Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
378 changes: 189 additions & 189 deletions .aiwg/reports/g-icm-01-interface-inventory.json

Large diffs are not rendered by default.

7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@ Adversarial-review fixes over the shipped sync wave.

### Fixed

- **Graphify import path scoping** (security). An explicit path on `mem::graph::import-graphify` (`POST /agentmemory/graph/import-graphify`) could point anywhere the daemon can read. Explicit paths must now resolve inside the requested project cwd and keep the `graph.json` basename; violations return a generic error that never echoes the attempted path, and stat failures for explicit paths stay equally non-specific.
- **Graphify import path scoping** (security). An explicit `path`/`cwd` on `mem::graph::import-graphify` (`POST /agentmemory/graph/import-graphify`) could point anywhere the daemon can read — both fields were client-controlled, and a symlinked `graph.json` escaped the containment check. Explicit path/cwd imports are now ADMIN-only: the REST route requires administrative authorization whenever a request carries either field, while capability callers import the default `<daemon-cwd>/graphify-out/graph.json` (failing honestly when absent). The engine anchors its computed default to its own working directory, ignores caller-supplied cwd values, keeps the `graph.json` basename and under-daemon-cwd checks as defense in depth; violations return a generic error that never echoes the attempted path, and stat failures for explicit paths stay equally non-specific.
- **Credential redaction in the identity-fallback warning** (security). The stderr warning for an unnormalizable git remote wrote the raw `git remote get-url` output, leaking embedded passwords; remotes are masked before logging (scheme and host/path preserved, credentials replaced).
- **Project capability secret hardening** (security). Zero-touch provisioning creates the credential directory with mode 0700, refuses a symlink parked at the credential path instead of following it, keeps a pre-existing populated secret when only its permission tightening fails, and removes a freshly written secret whose securing chmod failed rather than leaving it readable.
- **`--data-dir` honored during `.env` hydration** (correctness). The CLI hydrated `<data-dir>/.env` before folding the flag into the environment, so a flagged run silently read its `.env` from the default `~/.agentmemory`; the fold now happens first.
- **Standalone MCP persist path follows the data dir** (correctness). The shim kept a duplicate resolver pinned to `~/.agentmemory`; it now delegates to the shared config resolver after folding `.env`, preserving the `STANDALONE_PERSIST_PATH` override while honoring `AGENTMEMORY_DATA_DIR`.
- **Consolidation cooldown released on rejected dispatch** (correctness). A rejected `mem::consolidate-pipeline` / `mem::auto-crystallize` Void dispatch left the cooldown marker standing for the whole window with no pipeline behind it; rejection handlers clear the marker best-effort so the next eligible stop retries.
- **Consolidation cooldown released on rejected dispatch** (correctness). A rejected `mem::consolidate-pipeline` / `mem::auto-crystallize` Void dispatch left the cooldown marker standing for the whole window with no pipeline behind it; rejection handlers clear the marker best-effort so the next eligible stop retries. Follow-up hardening closed two races in that release: each dispatch now claims the marker with its own token and deletes on rejection only when the marker still carries it, so a rejected crystallize can no longer clear the debounce under a still-running pipeline, and a late rejection from an older cycle cannot erase a newer cycle's fresh marker.
- **CLI boot ordering** (correctness). `--help` printed usage after the legacy-data-dir warning ran, emitting spurious stderr noise on every help invocation; help now exits right after flag parsing. The legacy warning itself moved after `.env` hydration so an `AGENTMEMORY_DATA_DIR` declared only in `<data-dir>/.env` suppresses it instead of producing a false alarm.
- **Standalone persist path trim restored** (correctness). A whitespace-only `STANDALONE_PERSIST_PATH` was honored verbatim as a relative file path; the value is trimmed first and empty results fall back to `<data-dir>/standalone.json`.
- **Capability provisioning failures are logged** (info). `connect` and onboarding swallowed credential-provisioning errors silently; both now write one stderr line pointing at `agentmemory doctor`, keeping the never-block-wiring semantics.
- **Origin provenance on peer Memory upserts** (security). Mesh receive/pull wrote peer memories without provenance; records lacking an Origin now gain shared-channel provenance via the shared keep-or-mark factory, and peer-provided origins are preserved.
- **Search-index readiness after startup reconciliation** (perf). Reconciliation walks the full memory corpus but never marked the index ready, forcing live saves onto full-scan fallbacks until an explicit rebuild; success now sets the same readiness flag a rebuild does.
- **Per-project user overrides follow the data dir** (info). User project config overrides are read from `<data-dir>/projects/<hash>.yaml`, falling back to the legacy `~/.agentmemory/projects/<hash>.yaml` copy so existing overrides keep working.
Expand Down
2 changes: 1 addition & 1 deletion ci/r13-test-manifest.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"count": 176,
"sha256": "4ef314289367720f8cbe199ca8f2823eea416ec3fa0c861fefcbaf0550d530f1",
"content_sha256": "542b9f58957d1ac9fa9421abb47bbd4a985dae5a3a1fe6ee4b2f1916d527693e"
"content_sha256": "87a73e351114bac87891494dcb5115636a51608b7c7f8cc0f79ca8809a13145d"
}
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@agentmemory/agentmemory",
"version": "0.9.30-chronode.2",
"version": "0.9.30-chronode.3",
"description": "Persistent memory for AI coding agents, powered by iii-engine's three primitives",
"type": "module",
"main": "dist/index.mjs",
Expand Down
4 changes: 2 additions & 2 deletions packages/mcp/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@agentmemory/mcp",
"version": "0.9.30-chronode.2",
"version": "0.9.30-chronode.3",
"description": "Standalone MCP server for agentmemory — thin shim that re-exposes @agentmemory/agentmemory's MCP entrypoint",
"type": "module",
"bin": {
Expand Down Expand Up @@ -28,7 +28,7 @@
"homepage": "https://github.com/rohitg00/agentmemory#readme",
"bugs": "https://github.com/rohitg00/agentmemory/issues",
"dependencies": {
"@agentmemory/agentmemory": "0.9.30-chronode.2"
"@agentmemory/agentmemory": "0.9.30-chronode.3"
},
"publishConfig": {
"access": "public",
Expand Down
2 changes: 1 addition & 1 deletion plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agentmemory",
"version": "0.9.30-chronode.2",
"version": "0.9.30-chronode.3",
"description": "Persistent memory for AI coding agents -- captures tool usage, compresses via LLM, injects context into future sessions. 12 hooks, 60 MCP tools, 17 skills, real-time viewer.",
"author": {
"name": "Rohit Ghumare",
Expand Down
2 changes: 1 addition & 1 deletion plugin/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agentmemory",
"version": "0.9.30-chronode.2",
"version": "0.9.30-chronode.3",
"description": "Persistent memory for AI coding agents -- captures tool usage, compresses via LLM, injects context into future sessions. 11 hooks, 60 MCP tools, 17 skills, real-time viewer.",
"author": {
"name": "Rohit Ghumare",
Expand Down
2 changes: 1 addition & 1 deletion plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agentmemory",
"version": "0.9.30-chronode.2",
"version": "0.9.30-chronode.3",
"description": "Persistent memory for AI coding agents -- captures tool usage, compresses via LLM, injects context into future sessions. 12 hooks, 60 MCP tools, 17 skills, real-time viewer.",
"author": {
"name": "Rohit Ghumare",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { i as isStrictCapabilityMode, n as PROJECT_CAPABILITY_PROJECT_HEADER, o as hydrateProcessEnvFromFile, r as createProjectCapabilityToken, s as resolveDataDir } from "./auth-DkiaFluQ.mjs";
import { i as isStrictCapabilityMode, n as PROJECT_CAPABILITY_PROJECT_HEADER, o as hydrateProcessEnvFromFile, r as createProjectCapabilityToken, s as resolveDataDir } from "./auth-DYDHBWPd.mjs";
import { createRequire } from "node:module";
import { existsSync, readFileSync, realpathSync } from "node:fs";
import { isAbsolute, join, relative, resolve } from "node:path";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { a as normalizedProjectPath, r as isProjectPathExcluded } from "./_auth-1Z57rc-e.mjs";
import { a as normalizedProjectPath, r as isProjectPathExcluded } from "./_auth-CBScPKV6.mjs";
import { resolve } from "node:path";
import { createHash } from "node:crypto";
import { execFileSync } from "node:child_process";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { n as projectAuthHeaders } from "./_auth-1Z57rc-e.mjs";
import { n as projectAuthHeaders } from "./_auth-CBScPKV6.mjs";
//#region src/hooks/_delivery.ts
var HookDeliveryError = class extends Error {
retryable;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { n as projectAuthHeaders } from "./_auth-1Z57rc-e.mjs";
import { n as projectAuthHeaders } from "./_auth-CBScPKV6.mjs";
//#region src/hooks/_observe-delivery.ts
const MAX_ATTEMPTS = 2;
const REQUEST_TIMEOUT_MS = 250;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { i as loadAgentmemoryEnvironment, o as resolveProjectConfig } from "./_auth-1Z57rc-e.mjs";
import { i as loadAgentmemoryEnvironment, o as resolveProjectConfig } from "./_auth-CBScPKV6.mjs";
//#region src/hooks/_project.ts
loadAgentmemoryEnvironment();
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ function getMergedEnv(overrides) {
};
}
function getStandalonePersistPath() {
return getMergedEnv()["STANDALONE_PERSIST_PATH"] || join(resolveDataDir(), "standalone.json");
const configured = getMergedEnv()["STANDALONE_PERSIST_PATH"]?.trim();
return configured ? configured : join(resolveDataDir(), "standalone.json");
}
randomBytes(32);
const PROJECT_CAPABILITY_TOKEN_VERSION = "amcap1";
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/notification.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BSYpE5r3.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BsKR4_co.mjs";
//#region src/hooks/notification.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
6 changes: 3 additions & 3 deletions plugin/scripts/post-commit.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-BPnYIm56.mjs";
import { n as credentialFreeWorktreeId, r as parseCommitTransitions } from "./_capture-Ba1NCNW7.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-Bevmy6M8.mjs";
import { n as credentialFreeWorktreeId, r as parseCommitTransitions } from "./_capture-DH0HGaDe.mjs";
import { resolve } from "node:path";
import { execFile } from "node:child_process";
import { pathToFileURL } from "node:url";
Expand Down
6 changes: 3 additions & 3 deletions plugin/scripts/post-tool-failure.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node
import { o as resolveProjectConfig } from "./_auth-1Z57rc-e.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BSYpE5r3.mjs";
import { t as captureToolEvent } from "./_capture-Ba1NCNW7.mjs";
import { o as resolveProjectConfig } from "./_auth-CBScPKV6.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BsKR4_co.mjs";
import { t as captureToolEvent } from "./_capture-DH0HGaDe.mjs";
//#region src/hooks/post-tool-failure.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
6 changes: 3 additions & 3 deletions plugin/scripts/post-tool-use.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node
import { o as resolveProjectConfig } from "./_auth-1Z57rc-e.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BSYpE5r3.mjs";
import { t as captureToolEvent } from "./_capture-Ba1NCNW7.mjs";
import { o as resolveProjectConfig } from "./_auth-CBScPKV6.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BsKR4_co.mjs";
import { t as captureToolEvent } from "./_capture-DH0HGaDe.mjs";
//#region src/hooks/post-tool-use.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/pre-compact.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { i as loadAgentmemoryEnvironment, n as projectAuthHeaders, t as contextAcknowledgementSecret } from "./_auth-1Z57rc-e.mjs";
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { i as loadAgentmemoryEnvironment, n as projectAuthHeaders, t as contextAcknowledgementSecret } from "./_auth-CBScPKV6.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { createHash, createHmac, randomUUID } from "node:crypto";
//#region src/hooks/pre-compact.ts
function isSdkChildContext(payload) {
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/pre-tool-use.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { i as loadAgentmemoryEnvironment, n as projectAuthHeaders } from "./_auth-1Z57rc-e.mjs";
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { i as loadAgentmemoryEnvironment, n as projectAuthHeaders } from "./_auth-CBScPKV6.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
//#region src/hooks/pre-tool-use.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/prompt-submit.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BSYpE5r3.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BsKR4_co.mjs";
//#region src/hooks/prompt-submit.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/session-end.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-BPnYIm56.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-Bevmy6M8.mjs";
//#region src/hooks/session-end.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
6 changes: 3 additions & 3 deletions plugin/scripts/session-start.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node
import { o as resolveProjectConfig } from "./_auth-1Z57rc-e.mjs";
import "./_project-BqDfPlX6.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-BPnYIm56.mjs";
import { o as resolveProjectConfig } from "./_auth-CBScPKV6.mjs";
import "./_project-BQWFXz1a.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-Bevmy6M8.mjs";
//#region src/hooks/session-start.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/standalone.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { n as generateId, t as KV } from "./schema-Dttua2Zo.mjs";
import { a as getStandalonePersistPath$1, i as isStrictCapabilityMode, n as PROJECT_CAPABILITY_PROJECT_HEADER, o as hydrateProcessEnvFromFile, r as createProjectCapabilityToken } from "./auth-DkiaFluQ.mjs";
import { a as getStandalonePersistPath$1, i as isStrictCapabilityMode, n as PROJECT_CAPABILITY_PROJECT_HEADER, o as hydrateProcessEnvFromFile, r as createProjectCapabilityToken } from "./auth-DYDHBWPd.mjs";
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { homedir } from "node:os";
Expand Down Expand Up @@ -1761,7 +1761,7 @@ function getAllTools() {
}
//#endregion
//#region src/version.ts
const VERSION = "0.9.30-chronode.2";
const VERSION = "0.9.30-chronode.3";
process.env["AGENTMEMORY_BUILD_ID"];
process.env["AGENTMEMORY_VIEWER_BUILD_ID"];
//#endregion
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/stop.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-BPnYIm56.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportHookDeliveryFailure, t as deliverProjectRequest } from "./_delivery-Bevmy6M8.mjs";
//#region src/hooks/stop.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/subagent-start.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BSYpE5r3.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BsKR4_co.mjs";
//#region src/hooks/subagent-start.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/subagent-stop.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BSYpE5r3.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BsKR4_co.mjs";
//#region src/hooks/subagent-stop.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
4 changes: 2 additions & 2 deletions plugin/scripts/task-completed.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node
import { t as resolveProject } from "./_project-BqDfPlX6.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BSYpE5r3.mjs";
import { t as resolveProject } from "./_project-BQWFXz1a.mjs";
import { n as reportObservationDeliveryFailure, t as deliverObservation } from "./_observe-delivery-BsKR4_co.mjs";
//#region src/hooks/task-completed.ts
function isSdkChildContext(payload) {
if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
Expand Down
Loading
Loading