pi-fabric 0.92.18 → 0.92.20

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 (61) hide show
  1. package/dist/agents.js +3 -3
  2. package/dist/chunks/chunk-EDL4JDW7.js +184 -0
  3. package/dist/chunks/chunk-EDL4JDW7.js.map +7 -0
  4. package/dist/chunks/{chunk-3KOK4CPR.js → chunk-EFHCXJTV.js} +2 -2
  5. package/dist/chunks/{chunk-RNOPHITP.js → chunk-H6DDV6E2.js} +180 -24
  6. package/dist/chunks/chunk-H6DDV6E2.js.map +7 -0
  7. package/dist/chunks/{chunk-4U5NR5VF.js → chunk-KI4VAMHK.js} +8 -8
  8. package/dist/chunks/{chunk-VHEO26TE.js → chunk-NSTQH46Z.js} +5 -5
  9. package/dist/chunks/{chunk-NIUOPHLB.js → chunk-ROXAXSTJ.js} +2 -2
  10. package/dist/chunks/{chunk-TPLMVELH.js → chunk-VYXFSUWU.js} +4 -4
  11. package/dist/chunks/{chunk-DW5MTOJP.js → chunk-XFSRHUZH.js} +5 -5
  12. package/dist/chunks/{chunk-OP2KTYQB.js → chunk-ZMIJ6AT4.js} +4 -4
  13. package/dist/core/action-registry.js +2 -2
  14. package/dist/entropy/compiler.d.ts +8 -0
  15. package/dist/entropy/compiler.d.ts.map +1 -1
  16. package/dist/entropy/index.js +9 -1
  17. package/dist/entropy/meter.d.ts +10 -0
  18. package/dist/entropy/meter.d.ts.map +1 -1
  19. package/dist/entropy/pool.d.ts +5 -0
  20. package/dist/entropy/pool.d.ts.map +1 -1
  21. package/dist/entropy/sessions.d.ts +12 -1
  22. package/dist/entropy/sessions.d.ts.map +1 -1
  23. package/dist/fabric-runtime-state.js +23 -16
  24. package/dist/fabric-runtime-state.js.map +2 -2
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +36 -19
  27. package/dist/index.js.map +2 -2
  28. package/dist/jev/browser.js +2 -2
  29. package/dist/jev/observation.js +2 -2
  30. package/dist/jev.js +5 -5
  31. package/dist/memory/file-worker.d.ts +15 -0
  32. package/dist/memory/file-worker.d.ts.map +1 -0
  33. package/dist/memory/file-worker.js +44 -0
  34. package/dist/memory/file-worker.js.map +7 -0
  35. package/dist/memory/worker-provider.d.ts +24 -0
  36. package/dist/memory/worker-provider.d.ts.map +1 -0
  37. package/dist/memory/worker-provider.js +18 -0
  38. package/dist/memory/worker-provider.js.map +7 -0
  39. package/dist/providers/jev-provider.js +4 -4
  40. package/dist/residency/host.js +4 -4
  41. package/dist/residency/pi-entry.js +4 -4
  42. package/dist/runtime/typescript-kernel.js +6 -6
  43. package/dist/runtime-state-builtins.d.ts.map +1 -1
  44. package/dist/speculation/stream-tap.d.ts.map +1 -1
  45. package/dist/worker/model-control.d.ts.map +1 -1
  46. package/dist/worker/model-control.js +0 -1
  47. package/dist/worker/model-control.js.map +2 -2
  48. package/dist/worker.js +3 -9
  49. package/dist/worker.js.map +2 -2
  50. package/docs/agents.md +2 -2
  51. package/docs/entropy.md +17 -1
  52. package/docs/memory-recall.md +21 -0
  53. package/package.json +3 -1
  54. package/dist/chunks/chunk-RNOPHITP.js.map +0 -7
  55. /package/dist/chunks/{chunk-3KOK4CPR.js.map → chunk-EFHCXJTV.js.map} +0 -0
  56. /package/dist/chunks/{chunk-4U5NR5VF.js.map → chunk-KI4VAMHK.js.map} +0 -0
  57. /package/dist/chunks/{chunk-VHEO26TE.js.map → chunk-NSTQH46Z.js.map} +0 -0
  58. /package/dist/chunks/{chunk-NIUOPHLB.js.map → chunk-ROXAXSTJ.js.map} +0 -0
  59. /package/dist/chunks/{chunk-TPLMVELH.js.map → chunk-VYXFSUWU.js.map} +0 -0
  60. /package/dist/chunks/{chunk-DW5MTOJP.js.map → chunk-XFSRHUZH.js.map} +0 -0
  61. /package/dist/chunks/{chunk-OP2KTYQB.js.map → chunk-ZMIJ6AT4.js.map} +0 -0
