@agentmemory/agentmemory 0.9.29 → 0.9.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/.env.example +83 -22
  2. package/AGENTS.md +17 -24
  3. package/README.md +447 -170
  4. package/dist/.env.example +83 -22
  5. package/dist/cli.d.mts.map +1 -1
  6. package/dist/cli.mjs +1221 -335
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/{connect-Qaeq15TQ.mjs → connect-B4_ca6BD.mjs} +30 -39
  9. package/dist/connect-B4_ca6BD.mjs.map +1 -0
  10. package/dist/docker-compose.yml +40 -14
  11. package/dist/hooks/_capture.d.mts +22 -0
  12. package/dist/hooks/_capture.d.mts.map +1 -0
  13. package/dist/hooks/_capture.mjs +908 -0
  14. package/dist/hooks/_capture.mjs.map +1 -0
  15. package/dist/hooks/antigravity-bridge.d.mts +1 -1
  16. package/dist/hooks/antigravity-bridge.d.mts.map +1 -1
  17. package/dist/hooks/antigravity-bridge.mjs +24 -15
  18. package/dist/hooks/antigravity-bridge.mjs.map +1 -1
  19. package/dist/hooks/notification.mjs +17 -25
  20. package/dist/hooks/notification.mjs.map +1 -1
  21. package/dist/hooks/post-commit.mjs +71 -1
  22. package/dist/hooks/post-commit.mjs.map +1 -1
  23. package/dist/hooks/post-tool-failure.mjs +59 -25
  24. package/dist/hooks/post-tool-failure.mjs.map +1 -1
  25. package/dist/hooks/post-tool-use.mjs +87 -35
  26. package/dist/hooks/post-tool-use.mjs.map +1 -1
  27. package/dist/hooks/pre-compact.mjs +83 -3
  28. package/dist/hooks/pre-compact.mjs.map +1 -1
  29. package/dist/hooks/pre-tool-use.mjs +71 -1
  30. package/dist/hooks/pre-tool-use.mjs.map +1 -1
  31. package/dist/hooks/prompt-submit.mjs +13 -21
  32. package/dist/hooks/prompt-submit.mjs.map +1 -1
  33. package/dist/hooks/session-end.mjs +25 -20
  34. package/dist/hooks/session-end.mjs.map +1 -1
  35. package/dist/hooks/session-start.mjs +80 -3
  36. package/dist/hooks/session-start.mjs.map +1 -1
  37. package/dist/hooks/stop.mjs +71 -1
  38. package/dist/hooks/stop.mjs.map +1 -1
  39. package/dist/hooks/subagent-start.mjs +16 -25
  40. package/dist/hooks/subagent-start.mjs.map +1 -1
  41. package/dist/hooks/subagent-stop.mjs +17 -25
  42. package/dist/hooks/subagent-stop.mjs.map +1 -1
  43. package/dist/hooks/task-completed.mjs +19 -27
  44. package/dist/hooks/task-completed.mjs.map +1 -1
  45. package/dist/iii-config.docker.yaml +10 -10
  46. package/dist/iii-config.yaml +3 -1
  47. package/dist/{image-refs-BKLmp_sD.mjs → image-refs-BaT-9oMU.mjs} +2 -2
  48. package/dist/image-refs-BaT-9oMU.mjs.map +1 -0
  49. package/dist/{image-refs-CJgZmb9X.mjs → image-refs-T_urbwHM.mjs} +3 -3
  50. package/dist/image-refs-T_urbwHM.mjs.map +1 -0
  51. package/dist/{keyed-mutex-DTHtcZrt.mjs → image-store-BsN4vyjr.mjs} +2 -14
  52. package/dist/image-store-BsN4vyjr.mjs.map +1 -0
  53. package/dist/index.mjs +12943 -6218
  54. package/dist/index.mjs.map +1 -1
  55. package/dist/{schema-BFZhNTF7.mjs → keyed-mutex-DchXsyfP.mjs} +28 -4
  56. package/dist/keyed-mutex-DchXsyfP.mjs.map +1 -0
  57. package/dist/secret-store-BnY3A50C.mjs +2348 -0
  58. package/dist/secret-store-BnY3A50C.mjs.map +1 -0
  59. package/dist/{src-G7yt8gGm.mjs → src-Jsq9LCeH.mjs} +5941 -2180
  60. package/dist/src-Jsq9LCeH.mjs.map +1 -0
  61. package/dist/{standalone-BqNJDJ04.mjs → standalone-DKCdrf1d.mjs} +39 -12
  62. package/dist/standalone-DKCdrf1d.mjs.map +1 -0
  63. package/dist/standalone.d.mts.map +1 -1
  64. package/dist/standalone.mjs +249 -14
  65. package/dist/standalone.mjs.map +1 -1
  66. package/dist/status-IRz7ta8-.mjs +2344 -0
  67. package/dist/status-IRz7ta8-.mjs.map +1 -0
  68. package/dist/viewer/index.html +7224 -2794
  69. package/docker-compose.yml +40 -14
  70. package/iii-config.docker.yaml +10 -10
  71. package/iii-config.yaml +3 -1
  72. package/integrations/pi/index.ts +2 -3
  73. package/integrations/pi/security.ts +52 -0
  74. package/package.json +13 -4
  75. package/plugin/.claude-plugin/plugin.json +2 -2
  76. package/plugin/.codex-plugin/plugin.json +26 -4
  77. package/plugin/.devin-plugin/plugin.json +1 -1
  78. package/plugin/.mcp.codex.json +12 -0
  79. package/plugin/.mcp.copilot.json +2 -7
  80. package/plugin/.mcp.json +2 -7
  81. package/plugin/assets/icon.svg +35 -0
  82. package/plugin/hooks/hooks.copilot.json +11 -11
  83. package/plugin/opencode/README.md +266 -30
  84. package/plugin/opencode/agentmemory-capture.ts +572 -3
  85. package/plugin/opencode/plugin.json +1 -1
  86. package/plugin/plugin.json +1 -1
  87. package/plugin/scripts/_capture.d.mts +22 -0
  88. package/plugin/scripts/_capture.d.mts.map +1 -0
  89. package/plugin/scripts/_capture.mjs +908 -0
  90. package/plugin/scripts/_capture.mjs.map +1 -0
  91. package/plugin/scripts/antigravity-bridge.d.mts +1 -1
  92. package/plugin/scripts/antigravity-bridge.d.mts.map +1 -1
  93. package/plugin/scripts/antigravity-bridge.mjs +24 -15
  94. package/plugin/scripts/antigravity-bridge.mjs.map +1 -1
  95. package/plugin/scripts/notification.mjs +17 -25
  96. package/plugin/scripts/notification.mjs.map +1 -1
  97. package/plugin/scripts/plugin-bridge.mjs +378 -0
  98. package/plugin/scripts/post-commit.mjs +71 -1
  99. package/plugin/scripts/post-commit.mjs.map +1 -1
  100. package/plugin/scripts/post-tool-failure.mjs +59 -25
  101. package/plugin/scripts/post-tool-failure.mjs.map +1 -1
  102. package/plugin/scripts/post-tool-use.mjs +87 -35
  103. package/plugin/scripts/post-tool-use.mjs.map +1 -1
  104. package/plugin/scripts/pre-compact.mjs +83 -3
  105. package/plugin/scripts/pre-compact.mjs.map +1 -1
  106. package/plugin/scripts/pre-tool-use.mjs +71 -1
  107. package/plugin/scripts/pre-tool-use.mjs.map +1 -1
  108. package/plugin/scripts/prompt-submit.mjs +13 -21
  109. package/plugin/scripts/prompt-submit.mjs.map +1 -1
  110. package/plugin/scripts/session-end.mjs +25 -20
  111. package/plugin/scripts/session-end.mjs.map +1 -1
  112. package/plugin/scripts/session-start.mjs +80 -3
  113. package/plugin/scripts/session-start.mjs.map +1 -1
  114. package/plugin/scripts/stop.mjs +71 -1
  115. package/plugin/scripts/stop.mjs.map +1 -1
  116. package/plugin/scripts/subagent-start.mjs +16 -25
  117. package/plugin/scripts/subagent-start.mjs.map +1 -1
  118. package/plugin/scripts/subagent-stop.mjs +17 -25
  119. package/plugin/scripts/subagent-stop.mjs.map +1 -1
  120. package/plugin/scripts/task-completed.mjs +19 -27
  121. package/plugin/scripts/task-completed.mjs.map +1 -1
  122. package/plugin/skills/_shared/TROUBLESHOOTING.md +22 -6
  123. package/plugin/skills/agentmemory-agents/REFERENCE.md +3 -3
  124. package/plugin/skills/agentmemory-config/REFERENCE.md +49 -1
  125. package/plugin/skills/agentmemory-config/SKILL.md +44 -7
  126. package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +1 -1
  127. package/plugin/skills/agentmemory-rest-api/REFERENCE.md +10 -2
  128. package/plugin/skills/handoff/SKILL.md +4 -2
  129. package/plugin/skills/memory-discipline/SKILL.md +13 -5
  130. package/dist/connect-Qaeq15TQ.mjs.map +0 -1
  131. package/dist/image-refs-BKLmp_sD.mjs.map +0 -1
  132. package/dist/image-refs-CJgZmb9X.mjs.map +0 -1
  133. package/dist/keyed-mutex-DTHtcZrt.mjs.map +0 -1
  134. package/dist/logger-BEB7pCI9.mjs +0 -43
  135. package/dist/logger-BEB7pCI9.mjs.map +0 -1
  136. package/dist/schema-BFZhNTF7.mjs.map +0 -1
  137. package/dist/src-G7yt8gGm.mjs.map +0 -1
  138. package/dist/standalone-BqNJDJ04.mjs.map +0 -1
  139. package/dist/tools-registry-BV_2bu7z.mjs +0 -1405
  140. package/dist/tools-registry-BV_2bu7z.mjs.map +0 -1
