@0xmaxma/claude-gateway 1.6.8 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +149 -20
  2. package/config.template.json +59 -1
  3. package/dist/agent/dreaming/accept.d.ts +43 -0
  4. package/dist/agent/dreaming/accept.d.ts.map +1 -0
  5. package/dist/agent/dreaming/accept.js +230 -0
  6. package/dist/agent/dreaming/accept.js.map +1 -0
  7. package/dist/agent/dreaming/applier.d.ts +77 -0
  8. package/dist/agent/dreaming/applier.d.ts.map +1 -0
  9. package/dist/agent/dreaming/applier.js +406 -0
  10. package/dist/agent/dreaming/applier.js.map +1 -0
  11. package/dist/agent/dreaming/audit.d.ts +27 -0
  12. package/dist/agent/dreaming/audit.d.ts.map +1 -0
  13. package/dist/agent/dreaming/audit.js +100 -0
  14. package/dist/agent/dreaming/audit.js.map +1 -0
  15. package/dist/agent/dreaming/compactor.d.ts +66 -0
  16. package/dist/agent/dreaming/compactor.d.ts.map +1 -0
  17. package/dist/agent/dreaming/compactor.js +306 -0
  18. package/dist/agent/dreaming/compactor.js.map +1 -0
  19. package/dist/agent/dreaming/config.d.ts +19 -0
  20. package/dist/agent/dreaming/config.d.ts.map +1 -0
  21. package/dist/agent/dreaming/config.js +107 -0
  22. package/dist/agent/dreaming/config.js.map +1 -0
  23. package/dist/agent/dreaming/episodic.d.ts +42 -0
  24. package/dist/agent/dreaming/episodic.d.ts.map +1 -0
  25. package/dist/agent/dreaming/episodic.js +116 -0
  26. package/dist/agent/dreaming/episodic.js.map +1 -0
  27. package/dist/agent/dreaming/gather.d.ts +31 -0
  28. package/dist/agent/dreaming/gather.d.ts.map +1 -0
  29. package/dist/agent/dreaming/gather.js +55 -0
  30. package/dist/agent/dreaming/gather.js.map +1 -0
  31. package/dist/agent/dreaming/index.d.ts +87 -0
  32. package/dist/agent/dreaming/index.d.ts.map +1 -0
  33. package/dist/agent/dreaming/index.js +377 -0
  34. package/dist/agent/dreaming/index.js.map +1 -0
  35. package/dist/agent/dreaming/migrate-cli.d.ts +17 -0
  36. package/dist/agent/dreaming/migrate-cli.d.ts.map +1 -0
  37. package/dist/agent/dreaming/migrate-cli.js +42 -0
  38. package/dist/agent/dreaming/migrate-cli.js.map +1 -0
  39. package/dist/agent/dreaming/migrate.d.ts +72 -0
  40. package/dist/agent/dreaming/migrate.d.ts.map +1 -0
  41. package/dist/agent/dreaming/migrate.js +374 -0
  42. package/dist/agent/dreaming/migrate.js.map +1 -0
  43. package/dist/agent/dreaming/report.d.ts +39 -0
  44. package/dist/agent/dreaming/report.d.ts.map +1 -0
  45. package/dist/agent/dreaming/report.js +121 -0
  46. package/dist/agent/dreaming/report.js.map +1 -0
  47. package/dist/agent/dreaming/reviewer.d.ts +43 -0
  48. package/dist/agent/dreaming/reviewer.d.ts.map +1 -0
  49. package/dist/agent/dreaming/reviewer.js +249 -0
  50. package/dist/agent/dreaming/reviewer.js.map +1 -0
  51. package/dist/agent/dreaming/staleness.d.ts +68 -0
  52. package/dist/agent/dreaming/staleness.d.ts.map +1 -0
  53. package/dist/agent/dreaming/staleness.js +281 -0
  54. package/dist/agent/dreaming/staleness.js.map +1 -0
  55. package/dist/agent/dreaming/types.d.ts +130 -0
  56. package/dist/agent/dreaming/types.d.ts.map +1 -0
  57. package/dist/agent/dreaming/types.js +10 -0
  58. package/dist/agent/dreaming/types.js.map +1 -0
  59. package/dist/agent/knowledge/archive-db.d.ts +114 -0
  60. package/dist/agent/knowledge/archive-db.d.ts.map +1 -0
  61. package/dist/agent/knowledge/archive-db.js +474 -0
  62. package/dist/agent/knowledge/archive-db.js.map +1 -0
  63. package/dist/agent/knowledge/chunk.d.ts +21 -0
  64. package/dist/agent/knowledge/chunk.d.ts.map +1 -0
  65. package/dist/agent/knowledge/chunk.js +67 -0
  66. package/dist/agent/knowledge/chunk.js.map +1 -0
  67. package/dist/agent/knowledge/config.d.ts +20 -0
  68. package/dist/agent/knowledge/config.d.ts.map +1 -0
  69. package/dist/agent/knowledge/config.js +143 -0
  70. package/dist/agent/knowledge/config.js.map +1 -0
  71. package/dist/agent/knowledge/graph-demo.d.ts +25 -0
  72. package/dist/agent/knowledge/graph-demo.d.ts.map +1 -0
  73. package/dist/agent/knowledge/graph-demo.js +132 -0
  74. package/dist/agent/knowledge/graph-demo.js.map +1 -0
  75. package/dist/agent/knowledge/index.d.ts +24 -0
  76. package/dist/agent/knowledge/index.d.ts.map +1 -0
  77. package/dist/agent/knowledge/index.js +50 -0
  78. package/dist/agent/knowledge/index.js.map +1 -0
  79. package/dist/agent/knowledge/indexer.d.ts +34 -0
  80. package/dist/agent/knowledge/indexer.d.ts.map +1 -0
  81. package/dist/agent/knowledge/indexer.js +271 -0
  82. package/dist/agent/knowledge/indexer.js.map +1 -0
  83. package/dist/agent/knowledge/lifecycle.d.ts +91 -0
  84. package/dist/agent/knowledge/lifecycle.d.ts.map +1 -0
  85. package/dist/agent/knowledge/lifecycle.js +205 -0
  86. package/dist/agent/knowledge/lifecycle.js.map +1 -0
  87. package/dist/agent/knowledge/provenance.d.ts +15 -0
  88. package/dist/agent/knowledge/provenance.d.ts.map +1 -0
  89. package/dist/agent/knowledge/provenance.js +37 -0
  90. package/dist/agent/knowledge/provenance.js.map +1 -0
  91. package/dist/agent/knowledge/reindex-cli.d.ts +13 -0
  92. package/dist/agent/knowledge/reindex-cli.d.ts.map +1 -0
  93. package/dist/agent/knowledge/reindex-cli.js +53 -0
  94. package/dist/agent/knowledge/reindex-cli.js.map +1 -0
  95. package/dist/agent/knowledge/reindex-spawn.d.ts +30 -0
  96. package/dist/agent/knowledge/reindex-spawn.d.ts.map +1 -0
  97. package/dist/agent/knowledge/reindex-spawn.js +97 -0
  98. package/dist/agent/knowledge/reindex-spawn.js.map +1 -0
  99. package/dist/agent/knowledge/shared-promote.d.ts +18 -0
  100. package/dist/agent/knowledge/shared-promote.d.ts.map +1 -0
  101. package/dist/agent/knowledge/shared-promote.js +29 -0
  102. package/dist/agent/knowledge/shared-promote.js.map +1 -0
  103. package/dist/agent/knowledge/shared-writer.d.ts +24 -0
  104. package/dist/agent/knowledge/shared-writer.d.ts.map +1 -0
  105. package/dist/agent/knowledge/shared-writer.js +97 -0
  106. package/dist/agent/knowledge/shared-writer.js.map +1 -0
  107. package/dist/agent/knowledge/types.d.ts +83 -0
  108. package/dist/agent/knowledge/types.d.ts.map +1 -0
  109. package/dist/agent/knowledge/types.js +12 -0
  110. package/dist/agent/knowledge/types.js.map +1 -0
  111. package/dist/agent/knowledge/wiki.d.ts +107 -0
  112. package/dist/agent/knowledge/wiki.d.ts.map +1 -0
  113. package/dist/agent/knowledge/wiki.js +415 -0
  114. package/dist/agent/knowledge/wiki.js.map +1 -0
  115. package/dist/agent/memory-metrics.d.ts +48 -0
  116. package/dist/agent/memory-metrics.d.ts.map +1 -0
  117. package/dist/agent/memory-metrics.js +156 -0
  118. package/dist/agent/memory-metrics.js.map +1 -0
  119. package/dist/agent/runner.d.ts +24 -1
  120. package/dist/agent/runner.d.ts.map +1 -1
  121. package/dist/agent/runner.js +82 -6
  122. package/dist/agent/runner.js.map +1 -1
  123. package/dist/agent/skill-learning/config.d.ts +18 -0
  124. package/dist/agent/skill-learning/config.d.ts.map +1 -0
  125. package/dist/agent/skill-learning/config.js +71 -0
  126. package/dist/agent/skill-learning/config.js.map +1 -0
  127. package/dist/agent/skill-learning/curator.d.ts +45 -0
  128. package/dist/agent/skill-learning/curator.d.ts.map +1 -0
  129. package/dist/agent/skill-learning/curator.js +171 -0
  130. package/dist/agent/skill-learning/curator.js.map +1 -0
  131. package/dist/agent/skill-learning/index.d.ts +79 -0
  132. package/dist/agent/skill-learning/index.d.ts.map +1 -0
  133. package/dist/agent/skill-learning/index.js +308 -0
  134. package/dist/agent/skill-learning/index.js.map +1 -0
  135. package/dist/agent/skill-learning/metrics.d.ts +13 -0
  136. package/dist/agent/skill-learning/metrics.d.ts.map +1 -0
  137. package/dist/agent/skill-learning/metrics.js +109 -0
  138. package/dist/agent/skill-learning/metrics.js.map +1 -0
  139. package/dist/agent/skill-learning/notifier.d.ts +111 -0
  140. package/dist/agent/skill-learning/notifier.d.ts.map +1 -0
  141. package/dist/agent/skill-learning/notifier.js +398 -0
  142. package/dist/agent/skill-learning/notifier.js.map +1 -0
  143. package/dist/agent/skill-learning/reviewer.d.ts +61 -0
  144. package/dist/agent/skill-learning/reviewer.d.ts.map +1 -0
  145. package/dist/agent/skill-learning/reviewer.js +271 -0
  146. package/dist/agent/skill-learning/reviewer.js.map +1 -0
  147. package/dist/agent/skill-learning/telemetry.d.ts +22 -0
  148. package/dist/agent/skill-learning/telemetry.d.ts.map +1 -0
  149. package/dist/agent/skill-learning/telemetry.js +90 -0
  150. package/dist/agent/skill-learning/telemetry.js.map +1 -0
  151. package/dist/agent/skill-learning/trigger.d.ts +23 -0
  152. package/dist/agent/skill-learning/trigger.d.ts.map +1 -0
  153. package/dist/agent/skill-learning/trigger.js +44 -0
  154. package/dist/agent/skill-learning/trigger.js.map +1 -0
  155. package/dist/agent/skill-learning/types.d.ts +165 -0
  156. package/dist/agent/skill-learning/types.d.ts.map +1 -0
  157. package/dist/agent/skill-learning/types.js +11 -0
  158. package/dist/agent/skill-learning/types.js.map +1 -0
  159. package/dist/agent/skill-learning/writer.d.ts +37 -0
  160. package/dist/agent/skill-learning/writer.d.ts.map +1 -0
  161. package/dist/agent/skill-learning/writer.js +223 -0
  162. package/dist/agent/skill-learning/writer.js.map +1 -0
  163. package/dist/agent/workspace-loader.d.ts +83 -6
  164. package/dist/agent/workspace-loader.d.ts.map +1 -1
  165. package/dist/agent/workspace-loader.js +207 -14
  166. package/dist/agent/workspace-loader.js.map +1 -1
  167. package/dist/api/gateway-router.d.ts +2 -0
  168. package/dist/api/gateway-router.d.ts.map +1 -1
  169. package/dist/api/gateway-router.js +293 -6
  170. package/dist/api/gateway-router.js.map +1 -1
  171. package/dist/api/share-router.d.ts.map +1 -1
  172. package/dist/api/share-router.js +27 -1
  173. package/dist/api/share-router.js.map +1 -1
  174. package/dist/api/skills-router.d.ts +2 -2
  175. package/dist/api/skills-router.d.ts.map +1 -1
  176. package/dist/api/skills-router.js +61 -1
  177. package/dist/api/skills-router.js.map +1 -1
  178. package/dist/apps/agent-manager.d.ts +7 -0
  179. package/dist/apps/agent-manager.d.ts.map +1 -1
  180. package/dist/apps/agent-manager.js +13 -1
  181. package/dist/apps/agent-manager.js.map +1 -1
  182. package/dist/config/migrator.d.ts +2 -0
  183. package/dist/config/migrator.d.ts.map +1 -1
  184. package/dist/config/migrator.js +72 -1
  185. package/dist/config/migrator.js.map +1 -1
  186. package/dist/history/cleanup.d.ts +7 -0
  187. package/dist/history/cleanup.d.ts.map +1 -1
  188. package/dist/history/cleanup.js +27 -0
  189. package/dist/history/cleanup.js.map +1 -1
  190. package/dist/history/db.d.ts +65 -0
  191. package/dist/history/db.d.ts.map +1 -1
  192. package/dist/history/db.js +261 -0
  193. package/dist/history/db.js.map +1 -1
  194. package/dist/index.js +122 -20
  195. package/dist/index.js.map +1 -1
  196. package/dist/session/process.d.ts +10 -0
  197. package/dist/session/process.d.ts.map +1 -1
  198. package/dist/session/process.js +86 -1
  199. package/dist/session/process.js.map +1 -1
  200. package/dist/share/share-store.d.ts +11 -0
  201. package/dist/share/share-store.d.ts.map +1 -1
  202. package/dist/share/share-store.js +3 -1
  203. package/dist/share/share-store.js.map +1 -1
  204. package/dist/skills/loader.d.ts +8 -0
  205. package/dist/skills/loader.d.ts.map +1 -1
  206. package/dist/skills/loader.js +29 -1
  207. package/dist/skills/loader.js.map +1 -1
  208. package/dist/types.d.ts +116 -0
  209. package/dist/types.d.ts.map +1 -1
  210. package/dist/ui/web-ui.d.ts.map +1 -1
  211. package/dist/ui/web-ui.js +1126 -3
  212. package/dist/ui/web-ui.js.map +1 -1
  213. package/mcp/package.json +2 -1
  214. package/mcp/server.ts +2 -0
  215. package/mcp/tools/image/module.ts +114 -9
  216. package/mcp/tools/memory/archive-reader.test.ts +212 -0
  217. package/mcp/tools/memory/archive-reader.ts +253 -0
  218. package/mcp/tools/memory/module.ts +152 -0
  219. package/mcp/tools/memory/retrieval-recorder.ts +66 -0
  220. package/mcp/tools/shared/share-client.ts +20 -1
  221. package/mcp/tools/skills/module.ts +28 -0
  222. package/package.json +1 -1
  223. package/resource/claude_gateway.svg +1038 -112
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Standalone archive reindex entry (planning-64 K1).
4
+ *
5
+ * Run by the gateway as a DETACHED, unref'd subprocess so the synchronous
6
+ * `node:sqlite` indexing never blocks the gateway event loop (#277 lesson). The
7
+ * indexer is hash-guarded, so an unchanged workspace is a cheap no-op.
8
+ *
9
+ * Usage: node reindex-cli.js <workspaceDir> [<resolvedArchiveCfgJson>]
10
+ * Best-effort: any failure exits 0 without disturbing the gateway.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=reindex-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex-cli.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/reindex-cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Standalone archive reindex entry (planning-64 K1).
5
+ *
6
+ * Run by the gateway as a DETACHED, unref'd subprocess so the synchronous
7
+ * `node:sqlite` indexing never blocks the gateway event loop (#277 lesson). The
8
+ * indexer is hash-guarded, so an unchanged workspace is a cheap no-op.
9
+ *
10
+ * Usage: node reindex-cli.js <workspaceDir> [<resolvedArchiveCfgJson>]
11
+ * Best-effort: any failure exits 0 without disturbing the gateway.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const indexer_1 = require("./indexer");
15
+ function parse(arg, label) {
16
+ if (arg === undefined)
17
+ return undefined; // no arg → use defaults (expected)
18
+ try {
19
+ return JSON.parse(arg);
20
+ }
21
+ catch {
22
+ // A malformed (present) arg falls back to defaults, but is NOT silent — the
23
+ // gateway builds this JSON, so a parse failure is a real bug worth surfacing in
24
+ // the detached subprocess's captured output.
25
+ process.stderr.write(`[reindex-cli] ignoring malformed ${label} config arg; using defaults\n`);
26
+ return undefined;
27
+ }
28
+ }
29
+ function main() {
30
+ const workspaceDir = process.argv[2];
31
+ if (!workspaceDir)
32
+ return;
33
+ const archiveCfg = parse(process.argv[3], 'archive');
34
+ const sharedCfg = parse(process.argv[4], 'shared');
35
+ // Each indexer is internally guarded by its own `enabled` flag, so a disabled
36
+ // lane is a no-op. Failures are swallowed independently — the shared reindex
37
+ // runs even if the per-agent one throws, and vice versa.
38
+ try {
39
+ (0, indexer_1.indexAgentArchive)(workspaceDir, archiveCfg);
40
+ }
41
+ catch {
42
+ /* best-effort */
43
+ }
44
+ try {
45
+ (0, indexer_1.indexSharedArchive)(sharedCfg);
46
+ }
47
+ catch {
48
+ /* best-effort */
49
+ }
50
+ }
51
+ main();
52
+ process.exit(0);
53
+ //# sourceMappingURL=reindex-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex-cli.js","sourceRoot":"","sources":["../../../src/agent/knowledge/reindex-cli.ts"],"names":[],"mappings":";;AACA;;;;;;;;;GASG;;AAEH,uCAAkE;AAGlE,SAAS,KAAK,CAAI,GAAuB,EAAE,KAAa;IACtD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,CAAC,mCAAmC;IAC5E,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,gFAAgF;QAChF,6CAA6C;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,KAAK,+BAA+B,CAAC,CAAC;QAC/F,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,IAAI;IACX,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY;QAAE,OAAO;IAE1B,MAAM,UAAU,GAAG,KAAK,CAAyB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,KAAK,CAAwB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE1E,8EAA8E;IAC9E,6EAA6E;IAC7E,yDAAyD;IACzD,IAAI,CAAC;QACH,IAAA,2BAAiB,EAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,IAAI,CAAC;QACH,IAAA,4BAAkB,EAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC;AACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Fire-and-forget archive reindex trigger (planning-64 K1).
3
+ *
4
+ * The gateway calls this at agent-session spawn to keep the searchable archive
5
+ * fresh. It launches reindex-cli.ts as a DETACHED, unref'd subprocess so the
6
+ * synchronous `node:sqlite` indexing runs entirely OFF the gateway event loop
7
+ * (#277 lesson). No-op when the archive is disabled; never throws.
8
+ */
9
+ import { resolveArchiveConfig, resolveSharedConfig } from './config';
10
+ /** The `gateway.knowledge` block shape this trigger reads (archive + shared). */
11
+ interface KnowledgeBlock {
12
+ archive?: Parameters<typeof resolveArchiveConfig>[0];
13
+ shared?: Parameters<typeof resolveSharedConfig>[0];
14
+ }
15
+ /**
16
+ * Per-workspace debounce so a burst of session spawns (interactive + subagent +
17
+ * cron + heartbeat) doesn't launch a stampede of reindex subprocesses all racing
18
+ * the same kb.sqlite. The indexer is hash-guarded, so skipping a redundant run
19
+ * within the window loses nothing.
20
+ */
21
+ export declare const REINDEX_DEBOUNCE_MS = 30000;
22
+ /**
23
+ * Debounce gate (pure, exported for tests): returns true and records `now` when a
24
+ * reindex for `workspaceDir` is due, or false when one ran within the window.
25
+ * `now` is injected so tests are deterministic.
26
+ */
27
+ export declare function shouldReindexNow(workspaceDir: string, now: number): boolean;
28
+ export declare function spawnArchiveReindex(workspaceDir: string, agentKnowledge?: KnowledgeBlock, globalKnowledge?: KnowledgeBlock): void;
29
+ export {};
30
+ //# sourceMappingURL=reindex-spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex-spawn.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/reindex-spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAErE,iFAAiF;AACjF,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;CACpD;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAG1C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAK3E;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,cAAc,EAC/B,eAAe,CAAC,EAAE,cAAc,GAC/B,IAAI,CAyBN"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * Fire-and-forget archive reindex trigger (planning-64 K1).
4
+ *
5
+ * The gateway calls this at agent-session spawn to keep the searchable archive
6
+ * fresh. It launches reindex-cli.ts as a DETACHED, unref'd subprocess so the
7
+ * synchronous `node:sqlite` indexing runs entirely OFF the gateway event loop
8
+ * (#277 lesson). No-op when the archive is disabled; never throws.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.REINDEX_DEBOUNCE_MS = void 0;
45
+ exports.shouldReindexNow = shouldReindexNow;
46
+ exports.spawnArchiveReindex = spawnArchiveReindex;
47
+ const child_process_1 = require("child_process");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const config_1 = require("./config");
51
+ /**
52
+ * Per-workspace debounce so a burst of session spawns (interactive + subagent +
53
+ * cron + heartbeat) doesn't launch a stampede of reindex subprocesses all racing
54
+ * the same kb.sqlite. The indexer is hash-guarded, so skipping a redundant run
55
+ * within the window loses nothing.
56
+ */
57
+ exports.REINDEX_DEBOUNCE_MS = 30000;
58
+ const lastReindexAt = new Map();
59
+ /**
60
+ * Debounce gate (pure, exported for tests): returns true and records `now` when a
61
+ * reindex for `workspaceDir` is due, or false when one ran within the window.
62
+ * `now` is injected so tests are deterministic.
63
+ */
64
+ function shouldReindexNow(workspaceDir, now) {
65
+ const last = lastReindexAt.get(workspaceDir);
66
+ if (last !== undefined && now - last < exports.REINDEX_DEBOUNCE_MS)
67
+ return false;
68
+ lastReindexAt.set(workspaceDir, now);
69
+ return true;
70
+ }
71
+ function spawnArchiveReindex(workspaceDir, agentKnowledge, globalKnowledge) {
72
+ try {
73
+ const archiveCfg = (0, config_1.resolveArchiveConfig)(agentKnowledge?.archive, globalKnowledge?.archive);
74
+ const sharedCfg = (0, config_1.resolveSharedConfig)(agentKnowledge?.shared, globalKnowledge?.shared);
75
+ // Spawn if EITHER lane is enabled; the CLI indexes whichever is on.
76
+ if (!archiveCfg.enabled && !sharedCfg.enabled)
77
+ return;
78
+ if (!shouldReindexNow(workspaceDir, Date.now()))
79
+ return;
80
+ // The compiled CLI sits next to this file under dist/agent/knowledge/. Skip
81
+ // silently when it isn't present (e.g. ts-jest/dev runs against source) so we
82
+ // never attempt a doomed spawn.
83
+ const cliPath = path.join(__dirname, 'reindex-cli.js');
84
+ if (!fs.existsSync(cliPath))
85
+ return;
86
+ const child = (0, child_process_1.spawn)(process.execPath, [cliPath, workspaceDir, JSON.stringify(archiveCfg), JSON.stringify(sharedCfg)], { detached: true, stdio: 'ignore' });
87
+ // A spawn failure (e.g. missing CLI in an odd build) must never affect the session.
88
+ child.on('error', () => {
89
+ /* swallowed */
90
+ });
91
+ child.unref();
92
+ }
93
+ catch {
94
+ /* best-effort: reindex is never on the critical path of spawning a session */
95
+ }
96
+ }
97
+ //# sourceMappingURL=reindex-spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex-spawn.js","sourceRoot":"","sources":["../../../src/agent/knowledge/reindex-spawn.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BH,4CAKC;AAED,kDA6BC;AA7DD,iDAAsC;AACtC,uCAAyB;AACzB,2CAA6B;AAC7B,qCAAqE;AAQrE;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,KAAM,CAAC;AAC1C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,YAAoB,EAAE,GAAW;IAChE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,GAAG,2BAAmB;QAAE,OAAO,KAAK,CAAC;IACzE,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,mBAAmB,CACjC,YAAoB,EACpB,cAA+B,EAC/B,eAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAA,6BAAoB,EAAC,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QAC3F,MAAM,SAAS,GAAG,IAAA,4BAAmB,EAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QACvF,oEAAoE;QACpE,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QACtD,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAAE,OAAO;QACxD,4EAA4E;QAC5E,8EAA8E;QAC9E,gCAAgC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO;QACpC,MAAM,KAAK,GAAG,IAAA,qBAAK,EACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAC9E,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpC,CAAC;QACF,oFAAoF;QACpF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,eAAe;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { KnowledgeSharedConfig } from './types';
2
+ /**
3
+ * Build the per-agent→shared promotion function used after the dreaming applier
4
+ * writes an `add` to local memory (K3↔K4). Returns `undefined` when the shared
5
+ * KB is disabled or in `propose` (dry-run) mode — callers then skip promotion.
6
+ *
7
+ * A durable add is written to the shared vault under a **content-hashed**
8
+ * filename so two proposals whose reasons slug to the same name (or a recurring
9
+ * nightly reason) can't silently overwrite each other, and identical content
10
+ * maps to the same file (idempotent). Extracted here so both the nightly
11
+ * auto-applier (src/index.ts) and the manual dashboard accept endpoint share one
12
+ * implementation.
13
+ */
14
+ export declare function makeSharedPromoter(agentId: string, agentCfg: KnowledgeSharedConfig | undefined, globalCfg: KnowledgeSharedConfig | undefined): ((p: {
15
+ reason: string;
16
+ content?: string;
17
+ }) => void) | undefined;
18
+ //# sourceMappingURL=shared-promote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-promote.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-promote.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,qBAAqB,GAAG,SAAS,EAC3C,SAAS,EAAE,qBAAqB,GAAG,SAAS,GAC3C,CAAC,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC,GAAG,SAAS,CAQjE"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeSharedPromoter = makeSharedPromoter;
4
+ const crypto_1 = require("crypto");
5
+ const shared_writer_1 = require("./shared-writer");
6
+ const config_1 = require("./config");
7
+ /**
8
+ * Build the per-agent→shared promotion function used after the dreaming applier
9
+ * writes an `add` to local memory (K3↔K4). Returns `undefined` when the shared
10
+ * KB is disabled or in `propose` (dry-run) mode — callers then skip promotion.
11
+ *
12
+ * A durable add is written to the shared vault under a **content-hashed**
13
+ * filename so two proposals whose reasons slug to the same name (or a recurring
14
+ * nightly reason) can't silently overwrite each other, and identical content
15
+ * maps to the same file (idempotent). Extracted here so both the nightly
16
+ * auto-applier (src/index.ts) and the manual dashboard accept endpoint share one
17
+ * implementation.
18
+ */
19
+ function makeSharedPromoter(agentId, agentCfg, globalCfg) {
20
+ const sharedCfg = (0, config_1.resolveSharedConfig)(agentCfg, globalCfg);
21
+ if (!sharedCfg.enabled || sharedCfg.mode !== 'auto')
22
+ return undefined;
23
+ return (p) => {
24
+ const content = p.content ?? '';
25
+ const hash = (0, crypto_1.createHash)('sha256').update(content).digest('hex').slice(0, 8);
26
+ (0, shared_writer_1.writeSharedNote)(sharedCfg, `${agentId}-${p.reason}-${hash}`, content);
27
+ };
28
+ }
29
+ //# sourceMappingURL=shared-promote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-promote.js","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-promote.ts"],"names":[],"mappings":";;AAiBA,gDAYC;AA7BD,mCAAoC;AACpC,mDAAkD;AAClD,qCAA+C;AAG/C;;;;;;;;;;;GAWG;AACH,SAAgB,kBAAkB,CAChC,OAAe,EACf,QAA2C,EAC3C,SAA4C;IAE5C,MAAM,SAAS,GAAG,IAAA,4BAAmB,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IACtE,OAAO,CAAC,CAAuC,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,IAAA,+BAAe,EAAC,SAAS,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Atomic writer for the shared KB notes dir (planning-64 K3).
3
+ *
4
+ * Multiple agents (each in its own gateway subprocess) may contribute to the same
5
+ * shared vault. Two safety properties make that correct WITHOUT an in-process lock
6
+ * (an in-process mutex wouldn't coordinate across separate processes anyway):
7
+ * 1. Note files are written **write-temp + atomic rename**, so a concurrent
8
+ * reader/indexer never observes a partially-written note (same-file races
9
+ * resolve to last-write-wins, never corruption).
10
+ * 2. The shared SQLite index is guarded by `PRAGMA busy_timeout` (archive-db),
11
+ * which serializes concurrent writers ACROSS processes.
12
+ *
13
+ * Note names are slugified to a single safe path segment — a caller can never
14
+ * escape the notes dir.
15
+ */
16
+ import type { ResolvedKnowledgeSharedCfg } from './types';
17
+ /** Reduce an arbitrary name to one safe `*.md` path segment (no traversal). */
18
+ export declare function sharedNoteFilename(name: string): string;
19
+ /**
20
+ * Write a note into the shared vault's notes dir atomically. Returns the absolute
21
+ * path written. Creates the notes dir if missing.
22
+ */
23
+ export declare function writeSharedNote(cfg: ResolvedKnowledgeSharedCfg, name: string, content: string): string;
24
+ //# sourceMappingURL=shared-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-writer.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAM1D,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBtG"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * Atomic writer for the shared KB notes dir (planning-64 K3).
4
+ *
5
+ * Multiple agents (each in its own gateway subprocess) may contribute to the same
6
+ * shared vault. Two safety properties make that correct WITHOUT an in-process lock
7
+ * (an in-process mutex wouldn't coordinate across separate processes anyway):
8
+ * 1. Note files are written **write-temp + atomic rename**, so a concurrent
9
+ * reader/indexer never observes a partially-written note (same-file races
10
+ * resolve to last-write-wins, never corruption).
11
+ * 2. The shared SQLite index is guarded by `PRAGMA busy_timeout` (archive-db),
12
+ * which serializes concurrent writers ACROSS processes.
13
+ *
14
+ * Note names are slugified to a single safe path segment — a caller can never
15
+ * escape the notes dir.
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.sharedNoteFilename = sharedNoteFilename;
52
+ exports.writeSharedNote = writeSharedNote;
53
+ const fs = __importStar(require("fs"));
54
+ const path = __importStar(require("path"));
55
+ const config_1 = require("./config");
56
+ // Monotonic per-process counter so concurrent writes within one process still get
57
+ // distinct temp names (combined with pid for cross-process uniqueness).
58
+ let tmpCounter = 0;
59
+ /** Reduce an arbitrary name to one safe `*.md` path segment (no traversal). */
60
+ function sharedNoteFilename(name) {
61
+ const base = name
62
+ .toLowerCase()
63
+ .replace(/\.md$/i, '')
64
+ .replace(/[^a-z0-9._-]+/g, '-')
65
+ .replace(/^[-.]+|[-.]+$/g, '')
66
+ .slice(0, 120);
67
+ return `${base || 'note'}.md`;
68
+ }
69
+ /**
70
+ * Write a note into the shared vault's notes dir atomically. Returns the absolute
71
+ * path written. Creates the notes dir if missing.
72
+ */
73
+ function writeSharedNote(cfg, name, content) {
74
+ const dir = (0, config_1.sharedNotesDir)(cfg);
75
+ fs.mkdirSync(dir, { recursive: true });
76
+ const target = path.join(dir, sharedNoteFilename(name));
77
+ // Unique temp in the SAME dir so the rename is atomic (same filesystem). The
78
+ // suffix is `.part` (NOT `.md`) and dot-prefixed so that if the process crashes
79
+ // between write and rename, the orphan is NOT picked up by the `*.md` indexer as
80
+ // a permanent junk note (walkMarkdown also skips dotfiles as a second guard).
81
+ const tmp = path.join(dir, `.tmp-${process.pid}-${(tmpCounter += 1)}-${process.hrtime.bigint().toString(36)}.part`);
82
+ try {
83
+ fs.writeFileSync(tmp, content, 'utf8');
84
+ fs.renameSync(tmp, target); // atomic replace
85
+ }
86
+ catch (err) {
87
+ try {
88
+ fs.rmSync(tmp, { force: true });
89
+ }
90
+ catch {
91
+ /* best-effort cleanup */
92
+ }
93
+ throw err;
94
+ }
95
+ return target;
96
+ }
97
+ //# sourceMappingURL=shared-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-writer.js","sourceRoot":"","sources":["../../../src/agent/knowledge/shared-writer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,gDAQC;AAMD,0CAqBC;AA7CD,uCAAyB;AACzB,2CAA6B;AAC7B,qCAA0C;AAG1C,kFAAkF;AAClF,wEAAwE;AACxE,IAAI,UAAU,GAAG,CAAC,CAAC;AAEnB,+EAA+E;AAC/E,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,MAAM,IAAI,GAAG,IAAI;SACd,WAAW,EAAE;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjB,OAAO,GAAG,IAAI,IAAI,MAAM,KAAK,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAA+B,EAAE,IAAY,EAAE,OAAe;IAC5F,MAAM,GAAG,GAAG,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;IAChC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,6EAA6E;IAC7E,gFAAgF;IAChF,iFAAiF;IACjF,8EAA8E;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACpH,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,iBAAiB;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Two-lane memory: per-agent searchable archive (planning-64 K0).
3
+ *
4
+ * Types for the archive substrate — a SQLite/FTS5 index over an agent's
5
+ * `memory/*.md` notes (plus the evergreen `MEMORY.md`/`USER.md`). K0 is dormant
6
+ * infrastructure: it builds and populates the index; later phases (K1 tools,
7
+ * K2 core-shrink, K4 applier) read from it. Nothing here touches the injected
8
+ * prompt or spawns tools.
9
+ */
10
+ /** Trust class of an indexed chunk. Fail-closed: unclassified ⇒ `untrusted`. */
11
+ export type OriginClass = 'owner' | 'agent' | 'untrusted' | 'system';
12
+ /** Session context a chunk was observed in (reserved for later promotion gating). */
13
+ export type SessionKind = 'interactive' | 'cron' | 'heartbeat' | 'subagent' | 'unknown';
14
+ /** Raw config shape under `gateway.knowledge.archive` (untyped JSON before resolve). */
15
+ export interface KnowledgeArchiveConfig {
16
+ enabled?: boolean;
17
+ tokenizer?: string;
18
+ chunkTokens?: number;
19
+ chunkOverlap?: number;
20
+ }
21
+ /** Resolved, sanitized archive config (all fields present). */
22
+ export interface ResolvedKnowledgeArchiveCfg {
23
+ enabled: boolean;
24
+ tokenizer: string;
25
+ chunkTokens: number;
26
+ chunkOverlap: number;
27
+ }
28
+ /** Raw config shape under `gateway.knowledge.shared` (planning-64 K3/K5). */
29
+ export interface KnowledgeSharedConfig {
30
+ enabled?: boolean;
31
+ project?: string;
32
+ root?: string;
33
+ mode?: 'propose' | 'auto';
34
+ graph?: boolean;
35
+ }
36
+ /** Resolved, sanitized shared-KB config (all fields present). */
37
+ export interface ResolvedKnowledgeSharedCfg {
38
+ enabled: boolean;
39
+ project: string;
40
+ root: string;
41
+ mode: 'propose' | 'auto';
42
+ graph: boolean;
43
+ }
44
+ /** One indexed source file. */
45
+ export interface ArchiveSourceRow {
46
+ id: number;
47
+ path: string;
48
+ hash: string;
49
+ mtime: number;
50
+ size: number;
51
+ source: string;
52
+ }
53
+ /** One indexed chunk. */
54
+ export interface ArchiveChunkRow {
55
+ id: string;
56
+ path: string;
57
+ startLine: number;
58
+ endLine: number;
59
+ text: string;
60
+ updatedAt: number;
61
+ }
62
+ /** Recall metadata for a chunk (importance/triggers/project scoping). */
63
+ export interface ArchiveRecallRow {
64
+ importance: number | null;
65
+ triggers: string | null;
66
+ projectKey: string | null;
67
+ }
68
+ /** Provenance/trust metadata for a chunk. */
69
+ export interface ArchiveProvenanceRow {
70
+ originClass: OriginClass;
71
+ sessionKind: SessionKind;
72
+ observedAt: number;
73
+ supersedesKey: string | null;
74
+ }
75
+ /** Result of an index pass over one agent's memory files. */
76
+ export interface IndexResult {
77
+ filesSeen: number;
78
+ filesIndexed: number;
79
+ filesSkipped: number;
80
+ filesRemoved: number;
81
+ chunksWritten: number;
82
+ }
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;AAErE,qFAAqF;AACrF,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAExF,wFAAwF;AACxF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+DAA+D;AAC/D,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,iEAAiE;AACjE,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,+BAA+B;AAC/B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Two-lane memory: per-agent searchable archive (planning-64 K0).
4
+ *
5
+ * Types for the archive substrate — a SQLite/FTS5 index over an agent's
6
+ * `memory/*.md` notes (plus the evergreen `MEMORY.md`/`USER.md`). K0 is dormant
7
+ * infrastructure: it builds and populates the index; later phases (K1 tools,
8
+ * K2 core-shrink, K4 applier) read from it. Nothing here touches the injected
9
+ * prompt or spawns tools.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/knowledge/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Shared-KB graph layer (planning-64 K5) — a deterministic, memory-wiki-style
3
+ * compile over the shared vault. NO LLM. Reads the vault's `*.md` notes (YAML
4
+ * frontmatter: title, claims[], evidence[], confidence, updatedAt; body
5
+ * `[[wiki-links]]`) and writes `reports/*.md`:
6
+ * - relationship-graph.md — every [[link]] edge, flat.
7
+ * - backlinks.md — a "referenced by" map (the reverse edges).
8
+ * - contradictions.md — claims sharing an id but diverging in text/status.
9
+ * - stale-pages.md — pages older than the stale threshold.
10
+ * - low-confidence.md — pages/claims with confidence < 0.5.
11
+ *
12
+ * Mirrors openclaw memory-wiki's shallow, pure-function dashboards. Opt-in via
13
+ * `gateway.knowledge.shared.graph`. Runs off the event loop (after the shared
14
+ * reindex). Report pages are never treated as source pages (no self-reference).
15
+ */
16
+ export interface WikiClaim {
17
+ id?: string;
18
+ text: string;
19
+ status?: string;
20
+ confidence?: number;
21
+ }
22
+ export interface WikiPage {
23
+ relPath: string;
24
+ title: string;
25
+ type: string | null;
26
+ claims: WikiClaim[];
27
+ confidence: number | null;
28
+ updatedAt: string | null;
29
+ links: string[];
30
+ excerpt: string | null;
31
+ }
32
+ export interface WikiCompileResult {
33
+ pages: number;
34
+ edges: number;
35
+ contradictions: number;
36
+ stale: number;
37
+ lowConfidence: number;
38
+ }
39
+ /** Extract `[[target]]` link targets from a body (code spans not masked — v1). */
40
+ export declare function extractLinks(body: string): string[];
41
+ export declare function parseWikiPage(relPath: string, raw: string): WikiPage;
42
+ /** Map each page to the pages that link to it (reverse [[link]] edges). */
43
+ export declare function buildBacklinks(pages: WikiPage[]): Map<string, string[]>;
44
+ export interface Dashboards {
45
+ contradictions: Array<{
46
+ claimId: string;
47
+ variants: Array<{
48
+ page: string;
49
+ text: string;
50
+ status?: string;
51
+ }>;
52
+ }>;
53
+ stale: Array<{
54
+ page: string;
55
+ updatedAt: string;
56
+ ageDays: number;
57
+ }>;
58
+ lowConfidence: Array<{
59
+ page: string;
60
+ confidence: number;
61
+ kind: 'page' | 'claim';
62
+ text?: string;
63
+ }>;
64
+ }
65
+ export declare function buildDashboards(pages: WikiPage[], now: number): Dashboards;
66
+ /**
67
+ * Read every source note in the vault into `WikiPage`s. Skips the generated
68
+ * `reports/` dir, dotfiles, and oversized notes (DoS guard). Deterministic
69
+ * order. Shared by `compileWiki` (report generation) and `buildGraphModel`
70
+ * (the on-demand dashboard graph endpoint).
71
+ */
72
+ export declare function readVaultPages(vaultDir: string): WikiPage[];
73
+ export interface GraphNode {
74
+ id: string;
75
+ title: string;
76
+ type: string | null;
77
+ degree: number;
78
+ confidence: number | null;
79
+ updatedAt: string | null;
80
+ stale: boolean;
81
+ contradiction: boolean;
82
+ excerpt: string | null;
83
+ }
84
+ export interface GraphEdge {
85
+ source: string;
86
+ target: string;
87
+ }
88
+ export interface GraphModel {
89
+ nodes: GraphNode[];
90
+ edges: GraphEdge[];
91
+ }
92
+ /**
93
+ * Build the `{ nodes, edges }` graph model from already-parsed pages. Pure and
94
+ * deterministic (`now` injected) so it is unit-testable without disk. Edges are
95
+ * `[[link]]`s resolved to a real target page (same key resolution as backlinks),
96
+ * de-duplicated and self-loops dropped; `degree` counts both directions; `stale`
97
+ * reuses the dashboard staleness threshold.
98
+ */
99
+ export declare function graphFromPages(pages: WikiPage[], now: number): GraphModel;
100
+ /** Read the vault and build the on-demand graph model. `now` injected for determinism. */
101
+ export declare function buildGraphModel(vaultDir: string, now: number): GraphModel;
102
+ /**
103
+ * Compile the wiki reports for a vault. Deterministic; `now` is injected. Writes
104
+ * `<vault>/reports/*.md`. Best-effort per file. Returns summary counts.
105
+ */
106
+ export declare function compileWiki(vaultDir: string, now: number): WikiCompileResult;
107
+ //# sourceMappingURL=wiki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/wiki.ts"],"names":[],"mappings":"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"}