package/dist/agents.js CHANGED
@@ -1,10 +1,10 @@
1
- import {
2
- validateAgentResult
3
- } from "./chunks/chunk-3QECYQGA.js";
4
1
  import {
5
2
  AGENTS_ACTION_DESCRIPTORS,
6
3
  normalizeAgentRunRequest
7
4
  } from "./chunks/chunk-2PZWDVJB.js";
5
+ import {
6
+ validateAgentResult
7
+ } from "./chunks/chunk-3QECYQGA.js";
8
8
  import {
9
9
  actionArgNormalizer
10
10
  } from "./chunks/chunk-NQOEHX62.js";
@@ -0,0 +1,184 @@
1
+ import {
2
+ MemoryProvider
3
+ } from "./chunk-UQ4LTUH4.js";
4
+
5
+ // src/memory/worker-provider.ts
6
+ import path from "node:path";
7
+ import { Worker } from "node:worker_threads";
8
+ var MAX_PENDING_REQUESTS = 64;
9
+ var IDLE_TIMEOUT_MS = 3e4;
10
+ var sameBranch = (left, right) => left.leafId === right.leafId && left.entries.length === right.entries.length && left.entries.every((entry, index) => entry.id === right.entries[index].id);
11
+ var WorkerMemoryProvider = class extends MemoryProvider {
12
+ constructor(workerContext, workerUrl = new URL("../memory/file-worker.js", import.meta.url)) {
13
+ super(workerContext);
14
+ this.workerContext = workerContext;
15
+ this.workerUrl = workerUrl;
16
+ }
17
+ worker;
18
+ active;
19
+ pending = [];
20
+ idleTimer;
21
+ stopping;
22
+ closed = false;
23
+ nextId = 0;
24
+ async invoke(action, args, invocation) {
25
+ invocation.signal?.throwIfAborted();
26
+ if (this.closed) throw new Error("Memory provider is closed");
27
+ if (typeof args.source === "string" && args.source.length > 0 || !["recall", "expand", "sessions"].includes(action)) {
28
+ return super.invoke(action, args, invocation);
29
+ }
30
+ if (this.pending.length + (this.active ? 1 : 0) >= MAX_PENDING_REQUESTS) {
31
+ throw new Error(`Memory request queue is full (${MAX_PENDING_REQUESTS} requests); await outstanding calls`);
32
+ }
33
+ return new Promise((resolve, reject) => {
34
+ const request = {
35
+ id: ++this.nextId,
36
+ action,
37
+ args,
38
+ invocation,
39
+ resolve,
40
+ reject,
41
+ abort: () => {
42
+ if (this.active === request) {
43
+ this.active = void 0;
44
+ void this.retire();
45
+ } else {
46
+ const index = this.pending.indexOf(request);
47
+ if (index >= 0) this.pending.splice(index, 1);
48
+ }
49
+ this.finish(request, false, invocation.signal?.reason ?? new Error("Memory request aborted"));
50
+ this.pump();
51
+ }
52
+ };
53
+ invocation.signal?.addEventListener("abort", request.abort, { once: true });
54
+ this.pending.push(request);
55
+ this.pump();
56
+ });
57
+ }
58
+ snapshot(request) {
59
+ const context = this.workerContext;
60
+ if (request.args.branches === "all" || !context.sessionFile || !context.getLiveBranch) return void 0;
61
+ const selector = request.action === "expand" ? request.args.session : request.args.scope;
62
+ const target = typeof selector === "string" && selector.trim().startsWith("session:") ? selector.trim().slice("session:".length).trim() : request.action === "expand" && typeof selector === "string" ? selector.trim() : void 0;
63
+ if (target !== void 0 && target !== context.sessionId && target !== path.basename(context.sessionFile, ".jsonl") && path.resolve(target) !== path.resolve(context.sessionFile)) return void 0;
64
+ const branch = context.getLiveBranch();
65
+ return {
66
+ leafId: branch.leafId,
67
+ entries: branch.entries.map((entry) => {
68
+ const id = entry !== null && typeof entry === "object" ? entry.id : void 0;
69
+ return typeof id === "string" ? { id } : {};
70
+ })
71
+ };
72
+ }
73
+ start() {
74
+ const { agentDir, cwd, config, sessionId, sessionFile } = this.workerContext;
75
+ const worker = new Worker(this.workerUrl, {
76
+ workerData: { agentDir, cwd, config, sessionId, sessionFile },
77
+ // Eval/stdin-only flags are invalid when Node starts this compiled module file.
78
+ execArgv: process.execArgv.filter((value, index, args) => value !== "--input-type" && args[index - 1] !== "--input-type" && !value.startsWith("--input-type="))
79
+ });
80
+ this.worker = worker;
81
+ worker.on("message", (message) => {
82
+ const request = this.active;
83
+ if (this.worker !== worker || !request || message?.id !== request.id) return;
84
+ try {
85
+ if (message.type === "progress") {
86
+ request.invocation.update(message.text);
87
+ return;
88
+ }
89
+ if (message.type === "error") {
90
+ const error = new Error(message.message);
91
+ error.name = message.name;
92
+ this.active = void 0;
93
+ this.finish(request, false, error);
94
+ } else if (message.type === "result") {
95
+ const branch = this.snapshot(request);
96
+ if (request.branch && (!branch || !sameBranch(request.branch, branch))) {
97
+ throw new Error("Session branch changed during memory retrieval; retry the request");
98
+ }
99
+ this.active = void 0;
100
+ this.finish(request, true, message.value);
101
+ } else {
102
+ throw new Error("Invalid memory worker response");
103
+ }
104
+ this.pump();
105
+ } catch (error) {
106
+ this.failWorker(worker, error);
107
+ }
108
+ });
109
+ worker.once("error", (error) => this.failWorker(worker, error));
110
+ worker.once("exit", (code) => this.failWorker(worker, new Error(`Memory worker exited before completing its request (code ${code})`)));
111
+ return worker;
112
+ }
113
+ finish(request, success, value) {
114
+ request.invocation.signal?.removeEventListener("abort", request.abort);
115
+ if (success) request.resolve(value);
116
+ else request.reject(value);
117
+ }
118
+ failWorker(worker, error) {
119
+ if (this.worker !== worker) return;
120
+ const request = this.active;
121
+ this.active = void 0;
122
+ void this.retire();
123
+ if (request) this.finish(request, false, error);
124
+ }
125
+ pump() {
126
+ if (this.closed || this.active || this.stopping) return;
127
+ const request = this.pending.shift();
128
+ if (!request) {
129
+ this.worker?.unref();
130
+ if (this.worker && !this.idleTimer) {
131
+ this.idleTimer = setTimeout(() => {
132
+ void this.retire();
133
+ }, IDLE_TIMEOUT_MS);
134
+ this.idleTimer.unref();
135
+ }
136
+ return;
137
+ }
138
+ if (this.idleTimer) clearTimeout(this.idleTimer);
139
+ this.idleTimer = void 0;
140
+ this.active = request;
141
+ try {
142
+ request.invocation.signal?.throwIfAborted();
143
+ request.branch = this.snapshot(request);
144
+ const worker = this.worker ?? this.start();
145
+ worker.ref();
146
+ worker.postMessage({ id: request.id, action: request.action, args: request.args, branch: request.branch });
147
+ } catch (error) {
148
+ this.active = void 0;
149
+ void this.retire();
150
+ this.finish(request, false, error);
151
+ this.pump();
152
+ }
153
+ }
154
+ retire() {
155
+ if (this.idleTimer) clearTimeout(this.idleTimer);
156
+ this.idleTimer = void 0;
157
+ const worker = this.worker;
158
+ this.worker = void 0;
159
+ if (!worker) return this.stopping ?? Promise.resolve();
160
+ const stopping = worker.terminate().then(() => {
161
+ }, () => {
162
+ });
163
+ this.stopping = stopping;
164
+ void stopping.then(() => {
165
+ if (this.stopping === stopping) this.stopping = void 0;
166
+ this.pump();
167
+ });
168
+ return stopping;
169
+ }
170
+ async close() {
171
+ this.closed = true;
172
+ const active = this.active;
173
+ this.active = void 0;
174
+ const requests = this.pending.splice(0);
175
+ if (active) requests.unshift(active);
176
+ for (const request of requests) this.finish(request, false, new Error("Memory provider is closed"));
177
+ await this.retire();
178
+ }
179
+ };
180
+
181
+ export {
182
+ WorkerMemoryProvider
183
+ };
184
+ //# sourceMappingURL=chunk-EDL4JDW7.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/memory/worker-provider.ts"],
4
+ "sourcesContent": ["import path from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport type { FabricInvocationContext } from \"../protocol.js\";\nimport { MemoryProvider, type MemoryProviderContext } from \"../providers/memory-provider.js\";\nimport type { LiveSessionBranch } from \"./lineage.js\";\nimport type { MemoryWorkerReply } from \"./file-worker.js\";\n\nconst MAX_PENDING_REQUESTS = 64;\nconst IDLE_TIMEOUT_MS = 30_000;\n\ninterface Request {\n id: number;\n action: string;\n args: Record<string, unknown>;\n invocation: FabricInvocationContext;\n branch?: LiveSessionBranch | undefined;\n abort(): void;\n resolve(value: unknown): void;\n reject(error: unknown): void;\n}\n\nconst sameBranch = (left: LiveSessionBranch, right: LiveSessionBranch): boolean =>\n left.leafId === right.leafId && left.entries.length === right.entries.length &&\n left.entries.every((entry, index) =>\n (entry as { id?: string }).id === (right.entries[index] as { id?: string }).id);\n\n/** Pi-facing file memory: one lazy worker, bounded FIFO, no transcript work on the UI thread. */\nexport class WorkerMemoryProvider extends MemoryProvider {\n private worker: Worker | undefined;\n private active: Request | undefined;\n private readonly pending: Request[] = [];\n private idleTimer: NodeJS.Timeout | undefined;\n private stopping: Promise<void> | undefined;\n private closed = false;\n private nextId = 0;\n\n constructor(\n private readonly workerContext: MemoryProviderContext,\n private readonly workerUrl = new URL(\"../memory/file-worker.js\", import.meta.url),\n ) {\n super(workerContext);\n }\n\n override async invoke(action: string, args: Record<string, unknown>, invocation: FabricInvocationContext): Promise<unknown> {\n invocation.signal?.throwIfAborted();\n if (this.closed) throw new Error(\"Memory provider is closed\");\n // Authorized host adapters contain callbacks and must stay in their owning host.\n if ((typeof args.source === \"string\" && args.source.length > 0) ||\n ![\"recall\", \"expand\", \"sessions\"].includes(action)) {\n return super.invoke(action, args, invocation);\n }\n if (this.pending.length + (this.active ? 1 : 0) >= MAX_PENDING_REQUESTS) {\n throw new Error(`Memory request queue is full (${MAX_PENDING_REQUESTS} requests); await outstanding calls`);\n }\n return new Promise((resolve, reject) => {\n const request: Request = {\n id: ++this.nextId, action, args, invocation, resolve, reject,\n abort: () => {\n if (this.active === request) {\n this.active = undefined;\n void this.retire();\n } else {\n const index = this.pending.indexOf(request);\n if (index >= 0) this.pending.splice(index, 1);\n }\n this.finish(request, false, invocation.signal?.reason ?? new Error(\"Memory request aborted\"));\n this.pump();\n },\n };\n invocation.signal?.addEventListener(\"abort\", request.abort, { once: true });\n this.pending.push(request);\n this.pump();\n });\n }\n\n private snapshot(request: Request): LiveSessionBranch | undefined {\n const context = this.workerContext;\n if (request.args.branches === \"all\" || !context.sessionFile || !context.getLiveBranch) return undefined;\n const selector = request.action === \"expand\" ? request.args.session : request.args.scope;\n const target = typeof selector === \"string\" && selector.trim().startsWith(\"session:\")\n ? selector.trim().slice(\"session:\".length).trim()\n : request.action === \"expand\" && typeof selector === \"string\" ? selector.trim() : undefined;\n if (target !== undefined && target !== context.sessionId &&\n target !== path.basename(context.sessionFile, \".jsonl\") &&\n path.resolve(target) !== path.resolve(context.sessionFile)) return undefined;\n const branch = context.getLiveBranch();\n // Lineage needs IDs only. Never clone tool output, images, or the full transcript to the worker.\n return {\n leafId: branch.leafId,\n entries: branch.entries.map(entry => {\n const id = entry !== null && typeof entry === \"object\" ? (entry as { id?: unknown }).id : undefined;\n return typeof id === \"string\" ? { id } : {};\n }),\n };\n }\n\n private start(): Worker {\n const { agentDir, cwd, config, sessionId, sessionFile } = this.workerContext;\n const worker = new Worker(this.workerUrl, {\n workerData: { agentDir, cwd, config, sessionId, sessionFile },\n // Eval/stdin-only flags are invalid when Node starts this compiled module file.\n execArgv: process.execArgv.filter((value, index, args) =>\n value !== \"--input-type\" && args[index - 1] !== \"--input-type\" && !value.startsWith(\"--input-type=\")),\n });\n this.worker = worker;\n worker.on(\"message\", (message: MemoryWorkerReply) => {\n const request = this.active;\n if (this.worker !== worker || !request || message?.id !== request.id) return;\n try {\n if (message.type === \"progress\") {\n request.invocation.update(message.text);\n return;\n }\n if (message.type === \"error\") {\n const error = new Error(message.message);\n error.name = message.name;\n this.active = undefined;\n this.finish(request, false, error);\n } else if (message.type === \"result\") {\n const branch = this.snapshot(request);\n if (request.branch && (!branch || !sameBranch(request.branch, branch))) {\n throw new Error(\"Session branch changed during memory retrieval; retry the request\");\n }\n this.active = undefined;\n this.finish(request, true, message.value);\n } else {\n throw new Error(\"Invalid memory worker response\");\n }\n this.pump();\n } catch (error) {\n this.failWorker(worker, error);\n }\n });\n worker.once(\"error\", error => this.failWorker(worker, error));\n worker.once(\"exit\", code => this.failWorker(worker, new Error(`Memory worker exited before completing its request (code ${code})`)));\n return worker;\n }\n\n private finish(request: Request, success: boolean, value: unknown): void {\n request.invocation.signal?.removeEventListener(\"abort\", request.abort);\n if (success) request.resolve(value);\n else request.reject(value);\n }\n\n private failWorker(worker: Worker, error: unknown): void {\n if (this.worker !== worker) return;\n const request = this.active;\n this.active = undefined;\n void this.retire();\n if (request) this.finish(request, false, error);\n }\n\n private pump(): void {\n if (this.closed || this.active || this.stopping) return;\n const request = this.pending.shift();\n if (!request) {\n this.worker?.unref();\n if (this.worker && !this.idleTimer) {\n this.idleTimer = setTimeout(() => { void this.retire(); }, IDLE_TIMEOUT_MS);\n this.idleTimer.unref();\n }\n return;\n }\n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = undefined;\n this.active = request;\n try {\n request.invocation.signal?.throwIfAborted();\n request.branch = this.snapshot(request);\n const worker = this.worker ?? this.start();\n worker.ref();\n worker.postMessage({ id: request.id, action: request.action, args: request.args, branch: request.branch });\n } catch (error) {\n this.active = undefined;\n void this.retire();\n this.finish(request, false, error);\n this.pump();\n }\n }\n\n private retire(): Promise<void> {\n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = undefined;\n const worker = this.worker;\n this.worker = undefined;\n if (!worker) return this.stopping ?? Promise.resolve();\n const stopping = worker.terminate().then(() => {}, () => {});\n this.stopping = stopping;\n void stopping.then(() => {\n if (this.stopping === stopping) this.stopping = undefined;\n this.pump();\n });\n return stopping;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n const active = this.active;\n this.active = undefined;\n const requests = this.pending.splice(0);\n if (active) requests.unshift(active);\n for (const request of requests) this.finish(request, false, new Error(\"Memory provider is closed\"));\n await this.retire();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -9,7 +9,7 @@ import {
9
9
  agentParticipantRecords,
10
10
  loadModelUsage,
11
11
  useBudgetLedger
12
- } from "./chunk-4U5NR5VF.js";
12
+ } from "./chunk-KI4VAMHK.js";
13
13
  import {
14
14
  RESIDENT_HOST_FORMAT,
15
15
  residentDeliveryPrefix,
@@ -689,4 +689,4 @@ if (isMain) {
689
689
  export {
690
690
  runResidentHostFromConfigPath
691
691
  };
692
- //# sourceMappingURL=chunk-3KOK4CPR.js.map
692
+ //# sourceMappingURL=chunk-EFHCXJTV.js.map
@@ -220,6 +220,82 @@ var finalizeMeasure = (input, state) => {
220
220
  refs: sortedRefs
221
221
  };
222
222
  };
223
+ var mergeCounts = (target, source) => {
224
+ for (const [key, count] of source) target.set(key, (target.get(key) ?? 0) + count);
225
+ };
226
+ var mergeMeasureState = (target, source) => {
227
+ for (const key of Object.keys(source.totals)) {
228
+ target.totals[key] += source.totals[key];
229
+ }
230
+ target.churnPairs += source.churnPairs;
231
+ target.churnSum += source.churnSum;
232
+ for (const [ref, acc] of source.refs) {
233
+ const into = accumulatorFor(target, ref);
234
+ for (const key of ["calls", "succeeded", "failed", "churnPairs", "churnSum"]) into[key] += acc[key];
235
+ mergeCounts(into.signatures, acc.signatures);
236
+ mergeCounts(into.stages, acc.stages);
237
+ }
238
+ for (const [task, sequences] of source.taskSequences) {
239
+ let into = target.taskSequences.get(task);
240
+ if (!into) target.taskSequences.set(task, into = /* @__PURE__ */ new Map());
241
+ mergeCounts(into, sequences);
242
+ }
243
+ };
244
+ var SessionEntropyMeter = class {
245
+ #windows = /* @__PURE__ */ new Map();
246
+ async measure(windows, input) {
247
+ const reportInput = { ...input, traces: [] };
248
+ const combined = createMeasureState(reportInput);
249
+ const models = /* @__PURE__ */ new Map();
250
+ for (const window of windows) {
251
+ let cached = this.#windows.get(window.file);
252
+ if (cached?.traces !== window.traces) {
253
+ const append = cached && cached.traces.length <= window.traces.length && cached.traces.every((trace, index) => trace === window.traces[index]);
254
+ if (!append) cached = { traces: [], state: createMeasureState({ traces: [] }), models: /* @__PURE__ */ new Map() };
255
+ const entry2 = cached;
256
+ this.#windows.delete(window.file);
257
+ for (let index = entry2.traces.length; index < window.traces.length; index++) {
258
+ const trace = window.traces[index];
259
+ accumulateTrace(entry2.state, trace);
260
+ entry2.state.totals.traces++;
261
+ if (trace.model) {
262
+ let model = entry2.models.get(trace.model);
263
+ if (!model) entry2.models.set(trace.model, model = createMeasureState({ traces: [] }));
264
+ accumulateTrace(model, trace);
265
+ model.totals.traces++;
266
+ }
267
+ if ((index + 1) % COOPERATIVE_TRACE_CHUNK === 0) await yieldToLoop();
268
+ }
269
+ entry2.traces = window.traces;
270
+ }
271
+ const entry = cached;
272
+ this.#windows.delete(window.file);
273
+ this.#windows.set(window.file, entry);
274
+ while (this.#windows.size > 16) this.#windows.delete(this.#windows.keys().next().value);
275
+ mergeMeasureState(combined, entry.state);
276
+ for (const [name, source] of entry.models) {
277
+ let model = models.get(name);
278
+ if (!model) models.set(name, model = createMeasureState(reportInput));
279
+ mergeMeasureState(model, source);
280
+ }
281
+ await yieldToLoop();
282
+ }
283
+ const report = finalizeMeasure(reportInput, combined);
284
+ const byModel = [...models.entries()].sort(([a], [b]) => compareCodeUnits(a, b)).map(([model, state]) => {
285
+ const scoped = finalizeMeasure(reportInput, state);
286
+ return {
287
+ model,
288
+ operations: scoped.totals.operations,
289
+ actionOperations: scoped.totals.actionOperations,
290
+ succeeded: scoped.totals.succeeded,
291
+ invocationRejections: scoped.totals.invocationRejections,
292
+ invocationRejectionsPer1k: scoped.totals.invocationRejectionsPer1k,
293
+ behavioralScore: scoped.behavioralScore
294
+ };
295
+ });
296
+ return { ...report, byModel };
297
+ }
298
+ };
223
299
  var measureOnce = (input) => {
224
300
  const state = createMeasureState(input);
225
301
  for (const trace of input.traces) accumulateTrace(state, trace);
@@ -569,26 +645,24 @@ var digestFromIdentityCountsAsync = async (counts) => {
569
645
  const hash = createHash("sha256");
570
646
  hash.update("[");
571
647
  let first = true;
572
- let encodedBatch = [];
573
- const flush = async () => {
574
- if (encodedBatch.length === 0) return;
575
- hash.update(`${first ? "" : ","}${encodedBatch.join(",")}`);
576
- first = false;
577
- encodedBatch = [];
578
- await yieldToLoop2();
579
- };
648
+ let processed = 0;
580
649
  for (const [identity, count] of Object.entries(counts).sort(
581
650
  ([left], [right]) => compareCodeUnits(left, right)
582
651
  )) {
583
652
  const encoded = JSON.stringify(identity);
584
- for (let occurrence = 0; occurrence < count; occurrence += 1) {
585
- encodedBatch.push(encoded);
586
- if (encodedBatch.length >= COOPERATIVE_DIGEST_CHUNK) await flush();
653
+ const batchSize = Math.max(1, Math.floor(32768 / (encoded.length + 1)));
654
+ for (let remaining = count; remaining > 0; ) {
655
+ const size = Math.min(remaining, batchSize, COOPERATIVE_DIGEST_CHUNK - processed);
656
+ hash.update(`${first ? "" : ","}${encoded}${`,${encoded}`.repeat(size - 1)}`);
657
+ first = false;
658
+ remaining -= size;
659
+ processed += size;
660
+ if (processed >= COOPERATIVE_DIGEST_CHUNK) {
661
+ processed = 0;
662
+ await yieldToLoop2();
663
+ }
587
664
  }
588
665
  }
589
- if (encodedBatch.length > 0) {
590
- hash.update(`${first ? "" : ","}${encodedBatch.join(",")}`);
591
- }
592
666
  hash.update("]");
593
667
  return hash.digest("hex");
594
668
  };
@@ -707,7 +781,7 @@ var mergeObservationSummaries = (pool, windows) => {
707
781
  const entry = working.get(entryId);
708
782
  if (entry) enforceValueCap(entry);
709
783
  }
710
- const trackedSession = { file: window.file, digest, counts: fresh };
784
+ const trackedSession = { file: window.file, digest, counts: { ...fresh } };
711
785
  if (existing) {
712
786
  tracked[existingIndex] = trackedSession;
713
787
  } else {
@@ -739,6 +813,36 @@ var mergeObservationWindow = (pool, windows) => mergeObservationSummaries(
739
813
  summary: summarizeObservations(window.observations)
740
814
  }))
741
815
  );
816
+ var SessionObservationCache = class {
817
+ #windows = /* @__PURE__ */ new Map();
818
+ async merge(pool, windows) {
819
+ const summarized = [];
820
+ for (const window of windows) {
821
+ let cached = this.#windows.get(window.file);
822
+ if (cached?.observations !== window.observations) {
823
+ const append = cached && cached.observations.length <= window.observations.length && cached.observations.every((observation, index) => observation === window.observations[index]);
824
+ const counts = append ? { ...cached.counts } : {};
825
+ const digestCounts = append ? { ...cached.digestCounts } : {};
826
+ const start = append ? cached.observations.length : 0;
827
+ for (let index = start; index < window.observations.length; index++) {
828
+ const observation = window.observations[index];
829
+ const identity = observationIdentity(observation);
830
+ counts[identity] = (counts[identity] ?? 0) + (observation.count ?? 1);
831
+ digestCounts[identity] = (digestCounts[identity] ?? 0) + 1;
832
+ if ((index + 1) % COOPERATIVE_OBSERVATION_CHUNK === 0) await yieldToLoop2();
833
+ }
834
+ const digest = append && start === window.observations.length ? cached.summary.digest : await digestFromIdentityCountsAsync(digestCounts);
835
+ cached = { observations: window.observations, counts, digestCounts, summary: { counts, digest } };
836
+ }
837
+ this.#windows.delete(window.file);
838
+ this.#windows.set(window.file, cached);
839
+ while (this.#windows.size > 16) this.#windows.delete(this.#windows.keys().next().value);
840
+ summarized.push({ file: window.file, summary: cached.summary });
841
+ await yieldToLoop2();
842
+ }
843
+ return mergeObservationSummaries(pool, summarized);
844
+ }
845
+ };
742
846
  var mergeObservationWindowAsync = async (pool, windows) => {
743
847
  const summarized = [];
744
848
  for (const window of windows) {
@@ -986,8 +1090,8 @@ var formatEntropyReviewSignal = (proposal) => {
986
1090
  return `${proposal.kind} ${proposal.ref}`;
987
1091
  };
988
1092
  var sortedActions = (surface) => [...surface.actions].sort((a, b) => a.ref < b.ref ? -1 : a.ref > b.ref ? 1 : 0);
989
- var finishCompile = (input, report, plans) => {
990
- const review = entropyReviewSignals({ ...input, report });
1093
+ var finishCompile = (input, report, plans, reviewSignals = true) => {
1094
+ const review = reviewSignals ? entropyReviewSignals({ ...input, report }) : [];
991
1095
  const previous = input.artifact;
992
1096
  const current = previous?.version === COMPILED_SURFACE_VERSION && previous.actions.length === 0 && previous.quarantined.length === 0 && stableJsonHash(previous.normalizations ?? []) === stableJsonHash(plans);
993
1097
  if (current || !previous && plans.length === 0) {
@@ -1009,6 +1113,30 @@ var finishCompile = (input, report, plans) => {
1009
1113
  };
1010
1114
  return { status: "compiled", artifact, report, after: report, proposals: [...proposals, ...review], gate };
1011
1115
  };
1116
+ var BackgroundEntropyCompiler = class {
1117
+ #meter = new SessionEntropyMeter();
1118
+ #plans;
1119
+ async compile(input) {
1120
+ const digest = entropySurfaceHash(input.surface);
1121
+ if (this.#plans?.digest !== digest) {
1122
+ const plans2 = [];
1123
+ let processed = 0;
1124
+ for (const action of sortedActions(input.surface)) {
1125
+ const plan = deriveNormalFormPlan(action.ref, action.inputSchema);
1126
+ if (plan && plans2.length < MAX_NORMAL_FORM_PLANS) plans2.push(plan);
1127
+ if (++processed % 32 === 0) await new Promise((resolve) => setImmediate(resolve));
1128
+ }
1129
+ this.#plans = { digest, plans: plans2 };
1130
+ }
1131
+ const plans = this.#plans.plans;
1132
+ const report = await this.#meter.measure(input.windows, {
1133
+ surface: input.surface,
1134
+ ...input.repairs ? { repairs: input.repairs } : {},
1135
+ catalogDigest: input.catalogDigest ?? digest
1136
+ });
1137
+ return finishCompile({ ...input, traces: [] }, report, structuredClone(plans), false);
1138
+ }
1139
+ };
1012
1140
  var compileEntropySurface = (input) => {
1013
1141
  const report = measureEntropy({ ...input, catalogDigest: input.catalogDigest ?? entropySurfaceHash(input.surface) });
1014
1142
  const plans = [];
@@ -1422,6 +1550,23 @@ var measureSessionCorpus = (input) => {
1422
1550
  }
1423
1551
  return finalizeSessionCorpus(input.files, sessions);
1424
1552
  };
1553
+ var BackgroundSessionSelector = class {
1554
+ constructor(scan = machineSessionFilesAsync) {
1555
+ this.scan = scan;
1556
+ }
1557
+ #cached;
1558
+ async select(agentDir, cwd, currentFile) {
1559
+ const cached = this.#cached;
1560
+ let files;
1561
+ if (cached && cached.agentDir === agentDir && cached.cwd === cwd && Date.now() < cached.until) {
1562
+ files = cached.files;
1563
+ } else {
1564
+ files = await this.scan(agentDir, cwd);
1565
+ this.#cached = files.length > 0 ? { agentDir, cwd, files, until: Date.now() + 3e4 } : void 0;
1566
+ }
1567
+ return currentFile ? [currentFile, ...files.filter((file) => file !== currentFile)].slice(0, DEFAULT_SESSION_WINDOW) : [...files];
1568
+ }
1569
+ };
1425
1570
  var sessionMetadata = async (file) => {
1426
1571
  try {
1427
1572
  const entry = await fs2.promises.stat(file);
@@ -1460,6 +1605,7 @@ var scanSessionRange = async (file, start, end, initialModel) => {
1460
1605
  }
1461
1606
  };
1462
1607
  var evidenceWindow = (file, evidence) => ({
1608
+ traceWindows: [{ file, traces: evidence.traces }],
1463
1609
  traces: evidence.traces,
1464
1610
  valueObservations: evidence.valueObservations,
1465
1611
  auditCalls: evidence.auditCalls,
@@ -1516,20 +1662,24 @@ var readSessionEvidenceAsync = async (file) => {
1516
1662
  }
1517
1663
  return evidenceWindow(file, evidence);
1518
1664
  };
1519
- var sessionWindowEvidenceAsync = async (files) => {
1665
+ var sessionWindowEvidenceAsync = async (files, options = {}) => {
1520
1666
  const windows = await mapConcurrent(files, SESSION_READ_CONCURRENCY, readSessionEvidenceAsync);
1521
1667
  const traces = [];
1522
1668
  const valueObservations = [];
1523
1669
  const auditCalls = [];
1524
1670
  const observationWindows = [];
1671
+ const traceWindows = [];
1525
1672
  for (const window of windows) {
1526
1673
  if (!window) continue;
1527
- traces.push(...window.traces);
1528
- valueObservations.push(...window.valueObservations);
1529
- auditCalls.push(...window.auditCalls);
1674
+ if (!options.windowsOnly) {
1675
+ for (const trace of window.traces) traces.push(trace);
1676
+ for (const observation of window.valueObservations) valueObservations.push(observation);
1677
+ for (const call of window.auditCalls) auditCalls.push(call);
1678
+ }
1530
1679
  observationWindows.push(...window.observationWindows);
1680
+ traceWindows.push(...window.traceWindows);
1531
1681
  }
1532
- return { traces, valueObservations, auditCalls, observationWindows };
1682
+ return { traces, valueObservations, auditCalls, observationWindows, traceWindows };
1533
1683
  };
1534
1684
  var measureSessionCorpusAsync = async (input) => {
1535
1685
  const windows = await mapConcurrent(
@@ -1557,6 +1707,7 @@ var sessionWindowEvidence = (files) => {
1557
1707
  const valueObservations = [];
1558
1708
  const auditCalls = [];
1559
1709
  const observationWindows = [];
1710
+ const traceWindows = [];
1560
1711
  for (const file of files) {
1561
1712
  let text;
1562
1713
  try {
@@ -1569,8 +1720,9 @@ var sessionWindowEvidence = (files) => {
1569
1720
  valueObservations.push(...evidence.valueObservations);
1570
1721
  auditCalls.push(...evidence.auditCalls);
1571
1722
  observationWindows.push({ file, observations: evidence.valueObservations });
1723
+ traceWindows.push({ file, traces: evidence.traces });
1572
1724
  }
1573
- return { traces, valueObservations, auditCalls, observationWindows };
1725
+ return { traces, valueObservations, auditCalls, observationWindows, traceWindows };
1574
1726
  };
1575
1727
 
1576
1728
  // src/entropy/trial.ts
@@ -1677,6 +1829,7 @@ export {
1677
1829
  entropyAuditCallsFromSessionJsonl,
1678
1830
  entropyRepairRows,
1679
1831
  entropyReportHash,
1832
+ SessionEntropyMeter,
1680
1833
  measureEntropy,
1681
1834
  measureEntropyAsync,
1682
1835
  projectSessionFiles,
@@ -1684,6 +1837,7 @@ export {
1684
1837
  projectSessionFilesAsync,
1685
1838
  machineSessionFilesAsync,
1686
1839
  measureSessionCorpus,
1840
+ BackgroundSessionSelector,
1687
1841
  sessionWindowEvidenceAsync,
1688
1842
  measureSessionCorpusAsync,
1689
1843
  sessionWindowEvidence,
@@ -1694,6 +1848,7 @@ export {
1694
1848
  AUTO_APPLY_PROPOSAL_KINDS,
1695
1849
  entropyReviewSignals,
1696
1850
  formatEntropyReviewSignal,
1851
+ BackgroundEntropyCompiler,
1697
1852
  compileEntropySurface,
1698
1853
  compileEntropySurfaceAsync,
1699
1854
  OBSERVATION_POOL_VERSION,
@@ -1703,6 +1858,7 @@ export {
1703
1858
  observationIdentity,
1704
1859
  observationWindowDigest,
1705
1860
  mergeObservationWindow,
1861
+ SessionObservationCache,
1706
1862
  mergeObservationWindowAsync,
1707
1863
  poolToValueObservations,
1708
1864
  observationPoolDirectory,
@@ -1717,4 +1873,4 @@ export {
1717
1873
  formatEntropyCompileNotice,
1718
1874
  runEntropyTrial
1719
1875
  };
1720
- //# sourceMappingURL=chunk-RNOPHITP.js.map
1876
+ //# sourceMappingURL=chunk-H6DDV6E2.js.map