Pensyve
Memory serverOfficial Major 7 Apps LLC project
Created by Major 7 Apps LLC
Published in major7apps/pensyve. Publisher page
100 GitHub stars
What it is
Universal memory runtime for AI agents
AutoGineer overview, from the brain’s own files
Pensyve is an open-source memory runtime designed to provide AI agents with persistent, cross-session recall. It functions as a memory layer that stores facts, conversations, observations, and action outcomes outside of the language model itself. The system is built in Rust and utilizes SQLite for local storage, with optional PostgreSQL support. It supports semantic search via locally run embedding models and provides multiple interfaces, including a Python SDK, an MCP server for integration with tools like Claude Code and Cursor, and an HTTP gateway for REST-based access. Pensyve is designed to be self-hosted, requiring no external accounts or API keys for local operation.
How it works
Memory model: Hybrid
AutoGineer overview, from the brain’s own files
Pensyve operates as a memory server that stores data in a local SQLite database or a PostgreSQL instance. It organizes information into four categories: facts (semantic memory), conversations (episodic memory), action outcomes (procedural memory), and observations. The system uses embedding models to enable semantic search across these records. Agents interact with Pensyve through various SDKs or the MCP protocol to save and retrieve information, which is then injected into the agent's prompt to provide context across different sessions and processes.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 10 |
| docs | docs | 15 |
| scripts | scripts | 3 |
| tests | tests | 11 |
| .agents | folder | 1 |
| .claude-plugin | folder | 1 |
| benchmarks | folder | 8 |
| integrations | folder | 324 |
| loadtest | folder | 3 |
| pensyve-benchmarks | folder | 17 |
| pensyve-cli | folder | 3 |
| pensyve-core | folder | 90 |
| pensyve-go | folder | 10 |
| pensyve-mcp | folder | 6 |
| pensyve-mcp-gateway | folder | 36 |
| pensyve-mcp-tools | folder | 5 |
| pensyve-python | folder | 19 |
| pensyve-ts | folder | 11 |
| pensyve-wasm | folder | 4 |
| pensyve_server | folder | 3 |
| results | folder | 6 |
Requirements
Runtimes: Python >=3.10, Rust
Databases: PostgreSQL, SQLite
Works with: Claude Code, OpenAI Codex, GitHub Copilot, Cursor, Kiro, OpenCode, Amp, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
This brain runs code automatically: 8 hooks (claude-code, codex). Review integrations/claude-code/hooks/hooks.json, integrations/codex-plugin/hooks/hooks.json before opening the folder in Claude Code. No step below turns a hook on for you.
integrations/claude-code/hooks/hooks.json:cat "${CLAUDE_PLUGIN_ROOT}/hooks/session-start.md"integrations/claude-code/hooks/hooks.json:cat "${CLAUDE_PLUGIN_ROOT}/hooks/post-tool-write-edit.md"integrations/claude-code/hooks/hooks.json:cat "${CLAUDE_PLUGIN_ROOT}/hooks/post-tool-bash.md"integrations/claude-code/hooks/hooks.json:cat "${CLAUDE_PLUGIN_ROOT}/hooks/pre-compact.md"integrations/claude-code/hooks/hooks.json:cat "${CLAUDE_PLUGIN_ROOT}/hooks/stop.md"integrations/claude-code/hooks/hooks.json:cat "${CLAUDE_PLUGIN_ROOT}/hooks/user-prompt-submit.md"integrations/codex-plugin/hooks/hooks.json:cat "${PLUGIN_ROOT}/hooks/session-start.md"integrations/codex-plugin/hooks/hooks.json:cat "${PLUGIN_ROOT}/hooks/user-prompt-submit.md"
- Not scanned by AutoGineerThe author’s MCP configuration (README.md) also starts it in a way AutoGineer does not offer. Read that file: AutoGineer did not scan that path; what it runs is listed under “This brain runs”. https://github.com/major7apps/pensyve/blob/d2c56fa44d1ee7b2d504f0008c6b9c860bc7d25f/README.md
- Not scanned by AutoGineerThe author’s MCP configuration (smithery.yaml) also starts it in a way AutoGineer does not offer. Read that file: AutoGineer did not scan that path; what it runs is listed under “This brain runs”. https://github.com/major7apps/pensyve/blob/d2c56fa44d1ee7b2d504f0008c6b9c860bc7d25f/smithery.yaml
- Not scanned by AutoGineerThe author’s README also describes installing it as the PyPI package pensyve. Read its install section: AutoGineer did not scan that path. https://github.com/major7apps/pensyve/blob/d2c56fa44d1ee7b2d504f0008c6b9c860bc7d25f/README.md#python-quick-start
- Not scanned by AutoGineerThe author also offers a container image (ghcr.io/major7apps/pensyve-mcp:5.0.0). https://github.com/major7apps/pensyve/tree/d2c56fa44d1ee7b2d504f0008c6b9c860bc7d25f
Created by Major 7 Apps LLC. Published in major7apps/pensyve. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- Add persistent memory to Python-based AI agents using the Python SDK.
- Connect AI coding assistants like Claude Code, Cursor, or Codex to a shared memory store via the MCP server.
- Share a centralized memory store across multiple services using the HTTP gateway.
- Integrate with LangChain or LangGraph frameworks for enhanced agent memory capabilities.
- Perform semantic search and retrieval of past conversations or facts via the command-line interface.
- “Save a fact about the user's preference for dark mode.”
- The agent stores the fact in the local SQLite database, allowing it to recall this preference in future sessions.
- “Recall previous editor settings for the current project.”
- The agent retrieves relevant facts or conversation history from the memory store and uses them to inform its current task.
Documentation by Major 7 Apps LLC
Pensyve
Image: CI Image: License: Apache 2.0 Image: Python 3.10+ Image: Rust 1.94+
Pensyve is an open-source runtime for persistent AI agent memory. It stores facts, conversations, observations, and action outcomes so an agent can retrieve them in later sessions. You can use it through Python, a Model Context Protocol (MCP) server, a command-line tool, or a REST API.
The Rust engine uses SQLite for local storage and runs embedding models locally to search by meaning. TypeScript and Go clients connect to a gateway you run yourself. Local use does not require a Pensyve account or API key. Your application or client integration calls Pensyve to save and retrieve memories.
Choose a setup
| Use case | Start here |
|---|---|
| Add persistent memory to a Python agent | Python quick start |
| Give Claude Code, Cursor, or Codex access to memory tools | MCP server and client setup guides |
| Share a memory store through TypeScript, Go, or REST | HTTP gateway |
| Use a LangChain or LangGraph adapter | Python integration or TypeScript integration |
Project status
Pensyve Cloud closed on October 1, 2026. The open-source project continues in this repository under the Apache 2.0 license, with the engine, SDKs, integrations, and documentation available here.
Pensyve is in maintenance mode. Releases cover security fixes and dependency updates, with no new features planned. See the maintenance policy for contribution and support expectations. If you have a saved Cloud export, the self-hosting guide explains how to use it with your own gateway.
What you can do
Store facts about users, projects, or other named entities, and record conversations as episodes.
Search memories using text matching, embeddings, and relationships between entities.
Record observations and action outcomes, and use consolidation to promote repeated facts and update memory retention.
Keep data in local SQLite storage, or run the HTTP gateway with SQLite or PostgreSQL.
Embedding models may download when first loaded unless they are already cached. Running without network access requires preparing the model files first. See the model setup and deployment guide.
How agent memory works
Pensyve stores memory outside the language model. Your application saves facts or conversations, searches for relevant records, and adds the results to a later prompt. Reusing the same storage path and namespace lets the agent retrieve information across processes and sessions. Saving a memory does not train the language model or change its weights.
The store holds four kinds of records: facts (semantic memory), conversations (episodic memory), action outcomes (procedural memory), and observations. Your integration decides what to record and when to retrieve it. Recording a conversation does not automatically turn it into a successful procedure. See how storage and retrieval work and the usage recipes for the APIs and their limits.
Python quick start
Python 3.10 or newer is required.
pip install pensyveCreate a local store, save a fact, and retrieve it:
import pensyve
p = pensyve.Pensyve(path="./memories", namespace="my-agent")
user = p.entity("user", kind="user")
p.remember(
entity=user,
fact="Prefers dark mode and vim keybindings",
confidence=0.95,
)
for memory in p.recall("editor preferences", entity=user):
print(memory.content)Reuse the same path and namespace in a later process to retrieve saved memories. The Python SDK runs the engine in your process and does not need the HTTP gateway.
You can also record a conversation with the same p and user:
with p.episode(user) as episode:
episode.message("user", "Use dark mode in my editor")
episode.message("agent", "I updated the editor settings")
episode.outcome("success")
groups = p.recall_grouped("editor settings", limit=10)
for group in groups:
for memory in group.memories:
print(memory.content)recall_grouped() groups results by source session for use in an agent's
prompt. See the Python SDK guide and
recipes for more examples.
MCP server
Pensyve's local MCP memory server lets clients such as Claude Code, Codex, and Cursor store and retrieve memories across sessions. From a checkout of this repository, install the server with Rust 1.94 or newer:
git clone https://github.com/major7apps/pensyve.git
cd pensyve
cargo install --path pensyve-mcp --lockedMake sure Cargo's binary directory is on your client's PATH, then add a
stdio server entry to its MCP configuration:
{
"mcpServers": {
"pensyve": {
"command": "pensyve-mcp",
"args": ["--stdio"],
"env": {
"PENSYVE_NAMESPACE": "my-project"
}
}
}
}The server provides tools such as pensyve_remember, pensyve_recall,
pensyve_observe, and pensyve_inspect. It stores data locally and needs no
API key. The configuration file location depends on your client. See the
MCP setup guide and
integration guides.
HTTP gateway
Run the gateway to access Pensyve over REST or MCP HTTP, including from the TypeScript and Go SDKs. From the repository root, start a local instance:
HOST=127.0.0.1 PENSYVE_API_KEYS=psy_local_example \
cargo run --release -p pensyve-mcp-gatewayIn another terminal, save and recall a fact:
curl http://localhost:3000/v1/remember \
-H "Authorization: Bearer psy_local_example" \
-H "Content-Type: application/json" \
-d '{"entity":"user","fact":"Prefers Python","confidence":0.95}'
curl http://localhost:3000/v1/recall \
-H "Authorization: Bearer psy_local_example" \
-H "Content-Type: application/json" \
-d '{"query":"programming language","entity":"user"}'The MCP HTTP endpoint is http://localhost:3000/mcp. Use the same API key in
your client's Authorization: Bearer header.
The example key is for local testing. For a deployment, choose your own key
with the required psy_ prefix and configure HTTPS and allowed hosts. See
the self-hosting guide,
gateway configuration, and
security documentation.
SDKs and integrations
The TypeScript and Go SDKs require a running gateway. Configure its URL and, when authentication is enabled, an API key from that gateway.
| Interface | Installation or guide |
|---|---|
| Python | pip install pensyve, SDK guide |
| TypeScript | npm install @pensyve/sdk, SDK guide |
| Go | go get github.com/major7apps/pensyve/pensyve-go/v5@latest, SDK guide |
| Claude Code | Plugin setup |
| Cursor | MCP setup and rules |
| Codex | Plugin setup |
| LangChain and LangGraph | Python adapter, TypeScript adapter |
| Other clients and frameworks | Integration index |
Command-line tool
From the repository root, install the CLI and inspect its commands:
cargo install --path pensyve-cli --locked
pensyve --help
pensyve status
pensyve recall "editor preferences" --entity userThe binary is named pensyve. Its default output is JSON, and --format text
selects text output. The CLI uses its own default local storage location;
it does not automatically open the ./memories directory from the Python
example. See the CLI source and command definitions
for storage and namespace options.
Documentation
| Guide | Contents |
|---|---|
| Documentation index | Choose a setup, find API guides, and identify historical plans |
| Getting started | Setup by client or SDK |
| Self-hosting | Gateway deployment, model files, backups, and saved Cloud exports |
| Recipes | Recall, facts, episodes, observations, and other API examples |
| Architecture | Storage, retrieval, and component boundaries |
| Security | Authentication, namespace isolation, and execution limits |
| Reliability | Tests and runtime guarantees |
| Changelog | Release history and breaking changes |
Development and contributions
Start with CONTRIBUTING.md for prerequisites and setup. From the repository root:
uv sync --extra dev
make build
make checkmake build compiles Rust and builds the Python extension. make check
runs the Rust and Python lint and test commands. TypeScript and Go have
separate checks documented in the contribution guide.
Issues and pull requests follow the maintenance policy. Report security issues through private vulnerability reporting.
License
Pensyve is licensed under Apache 2.0.
docs/SECURITY.md
Pensyve Security
Security posture for the Pensyve memory runtime. Pensyve is designed to handle sensitive conversational data, so isolation, access control, and data hygiene are first-class concerns.
Authentication
Two auth mechanisms, both opt-in:
| Method | Transport | When to use |
|---|---|---|
| API key | Authorization: Bearer <key> header | Server-to-server, CLI, SDK clients |
| JWT | Authorization: Bearer <jwt> header (EdDSA) | Deployments that run their own token issuer |
Authentication is required as soon as any mechanism is configured:
PENSYVE_API_KEYS, PENSYVE_VALIDATION_URL, or OAUTH_PUBLIC_KEY. All
endpoints are open (local-only development mode) only when none of the three is
set. For production deployments, set PENSYVE_API_KEYS to a comma-separated
list of keys.
JWT validation is off unless OAUTH_PUBLIC_KEY (Ed25519 public key, PEM),
OAUTH_ISSUER (required iss claim), and OAUTH_AUDIENCE (required aud
claim) are all set. A JWT must carry exp, iss, and aud; a token that
omits any of them is rejected. If the key is set without an issuer or audience,
the gateway logs a warning and rejects every JWT, and it stays closed: with no
other mechanism configured it rejects every request. The gateway does not issue
tokens and serves no OAuth endpoints; the /oauth/* proxy and
/.well-known/oauth-* metadata that pointed at the closed hosted service have
been removed.
A request with no credential gets 401 with WWW-Authenticate: Bearer.
Role-Based Access Control (RBAC)
The memory mesh module (pensyve-core/src/mesh.rs) enforces namespace-level
permissions:
| Role | Capabilities |
|---|---|
| Owner | Full read/write/delete, manage ACLs |
| Writer | Read and write memories |
| Reader | Read-only access |
Visibility levels per memory: Private (owner only), Shared (ACL-listed entities), Public (any authenticated caller in the namespace).
Multi-Tenant Isolation
Every memory is scoped to an (agent_id, user_id) pair within a namespace.
Cross-tenant queries are rejected at the storage layer. The gateway
(pensyve-mcp-gateway) maintains per-tenant state via tenant.rs, ensuring
one tenant's data is never visible to another.
Postgres row-level security
On the Postgres backend, namespace isolation is meant to have two independent layers:
The explicit
namespace_id = $npredicates in the storage layer's SQL. This is the load-bearing layer: it is the only one onSQLite, and the only one left on a Postgres whose role holdsBYPASSRLS.Row-level security, as a backstop for a query that omits the predicate. Enforced by default since the enforce-by-default change — see below.
postgres_schema.sql enables RLS and declares a namespace_isolation_* policy
per namespaced table. Each policy matches namespace_id against the
pensyve.namespace_id setting, on both the read half (USING) and the write
half (WITH CHECK), so a connection scoped to one namespace can neither read
nor write another's rows.
The backend binds that setting on every connection its own storage methods take from the pool. A storage method that carries no namespace binds the empty string instead, which no UUID can match, so those paths fail closed rather than inheriting the previous caller's namespace.
The guarantee stops at the backend's own storage methods. A few call sites
deliberately take a connection with nothing bound, reached through
ScopedPool::unbound, and one of them is the public PostgresBackend::pool
accessor. A connection from there carries whatever namespace the previous
checkout left set, because the setting is session-scoped and Postgres does not
clear it. Anything querying a table that carries a namespace_isolation_*
policy through such a connection must bind a namespace first, with
PostgresBackend::set_namespace_config, or bind the empty string to fail
closed on purpose. Without that, a query reads the previous caller's namespace
once RLS is enforced, which is a cross-namespace read rather than an empty
result. The internal uses are limited to DDL, which RLS does not apply to, and
to namespaces and activity_events, neither of which carries a policy.
Layer 2 is active by default. Postgres exempts a table's owner from its own
policies, so ENABLE ROW LEVEL SECURITY alone would leave them inert for the
role that applies the schema. postgres_schema.sql therefore ends with
ALTER TABLE ... FORCE ROW LEVEL SECURITY on all seven policied tables, which
removes that exemption. It is applied by every startup that applies the schema,
and it is idempotent, so a re-apply is a no-op.
Enforcement used to ship as a separate file an operator applied by hand
(postgres_rls_enforce.sql). That was a staging device: it existed while parts
of the storage surface still reached the database without a namespace, and
enforcing then would have turned those paths into silent no-ops. Every
StorageTrait method carries a namespace now, so the file has been folded into
the schema and removed.
The one thing FORCE cannot do is override a role's own attributes. A
superuser, and any role holding BYPASSRLS, ignores every policy no matter what
the catalog says the tables are forced to. That is why the role model below is
part of the control and not an optional hardening step, and why startup reports
the connected role's exemptions on every start.
What enforcement does to an unscoped path
Enforcement fails closed, and it fails without raising an error. A query path
that does not carry a namespace returns no rows, and a delete on that path
deletes nothing while still returning Ok. The hazard is that the call
succeeds at all, so a caller that only checks for an error treats a no-op as a
completed erase.
No StorageTrait method has that problem any more. Every method that reaches
a table carrying a namespace_isolation_* policy now takes a namespace_id
and puts it in the SQL. The list used to be enumerated here and is now empty.
Getting there took three rounds. #254 replaced recall candidate hydration,
memory supersession and delete-by-id with _in_namespace variants; #256 did
the same for entity forget; #264 folded the GDPR erase's four independent
calls into one transaction whose every leg — observations and the entity record
included — carries a namespace_id predicate and runs on a namespace-bound
connection. The last round replaced the remaining nine. Five became scoped
variants — get_entity_in_namespace,
list_episodic_by_entity_in_namespace, list_semantic_by_entity_in_namespace,
update_episodic_access_in_namespace and
update_procedural_reliability_in_namespace. The other four —
delete_entity, invalidate_semantic, update_semantic_content and
delete_observations_by_entity — had no caller left once the capturing erase
absorbed their work, and were removed rather than scoped, so there is no
unscoped path left to call by accident.
The highest-traffic one is worth naming: update_episodic_access_in_namespace
writes the retrieval reinforcement stamp, once per episodic result of every
recall. Unscoped, that UPDATE matched no row under enforcement and returned
success, so spaced-repetition decay would have quietly stopped tracking access
on every enforced deployment.
live_rls.rs gates each replacement under enforcement directly, in
scoped_memory_reads_still_work_under_enforced_rls,
supersede_still_works_under_enforced_rls,
namespace_scoping_end_to_end_under_enforced_rls,
entity_delete_still_works_under_enforced_rls,
entity_lookup_by_id_still_works_under_enforced_rls,
entity_scoped_memory_listings_still_work_under_enforced_rls,
reinforcement_stamp_still_lands_under_enforced_rls and
procedural_reliability_update_still_lands_under_enforced_rls. The old
enforced_rls_fails_closed_for_unscoped_methods checklist is empty and gone;
the per-method tests are the standing gate in its place.
Edges are the newest addition to layer 2. They gained a namespace_id — an
edge belongs to the namespace of its source entity — plus a
namespace_isolation_edges policy and a FORCE line alongside the other six.
save_edge and get_edges_for_entity_in_namespace both take a namespace and
bind it on their connection, so the graph is covered by both layers rather than
by neither. A GDPR erase now really deletes them: the edge leg of
erase_entity_capturing is a DELETE … WHERE (source = ? OR target = ?) AND namespace_id = ?, where the erase used to run a SELECT and report its row
count as edges_deleted while every edge stayed in the table (#264).
Source-namespace ownership has one consequence worth stating plainly: an edge
whose source is in namespace A and whose target is in namespace B is stored in
A, so B cannot see it at all — not even on the target leg, where B would
otherwise expect to find an edge pointing at its own entity. An erase running
in B therefore does not see and does not delete A's edge into B. That is the
intended trade (the edge is A's data, and B must not be handed a read into A),
and it is the one residue a GDPR erase deliberately leaves behind.
Databases provisioned before the column existed are migrated in place: the
column is backfilled from entities.namespace_id via edges.source, and edges
whose source entity no longer exists are deleted, because they can be
attributed to no namespace and no scoped accessor can reach them. On Postgres
the count is reported as a NOTICE; on SQLite it is logged at WARN.
On an already-enforced database the Postgres migration may refuse to run, and
that refusal is doing its job. run_schema sends the schema through a
connection with no namespace bound. Where entities is forced, that connection
reads it as empty, which would make the backfill match nothing and the orphan
delete match everything — silently destroying the graph. The migration
therefore runs under SET row_security = off, which makes Postgres raise
rather than filter, and it aborts the whole schema batch with
refusing to migrate edges.namespace_id. Nothing is written.
The edges migration in particular does not hit this on an ordinary upgrade.
The FORCE block is the last thing in postgres_schema.sql, after the
backfill, so a database being brought up from an unenforced build migrates
first and is forced afterwards, in one batch. You will only see it there if
edges actually holds rows; an empty edges table migrates cleanly under
enforcement, and so does a database that has already been migrated. To clear
that refusal, ALTER TABLE entities NO FORCE ROW LEVEL SECURITY for the
duration of the upgrade and restore it afterward, or apply the schema once as a
role the policies do not apply to.
But the shape of that refusal is now a standing rule, not a one-off. Read
this part if you are about to add a migration to postgres_schema.sql.
From the enforce-by-default change onward, every deployment past its first
schema apply has entities — and the other six policied tables — already
FORCEd when the next schema batch runs. Enforcement is state on the tables,
not a property of the file, so it is in place before the batch starts. At the
same time, schema_dml_on_policied_tables_cannot_be_silently_blinded requires
any DML in this file against a policied table to sit inside the
SET row_security = off … RESET row_security window, precisely so a blinded
read raises instead of returning a wrong answer.
Put together: any future migration that reads or writes a policied table will raise, on every already-enforced database, unless it runs as a role the policies do not apply to. That is the guardrail working, not a bug — the alternative is a migration that silently sees an empty table and acts on it. The consequences for a schema author are:
A migration touching policied tables must be run by the owner, and the owner must not be subject to the policies for its duration. In practice that means the owner-connected startup in the upgrade sequence below, with
NO FORCEon the tables it reads if the owner is itself forced. The unprivilegedpensyve_appserving role can never apply such a migration.Prefer a migration that does not need to read tenant rows at all. Catalog reads (
pg_attribute,pg_class) are never filtered by RLS, which is why the edges migration gates itself onattnotnulland why an already-migrated database skips the guarded body entirely and starts normally.Gate the expensive or dangerous part behind that catalog check, so the common path — a database with nothing to migrate — never enters the window.
The startup self-check
The backend runs this check itself, on every Postgres startup:
SELECT rolsuper, rolbypassrls FROM pg_roles WHERE rolname = current_user;If either column is true it logs a WARN naming the role and both flags.
Both exemptions survive FORCE ROW LEVEL SECURITY, so a deployment running as
such a role has enforced nothing, and there is no other symptom — queries keep
returning rows, the catalog keeps reporting the tables as forced. Making it
observable from the application is the point; it is not a runbook step anyone
has to remember.
It is a warning, not a refusal. A local or single-tenant deployment
legitimately connects as the owner or as postgres, and neither is worth
refusing to start over. If you see this warning on a multi-tenant deployment,
treat it as enforcement being off no matter what the catalog says.
PostgresBackend::role_rls_exemptions exposes the same answer to callers that
want to assert on it.
Verifying enforcement
Applying the schema is all there is to enabling enforcement; there is no separate step and no separate file. What is worth doing is checking that it took effect, because a clean startup does not prove it.
First check that the application's role is not a superuser and does not hold
BYPASSRLS — the startup self-check above will already have told you, and the
query it runs is the one to re-run by hand. Expect f in both columns. If
either is t, enforcement cannot work on that connection whatever the tables
say; move the application to an ordinary role.
Then check the tables. Every row below should report t:
SELECT relname, relrowsecurity, relforcerowsecurity
FROM pg_class
WHERE relname IN ('entities', 'episodes', 'episodic_memories',
'semantic_memories', 'procedural_memories',
'observation_memories', 'edges');All t proves the tables are forced. It does not prove the policies apply to
the role the application connects as, and the difference matters. A superuser
gets t on every row above and still reads every namespace, which is exactly
how a broken deployment looks like a working one. The only check that settles
it is behavioural. Run this as the application role against a database that
holds data, using a namespace id that owns no rows:
SELECT set_config('pensyve.namespace_id', '00000000-0000-0000-0000-000000000000', false);
SELECT count(*) FROM episodic_memories;A count of 0 means the policies apply to this role. Anything above 0 means they
do not, whatever the catalog says, and the usual cause is connecting as a
superuser or as a role holding BYPASSRLS.
To roll back, run ALTER TABLE <table> NO FORCE ROW LEVEL SECURITY; for each
table. Rollback takes effect immediately and touches neither the policies nor
the data. It lasts until the next startup that applies the schema, which forces
again — so it is a way to unblock an upgrade or an investigation, not a way to
run.
Upgrading a deployment provisioned before enforcement shipped
A database whose schema predates this change is already enforced the moment the new build applies its schema, and that is a behaviour change, not just a migration. Two things have to be true first, and both are about the role:
The role the application serves as must be
NOSUPERUSER NOBYPASSRLS. If it holds either attribute, forcing the tables changes nothing and the isolation you think you turned on is not on. The startup self-check reports this.Nothing outside
StorageTraitmay reach a policied table on a connection with no namespace bound. Inside the backend this is structural. A tool, script or migration holding its own connection is not, and under enforcement it reads nothing rather than erroring.
The role setup below is the same one the DDL/serving split needs, so a
deployment that already runs as pensyve_app has nothing to do beyond the
ordinary upgrade sequence.
The dedicated application role
A role that does not own the tables is subject to their policies regardless of
whether FORCE is set, so running the application as a non-owner role is the
more durable control. It is supported.
It used not to be. PostgresBackend::new applied the schema unconditionally on
every startup, and the schema contains statements only a table's owner may run
— ALTER TABLE ... ADD COLUMN, CREATE INDEX, ALTER TABLE ... ENABLE ROW LEVEL SECURITY, CREATE POLICY. A non-owner failed at startup with
must be owner of table entities, even holding every table privilege and
CREATE on the schema.
Startup now separates applying the schema from serving traffic. It first reads
pensyve_schema_state, a one-row table holding a digest of the schema text
that was last applied. When that digest is the one this build ships, the whole
DDL batch is skipped and a role with only DML grants starts normally. When it
is not — a fresh database, or an upgrade carrying a schema change — the batch
runs, which still requires ownership, and a non-owner is told so:
pensyve: the database schema is not at the version this build applies, and the connected role may not apply it. Schema application is owner-only DDL …
The digest covers the whole schema file, so any edit invalidates it and the batch runs again. The idempotent re-apply is preserved where it matters, a changed file, and skipped only where it was already a guaranteed no-op.
Upgrading a deployment that serves as pensyve_app
A build whose schema text is unchanged needs nothing: the digest still matches, the DDL is skipped, and the serving role starts as it always did. A build that changes the schema needs this sequence, in this order:
Apply the new schema text, however you prefer. Starting the new build on an owner connection does it; so does
psql -f pensyve-core/src/storage/postgres_schema.sqlas the owner. Either is fine, and this step is where the owner-only DDL actually happens.Start the new build once on an owner connection. This step is required even if step 1 already applied the file by hand, and it is not optional ceremony:
postgres_schema.sqlcannot record its own digest, so a hand-applied schema leavespensyve_schema_statepresent but empty. Only a startup stamps it. The startup verifies the schema, re-applies it — idempotently, so doing step 1 by hand first costs nothing — and writes the digest. Which line it logs depends on what step 1 left behind: a marker holding no row at all — a first hand-apply, or one on a pre-marker database — logsschema marker present but unstamped, while a deployment that has been stamped before and is now on older schema text logsdatabase schema is not at this build's version; applying it. Either line means the same thing here, and this step is the remedy for both.Flip serving back to
pensyve_app. With the digest stamped, the probe reads "current", the DDL batch is skipped, and the unprivileged role starts.
Step 2 is the one worth not skipping. Without it the marker is never stamped,
every later startup reads "not current", and pensyve_app fails on owner-only
DDL indefinitely — the database is fine and the application will not start.
Running the new build as the owner for step 1 collapses steps 1 and 2 into one
action, which is the simplest way to do this.
Rolling back to an earlier build costs the same owner-run startup
The marker records the digest of the schema text that was last applied, not a
version number, and it does not know which direction you are moving in. A
rollback to a build whose postgres_schema.sql differs from the one last
applied is therefore the same case as an upgrade: the older build reads a digest
that is not its own, concludes the schema is not current, and runs its DDL
batch. On the serving role that fails with the same owner-only error.
So a rollback across a schema-text change needs one startup of the older build
on an owner connection before pensyve_app can serve again, exactly like step 2
above. Plan for it: a rollback you expect to be a quick redeploy of the previous
image will not start as the serving role until that owner-run startup has
happened. Rolling forward again afterwards costs another one, for the same
reason.
That startup logs database schema is not at this build's version; applying it
and stamps the older build's digest.
It does not undo the newer build's schema. The older build sends its own schema text, and that text only creates what is missing, so tables, columns and indexes the newer build added stay in place. The policies are the exception: the file drops and re-creates each policy it defines, so those return to the older build's definitions.
None of this applies when the two builds ship the same postgres_schema.sql.
The stored digest matches, the DDL is skipped, and the serving role starts.
NOBYPASSRLS is required because a role with BYPASSRLS, and any superuser,
ignores every policy — the startup self-check above will warn if you get this
wrong.
CREATE ROLE pensyve_app LOGIN PASSWORD '...' NOSUPERUSER NOBYPASSRLS;
GRANT USAGE ON SCHEMA public TO pensyve_app;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO pensyve_app;
-- Run this as the role that owns the tables, or name that role with FOR ROLE.
-- ALTER DEFAULT PRIVILEGES only covers tables created later by the role it
-- names, so running it as anyone else silently grants nothing on the tables
-- the owner goes on to create.
ALTER DEFAULT PRIVILEGES FOR ROLE pensyve_owner IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO pensyve_app;ALTER DEFAULT PRIVILEGES never applies to tables that already exist, so the
GRANT ... ON ALL TABLES above is what covers the current schema. Both
statements are needed. The GRANT ... ON ALL TABLES also covers
pensyve_schema_state; without SELECT on it the serving role cannot read the
applied digest and startup fails with permission denied for table pensyve_schema_state rather than skipping the DDL.
What goes wrong
Reads come back empty. Enforcement fails closed without raising, so an
unscoped query path returns nothing and an unscoped delete deletes nothing while
still returning Ok. Every StorageTrait method carries a namespace, so the
usual cause is not the application: check the connection. A path that reached
the database without going through a storage method — the
PostgresBackend::pool accessor, or a tool holding its own connection — has to
bind pensyve.namespace_id itself. NO FORCE while you find it; that is
immediate and touches neither the policies nor the data, and the next schema
apply restores enforcement.
Enforcement appears to do nothing: rows from every namespace still come
back. Look at the startup log. The backend warns on every start when
current_user holds rolsuper or rolbypassrls, because both survive
FORCE — the catalog will report the tables as forced and the policies will
still not apply. Move the application to a NOSUPERUSER NOBYPASSRLS role. The
behavioural check above (set_config to a namespace that owns no rows, then
count) is what settles it either way.
Startup fails with must be owner of table entities. The serving role has
been asked to apply the schema, which is owner-only DDL. It is only asked to
when the digest in pensyve_schema_state is not this build's, so the fix is
always the same: start the new build once on an owner connection, then start
the serving role again. See the upgrade sequence above. A build whose schema
text is unchanged skips the DDL entirely and never reaches this. The error the
application raises says the same thing; the bare Postgres message is not what
you will see.
Note that applying postgres_schema.sql by hand does not on its own clear
this. The file creates pensyve_schema_state but cannot record its own digest,
so a hand-applied schema leaves the marker unstamped for this build and the
serving role still fails here. The owner-connected startup is what stamps it —
to confirm it found and fixed exactly this state, look in that startup's log for
schema marker present but unstamped if the marker held no row (a first
hand-apply, or one on a pre-marker database), or database schema is not at this build's version; applying it if the deployment had been stamped by an earlier
build. The remedy is the same either way.
Existing namespaces serve lexical-only after upgrading to schema v6. Versioned
embedding generations start with no active generation per namespace. After the
owner-connected startup, run pensyve-mcp-gateway backfill-embeddings once with
the serving role's DATABASE_URL (in a container deployment, a one-off run of
the gateway image with the command overridden to backfill-embeddings).
It pages every namespace, embeds each source on the loaded generation, verifies
coverage, and activates; running tasks observe activation on their next request.
Startup fails with permission denied for table pensyve_schema_state. The
serving role cannot read the applied-schema marker, so it cannot establish that
the DDL is safe to skip. Grant it SELECT — the
GRANT ... ON ALL TABLES IN SCHEMA public in the role setup above covers it, so
this usually means that grant was run before the table existed. Re-run it.
Network Policy
The NetworkPolicy enum controls outbound network access for the core engine:
| Variant | Behavior |
|---|---|
Disabled | No network calls; fully offline operation |
LocalOnly | Only localhost connections (e.g., local LLM inference) |
Permissive | Outbound allowed (cloud embedding endpoints, remote models) |
The model-loading policy depends on the entry point. The Python SDK defaults
to Permissive when PENSYVE_NETWORK_POLICY is unset, and the stdio server's
model loader uses Permissive. Models may download when first loaded. Prepare
the model cache before running
without network access.
PII Detection
The optional Python extraction helper in pensyve_server/extraction.py
redacts common sensitive patterns before passing text to its local model.
The helper accepts a model path explicitly;
PENSYVE_TIER2_ENABLED and PENSYVE_TIER2_MODEL_PATH do not configure the
shipped SDK or gateway.
Execution Bounds
Hard limits prevent runaway operations and cross-tenant corpus retention:
| Operation | Bound |
|---|---|
| Recall query | 5 second timeout |
| Gateway recall admission | 8 concurrent reservations; 64 MiB reserved working set |
| Vector / lexical candidates | 100 each |
| Fused references / hydrated payload | 200 references; 4 MiB |
| SQLite exact-vector scan | 50,000 eligible active-generation rows |
| Memory page | 256 rows |
| Consolidation cycle | 60 second maximum |
| Consolidation comparison / promotion | 64 candidates; 4,096 members |
| Tenant metadata cache | 1,024 entries; 30-minute idle expiry |
| Episode TTL | 30 minutes (REST API) |
| Embedding migration page | 256 rows; one target session per namespace |
Shipping runtimes hold no resident namespace vector corpus. Exact search applies namespace and immutable active-generation identity in storage before ranking; hydration is a separate bounded step. Missing or mismatched embedding provenance degrades to lexical-only retrieval, never a mixed or partial vector ranking. Source and embedding-generation mutations commit transactionally across remember, update, supersede, forget, erase, restore, and backfill paths.
These contracts are common to SQLite and Postgres.
Rate Limiting
The gateway applies one sliding-window limit to every tenant
(rate_limit.rs): PENSYVE_RATE_LIMIT requests per minute (default 30) and
PENSYVE_DAILY_QUOTA operations per UTC day (default 1000). There are no plan
tiers. The daily quota is enforced only when REDIS_URL is set; without Redis
the gateway keeps the per-minute limit in memory. A usage counter
(usage_counter.rs, GET /v1/usage) tracks operations per (user, month,
operation kind). Nothing is reported to an external billing service.
Secret Handling
Never commit secrets, API keys, or
.envfiles. Usegit addwith specific filenames, nevergit add -Aorgit add ..All secrets are passed via environment variables (see
AGENTS.mdfor the full variable table).The JWT public key is loaded from
OAUTH_PUBLIC_KEYenv var, never embedded in source.API key validation supports both a local list and a remote validation endpoint with response caching.
Dependency Hygiene
ONNX embeddings via
fastembed(no external API calls in offline mode).Optional Postgres backend is feature-gated; SQLite is the default.
Optional Redis cache is environment-gated: enabled when
REDIS_URLis set.Go SDK uses standard library only; no third-party dependencies.
512 files · 482 not served here
- .agents/plugins/marketplace.json (not served here)
- .claude-plugin/marketplace.json (not served here)
- .env.example (not served here)
- .github/FUNDING.yml (not served here)
- .github/ISSUE_TEMPLATE/bug_report.md (not served here)
- .github/ISSUE_TEMPLATE/feature_request.md (not served here)
- .github/ISSUE_TEMPLATE/question.md (not served here)
- .github/dependabot.yml (not served here)
- .github/workflows/ci.yml (not served here)
- .github/workflows/claude-code-review.yml (not served here)
- .github/workflows/claude.yml (not served here)
- .github/workflows/publish-mcp-registry.yml (not served here)
- .github/workflows/release.yml (not served here)
- .gitignore (not served here)
- AGENTS.md
- ATTRIBUTION.md
- AUTOGINEER-RUNS.md
- CHANGELOG.md
- CLAUDE.md
- CODE_OF_CONDUCT.md
- CONTRIBUTING.md
- Cargo.lock (not served here)
- Cargo.toml (not served here)
- LICENSE
- MAINTENANCE.md
- Makefile (not served here)
- README.md
- SECURITY.md
- benchmarks/README.md (not served here)
- benchmarks/__init__.py (not served here)
- benchmarks/eval-dataset/README.md (not served here)
- benchmarks/eval-dataset/scenarios.json (not served here)
- benchmarks/synthetic/__init__.py (not served here)
- benchmarks/synthetic/evaluate.py (not served here)
- benchmarks/synthetic/generate.py (not served here)
- benchmarks/synthetic/run.py (not served here)
- clippy.toml (not served here)
- conftest.py (not served here)
- docs/ARCHITECTURE.md
- docs/GETTING_STARTED.md (not served here)
- docs/README.md
- docs/RECIPES.md
- docs/RELIABILITY.md
- docs/SECURITY.md
- docs/guides/openclaw.md (not served here)
- docs/images/architecture.png (not served here)
- docs/images/logo.png (not served here)
- docs/reviews/2026-10-04-search-audit.md (not served here)
- docs/reviews/2026-10-04-search-baseline.json (not served here)
- docs/self-host.md (not served here)
- docs/superpowers/plans/2026-08-04-forget-safety-completion.md (not served here)
- docs/superpowers/plans/2026-08-04-paraphrase-recall.md (not served here)
- docs/superpowers/specs/2026-08-04-open-issues-remediation-design.md (not served here)
- glama.json (not served here)
- integrations/README.md (not served here)
- integrations/amazon-q/.amazonq/mcp.json.example (not served here)
- integrations/amazon-q/.amazonq/mcp.json.local.example (not served here)
- integrations/amazon-q/.amazonq/rules/context-loader.md (not served here)
- integrations/amazon-q/.amazonq/rules/entity-detection.md (not served here)
- integrations/amazon-q/.amazonq/rules/memory-informed-debug.md (not served here)
- integrations/amazon-q/.amazonq/rules/memory-informed-design.md (not served here)
- integrations/amazon-q/.amazonq/rules/memory-informed-longitudinal-work.md (not served here)
- integrations/amazon-q/.amazonq/rules/memory-informed-refactor.md (not served here)
- integrations/amazon-q/.amazonq/rules/memory-reflex.md (not served here)
- integrations/amazon-q/.amazonq/rules/session-memory.md (not served here)
- integrations/amazon-q/CHANGELOG.md (not served here)
- integrations/amazon-q/README.md (not served here)
- integrations/amazon-q/scripts/lint-mcp-refs.sh (not served here)
- integrations/antigravity-plugin/CHANGELOG.md (not served here)
- integrations/antigravity-plugin/LICENSE
- integrations/antigravity-plugin/README.md (not served here)
- integrations/antigravity-plugin/mcp_config.json (not served here)
- integrations/antigravity-plugin/plugin.json (not served here)
- integrations/antigravity-plugin/rules/context-loader.md (not served here)
- integrations/antigravity-plugin/rules/entity-detection.md (not served here)
- integrations/antigravity-plugin/rules/memory-informed-debug.md (not served here)
- integrations/antigravity-plugin/rules/memory-informed-design.md (not served here)
- integrations/antigravity-plugin/rules/memory-informed-longitudinal-work.md (not served here)
- integrations/antigravity-plugin/rules/memory-informed-refactor.md (not served here)
- integrations/antigravity-plugin/rules/memory-reflex.md (not served here)
- integrations/antigravity-plugin/rules/session-memory.md (not served here)
- integrations/antigravity-plugin/scripts/lint-mcp-refs.sh (not served here)
- integrations/antigravity-plugin/scripts/test-lint-mcp-refs.sh (not served here)
- integrations/antigravity-plugin/skills/context-loader/SKILL.md (not served here)
- integrations/antigravity-plugin/skills/forget/SKILL.md (not served here)
- integrations/antigravity-plugin/skills/inspect/SKILL.md (not served here)
- integrations/antigravity-plugin/skills/memory-informed-refactor/SKILL.md (not served here)
- integrations/antigravity-plugin/skills/memory-review/SKILL.md (not served here)
- integrations/antigravity-plugin/skills/recall/SKILL.md (not served here)
- integrations/antigravity-plugin/skills/remember/SKILL.md (not served here)
- integrations/antigravity-plugin/skills/session-memory/SKILL.md (not served here)
- integrations/autogen/CHANGELOG.md (not served here)
- integrations/autogen/LICENSE
- integrations/autogen/README.md (not served here)
- integrations/autogen/SUBSTRATE_PROMPT.md (not served here)
- integrations/autogen/__init__.py (not served here)
- integrations/autogen/examples/pensyve_agent.py (not served here)
- integrations/autogen/pensyve_autogen.py (not served here)
- integrations/autogen/pensyve_capture.py (not served here)
- integrations/autogen/pyproject.toml (not served here)
- integrations/autogen/scripts/lint-mcp-refs.sh (not served here)
- integrations/autogen/src/__init__.py (not served here)
- integrations/autogen/src/_vendor/__init__.py (not served here)
- integrations/autogen/src/_vendor/memory_capture_core.py (not served here)
- integrations/autogen/tests/__init__.py (not served here)
- integrations/autogen/tests/test_pensyve_autogen.py (not served here)
- integrations/autogen/uv.lock (not served here)
- integrations/build.sh (not served here)
- integrations/claude-code/.claude-plugin/marketplace.json (not served here)
- integrations/claude-code/.claude-plugin/plugin.json (not served here)
- integrations/claude-code/LICENSE
- integrations/claude-code/README.md (not served here)
- integrations/claude-code/agents/context-researcher.md (not served here)
- integrations/claude-code/agents/memory-curator.md (not served here)
- integrations/claude-code/commands/consolidate.md (not served here)
- integrations/claude-code/commands/forget.md (not served here)
- integrations/claude-code/commands/inspect.md (not served here)
- integrations/claude-code/commands/memory-status.md (not served here)
- integrations/claude-code/commands/recall.md (not served here)
- integrations/claude-code/commands/remember.md (not served here)
- integrations/claude-code/commands/using-pensyve.md (not served here)
- integrations/claude-code/hooks/hooks.json (not served here)
- integrations/claude-code/hooks/post-tool-bash.md (not served here)
- integrations/claude-code/hooks/post-tool-write-edit.md (not served here)
- integrations/claude-code/hooks/pre-compact.md (not served here)
- integrations/claude-code/hooks/session-start.md (not served here)
- integrations/claude-code/hooks/stop.md (not served here)
- integrations/claude-code/hooks/user-prompt-submit.md (not served here)
- integrations/claude-code/pensyve-plugin.local.md (not served here)
- integrations/claude-code/skills/context-loader/SKILL.md (not served here)
- integrations/claude-code/skills/memory-informed-debug/SKILL.md (not served here)
- integrations/claude-code/skills/memory-informed-design/SKILL.md (not served here)
- integrations/claude-code/skills/memory-informed-longitudinal-work/SKILL.md (not served here)
- integrations/claude-code/skills/memory-informed-refactor/SKILL.md (not served here)
- integrations/claude-code/skills/memory-review/SKILL.md (not served here)
- integrations/claude-code/skills/session-memory/SKILL.md (not served here)
- integrations/claude-code/skills/shared/entity-detection.md (not served here)
- integrations/claude-code/skills/shared/memory-reflex.md (not served here)
- integrations/cline/.clinerules/context-loader.md (not served here)
- integrations/cline/.clinerules/entity-detection.md (not served here)
- integrations/cline/.clinerules/memory-informed-debug.md (not served here)
- integrations/cline/.clinerules/memory-informed-design.md (not served here)
- integrations/cline/.clinerules/memory-informed-longitudinal-work.md (not served here)
- integrations/cline/.clinerules/memory-informed-refactor.md (not served here)
- integrations/cline/.clinerules/memory-reflex.md (not served here)
- integrations/cline/.clinerules/session-memory.md (not served here)
- integrations/cline/CHANGELOG.md (not served here)
- integrations/cline/README.md (not served here)
- integrations/cline/cline_mcp_settings.json.example (not served here)
- integrations/cline/scripts/lint-mcp-refs.sh (not served here)
- integrations/codex-plugin/.agents/mcp.json.example (not served here)
- integrations/codex-plugin/.agents/plugins/marketplace.json (not served here)
- integrations/codex-plugin/.codex-plugin/plugin.json (not served here)
- integrations/codex-plugin/.mcp.json (not served here)
- integrations/codex-plugin/AGENTS.md (not served here)
- integrations/codex-plugin/CHANGELOG.md (not served here)
- integrations/codex-plugin/LICENSE
- integrations/codex-plugin/README.md (not served here)
- integrations/codex-plugin/assets/pensyve-icon.svg (not served here)
- integrations/codex-plugin/assets/pensyve-logo.svg (not served here)
- integrations/codex-plugin/commands/pensyve.md (not served here)
- integrations/codex-plugin/docs/ARCHITECTURE.md (not served here)
- integrations/codex-plugin/hooks/hooks.json (not served here)
- integrations/codex-plugin/hooks/session-start.md (not served here)
- integrations/codex-plugin/hooks/user-prompt-submit.md (not served here)
- integrations/codex-plugin/scripts/lint-mcp-refs.sh (not served here)
- integrations/codex-plugin/skills/context-loader/SKILL.md (not served here)
- integrations/codex-plugin/skills/memory-informed-refactor/SKILL.md (not served here)
- integrations/codex-plugin/skills/memory-review/SKILL.md (not served here)
- integrations/codex-plugin/skills/mention-workflow/SKILL.md (not served here)
- integrations/codex-plugin/skills/pensyve/SKILL.md (not served here)
- integrations/codex-plugin/skills/pensyve/agents/openai.yaml (not served here)
- integrations/codex-plugin/skills/session-memory/SKILL.md (not served here)
- integrations/continue/.continue/rules/context-loader.md (not served here)
- integrations/continue/.continue/rules/entity-detection.md (not served here)
- integrations/continue/.continue/rules/memory-informed-debug.md (not served here)
- integrations/continue/.continue/rules/memory-informed-design.md (not served here)
- integrations/continue/.continue/rules/memory-informed-longitudinal-work.md (not served here)
- integrations/continue/.continue/rules/memory-informed-refactor.md (not served here)
- integrations/continue/.continue/rules/memory-reflex.md (not served here)
- integrations/continue/.continue/rules/session-memory.md (not served here)
- integrations/continue/CHANGELOG.md (not served here)
- integrations/continue/README.md (not served here)
- integrations/continue/config.yaml.example (not served here)
- integrations/continue/scripts/lint-mcp-refs.sh (not served here)
- integrations/crewai/CHANGELOG.md (not served here)
- integrations/crewai/LICENSE
- integrations/crewai/README.md (not served here)
- integrations/crewai/SUBSTRATE_PROMPT.md (not served here)
- integrations/crewai/__init__.py (not served here)
- integrations/crewai/examples/pensyve_crew.py (not served here)
- integrations/crewai/pensyve_capture.py (not served here)
- integrations/crewai/pensyve_crewai.py (not served here)
- integrations/crewai/pyproject.toml (not served here)
- integrations/crewai/scripts/lint-mcp-refs.sh (not served here)
- integrations/crewai/src/__init__.py (not served here)
- integrations/crewai/src/_vendor/__init__.py (not served here)
- integrations/crewai/src/_vendor/memory_capture_core.py (not served here)
- integrations/crewai/tests/__init__.py (not served here)
- integrations/crewai/tests/test_pensyve_crewai.py (not served here)
- integrations/crewai/uv.lock (not served here)
- integrations/cursor/.cursor/mcp.json.example (not served here)
- integrations/cursor/.cursor/rules/context-loader.mdc (not served here)
- integrations/cursor/.cursor/rules/entity-detection.mdc (not served here)
- integrations/cursor/.cursor/rules/memory-informed-debug.mdc (not served here)
- integrations/cursor/.cursor/rules/memory-informed-design.mdc (not served here)
- integrations/cursor/.cursor/rules/memory-informed-longitudinal-work.mdc (not served here)
- integrations/cursor/.cursor/rules/memory-informed-refactor.mdc (not served here)
- integrations/cursor/.cursor/rules/memory-reflex.mdc (not served here)
- integrations/cursor/.cursor/rules/session-memory.mdc (not served here)
- integrations/cursor/CHANGELOG.md (not served here)
- integrations/cursor/README.md (not served here)
- integrations/cursor/scripts/lint-mcp-refs.sh (not served here)
- integrations/cursor/scripts/smoketest-mcp.sh (not served here)
- integrations/google-adk/CHANGELOG.md (not served here)
- integrations/google-adk/README.md (not served here)
- integrations/google-adk/SUBSTRATE_PROMPT.md (not served here)
- integrations/google-adk/examples/pensyve_agent.py (not served here)
- integrations/google-adk/scripts/lint-mcp-refs.sh (not served here)
- integrations/hermes/AGENTS.md (not served here)
- integrations/hermes/CHANGELOG.md (not served here)
- integrations/hermes/LICENSE
- integrations/hermes/README.md (not served here)
- integrations/hermes/__init__.py (not served here)
- integrations/hermes/hermes.mcp.json.example (not served here)
- integrations/hermes/scripts/lint-mcp-refs.sh (not served here)
- integrations/jetbrains/CHANGELOG.md (not served here)
- integrations/jetbrains/README.md (not served here)
- integrations/jetbrains/instructions/context-loader.md (not served here)
- integrations/jetbrains/instructions/entity-detection.md (not served here)
- integrations/jetbrains/instructions/memory-informed-debug.md (not served here)
- integrations/jetbrains/instructions/memory-informed-design.md (not served here)
- integrations/jetbrains/instructions/memory-informed-longitudinal-work.md (not served here)
- integrations/jetbrains/instructions/memory-informed-refactor.md (not served here)
- integrations/jetbrains/instructions/memory-reflex.md (not served here)
- integrations/jetbrains/instructions/session-memory.md (not served here)
- integrations/jetbrains/jetbrains-mcp.json.example (not served here)
- integrations/jetbrains/scripts/lint-mcp-refs.sh (not served here)
- integrations/kiro/.kiro/mcp.json.example (not served here)
- integrations/kiro/.kiro/steering/context-loader.md (not served here)
- integrations/kiro/.kiro/steering/entity-detection.md (not served here)
- integrations/kiro/.kiro/steering/memory-informed-debug.md (not served here)
- integrations/kiro/.kiro/steering/memory-informed-design.md (not served here)
- integrations/kiro/.kiro/steering/memory-informed-longitudinal-work.md (not served here)
- integrations/kiro/.kiro/steering/memory-informed-refactor.md (not served here)
- integrations/kiro/.kiro/steering/memory-reflex.md (not served here)
- integrations/kiro/.kiro/steering/session-memory.md (not served here)
- integrations/kiro/CHANGELOG.md (not served here)
- integrations/kiro/README.md (not served here)
- integrations/kiro/scripts/lint-mcp-refs.sh (not served here)
- integrations/langchain-ts/CHANGELOG.md (not served here)
- integrations/langchain-ts/LICENSE
- integrations/langchain-ts/README.md (not served here)
- integrations/langchain-ts/SUBSTRATE_PROMPT.md (not served here)
- integrations/langchain-ts/bun.lock (not served here)
- integrations/langchain-ts/examples/pensyve-agent.ts (not served here)
- integrations/langchain-ts/package-lock.json (not served here)
- integrations/langchain-ts/package.json (not served here)
- integrations/langchain-ts/scripts/lint-mcp-refs.sh (not served here)
- integrations/langchain-ts/src/_vendor/memory-capture-core.ts (not served here)
- integrations/langchain-ts/src/capture-handler.ts (not served here)
- integrations/langchain-ts/src/index.test.ts (not served here)
- integrations/langchain-ts/src/index.ts (not served here)
- integrations/langchain-ts/tsconfig.json (not served here)
- integrations/langchain-ts/vitest.config.ts (not served here)
- integrations/langchain/CHANGELOG.md (not served here)
- integrations/langchain/LICENSE
- integrations/langchain/README.md (not served here)
- integrations/langchain/SUBSTRATE_PROMPT.md (not served here)
- integrations/langchain/__init__.py (not served here)
- integrations/langchain/examples/pensyve_agent.py (not served here)
- integrations/langchain/pensyve_capture.py (not served here)
- integrations/langchain/pensyve_langchain.py (not served here)
- integrations/langchain/pyproject.toml (not served here)
- integrations/langchain/scripts/lint-mcp-refs.sh (not served here)
- integrations/langchain/src/__init__.py (not served here)
- integrations/langchain/src/_vendor/__init__.py (not served here)
- integrations/langchain/src/_vendor/memory_capture_core.py (not served here)
- integrations/langchain/tests/__init__.py (not served here)
- integrations/langchain/tests/conftest.py (not served here)
- integrations/langchain/tests/test_pensyve_langchain.py (not served here)
- integrations/langchain/uv.lock (not served here)
- integrations/neovim/CHANGELOG.md (not served here)
- integrations/neovim/README.md (not served here)
- integrations/neovim/instructions/context-loader.md (not served here)
- integrations/neovim/instructions/entity-detection.md (not served here)
- integrations/neovim/instructions/memory-informed-debug.md (not served here)
- integrations/neovim/instructions/memory-informed-design.md (not served here)
- integrations/neovim/instructions/memory-informed-longitudinal-work.md (not served here)
- integrations/neovim/instructions/memory-informed-refactor.md (not served here)
- integrations/neovim/instructions/memory-reflex.md (not served here)
- integrations/neovim/instructions/session-memory.md (not served here)
- integrations/neovim/neovim-mcp.json.example (not served here)
- integrations/neovim/scripts/lint-mcp-refs.sh (not served here)
- integrations/openclaw-plugin/AGENTS.md (not served here)
- integrations/openclaw-plugin/CHANGELOG.md (not served here)
- integrations/openclaw-plugin/LICENSE
- integrations/openclaw-plugin/README.md (not served here)
- integrations/openclaw-plugin/openclaw.mcp.json.example (not served here)
- integrations/openclaw-plugin/openclaw.plugin.json (not served here)
- integrations/openclaw-plugin/package-lock.json (not served here)
- integrations/openclaw-plugin/package.json (not served here)
- integrations/openclaw-plugin/scripts/lint-mcp-refs.sh (not served here)
- integrations/openclaw-plugin/src/index.test.ts (not served here)
- integrations/openclaw-plugin/src/index.ts (not served here)
- integrations/openclaw-plugin/tsconfig.json (not served here)
- integrations/openclaw-plugin/vitest.config.ts (not served here)
- integrations/opencode-plugin/AGENTS.md (not served here)
- integrations/opencode-plugin/CHANGELOG.md (not served here)
- integrations/opencode-plugin/LICENSE
- integrations/opencode-plugin/README.md (not served here)
- integrations/opencode-plugin/opencode.mcp.json.example (not served here)
- integrations/opencode-plugin/package-lock.json (not served here)
- integrations/opencode-plugin/package.json (not served here)
- integrations/opencode-plugin/scripts/lint-mcp-refs.sh (not served here)
- integrations/opencode-plugin/src/index.test.ts (not served here)
- integrations/opencode-plugin/src/index.ts (not served here)
- integrations/opencode-plugin/tsconfig.json (not served here)
- integrations/opencode-plugin/vitest.config.ts (not served here)
- integrations/pydantic-ai/CHANGELOG.md (not served here)
- integrations/pydantic-ai/README.md (not served here)
- integrations/pydantic-ai/SUBSTRATE_PROMPT.md (not served here)
- integrations/pydantic-ai/examples/pensyve_agent.py (not served here)
- integrations/pydantic-ai/scripts/lint-mcp-refs.sh (not served here)
- integrations/shared/memory-capture-core.test.ts (not served here)
- integrations/shared/memory-capture-core.ts (not served here)
- integrations/shared/memory_capture_core.py (not served here)
- integrations/shared/package-lock.json (not served here)
- integrations/shared/package.json (not served here)
- integrations/shared/pensyve-client.test.ts (not served here)
- integrations/shared/pensyve-client.ts (not served here)
- integrations/shared/pensyve_client.py (not served here)
- integrations/shared/tests/conftest.py (not served here)
- integrations/shared/tests/test_memory_capture_core.py (not served here)
- integrations/shared/vitest.config.ts (not served here)
- integrations/vscode-copilot/.github/copilot-instructions.md (not served here)
- integrations/vscode-copilot/CHANGELOG.md (not served here)
- integrations/vscode-copilot/README.md (not served here)
- integrations/vscode-copilot/scripts/lint-mcp-refs.sh (not served here)
- integrations/vscode-copilot/vscode-mcp.json.example (not served here)
- integrations/vscode/.gitignore (not served here)
- integrations/vscode/.vscodeignore (not served here)
- integrations/vscode/CHANGELOG.md (not served here)
- integrations/vscode/LICENSE
- integrations/vscode/README.md (not served here)
- integrations/vscode/instructions/context-loader.md (not served here)
- integrations/vscode/instructions/entity-detection.md (not served here)
- integrations/vscode/instructions/memory-informed-debug.md (not served here)
- integrations/vscode/instructions/memory-informed-design.md (not served here)
- integrations/vscode/instructions/memory-informed-longitudinal-work.md (not served here)
- integrations/vscode/instructions/memory-informed-refactor.md (not served here)
- integrations/vscode/instructions/memory-reflex.md (not served here)
- integrations/vscode/instructions/session-memory.md (not served here)
- integrations/vscode/package-lock.json (not served here)
- integrations/vscode/package.json (not served here)
- integrations/vscode/resources/icon.png (not served here)
- integrations/vscode/resources/icon.svg (not served here)
- integrations/vscode/scripts/lint-mcp-refs.sh (not served here)
- integrations/vscode/src/capture.ts (not served here)
- integrations/vscode/src/client.test.ts (not served here)
- integrations/vscode/src/client.ts (not served here)
- integrations/vscode/src/commands.ts (not served here)
- integrations/vscode/src/extension.ts (not served here)
- integrations/vscode/src/memory-capture-core.ts (not served here)
- integrations/vscode/src/sidebar.ts (not served here)
- integrations/vscode/tsconfig.json (not served here)
- integrations/windsurf/.windsurf/mcp_config.json.example (not served here)
- integrations/windsurf/.windsurf/rules/context-loader.md (not served here)
- integrations/windsurf/.windsurf/rules/entity-detection.md (not served here)
- integrations/windsurf/.windsurf/rules/memory-informed-debug.md (not served here)
- integrations/windsurf/.windsurf/rules/memory-informed-design.md (not served here)
- integrations/windsurf/.windsurf/rules/memory-informed-longitudinal-work.md (not served here)
- integrations/windsurf/.windsurf/rules/memory-informed-refactor.md (not served here)
- integrations/windsurf/.windsurf/rules/memory-reflex.md (not served here)
- integrations/windsurf/.windsurf/rules/session-memory.md (not served here)
- integrations/windsurf/CHANGELOG.md (not served here)
- integrations/windsurf/README.md (not served here)
- integrations/windsurf/scripts/lint-mcp-refs.sh (not served here)
- llms.txt (not served here)
- loadtest/Cargo.lock (not served here)
- loadtest/Cargo.toml (not served here)
- loadtest/src/main.rs (not served here)
- pensyve-benchmarks/.gitignore (not served here)
- pensyve-benchmarks/Cargo.toml (not served here)
- pensyve-benchmarks/fixtures/paraphrase_corpus.json (not served here)
- pensyve-benchmarks/results/paraphrase_baseline.json (not served here)
- pensyve-benchmarks/src/bin/judge_eval.rs (not served here)
- pensyve-benchmarks/src/bin/monte_carlo_eval.rs (not served here)
- pensyve-benchmarks/src/bin/paraphrase_eval.rs (not served here)
- pensyve-benchmarks/src/bin/real_content_eval.rs (not served here)
- pensyve-benchmarks/src/bin/sensitivity_sweep.rs (not served here)
- pensyve-benchmarks/src/corpus.rs (not served here)
- pensyve-benchmarks/src/fixture.rs (not served here)
- pensyve-benchmarks/src/judge.rs (not served here)
- pensyve-benchmarks/src/lib.rs (not served here)
- pensyve-benchmarks/src/metrics.rs (not served here)
- pensyve-benchmarks/src/resilience.rs (not served here)
- pensyve-benchmarks/src/sensitivity.rs (not served here)
- pensyve-benchmarks/src/stats.rs (not served here)
- pensyve-cli/Cargo.toml (not served here)
- pensyve-cli/src/main.rs (not served here)
- pensyve-cli/tests/embedding_space_storage.rs (not served here)
- pensyve-core/Cargo.toml (not served here)
- pensyve-core/benches/cognitive_engine.rs (not served here)
- pensyve-core/src/a2a.rs (not served here)
- pensyve-core/src/activation.rs (not served here)
- pensyve-core/src/classifier.rs (not served here)
- pensyve-core/src/config.rs (not served here)
- pensyve-core/src/consolidation/dmem.rs (not served here)
- pensyve-core/src/consolidation/gate.rs (not served here)
- pensyve-core/src/consolidation/mod.rs (not served here)
- pensyve-core/src/consolidation/typed_slots.rs (not served here)
- pensyve-core/src/decay.rs (not served here)
- pensyve-core/src/embedding.rs (not served here)
- pensyve-core/src/embedding_migration.rs (not served here)
- pensyve-core/src/embedding_space.rs (not served here)
- pensyve-core/src/extraction/dep_parse.rs (not served here)
- pensyve-core/src/extraction/mod.rs (not served here)
- pensyve-core/src/feedback.rs (not served here)
- pensyve-core/src/gdpr.rs (not served here)
- pensyve-core/src/graph.rs (not served here)
- pensyve-core/src/lib.rs (not served here)
- pensyve-core/src/mesh.rs (not served here)
- pensyve-core/src/multimodal.rs (not served here)
- pensyve-core/src/namespace_export.rs (not served here)
- pensyve-core/src/network_policy.rs (not served here)
- pensyve-core/src/observability.rs (not served here)
- pensyve-core/src/observation.rs (not served here)
- pensyve-core/src/ocr.rs (not served here)
- pensyve-core/src/peer_card.rs (not served here)
- pensyve-core/src/procedural.rs (not served here)
- pensyve-core/src/recall_grouped.rs (not served here)
- pensyve-core/src/reranker.rs (not served here)
- pensyve-core/src/retrieval/cards/composite.rs (not served here)
- pensyve-core/src/retrieval/cards/mod.rs (not served here)
- pensyve-core/src/retrieval/cards/multi_session.rs (not served here)
- pensyve-core/src/retrieval/cards/peer_card_adapter.rs (not served here)
- pensyve-core/src/retrieval/cards/single_session_user.rs (not served here)
- pensyve-core/src/retrieval/cards/supersession.rs (not served here)
- pensyve-core/src/retrieval/contradictions.rs (not served here)
- pensyve-core/src/retrieval/diversity.rs (not served here)
- pensyve-core/src/retrieval/engine.rs (not served here)
- pensyve-core/src/retrieval/intent_router.rs (not served here)
- pensyve-core/src/retrieval/mod.rs (not served here)
- pensyve-core/src/retrieval/ppr.rs (not served here)
- pensyve-core/src/retrieval/query_classifier.rs (not served here)
- pensyve-core/src/retrieval/vendi.rs (not served here)
- pensyve-core/src/rrf.rs (not served here)
- pensyve-core/src/salience.rs (not served here)
- pensyve-core/src/snapshot.rs (not served here)
- pensyve-core/src/storage/bounded.rs (not served here)
- pensyve-core/src/storage/consolidation_workspace.rs (not served here)
- pensyve-core/src/storage/mod.rs (not served here)
- pensyve-core/src/storage/postgres.rs (not served here)
- pensyve-core/src/storage/postgres/live_rls.rs (not served here)
- pensyve-core/src/storage/postgres/scoped_pool.rs (not served here)
- pensyve-core/src/storage/postgres_schema.sql (not served here)
- pensyve-core/src/storage/sqlite.rs (not served here)
- pensyve-core/src/surprise.rs (not served here)
- pensyve-core/src/sync.rs (not served here)
- pensyve-core/src/types.rs (not served here)
- pensyve-core/src/vector.rs (not served here)
- pensyve-core/tests/adversarial.rs (not served here)
- pensyve-core/tests/forget_snapshot_scope.rs (not served here)
- pensyve-core/tests/network_policy_fail_closed.rs (not served here)
- pensyve-core/tests/test_bounded_consolidation.rs (not served here)
- pensyve-core/tests/test_bounded_storage.rs (not served here)
- pensyve-core/tests/test_composite_card.rs (not served here)
- pensyve-core/tests/test_consolidation_concurrent_runs.rs (not served here)
- pensyve-core/tests/test_consolidation_idempotency.rs (not served here)
- pensyve-core/tests/test_consolidation_policy_and_cancel.rs (not served here)
- pensyve-core/tests/test_consolidation_supersession_guard.rs (not served here)
- pensyve-core/tests/test_diversity.rs (not served here)
- pensyve-core/tests/test_embedding_migration.rs (not served here)
- pensyve-core/tests/test_embedding_space.rs (not served here)
- pensyve-core/tests/test_extractor_cancellation.rs (not served here)
- pensyve-core/tests/test_gate_wiring.rs (not served here)
- pensyve-core/tests/test_intent_router.rs (not served here)
- pensyve-core/tests/test_migration_idempotency.rs (not served here)
- pensyve-core/tests/test_ms_card_v2.rs (not served here)
- pensyve-core/tests/test_multi_session_card.rs (not served here)
- pensyve-core/tests/test_namespace_scoping.rs (not served here)
- pensyve-core/tests/test_no_network_invariants.rs (not served here)
- pensyve-core/tests/test_pensyve_handle_policy_propagation.rs (not served here)
- pensyve-core/tests/test_retrieval_card_trait.rs (not served here)
- pensyve-core/tests/test_schema_v2_migration.rs (not served here)
- pensyve-core/tests/test_schema_v4_migration.rs (not served here)
- pensyve-core/tests/test_schema_v5_migration.rs (not served here)
- pensyve-core/tests/test_schema_v6_migration.rs (not served here)
- pensyve-core/tests/test_single_session_user_card.rs (not served here)
- pensyve-core/tests/test_supersession_card.rs (not served here)
- pensyve-core/tests/test_typed_slots.rs (not served here)
- pensyve-go/LICENSE
- pensyve-go/README.md (not served here)
- pensyve-go/client.go (not served here)
- pensyve-go/client_test.go (not served here)
- pensyve-go/episode.go (not served here)
- pensyve-go/errors.go (not served here)
- pensyve-go/go.mod (not served here)
- pensyve-go/retry.go (not served here)
- pensyve-go/retry_test.go (not served here)
- pensyve-go/types.go (not served here)
- pensyve-mcp-gateway/Cargo.toml (not served here)
- pensyve-mcp-gateway/Dockerfile (not served here)
- pensyve-mcp-gateway/README.md (not served here)
- pensyve-mcp-gateway/entrypoint.sh (not served here)
- pensyve-mcp-gateway/models/manifest.sha256 (not served here)
- pensyve-mcp-gateway/models/revisions.env (not served here)
- pensyve-mcp-gateway/scripts/fetch-model-bundle.sh (not served here)
- pensyve-mcp-gateway/scripts/test-model-bundle.sh (not served here)
- server.json
- smithery.yaml
Advantages
- Provides persistent, cross-session memory that functions independently of the language model's training. evidence: README.md
- Supports multiple integration methods including Python, MCP, and REST API for flexibility across different agent architectures. evidence: README.md
Limitations
- Embedding models may require initial download, and running without network access requires pre-caching model files. evidence: README.md
- The project is in maintenance mode, meaning no new features are planned, with updates limited to security and dependency maintenance. evidence: README.md
Security
Risk level: No risk found
This brain runs
Agent instructions that run or fetch something (48)
AGENTS.md:**`README.md`** — overview, install, quick-start examples.AGENTS.md:**`docs/GETTING_STARTED.md`** — first-run walkthrough for new contributors.AGENTS.md:make build # Full build (Rust + PyO3 into .venv)AGENTS.md:make test # Rust + Python testsAGENTS.md:make lint # clippy --workspace + ruff check + pyrightAGENTS.md:make format # cargo fmt + ruff formatAGENTS.md:make check # Rust + Python lint and tests; run SDK checks separatelyAGENTS.md:.venv/bin/pytest tests/python/ -v # Python tests (requires `make build` first)AGENTS.md:cargo run -p pensyve-mcp-gateway # HTTP gateway (port 3000)AGENTS.md:cargo run -p pensyve-cli -- recall "q" # CLIAGENTS.md:cargo run -p pensyve-mcp # MCP stdio serverAGENTS.md:Python env setup: `uv sync --extra dev && uv run maturin develop --manifest-path pensyve-python/Cargo.toml`AGENTS.md:Use `git add` with specific filenames.AGENTS.md:Run `make check` before pushing.integrations/antigravity-plugin/skills/context-loader/SKILL.md:If the user explicitly opts into cross-entity discovery, run targeted recall queries with `types: ["episodic", "procedural", "semantic"]`, `limit: 5`, and label the results as top matches ranked by relevance/RRF score.integrations/antigravity-plugin/skills/memory-informed-refactor/SKILL.md:Run multiple `pensyve_recall` queries to gather comprehensive context about the target within the shared recall budget:integrations/antigravity-plugin/skills/memory-review/SKILL.md:If no entity is specified, run a broad `pensyve_recall` query with `"*"` (limit: 50) to discover entities, then inspect the top entities found.integrations/antigravity-plugin/skills/session-memory/SKILL.md:Then run `pensyve_recall` with a query matching the sanitized candidate fact.integrations/claude-code/skills/context-loader/SKILL.md:Run the following `pensyve_recall` queries to gather session context:integrations/claude-code/skills/memory-informed-design/SKILL.md:If the design process revealed a reusable way to evaluate similar decisions (e.g., "run spike vs.integrations/claude-code/skills/memory-informed-longitudinal-work/SKILL.md:| What you learned | Type | Example | |---|---|---| | Per-run outcome (what this run showed) | episodic | "Run N+1: V7r accuracy improved +3.5% with new threshold" | | Stable truth about the system | semantic | "Haiku classifier plateaus above temp 0.3" | | Reusable experiment procedure …[+83 chars]integrations/claude-code/skills/memory-informed-longitudinal-work/SKILL.md:When a run ends with an unresolved question ("X improved but we don't know why"), capture it as an episodic observation with open-question provenance:integrations/claude-code/skills/memory-informed-longitudinal-work/SKILL.md:Before Stop fires, briefly summarize (inline, 3-5 lines): what this run taught us vs.integrations/claude-code/skills/memory-informed-refactor/SKILL.md:Run multiple `pensyve_recall` queries to gather comprehensive context about the target:integrations/claude-code/skills/memory-review/SKILL.md:If no entity is specified, run a broad `pensyve_recall` query with `"*"` (limit: 50) to discover entities, then inspect the top entities found.integrations/claude-code/skills/memory-review/SKILL.md:**Consolidation**: Suggest running `/consolidate` (this skill does not run consolidation directly).integrations/claude-code/skills/session-memory/SKILL.md:Before storing, run `pensyve_recall` with a query matching the candidate fact to check for duplicates.integrations/codex-plugin/AGENTS.md:| What you learned | Type | Call | |---|---|---| | Per-run outcome | episodic | `pensyve_observe(..., content: "[proactive/in-flight/tier-1] Run N+1: ...", source_entity: "codex", about_entity: <entity>, content_type: "text")` | | Stable truth | semantic | `pensyve_remember(entity, fac …[+280 chars]integrations/codex-plugin/AGENTS.md:Before wrapping: summarize what this run taught vs.integrations/codex-plugin/skills/context-loader/SKILL.md:Run the following `pensyve_recall` queries to gather session context:integrations/codex-plugin/skills/memory-informed-refactor/SKILL.md:Run multiple `pensyve_recall` queries to gather comprehensive context about the target:integrations/codex-plugin/skills/memory-review/SKILL.md:If no entity is specified, run a broad `pensyve_recall` query with `"*"` (limit: 50) to discover entities, then inspect the top entities found.integrations/codex-plugin/skills/session-memory/SKILL.md:Before storing, run `pensyve_recall` with a query matching the candidate fact to check for duplicates.integrations/hermes/AGENTS.md:| What you learned | Type | Call | |---|---|---| | Per-run outcome | episodic | `pensyve_observe(..., content: "[proactive/in-flight/tier-1] Run N+1: ...", source_entity: "hermes", about_entity: <entity>, content_type: "text")` | | Stable truth | semantic | `pensyve_remember(entity, fa …[+282 chars]integrations/hermes/AGENTS.md:Before wrapping: summarize what this run taught vs.integrations/openclaw-plugin/AGENTS.md:| What you learned | Type | Call | |---|---|---| | Per-run outcome | episodic | `pensyve_observe(..., content: "[proactive/in-flight/tier-1] Run N+1: ...", source_entity: "openclaw", about_entity: <entity>, content_type: "text")` | | Stable truth | semantic | `pensyve_remember(entity, …[+286 chars]integrations/openclaw-plugin/AGENTS.md:Before wrapping: summarize what this run taught vs.integrations/opencode-plugin/AGENTS.md:| What you learned | Type | Call | |---|---|---| | Per-run outcome | episodic | `pensyve_observe(..., content: "[proactive/in-flight/tier-1] Run N+1: ...", source_entity: "opencode", about_entity: <entity>, content_type: "text")` | | Stable truth | semantic | `pensyve_remember(entity, …[+286 chars]integrations/opencode-plugin/AGENTS.md:Before wrapping: summarize what this run taught vs.pensyve-ts/CLAUDE.md:Use `bun <file>` instead of `node <file>` or `ts-node <file>`pensyve-ts/CLAUDE.md:Use `bun test` instead of `jest` or `vitest`pensyve-ts/CLAUDE.md:Use `bun build <file.html|file.ts|file.css>` instead of `webpack` or `esbuild`pensyve-ts/CLAUDE.md:Use `bun install` instead of `npm install` or `yarn install` or `pnpm install`pensyve-ts/CLAUDE.md:Use `bun run <script>` instead of `npm run <script>` or `yarn run <script>` or `pnpm run <script>`pensyve-ts/CLAUDE.md:Use `bunx <package> <command>` instead of `npx <package> <command>`pensyve-ts/CLAUDE.md:Use `bun test` to run tests.pensyve-ts/CLAUDE.md:Then, run index.tspensyve-ts/CLAUDE.md:bun --hot ./index.ts
MCP servers (2)
README.md(pensyve):pensyve-mcp --stdiointegrations/codex-plugin/.mcp.json(pensyve):pensyve-mcp --stdio
Hooks (8)
integrations/claude-code/hooks/hooks.json(SessionStart):cat "${CLAUDE_PLUGIN_ROOT}/hooks/session-start.md"integrations/claude-code/hooks/hooks.json(PostToolUse):cat "${CLAUDE_PLUGIN_ROOT}/hooks/post-tool-write-edit.md"integrations/claude-code/hooks/hooks.json(PostToolUse):cat "${CLAUDE_PLUGIN_ROOT}/hooks/post-tool-bash.md"integrations/claude-code/hooks/hooks.json(PreCompact):cat "${CLAUDE_PLUGIN_ROOT}/hooks/pre-compact.md"integrations/claude-code/hooks/hooks.json(Stop):cat "${CLAUDE_PLUGIN_ROOT}/hooks/stop.md"integrations/claude-code/hooks/hooks.json(UserPromptSubmit):cat "${CLAUDE_PLUGIN_ROOT}/hooks/user-prompt-submit.md"integrations/codex-plugin/hooks/hooks.json(SessionStart):cat "${PLUGIN_ROOT}/hooks/session-start.md"integrations/codex-plugin/hooks/hooks.json(UserPromptSubmit):cat "${PLUGIN_ROOT}/hooks/user-prompt-submit.md"
Attribution and licence
- Created by
- Major 7 Apps LLC
- Declared authors
- Major7 Apps (declared in pyproject.toml)
- Publisher
- Major 7 Apps LLC (Official Major 7 Apps LLC project)
- Source
- major7apps/pensyve · commit d2c56fa
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Major 7 Apps LLC.
Install from source
482 of its files are not served here, so there is no ZIP. major7apps/pensyve at d2c56fa