@narumitw/pi-subagents 2.0.6 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -50
- package/dist/chunks/{auto-transport-SY2VHUFH.ts → auto-transport-FUUKFDIG.ts} +6 -6
- package/dist/chunks/{capability-grant-CGEWOEKE.ts → capability-grant-PR72SWWS.ts} +4 -4
- package/dist/chunks/{chunk-DPPVEQAM.ts → chunk-4AQSF7AS.ts} +1 -1
- package/dist/chunks/chunk-4AQSF7AS.ts.map +7 -0
- package/dist/chunks/chunk-6H6TBBED.ts +108 -0
- package/dist/chunks/chunk-6H6TBBED.ts.map +7 -0
- package/dist/chunks/{chunk-DSOOH73Y.ts → chunk-7AAJEUSL.ts} +3 -3
- package/dist/chunks/{chunk-DSOOH73Y.ts.map → chunk-7AAJEUSL.ts.map} +2 -2
- package/dist/chunks/{chunk-7QPPBBXZ.ts → chunk-D4CR7T73.ts} +21 -3
- package/dist/chunks/chunk-D4CR7T73.ts.map +7 -0
- package/dist/chunks/{chunk-434NII74.ts → chunk-DIHBUR2E.ts} +54 -8
- package/dist/chunks/chunk-DIHBUR2E.ts.map +7 -0
- package/dist/chunks/{chunk-NIF42QMF.ts → chunk-FEVPWRMU.ts} +7 -4
- package/dist/chunks/chunk-FEVPWRMU.ts.map +7 -0
- package/dist/chunks/{chunk-YBUWBRF7.ts → chunk-FXI45N3J.ts} +5 -5
- package/dist/chunks/{chunk-S2IWVK3J.ts → chunk-ILEQ27AL.ts} +3 -2
- package/dist/chunks/chunk-ILEQ27AL.ts.map +7 -0
- package/dist/chunks/{chunk-DQMN4OYM.ts → chunk-ITVWPNU4.ts} +12 -106
- package/dist/chunks/chunk-ITVWPNU4.ts.map +7 -0
- package/dist/chunks/{chunk-QDVGH2X7.ts → chunk-IWC32VPY.ts} +2 -1
- package/dist/chunks/{chunk-QDVGH2X7.ts.map → chunk-IWC32VPY.ts.map} +2 -2
- package/dist/chunks/{chunk-I2FAK44T.ts → chunk-JSZIP73U.ts} +48 -10
- package/dist/chunks/chunk-JSZIP73U.ts.map +7 -0
- package/dist/chunks/{chunk-ZHTNCZIA.ts → chunk-JU6LUNLP.ts} +2 -2
- package/dist/chunks/{chunk-PSK43Y6A.ts → chunk-LASD73CM.ts} +2 -2
- package/dist/chunks/{chunk-C4L6P266.ts → chunk-LEOYDZI3.ts} +1 -1
- package/dist/chunks/{chunk-C4L6P266.ts.map → chunk-LEOYDZI3.ts.map} +2 -2
- package/dist/chunks/{chunk-H3BFJ7HJ.ts → chunk-LL4LP2T7.ts} +5 -5
- package/dist/chunks/chunk-N2T5IN4X.ts +18 -0
- package/dist/chunks/chunk-N2T5IN4X.ts.map +7 -0
- package/dist/chunks/{chunk-G3RSMSXJ.ts → chunk-NTRPLF46.ts} +1 -1
- package/dist/chunks/chunk-NTRPLF46.ts.map +7 -0
- package/dist/chunks/{chunk-CBP76ARQ.ts → chunk-PABJJYP6.ts} +174 -47
- package/dist/chunks/chunk-PABJJYP6.ts.map +7 -0
- package/dist/chunks/{chunk-EFBPISNT.ts → chunk-PBZMBTNJ.ts} +104 -103
- package/dist/chunks/chunk-PBZMBTNJ.ts.map +7 -0
- package/dist/chunks/{chunk-SCZ33MYW.ts → chunk-PGLSFLYW.ts} +2 -2
- package/dist/chunks/{chunk-O4VO6JUJ.ts → chunk-TM2R67J3.ts} +3 -3
- package/dist/chunks/{chunk-QBORTI4W.ts → chunk-TMZRHIIK.ts} +32 -3
- package/dist/chunks/chunk-TMZRHIIK.ts.map +7 -0
- package/dist/chunks/chunk-TZ34IQ3M.ts +59 -0
- package/dist/chunks/chunk-TZ34IQ3M.ts.map +7 -0
- package/dist/chunks/chunk-VBDGNNLM.ts +214 -0
- package/dist/chunks/chunk-VBDGNNLM.ts.map +7 -0
- package/dist/chunks/{chunk-7OBINKFM.ts → chunk-VDG7LTYE.ts} +11 -11
- package/dist/chunks/chunk-VDG7LTYE.ts.map +7 -0
- package/dist/chunks/{chunk-AEUYS7JC.ts → chunk-X4NMONPE.ts} +1 -1
- package/dist/chunks/chunk-X4NMONPE.ts.map +7 -0
- package/dist/chunks/{chunk-HKC4ES4B.ts → chunk-YPJEN6NU.ts} +2 -2
- package/dist/chunks/{completion-delivery-YPOWSSV3.ts → completion-delivery-JVLNQRWX.ts} +5 -4
- package/dist/chunks/{config-status-J4GPWP46.ts → config-status-FKGDECZ3.ts} +7 -6
- package/dist/chunks/{config-ui-2YUCUEBM.ts → config-ui-DDKERQHI.ts} +297 -231
- package/dist/chunks/config-ui-DDKERQHI.ts.map +7 -0
- package/dist/chunks/{consult-IV7UBNQQ.ts → consult-PQ6PRAKC.ts} +14 -13
- package/dist/chunks/consult-PQ6PRAKC.ts.map +7 -0
- package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts → create-stateful-transport-JWC2EFYL.ts} +6 -6
- package/dist/chunks/{delegation-contract-WJPT4FVS.ts → delegation-contract-LA56I5DT.ts} +2 -2
- package/dist/chunks/{discovery-K25T3SH4.ts → discovery-MIFB2U4Y.ts} +3 -3
- package/dist/chunks/{execution-LA7HN5YF.ts → execution-Q2JZLKJA.ts} +19 -16
- package/dist/chunks/execution-Q2JZLKJA.ts.map +7 -0
- package/dist/chunks/{in-process-transport-4RF3J6XK.ts → in-process-transport-HJ6TZXC3.ts} +9 -9
- package/dist/chunks/{inspect-XV2QALMR.ts → inspect-UH2TKH6E.ts} +25 -10
- package/dist/chunks/inspect-UH2TKH6E.ts.map +7 -0
- package/dist/chunks/{persistence-VSGXAW4P.ts → persistence-XHPJBZL7.ts} +11 -7
- package/dist/chunks/persistence-XHPJBZL7.ts.map +7 -0
- package/dist/chunks/{registry-E6XPJB7L.ts → registry-XDXPECWF.ts} +136 -15
- package/dist/chunks/registry-XDXPECWF.ts.map +7 -0
- package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts → retained-semantic-state-GM75FZGE.ts} +3 -3
- package/dist/chunks/{rpc-transport-NEHBHWX4.ts → rpc-transport-7R7DVCEB.ts} +12 -16
- package/dist/chunks/rpc-transport-7R7DVCEB.ts.map +7 -0
- package/dist/chunks/{spawn-idempotency-QGHO2WKC.ts → spawn-idempotency-BNHOSMZW.ts} +2 -2
- package/dist/chunks/{subprocess-transport-NSHOGDC4.ts → subprocess-transport-VHZJRBTW.ts} +15 -14
- package/dist/chunks/subprocess-transport-VHZJRBTW.ts.map +7 -0
- package/dist/chunks/usage-recording-store-CW3EH2SZ.ts +164 -0
- package/dist/chunks/usage-recording-store-CW3EH2SZ.ts.map +7 -0
- package/dist/index.ts +427 -30
- package/dist/index.ts.map +3 -3
- package/docs/async-runtime-protocol.md +69 -0
- package/docs/implementation-notes/pi-subagents-capability-matrix.md +62 -0
- package/docs/implementation-notes/pi-subagents-current-direction.md +99 -0
- package/docs/implementation-notes/pi-subagents-rpc-v1.md +153 -0
- package/docs/pi-subagents-diagrams.md +183 -0
- package/package.json +9 -8
- package/src/agents/types.ts +2 -0
- package/src/async-subagent-benchmark.ts +532 -0
- package/src/completion-delivery.ts +71 -4
- package/src/completion-render.ts +1 -0
- package/src/completion-requirement.ts +308 -0
- package/src/config-registration.ts +5 -5
- package/src/config-status.ts +66 -70
- package/src/config-ui.ts +244 -150
- package/src/consult-resources.ts +1 -1
- package/src/consult.ts +3 -8
- package/src/delegation-contract.ts +55 -9
- package/src/execution-plan.ts +1 -1
- package/src/execution-ui.ts +40 -29
- package/src/execution.ts +2 -3
- package/src/inspect.ts +24 -1
- package/src/orchestration-metrics.ts +1 -1
- package/src/panel-execution.ts +2 -3
- package/src/panel-failure.ts +1 -1
- package/src/panel-render.ts +1 -1
- package/src/parallel-limit-ui.ts +6 -5
- package/src/params.ts +2 -1
- package/src/persistence.ts +9 -0
- package/src/process-control.ts +43 -0
- package/src/registry-types.ts +5 -0
- package/src/registry.ts +162 -18
- package/src/render.ts +2 -1
- package/src/rpc-transport.ts +1 -1
- package/src/runner-outcome.ts +1 -1
- package/src/runner-result.ts +1 -1
- package/src/runner-types.ts +102 -0
- package/src/runner.ts +11 -192
- package/src/settings/inspection.ts +27 -0
- package/src/settings/schema.ts +9 -0
- package/src/settings-reader.ts +7 -0
- package/src/settings.ts +20 -0
- package/src/spawn-idempotency.ts +5 -0
- package/src/stateful-agent-view.ts +15 -19
- package/src/stateful-guidance.ts +14 -4
- package/src/stateful-limit-ui.ts +23 -20
- package/src/stateful-limits.ts +10 -10
- package/src/stateful-registration.ts +126 -9
- package/src/stateful-render.ts +27 -2
- package/src/subagent-details.ts +43 -0
- package/src/subagents-extension.ts +66 -8
- package/src/subagents.ts +2 -0
- package/src/subprocess-transport.ts +2 -1
- package/src/supervision.ts +2 -1
- package/src/timeout-finalization.ts +1 -1
- package/src/tool-schema-compatibility.ts +73 -0
- package/src/transport-types.ts +6 -0
- package/src/transport-ui.ts +18 -46
- package/src/usage-recording-config.ts +13 -0
- package/src/usage-recording-store.ts +183 -0
- package/src/usage-recording.ts +478 -0
- package/src/verification-harness.ts +1 -1
- package/src/workflow-ui.ts +17 -9
- package/dist/chunks/chunk-434NII74.ts.map +0 -7
- package/dist/chunks/chunk-7OBINKFM.ts.map +0 -7
- package/dist/chunks/chunk-7QPPBBXZ.ts.map +0 -7
- package/dist/chunks/chunk-AEUYS7JC.ts.map +0 -7
- package/dist/chunks/chunk-CBP76ARQ.ts.map +0 -7
- package/dist/chunks/chunk-DPPVEQAM.ts.map +0 -7
- package/dist/chunks/chunk-DQMN4OYM.ts.map +0 -7
- package/dist/chunks/chunk-EFBPISNT.ts.map +0 -7
- package/dist/chunks/chunk-G3RSMSXJ.ts.map +0 -7
- package/dist/chunks/chunk-I2FAK44T.ts.map +0 -7
- package/dist/chunks/chunk-NIF42QMF.ts.map +0 -7
- package/dist/chunks/chunk-QBORTI4W.ts.map +0 -7
- package/dist/chunks/chunk-S2IWVK3J.ts.map +0 -7
- package/dist/chunks/config-ui-2YUCUEBM.ts.map +0 -7
- package/dist/chunks/consult-IV7UBNQQ.ts.map +0 -7
- package/dist/chunks/execution-LA7HN5YF.ts.map +0 -7
- package/dist/chunks/inspect-XV2QALMR.ts.map +0 -7
- package/dist/chunks/persistence-VSGXAW4P.ts.map +0 -7
- package/dist/chunks/registry-E6XPJB7L.ts.map +0 -7
- package/dist/chunks/rpc-transport-NEHBHWX4.ts.map +0 -7
- package/dist/chunks/subprocess-transport-NSHOGDC4.ts.map +0 -7
- /package/dist/chunks/{auto-transport-SY2VHUFH.ts.map → auto-transport-FUUKFDIG.ts.map} +0 -0
- /package/dist/chunks/{capability-grant-CGEWOEKE.ts.map → capability-grant-PR72SWWS.ts.map} +0 -0
- /package/dist/chunks/{chunk-YBUWBRF7.ts.map → chunk-FXI45N3J.ts.map} +0 -0
- /package/dist/chunks/{chunk-ZHTNCZIA.ts.map → chunk-JU6LUNLP.ts.map} +0 -0
- /package/dist/chunks/{chunk-PSK43Y6A.ts.map → chunk-LASD73CM.ts.map} +0 -0
- /package/dist/chunks/{chunk-H3BFJ7HJ.ts.map → chunk-LL4LP2T7.ts.map} +0 -0
- /package/dist/chunks/{chunk-SCZ33MYW.ts.map → chunk-PGLSFLYW.ts.map} +0 -0
- /package/dist/chunks/{chunk-O4VO6JUJ.ts.map → chunk-TM2R67J3.ts.map} +0 -0
- /package/dist/chunks/{chunk-HKC4ES4B.ts.map → chunk-YPJEN6NU.ts.map} +0 -0
- /package/dist/chunks/{completion-delivery-YPOWSSV3.ts.map → completion-delivery-JVLNQRWX.ts.map} +0 -0
- /package/dist/chunks/{config-status-J4GPWP46.ts.map → config-status-FKGDECZ3.ts.map} +0 -0
- /package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts.map → create-stateful-transport-JWC2EFYL.ts.map} +0 -0
- /package/dist/chunks/{delegation-contract-WJPT4FVS.ts.map → delegation-contract-LA56I5DT.ts.map} +0 -0
- /package/dist/chunks/{discovery-K25T3SH4.ts.map → discovery-MIFB2U4Y.ts.map} +0 -0
- /package/dist/chunks/{in-process-transport-4RF3J6XK.ts.map → in-process-transport-HJ6TZXC3.ts.map} +0 -0
- /package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts.map → retained-semantic-state-GM75FZGE.ts.map} +0 -0
- /package/dist/chunks/{spawn-idempotency-QGHO2WKC.ts.map → spawn-idempotency-BNHOSMZW.ts.map} +0 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
|
|
4
|
+
// src/process-control.ts
|
|
5
|
+
var KILL_GRACE_MS = 5e3;
|
|
6
|
+
function signalProcess(proc, signal) {
|
|
7
|
+
if (process.platform !== "win32" && proc.pid) {
|
|
8
|
+
try {
|
|
9
|
+
process.kill(-proc.pid, signal);
|
|
10
|
+
return;
|
|
11
|
+
} catch {
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
proc.kill(signal);
|
|
16
|
+
} catch {
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function terminateProcess(proc, graceMs = KILL_GRACE_MS) {
|
|
20
|
+
const leaderExited = proc.exitCode !== null || proc.signalCode !== null;
|
|
21
|
+
const capturedOutputClosed = [proc.stdout, proc.stderr].every(
|
|
22
|
+
(stream) => !stream || stream.readableEnded || stream.destroyed
|
|
23
|
+
);
|
|
24
|
+
let closed = leaderExited && capturedOutputClosed;
|
|
25
|
+
const onClose = () => {
|
|
26
|
+
closed = true;
|
|
27
|
+
};
|
|
28
|
+
proc.once("close", onClose);
|
|
29
|
+
if (!closed) signalProcess(proc, "SIGTERM");
|
|
30
|
+
const escalation = setTimeout(() => {
|
|
31
|
+
if (!closed) signalProcess(proc, "SIGKILL");
|
|
32
|
+
}, graceMs);
|
|
33
|
+
escalation.unref();
|
|
34
|
+
return () => {
|
|
35
|
+
clearTimeout(escalation);
|
|
36
|
+
proc.off("close", onClose);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/protocol.ts
|
|
41
|
+
import { StringDecoder } from "node:string_decoder";
|
|
42
|
+
var DEFAULT_MAX_LINE_BYTES = 256 * 1024;
|
|
43
|
+
var JsonLineDecoder = class {
|
|
44
|
+
constructor(options) {
|
|
45
|
+
this.options = options;
|
|
46
|
+
const maxLineBytes = options.maxLineBytes ?? DEFAULT_MAX_LINE_BYTES;
|
|
47
|
+
if (!Number.isSafeInteger(maxLineBytes) || maxLineBytes < 1) {
|
|
48
|
+
throw new Error("JSON line limit must be a positive safe integer");
|
|
49
|
+
}
|
|
50
|
+
this.maxLineBytes = maxLineBytes;
|
|
51
|
+
}
|
|
52
|
+
options;
|
|
53
|
+
buffer = "";
|
|
54
|
+
droppingOversizedLine = false;
|
|
55
|
+
maxLineBytes;
|
|
56
|
+
decoder = new StringDecoder("utf8");
|
|
57
|
+
push(chunk) {
|
|
58
|
+
this.buffer += typeof chunk === "string" ? chunk : this.decoder.write(chunk);
|
|
59
|
+
this.drain(false);
|
|
60
|
+
}
|
|
61
|
+
finish() {
|
|
62
|
+
this.buffer += this.decoder.end();
|
|
63
|
+
this.drain(true);
|
|
64
|
+
this.buffer = "";
|
|
65
|
+
this.droppingOversizedLine = false;
|
|
66
|
+
}
|
|
67
|
+
drain(flush) {
|
|
68
|
+
while (true) {
|
|
69
|
+
const newline = this.buffer.indexOf("\n");
|
|
70
|
+
if (newline < 0) break;
|
|
71
|
+
const line = this.buffer.slice(0, newline).replace(/\r$/, "");
|
|
72
|
+
this.buffer = this.buffer.slice(newline + 1);
|
|
73
|
+
if (this.droppingOversizedLine) {
|
|
74
|
+
this.droppingOversizedLine = false;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
this.processLine(line);
|
|
78
|
+
}
|
|
79
|
+
if (!flush && Buffer.byteLength(this.buffer, "utf8") > this.maxLineBytes) {
|
|
80
|
+
this.options.onOversized?.(Buffer.byteLength(this.buffer, "utf8"));
|
|
81
|
+
this.buffer = "";
|
|
82
|
+
this.droppingOversizedLine = true;
|
|
83
|
+
}
|
|
84
|
+
if (flush && this.buffer.length > 0 && !this.droppingOversizedLine) {
|
|
85
|
+
this.processLine(this.buffer.replace(/\r$/, ""));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
processLine(line) {
|
|
89
|
+
if (!line.trim()) return;
|
|
90
|
+
const bytes = Buffer.byteLength(line, "utf8");
|
|
91
|
+
if (bytes > this.maxLineBytes) {
|
|
92
|
+
this.options.onOversized?.(bytes);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
this.options.onValue(JSON.parse(line));
|
|
97
|
+
} catch {
|
|
98
|
+
this.options.onMalformed?.(line);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
KILL_GRACE_MS,
|
|
105
|
+
terminateProcess,
|
|
106
|
+
JsonLineDecoder
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=chunk-6H6TBBED.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/process-control.ts", "../../src/protocol.ts"],
|
|
4
|
+
"sourcesContent": ["import type { spawn } from \"node:child_process\";\n\nexport const KILL_GRACE_MS = 5000;\n\nfunction signalProcess(proc: ReturnType<typeof spawn>, signal: NodeJS.Signals): void {\n\tif (process.platform !== \"win32\" && proc.pid) {\n\t\ttry {\n\t\t\tprocess.kill(-proc.pid, signal);\n\t\t\treturn;\n\t\t} catch {\n\t\t\t// Fall back to signaling the immediate child when process-group signaling is unavailable.\n\t\t}\n\t}\n\ttry {\n\t\tproc.kill(signal);\n\t} catch {\n\t\t// The process may already have exited.\n\t}\n}\n\nexport function terminateProcess(\n\tproc: ReturnType<typeof spawn>,\n\tgraceMs = KILL_GRACE_MS,\n): () => void {\n\tconst leaderExited = proc.exitCode !== null || proc.signalCode !== null;\n\tconst capturedOutputClosed = [proc.stdout, proc.stderr].every(\n\t\t(stream) => !stream || stream.readableEnded || stream.destroyed,\n\t);\n\tlet closed = leaderExited && capturedOutputClosed;\n\tconst onClose = () => {\n\t\tclosed = true;\n\t};\n\tproc.once(\"close\", onClose);\n\tif (!closed) signalProcess(proc, \"SIGTERM\");\n\tconst escalation = setTimeout(() => {\n\t\tif (!closed) signalProcess(proc, \"SIGKILL\");\n\t}, graceMs);\n\tescalation.unref();\n\treturn () => {\n\t\tclearTimeout(escalation);\n\t\tproc.off(\"close\", onClose);\n\t};\n}\n", "import { StringDecoder } from \"node:string_decoder\";\n\nconst DEFAULT_MAX_LINE_BYTES = 256 * 1024;\n\nexport interface JsonLineDecoderOptions {\n\tmaxLineBytes?: number;\n\tonValue: (value: unknown) => void;\n\tonMalformed?: (line: string) => void;\n\tonOversized?: (bytes: number) => void;\n}\n\n/** Bounded newline-delimited JSON decoder for child Pi event streams. */\nexport class JsonLineDecoder {\n\tprivate buffer = \"\";\n\tprivate droppingOversizedLine = false;\n\tprivate readonly maxLineBytes: number;\n\tprivate readonly decoder = new StringDecoder(\"utf8\");\n\n\tconstructor(private readonly options: JsonLineDecoderOptions) {\n\t\tconst maxLineBytes = options.maxLineBytes ?? DEFAULT_MAX_LINE_BYTES;\n\t\tif (!Number.isSafeInteger(maxLineBytes) || maxLineBytes < 1) {\n\t\t\tthrow new Error(\"JSON line limit must be a positive safe integer\");\n\t\t}\n\t\tthis.maxLineBytes = maxLineBytes;\n\t}\n\n\tpush(chunk: string | Buffer): void {\n\t\tthis.buffer += typeof chunk === \"string\" ? chunk : this.decoder.write(chunk);\n\t\tthis.drain(false);\n\t}\n\n\tfinish(): void {\n\t\tthis.buffer += this.decoder.end();\n\t\tthis.drain(true);\n\t\tthis.buffer = \"\";\n\t\tthis.droppingOversizedLine = false;\n\t}\n\n\tprivate drain(flush: boolean): void {\n\t\twhile (true) {\n\t\t\tconst newline = this.buffer.indexOf(\"\\n\");\n\t\t\tif (newline < 0) break;\n\t\t\tconst line = this.buffer.slice(0, newline).replace(/\\r$/, \"\");\n\t\t\tthis.buffer = this.buffer.slice(newline + 1);\n\t\t\tif (this.droppingOversizedLine) {\n\t\t\t\tthis.droppingOversizedLine = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.processLine(line);\n\t\t}\n\n\t\tif (!flush && Buffer.byteLength(this.buffer, \"utf8\") > this.maxLineBytes) {\n\t\t\tthis.options.onOversized?.(Buffer.byteLength(this.buffer, \"utf8\"));\n\t\t\tthis.buffer = \"\";\n\t\t\tthis.droppingOversizedLine = true;\n\t\t}\n\n\t\tif (flush && this.buffer.length > 0 && !this.droppingOversizedLine) {\n\t\t\tthis.processLine(this.buffer.replace(/\\r$/, \"\"));\n\t\t}\n\t}\n\n\tprivate processLine(line: string): void {\n\t\tif (!line.trim()) return;\n\t\tconst bytes = Buffer.byteLength(line, \"utf8\");\n\t\tif (bytes > this.maxLineBytes) {\n\t\t\tthis.options.onOversized?.(bytes);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.options.onValue(JSON.parse(line));\n\t\t} catch {\n\t\t\tthis.options.onMalformed?.(line);\n\t\t}\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAEO,IAAM,gBAAgB;AAE7B,SAAS,cAAc,MAAgC,QAA8B;AACpF,MAAI,QAAQ,aAAa,WAAW,KAAK,KAAK;AAC7C,QAAI;AACH,cAAQ,KAAK,CAAC,KAAK,KAAK,MAAM;AAC9B;AAAA,IACD,QAAQ;AAAA,IAER;AAAA,EACD;AACA,MAAI;AACH,SAAK,KAAK,MAAM;AAAA,EACjB,QAAQ;AAAA,EAER;AACD;AAEO,SAAS,iBACf,MACA,UAAU,eACG;AACb,QAAM,eAAe,KAAK,aAAa,QAAQ,KAAK,eAAe;AACnE,QAAM,uBAAuB,CAAC,KAAK,QAAQ,KAAK,MAAM,EAAE;AAAA,IACvD,CAAC,WAAW,CAAC,UAAU,OAAO,iBAAiB,OAAO;AAAA,EACvD;AACA,MAAI,SAAS,gBAAgB;AAC7B,QAAM,UAAU,MAAM;AACrB,aAAS;AAAA,EACV;AACA,OAAK,KAAK,SAAS,OAAO;AAC1B,MAAI,CAAC,OAAQ,eAAc,MAAM,SAAS;AAC1C,QAAM,aAAa,WAAW,MAAM;AACnC,QAAI,CAAC,OAAQ,eAAc,MAAM,SAAS;AAAA,EAC3C,GAAG,OAAO;AACV,aAAW,MAAM;AACjB,SAAO,MAAM;AACZ,iBAAa,UAAU;AACvB,SAAK,IAAI,SAAS,OAAO;AAAA,EAC1B;AACD;;;AC1CA,SAAS,qBAAqB;AAE9B,IAAM,yBAAyB,MAAM;AAU9B,IAAM,kBAAN,MAAsB;AAAA,EAM5B,YAA6B,SAAiC;AAAjC;AAC5B,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAI,CAAC,OAAO,cAAc,YAAY,KAAK,eAAe,GAAG;AAC5D,YAAM,IAAI,MAAM,iDAAiD;AAAA,IAClE;AACA,SAAK,eAAe;AAAA,EACrB;AAAA,EAN6B;AAAA,EALrB,SAAS;AAAA,EACT,wBAAwB;AAAA,EACf;AAAA,EACA,UAAU,IAAI,cAAc,MAAM;AAAA,EAUnD,KAAK,OAA8B;AAClC,SAAK,UAAU,OAAO,UAAU,WAAW,QAAQ,KAAK,QAAQ,MAAM,KAAK;AAC3E,SAAK,MAAM,KAAK;AAAA,EACjB;AAAA,EAEA,SAAe;AACd,SAAK,UAAU,KAAK,QAAQ,IAAI;AAChC,SAAK,MAAM,IAAI;AACf,SAAK,SAAS;AACd,SAAK,wBAAwB;AAAA,EAC9B;AAAA,EAEQ,MAAM,OAAsB;AACnC,WAAO,MAAM;AACZ,YAAM,UAAU,KAAK,OAAO,QAAQ,IAAI;AACxC,UAAI,UAAU,EAAG;AACjB,YAAM,OAAO,KAAK,OAAO,MAAM,GAAG,OAAO,EAAE,QAAQ,OAAO,EAAE;AAC5D,WAAK,SAAS,KAAK,OAAO,MAAM,UAAU,CAAC;AAC3C,UAAI,KAAK,uBAAuB;AAC/B,aAAK,wBAAwB;AAC7B;AAAA,MACD;AACA,WAAK,YAAY,IAAI;AAAA,IACtB;AAEA,QAAI,CAAC,SAAS,OAAO,WAAW,KAAK,QAAQ,MAAM,IAAI,KAAK,cAAc;AACzE,WAAK,QAAQ,cAAc,OAAO,WAAW,KAAK,QAAQ,MAAM,CAAC;AACjE,WAAK,SAAS;AACd,WAAK,wBAAwB;AAAA,IAC9B;AAEA,QAAI,SAAS,KAAK,OAAO,SAAS,KAAK,CAAC,KAAK,uBAAuB;AACnE,WAAK,YAAY,KAAK,OAAO,QAAQ,OAAO,EAAE,CAAC;AAAA,IAChD;AAAA,EACD;AAAA,EAEQ,YAAY,MAAoB;AACvC,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,QAAQ,OAAO,WAAW,MAAM,MAAM;AAC5C,QAAI,QAAQ,KAAK,cAAc;AAC9B,WAAK,QAAQ,cAAc,KAAK;AAChC;AAAA,IACD;AACA,QAAI;AACH,WAAK,QAAQ,QAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,IACtC,QAAQ;AACP,WAAK,QAAQ,cAAc,IAAI;AAAA,IAChC;AAAA,EACD;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
4
|
resolveAgentToolNames
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-4AQSF7AS.ts";
|
|
6
6
|
|
|
7
7
|
// src/admission-policy.ts
|
|
8
8
|
var DELEGATION_ADMISSION_VERSION = "pi-subagents:admission:v1";
|
|
@@ -161,7 +161,7 @@ function acknowledgeExecutionPlan(plan) {
|
|
|
161
161
|
}
|
|
162
162
|
if (plan.unsupportedGuarantees.length > 0) {
|
|
163
163
|
reasonCodes.push("unsupported-guarantee");
|
|
164
|
-
recoveryActions.push("stop");
|
|
164
|
+
recoveryActions.push("repair-contract", "stop");
|
|
165
165
|
}
|
|
166
166
|
return {
|
|
167
167
|
version: EXECUTION_ACKNOWLEDGEMENT_VERSION,
|
|
@@ -235,4 +235,4 @@ export {
|
|
|
235
235
|
rotateExecutionPlanGeneration,
|
|
236
236
|
isExecutionPlan
|
|
237
237
|
};
|
|
238
|
-
//# sourceMappingURL=chunk-
|
|
238
|
+
//# sourceMappingURL=chunk-7AAJEUSL.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/admission-policy.ts", "../../src/execution-plan.ts"],
|
|
4
|
-
"sourcesContent": ["export const DELEGATION_ADMISSION_VERSION = \"pi-subagents:admission:v1\" as const;\n\nexport type DelegationAdmissionRecommendation =\n\t| \"parent-owned-direct\"\n\t| \"one-child\"\n\t| \"one-child-plus-verification\"\n\t| \"bounded-two-child\"\n\t| \"abstain-insufficient-evidence\";\n\nexport interface DelegationAdmissionInput {\n\tcontextPressure: \"low\" | \"medium\" | \"high\";\n\tindependentWorkItems: number;\n\tcoupling: \"dense\" | \"sparse\";\n\tverificationRequired: boolean;\n\tverificationAvailable: boolean;\n\tcapabilitiesSupported: boolean;\n\tbudgetAllowsChildren: boolean;\n\tgenerationCurrent: boolean;\n\trequirementsComplete: boolean;\n}\n\nexport interface DelegationAdmissionDecision {\n\tversion: typeof DELEGATION_ADMISSION_VERSION;\n\trecommendation: DelegationAdmissionRecommendation;\n\treasonCodes: string[];\n\tbenefitHypothesis: string;\n\tauditOnly: true;\n}\n\nexport function evaluateDelegationAdmission(\n\tinput: DelegationAdmissionInput,\n): DelegationAdmissionDecision {\n\tif (!input.generationCurrent)\n\t\treturn decision(\"abstain-insufficient-evidence\", [\"stale-generation\"]);\n\tif (!input.requirementsComplete) {\n\t\treturn decision(\"abstain-insufficient-evidence\", [\"requirements-incomplete\"]);\n\t}\n\tif (!input.capabilitiesSupported) {\n\t\treturn decision(\"abstain-insufficient-evidence\", [\"capability-unsupported\"]);\n\t}\n\tif (!input.budgetAllowsChildren) {\n\t\treturn decision(\"parent-owned-direct\", [\"child-budget-insufficient\"]);\n\t}\n\tif (input.independentWorkItems >= 2 && input.coupling === \"sparse\") {\n\t\treturn decision(\n\t\t\t\"bounded-two-child\",\n\t\t\t[\"declared-independent-work\"],\n\t\t\t\"parallel-critical-path-reduction\",\n\t\t);\n\t}\n\tif (input.verificationRequired) {\n\t\treturn input.verificationAvailable\n\t\t\t? decision(\n\t\t\t\t\t\"one-child-plus-verification\",\n\t\t\t\t\t[\"independent-verification-required\"],\n\t\t\t\t\t\"independent-error-detection\",\n\t\t\t\t)\n\t\t\t: decision(\"abstain-insufficient-evidence\", [\"verification-unavailable\"]);\n\t}\n\tif (input.contextPressure === \"high\") {\n\t\treturn decision(\"one-child\", [\"declared-context-pressure\"], \"context-isolation\");\n\t}\n\treturn decision(\"parent-owned-direct\", [\"delegation-benefit-not-established\"]);\n}\n\nfunction decision(\n\trecommendation: DelegationAdmissionRecommendation,\n\treasonCodes: string[],\n\tbenefitHypothesis = \"none\",\n): DelegationAdmissionDecision {\n\treturn {\n\t\tversion: DELEGATION_ADMISSION_VERSION,\n\t\trecommendation,\n\t\treasonCodes,\n\t\tbenefitHypothesis,\n\t\tauditOnly: true,\n\t};\n}\n", "import { createHash } from \"node:crypto\";\nimport {\n\ttype DelegationAdmissionDecision,\n\tevaluateDelegationAdmission,\n} from \"./admission-policy.js\";\nimport {\n\ttype AgentConfig,\n\ttype AgentSource,\n\tresolveAgentToolNames,\n\ttype SubagentThinkingLevel,\n} from \"./agents/types.js\";\nimport type { TargetPolicyAudit } from \"./cwd-policy.js\";\nimport type { DelegationContract } from \"./delegation-contract.js\";\nimport type { SubagentResultFormat } from \"./result-contract.js\";\n\nexport const EXECUTION_PLAN_VERSION = \"pi-subagents:execution-plan:v1\" as const;\nexport const EXECUTION_ACKNOWLEDGEMENT_VERSION = \"pi-subagents:acknowledgement:v1\" as const;\n\nexport type CapabilityFit = \"match\" | \"mismatch\" | \"unknown\";\nexport type ExecutionPlanTransport = \"subprocess\" | \"in-process\" | \"rpc\" | \"auto\";\n\nexport interface ExecutionPlanAgentProjection {\n\tname: string;\n\tsource: AgentSource;\n\tcapabilitiesKnown: boolean;\n}\n\nexport interface ExecutionPlan {\n\tversion: typeof EXECUTION_PLAN_VERSION;\n\tid: string;\n\tmode: \"audit\" | \"enforce\";\n\ttaskId?: string;\n\ttaskGeneration: number;\n\tcancellationLineage: string[];\n\tadmission: DelegationAdmissionDecision;\n\tagent: ExecutionPlanAgentProjection;\n\tcapabilityFit: CapabilityFit;\n\tmissingCapabilities: string[];\n\trequestedCapabilities: string[];\n\tdeclaredCapabilities: string[];\n\trequestedTools: string[];\n\teffectiveTools?: string[];\n\tmissingTools: string[];\n\tovergrantedTools: string[];\n\tresultFormat: SubagentResultFormat;\n\tsideEffectPolicy: \"read-only\" | \"idempotent\" | \"mutating\";\n\tresultFormatSupported: boolean | \"unknown\";\n\ttarget: TargetPolicyAudit;\n\tworkspaceMode: \"shared\" | \"worktree\";\n\ttransport: ExecutionPlanTransport;\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttimeoutMs?: number;\n\tunsupportedGuarantees: string[];\n\twarnings: string[];\n}\n\nexport interface ExecutionAcknowledgement {\n\tversion: typeof EXECUTION_ACKNOWLEDGEMENT_VERSION;\n\tstatus: \"accepted\" | \"rejected\";\n\treasonCodes: string[];\n\trecoveryActions: string[];\n}\n\nexport interface CreateExecutionPlanInput {\n\tcontract?: DelegationContract;\n\tagent: AgentConfig;\n\teffectiveTools?: string[];\n\ttarget: TargetPolicyAudit;\n\tworkspaceMode: \"shared\" | \"worktree\";\n\ttransport: ExecutionPlanTransport;\n\tresultFormat: SubagentResultFormat;\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttimeoutMs?: number;\n\ttaskGeneration?: number;\n\tcancellationLineage?: string[];\n}\n\nexport function createExecutionPlan(input: CreateExecutionPlanInput): ExecutionPlan {\n\tconst manifest = input.agent.capabilityManifest;\n\tconst requestedCapabilities = unique(input.contract?.requestedAuthority?.capabilities ?? []);\n\tconst declaredCapabilities = unique(manifest?.capabilities ?? []);\n\tconst missingCapabilities = requestedCapabilities.filter(\n\t\t(capability) => !declaredCapabilities.includes(capability),\n\t);\n\tconst capabilityFit: CapabilityFit = manifest\n\t\t? missingCapabilities.length > 0\n\t\t\t? \"mismatch\"\n\t\t\t: \"match\"\n\t\t: \"unknown\";\n\tconst requestedTools = unique(input.contract?.requestedAuthority?.tools ?? []);\n\tconst effectiveTools = input.effectiveTools ? unique(input.effectiveTools) : undefined;\n\tconst missingTools = requestedTools.filter((tool) => !(effectiveTools ?? []).includes(tool));\n\tconst overgrantedTools =\n\t\trequestedTools.length === 0\n\t\t\t? []\n\t\t\t: (effectiveTools ?? []).filter((tool) => !requestedTools.includes(tool));\n\tconst resultFormatSupported = manifest\n\t\t? manifest.resultFormats.includes(input.resultFormat)\n\t\t: \"unknown\";\n\tconst unsupportedGuarantees = unsupported(input.contract);\n\tconst taskGeneration = input.taskGeneration ?? 0;\n\tconst cancellationLineage = [...(input.cancellationLineage ?? [])];\n\tconst admissionRequest = input.contract?.admission;\n\tconst admission = evaluateDelegationAdmission({\n\t\tcontextPressure: admissionRequest?.contextPressure ?? \"low\",\n\t\tindependentWorkItems: admissionRequest?.independentWorkItems ?? 1,\n\t\tcoupling: admissionRequest?.coupling ?? \"dense\",\n\t\tverificationRequired: admissionRequest?.verificationRequired ?? false,\n\t\tverificationAvailable: admissionRequest?.verificationAvailable ?? false,\n\t\tcapabilitiesSupported: capabilityFit === \"match\" && missingTools.length === 0,\n\t\tbudgetAllowsChildren: admissionRequest?.budgetAllowsChildren ?? true,\n\t\tgenerationCurrent: true,\n\t\trequirementsComplete: admissionRequest?.requirementsComplete ?? false,\n\t});\n\tconst warnings: string[] = [];\n\tif (!manifest) warnings.push(\"agent-capabilities-unknown\");\n\tif (missingCapabilities.length > 0) warnings.push(\"capability-mismatch\");\n\tif (missingTools.length > 0) warnings.push(\"requested-tools-missing\");\n\tif (overgrantedTools.length > 0) warnings.push(\"tools-overgranted\");\n\tif (resultFormatSupported === false) warnings.push(\"result-format-unsupported\");\n\tif (unsupportedGuarantees.length > 0) warnings.push(\"unsupported-guarantees\");\n\tconst planWithoutId: Omit<ExecutionPlan, \"id\"> = {\n\t\tversion: EXECUTION_PLAN_VERSION,\n\t\tmode: input.contract?.enforcement ?? \"audit\",\n\t\t...(input.contract?.taskId ? { taskId: input.contract.taskId } : {}),\n\t\tagent: {\n\t\t\tname: input.agent.name,\n\t\t\tsource: input.agent.source,\n\t\t\tcapabilitiesKnown: manifest !== undefined,\n\t\t},\n\t\tcapabilityFit,\n\t\tmissingCapabilities,\n\t\trequestedCapabilities,\n\t\tdeclaredCapabilities,\n\t\trequestedTools,\n\t\t...(effectiveTools === undefined ? {} : { effectiveTools }),\n\t\tmissingTools,\n\t\tovergrantedTools,\n\t\tresultFormat: input.resultFormat,\n\t\tsideEffectPolicy: input.contract?.sideEffectPolicy ?? \"mutating\",\n\t\tresultFormatSupported,\n\t\ttarget: structuredClone(input.target),\n\t\tworkspaceMode: input.workspaceMode,\n\t\ttransport: input.transport,\n\t\t...(input.model === undefined ? {} : { model: input.model }),\n\t\t...(input.thinkingLevel === undefined ? {} : { thinkingLevel: input.thinkingLevel }),\n\t\t...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),\n\t\tunsupportedGuarantees,\n\t\twarnings,\n\t\ttaskGeneration,\n\t\tcancellationLineage,\n\t\tadmission,\n\t};\n\treturn { ...planWithoutId, id: executionPlanId(planWithoutId) };\n}\n\nexport function resolveContractTools(\n\tconfiguredTools: string[] | undefined,\n\tcontract: DelegationContract | undefined,\n): string[] | undefined {\n\tconst requested = contract?.requestedAuthority?.tools;\n\tif (contract?.enforcement !== \"enforce\" || requested === undefined) {\n\t\treturn configuredTools ? unique(configuredTools) : undefined;\n\t}\n\tconst availableTools = resolveAgentToolNames(configuredTools);\n\treturn unique(requested.filter((tool) => availableTools.includes(tool)));\n}\n\nexport function acknowledgeExecutionPlan(plan: ExecutionPlan): ExecutionAcknowledgement {\n\tif (plan.mode === \"audit\") {\n\t\treturn {\n\t\t\tversion: EXECUTION_ACKNOWLEDGEMENT_VERSION,\n\t\t\tstatus: \"accepted\",\n\t\t\treasonCodes: [],\n\t\t\trecoveryActions: [],\n\t\t};\n\t}\n\tconst reasonCodes: string[] = [];\n\tconst recoveryActions: string[] = [];\n\tif (plan.capabilityFit === \"unknown\") {\n\t\treasonCodes.push(\"capabilities-unknown\");\n\t\trecoveryActions.push(\"declare-capabilities\", \"reroute\");\n\t}\n\tif (plan.missingCapabilities.length > 0) {\n\t\treasonCodes.push(\"capability-mismatch\");\n\t\trecoveryActions.push(\"reroute\");\n\t}\n\tif (plan.missingTools.length > 0) {\n\t\treasonCodes.push(\"authority-missing\");\n\t\trecoveryActions.push(\"grant-authority\", \"reroute\");\n\t}\n\tif (plan.overgrantedTools.length > 0) {\n\t\treasonCodes.push(\"authority-overgranted\");\n\t\trecoveryActions.push(\"narrow-authority\");\n\t}\n\tif (plan.resultFormatSupported !== true) {\n\t\treasonCodes.push(\"result-format-unsupported\");\n\t\trecoveryActions.push(\"reroute\", \"change-result-format\");\n\t}\n\tif (plan.unsupportedGuarantees.length > 0) {\n\t\treasonCodes.push(\"unsupported-guarantee\");\n\t\trecoveryActions.push(\"stop\");\n\t}\n\treturn {\n\t\tversion: EXECUTION_ACKNOWLEDGEMENT_VERSION,\n\t\tstatus: reasonCodes.length === 0 ? \"accepted\" : \"rejected\",\n\t\treasonCodes: unique(reasonCodes),\n\t\trecoveryActions: unique(recoveryActions),\n\t};\n}\n\nexport function copyExecutionPlan(plan: ExecutionPlan): ExecutionPlan {\n\tconst { id: _storedId, ...cloned } = structuredClone(plan);\n\tconst legacyAdmission = evaluateDelegationAdmission({\n\t\tcontextPressure: \"low\",\n\t\tindependentWorkItems: 1,\n\t\tcoupling: \"dense\",\n\t\tverificationRequired: false,\n\t\tverificationAvailable: false,\n\t\tcapabilitiesSupported: false,\n\t\tbudgetAllowsChildren: true,\n\t\tgenerationCurrent: true,\n\t\trequirementsComplete: false,\n\t});\n\tconst normalized = {\n\t\t...cloned,\n\t\tsideEffectPolicy: plan.sideEffectPolicy ?? \"mutating\",\n\t\ttaskGeneration: plan.taskGeneration ?? 0,\n\t\tcancellationLineage: plan.cancellationLineage ?? [],\n\t\tadmission: plan.admission ?? legacyAdmission,\n\t};\n\treturn { ...normalized, id: executionPlanId(normalized) };\n}\n\nexport function rotateExecutionPlanGeneration(plan: ExecutionPlan): ExecutionPlan {\n\tconst normalized = copyExecutionPlan(plan);\n\tconst { id: previousId, ...withoutId } = normalized;\n\tconst rotated = {\n\t\t...withoutId,\n\t\ttaskGeneration: normalized.taskGeneration + 1,\n\t\tcancellationLineage: [...normalized.cancellationLineage, previousId],\n\t};\n\treturn { ...rotated, id: executionPlanId(rotated) };\n}\n\nexport function isExecutionPlan(value: unknown): value is ExecutionPlan {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst plan = value as Partial<ExecutionPlan>;\n\treturn (\n\t\tplan.version === EXECUTION_PLAN_VERSION &&\n\t\t(plan.mode === \"audit\" || plan.mode === \"enforce\") &&\n\t\tBoolean(plan.agent) &&\n\t\ttypeof plan.agent?.name === \"string\" &&\n\t\t[\"built-in\", \"user\", \"project\"].includes(String(plan.agent?.source)) &&\n\t\t[\"match\", \"mismatch\", \"unknown\"].includes(String(plan.capabilityFit)) &&\n\t\tArray.isArray(plan.missingCapabilities) &&\n\t\tplan.missingCapabilities.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.requestedCapabilities) &&\n\t\tplan.requestedCapabilities.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.declaredCapabilities) &&\n\t\tplan.declaredCapabilities.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.missingTools) &&\n\t\tplan.missingTools.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.requestedTools) &&\n\t\tplan.requestedTools.every((item) => typeof item === \"string\") &&\n\t\t(plan.effectiveTools === undefined ||\n\t\t\t(Array.isArray(plan.effectiveTools) &&\n\t\t\t\tplan.effectiveTools.every((item) => typeof item === \"string\"))) &&\n\t\tArray.isArray(plan.overgrantedTools) &&\n\t\tplan.overgrantedTools.every((item) => typeof item === \"string\") &&\n\t\t[\"text\", \"structured-v1\", \"structured-v2\"].includes(String(plan.resultFormat)) &&\n\t\t(typeof plan.resultFormatSupported === \"boolean\" || plan.resultFormatSupported === \"unknown\") &&\n\t\tBoolean(plan.target) &&\n\t\ttypeof plan.target?.cwd === \"string\" &&\n\t\t[\"current-workspace\", \"external\"].includes(String(plan.target?.boundary)) &&\n\t\t(plan.workspaceMode === \"shared\" || plan.workspaceMode === \"worktree\") &&\n\t\t[\"subprocess\", \"in-process\", \"rpc\", \"auto\"].includes(String(plan.transport)) &&\n\t\ttypeof plan.id === \"string\" &&\n\t\t/^[a-f0-9]{64}$/u.test(plan.id) &&\n\t\t(plan.taskGeneration === undefined ||\n\t\t\t(Number.isSafeInteger(plan.taskGeneration) && Number(plan.taskGeneration) >= 0)) &&\n\t\t(plan.cancellationLineage === undefined ||\n\t\t\t(Array.isArray(plan.cancellationLineage) &&\n\t\t\t\tplan.cancellationLineage.every((item) => typeof item === \"string\"))) &&\n\t\t(plan.admission === undefined ||\n\t\t\t(typeof plan.admission === \"object\" &&\n\t\t\t\tplan.admission.auditOnly === true &&\n\t\t\t\ttypeof plan.admission.recommendation === \"string\" &&\n\t\t\t\tArray.isArray(plan.admission.reasonCodes) &&\n\t\t\t\tplan.admission.reasonCodes.every((item) => typeof item === \"string\"))) &&\n\t\t(plan.sideEffectPolicy === undefined ||\n\t\t\t[\"read-only\", \"idempotent\", \"mutating\"].includes(String(plan.sideEffectPolicy))) &&\n\t\tArray.isArray(plan.unsupportedGuarantees) &&\n\t\tplan.unsupportedGuarantees.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.warnings) &&\n\t\tplan.warnings.every((item) => typeof item === \"string\") &&\n\t\tcopyExecutionPlan(plan as ExecutionPlan).id === plan.id\n\t);\n}\n\nfunction executionPlanId(plan: Omit<ExecutionPlan, \"id\"> | Record<string, unknown>): string {\n\treturn createHash(\"sha256\").update(JSON.stringify(plan)).digest(\"hex\");\n}\n\nfunction unsupported(contract: DelegationContract | undefined): string[] {\n\tif (!contract?.requestedAuthority) return [];\n\tconst authority = contract.requestedAuthority;\n\tconst result: string[] = [];\n\tif (authority.readPaths && authority.readPaths.length > 0) result.push(\"read-path-scope\");\n\tif (authority.writePaths && authority.writePaths.length > 0) result.push(\"write-path-scope\");\n\tif (authority.network === \"denied\") result.push(\"network-denial\");\n\tif (authority.network === \"required\") result.push(\"network-availability\");\n\tif (authority.secrets === \"denied\") result.push(\"secret-denial\");\n\tif (authority.secrets === \"required\") result.push(\"secret-availability\");\n\treturn result;\n}\n\nfunction unique(values: readonly string[]): string[] {\n\treturn [...new Set(values)];\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["export const DELEGATION_ADMISSION_VERSION = \"pi-subagents:admission:v1\" as const;\n\nexport type DelegationAdmissionRecommendation =\n\t| \"parent-owned-direct\"\n\t| \"one-child\"\n\t| \"one-child-plus-verification\"\n\t| \"bounded-two-child\"\n\t| \"abstain-insufficient-evidence\";\n\nexport interface DelegationAdmissionInput {\n\tcontextPressure: \"low\" | \"medium\" | \"high\";\n\tindependentWorkItems: number;\n\tcoupling: \"dense\" | \"sparse\";\n\tverificationRequired: boolean;\n\tverificationAvailable: boolean;\n\tcapabilitiesSupported: boolean;\n\tbudgetAllowsChildren: boolean;\n\tgenerationCurrent: boolean;\n\trequirementsComplete: boolean;\n}\n\nexport interface DelegationAdmissionDecision {\n\tversion: typeof DELEGATION_ADMISSION_VERSION;\n\trecommendation: DelegationAdmissionRecommendation;\n\treasonCodes: string[];\n\tbenefitHypothesis: string;\n\tauditOnly: true;\n}\n\nexport function evaluateDelegationAdmission(\n\tinput: DelegationAdmissionInput,\n): DelegationAdmissionDecision {\n\tif (!input.generationCurrent)\n\t\treturn decision(\"abstain-insufficient-evidence\", [\"stale-generation\"]);\n\tif (!input.requirementsComplete) {\n\t\treturn decision(\"abstain-insufficient-evidence\", [\"requirements-incomplete\"]);\n\t}\n\tif (!input.capabilitiesSupported) {\n\t\treturn decision(\"abstain-insufficient-evidence\", [\"capability-unsupported\"]);\n\t}\n\tif (!input.budgetAllowsChildren) {\n\t\treturn decision(\"parent-owned-direct\", [\"child-budget-insufficient\"]);\n\t}\n\tif (input.independentWorkItems >= 2 && input.coupling === \"sparse\") {\n\t\treturn decision(\n\t\t\t\"bounded-two-child\",\n\t\t\t[\"declared-independent-work\"],\n\t\t\t\"parallel-critical-path-reduction\",\n\t\t);\n\t}\n\tif (input.verificationRequired) {\n\t\treturn input.verificationAvailable\n\t\t\t? decision(\n\t\t\t\t\t\"one-child-plus-verification\",\n\t\t\t\t\t[\"independent-verification-required\"],\n\t\t\t\t\t\"independent-error-detection\",\n\t\t\t\t)\n\t\t\t: decision(\"abstain-insufficient-evidence\", [\"verification-unavailable\"]);\n\t}\n\tif (input.contextPressure === \"high\") {\n\t\treturn decision(\"one-child\", [\"declared-context-pressure\"], \"context-isolation\");\n\t}\n\treturn decision(\"parent-owned-direct\", [\"delegation-benefit-not-established\"]);\n}\n\nfunction decision(\n\trecommendation: DelegationAdmissionRecommendation,\n\treasonCodes: string[],\n\tbenefitHypothesis = \"none\",\n): DelegationAdmissionDecision {\n\treturn {\n\t\tversion: DELEGATION_ADMISSION_VERSION,\n\t\trecommendation,\n\t\treasonCodes,\n\t\tbenefitHypothesis,\n\t\tauditOnly: true,\n\t};\n}\n", "import { createHash } from \"node:crypto\";\nimport {\n\ttype DelegationAdmissionDecision,\n\tevaluateDelegationAdmission,\n} from \"./admission-policy.js\";\nimport {\n\ttype AgentConfig,\n\ttype AgentSource,\n\tresolveAgentToolNames,\n\ttype SubagentThinkingLevel,\n} from \"./agents/types.js\";\nimport type { TargetPolicyAudit } from \"./cwd-policy.js\";\nimport type { DelegationContract } from \"./delegation-contract.js\";\nimport type { SubagentResultFormat } from \"./result-contract.js\";\n\nexport const EXECUTION_PLAN_VERSION = \"pi-subagents:execution-plan:v1\" as const;\nexport const EXECUTION_ACKNOWLEDGEMENT_VERSION = \"pi-subagents:acknowledgement:v1\" as const;\n\nexport type CapabilityFit = \"match\" | \"mismatch\" | \"unknown\";\nexport type ExecutionPlanTransport = \"subprocess\" | \"in-process\" | \"rpc\" | \"auto\";\n\nexport interface ExecutionPlanAgentProjection {\n\tname: string;\n\tsource: AgentSource;\n\tcapabilitiesKnown: boolean;\n}\n\nexport interface ExecutionPlan {\n\tversion: typeof EXECUTION_PLAN_VERSION;\n\tid: string;\n\tmode: \"audit\" | \"enforce\";\n\ttaskId?: string;\n\ttaskGeneration: number;\n\tcancellationLineage: string[];\n\tadmission: DelegationAdmissionDecision;\n\tagent: ExecutionPlanAgentProjection;\n\tcapabilityFit: CapabilityFit;\n\tmissingCapabilities: string[];\n\trequestedCapabilities: string[];\n\tdeclaredCapabilities: string[];\n\trequestedTools: string[];\n\teffectiveTools?: string[];\n\tmissingTools: string[];\n\tovergrantedTools: string[];\n\tresultFormat: SubagentResultFormat;\n\tsideEffectPolicy: \"read-only\" | \"idempotent\" | \"mutating\";\n\tresultFormatSupported: boolean | \"unknown\";\n\ttarget: TargetPolicyAudit;\n\tworkspaceMode: \"shared\" | \"worktree\";\n\ttransport: ExecutionPlanTransport;\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttimeoutMs?: number;\n\tunsupportedGuarantees: string[];\n\twarnings: string[];\n}\n\nexport interface ExecutionAcknowledgement {\n\tversion: typeof EXECUTION_ACKNOWLEDGEMENT_VERSION;\n\tstatus: \"accepted\" | \"rejected\";\n\treasonCodes: string[];\n\trecoveryActions: string[];\n}\n\nexport interface CreateExecutionPlanInput {\n\tcontract?: DelegationContract;\n\tagent: AgentConfig;\n\teffectiveTools?: string[];\n\ttarget: TargetPolicyAudit;\n\tworkspaceMode: \"shared\" | \"worktree\";\n\ttransport: ExecutionPlanTransport;\n\tresultFormat: SubagentResultFormat;\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttimeoutMs?: number;\n\ttaskGeneration?: number;\n\tcancellationLineage?: string[];\n}\n\nexport function createExecutionPlan(input: CreateExecutionPlanInput): ExecutionPlan {\n\tconst manifest = input.agent.capabilityManifest;\n\tconst requestedCapabilities = unique(input.contract?.requestedAuthority?.capabilities ?? []);\n\tconst declaredCapabilities = unique(manifest?.capabilities ?? []);\n\tconst missingCapabilities = requestedCapabilities.filter(\n\t\t(capability) => !declaredCapabilities.includes(capability),\n\t);\n\tconst capabilityFit: CapabilityFit = manifest\n\t\t? missingCapabilities.length > 0\n\t\t\t? \"mismatch\"\n\t\t\t: \"match\"\n\t\t: \"unknown\";\n\tconst requestedTools = unique(input.contract?.requestedAuthority?.tools ?? []);\n\tconst effectiveTools = input.effectiveTools ? unique(input.effectiveTools) : undefined;\n\tconst missingTools = requestedTools.filter((tool) => !(effectiveTools ?? []).includes(tool));\n\tconst overgrantedTools =\n\t\trequestedTools.length === 0\n\t\t\t? []\n\t\t\t: (effectiveTools ?? []).filter((tool) => !requestedTools.includes(tool));\n\tconst resultFormatSupported = manifest\n\t\t? manifest.resultFormats.includes(input.resultFormat)\n\t\t: \"unknown\";\n\tconst unsupportedGuarantees = unsupported(input.contract);\n\tconst taskGeneration = input.taskGeneration ?? 0;\n\tconst cancellationLineage = [...(input.cancellationLineage ?? [])];\n\tconst admissionRequest = input.contract?.admission;\n\tconst admission = evaluateDelegationAdmission({\n\t\tcontextPressure: admissionRequest?.contextPressure ?? \"low\",\n\t\tindependentWorkItems: admissionRequest?.independentWorkItems ?? 1,\n\t\tcoupling: admissionRequest?.coupling ?? \"dense\",\n\t\tverificationRequired: admissionRequest?.verificationRequired ?? false,\n\t\tverificationAvailable: admissionRequest?.verificationAvailable ?? false,\n\t\tcapabilitiesSupported: capabilityFit === \"match\" && missingTools.length === 0,\n\t\tbudgetAllowsChildren: admissionRequest?.budgetAllowsChildren ?? true,\n\t\tgenerationCurrent: true,\n\t\trequirementsComplete: admissionRequest?.requirementsComplete ?? false,\n\t});\n\tconst warnings: string[] = [];\n\tif (!manifest) warnings.push(\"agent-capabilities-unknown\");\n\tif (missingCapabilities.length > 0) warnings.push(\"capability-mismatch\");\n\tif (missingTools.length > 0) warnings.push(\"requested-tools-missing\");\n\tif (overgrantedTools.length > 0) warnings.push(\"tools-overgranted\");\n\tif (resultFormatSupported === false) warnings.push(\"result-format-unsupported\");\n\tif (unsupportedGuarantees.length > 0) warnings.push(\"unsupported-guarantees\");\n\tconst planWithoutId: Omit<ExecutionPlan, \"id\"> = {\n\t\tversion: EXECUTION_PLAN_VERSION,\n\t\tmode: input.contract?.enforcement ?? \"audit\",\n\t\t...(input.contract?.taskId ? { taskId: input.contract.taskId } : {}),\n\t\tagent: {\n\t\t\tname: input.agent.name,\n\t\t\tsource: input.agent.source,\n\t\t\tcapabilitiesKnown: manifest !== undefined,\n\t\t},\n\t\tcapabilityFit,\n\t\tmissingCapabilities,\n\t\trequestedCapabilities,\n\t\tdeclaredCapabilities,\n\t\trequestedTools,\n\t\t...(effectiveTools === undefined ? {} : { effectiveTools }),\n\t\tmissingTools,\n\t\tovergrantedTools,\n\t\tresultFormat: input.resultFormat,\n\t\tsideEffectPolicy: input.contract?.sideEffectPolicy ?? \"mutating\",\n\t\tresultFormatSupported,\n\t\ttarget: structuredClone(input.target),\n\t\tworkspaceMode: input.workspaceMode,\n\t\ttransport: input.transport,\n\t\t...(input.model === undefined ? {} : { model: input.model }),\n\t\t...(input.thinkingLevel === undefined ? {} : { thinkingLevel: input.thinkingLevel }),\n\t\t...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),\n\t\tunsupportedGuarantees,\n\t\twarnings,\n\t\ttaskGeneration,\n\t\tcancellationLineage,\n\t\tadmission,\n\t};\n\treturn { ...planWithoutId, id: executionPlanId(planWithoutId) };\n}\n\nexport function resolveContractTools(\n\tconfiguredTools: string[] | undefined,\n\tcontract: DelegationContract | undefined,\n): string[] | undefined {\n\tconst requested = contract?.requestedAuthority?.tools;\n\tif (contract?.enforcement !== \"enforce\" || requested === undefined) {\n\t\treturn configuredTools ? unique(configuredTools) : undefined;\n\t}\n\tconst availableTools = resolveAgentToolNames(configuredTools);\n\treturn unique(requested.filter((tool) => availableTools.includes(tool)));\n}\n\nexport function acknowledgeExecutionPlan(plan: ExecutionPlan): ExecutionAcknowledgement {\n\tif (plan.mode === \"audit\") {\n\t\treturn {\n\t\t\tversion: EXECUTION_ACKNOWLEDGEMENT_VERSION,\n\t\t\tstatus: \"accepted\",\n\t\t\treasonCodes: [],\n\t\t\trecoveryActions: [],\n\t\t};\n\t}\n\tconst reasonCodes: string[] = [];\n\tconst recoveryActions: string[] = [];\n\tif (plan.capabilityFit === \"unknown\") {\n\t\treasonCodes.push(\"capabilities-unknown\");\n\t\trecoveryActions.push(\"declare-capabilities\", \"reroute\");\n\t}\n\tif (plan.missingCapabilities.length > 0) {\n\t\treasonCodes.push(\"capability-mismatch\");\n\t\trecoveryActions.push(\"reroute\");\n\t}\n\tif (plan.missingTools.length > 0) {\n\t\treasonCodes.push(\"authority-missing\");\n\t\trecoveryActions.push(\"grant-authority\", \"reroute\");\n\t}\n\tif (plan.overgrantedTools.length > 0) {\n\t\treasonCodes.push(\"authority-overgranted\");\n\t\trecoveryActions.push(\"narrow-authority\");\n\t}\n\tif (plan.resultFormatSupported !== true) {\n\t\treasonCodes.push(\"result-format-unsupported\");\n\t\trecoveryActions.push(\"reroute\", \"change-result-format\");\n\t}\n\tif (plan.unsupportedGuarantees.length > 0) {\n\t\treasonCodes.push(\"unsupported-guarantee\");\n\t\trecoveryActions.push(\"repair-contract\", \"stop\");\n\t}\n\treturn {\n\t\tversion: EXECUTION_ACKNOWLEDGEMENT_VERSION,\n\t\tstatus: reasonCodes.length === 0 ? \"accepted\" : \"rejected\",\n\t\treasonCodes: unique(reasonCodes),\n\t\trecoveryActions: unique(recoveryActions),\n\t};\n}\n\nexport function copyExecutionPlan(plan: ExecutionPlan): ExecutionPlan {\n\tconst { id: _storedId, ...cloned } = structuredClone(plan);\n\tconst legacyAdmission = evaluateDelegationAdmission({\n\t\tcontextPressure: \"low\",\n\t\tindependentWorkItems: 1,\n\t\tcoupling: \"dense\",\n\t\tverificationRequired: false,\n\t\tverificationAvailable: false,\n\t\tcapabilitiesSupported: false,\n\t\tbudgetAllowsChildren: true,\n\t\tgenerationCurrent: true,\n\t\trequirementsComplete: false,\n\t});\n\tconst normalized = {\n\t\t...cloned,\n\t\tsideEffectPolicy: plan.sideEffectPolicy ?? \"mutating\",\n\t\ttaskGeneration: plan.taskGeneration ?? 0,\n\t\tcancellationLineage: plan.cancellationLineage ?? [],\n\t\tadmission: plan.admission ?? legacyAdmission,\n\t};\n\treturn { ...normalized, id: executionPlanId(normalized) };\n}\n\nexport function rotateExecutionPlanGeneration(plan: ExecutionPlan): ExecutionPlan {\n\tconst normalized = copyExecutionPlan(plan);\n\tconst { id: previousId, ...withoutId } = normalized;\n\tconst rotated = {\n\t\t...withoutId,\n\t\ttaskGeneration: normalized.taskGeneration + 1,\n\t\tcancellationLineage: [...normalized.cancellationLineage, previousId],\n\t};\n\treturn { ...rotated, id: executionPlanId(rotated) };\n}\n\nexport function isExecutionPlan(value: unknown): value is ExecutionPlan {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst plan = value as Partial<ExecutionPlan>;\n\treturn (\n\t\tplan.version === EXECUTION_PLAN_VERSION &&\n\t\t(plan.mode === \"audit\" || plan.mode === \"enforce\") &&\n\t\tBoolean(plan.agent) &&\n\t\ttypeof plan.agent?.name === \"string\" &&\n\t\t[\"built-in\", \"user\", \"project\"].includes(String(plan.agent?.source)) &&\n\t\t[\"match\", \"mismatch\", \"unknown\"].includes(String(plan.capabilityFit)) &&\n\t\tArray.isArray(plan.missingCapabilities) &&\n\t\tplan.missingCapabilities.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.requestedCapabilities) &&\n\t\tplan.requestedCapabilities.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.declaredCapabilities) &&\n\t\tplan.declaredCapabilities.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.missingTools) &&\n\t\tplan.missingTools.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.requestedTools) &&\n\t\tplan.requestedTools.every((item) => typeof item === \"string\") &&\n\t\t(plan.effectiveTools === undefined ||\n\t\t\t(Array.isArray(plan.effectiveTools) &&\n\t\t\t\tplan.effectiveTools.every((item) => typeof item === \"string\"))) &&\n\t\tArray.isArray(plan.overgrantedTools) &&\n\t\tplan.overgrantedTools.every((item) => typeof item === \"string\") &&\n\t\t[\"text\", \"structured-v1\", \"structured-v2\"].includes(String(plan.resultFormat)) &&\n\t\t(typeof plan.resultFormatSupported === \"boolean\" || plan.resultFormatSupported === \"unknown\") &&\n\t\tBoolean(plan.target) &&\n\t\ttypeof plan.target?.cwd === \"string\" &&\n\t\t[\"current-workspace\", \"external\"].includes(String(plan.target?.boundary)) &&\n\t\t(plan.workspaceMode === \"shared\" || plan.workspaceMode === \"worktree\") &&\n\t\t[\"subprocess\", \"in-process\", \"rpc\", \"auto\"].includes(String(plan.transport)) &&\n\t\ttypeof plan.id === \"string\" &&\n\t\t/^[a-f0-9]{64}$/u.test(plan.id) &&\n\t\t(plan.taskGeneration === undefined ||\n\t\t\t(Number.isSafeInteger(plan.taskGeneration) && Number(plan.taskGeneration) >= 0)) &&\n\t\t(plan.cancellationLineage === undefined ||\n\t\t\t(Array.isArray(plan.cancellationLineage) &&\n\t\t\t\tplan.cancellationLineage.every((item) => typeof item === \"string\"))) &&\n\t\t(plan.admission === undefined ||\n\t\t\t(typeof plan.admission === \"object\" &&\n\t\t\t\tplan.admission.auditOnly === true &&\n\t\t\t\ttypeof plan.admission.recommendation === \"string\" &&\n\t\t\t\tArray.isArray(plan.admission.reasonCodes) &&\n\t\t\t\tplan.admission.reasonCodes.every((item) => typeof item === \"string\"))) &&\n\t\t(plan.sideEffectPolicy === undefined ||\n\t\t\t[\"read-only\", \"idempotent\", \"mutating\"].includes(String(plan.sideEffectPolicy))) &&\n\t\tArray.isArray(plan.unsupportedGuarantees) &&\n\t\tplan.unsupportedGuarantees.every((item) => typeof item === \"string\") &&\n\t\tArray.isArray(plan.warnings) &&\n\t\tplan.warnings.every((item) => typeof item === \"string\") &&\n\t\tcopyExecutionPlan(plan as ExecutionPlan).id === plan.id\n\t);\n}\n\nfunction executionPlanId(plan: Omit<ExecutionPlan, \"id\"> | Record<string, unknown>): string {\n\treturn createHash(\"sha256\").update(JSON.stringify(plan)).digest(\"hex\");\n}\n\nfunction unsupported(contract: DelegationContract | undefined): string[] {\n\tif (!contract?.requestedAuthority) return [];\n\tconst authority = contract.requestedAuthority;\n\tconst result: string[] = [];\n\tif (authority.readPaths && authority.readPaths.length > 0) result.push(\"read-path-scope\");\n\tif (authority.writePaths && authority.writePaths.length > 0) result.push(\"write-path-scope\");\n\tif (authority.network === \"denied\") result.push(\"network-denial\");\n\tif (authority.network === \"required\") result.push(\"network-availability\");\n\tif (authority.secrets === \"denied\") result.push(\"secret-denial\");\n\tif (authority.secrets === \"required\") result.push(\"secret-availability\");\n\treturn result;\n}\n\nfunction unique(values: readonly string[]): string[] {\n\treturn [...new Set(values)];\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAAO,IAAM,+BAA+B;AA6BrC,SAAS,4BACf,OAC8B;AAC9B,MAAI,CAAC,MAAM;AACV,WAAO,SAAS,iCAAiC,CAAC,kBAAkB,CAAC;AACtE,MAAI,CAAC,MAAM,sBAAsB;AAChC,WAAO,SAAS,iCAAiC,CAAC,yBAAyB,CAAC;AAAA,EAC7E;AACA,MAAI,CAAC,MAAM,uBAAuB;AACjC,WAAO,SAAS,iCAAiC,CAAC,wBAAwB,CAAC;AAAA,EAC5E;AACA,MAAI,CAAC,MAAM,sBAAsB;AAChC,WAAO,SAAS,uBAAuB,CAAC,2BAA2B,CAAC;AAAA,EACrE;AACA,MAAI,MAAM,wBAAwB,KAAK,MAAM,aAAa,UAAU;AACnE,WAAO;AAAA,MACN;AAAA,MACA,CAAC,2BAA2B;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;AACA,MAAI,MAAM,sBAAsB;AAC/B,WAAO,MAAM,wBACV;AAAA,MACA;AAAA,MACA,CAAC,mCAAmC;AAAA,MACpC;AAAA,IACD,IACC,SAAS,iCAAiC,CAAC,0BAA0B,CAAC;AAAA,EAC1E;AACA,MAAI,MAAM,oBAAoB,QAAQ;AACrC,WAAO,SAAS,aAAa,CAAC,2BAA2B,GAAG,mBAAmB;AAAA,EAChF;AACA,SAAO,SAAS,uBAAuB,CAAC,oCAAoC,CAAC;AAC9E;AAEA,SAAS,SACR,gBACA,aACA,oBAAoB,QACU;AAC9B,SAAO;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACZ;AACD;;;AC7EA,SAAS,kBAAkB;AAepB,IAAM,yBAAyB;AAC/B,IAAM,oCAAoC;AA+D1C,SAAS,oBAAoB,OAAgD;AACnF,QAAM,WAAW,MAAM,MAAM;AAC7B,QAAM,wBAAwB,OAAO,MAAM,UAAU,oBAAoB,gBAAgB,CAAC,CAAC;AAC3F,QAAM,uBAAuB,OAAO,UAAU,gBAAgB,CAAC,CAAC;AAChE,QAAM,sBAAsB,sBAAsB;AAAA,IACjD,CAAC,eAAe,CAAC,qBAAqB,SAAS,UAAU;AAAA,EAC1D;AACA,QAAM,gBAA+B,WAClC,oBAAoB,SAAS,IAC5B,aACA,UACD;AACH,QAAM,iBAAiB,OAAO,MAAM,UAAU,oBAAoB,SAAS,CAAC,CAAC;AAC7E,QAAM,iBAAiB,MAAM,iBAAiB,OAAO,MAAM,cAAc,IAAI;AAC7E,QAAM,eAAe,eAAe,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,GAAG,SAAS,IAAI,CAAC;AAC3F,QAAM,mBACL,eAAe,WAAW,IACvB,CAAC,KACA,kBAAkB,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,eAAe,SAAS,IAAI,CAAC;AAC1E,QAAM,wBAAwB,WAC3B,SAAS,cAAc,SAAS,MAAM,YAAY,IAClD;AACH,QAAM,wBAAwB,YAAY,MAAM,QAAQ;AACxD,QAAM,iBAAiB,MAAM,kBAAkB;AAC/C,QAAM,sBAAsB,CAAC,GAAI,MAAM,uBAAuB,CAAC,CAAE;AACjE,QAAM,mBAAmB,MAAM,UAAU;AACzC,QAAM,YAAY,4BAA4B;AAAA,IAC7C,iBAAiB,kBAAkB,mBAAmB;AAAA,IACtD,sBAAsB,kBAAkB,wBAAwB;AAAA,IAChE,UAAU,kBAAkB,YAAY;AAAA,IACxC,sBAAsB,kBAAkB,wBAAwB;AAAA,IAChE,uBAAuB,kBAAkB,yBAAyB;AAAA,IAClE,uBAAuB,kBAAkB,WAAW,aAAa,WAAW;AAAA,IAC5E,sBAAsB,kBAAkB,wBAAwB;AAAA,IAChE,mBAAmB;AAAA,IACnB,sBAAsB,kBAAkB,wBAAwB;AAAA,EACjE,CAAC;AACD,QAAM,WAAqB,CAAC;AAC5B,MAAI,CAAC,SAAU,UAAS,KAAK,4BAA4B;AACzD,MAAI,oBAAoB,SAAS,EAAG,UAAS,KAAK,qBAAqB;AACvE,MAAI,aAAa,SAAS,EAAG,UAAS,KAAK,yBAAyB;AACpE,MAAI,iBAAiB,SAAS,EAAG,UAAS,KAAK,mBAAmB;AAClE,MAAI,0BAA0B,MAAO,UAAS,KAAK,2BAA2B;AAC9E,MAAI,sBAAsB,SAAS,EAAG,UAAS,KAAK,wBAAwB;AAC5E,QAAM,gBAA2C;AAAA,IAChD,SAAS;AAAA,IACT,MAAM,MAAM,UAAU,eAAe;AAAA,IACrC,GAAI,MAAM,UAAU,SAAS,EAAE,QAAQ,MAAM,SAAS,OAAO,IAAI,CAAC;AAAA,IAClE,OAAO;AAAA,MACN,MAAM,MAAM,MAAM;AAAA,MAClB,QAAQ,MAAM,MAAM;AAAA,MACpB,mBAAmB,aAAa;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,IACzD;AAAA,IACA;AAAA,IACA,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM,UAAU,oBAAoB;AAAA,IACtD;AAAA,IACA,QAAQ,gBAAgB,MAAM,MAAM;AAAA,IACpC,eAAe,MAAM;AAAA,IACrB,WAAW,MAAM;AAAA,IACjB,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,kBAAkB,SAAY,CAAC,IAAI,EAAE,eAAe,MAAM,cAAc;AAAA,IAClF,GAAI,MAAM,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;AAAA,IACtE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,SAAO,EAAE,GAAG,eAAe,IAAI,gBAAgB,aAAa,EAAE;AAC/D;AAEO,SAAS,qBACf,iBACA,UACuB;AACvB,QAAM,YAAY,UAAU,oBAAoB;AAChD,MAAI,UAAU,gBAAgB,aAAa,cAAc,QAAW;AACnE,WAAO,kBAAkB,OAAO,eAAe,IAAI;AAAA,EACpD;AACA,QAAM,iBAAiB,sBAAsB,eAAe;AAC5D,SAAO,OAAO,UAAU,OAAO,CAAC,SAAS,eAAe,SAAS,IAAI,CAAC,CAAC;AACxE;AAEO,SAAS,yBAAyB,MAA+C;AACvF,MAAI,KAAK,SAAS,SAAS;AAC1B,WAAO;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,aAAa,CAAC;AAAA,MACd,iBAAiB,CAAC;AAAA,IACnB;AAAA,EACD;AACA,QAAM,cAAwB,CAAC;AAC/B,QAAM,kBAA4B,CAAC;AACnC,MAAI,KAAK,kBAAkB,WAAW;AACrC,gBAAY,KAAK,sBAAsB;AACvC,oBAAgB,KAAK,wBAAwB,SAAS;AAAA,EACvD;AACA,MAAI,KAAK,oBAAoB,SAAS,GAAG;AACxC,gBAAY,KAAK,qBAAqB;AACtC,oBAAgB,KAAK,SAAS;AAAA,EAC/B;AACA,MAAI,KAAK,aAAa,SAAS,GAAG;AACjC,gBAAY,KAAK,mBAAmB;AACpC,oBAAgB,KAAK,mBAAmB,SAAS;AAAA,EAClD;AACA,MAAI,KAAK,iBAAiB,SAAS,GAAG;AACrC,gBAAY,KAAK,uBAAuB;AACxC,oBAAgB,KAAK,kBAAkB;AAAA,EACxC;AACA,MAAI,KAAK,0BAA0B,MAAM;AACxC,gBAAY,KAAK,2BAA2B;AAC5C,oBAAgB,KAAK,WAAW,sBAAsB;AAAA,EACvD;AACA,MAAI,KAAK,sBAAsB,SAAS,GAAG;AAC1C,gBAAY,KAAK,uBAAuB;AACxC,oBAAgB,KAAK,mBAAmB,MAAM;AAAA,EAC/C;AACA,SAAO;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,YAAY,WAAW,IAAI,aAAa;AAAA,IAChD,aAAa,OAAO,WAAW;AAAA,IAC/B,iBAAiB,OAAO,eAAe;AAAA,EACxC;AACD;AAEO,SAAS,kBAAkB,MAAoC;AACrE,QAAM,EAAE,IAAI,WAAW,GAAG,OAAO,IAAI,gBAAgB,IAAI;AACzD,QAAM,kBAAkB,4BAA4B;AAAA,IACnD,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,UAAU;AAAA,IACV,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,EACvB,CAAC;AACD,QAAM,aAAa;AAAA,IAClB,GAAG;AAAA,IACH,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,qBAAqB,KAAK,uBAAuB,CAAC;AAAA,IAClD,WAAW,KAAK,aAAa;AAAA,EAC9B;AACA,SAAO,EAAE,GAAG,YAAY,IAAI,gBAAgB,UAAU,EAAE;AACzD;AAEO,SAAS,8BAA8B,MAAoC;AACjF,QAAM,aAAa,kBAAkB,IAAI;AACzC,QAAM,EAAE,IAAI,YAAY,GAAG,UAAU,IAAI;AACzC,QAAM,UAAU;AAAA,IACf,GAAG;AAAA,IACH,gBAAgB,WAAW,iBAAiB;AAAA,IAC5C,qBAAqB,CAAC,GAAG,WAAW,qBAAqB,UAAU;AAAA,EACpE;AACA,SAAO,EAAE,GAAG,SAAS,IAAI,gBAAgB,OAAO,EAAE;AACnD;AAEO,SAAS,gBAAgB,OAAwC;AACvE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,OAAO;AACb,SACC,KAAK,YAAY,2BAChB,KAAK,SAAS,WAAW,KAAK,SAAS,cACxC,QAAQ,KAAK,KAAK,KAClB,OAAO,KAAK,OAAO,SAAS,YAC5B,CAAC,YAAY,QAAQ,SAAS,EAAE,SAAS,OAAO,KAAK,OAAO,MAAM,CAAC,KACnE,CAAC,SAAS,YAAY,SAAS,EAAE,SAAS,OAAO,KAAK,aAAa,CAAC,KACpE,MAAM,QAAQ,KAAK,mBAAmB,KACtC,KAAK,oBAAoB,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KACjE,MAAM,QAAQ,KAAK,qBAAqB,KACxC,KAAK,sBAAsB,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KACnE,MAAM,QAAQ,KAAK,oBAAoB,KACvC,KAAK,qBAAqB,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KAClE,MAAM,QAAQ,KAAK,YAAY,KAC/B,KAAK,aAAa,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KAC1D,MAAM,QAAQ,KAAK,cAAc,KACjC,KAAK,eAAe,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,MAC3D,KAAK,mBAAmB,UACvB,MAAM,QAAQ,KAAK,cAAc,KACjC,KAAK,eAAe,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,MAC9D,MAAM,QAAQ,KAAK,gBAAgB,KACnC,KAAK,iBAAiB,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KAC9D,CAAC,QAAQ,iBAAiB,eAAe,EAAE,SAAS,OAAO,KAAK,YAAY,CAAC,MAC5E,OAAO,KAAK,0BAA0B,aAAa,KAAK,0BAA0B,cACnF,QAAQ,KAAK,MAAM,KACnB,OAAO,KAAK,QAAQ,QAAQ,YAC5B,CAAC,qBAAqB,UAAU,EAAE,SAAS,OAAO,KAAK,QAAQ,QAAQ,CAAC,MACvE,KAAK,kBAAkB,YAAY,KAAK,kBAAkB,eAC3D,CAAC,cAAc,cAAc,OAAO,MAAM,EAAE,SAAS,OAAO,KAAK,SAAS,CAAC,KAC3E,OAAO,KAAK,OAAO,YACnB,kBAAkB,KAAK,KAAK,EAAE,MAC7B,KAAK,mBAAmB,UACvB,OAAO,cAAc,KAAK,cAAc,KAAK,OAAO,KAAK,cAAc,KAAK,OAC7E,KAAK,wBAAwB,UAC5B,MAAM,QAAQ,KAAK,mBAAmB,KACtC,KAAK,oBAAoB,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,OAClE,KAAK,cAAc,UAClB,OAAO,KAAK,cAAc,YAC1B,KAAK,UAAU,cAAc,QAC7B,OAAO,KAAK,UAAU,mBAAmB,YACzC,MAAM,QAAQ,KAAK,UAAU,WAAW,KACxC,KAAK,UAAU,YAAY,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,OACpE,KAAK,qBAAqB,UAC1B,CAAC,aAAa,cAAc,UAAU,EAAE,SAAS,OAAO,KAAK,gBAAgB,CAAC,MAC/E,MAAM,QAAQ,KAAK,qBAAqB,KACxC,KAAK,sBAAsB,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KACnE,MAAM,QAAQ,KAAK,QAAQ,KAC3B,KAAK,SAAS,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,KACtD,kBAAkB,IAAqB,EAAE,OAAO,KAAK;AAEvD;AAEA,SAAS,gBAAgB,MAAmE;AAC3F,SAAO,WAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,IAAI,CAAC,EAAE,OAAO,KAAK;AACtE;AAEA,SAAS,YAAY,UAAoD;AACxE,MAAI,CAAC,UAAU,mBAAoB,QAAO,CAAC;AAC3C,QAAM,YAAY,SAAS;AAC3B,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU,aAAa,UAAU,UAAU,SAAS,EAAG,QAAO,KAAK,iBAAiB;AACxF,MAAI,UAAU,cAAc,UAAU,WAAW,SAAS,EAAG,QAAO,KAAK,kBAAkB;AAC3F,MAAI,UAAU,YAAY,SAAU,QAAO,KAAK,gBAAgB;AAChE,MAAI,UAAU,YAAY,WAAY,QAAO,KAAK,sBAAsB;AACxE,MAAI,UAAU,YAAY,SAAU,QAAO,KAAK,eAAe;AAC/D,MAAI,UAAU,YAAY,WAAY,QAAO,KAAK,qBAAqB;AACvE,SAAO;AACR;AAEA,SAAS,OAAO,QAAqC;AACpD,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAC3B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -8,13 +8,13 @@ import {
|
|
|
8
8
|
normalizeSubagentSettings,
|
|
9
9
|
pathEntryExists,
|
|
10
10
|
resolveSubagentSettingsPaths
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-TMZRHIIK.ts";
|
|
12
12
|
import {
|
|
13
13
|
STATEFUL_LIMIT_FIELDS,
|
|
14
14
|
isValidStatefulLimit,
|
|
15
15
|
resolveStatefulLimits,
|
|
16
16
|
statefulLimitDefinition
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-VDG7LTYE.ts";
|
|
18
18
|
import {
|
|
19
19
|
MAX_CONFIGURABLE_PARALLEL_TASKS
|
|
20
20
|
} from "./chunk-H3FP6DLR.ts";
|
|
@@ -107,6 +107,23 @@ function updateCompletionDeliverySetting(value) {
|
|
|
107
107
|
);
|
|
108
108
|
});
|
|
109
109
|
}
|
|
110
|
+
function updateUsageRecordingSetting(enabled) {
|
|
111
|
+
withSettingsMutationLock(() => {
|
|
112
|
+
const update = readSettingsObjectForUpdate();
|
|
113
|
+
const raw = update.document;
|
|
114
|
+
const usageRecording = raw.usageRecording;
|
|
115
|
+
if (usageRecording !== void 0 && !isPlainObject(usageRecording)) {
|
|
116
|
+
throw new Error(`Cannot update invalid ${SETTINGS_FILE} usageRecording settings`);
|
|
117
|
+
}
|
|
118
|
+
writeSettingsObjectUnlocked(
|
|
119
|
+
{
|
|
120
|
+
...raw,
|
|
121
|
+
usageRecording: { ...usageRecording ?? {}, enabled }
|
|
122
|
+
},
|
|
123
|
+
update.replaceCanonical
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
110
127
|
function updateBlockingMaxParallelTasksSetting(value) {
|
|
111
128
|
if (!isPositiveInteger(value) || value > MAX_CONFIGURABLE_PARALLEL_TASKS) {
|
|
112
129
|
throw new Error(
|
|
@@ -322,6 +339,7 @@ export {
|
|
|
322
339
|
updateDelegationWorkflowSetting,
|
|
323
340
|
updateStatefulTransportSetting,
|
|
324
341
|
updateCompletionDeliverySetting,
|
|
342
|
+
updateUsageRecordingSetting,
|
|
325
343
|
updateBlockingMaxParallelTasksSetting,
|
|
326
344
|
updateStatefulLimitSetting,
|
|
327
345
|
updateConsultResourceSetting,
|
|
@@ -332,4 +350,4 @@ export {
|
|
|
332
350
|
sameToolSet,
|
|
333
351
|
resolveSubagentThinkingLevel
|
|
334
352
|
};
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
353
|
+
//# sourceMappingURL=chunk-D4CR7T73.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/settings.ts"],
|
|
4
|
+
"sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type {\n\tAgentConfig,\n\tCompletionDelivery,\n\tConsultationCwdPolicy,\n\tConsultResourcePolicy,\n\tDelegationCwdPolicy,\n\tSubagentAgentConfig,\n\tSubagentSettings,\n\tSubagentThinkingLevel,\n\tSubagentTransportKind,\n} from \"./agents/types.js\";\nimport { MAX_CONFIGURABLE_PARALLEL_TASKS } from \"./limits.js\";\nimport type { DelegationWorkflow } from \"./settings/inspection.js\";\nimport {\n\thasOwn,\n\tisPlainObject,\n\tisPositiveInteger,\n\tnormalizeSubagentSettings,\n} from \"./settings/schema.js\";\nimport {\n\tpathEntryExists,\n\tresolveSubagentSettingsPaths,\n\tSUBAGENT_SETTINGS_FILE,\n} from \"./settings-reader.js\";\nimport {\n\tisValidStatefulLimit,\n\tresolveStatefulLimits,\n\tSTATEFUL_LIMIT_FIELDS,\n\ttype StatefulLimitField,\n\ttype StatefulLimits,\n\tstatefulLimitDefinition,\n} from \"./stateful-limits.js\";\n\nexport {\n\ttype BlockingParallelLimitSettingsSnapshot,\n\ttype CompletionDeliverySettingsSnapshot,\n\ttype ConsultResourceSettingsSnapshot,\n\ttype CwdPolicyFieldSnapshot,\n\ttype CwdPolicySettingsSnapshot,\n\tconsumeSubagentSettingsNotice,\n\tDEFAULT_CONSULT_RESOURCE_POLICY,\n\tDEFAULT_CONSULTATION_CWD_POLICY,\n\tDEFAULT_DELEGATION_CWD_POLICY,\n\ttype DelegationWorkflow,\n\ttype DelegationWorkflowSettingsSnapshot,\n\thasOwn,\n\tinspectBlockingParallelLimitSettings,\n\tinspectCompletionDeliverySettings,\n\tinspectConsultResourceSettings,\n\tinspectCwdPolicySettings,\n\tinspectDelegationWorkflowSettings,\n\tinspectStatefulLimitSettings,\n\tinspectStatefulTransportSettings,\n\tinspectSubagentSettings,\n\tinspectUsageRecordingSettings,\n\tnormalizeAgentSettings,\n\tnormalizeSubagentSettings,\n\treadSubagentSettings,\n\tresolveBlockingMaxParallelTasks,\n\tresolveDelegationWorkflow,\n\ttype StatefulLimitFieldSnapshot,\n\ttype StatefulLimitSettingsSnapshot,\n\ttype StatefulTransportSettingsSnapshot,\n\ttype SubagentSettingsSnapshot,\n\tsubagentSettingsFilePath,\n\ttype UsageRecordingSettingsSnapshot,\n} from \"./settings-reader.js\";\n\nconst SETTINGS_FILE = SUBAGENT_SETTINGS_FILE;\nconst require = createRequire(import.meta.url);\n\nconst SETTINGS_LOCK_FS_ADAPTER = {\n\tmkdir: fs.mkdir,\n\tmkdirSync: fs.mkdirSync,\n\trealpath: fs.realpath,\n\trealpathSync: fs.realpathSync,\n\trmdir: fs.rmdir,\n\trmdirSync: fs.rmdirSync,\n\tstat: fs.stat,\n\tstatSync: fs.statSync,\n\tutimes: fs.utimes,\n\tutimesSync: fs.utimesSync,\n};\n\nexport function saveSubagentConfig(settings: SubagentSettings): void {\n\twriteSettingsObject(settings);\n}\n\nexport function updateDelegationWorkflowSetting(\n\tvalue: Exclude<DelegationWorkflow, \"disabled\">,\n): void {\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst blocking = raw.blocking;\n\t\tif (blocking !== undefined && !isPlainObject(blocking)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} blocking settings`);\n\t\t}\n\t\tconst stateful = raw.stateful;\n\t\tif (stateful !== undefined && !isPlainObject(stateful)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} stateful settings`);\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tblocking: {\n\t\t\t\t\t...(blocking ?? {}),\n\t\t\t\t\tenabled: value !== \"async-only\",\n\t\t\t\t},\n\t\t\t\tstateful: {\n\t\t\t\t\t...(stateful ?? {}),\n\t\t\t\t\tenabled: value !== \"blocking-only\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport function updateStatefulTransportSetting(value: SubagentTransportKind): void {\n\tif (![\"subprocess\", \"in-process\", \"rpc\", \"auto\"].includes(value)) {\n\t\tthrow new Error(`Unsupported stateful transport: ${value}`);\n\t}\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst stateful = raw.stateful;\n\t\tif (stateful !== undefined && !isPlainObject(stateful)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} stateful settings`);\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tstateful: { ...(stateful ?? {}), transport: value },\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport function updateCompletionDeliverySetting(value: CompletionDelivery): void {\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst stateful = raw.stateful;\n\t\tif (stateful !== undefined && !isPlainObject(stateful)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} stateful settings`);\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tstateful: {\n\t\t\t\t\t...(stateful ?? {}),\n\t\t\t\t\tcompletionDelivery: value,\n\t\t\t\t},\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport function updateUsageRecordingSetting(enabled: boolean): void {\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst usageRecording = raw.usageRecording;\n\t\tif (usageRecording !== undefined && !isPlainObject(usageRecording)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} usageRecording settings`);\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tusageRecording: { ...(usageRecording ?? {}), enabled },\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport function updateBlockingMaxParallelTasksSetting(value: number): void {\n\tif (!isPositiveInteger(value) || value > MAX_CONFIGURABLE_PARALLEL_TASKS) {\n\t\tthrow new Error(\n\t\t\t`Maximum parallel tasks must be an integer between 1 and ${MAX_CONFIGURABLE_PARALLEL_TASKS}`,\n\t\t);\n\t}\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst blocking = raw.blocking;\n\t\tif (blocking !== undefined && !isPlainObject(blocking)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} blocking settings`);\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tblocking: {\n\t\t\t\t\t...(blocking ?? {}),\n\t\t\t\t\tmaxParallelTasks: value,\n\t\t\t\t},\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport function updateStatefulLimitSetting(\n\tfield: StatefulLimitField,\n\tvalue: number,\n\texpected?: StatefulLimits,\n): void {\n\tif (!isValidStatefulLimit(field, value)) {\n\t\tthrow new Error(\n\t\t\t`${field} must be a safe integer greater than or equal to ${statefulLimitDefinition(field).minimum}`,\n\t\t);\n\t}\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst stateful = raw.stateful;\n\t\tif (stateful !== undefined && !isPlainObject(stateful)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} stateful settings`);\n\t\t}\n\t\tconst normalized = normalizeSubagentSettings(raw);\n\t\tif (!normalized) throw new Error(`Cannot update invalid ${SETTINGS_FILE}`);\n\t\tif (expected && !sameStatefulLimits(resolveStatefulLimits(normalized.stateful), expected)) {\n\t\t\tthrow new Error(\"Detached limit settings changed; reopen settings and retry\");\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tstateful: { ...(stateful ?? {}), [field]: value },\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport function updateConsultResourceSetting(value: ConsultResourcePolicy): void {\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst consult = raw.consult;\n\t\tif (consult !== undefined && !isPlainObject(consult)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} consult settings`);\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tconsult: {\n\t\t\t\t\t...(consult ?? {}),\n\t\t\t\t\tresources: value,\n\t\t\t\t},\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport function updateCwdPolicySetting(field: \"consultation\", value: ConsultationCwdPolicy): void;\nexport function updateCwdPolicySetting(field: \"delegation\", value: DelegationCwdPolicy): void;\nexport function updateCwdPolicySetting(\n\tfield: \"consultation\" | \"delegation\",\n\tvalue: ConsultationCwdPolicy | DelegationCwdPolicy,\n): void {\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst cwdPolicy = raw.cwdPolicy;\n\t\tif (cwdPolicy !== undefined && !isPlainObject(cwdPolicy)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} cwdPolicy settings`);\n\t\t}\n\t\twriteSettingsObjectUnlocked(\n\t\t\t{\n\t\t\t\t...raw,\n\t\t\t\tcwdPolicy: { ...(cwdPolicy ?? {}), [field]: value },\n\t\t\t},\n\t\t\tupdate.replaceCanonical,\n\t\t);\n\t});\n}\n\nexport type AgentSettingsPatch = {\n\ttools?: string[] | undefined;\n\tmodel?: string | null | undefined;\n\tthinkingLevel?: SubagentThinkingLevel | null | undefined;\n\ttimeoutMs?: number | null | undefined;\n};\n\nexport function updateAgentToolsSetting(name: string, tools: string[] | undefined): void {\n\tupdateAgentSettingsPatch({ [name]: { tools } });\n}\n\nexport function updateAgentSettingsPatch(patches: Record<string, AgentSettingsPatch>): void {\n\twithSettingsMutationLock(() => {\n\t\tconst update = readSettingsObjectForUpdate();\n\t\tconst raw = update.document;\n\t\tconst rawAgents = raw.agents;\n\t\tif (rawAgents !== undefined && !isPlainObject(rawAgents)) {\n\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} agent settings`);\n\t\t}\n\t\tconst agents = { ...(rawAgents ?? {}) };\n\t\tfor (const [name, patch] of Object.entries(patches)) {\n\t\t\tconst rawAgent = hasOwn(agents, name) ? agents[name] : undefined;\n\t\t\tif (rawAgent !== undefined && !isPlainObject(rawAgent)) {\n\t\t\t\tthrow new Error(`Cannot update invalid ${SETTINGS_FILE} settings for ${name}`);\n\t\t\t}\n\t\t\tconst agent = { ...(rawAgent ?? {}) };\n\t\t\tfor (const field of [\"tools\", \"model\", \"thinkingLevel\", \"timeoutMs\"] as const) {\n\t\t\t\tif (!hasOwn(patch, field)) continue;\n\t\t\t\tconst value = patch[field];\n\t\t\t\tif (value === undefined) delete agent[field];\n\t\t\t\telse\n\t\t\t\t\tObject.defineProperty(agent, field, {\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tenumerable: true,\n\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\twritable: true,\n\t\t\t\t\t});\n\t\t\t}\n\t\t\tif (Object.keys(agent).length > 0) {\n\t\t\t\tObject.defineProperty(agents, name, {\n\t\t\t\t\tvalue: agent,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdelete agents[name];\n\t\t\t}\n\t\t}\n\n\t\tconst normalized = normalizeSubagentSettings({\n\t\t\t...raw,\n\t\t\t...(Object.keys(agents).length > 0 ? { agents } : {}),\n\t\t});\n\t\tif (!normalized) throw new Error(`Cannot update invalid ${SETTINGS_FILE} agent settings`);\n\t\tconst updated = { ...raw };\n\t\tif (Object.keys(agents).length > 0) updated.agents = agents;\n\t\telse delete updated.agents;\n\t\twriteSettingsObjectUnlocked(updated, update.replaceCanonical);\n\t});\n}\n\ninterface SettingsObjectForUpdate {\n\tdocument: Record<string, unknown>;\n\treplaceCanonical: boolean;\n}\n\nfunction readSettingsObjectForUpdate(): SettingsObjectForUpdate {\n\tconst { canonicalPath, activePath } = resolveSubagentSettingsPaths();\n\tif (activePath === undefined) return { document: {}, replaceCanonical: false };\n\tconst activeFile = path.basename(activePath);\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(fs.readFileSync(activePath, \"utf8\"));\n\t} catch {\n\t\tthrow new Error(`Cannot update malformed ${activeFile}`);\n\t}\n\tif (!isPlainObject(parsed) || !normalizeSubagentSettings(parsed)) {\n\t\tthrow new Error(`Cannot update invalid ${activeFile}`);\n\t}\n\treturn { document: parsed, replaceCanonical: activePath === canonicalPath };\n}\n\nfunction writeSettingsObject(settings: object, replaceCanonical?: boolean): void {\n\twithSettingsMutationLock(() => writeSettingsObjectUnlocked(settings, replaceCanonical));\n}\n\nfunction writeSettingsObjectUnlocked(settings: object, replaceCanonical?: boolean): void {\n\tconst agentDir = getAgentDir();\n\tfs.mkdirSync(agentDir, { recursive: true });\n\tconst configPath = path.join(agentDir, SETTINGS_FILE);\n\tconst tempFile = path.join(agentDir, `.${SETTINGS_FILE}.${randomUUID()}.tmp`);\n\t// Updates seeded from a missing or legacy document must remain exclusive even if the\n\t// canonical path appears after the read and before publication.\n\tconst firstCanonicalPublication = !(replaceCanonical ?? pathEntryExists(configPath));\n\ttry {\n\t\tfs.writeFileSync(tempFile, `${JSON.stringify(settings, null, \"\\t\")}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t});\n\t\tif (firstCanonicalPublication && pathEntryExists(configPath)) {\n\t\t\tthrow new Error(`${SETTINGS_FILE} was created concurrently; reopen settings and retry`);\n\t\t}\n\t\tfs.renameSync(tempFile, configPath);\n\t} finally {\n\t\ttry {\n\t\t\tfs.rmSync(tempFile, { force: true });\n\t\t} catch {\n\t\t\t// Preserve the save result if best-effort temp cleanup fails.\n\t\t}\n\t}\n}\n\nfunction withSettingsMutationLock<T>(mutate: () => T): T {\n\tconst lockfile = require(\"proper-lockfile\") as typeof import(\"proper-lockfile\");\n\tconst agentDir = getAgentDir();\n\tfs.mkdirSync(agentDir, { recursive: true });\n\tconst configPath = path.join(agentDir, SETTINGS_FILE);\n\tconst release = lockfile.lockSync(configPath, {\n\t\tfs: SETTINGS_LOCK_FS_ADAPTER,\n\t\tlockfilePath: `${configPath}.mutation-lock`,\n\t\trealpath: false,\n\t});\n\ttry {\n\t\treturn mutate();\n\t} finally {\n\t\trelease();\n\t}\n}\n\nfunction sameStatefulLimits(left: StatefulLimits, right: StatefulLimits): boolean {\n\treturn STATEFUL_LIMIT_FIELDS.every((field) => left[field] === right[field]);\n}\n\nexport function uniqueToolNames(tools: string[]): string[] {\n\treturn [...new Set(tools)];\n}\n\nexport function sameToolSet(left: string[], right: string[]): boolean {\n\tconst leftSet = new Set(left);\n\tconst rightSet = new Set(right);\n\tif (leftSet.size !== rightSet.size) return false;\n\treturn [...leftSet].every((tool) => rightSet.has(tool));\n}\n\nexport function resolveSubagentThinkingLevel(\n\tagents: readonly Pick<AgentConfig, \"name\" | \"thinkingLevel\">[],\n\tagentName: string,\n\ttopLevelThinkingLevel?: SubagentThinkingLevel,\n\tlocalThinkingLevel?: SubagentThinkingLevel,\n): SubagentThinkingLevel | undefined {\n\treturn (\n\t\tlocalThinkingLevel ??\n\t\ttopLevelThinkingLevel ??\n\t\tagents.find((agent) => agent.name === agentName)?.thinkingLevel\n\t);\n}\n\nexport function hasAnyAgentOverride(config: SubagentAgentConfig): boolean {\n\treturn (\n\t\thasOwn(config, \"tools\") ||\n\t\thasOwn(config, \"model\") ||\n\t\thasOwn(config, \"thinkingLevel\") ||\n\t\thasOwn(config, \"timeoutMs\")\n\t);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,YAAY,QAAQ;AACpB,SAAS,qBAAqB;AAC9B,YAAY,UAAU;AACtB,SAAS,mBAAmB;AAqE5B,IAAM,gBAAgB;AACtB,IAAMA,WAAU,cAAc,YAAY,GAAG;AAE7C,IAAM,2BAA2B;AAAA,EAChC,OAAU;AAAA,EACV,WAAc;AAAA,EACd,UAAa;AAAA,EACb,cAAiB;AAAA,EACjB,OAAU;AAAA,EACV,WAAc;AAAA,EACd,MAAS;AAAA,EACT,UAAa;AAAA,EACb,QAAW;AAAA,EACX,YAAe;AAChB;AAMO,SAAS,gCACf,OACO;AACP,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,UAAa,CAAC,cAAc,QAAQ,GAAG;AACvD,YAAM,IAAI,MAAM,yBAAyB,aAAa,oBAAoB;AAAA,IAC3E;AACA,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,UAAa,CAAC,cAAc,QAAQ,GAAG;AACvD,YAAM,IAAI,MAAM,yBAAyB,aAAa,oBAAoB;AAAA,IAC3E;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,UAAU;AAAA,UACT,GAAI,YAAY,CAAC;AAAA,UACjB,SAAS,UAAU;AAAA,QACpB;AAAA,QACA,UAAU;AAAA,UACT,GAAI,YAAY,CAAC;AAAA,UACjB,SAAS,UAAU;AAAA,QACpB;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAEO,SAAS,+BAA+B,OAAoC;AAClF,MAAI,CAAC,CAAC,cAAc,cAAc,OAAO,MAAM,EAAE,SAAS,KAAK,GAAG;AACjE,UAAM,IAAI,MAAM,mCAAmC,KAAK,EAAE;AAAA,EAC3D;AACA,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,UAAa,CAAC,cAAc,QAAQ,GAAG;AACvD,YAAM,IAAI,MAAM,yBAAyB,aAAa,oBAAoB;AAAA,IAC3E;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,UAAU,EAAE,GAAI,YAAY,CAAC,GAAI,WAAW,MAAM;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAEO,SAAS,gCAAgC,OAAiC;AAChF,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,UAAa,CAAC,cAAc,QAAQ,GAAG;AACvD,YAAM,IAAI,MAAM,yBAAyB,aAAa,oBAAoB;AAAA,IAC3E;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,UAAU;AAAA,UACT,GAAI,YAAY,CAAC;AAAA,UACjB,oBAAoB;AAAA,QACrB;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAEO,SAAS,4BAA4B,SAAwB;AACnE,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,iBAAiB,IAAI;AAC3B,QAAI,mBAAmB,UAAa,CAAC,cAAc,cAAc,GAAG;AACnE,YAAM,IAAI,MAAM,yBAAyB,aAAa,0BAA0B;AAAA,IACjF;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,gBAAgB,EAAE,GAAI,kBAAkB,CAAC,GAAI,QAAQ;AAAA,MACtD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAEO,SAAS,sCAAsC,OAAqB;AAC1E,MAAI,CAAC,kBAAkB,KAAK,KAAK,QAAQ,iCAAiC;AACzE,UAAM,IAAI;AAAA,MACT,2DAA2D,+BAA+B;AAAA,IAC3F;AAAA,EACD;AACA,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,UAAa,CAAC,cAAc,QAAQ,GAAG;AACvD,YAAM,IAAI,MAAM,yBAAyB,aAAa,oBAAoB;AAAA,IAC3E;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,UAAU;AAAA,UACT,GAAI,YAAY,CAAC;AAAA,UACjB,kBAAkB;AAAA,QACnB;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAEO,SAAS,2BACf,OACA,OACA,UACO;AACP,MAAI,CAAC,qBAAqB,OAAO,KAAK,GAAG;AACxC,UAAM,IAAI;AAAA,MACT,GAAG,KAAK,oDAAoD,wBAAwB,KAAK,EAAE,OAAO;AAAA,IACnG;AAAA,EACD;AACA,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,UAAa,CAAC,cAAc,QAAQ,GAAG;AACvD,YAAM,IAAI,MAAM,yBAAyB,aAAa,oBAAoB;AAAA,IAC3E;AACA,UAAM,aAAa,0BAA0B,GAAG;AAChD,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,yBAAyB,aAAa,EAAE;AACzE,QAAI,YAAY,CAAC,mBAAmB,sBAAsB,WAAW,QAAQ,GAAG,QAAQ,GAAG;AAC1F,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC7E;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,UAAU,EAAE,GAAI,YAAY,CAAC,GAAI,CAAC,KAAK,GAAG,MAAM;AAAA,MACjD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAEO,SAAS,6BAA6B,OAAoC;AAChF,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,UAAU,IAAI;AACpB,QAAI,YAAY,UAAa,CAAC,cAAc,OAAO,GAAG;AACrD,YAAM,IAAI,MAAM,yBAAyB,aAAa,mBAAmB;AAAA,IAC1E;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,SAAS;AAAA,UACR,GAAI,WAAW,CAAC;AAAA,UAChB,WAAW;AAAA,QACZ;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AAIO,SAAS,uBACf,OACA,OACO;AACP,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,YAAY,IAAI;AACtB,QAAI,cAAc,UAAa,CAAC,cAAc,SAAS,GAAG;AACzD,YAAM,IAAI,MAAM,yBAAyB,aAAa,qBAAqB;AAAA,IAC5E;AACA;AAAA,MACC;AAAA,QACC,GAAG;AAAA,QACH,WAAW,EAAE,GAAI,aAAa,CAAC,GAAI,CAAC,KAAK,GAAG,MAAM;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD,CAAC;AACF;AASO,SAAS,wBAAwB,MAAc,OAAmC;AACxF,2BAAyB,EAAE,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;AAC/C;AAEO,SAAS,yBAAyB,SAAmD;AAC3F,2BAAyB,MAAM;AAC9B,UAAM,SAAS,4BAA4B;AAC3C,UAAM,MAAM,OAAO;AACnB,UAAM,YAAY,IAAI;AACtB,QAAI,cAAc,UAAa,CAAC,cAAc,SAAS,GAAG;AACzD,YAAM,IAAI,MAAM,yBAAyB,aAAa,iBAAiB;AAAA,IACxE;AACA,UAAM,SAAS,EAAE,GAAI,aAAa,CAAC,EAAG;AACtC,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,YAAM,WAAW,OAAO,QAAQ,IAAI,IAAI,OAAO,IAAI,IAAI;AACvD,UAAI,aAAa,UAAa,CAAC,cAAc,QAAQ,GAAG;AACvD,cAAM,IAAI,MAAM,yBAAyB,aAAa,iBAAiB,IAAI,EAAE;AAAA,MAC9E;AACA,YAAM,QAAQ,EAAE,GAAI,YAAY,CAAC,EAAG;AACpC,iBAAW,SAAS,CAAC,SAAS,SAAS,iBAAiB,WAAW,GAAY;AAC9E,YAAI,CAAC,OAAO,OAAO,KAAK,EAAG;AAC3B,cAAM,QAAQ,MAAM,KAAK;AACzB,YAAI,UAAU,OAAW,QAAO,MAAM,KAAK;AAAA;AAE1C,iBAAO,eAAe,OAAO,OAAO;AAAA,YACnC;AAAA,YACA,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,UAAU;AAAA,UACX,CAAC;AAAA,MACH;AACA,UAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAClC,eAAO,eAAe,QAAQ,MAAM;AAAA,UACnC,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU;AAAA,QACX,CAAC;AAAA,MACF,OAAO;AACN,eAAO,OAAO,IAAI;AAAA,MACnB;AAAA,IACD;AAEA,UAAM,aAAa,0BAA0B;AAAA,MAC5C,GAAG;AAAA,MACH,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,IACpD,CAAC;AACD,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,yBAAyB,aAAa,iBAAiB;AACxF,UAAM,UAAU,EAAE,GAAG,IAAI;AACzB,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,EAAG,SAAQ,SAAS;AAAA,QAChD,QAAO,QAAQ;AACpB,gCAA4B,SAAS,OAAO,gBAAgB;AAAA,EAC7D,CAAC;AACF;AAOA,SAAS,8BAAuD;AAC/D,QAAM,EAAE,eAAe,WAAW,IAAI,6BAA6B;AACnE,MAAI,eAAe,OAAW,QAAO,EAAE,UAAU,CAAC,GAAG,kBAAkB,MAAM;AAC7E,QAAM,aAAkB,cAAS,UAAU;AAC3C,MAAI;AACJ,MAAI;AACH,aAAS,KAAK,MAAS,gBAAa,YAAY,MAAM,CAAC;AAAA,EACxD,QAAQ;AACP,UAAM,IAAI,MAAM,2BAA2B,UAAU,EAAE;AAAA,EACxD;AACA,MAAI,CAAC,cAAc,MAAM,KAAK,CAAC,0BAA0B,MAAM,GAAG;AACjE,UAAM,IAAI,MAAM,yBAAyB,UAAU,EAAE;AAAA,EACtD;AACA,SAAO,EAAE,UAAU,QAAQ,kBAAkB,eAAe,cAAc;AAC3E;AAMA,SAAS,4BAA4B,UAAkB,kBAAkC;AACxF,QAAM,WAAW,YAAY;AAC7B,EAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAC1C,QAAM,aAAkB,UAAK,UAAU,aAAa;AACpD,QAAM,WAAgB,UAAK,UAAU,IAAI,aAAa,IAAI,WAAW,CAAC,MAAM;AAG5E,QAAM,4BAA4B,EAAE,oBAAoB,gBAAgB,UAAU;AAClF,MAAI;AACH,IAAG,iBAAc,UAAU,GAAG,KAAK,UAAU,UAAU,MAAM,GAAI,CAAC;AAAA,GAAM;AAAA,MACvE,UAAU;AAAA,MACV,MAAM;AAAA,IACP,CAAC;AACD,QAAI,6BAA6B,gBAAgB,UAAU,GAAG;AAC7D,YAAM,IAAI,MAAM,GAAG,aAAa,sDAAsD;AAAA,IACvF;AACA,IAAG,cAAW,UAAU,UAAU;AAAA,EACnC,UAAE;AACD,QAAI;AACH,MAAG,UAAO,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,IACpC,QAAQ;AAAA,IAER;AAAA,EACD;AACD;AAEA,SAAS,yBAA4B,QAAoB;AACxD,QAAM,WAAWC,SAAQ,iBAAiB;AAC1C,QAAM,WAAW,YAAY;AAC7B,EAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAC1C,QAAM,aAAkB,UAAK,UAAU,aAAa;AACpD,QAAM,UAAU,SAAS,SAAS,YAAY;AAAA,IAC7C,IAAI;AAAA,IACJ,cAAc,GAAG,UAAU;AAAA,IAC3B,UAAU;AAAA,EACX,CAAC;AACD,MAAI;AACH,WAAO,OAAO;AAAA,EACf,UAAE;AACD,YAAQ;AAAA,EACT;AACD;AAEA,SAAS,mBAAmB,MAAsB,OAAgC;AACjF,SAAO,sBAAsB,MAAM,CAAC,UAAU,KAAK,KAAK,MAAM,MAAM,KAAK,CAAC;AAC3E;AAEO,SAAS,gBAAgB,OAA2B;AAC1D,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAC1B;AAEO,SAAS,YAAY,MAAgB,OAA0B;AACrE,QAAM,UAAU,IAAI,IAAI,IAAI;AAC5B,QAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,MAAI,QAAQ,SAAS,SAAS,KAAM,QAAO;AAC3C,SAAO,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,SAAS,SAAS,IAAI,IAAI,CAAC;AACvD;AAEO,SAAS,6BACf,QACA,WACA,uBACA,oBACoC;AACpC,SACC,sBACA,yBACA,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,SAAS,GAAG;AAEpD;",
|
|
6
|
+
"names": ["require", "require"]
|
|
7
|
+
}
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
4
|
PI_SUBAGENTS_RPC_PROTOCOL
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LEOYDZI3.ts";
|
|
6
6
|
import {
|
|
7
7
|
SUBAGENT_COMPLETION_MESSAGE_TYPE
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IWC32VPY.ts";
|
|
9
|
+
import {
|
|
10
|
+
requirementForCompletion
|
|
11
|
+
} from "./chunk-VBDGNNLM.ts";
|
|
9
12
|
import {
|
|
10
13
|
safeTerminalText
|
|
11
14
|
} from "./chunk-SWGQLFSD.ts";
|
|
@@ -19,6 +22,7 @@ import {
|
|
|
19
22
|
// src/completion-delivery.ts
|
|
20
23
|
var MAX_COMPLETION_ERROR_BYTES = 512;
|
|
21
24
|
var MAX_COMPLETIONS_PER_MESSAGE = 16;
|
|
25
|
+
var MAX_ACKNOWLEDGED_COMPLETION_IDS = 2048;
|
|
22
26
|
var COMPLETION_BATCH_DELAY_MS = 10;
|
|
23
27
|
var CompletionDeliveryBroker = class {
|
|
24
28
|
constructor(pi, ctx, delivery, options = {}) {
|
|
@@ -33,12 +37,15 @@ var CompletionDeliveryBroker = class {
|
|
|
33
37
|
options;
|
|
34
38
|
pending = [];
|
|
35
39
|
knownCompletionIds = /* @__PURE__ */ new Set();
|
|
40
|
+
acknowledgedCompletionIds = /* @__PURE__ */ new Set();
|
|
36
41
|
awaitingParentAck = [];
|
|
37
42
|
flushTimer;
|
|
38
43
|
wakeInFlight = false;
|
|
39
44
|
closed = false;
|
|
40
45
|
enqueue(completion) {
|
|
41
|
-
if (this.closed || this.knownCompletionIds.has(completion.completionId))
|
|
46
|
+
if (this.closed || this.knownCompletionIds.has(completion.completionId) || this.acknowledgedCompletionIds.has(completion.completionId)) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
42
49
|
this.knownCompletionIds.add(completion.completionId);
|
|
43
50
|
this.pending.push(completion);
|
|
44
51
|
this.scheduleFlush();
|
|
@@ -66,7 +73,6 @@ var CompletionDeliveryBroker = class {
|
|
|
66
73
|
if (this.closed || this.pending.length === 0) return;
|
|
67
74
|
if (this.flushTimer) clearTimeout(this.flushTimer);
|
|
68
75
|
this.flushTimer = void 0;
|
|
69
|
-
if (this.delivery === "auto-resume" && !this.isRootIdle()) return;
|
|
70
76
|
const completions = this.pending.splice(0);
|
|
71
77
|
const batches = chunkCompletions(completions);
|
|
72
78
|
let canWake = this.shouldWakeRoot();
|
|
@@ -81,14 +87,34 @@ var CompletionDeliveryBroker = class {
|
|
|
81
87
|
deliverAs: "steer",
|
|
82
88
|
...triggerTurn ? { triggerTurn: true } : {}
|
|
83
89
|
});
|
|
90
|
+
this.notifyDeliveryAttempt(batch, {
|
|
91
|
+
delivery: "steer",
|
|
92
|
+
triggerTurn,
|
|
93
|
+
outcome: "accepted"
|
|
94
|
+
});
|
|
84
95
|
} catch (primaryError) {
|
|
96
|
+
this.notifyDeliveryAttempt(batch, {
|
|
97
|
+
delivery: "steer",
|
|
98
|
+
triggerTurn,
|
|
99
|
+
outcome: "failed"
|
|
100
|
+
});
|
|
85
101
|
this.removeAwaiting(batch);
|
|
86
102
|
if (triggerTurn) this.wakeInFlight = false;
|
|
87
103
|
canWake = false;
|
|
88
104
|
this.awaitingParentAck.push(...batch);
|
|
89
105
|
try {
|
|
90
106
|
this.pi.sendMessage(message, { deliverAs: "nextTurn", triggerTurn: false });
|
|
107
|
+
this.notifyDeliveryAttempt(batch, {
|
|
108
|
+
delivery: "nextTurn",
|
|
109
|
+
triggerTurn: false,
|
|
110
|
+
outcome: "accepted"
|
|
111
|
+
});
|
|
91
112
|
} catch (fallbackError) {
|
|
113
|
+
this.notifyDeliveryAttempt(batch, {
|
|
114
|
+
delivery: "nextTurn",
|
|
115
|
+
triggerTurn: false,
|
|
116
|
+
outcome: "failed"
|
|
117
|
+
});
|
|
92
118
|
this.removeAwaiting(batch);
|
|
93
119
|
this.pending = [...batches.slice(index).flat(), ...this.pending];
|
|
94
120
|
try {
|
|
@@ -112,6 +138,7 @@ var CompletionDeliveryBroker = class {
|
|
|
112
138
|
this.pending = [];
|
|
113
139
|
this.awaitingParentAck = [];
|
|
114
140
|
this.knownCompletionIds.clear();
|
|
141
|
+
this.acknowledgedCompletionIds.clear();
|
|
115
142
|
}
|
|
116
143
|
scheduleFlush() {
|
|
117
144
|
if (this.closed || this.pending.length === 0 || this.flushTimer) return;
|
|
@@ -133,18 +160,35 @@ var CompletionDeliveryBroker = class {
|
|
|
133
160
|
this.pending = this.pending.filter(
|
|
134
161
|
(completion) => !acknowledgedIds.has(completion.completionId)
|
|
135
162
|
);
|
|
136
|
-
for (const completion of completions)
|
|
163
|
+
for (const completion of completions) {
|
|
164
|
+
this.knownCompletionIds.delete(completion.completionId);
|
|
165
|
+
this.rememberAcknowledged(completion.completionId);
|
|
166
|
+
}
|
|
137
167
|
try {
|
|
138
168
|
this.options.onAcknowledged?.(completions, (this.options.now ?? Date.now)());
|
|
139
169
|
} catch {
|
|
140
170
|
}
|
|
141
171
|
}
|
|
172
|
+
rememberAcknowledged(completionId) {
|
|
173
|
+
this.acknowledgedCompletionIds.add(completionId);
|
|
174
|
+
while (this.acknowledgedCompletionIds.size > MAX_ACKNOWLEDGED_COMPLETION_IDS) {
|
|
175
|
+
const oldest = this.acknowledgedCompletionIds.values().next().value;
|
|
176
|
+
if (typeof oldest !== "string") return;
|
|
177
|
+
this.acknowledgedCompletionIds.delete(oldest);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
142
180
|
removeAwaiting(completions) {
|
|
143
181
|
const removed = new Set(completions.map((completion) => completion.completionId));
|
|
144
182
|
this.awaitingParentAck = this.awaitingParentAck.filter(
|
|
145
183
|
(completion) => !removed.has(completion.completionId)
|
|
146
184
|
);
|
|
147
185
|
}
|
|
186
|
+
notifyDeliveryAttempt(completions, input) {
|
|
187
|
+
try {
|
|
188
|
+
this.options.onDeliveryAttempt?.(completions, input);
|
|
189
|
+
} catch {
|
|
190
|
+
}
|
|
191
|
+
}
|
|
148
192
|
isRootIdle() {
|
|
149
193
|
try {
|
|
150
194
|
return this.ctx.isIdle();
|
|
@@ -153,7 +197,7 @@ var CompletionDeliveryBroker = class {
|
|
|
153
197
|
}
|
|
154
198
|
}
|
|
155
199
|
shouldWakeRoot() {
|
|
156
|
-
if (this.delivery !== "auto-resume" || this.wakeInFlight) return false;
|
|
200
|
+
if (this.delivery !== "auto-resume" || this.wakeInFlight || !this.isRootIdle()) return false;
|
|
157
201
|
try {
|
|
158
202
|
return !this.ctx.hasPendingMessages();
|
|
159
203
|
} catch {
|
|
@@ -226,6 +270,7 @@ function buildCompletionMessage(completions) {
|
|
|
226
270
|
};
|
|
227
271
|
}
|
|
228
272
|
function completionMetadata(completion) {
|
|
273
|
+
const completionRequirement = requirementForCompletion(completion.agent, completion.completionId);
|
|
229
274
|
return {
|
|
230
275
|
protocol: PI_SUBAGENTS_RPC_PROTOCOL,
|
|
231
276
|
completionId: completion.completionId,
|
|
@@ -240,7 +285,8 @@ function completionMetadata(completion) {
|
|
|
240
285
|
...completion.agent.telemetry?.transport ? { transport: completion.agent.telemetry.transport } : {},
|
|
241
286
|
...completion.agent.structuredResult ? { structuredResult: completion.agent.structuredResult } : {},
|
|
242
287
|
...completion.agent.outcome ? { outcome: completion.agent.outcome } : {},
|
|
243
|
-
...completion.agent.capabilityGrant ? { capabilityGrant: completion.agent.capabilityGrant } : {}
|
|
288
|
+
...completion.agent.capabilityGrant ? { capabilityGrant: completion.agent.capabilityGrant } : {},
|
|
289
|
+
...completionRequirement ? { completionRequirement } : {}
|
|
244
290
|
};
|
|
245
291
|
}
|
|
246
292
|
function buildDetachedCompletionMessage(completion) {
|
|
@@ -279,4 +325,4 @@ export {
|
|
|
279
325
|
CompletionDeliveryBroker,
|
|
280
326
|
buildDetachedCompletionMessage
|
|
281
327
|
};
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
328
|
+
//# sourceMappingURL=chunk-DIHBUR2E.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/completion-delivery.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ExtensionAPI, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { CompletionDelivery } from \"./agents/types.js\";\nimport { SUBAGENT_COMPLETION_MESSAGE_TYPE } from \"./completion-render.js\";\nimport { requirementForCompletion } from \"./completion-requirement.js\";\nimport { redactPrivateText } from \"./context.js\";\nimport { DEFAULT_MAX_CONTEXT_BYTES, MAX_TOOL_MESSAGE_BYTES, truncateUtf8 } from \"./limits.js\";\nimport type { AgentTurnCompletion, ManagedAgent } from \"./registry.js\";\nimport { safeTerminalText } from \"./safe-text.js\";\nimport { PI_SUBAGENTS_RPC_PROTOCOL } from \"./transport-types.js\";\n\nconst MAX_COMPLETION_ERROR_BYTES = 512;\nconst MAX_COMPLETIONS_PER_MESSAGE = 16;\nconst MAX_ACKNOWLEDGED_COMPLETION_IDS = 2_048;\nconst COMPLETION_BATCH_DELAY_MS = 10;\n\ninterface CompletionMetadata {\n\tprotocol: typeof PI_SUBAGENTS_RPC_PROTOCOL;\n\tcompletionId: string;\n\trunId: string;\n\tgeneration: number;\n\tagentId: string;\n\ttaskPath?: string;\n\trecipientPath?: string;\n\tagent: string;\n\ttask: string;\n\tstate: string;\n\ttransport?: string;\n\tstructuredResult?: ManagedAgent[\"structuredResult\"];\n\toutcome?: ManagedAgent[\"outcome\"];\n\tcapabilityGrant?: ManagedAgent[\"capabilityGrant\"];\n\tcompletionRequirement?: NonNullable<ManagedAgent[\"completionRequirements\"]>[number];\n}\n\ninterface CompletionMessage {\n\tcustomType: typeof SUBAGENT_COMPLETION_MESSAGE_TYPE;\n\tcontent: string;\n\tdisplay: true;\n\tdetails:\n\t\t| CompletionMetadata\n\t\t| {\n\t\t\t\tcompletionCount: number;\n\t\t\t\tcompletions: CompletionMetadata[];\n\t\t };\n}\n\ntype CompletionContext = Pick<ExtensionContext, \"hasPendingMessages\" | \"isIdle\">;\ntype CompletionPi = Pick<ExtensionAPI, \"sendMessage\">;\n\nexport interface CompletionDeliveryBrokerOptions {\n\tonDeliveryError?: (error: unknown) => void;\n\tonDeliveryAttempt?: (\n\t\tcompletions: readonly AgentTurnCompletion[],\n\t\tinput: {\n\t\t\tdelivery: \"steer\" | \"nextTurn\";\n\t\t\ttriggerTurn: boolean;\n\t\t\toutcome: \"accepted\" | \"failed\";\n\t\t},\n\t) => void;\n\tonAcknowledged?: (completions: readonly AgentTurnCompletion[], acknowledgedAt: number) => void;\n\tnow?: () => number;\n}\n\n/** Owns bounded completion batching and at most one idle-root wake for one parent session. */\nexport class CompletionDeliveryBroker {\n\tprivate pending: AgentTurnCompletion[] = [];\n\tprivate readonly knownCompletionIds = new Set<string>();\n\tprivate readonly acknowledgedCompletionIds = new Set<string>();\n\tprivate awaitingParentAck: AgentTurnCompletion[] = [];\n\tprivate flushTimer?: NodeJS.Timeout;\n\tprivate wakeInFlight = false;\n\tprivate closed = false;\n\n\tconstructor(\n\t\tprivate readonly pi: CompletionPi,\n\t\tprivate readonly ctx: CompletionContext,\n\t\tprivate delivery: CompletionDelivery,\n\t\tprivate readonly options: CompletionDeliveryBrokerOptions = {},\n\t) {}\n\n\tenqueue(completion: AgentTurnCompletion): void {\n\t\tif (\n\t\t\tthis.closed ||\n\t\t\tthis.knownCompletionIds.has(completion.completionId) ||\n\t\t\tthis.acknowledgedCompletionIds.has(completion.completionId)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.knownCompletionIds.add(completion.completionId);\n\t\tthis.pending.push(completion);\n\t\tthis.scheduleFlush();\n\t}\n\n\tsetDelivery(value: CompletionDelivery): void {\n\t\tthis.delivery = value;\n\t\tthis.scheduleFlush();\n\t}\n\n\tonParentTurnStart(): void {\n\t\tthis.wakeInFlight = false;\n\t\tthis.scheduleFlush();\n\t}\n\n\tonParentContext(messages: readonly unknown[]): void {\n\t\tthis.acknowledgeVisible(completionIdsFromContext(messages));\n\t\tif (this.awaitingParentAck.length > 0) {\n\t\t\tthis.pending = [...this.awaitingParentAck.splice(0), ...this.pending];\n\t\t}\n\t\tthis.scheduleFlush();\n\t}\n\n\tonParentSettled(): void {\n\t\tthis.wakeInFlight = false;\n\t\tthis.scheduleFlush();\n\t}\n\n\tflush(): void {\n\t\tif (this.closed || this.pending.length === 0) return;\n\t\tif (this.flushTimer) clearTimeout(this.flushTimer);\n\t\tthis.flushTimer = undefined;\n\n\t\tconst completions = this.pending.splice(0);\n\t\tconst batches = chunkCompletions(completions);\n\t\tlet canWake = this.shouldWakeRoot();\n\t\tfor (let index = 0; index < batches.length; index++) {\n\t\t\tconst triggerTurn = canWake && index === batches.length - 1;\n\t\t\tconst batch = batches[index];\n\t\t\tconst message = buildCompletionMessage(batch);\n\t\t\tif (triggerTurn) this.wakeInFlight = true;\n\t\t\tthis.awaitingParentAck.push(...batch);\n\t\t\ttry {\n\t\t\t\t// Pi treats explicit false as immediate insertion instead of queued steering while streaming.\n\t\t\t\tthis.pi.sendMessage(message, {\n\t\t\t\t\tdeliverAs: \"steer\",\n\t\t\t\t\t...(triggerTurn ? { triggerTurn: true } : {}),\n\t\t\t\t});\n\t\t\t\tthis.notifyDeliveryAttempt(batch, {\n\t\t\t\t\tdelivery: \"steer\",\n\t\t\t\t\ttriggerTurn,\n\t\t\t\t\toutcome: \"accepted\",\n\t\t\t\t});\n\t\t\t} catch (primaryError) {\n\t\t\t\tthis.notifyDeliveryAttempt(batch, {\n\t\t\t\t\tdelivery: \"steer\",\n\t\t\t\t\ttriggerTurn,\n\t\t\t\t\toutcome: \"failed\",\n\t\t\t\t});\n\t\t\t\tthis.removeAwaiting(batch);\n\t\t\t\tif (triggerTurn) this.wakeInFlight = false;\n\t\t\t\tcanWake = false;\n\t\t\t\tthis.awaitingParentAck.push(...batch);\n\t\t\t\ttry {\n\t\t\t\t\tthis.pi.sendMessage(message, { deliverAs: \"nextTurn\", triggerTurn: false });\n\t\t\t\t\tthis.notifyDeliveryAttempt(batch, {\n\t\t\t\t\t\tdelivery: \"nextTurn\",\n\t\t\t\t\t\ttriggerTurn: false,\n\t\t\t\t\t\toutcome: \"accepted\",\n\t\t\t\t\t});\n\t\t\t\t} catch (fallbackError) {\n\t\t\t\t\tthis.notifyDeliveryAttempt(batch, {\n\t\t\t\t\t\tdelivery: \"nextTurn\",\n\t\t\t\t\t\ttriggerTurn: false,\n\t\t\t\t\t\toutcome: \"failed\",\n\t\t\t\t\t});\n\t\t\t\t\tthis.removeAwaiting(batch);\n\t\t\t\t\tthis.pending = [...batches.slice(index).flat(), ...this.pending];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.options.onDeliveryError?.(\n\t\t\t\t\t\t\tnew AggregateError(\n\t\t\t\t\t\t\t\t[primaryError, fallbackError],\n\t\t\t\t\t\t\t\t\"Detached subagent completion delivery failed\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Delivery retention must survive a failing observer.\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tclose(): void {\n\t\tthis.closed = true;\n\t\tif (this.flushTimer) clearTimeout(this.flushTimer);\n\t\tthis.flushTimer = undefined;\n\t\tthis.pending = [];\n\t\tthis.awaitingParentAck = [];\n\t\tthis.knownCompletionIds.clear();\n\t\tthis.acknowledgedCompletionIds.clear();\n\t}\n\n\tprivate scheduleFlush(): void {\n\t\tif (this.closed || this.pending.length === 0 || this.flushTimer) return;\n\t\tthis.flushTimer = setTimeout(() => {\n\t\t\tthis.flushTimer = undefined;\n\t\t\tthis.flush();\n\t\t}, COMPLETION_BATCH_DELAY_MS);\n\t}\n\n\tprivate acknowledgeVisible(visibleIds: ReadonlySet<string>): void {\n\t\tif (visibleIds.size === 0) return;\n\t\tconst completions = [...this.awaitingParentAck, ...this.pending].filter((completion) =>\n\t\t\tvisibleIds.has(completion.completionId),\n\t\t);\n\t\tif (completions.length === 0) return;\n\t\tconst acknowledgedIds = new Set(completions.map((completion) => completion.completionId));\n\t\tthis.awaitingParentAck = this.awaitingParentAck.filter(\n\t\t\t(completion) => !acknowledgedIds.has(completion.completionId),\n\t\t);\n\t\tthis.pending = this.pending.filter(\n\t\t\t(completion) => !acknowledgedIds.has(completion.completionId),\n\t\t);\n\t\tfor (const completion of completions) {\n\t\t\tthis.knownCompletionIds.delete(completion.completionId);\n\t\t\tthis.rememberAcknowledged(completion.completionId);\n\t\t}\n\t\ttry {\n\t\t\tthis.options.onAcknowledged?.(completions, (this.options.now ?? Date.now)());\n\t\t} catch {\n\t\t\t// Context assembly already observed the message, so observer failures cannot retract it.\n\t\t}\n\t}\n\n\tprivate rememberAcknowledged(completionId: string): void {\n\t\tthis.acknowledgedCompletionIds.add(completionId);\n\t\twhile (this.acknowledgedCompletionIds.size > MAX_ACKNOWLEDGED_COMPLETION_IDS) {\n\t\t\tconst oldest = this.acknowledgedCompletionIds.values().next().value;\n\t\t\tif (typeof oldest !== \"string\") return;\n\t\t\tthis.acknowledgedCompletionIds.delete(oldest);\n\t\t}\n\t}\n\n\tprivate removeAwaiting(completions: readonly AgentTurnCompletion[]): void {\n\t\tconst removed = new Set(completions.map((completion) => completion.completionId));\n\t\tthis.awaitingParentAck = this.awaitingParentAck.filter(\n\t\t\t(completion) => !removed.has(completion.completionId),\n\t\t);\n\t}\n\n\tprivate notifyDeliveryAttempt(\n\t\tcompletions: readonly AgentTurnCompletion[],\n\t\tinput: {\n\t\t\tdelivery: \"steer\" | \"nextTurn\";\n\t\t\ttriggerTurn: boolean;\n\t\t\toutcome: \"accepted\" | \"failed\";\n\t\t},\n\t): void {\n\t\ttry {\n\t\t\tthis.options.onDeliveryAttempt?.(completions, input);\n\t\t} catch {\n\t\t\t// Delivery already succeeded, so an observer cannot retract it.\n\t\t}\n\t}\n\n\tprivate isRootIdle(): boolean {\n\t\ttry {\n\t\t\treturn this.ctx.isIdle();\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate shouldWakeRoot(): boolean {\n\t\tif (this.delivery !== \"auto-resume\" || this.wakeInFlight || !this.isRootIdle()) return false;\n\t\ttry {\n\t\t\treturn !this.ctx.hasPendingMessages();\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nfunction completionIdsFromContext(messages: readonly unknown[]): Set<string> {\n\tconst ids = new Set<string>();\n\tfor (const message of messages) {\n\t\tif (!message || typeof message !== \"object\" || Array.isArray(message)) continue;\n\t\tconst record = message as Record<string, unknown>;\n\t\tif (record.role !== \"custom\" || record.customType !== SUBAGENT_COMPLETION_MESSAGE_TYPE)\n\t\t\tcontinue;\n\t\tconst details = record.details;\n\t\tif (!details || typeof details !== \"object\" || Array.isArray(details)) continue;\n\t\tconst metadata = details as Record<string, unknown>;\n\t\tif (\n\t\t\tmetadata.protocol === PI_SUBAGENTS_RPC_PROTOCOL &&\n\t\t\ttypeof metadata.completionId === \"string\"\n\t\t) {\n\t\t\tids.add(metadata.completionId);\n\t\t}\n\t\tif (!Array.isArray(metadata.completions)) continue;\n\t\tfor (const completion of metadata.completions) {\n\t\t\tif (!completion || typeof completion !== \"object\" || Array.isArray(completion)) continue;\n\t\t\tconst item = completion as Record<string, unknown>;\n\t\t\tif (item.protocol === PI_SUBAGENTS_RPC_PROTOCOL && typeof item.completionId === \"string\") {\n\t\t\t\tids.add(item.completionId);\n\t\t\t}\n\t\t}\n\t}\n\treturn ids;\n}\n\nfunction chunkCompletions(completions: AgentTurnCompletion[]): AgentTurnCompletion[][] {\n\tconst batches: AgentTurnCompletion[][] = [];\n\tfor (let index = 0; index < completions.length; index += MAX_COMPLETIONS_PER_MESSAGE) {\n\t\tbatches.push(completions.slice(index, index + MAX_COMPLETIONS_PER_MESSAGE));\n\t}\n\treturn batches;\n}\n\nfunction buildCompletionMessage(completions: AgentTurnCompletion[]): CompletionMessage {\n\tif (completions.length === 1) {\n\t\tconst completion = completions[0];\n\t\treturn {\n\t\t\tcustomType: SUBAGENT_COMPLETION_MESSAGE_TYPE,\n\t\t\tcontent: buildDetachedCompletionMessage(completion),\n\t\t\tdisplay: true,\n\t\t\tdetails: completionMetadata(completion),\n\t\t};\n\t}\n\tconst content = truncateUtf8(\n\t\t[\n\t\t\t\"Message Type: SUBAGENT_COMPLETION_BATCH\",\n\t\t\t`Protocol: ${PI_SUBAGENTS_RPC_PROTOCOL}`,\n\t\t\t`Completion Count: ${completions.length}`,\n\t\t\t...completions.flatMap((completion, index) => [\n\t\t\t\t\"\",\n\t\t\t\t`--- Completion ${index + 1} of ${completions.length} ---`,\n\t\t\t\tbuildDetachedCompletionMessage(completion),\n\t\t\t]),\n\t\t].join(\"\\n\"),\n\t\tDEFAULT_MAX_CONTEXT_BYTES,\n\t).text;\n\treturn {\n\t\tcustomType: SUBAGENT_COMPLETION_MESSAGE_TYPE,\n\t\tcontent,\n\t\tdisplay: true,\n\t\tdetails: {\n\t\t\tcompletionCount: completions.length,\n\t\t\tcompletions: completions.map(completionMetadata),\n\t\t},\n\t};\n}\n\nfunction completionMetadata(completion: AgentTurnCompletion): CompletionMetadata {\n\tconst completionRequirement = requirementForCompletion(completion.agent, completion.completionId);\n\treturn {\n\t\tprotocol: PI_SUBAGENTS_RPC_PROTOCOL,\n\t\tcompletionId: completion.completionId,\n\t\trunId: completion.runId,\n\t\tgeneration: completion.generation,\n\t\tagentId: completion.agent.id,\n\t\t...(completion.agent.taskPath ? { taskPath: completion.agent.taskPath } : {}),\n\t\t...(completion.recipientPath ? { recipientPath: completion.recipientPath } : {}),\n\t\tagent: completion.agent.agent,\n\t\ttask: sanitizeCompletionLine(completion.task, 256) || \"(unknown task)\",\n\t\tstate: completion.agent.state,\n\t\t...(completion.agent.telemetry?.transport\n\t\t\t? { transport: completion.agent.telemetry.transport }\n\t\t\t: {}),\n\t\t...(completion.agent.structuredResult\n\t\t\t? { structuredResult: completion.agent.structuredResult }\n\t\t\t: {}),\n\t\t...(completion.agent.outcome ? { outcome: completion.agent.outcome } : {}),\n\t\t...(completion.agent.capabilityGrant\n\t\t\t? { capabilityGrant: completion.agent.capabilityGrant }\n\t\t\t: {}),\n\t\t...(completionRequirement ? { completionRequirement } : {}),\n\t};\n}\n\nexport function buildDetachedCompletionMessage(completion: AgentTurnCompletion): string {\n\tconst task = sanitizeCompletionLine(completion.task, 256) || \"(unknown task)\";\n\tconst agentName = sanitizeCompletionLine(completion.agent.agent, 128) || \"(unknown agent)\";\n\tconst output = safeTerminalText(redactPrivateText(completion.output));\n\tconst error = completion.error\n\t\t? truncateUtf8(\n\t\t\t\tsafeTerminalText(redactPrivateText(completion.error)),\n\t\t\t\tMAX_COMPLETION_ERROR_BYTES,\n\t\t\t).text\n\t\t: \"\";\n\treturn truncateUtf8(\n\t\t[\n\t\t\t\"Message Type: SUBAGENT_COMPLETION\",\n\t\t\t`Protocol: ${PI_SUBAGENTS_RPC_PROTOCOL}`,\n\t\t\t`Completion ID: ${completion.completionId}`,\n\t\t\t`Run ID: ${completion.runId}`,\n\t\t\t`Generation: ${completion.generation}`,\n\t\t\t`Agent ID: ${completion.agent.id}`,\n\t\t\t...(completion.agent.taskPath ? [`Agent Path: ${completion.agent.taskPath}`] : []),\n\t\t\t...(completion.recipientPath ? [`Recipient Path: ${completion.recipientPath}`] : []),\n\t\t\t`Agent: ${agentName}`,\n\t\t\t`Task: ${task}`,\n\t\t\t`State: ${completion.agent.state}`,\n\t\t\t...(error.trim() ? [\"Error:\", error] : []),\n\t\t\t\"Payload:\",\n\t\t\toutput.trim() ? output : \"(no output)\",\n\t\t].join(\"\\n\"),\n\t\tMAX_TOOL_MESSAGE_BYTES,\n\t).text;\n}\n\nfunction sanitizeCompletionLine(value: string, maxBytes: number): string {\n\treturn (\n\t\ttruncateUtf8(redactPrivateText(value), maxBytes)\n\t\t\t// biome-ignore lint/suspicious/noControlCharactersInRegex: Strip untrusted terminal controls.\n\t\t\t.text.replace(/[\\u0000-\\u001f\\u007f]+/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim()\n\t);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|