@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.
- 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/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +27 -1
- package/dist/api/share-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/share/share-store.d.ts +11 -0
- package/dist/share/share-store.d.ts.map +1 -1
- package/dist/share/share-store.js +3 -1
- package/dist/share/share-store.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/image/module.ts +114 -9
- 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/shared/share-client.ts +20 -1
- package/mcp/tools/skills/module.ts +28 -0
- package/package.json +1 -1
- package/resource/claude_gateway.svg +1038 -112
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Per-agent knowledge archive — SQLite/FTS5 substrate (planning-64 K0).
|
|
4
|
+
*
|
|
5
|
+
* One `kb.sqlite` per agent, alongside `history.db`. Backed by `node:sqlite`
|
|
6
|
+
* `DatabaseSync` (zero new dependency — the same substrate `src/history/db.ts`
|
|
7
|
+
* uses, which already runs FTS5). Schema adapted from openclaw memory-core,
|
|
8
|
+
* trimmed for v1 (FTS5-only; no vector table yet).
|
|
9
|
+
*
|
|
10
|
+
* IMPORTANT: `DatabaseSync` is synchronous. Every method here blocks. Callers
|
|
11
|
+
* MUST run indexing/queries OFF the gateway event loop (the nightly dreaming
|
|
12
|
+
* spawn or an out-of-process tool) — never on the HTTP read path (#277 lesson).
|
|
13
|
+
* K0 ships this as dormant infrastructure; no gateway runtime path calls it yet.
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.ArchiveDB = void 0;
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const node_sqlite_1 = require("node:sqlite");
|
|
53
|
+
// Singleton cache: one DB handle per absolute file path.
|
|
54
|
+
const cache = new Map();
|
|
55
|
+
class ArchiveDB {
|
|
56
|
+
constructor(dbPath, tokenizer) {
|
|
57
|
+
this.dbPath = dbPath;
|
|
58
|
+
this.tokenizer = tokenizer;
|
|
59
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
60
|
+
this.db = new node_sqlite_1.DatabaseSync(dbPath);
|
|
61
|
+
this.db.exec('PRAGMA journal_mode=WAL');
|
|
62
|
+
this.db.exec('PRAGMA synchronous=NORMAL');
|
|
63
|
+
this.db.exec('PRAGMA foreign_keys=ON');
|
|
64
|
+
// All sessions of an agent reindex the SAME kb.sqlite; concurrent reindex
|
|
65
|
+
// subprocesses would otherwise hit SQLITE_BUSY immediately. Wait instead of
|
|
66
|
+
// failing so a losing writer completes rather than silently no-opping.
|
|
67
|
+
this.db.exec('PRAGMA busy_timeout=5000');
|
|
68
|
+
this._initSchema();
|
|
69
|
+
this.stmts = {
|
|
70
|
+
getSource: this.db.prepare('SELECT id, path, hash, mtime, size, source FROM kb_sources WHERE path = ?'),
|
|
71
|
+
upsertSource: this.db.prepare(`INSERT INTO kb_sources (path, hash, mtime, size, source) VALUES (?, ?, ?, ?, ?)
|
|
72
|
+
ON CONFLICT(path) DO UPDATE SET hash=excluded.hash, mtime=excluded.mtime, size=excluded.size, source=excluded.source`),
|
|
73
|
+
deleteSource: this.db.prepare('DELETE FROM kb_sources WHERE path = ?'),
|
|
74
|
+
insertChunk: this.db.prepare(`INSERT INTO kb_chunks (id, path, start_line, end_line, text, updated_at, entry_hash) VALUES (?, ?, ?, ?, ?, ?, ?)`),
|
|
75
|
+
insertRecall: this.db.prepare(`INSERT INTO kb_chunk_recall (chunk_id, importance, triggers, project_key) VALUES (?, ?, ?, ?)`),
|
|
76
|
+
insertProvenance: this.db.prepare(`INSERT INTO kb_chunk_provenance (chunk_id, origin_class, session_kind, observed_at, supersedes_key)
|
|
77
|
+
VALUES (?, ?, ?, ?, ?)`),
|
|
78
|
+
// Age survives reindex: first_seen is written ONCE (never reset); a later
|
|
79
|
+
// reindex of the same entry only refreshes its current path (planning-66).
|
|
80
|
+
upsertLifecycle: this.db.prepare(`INSERT INTO kb_entry_lifecycle (entry_hash, path, first_seen) VALUES (?, ?, ?)
|
|
81
|
+
ON CONFLICT(entry_hash) DO UPDATE SET path = excluded.path`),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
static forPath(dbPath, tokenizer = 'unicode61') {
|
|
85
|
+
const abs = path.resolve(dbPath);
|
|
86
|
+
if (!cache.has(abs))
|
|
87
|
+
cache.set(abs, new ArchiveDB(abs, tokenizer));
|
|
88
|
+
return cache.get(abs);
|
|
89
|
+
}
|
|
90
|
+
static evict(dbPath) {
|
|
91
|
+
const inst = cache.get(path.resolve(dbPath));
|
|
92
|
+
if (inst)
|
|
93
|
+
inst.close(); // closes the handle + removes it from the cache
|
|
94
|
+
}
|
|
95
|
+
_initSchema() {
|
|
96
|
+
// FTS5 tokenizer is a trusted, enum-validated value (resolveArchiveConfig),
|
|
97
|
+
// never raw user input — safe to interpolate into the CREATE. NOTE (K0
|
|
98
|
+
// limitation): the FTS vtable is created with IF NOT EXISTS, so an existing
|
|
99
|
+
// kb.sqlite keeps its ORIGINAL tokenizer — changing `tokenizer` in config does
|
|
100
|
+
// not retokenize a built index. A later phase (planning-64) will persist the
|
|
101
|
+
// config signature in kb_index_state and force a rebuild when it changes.
|
|
102
|
+
const tok = this.tokenizer.replace(/[^a-z0-9]/g, '') || 'unicode61';
|
|
103
|
+
this.db.exec(`
|
|
104
|
+
CREATE TABLE IF NOT EXISTS kb_sources (
|
|
105
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
106
|
+
path TEXT NOT NULL UNIQUE,
|
|
107
|
+
hash TEXT NOT NULL,
|
|
108
|
+
mtime REAL NOT NULL,
|
|
109
|
+
size INTEGER NOT NULL,
|
|
110
|
+
source TEXT NOT NULL DEFAULT 'memory'
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
CREATE TABLE IF NOT EXISTS kb_chunks (
|
|
114
|
+
rowid_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
115
|
+
id TEXT NOT NULL UNIQUE,
|
|
116
|
+
path TEXT NOT NULL,
|
|
117
|
+
start_line INTEGER NOT NULL,
|
|
118
|
+
end_line INTEGER NOT NULL,
|
|
119
|
+
text TEXT NOT NULL,
|
|
120
|
+
updated_at INTEGER NOT NULL,
|
|
121
|
+
entry_hash TEXT
|
|
122
|
+
);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_kb_chunks_path ON kb_chunks(path);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_kb_chunks_entry_hash ON kb_chunks(entry_hash);
|
|
125
|
+
|
|
126
|
+
CREATE TABLE IF NOT EXISTS kb_chunk_recall (
|
|
127
|
+
chunk_id TEXT PRIMARY KEY,
|
|
128
|
+
importance INTEGER CHECK (importance IS NULL OR importance BETWEEN 1 AND 10),
|
|
129
|
+
triggers TEXT,
|
|
130
|
+
project_key TEXT,
|
|
131
|
+
FOREIGN KEY (chunk_id) REFERENCES kb_chunks(id) ON DELETE CASCADE
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
CREATE TABLE IF NOT EXISTS kb_chunk_provenance (
|
|
135
|
+
chunk_id TEXT PRIMARY KEY,
|
|
136
|
+
origin_class TEXT NOT NULL CHECK (origin_class IN ('owner','agent','untrusted','system')),
|
|
137
|
+
session_kind TEXT NOT NULL CHECK (session_kind IN ('interactive','cron','heartbeat','subagent','unknown')),
|
|
138
|
+
observed_at INTEGER NOT NULL,
|
|
139
|
+
supersedes_key TEXT,
|
|
140
|
+
FOREIGN KEY (chunk_id) REFERENCES kb_chunks(id) ON DELETE CASCADE
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
-- Per-ENTRY lifecycle (planning-66). Deliberately NOT a FK-cascade child of
|
|
144
|
+
-- kb_chunks: reindex does delete-then-insert of chunks, which would wipe any
|
|
145
|
+
-- cascade child — so age/recall/invalidation must live in a standalone table
|
|
146
|
+
-- keyed by the stable entry_hash (sha256 of normalized block text), which
|
|
147
|
+
-- survives re-chunking. NULL invalid_at = live; a stamp = soft-invalidated
|
|
148
|
+
-- (Zep bi-temporal: still indexed + searchable, never hard-deleted).
|
|
149
|
+
CREATE TABLE IF NOT EXISTS kb_entry_lifecycle (
|
|
150
|
+
entry_hash TEXT PRIMARY KEY,
|
|
151
|
+
path TEXT NOT NULL,
|
|
152
|
+
first_seen INTEGER NOT NULL,
|
|
153
|
+
last_retrieved INTEGER,
|
|
154
|
+
retrieval_count INTEGER NOT NULL DEFAULT 0,
|
|
155
|
+
superseded_by TEXT,
|
|
156
|
+
invalid_at INTEGER
|
|
157
|
+
);
|
|
158
|
+
CREATE INDEX IF NOT EXISTS idx_kb_lifecycle_invalid ON kb_entry_lifecycle(invalid_at);
|
|
159
|
+
CREATE INDEX IF NOT EXISTS idx_kb_lifecycle_superseded ON kb_entry_lifecycle(superseded_by);
|
|
160
|
+
|
|
161
|
+
-- Append-only retrieval log (planning-66). The Bun read path appends a row
|
|
162
|
+
-- per memory_search hit (fire-and-forget); the Node side folds it into
|
|
163
|
+
-- kb_entry_lifecycle.last_retrieved/retrieval_count at GC time, then clears
|
|
164
|
+
-- the folded rows. Keyed by the stable entry_hash, never the line-based id.
|
|
165
|
+
CREATE TABLE IF NOT EXISTS kb_retrieval_log (
|
|
166
|
+
rowid_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
167
|
+
entry_hash TEXT NOT NULL,
|
|
168
|
+
retrieved_at INTEGER NOT NULL
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS kb_chunks_fts USING fts5(
|
|
172
|
+
text,
|
|
173
|
+
content='kb_chunks',
|
|
174
|
+
content_rowid='rowid_id',
|
|
175
|
+
tokenize='${tok}'
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
-- INVARIANT: kb_chunks rows are IMMUTABLE — only ever INSERTed or DELETEd
|
|
179
|
+
-- (replaceSource does delete-then-insert, never UPDATE). Hence there is no
|
|
180
|
+
-- AFTER UPDATE trigger and the revision counter bumps on INSERT only. Any
|
|
181
|
+
-- future code that UPDATEs kb_chunks.text MUST add an _au FTS trigger + a
|
|
182
|
+
-- revision bump, or the FTS index will silently desync.
|
|
183
|
+
CREATE TRIGGER IF NOT EXISTS kb_chunks_ai AFTER INSERT ON kb_chunks BEGIN
|
|
184
|
+
INSERT INTO kb_chunks_fts(rowid, text) VALUES (new.rowid_id, new.text);
|
|
185
|
+
END;
|
|
186
|
+
CREATE TRIGGER IF NOT EXISTS kb_chunks_ad AFTER DELETE ON kb_chunks BEGIN
|
|
187
|
+
INSERT INTO kb_chunks_fts(kb_chunks_fts, rowid, text) VALUES ('delete', old.rowid_id, old.text);
|
|
188
|
+
END;
|
|
189
|
+
|
|
190
|
+
-- Single revision counter, bumped on any source/chunk mutation. An
|
|
191
|
+
-- optimistic-concurrency hook for later phases (shadow reindex publish).
|
|
192
|
+
CREATE TABLE IF NOT EXISTS kb_index_state (
|
|
193
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
194
|
+
revision INTEGER NOT NULL
|
|
195
|
+
);
|
|
196
|
+
INSERT OR IGNORE INTO kb_index_state (id, revision) VALUES (1, 0);
|
|
197
|
+
|
|
198
|
+
CREATE TRIGGER IF NOT EXISTS kb_sources_rev AFTER INSERT ON kb_sources BEGIN
|
|
199
|
+
UPDATE kb_index_state SET revision = revision + 1 WHERE id = 1;
|
|
200
|
+
END;
|
|
201
|
+
CREATE TRIGGER IF NOT EXISTS kb_sources_rev_u AFTER UPDATE ON kb_sources BEGIN
|
|
202
|
+
UPDATE kb_index_state SET revision = revision + 1 WHERE id = 1;
|
|
203
|
+
END;
|
|
204
|
+
CREATE TRIGGER IF NOT EXISTS kb_sources_rev_d AFTER DELETE ON kb_sources BEGIN
|
|
205
|
+
UPDATE kb_index_state SET revision = revision + 1 WHERE id = 1;
|
|
206
|
+
END;
|
|
207
|
+
CREATE TRIGGER IF NOT EXISTS kb_chunks_rev AFTER INSERT ON kb_chunks BEGIN
|
|
208
|
+
UPDATE kb_index_state SET revision = revision + 1 WHERE id = 1;
|
|
209
|
+
END;
|
|
210
|
+
`);
|
|
211
|
+
// Idempotent column migration (planning-66): a kb.sqlite built before the
|
|
212
|
+
// entry_hash column exists keeps its rows via CREATE TABLE IF NOT EXISTS, but
|
|
213
|
+
// the new column is absent. Add it in place (nullable, no default) so the
|
|
214
|
+
// insert/read statements below don't fail on an upgraded DB. The lifecycle +
|
|
215
|
+
// retrieval-log tables above are new, so IF NOT EXISTS creates them cleanly.
|
|
216
|
+
const cols = this.db.prepare(`PRAGMA table_info(kb_chunks)`).all();
|
|
217
|
+
if (!cols.some((c) => c.name === 'entry_hash')) {
|
|
218
|
+
this.db.exec(`ALTER TABLE kb_chunks ADD COLUMN entry_hash TEXT`);
|
|
219
|
+
this.db.exec(`CREATE INDEX IF NOT EXISTS idx_kb_chunks_entry_hash ON kb_chunks(entry_hash)`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Look up an indexed source by its workspace-relative path. */
|
|
223
|
+
getSource(relPath) {
|
|
224
|
+
const row = this.stmts.getSource.get(relPath);
|
|
225
|
+
if (!row)
|
|
226
|
+
return undefined;
|
|
227
|
+
return {
|
|
228
|
+
id: row.id,
|
|
229
|
+
path: row.path,
|
|
230
|
+
hash: row.hash,
|
|
231
|
+
mtime: row.mtime,
|
|
232
|
+
size: row.size,
|
|
233
|
+
source: row.source,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Replace a file's index atomically: delete its old chunks, upsert the source
|
|
238
|
+
* row, insert the fresh chunks (+ recall + provenance), then upsert the entry
|
|
239
|
+
* lifecycle rows for ALL of the file's blocks. Runs in a transaction so a
|
|
240
|
+
* failure never leaves a half-indexed file.
|
|
241
|
+
*
|
|
242
|
+
* `entryBlocks` (planning-66) is the FULL set of archive-entry blocks in the file
|
|
243
|
+
* — one lifecycle row each — NOT derived from chunks: a single FTS chunk can span
|
|
244
|
+
* several blocks, so per-chunk upsert would miss the inner ones. Empty for
|
|
245
|
+
* non-archive-tier files (evergreen/pinned/shared get no lifecycle).
|
|
246
|
+
*/
|
|
247
|
+
replaceSource(source, chunks, entryBlocks = []) {
|
|
248
|
+
this.db.exec('BEGIN');
|
|
249
|
+
try {
|
|
250
|
+
// Drop old chunks for this path first (cascades recall + provenance + FTS).
|
|
251
|
+
this._deleteChunksForPath(source.path);
|
|
252
|
+
this.stmts.upsertSource.run(source.path, source.hash, source.mtime, source.size, source.source);
|
|
253
|
+
for (const { chunk, recall, provenance, entryHash } of chunks) {
|
|
254
|
+
this.stmts.insertChunk.run(chunk.id, chunk.path, chunk.startLine, chunk.endLine, chunk.text, chunk.updatedAt, entryHash ?? null);
|
|
255
|
+
this.stmts.insertRecall.run(chunk.id, recall.importance, recall.triggers, recall.projectKey);
|
|
256
|
+
this.stmts.insertProvenance.run(chunk.id, provenance.originClass, provenance.sessionKind, provenance.observedAt, provenance.supersedesKey);
|
|
257
|
+
}
|
|
258
|
+
// Entry lifecycle (planning-66): upsert-once first_seen per BLOCK keyed by the
|
|
259
|
+
// stable entry_hash; a re-index only refreshes the current path. Age therefore
|
|
260
|
+
// survives edits and re-chunking (kb_chunks is delete-then-insert, but this
|
|
261
|
+
// standalone table is not a cascade child, so its first_seen is preserved).
|
|
262
|
+
for (const b of entryBlocks) {
|
|
263
|
+
this.stmts.upsertLifecycle.run(b.entryHash, source.path, b.firstSeen);
|
|
264
|
+
}
|
|
265
|
+
this.db.exec('COMMIT');
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
// A failing COMMIT may have already rolled the txn back, so this ROLLBACK
|
|
269
|
+
// can itself throw "no transaction is active" — swallow it so the ORIGINAL
|
|
270
|
+
// error is the one that propagates.
|
|
271
|
+
try {
|
|
272
|
+
this.db.exec('ROLLBACK');
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
/* txn already unwound */
|
|
276
|
+
}
|
|
277
|
+
throw err;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** Remove a source and all its chunks (file disappeared). */
|
|
281
|
+
deleteSource(relPath) {
|
|
282
|
+
this.db.exec('BEGIN');
|
|
283
|
+
try {
|
|
284
|
+
this._deleteChunksForPath(relPath);
|
|
285
|
+
this.stmts.deleteSource.run(relPath);
|
|
286
|
+
this.db.exec('COMMIT');
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
// A failing COMMIT may have already rolled the txn back, so this ROLLBACK
|
|
290
|
+
// can itself throw "no transaction is active" — swallow it so the ORIGINAL
|
|
291
|
+
// error is the one that propagates.
|
|
292
|
+
try {
|
|
293
|
+
this.db.exec('ROLLBACK');
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
/* txn already unwound */
|
|
297
|
+
}
|
|
298
|
+
throw err;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
_deleteChunksForPath(relPath) {
|
|
302
|
+
// Explicit DELETE so the FTS delete-trigger + FK cascades both fire.
|
|
303
|
+
this.db.prepare('DELETE FROM kb_chunks WHERE path = ?').run(relPath);
|
|
304
|
+
}
|
|
305
|
+
/** All indexed source paths. */
|
|
306
|
+
listSourcePaths() {
|
|
307
|
+
const rows = this.db.prepare('SELECT path FROM kb_sources ORDER BY path').all();
|
|
308
|
+
return rows.map((r) => r.path);
|
|
309
|
+
}
|
|
310
|
+
/** Current index revision (bumped on every mutation). */
|
|
311
|
+
getRevision() {
|
|
312
|
+
const row = this.db.prepare('SELECT revision FROM kb_index_state WHERE id = 1').get();
|
|
313
|
+
return row ? row.revision : 0;
|
|
314
|
+
}
|
|
315
|
+
/** Total chunk count (test/introspection helper). */
|
|
316
|
+
chunkCount() {
|
|
317
|
+
const row = this.db.prepare('SELECT COUNT(*) AS n FROM kb_chunks').get();
|
|
318
|
+
return row.n;
|
|
319
|
+
}
|
|
320
|
+
/** Provenance row for a chunk (test/introspection helper). */
|
|
321
|
+
getProvenance(chunkId) {
|
|
322
|
+
const row = this.db
|
|
323
|
+
.prepare('SELECT origin_class, session_kind, observed_at, supersedes_key FROM kb_chunk_provenance WHERE chunk_id = ?')
|
|
324
|
+
.get(chunkId);
|
|
325
|
+
if (!row)
|
|
326
|
+
return undefined;
|
|
327
|
+
return {
|
|
328
|
+
originClass: row.origin_class,
|
|
329
|
+
sessionKind: row.session_kind,
|
|
330
|
+
observedAt: row.observed_at,
|
|
331
|
+
supersedesKey: row.supersedes_key ?? null,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
// ── Entry lifecycle / staleness GC (planning-66) ──────────────────────────
|
|
335
|
+
/** Append a retrieval event (Node-side seed for tests + aggregation symmetry). */
|
|
336
|
+
logRetrieval(entryHash, retrievedAt) {
|
|
337
|
+
this.db
|
|
338
|
+
.prepare('INSERT INTO kb_retrieval_log (entry_hash, retrieved_at) VALUES (?, ?)')
|
|
339
|
+
.run(entryHash, retrievedAt);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Fold the append-only retrieval log into per-entry lifecycle: bump each entry's
|
|
343
|
+
* `last_retrieved` to the newest hit and add the hit count, then delete the
|
|
344
|
+
* folded rows (bounded by the max rowid read, so a concurrent append after this
|
|
345
|
+
* read survives to the next GC). Returns how many log rows were folded. A hit for
|
|
346
|
+
* an entry_hash no longer in lifecycle (its text changed → new hash) updates 0
|
|
347
|
+
* rows and is harmlessly dropped.
|
|
348
|
+
*/
|
|
349
|
+
aggregateRetrievalLog() {
|
|
350
|
+
const rows = this.db
|
|
351
|
+
.prepare('SELECT rowid_id, entry_hash, retrieved_at FROM kb_retrieval_log ORDER BY rowid_id')
|
|
352
|
+
.all();
|
|
353
|
+
if (rows.length === 0)
|
|
354
|
+
return 0;
|
|
355
|
+
const agg = new Map();
|
|
356
|
+
let maxRowId = 0;
|
|
357
|
+
for (const r of rows) {
|
|
358
|
+
maxRowId = Math.max(maxRowId, r.rowid_id);
|
|
359
|
+
const cur = agg.get(r.entry_hash);
|
|
360
|
+
if (cur) {
|
|
361
|
+
cur.max = Math.max(cur.max, r.retrieved_at);
|
|
362
|
+
cur.count += 1;
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
agg.set(r.entry_hash, { max: r.retrieved_at, count: 1 });
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
const upd = this.db.prepare(`UPDATE kb_entry_lifecycle
|
|
369
|
+
SET last_retrieved = MAX(COALESCE(last_retrieved, 0), ?), retrieval_count = retrieval_count + ?
|
|
370
|
+
WHERE entry_hash = ?`);
|
|
371
|
+
this.db.exec('BEGIN');
|
|
372
|
+
try {
|
|
373
|
+
for (const [hash, { max, count }] of agg)
|
|
374
|
+
upd.run(max, count, hash);
|
|
375
|
+
this.db.prepare('DELETE FROM kb_retrieval_log WHERE rowid_id <= ?').run(maxRowId);
|
|
376
|
+
this.db.exec('COMMIT');
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
try {
|
|
380
|
+
this.db.exec('ROLLBACK');
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
/* txn already unwound */
|
|
384
|
+
}
|
|
385
|
+
throw err;
|
|
386
|
+
}
|
|
387
|
+
return rows.length;
|
|
388
|
+
}
|
|
389
|
+
/** All lifecycle rows, joined with the MAX importance across their chunks. */
|
|
390
|
+
listLifecycle() {
|
|
391
|
+
const rows = this.db
|
|
392
|
+
.prepare(`SELECT l.entry_hash, l.path, l.first_seen, l.last_retrieved, l.retrieval_count,
|
|
393
|
+
l.superseded_by, l.invalid_at,
|
|
394
|
+
(SELECT MAX(r.importance) FROM kb_chunks c JOIN kb_chunk_recall r ON r.chunk_id = c.id
|
|
395
|
+
WHERE c.entry_hash = l.entry_hash) AS importance
|
|
396
|
+
FROM kb_entry_lifecycle l`)
|
|
397
|
+
.all();
|
|
398
|
+
return rows.map((r) => ({
|
|
399
|
+
entryHash: r.entry_hash,
|
|
400
|
+
path: r.path,
|
|
401
|
+
firstSeen: r.first_seen,
|
|
402
|
+
lastRetrieved: r.last_retrieved ?? null,
|
|
403
|
+
retrievalCount: r.retrieval_count ?? 0,
|
|
404
|
+
supersededBy: r.superseded_by ?? null,
|
|
405
|
+
invalidAt: r.invalid_at ?? null,
|
|
406
|
+
importance: r.importance ?? null,
|
|
407
|
+
}));
|
|
408
|
+
}
|
|
409
|
+
/** Read one lifecycle row (test/introspection helper). */
|
|
410
|
+
getLifecycle(entryHash) {
|
|
411
|
+
return this.listLifecycle().find((l) => l.entryHash === entryHash);
|
|
412
|
+
}
|
|
413
|
+
/** Mark `entryHash` superseded by `bySpec` (or clear when null). */
|
|
414
|
+
setSuperseded(entryHash, bySpec) {
|
|
415
|
+
this.db
|
|
416
|
+
.prepare('UPDATE kb_entry_lifecycle SET superseded_by = ? WHERE entry_hash = ?')
|
|
417
|
+
.run(bySpec, entryHash);
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Populate the (previously inert) provenance `supersedes_key` for every chunk of
|
|
421
|
+
* a superseded entry — so the search-side provenance reflects supersession too,
|
|
422
|
+
* not just the lifecycle table. Best-effort mirror of {@link setSuperseded}.
|
|
423
|
+
*/
|
|
424
|
+
setSupersedesKeyForEntry(entryHash, key) {
|
|
425
|
+
this.db
|
|
426
|
+
.prepare(`UPDATE kb_chunk_provenance SET supersedes_key = ?
|
|
427
|
+
WHERE chunk_id IN (SELECT id FROM kb_chunks WHERE entry_hash = ?)`)
|
|
428
|
+
.run(key, entryHash);
|
|
429
|
+
}
|
|
430
|
+
/** Stamp (soft-invalidate) or clear an entry's invalidation. */
|
|
431
|
+
stampInvalid(entryHash, invalidAt) {
|
|
432
|
+
this.db
|
|
433
|
+
.prepare('UPDATE kb_entry_lifecycle SET invalid_at = ? WHERE entry_hash = ?')
|
|
434
|
+
.run(invalidAt, entryHash);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Keyword search over chunk text (FTS5 BM25). K0 helper for tests/introspection;
|
|
438
|
+
* the ranked, agent-facing `memory_search` tool is K1. Returns best matches
|
|
439
|
+
* first. Query tokens are quoted so punctuation can't inject FTS syntax.
|
|
440
|
+
*/
|
|
441
|
+
search(query, limit = 10) {
|
|
442
|
+
const match = query
|
|
443
|
+
.split(/[^\p{L}\p{N}_]+/u)
|
|
444
|
+
.filter(Boolean)
|
|
445
|
+
.map((t) => `"${t.replace(/"/g, '""')}"`)
|
|
446
|
+
.join(' ');
|
|
447
|
+
if (!match)
|
|
448
|
+
return [];
|
|
449
|
+
const rows = this.db
|
|
450
|
+
.prepare(`SELECT c.id, c.path, c.start_line, c.end_line, c.text, c.updated_at
|
|
451
|
+
FROM kb_chunks_fts f JOIN kb_chunks c ON c.rowid_id = f.rowid
|
|
452
|
+
WHERE kb_chunks_fts MATCH ? ORDER BY bm25(kb_chunks_fts) LIMIT ?`)
|
|
453
|
+
.all(match, limit);
|
|
454
|
+
return rows.map((r) => ({
|
|
455
|
+
id: r.id,
|
|
456
|
+
path: r.path,
|
|
457
|
+
startLine: r.start_line,
|
|
458
|
+
endLine: r.end_line,
|
|
459
|
+
text: r.text,
|
|
460
|
+
updatedAt: r.updated_at,
|
|
461
|
+
}));
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Close the handle AND drop it from the singleton cache, so a later
|
|
465
|
+
* `forPath(samePath)` opens a fresh handle instead of returning this closed one
|
|
466
|
+
* (whose statements would throw). Mirrors `evict()`.
|
|
467
|
+
*/
|
|
468
|
+
close() {
|
|
469
|
+
this.db.close();
|
|
470
|
+
cache.delete(this.dbPath);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
exports.ArchiveDB = ArchiveDB;
|
|
474
|
+
//# sourceMappingURL=archive-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-db.js","sourceRoot":"","sources":["../../../src/agent/knowledge/archive-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown line-accumulator chunker (planning-64 K0).
|
|
3
|
+
*
|
|
4
|
+
* Splits a file into overlapping, line-aligned chunks sized by an approximate
|
|
5
|
+
* token budget. Mirrors openclaw memory-core's `chunkMarkdown` line accumulator:
|
|
6
|
+
* fill until adding the next line would exceed the char budget, flush, then carry
|
|
7
|
+
* a trailing overlap tail into the next chunk. Line-aligned so `memory_get`
|
|
8
|
+
* excerpts map back to real line ranges. Deterministic — no model calls.
|
|
9
|
+
*/
|
|
10
|
+
export interface Chunk {
|
|
11
|
+
startLine: number;
|
|
12
|
+
endLine: number;
|
|
13
|
+
text: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @param content full file text
|
|
17
|
+
* @param chunkTokens target chunk size in ~tokens
|
|
18
|
+
* @param overlap overlap between consecutive chunks in ~tokens (< chunkTokens)
|
|
19
|
+
*/
|
|
20
|
+
export declare function chunkMarkdown(content: string, chunkTokens: number, overlap: number): Chunk[];
|
|
21
|
+
//# sourceMappingURL=chunk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/chunk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,KAAK;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAoD5F"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Markdown line-accumulator chunker (planning-64 K0).
|
|
4
|
+
*
|
|
5
|
+
* Splits a file into overlapping, line-aligned chunks sized by an approximate
|
|
6
|
+
* token budget. Mirrors openclaw memory-core's `chunkMarkdown` line accumulator:
|
|
7
|
+
* fill until adding the next line would exceed the char budget, flush, then carry
|
|
8
|
+
* a trailing overlap tail into the next chunk. Line-aligned so `memory_get`
|
|
9
|
+
* excerpts map back to real line ranges. Deterministic — no model calls.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.chunkMarkdown = chunkMarkdown;
|
|
13
|
+
/** Rough chars-per-token estimate (matches openclaw's estimate). */
|
|
14
|
+
const CHARS_PER_TOKEN = 4;
|
|
15
|
+
/**
|
|
16
|
+
* @param content full file text
|
|
17
|
+
* @param chunkTokens target chunk size in ~tokens
|
|
18
|
+
* @param overlap overlap between consecutive chunks in ~tokens (< chunkTokens)
|
|
19
|
+
*/
|
|
20
|
+
function chunkMarkdown(content, chunkTokens, overlap) {
|
|
21
|
+
const maxChars = Math.max(32, chunkTokens * CHARS_PER_TOKEN);
|
|
22
|
+
const overlapChars = Math.max(0, overlap * CHARS_PER_TOKEN);
|
|
23
|
+
// Preserve line structure; a file with no trailing newline still yields its lines.
|
|
24
|
+
const lines = content.split('\n');
|
|
25
|
+
const chunks = [];
|
|
26
|
+
// Current chunk accumulator: 1-indexed start line + the lines it holds.
|
|
27
|
+
let startLine = 1;
|
|
28
|
+
let buf = [];
|
|
29
|
+
let bufChars = 0;
|
|
30
|
+
const flush = (endLine) => {
|
|
31
|
+
const text = buf.join('\n').trim();
|
|
32
|
+
if (text.length > 0) {
|
|
33
|
+
chunks.push({ startLine, endLine, text });
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
for (let i = 0; i < lines.length; i++) {
|
|
37
|
+
const line = lines[i];
|
|
38
|
+
const lineNo = i + 1; // 1-indexed
|
|
39
|
+
const addLen = line.length + 1; // +1 for the joining newline
|
|
40
|
+
// Flush before overflowing — but only if the buffer already has content
|
|
41
|
+
// (a single over-long line becomes its own chunk rather than an empty flush).
|
|
42
|
+
if (bufChars > 0 && bufChars + addLen > maxChars) {
|
|
43
|
+
flush(lineNo - 1);
|
|
44
|
+
// Carry an overlap tail: keep trailing lines whose cumulative length stays
|
|
45
|
+
// under overlapChars, but ALWAYS drop at least the first line of the
|
|
46
|
+
// flushed chunk so the window advances (no infinite loop).
|
|
47
|
+
const carry = [];
|
|
48
|
+
let carryChars = 0;
|
|
49
|
+
for (let j = buf.length - 1; j >= 1; j--) {
|
|
50
|
+
const l = buf[j];
|
|
51
|
+
if (carryChars + l.length + 1 > overlapChars)
|
|
52
|
+
break;
|
|
53
|
+
carry.unshift(l);
|
|
54
|
+
carryChars += l.length + 1;
|
|
55
|
+
}
|
|
56
|
+
buf = carry;
|
|
57
|
+
bufChars = carryChars;
|
|
58
|
+
startLine = lineNo - carry.length;
|
|
59
|
+
}
|
|
60
|
+
buf.push(line);
|
|
61
|
+
bufChars += addLen;
|
|
62
|
+
}
|
|
63
|
+
if (bufChars > 0)
|
|
64
|
+
flush(lines.length);
|
|
65
|
+
return chunks;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../src/agent/knowledge/chunk.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAgBH,sCAoDC;AAlED,oEAAoE;AACpE,MAAM,eAAe,GAAG,CAAC,CAAC;AAQ1B;;;;GAIG;AACH,SAAgB,aAAa,CAAC,OAAe,EAAE,WAAmB,EAAE,OAAe;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,GAAG,eAAe,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC,CAAC;IAE5D,mFAAmF;IACnF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,wEAAwE;IACxE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,GAAG,GAAa,EAAE,CAAC;IACvB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,MAAM,KAAK,GAAG,CAAC,OAAe,EAAQ,EAAE;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,6BAA6B;QAE7D,wEAAwE;QACxE,8EAA8E;QAC9E,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;YACjD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAElB,2EAA2E;YAC3E,qEAAqE;YACrE,2DAA2D;YAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjB,IAAI,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY;oBAAE,MAAM;gBACpD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACjB,UAAU,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,CAAC;YACD,GAAG,GAAG,KAAK,CAAC;YACZ,QAAQ,GAAG,UAAU,CAAC;YACtB,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,QAAQ,IAAI,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC;QAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the effective knowledge-archive config for one agent.
|
|
3
|
+
*
|
|
4
|
+
* Precedence mirrors `resolveDreamingConfig`: a per-agent override wins over the
|
|
5
|
+
* global gateway default, which wins over the built-in default. Numeric fields
|
|
6
|
+
* are sanitized (non-finite / out-of-range JSON ⇒ default) so the indexer never
|
|
7
|
+
* chunks with a NaN window.
|
|
8
|
+
*/
|
|
9
|
+
import type { KnowledgeArchiveConfig, ResolvedKnowledgeArchiveCfg, KnowledgeSharedConfig, ResolvedKnowledgeSharedCfg } from './types';
|
|
10
|
+
export declare const ARCHIVE_DEFAULTS: ResolvedKnowledgeArchiveCfg;
|
|
11
|
+
export declare function resolveArchiveConfig(agentCfg?: KnowledgeArchiveConfig, globalCfg?: KnowledgeArchiveConfig): ResolvedKnowledgeArchiveCfg;
|
|
12
|
+
export declare const SHARED_DEFAULTS: ResolvedKnowledgeSharedCfg;
|
|
13
|
+
export declare function resolveSharedConfig(agentCfg?: KnowledgeSharedConfig, globalCfg?: KnowledgeSharedConfig): ResolvedKnowledgeSharedCfg;
|
|
14
|
+
/** Directory for a project's shared vault: <root>/<project>. */
|
|
15
|
+
export declare function sharedVaultDir(cfg: ResolvedKnowledgeSharedCfg): string;
|
|
16
|
+
/** The shared vault's SQLite index path. */
|
|
17
|
+
export declare function sharedDbPath(cfg: ResolvedKnowledgeSharedCfg): string;
|
|
18
|
+
/** The shared vault's notes dir (agents drop shared `*.md` here; indexed to kb.sqlite). */
|
|
19
|
+
export declare function sharedNotesDir(cfg: ResolvedKnowledgeSharedCfg): string;
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/agent/knowledge/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,gBAAgB,EAAE,2BAK9B,CAAC;AAiBF,wBAAgB,oBAAoB,CAClC,QAAQ,CAAC,EAAE,sBAAsB,EACjC,SAAS,CAAC,EAAE,sBAAsB,GACjC,2BAA2B,CAuB7B;AAID,eAAO,MAAM,eAAe,EAAE,0BAM7B,CAAC;AAoBF,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,qBAAqB,EAChC,SAAS,CAAC,EAAE,qBAAqB,GAChC,0BAA0B,CAiB5B;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,0BAA0B,GAAG,MAAM,CAEtE;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,GAAG,EAAE,0BAA0B,GAAG,MAAM,CAEpE;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,GAAG,EAAE,0BAA0B,GAAG,MAAM,CAEtE"}
|