@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.
Files changed (122) hide show
  1. package/README.md +0 -26
  2. package/dist/agents/permissions.d.ts +8 -3
  3. package/dist/agents/permissions.d.ts.map +1 -1
  4. package/dist/auto-search-worker.js +4 -4
  5. package/dist/chunk-embedding-write-worker.js +5 -5
  6. package/dist/{compartment-chunk-embedding-he60aaa2.js → compartment-chunk-embedding-eypvn607.js} +3 -3
  7. package/dist/{conflict-warning-hook-2r32hyx6.js → conflict-warning-hook-a27bhggg.js} +4 -4
  8. package/dist/{context-j7hp43a0.js → context-keb00be8.js} +30 -24
  9. package/dist/{embedding-backfill-dtke6tck.js → embedding-backfill-vddgmem3.js} +5 -5
  10. package/dist/features/magic-context/dreamer/primer-seed.d.ts.map +1 -1
  11. package/dist/features/magic-context/tool-definition-tokens.d.ts +113 -57
  12. package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -1
  13. package/dist/hooks/magic-context/ask-answer-notice.d.ts +25 -0
  14. package/dist/hooks/magic-context/ask-answer-notice.d.ts.map +1 -0
  15. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +1 -1
  16. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  17. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +12 -4
  18. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  19. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  20. package/dist/hooks/magic-context/lkg-measured-request.d.ts.map +1 -1
  21. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -1
  22. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  23. package/dist/hooks/magic-context/protected-tail-boundary.d.ts +8 -0
  24. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
  25. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  26. package/dist/hooks/magic-context/read-session-raw.d.ts +10 -0
  27. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  28. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  29. package/dist/hooks/magic-context/signed-thinking-fit-snapshot.d.ts +42 -0
  30. package/dist/hooks/magic-context/signed-thinking-fit-snapshot.d.ts.map +1 -0
  31. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  32. package/dist/{index-y76rhsnr.js → index-0s8454t2.js} +50 -31
  33. package/dist/{index-1gtfne2c.js → index-2haxh8h3.js} +1 -1
  34. package/dist/{index-m32esgmj.js → index-3d5wnkq7.js} +1 -1
  35. package/dist/{index-jfem3dgz.js → index-7tdtpqrg.js} +5 -1
  36. package/dist/{index-mnnkgq0q.js → index-awcftgmx.js} +7 -49
  37. package/dist/{index-1kbznkft.js → index-axjgxeww.js} +10 -8
  38. package/dist/{index-j32jj2t8.js → index-bhyksfyy.js} +3 -3
  39. package/dist/{index-ksq50rg0.js → index-c9zrgcnt.js} +1 -1
  40. package/dist/index-cfaet9cg.js +405 -0
  41. package/dist/{index-jmq8kfe7.js → index-ebsvmc5s.js} +4 -4
  42. package/dist/{index-66eby7hx.js → index-jcr6pe7z.js} +1 -1
  43. package/dist/{index-syaazvy2.js → index-n18sch77.js} +5 -5
  44. package/dist/{index-a9zvn5fe.js → index-q7ywt6xt.js} +3 -3
  45. package/dist/{index-x6cbrv9h.js → index-szf8r0ba.js} +1 -1
  46. package/dist/{index-rxqr723x.js → index-t6j3qxnd.js} +1 -1
  47. package/dist/{index-11gzxvf4.js → index-y6xpzjzr.js} +98 -48
  48. package/dist/{index-mnhcdfxg.js → index-yrrsp47d.js} +91 -17
  49. package/dist/{index-zy67whjr.js → index-z05n7702.js} +1 -1
  50. package/dist/{index-3svaejkh.js → index-z928hmnp.js} +1 -1
  51. package/dist/{index-ffzhwfzy.js → index-zzrzjnx5.js} +3 -3
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +43 -38
  54. package/dist/{message-fts-rowid-map-e79b7b6x.js → message-fts-rowid-map-9e1getgs.js} +2 -2
  55. package/dist/{message-index-4q8ek2fc.js → message-index-3g966xn7.js} +7 -7
  56. package/dist/{message-index-bounded-rydsg9r5.js → message-index-bounded-vaeqhp9w.js} +7 -7
  57. package/dist/migration-worker.js +4 -4
  58. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  59. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  60. package/dist/{project-embedding-registry-hn529988.js → project-embedding-registry-rstzmb60.js} +4 -4
  61. package/dist/raw-ordinal-warmup-worker.js +6 -6
  62. package/dist/{read-session-chunk-t039f0m5.js → read-session-chunk-z5gnc0zb.js} +4 -4
  63. package/dist/{read-session-raw-aw6jgvwg.js → read-session-raw-s4amywnh.js} +3 -1
  64. package/dist/{recomp-orchestrator-hbm53jj5.js → recomp-orchestrator-qwqeskhq.js} +14 -14
  65. package/dist/{search-hea079d7.js → search-84zfqeky.js} +11 -11
  66. package/dist/{search-archive-weh164mh.js → search-archive-mfabzyn2.js} +5 -5
  67. package/dist/{send-session-notification-gqzkz7da.js → send-session-notification-ygj4mja0.js} +3 -3
  68. package/dist/shared/slow-test.d.ts +7 -0
  69. package/dist/shared/slow-test.d.ts.map +1 -0
  70. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  71. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  72. package/dist/tools/parameter-descriptions.d.ts +6 -6
  73. package/dist/tools/parameter-descriptions.d.ts.map +1 -1
  74. package/dist/{transform-postprocess-phase-0b04tm1p.js → transform-postprocess-phase-hr1ntmjj.js} +14 -14
  75. package/dist/v2/auto-search-worker.js +4 -4
  76. package/dist/v2/chunk-embedding-write-worker.js +5 -5
  77. package/dist/v2/{compartment-chunk-embedding-8jjmcgeg.js → compartment-chunk-embedding-tk6g4q80.js} +3 -3
  78. package/dist/v2/{context-ea3x7smm.js → context-y7wfvdve.js} +106 -50
  79. package/dist/v2/{embedding-backfill-5e74ae0m.js → embedding-backfill-w5qp7t28.js} +5 -5
  80. package/dist/v2/hooks/context.d.ts +4 -0
  81. package/dist/v2/hooks/context.d.ts.map +1 -1
  82. package/dist/v2/{message-fts-rowid-map-n8fdg2ja.js → message-fts-rowid-map-pqk3a55v.js} +2 -2
  83. package/dist/v2/{message-index-bounded-8rcd7qq9.js → message-index-bounded-te303atj.js} +6 -6
  84. package/dist/v2/{message-index-qz9wdp82.js → message-index-fz6b4jeh.js} +6 -6
  85. package/dist/v2/migration-worker.js +4 -4
  86. package/dist/v2/{project-embedding-registry-v38q4xd5.js → project-embedding-registry-e7zftfvj.js} +4 -4
  87. package/dist/v2/raw-ordinal-warmup-worker.js +6 -6
  88. package/dist/v2/{read-session-chunk-wazfyxcg.js → read-session-chunk-knvkq1hf.js} +3 -3
  89. package/dist/v2/{read-session-raw-b70cpwzj.js → read-session-raw-ppjxnqk4.js} +3 -1
  90. package/dist/v2/{recomp-orchestrator-b12zaptj.js → recomp-orchestrator-e8a4jpvr.js} +11 -11
  91. package/dist/v2/{search-archive-x64rtz1z.js → search-archive-vrwgxv6z.js} +4 -4
  92. package/dist/v2/{search-hza9x72a.js → search-hav4dggf.js} +10 -10
  93. package/dist/v2/{send-session-notification-8eqe259v.js → send-session-notification-f8scq6ae.js} +1 -1
  94. package/dist/v2/{server-m4bfaevz.js → server-5brp2rfn.js} +90 -16
  95. package/dist/v2/{server-ppcd1qxh.js → server-6a8pxpxg.js} +7 -49
  96. package/dist/v2/server-7d6m1p2b.js +361 -0
  97. package/dist/v2/{server-zg5y109h.js → server-7weh65vd.js} +45 -27
  98. package/dist/v2/{server-qteg2kt9.js → server-8j2e7t31.js} +1 -1
  99. package/dist/v2/{server-d48x3m4x.js → server-9xbbaekh.js} +1 -1
  100. package/dist/v2/{server-j8h7bsca.js → server-e75vag9d.js} +3 -3
  101. package/dist/v2/{server-132h8twc.js → server-m6yyn961.js} +2 -2
  102. package/dist/v2/{server-62g58aaz.js → server-pw21ypwb.js} +1 -1
  103. package/dist/v2/{server-ad18djzs.js → server-q5z0gag0.js} +1 -1
  104. package/dist/v2/{server-4kjmrjn4.js → server-swvhxhxz.js} +5 -1
  105. package/dist/v2/{server-33nqbqkw.js → server-tfawsj08.js} +5 -5
  106. package/dist/v2/{server-dtp8hcjh.js → server-wxrdher8.js} +1 -1
  107. package/dist/v2/server.js +5 -5
  108. package/dist/v2/{wrapup-orchestrator-3ssd5yy1.js → wrapup-orchestrator-ycs8y6n4.js} +11 -11
  109. package/dist/{wrapup-orchestrator-5vpcd1zx.js → wrapup-orchestrator-f642w8n3.js} +15 -15
  110. package/package.json +4 -4
  111. package/src/agents/permissions.ts +22 -6
  112. package/src/agents/smart-notes-dreamer-gate.golden.json +241 -241
  113. package/src/agents/smart-notes-on.golden.json +4 -4
  114. package/src/config/compaction-accessor-guard.test.ts +0 -5
  115. package/src/config/removed-config-keys.test.ts +12 -26
  116. package/src/shared/announcement.test.ts +55 -59
  117. package/src/shared/prompt-surface-a1-golden.md +6 -7
  118. package/src/shared/slow-test.ts +24 -0
  119. package/src/shared/stable-json-linear.test.ts +18 -10
  120. package/dist/index-j76ah6d7.js +0 -120
  121. package/dist/v2/server-d1dzgvwd.js +0 -120
  122. 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-y76rhsnr.js";
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-mnhcdfxg.js";
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-66eby7hx.js";
36
+ } from "./index-jcr6pe7z.js";
37
37
  import {
38
38
  setRecompStarting2,
39
39
  setRecompTerminal2
40
- } from "./index-ffzhwfzy.js";
40
+ } from "./index-zzrzjnx5.js";
41
41
 
