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.
- package/CHANGELOG.md +47 -0
- package/README.md +90 -61
- package/config/.env.memory.example +114 -0
- package/dist/cli/abmind-backup.js +10 -10
- package/dist/cli/abmind-backup.js.map +1 -1
- package/dist/cli/abmind-bundle.js +4 -0
- package/dist/cli/abmind-bundle.js.map +1 -1
- package/dist/cli/abmind-hook-notification.d.ts +6 -0
- package/dist/cli/abmind-hook-notification.d.ts.map +1 -0
- package/dist/cli/abmind-hook-notification.js +56 -0
- package/dist/cli/abmind-hook-notification.js.map +1 -0
- package/dist/cli/abmind-hook-postToolUse.d.ts +10 -0
- package/dist/cli/abmind-hook-postToolUse.d.ts.map +1 -0
- package/dist/cli/abmind-hook-postToolUse.js +85 -0
- package/dist/cli/abmind-hook-postToolUse.js.map +1 -0
- package/dist/cli/abmind-hook-postcompact.d.ts +9 -0
- package/dist/cli/abmind-hook-postcompact.d.ts.map +1 -0
- package/dist/cli/abmind-hook-postcompact.js +64 -0
- package/dist/cli/abmind-hook-postcompact.js.map +1 -0
- package/dist/cli/abmind-hook-postuserprompt.d.ts +7 -0
- package/dist/cli/abmind-hook-postuserprompt.d.ts.map +1 -0
- package/dist/cli/abmind-hook-postuserprompt.js +69 -0
- package/dist/cli/abmind-hook-postuserprompt.js.map +1 -0
- package/dist/cli/abmind-hook-preToolUse.d.ts +10 -0
- package/dist/cli/abmind-hook-preToolUse.d.ts.map +1 -0
- package/dist/cli/abmind-hook-preToolUse.js +61 -0
- package/dist/cli/abmind-hook-preToolUse.js.map +1 -0
- package/dist/cli/abmind-hook-precompact.d.ts +7 -0
- package/dist/cli/abmind-hook-precompact.d.ts.map +1 -0
- package/dist/cli/abmind-hook-precompact.js +63 -0
- package/dist/cli/abmind-hook-precompact.js.map +1 -0
- package/dist/cli/abmind-hook-preuserprompt.d.ts +16 -0
- package/dist/cli/abmind-hook-preuserprompt.d.ts.map +1 -0
- package/dist/cli/abmind-hook-preuserprompt.js +125 -0
- package/dist/cli/abmind-hook-preuserprompt.js.map +1 -0
- package/dist/cli/abmind-hook-store.js +26 -3
- package/dist/cli/abmind-hook-store.js.map +1 -1
- package/dist/cli/abmind-hook-subagentstart.d.ts +6 -0
- package/dist/cli/abmind-hook-subagentstart.d.ts.map +1 -0
- package/dist/cli/abmind-hook-subagentstart.js +56 -0
- package/dist/cli/abmind-hook-subagentstart.js.map +1 -0
- package/dist/cli/abmind-hook-subagentstop.d.ts +6 -0
- package/dist/cli/abmind-hook-subagentstop.d.ts.map +1 -0
- package/dist/cli/abmind-hook-subagentstop.js +58 -0
- package/dist/cli/abmind-hook-subagentstop.js.map +1 -0
- package/dist/cli/abmind-hook-toolfailure.d.ts +7 -0
- package/dist/cli/abmind-hook-toolfailure.d.ts.map +1 -0
- package/dist/cli/abmind-hook-toolfailure.js +66 -0
- package/dist/cli/abmind-hook-toolfailure.js.map +1 -0
- package/dist/cli/abmind-hook-wakeup.js +10 -0
- package/dist/cli/abmind-hook-wakeup.js.map +1 -1
- package/dist/cli/abmind-install.js +251 -11
- package/dist/cli/abmind-install.js.map +1 -1
- package/dist/cli/abmind-restore.d.ts +1 -1
- package/dist/cli/abmind-restore.js +14 -36
- package/dist/cli/abmind-restore.js.map +1 -1
- package/dist/cli/abmind-retro-extract.js +41 -5
- package/dist/cli/abmind-retro-extract.js.map +1 -1
- package/dist/cli/abmind-sleep-state.js +1 -1
- package/dist/cli/abmind-sleep-state.js.map +1 -1
- package/dist/cli/abmind.js +2 -0
- package/dist/cli/abmind.js.map +1 -1
- package/dist/src/backup.d.ts +3 -1
- package/dist/src/backup.d.ts.map +1 -1
- package/dist/src/backup.js +11 -4
- package/dist/src/backup.js.map +1 -1
- package/dist/src/context-engine.d.ts +1 -1
- package/dist/src/context-engine.d.ts.map +1 -1
- package/dist/src/context-engine.js +1 -1
- package/dist/src/context-engine.js.map +1 -1
- package/dist/src/context-orchestrator.js +3 -3
- package/dist/src/context-orchestrator.js.map +1 -1
- package/dist/src/crypto.d.ts +6 -0
- package/dist/src/crypto.d.ts.map +1 -1
- package/dist/src/crypto.js +100 -17
- package/dist/src/crypto.js.map +1 -1
- package/dist/src/ensure-initialized.d.ts +1 -1
- package/dist/src/ensure-initialized.js +1 -1
- package/dist/src/env-schema.d.ts +2 -0
- package/dist/src/env-schema.d.ts.map +1 -1
- package/dist/src/env-schema.js +3 -1
- package/dist/src/env-schema.js.map +1 -1
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/keyring.d.ts +9 -0
- package/dist/src/keyring.d.ts.map +1 -0
- package/dist/src/keyring.js +60 -0
- package/dist/src/keyring.js.map +1 -0
- package/dist/src/mem-types.d.ts +1 -1
- package/dist/src/mem-types.d.ts.map +1 -1
- package/dist/src/memory-backend.d.ts +3 -0
- package/dist/src/memory-backend.d.ts.map +1 -1
- package/dist/src/memory-config.js +1 -1
- package/dist/src/memory-config.js.map +1 -1
- package/dist/src/memory-db.d.ts +1 -6
- package/dist/src/memory-db.d.ts.map +1 -1
- package/dist/src/memory-db.js +7 -1
- package/dist/src/memory-db.js.map +1 -1
- package/dist/src/memory-editor.d.ts +1 -0
- package/dist/src/memory-editor.d.ts.map +1 -1
- package/dist/src/memory-editor.js +17 -16
- package/dist/src/memory-editor.js.map +1 -1
- package/dist/src/memory-ipc-client.d.ts +3 -0
- package/dist/src/memory-ipc-client.d.ts.map +1 -1
- package/dist/src/memory-ipc-client.js +4 -0
- package/dist/src/memory-ipc-client.js.map +1 -1
- package/dist/src/message-store.js +1 -1
- package/dist/src/message-store.js.map +1 -1
- package/dist/src/recall-benchmark.js +4 -2
- package/dist/src/recall-benchmark.js.map +1 -1
- package/dist/src/redact-secrets.d.ts.map +1 -1
- package/dist/src/redact-secrets.js +3 -0
- package/dist/src/redact-secrets.js.map +1 -1
- package/dist/src/session-context.d.ts +6 -5
- package/dist/src/session-context.d.ts.map +1 -1
- package/dist/src/session-context.js +134 -66
- package/dist/src/session-context.js.map +1 -1
- package/dist/src/sleep/levels.d.ts +7 -6
- package/dist/src/sleep/levels.d.ts.map +1 -1
- package/dist/src/sleep/levels.js.map +1 -1
- package/dist/src/sleep/orchestrator.d.ts +1 -1
- package/dist/src/sleep/orchestrator.d.ts.map +1 -1
- package/dist/src/sleep/orchestrator.js +80 -38
- package/dist/src/sleep/orchestrator.js.map +1 -1
- package/dist/src/sleep/sleep-daily-summary.d.ts +6 -2
- package/dist/src/sleep/sleep-daily-summary.d.ts.map +1 -1
- package/dist/src/sleep/sleep-daily-summary.js +34 -12
- package/dist/src/sleep/sleep-daily-summary.js.map +1 -1
- package/dist/src/sleep/sleep-extract-daily.d.ts.map +1 -1
- package/dist/src/sleep/sleep-extract-daily.js +3 -0
- package/dist/src/sleep/sleep-extract-daily.js.map +1 -1
- package/dist/src/sleep/sleep-prompt-loader.js +3 -3
- package/dist/src/sleep/sleep-prompt-loader.js.map +1 -1
- package/dist/src/sleep-data-access.d.ts +4 -2
- package/dist/src/sleep-data-access.d.ts.map +1 -1
- package/dist/src/sleep-data-access.js +49 -13
- package/dist/src/sleep-data-access.js.map +1 -1
- package/dist/src/sqlite-backend.d.ts +3 -0
- package/dist/src/sqlite-backend.d.ts.map +1 -1
- package/dist/src/sqlite-backend.js +3 -0
- package/dist/src/sqlite-backend.js.map +1 -1
- package/dist/src/status-block.d.ts +7 -0
- package/dist/src/status-block.d.ts.map +1 -0
- package/dist/src/status-block.js +67 -0
- package/dist/src/status-block.js.map +1 -0
- package/dist/src/wake-up-renderer.d.ts +0 -5
- package/dist/src/wake-up-renderer.d.ts.map +1 -1
- package/dist/src/wake-up-renderer.js +0 -34
- package/dist/src/wake-up-renderer.js.map +1 -1
- package/package.json +6 -3
- package/prompts/sleep/03-retrospective.md +23 -0
- package/prompts/sleep/04-extract-memories.md +3 -0
- package/prompts/sleep/06-retro-derive.md +39 -0
- package/prompts/sleep/08-memory-maintenance.md +39 -0
- package/prompts/sleep/{13-consolidation.md → 11-consolidation.md} +4 -1
- package/templates/core/SOUL.md +24 -0
- package/templates/core/agent_notes.md +7 -0
- package/templates/core/core_facts.md +10 -0
- package/templates/core/memory-tools.md +43 -0
- package/templates/core/user_profile.md +7 -0
- package/templates/with-abmind-hooks.json +26 -0
- package/dist/cli/abmind-backfill.d.ts +0 -3
- package/dist/cli/abmind-backfill.d.ts.map +0 -1
- package/dist/cli/abmind-backfill.js +0 -64
- package/dist/cli/abmind-backfill.js.map +0 -1
- package/dist/cli/abmind-memory-stats.d.ts +0 -3
- package/dist/cli/abmind-memory-stats.d.ts.map +0 -1
- package/dist/cli/abmind-memory-stats.js +0 -45
- package/dist/cli/abmind-memory-stats.js.map +0 -1
- package/dist/cli/abmind-reset.d.ts +0 -11
- package/dist/cli/abmind-reset.d.ts.map +0 -1
- package/dist/cli/abmind-reset.js +0 -143
- package/dist/cli/abmind-reset.js.map +0 -1
- package/dist/cli/abmind-status.d.ts +0 -3
- package/dist/cli/abmind-status.d.ts.map +0 -1
- package/dist/cli/abmind-status.js +0 -45
- package/dist/cli/abmind-status.js.map +0 -1
- package/prompts/sleep/03-extract-from-daily.md +0 -3
- package/prompts/sleep/04-retrospective.md +0 -30
- package/prompts/sleep/07-topic-assignment.md +0 -23
- package/prompts/sleep/08-core-promotion.md +0 -26
- package/prompts/sleep/09-merge.md +0 -19
- package/prompts/sleep/12-core-knowledge.md +0 -14
- package/prompts/sleep/14-emotion-context.md +0 -17
- /package/prompts/sleep/{15-contradiction-and-graph.md → 05-contradiction-and-graph.md} +0 -0
- /package/prompts/sleep/{06-feedback.md → 07-feedback.md} +0 -0
- /package/prompts/sleep/{10-translation.md → 09-translation.md} +0 -0
- /package/prompts/sleep/{11-skill-review.md → 10-skill-review.md} +0 -0
- /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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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
|
|
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
|
|
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":";AACA;;;;;;;;;;;;;GAaG;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;
|
|
1
|
+
{"version":3,"file":"abmind-hook-store.js","sourceRoot":"","sources":["../../cli/abmind-hook-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"abmind-hook-subagentstop.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-subagentstop.ts"],"names":[],"mappings":";AACA;;GAEG"}
|