@0xmaxma/claude-gateway 1.6.9 → 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 (214) 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/skills-router.d.ts +2 -2
  172. package/dist/api/skills-router.d.ts.map +1 -1
  173. package/dist/api/skills-router.js +61 -1
  174. package/dist/api/skills-router.js.map +1 -1
  175. package/dist/apps/agent-manager.d.ts +7 -0
  176. package/dist/apps/agent-manager.d.ts.map +1 -1
  177. package/dist/apps/agent-manager.js +13 -1
  178. package/dist/apps/agent-manager.js.map +1 -1
  179. package/dist/config/migrator.d.ts +2 -0
  180. package/dist/config/migrator.d.ts.map +1 -1
  181. package/dist/config/migrator.js +72 -1
  182. package/dist/config/migrator.js.map +1 -1
  183. package/dist/history/cleanup.d.ts +7 -0
  184. package/dist/history/cleanup.d.ts.map +1 -1
  185. package/dist/history/cleanup.js +27 -0
  186. package/dist/history/cleanup.js.map +1 -1
  187. package/dist/history/db.d.ts +65 -0
  188. package/dist/history/db.d.ts.map +1 -1
  189. package/dist/history/db.js +261 -0
  190. package/dist/history/db.js.map +1 -1
  191. package/dist/index.js +122 -20
  192. package/dist/index.js.map +1 -1
  193. package/dist/session/process.d.ts +10 -0
  194. package/dist/session/process.d.ts.map +1 -1
  195. package/dist/session/process.js +86 -1
  196. package/dist/session/process.js.map +1 -1
  197. package/dist/skills/loader.d.ts +8 -0
  198. package/dist/skills/loader.d.ts.map +1 -1
  199. package/dist/skills/loader.js +29 -1
  200. package/dist/skills/loader.js.map +1 -1
  201. package/dist/types.d.ts +116 -0
  202. package/dist/types.d.ts.map +1 -1
  203. package/dist/ui/web-ui.d.ts.map +1 -1
  204. package/dist/ui/web-ui.js +1126 -3
  205. package/dist/ui/web-ui.js.map +1 -1
  206. package/mcp/package.json +2 -1
  207. package/mcp/server.ts +2 -0
  208. package/mcp/tools/memory/archive-reader.test.ts +212 -0
  209. package/mcp/tools/memory/archive-reader.ts +253 -0
  210. package/mcp/tools/memory/module.ts +152 -0
  211. package/mcp/tools/memory/retrieval-recorder.ts +66 -0
  212. package/mcp/tools/skills/module.ts +28 -0
  213. package/package.json +1 -1
  214. package/resource/claude_gateway.svg +1038 -112
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ /**
3
+ * Shared-KB graph layer (planning-64 K5) — a deterministic, memory-wiki-style
4
+ * compile over the shared vault. NO LLM. Reads the vault's `*.md` notes (YAML
5
+ * frontmatter: title, claims[], evidence[], confidence, updatedAt; body
6
+ * `[[wiki-links]]`) and writes `reports/*.md`:
7
+ * - relationship-graph.md — every [[link]] edge, flat.
8
+ * - backlinks.md — a "referenced by" map (the reverse edges).
9
+ * - contradictions.md — claims sharing an id but diverging in text/status.
10
+ * - stale-pages.md — pages older than the stale threshold.
11
+ * - low-confidence.md — pages/claims with confidence < 0.5.
12
+ *
13
+ * Mirrors openclaw memory-wiki's shallow, pure-function dashboards. Opt-in via
14
+ * `gateway.knowledge.shared.graph`. Runs off the event loop (after the shared
15
+ * reindex). Report pages are never treated as source pages (no self-reference).
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
51
+ return (mod && mod.__esModule) ? mod : { "default": mod };
52
+ };
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.extractLinks = extractLinks;
55
+ exports.parseWikiPage = parseWikiPage;
56
+ exports.buildBacklinks = buildBacklinks;
57
+ exports.buildDashboards = buildDashboards;
58
+ exports.readVaultPages = readVaultPages;
59
+ exports.graphFromPages = graphFromPages;
60
+ exports.buildGraphModel = buildGraphModel;
61
+ exports.compileWiki = compileWiki;
62
+ const fs = __importStar(require("fs"));
63
+ const path = __importStar(require("path"));
64
+ const js_yaml_1 = __importDefault(require("js-yaml"));
65
+ const WIKI_STALE_DAYS = 90;
66
+ const LOW_CONFIDENCE = 0.5;
67
+ const REPORTS_DIR = 'reports';
68
+ // Guards against a pathological note (a multi-hundred-MB file or a YAML
69
+ // anchor/alias "billion laughs" frontmatter) OOM-ing or hanging the reindex
70
+ // subprocess: oversized notes are skipped, and the frontmatter block handed to
71
+ // js-yaml is length-capped before parsing.
72
+ const MAX_NOTE_BYTES = 512 * 1024;
73
+ const MAX_FRONTMATTER_CHARS = 64 * 1024;
74
+ const REPORT_NAMES = new Set([
75
+ 'relationship-graph.md',
76
+ 'backlinks.md',
77
+ 'contradictions.md',
78
+ 'stale-pages.md',
79
+ 'low-confidence.md',
80
+ ]);
81
+ function toStr(v) {
82
+ return typeof v === 'string' && v.trim() ? v.trim() : undefined;
83
+ }
84
+ /**
85
+ * Coerce a frontmatter date field to a `YYYY-MM-DD` string. js-yaml parses an
86
+ * UNQUOTED YAML date (`updatedAt: 2026-03-20`) into a JS `Date`, not a string, so
87
+ * a plain `toStr` would drop it and silently disable staleness for that page (the
88
+ * most natural way to write the field). Accept both a Date and an explicit string.
89
+ */
90
+ function toDateStr(v) {
91
+ if (v instanceof Date && !Number.isNaN(v.getTime()))
92
+ return v.toISOString().slice(0, 10);
93
+ return toStr(v);
94
+ }
95
+ function toNum(v) {
96
+ return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
97
+ }
98
+ /** Split `--- yaml --- body`; tolerate a missing/invalid frontmatter block. */
99
+ function splitFrontmatter(raw) {
100
+ const m = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/.exec(raw);
101
+ if (!m)
102
+ return { fm: {}, body: raw };
103
+ // Cap the frontmatter block before parsing — a huge/alias-bomb block is treated
104
+ // as "no frontmatter" rather than fed to js-yaml.
105
+ if (m[1].length > MAX_FRONTMATTER_CHARS)
106
+ return { fm: {}, body: m[2] };
107
+ let fm = {};
108
+ try {
109
+ const loaded = js_yaml_1.default.load(m[1]);
110
+ if (loaded && typeof loaded === 'object')
111
+ fm = loaded;
112
+ }
113
+ catch {
114
+ fm = {};
115
+ }
116
+ return { fm, body: m[2] };
117
+ }
118
+ const EXCERPT_MAX = 480;
119
+ /**
120
+ * Plain-text preview of a note body for the graph side-panel. Strips fenced code,
121
+ * unwraps `[[link|alias]]` to its display text, drops the most common Markdown
122
+ * punctuation, and caps the length. Paragraph/line breaks are PRESERVED (only
123
+ * horizontal whitespace is collapsed) so the panel — which renders with
124
+ * `white-space: pre-wrap` — shows readable lines instead of one run-on wall of
125
+ * text. Returns null for an empty body so the panel can omit the section.
126
+ */
127
+ function toExcerpt(body) {
128
+ const t = body
129
+ .replace(/```[\s\S]*?```/g, ' ') // fenced code blocks
130
+ .replace(/`[^`]*`/g, ' ') // inline code
131
+ .replace(/\[\[[^\]|]*\|([^\]]+)\]\]/g, '$1') // [[target|alias]] -> alias
132
+ .replace(/\[\[([^\]]+)\]\]/g, '$1') // [[target]] -> target
133
+ .replace(/^\s*[#>\-*+]\s?/gm, '') // leading heading/list/quote markers
134
+ .replace(/[*_~]/g, '') // emphasis marks
135
+ .replace(/[ \t]+/g, ' ') // collapse horizontal whitespace ONLY (keep newlines)
136
+ .replace(/[ \t]*\n[ \t]*/g, '\n') // trim spaces hugging each line break
137
+ .replace(/\n{3,}/g, '\n\n') // cap blank runs to a single blank line
138
+ .trim();
139
+ if (!t)
140
+ return null;
141
+ return t.length > EXCERPT_MAX ? t.slice(0, EXCERPT_MAX).replace(/\s+\S*$/, '') + '…' : t;
142
+ }
143
+ /** Extract `[[target]]` link targets from a body (code spans not masked — v1). */
144
+ function extractLinks(body) {
145
+ const out = [];
146
+ const re = /\[\[([^\]|]+)(?:\|[^\]]*)?\]\]/g;
147
+ let m;
148
+ while ((m = re.exec(body)) !== null) {
149
+ const t = m[1].trim();
150
+ if (t)
151
+ out.push(t);
152
+ }
153
+ return out;
154
+ }
155
+ function normalizeClaims(v) {
156
+ if (!Array.isArray(v))
157
+ return [];
158
+ const out = [];
159
+ for (const item of v) {
160
+ if (typeof item === 'string') {
161
+ if (item.trim())
162
+ out.push({ text: item.trim() });
163
+ continue;
164
+ }
165
+ if (item && typeof item === 'object') {
166
+ const rec = item;
167
+ const text = toStr(rec.text);
168
+ if (!text)
169
+ continue; // a claim with no text is dropped
170
+ out.push({ id: toStr(rec.id), text, status: toStr(rec.status), confidence: toNum(rec.confidence) });
171
+ }
172
+ }
173
+ return out;
174
+ }
175
+ function parseWikiPage(relPath, raw) {
176
+ const { fm, body } = splitFrontmatter(raw);
177
+ return {
178
+ relPath,
179
+ title: toStr(fm.title) ?? relPath.replace(/\.md$/i, ''),
180
+ type: toStr(fm.type) ?? null,
181
+ claims: normalizeClaims(fm.claims),
182
+ confidence: toNum(fm.confidence) ?? null,
183
+ updatedAt: toDateStr(fm.updatedAt) ?? null,
184
+ links: extractLinks(body),
185
+ excerpt: toExcerpt(body),
186
+ };
187
+ }
188
+ /** page relPath, its stem, its basename, and its title — all match keys for a link. */
189
+ function pageKeys(p) {
190
+ const rel = p.relPath;
191
+ const noExt = rel.replace(/\.md$/i, '');
192
+ const base = path.posix.basename(noExt);
193
+ return [rel, noExt, base, p.title].map((s) => s.toLowerCase());
194
+ }
195
+ /** Map each page to the pages that link to it (reverse [[link]] edges). */
196
+ function buildBacklinks(pages) {
197
+ const keyToPage = new Map();
198
+ for (const p of pages)
199
+ for (const k of pageKeys(p))
200
+ keyToPage.set(k, p.relPath);
201
+ const back = new Map();
202
+ for (const p of pages) {
203
+ for (const link of p.links) {
204
+ const target = keyToPage.get(link.toLowerCase());
205
+ if (!target || target === p.relPath)
206
+ continue;
207
+ const arr = back.get(target) ?? [];
208
+ if (!arr.includes(p.relPath))
209
+ arr.push(p.relPath);
210
+ back.set(target, arr);
211
+ }
212
+ }
213
+ return back;
214
+ }
215
+ function buildDashboards(pages, now) {
216
+ // Contradictions: claims sharing an id whose normalized text OR status diverges.
217
+ const byId = new Map();
218
+ for (const p of pages) {
219
+ for (const c of p.claims) {
220
+ if (!c.id)
221
+ continue;
222
+ const arr = byId.get(c.id) ?? [];
223
+ arr.push({ page: p.relPath, text: c.text, status: c.status });
224
+ byId.set(c.id, arr);
225
+ }
226
+ }
227
+ const contradictions = [];
228
+ for (const [claimId, variants] of byId) {
229
+ if (variants.length < 2)
230
+ continue;
231
+ const distinctText = new Set(variants.map((v) => v.text.trim().toLowerCase()));
232
+ const distinctStatus = new Set(variants.map((v) => (v.status ?? '').trim().toLowerCase()));
233
+ if (distinctText.size > 1 || distinctStatus.size > 1)
234
+ contradictions.push({ claimId, variants });
235
+ }
236
+ // Stale: pages whose updatedAt is older than the threshold.
237
+ const stale = [];
238
+ for (const p of pages) {
239
+ if (!p.updatedAt)
240
+ continue;
241
+ const t = Date.parse(p.updatedAt);
242
+ if (Number.isNaN(t))
243
+ continue;
244
+ const ageDays = Math.floor((now - t) / (24 * 60 * 60 * 1000));
245
+ if (ageDays >= WIKI_STALE_DAYS)
246
+ stale.push({ page: p.relPath, updatedAt: p.updatedAt, ageDays });
247
+ }
248
+ // Low confidence: page-level or claim-level confidence below the threshold.
249
+ const lowConfidence = [];
250
+ for (const p of pages) {
251
+ if (p.confidence !== null && p.confidence < LOW_CONFIDENCE) {
252
+ lowConfidence.push({ page: p.relPath, confidence: p.confidence, kind: 'page' });
253
+ }
254
+ for (const c of p.claims) {
255
+ if (c.confidence !== undefined && c.confidence < LOW_CONFIDENCE) {
256
+ lowConfidence.push({ page: p.relPath, confidence: c.confidence, kind: 'claim', text: c.text });
257
+ }
258
+ }
259
+ }
260
+ return { contradictions, stale, lowConfidence };
261
+ }
262
+ function renderReports(pages, back, d) {
263
+ const gen = '<!-- generated by knowledge/wiki.ts — do not edit -->\n\n';
264
+ const edges = [];
265
+ for (const p of pages)
266
+ for (const l of p.links)
267
+ edges.push(`- \`${p.relPath}\` → [[${l}]]`);
268
+ const backLines = [];
269
+ for (const [target, refs] of [...back.entries()].sort()) {
270
+ backLines.push(`- \`${target}\` ← ${refs.map((r) => `\`${r}\``).join(', ')}`);
271
+ }
272
+ const contra = d.contradictions.map((c) => `- **${c.claimId}**:\n${c.variants.map((v) => ` - \`${v.page}\`: ${v.text}${v.status ? ` _(${v.status})_` : ''}`).join('\n')}`);
273
+ const stale = d.stale.sort((a, b) => b.ageDays - a.ageDays).map((s) => `- \`${s.page}\` — ${s.ageDays}d old (updated ${s.updatedAt})`);
274
+ const low = d.lowConfidence.map((l) => `- \`${l.page}\` — ${l.kind} confidence ${l.confidence}${l.text ? `: ${l.text}` : ''}`);
275
+ const section = (title, lines, empty) => `${gen}# ${title}\n\n${lines.length ? lines.join('\n') : `_${empty}_`}\n`;
276
+ return {
277
+ 'relationship-graph.md': section('Relationship graph', edges, 'No links yet.'),
278
+ 'backlinks.md': section('Backlinks', backLines, 'No backlinks yet.'),
279
+ 'contradictions.md': section('Contradictions', contra, 'No contradictions detected.'),
280
+ 'stale-pages.md': section(`Stale pages (≥ ${WIKI_STALE_DAYS}d)`, stale, 'No stale pages.'),
281
+ 'low-confidence.md': section(`Low confidence (< ${LOW_CONFIDENCE})`, low, 'No low-confidence entries.'),
282
+ };
283
+ }
284
+ /** Recursively collect vault `*.md` files, EXCLUDING the reports dir. */
285
+ function collectPages(vaultDir, dir, out) {
286
+ let entries;
287
+ try {
288
+ entries = fs.readdirSync(dir, { withFileTypes: true });
289
+ }
290
+ catch {
291
+ return;
292
+ }
293
+ entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)); // deterministic order
294
+ for (const e of entries) {
295
+ if (e.name.startsWith('.'))
296
+ continue; // skip dotfiles / `.tmp-*` write leftovers
297
+ const full = path.join(dir, e.name);
298
+ if (e.isDirectory()) {
299
+ if (path.relative(vaultDir, full) === REPORTS_DIR)
300
+ continue; // never scan generated reports
301
+ collectPages(vaultDir, full, out);
302
+ }
303
+ else if (e.isFile() && e.name.toLowerCase().endsWith('.md')) {
304
+ out.push(full);
305
+ }
306
+ }
307
+ }
308
+ /**
309
+ * Read every source note in the vault into `WikiPage`s. Skips the generated
310
+ * `reports/` dir, dotfiles, and oversized notes (DoS guard). Deterministic
311
+ * order. Shared by `compileWiki` (report generation) and `buildGraphModel`
312
+ * (the on-demand dashboard graph endpoint).
313
+ */
314
+ function readVaultPages(vaultDir) {
315
+ const absFiles = [];
316
+ collectPages(vaultDir, vaultDir, absFiles);
317
+ const pages = [];
318
+ for (const abs of absFiles) {
319
+ const rel = path.relative(vaultDir, abs).split(path.sep).join('/');
320
+ if (REPORT_NAMES.has(path.posix.basename(rel)) && rel.startsWith(`${REPORTS_DIR}/`))
321
+ continue;
322
+ let raw;
323
+ try {
324
+ if (fs.statSync(abs).size > MAX_NOTE_BYTES)
325
+ continue; // oversized note — skip (DoS guard)
326
+ raw = fs.readFileSync(abs, 'utf8');
327
+ }
328
+ catch {
329
+ continue;
330
+ }
331
+ pages.push(parseWikiPage(rel, raw));
332
+ }
333
+ return pages;
334
+ }
335
+ /**
336
+ * Build the `{ nodes, edges }` graph model from already-parsed pages. Pure and
337
+ * deterministic (`now` injected) so it is unit-testable without disk. Edges are
338
+ * `[[link]]`s resolved to a real target page (same key resolution as backlinks),
339
+ * de-duplicated and self-loops dropped; `degree` counts both directions; `stale`
340
+ * reuses the dashboard staleness threshold.
341
+ */
342
+ function graphFromPages(pages, now) {
343
+ const keyToPage = new Map();
344
+ for (const p of pages)
345
+ for (const k of pageKeys(p))
346
+ keyToPage.set(k, p.relPath);
347
+ const edges = [];
348
+ const seen = new Set();
349
+ const degree = new Map();
350
+ const bump = (id) => {
351
+ degree.set(id, (degree.get(id) ?? 0) + 1);
352
+ };
353
+ for (const p of pages) {
354
+ for (const link of p.links) {
355
+ const target = keyToPage.get(link.toLowerCase());
356
+ if (!target || target === p.relPath)
357
+ continue; // unresolved or self-loop
358
+ const key = `${p.relPath}\n${target}`; // \n can't occur in a path -> no dedup-key collision
359
+ if (seen.has(key))
360
+ continue; // de-dupe repeated links to the same target
361
+ seen.add(key);
362
+ edges.push({ source: p.relPath, target });
363
+ bump(p.relPath);
364
+ bump(target);
365
+ }
366
+ }
367
+ const dash = buildDashboards(pages, now);
368
+ const staleSet = new Set(dash.stale.map((s) => s.page));
369
+ const contradictionSet = new Set(dash.contradictions.flatMap((c) => c.variants.map((v) => v.page)));
370
+ const nodes = pages.map((p) => ({
371
+ id: p.relPath,
372
+ title: p.title,
373
+ type: p.type,
374
+ degree: degree.get(p.relPath) ?? 0,
375
+ confidence: p.confidence,
376
+ updatedAt: p.updatedAt,
377
+ stale: staleSet.has(p.relPath),
378
+ contradiction: contradictionSet.has(p.relPath),
379
+ excerpt: p.excerpt ?? null,
380
+ }));
381
+ return { nodes, edges };
382
+ }
383
+ /** Read the vault and build the on-demand graph model. `now` injected for determinism. */
384
+ function buildGraphModel(vaultDir, now) {
385
+ return graphFromPages(readVaultPages(vaultDir), now);
386
+ }
387
+ /**
388
+ * Compile the wiki reports for a vault. Deterministic; `now` is injected. Writes
389
+ * `<vault>/reports/*.md`. Best-effort per file. Returns summary counts.
390
+ */
391
+ function compileWiki(vaultDir, now) {
392
+ const pages = readVaultPages(vaultDir);
393
+ const back = buildBacklinks(pages);
394
+ const dash = buildDashboards(pages, now);
395
+ const reports = renderReports(pages, back, dash);
396
+ const reportsDir = path.join(vaultDir, REPORTS_DIR);
397
+ fs.mkdirSync(reportsDir, { recursive: true });
398
+ for (const [name, content] of Object.entries(reports)) {
399
+ try {
400
+ fs.writeFileSync(path.join(reportsDir, name), content, 'utf8');
401
+ }
402
+ catch {
403
+ /* best-effort */
404
+ }
405
+ }
406
+ const edges = pages.reduce((n, p) => n + p.links.length, 0);
407
+ return {
408
+ pages: pages.length,
409
+ edges,
410
+ contradictions: dash.contradictions.length,
411
+ stale: dash.stale.length,
412
+ lowConfidence: dash.lowConfidence.length,
413
+ };
414
+ }
415
+ //# sourceMappingURL=wiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../../src/agent/knowledge/wiki.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Memory metrics (planning-64 Measurement, absorbs planning-63 P4).
3
+ *
4
+ * Computes the 5 measures from data already on disk — memory files, the per-agent
5
+ * and shared kb.sqlite indexes, and the dreaming audit (.dreaming/promotions.jsonl)
6
+ * — plus the session-drop invariant. Read-only and cheap; opens a kb.sqlite only
7
+ * when it already exists (never creates one as a side effect of reading metrics).
8
+ */
9
+ import type { AgentConfig, GatewayConfig } from '../types';
10
+ export interface FileHygiene {
11
+ chars: number;
12
+ budget: number;
13
+ utilization: number;
14
+ overBudget: boolean;
15
+ }
16
+ export interface ArchiveStats {
17
+ exists: boolean;
18
+ sources: number;
19
+ chunks: number;
20
+ }
21
+ export interface DreamingStats {
22
+ runs: number;
23
+ proposals: number;
24
+ applied: number;
25
+ tokensSpent: number;
26
+ lastRunISO: string | null;
27
+ }
28
+ export interface MemoryMetrics {
29
+ agentId: string;
30
+ /** #1 — memory-write-triggered session drops. Structurally 0 (Part A). */
31
+ sessionDropIncidents: number;
32
+ sessionDropNote: string;
33
+ /** #2 — memory hygiene (budget utilization). */
34
+ hygiene: {
35
+ memory: FileHygiene;
36
+ user: FileHygiene;
37
+ };
38
+ /** archive coverage (the searchable backing for #3 adoption). */
39
+ archive: ArchiveStats;
40
+ shared: ArchiveStats & {
41
+ enabled: boolean;
42
+ project: string;
43
+ };
44
+ /** #4 consolidation yield + #5 net-token (dreaming spend). */
45
+ dreaming: DreamingStats;
46
+ }
47
+ export declare function computeMemoryMetrics(agentConfig: AgentConfig, gatewayConfig?: GatewayConfig): MemoryMetrics;
48
+ //# sourceMappingURL=memory-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-metrics.d.ts","sourceRoot":"","sources":["../../src/agent/memory-metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI3D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC;IACpD,iEAAiE;IACjE,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,YAAY,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,8DAA8D;IAC9D,QAAQ,EAAE,aAAa,CAAC;CACzB;AAiFD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,WAAW,EACxB,aAAa,CAAC,EAAE,aAAa,GAC5B,aAAa,CAsBf"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * Memory metrics (planning-64 Measurement, absorbs planning-63 P4).
4
+ *
5
+ * Computes the 5 measures from data already on disk — memory files, the per-agent
6
+ * and shared kb.sqlite indexes, and the dreaming audit (.dreaming/promotions.jsonl)
7
+ * — plus the session-drop invariant. Read-only and cheap; opens a kb.sqlite only
8
+ * when it already exists (never creates one as a side effect of reading metrics).
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.computeMemoryMetrics = computeMemoryMetrics;
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const node_sqlite_1 = require("node:sqlite");
48
+ const workspace_loader_1 = require("./workspace-loader");
49
+ const knowledge_1 = require("./knowledge");
50
+ function fileHygiene(filePath, budget) {
51
+ // Count STRING LENGTH (code points as JS sees them), NOT byte size — this must
52
+ // match the budget enforcement in workspace-loader (`content.length`). Byte size
53
+ // over-counts multi-byte text (e.g. Thai = 3 bytes/char) and would report a file
54
+ // as over budget while the live banner considers it fine.
55
+ let chars = 0;
56
+ try {
57
+ chars = fs.readFileSync(filePath, 'utf8').length;
58
+ }
59
+ catch {
60
+ chars = 0;
61
+ }
62
+ return {
63
+ chars,
64
+ budget,
65
+ utilization: budget > 0 ? Number((chars / budget).toFixed(3)) : 0,
66
+ overBudget: budget > 0 && chars > budget,
67
+ };
68
+ }
69
+ /**
70
+ * Count sources + chunks in a kb.sqlite WITHOUT creating it if absent and WITHOUT
71
+ * a writable handle. This runs on the HTTP read path (event loop), so it opens a
72
+ * short-lived READ-ONLY connection — no WAL/-shm sidecar creation, no schema DDL,
73
+ * no cached handle (the #277 anti-pattern) — and closes it immediately. A failure
74
+ * (locked/corrupt/read-only FS) degrades to `exists:false` and leaks nothing.
75
+ */
76
+ function archiveStats(dbPath) {
77
+ if (!fs.existsSync(dbPath))
78
+ return { exists: false, sources: 0, chunks: 0 };
79
+ let db;
80
+ try {
81
+ db = new node_sqlite_1.DatabaseSync(dbPath, { readOnly: true });
82
+ const s = db.prepare('SELECT count(*) AS n FROM kb_sources').get();
83
+ const c = db.prepare('SELECT count(*) AS n FROM kb_chunks').get();
84
+ return { exists: true, sources: Number(s?.n ?? 0), chunks: Number(c?.n ?? 0) };
85
+ }
86
+ catch {
87
+ return { exists: false, sources: 0, chunks: 0 };
88
+ }
89
+ finally {
90
+ try {
91
+ db?.close();
92
+ }
93
+ catch {
94
+ /* best-effort */
95
+ }
96
+ }
97
+ }
98
+ function dreamingStats(workspaceDir) {
99
+ const jsonl = path.join(workspaceDir, '.dreaming', 'promotions.jsonl');
100
+ const empty = { runs: 0, proposals: 0, applied: 0, tokensSpent: 0, lastRunISO: null };
101
+ let raw = '';
102
+ try {
103
+ raw = fs.readFileSync(jsonl, 'utf8');
104
+ }
105
+ catch {
106
+ return empty;
107
+ }
108
+ const runs = new Set();
109
+ let proposals = 0;
110
+ let lastTs = 0;
111
+ for (const line of raw.split('\n')) {
112
+ if (!line.trim())
113
+ continue;
114
+ try {
115
+ const row = JSON.parse(line);
116
+ proposals++;
117
+ if (typeof row.ts === 'number') {
118
+ runs.add(row.ts);
119
+ if (row.ts > lastTs)
120
+ lastTs = row.ts;
121
+ }
122
+ }
123
+ catch {
124
+ /* skip malformed line */
125
+ }
126
+ }
127
+ return {
128
+ runs: runs.size,
129
+ proposals,
130
+ applied: 0, // per-op apply status is not recorded in the jsonl; run log carries counts
131
+ tokensSpent: 0, // token spend lives in DREAMS.md summary, not the per-op jsonl
132
+ lastRunISO: lastTs > 0 ? new Date(lastTs).toISOString() : null,
133
+ };
134
+ }
135
+ function computeMemoryMetrics(agentConfig, gatewayConfig) {
136
+ const workspaceDir = agentConfig.workspace;
137
+ const budget = (0, workspace_loader_1.resolveMemoryBudget)({ ...gatewayConfig?.gateway?.memory, ...agentConfig.memory });
138
+ const sharedCfg = (0, knowledge_1.resolveSharedConfig)(agentConfig.knowledge?.shared, gatewayConfig?.gateway?.knowledge?.shared);
139
+ return {
140
+ agentId: agentConfig.id,
141
+ sessionDropIncidents: 0,
142
+ sessionDropNote: 'Structurally 0: a memory-file write is classified memory-only and restarts no session (planning-63 Part A).',
143
+ hygiene: {
144
+ memory: fileHygiene(path.join(workspaceDir, 'MEMORY.md'), budget.memoryBudgetChars),
145
+ user: fileHygiene(path.join(workspaceDir, 'USER.md'), budget.userBudgetChars),
146
+ },
147
+ archive: archiveStats((0, knowledge_1.archiveDbPath)(workspaceDir)),
148
+ shared: {
149
+ enabled: sharedCfg.enabled,
150
+ project: sharedCfg.project,
151
+ ...(sharedCfg.enabled ? archiveStats((0, knowledge_1.sharedDbPath)(sharedCfg)) : { exists: false, sources: 0, chunks: 0 }),
152
+ },
153
+ dreaming: dreamingStats(workspaceDir),
154
+ };
155
+ }
156
+ //# sourceMappingURL=memory-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-metrics.js","sourceRoot":"","sources":["../../src/agent/memory-metrics.ts"],"names":[],"mappings":"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"}