@caupulican/pi-adaptative 0.94.0 → 0.94.1
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/CHANGELOG.md +16 -0
- package/dist/core/agent-paths.d.ts +2 -0
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +7 -0
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +8 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +75 -5
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +15 -0
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +122 -15
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/context/long-term-memory-trigger.d.ts +3 -1
- package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
- package/dist/core/context/long-term-memory-trigger.js +1 -1
- package/dist/core/context/long-term-memory-trigger.js.map +1 -1
- package/dist/core/context/okf-memory-provider.d.ts +3 -0
- package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
- package/dist/core/context/okf-memory-provider.js +66 -31
- package/dist/core/context/okf-memory-provider.js.map +1 -1
- package/dist/core/context/okf-memory.d.ts +18 -1
- package/dist/core/context/okf-memory.d.ts.map +1 -1
- package/dist/core/context/okf-memory.js +48 -0
- package/dist/core/context/okf-memory.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +4 -0
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +1 -1
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.d.ts +10 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +69 -3
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +17 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +78 -10
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/learning/learning-audit.d.ts +5 -1
- package/dist/core/learning/learning-audit.d.ts.map +1 -1
- package/dist/core/learning/learning-audit.js +32 -1
- package/dist/core/learning/learning-audit.js.map +1 -1
- package/dist/core/learning/reflection-engine.d.ts +20 -0
- package/dist/core/learning/reflection-engine.d.ts.map +1 -1
- package/dist/core/learning/reflection-engine.js +58 -0
- package/dist/core/learning/reflection-engine.js.map +1 -1
- package/dist/core/memory/okf-project-memory-store.d.ts +28 -0
- package/dist/core/memory/okf-project-memory-store.d.ts.map +1 -0
- package/dist/core/memory/okf-project-memory-store.js +111 -0
- package/dist/core/memory/okf-project-memory-store.js.map +1 -0
- package/dist/core/memory/providers/file-store.d.ts +42 -1
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +274 -13
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory-controller.d.ts +10 -1
- package/dist/core/memory-controller.d.ts.map +1 -1
- package/dist/core/memory-controller.js +72 -8
- package/dist/core/memory-controller.js.map +1 -1
- package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
- package/dist/core/provider-prompt-contracts.js +9 -19
- package/dist/core/provider-prompt-contracts.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +7 -0
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +94 -15
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts +2 -0
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +4 -0
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +2 -0
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +83 -21
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/tool-task.d.ts +1 -0
- package/dist/core/tools/tool-task.d.ts.map +1 -1
- package/dist/core/tools/tool-task.js +13 -8
- package/dist/core/tools/tool-task.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts +2 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +4 -0
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +2 -0
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +12 -23
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +125 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -23,6 +23,7 @@ const RECORD_KEYS = [
|
|
|
23
23
|
"artifactId",
|
|
24
24
|
"usage",
|
|
25
25
|
"cancellationRequested",
|
|
26
|
+
"terminalDelivery",
|
|
26
27
|
];
|
|
27
28
|
/** Match a goal/task_steps evidence uri to a session background tool task by task id or toolCallId. */
|
|
28
29
|
export function findBackgroundToolTask(records, uri) {
|
|
@@ -165,7 +166,10 @@ function decodeRecord(value, sessionIds) {
|
|
|
165
166
|
typeof value.output !== "string" ||
|
|
166
167
|
(value.artifactId !== undefined &&
|
|
167
168
|
(typeof value.artifactId !== "string" || !/^[0-9a-f]{1,64}$/.test(value.artifactId))) ||
|
|
168
|
-
(value.cancellationRequested !== undefined && typeof value.cancellationRequested !== "boolean")
|
|
169
|
+
(value.cancellationRequested !== undefined && typeof value.cancellationRequested !== "boolean") ||
|
|
170
|
+
(value.terminalDelivery !== undefined &&
|
|
171
|
+
value.terminalDelivery !== "pending" &&
|
|
172
|
+
value.terminalDelivery !== "delivered")) {
|
|
169
173
|
return undefined;
|
|
170
174
|
}
|
|
171
175
|
const usage = value.usage === undefined ? undefined : cloneUsage(value.usage);
|
|
@@ -185,6 +189,7 @@ function decodeRecord(value, sessionIds) {
|
|
|
185
189
|
...(value.artifactId ? { artifactId: value.artifactId } : {}),
|
|
186
190
|
...(usage ? { usage } : {}),
|
|
187
191
|
...(value.cancellationRequested !== undefined ? { cancellationRequested: value.cancellationRequested } : {}),
|
|
192
|
+
...(value.terminalDelivery !== undefined ? { terminalDelivery: value.terminalDelivery } : {}),
|
|
188
193
|
};
|
|
189
194
|
}
|
|
190
195
|
/**
|
|
@@ -196,6 +201,8 @@ export class BackgroundToolTaskController {
|
|
|
196
201
|
this.tasks = new Map();
|
|
197
202
|
this.handoffRequests = new Map();
|
|
198
203
|
this.queuedNotifications = [];
|
|
204
|
+
this.activeNotificationRecords = new Set();
|
|
205
|
+
this.notificationRetryCount = 0;
|
|
199
206
|
this.nextTaskId = 1;
|
|
200
207
|
this.disposed = false;
|
|
201
208
|
this.deps = deps;
|
|
@@ -248,12 +255,27 @@ export class BackgroundToolTaskController {
|
|
|
248
255
|
list() {
|
|
249
256
|
return [...this.tasks.values()].map((state) => ({ ...state.record }));
|
|
250
257
|
}
|
|
258
|
+
/** Model-facing read that consumes terminal delivery without approving its outcome. */
|
|
259
|
+
observe(taskIds) {
|
|
260
|
+
const ids = typeof taskIds === "string" ? [taskIds] : taskIds;
|
|
261
|
+
const states = ids
|
|
262
|
+
? ids.flatMap((taskId) => {
|
|
263
|
+
const state = this.tasks.get(taskId);
|
|
264
|
+
return state === undefined ? [] : [state];
|
|
265
|
+
})
|
|
266
|
+
: [...this.tasks.values()];
|
|
267
|
+
for (const state of states)
|
|
268
|
+
this.observeState(state);
|
|
269
|
+
return states.map((state) => ({ ...state.record }));
|
|
270
|
+
}
|
|
251
271
|
wait(taskId, signal) {
|
|
252
272
|
const state = this.tasks.get(taskId);
|
|
253
273
|
if (!state)
|
|
254
274
|
return Promise.reject(new Error(`Unknown background tool task: ${taskId}`));
|
|
255
|
-
if (state.record.status !== "running")
|
|
275
|
+
if (state.record.status !== "running") {
|
|
276
|
+
this.observeState(state);
|
|
256
277
|
return Promise.resolve({ ...state.record });
|
|
278
|
+
}
|
|
257
279
|
if (signal?.aborted)
|
|
258
280
|
return Promise.resolve({ ...state.record });
|
|
259
281
|
state.waitingConsumers++;
|
|
@@ -273,7 +295,9 @@ export class BackgroundToolTaskController {
|
|
|
273
295
|
clearTimeout(watchdog);
|
|
274
296
|
signal?.removeEventListener("abort", onAbort);
|
|
275
297
|
releaseWaiter();
|
|
276
|
-
|
|
298
|
+
if (record.status !== "running")
|
|
299
|
+
this.observeState(state);
|
|
300
|
+
resolve({ ...state.record });
|
|
277
301
|
};
|
|
278
302
|
const onAbort = () => {
|
|
279
303
|
finishWait(state.record);
|
|
@@ -326,11 +350,20 @@ export class BackgroundToolTaskController {
|
|
|
326
350
|
await Promise.resolve();
|
|
327
351
|
for (;;) {
|
|
328
352
|
const drain = this.notificationDrain;
|
|
329
|
-
if (
|
|
353
|
+
if (drain) {
|
|
354
|
+
await drain;
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
if (this.queuedNotifications.length === 0)
|
|
330
358
|
return;
|
|
331
|
-
|
|
332
|
-
if (
|
|
359
|
+
const retry = this.notificationRetryCompletion;
|
|
360
|
+
if (retry) {
|
|
361
|
+
await retry;
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (this.disposed)
|
|
333
365
|
return;
|
|
366
|
+
this.scheduleNotificationDrain();
|
|
334
367
|
}
|
|
335
368
|
}
|
|
336
369
|
async shutdown() {
|
|
@@ -409,6 +442,8 @@ export class BackgroundToolTaskController {
|
|
|
409
442
|
this.tasks.set(record.taskId, state);
|
|
410
443
|
if (record.status !== "running") {
|
|
411
444
|
state.resolveTerminal(record);
|
|
445
|
+
if (record.terminalDelivery === "pending")
|
|
446
|
+
this.notify(record, true);
|
|
412
447
|
continue;
|
|
413
448
|
}
|
|
414
449
|
this.finishState(state, "failed", "The session resumed after the owning process ended; the original tool completion is unavailable.", undefined, false);
|
|
@@ -452,20 +487,31 @@ export class BackgroundToolTaskController {
|
|
|
452
487
|
...(packed.artifactId ? { artifactId: packed.artifactId } : {}),
|
|
453
488
|
...(usage ? { usage } : {}),
|
|
454
489
|
...(state.cancellationRequested ? { cancellationRequested: true } : {}),
|
|
490
|
+
terminalDelivery: notify ? "pending" : "delivered",
|
|
455
491
|
};
|
|
456
|
-
|
|
457
|
-
|
|
492
|
+
const persisted = this.persist(record);
|
|
493
|
+
const terminalRecord = persisted
|
|
494
|
+
? record
|
|
495
|
+
: {
|
|
496
|
+
...record,
|
|
497
|
+
status: "failed",
|
|
498
|
+
summary: `${record.toolName} failed: terminal result could not be persisted`,
|
|
499
|
+
output: "Background tool result could not be persisted; treat it as unavailable.",
|
|
500
|
+
};
|
|
501
|
+
state.record = terminalRecord;
|
|
458
502
|
if (usage)
|
|
459
503
|
this.deps.recordUsage?.(record.taskId, usage);
|
|
460
|
-
state.resolveTerminal(
|
|
504
|
+
state.resolveTerminal(terminalRecord);
|
|
461
505
|
this.emitLiveTasks();
|
|
462
506
|
this.pruneTerminalTasks();
|
|
463
507
|
if (notify)
|
|
464
|
-
this.notify(
|
|
508
|
+
this.notify(terminalRecord, state.waitingConsumers === 0);
|
|
465
509
|
}
|
|
466
510
|
persist(record) {
|
|
467
511
|
try {
|
|
468
|
-
|
|
512
|
+
const durableRecord = { ...record };
|
|
513
|
+
delete durableRecord.observedAt;
|
|
514
|
+
this.deps.persist(durableRecord);
|
|
469
515
|
return true;
|
|
470
516
|
}
|
|
471
517
|
catch (error) {
|
|
@@ -474,18 +520,62 @@ export class BackgroundToolTaskController {
|
|
|
474
520
|
}
|
|
475
521
|
}
|
|
476
522
|
notify(record, wakeParent) {
|
|
477
|
-
|
|
523
|
+
const notificationRecord = {
|
|
524
|
+
...record,
|
|
525
|
+
...(!wakeParent && !record.observedAt ? { observedAt: this.now().toISOString() } : {}),
|
|
526
|
+
};
|
|
527
|
+
this.activeNotificationRecords.add(notificationRecord);
|
|
528
|
+
this.queuedNotifications.push({ record: notificationRecord, wakeParent });
|
|
478
529
|
this.scheduleNotificationDrain();
|
|
479
530
|
}
|
|
531
|
+
markNotificationDelivered(record) {
|
|
532
|
+
if (record.terminalDelivery !== "pending")
|
|
533
|
+
return;
|
|
534
|
+
const delivered = { ...record, terminalDelivery: "delivered" };
|
|
535
|
+
if (this.persist(delivered)) {
|
|
536
|
+
const state = this.tasks.get(record.taskId);
|
|
537
|
+
if (state && state.record.completedAt === record.completedAt)
|
|
538
|
+
state.record = delivered;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
observeState(state) {
|
|
542
|
+
if (state.record.status === "running" || state.record.observedAt)
|
|
543
|
+
return;
|
|
544
|
+
const observedAt = this.now().toISOString();
|
|
545
|
+
state.record = { ...state.record, observedAt };
|
|
546
|
+
for (const record of this.activeNotificationRecords) {
|
|
547
|
+
if (record.taskId === state.record.taskId && record.completedAt === state.record.completedAt) {
|
|
548
|
+
record.observedAt = observedAt;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
480
552
|
scheduleNotificationDrain() {
|
|
481
|
-
if (this.notificationDrain)
|
|
553
|
+
if (this.disposed || this.notificationDrain || this.notificationRetryTimer)
|
|
482
554
|
return;
|
|
483
555
|
this.notificationDrain = this.drainNotifications().finally(() => {
|
|
484
556
|
this.notificationDrain = undefined;
|
|
485
|
-
if (this.queuedNotifications.length > 0)
|
|
557
|
+
if (this.queuedNotifications.length > 0 && !this.notificationRetryTimer)
|
|
486
558
|
this.scheduleNotificationDrain();
|
|
487
559
|
});
|
|
488
560
|
}
|
|
561
|
+
scheduleNotificationRetry() {
|
|
562
|
+
if (this.disposed || this.notificationRetryTimer)
|
|
563
|
+
return;
|
|
564
|
+
const delayMs = Math.min(100 * 2 ** Math.min(this.notificationRetryCount, 5), 5_000);
|
|
565
|
+
this.notificationRetryCount++;
|
|
566
|
+
this.notificationRetryCompletion = new Promise((resolve) => {
|
|
567
|
+
this.resolveNotificationRetry = resolve;
|
|
568
|
+
});
|
|
569
|
+
this.notificationRetryTimer = setTimeout(() => {
|
|
570
|
+
this.notificationRetryTimer = undefined;
|
|
571
|
+
const resolve = this.resolveNotificationRetry;
|
|
572
|
+
this.resolveNotificationRetry = undefined;
|
|
573
|
+
this.notificationRetryCompletion = undefined;
|
|
574
|
+
resolve?.();
|
|
575
|
+
this.scheduleNotificationDrain();
|
|
576
|
+
}, delayMs);
|
|
577
|
+
this.notificationRetryTimer.unref?.();
|
|
578
|
+
}
|
|
489
579
|
async drainNotifications() {
|
|
490
580
|
// Allow completions released by the same event to reach this queue before forming the batch.
|
|
491
581
|
await Promise.resolve();
|
|
@@ -499,10 +589,27 @@ export class BackgroundToolTaskController {
|
|
|
499
589
|
});
|
|
500
590
|
}
|
|
501
591
|
catch (error) {
|
|
592
|
+
// A rejected handoff is not a delivery receipt. Put the exact records back ahead of
|
|
593
|
+
// newer completions and retry on an event-driven backoff; persistence already contains
|
|
594
|
+
// the terminal, so a transient notifier failure must not make it disappear.
|
|
595
|
+
this.queuedNotifications.unshift(...batch);
|
|
502
596
|
const includedIds = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS).map((record) => record.taskId);
|
|
503
597
|
const omitted = records.length - includedIds.length;
|
|
504
598
|
const suffix = omitted > 0 ? ` (+${omitted} more)` : "";
|
|
505
|
-
|
|
599
|
+
try {
|
|
600
|
+
this.deps.onError?.(`Failed to notify terminal background tool task batch ${includedIds.join(", ")}${suffix}`, error);
|
|
601
|
+
}
|
|
602
|
+
catch {
|
|
603
|
+
// Diagnostics cannot consume the pending terminal handoff.
|
|
604
|
+
}
|
|
605
|
+
this.scheduleNotificationRetry();
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
this.notificationRetryCount = 0;
|
|
609
|
+
for (const record of records)
|
|
610
|
+
this.markNotificationDelivered(record);
|
|
611
|
+
for (const record of records) {
|
|
612
|
+
this.activeNotificationRecords.delete(record);
|
|
506
613
|
}
|
|
507
614
|
}
|
|
508
615
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-tool-task-controller.js","sourceRoot":"","sources":["../../src/core/background-tool-task-controller.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,CAAC,MAAM,qCAAqC,GAAG,MAAM,CAAC;AAC5D,MAAM,CAAC,MAAM,4CAA4C,GAAG,MAAM,CAAC;AACnE,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AAEvE,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,4BAA4B,GAAG,CAAC,CAAC;AACvC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,MAAM,WAAW,GAAG;IACnB,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,WAAW;IACX,aAAa;IACb,wBAAwB;IACxB,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,uBAAuB;CACd,CAAC;AAMX,uGAAuG;AACvG,MAAM,UAAU,sBAAsB,CACrC,OAAqB,EACrB,GAAW;IAEX,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,iCAAiC,CAChD,OAAyC,EACzC,GAAW;IAEX,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAG9C;IACA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACrB,CAAC;AAkED,2GAA2G;AAC3G,MAAM,UAAU,wCAAwC,CACvD,cAAoE;IAEpE,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,IAAI,MAA0B,CAAC;IAC/B,SAAS,CAAC;QACT,MAAM,KAAK,GAAG,cAAc,CAAC,4BAA4B,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;QACpG,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QAC5C,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;IACzB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mCAAmC,CAClD,OAA4C;IAE5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;IAC/G,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjD,OAAO;QACN,UAAU,EAAE,4BAA4B;QACxC,OAAO,EAAE;YACR,mCAAmC;YACnC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,4CAA4C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,mEAAmE;SACnE,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACR,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC,CAAC;SACH;KACD,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAwC;IACvE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,2DAA2D,CAChG,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qCAAqC,CAAC;AACnE,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC7B,OAAO,KAAK;SACV,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,UAAU,CAAC,MAAgC,EAAE,QAAgB,EAAE,MAAc;IACrF,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IACjC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,CAAU,CAAC;IACtF,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAU,CAAC;IACpF,IACC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAC3F,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO;QACN,KAAK,EAAE,KAAK,CAAC,KAAe;QAC5B,MAAM,EAAE,KAAK,CAAC,MAAgB;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAmB;QACpC,UAAU,EAAE,KAAK,CAAC,UAAoB;QACtC,WAAW,EAAE,KAAK,CAAC,WAAqB;QACxC,IAAI,EAAE;YACL,KAAK,EAAE,IAAI,CAAC,KAAe;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAgB;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAmB;YACnC,UAAU,EAAE,IAAI,CAAC,UAAoB;YACrC,KAAK,EAAE,IAAI,CAAC,KAAe;SAC3B;KACD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,UAA+B;IACpE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAChF,IACC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAC5B,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;QAChC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS;QACtC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAC7B,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YAC1B,KAAK,CAAC,MAAM,KAAK,WAAW;YAC5B,KAAK,CAAC,MAAM,KAAK,QAAQ;YACzB,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC;QAC7B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YAC/B,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;QAC/D,OAAO,KAAK,CAAC,sBAAsB,KAAK,QAAQ;QAChD,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC;QAC9C,KAAK,CAAC,sBAAsB,GAAG,CAAC;QAChC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS;YAC9B,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACtF,CAAC,KAAK,CAAC,qBAAqB,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,qBAAqB,KAAK,SAAS,CAAC,EAC9F,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC1D,OAAO;QACN,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5G,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,4BAA4B;IAUxC,YAAY,IAAsC;QARjC,UAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;QACnD,oBAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;QACrD,wBAAmB,GAAqE,EAAE,CAAC;QAGpG,eAAU,GAAG,CAAC,CAAC;QACf,aAAQ,GAAG,KAAK,CAAC;QAGxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,4CAA4C,CAAC;QACxF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,SAAS,CAAC,oEAAoE,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,OAAkC;QACzC,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,aAAa,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,MAAM,GAA6B;YACxC,SAAS;YACT,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;YAC/B,MAAM,EAAE,SAAS;YACjB,SAAS;YACT,sBAAsB,EAAE,OAAO,CAAC,SAAS;YACzC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,4BAA4B;YAC7D,MAAM,EAAE,EAAE;SACV,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,CAAC,UAAU,CAAC,IAAI,CACtB,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,EAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAC5C,CAAC;QAEF,OAAO;YACN,MAAM,EAAE;gBACP,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACL,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,8BAA8B,MAAM,GAAG;4BAClI,0GAA0G;yBAC1G,CAAC,IAAI,CAAC,IAAI,CAAC;qBACZ;iBACD;gBACD,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAkB,EAAE;aAC1D;SACD,CAAC;IACH,CAAC;IAED,IAAI;QACH,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,MAAoB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,MAAM,aAAa,GAAG,GAAS,EAAE;YAChC,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,CAAC;QACF,OAAO,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;YACxD,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,UAAU,GAAG,CAAC,MAAgC,EAAQ,EAAE;gBAC7D,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,aAAa,EAAE,CAAC;gBAChB,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACxB,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAS,EAAE;gBAC1B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC,CAAC;YACF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAChF,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;YACnB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAc;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC9D,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACnC,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC;YACJ,KAAK,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,yCAAyC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uBAAuB,CAAC,UAAkB,EAAE,OAAmB;QAC9D,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,GAAG,EAAc,CAAC;QAC/E,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,GAAG,EAAE;YACX,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,UAAmB;QACjC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,UAAU;YAC3B,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC3E,KAAK,MAAM,OAAO,IAAI,SAAS;YAAE,OAAO,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,oBAAoB;QACzB,iGAAiG;QACjG,yFAAyF;QACzF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,SAAS,CAAC;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACrC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,KAAK,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;QAC9E,CAAC;IACF,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,SAAS;gBAChD,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBACnC,IAAI,CAAC;oBACJ,KAAK,CAAC,MAAM,EAAE,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,yCAAyC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC5F,CAAC;gBACD,IAAI,CAAC,WAAW,CACf,KAAK,EACL,UAAU,EACV,qDAAqD,EACrD,SAAS,EACT,KAAK,CACL,CAAC;YACH,CAAC;QACF,CAAC;QACD,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACnC,CAAC;IAEO,MAAM,CAAC,KAA8B,EAAE,UAAwC;QACtF,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;QACtG,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAEO,cAAc,CAAC,KAA8B,EAAE,KAAc;QACpE,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnE,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAEO,qBAAqB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC;QACvD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACJ,MAAM,GAAG,IAAI,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;YAC7E,OAAO;QACR,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,aAAa,GAA+B,EAAE,CAAC;QACrD,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;gBACrB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;gBACnC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;gBAChC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAC/B,CAAC;gBACF,SAAS;YACV,CAAC;YACD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,aAAa,KAAK,SAAS;gBAAE,SAAS;YAC1C,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC/D,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC5C,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,iBAAiB,GAAG,CAAC,CAAC;QACxC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAE,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC;QAC1F,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC9B,SAAS;YACV,CAAC;YACD,IAAI,CAAC,WAAW,CACf,KAAK,EACL,QAAQ,EACR,kGAAkG,EAClG,SAAS,EACT,KAAK,CACL,CAAC;QACH,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;IAEO,WAAW,CAAC,MAAgC,EAAE,MAAkB;QACvE,IAAI,eAAiF,CAAC;QACtF,MAAM,QAAQ,GAAG,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;YAClE,eAAe,GAAG,OAAO,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO;YACN,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;YACrB,MAAM;YACN,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,KAAK;YAC5D,gBAAgB,EAAE,CAAC;YACnB,QAAQ;YACR,eAAe,EAAE,eAAgB;YACjC,gBAAgB,EAAE,wBAAwB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;SAC7E,CAAC;IACH,CAAC;IAEO,WAAW,CAClB,KAA8B,EAC9B,MAAoD,EACpD,SAAiB,EACjB,KAAwB,EACxB,MAAe;QAEf,MAAM,MAAM,GAAG,cAAc,CAC5B;YACC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;YAC/B,UAAU,EAAE,SAAS;YACrB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YACnC,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,uBAAuB,EAAE;SACpF,EACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAC5B,KAAK,CAAC,gBAAgB,CACtB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU;YAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,QAAQ,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG;YACrE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAClB,MAAM,MAAM,GAA6B;YACxC,GAAG,KAAK,CAAC,MAAM;YACf,MAAM;YACN,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YACrC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC1D,MAAM;YACN,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;QACF,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzD,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,OAAO,CAAC,MAAgC;QAC/C,IAAI,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,0CAA0C,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;YACtF,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAEO,MAAM,CAAC,MAAgC,EAAE,UAAmB;QACnE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC;IAEO,yBAAyB;QAChC,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACnC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/D,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC3E,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC/B,6FAA6F;QAC7F,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;oBACvC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC;iBACjE,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClG,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;gBACpD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAClB,wDAAwD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,EACzF,KAAK,CACL,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAEO,aAAa;QACpB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aACpC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;aACpD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;YACnC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;YAC/B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;SACjC,CAAC,CAAC,CAAC;QACL,IAAI,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACF,CAAC;IAEO,kBAAkB;QACzB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC/F,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,2BAA2B,CAAC,CAAC,EAAE,CAAC;YACnG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;gBAAE,SAAS;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3C,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACxE,KAAK,EAAE,OAAO,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAEO,GAAG;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;IACxC,CAAC;CACD","sourcesContent":["import type {\n\tBackgroundToolCallCompletion,\n\tBackgroundToolCallContext,\n\tBackgroundToolCallHandoff,\n} from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport type { ArtifactStore } from \"./context/context-artifacts.ts\";\nimport { formatArtifactNotice, packToolOutput } from \"./context/tool-output-packer.ts\";\nimport { hasOnlyKeys, isPlainRecord } from \"./util/value-guards.ts\";\n\nexport const DEFAULT_BACKGROUND_TOOL_CALL_AFTER_MS = 15_000;\nexport const DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS = 30_000;\nexport const BACKGROUND_TOOL_TASK_CUSTOM_TYPE = \"background_tool_task\";\n\nconst MAX_RETAINED_TERMINAL_TASKS = 64;\nconst MAX_INLINE_OUTPUT_BYTES = 32 * 1024;\nconst MAX_INLINE_OUTPUT_LINES = 400;\nconst MAX_SUMMARY_CHARS = 200;\nconst MAX_TERMINAL_HANDOFF_RECORDS = 8;\nconst TASK_ID_PATTERN = /^tool-task-([1-9]\\d*)$/;\nconst RECORD_KEYS = [\n\t\"sessionId\",\n\t\"taskId\",\n\t\"toolCallId\",\n\t\"toolName\",\n\t\"status\",\n\t\"startedAt\",\n\t\"completedAt\",\n\t\"elapsedBeforeHandoffMs\",\n\t\"summary\",\n\t\"output\",\n\t\"artifactId\",\n\t\"usage\",\n\t\"cancellationRequested\",\n] as const;\n\nexport type BackgroundToolTaskStatus = \"running\" | \"completed\" | \"failed\" | \"canceled\";\n\nexport type BackgroundToolTaskRef = Pick<BackgroundToolTaskRecord, \"taskId\" | \"toolCallId\" | \"status\">;\n\n/** Match a goal/task_steps evidence uri to a session background tool task by task id or toolCallId. */\nexport function findBackgroundToolTask<T extends BackgroundToolTaskRef>(\n\trecords: readonly T[],\n\turi: string,\n): T | undefined {\n\tconst id = uri.trim();\n\tif (!id) return undefined;\n\treturn records.find((record) => record.taskId === id || record.toolCallId === id);\n}\n\n/** True only when the cited background task finished successfully. Undefined when no task matches. */\nexport function isCompletedBackgroundToolEvidence(\n\trecords: readonly BackgroundToolTaskRef[],\n\turi: string,\n): boolean | undefined {\n\tconst task = findBackgroundToolTask(records, uri);\n\tif (!task) return undefined;\n\treturn task.status === \"completed\";\n}\n\nexport function collectCitedRunningToolTaskIds(args: {\n\trecords: readonly BackgroundToolTaskRef[];\n\turis: readonly string[];\n}): string[] {\n\tconst running = new Set<string>();\n\tfor (const uri of args.uris) {\n\t\tconst task = findBackgroundToolTask(args.records, uri);\n\t\tif (task?.status === \"running\") running.add(task.taskId);\n\t}\n\treturn [...running];\n}\n\nexport interface BackgroundToolTaskRecord {\n\tsessionId: string;\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tstatus: BackgroundToolTaskStatus;\n\tstartedAt: string;\n\tcompletedAt?: string;\n\telapsedBeforeHandoffMs: number;\n\tsummary: string;\n\toutput: string;\n\tartifactId?: string;\n\tusage?: Usage;\n\tcancellationRequested?: boolean;\n}\n\nexport interface BackgroundToolTaskLiveView {\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tdescription: string;\n}\n\nexport interface BackgroundToolTerminalMessage {\n\tcustomType: \"background-tool-completion\";\n\tcontent: string;\n\tdisplay: true;\n\tdetails: {\n\t\trecords: Array<{\n\t\t\ttaskId: string;\n\t\t\tstatus: BackgroundToolTaskStatus;\n\t\t\ttoolName: string;\n\t\t\tartifactId?: string;\n\t\t}>;\n\t};\n}\n\nexport interface BackgroundToolTaskControllerDeps {\n\tgetSessionId(): string;\n\t/** Current session followed by the authoritative fork ancestry whose branch records remain visible. */\n\tgetSessionLineageIds?(): readonly string[];\n\tgetArtifactStore(): ArtifactStore | undefined;\n\t/** Durable task records on the active branch, newest first, without rebuilding full model context. */\n\tloadPersistedRecordsNewestFirst?(): readonly unknown[];\n\tpersist(record: BackgroundToolTaskRecord): void;\n\tnotifyTerminal(records: readonly BackgroundToolTaskRecord[], options: { wakeParent: boolean }): Promise<void> | void;\n\tonLiveTasksChanged?(tasks: readonly BackgroundToolTaskLiveView[]): void;\n\trecordUsage?(taskId: string, usage: Usage): void;\n\tonError?(message: string, error: unknown): void;\n\tnow?(): Date;\n\t/** Event-wait watchdog; completion still arrives through the terminal handoff after this bound. */\n\twaitTimeoutMs?: number;\n}\n\ninterface BackgroundToolTaskState {\n\trecord: BackgroundToolTaskRecord;\n\tcancel: () => void;\n\tcancellationRequested: boolean;\n\twaitingConsumers: number;\n\tterminal: Promise<BackgroundToolTaskRecord>;\n\tresolveTerminal: (record: BackgroundToolTaskRecord) => void;\n\tartifactHolderId: string;\n}\n\n/** Read only task records on the active branch without allocating or hydrating the full branch context. */\nexport function loadBackgroundToolTaskRecordsNewestFirst(\n\tsessionManager: Pick<SessionManager, \"getLatestCustomEntryOnBranch\">,\n): unknown[] {\n\tconst records: unknown[] = [];\n\tlet fromId: string | undefined;\n\tfor (;;) {\n\t\tconst entry = sessionManager.getLatestCustomEntryOnBranch(BACKGROUND_TOOL_TASK_CUSTOM_TYPE, fromId);\n\t\tif (!entry) return records;\n\t\trecords.push(entry.data);\n\t\tif (entry.parentId === null) return records;\n\t\tfromId = entry.parentId;\n\t}\n}\n\nexport function createBackgroundToolTerminalMessage(\n\trecords: readonly BackgroundToolTaskRecord[],\n): BackgroundToolTerminalMessage {\n\tif (records.length === 0) throw new TypeError(\"Background tool terminal handoff requires at least one record\");\n\tconst included = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS);\n\tconst omitted = records.length - included.length;\n\treturn {\n\t\tcustomType: \"background-tool-completion\",\n\t\tcontent: [\n\t\t\t\"Background tool terminal handoff:\",\n\t\t\t...included.map((record) => `- ${record.taskId}: ${record.status} tool=${record.toolName}`),\n\t\t\t...(omitted > 0 ? [`- ${omitted} additional terminal tool task(s) omitted.`] : []),\n\t\t\t\"Parent woke. Need result: tool_task action=wait once; never poll.\",\n\t\t].join(\"\\n\"),\n\t\tdisplay: true,\n\t\tdetails: {\n\t\t\trecords: included.map((record) => ({\n\t\t\t\ttaskId: record.taskId,\n\t\t\t\tstatus: record.status,\n\t\t\t\ttoolName: record.toolName,\n\t\t\t\t...(record.artifactId ? { artifactId: record.artifactId } : {}),\n\t\t\t})),\n\t\t},\n\t};\n}\n\nfunction renderCompletionOutput(completion: BackgroundToolCallCompletion): string {\n\tconst blocks = completion.result.content.map((block) =>\n\t\tblock.type === \"text\" ? block.text : \"[Image output retained outside the foreground transcript]\",\n\t);\n\treturn blocks.join(\"\\n\") || \"Tool completed without text output.\";\n}\n\nfunction oneLine(value: string): string {\n\treturn value\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction summaryFor(status: BackgroundToolTaskStatus, toolName: string, output: string): string {\n\tconst prefix = `${toolName} ${status}`;\n\tconst firstLine = oneLine(output);\n\tif (!firstLine) return prefix;\n\tconst remaining = Math.max(0, MAX_SUMMARY_CHARS - prefix.length - 2);\n\treturn `${prefix}: ${firstLine.slice(0, remaining)}`;\n}\n\nfunction taskNumber(taskId: string): number | undefined {\n\tconst match = TASK_ID_PATTERN.exec(taskId);\n\tif (!match) return undefined;\n\tconst value = Number(match[1]);\n\treturn Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n\nfunction cloneUsage(value: unknown): Usage | undefined {\n\tif (!isPlainRecord(value)) return undefined;\n\tconst cost = value.cost;\n\tif (!isPlainRecord(cost)) return undefined;\n\tconst fields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"totalTokens\"] as const;\n\tconst costFields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const;\n\tif (\n\t\tfields.some((field) => typeof value[field] !== \"number\" || !Number.isFinite(value[field])) ||\n\t\tcostFields.some((field) => typeof cost[field] !== \"number\" || !Number.isFinite(cost[field]))\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tinput: value.input as number,\n\t\toutput: value.output as number,\n\t\tcacheRead: value.cacheRead as number,\n\t\tcacheWrite: value.cacheWrite as number,\n\t\ttotalTokens: value.totalTokens as number,\n\t\tcost: {\n\t\t\tinput: cost.input as number,\n\t\t\toutput: cost.output as number,\n\t\t\tcacheRead: cost.cacheRead as number,\n\t\t\tcacheWrite: cost.cacheWrite as number,\n\t\t\ttotal: cost.total as number,\n\t\t},\n\t};\n}\n\nfunction decodeRecord(value: unknown, sessionIds: ReadonlySet<string>): BackgroundToolTaskRecord | undefined {\n\tif (!isPlainRecord(value) || !hasOnlyKeys(value, RECORD_KEYS)) return undefined;\n\tif (\n\t\ttypeof value.sessionId !== \"string\" ||\n\t\tvalue.sessionId.length === 0 ||\n\t\t!sessionIds.has(value.sessionId) ||\n\t\ttypeof value.taskId !== \"string\" ||\n\t\ttaskNumber(value.taskId) === undefined ||\n\t\ttypeof value.toolCallId !== \"string\" ||\n\t\tvalue.toolCallId.length === 0 ||\n\t\ttypeof value.toolName !== \"string\" ||\n\t\tvalue.toolName.length === 0 ||\n\t\t(value.status !== \"running\" &&\n\t\t\tvalue.status !== \"completed\" &&\n\t\t\tvalue.status !== \"failed\" &&\n\t\t\tvalue.status !== \"canceled\") ||\n\t\ttypeof value.startedAt !== \"string\" ||\n\t\t!Number.isFinite(Date.parse(value.startedAt)) ||\n\t\t(value.completedAt !== undefined &&\n\t\t\t(typeof value.completedAt !== \"string\" || !Number.isFinite(Date.parse(value.completedAt)))) ||\n\t\t(value.status !== \"running\" && value.completedAt === undefined) ||\n\t\ttypeof value.elapsedBeforeHandoffMs !== \"number\" ||\n\t\t!Number.isFinite(value.elapsedBeforeHandoffMs) ||\n\t\tvalue.elapsedBeforeHandoffMs < 0 ||\n\t\ttypeof value.summary !== \"string\" ||\n\t\ttypeof value.output !== \"string\" ||\n\t\t(value.artifactId !== undefined &&\n\t\t\t(typeof value.artifactId !== \"string\" || !/^[0-9a-f]{1,64}$/.test(value.artifactId))) ||\n\t\t(value.cancellationRequested !== undefined && typeof value.cancellationRequested !== \"boolean\")\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = value.usage === undefined ? undefined : cloneUsage(value.usage);\n\tif (value.usage !== undefined && !usage) return undefined;\n\treturn {\n\t\tsessionId: value.sessionId,\n\t\ttaskId: value.taskId,\n\t\ttoolCallId: value.toolCallId,\n\t\ttoolName: value.toolName,\n\t\tstatus: value.status,\n\t\tstartedAt: value.startedAt,\n\t\t...(value.completedAt ? { completedAt: value.completedAt } : {}),\n\t\telapsedBeforeHandoffMs: value.elapsedBeforeHandoffMs,\n\t\tsummary: value.summary,\n\t\toutput: value.output,\n\t\t...(value.artifactId ? { artifactId: value.artifactId } : {}),\n\t\t...(usage ? { usage } : {}),\n\t\t...(value.cancellationRequested !== undefined ? { cancellationRequested: value.cancellationRequested } : {}),\n\t};\n}\n\n/**\n * Session-owned registry for foreground tool calls transferred into background execution.\n * It emits edge records for durability and a replace-style live-task signal for UI consumers.\n */\nexport class BackgroundToolTaskController {\n\tprivate readonly deps: BackgroundToolTaskControllerDeps;\n\tprivate readonly tasks = new Map<string, BackgroundToolTaskState>();\n\tprivate readonly handoffRequests = new Map<string, Set<() => void>>();\n\tprivate readonly queuedNotifications: Array<{ record: BackgroundToolTaskRecord; wakeParent: boolean }> = [];\n\tprivate notificationDrain: Promise<void> | undefined;\n\tprivate readonly waitTimeoutMs: number;\n\tprivate nextTaskId = 1;\n\tprivate disposed = false;\n\n\tconstructor(deps: BackgroundToolTaskControllerDeps) {\n\t\tthis.deps = deps;\n\t\tthis.waitTimeoutMs = deps.waitTimeoutMs ?? DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS;\n\t\tif (!Number.isSafeInteger(this.waitTimeoutMs) || this.waitTimeoutMs < 1) {\n\t\t\tthrow new TypeError(\"Background tool task wait timeout must be a positive safe integer.\");\n\t\t}\n\t\tthis.restorePersistedTasks();\n\t}\n\n\thandoff(context: BackgroundToolCallContext): BackgroundToolCallHandoff | undefined {\n\t\tif (this.disposed || context.toolCall.name === \"tool_task\") return undefined;\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst taskId = `tool-task-${this.nextTaskId++}`;\n\t\tconst startedAt = this.now().toISOString();\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\tsessionId,\n\t\t\ttaskId,\n\t\t\ttoolCallId: context.toolCall.id,\n\t\t\ttoolName: context.toolCall.name,\n\t\t\tstatus: \"running\",\n\t\t\tstartedAt,\n\t\t\telapsedBeforeHandoffMs: context.elapsedMs,\n\t\t\tsummary: `${context.toolCall.name} running in the background`,\n\t\t\toutput: \"\",\n\t\t};\n\t\tconst state = this.createState(record, context.cancel);\n\t\tthis.tasks.set(taskId, state);\n\t\tif (!this.persist(record)) {\n\t\t\tthis.tasks.delete(taskId);\n\t\t\treturn undefined;\n\t\t}\n\t\tthis.emitLiveTasks();\n\t\tcontext.completion.then(\n\t\t\t(completion) => this.settle(state, completion),\n\t\t\t(error) => this.settleRejected(state, error),\n\t\t);\n\n\t\treturn {\n\t\t\tresult: {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: [\n\t\t\t\t\t\t\t`Tool ${context.toolCall.name} exceeded ${Math.max(1, Math.round(context.elapsedMs / 1000))}s; running as session task ${taskId}.`,\n\t\t\t\t\t\t\t\"Continue independent work. Dependency: tool_task action=wait once with taskId; event-driven, never poll.\",\n\t\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { sessionId, taskId, status: \"running\" as const },\n\t\t\t},\n\t\t};\n\t}\n\n\tlist(): BackgroundToolTaskRecord[] {\n\t\treturn [...this.tasks.values()].map((state) => ({ ...state.record }));\n\t}\n\n\twait(taskId: string, signal?: AbortSignal): Promise<BackgroundToolTaskRecord> {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state) return Promise.reject(new Error(`Unknown background tool task: ${taskId}`));\n\t\tif (state.record.status !== \"running\") return Promise.resolve({ ...state.record });\n\t\tif (signal?.aborted) return Promise.resolve({ ...state.record });\n\t\tstate.waitingConsumers++;\n\t\tlet waiting = true;\n\t\tconst releaseWaiter = (): void => {\n\t\t\tif (!waiting) return;\n\t\t\twaiting = false;\n\t\t\tstate.waitingConsumers--;\n\t\t};\n\t\treturn new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finishWait = (record: BackgroundToolTaskRecord): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(watchdog);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treleaseWaiter();\n\t\t\t\tresolve({ ...record });\n\t\t\t};\n\t\t\tconst onAbort = (): void => {\n\t\t\t\tfinishWait(state.record);\n\t\t\t};\n\t\t\tconst watchdog = setTimeout(() => finishWait(state.record), this.waitTimeoutMs);\n\t\t\twatchdog.unref?.();\n\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tstate.terminal.then(finishWait);\n\t\t});\n\t}\n\n\tcancel(taskId: string): boolean {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state || state.record.status !== \"running\") return false;\n\t\tstate.cancellationRequested = true;\n\t\tstate.record = { ...state.record, cancellationRequested: true };\n\t\ttry {\n\t\t\tstate.cancel();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${taskId}`, error);\n\t\t}\n\t\treturn true;\n\t}\n\n\tsubscribeHandoffRequest(toolCallId: string, request: () => void): () => void {\n\t\tif (this.disposed) return () => {};\n\t\tconst requests = this.handoffRequests.get(toolCallId) ?? new Set<() => void>();\n\t\trequests.add(request);\n\t\tthis.handoffRequests.set(toolCallId, requests);\n\t\treturn () => {\n\t\t\trequests.delete(request);\n\t\t\tif (requests.size === 0) this.handoffRequests.delete(toolCallId);\n\t\t};\n\t}\n\n\trequestHandoff(toolCallId?: string): number {\n\t\tif (this.disposed) return 0;\n\t\tconst requested = toolCallId\n\t\t\t? [...(this.handoffRequests.get(toolCallId) ?? [])]\n\t\t\t: [...this.handoffRequests.values()].flatMap((requests) => [...requests]);\n\t\tfor (const request of requested) request();\n\t\treturn requested.length;\n\t}\n\n\tasync waitForNotifications(): Promise<void> {\n\t\t// A just-resolved tool completion settles through its promise continuation before it can enqueue\n\t\t// the notification drain. Yield once so this event-driven barrier observes that enqueue.\n\t\tawait Promise.resolve();\n\t\tfor (;;) {\n\t\t\tconst drain = this.notificationDrain;\n\t\t\tif (!drain) return;\n\t\t\tawait drain;\n\t\t\tif (!this.notificationDrain && this.queuedNotifications.length === 0) return;\n\t\t}\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tif (!this.disposed) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.handoffRequests.clear();\n\t\t\tfor (const state of this.tasks.values()) {\n\t\t\t\tif (state.record.status !== \"running\") continue;\n\t\t\t\tstate.cancellationRequested = true;\n\t\t\t\ttry {\n\t\t\t\t\tstate.cancel();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${state.record.taskId}`, error);\n\t\t\t\t}\n\t\t\t\tthis.finishState(\n\t\t\t\t\tstate,\n\t\t\t\t\t\"canceled\",\n\t\t\t\t\t\"Session ended before the background tool completed.\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait this.waitForNotifications();\n\t}\n\n\tprivate settle(state: BackgroundToolTaskState, completion: BackgroundToolCallCompletion): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : completion.isError ? \"failed\" : \"completed\";\n\t\tconst output = renderCompletionOutput(completion);\n\t\tthis.finishState(state, status, output, completion.result.usage, true);\n\t}\n\n\tprivate settleRejected(state: BackgroundToolTaskState, error: unknown): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : \"failed\";\n\t\tconst output = error instanceof Error ? error.message : String(error);\n\t\tthis.finishState(state, status, output, undefined, true);\n\t}\n\n\tprivate restorePersistedTasks(): void {\n\t\tconst load = this.deps.loadPersistedRecordsNewestFirst;\n\t\tif (!load) return;\n\t\tlet values: readonly unknown[];\n\t\ttry {\n\t\t\tvalues = load();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to load persisted background tool tasks\", error);\n\t\t\treturn;\n\t\t}\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst sessionIds = new Set(this.deps.getSessionLineageIds?.() ?? [sessionId]);\n\t\tsessionIds.add(sessionId);\n\t\tconst seenTaskIds = new Set<string>();\n\t\tconst latestRecords: BackgroundToolTaskRecord[] = [];\n\t\tlet highestTaskNumber = 0;\n\t\tfor (const value of values) {\n\t\t\tif (\n\t\t\t\t!isPlainRecord(value) ||\n\t\t\t\ttypeof value.sessionId !== \"string\" ||\n\t\t\t\t!sessionIds.has(value.sessionId) ||\n\t\t\t\ttypeof value.taskId !== \"string\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst numericTaskId = taskNumber(value.taskId);\n\t\t\tif (numericTaskId === undefined) continue;\n\t\t\thighestTaskNumber = Math.max(highestTaskNumber, numericTaskId);\n\t\t\tif (seenTaskIds.has(value.taskId)) continue;\n\t\t\tseenTaskIds.add(value.taskId);\n\t\t\tconst record = decodeRecord(value, sessionIds);\n\t\t\tif (record) latestRecords.push(record);\n\t\t}\n\t\tthis.nextTaskId = highestTaskNumber + 1;\n\t\tlatestRecords.sort((left, right) => taskNumber(left.taskId)! - taskNumber(right.taskId)!);\n\t\tfor (const record of latestRecords) {\n\t\t\tconst state = this.createState(record, () => {});\n\t\t\tthis.tasks.set(record.taskId, state);\n\t\t\tif (record.status !== \"running\") {\n\t\t\t\tstate.resolveTerminal(record);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.finishState(\n\t\t\t\tstate,\n\t\t\t\t\"failed\",\n\t\t\t\t\"The session resumed after the owning process ended; the original tool completion is unavailable.\",\n\t\t\t\tundefined,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\tthis.pruneTerminalTasks();\n\t\tthis.emitLiveTasks();\n\t}\n\n\tprivate createState(record: BackgroundToolTaskRecord, cancel: () => void): BackgroundToolTaskState {\n\t\tlet resolveTerminal: ((terminalRecord: BackgroundToolTaskRecord) => void) | undefined;\n\t\tconst terminal = new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tresolveTerminal = resolve;\n\t\t});\n\t\treturn {\n\t\t\trecord: { ...record },\n\t\t\tcancel,\n\t\t\tcancellationRequested: record.cancellationRequested ?? false,\n\t\t\twaitingConsumers: 0,\n\t\t\tterminal,\n\t\t\tresolveTerminal: resolveTerminal!,\n\t\t\tartifactHolderId: `background-tool-task:${record.sessionId}:${record.taskId}`,\n\t\t};\n\t}\n\n\tprivate finishState(\n\t\tstate: BackgroundToolTaskState,\n\t\tstatus: Exclude<BackgroundToolTaskStatus, \"running\">,\n\t\trawOutput: string,\n\t\tusage: Usage | undefined,\n\t\tnotify: boolean,\n\t): void {\n\t\tconst packed = packToolOutput(\n\t\t\t{\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\trawContent: rawOutput,\n\t\t\t\tsessionEntryId: state.record.taskId,\n\t\t\t\tcreatedAtTurn: 0,\n\t\t\t\treproducible: false,\n\t\t\t\ttruncation: { maxBytes: MAX_INLINE_OUTPUT_BYTES, maxLines: MAX_INLINE_OUTPUT_LINES },\n\t\t\t},\n\t\t\tthis.deps.getArtifactStore(),\n\t\t\tstate.artifactHolderId,\n\t\t);\n\t\tconst output = packed.artifactId\n\t\t\t? `${packed.content}\\n\\n[${formatArtifactNotice(packed.artifactId)}]`\n\t\t\t: packed.content;\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\t...state.record,\n\t\t\tstatus,\n\t\t\tcompletedAt: this.now().toISOString(),\n\t\t\tsummary: summaryFor(status, state.record.toolName, output),\n\t\t\toutput,\n\t\t\t...(packed.artifactId ? { artifactId: packed.artifactId } : {}),\n\t\t\t...(usage ? { usage } : {}),\n\t\t\t...(state.cancellationRequested ? { cancellationRequested: true } : {}),\n\t\t};\n\t\tstate.record = record;\n\t\tthis.persist(record);\n\t\tif (usage) this.deps.recordUsage?.(record.taskId, usage);\n\t\tstate.resolveTerminal(record);\n\t\tthis.emitLiveTasks();\n\t\tthis.pruneTerminalTasks();\n\t\tif (notify) this.notify(record, state.waitingConsumers === 0);\n\t}\n\n\tprivate persist(record: BackgroundToolTaskRecord): boolean {\n\t\ttry {\n\t\t\tthis.deps.persist({ ...record });\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to persist background tool task ${record.taskId}`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate notify(record: BackgroundToolTaskRecord, wakeParent: boolean): void {\n\t\tthis.queuedNotifications.push({ record: { ...record }, wakeParent });\n\t\tthis.scheduleNotificationDrain();\n\t}\n\n\tprivate scheduleNotificationDrain(): void {\n\t\tif (this.notificationDrain) return;\n\t\tthis.notificationDrain = this.drainNotifications().finally(() => {\n\t\t\tthis.notificationDrain = undefined;\n\t\t\tif (this.queuedNotifications.length > 0) this.scheduleNotificationDrain();\n\t\t});\n\t}\n\n\tprivate async drainNotifications(): Promise<void> {\n\t\t// Allow completions released by the same event to reach this queue before forming the batch.\n\t\tawait Promise.resolve();\n\t\twhile (this.queuedNotifications.length > 0) {\n\t\t\tawait Promise.resolve();\n\t\t\tconst batch = this.queuedNotifications.splice(0);\n\t\t\tconst records = batch.map((notification) => notification.record);\n\t\t\ttry {\n\t\t\t\tawait this.deps.notifyTerminal(records, {\n\t\t\t\t\twakeParent: batch.some((notification) => notification.wakeParent),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconst includedIds = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS).map((record) => record.taskId);\n\t\t\t\tconst omitted = records.length - includedIds.length;\n\t\t\t\tconst suffix = omitted > 0 ? ` (+${omitted} more)` : \"\";\n\t\t\t\tthis.deps.onError?.(\n\t\t\t\t\t`Failed to notify terminal background tool task batch ${includedIds.join(\", \")}${suffix}`,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate emitLiveTasks(): void {\n\t\tconst tasks = [...this.tasks.values()]\n\t\t\t.filter((state) => state.record.status === \"running\")\n\t\t\t.map((state) => ({\n\t\t\t\ttaskId: state.record.taskId,\n\t\t\t\ttoolCallId: state.record.toolCallId,\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\tdescription: state.record.summary,\n\t\t\t}));\n\t\ttry {\n\t\t\tthis.deps.onLiveTasksChanged?.(tasks);\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to emit background tool task level signal\", error);\n\t\t}\n\t}\n\n\tprivate pruneTerminalTasks(): void {\n\t\tconst terminal = [...this.tasks.values()].filter((state) => state.record.status !== \"running\");\n\t\tfor (const state of terminal.slice(0, Math.max(0, terminal.length - MAX_RETAINED_TERMINAL_TASKS))) {\n\t\t\tthis.tasks.delete(state.record.taskId);\n\t\t\tif (!state.record.artifactId) continue;\n\t\t\tconst store = this.deps.getArtifactStore();\n\t\t\tstore?.removeReference(state.record.artifactId, state.artifactHolderId);\n\t\t\tstore?.cleanup();\n\t\t}\n\t}\n\n\tprivate now(): Date {\n\t\treturn this.deps.now?.() ?? new Date();\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"background-tool-task-controller.js","sourceRoot":"","sources":["../../src/core/background-tool-task-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tBackgroundToolCallCompletion,\n\tBackgroundToolCallContext,\n\tBackgroundToolCallHandoff,\n} from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport type { ArtifactStore } from \"./context/context-artifacts.ts\";\nimport { formatArtifactNotice, packToolOutput } from \"./context/tool-output-packer.ts\";\nimport { hasOnlyKeys, isPlainRecord } from \"./util/value-guards.ts\";\n\nexport const DEFAULT_BACKGROUND_TOOL_CALL_AFTER_MS = 15_000;\nexport const DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS = 30_000;\nexport const BACKGROUND_TOOL_TASK_CUSTOM_TYPE = \"background_tool_task\";\n\nconst MAX_RETAINED_TERMINAL_TASKS = 64;\nconst MAX_INLINE_OUTPUT_BYTES = 32 * 1024;\nconst MAX_INLINE_OUTPUT_LINES = 400;\nconst MAX_SUMMARY_CHARS = 200;\nconst MAX_TERMINAL_HANDOFF_RECORDS = 8;\nconst TASK_ID_PATTERN = /^tool-task-([1-9]\\d*)$/;\nconst RECORD_KEYS = [\n\t\"sessionId\",\n\t\"taskId\",\n\t\"toolCallId\",\n\t\"toolName\",\n\t\"status\",\n\t\"startedAt\",\n\t\"completedAt\",\n\t\"elapsedBeforeHandoffMs\",\n\t\"summary\",\n\t\"output\",\n\t\"artifactId\",\n\t\"usage\",\n\t\"cancellationRequested\",\n\t\"terminalDelivery\",\n] as const;\n\nexport type BackgroundToolTaskStatus = \"running\" | \"completed\" | \"failed\" | \"canceled\";\nexport type BackgroundToolTerminalDelivery = \"pending\" | \"delivered\";\n\nexport type BackgroundToolTaskRef = Pick<BackgroundToolTaskRecord, \"taskId\" | \"toolCallId\" | \"status\">;\n\n/** Match a goal/task_steps evidence uri to a session background tool task by task id or toolCallId. */\nexport function findBackgroundToolTask<T extends BackgroundToolTaskRef>(\n\trecords: readonly T[],\n\turi: string,\n): T | undefined {\n\tconst id = uri.trim();\n\tif (!id) return undefined;\n\treturn records.find((record) => record.taskId === id || record.toolCallId === id);\n}\n\n/** True only when the cited background task finished successfully. Undefined when no task matches. */\nexport function isCompletedBackgroundToolEvidence(\n\trecords: readonly BackgroundToolTaskRef[],\n\turi: string,\n): boolean | undefined {\n\tconst task = findBackgroundToolTask(records, uri);\n\tif (!task) return undefined;\n\treturn task.status === \"completed\";\n}\n\nexport function collectCitedRunningToolTaskIds(args: {\n\trecords: readonly BackgroundToolTaskRef[];\n\turis: readonly string[];\n}): string[] {\n\tconst running = new Set<string>();\n\tfor (const uri of args.uris) {\n\t\tconst task = findBackgroundToolTask(args.records, uri);\n\t\tif (task?.status === \"running\") running.add(task.taskId);\n\t}\n\treturn [...running];\n}\n\nexport interface BackgroundToolTaskRecord {\n\tsessionId: string;\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tstatus: BackgroundToolTaskStatus;\n\tstartedAt: string;\n\tcompletedAt?: string;\n\telapsedBeforeHandoffMs: number;\n\tsummary: string;\n\toutput: string;\n\tartifactId?: string;\n\tusage?: Usage;\n\tcancellationRequested?: boolean;\n\t/** Durable terminal handoff state. Undefined on legacy records, which are treated as delivered. */\n\tterminalDelivery?: BackgroundToolTerminalDelivery;\n\t/** Runtime-only receipt; never serialized into the durable task record. */\n\tobservedAt?: string;\n}\n\nexport interface BackgroundToolTaskLiveView {\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tdescription: string;\n}\n\nexport interface BackgroundToolTerminalMessage {\n\tcustomType: \"background-tool-completion\";\n\tcontent: string;\n\tdisplay: true;\n\tdetails: {\n\t\trecords: Array<{\n\t\t\ttaskId: string;\n\t\t\tstatus: BackgroundToolTaskStatus;\n\t\t\ttoolName: string;\n\t\t\tartifactId?: string;\n\t\t}>;\n\t};\n}\n\nexport interface BackgroundToolTaskControllerDeps {\n\tgetSessionId(): string;\n\t/** Current session followed by the authoritative fork ancestry whose branch records remain visible. */\n\tgetSessionLineageIds?(): readonly string[];\n\tgetArtifactStore(): ArtifactStore | undefined;\n\t/** Durable task records on the active branch, newest first, without rebuilding full model context. */\n\tloadPersistedRecordsNewestFirst?(): readonly unknown[];\n\tpersist(record: BackgroundToolTaskRecord): void;\n\tnotifyTerminal(records: readonly BackgroundToolTaskRecord[], options: { wakeParent: boolean }): Promise<void> | void;\n\tonLiveTasksChanged?(tasks: readonly BackgroundToolTaskLiveView[]): void;\n\trecordUsage?(taskId: string, usage: Usage): void;\n\tonError?(message: string, error: unknown): void;\n\tnow?(): Date;\n\t/** Event-wait watchdog; completion still arrives through the terminal handoff after this bound. */\n\twaitTimeoutMs?: number;\n}\n\ninterface BackgroundToolTaskState {\n\trecord: BackgroundToolTaskRecord;\n\tcancel: () => void;\n\tcancellationRequested: boolean;\n\twaitingConsumers: number;\n\tterminal: Promise<BackgroundToolTaskRecord>;\n\tresolveTerminal: (record: BackgroundToolTaskRecord) => void;\n\tartifactHolderId: string;\n}\n\n/** Read only task records on the active branch without allocating or hydrating the full branch context. */\nexport function loadBackgroundToolTaskRecordsNewestFirst(\n\tsessionManager: Pick<SessionManager, \"getLatestCustomEntryOnBranch\">,\n): unknown[] {\n\tconst records: unknown[] = [];\n\tlet fromId: string | undefined;\n\tfor (;;) {\n\t\tconst entry = sessionManager.getLatestCustomEntryOnBranch(BACKGROUND_TOOL_TASK_CUSTOM_TYPE, fromId);\n\t\tif (!entry) return records;\n\t\trecords.push(entry.data);\n\t\tif (entry.parentId === null) return records;\n\t\tfromId = entry.parentId;\n\t}\n}\n\nexport function createBackgroundToolTerminalMessage(\n\trecords: readonly BackgroundToolTaskRecord[],\n): BackgroundToolTerminalMessage {\n\tif (records.length === 0) throw new TypeError(\"Background tool terminal handoff requires at least one record\");\n\tconst included = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS);\n\tconst omitted = records.length - included.length;\n\treturn {\n\t\tcustomType: \"background-tool-completion\",\n\t\tcontent: [\n\t\t\t\"Background tool terminal handoff:\",\n\t\t\t...included.map((record) => `- ${record.taskId}: ${record.status} tool=${record.toolName}`),\n\t\t\t...(omitted > 0 ? [`- ${omitted} additional terminal tool task(s) omitted.`] : []),\n\t\t\t\"Parent woke. Need result: tool_task action=wait once; never poll.\",\n\t\t].join(\"\\n\"),\n\t\tdisplay: true,\n\t\tdetails: {\n\t\t\trecords: included.map((record) => ({\n\t\t\t\ttaskId: record.taskId,\n\t\t\t\tstatus: record.status,\n\t\t\t\ttoolName: record.toolName,\n\t\t\t\t...(record.artifactId ? { artifactId: record.artifactId } : {}),\n\t\t\t})),\n\t\t},\n\t};\n}\n\nfunction renderCompletionOutput(completion: BackgroundToolCallCompletion): string {\n\tconst blocks = completion.result.content.map((block) =>\n\t\tblock.type === \"text\" ? block.text : \"[Image output retained outside the foreground transcript]\",\n\t);\n\treturn blocks.join(\"\\n\") || \"Tool completed without text output.\";\n}\n\nfunction oneLine(value: string): string {\n\treturn value\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction summaryFor(status: BackgroundToolTaskStatus, toolName: string, output: string): string {\n\tconst prefix = `${toolName} ${status}`;\n\tconst firstLine = oneLine(output);\n\tif (!firstLine) return prefix;\n\tconst remaining = Math.max(0, MAX_SUMMARY_CHARS - prefix.length - 2);\n\treturn `${prefix}: ${firstLine.slice(0, remaining)}`;\n}\n\nfunction taskNumber(taskId: string): number | undefined {\n\tconst match = TASK_ID_PATTERN.exec(taskId);\n\tif (!match) return undefined;\n\tconst value = Number(match[1]);\n\treturn Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n\nfunction cloneUsage(value: unknown): Usage | undefined {\n\tif (!isPlainRecord(value)) return undefined;\n\tconst cost = value.cost;\n\tif (!isPlainRecord(cost)) return undefined;\n\tconst fields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"totalTokens\"] as const;\n\tconst costFields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const;\n\tif (\n\t\tfields.some((field) => typeof value[field] !== \"number\" || !Number.isFinite(value[field])) ||\n\t\tcostFields.some((field) => typeof cost[field] !== \"number\" || !Number.isFinite(cost[field]))\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tinput: value.input as number,\n\t\toutput: value.output as number,\n\t\tcacheRead: value.cacheRead as number,\n\t\tcacheWrite: value.cacheWrite as number,\n\t\ttotalTokens: value.totalTokens as number,\n\t\tcost: {\n\t\t\tinput: cost.input as number,\n\t\t\toutput: cost.output as number,\n\t\t\tcacheRead: cost.cacheRead as number,\n\t\t\tcacheWrite: cost.cacheWrite as number,\n\t\t\ttotal: cost.total as number,\n\t\t},\n\t};\n}\n\nfunction decodeRecord(value: unknown, sessionIds: ReadonlySet<string>): BackgroundToolTaskRecord | undefined {\n\tif (!isPlainRecord(value) || !hasOnlyKeys(value, RECORD_KEYS)) return undefined;\n\tif (\n\t\ttypeof value.sessionId !== \"string\" ||\n\t\tvalue.sessionId.length === 0 ||\n\t\t!sessionIds.has(value.sessionId) ||\n\t\ttypeof value.taskId !== \"string\" ||\n\t\ttaskNumber(value.taskId) === undefined ||\n\t\ttypeof value.toolCallId !== \"string\" ||\n\t\tvalue.toolCallId.length === 0 ||\n\t\ttypeof value.toolName !== \"string\" ||\n\t\tvalue.toolName.length === 0 ||\n\t\t(value.status !== \"running\" &&\n\t\t\tvalue.status !== \"completed\" &&\n\t\t\tvalue.status !== \"failed\" &&\n\t\t\tvalue.status !== \"canceled\") ||\n\t\ttypeof value.startedAt !== \"string\" ||\n\t\t!Number.isFinite(Date.parse(value.startedAt)) ||\n\t\t(value.completedAt !== undefined &&\n\t\t\t(typeof value.completedAt !== \"string\" || !Number.isFinite(Date.parse(value.completedAt)))) ||\n\t\t(value.status !== \"running\" && value.completedAt === undefined) ||\n\t\ttypeof value.elapsedBeforeHandoffMs !== \"number\" ||\n\t\t!Number.isFinite(value.elapsedBeforeHandoffMs) ||\n\t\tvalue.elapsedBeforeHandoffMs < 0 ||\n\t\ttypeof value.summary !== \"string\" ||\n\t\ttypeof value.output !== \"string\" ||\n\t\t(value.artifactId !== undefined &&\n\t\t\t(typeof value.artifactId !== \"string\" || !/^[0-9a-f]{1,64}$/.test(value.artifactId))) ||\n\t\t(value.cancellationRequested !== undefined && typeof value.cancellationRequested !== \"boolean\") ||\n\t\t(value.terminalDelivery !== undefined &&\n\t\t\tvalue.terminalDelivery !== \"pending\" &&\n\t\t\tvalue.terminalDelivery !== \"delivered\")\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = value.usage === undefined ? undefined : cloneUsage(value.usage);\n\tif (value.usage !== undefined && !usage) return undefined;\n\treturn {\n\t\tsessionId: value.sessionId,\n\t\ttaskId: value.taskId,\n\t\ttoolCallId: value.toolCallId,\n\t\ttoolName: value.toolName,\n\t\tstatus: value.status,\n\t\tstartedAt: value.startedAt,\n\t\t...(value.completedAt ? { completedAt: value.completedAt } : {}),\n\t\telapsedBeforeHandoffMs: value.elapsedBeforeHandoffMs,\n\t\tsummary: value.summary,\n\t\toutput: value.output,\n\t\t...(value.artifactId ? { artifactId: value.artifactId } : {}),\n\t\t...(usage ? { usage } : {}),\n\t\t...(value.cancellationRequested !== undefined ? { cancellationRequested: value.cancellationRequested } : {}),\n\t\t...(value.terminalDelivery !== undefined ? { terminalDelivery: value.terminalDelivery } : {}),\n\t};\n}\n\n/**\n * Session-owned registry for foreground tool calls transferred into background execution.\n * It emits edge records for durability and a replace-style live-task signal for UI consumers.\n */\nexport class BackgroundToolTaskController {\n\tprivate readonly deps: BackgroundToolTaskControllerDeps;\n\tprivate readonly tasks = new Map<string, BackgroundToolTaskState>();\n\tprivate readonly handoffRequests = new Map<string, Set<() => void>>();\n\tprivate readonly queuedNotifications: Array<{ record: BackgroundToolTaskRecord; wakeParent: boolean }> = [];\n\tprivate readonly activeNotificationRecords = new Set<BackgroundToolTaskRecord>();\n\tprivate notificationDrain: Promise<void> | undefined;\n\tprivate notificationRetryTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate notificationRetryCompletion: Promise<void> | undefined;\n\tprivate resolveNotificationRetry: (() => void) | undefined;\n\tprivate notificationRetryCount = 0;\n\tprivate readonly waitTimeoutMs: number;\n\tprivate nextTaskId = 1;\n\tprivate disposed = false;\n\n\tconstructor(deps: BackgroundToolTaskControllerDeps) {\n\t\tthis.deps = deps;\n\t\tthis.waitTimeoutMs = deps.waitTimeoutMs ?? DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS;\n\t\tif (!Number.isSafeInteger(this.waitTimeoutMs) || this.waitTimeoutMs < 1) {\n\t\t\tthrow new TypeError(\"Background tool task wait timeout must be a positive safe integer.\");\n\t\t}\n\t\tthis.restorePersistedTasks();\n\t}\n\n\thandoff(context: BackgroundToolCallContext): BackgroundToolCallHandoff | undefined {\n\t\tif (this.disposed || context.toolCall.name === \"tool_task\") return undefined;\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst taskId = `tool-task-${this.nextTaskId++}`;\n\t\tconst startedAt = this.now().toISOString();\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\tsessionId,\n\t\t\ttaskId,\n\t\t\ttoolCallId: context.toolCall.id,\n\t\t\ttoolName: context.toolCall.name,\n\t\t\tstatus: \"running\",\n\t\t\tstartedAt,\n\t\t\telapsedBeforeHandoffMs: context.elapsedMs,\n\t\t\tsummary: `${context.toolCall.name} running in the background`,\n\t\t\toutput: \"\",\n\t\t};\n\t\tconst state = this.createState(record, context.cancel);\n\t\tthis.tasks.set(taskId, state);\n\t\tif (!this.persist(record)) {\n\t\t\tthis.tasks.delete(taskId);\n\t\t\treturn undefined;\n\t\t}\n\t\tthis.emitLiveTasks();\n\t\tcontext.completion.then(\n\t\t\t(completion) => this.settle(state, completion),\n\t\t\t(error) => this.settleRejected(state, error),\n\t\t);\n\n\t\treturn {\n\t\t\tresult: {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: [\n\t\t\t\t\t\t\t`Tool ${context.toolCall.name} exceeded ${Math.max(1, Math.round(context.elapsedMs / 1000))}s; running as session task ${taskId}.`,\n\t\t\t\t\t\t\t\"Continue independent work. Dependency: tool_task action=wait once with taskId; event-driven, never poll.\",\n\t\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { sessionId, taskId, status: \"running\" as const },\n\t\t\t},\n\t\t};\n\t}\n\n\tlist(): BackgroundToolTaskRecord[] {\n\t\treturn [...this.tasks.values()].map((state) => ({ ...state.record }));\n\t}\n\n\t/** Model-facing read that consumes terminal delivery without approving its outcome. */\n\tobserve(taskIds?: string | readonly string[]): BackgroundToolTaskRecord[] {\n\t\tconst ids = typeof taskIds === \"string\" ? [taskIds] : taskIds;\n\t\tconst states = ids\n\t\t\t? ids.flatMap((taskId) => {\n\t\t\t\t\tconst state = this.tasks.get(taskId);\n\t\t\t\t\treturn state === undefined ? [] : [state];\n\t\t\t\t})\n\t\t\t: [...this.tasks.values()];\n\t\tfor (const state of states) this.observeState(state);\n\t\treturn states.map((state) => ({ ...state.record }));\n\t}\n\n\twait(taskId: string, signal?: AbortSignal): Promise<BackgroundToolTaskRecord> {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state) return Promise.reject(new Error(`Unknown background tool task: ${taskId}`));\n\t\tif (state.record.status !== \"running\") {\n\t\t\tthis.observeState(state);\n\t\t\treturn Promise.resolve({ ...state.record });\n\t\t}\n\t\tif (signal?.aborted) return Promise.resolve({ ...state.record });\n\t\tstate.waitingConsumers++;\n\t\tlet waiting = true;\n\t\tconst releaseWaiter = (): void => {\n\t\t\tif (!waiting) return;\n\t\t\twaiting = false;\n\t\t\tstate.waitingConsumers--;\n\t\t};\n\t\treturn new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finishWait = (record: BackgroundToolTaskRecord): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(watchdog);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treleaseWaiter();\n\t\t\t\tif (record.status !== \"running\") this.observeState(state);\n\t\t\t\tresolve({ ...state.record });\n\t\t\t};\n\t\t\tconst onAbort = (): void => {\n\t\t\t\tfinishWait(state.record);\n\t\t\t};\n\t\t\tconst watchdog = setTimeout(() => finishWait(state.record), this.waitTimeoutMs);\n\t\t\twatchdog.unref?.();\n\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tstate.terminal.then(finishWait);\n\t\t});\n\t}\n\n\tcancel(taskId: string): boolean {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state || state.record.status !== \"running\") return false;\n\t\tstate.cancellationRequested = true;\n\t\tstate.record = { ...state.record, cancellationRequested: true };\n\t\ttry {\n\t\t\tstate.cancel();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${taskId}`, error);\n\t\t}\n\t\treturn true;\n\t}\n\n\tsubscribeHandoffRequest(toolCallId: string, request: () => void): () => void {\n\t\tif (this.disposed) return () => {};\n\t\tconst requests = this.handoffRequests.get(toolCallId) ?? new Set<() => void>();\n\t\trequests.add(request);\n\t\tthis.handoffRequests.set(toolCallId, requests);\n\t\treturn () => {\n\t\t\trequests.delete(request);\n\t\t\tif (requests.size === 0) this.handoffRequests.delete(toolCallId);\n\t\t};\n\t}\n\n\trequestHandoff(toolCallId?: string): number {\n\t\tif (this.disposed) return 0;\n\t\tconst requested = toolCallId\n\t\t\t? [...(this.handoffRequests.get(toolCallId) ?? [])]\n\t\t\t: [...this.handoffRequests.values()].flatMap((requests) => [...requests]);\n\t\tfor (const request of requested) request();\n\t\treturn requested.length;\n\t}\n\n\tasync waitForNotifications(): Promise<void> {\n\t\t// A just-resolved tool completion settles through its promise continuation before it can enqueue\n\t\t// the notification drain. Yield once so this event-driven barrier observes that enqueue.\n\t\tawait Promise.resolve();\n\t\tfor (;;) {\n\t\t\tconst drain = this.notificationDrain;\n\t\t\tif (drain) {\n\t\t\t\tawait drain;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.queuedNotifications.length === 0) return;\n\t\t\tconst retry = this.notificationRetryCompletion;\n\t\t\tif (retry) {\n\t\t\t\tawait retry;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.disposed) return;\n\t\t\tthis.scheduleNotificationDrain();\n\t\t}\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tif (!this.disposed) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.handoffRequests.clear();\n\t\t\tfor (const state of this.tasks.values()) {\n\t\t\t\tif (state.record.status !== \"running\") continue;\n\t\t\t\tstate.cancellationRequested = true;\n\t\t\t\ttry {\n\t\t\t\t\tstate.cancel();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${state.record.taskId}`, error);\n\t\t\t\t}\n\t\t\t\tthis.finishState(\n\t\t\t\t\tstate,\n\t\t\t\t\t\"canceled\",\n\t\t\t\t\t\"Session ended before the background tool completed.\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait this.waitForNotifications();\n\t}\n\n\tprivate settle(state: BackgroundToolTaskState, completion: BackgroundToolCallCompletion): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : completion.isError ? \"failed\" : \"completed\";\n\t\tconst output = renderCompletionOutput(completion);\n\t\tthis.finishState(state, status, output, completion.result.usage, true);\n\t}\n\n\tprivate settleRejected(state: BackgroundToolTaskState, error: unknown): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : \"failed\";\n\t\tconst output = error instanceof Error ? error.message : String(error);\n\t\tthis.finishState(state, status, output, undefined, true);\n\t}\n\n\tprivate restorePersistedTasks(): void {\n\t\tconst load = this.deps.loadPersistedRecordsNewestFirst;\n\t\tif (!load) return;\n\t\tlet values: readonly unknown[];\n\t\ttry {\n\t\t\tvalues = load();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to load persisted background tool tasks\", error);\n\t\t\treturn;\n\t\t}\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst sessionIds = new Set(this.deps.getSessionLineageIds?.() ?? [sessionId]);\n\t\tsessionIds.add(sessionId);\n\t\tconst seenTaskIds = new Set<string>();\n\t\tconst latestRecords: BackgroundToolTaskRecord[] = [];\n\t\tlet highestTaskNumber = 0;\n\t\tfor (const value of values) {\n\t\t\tif (\n\t\t\t\t!isPlainRecord(value) ||\n\t\t\t\ttypeof value.sessionId !== \"string\" ||\n\t\t\t\t!sessionIds.has(value.sessionId) ||\n\t\t\t\ttypeof value.taskId !== \"string\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst numericTaskId = taskNumber(value.taskId);\n\t\t\tif (numericTaskId === undefined) continue;\n\t\t\thighestTaskNumber = Math.max(highestTaskNumber, numericTaskId);\n\t\t\tif (seenTaskIds.has(value.taskId)) continue;\n\t\t\tseenTaskIds.add(value.taskId);\n\t\t\tconst record = decodeRecord(value, sessionIds);\n\t\t\tif (record) latestRecords.push(record);\n\t\t}\n\t\tthis.nextTaskId = highestTaskNumber + 1;\n\t\tlatestRecords.sort((left, right) => taskNumber(left.taskId)! - taskNumber(right.taskId)!);\n\t\tfor (const record of latestRecords) {\n\t\t\tconst state = this.createState(record, () => {});\n\t\t\tthis.tasks.set(record.taskId, state);\n\t\t\tif (record.status !== \"running\") {\n\t\t\t\tstate.resolveTerminal(record);\n\t\t\t\tif (record.terminalDelivery === \"pending\") this.notify(record, true);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.finishState(\n\t\t\t\tstate,\n\t\t\t\t\"failed\",\n\t\t\t\t\"The session resumed after the owning process ended; the original tool completion is unavailable.\",\n\t\t\t\tundefined,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\tthis.pruneTerminalTasks();\n\t\tthis.emitLiveTasks();\n\t}\n\n\tprivate createState(record: BackgroundToolTaskRecord, cancel: () => void): BackgroundToolTaskState {\n\t\tlet resolveTerminal: ((terminalRecord: BackgroundToolTaskRecord) => void) | undefined;\n\t\tconst terminal = new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tresolveTerminal = resolve;\n\t\t});\n\t\treturn {\n\t\t\trecord: { ...record },\n\t\t\tcancel,\n\t\t\tcancellationRequested: record.cancellationRequested ?? false,\n\t\t\twaitingConsumers: 0,\n\t\t\tterminal,\n\t\t\tresolveTerminal: resolveTerminal!,\n\t\t\tartifactHolderId: `background-tool-task:${record.sessionId}:${record.taskId}`,\n\t\t};\n\t}\n\n\tprivate finishState(\n\t\tstate: BackgroundToolTaskState,\n\t\tstatus: Exclude<BackgroundToolTaskStatus, \"running\">,\n\t\trawOutput: string,\n\t\tusage: Usage | undefined,\n\t\tnotify: boolean,\n\t): void {\n\t\tconst packed = packToolOutput(\n\t\t\t{\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\trawContent: rawOutput,\n\t\t\t\tsessionEntryId: state.record.taskId,\n\t\t\t\tcreatedAtTurn: 0,\n\t\t\t\treproducible: false,\n\t\t\t\ttruncation: { maxBytes: MAX_INLINE_OUTPUT_BYTES, maxLines: MAX_INLINE_OUTPUT_LINES },\n\t\t\t},\n\t\t\tthis.deps.getArtifactStore(),\n\t\t\tstate.artifactHolderId,\n\t\t);\n\t\tconst output = packed.artifactId\n\t\t\t? `${packed.content}\\n\\n[${formatArtifactNotice(packed.artifactId)}]`\n\t\t\t: packed.content;\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\t...state.record,\n\t\t\tstatus,\n\t\t\tcompletedAt: this.now().toISOString(),\n\t\t\tsummary: summaryFor(status, state.record.toolName, output),\n\t\t\toutput,\n\t\t\t...(packed.artifactId ? { artifactId: packed.artifactId } : {}),\n\t\t\t...(usage ? { usage } : {}),\n\t\t\t...(state.cancellationRequested ? { cancellationRequested: true } : {}),\n\t\t\tterminalDelivery: notify ? \"pending\" : \"delivered\",\n\t\t};\n\t\tconst persisted = this.persist(record);\n\t\tconst terminalRecord = persisted\n\t\t\t? record\n\t\t\t: {\n\t\t\t\t\t...record,\n\t\t\t\t\tstatus: \"failed\" as const,\n\t\t\t\t\tsummary: `${record.toolName} failed: terminal result could not be persisted`,\n\t\t\t\t\toutput: \"Background tool result could not be persisted; treat it as unavailable.\",\n\t\t\t\t};\n\t\tstate.record = terminalRecord;\n\t\tif (usage) this.deps.recordUsage?.(record.taskId, usage);\n\t\tstate.resolveTerminal(terminalRecord);\n\t\tthis.emitLiveTasks();\n\t\tthis.pruneTerminalTasks();\n\t\tif (notify) this.notify(terminalRecord, state.waitingConsumers === 0);\n\t}\n\n\tprivate persist(record: BackgroundToolTaskRecord): boolean {\n\t\ttry {\n\t\t\tconst durableRecord = { ...record };\n\t\t\tdelete durableRecord.observedAt;\n\t\t\tthis.deps.persist(durableRecord);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to persist background tool task ${record.taskId}`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate notify(record: BackgroundToolTaskRecord, wakeParent: boolean): void {\n\t\tconst notificationRecord = {\n\t\t\t...record,\n\t\t\t...(!wakeParent && !record.observedAt ? { observedAt: this.now().toISOString() } : {}),\n\t\t};\n\t\tthis.activeNotificationRecords.add(notificationRecord);\n\t\tthis.queuedNotifications.push({ record: notificationRecord, wakeParent });\n\t\tthis.scheduleNotificationDrain();\n\t}\n\n\tprivate markNotificationDelivered(record: BackgroundToolTaskRecord): void {\n\t\tif (record.terminalDelivery !== \"pending\") return;\n\t\tconst delivered = { ...record, terminalDelivery: \"delivered\" as const };\n\t\tif (this.persist(delivered)) {\n\t\t\tconst state = this.tasks.get(record.taskId);\n\t\t\tif (state && state.record.completedAt === record.completedAt) state.record = delivered;\n\t\t}\n\t}\n\n\tprivate observeState(state: BackgroundToolTaskState): void {\n\t\tif (state.record.status === \"running\" || state.record.observedAt) return;\n\t\tconst observedAt = this.now().toISOString();\n\t\tstate.record = { ...state.record, observedAt };\n\t\tfor (const record of this.activeNotificationRecords) {\n\t\t\tif (record.taskId === state.record.taskId && record.completedAt === state.record.completedAt) {\n\t\t\t\trecord.observedAt = observedAt;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate scheduleNotificationDrain(): void {\n\t\tif (this.disposed || this.notificationDrain || this.notificationRetryTimer) return;\n\t\tthis.notificationDrain = this.drainNotifications().finally(() => {\n\t\t\tthis.notificationDrain = undefined;\n\t\t\tif (this.queuedNotifications.length > 0 && !this.notificationRetryTimer) this.scheduleNotificationDrain();\n\t\t});\n\t}\n\n\tprivate scheduleNotificationRetry(): void {\n\t\tif (this.disposed || this.notificationRetryTimer) return;\n\t\tconst delayMs = Math.min(100 * 2 ** Math.min(this.notificationRetryCount, 5), 5_000);\n\t\tthis.notificationRetryCount++;\n\t\tthis.notificationRetryCompletion = new Promise<void>((resolve) => {\n\t\t\tthis.resolveNotificationRetry = resolve;\n\t\t});\n\t\tthis.notificationRetryTimer = setTimeout(() => {\n\t\t\tthis.notificationRetryTimer = undefined;\n\t\t\tconst resolve = this.resolveNotificationRetry;\n\t\t\tthis.resolveNotificationRetry = undefined;\n\t\t\tthis.notificationRetryCompletion = undefined;\n\t\t\tresolve?.();\n\t\t\tthis.scheduleNotificationDrain();\n\t\t}, delayMs);\n\t\tthis.notificationRetryTimer.unref?.();\n\t}\n\n\tprivate async drainNotifications(): Promise<void> {\n\t\t// Allow completions released by the same event to reach this queue before forming the batch.\n\t\tawait Promise.resolve();\n\t\twhile (this.queuedNotifications.length > 0) {\n\t\t\tawait Promise.resolve();\n\t\t\tconst batch = this.queuedNotifications.splice(0);\n\t\t\tconst records = batch.map((notification) => notification.record);\n\t\t\ttry {\n\t\t\t\tawait this.deps.notifyTerminal(records, {\n\t\t\t\t\twakeParent: batch.some((notification) => notification.wakeParent),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\t// A rejected handoff is not a delivery receipt. Put the exact records back ahead of\n\t\t\t\t// newer completions and retry on an event-driven backoff; persistence already contains\n\t\t\t\t// the terminal, so a transient notifier failure must not make it disappear.\n\t\t\t\tthis.queuedNotifications.unshift(...batch);\n\t\t\t\tconst includedIds = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS).map((record) => record.taskId);\n\t\t\t\tconst omitted = records.length - includedIds.length;\n\t\t\t\tconst suffix = omitted > 0 ? ` (+${omitted} more)` : \"\";\n\t\t\t\ttry {\n\t\t\t\t\tthis.deps.onError?.(\n\t\t\t\t\t\t`Failed to notify terminal background tool task batch ${includedIds.join(\", \")}${suffix}`,\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Diagnostics cannot consume the pending terminal handoff.\n\t\t\t\t}\n\t\t\t\tthis.scheduleNotificationRetry();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.notificationRetryCount = 0;\n\t\t\tfor (const record of records) this.markNotificationDelivered(record);\n\t\t\tfor (const record of records) {\n\t\t\t\tthis.activeNotificationRecords.delete(record);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate emitLiveTasks(): void {\n\t\tconst tasks = [...this.tasks.values()]\n\t\t\t.filter((state) => state.record.status === \"running\")\n\t\t\t.map((state) => ({\n\t\t\t\ttaskId: state.record.taskId,\n\t\t\t\ttoolCallId: state.record.toolCallId,\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\tdescription: state.record.summary,\n\t\t\t}));\n\t\ttry {\n\t\t\tthis.deps.onLiveTasksChanged?.(tasks);\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to emit background tool task level signal\", error);\n\t\t}\n\t}\n\n\tprivate pruneTerminalTasks(): void {\n\t\tconst terminal = [...this.tasks.values()].filter((state) => state.record.status !== \"running\");\n\t\tfor (const state of terminal.slice(0, Math.max(0, terminal.length - MAX_RETAINED_TERMINAL_TASKS))) {\n\t\t\tthis.tasks.delete(state.record.taskId);\n\t\t\tif (!state.record.artifactId) continue;\n\t\t\tconst store = this.deps.getArtifactStore();\n\t\t\tstore?.removeReference(state.record.artifactId, state.artifactHolderId);\n\t\t\tstore?.cleanup();\n\t\t}\n\t}\n\n\tprivate now(): Date {\n\t\treturn this.deps.now?.() ?? new Date();\n\t}\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type GoalState } from "../goals/goal-state.ts";
|
|
2
2
|
import type { MemoryPromptBudget } from "./memory-prompt-budget.ts";
|
|
3
|
-
export type LongTermMemoryTriggerReason = "explicit_recall" | "goal_continuation_missing_context" | "user_or_project_preference" | "durable_identifier" | "missing_background" | "short_or_grounded_turn" | "budget_disabled" | "secret_like_query";
|
|
3
|
+
export type LongTermMemoryTriggerReason = "explicit_recall" | "goal_continuation_missing_context" | "user_or_project_preference" | "durable_identifier" | "missing_background" | "proactive_local_turn" | "short_or_grounded_turn" | "budget_disabled" | "secret_like_query";
|
|
4
4
|
export interface LongTermMemoryTriggerInput {
|
|
5
5
|
latestUserText: string;
|
|
6
6
|
goalState?: GoalState;
|
|
@@ -10,6 +10,8 @@ export interface LongTermMemoryTriggerInput {
|
|
|
10
10
|
export interface LongTermMemoryTriggerDecision {
|
|
11
11
|
shouldQuery: boolean;
|
|
12
12
|
reason: LongTermMemoryTriggerReason;
|
|
13
|
+
/** External providers remain demand-gated even when local OKF retrieval is proactive. */
|
|
14
|
+
shouldQueryExternal?: boolean;
|
|
13
15
|
}
|
|
14
16
|
export declare function shouldQueryLongTermMemory(input: LongTermMemoryTriggerInput): LongTermMemoryTriggerDecision;
|
|
15
17
|
//# sourceMappingURL=long-term-memory-trigger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"long-term-memory-trigger.d.ts","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,MAAM,2BAA2B,GACpC,iBAAiB,GACjB,mCAAmC,GACnC,4BAA4B,GAC5B,oBAAoB,GACpB,oBAAoB,GACpB,wBAAwB,GACxB,iBAAiB,GACjB,mBAAmB,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC7C,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"long-term-memory-trigger.d.ts","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,MAAM,2BAA2B,GACpC,iBAAiB,GACjB,mCAAmC,GACnC,4BAA4B,GAC5B,oBAAoB,GACpB,oBAAoB,GACpB,sBAAsB,GACtB,wBAAwB,GACxB,iBAAiB,GACjB,mBAAmB,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC7C,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,2BAA2B,CAAC;IACpC,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAkBD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,0BAA0B,GAAG,6BAA6B,CAyB1G"}
|
|
@@ -35,6 +35,6 @@ export function shouldQueryLongTermMemory(input) {
|
|
|
35
35
|
if ((input.currentWorkCandidateCount ?? 0) > 0 && input.budget?.compact) {
|
|
36
36
|
return { shouldQuery: false, reason: "short_or_grounded_turn" };
|
|
37
37
|
}
|
|
38
|
-
return { shouldQuery:
|
|
38
|
+
return { shouldQuery: true, reason: "proactive_local_turn", shouldQueryExternal: false };
|
|
39
39
|
}
|
|
40
40
|
//# sourceMappingURL=long-term-memory-trigger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"long-term-memory-trigger.js","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"long-term-memory-trigger.js","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AA2BxE,MAAM,kBAAkB,GAAG,6EAA6E,CAAC;AACzG,MAAM,aAAa,GAClB,qHAAqH,CAAC;AACvH,MAAM,aAAa,GAClB,yGAAyG,CAAC;AAC3G,MAAM,qBAAqB,GAAG,iFAAiF,CAAC;AAEhH,SAAS,WAAW,CAAC,IAAY;IAChC,OAAO,CACN,IAAI;SACF,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAiC;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClH,IAAI,uBAAuB,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAE9F,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC3F,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IACjG,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACzF,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAEjG,MAAM,UAAU,GACf,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9G,IACC,UAAU,KAAK,SAAS;QACxB,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,CAAC,EAC3E,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACxF,IAAI,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACzE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;AAC1F,CAAC","sourcesContent":["import { type GoalState, isGoalExecutionActive } from \"../goals/goal-state.ts\";\nimport type { MemoryPromptBudget } from \"./memory-prompt-budget.ts\";\nimport { hasSecretLikeMemoryText } from \"./memory-provider-contract.ts\";\n\nexport type LongTermMemoryTriggerReason =\n\t| \"explicit_recall\"\n\t| \"goal_continuation_missing_context\"\n\t| \"user_or_project_preference\"\n\t| \"durable_identifier\"\n\t| \"missing_background\"\n\t| \"proactive_local_turn\"\n\t| \"short_or_grounded_turn\"\n\t| \"budget_disabled\"\n\t| \"secret_like_query\";\n\nexport interface LongTermMemoryTriggerInput {\n\tlatestUserText: string;\n\tgoalState?: GoalState;\n\tbudget?: MemoryPromptBudget;\n\tcurrentWorkCandidateCount?: number;\n}\n\nexport interface LongTermMemoryTriggerDecision {\n\tshouldQuery: boolean;\n\treason: LongTermMemoryTriggerReason;\n\t/** External providers remain demand-gated even when local OKF retrieval is proactive. */\n\tshouldQueryExternal?: boolean;\n}\n\nconst EXPLICIT_RECALL_RE = /\\b(recall|remember|memory|memories|resume|previous|prior|before|history)\\b/i;\nconst PREFERENCE_RE =\n\t/\\b(preferences?|prefers?|rules?|instructions?|policy|how should|how do you usually|project context|user context)\\b/i;\nconst DURABLE_ID_RE =\n\t/\\b(?:goal-[a-z0-9-]+|[A-Z]+-\\d+|#[0-9]+|[a-f0-9]{8,40}|build\\s*#?\\d+|artifact|trello|jenkins|branch)\\b/i;\nconst MISSING_BACKGROUND_RE = /\\b(context|background|what did|where were|what was|remind me|familiar|ready)\\b/i;\n\nfunction substantial(text: string): boolean {\n\treturn (\n\t\ttext\n\t\t\t.trim()\n\t\t\t.split(/\\s+/)\n\t\t\t.filter((word) => word.length >= 3).length >= 3\n\t);\n}\n\nexport function shouldQueryLongTermMemory(input: LongTermMemoryTriggerInput): LongTermMemoryTriggerDecision {\n\tconst text = input.latestUserText.trim();\n\tif (input.budget !== undefined && !input.budget.enabled) return { shouldQuery: false, reason: \"budget_disabled\" };\n\tif (hasSecretLikeMemoryText(text)) return { shouldQuery: false, reason: \"secret_like_query\" };\n\n\tif (EXPLICIT_RECALL_RE.test(text)) return { shouldQuery: true, reason: \"explicit_recall\" };\n\tif (PREFERENCE_RE.test(text)) return { shouldQuery: true, reason: \"user_or_project_preference\" };\n\tif (DURABLE_ID_RE.test(text)) return { shouldQuery: true, reason: \"durable_identifier\" };\n\tif (MISSING_BACKGROUND_RE.test(text)) return { shouldQuery: true, reason: \"missing_background\" };\n\n\tconst activeGoal =\n\t\tinput.goalState !== undefined && isGoalExecutionActive(input.goalState.status) ? input.goalState : undefined;\n\tif (\n\t\tactiveGoal !== undefined &&\n\t\ttext.length === 0 &&\n\t\tactiveGoal.requirements.some((requirement) => requirement.status === \"open\")\n\t) {\n\t\treturn { shouldQuery: true, reason: \"goal_continuation_missing_context\" };\n\t}\n\n\tif (!substantial(text)) return { shouldQuery: false, reason: \"short_or_grounded_turn\" };\n\tif ((input.currentWorkCandidateCount ?? 0) > 0 && input.budget?.compact) {\n\t\treturn { shouldQuery: false, reason: \"short_or_grounded_turn\" };\n\t}\n\treturn { shouldQuery: true, reason: \"proactive_local_turn\", shouldQueryExternal: false };\n}\n"]}
|
|
@@ -6,6 +6,9 @@ export interface OkfMemoryProviderOptions {
|
|
|
6
6
|
providerId?: string;
|
|
7
7
|
maxFileBytes?: number;
|
|
8
8
|
maxDocuments?: number;
|
|
9
|
+
/** Current workspace identity. When set, foreign project-scoped records are excluded. */
|
|
10
|
+
projectId?: string;
|
|
11
|
+
projectRoot?: string;
|
|
9
12
|
}
|
|
10
13
|
export interface OkfMemoryLoadEntry {
|
|
11
14
|
path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"okf-memory-provider.d.ts","sourceRoot":"","sources":["../../../src/core/context/okf-memory-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"okf-memory-provider.d.ts","sourceRoot":"","sources":["../../../src/core/context/okf-memory-provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAEX,cAAc,EACd,cAAc,EAKd,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG5B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC,CAAC;CACzE;AAmGD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,mBAAmB,CA2B1F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,cAAc,CA0BzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,WAAW,EAAE,CAI9E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAIhF"}
|