abmind 0.1.3 → 0.1.5-alpha.1

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 (191) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +90 -61
  3. package/config/.env.memory.example +114 -0
  4. package/dist/cli/abmind-backup.js +10 -10
  5. package/dist/cli/abmind-backup.js.map +1 -1
  6. package/dist/cli/abmind-bundle.js +4 -0
  7. package/dist/cli/abmind-bundle.js.map +1 -1
  8. package/dist/cli/abmind-hook-notification.d.ts +6 -0
  9. package/dist/cli/abmind-hook-notification.d.ts.map +1 -0
  10. package/dist/cli/abmind-hook-notification.js +56 -0
  11. package/dist/cli/abmind-hook-notification.js.map +1 -0
  12. package/dist/cli/abmind-hook-postToolUse.d.ts +10 -0
  13. package/dist/cli/abmind-hook-postToolUse.d.ts.map +1 -0
  14. package/dist/cli/abmind-hook-postToolUse.js +85 -0
  15. package/dist/cli/abmind-hook-postToolUse.js.map +1 -0
  16. package/dist/cli/abmind-hook-postcompact.d.ts +9 -0
  17. package/dist/cli/abmind-hook-postcompact.d.ts.map +1 -0
  18. package/dist/cli/abmind-hook-postcompact.js +64 -0
  19. package/dist/cli/abmind-hook-postcompact.js.map +1 -0
  20. package/dist/cli/abmind-hook-postuserprompt.d.ts +7 -0
  21. package/dist/cli/abmind-hook-postuserprompt.d.ts.map +1 -0
  22. package/dist/cli/abmind-hook-postuserprompt.js +69 -0
  23. package/dist/cli/abmind-hook-postuserprompt.js.map +1 -0
  24. package/dist/cli/abmind-hook-preToolUse.d.ts +10 -0
  25. package/dist/cli/abmind-hook-preToolUse.d.ts.map +1 -0
  26. package/dist/cli/abmind-hook-preToolUse.js +61 -0
  27. package/dist/cli/abmind-hook-preToolUse.js.map +1 -0
  28. package/dist/cli/abmind-hook-precompact.d.ts +7 -0
  29. package/dist/cli/abmind-hook-precompact.d.ts.map +1 -0
  30. package/dist/cli/abmind-hook-precompact.js +63 -0
  31. package/dist/cli/abmind-hook-precompact.js.map +1 -0
  32. package/dist/cli/abmind-hook-preuserprompt.d.ts +16 -0
  33. package/dist/cli/abmind-hook-preuserprompt.d.ts.map +1 -0
  34. package/dist/cli/abmind-hook-preuserprompt.js +125 -0
  35. package/dist/cli/abmind-hook-preuserprompt.js.map +1 -0
  36. package/dist/cli/abmind-hook-store.js +26 -3
  37. package/dist/cli/abmind-hook-store.js.map +1 -1
  38. package/dist/cli/abmind-hook-subagentstart.d.ts +6 -0
  39. package/dist/cli/abmind-hook-subagentstart.d.ts.map +1 -0
  40. package/dist/cli/abmind-hook-subagentstart.js +56 -0
  41. package/dist/cli/abmind-hook-subagentstart.js.map +1 -0
  42. package/dist/cli/abmind-hook-subagentstop.d.ts +6 -0
  43. package/dist/cli/abmind-hook-subagentstop.d.ts.map +1 -0
  44. package/dist/cli/abmind-hook-subagentstop.js +58 -0
  45. package/dist/cli/abmind-hook-subagentstop.js.map +1 -0
  46. package/dist/cli/abmind-hook-toolfailure.d.ts +7 -0
  47. package/dist/cli/abmind-hook-toolfailure.d.ts.map +1 -0
  48. package/dist/cli/abmind-hook-toolfailure.js +66 -0
  49. package/dist/cli/abmind-hook-toolfailure.js.map +1 -0
  50. package/dist/cli/abmind-hook-wakeup.js +10 -0
  51. package/dist/cli/abmind-hook-wakeup.js.map +1 -1
  52. package/dist/cli/abmind-install.js +251 -11
  53. package/dist/cli/abmind-install.js.map +1 -1
  54. package/dist/cli/abmind-restore.d.ts +1 -1
  55. package/dist/cli/abmind-restore.js +14 -36
  56. package/dist/cli/abmind-restore.js.map +1 -1
  57. package/dist/cli/abmind-retro-extract.js +41 -5
  58. package/dist/cli/abmind-retro-extract.js.map +1 -1
  59. package/dist/cli/abmind-sleep-state.js +1 -1
  60. package/dist/cli/abmind-sleep-state.js.map +1 -1
  61. package/dist/cli/abmind.js +2 -0
  62. package/dist/cli/abmind.js.map +1 -1
  63. package/dist/src/backup.d.ts +3 -1
  64. package/dist/src/backup.d.ts.map +1 -1
  65. package/dist/src/backup.js +11 -4
  66. package/dist/src/backup.js.map +1 -1
  67. package/dist/src/context-engine.d.ts +1 -1
  68. package/dist/src/context-engine.d.ts.map +1 -1
  69. package/dist/src/context-engine.js +1 -1
  70. package/dist/src/context-engine.js.map +1 -1
  71. package/dist/src/context-orchestrator.js +3 -3
  72. package/dist/src/context-orchestrator.js.map +1 -1
  73. package/dist/src/crypto.d.ts +6 -0
  74. package/dist/src/crypto.d.ts.map +1 -1
  75. package/dist/src/crypto.js +100 -17
  76. package/dist/src/crypto.js.map +1 -1
  77. package/dist/src/ensure-initialized.d.ts +1 -1
  78. package/dist/src/ensure-initialized.js +1 -1
  79. package/dist/src/env-schema.d.ts +2 -0
  80. package/dist/src/env-schema.d.ts.map +1 -1
  81. package/dist/src/env-schema.js +3 -1
  82. package/dist/src/env-schema.js.map +1 -1
  83. package/dist/src/index.d.ts +5 -2
  84. package/dist/src/index.d.ts.map +1 -1
  85. package/dist/src/index.js +5 -2
  86. package/dist/src/index.js.map +1 -1
  87. package/dist/src/keyring.d.ts +9 -0
  88. package/dist/src/keyring.d.ts.map +1 -0
  89. package/dist/src/keyring.js +60 -0
  90. package/dist/src/keyring.js.map +1 -0
  91. package/dist/src/mem-types.d.ts +1 -1
  92. package/dist/src/mem-types.d.ts.map +1 -1
  93. package/dist/src/memory-backend.d.ts +3 -0
  94. package/dist/src/memory-backend.d.ts.map +1 -1
  95. package/dist/src/memory-config.js +1 -1
  96. package/dist/src/memory-config.js.map +1 -1
  97. package/dist/src/memory-db.d.ts +1 -6
  98. package/dist/src/memory-db.d.ts.map +1 -1
  99. package/dist/src/memory-db.js +7 -1
  100. package/dist/src/memory-db.js.map +1 -1
  101. package/dist/src/memory-editor.d.ts +1 -0
  102. package/dist/src/memory-editor.d.ts.map +1 -1
  103. package/dist/src/memory-editor.js +17 -16
  104. package/dist/src/memory-editor.js.map +1 -1
  105. package/dist/src/memory-ipc-client.d.ts +3 -0
  106. package/dist/src/memory-ipc-client.d.ts.map +1 -1
  107. package/dist/src/memory-ipc-client.js +4 -0
  108. package/dist/src/memory-ipc-client.js.map +1 -1
  109. package/dist/src/message-store.js +1 -1
  110. package/dist/src/message-store.js.map +1 -1
  111. package/dist/src/recall-benchmark.js +4 -2
  112. package/dist/src/recall-benchmark.js.map +1 -1
  113. package/dist/src/redact-secrets.d.ts.map +1 -1
  114. package/dist/src/redact-secrets.js +3 -0
  115. package/dist/src/redact-secrets.js.map +1 -1
  116. package/dist/src/session-context.d.ts +6 -5
  117. package/dist/src/session-context.d.ts.map +1 -1
  118. package/dist/src/session-context.js +134 -66
  119. package/dist/src/session-context.js.map +1 -1
  120. package/dist/src/sleep/levels.d.ts +7 -6
  121. package/dist/src/sleep/levels.d.ts.map +1 -1
  122. package/dist/src/sleep/levels.js.map +1 -1
  123. package/dist/src/sleep/orchestrator.d.ts +1 -1
  124. package/dist/src/sleep/orchestrator.d.ts.map +1 -1
  125. package/dist/src/sleep/orchestrator.js +80 -38
  126. package/dist/src/sleep/orchestrator.js.map +1 -1
  127. package/dist/src/sleep/sleep-daily-summary.d.ts +6 -2
  128. package/dist/src/sleep/sleep-daily-summary.d.ts.map +1 -1
  129. package/dist/src/sleep/sleep-daily-summary.js +34 -12
  130. package/dist/src/sleep/sleep-daily-summary.js.map +1 -1
  131. package/dist/src/sleep/sleep-extract-daily.d.ts.map +1 -1
  132. package/dist/src/sleep/sleep-extract-daily.js +3 -0
  133. package/dist/src/sleep/sleep-extract-daily.js.map +1 -1
  134. package/dist/src/sleep/sleep-prompt-loader.js +3 -3
  135. package/dist/src/sleep/sleep-prompt-loader.js.map +1 -1
  136. package/dist/src/sleep-data-access.d.ts +4 -2
  137. package/dist/src/sleep-data-access.d.ts.map +1 -1
  138. package/dist/src/sleep-data-access.js +49 -13
  139. package/dist/src/sleep-data-access.js.map +1 -1
  140. package/dist/src/sqlite-backend.d.ts +3 -0
  141. package/dist/src/sqlite-backend.d.ts.map +1 -1
  142. package/dist/src/sqlite-backend.js +3 -0
  143. package/dist/src/sqlite-backend.js.map +1 -1
  144. package/dist/src/status-block.d.ts +7 -0
  145. package/dist/src/status-block.d.ts.map +1 -0
  146. package/dist/src/status-block.js +67 -0
  147. package/dist/src/status-block.js.map +1 -0
  148. package/dist/src/wake-up-renderer.d.ts +0 -5
  149. package/dist/src/wake-up-renderer.d.ts.map +1 -1
  150. package/dist/src/wake-up-renderer.js +0 -34
  151. package/dist/src/wake-up-renderer.js.map +1 -1
  152. package/package.json +6 -3
  153. package/prompts/sleep/03-retrospective.md +23 -0
  154. package/prompts/sleep/04-extract-memories.md +3 -0
  155. package/prompts/sleep/06-retro-derive.md +39 -0
  156. package/prompts/sleep/08-memory-maintenance.md +39 -0
  157. package/prompts/sleep/{13-consolidation.md → 11-consolidation.md} +4 -1
  158. package/templates/core/SOUL.md +24 -0
  159. package/templates/core/agent_notes.md +7 -0
  160. package/templates/core/core_facts.md +10 -0
  161. package/templates/core/memory-tools.md +43 -0
  162. package/templates/core/user_profile.md +7 -0
  163. package/templates/with-abmind-hooks.json +26 -0
  164. package/dist/cli/abmind-backfill.d.ts +0 -3
  165. package/dist/cli/abmind-backfill.d.ts.map +0 -1
  166. package/dist/cli/abmind-backfill.js +0 -64
  167. package/dist/cli/abmind-backfill.js.map +0 -1
  168. package/dist/cli/abmind-memory-stats.d.ts +0 -3
  169. package/dist/cli/abmind-memory-stats.d.ts.map +0 -1
  170. package/dist/cli/abmind-memory-stats.js +0 -45
  171. package/dist/cli/abmind-memory-stats.js.map +0 -1
  172. package/dist/cli/abmind-reset.d.ts +0 -11
  173. package/dist/cli/abmind-reset.d.ts.map +0 -1
  174. package/dist/cli/abmind-reset.js +0 -143
  175. package/dist/cli/abmind-reset.js.map +0 -1
  176. package/dist/cli/abmind-status.d.ts +0 -3
  177. package/dist/cli/abmind-status.d.ts.map +0 -1
  178. package/dist/cli/abmind-status.js +0 -45
  179. package/dist/cli/abmind-status.js.map +0 -1
  180. package/prompts/sleep/03-extract-from-daily.md +0 -3
  181. package/prompts/sleep/04-retrospective.md +0 -30
  182. package/prompts/sleep/07-topic-assignment.md +0 -23
  183. package/prompts/sleep/08-core-promotion.md +0 -26
  184. package/prompts/sleep/09-merge.md +0 -19
  185. package/prompts/sleep/12-core-knowledge.md +0 -14
  186. package/prompts/sleep/14-emotion-context.md +0 -17
  187. /package/prompts/sleep/{15-contradiction-and-graph.md → 05-contradiction-and-graph.md} +0 -0
  188. /package/prompts/sleep/{06-feedback.md → 07-feedback.md} +0 -0
  189. /package/prompts/sleep/{10-translation.md → 09-translation.md} +0 -0
  190. /package/prompts/sleep/{11-skill-review.md → 10-skill-review.md} +0 -0
  191. /package/prompts/sleep/{16-rem-synthesis.md → 12-rem-synthesis.md} +0 -0
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook PostCompact — inject fresh recall after context compaction.
4
+ * Re-grounds the agent with relevant memories after context was trimmed.
5
+ * NOTE: Claude Code does not officially support this event yet.
6
+ * When it does, this hook activates automatically.
7
+ */
8
+ import { runCliRaw } from "../src/cli-runner-raw.js";
9
+ import { loadMemoryConfig } from "../src/memory-config.js";
10
+ import { MemoryManager } from "../src/memory-manager.js";
11
+ import { SleepDataAccess } from "../src/sleep-data-access.js";
12
+ import { hooksDisabled, logHookError, readStdinJson, ensureHooksDir } from "../src/hook-helpers.js";
13
+ import { extractEnglishTokens } from "../src/query-tokenizer.js";
14
+ await runCliRaw(import.meta.url, {
15
+ name: "abmind-hook-postcompact",
16
+ help: "PostCompact hook — inject fresh recall after context compaction.",
17
+ flags: [],
18
+ handler: async () => {
19
+ ensureHooksDir();
20
+ if (hooksDisabled()) {
21
+ process.exit(0);
22
+ }
23
+ try {
24
+ const payload = await readStdinJson();
25
+ const summary = payload?.summary?.trim();
26
+ if (!summary) {
27
+ process.exit(0);
28
+ }
29
+ const memory = new MemoryManager(loadMemoryConfig());
30
+ await memory.initialize({ skipEmbeddingCheck: true });
31
+ try {
32
+ const db = memory.getDatabase();
33
+ if (!db) {
34
+ process.exit(0);
35
+ }
36
+ const sleepData = new SleepDataAccess(db);
37
+ let userId;
38
+ try {
39
+ userId = sleepData.getPrimaryUserId();
40
+ }
41
+ catch {
42
+ process.exit(0);
43
+ }
44
+ const tokens = extractEnglishTokens(summary);
45
+ if (tokens.length === 0) {
46
+ process.exit(0);
47
+ }
48
+ const results = await memory.search(tokens.join(" "), { userId, limit: 5 });
49
+ if (results.length > 0) {
50
+ const output = results.map((r) => `- ${r.content_en}`).join("\n");
51
+ process.stdout.write(output.slice(0, 2000));
52
+ }
53
+ }
54
+ finally {
55
+ memory.close();
56
+ }
57
+ }
58
+ catch (err) {
59
+ logHookError("postcompact", err);
60
+ }
61
+ process.exit(0);
62
+ },
63
+ });
64
+ //# sourceMappingURL=abmind-hook-postcompact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-postcompact.js","sourceRoot":"","sources":["../../cli/abmind-hook-postcompact.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAOjE,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAC/B,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,kEAAkE;IACxE,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,cAAc,EAAE,CAAC;QACjB,IAAI,aAAa,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,EAAsB,CAAC;YAC1D,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAElC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,EAAE,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAC7B,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,MAAc,CAAC;gBACnB,IAAI,CAAC;oBAAC,MAAM,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAEzE,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAE7C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;oBAAS,CAAC;gBAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YAAC,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook PostUserPrompt — real-time extraction after high-signal exchanges.
4
+ * Hybrid: heuristic gate + only extracts when triggered.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=abmind-hook-postuserprompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-postuserprompt.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-postuserprompt.ts"],"names":[],"mappings":";AACA;;;GAGG"}
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook PostUserPrompt — real-time extraction after high-signal exchanges.
4
+ * Hybrid: heuristic gate + only extracts when triggered.
5
+ */
6
+ import { runCliRaw } from "../src/cli-runner-raw.js";
7
+ import { loadMemoryConfig } from "../src/memory-config.js";
8
+ import { MemoryManager } from "../src/memory-manager.js";
9
+ import { SleepDataAccess } from "../src/sleep-data-access.js";
10
+ import { hooksDisabled, logHookError, readStdinJson, ensureHooksDir } from "../src/hook-helpers.js";
11
+ const SIGNAL_PATTERNS = [
12
+ /\b(remember|don't forget|note that|my .+ is|I prefer|I decided|I always|I never)\b/i,
13
+ /\b(password|secret|key|token|credential)\b/i,
14
+ /\b(important|critical|rule|always do|never do)\b/i,
15
+ ];
16
+ await runCliRaw(import.meta.url, {
17
+ name: "abmind-hook-postuserprompt",
18
+ help: "PostUserPrompt hook — real-time extraction on high-signal exchanges.",
19
+ flags: [],
20
+ handler: async () => {
21
+ ensureHooksDir();
22
+ if (hooksDisabled()) {
23
+ process.exit(0);
24
+ }
25
+ try {
26
+ const payload = await readStdinJson();
27
+ const userMsg = payload?.user_message ?? "";
28
+ const assistantMsg = payload?.assistant_message ?? "";
29
+ const combined = userMsg + " " + assistantMsg;
30
+ // Heuristic gate — only extract if high-signal
31
+ const triggered = SIGNAL_PATTERNS.some(p => p.test(combined));
32
+ if (!triggered) {
33
+ process.exit(0);
34
+ }
35
+ const memory = new MemoryManager(loadMemoryConfig());
36
+ await memory.initialize({ skipEmbeddingCheck: true });
37
+ try {
38
+ const db = memory.getDatabase();
39
+ if (!db) {
40
+ process.exit(0);
41
+ }
42
+ const sleepData = new SleepDataAccess(db);
43
+ let userId;
44
+ try {
45
+ userId = sleepData.getPrimaryUserId();
46
+ }
47
+ catch {
48
+ process.exit(0);
49
+ }
50
+ // Record both messages for Dreamy extraction
51
+ const now = Date.now();
52
+ if (userMsg.length > 10) {
53
+ memory.recordMessage({ userId, sessionId: "_A_realtime", role: "user", content: userMsg, timestamp: now - 1000 });
54
+ }
55
+ if (assistantMsg.length > 10) {
56
+ memory.recordMessage({ userId, sessionId: "_A_realtime", role: "assistant", content: assistantMsg, timestamp: now });
57
+ }
58
+ }
59
+ finally {
60
+ memory.close();
61
+ }
62
+ }
63
+ catch (err) {
64
+ logHookError("postuserprompt", err);
65
+ }
66
+ process.exit(0);
67
+ },
68
+ });
69
+ //# sourceMappingURL=abmind-hook-postuserprompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-postuserprompt.js","sourceRoot":"","sources":["../../cli/abmind-hook-postuserprompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook-preToolUse — Kiro CLI preToolUse hook (#634).
4
+ *
5
+ * Security gate: blocks direct writes to abmind's memory DB.
6
+ * Pure string matching — no I/O, no async beyond stdin read.
7
+ * Exit 0 = allow, exit 2 = block (STDERR returned to LLM).
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=abmind-hook-preToolUse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-preToolUse.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-preToolUse.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook-preToolUse — Kiro CLI preToolUse hook (#634).
4
+ *
5
+ * Security gate: blocks direct writes to abmind's memory DB.
6
+ * Pure string matching — no I/O, no async beyond stdin read.
7
+ * Exit 0 = allow, exit 2 = block (STDERR returned to LLM).
8
+ */
9
+ import { runCliRaw } from "../src/cli-runner-raw.js";
10
+ import { hooksDisabled, readStdinJson, ensureHooksDir } from "../src/hook-helpers.js";
11
+ const BLOCKED_DB_PATTERNS = [
12
+ /memory\.db/,
13
+ /memory\/memory/,
14
+ /\.abmind\/memory/,
15
+ ];
16
+ await runCliRaw(import.meta.url, {
17
+ name: "abmind-hook-preToolUse",
18
+ help: `Usage:
19
+ abmind hook-preToolUse
20
+
21
+ Kiro CLI preToolUse hook. Blocks direct writes to abmind's memory DB.
22
+ Exit 0 = allow, exit 2 = block.
23
+
24
+ Env var: ABMIND_HOOKS_DISABLED=true disables all hooks.`,
25
+ flags: [],
26
+ handler: async () => {
27
+ ensureHooksDir();
28
+ if (hooksDisabled()) {
29
+ process.exit(0);
30
+ }
31
+ try {
32
+ const payload = await readStdinJson();
33
+ if (!payload?.tool_name) {
34
+ process.exit(0);
35
+ }
36
+ const toolName = payload.tool_name;
37
+ const input = payload.tool_input ?? {};
38
+ if (toolName === "execute_bash" || toolName === "shell") {
39
+ const cmd = String(input.command ?? "");
40
+ for (const pat of BLOCKED_DB_PATTERNS) {
41
+ if (pat.test(cmd)) {
42
+ process.stderr.write(`🛡️ Blocked: direct access to abmind memory.db is not allowed. Use abmind CLI commands instead.\n`);
43
+ process.exit(2);
44
+ }
45
+ }
46
+ }
47
+ if (toolName === "fs_write" || toolName === "write") {
48
+ const path = String(input.path ?? "");
49
+ if (path.includes(".abmind/memory")) {
50
+ process.stderr.write(`🛡️ Blocked: direct writes to ~/.abmind/memory/ are not allowed. Use abmind CLI commands instead.\n`);
51
+ process.exit(2);
52
+ }
53
+ }
54
+ }
55
+ catch {
56
+ // Never block on hook failure
57
+ }
58
+ process.exit(0);
59
+ },
60
+ });
61
+ //# sourceMappingURL=abmind-hook-preToolUse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-preToolUse.js","sourceRoot":"","sources":["../../cli/abmind-hook-preToolUse.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQtF,MAAM,mBAAmB,GAAG;IAC1B,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;CACnB,CAAC;AAEF,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAC/B,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE;;;;;;wDAMgD;IACtD,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,cAAc,EAAE,CAAC;QACjB,IAAI,aAAa,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,EAAqB,CAAC;YACzD,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAE7C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;YAEvC,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACxD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBACxC,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;oBACtC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAC;wBAC1H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACpD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qGAAqG,CAAC,CAAC;oBAC5H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook PreCompact — extract memories before context compaction.
4
+ * Reads transcript from stdin, runs extraction so memories aren't lost.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=abmind-hook-precompact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-precompact.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-precompact.ts"],"names":[],"mappings":";AACA;;;GAGG"}
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook PreCompact — extract memories before context compaction.
4
+ * Reads transcript from stdin, runs extraction so memories aren't lost.
5
+ */
6
+ import { runCliRaw } from "../src/cli-runner-raw.js";
7
+ import { loadMemoryConfig } from "../src/memory-config.js";
8
+ import { MemoryManager } from "../src/memory-manager.js";
9
+ import { SleepDataAccess } from "../src/sleep-data-access.js";
10
+ import { hooksDisabled, logHookError, readStdinJson, ensureHooksDir } from "../src/hook-helpers.js";
11
+ await runCliRaw(import.meta.url, {
12
+ name: "abmind-hook-precompact",
13
+ help: "PreCompact hook — extract memories from transcript before context is lost.",
14
+ flags: [],
15
+ handler: async () => {
16
+ ensureHooksDir();
17
+ if (hooksDisabled()) {
18
+ process.exit(0);
19
+ }
20
+ try {
21
+ const payload = await readStdinJson();
22
+ const transcript = payload?.transcript?.trim();
23
+ if (!transcript || transcript.length < 100) {
24
+ process.exit(0);
25
+ }
26
+ const memory = new MemoryManager(loadMemoryConfig());
27
+ await memory.initialize({ skipEmbeddingCheck: true });
28
+ try {
29
+ const db = memory.getDatabase();
30
+ if (!db) {
31
+ process.exit(0);
32
+ }
33
+ const sleepData = new SleepDataAccess(db);
34
+ let userId;
35
+ try {
36
+ userId = sleepData.getPrimaryUserId();
37
+ }
38
+ catch {
39
+ process.exit(0);
40
+ }
41
+ // Record transcript messages so Dreamy can extract them later
42
+ const lines = transcript.split("\n").filter(l => l.trim());
43
+ const now = Date.now();
44
+ for (let i = 0; i < Math.min(lines.length, 50); i++) {
45
+ const line = lines[i];
46
+ const role = line.startsWith("Human:") || line.startsWith("User:") ? "user" : "assistant";
47
+ const content = line.replace(/^(Human|User|Assistant|Claude):\s*/i, "").trim();
48
+ if (content.length > 10) {
49
+ memory.recordMessage({ userId, sessionId: "_A_compact", role, content, timestamp: now - (lines.length - i) * 1000 });
50
+ }
51
+ }
52
+ }
53
+ finally {
54
+ memory.close();
55
+ }
56
+ }
57
+ catch (err) {
58
+ logHookError("precompact", err);
59
+ }
60
+ process.exit(0);
61
+ },
62
+ });
63
+ //# sourceMappingURL=abmind-hook-precompact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-precompact.js","sourceRoot":"","sources":["../../cli/abmind-hook-precompact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook preuserprompt — Kiro CLI PreUserPrompt / Gemini BeforeAgent hook (#344).
4
+ *
5
+ * Reads JSON from stdin: { hook_event_name, cwd, prompt }
6
+ * Writes relevant memories to stdout (capped) for context injection.
7
+ * Also writes the prompt to a sidecar file so the `stop` hook can record
8
+ * a full turn. Exit 0 always (never blocks chat).
9
+ *
10
+ * Translation awareness: the prompt is split across `translated` (English
11
+ * tokens extracted heuristically) and `original` (raw prompt). Sf's
12
+ * three-query fan-out handles both paths. See
13
+ * abproject/docs/plans/abmind-hook-preuserprompt-translation.md.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=abmind-hook-preuserprompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-preuserprompt.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-preuserprompt.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook preuserprompt — Kiro CLI PreUserPrompt / Gemini BeforeAgent hook (#344).
4
+ *
5
+ * Reads JSON from stdin: { hook_event_name, cwd, prompt }
6
+ * Writes relevant memories to stdout (capped) for context injection.
7
+ * Also writes the prompt to a sidecar file so the `stop` hook can record
8
+ * a full turn. Exit 0 always (never blocks chat).
9
+ *
10
+ * Translation awareness: the prompt is split across `translated` (English
11
+ * tokens extracted heuristically) and `original` (raw prompt). Sf's
12
+ * three-query fan-out handles both paths. See
13
+ * abproject/docs/plans/abmind-hook-preuserprompt-translation.md.
14
+ */
15
+ import { runCliRaw } from "../src/cli-runner-raw.js";
16
+ import { loadMemoryConfig } from "../src/memory-config.js";
17
+ import { MemoryManager } from "../src/memory-manager.js";
18
+ import { SleepDataAccess } from "../src/sleep-data-access.js";
19
+ import { hooksDisabled, logHookError, readStdinJson, ensureHooksDir } from "../src/hook-helpers.js";
20
+ import { hookSidecarPath } from "../src/mem-paths.js";
21
+ import { extractEnglishTokens } from "../src/query-tokenizer.js";
22
+ import { writeFileSync } from "node:fs";
23
+ const DEFAULT_LIMIT = 5;
24
+ const DEFAULT_MAX_CHARS = 2000;
25
+ await runCliRaw(import.meta.url, {
26
+ name: "abmind-hook-preuserprompt",
27
+ help: `Usage:
28
+ abmind hook preuserprompt
29
+
30
+ Kiro CLI PreUserPrompt hook. Reads hook event JSON from stdin, runs
31
+ recall on the prompt, outputs top matches for context injection.
32
+
33
+ Also writes the prompt to a sidecar file so the \`stop\` hook can record
34
+ the full turn.
35
+
36
+ Exits 0 unconditionally. SECRET memories (classification=3) are never
37
+ surfaced here — only explicit CLI/agent queries can reach them.
38
+
39
+ Env vars:
40
+ ABMIND_HOOKS_DISABLED disable all hooks (default: false)
41
+ ABMIND_HOOK_RECALL_LIMIT max results (default: 5)
42
+ ABMIND_HOOK_RECALL_MAX_CHARS max output chars (default: 2000)`,
43
+ flags: [],
44
+ handler: async () => {
45
+ ensureHooksDir();
46
+ if (hooksDisabled()) {
47
+ process.exit(0);
48
+ }
49
+ try {
50
+ const payload = await readStdinJson();
51
+ const prompt = payload?.prompt?.trim();
52
+ if (!prompt) {
53
+ process.exit(0);
54
+ }
55
+ // Write sidecar FIRST so even a recall failure doesn't drop the prompt for the stop hook
56
+ try {
57
+ writeFileSync(hookSidecarPath(), prompt, "utf-8");
58
+ }
59
+ catch (err) {
60
+ logHookError("recall:sidecar", err);
61
+ }
62
+ const limit = Math.max(1, Math.min(50, Number(process.env.ABMIND_HOOK_RECALL_LIMIT ?? DEFAULT_LIMIT)));
63
+ const maxChars = Math.max(100, Number(process.env.ABMIND_HOOK_RECALL_MAX_CHARS ?? DEFAULT_MAX_CHARS));
64
+ const memory = new MemoryManager(loadMemoryConfig());
65
+ await memory.initialize({ skipEmbeddingCheck: true });
66
+ try {
67
+ const db = memory.getDatabase();
68
+ if (!db) {
69
+ process.exit(0);
70
+ }
71
+ const sleepData = new SleepDataAccess(db);
72
+ let userId;
73
+ try {
74
+ userId = sleepData.getPrimaryUserId();
75
+ }
76
+ catch {
77
+ process.exit(0); /* no messages yet — nothing to recall */
78
+ }
79
+ // Translation-aware query: extract English-looking tokens from the
80
+ // raw prompt and split the query across `translated` (EN-indexed
81
+ // paths: FTS5 porter, trigram content_en, Se embedding) and
82
+ // `original` (trigram content_original path). See
83
+ // abproject/docs/plans/abmind-hook-preuserprompt-translation.md.
84
+ const englishTokens = extractEnglishTokens(prompt);
85
+ const translated = englishTokens.length > 0 ? englishTokens : [prompt];
86
+ const original = englishTokens.length > 0 ? prompt : undefined;
87
+ const result = await memory.recallSearch({
88
+ translated,
89
+ original,
90
+ userId,
91
+ limit,
92
+ // maxClassification: 2 is intentional — SECRET memories (class=3) MUST NOT auto-surface
93
+ // via hooks. They only appear on explicit CLI / dedicated-agent recall where the user
94
+ // chose to ask. See #344 plan, "Token budget" + maxClassification note.
95
+ maxClassification: 2,
96
+ });
97
+ if (result.results.length === 0) {
98
+ process.exit(0);
99
+ }
100
+ // Format as compact markdown lines; cap total chars
101
+ const lines = ["[abmind memory context]"];
102
+ let total = lines[0].length + 1;
103
+ for (const hit of result.results) {
104
+ const line = `- (${hit.date}) ${hit.content}`.replace(/\s+/g, " ").trim();
105
+ if (total + line.length + 1 > maxChars)
106
+ break;
107
+ lines.push(line);
108
+ total += line.length + 1;
109
+ }
110
+ if (lines.length > 1) {
111
+ const { resolveHookFormat, writeHookOutput } = await import("./hook-output.js");
112
+ writeHookOutput(lines.join("\n") + "\n", resolveHookFormat());
113
+ }
114
+ }
115
+ finally {
116
+ memory.close();
117
+ }
118
+ }
119
+ catch (err) {
120
+ logHookError("recall", err);
121
+ }
122
+ process.exit(0);
123
+ },
124
+ });
125
+ //# sourceMappingURL=abmind-hook-preuserprompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-preuserprompt.js","sourceRoot":"","sources":["../../cli/abmind-hook-preuserprompt.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAQ/B,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAC/B,IAAI,EAAE,2BAA2B;IACjC,IAAI,EAAE;;;;;;;;;;;;;;;iEAeyD;IAC/D,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,cAAc,EAAE,CAAC;QACjB,IAAI,aAAa,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,EAAuB,CAAC;YAC3D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAEjC,yFAAyF;YACzF,IAAI,CAAC;gBACH,aAAa,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;YACvG,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,iBAAiB,CAAC,CAAC,CAAC;YAEtG,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,EAAE,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAC7B,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,MAAc,CAAC;gBACnB,IAAI,CAAC;oBAAC,MAAM,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAAC,CAAC;gBAC9C,MAAM,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,yCAAyC;gBAAC,CAAC;gBAEpE,mEAAmE;gBACnE,iEAAiE;gBACjE,4DAA4D;gBAC5D,kDAAkD;gBAClD,iEAAiE;gBACjE,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAO,CAAC,CAAC;gBACpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,CAAC;gBACxE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;oBACvC,UAAU;oBACV,QAAQ;oBACR,MAAM;oBACN,KAAK;oBACL,wFAAwF;oBACxF,sFAAsF;oBACtF,wEAAwE;oBACxE,iBAAiB,EAAE,CAAC;iBACrB,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAErD,oDAAoD;gBACpD,MAAM,KAAK,GAAa,CAAC,yBAAyB,CAAC,CAAC;gBACpD,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC1E,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ;wBAAE,MAAM;oBAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3B,CAAC;gBACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,EAAE,iBAAiB,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;oBAChF,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC,CAAC"}
@@ -18,8 +18,9 @@ import { loadMemoryConfig } from "../src/memory-config.js";
18
18
  import { MemoryManager } from "../src/memory-manager.js";
19
19
  import { SleepDataAccess } from "../src/sleep-data-access.js";
20
20
  import { hooksDisabled, logHookError, readStdinJson, ensureHooksDir } from "../src/hook-helpers.js";
21
- import { hookSidecarPath } from "../src/mem-paths.js";
21
+ import { hookSidecarPath, abmindHooksDir, hookSidecarKey } from "../src/mem-paths.js";
22
22
  import { readFileSync, unlinkSync, existsSync } from "node:fs";
23
+ import { join } from "node:path";
23
24
  await runCliRaw(import.meta.url, {
24
25
  name: "abmind-hook-store",
25
26
  help: `Usage:
@@ -83,11 +84,24 @@ Env var: ABMIND_HOOKS_DISABLED=true disables all hooks.`,
83
84
  });
84
85
  }
85
86
  if (assistantResponse) {
87
+ // Append tools context from postToolUse sidecar
88
+ let content = assistantResponse;
89
+ const toolsSidecar = join(abmindHooksDir(), `tools-${hookSidecarKey()}.sidecar`);
90
+ if (existsSync(toolsSidecar)) {
91
+ try {
92
+ const tools = readFileSync(toolsSidecar, "utf-8").trim();
93
+ if (tools)
94
+ content += `\n\n[tools used]\n${tools}`;
95
+ }
96
+ catch (err) {
97
+ logHookError("store:tools-read", err);
98
+ }
99
+ }
86
100
  memory.recordMessage({
87
101
  userId,
88
102
  sessionId,
89
103
  role: "assistant",
90
- content: assistantResponse,
104
+ content,
91
105
  timestamp: now,
92
106
  });
93
107
  }
@@ -96,7 +110,7 @@ Env var: ABMIND_HOOKS_DISABLED=true disables all hooks.`,
96
110
  memory.close();
97
111
  }
98
112
  }
99
- // Clean up sidecar regardless of outcome
113
+ // Clean up sidecars regardless of outcome
100
114
  if (existsSync(sidecarPath)) {
101
115
  try {
102
116
  unlinkSync(sidecarPath);
@@ -105,6 +119,15 @@ Env var: ABMIND_HOOKS_DISABLED=true disables all hooks.`,
105
119
  logHookError("store:sidecar-unlink", err);
106
120
  }
107
121
  }