@@ -8,34 +8,60 @@ services:
8
8
  iii-init:
9
9
  image: busybox:1.36
10
10
  user: "0:0"
11
+ environment:
12
+ AGENTMEMORY_DOCKER_UID: "${AGENTMEMORY_DOCKER_UID:-65532}"
13
+ AGENTMEMORY_DOCKER_GID: "${AGENTMEMORY_DOCKER_GID:-65532}"
14
+ AGENTMEMORY_DOCKER_SKIP_CHOWN: "${AGENTMEMORY_DOCKER_SKIP_CHOWN:-0}"
11
15
  volumes:
12
16
  - "${AGENTMEMORY_DATA_DIR:-iii-data}:/data"
13
- entrypoint: ["sh", "-c", "chown -R 65532:65532 /data && chmod 755 /data"]
17
+ entrypoint: ["sh", "-c", "if [ \"$${AGENTMEMORY_DOCKER_SKIP_CHOWN}\" = \"1\" ]; then exit 0; fi; chown -R $${AGENTMEMORY_DOCKER_UID}:$${AGENTMEMORY_DOCKER_GID} /data && chmod 755 /data"]
14
18
  restart: "no"
15
19
 
16
20
  iii-engine:
17
- # Pinned to v0.11.2 — the last engine that runs agentmemory's current
18
- # worker model cleanly. v0.11.6 introduces a new sandbox-everything-
19
- # via-`iii worker add` model that agentmemory hasn't been refactored
20
- # for yet; the architectural mismatch surfaces as EPIPE reconnect
21
- # loops and empty search after save. Bump only after agentmemory is
22
- # refactored to register as a sandboxed worker.
21
+ # Pinned to the same release as agentmemory's iii-sdk dependency
22
+ # (package.json). The worker speaks this engine's wire protocol, so
23
+ # bump the image tag and the SDK together, never one of them alone.
24
+ # 0.22.x is the last line before 0.23 removes the config.yaml worker
25
+ # lifecycle; it keeps HTTP routes owned by the reconnecting worker.
23
26
  #
