ziiagentmemory 0.1.0

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 (160) hide show
  1. package/.env.example +175 -0
  2. package/AGENTS.md +124 -0
  3. package/LICENSE +190 -0
  4. package/README.md +1546 -0
  5. package/dist/cli.d.mts +5 -0
  6. package/dist/cli.d.mts.map +1 -0
  7. package/dist/cli.mjs +2859 -0
  8. package/dist/cli.mjs.map +1 -0
  9. package/dist/config-ChC9EtgV.mjs +259 -0
  10. package/dist/config-ChC9EtgV.mjs.map +1 -0
  11. package/dist/connect-JnsJXc68.mjs +1075 -0
  12. package/dist/connect-JnsJXc68.mjs.map +1 -0
  13. package/dist/hooks/notification.d.mts +1 -0
  14. package/dist/hooks/notification.mjs +74 -0
  15. package/dist/hooks/notification.mjs.map +1 -0
  16. package/dist/hooks/post-commit.d.mts +1 -0
  17. package/dist/hooks/post-commit.mjs +101 -0
  18. package/dist/hooks/post-commit.mjs.map +1 -0
  19. package/dist/hooks/post-tool-failure.d.mts +1 -0
  20. package/dist/hooks/post-tool-failure.mjs +75 -0
  21. package/dist/hooks/post-tool-failure.mjs.map +1 -0
  22. package/dist/hooks/post-tool-use.d.mts +1 -0
  23. package/dist/hooks/post-tool-use.mjs +120 -0
  24. package/dist/hooks/post-tool-use.mjs.map +1 -0
  25. package/dist/hooks/pre-compact.d.mts +1 -0
  26. package/dist/hooks/pre-compact.mjs +78 -0
  27. package/dist/hooks/pre-compact.mjs.map +1 -0
  28. package/dist/hooks/pre-tool-use.d.mts +1 -0
  29. package/dist/hooks/pre-tool-use.mjs +84 -0
  30. package/dist/hooks/pre-tool-use.mjs.map +1 -0
  31. package/dist/hooks/prompt-submit.d.mts +1 -0
  32. package/dist/hooks/prompt-submit.mjs +67 -0
  33. package/dist/hooks/prompt-submit.mjs.map +1 -0
  34. package/dist/hooks/session-end.d.mts +1 -0
  35. package/dist/hooks/session-end.mjs +60 -0
  36. package/dist/hooks/session-end.mjs.map +1 -0
  37. package/dist/hooks/session-start.d.mts +1 -0
  38. package/dist/hooks/session-start.mjs +85 -0
  39. package/dist/hooks/session-start.mjs.map +1 -0
  40. package/dist/hooks/stop.d.mts +1 -0
  41. package/dist/hooks/stop.mjs +44 -0
  42. package/dist/hooks/stop.mjs.map +1 -0
  43. package/dist/hooks/subagent-start.d.mts +1 -0
  44. package/dist/hooks/subagent-start.mjs +73 -0
  45. package/dist/hooks/subagent-start.mjs.map +1 -0
  46. package/dist/hooks/subagent-stop.d.mts +1 -0
  47. package/dist/hooks/subagent-stop.mjs +74 -0
  48. package/dist/hooks/subagent-stop.mjs.map +1 -0
  49. package/dist/hooks/task-completed.d.mts +1 -0
  50. package/dist/hooks/task-completed.mjs +73 -0
  51. package/dist/hooks/task-completed.mjs.map +1 -0
  52. package/dist/image-refs-BKLmp_sD.mjs +34 -0
  53. package/dist/image-refs-BKLmp_sD.mjs.map +1 -0
  54. package/dist/image-refs-C2YU7BIm.mjs +34 -0
  55. package/dist/image-refs-C2YU7BIm.mjs.map +1 -0
  56. package/dist/index.d.mts +2 -0
  57. package/dist/index.mjs +22324 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/keyed-mutex-DTHtcZrt.mjs +88 -0
  60. package/dist/keyed-mutex-DTHtcZrt.mjs.map +1 -0
  61. package/dist/logger-BEB7pCI9.mjs +43 -0
  62. package/dist/logger-BEB7pCI9.mjs.map +1 -0
  63. package/dist/schema-CNiCWzV9.mjs +78 -0
  64. package/dist/schema-CNiCWzV9.mjs.map +1 -0
  65. package/dist/src-Cr3pH_uH.mjs +20745 -0
  66. package/dist/src-Cr3pH_uH.mjs.map +1 -0
  67. package/dist/standalone-C6KzNkt5.mjs +700 -0
  68. package/dist/standalone-C6KzNkt5.mjs.map +1 -0
  69. package/dist/standalone.d.mts +25 -0
  70. package/dist/standalone.d.mts.map +1 -0
  71. package/dist/standalone.mjs +1867 -0
  72. package/dist/standalone.mjs.map +1 -0
  73. package/dist/tools-registry-DCt2KAWA.mjs +1145 -0
  74. package/dist/tools-registry-DCt2KAWA.mjs.map +1 -0
  75. package/docker-compose.yml +47 -0
  76. package/iii-config.docker.yaml +53 -0
  77. package/iii-config.yaml +61 -0
  78. package/package.json +99 -0
  79. package/plugin/.claude-plugin/plugin.json +13 -0
  80. package/plugin/.codex-plugin/plugin.json +15 -0
  81. package/plugin/.mcp.copilot.json +15 -0
  82. package/plugin/.mcp.json +13 -0
  83. package/plugin/hooks/hooks.codex.json +67 -0
  84. package/plugin/hooks/hooks.copilot.json +72 -0
  85. package/plugin/hooks/hooks.json +125 -0
  86. package/plugin/opencode/README.md +229 -0
  87. package/plugin/opencode/agentmemory-capture.ts +687 -0
  88. package/plugin/opencode/commands/recall.md +19 -0
  89. package/plugin/opencode/commands/remember.md +19 -0
  90. package/plugin/opencode/plugin.json +12 -0
  91. package/plugin/plugin.json +15 -0
  92. package/plugin/scripts/diagnostics.mjs +551 -0
  93. package/plugin/scripts/notification.d.mts +1 -0
  94. package/plugin/scripts/notification.mjs +74 -0
  95. package/plugin/scripts/notification.mjs.map +1 -0
  96. package/plugin/scripts/post-commit.d.mts +1 -0
  97. package/plugin/scripts/post-commit.mjs +101 -0
  98. package/plugin/scripts/post-commit.mjs.map +1 -0
  99. package/plugin/scripts/post-tool-failure.d.mts +1 -0
  100. package/plugin/scripts/post-tool-failure.mjs +75 -0
  101. package/plugin/scripts/post-tool-failure.mjs.map +1 -0
  102. package/plugin/scripts/post-tool-use.d.mts +1 -0
  103. package/plugin/scripts/post-tool-use.mjs +120 -0
  104. package/plugin/scripts/post-tool-use.mjs.map +1 -0
  105. package/plugin/scripts/pre-compact.d.mts +1 -0
  106. package/plugin/scripts/pre-compact.mjs +78 -0
  107. package/plugin/scripts/pre-compact.mjs.map +1 -0
  108. package/plugin/scripts/pre-tool-use.d.mts +1 -0
  109. package/plugin/scripts/pre-tool-use.mjs +84 -0
  110. package/plugin/scripts/pre-tool-use.mjs.map +1 -0
  111. package/plugin/scripts/prompt-submit.d.mts +1 -0
  112. package/plugin/scripts/prompt-submit.mjs +67 -0
  113. package/plugin/scripts/prompt-submit.mjs.map +1 -0
  114. package/plugin/scripts/session-end.d.mts +1 -0
  115. package/plugin/scripts/session-end.mjs +60 -0
  116. package/plugin/scripts/session-end.mjs.map +1 -0
  117. package/plugin/scripts/session-start.d.mts +1 -0
  118. package/plugin/scripts/session-start.mjs +85 -0
  119. package/plugin/scripts/session-start.mjs.map +1 -0
  120. package/plugin/scripts/stop.d.mts +1 -0
  121. package/plugin/scripts/stop.mjs +44 -0
  122. package/plugin/scripts/stop.mjs.map +1 -0
  123. package/plugin/scripts/subagent-start.d.mts +1 -0
  124. package/plugin/scripts/subagent-start.mjs +73 -0
  125. package/plugin/scripts/subagent-start.mjs.map +1 -0
  126. package/plugin/scripts/subagent-stop.d.mts +1 -0
  127. package/plugin/scripts/subagent-stop.mjs +74 -0
  128. package/plugin/scripts/subagent-stop.mjs.map +1 -0
  129. package/plugin/scripts/task-completed.d.mts +1 -0
  130. package/plugin/scripts/task-completed.mjs +73 -0
  131. package/plugin/scripts/task-completed.mjs.map +1 -0
  132. package/plugin/skills/_shared/TROUBLESHOOTING.md +38 -0
  133. package/plugin/skills/agentmemory-agents/REFERENCE.md +28 -0
  134. package/plugin/skills/agentmemory-agents/SKILL.md +34 -0
  135. package/plugin/skills/agentmemory-architecture/SKILL.md +33 -0
  136. package/plugin/skills/agentmemory-config/REFERENCE.md +42 -0
  137. package/plugin/skills/agentmemory-config/SKILL.md +37 -0
  138. package/plugin/skills/agentmemory-hooks/REFERENCE.md +20 -0
  139. package/plugin/skills/agentmemory-hooks/SKILL.md +39 -0
  140. package/plugin/skills/agentmemory-mcp-tools/REFERENCE.md +65 -0
  141. package/plugin/skills/agentmemory-mcp-tools/SKILL.md +39 -0
  142. package/plugin/skills/agentmemory-rest-api/REFERENCE.md +129 -0
  143. package/plugin/skills/agentmemory-rest-api/SKILL.md +43 -0
  144. package/plugin/skills/commit-context/EXAMPLES.md +71 -0
  145. package/plugin/skills/commit-context/SKILL.md +64 -0
  146. package/plugin/skills/commit-history/EXAMPLES.md +71 -0
  147. package/plugin/skills/commit-history/SKILL.md +62 -0
  148. package/plugin/skills/forget/EXAMPLES.md +75 -0
  149. package/plugin/skills/forget/SKILL.md +66 -0
  150. package/plugin/skills/handoff/EXAMPLES.md +56 -0
  151. package/plugin/skills/handoff/SKILL.md +68 -0
  152. package/plugin/skills/recall/EXAMPLES.md +74 -0
  153. package/plugin/skills/recall/SKILL.md +60 -0
  154. package/plugin/skills/recap/EXAMPLES.md +60 -0
  155. package/plugin/skills/recap/SKILL.md +63 -0
  156. package/plugin/skills/remember/EXAMPLES.md +67 -0
  157. package/plugin/skills/remember/SKILL.md +61 -0
  158. package/plugin/skills/session-history/EXAMPLES.md +59 -0
  159. package/plugin/skills/session-history/SKILL.md +61 -0
  160. package/plugin/skills/write-agentmemory-skill/SKILL.md +40 -0
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import { execSync } from "node:child_process";
3
+ import { basename } from "node:path";
4
+ //#region src/hooks/_project.ts
5
+ function resolveProject(cwd) {
6
+ const explicit = process.env["AGENTMEMORY_PROJECT_NAME"];
7
+ if (explicit && explicit.trim()) return explicit.trim();
8
+ const dir = cwd && cwd.trim() ? cwd : process.cwd();
9
+ try {
10
+ const top = execSync("git rev-parse --show-toplevel", {
11
+ cwd: dir,
12
+ stdio: [
13
+ "ignore",
14
+ "pipe",
15
+ "ignore"
16
+ ],
17
+ timeout: 500
18
+ }).toString().trim();
19
+ if (top) return basename(top);
20
+ } catch {}
21
+ return basename(dir);
22
+ }
23
+ //#endregion
24
+ //#region src/hooks/subagent-stop.ts
25
+ function isSdkChildContext(payload) {
26
+ if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
27
+ if (!payload || typeof payload !== "object") return false;
28
+ return payload.entrypoint === "sdk-ts";
29
+ }
30
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
31
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
32
+ function authHeaders() {
33
+ const h = { "Content-Type": "application/json" };
34
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
35
+ return h;
36
+ }
37
+ async function main() {
38
+ let input = "";
39
+ for await (const chunk of process.stdin) input += chunk;
40
+ let data;
41
+ try {
42
+ data = JSON.parse(input);
43
+ } catch {
44
+ return;
45
+ }
46
+ if (isSdkChildContext(data)) return;
47
+ const sessionId = data.session_id || data.sessionId || "unknown";
48
+ const agentId = data.agent_id || data.agentName;
49
+ const agentType = data.agent_type || data.agentDisplayName || data.agentName;
50
+ const lastMsg = typeof data.last_assistant_message === "string" ? data.last_assistant_message.slice(0, 4e3) : "";
51
+ fetch(`${REST_URL}/agentmemory/observe`, {
52
+ method: "POST",
53
+ headers: authHeaders(),
54
+ body: JSON.stringify({
55
+ hookType: "subagent_stop",
56
+ sessionId,
57
+ project: resolveProject(data.cwd),
58
+ cwd: data.cwd || process.cwd(),
59
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
60
+ data: {
61
+ agent_id: agentId,
62
+ agent_type: agentType,
63
+ last_message: lastMsg
64
+ }
65
+ }),
66
+ signal: AbortSignal.timeout(2e3)
67
+ }).catch(() => {});
68
+ setTimeout(() => process.exit(0), 500).unref();
69
+ }
70
+ main();
71
+ //#endregion
72
+ export {};
73
+
74
+ //# sourceMappingURL=subagent-stop.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-stop.mjs","names":[],"sources":["../../src/hooks/_project.ts","../../src/hooks/subagent-stop.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\r\nimport { basename } from \"node:path\";\r\n\r\n// Resolution order: AGENTMEMORY_PROJECT_NAME env → git toplevel basename → cwd basename.\r\nexport function resolveProject(cwd?: string): string {\r\n const explicit = process.env[\"AGENTMEMORY_PROJECT_NAME\"];\r\n if (explicit && explicit.trim()) return explicit.trim();\r\n const dir = cwd && cwd.trim() ? cwd : process.cwd();\r\n try {\r\n const top = execSync(\"git rev-parse --show-toplevel\", {\r\n cwd: dir,\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n timeout: 500,\r\n })\r\n .toString()\r\n .trim();\r\n if (top) return basename(top);\r\n } catch {}\r\n return basename(dir);\r\n}\r\n","#!/usr/bin/env node\r\nimport { resolveProject } from \"./_project.js\";\r\n\r\nfunction isSdkChildContext(payload: unknown): boolean {\r\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\r\n if (!payload || typeof payload !== \"object\") return false;\r\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\r\n}\r\n\r\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\r\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\r\n\r\nfunction authHeaders(): Record<string, string> {\r\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\r\n return h;\r\n}\r\n\r\nasync function main() {\r\n let input = \"\";\r\n for await (const chunk of process.stdin) {\r\n input += chunk;\r\n }\r\n\r\n let data: Record<string, unknown>;\r\n try {\r\n data = JSON.parse(input);\r\n } catch {\r\n return;\r\n }\r\n\r\n if (isSdkChildContext(data)) return;\r\n\r\n const sessionId = ((data.session_id || data.sessionId) as string) || \"unknown\";\r\n const agentId = data.agent_id || data.agentName;\r\n const agentType = data.agent_type || data.agentDisplayName || data.agentName;\r\n const lastMsg =\r\n typeof data.last_assistant_message === \"string\"\r\n ? data.last_assistant_message.slice(0, 4000)\r\n : \"\";\r\n\r\n fetch(`${REST_URL}/agentmemory/observe`, {\r\n method: \"POST\",\r\n headers: authHeaders(),\r\n body: JSON.stringify({\r\n hookType: \"subagent_stop\",\r\n sessionId,\r\n project: resolveProject(data.cwd as string | undefined),\r\n cwd: (data.cwd as string | undefined) || process.cwd(),\r\n timestamp: new Date().toISOString(),\r\n data: {\r\n agent_id: agentId,\r\n agent_type: agentType,\r\n last_message: lastMsg,\r\n },\r\n }),\r\n signal: AbortSignal.timeout(2000),\r\n }).catch(() => {});\r\n setTimeout(() => process.exit(0), 500).unref();\r\n}\r\n\r\nmain();\r\n"],"mappings":";;;;AAIA,SAAgB,eAAe,KAAsB;CACnD,MAAM,WAAW,QAAQ,IAAI;AAC7B,KAAI,YAAY,SAAS,MAAM,CAAE,QAAO,SAAS,MAAM;CACvD,MAAM,MAAM,OAAO,IAAI,MAAM,GAAG,MAAM,QAAQ,KAAK;AACnD,KAAI;EACF,MAAM,MAAM,SAAS,iCAAiC;GACpD,KAAK;GACL,OAAO;IAAC;IAAU;IAAQ;IAAS;GACnC,SAAS;GACV,CAAC,CACC,UAAU,CACV,MAAM;AACT,MAAI,IAAK,QAAO,SAAS,IAAI;SACvB;AACR,QAAO,SAAS,IAAI;;;;ACftB,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAG9D,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YAAc,KAAK,cAAc,KAAK,aAAyB;CACrE,MAAM,UAAU,KAAK,YAAY,KAAK;CACtC,MAAM,YAAY,KAAK,cAAc,KAAK,oBAAoB,KAAK;CACnE,MAAM,UACJ,OAAO,KAAK,2BAA2B,WACnC,KAAK,uBAAuB,MAAM,GAAG,IAAK,GAC1C;AAEN,OAAM,GAAG,SAAS,uBAAuB;EACvC,QAAQ;EACR,SAAS,aAAa;EACtB,MAAM,KAAK,UAAU;GACnB,UAAU;GACV;GACA,SAAS,eAAe,KAAK,IAA0B;GACvD,KAAM,KAAK,OAA8B,QAAQ,KAAK;GACtD,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,MAAM;IACJ,UAAU;IACV,YAAY;IACZ,cAAc;IACf;GACF,CAAC;EACF,QAAQ,YAAY,QAAQ,IAAK;EAClC,CAAC,CAAC,YAAY,GAAG;AAClB,kBAAiB,QAAQ,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO;;AAGhD,MAAM"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ import { execSync } from "node:child_process";
3
+ import { basename } from "node:path";
4
+ //#region src/hooks/_project.ts
5
+ function resolveProject(cwd) {
6
+ const explicit = process.env["AGENTMEMORY_PROJECT_NAME"];
7
+ if (explicit && explicit.trim()) return explicit.trim();
8
+ const dir = cwd && cwd.trim() ? cwd : process.cwd();
9
+ try {
10
+ const top = execSync("git rev-parse --show-toplevel", {
11
+ cwd: dir,
12
+ stdio: [
13
+ "ignore",
14
+ "pipe",
15
+ "ignore"
16
+ ],
17
+ timeout: 500
18
+ }).toString().trim();
19
+ if (top) return basename(top);
20
+ } catch {}
21
+ return basename(dir);
22
+ }
23
+ //#endregion
24
+ //#region src/hooks/task-completed.ts
25
+ function isSdkChildContext(payload) {
26
+ if (process.env["AGENTMEMORY_SDK_CHILD"] === "1") return true;
27
+ if (!payload || typeof payload !== "object") return false;
28
+ return payload.entrypoint === "sdk-ts";
29
+ }
30
+ const REST_URL = process.env["AGENTMEMORY_URL"] || "http://localhost:3111";
31
+ const SECRET = process.env["AGENTMEMORY_SECRET"] || "";
32
+ function authHeaders() {
33
+ const h = { "Content-Type": "application/json" };
34
+ if (SECRET) h["Authorization"] = `Bearer ${SECRET}`;
35
+ return h;
36
+ }
37
+ async function main() {
38
+ let input = "";
39
+ for await (const chunk of process.stdin) input += chunk;
40
+ let data;
41
+ try {
42
+ data = JSON.parse(input);
43
+ } catch {
44
+ return;
45
+ }
46
+ if (isSdkChildContext(data)) return;
47
+ const sessionId = data.session_id || "unknown";
48
+ fetch(`${REST_URL}/agentmemory/observe`, {
49
+ method: "POST",
50
+ headers: authHeaders(),
51
+ body: JSON.stringify({
52
+ hookType: "task_completed",
53
+ sessionId,
54
+ project: resolveProject(data.cwd),
55
+ cwd: data.cwd || process.cwd(),
56
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
57
+ data: {
58
+ task_id: data.task_id,
59
+ task_subject: data.task_subject,
60
+ task_description: typeof data.task_description === "string" ? data.task_description.slice(0, 2e3) : "",
61
+ teammate_name: data.teammate_name,
62
+ team_name: data.team_name
63
+ }
64
+ }),
65
+ signal: AbortSignal.timeout(2e3)
66
+ }).catch(() => {});
67
+ setTimeout(() => process.exit(0), 500).unref();
68
+ }
69
+ main();
70
+ //#endregion
71
+ export {};
72
+
73
+ //# sourceMappingURL=task-completed.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-completed.mjs","names":[],"sources":["../../src/hooks/_project.ts","../../src/hooks/task-completed.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\r\nimport { basename } from \"node:path\";\r\n\r\n// Resolution order: AGENTMEMORY_PROJECT_NAME env → git toplevel basename → cwd basename.\r\nexport function resolveProject(cwd?: string): string {\r\n const explicit = process.env[\"AGENTMEMORY_PROJECT_NAME\"];\r\n if (explicit && explicit.trim()) return explicit.trim();\r\n const dir = cwd && cwd.trim() ? cwd : process.cwd();\r\n try {\r\n const top = execSync(\"git rev-parse --show-toplevel\", {\r\n cwd: dir,\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n timeout: 500,\r\n })\r\n .toString()\r\n .trim();\r\n if (top) return basename(top);\r\n } catch {}\r\n return basename(dir);\r\n}\r\n","#!/usr/bin/env node\r\nimport { resolveProject } from \"./_project.js\";\r\n\r\nfunction isSdkChildContext(payload: unknown): boolean {\r\n if (process.env[\"AGENTMEMORY_SDK_CHILD\"] === \"1\") return true;\r\n if (!payload || typeof payload !== \"object\") return false;\r\n return (payload as { entrypoint?: unknown }).entrypoint === \"sdk-ts\";\r\n}\r\n\r\nconst REST_URL = process.env[\"AGENTMEMORY_URL\"] || \"http://localhost:3111\";\r\nconst SECRET = process.env[\"AGENTMEMORY_SECRET\"] || \"\";\r\n\r\nfunction authHeaders(): Record<string, string> {\r\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (SECRET) h[\"Authorization\"] = `Bearer ${SECRET}`;\r\n return h;\r\n}\r\n\r\nasync function main() {\r\n let input = \"\";\r\n for await (const chunk of process.stdin) {\r\n input += chunk;\r\n }\r\n\r\n let data: Record<string, unknown>;\r\n try {\r\n data = JSON.parse(input);\r\n } catch {\r\n return;\r\n }\r\n\r\n if (isSdkChildContext(data)) return;\r\n\r\n const sessionId = (data.session_id as string) || \"unknown\";\r\n\r\n fetch(`${REST_URL}/agentmemory/observe`, {\r\n method: \"POST\",\r\n headers: authHeaders(),\r\n body: JSON.stringify({\r\n hookType: \"task_completed\",\r\n sessionId,\r\n project: resolveProject(data.cwd as string | undefined),\r\n cwd: (data.cwd as string | undefined) || process.cwd(),\r\n timestamp: new Date().toISOString(),\r\n data: {\r\n task_id: data.task_id,\r\n task_subject: data.task_subject,\r\n task_description: typeof data.task_description === \"string\"\r\n ? data.task_description.slice(0, 2000)\r\n : \"\",\r\n teammate_name: data.teammate_name,\r\n team_name: data.team_name,\r\n },\r\n }),\r\n signal: AbortSignal.timeout(2000),\r\n }).catch(() => {});\r\n setTimeout(() => process.exit(0), 500).unref();\r\n}\r\n\r\nmain();\r\n"],"mappings":";;;;AAIA,SAAgB,eAAe,KAAsB;CACnD,MAAM,WAAW,QAAQ,IAAI;AAC7B,KAAI,YAAY,SAAS,MAAM,CAAE,QAAO,SAAS,MAAM;CACvD,MAAM,MAAM,OAAO,IAAI,MAAM,GAAG,MAAM,QAAQ,KAAK;AACnD,KAAI;EACF,MAAM,MAAM,SAAS,iCAAiC;GACpD,KAAK;GACL,OAAO;IAAC;IAAU;IAAQ;IAAS;GACnC,SAAS;GACV,CAAC,CACC,UAAU,CACV,MAAM;AACT,MAAI,IAAK,QAAO,SAAS,IAAI;SACvB;AACR,QAAO,SAAS,IAAI;;;;ACftB,SAAS,kBAAkB,SAA2B;AACpD,KAAI,QAAQ,IAAI,6BAA6B,IAAK,QAAO;AACzD,KAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAQ,QAAqC,eAAe;;AAG9D,MAAM,WAAW,QAAQ,IAAI,sBAAsB;AACnD,MAAM,SAAS,QAAQ,IAAI,yBAAyB;AAEpD,SAAS,cAAsC;CAC7C,MAAM,IAA4B,EAAE,gBAAgB,oBAAoB;AACxE,KAAI,OAAQ,GAAE,mBAAmB,UAAU;AAC3C,QAAO;;AAGT,eAAe,OAAO;CACpB,IAAI,QAAQ;AACZ,YAAW,MAAM,SAAS,QAAQ,MAChC,UAAS;CAGX,IAAI;AACJ,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN;;AAGF,KAAI,kBAAkB,KAAK,CAAE;CAE7B,MAAM,YAAa,KAAK,cAAyB;AAEjD,OAAM,GAAG,SAAS,uBAAuB;EACvC,QAAQ;EACR,SAAS,aAAa;EACtB,MAAM,KAAK,UAAU;GACnB,UAAU;GACV;GACA,SAAS,eAAe,KAAK,IAA0B;GACvD,KAAM,KAAK,OAA8B,QAAQ,KAAK;GACtD,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,MAAM;IACJ,SAAS,KAAK;IACd,cAAc,KAAK;IACnB,kBAAkB,OAAO,KAAK,qBAAqB,WAC/C,KAAK,iBAAiB,MAAM,GAAG,IAAK,GACpC;IACJ,eAAe,KAAK;IACpB,WAAW,KAAK;IACjB;GACF,CAAC;EACF,QAAQ,YAAY,QAAQ,IAAK;EAClC,CAAC,CAAC,YAAY,GAAG;AAClB,kBAAiB,QAAQ,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO;;AAGhD,MAAM"}
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { i as KV, n as touchImage, r as withKeyedLock, t as deleteImage } from "./index.mjs";
3
+ import { TriggerAction } from "iii-sdk";
4
+ //#region src/functions/image-refs.ts
5
+ async function getImageRefCount(kv, filePath) {
6
+ const count = await kv.get(KV.imageRefs, filePath);
7
+ return count ? Number(count) : 0;
8
+ }
9
+ async function incrementImageRef(kv, filePath) {
10
+ return withKeyedLock(`imgRef:${filePath}`, async () => {
11
+ const current = await getImageRefCount(kv, filePath);
12
+ await kv.set(KV.imageRefs, filePath, current + 1);
13
+ await touchImage(filePath);
14
+ });
15
+ }
16
+ async function decrementImageRef(kv, sdk, filePath) {
17
+ return withKeyedLock(`imgRef:${filePath}`, async () => {
18
+ const current = await getImageRefCount(kv, filePath);
19
+ if (current <= 1) {
20
+ await kv.delete(KV.imageEmbeddings, filePath);
21
+ await kv.delete(KV.imageRefs, filePath);
22
+ const { deletedBytes } = await deleteImage(filePath);
23
+ if (deletedBytes > 0) sdk.trigger({
24
+ function_id: "mem::disk-size-delta",
25
+ payload: { deltaBytes: -deletedBytes },
26
+ action: TriggerAction.Void()
27
+ });
28
+ } else await kv.set(KV.imageRefs, filePath, current - 1);
29
+ });
30
+ }
31
+ //#endregion
32
+ export { decrementImageRef, getImageRefCount, incrementImageRef };
33
+
34
+ //# sourceMappingURL=image-refs-BKLmp_sD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-refs-BKLmp_sD.mjs","names":[],"sources":["../src/functions/image-refs.ts"],"sourcesContent":["import { TriggerAction, type ISdk } from \"iii-sdk\";\r\nimport { KV } from \"../state/schema.js\";\r\nimport { StateKV } from \"../state/kv.js\";\r\nimport { deleteImage, touchImage } from \"../utils/image-store.js\";\r\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\r\n\r\nexport async function getImageRefCount(kv: StateKV, filePath: string): Promise<number> {\r\n const count = await kv.get<number>(KV.imageRefs, filePath);\r\n return count ? Number(count) : 0;\r\n}\r\n\r\nexport async function incrementImageRef(kv: StateKV, filePath: string): Promise<void> {\r\n return withKeyedLock(`imgRef:${filePath}`, async () => {\r\n const current = await getImageRefCount(kv, filePath);\r\n await kv.set(KV.imageRefs, filePath, current + 1);\r\n await touchImage(filePath);\r\n });\r\n}\r\n\r\nexport async function decrementImageRef(kv: StateKV, sdk: ISdk, filePath: string): Promise<void> {\r\n return withKeyedLock(`imgRef:${filePath}`, async () => {\r\n const current = await getImageRefCount(kv, filePath);\r\n if (current <= 1) {\r\n await kv.delete(KV.imageEmbeddings, filePath);\r\n await kv.delete(KV.imageRefs, filePath);\r\n const { deletedBytes } = await deleteImage(filePath);\r\n if (deletedBytes > 0) {\r\n sdk.trigger({\r\n function_id: \"mem::disk-size-delta\",\r\n payload: { deltaBytes: -deletedBytes },\r\n action: TriggerAction.Void(),\r\n });\r\n }\r\n } else {\r\n await kv.set(KV.imageRefs, filePath, current - 1);\r\n }\r\n });\r\n}\r\n"],"mappings":";;;;AAMA,eAAsB,iBAAiB,IAAa,UAAmC;CACrF,MAAM,QAAQ,MAAM,GAAG,IAAY,GAAG,WAAW,SAAS;AAC1D,QAAO,QAAQ,OAAO,MAAM,GAAG;;AAGjC,eAAsB,kBAAkB,IAAa,UAAiC;AACpF,QAAO,cAAc,UAAU,YAAY,YAAY;EACrD,MAAM,UAAU,MAAM,iBAAiB,IAAI,SAAS;AACpD,QAAM,GAAG,IAAI,GAAG,WAAW,UAAU,UAAU,EAAE;AACjD,QAAM,WAAW,SAAS;GAC1B;;AAGJ,eAAsB,kBAAkB,IAAa,KAAW,UAAiC;AAC/F,QAAO,cAAc,UAAU,YAAY,YAAY;EACrD,MAAM,UAAU,MAAM,iBAAiB,IAAI,SAAS;AACpD,MAAI,WAAW,GAAG;AAChB,SAAM,GAAG,OAAO,GAAG,iBAAiB,SAAS;AAC7C,SAAM,GAAG,OAAO,GAAG,WAAW,SAAS;GACvC,MAAM,EAAE,iBAAiB,MAAM,YAAY,SAAS;AACpD,OAAI,eAAe,EACjB,KAAI,QAAQ;IACV,aAAa;IACb,SAAS,EAAE,YAAY,CAAC,cAAc;IACtC,QAAQ,cAAc,MAAM;IAC7B,CAAC;QAGJ,OAAM,GAAG,IAAI,GAAG,WAAW,UAAU,UAAU,EAAE;GAEnD"}
@@ -0,0 +1,34 @@
1
+ import { t as KV } from "./schema-CNiCWzV9.mjs";
2
+ import { r as deleteImage, s as touchImage, t as withKeyedLock } from "./keyed-mutex-DTHtcZrt.mjs";
3
+ import { TriggerAction } from "iii-sdk";
4
+ //#region src/functions/image-refs.ts
5
+ async function getImageRefCount(kv, filePath) {
6
+ const count = await kv.get(KV.imageRefs, filePath);
7
+ return count ? Number(count) : 0;
8
+ }
9
+ async function incrementImageRef(kv, filePath) {
10
+ return withKeyedLock(`imgRef:${filePath}`, async () => {
11
+ const current = await getImageRefCount(kv, filePath);
12
+ await kv.set(KV.imageRefs, filePath, current + 1);
13
+ await touchImage(filePath);
14
+ });
15
+ }
16
+ async function decrementImageRef(kv, sdk, filePath) {
17
+ return withKeyedLock(`imgRef:${filePath}`, async () => {
18
+ const current = await getImageRefCount(kv, filePath);
19
+ if (current <= 1) {
20
+ await kv.delete(KV.imageEmbeddings, filePath);
21
+ await kv.delete(KV.imageRefs, filePath);
22
+ const { deletedBytes } = await deleteImage(filePath);
23
+ if (deletedBytes > 0) sdk.trigger({
24
+ function_id: "mem::disk-size-delta",
25
+ payload: { deltaBytes: -deletedBytes },
26
+ action: TriggerAction.Void()
27
+ });
28
+ } else await kv.set(KV.imageRefs, filePath, current - 1);
29
+ });
30
+ }
31
+ //#endregion
32
+ export { decrementImageRef, getImageRefCount, incrementImageRef };
33
+
34
+ //# sourceMappingURL=image-refs-C2YU7BIm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-refs-C2YU7BIm.mjs","names":[],"sources":["../src/functions/image-refs.ts"],"sourcesContent":["import { TriggerAction, type ISdk } from \"iii-sdk\";\r\nimport { KV } from \"../state/schema.js\";\r\nimport { StateKV } from \"../state/kv.js\";\r\nimport { deleteImage, touchImage } from \"../utils/image-store.js\";\r\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\r\n\r\nexport async function getImageRefCount(kv: StateKV, filePath: string): Promise<number> {\r\n const count = await kv.get<number>(KV.imageRefs, filePath);\r\n return count ? Number(count) : 0;\r\n}\r\n\r\nexport async function incrementImageRef(kv: StateKV, filePath: string): Promise<void> {\r\n return withKeyedLock(`imgRef:${filePath}`, async () => {\r\n const current = await getImageRefCount(kv, filePath);\r\n await kv.set(KV.imageRefs, filePath, current + 1);\r\n await touchImage(filePath);\r\n });\r\n}\r\n\r\nexport async function decrementImageRef(kv: StateKV, sdk: ISdk, filePath: string): Promise<void> {\r\n return withKeyedLock(`imgRef:${filePath}`, async () => {\r\n const current = await getImageRefCount(kv, filePath);\r\n if (current <= 1) {\r\n await kv.delete(KV.imageEmbeddings, filePath);\r\n await kv.delete(KV.imageRefs, filePath);\r\n const { deletedBytes } = await deleteImage(filePath);\r\n if (deletedBytes > 0) {\r\n sdk.trigger({\r\n function_id: \"mem::disk-size-delta\",\r\n payload: { deltaBytes: -deletedBytes },\r\n action: TriggerAction.Void(),\r\n });\r\n }\r\n } else {\r\n await kv.set(KV.imageRefs, filePath, current - 1);\r\n }\r\n });\r\n}\r\n"],"mappings":";;;;AAMA,eAAsB,iBAAiB,IAAa,UAAmC;CACrF,MAAM,QAAQ,MAAM,GAAG,IAAY,GAAG,WAAW,SAAS;AAC1D,QAAO,QAAQ,OAAO,MAAM,GAAG;;AAGjC,eAAsB,kBAAkB,IAAa,UAAiC;AACpF,QAAO,cAAc,UAAU,YAAY,YAAY;EACrD,MAAM,UAAU,MAAM,iBAAiB,IAAI,SAAS;AACpD,QAAM,GAAG,IAAI,GAAG,WAAW,UAAU,UAAU,EAAE;AACjD,QAAM,WAAW,SAAS;GAC1B;;AAGJ,eAAsB,kBAAkB,IAAa,KAAW,UAAiC;AAC/F,QAAO,cAAc,UAAU,YAAY,YAAY;EACrD,MAAM,UAAU,MAAM,iBAAiB,IAAI,SAAS;AACpD,MAAI,WAAW,GAAG;AAChB,SAAM,GAAG,OAAO,GAAG,iBAAiB,SAAS;AAC7C,SAAM,GAAG,OAAO,GAAG,WAAW,SAAS;GACvC,MAAM,EAAE,iBAAiB,MAAM,YAAY,SAAS;AACpD,OAAI,eAAe,EACjB,KAAI,QAAQ;IACV,aAAa;IACb,SAAS,EAAE,YAAY,CAAC,cAAc;IACtC,QAAQ,cAAc,MAAM;IAC7B,CAAC;QAGJ,OAAM,GAAG,IAAI,GAAG,WAAW,UAAU,UAAU,EAAE;GAEnD"}
@@ -0,0 +1,2 @@
1
+
2
+ export { };