122
+ const toolsSidecarCleanup = join(abmindHooksDir(), `tools-${hookSidecarKey()}.sidecar`);
123
+ if (existsSync(toolsSidecarCleanup)) {
124
+ try {
125
+ unlinkSync(toolsSidecarCleanup);
126
+ }
127
+ catch (err) {
128
+ logHookError("store:tools-unlink", err);
129
+ }
130
+ }
108
131
  }
109
132
  catch (err) {
110
133
  logHookError("store", err);
@@ -1 +1 @@
1
- {"version":3,"file":"abmind-hook-store.js","sourceRoot":"","sources":["../../cli/abmind-hook-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"abmind-hook-store.js","sourceRoot":"","sources":["../../cli/abmind-hook-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook SubagentStart — log delegation as session breadcrumb.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=abmind-hook-subagentstart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-subagentstart.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-subagentstart.ts"],"names":[],"mappings":";AACA;;GAEG"}
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook SubagentStart — log delegation as session breadcrumb.
4
+ */
5
+ import { runCliRaw } from "../src/cli-runner-raw.js";
6
+ import { loadMemoryConfig } from "../src/memory-config.js";
7
+ import { MemoryManager } from "../src/memory-manager.js";
8
+ import { SleepDataAccess } from "../src/sleep-data-access.js";
9
+ import { hooksDisabled, logHookError, readStdinJson, ensureHooksDir } from "../src/hook-helpers.js";
10
+ await runCliRaw(import.meta.url, {
11
+ name: "abmind-hook-subagentstart",
12
+ help: "SubagentStart hook — log delegation event as session breadcrumb.",
13
+ flags: [],
14
+ handler: async () => {
15
+ ensureHooksDir();
16
+ if (hooksDisabled()) {
17
+ process.exit(0);
18
+ }
19
+ try {
20
+ const payload = await readStdinJson();
21
+ const task = payload?.task?.trim();
22
+ if (!task) {
23
+ process.exit(0);
24
+ }
25
+ const memory = new MemoryManager(loadMemoryConfig());
26
+ await memory.initialize({ skipEmbeddingCheck: true });
27
+ try {
28
+ const db = memory.getDatabase();
29
+ if (!db) {
30
+ process.exit(0);
31
+ }
32
+ const sleepData = new SleepDataAccess(db);
33
+ let userId;
34
+ try {
35
+ userId = sleepData.getPrimaryUserId();
36
+ }
37
+ catch {
38
+ process.exit(0);
39
+ }
40
+ memory.recordMessage({
41
+ userId, sessionId: "_S_breadcrumb", role: "assistant",
42
+ content: `[DELEGATION] Subagent spawned: ${task.slice(0, 200)}`,
43
+ timestamp: Date.now(),
44
+ });
45
+ }
46
+ finally {
47
+ memory.close();
48
+ }
49
+ }
50
+ catch (err) {
51
+ logHookError("subagentstart", err);
52
+ }
53
+ process.exit(0);
54
+ },
55
+ });
56
+ //# sourceMappingURL=abmind-hook-subagentstart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-subagentstart.js","sourceRoot":"","sources":["../../cli/abmind-hook-subagentstart.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAOpG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAC/B,IAAI,EAAE,2BAA2B;IACjC,IAAI,EAAE,kEAAkE;IACxE,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,cAAc,EAAE,CAAC;QACjB,IAAI,aAAa,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,EAAwB,CAAC;YAC5D,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,EAAE,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAC7B,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,MAAc,CAAC;gBACnB,IAAI,CAAC;oBAAC,MAAM,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAEzE,MAAM,CAAC,aAAa,CAAC;oBACnB,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW;oBACrD,OAAO,EAAE,kCAAkC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;oBAC/D,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YAAC,YAAY,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * abmind hook SubagentStop — capture subagent output as memory.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=abmind-hook-subagentstop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abmind-hook-subagentstop.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-subagentstop.ts"],"names":[],"mappings":";AACA;;GAEG"}