24
27
  # Override per-shell or via .env file:
25
- # AGENTMEMORY_III_VERSION=0.11.7 docker compose up
26
- image: iiidev/iii:${AGENTMEMORY_III_VERSION:-0.11.2}
27
- user: "65532:65532"
28
+ # AGENTMEMORY_III_VERSION=0.22.1 docker compose up
29
+ image: iiidev/iii:${AGENTMEMORY_III_VERSION:-0.22.1}
30
+ user: "${AGENTMEMORY_DOCKER_UID:-65532}:${AGENTMEMORY_DOCKER_GID:-65532}"
28
31
  depends_on:
29
32
  iii-init:
30
33
  condition: service_completed_successfully
34
+ command: ["--config", "/app/config.yaml", "--no-update-check"]
35
+ environment:
36
+ III_TELEMETRY_ENABLED: "${III_TELEMETRY_ENABLED:-false}"
37
+ III_REST_PORT: "${III_REST_PORT:-3111}"
38
+ III_STREAM_PORT: "${III_STREAM_PORT:-3112}"
39
+ III_VIEWER_PORT: "${III_VIEWER_PORT:-3113}"
40
+ III_ENGINE_PORT: "${III_ENGINE_PORT:-49134}"
41
+ AGENTMEMORY_REDIS_URL: "${AGENTMEMORY_REDIS_URL:-}"
42
+ AGENTMEMORY_STATE_SAVE_INTERVAL_MS: "${AGENTMEMORY_STATE_SAVE_INTERVAL_MS:-2000}"
43
+ MALLOC_ARENA_MAX: "${MALLOC_ARENA_MAX:-2}"
44
+ ulimits:
45
+ nofile:
46
+ soft: 10240
47
+ hard: 10240
31
48
  ports:
