@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.
- package/README.md +149 -20
- package/config.template.json +59 -1
- package/dist/agent/dreaming/accept.d.ts +43 -0
- package/dist/agent/dreaming/accept.d.ts.map +1 -0
- package/dist/agent/dreaming/accept.js +230 -0
- package/dist/agent/dreaming/accept.js.map +1 -0
- package/dist/agent/dreaming/applier.d.ts +77 -0
- package/dist/agent/dreaming/applier.d.ts.map +1 -0
- package/dist/agent/dreaming/applier.js +406 -0
- package/dist/agent/dreaming/applier.js.map +1 -0
- package/dist/agent/dreaming/audit.d.ts +27 -0
- package/dist/agent/dreaming/audit.d.ts.map +1 -0
- package/dist/agent/dreaming/audit.js +100 -0
- package/dist/agent/dreaming/audit.js.map +1 -0
- package/dist/agent/dreaming/compactor.d.ts +66 -0
- package/dist/agent/dreaming/compactor.d.ts.map +1 -0
- package/dist/agent/dreaming/compactor.js +306 -0
- package/dist/agent/dreaming/compactor.js.map +1 -0
- package/dist/agent/dreaming/config.d.ts +19 -0
- package/dist/agent/dreaming/config.d.ts.map +1 -0
- package/dist/agent/dreaming/config.js +107 -0
- package/dist/agent/dreaming/config.js.map +1 -0
- package/dist/agent/dreaming/episodic.d.ts +42 -0
- package/dist/agent/dreaming/episodic.d.ts.map +1 -0
- package/dist/agent/dreaming/episodic.js +116 -0
- package/dist/agent/dreaming/episodic.js.map +1 -0
- package/dist/agent/dreaming/gather.d.ts +31 -0
- package/dist/agent/dreaming/gather.d.ts.map +1 -0
- package/dist/agent/dreaming/gather.js +55 -0
- package/dist/agent/dreaming/gather.js.map +1 -0
- package/dist/agent/dreaming/index.d.ts +87 -0
- package/dist/agent/dreaming/index.d.ts.map +1 -0
- package/dist/agent/dreaming/index.js +377 -0
- package/dist/agent/dreaming/index.js.map +1 -0
- package/dist/agent/dreaming/migrate-cli.d.ts +17 -0
- package/dist/agent/dreaming/migrate-cli.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate-cli.js +42 -0
- package/dist/agent/dreaming/migrate-cli.js.map +1 -0
- package/dist/agent/dreaming/migrate.d.ts +72 -0
- package/dist/agent/dreaming/migrate.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate.js +374 -0
- package/dist/agent/dreaming/migrate.js.map +1 -0
- package/dist/agent/dreaming/report.d.ts +39 -0
- package/dist/agent/dreaming/report.d.ts.map +1 -0
- package/dist/agent/dreaming/report.js +121 -0
- package/dist/agent/dreaming/report.js.map +1 -0
- package/dist/agent/dreaming/reviewer.d.ts +43 -0
- package/dist/agent/dreaming/reviewer.d.ts.map +1 -0
- package/dist/agent/dreaming/reviewer.js +249 -0
- package/dist/agent/dreaming/reviewer.js.map +1 -0
- package/dist/agent/dreaming/staleness.d.ts +68 -0
- package/dist/agent/dreaming/staleness.d.ts.map +1 -0
- package/dist/agent/dreaming/staleness.js +281 -0
- package/dist/agent/dreaming/staleness.js.map +1 -0
- package/dist/agent/dreaming/types.d.ts +130 -0
- package/dist/agent/dreaming/types.d.ts.map +1 -0
- package/dist/agent/dreaming/types.js +10 -0
- package/dist/agent/dreaming/types.js.map +1 -0
- package/dist/agent/knowledge/archive-db.d.ts +114 -0
- package/dist/agent/knowledge/archive-db.d.ts.map +1 -0
- package/dist/agent/knowledge/archive-db.js +474 -0
- package/dist/agent/knowledge/archive-db.js.map +1 -0
- package/dist/agent/knowledge/chunk.d.ts +21 -0
- package/dist/agent/knowledge/chunk.d.ts.map +1 -0
- package/dist/agent/knowledge/chunk.js +67 -0
- package/dist/agent/knowledge/chunk.js.map +1 -0
- package/dist/agent/knowledge/config.d.ts +20 -0
- package/dist/agent/knowledge/config.d.ts.map +1 -0
- package/dist/agent/knowledge/config.js +143 -0
- package/dist/agent/knowledge/config.js.map +1 -0
- package/dist/agent/knowledge/graph-demo.d.ts +25 -0
- package/dist/agent/knowledge/graph-demo.d.ts.map +1 -0
- package/dist/agent/knowledge/graph-demo.js +132 -0
- package/dist/agent/knowledge/graph-demo.js.map +1 -0
- package/dist/agent/knowledge/index.d.ts +24 -0
- package/dist/agent/knowledge/index.d.ts.map +1 -0
- package/dist/agent/knowledge/index.js +50 -0
- package/dist/agent/knowledge/index.js.map +1 -0
- package/dist/agent/knowledge/indexer.d.ts +34 -0
- package/dist/agent/knowledge/indexer.d.ts.map +1 -0
- package/dist/agent/knowledge/indexer.js +271 -0
- package/dist/agent/knowledge/indexer.js.map +1 -0
- package/dist/agent/knowledge/lifecycle.d.ts +91 -0
- package/dist/agent/knowledge/lifecycle.d.ts.map +1 -0
- package/dist/agent/knowledge/lifecycle.js +205 -0
- package/dist/agent/knowledge/lifecycle.js.map +1 -0
- package/dist/agent/knowledge/provenance.d.ts +15 -0
- package/dist/agent/knowledge/provenance.d.ts.map +1 -0
- package/dist/agent/knowledge/provenance.js +37 -0
- package/dist/agent/knowledge/provenance.js.map +1 -0
- package/dist/agent/knowledge/reindex-cli.d.ts +13 -0
- package/dist/agent/knowledge/reindex-cli.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-cli.js +53 -0
- package/dist/agent/knowledge/reindex-cli.js.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts +30 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.js +97 -0
- package/dist/agent/knowledge/reindex-spawn.js.map +1 -0
- package/dist/agent/knowledge/shared-promote.d.ts +18 -0
- package/dist/agent/knowledge/shared-promote.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-promote.js +29 -0
- package/dist/agent/knowledge/shared-promote.js.map +1 -0
- package/dist/agent/knowledge/shared-writer.d.ts +24 -0
- package/dist/agent/knowledge/shared-writer.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-writer.js +97 -0
- package/dist/agent/knowledge/shared-writer.js.map +1 -0
- package/dist/agent/knowledge/types.d.ts +83 -0
- package/dist/agent/knowledge/types.d.ts.map +1 -0
- package/dist/agent/knowledge/types.js +12 -0
- package/dist/agent/knowledge/types.js.map +1 -0
- package/dist/agent/knowledge/wiki.d.ts +107 -0
- package/dist/agent/knowledge/wiki.d.ts.map +1 -0
- package/dist/agent/knowledge/wiki.js +415 -0
- package/dist/agent/knowledge/wiki.js.map +1 -0
- package/dist/agent/memory-metrics.d.ts +48 -0
- package/dist/agent/memory-metrics.d.ts.map +1 -0
- package/dist/agent/memory-metrics.js +156 -0
- package/dist/agent/memory-metrics.js.map +1 -0
- package/dist/agent/runner.d.ts +24 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +82 -6
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/skill-learning/config.d.ts +18 -0
- package/dist/agent/skill-learning/config.d.ts.map +1 -0
- package/dist/agent/skill-learning/config.js +71 -0
- package/dist/agent/skill-learning/config.js.map +1 -0
- package/dist/agent/skill-learning/curator.d.ts +45 -0
- package/dist/agent/skill-learning/curator.d.ts.map +1 -0
- package/dist/agent/skill-learning/curator.js +171 -0
- package/dist/agent/skill-learning/curator.js.map +1 -0
- package/dist/agent/skill-learning/index.d.ts +79 -0
- package/dist/agent/skill-learning/index.d.ts.map +1 -0
- package/dist/agent/skill-learning/index.js +308 -0
- package/dist/agent/skill-learning/index.js.map +1 -0
- package/dist/agent/skill-learning/metrics.d.ts +13 -0
- package/dist/agent/skill-learning/metrics.d.ts.map +1 -0
- package/dist/agent/skill-learning/metrics.js +109 -0
- package/dist/agent/skill-learning/metrics.js.map +1 -0
- package/dist/agent/skill-learning/notifier.d.ts +111 -0
- package/dist/agent/skill-learning/notifier.d.ts.map +1 -0
- package/dist/agent/skill-learning/notifier.js +398 -0
- package/dist/agent/skill-learning/notifier.js.map +1 -0
- package/dist/agent/skill-learning/reviewer.d.ts +61 -0
- package/dist/agent/skill-learning/reviewer.d.ts.map +1 -0
- package/dist/agent/skill-learning/reviewer.js +271 -0
- package/dist/agent/skill-learning/reviewer.js.map +1 -0
- package/dist/agent/skill-learning/telemetry.d.ts +22 -0
- package/dist/agent/skill-learning/telemetry.d.ts.map +1 -0
- package/dist/agent/skill-learning/telemetry.js +90 -0
- package/dist/agent/skill-learning/telemetry.js.map +1 -0
- package/dist/agent/skill-learning/trigger.d.ts +23 -0
- package/dist/agent/skill-learning/trigger.d.ts.map +1 -0
- package/dist/agent/skill-learning/trigger.js +44 -0
- package/dist/agent/skill-learning/trigger.js.map +1 -0
- package/dist/agent/skill-learning/types.d.ts +165 -0
- package/dist/agent/skill-learning/types.d.ts.map +1 -0
- package/dist/agent/skill-learning/types.js +11 -0
- package/dist/agent/skill-learning/types.js.map +1 -0
- package/dist/agent/skill-learning/writer.d.ts +37 -0
- package/dist/agent/skill-learning/writer.d.ts.map +1 -0
- package/dist/agent/skill-learning/writer.js +223 -0
- package/dist/agent/skill-learning/writer.js.map +1 -0
- package/dist/agent/workspace-loader.d.ts +83 -6
- package/dist/agent/workspace-loader.d.ts.map +1 -1
- package/dist/agent/workspace-loader.js +207 -14
- package/dist/agent/workspace-loader.js.map +1 -1
- package/dist/api/gateway-router.d.ts +2 -0
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +293 -6
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/skills-router.d.ts +2 -2
- package/dist/api/skills-router.d.ts.map +1 -1
- package/dist/api/skills-router.js +61 -1
- package/dist/api/skills-router.js.map +1 -1
- package/dist/apps/agent-manager.d.ts +7 -0
- package/dist/apps/agent-manager.d.ts.map +1 -1
- package/dist/apps/agent-manager.js +13 -1
- package/dist/apps/agent-manager.js.map +1 -1
- package/dist/config/migrator.d.ts +2 -0
- package/dist/config/migrator.d.ts.map +1 -1
- package/dist/config/migrator.js +72 -1
- package/dist/config/migrator.js.map +1 -1
- package/dist/history/cleanup.d.ts +7 -0
- package/dist/history/cleanup.d.ts.map +1 -1
- package/dist/history/cleanup.js +27 -0
- package/dist/history/cleanup.js.map +1 -1
- package/dist/history/db.d.ts +65 -0
- package/dist/history/db.d.ts.map +1 -1
- package/dist/history/db.js +261 -0
- package/dist/history/db.js.map +1 -1
- package/dist/index.js +122 -20
- package/dist/index.js.map +1 -1
- package/dist/session/process.d.ts +10 -0
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +86 -1
- package/dist/session/process.js.map +1 -1
- package/dist/skills/loader.d.ts +8 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +29 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +1126 -3
- package/dist/ui/web-ui.js.map +1 -1
- package/mcp/package.json +2 -1
- package/mcp/server.ts +2 -0
- package/mcp/tools/memory/archive-reader.test.ts +212 -0
- package/mcp/tools/memory/archive-reader.ts +253 -0
- package/mcp/tools/memory/module.ts +152 -0
- package/mcp/tools/memory/retrieval-recorder.ts +66 -0
- package/mcp/tools/skills/module.ts +28 -0
- package/package.json +1 -1
- 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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"}
|