abmind 0.1.4 → 0.1.5-alpha.2
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-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-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-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-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-install.js +263 -12
- 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/src/crypto.d.ts.map +1 -1
- package/dist/src/crypto.js +0 -3
- package/dist/src/crypto.js.map +1 -1
- package/package.json +6 -3
- 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-key.d.ts +0 -5
- package/dist/cli/abmind-key.d.ts.map +0 -1
- package/dist/cli/abmind-key.js +0 -214
- package/dist/cli/abmind-key.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
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* abmind hook SubagentStop — capture subagent output as memory.
|
|
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-subagentstop",
|
|
12
|
+
help: "SubagentStop hook — capture subagent output as memory.",
|
|
13
|
+
flags: [],
|
|
14
|
+
handler: async () => {
|
|
15
|
+
ensureHooksDir();
|
|
16
|
+
if (hooksDisabled()) {
|
|
17
|
+
process.exit(0);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const payload = await readStdinJson();
|
|
21
|
+
const output = payload?.output?.trim();
|
|
22
|
+
if (!output || output.length < 20) {
|
|
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
|
+
const userId = payload?.parent_user_id ?? (() => { try {
|
|
34
|
+
return sleepData.getPrimaryUserId();
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
} })();
|
|
39
|
+
if (!userId) {
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
await memory.editor.instantStore({
|
|
43
|
+
userId, contentEn: `Subagent completed: ${output.slice(0, 500)}`,
|
|
44
|
+
contentOriginal: output.slice(0, 500),
|
|
45
|
+
memoryType: "fact", emotionScore: 0,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
memory.close();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
logHookError("subagentstop", err);
|
|
54
|
+
}
|
|
55
|
+
process.exit(0);
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=abmind-hook-subagentstop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abmind-hook-subagentstop.js","sourceRoot":"","sources":["../../cli/abmind-hook-subagentstop.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;AAQpG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAC/B,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE,wDAAwD;IAC9D,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,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAEvD,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,MAAM,MAAM,GAAG,OAAO,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;oBAAC,OAAO,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,IAAI,CAAC;gBAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5H,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAEjC,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC/B,MAAM,EAAE,SAAS,EAAE,uBAAuB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;oBAChE,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACrC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;iBACpC,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,cAAc,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abmind-hook-toolfailure.d.ts","sourceRoot":"","sources":["../../cli/abmind-hook-toolfailure.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* abmind hook PostToolUseFailure — store novel failure patterns as lessons.
|
|
4
|
+
* Dedup: only stores if same tool+error not seen in last 24h.
|
|
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-toolfailure",
|
|
13
|
+
help: "PostToolUseFailure hook — store novel failure patterns as lessons.",
|
|
14
|
+
flags: [],
|
|
15
|
+
handler: async () => {
|
|
16
|
+
ensureHooksDir();
|
|
17
|
+
if (hooksDisabled()) {
|
|
18
|
+
process.exit(0);
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const payload = await readStdinJson();
|
|
22
|
+
const toolName = payload?.tool_name ?? "unknown";
|
|
23
|
+
const error = payload?.error?.trim() ?? "";
|
|
24
|
+
if (!error) {
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
const memory = new MemoryManager(loadMemoryConfig());
|
|
28
|
+
await memory.initialize({ skipEmbeddingCheck: true });
|
|
29
|
+
try {
|
|
30
|
+
const db = memory.getDatabase();
|
|
31
|
+
if (!db) {
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
const sleepData = new SleepDataAccess(db);
|
|
35
|
+
let userId;
|
|
36
|
+
try {
|
|
37
|
+
userId = sleepData.getPrimaryUserId();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
// Dedup: skip if same tool+error seen in last 24h
|
|
43
|
+
const dedupKey = `${toolName}:${error.slice(0, 50)}`;
|
|
44
|
+
const existing = db.prepare("SELECT id FROM extracted_memories WHERE content_en LIKE ? AND created_at > ? LIMIT 1").get(`%${dedupKey}%`, Date.now() - 86_400_000);
|
|
45
|
+
if (existing) {
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
await memory.editor.instantStore({
|
|
49
|
+
userId,
|
|
50
|
+
contentEn: `Tool ${toolName} failed: ${error.slice(0, 200)}`,
|
|
51
|
+
contentOriginal: `${toolName}: ${error.slice(0, 200)}`,
|
|
52
|
+
memoryType: "lesson",
|
|
53
|
+
emotionScore: -1,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
memory.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
logHookError("toolfailure", err);
|
|
62
|
+
}
|
|
63
|
+
process.exit(0);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=abmind-hook-toolfailure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abmind-hook-toolfailure.js","sourceRoot":"","sources":["../../cli/abmind-hook-toolfailure.ts"],"names":[],"mappings":"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"}
|