32
- - "127.0.0.1:49134:49134"
33
- - "127.0.0.1:3111:3111"
34
- - "127.0.0.1:3112:3112"
35
- - "127.0.0.1:9464:9464"
49
+ - "127.0.0.1:${III_ENGINE_PORT:-49134}:${III_ENGINE_PORT:-49134}"
50
+ - "127.0.0.1:${III_REST_PORT:-3111}:${III_REST_PORT:-3111}"
51
+ - "127.0.0.1:${III_STREAM_PORT:-3112}:${III_STREAM_PORT:-3112}"
52
+ - "127.0.0.1:${AGENTMEMORY_METRICS_PORT:-9464}:9464"
36
53
  volumes:
37
54
  - "${AGENTMEMORY_DATA_DIR:-iii-data}:/data"
38
55
  - ./iii-config.docker.yaml:/app/config.yaml:ro
56
+ # The engine persists each builtin worker's seeded config block under
57
+ # config/ next to its config file (/app/config in the image) on first
58
+ # boot and treats that copy as the source of truth afterwards. Keeping
59
+ # it on a tmpfs means every container start re-seeds from config.yaml
60
+ # and the III_* env vars, the same behavior the native CLI path has.
61
+ - type: tmpfs
62
+ target: /app/config
63
+ tmpfs:
64
+ mode: 01777
39
65
  restart: unless-stopped
40
66
  logging:
41
67
  driver: json-file
@@ -1,18 +1,23 @@
1
1
  workers:
2
2
  - name: iii-http
3
3
  config:
4
- port: 3111
4
+ port: ${III_REST_PORT:3111}
5
5
  host: 0.0.0.0
6
6
  default_timeout: 180000
7
7
  cors:
8
- allowed_origins: ["http://localhost:3111", "http://localhost:3113", "http://127.0.0.1:3111", "http://127.0.0.1:3113"]
8
+ allowed_origins: ["http://localhost:${III_REST_PORT:3111}", "http://localhost:${III_VIEWER_PORT:3113}", "http://127.0.0.1:${III_REST_PORT:3111}", "http://127.0.0.1:${III_VIEWER_PORT:3113}"]
9
9
  allowed_methods: [GET, POST, PUT, DELETE, OPTIONS]
10
+ - name: iii-worker-manager
11
+ config:
12
+ port: ${III_ENGINE_PORT:49134}
13
+ host: 0.0.0.0
10
14
  - name: iii-state
11
15
  config:
12
16
  adapter:
13
17
  name: kv
14
18
  config:
15
19
  store_method: file_based
20
+ save_interval_ms: ${AGENTMEMORY_STATE_SAVE_INTERVAL_MS:2000}
16
21
  file_path: /data/state_store.db
17
22
  - name: iii-queue
18
23
  config:
@@ -28,26 +33,21 @@ workers:
28
33
  name: kv
29
34
  - name: iii-stream
30
35
  config:
31
- port: 3112
36
+ port: ${III_STREAM_PORT:3112}
32
37
  host: 0.0.0.0
33
38
  adapter:
34
39
  name: kv
35
40
  config:
36
41
  store_method: file_based
42
+ save_interval_ms: ${AGENTMEMORY_STATE_SAVE_INTERVAL_MS:2000}
37
43
  file_path: /data/stream_store
38
44
  - name: iii-observability
39
45
  config:
40
46
  enabled: true
41
47
  service_name: agentmemory
42
48
  exporter: memory
43
- # See iii-config.yaml for the rationale on 0.1 / console-off (#519).
49
+ # See iii-config.yaml for the rationale on 0.1 / console-off.
44
50
  sampling_ratio: 0.1
45
51
  metrics_enabled: true
46
52
  logs_enabled: true
47
53
  logs_console_output: false
48
- - name: iii-exec
49
- config:
50
- watch:
51
- - src/**/*.ts
52
- exec:
53
- - node dist/index.mjs
package/iii-config.yaml CHANGED
@@ -13,6 +13,7 @@ workers:
13
13
  name: kv
14
14
  config:
15
15
  store_method: file_based
