@narumitw/pi-subagents 2.0.5 → 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.
Files changed (178) hide show
  1. package/README.md +152 -50
  2. package/dist/chunks/{auto-transport-SY2VHUFH.ts → auto-transport-FUUKFDIG.ts} +6 -6
  3. package/dist/chunks/{capability-grant-CGEWOEKE.ts → capability-grant-PR72SWWS.ts} +4 -4
  4. package/dist/chunks/{chunk-DPPVEQAM.ts → chunk-4AQSF7AS.ts} +1 -1
  5. package/dist/chunks/chunk-4AQSF7AS.ts.map +7 -0
  6. package/dist/chunks/chunk-6H6TBBED.ts +108 -0
  7. package/dist/chunks/chunk-6H6TBBED.ts.map +7 -0
  8. package/dist/chunks/{chunk-DSOOH73Y.ts → chunk-7AAJEUSL.ts} +3 -3
  9. package/dist/chunks/{chunk-DSOOH73Y.ts.map → chunk-7AAJEUSL.ts.map} +2 -2
  10. package/dist/chunks/{chunk-7QPPBBXZ.ts → chunk-D4CR7T73.ts} +21 -3
  11. package/dist/chunks/chunk-D4CR7T73.ts.map +7 -0
  12. package/dist/chunks/{chunk-434NII74.ts → chunk-DIHBUR2E.ts} +54 -8
  13. package/dist/chunks/chunk-DIHBUR2E.ts.map +7 -0
  14. package/dist/chunks/{chunk-NIF42QMF.ts → chunk-FEVPWRMU.ts} +7 -4
  15. package/dist/chunks/chunk-FEVPWRMU.ts.map +7 -0
  16. package/dist/chunks/{chunk-YBUWBRF7.ts → chunk-FXI45N3J.ts} +5 -5
  17. package/dist/chunks/{chunk-S2IWVK3J.ts → chunk-ILEQ27AL.ts} +3 -2
  18. package/dist/chunks/chunk-ILEQ27AL.ts.map +7 -0
  19. package/dist/chunks/{chunk-DQMN4OYM.ts → chunk-ITVWPNU4.ts} +12 -106
  20. package/dist/chunks/chunk-ITVWPNU4.ts.map +7 -0
  21. package/dist/chunks/{chunk-QDVGH2X7.ts → chunk-IWC32VPY.ts} +2 -1
  22. package/dist/chunks/{chunk-QDVGH2X7.ts.map → chunk-IWC32VPY.ts.map} +2 -2
  23. package/dist/chunks/{chunk-I2FAK44T.ts → chunk-JSZIP73U.ts} +48 -10
  24. package/dist/chunks/chunk-JSZIP73U.ts.map +7 -0
  25. package/dist/chunks/{chunk-ZHTNCZIA.ts → chunk-JU6LUNLP.ts} +2 -2
  26. package/dist/chunks/{chunk-PSK43Y6A.ts → chunk-LASD73CM.ts} +2 -2
  27. package/dist/chunks/{chunk-C4L6P266.ts → chunk-LEOYDZI3.ts} +1 -1
  28. package/dist/chunks/{chunk-C4L6P266.ts.map → chunk-LEOYDZI3.ts.map} +2 -2
  29. package/dist/chunks/{chunk-H3BFJ7HJ.ts → chunk-LL4LP2T7.ts} +5 -5
  30. package/dist/chunks/chunk-N2T5IN4X.ts +18 -0
  31. package/dist/chunks/chunk-N2T5IN4X.ts.map +7 -0
  32. package/dist/chunks/{chunk-G3RSMSXJ.ts → chunk-NTRPLF46.ts} +1 -1
  33. package/dist/chunks/chunk-NTRPLF46.ts.map +7 -0
  34. package/dist/chunks/{chunk-CBP76ARQ.ts → chunk-PABJJYP6.ts} +174 -47
  35. package/dist/chunks/chunk-PABJJYP6.ts.map +7 -0
  36. package/dist/chunks/{chunk-EFBPISNT.ts → chunk-PBZMBTNJ.ts} +104 -103
  37. package/dist/chunks/chunk-PBZMBTNJ.ts.map +7 -0
  38. package/dist/chunks/{chunk-SCZ33MYW.ts → chunk-PGLSFLYW.ts} +2 -2
  39. package/dist/chunks/{chunk-O4VO6JUJ.ts → chunk-TM2R67J3.ts} +3 -3
  40. package/dist/chunks/{chunk-QBORTI4W.ts → chunk-TMZRHIIK.ts} +32 -3
  41. package/dist/chunks/chunk-TMZRHIIK.ts.map +7 -0
  42. package/dist/chunks/chunk-TZ34IQ3M.ts +59 -0
  43. package/dist/chunks/chunk-TZ34IQ3M.ts.map +7 -0
  44. package/dist/chunks/chunk-VBDGNNLM.ts +214 -0
  45. package/dist/chunks/chunk-VBDGNNLM.ts.map +7 -0
  46. package/dist/chunks/{chunk-7OBINKFM.ts → chunk-VDG7LTYE.ts} +11 -11
  47. package/dist/chunks/chunk-VDG7LTYE.ts.map +7 -0
  48. package/dist/chunks/{chunk-AEUYS7JC.ts → chunk-X4NMONPE.ts} +1 -1
  49. package/dist/chunks/chunk-X4NMONPE.ts.map +7 -0
  50. package/dist/chunks/{chunk-HKC4ES4B.ts → chunk-YPJEN6NU.ts} +2 -2
  51. package/dist/chunks/{completion-delivery-YPOWSSV3.ts → completion-delivery-JVLNQRWX.ts} +5 -4
  52. package/dist/chunks/{config-status-J4GPWP46.ts → config-status-FKGDECZ3.ts} +7 -6
  53. package/dist/chunks/{config-ui-2YUCUEBM.ts → config-ui-DDKERQHI.ts} +297 -231
  54. package/dist/chunks/config-ui-DDKERQHI.ts.map +7 -0
  55. package/dist/chunks/{consult-IV7UBNQQ.ts → consult-PQ6PRAKC.ts} +14 -13
  56. package/dist/chunks/consult-PQ6PRAKC.ts.map +7 -0
  57. package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts → create-stateful-transport-JWC2EFYL.ts} +6 -6
  58. package/dist/chunks/{delegation-contract-WJPT4FVS.ts → delegation-contract-LA56I5DT.ts} +2 -2
  59. package/dist/chunks/{discovery-K25T3SH4.ts → discovery-MIFB2U4Y.ts} +3 -3
  60. package/dist/chunks/{execution-LA7HN5YF.ts → execution-Q2JZLKJA.ts} +19 -16
  61. package/dist/chunks/execution-Q2JZLKJA.ts.map +7 -0
  62. package/dist/chunks/{in-process-transport-4RF3J6XK.ts → in-process-transport-HJ6TZXC3.ts} +9 -9
  63. package/dist/chunks/{inspect-XV2QALMR.ts → inspect-UH2TKH6E.ts} +25 -10
  64. package/dist/chunks/inspect-UH2TKH6E.ts.map +7 -0
  65. package/dist/chunks/{persistence-VSGXAW4P.ts → persistence-XHPJBZL7.ts} +11 -7
  66. package/dist/chunks/persistence-XHPJBZL7.ts.map +7 -0
  67. package/dist/chunks/{registry-E6XPJB7L.ts → registry-XDXPECWF.ts} +136 -15
  68. package/dist/chunks/registry-XDXPECWF.ts.map +7 -0
  69. package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts → retained-semantic-state-GM75FZGE.ts} +3 -3
  70. package/dist/chunks/{rpc-transport-NEHBHWX4.ts → rpc-transport-7R7DVCEB.ts} +12 -16
  71. package/dist/chunks/rpc-transport-7R7DVCEB.ts.map +7 -0
  72. package/dist/chunks/{spawn-idempotency-QGHO2WKC.ts → spawn-idempotency-BNHOSMZW.ts} +2 -2
  73. package/dist/chunks/{subprocess-transport-NSHOGDC4.ts → subprocess-transport-VHZJRBTW.ts} +15 -14
  74. package/dist/chunks/subprocess-transport-VHZJRBTW.ts.map +7 -0
  75. package/dist/chunks/usage-recording-store-CW3EH2SZ.ts +164 -0
  76. package/dist/chunks/usage-recording-store-CW3EH2SZ.ts.map +7 -0
  77. package/dist/index.ts +427 -30
  78. package/dist/index.ts.map +3 -3
  79. package/docs/async-runtime-protocol.md +69 -0
  80. package/docs/implementation-notes/pi-subagents-capability-matrix.md +62 -0
  81. package/docs/implementation-notes/pi-subagents-current-direction.md +99 -0
  82. package/docs/implementation-notes/pi-subagents-rpc-v1.md +153 -0
  83. package/docs/pi-subagents-diagrams.md +183 -0
  84. package/package.json +9 -8
  85. package/src/agents/types.ts +2 -0
  86. package/src/async-subagent-benchmark.ts +532 -0
  87. package/src/completion-delivery.ts +71 -4
  88. package/src/completion-render.ts +1 -0
  89. package/src/completion-requirement.ts +308 -0
  90. package/src/config-registration.ts +5 -5
  91. package/src/config-status.ts +66 -70
  92. package/src/config-ui.ts +244 -150
  93. package/src/consult-resources.ts +1 -1
  94. package/src/consult.ts +3 -8
  95. package/src/delegation-contract.ts +55 -9
  96. package/src/execution-plan.ts +1 -1
  97. package/src/execution-ui.ts +40 -29
  98. package/src/execution.ts +2 -3
  99. package/src/inspect.ts +24 -1
  100. package/src/orchestration-metrics.ts +1 -1
  101. package/src/panel-execution.ts +2 -3
  102. package/src/panel-failure.ts +1 -1
  103. package/src/panel-render.ts +1 -1
  104. package/src/parallel-limit-ui.ts +6 -5
  105. package/src/params.ts +2 -1
  106. package/src/persistence.ts +9 -0
  107. package/src/process-control.ts +43 -0
  108. package/src/registry-types.ts +5 -0
  109. package/src/registry.ts +162 -18
  110. package/src/render.ts +2 -1
  111. package/src/rpc-transport.ts +1 -1
  112. package/src/runner-outcome.ts +1 -1
  113. package/src/runner-result.ts +1 -1
  114. package/src/runner-types.ts +102 -0
  115. package/src/runner.ts +11 -192
  116. package/src/settings/inspection.ts +27 -0
  117. package/src/settings/schema.ts +9 -0
  118. package/src/settings-reader.ts +7 -0
  119. package/src/settings.ts +20 -0
  120. package/src/spawn-idempotency.ts +5 -0
  121. package/src/stateful-agent-view.ts +15 -19
  122. package/src/stateful-guidance.ts +14 -4
  123. package/src/stateful-limit-ui.ts +23 -20
  124. package/src/stateful-limits.ts +10 -10
  125. package/src/stateful-registration.ts +126 -9
  126. package/src/stateful-render.ts +27 -2
  127. package/src/subagent-details.ts +43 -0
  128. package/src/subagents-extension.ts +66 -8
  129. package/src/subagents.ts +2 -0
  130. package/src/subprocess-transport.ts +2 -1
  131. package/src/supervision.ts +2 -1
  132. package/src/timeout-finalization.ts +1 -1
  133. package/src/tool-schema-compatibility.ts +73 -0
  134. package/src/transport-types.ts +6 -0
  135. package/src/transport-ui.ts +18 -46
  136. package/src/usage-recording-config.ts +13 -0
  137. package/src/usage-recording-store.ts +183 -0
  138. package/src/usage-recording.ts +478 -0
  139. package/src/verification-harness.ts +1 -1
  140. package/src/workflow-ui.ts +17 -9
  141. package/dist/chunks/chunk-434NII74.ts.map +0 -7
  142. package/dist/chunks/chunk-7OBINKFM.ts.map +0 -7
  143. package/dist/chunks/chunk-7QPPBBXZ.ts.map +0 -7
  144. package/dist/chunks/chunk-AEUYS7JC.ts.map +0 -7
  145. package/dist/chunks/chunk-CBP76ARQ.ts.map +0 -7
  146. package/dist/chunks/chunk-DPPVEQAM.ts.map +0 -7
  147. package/dist/chunks/chunk-DQMN4OYM.ts.map +0 -7
  148. package/dist/chunks/chunk-EFBPISNT.ts.map +0 -7
  149. package/dist/chunks/chunk-G3RSMSXJ.ts.map +0 -7
  150. package/dist/chunks/chunk-I2FAK44T.ts.map +0 -7
  151. package/dist/chunks/chunk-NIF42QMF.ts.map +0 -7
  152. package/dist/chunks/chunk-QBORTI4W.ts.map +0 -7
  153. package/dist/chunks/chunk-S2IWVK3J.ts.map +0 -7
  154. package/dist/chunks/config-ui-2YUCUEBM.ts.map +0 -7
  155. package/dist/chunks/consult-IV7UBNQQ.ts.map +0 -7
  156. package/dist/chunks/execution-LA7HN5YF.ts.map +0 -7
  157. package/dist/chunks/inspect-XV2QALMR.ts.map +0 -7
  158. package/dist/chunks/persistence-VSGXAW4P.ts.map +0 -7
  159. package/dist/chunks/registry-E6XPJB7L.ts.map +0 -7
  160. package/dist/chunks/rpc-transport-NEHBHWX4.ts.map +0 -7
  161. package/dist/chunks/subprocess-transport-NSHOGDC4.ts.map +0 -7
  162. /package/dist/chunks/{auto-transport-SY2VHUFH.ts.map → auto-transport-FUUKFDIG.ts.map} +0 -0
  163. /package/dist/chunks/{capability-grant-CGEWOEKE.ts.map → capability-grant-PR72SWWS.ts.map} +0 -0
  164. /package/dist/chunks/{chunk-YBUWBRF7.ts.map → chunk-FXI45N3J.ts.map} +0 -0
  165. /package/dist/chunks/{chunk-ZHTNCZIA.ts.map → chunk-JU6LUNLP.ts.map} +0 -0
  166. /package/dist/chunks/{chunk-PSK43Y6A.ts.map → chunk-LASD73CM.ts.map} +0 -0
  167. /package/dist/chunks/{chunk-H3BFJ7HJ.ts.map → chunk-LL4LP2T7.ts.map} +0 -0
  168. /package/dist/chunks/{chunk-SCZ33MYW.ts.map → chunk-PGLSFLYW.ts.map} +0 -0
  169. /package/dist/chunks/{chunk-O4VO6JUJ.ts.map → chunk-TM2R67J3.ts.map} +0 -0
  170. /package/dist/chunks/{chunk-HKC4ES4B.ts.map → chunk-YPJEN6NU.ts.map} +0 -0
  171. /package/dist/chunks/{completion-delivery-YPOWSSV3.ts.map → completion-delivery-JVLNQRWX.ts.map} +0 -0
  172. /package/dist/chunks/{config-status-J4GPWP46.ts.map → config-status-FKGDECZ3.ts.map} +0 -0
  173. /package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts.map → create-stateful-transport-JWC2EFYL.ts.map} +0 -0
  174. /package/dist/chunks/{delegation-contract-WJPT4FVS.ts.map → delegation-contract-LA56I5DT.ts.map} +0 -0
  175. /package/dist/chunks/{discovery-K25T3SH4.ts.map → discovery-MIFB2U4Y.ts.map} +0 -0
  176. /package/dist/chunks/{in-process-transport-4RF3J6XK.ts.map → in-process-transport-HJ6TZXC3.ts.map} +0 -0
  177. /package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts.map → retained-semantic-state-GM75FZGE.ts.map} +0 -0
  178. /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": "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",
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-DPPVEQAM.ts";
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-DSOOH73Y.ts.map
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": "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",
6
6
  "names": []
7
7
  }
@@ -8,13 +8,13 @@ import {
8
8
  normalizeSubagentSettings,
9
9
  pathEntryExists,
10
10
  resolveSubagentSettingsPaths
11
- } from "./chunk-QBORTI4W.ts";
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-7OBINKFM.ts";
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-7QPPBBXZ.ts.map
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": "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",
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-C4L6P266.ts";
5
+ } from "./chunk-LEOYDZI3.ts";
6
6
  import {
7
7
  SUBAGENT_COMPLETION_MESSAGE_TYPE
8
- } from "./chunk-QDVGH2X7.ts";
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)) return;
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) this.knownCompletionIds.delete(completion.completionId);
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-434NII74.ts.map
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
+ }