@cortexkit/opencode-magic-context 0.49.23 → 0.49.25
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 +0 -26
- package/dist/agents/permissions.d.ts +8 -3
- package/dist/agents/permissions.d.ts.map +1 -1
- package/dist/auto-search-worker.js +4 -4
- package/dist/chunk-embedding-write-worker.js +5 -5
- package/dist/{compartment-chunk-embedding-he60aaa2.js → compartment-chunk-embedding-eypvn607.js} +3 -3
- package/dist/{conflict-warning-hook-2r32hyx6.js → conflict-warning-hook-a27bhggg.js} +4 -4
- package/dist/{context-j7hp43a0.js → context-keb00be8.js} +30 -24
- package/dist/{embedding-backfill-dtke6tck.js → embedding-backfill-vddgmem3.js} +5 -5
- package/dist/features/magic-context/dreamer/primer-seed.d.ts.map +1 -1
- package/dist/features/magic-context/tool-definition-tokens.d.ts +113 -57
- package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -1
- package/dist/hooks/magic-context/ask-answer-notice.d.ts +25 -0
- package/dist/hooks/magic-context/ask-answer-notice.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +1 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +12 -4
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-measured-request.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
- package/dist/hooks/magic-context/protected-tail-boundary.d.ts +8 -0
- package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-raw.d.ts +10 -0
- package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
- package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/signed-thinking-fit-snapshot.d.ts +42 -0
- package/dist/hooks/magic-context/signed-thinking-fit-snapshot.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/{index-y76rhsnr.js → index-0s8454t2.js} +50 -31
- package/dist/{index-1gtfne2c.js → index-2haxh8h3.js} +1 -1
- package/dist/{index-m32esgmj.js → index-3d5wnkq7.js} +1 -1
- package/dist/{index-jfem3dgz.js → index-7tdtpqrg.js} +5 -1
- package/dist/{index-mnnkgq0q.js → index-awcftgmx.js} +7 -49
- package/dist/{index-1kbznkft.js → index-axjgxeww.js} +10 -8
- package/dist/{index-j32jj2t8.js → index-bhyksfyy.js} +3 -3
- package/dist/{index-ksq50rg0.js → index-c9zrgcnt.js} +1 -1
- package/dist/index-cfaet9cg.js +405 -0
- package/dist/{index-jmq8kfe7.js → index-ebsvmc5s.js} +4 -4
- package/dist/{index-66eby7hx.js → index-jcr6pe7z.js} +1 -1
- package/dist/{index-syaazvy2.js → index-n18sch77.js} +5 -5
- package/dist/{index-a9zvn5fe.js → index-q7ywt6xt.js} +3 -3
- package/dist/{index-x6cbrv9h.js → index-szf8r0ba.js} +1 -1
- package/dist/{index-rxqr723x.js → index-t6j3qxnd.js} +1 -1
- package/dist/{index-11gzxvf4.js → index-y6xpzjzr.js} +98 -48
- package/dist/{index-mnhcdfxg.js → index-yrrsp47d.js} +91 -17
- package/dist/{index-zy67whjr.js → index-z05n7702.js} +1 -1
- package/dist/{index-3svaejkh.js → index-z928hmnp.js} +1 -1
- package/dist/{index-ffzhwfzy.js → index-zzrzjnx5.js} +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -38
- package/dist/{message-fts-rowid-map-e79b7b6x.js → message-fts-rowid-map-9e1getgs.js} +2 -2
- package/dist/{message-index-4q8ek2fc.js → message-index-3g966xn7.js} +7 -7
- package/dist/{message-index-bounded-rydsg9r5.js → message-index-bounded-vaeqhp9w.js} +7 -7
- package/dist/migration-worker.js +4 -4
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/{project-embedding-registry-hn529988.js → project-embedding-registry-rstzmb60.js} +4 -4
- package/dist/raw-ordinal-warmup-worker.js +6 -6
- package/dist/{read-session-chunk-t039f0m5.js → read-session-chunk-z5gnc0zb.js} +4 -4
- package/dist/{read-session-raw-aw6jgvwg.js → read-session-raw-s4amywnh.js} +3 -1
- package/dist/{recomp-orchestrator-hbm53jj5.js → recomp-orchestrator-qwqeskhq.js} +14 -14
- package/dist/{search-hea079d7.js → search-84zfqeky.js} +11 -11
- package/dist/{search-archive-weh164mh.js → search-archive-mfabzyn2.js} +5 -5
- package/dist/{send-session-notification-gqzkz7da.js → send-session-notification-ygj4mja0.js} +3 -3
- package/dist/shared/slow-test.d.ts +7 -0
- package/dist/shared/slow-test.d.ts.map +1 -0
- package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
- package/dist/tools/ctx-note/tools.d.ts.map +1 -1
- package/dist/tools/parameter-descriptions.d.ts +6 -6
- package/dist/tools/parameter-descriptions.d.ts.map +1 -1
- package/dist/{transform-postprocess-phase-0b04tm1p.js → transform-postprocess-phase-hr1ntmjj.js} +14 -14
- package/dist/v2/auto-search-worker.js +4 -4
- package/dist/v2/chunk-embedding-write-worker.js +5 -5
- package/dist/v2/{compartment-chunk-embedding-8jjmcgeg.js → compartment-chunk-embedding-tk6g4q80.js} +3 -3
- package/dist/v2/{context-ea3x7smm.js → context-y7wfvdve.js} +106 -50
- package/dist/v2/{embedding-backfill-5e74ae0m.js → embedding-backfill-w5qp7t28.js} +5 -5
- package/dist/v2/hooks/context.d.ts +4 -0
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/{message-fts-rowid-map-n8fdg2ja.js → message-fts-rowid-map-pqk3a55v.js} +2 -2
- package/dist/v2/{message-index-bounded-8rcd7qq9.js → message-index-bounded-te303atj.js} +6 -6
- package/dist/v2/{message-index-qz9wdp82.js → message-index-fz6b4jeh.js} +6 -6
- package/dist/v2/migration-worker.js +4 -4
- package/dist/v2/{project-embedding-registry-v38q4xd5.js → project-embedding-registry-e7zftfvj.js} +4 -4
- package/dist/v2/raw-ordinal-warmup-worker.js +6 -6
- package/dist/v2/{read-session-chunk-wazfyxcg.js → read-session-chunk-knvkq1hf.js} +3 -3
- package/dist/v2/{read-session-raw-b70cpwzj.js → read-session-raw-ppjxnqk4.js} +3 -1
- package/dist/v2/{recomp-orchestrator-b12zaptj.js → recomp-orchestrator-e8a4jpvr.js} +11 -11
- package/dist/v2/{search-archive-x64rtz1z.js → search-archive-vrwgxv6z.js} +4 -4
- package/dist/v2/{search-hza9x72a.js → search-hav4dggf.js} +10 -10
- package/dist/v2/{send-session-notification-8eqe259v.js → send-session-notification-f8scq6ae.js} +1 -1
- package/dist/v2/{server-m4bfaevz.js → server-5brp2rfn.js} +90 -16
- package/dist/v2/{server-ppcd1qxh.js → server-6a8pxpxg.js} +7 -49
- package/dist/v2/server-7d6m1p2b.js +361 -0
- package/dist/v2/{server-zg5y109h.js → server-7weh65vd.js} +45 -27
- package/dist/v2/{server-qteg2kt9.js → server-8j2e7t31.js} +1 -1
- package/dist/v2/{server-d48x3m4x.js → server-9xbbaekh.js} +1 -1
- package/dist/v2/{server-j8h7bsca.js → server-e75vag9d.js} +3 -3
- package/dist/v2/{server-132h8twc.js → server-m6yyn961.js} +2 -2
- package/dist/v2/{server-62g58aaz.js → server-pw21ypwb.js} +1 -1
- package/dist/v2/{server-ad18djzs.js → server-q5z0gag0.js} +1 -1
- package/dist/v2/{server-4kjmrjn4.js → server-swvhxhxz.js} +5 -1
- package/dist/v2/{server-33nqbqkw.js → server-tfawsj08.js} +5 -5
- package/dist/v2/{server-dtp8hcjh.js → server-wxrdher8.js} +1 -1
- package/dist/v2/server.js +5 -5
- package/dist/v2/{wrapup-orchestrator-3ssd5yy1.js → wrapup-orchestrator-ycs8y6n4.js} +11 -11
- package/dist/{wrapup-orchestrator-5vpcd1zx.js → wrapup-orchestrator-f642w8n3.js} +15 -15
- package/package.json +4 -4
- package/src/agents/permissions.ts +22 -6
- package/src/agents/smart-notes-dreamer-gate.golden.json +241 -241
- package/src/agents/smart-notes-on.golden.json +4 -4
- package/src/config/compaction-accessor-guard.test.ts +0 -5
- package/src/config/removed-config-keys.test.ts +12 -26
- package/src/shared/announcement.test.ts +55 -59
- package/src/shared/prompt-surface-a1-golden.md +6 -7
- package/src/shared/slow-test.ts +24 -0
- package/src/shared/stable-json-linear.test.ts +18 -10
- package/dist/index-j76ah6d7.js +0 -120
- package/dist/v2/server-d1dzgvwd.js +0 -120
- package/src/config/latch-permanence-guard.test.ts +0 -258
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import {
|
|
2
|
+
estimateTokens
|
|
3
|
+
} from "./index-b88dwwrh.js";
|
|
4
|
+
import {
|
|
5
|
+
stableStringify
|
|
6
|
+
} from "./index-x9k3mqrf.js";
|
|
7
|
+
|
|
8
|
+
// src/shared/bounded-session-map.ts
|
|
9
|
+
class BoundedSessionMap {
|
|
10
|
+
maxEntries;
|
|
11
|
+
store = new Map;
|
|
12
|
+
constructor(maxEntries) {
|
|
13
|
+
if (!Number.isFinite(maxEntries) || maxEntries < 1) {
|
|
14
|
+
throw new Error(`BoundedSessionMap: maxEntries must be >= 1, got ${maxEntries}`);
|
|
15
|
+
}
|
|
16
|
+
this.maxEntries = maxEntries;
|
|
17
|
+
}
|
|
18
|
+
get(sessionId) {
|
|
19
|
+
const value = this.store.get(sessionId);
|
|
20
|
+
if (value === undefined)
|
|
21
|
+
return;
|
|
22
|
+
this.store.delete(sessionId);
|
|
23
|
+
this.store.set(sessionId, value);
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
peek(sessionId) {
|
|
27
|
+
return this.store.get(sessionId);
|
|
28
|
+
}
|
|
29
|
+
has(sessionId) {
|
|
30
|
+
return this.store.has(sessionId);
|
|
31
|
+
}
|
|
32
|
+
set(sessionId, value) {
|
|
33
|
+
if (this.store.has(sessionId)) {
|
|
34
|
+
this.store.delete(sessionId);
|
|
35
|
+
} else if (this.store.size >= this.maxEntries) {
|
|
36
|
+
const oldest = this.store.keys().next().value;
|
|
37
|
+
if (oldest !== undefined)
|
|
38
|
+
this.store.delete(oldest);
|
|
39
|
+
}
|
|
40
|
+
this.store.set(sessionId, value);
|
|
41
|
+
}
|
|
42
|
+
delete(sessionId) {
|
|
43
|
+
return this.store.delete(sessionId);
|
|
44
|
+
}
|
|
45
|
+
clear() {
|
|
46
|
+
this.store.clear();
|
|
47
|
+
}
|
|
48
|
+
get size() {
|
|
49
|
+
return this.store.size;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/features/magic-context/tool-definition-tokens.ts
|
|
54
|
+
import { createHash } from "node:crypto";
|
|
55
|
+
var ACTIVITY_WINDOW_MS = 10 * 60000;
|
|
56
|
+
var MAX_ACTIVITY_GAP_MS = 60000;
|
|
57
|
+
var RETIRED_CACHE_LIMIT = 64;
|
|
58
|
+
var WRITE_RETRY_MS = 5000;
|
|
59
|
+
var WINDOWED_SINCE_KEY = "tool_definition_measurements:windowed_since";
|
|
60
|
+
var routes = new Map;
|
|
61
|
+
var sessionFlights = new BoundedSessionMap(1000);
|
|
62
|
+
var persistenceDb = null;
|
|
63
|
+
var windowedSince;
|
|
64
|
+
var boundAt = 0;
|
|
65
|
+
var cachedInsertStmt = null;
|
|
66
|
+
var cachedDeleteStmt = null;
|
|
67
|
+
function agentKey(agentName) {
|
|
68
|
+
return agentName && agentName.length > 0 ? agentName : "default";
|
|
69
|
+
}
|
|
70
|
+
function keyFor(providerID, modelID, agentName) {
|
|
71
|
+
return `${providerID}/${modelID}/${agentKey(agentName)}`;
|
|
72
|
+
}
|
|
73
|
+
function fingerprintFor(description, parameters) {
|
|
74
|
+
return createHash("sha256").update(description).update("\x00").update(stableStringify(parameters)).digest("hex");
|
|
75
|
+
}
|
|
76
|
+
function measure(description, parameters) {
|
|
77
|
+
let paramsText = "";
|
|
78
|
+
try {
|
|
79
|
+
paramsText = parameters === undefined ? "" : JSON.stringify(parameters);
|
|
80
|
+
} catch {
|
|
81
|
+
paramsText = "";
|
|
82
|
+
}
|
|
83
|
+
return estimateTokens(description) + estimateTokens(paramsText);
|
|
84
|
+
}
|
|
85
|
+
function routeFor(providerID, modelID, agentName) {
|
|
86
|
+
const key = keyFor(providerID, modelID, agentName);
|
|
87
|
+
let route = routes.get(key);
|
|
88
|
+
if (!route) {
|
|
89
|
+
route = {
|
|
90
|
+
providerID,
|
|
91
|
+
modelID,
|
|
92
|
+
agentName: agentKey(agentName),
|
|
93
|
+
tools: new Map,
|
|
94
|
+
live: false,
|
|
95
|
+
clock: 0,
|
|
96
|
+
lastWallAt: Date.now(),
|
|
97
|
+
oldestFireAt: Number.POSITIVE_INFINITY,
|
|
98
|
+
retired: new Map,
|
|
99
|
+
legacyRows: new Set
|
|
100
|
+
};
|
|
101
|
+
routes.set(key, route);
|
|
102
|
+
}
|
|
103
|
+
return { key, route };
|
|
104
|
+
}
|
|
105
|
+
function advanceClock(route) {
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
const gap = Math.min(Math.max(now - route.lastWallAt, 0), MAX_ACTIVITY_GAP_MS);
|
|
108
|
+
route.clock += gap;
|
|
109
|
+
route.lastWallAt = Math.max(route.lastWallAt, now);
|
|
110
|
+
return route.clock;
|
|
111
|
+
}
|
|
112
|
+
function counts(route, slot) {
|
|
113
|
+
if (!route.live)
|
|
114
|
+
return true;
|
|
115
|
+
if (slot.legacy)
|
|
116
|
+
return false;
|
|
117
|
+
return slot.lastFireAt >= route.clock - ACTIVITY_WINDOW_MS;
|
|
118
|
+
}
|
|
119
|
+
function currentTools(route) {
|
|
120
|
+
return [...route.tools.entries()].filter(([, slot]) => counts(route, slot));
|
|
121
|
+
}
|
|
122
|
+
function summarize(entries, live) {
|
|
123
|
+
let total = 0;
|
|
124
|
+
for (const [, slot] of entries)
|
|
125
|
+
total += slot.tokens;
|
|
126
|
+
const ids = entries.map(([id]) => id).sort();
|
|
127
|
+
const fingerprints = new Map(entries.map(([id, slot]) => [
|
|
128
|
+
id,
|
|
129
|
+
slot.fingerprint ?? (live ? `stored:${slot.tokens}` : undefined)
|
|
130
|
+
]));
|
|
131
|
+
const complete = ids.every((id) => fingerprints.get(id) !== undefined);
|
|
132
|
+
return {
|
|
133
|
+
total,
|
|
134
|
+
signature: complete ? createHash("sha256").update(JSON.stringify(ids.map((id) => [id, fingerprints.get(id)]))).digest("hex") : undefined,
|
|
135
|
+
hash: ids.length === 0 ? "" : createHash("sha256").update(ids.join("\x00")).digest("hex")
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function resolve(providerID, modelID, agentName, sessionId) {
|
|
139
|
+
if (!providerID || !modelID)
|
|
140
|
+
return;
|
|
141
|
+
const key = keyFor(providerID, modelID, agentName);
|
|
142
|
+
if (sessionId) {
|
|
143
|
+
const flight = sessionFlights.peek(sessionId);
|
|
144
|
+
if (flight?.key === key && flight.exact)
|
|
145
|
+
return flight.exact;
|
|
146
|
+
}
|
|
147
|
+
const route = routes.get(key);
|
|
148
|
+
if (!route)
|
|
149
|
+
return;
|
|
150
|
+
const entries = currentTools(route);
|
|
151
|
+
if (!route.live && entries.length === 0)
|
|
152
|
+
return;
|
|
153
|
+
return summarize(entries, route.live);
|
|
154
|
+
}
|
|
155
|
+
function readWindowedSince(db) {
|
|
156
|
+
try {
|
|
157
|
+
const row = db.prepare("SELECT value FROM schema_migrations_meta WHERE key = ?").get(WINDOWED_SINCE_KEY);
|
|
158
|
+
if (!row)
|
|
159
|
+
return;
|
|
160
|
+
const value = Number(row.value);
|
|
161
|
+
return Number.isFinite(value) ? value : undefined;
|
|
162
|
+
} catch {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function markWindowed() {
|
|
167
|
+
if (windowedSince !== undefined || !persistenceDb)
|
|
168
|
+
return;
|
|
169
|
+
try {
|
|
170
|
+
persistenceDb.prepare("INSERT OR IGNORE INTO schema_migrations_meta (key, value) VALUES (?, ?)").run(WINDOWED_SINCE_KEY, String(boundAt));
|
|
171
|
+
windowedSince = readWindowedSince(persistenceDb);
|
|
172
|
+
} catch {}
|
|
173
|
+
}
|
|
174
|
+
function persistInsert(route, toolID, tokens) {
|
|
175
|
+
if (!persistenceDb)
|
|
176
|
+
return false;
|
|
177
|
+
try {
|
|
178
|
+
cachedInsertStmt ??= persistenceDb.prepare(`INSERT OR REPLACE INTO tool_definition_measurements
|
|
179
|
+
(provider_id, model_id, agent_name, tool_id, token_count, recorded_at)
|
|
180
|
+
VALUES (?, ?, ?, ?, ?, ?)`);
|
|
181
|
+
cachedInsertStmt.run(route.providerID, route.modelID, route.agentName, toolID, tokens, Date.now());
|
|
182
|
+
} catch {
|
|
183
|
+
cachedInsertStmt = null;
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
if (route.legacyRows.delete(toolID) && route.legacyRows.size === 0)
|
|
187
|
+
markWindowed();
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
function persistDelete(route, toolIDs) {
|
|
191
|
+
if (!persistenceDb)
|
|
192
|
+
return false;
|
|
193
|
+
try {
|
|
194
|
+
cachedDeleteStmt ??= persistenceDb.prepare(`DELETE FROM tool_definition_measurements
|
|
195
|
+
WHERE provider_id = ? AND model_id = ? AND agent_name = ?
|
|
196
|
+
AND tool_id IN (SELECT value FROM json_each(?))`);
|
|
197
|
+
cachedDeleteStmt.run(route.providerID, route.modelID, route.agentName, JSON.stringify(toolIDs));
|
|
198
|
+
} catch {
|
|
199
|
+
cachedDeleteStmt = null;
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
for (const id of toolIDs)
|
|
203
|
+
route.legacyRows.delete(id);
|
|
204
|
+
markWindowed();
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
function writeSlot(route, toolID, slot) {
|
|
208
|
+
if (slot.persisted || !persistenceDb)
|
|
209
|
+
return;
|
|
210
|
+
const now = Date.now();
|
|
211
|
+
if (slot.writeFailedAt !== undefined && now - slot.writeFailedAt < WRITE_RETRY_MS)
|
|
212
|
+
return;
|
|
213
|
+
if (persistInsert(route, toolID, slot.tokens)) {
|
|
214
|
+
slot.persisted = true;
|
|
215
|
+
slot.writeFailedAt = undefined;
|
|
216
|
+
} else {
|
|
217
|
+
slot.writeFailedAt = now;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function retire(route, toolID, slot, rowDeleted) {
|
|
221
|
+
if (slot.fingerprint === undefined)
|
|
222
|
+
return;
|
|
223
|
+
route.retired.delete(toolID);
|
|
224
|
+
route.retired.set(toolID, {
|
|
225
|
+
fingerprint: slot.fingerprint,
|
|
226
|
+
tokens: slot.tokens,
|
|
227
|
+
rowKept: slot.persisted && !rowDeleted
|
|
228
|
+
});
|
|
229
|
+
if (route.retired.size > RETIRED_CACHE_LIMIT) {
|
|
230
|
+
const oldest = route.retired.keys().next().value;
|
|
231
|
+
if (oldest !== undefined)
|
|
232
|
+
route.retired.delete(oldest);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function freshSlot(route, toolID, description, parameters, fingerprint, now) {
|
|
236
|
+
const retired = route.retired.get(toolID);
|
|
237
|
+
if (retired)
|
|
238
|
+
route.retired.delete(toolID);
|
|
239
|
+
const reuse = retired?.fingerprint === fingerprint ? retired : undefined;
|
|
240
|
+
return {
|
|
241
|
+
tokens: reuse ? reuse.tokens : measure(description, parameters),
|
|
242
|
+
fingerprint,
|
|
243
|
+
lastFireAt: now,
|
|
244
|
+
legacy: false,
|
|
245
|
+
persisted: reuse?.rowKept === true
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function expire(route) {
|
|
249
|
+
const cutoff = route.clock - ACTIVITY_WINDOW_MS;
|
|
250
|
+
if (route.oldestFireAt >= cutoff)
|
|
251
|
+
return;
|
|
252
|
+
const leaving = [];
|
|
253
|
+
let oldest = Number.POSITIVE_INFINITY;
|
|
254
|
+
for (const entry of route.tools) {
|
|
255
|
+
if (entry[1].lastFireAt >= cutoff)
|
|
256
|
+
oldest = Math.min(oldest, entry[1].lastFireAt);
|
|
257
|
+
else
|
|
258
|
+
leaving.push(entry);
|
|
259
|
+
}
|
|
260
|
+
route.oldestFireAt = oldest;
|
|
261
|
+
if (leaving.length === 0)
|
|
262
|
+
return;
|
|
263
|
+
const deleted = persistDelete(route, leaving.map(([id]) => id));
|
|
264
|
+
for (const [id, slot] of leaving) {
|
|
265
|
+
route.tools.delete(id);
|
|
266
|
+
retire(route, id, slot, deleted);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function setDatabase(db) {
|
|
270
|
+
const rebound = persistenceDb !== null && persistenceDb !== db;
|
|
271
|
+
persistenceDb = db;
|
|
272
|
+
boundAt = Date.now();
|
|
273
|
+
cachedInsertStmt = null;
|
|
274
|
+
cachedDeleteStmt = null;
|
|
275
|
+
if (rebound) {
|
|
276
|
+
for (const route of routes.values()) {
|
|
277
|
+
for (const slot of route.tools.values()) {
|
|
278
|
+
slot.persisted = false;
|
|
279
|
+
slot.writeFailedAt = undefined;
|
|
280
|
+
}
|
|
281
|
+
for (const retired of route.retired.values())
|
|
282
|
+
retired.rowKept = false;
|
|
283
|
+
route.legacyRows.clear();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
windowedSince = readWindowedSince(db);
|
|
287
|
+
if (windowedSince !== undefined)
|
|
288
|
+
return;
|
|
289
|
+
try {
|
|
290
|
+
if (!db.prepare("SELECT 1 FROM tool_definition_measurements LIMIT 1").get())
|
|
291
|
+
markWindowed();
|
|
292
|
+
} catch {}
|
|
293
|
+
}
|
|
294
|
+
function loadToolDefinitionMeasurements(db) {
|
|
295
|
+
let rows = [];
|
|
296
|
+
try {
|
|
297
|
+
rows = db.prepare("SELECT provider_id, model_id, agent_name, tool_id, token_count, recorded_at FROM tool_definition_measurements").all();
|
|
298
|
+
} catch {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const since = readWindowedSince(db);
|
|
302
|
+
const loadedAt = new Map;
|
|
303
|
+
for (const row of rows) {
|
|
304
|
+
const { route } = routeFor(row.provider_id, row.model_id, row.agent_name);
|
|
305
|
+
if (route.live)
|
|
306
|
+
continue;
|
|
307
|
+
let now = loadedAt.get(route);
|
|
308
|
+
if (now === undefined) {
|
|
309
|
+
now = advanceClock(route);
|
|
310
|
+
loadedAt.set(route, now);
|
|
311
|
+
}
|
|
312
|
+
const legacy = since === undefined || !(Number(row.recorded_at) >= since);
|
|
313
|
+
route.tools.set(row.tool_id, {
|
|
314
|
+
tokens: row.token_count,
|
|
315
|
+
fingerprint: undefined,
|
|
316
|
+
lastFireAt: now,
|
|
317
|
+
legacy,
|
|
318
|
+
persisted: !legacy
|
|
319
|
+
});
|
|
320
|
+
route.oldestFireAt = Math.min(route.oldestFireAt, now);
|
|
321
|
+
if (legacy)
|
|
322
|
+
route.legacyRows.add(row.tool_id);
|
|
323
|
+
else
|
|
324
|
+
route.legacyRows.delete(row.tool_id);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function recordToolDefinition(providerID, modelID, agentName, toolID, description, parameters, sessionId) {
|
|
328
|
+
if (!providerID || !modelID || !toolID)
|
|
329
|
+
return;
|
|
330
|
+
const { key, route } = routeFor(providerID, modelID, agentName);
|
|
331
|
+
const now = advanceClock(route);
|
|
332
|
+
if (!route.live) {
|
|
333
|
+
route.live = true;
|
|
334
|
+
for (const slot of route.tools.values())
|
|
335
|
+
if (slot.legacy)
|
|
336
|
+
slot.lastFireAt = now;
|
|
337
|
+
}
|
|
338
|
+
if (sessionId)
|
|
339
|
+
sessionFlights.set(sessionId, { key });
|
|
340
|
+
const fingerprint = fingerprintFor(description ?? "", parameters);
|
|
341
|
+
let slot = route.tools.get(toolID);
|
|
342
|
+
if (slot && slot.fingerprint === fingerprint) {
|
|
343
|
+
slot.lastFireAt = now;
|
|
344
|
+
} else {
|
|
345
|
+
slot = freshSlot(route, toolID, description ?? "", parameters, fingerprint, now);
|
|
346
|
+
route.tools.set(toolID, slot);
|
|
347
|
+
route.oldestFireAt = Math.min(route.oldestFireAt, now);
|
|
348
|
+
}
|
|
349
|
+
writeSlot(route, toolID, slot);
|
|
350
|
+
expire(route);
|
|
351
|
+
}
|
|
352
|
+
function recordToolDefinitionSet(providerID, modelID, agentName, tools, sessionId) {
|
|
353
|
+
if (!providerID || !modelID)
|
|
354
|
+
return;
|
|
355
|
+
const { key, route } = routeFor(providerID, modelID, agentName);
|
|
356
|
+
const now = advanceClock(route);
|
|
357
|
+
route.live = true;
|
|
358
|
+
const next = new Map;
|
|
359
|
+
for (const tool of tools) {
|
|
360
|
+
if (!tool.id)
|
|
361
|
+
continue;
|
|
362
|
+
const fingerprint = fingerprintFor(tool.description ?? "", tool.parameters);
|
|
363
|
+
const previous = route.tools.get(tool.id);
|
|
364
|
+
if (previous && previous.fingerprint === fingerprint) {
|
|
365
|
+
previous.lastFireAt = now;
|
|
366
|
+
next.set(tool.id, previous);
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
next.set(tool.id, freshSlot(route, tool.id, tool.description ?? "", tool.parameters, fingerprint, now));
|
|
370
|
+
}
|
|
371
|
+
const removed = [...route.tools].filter(([id]) => !next.has(id));
|
|
372
|
+
route.tools = next;
|
|
373
|
+
route.oldestFireAt = now;
|
|
374
|
+
if (removed.length > 0) {
|
|
375
|
+
const deleted = persistDelete(route, removed.map(([id]) => id));
|
|
376
|
+
for (const [id, slot] of removed)
|
|
377
|
+
retire(route, id, slot, deleted);
|
|
378
|
+
}
|
|
379
|
+
for (const [toolID, slot] of next)
|
|
380
|
+
writeSlot(route, toolID, slot);
|
|
381
|
+
if (sessionId)
|
|
382
|
+
sessionFlights.set(sessionId, { key, exact: summarize([...next.entries()], true) });
|
|
383
|
+
}
|
|
384
|
+
function getCurrentToolSetHash(providerID, modelID, agentName, sessionId) {
|
|
385
|
+
return resolve(providerID, modelID, agentName, sessionId)?.hash ?? "";
|
|
386
|
+
}
|
|
387
|
+
function getToolDefinitionMeasurementSignature(providerID, modelID, agentName, sessionId) {
|
|
388
|
+
return resolve(providerID, modelID, agentName, sessionId)?.signature;
|
|
389
|
+
}
|
|
390
|
+
function getMeasuredToolDefinitionTokens(providerID, modelID, agentName, sessionId) {
|
|
391
|
+
return resolve(providerID, modelID, agentName, sessionId)?.total;
|
|
392
|
+
}
|
|
393
|
+
function getSessionToolDefinitionTokens(sessionId) {
|
|
394
|
+
if (!sessionId)
|
|
395
|
+
return;
|
|
396
|
+
const flight = sessionFlights.peek(sessionId);
|
|
397
|
+
if (!flight)
|
|
398
|
+
return;
|
|
399
|
+
if (flight.exact)
|
|
400
|
+
return flight.exact.total;
|
|
401
|
+
const route = routes.get(flight.key);
|
|
402
|
+
return route ? summarize(currentTools(route), route.live).total : undefined;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
export { BoundedSessionMap, setDatabase, loadToolDefinitionMeasurements, recordToolDefinition, recordToolDefinitionSet, getCurrentToolSetHash, getToolDefinitionMeasurementSignature, getMeasuredToolDefinitionTokens, getSessionToolDefinitionTokens };
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
getActiveCompartmentRun,
|
|
16
16
|
markActiveCompartmentRunPublished,
|
|
17
17
|
registerActiveCompartmentRun
|
|
18
|
-
} from "./index-
|
|
18
|
+
} from "./index-0s8454t2.js";
|
|
19
19
|
import {
|
|
20
20
|
inRootAsyncContext2
|
|
21
21
|
} from "./index-gzy5w8ya.js";
|
|
@@ -27,17 +27,17 @@ import {
|
|
|
27
27
|
getHistorianFailureState,
|
|
28
28
|
clearEmergencyRecovery,
|
|
29
29
|
prepareRawSessionOrdinals2
|
|
30
|
-
} from "./index-
|
|
30
|
+
} from "./index-yrrsp47d.js";
|
|
31
31
|
import {
|
|
32
32
|
pushNotification2
|
|
33
33
|
} from "./index-x8a7jmkh.js";
|
|
34
34
|
import {
|
|
35
35
|
sendStatusNotification2
|
|
36
|
-
} from "./index-
|
|
36
|
+
} from "./index-jcr6pe7z.js";
|
|
37
37
|
import {
|
|
38
38
|
setRecompStarting2,
|
|
39
39
|
setRecompTerminal2
|
|
40
|
-
} from "./index-
|
|
40
|
+
} from "./index-zzrzjnx5.js";
|
|
41
41
|
|
|
42
42
|
// src/hooks/magic-context/wrapup-orchestrator.ts
|
|
43
43
|
import * as crypto from "node:crypto";
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
loadCompartmentChunkEmbeddingsForSearch2,
|
|
25
25
|
peekCompartmentChunkSearchPool2,
|
|
26
26
|
warmCompartmentChunkSearchPool2
|
|
27
|
-
} from "./index-
|
|
27
|
+
} from "./index-3d5wnkq7.js";
|
|
28
28
|
import {
|
|
29
29
|
recordEmbeddingMeasurement,
|
|
30
30
|
saveCommitEmbedding,
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
enqueueShadowEmbeddingItems2,
|
|
42
42
|
getProjectEmbeddingSnapshot2,
|
|
43
43
|
embedItemsForProject2
|
|
44
|
-
} from "./index-
|
|
44
|
+
} from "./index-z05n7702.js";
|
|
45
45
|
import {
|
|
46
46
|
getProjectEmbeddings2
|
|
47
47
|
} from "./index-4dhv7mqz.js";
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
isEmbeddingEnabled,
|
|
51
51
|
embedText,
|
|
52
52
|
ensureMemoryEmbeddings2
|
|
53
|
-
} from "./index-
|
|
53
|
+
} from "./index-t6j3qxnd.js";
|
|
54
54
|
import {
|
|
55
55
|
ModuleMemoryAuthorityError2,
|
|
56
56
|
getMemoriesByProject2,
|
|
@@ -65,13 +65,13 @@ import {
|
|
|
65
65
|
sanitizeFtsQuery,
|
|
66
66
|
searchMemoriesFTS,
|
|
67
67
|
searchMemoriesFTSUnion
|
|
68
|
-
} from "./index-
|
|
68
|
+
} from "./index-z928hmnp.js";
|
|
69
69
|
import {
|
|
70
70
|
cleanSearchText,
|
|
71
71
|
keywordRelevance,
|
|
72
72
|
matchedSearchSnippet,
|
|
73
73
|
getIndexedMessageCorpusSize2
|
|
74
|
-
} from "./index-
|
|
74
|
+
} from "./index-awcftgmx.js";
|
|
75
75
|
import {
|
|
76
76
|
MESSAGE_FTS_SESSION_FILTER_SQL,
|
|
77
77
|
withMessageFtsSessionFilter
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
} from "./index-fb3zxn06.js";
|
|
45
45
|
import {
|
|
46
46
|
startMessageFtsRowidMapBackfill2
|
|
47
|
-
} from "./index-
|
|
47
|
+
} from "./index-szf8r0ba.js";
|
|
48
48
|
import {
|
|
49
49
|
LKG_SLOT_CHUNKS_DDL,
|
|
50
50
|
SESSION_REPLAY_DECISIONS_DDL,
|
|
@@ -67,7 +67,7 @@ import {
|
|
|
67
67
|
import {
|
|
68
68
|
setDatabase,
|
|
69
69
|
loadToolDefinitionMeasurements
|
|
70
|
-
} from "./index-
|
|
70
|
+
} from "./index-cfaet9cg.js";
|
|
71
71
|
import {
|
|
72
72
|
getErrorMessage
|
|
73
73
|
} from "./index-y8v6yerm.js";
|
|
@@ -1279,7 +1279,7 @@ function finishDatabaseOpen(db, dbPath, explicitDbPath, latestSupportedVersion)
|
|
|
1279
1279
|
state.running = startMessageFtsRowidMapBackfill2(db, signal).then(async () => {
|
|
1280
1280
|
if (signal.aborted || !readsOpenCodeStore)
|
|
1281
1281
|
return;
|
|
1282
|
-
const { readRawSessionMessagePage, readRawSessionMessages } = await importPluginModule(() => import("./read-session-chunk-
|
|
1282
|
+
const { readRawSessionMessagePage, readRawSessionMessages } = await importPluginModule(() => import("./read-session-chunk-z5gnc0zb.js"));
|
|
1283
1283
|
const { startMessageTimeBackfill } = await importPluginModule(() => import("./message-time-backfill-4qva0b4f.js"));
|
|
1284
1284
|
if (signal.aborted)
|
|
1285
1285
|
return;
|