16
+ save_interval_ms: 2000
16
17
  file_path: ./data/state_store.db
17
18
  - name: iii-queue
18
19
  config:
@@ -34,6 +35,7 @@ workers:
34
35
  name: kv
35
36
  config:
36
37
  store_method: file_based
38
+ save_interval_ms: 2000
37
39
  file_path: ./data/stream_store
38
40
  - name: iii-observability
39
41
  config:
@@ -45,7 +47,7 @@ workers:
45
47
  # subscriber lagged" WARN, and that WARN re-enters the same
46
48
  # stream the subscriber is failing to drain — a positive
47
49
  # feedback loop that wrote 137 GB to daemon.log.new on one user
48
- # in a few days (#519).
50
+ # in a few days.
49
51
  sampling_ratio: 0.1
50
52
  metrics_enabled: true
51
53
  logs_enabled: true
@@ -3,7 +3,7 @@ import { Type } from "typebox";
3
3
  import path from "node:path";
4
4
  import crypto from "node:crypto";
5
5
  import { execFileSync } from "node:child_process";
6
- import { createPlaintextBearerAuthGuard } from "./security.js";
6
+ import { createPlaintextBearerAuthGuard, resolveSecret } from "./security.js";
7
7
 
8
8
  type TextBlock = { type?: string; text?: string };
9
9
  type AssistantMessage = { role?: string; content?: unknown };
@@ -96,7 +96,7 @@ async function callAgentMemory<T>(
96
96
  const method = options?.method || "POST";
97
97
  const url = `${baseUrl}/agentmemory/${pathname.replace(/^\/+/, "")}`;
98
98
  const headers: Record<string, string> = {};
99
- const secret = process.env.AGENTMEMORY_SECRET;
99
+ const secret = resolveSecret(baseUrl, process.env.AGENTMEMORY_SECRET);
100
100
  guardPlaintextBearerAuth(baseUrl, secret);
101
101
  if (options?.body !== undefined) headers["Content-Type"] = "application/json";
102
102
  if (secret) headers.Authorization = `Bearer ${secret}`;
@@ -393,7 +393,6 @@ export default function agentmemoryExtension(pi: ExtensionAPI) {
393
393
  // /new, /resume, /fork and reloads fire this too; only quit ends the session.
394
394
  if (event.reason !== "quit") return;
395
395
  if (!lastHealthOk || !sessionId) return;
396
- // session/end already fans out the summary server-side (#1203).
397
396
  await callAgentMemory("session/end", {
398
397
  body: { sessionId },
399
398
  timeoutMs: 5_000,
@@ -1,5 +1,57 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+
1
5
  const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "::1"]);
2
6
 
7
+ function usableSecret(value: unknown): string {
8
+ const trimmed = typeof value === "string" ? value.trim() : "";
9
+ if (!trimmed || (trimmed.startsWith("${") && trimmed.endsWith("}"))) return "";
10
+ return trimmed;
11
+ }
12
+
13
+ function readAgentmemoryFile(name: string): string {
14
+ try {
15
+ return readFileSync(join(homedir(), ".agentmemory", name), "utf-8");
16
+ } catch {
17
+ return "";
18
+ }
19
+ }
20
+
21
+ function envFileSecret(): string {
22
+ let found = "";
23
+ for (const line of readAgentmemoryFile(".env").split("\n")) {
24
+ const trimmed = line.trim();
25
+ if (trimmed.startsWith("#")) continue;
26
+ const eq = trimmed.indexOf("=");
27
+ if (eq === -1) continue;
28
+ if (trimmed.slice(0, eq).replace(/^export\s+/, "").trim() !== "AGENTMEMORY_SECRET") continue;
29
+ let value = trimmed.slice(eq + 1).trim();
30
+ const quote = value[0];
31
+ const close = quote === '"' || quote === "'" ? value.indexOf(quote, 1) : -1;
32
+ if (close > 0) value = value.slice(1, close);
33
+ else if (value.includes(" #")) value = value.slice(0, value.indexOf(" #"));
34
+ found = usableSecret(value);
35
+ }
36
+ return found;
37
+ }
38
+
39
+ function isLoopbackUrl(url: string): boolean {
40
+ try {
41
+ const host = new URL(url).hostname.replace(/^\[|\]$/g, "").toLowerCase();
42
+ return host === "localhost" || host === "::1" || /^127(?:\.\d{1,3}){3}$/.test(host);
43
+ } catch {
44
+ return false;
45
+ }
46
+ }
47
+
48
+ export function resolveSecret(url: string, explicit?: string): string {
49
+ const configured = usableSecret(explicit);
50
+ if (configured) return configured;
51
+ if (!isLoopbackUrl(url)) return "";
52
+ return envFileSecret() || usableSecret(readAgentmemoryFile("secret"));
53
+ }
54
+
3
55
  function normalizedHostname(hostname: string): string {
4
56
  return hostname.replace(/^\[|\]$/g, "").toLowerCase();
5
57
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentmemory/agentmemory",
3
- "version": "0.9.29",
3
+ "version": "0.9.30",
4
4
  "description": "Persistent memory for AI coding agents, powered by iii-engine's three primitives",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -25,9 +25,17 @@
25
25
  "test:watch": "vitest --exclude test/integration.test.ts",
26
26
  "test:integration": "vitest run test/integration.test.ts",
27
27
  "test:all": "vitest run",
28
+ "release:gate": "node scripts/release-gate/run.mjs",
28
29
  "skills:gen": "tsx scripts/skills/generate.ts",
30
+ "engine:hashes": "node scripts/engine-hashes.mjs",
29
31
  "skills:check": "tsx scripts/skills/generate.ts --check && tsx scripts/skills/check.ts",
32
+ "docs:sync": "tsx scripts/docs-sync.ts",
33
+ "docs:check": "tsx scripts/docs-sync.ts --check",
34
+ "plugin:pack:codex": "npm run build && node scripts/plugins/package-codex.mjs",
35
+ "plugin:verify:published": "node scripts/plugins/verify-published.mjs",
36
+ "test:plugin:live": "node scripts/plugins/test-live.mjs",
30
37
  "bench:load": "node --import tsx benchmark/load-100k.ts",
38
+ "bench:capture-costs": "node --import tsx benchmark/capture-costs.ts",
31
39
  "eval:longmemeval": "tsx eval/runner/longmemeval.ts",
32
40
  "eval:coding-life": "tsx eval/runner/coding-life.ts"
33
41
  },
@@ -64,8 +72,9 @@
64
72
  "@anthropic-ai/claude-agent-sdk": "^0.3.142",
65
73
  "@anthropic-ai/sdk": "^0.100.1",
66
74
  "@clack/prompts": "^1.2.0",
67
- "dotenv": "^17.4.2",
68
- "iii-sdk": "0.11.2",
75
+ "dotenv": "^18.0.3",
76
+ "@iii-dev/helpers": "0.22.1",
77
+ "iii-sdk": "0.22.1",
69
78
  "picocolors": "^1.1.1",
70
79
  "zod": "^4.0.0"
71
80
  },
@@ -75,7 +84,7 @@
75
84
  "tiny-segmenter": "^0.2.0"
76
85
  },