42
42
  // src/hooks/magic-context/wrapup-orchestrator.ts
43
43
  import * as crypto from "node:crypto";
@@ -10,7 +10,7 @@ import {
10
10
  } from "./index-rrv26qjz.js";
11
11
  import {
12
12
  shouldHoldIgnoredNotification
13
- } from "./index-ksq50rg0.js";
13
+ } from "./index-c9zrgcnt.js";
14
14
  import {
15
15
  getErrorMessage
16
16
  } from "./index-y8v6yerm.js";
@@ -24,7 +24,7 @@ import {
24
24
  loadCompartmentChunkEmbeddingsForSearch2,
25
25
  peekCompartmentChunkSearchPool2,
26
26
  warmCompartmentChunkSearchPool2
27
- } from "./index-m32esgmj.js";
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-zy67whjr.js";
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-rxqr723x.js";
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-3svaejkh.js";
68
+ } from "./index-z928hmnp.js";
69
69
  import {
70
70
  cleanSearchText,
71
71
  keywordRelevance,
72
72
  matchedSearchSnippet,
73
73
  getIndexedMessageCorpusSize2
74
- } from "./index-mnnkgq0q.js";
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-x6cbrv9h.js";
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-j76ah6d7.js";
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-t039f0m5.js"));
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;
@@ -5,7 +5,7 @@ import {
5
5
  } from "./index-gzy5w8ya.js";
6
6
  import {
7
7
  runSessionWarmupWorker
8
- } from "./index-jfem3dgz.js";
8
+ } from "./index-7tdtpqrg.js";
9
9
  import {
10
10
  logSlowWriteTransaction
11
11
  } from "./index-t5pck3ss.js";
@@ -15,7 +15,7 @@ import {
15
15
  OpenAICompatibleEmbeddingProvider,
16
16
  getProjectEmbeddingSnapshot2,
17
17
  embedBatchForProject2
18
- } from "./index-zy67whjr.js";
18
+ } from "./index-z05n7702.js";
19
19
  import {
20
20
  isEmbeddingHostBusy2
21
21
  } from "./index-qt1qqasc.js";