77
86
  "devDependencies": {
78
- "@types/node": "^25.9.1",
87
+ "@types/node": "^26.6.2",
79
88
  "tsdown": "^0.21.10",
80
89
  "tsx": "^4.19.0",
81
90
  "typescript": "^6.0.3",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agentmemory",
3
- "version": "0.9.29",
4
- "description": "Persistent memory for AI coding agents -- captures tool usage, compresses via LLM, injects context into future sessions. 12 hooks, 54 MCP tools, 8 skills, real-time viewer.",
3
+ "version": "0.9.30",
4
+ "description": "Persistent memory for AI coding agents -- captures tool usage, compresses via LLM, injects context into future sessions. 12 hooks, 54 MCP tools, 17 skills, real-time viewer.",
5
5
  "author": {
6
6
  "name": "Rohit Ghumare",
7
7
  "url": "https://github.com/rohitg00"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agentmemory",
3
- "version": "0.9.29",
4
- "description": "Persistent memory for AI coding agents -- captures tool usage, compresses via LLM, injects context into future sessions. 6 hooks, 54 MCP tools, 8 skills, real-time viewer.",
3
+ "version": "0.9.30",
4
+ "description": "Local persistent memory for coding agents. Recall decisions, resume sessions, learn from corrections, and manage memory through 54 MCP tools and 17 skills. Optional capture through 6 Codex hooks.",
5
5
  "author": {
6
6
  "name": "Rohit Ghumare",
7
7
  "url": "https://github.com/rohitg00"
@@ -10,6 +10,28 @@
10
10
  "homepage": "https://github.com/rohitg00/agentmemory",
11
11
  "repository": "https://github.com/rohitg00/agentmemory",
12
12
  "skills": "./skills/",
13
- "mcpServers": "./.mcp.json",
14
- "hooks": "./hooks/hooks.codex.json"
13
+ "mcpServers": "./.mcp.codex.json",
14
+ "hooks": "./hooks/hooks.codex.json",
15
+ "interface": {
16
+ "displayName": "Agent Memory",
17
+ "shortDescription": "Memory across coding sessions",
18
+ "longDescription": "Recall past decisions, resume work, save useful context, and learn from corrections across Codex and Claude Code using one local Agent Memory daemon. Includes search, session history, lessons, graph queries, memory maintenance, export, and deletion workflows. Requires Node.js 20+ and a running Agent Memory daemon. Basic keyword recall needs no model key. Embeddings and model-based features require configuration; external providers may receive selected data when enabled. Automatic capture requires trusted, supported hooks. Designed for local Codex sessions.",
19
+ "developerName": "Rohit Ghumare",
20
+ "websiteURL": "https://github.com/rohitg00/agentmemory",
21
+ "supportURL": "https://github.com/rohitg00/agentmemory/issues",
22
+ "category": "Developer Tools",
23
+ "capabilities": ["Local persistent memory", "Session handoff", "Lessons and recall", "Memory management"],
24
+ "defaultPrompt": [
25
+ "Check my local Agent Memory connection and explain which features are enabled.",
26
+ "Recall decisions relevant to this repository, with the evidence for each.",
27
+ "Resume the latest session for this repository and show the recorded next step."
28
+ ],
29
+ "logo": "./assets/icon.svg",
30
+ "composerIcon": "./assets/icon.svg"
31
+ },
32
+ "extensions": {
33
+ "com.openai": {
34
+ "onboardingSkill": "./skills/agentmemory-config/SKILL.md"
35
+ }
36
+ }
15
37
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentmemory",
3
- "version": "0.9.29",
3
+ "version": "0.9.30",
4
4
  "description": "Persistent memory for AI coding agents. Captures sessions, recalls with hybrid BM25 + vector + graph search, and exposes 54 memory tools over MCP. Keyless by default, runs on your machine.",
5
5
  "author": {
6
6
  "name": "Rohit Ghumare",
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "agentmemory": {
4
+ "command": "node",
5
+ "args": ["scripts/plugin-bridge.mjs"],
6
+ "cwd": ".",
7
+ "env_vars": ["AGENTMEMORY_URL", "AGENTMEMORY_SECRET"],
8
+ "startup_timeout_sec": 20,
9
+ "tool_timeout_sec": 30
10
+ }
11
+ }
12
+ }
@@ -2,13 +2,8 @@
2
2
  "mcpServers": {
3
3
  "agentmemory": {
4
4
  "type": "local",
5
- "command": "npx",
6
- "args": ["-y", "@agentmemory/mcp"],
7
- "env": {
8
- "AGENTMEMORY_URL": "${AGENTMEMORY_URL:-http://localhost:3111}",
9
- "AGENTMEMORY_SECRET": "${AGENTMEMORY_SECRET:-}",
10
- "AGENTMEMORY_TOOLS": "${AGENTMEMORY_TOOLS:-all}"
11
- },
5
+ "command": "node",
6
+ "args": ["${COPILOT_PLUGIN_ROOT}/scripts/plugin-bridge.mjs"],
12
7
  "tools": ["*"]
13
8
  }
14
9
  }
package/plugin/.mcp.json CHANGED
@@ -1,13 +1,8 @@
1
1
  {
2
2
  "mcpServers": {
3
3
  "agentmemory": {
4
- "command": "npx",
5
- "args": ["-y", "@agentmemory/mcp"],
6
- "env": {
7
- "AGENTMEMORY_URL": "${AGENTMEMORY_URL:-http://localhost:3111}",
8
- "AGENTMEMORY_SECRET": "${AGENTMEMORY_SECRET:-}",
9
- "AGENTMEMORY_TOOLS": "${AGENTMEMORY_TOOLS:-all}"
10
- }
4
+ "command": "node",
5
+ "args": ["${CLAUDE_PLUGIN_ROOT}/scripts/plugin-bridge.mjs"]
11
6
  }
12
7
  }
13
8
  }
@@ -0,0 +1,35 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
+ <defs>
3
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0%" stop-color="#FF6B35"/>
5
+ <stop offset="100%" stop-color="#FF8F5E"/>
6
+ </linearGradient>
7
+ </defs>
8
+
9
+ <rect width="64" height="64" rx="14" fill="#1A1A1A"/>
10
+
11
+ <!-- 4 memory tiers -->
12
+ <rect x="14" y="40" width="36" height="5" rx="2.5" fill="#333" opacity="0.5"/>
13
+ <rect x="14" y="33" width="36" height="5" rx="2.5" fill="#444" opacity="0.6"/>
14
+ <rect x="14" y="26" width="36" height="5" rx="2.5" fill="#555" opacity="0.7"/>
15
+ <rect x="14" y="19" width="36" height="5" rx="2.5" fill="url(#g)"/>
16
+
17
+ <!-- Active nodes on hot layer -->
18
+ <circle cx="22" cy="21.5" r="1.8" fill="#fff"/>
19
+ <circle cx="32" cy="21.5" r="1.8" fill="#fff"/>
20
+ <circle cx="42" cy="21.5" r="1.8" fill="#fff"/>
21
+
22
+ <!-- Retrieval lines converging up -->
23
+ <line x1="22" y1="19" x2="32" y2="12" stroke="#FF6B35" stroke-width="1" opacity="0.7"/>
24
+ <line x1="32" y1="19" x2="32" y2="12" stroke="#FF6B35" stroke-width="1" opacity="0.5"/>
25
+ <line x1="42" y1="19" x2="32" y2="12" stroke="#FF6B35" stroke-width="1" opacity="0.7"/>
26
+
27
+ <!-- Retrieval point -->
28
+ <circle cx="32" cy="11" r="3" fill="url(#g)"/>
29
+ <circle cx="32" cy="11" r="5" fill="none" stroke="#FF6B35" stroke-width="0.8" opacity="0.3"/>
30
+
31
+ <!-- Fading dots on lower tiers -->
32
+ <circle cx="25" cy="28.5" r="1" fill="#888" opacity="0.4"/>
33
+ <circle cx="39" cy="28.5" r="1" fill="#888" opacity="0.4"/>
34
+ <circle cx="32" cy="35.5" r="0.8" fill="#666" opacity="0.3"/>
35
+ </svg>
@@ -4,68 +4,68 @@
4
4
  "sessionStart": [
5
5
  {
6
6
  "type": "command",
7
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/session-start.mjs"
7
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/session-start.mjs\""
8
8
  }
9
9
  ],
10
10
  "userPromptSubmitted": [
11
11
  {
12
12
  "type": "command",
13
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/prompt-submit.mjs"
13
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/prompt-submit.mjs\""
14
14
  }
15
15
  ],
16
16
  "preToolUse": [
17
17
  {
18
18
  "type": "command",
19
19
  "matcher": "edit|write|create|read|view|glob|grep",
20
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/pre-tool-use.mjs"
20
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/pre-tool-use.mjs\""
21
21
  }
22
22
  ],
23
23
  "postToolUse": [
24
24
  {
25
25
  "type": "command",
26
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/post-tool-use.mjs"
26
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/post-tool-use.mjs\""
27
27
  }
28
28
  ],
29
29
  "postToolUseFailure": [
30
30
  {
31
31
  "type": "command",
32
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/post-tool-failure.mjs"
32
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/post-tool-failure.mjs\""
33
33
  }
34
34
  ],
35
35
  "preCompact": [
36
36
  {
37
37
  "type": "command",
38
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/pre-compact.mjs"
38
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/pre-compact.mjs\""
39
39
  }
40
40
  ],
41
41
  "agentStop": [
42
42
  {
43
43
  "type": "command",
44
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/stop.mjs"
44
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/stop.mjs\""
45
45
  }
46
46
  ],
47
47
  "sessionEnd": [
48
48
  {
49
49
  "type": "command",
50
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/session-end.mjs"
50
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/session-end.mjs\""
51
51
  }
52
52
  ],
53
53
  "subagentStart": [
54
54
  {
55
55
  "type": "command",
56
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/subagent-start.mjs"
56
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/subagent-start.mjs\""
57
57
  }
58
58
  ],
59
59
  "subagentStop": [
60
60
  {
61
61
  "type": "command",
62
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/subagent-stop.mjs"
62
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/subagent-stop.mjs\""
63
63
  }
64
64
  ],
65
65
  "notification": [
66
66
  {
67
67
  "type": "command",
68
- "command": "node ${COPILOT_PLUGIN_ROOT}/scripts/notification.mjs"
68
+ "command": "node \"${COPILOT_PLUGIN_ROOT}/scripts/notification.mjs\""
69
69
  }
70
70
  ]
71
71
  }