@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
@@ -1,5 +1,8 @@
1
1
  // @generated by scripts/build-runtime.mjs; do not edit.
2
2
  // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
3
+ import {
4
+ grammarSafeToolObject
5
+ } from "./chunk-TZ34IQ3M.ts";
3
6
  import {
4
7
  MAX_SUBAGENT_TOOL_CALLS,
5
8
  MAX_SUBAGENT_TURNS
@@ -9,10 +12,10 @@ import {
9
12
  } from "./chunk-RSUXZD6S.ts";
10
13
  import {
11
14
  THINKING_LEVELS
12
- } from "./chunk-DPPVEQAM.ts";
15
+ } from "./chunk-4AQSF7AS.ts";
13
16
  import {
14
17
  DelegationContractSchema
15
- } from "./chunk-I2FAK44T.ts";
18
+ } from "./chunk-JSZIP73U.ts";
16
19
  import {
17
20
  MAX_CONFIGURABLE_PARALLEL_TASKS,
18
21
  MAX_SUBAGENT_TIMEOUT_MS
@@ -228,7 +231,7 @@ var AgentScopeSchema = StringEnum2(["user", "project", "both"], {
228
231
  description: 'Per-invocation custom agent scope. Default: "user". Use "project" for project-local agents or "both" for user and project agents; this is a tool argument, not a pi-subagents.json setting.',
229
232
  default: "user"
230
233
  });
231
- var SubagentParams = Type2.Object({
234
+ var SubagentParams = grammarSafeToolObject({
232
235
  agent: Type2.Optional(
233
236
  Type2.String({ description: "Name of the agent to invoke (for single mode)" })
234
237
  ),
@@ -294,4 +297,4 @@ export {
294
297
  SubagentParams,
295
298
  hasUsableAggregator
296
299
  };
297
- //# sourceMappingURL=chunk-NIF42QMF.ts.map
300
+ //# sourceMappingURL=chunk-FEVPWRMU.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/params.ts", "../../src/panel-presets.ts", "../../src/verified-execution-schema.ts"],
4
+ "sourcesContent": ["import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport { THINKING_LEVELS } from \"./agents/types.js\";\nimport { DelegationContractSchema } from \"./delegation-contract.js\";\nimport { MAX_CONFIGURABLE_PARALLEL_TASKS, MAX_SUBAGENT_TIMEOUT_MS } from \"./limits.js\";\nimport { PANEL_PRESETS } from \"./panel-presets.js\";\nimport { SUBAGENT_RESULT_FORMATS } from \"./result-contract.js\";\nimport { grammarSafeToolObject } from \"./tool-schema-compatibility.js\";\nimport { MAX_SUBAGENT_TOOL_CALLS, MAX_SUBAGENT_TURNS } from \"./turn-budget.js\";\nimport { VerifiedExecutionContractSchema } from \"./verified-execution-schema.js\";\n\nconst TimeoutMs = Type.Number({\n\tdescription:\n\t\t\"Work deadline in milliseconds selected for the task difficulty. On expiry, Pi aborts the work and makes one separately bounded summary attempt. Defaults to PI_SUBAGENT_TIMEOUT_MS or 600000.\",\n\tminimum: 1,\n\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n});\n\nconst TurnLimitFields = {\n\tidleTimeoutMs: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription:\n\t\t\t\t\"Maximum milliseconds without a completed assistant turn or tool result before Pi aborts work and preserves a checkpoint.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\t\t}),\n\t),\n\tmaxTurns: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum assistant turns before unfinished work is stopped and checkpointed.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TURNS,\n\t\t}),\n\t),\n\tmaxToolCalls: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum tool calls before additional tool work is stopped and checkpointed.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TOOL_CALLS,\n\t\t}),\n\t),\n};\n\nconst ThinkingLevelSchema = StringEnum(THINKING_LEVELS, {\n\tdescription:\n\t\t\"Pi thinking level for the subagent process: off, minimal, low, medium, high, xhigh, or max.\",\n});\n\nconst ResultFormatSchema = StringEnum(SUBAGENT_RESULT_FORMATS, {\n\tdescription:\n\t\t\"Optional completion contract. Text preserves ordinary output; structured-v1 and structured-v2 request versioned JSON with bounded text fallback.\",\n});\n\nconst ContractFields = {\n\tcontract: Type.Optional(DelegationContractSchema),\n\tresultFormat: Type.Optional(ResultFormatSchema),\n\tretryPolicy: Type.Optional(\n\t\tType.Object(\n\t\t\t{\n\t\t\t\tmaxAttempts: Type.Integer({ minimum: 1, maximum: 3 }),\n\t\t\t\tbackoffMs: Type.Optional(Type.Integer({ minimum: 0, maximum: 30_000 })),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t),\n\thedgeAfterMs: Type.Optional(Type.Integer({ minimum: 1, maximum: 30_000 })),\n};\n\nconst TaskItem = Type.Object({\n\tagent: Type.String({ description: \"Name of the agent to invoke\" }),\n\ttask: Type.String({ description: \"Task to delegate to the agent\" }),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent process\" })),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nconst WorkflowTaskItem = Type.Object({\n\tid: Type.String({ minLength: 1, maxLength: 256 }),\n\tagent: Type.Optional(\n\t\tType.String({ description: \"Optional explicit agent; omit to route by capability manifest\" }),\n\t),\n\trequiredCapabilities: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 50 }),\n\t),\n\trequiredTools: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 50 }),\n\t),\n\trequiredVerificationRole: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n\tpreferredCostHint: Type.Optional(StringEnum([\"low\", \"medium\", \"high\"] as const)),\n\tpreferredLatencyHint: Type.Optional(StringEnum([\"low\", \"medium\", \"high\"] as const)),\n\ttask: Type.String({ description: \"Task to delegate to the agent\" }),\n\tdependsOn: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 64 }),\n\t),\n\tinputArtifacts: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 50 }),\n\t),\n\tinputArtifactVersions: Type.Optional(\n\t\tType.Record(\n\t\t\tType.String({ minLength: 1, maxLength: 256 }),\n\t\t\tType.String({ minLength: 1, maxLength: 256 }),\n\t\t),\n\t),\n\treadPaths: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 50 })),\n\twritePaths: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 50 })),\n\townershipKeys: Type.Optional(Type.Array(Type.String({ maxLength: 256 }), { maxItems: 50 })),\n\tacceptanceCriteria: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 50 })),\n\tintegrationOwner: Type.Optional(Type.Boolean()),\n\tverifierFor: Type.Optional(\n\t\tType.String({\n\t\t\tminLength: 1,\n\t\t\tmaxLength: 256,\n\t\t\tdescription:\n\t\t\t\t\"Target task ID for one distinct direct-dependent structured-v2 verifier. The executor gates target acceptance on a current exact-tree receipt.\",\n\t\t}),\n\t),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent process\" })),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nconst ChainItem = Type.Object({\n\tagent: Type.String({ description: \"Name of the agent to invoke\" }),\n\ttask: Type.String({ description: \"Task with optional {previous} placeholder for prior output\" }),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent process\" })),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nconst AggregatorItem = Type.Object(\n\t{\n\t\tagent: Type.String({\n\t\t\tdescription: \"Name of the fan-in agent to invoke after parallel tasks complete\",\n\t\t}),\n\t\ttask: Type.String({\n\t\t\tdescription: \"Fan-in task. Use {previous} to include all parallel outputs.\",\n\t\t}),\n\t\tcwd: Type.Optional(\n\t\t\tType.String({ description: \"Working directory for the aggregator process\" }),\n\t\t),\n\t\ttimeoutMs: Type.Optional(TimeoutMs),\n\t\t...TurnLimitFields,\n\t\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t\t...ContractFields,\n\t},\n\t{\n\t\tdescription:\n\t\t\t\"Optional fan-in step for parallel mode. Omit this key entirely when no aggregation is needed; empty or whitespace-only agent/task values are treated as absent.\",\n\t},\n);\n\nconst PanelReviewerItem = Type.Object(\n\t{\n\t\tid: Type.String({ minLength: 1, maxLength: 256 }),\n\t\tagent: Type.String({ minLength: 1 }),\n\t\tfocus: Type.Optional(Type.String({ maxLength: 8 * 1024 })),\n\t\ttimeoutMs: Type.Optional(TimeoutMs),\n\t\t...TurnLimitFields,\n\t\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PanelSynthesizerItem = Type.Object(\n\t{\n\t\tagent: Type.String({ minLength: 1 }),\n\t\ttimeoutMs: Type.Optional(TimeoutMs),\n\t\t...TurnLimitFields,\n\t\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PanelItem = Type.Object(\n\t{\n\t\tid: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n\t\tpreset: Type.Optional(StringEnum(PANEL_PRESETS, { default: \"custom\" })),\n\t\ttask: Type.String({ minLength: 1, maxLength: 50 * 1024 }),\n\t\tcontext: Type.Optional(Type.String({ maxLength: 50 * 1024 })),\n\t\treviewers: Type.Array(PanelReviewerItem, {\n\t\t\tminItems: 2,\n\t\t\tmaxItems: MAX_CONFIGURABLE_PARALLEL_TASKS,\n\t\t}),\n\t\tsynthesizer: PanelSynthesizerItem,\n\t\tminValidReviews: Type.Optional(Type.Integer({ minimum: 2 })),\n\t},\n\t{\n\t\tadditionalProperties: false,\n\t\tdescription:\n\t\t\t\"One bounded independent review round followed by one evidence-preserving synthesis when enough valid reviews remain.\",\n\t},\n);\n\nconst AgentScopeSchema = StringEnum([\"user\", \"project\", \"both\"] as const, {\n\tdescription:\n\t\t'Per-invocation custom agent scope. Default: \"user\". Use \"project\" for project-local agents or \"both\" for user and project agents; this is a tool argument, not a pi-subagents.json setting.',\n\tdefault: \"user\",\n});\n\nexport const SubagentParams = grammarSafeToolObject({\n\tagent: Type.Optional(\n\t\tType.String({ description: \"Name of the agent to invoke (for single mode)\" }),\n\t),\n\ttask: Type.Optional(Type.String({ description: \"Task to delegate (for single mode)\" })),\n\ttasks: Type.Optional(\n\t\tType.Array(TaskItem, {\n\t\t\tdescription: \"Array of {agent, task} for parallel execution\",\n\t\t\tmaxItems: MAX_CONFIGURABLE_PARALLEL_TASKS,\n\t\t}),\n\t),\n\tchain: Type.Optional(\n\t\tType.Array(ChainItem, { description: \"Array of {agent, task} for sequential execution\" }),\n\t),\n\taggregator: Type.Optional(AggregatorItem),\n\tpanel: Type.Optional(PanelItem),\n\tworkflow: Type.Optional(\n\t\tType.Object(\n\t\t\t{\n\t\t\t\tid: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n\t\t\t\tverifiedExecution: Type.Optional(VerifiedExecutionContractSchema),\n\t\t\t\thonorAdmission: Type.Optional(\n\t\t\t\t\tType.Boolean({\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Opt in to declining workflow tasks whose explicit audit metadata recommends parent-owned work or abstention.\",\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\ttasks: Type.Array(WorkflowTaskItem, {\n\t\t\t\t\tminItems: 1,\n\t\t\t\t\tmaxItems: MAX_CONFIGURABLE_PARALLEL_TASKS,\n\t\t\t\t}),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t),\n\tagentScope: Type.Optional(AgentScopeSchema),\n\tconfirmProjectAgents: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Prompt before running project-local agents. Default: true.\",\n\t\t\tdefault: true,\n\t\t}),\n\t),\n\tcwd: Type.Optional(\n\t\tType.String({ description: \"Working directory for the agent process (single mode)\" }),\n\t),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\ttotalTimeoutMs: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription:\n\t\t\t\t\"Overall blocking-workflow deadline in milliseconds, including queued work, workflow tasks, panel phases, chain steps, and fan-in.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\t\t}),\n\t),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nexport type SubagentParams = Static<typeof SubagentParams>;\n\nexport function hasUsableAggregator(\n\taggregator: unknown,\n): aggregator is { agent: string; task: string } {\n\tif (!aggregator || typeof aggregator !== \"object\") return false;\n\tconst candidate = aggregator as { agent?: unknown; task?: unknown };\n\treturn (\n\t\ttypeof candidate.agent === \"string\" &&\n\t\tcandidate.agent.trim().length > 0 &&\n\t\ttypeof candidate.task === \"string\" &&\n\t\tcandidate.task.trim().length > 0\n\t);\n}\n", "export const PANEL_PRESETS = [\"code-review\", \"research\", \"security-review\", \"custom\"] as const;\n\nexport type PanelPreset = (typeof PANEL_PRESETS)[number];\n", "import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\n\nconst VerificationCheckSchema = Type.Object(\n\t{\n\t\tid: Type.String({\n\t\t\tminLength: 1,\n\t\t\tmaxLength: 256,\n\t\t\tpattern: \"^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$\",\n\t\t}),\n\t\tcommand: StringEnum([\"git\", \"node\", \"npm\", \"npx\"] as const),\n\t\targs: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 64 })),\n\t\tcwd: Type.Optional(Type.String({ minLength: 1, maxLength: 4096 })),\n\t\ttimeoutMs: Type.Optional(Type.Integer({ minimum: 1, maximum: 600_000 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const VerifiedExecutionContractSchema = Type.Object(\n\t{\n\t\tverifierAgent: Type.String({ minLength: 1, maxLength: 256 }),\n\t\tmaxReworkCycles: Type.Optional(Type.Integer({ minimum: 0, maximum: 1, default: 1 })),\n\t\tchecks: Type.Optional(Type.Array(VerificationCheckSchema, { maxItems: 32 })),\n\t},\n\t{\n\t\tadditionalProperties: false,\n\t\tdescription:\n\t\t\t\"Explicitly gate mutating workflow success on executor-owned deterministic checks, one least-authority independent verifier, exact submitted-state identity, and managed integration acceptance.\",\n\t},\n);\n\nexport type VerifiedExecutionContract = Static<typeof VerifiedExecutionContractSchema>;\n"],
5
+ "mappings": "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",
6
+ "names": ["StringEnum", "Type", "Type", "StringEnum"]
7
+ }
@@ -7,15 +7,15 @@ import {
7
7
  import {
8
8
  BUILT_IN_AGENTS,
9
9
  discoverAgents
10
- } from "./chunk-PSK43Y6A.ts";
10
+ } from "./chunk-LASD73CM.ts";
11
11
  import {
12
12
  DEFAULT_CONSULTATION_CWD_POLICY,
13
13
  DEFAULT_CONSULT_RESOURCE_POLICY
14
- } from "./chunk-QBORTI4W.ts";
14
+ } from "./chunk-TMZRHIIK.ts";
15
15
  import {
16
16
  THINKING_LEVELS,
17
17
  resolveAgentToolNames
18
- } from "./chunk-DPPVEQAM.ts";
18
+ } from "./chunk-4AQSF7AS.ts";
19
19
  import {
20
20
  COLLAPSED_ANSWER_LINES,
21
21
  COLLAPSED_LIST_LIMIT,
@@ -372,7 +372,7 @@ function safeNumber(value) {
372
372
  // src/consult-registration.ts
373
373
  function registerSubagentConsult(pi, options, dependencies = {}) {
374
374
  const loadExecution = cachedModuleLoader(
375
- dependencies.loadExecution ?? (() => import("./consult-IV7UBNQQ.ts"))
375
+ dependencies.loadExecution ?? (() => import("./consult-PQ6PRAKC.ts"))
376
376
  );
377
377
  let generation = 0;
378
378
  const active = /* @__PURE__ */ new Set();
@@ -487,4 +487,4 @@ export {
487
487
  SubagentConsultParams,
488
488
  registerSubagentConsult
489
489
  };
490
- //# sourceMappingURL=chunk-YBUWBRF7.ts.map
490
+ //# sourceMappingURL=chunk-FXI45N3J.ts.map
@@ -23,7 +23,8 @@ function hashSpawnRequest(request) {
23
23
  workspaceMode: request.workspaceMode,
24
24
  allowConcurrentWrites: request.allowConcurrentWrites,
25
25
  ...request.contract === void 0 ? {} : { contract: request.contract },
26
- resultFormat: request.resultFormat
26
+ resultFormat: request.resultFormat,
27
+ ...request.completionRequirement === "required" ? { completionRequirement: "required" } : {}
27
28
  })
28
29
  ).digest("hex");
29
30
  }
@@ -41,4 +42,4 @@ export {
41
42
  hashSpawnRequest,
42
43
  assertSpawnIdempotencyKey
43
44
  };
44
- //# sourceMappingURL=chunk-S2IWVK3J.ts.map
45
+ //# sourceMappingURL=chunk-ILEQ27AL.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/spawn-idempotency.ts"],
4
+ "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport type { AgentScope, SubagentThinkingLevel } from \"./agents/types.js\";\nimport type { CompletionRequirementMode } from \"./completion-requirement.js\";\nimport type { DelegationContract } from \"./delegation-contract.js\";\nimport type { SubagentResultFormat } from \"./result-contract.js\";\n\nexport const MAX_SPAWN_IDEMPOTENCY_KEY_LENGTH = 256;\n\nexport interface CanonicalSpawnRequest {\n\tagent: string;\n\ttaskName?: string;\n\ttask: string;\n\tcwd: string;\n\tagentScope: AgentScope;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttimeoutMs?: number;\n\tidleTimeoutMs?: number;\n\tmaxTurns?: number;\n\tmaxToolCalls?: number;\n\tparentId?: string;\n\tcontext?: string;\n\tcontextSourceIds: readonly string[];\n\tworkspaceMode: \"shared\" | \"worktree\";\n\tallowConcurrentWrites: boolean;\n\tcontract?: DelegationContract;\n\tresultFormat: SubagentResultFormat;\n\tcompletionRequirement?: CompletionRequirementMode;\n}\n\nexport function hashSpawnRequest(request: CanonicalSpawnRequest): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\n\t\t\tJSON.stringify({\n\t\t\t\tagent: request.agent,\n\t\t\t\t...(request.taskName === undefined ? {} : { taskName: request.taskName }),\n\t\t\t\ttask: request.task,\n\t\t\t\tcwd: request.cwd,\n\t\t\t\tagentScope: request.agentScope,\n\t\t\t\tthinkingLevel: request.thinkingLevel ?? null,\n\t\t\t\t...(request.timeoutMs === undefined ? {} : { timeoutMs: request.timeoutMs }),\n\t\t\t\t...(request.idleTimeoutMs === undefined ? {} : { idleTimeoutMs: request.idleTimeoutMs }),\n\t\t\t\t...(request.maxTurns === undefined ? {} : { maxTurns: request.maxTurns }),\n\t\t\t\t...(request.maxToolCalls === undefined ? {} : { maxToolCalls: request.maxToolCalls }),\n\t\t\t\tparentId: request.parentId ?? null,\n\t\t\t\tcontextHash: request.context\n\t\t\t\t\t? createHash(\"sha256\").update(request.context).digest(\"hex\")\n\t\t\t\t\t: null,\n\t\t\t\tcontextSourceIds: [...request.contextSourceIds],\n\t\t\t\tworkspaceMode: request.workspaceMode,\n\t\t\t\tallowConcurrentWrites: request.allowConcurrentWrites,\n\t\t\t\t...(request.contract === undefined ? {} : { contract: request.contract }),\n\t\t\t\tresultFormat: request.resultFormat,\n\t\t\t\t...(request.completionRequirement === \"required\"\n\t\t\t\t\t? { completionRequirement: \"required\" }\n\t\t\t\t\t: {}),\n\t\t\t}),\n\t\t)\n\t\t.digest(\"hex\");\n}\n\nexport function assertSpawnIdempotencyKey(value: string | undefined): void {\n\tif (value === undefined) return;\n\tif (!value || value.length > MAX_SPAWN_IDEMPOTENCY_KEY_LENGTH) {\n\t\tthrow new Error(\n\t\t\t`subagent_spawn idempotencyKey must contain 1-${MAX_SPAWN_IDEMPOTENCY_KEY_LENGTH} characters`,\n\t\t);\n\t}\n}\n"],
5
+ "mappings": ";;;;AAAA,SAAS,kBAAkB;AAMpB,IAAM,mCAAmC;AAuBzC,SAAS,iBAAiB,SAAwC;AACxE,SAAO,WAAW,QAAQ,EACxB;AAAA,IACA,KAAK,UAAU;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,MACvE,MAAM,QAAQ;AAAA,MACd,KAAK,QAAQ;AAAA,MACb,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,iBAAiB;AAAA,MACxC,GAAI,QAAQ,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,MAC1E,GAAI,QAAQ,kBAAkB,SAAY,CAAC,IAAI,EAAE,eAAe,QAAQ,cAAc;AAAA,MACtF,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,MACvE,GAAI,QAAQ,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,QAAQ,aAAa;AAAA,MACnF,UAAU,QAAQ,YAAY;AAAA,MAC9B,aAAa,QAAQ,UAClB,WAAW,QAAQ,EAAE,OAAO,QAAQ,OAAO,EAAE,OAAO,KAAK,IACzD;AAAA,MACH,kBAAkB,CAAC,GAAG,QAAQ,gBAAgB;AAAA,MAC9C,eAAe,QAAQ;AAAA,MACvB,uBAAuB,QAAQ;AAAA,MAC/B,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,MACvE,cAAc,QAAQ;AAAA,MACtB,GAAI,QAAQ,0BAA0B,aACnC,EAAE,uBAAuB,WAAW,IACpC,CAAC;AAAA,IACL,CAAC;AAAA,EACF,EACC,OAAO,KAAK;AACf;AAEO,SAAS,0BAA0B,OAAiC;AAC1E,MAAI,UAAU,OAAW;AACzB,MAAI,CAAC,SAAS,MAAM,SAAS,kCAAkC;AAC9D,UAAM,IAAI;AAAA,MACT,gDAAgD,gCAAgC;AAAA,IACjF;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -1,24 +1,29 @@
1
1
  // @generated by scripts/build-runtime.mjs; do not edit.
2
2
  // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
3
- import {
4
- resolvePiInvocation
5
- } from "./chunk-IGAMVWFN.ts";
6
3
  import {
7
4
  classifyStructuredOutcome
8
5
  } from "./chunk-47SK2QYC.ts";
9
6
  import {
10
7
  revokeCapabilityGrant
11
- } from "./chunk-HKC4ES4B.ts";
8
+ } from "./chunk-YPJEN6NU.ts";
9
+ import {
10
+ JsonLineDecoder,
11
+ KILL_GRACE_MS,
12
+ terminateProcess
13
+ } from "./chunk-6H6TBBED.ts";
14
+ import {
15
+ resolvePiInvocation
16
+ } from "./chunk-IGAMVWFN.ts";
12
17
  import {
13
18
  buildTimeoutFinalizationPrompt,
14
19
  resolveTimeoutFinalizationMs
15
- } from "./chunk-G3RSMSXJ.ts";
20
+ } from "./chunk-NTRPLF46.ts";
16
21
  import {
17
22
  formatResultFailure,
18
23
  getFinalOutput,
19
24
  getResultFinalOutput,
20
25
  isResultError
21
- } from "./chunk-AEUYS7JC.ts";
26
+ } from "./chunk-X4NMONPE.ts";
22
27
  import {
23
28
  TURN_TERMINATION_VERSION,
24
29
  TimeoutProgressJournal,
@@ -42,69 +47,6 @@ import {
42
47
  truncateUtf8
43
48
  } from "./chunk-H3FP6DLR.ts";
44
49
 
45
- // src/protocol.ts
46
- import { StringDecoder } from "node:string_decoder";
47
- var DEFAULT_MAX_LINE_BYTES = 256 * 1024;
48
- var JsonLineDecoder = class {
49
- constructor(options) {
50
- this.options = options;
51
- const maxLineBytes = options.maxLineBytes ?? DEFAULT_MAX_LINE_BYTES;
52
- if (!Number.isSafeInteger(maxLineBytes) || maxLineBytes < 1) {
53
- throw new Error("JSON line limit must be a positive safe integer");
54
- }
55
- this.maxLineBytes = maxLineBytes;
56
- }
57
- options;
58
- buffer = "";
59
- droppingOversizedLine = false;
60
- maxLineBytes;
61
- decoder = new StringDecoder("utf8");
62
- push(chunk) {
63
- this.buffer += typeof chunk === "string" ? chunk : this.decoder.write(chunk);
64
- this.drain(false);
65
- }
66
- finish() {
67
- this.buffer += this.decoder.end();
68
- this.drain(true);
69
- this.buffer = "";
70
- this.droppingOversizedLine = false;
71
- }
72
- drain(flush) {
73
- while (true) {
74
- const newline = this.buffer.indexOf("\n");
75
- if (newline < 0) break;
76
- const line = this.buffer.slice(0, newline).replace(/\r$/, "");
77
- this.buffer = this.buffer.slice(newline + 1);
78
- if (this.droppingOversizedLine) {
79
- this.droppingOversizedLine = false;
80
- continue;
81
- }
82
- this.processLine(line);
83
- }
84
- if (!flush && Buffer.byteLength(this.buffer, "utf8") > this.maxLineBytes) {
85
- this.options.onOversized?.(Buffer.byteLength(this.buffer, "utf8"));
86
- this.buffer = "";
87
- this.droppingOversizedLine = true;
88
- }
89
- if (flush && this.buffer.length > 0 && !this.droppingOversizedLine) {
90
- this.processLine(this.buffer.replace(/\r$/, ""));
91
- }
92
- }
93
- processLine(line) {
94
- if (!line.trim()) return;
95
- const bytes = Buffer.byteLength(line, "utf8");
96
- if (bytes > this.maxLineBytes) {
97
- this.options.onOversized?.(bytes);
98
- return;
99
- }
100
- try {
101
- this.options.onValue(JSON.parse(line));
102
- } catch {
103
- this.options.onMalformed?.(line);
104
- }
105
- }
106
- };
107
-
108
50
  // src/runner.ts
109
51
  import { spawn } from "node:child_process";
110
52
  import * as fs from "node:fs";
@@ -168,7 +110,6 @@ function mergeUsageStats(target, addition) {
168
110
  }
169
111
 
170
112
  // src/runner.ts
171
- var KILL_GRACE_MS = 5e3;
172
113
  var MAX_RECENT_ACTIVITY_ITEMS = 10;
173
114
  var MAX_RECENT_ACTIVITY_BYTES = 8 * 1024;
174
115
  var MAX_RECENT_ACTIVITY_ARGUMENT_BYTES = 1024;
@@ -319,39 +260,6 @@ async function writePromptToTempFile(agentName, prompt) {
319
260
  });
320
261
  return { dir: tmpDir, filePath };
321
262
  }
322
- function signalProcess(proc, signal) {
323
- if (process.platform !== "win32" && proc.pid) {
324
- try {
325
- process.kill(-proc.pid, signal);
326
- return;
327
- } catch {
328
- }
329
- }
330
- try {
331
- proc.kill(signal);
332
- } catch {
333
- }
334
- }
335
- function terminateProcess(proc, graceMs = KILL_GRACE_MS) {
336
- const leaderExited = proc.exitCode !== null || proc.signalCode !== null;
337
- const capturedOutputClosed = [proc.stdout, proc.stderr].every(
338
- (stream) => !stream || stream.readableEnded || stream.destroyed
339
- );
340
- let closed = leaderExited && capturedOutputClosed;
341
- const onClose = () => {
342
- closed = true;
343
- };
344
- proc.once("close", onClose);
345
- if (!closed) signalProcess(proc, "SIGTERM");
346
- const escalation = setTimeout(() => {
347
- if (!closed) signalProcess(proc, "SIGKILL");
348
- }, graceMs);
349
- escalation.unref();
350
- return () => {
351
- clearTimeout(escalation);
352
- proc.off("close", onClose);
353
- };
354
- }
355
263
  async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, signal, thinkingLevel, timeoutMs, onUpdate, makeDetails, invocationOverride, launchPolicy) {
356
264
  const agent = agents.find((a) => a.name === agentName);
357
265
  if (!agent) {
@@ -904,10 +812,8 @@ ${message}.`,
904
812
  }
905
813
 
906
814
  export {
907
- JsonLineDecoder,
908
815
  buildFanInContext,
909
816
  mapWithConcurrencyLimit,
910
- terminateProcess,
911
817
  runSingleAgent
912
818
  };
913
- //# sourceMappingURL=chunk-DQMN4OYM.ts.map
819
+ //# sourceMappingURL=chunk-ITVWPNU4.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/runner.ts", "../../src/pi-args.ts", "../../src/runner-usage.ts"],
4
+ "sourcesContent": ["import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport { withFileMutationQueue } from \"@earendil-works/pi-coding-agent\";\nimport type { AgentConfig, SubagentThinkingLevel } from \"./agents/types.js\";\nimport { revokeCapabilityGrant } from \"./capability-grant.js\";\nimport {\n\tappendBounded,\n\tDEFAULT_MAX_CONTEXT_BYTES,\n\tDEFAULT_MAX_MESSAGES,\n\tDEFAULT_MAX_OUTPUT_BYTES,\n\tDEFAULT_MAX_STDERR_BYTES,\n\tMAX_SUBAGENT_TIMEOUT_MS,\n\ttruncateUtf8,\n} from \"./limits.js\";\nimport { classifyStructuredOutcome } from \"./outcome.js\";\nimport { buildPiArgs } from \"./pi-args.js\";\nimport { resolvePiInvocation } from \"./pi-invocation.js\";\nimport { KILL_GRACE_MS, terminateProcess } from \"./process-control.js\";\nimport { JsonLineDecoder } from \"./protocol.js\";\nimport { parseAnyStructuredSubagentResult } from \"./result-contract.js\";\nimport { formatResultFailure, getResultFinalOutput, isResultError } from \"./runner-outcome.js\";\nimport { getFinalOutput } from \"./runner-result.js\";\nimport type { ChildLaunchPolicy, RecentActivityItem, SingleResult } from \"./runner-types.js\";\nimport {\n\taddUsageValue,\n\tmergeUsageStats,\n\tprotocolUsageCost,\n\tprotocolUsageCount,\n} from \"./runner-usage.js\";\nimport type { OnUpdateCallback, SubagentDetails } from \"./subagent-details.js\";\nimport {\n\tformatTimeoutCheckpoint,\n\tformatTurnTerminationMessage,\n\tjournalMessages,\n\tTimeoutProgressJournal,\n\tTURN_TERMINATION_VERSION,\n} from \"./timeout-checkpoint.js\";\nimport {\n\tbuildTimeoutFinalizationPrompt,\n\tresolveTimeoutFinalizationMs,\n} from \"./timeout-finalization.js\";\nimport { TurnBudgetMonitor, type TurnBudgetStop } from \"./turn-budget.js\";\n\nexport type { PiArgsOptions } from \"./pi-args.js\";\nexport { buildPiArgs } from \"./pi-args.js\";\nexport { KILL_GRACE_MS, terminateProcess } from \"./process-control.js\";\nexport {\n\tformatResultFailure,\n\tgetResultFinalOutput,\n\tisResultError,\n} from \"./runner-outcome.js\";\nexport type { ChildLaunchPolicy, RecentActivityItem, SingleResult } from \"./runner-types.js\";\nexport type { UsageStats } from \"./runner-usage.js\";\nexport type { OnUpdateCallback, PanelDetails, SubagentDetails } from \"./subagent-details.js\";\n\nconst MAX_RECENT_ACTIVITY_ITEMS = 10;\nconst MAX_RECENT_ACTIVITY_BYTES = 8 * 1024;\nconst MAX_RECENT_ACTIVITY_ARGUMENT_BYTES = 1024;\n\nfunction boundMessageText(\n\tmessage: Message,\n\tmaxBytes: number,\n): { message?: Message; bytes: number; truncated: boolean } {\n\tconst originalBytes = Buffer.byteLength(JSON.stringify(message), \"utf8\");\n\tif (Number.isSafeInteger(maxBytes) && maxBytes >= 0 && originalBytes <= maxBytes) {\n\t\treturn { message, bytes: originalBytes, truncated: false };\n\t}\n\tif (!Number.isSafeInteger(maxBytes) || maxBytes < 0) return { bytes: 0, truncated: true };\n\n\tconst content: Array<\n\t\t| { type: \"text\"; text: string }\n\t\t| { type: \"toolCall\"; id: string; name: string; arguments: Record<string, unknown> }\n\t> = [];\n\tconst bounded = () => ({ ...message, content }) as Message;\n\tconst fits = () => Buffer.byteLength(JSON.stringify(bounded()), \"utf8\") <= maxBytes;\n\tconst addText = (text: string, prepend = false) => {\n\t\tif (!text.trim()) return;\n\t\tconst part = { type: \"text\" as const, text: \"\" };\n\t\tif (prepend) content.unshift(part);\n\t\telse content.push(part);\n\t\tif (!fits()) {\n\t\t\tcontent.splice(content.indexOf(part), 1);\n\t\t\treturn;\n\t\t}\n\t\tlet low = 0;\n\t\tlet high = Buffer.byteLength(text, \"utf8\");\n\t\twhile (low < high) {\n\t\t\tconst middle = Math.ceil((low + high) / 2);\n\t\t\tpart.text = truncateUtf8(text, middle).text;\n\t\t\tif (fits()) low = middle;\n\t\t\telse high = middle - 1;\n\t\t}\n\t\tpart.text = truncateUtf8(text, low).text;\n\t\tif (!part.text.trim()) content.splice(content.indexOf(part), 1);\n\t};\n\tconst addToolCall = (part: Extract<Message[\"content\"][number], { type: \"toolCall\" }>) => {\n\t\tconst toolCall = {\n\t\t\ttype: \"toolCall\" as const,\n\t\t\tid: part.id,\n\t\t\tname: part.name,\n\t\t\targuments: part.arguments,\n\t\t};\n\t\tcontent.unshift(toolCall);\n\t\tif (fits()) return;\n\t\tconst arguments_: Record<string, unknown> = {};\n\t\tfor (const key of [\"command\", \"path\", \"file_path\", \"pattern\", \"url\"]) {\n\t\t\tconst value = part.arguments[key];\n\t\t\tif (typeof value === \"string\") arguments_[key] = truncateUtf8(value, 256).text;\n\t\t}\n\t\ttoolCall.arguments = arguments_;\n\t\tif (fits()) return;\n\t\ttoolCall.arguments = {};\n\t\tif (!fits()) content.shift();\n\t};\n\n\tif (message.role === \"assistant\") {\n\t\tfor (let index = message.content.length - 1; index >= 0; index--) {\n\t\t\tconst part = message.content[index];\n\t\t\tif (part.type === \"text\") addText(part.text, true);\n\t\t\telse if (part.type === \"toolCall\") addToolCall(part);\n\t\t}\n\t} else {\n\t\tfor (const part of message.content) {\n\t\t\tif (typeof part === \"object\" && part && part.type === \"text\") addText(part.text);\n\t\t}\n\t}\n\n\tif (content.length === 0) return { bytes: 0, truncated: true };\n\tconst result = bounded();\n\tconst bytes = Buffer.byteLength(JSON.stringify(result), \"utf8\");\n\treturn { message: result, bytes, truncated: true };\n}\nfunction compactRecentActivityArguments(args: Record<string, unknown>): Record<string, unknown> {\n\tif (Buffer.byteLength(JSON.stringify(args), \"utf8\") <= MAX_RECENT_ACTIVITY_ARGUMENT_BYTES)\n\t\treturn args;\n\tconst compact: Record<string, unknown> = {};\n\tfor (const key of [\"command\", \"path\", \"file_path\", \"pattern\", \"url\", \"selector\"]) {\n\t\tconst value = args[key];\n\t\tif (typeof value === \"string\") compact[key] = truncateUtf8(value, 256).text;\n\t\telse if (typeof value === \"number\" || typeof value === \"boolean\") compact[key] = value;\n\t}\n\treturn compact;\n}\n\nfunction appendRecentActivity(result: SingleResult, message: Message): void {\n\tif (message.role !== \"assistant\") return;\n\tconst append = (item: RecentActivityItem) => {\n\t\tresult.recentActivity ??= [];\n\t\tresult.recentActivityTotal = (result.recentActivityTotal ?? 0) + 1;\n\t\tresult.recentActivity.push(item);\n\t\tif (result.recentActivity.length > MAX_RECENT_ACTIVITY_ITEMS) {\n\t\t\tresult.recentActivity.splice(0, result.recentActivity.length - MAX_RECENT_ACTIVITY_ITEMS);\n\t\t}\n\t\twhile (\n\t\t\tBuffer.byteLength(JSON.stringify(result.recentActivity), \"utf8\") > MAX_RECENT_ACTIVITY_BYTES\n\t\t) {\n\t\t\tresult.recentActivity.shift();\n\t\t}\n\t};\n\tfor (const part of message.content) {\n\t\tif (part.type === \"text\") {\n\t\t\tconst text = part.text.trim();\n\t\t\tif (text) append({ type: \"text\", text: truncateUtf8(text, 1024).text });\n\t\t} else if (part.type === \"toolCall\") {\n\t\t\tappend({\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tname: part.name,\n\t\t\t\targs: compactRecentActivityArguments(part.arguments),\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function buildFanInContext(\n\tresults: SingleResult[],\n\tmaxBytes = DEFAULT_MAX_CONTEXT_BYTES,\n): string {\n\tconst text = results\n\t\t.map((result, index) => {\n\t\t\tconst failed = isResultError(result);\n\t\t\tconst status = result.exitCode === -1 ? \"running\" : failed ? \"failed\" : \"completed\";\n\t\t\tconst output = getResultFinalOutput(result);\n\t\t\tconst error = result.errorMessage || result.stderr.trim();\n\t\t\tconst resultText = failed\n\t\t\t\t? `${error ? \"Error\" : output ? \"Partial output\" : \"Error\"}:\\n${formatResultFailure(result)}`\n\t\t\t\t: result.structuredResult\n\t\t\t\t\t? `Structured result:\\n${JSON.stringify(result.structuredResult)}`\n\t\t\t\t\t: output\n\t\t\t\t\t\t? `Output:\\n${output}`\n\t\t\t\t\t\t: \"Output: (no output)\";\n\t\t\treturn [\n\t\t\t\t`## Result ${index + 1}: ${result.agent} (${status})`,\n\t\t\t\t`Task: ${result.task}`,\n\t\t\t\tresultText,\n\t\t\t].join(\"\\n\\n\");\n\t\t})\n\t\t.join(\"\\n\\n---\\n\\n\");\n\treturn truncateUtf8(text, maxBytes).text;\n}\n\nexport async function mapWithConcurrencyLimit<TIn, TOut>(\n\titems: TIn[],\n\tconcurrency: number,\n\tfn: (item: TIn, index: number) => Promise<TOut>,\n\tsignal?: AbortSignal,\n\tonSkipped?: (item: TIn, index: number) => TOut,\n): Promise<TOut[]> {\n\tif (items.length === 0) return [];\n\tconst limit = Math.max(1, Math.min(concurrency, items.length));\n\tconst results: TOut[] = new Array(items.length);\n\tlet nextIndex = 0;\n\tconst workers = new Array(limit).fill(null).map(async () => {\n\t\twhile (true) {\n\t\t\tconst current = nextIndex++;\n\t\t\tif (current >= items.length) return;\n\t\t\tif (signal?.aborted && onSkipped) {\n\t\t\t\tresults[current] = onSkipped(items[current], current);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresults[current] = await fn(items[current], current);\n\t\t}\n\t});\n\tawait Promise.all(workers);\n\treturn results;\n}\n\nasync function writePromptToTempFile(\n\tagentName: string,\n\tprompt: string,\n): Promise<{ dir: string; filePath: string }> {\n\tconst tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), \"pi-subagent-\"));\n\tconst safeName = agentName.replace(/[^\\w.-]+/g, \"_\");\n\tconst filePath = path.join(tmpDir, `prompt-${safeName}.md`);\n\tawait withFileMutationQueue(filePath, async () => {\n\t\tawait fs.promises.writeFile(filePath, prompt, { encoding: \"utf-8\", mode: 0o600 });\n\t});\n\treturn { dir: tmpDir, filePath };\n}\n\nexport async function runSingleAgent(\n\tdefaultCwd: string,\n\tagents: AgentConfig[],\n\tagentName: string,\n\ttask: string,\n\tcwd: string | undefined,\n\tstep: number | undefined,\n\tsignal: AbortSignal | undefined,\n\tthinkingLevel: SubagentThinkingLevel | undefined,\n\ttimeoutMs: number,\n\tonUpdate: OnUpdateCallback | undefined,\n\tmakeDetails: (results: SingleResult[]) => SubagentDetails,\n\tinvocationOverride?: { command: string; argsPrefix?: string[] },\n\tlaunchPolicy?: ChildLaunchPolicy,\n): Promise<SingleResult> {\n\tconst agent = agents.find((a) => a.name === agentName);\n\n\tif (!agent) {\n\t\tconst available = agents.map((a) => `\"${a.name}\"`).join(\", \") || \"none\";\n\t\treturn {\n\t\t\tagent: agentName,\n\t\t\tagentSource: \"unknown\",\n\t\t\ttask,\n\t\t\texitCode: 1,\n\t\t\tmessages: [],\n\t\t\tstderr: `Unknown agent: \"${agentName}\". Available agents: ${available}.`,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\tcost: 0,\n\t\t\t\tcontextTokens: 0,\n\t\t\t\tturns: 0,\n\t\t\t},\n\t\t\tthinkingLevel,\n\t\t\tstep,\n\t\t\tfinalOutput: \"\",\n\t\t};\n\t}\n\n\tconst temporaryPrompts: Array<{ dir: string; filePath: string }> = [];\n\tlet tmpPromptPath: string | null = null;\n\tlet baseSystemPromptPath: string | null = null;\n\n\tlet latestAssistantOutput = \"\";\n\tlet terminalAssistantOutput: string | undefined;\n\n\tconst progressJournal = new TimeoutProgressJournal();\n\tconst currentResult: SingleResult = {\n\t\tagent: agentName,\n\t\tagentSource: agent.source,\n\t\ttask: launchPolicy?.displayTask ?? task,\n\t\texitCode: 0,\n\t\tmessages: [],\n\t\tstderr: \"\",\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\tcost: 0,\n\t\t\tcontextTokens: 0,\n\t\t\tturns: 0,\n\t\t},\n\t\tmodel: agent.model ?? undefined,\n\t\tthinkingLevel,\n\t\tstep,\n\t\ttimeoutMs,\n\t\tcontract: launchPolicy?.contract,\n\t\tresultFormat: launchPolicy?.resultFormat,\n\t\texecutionPlan: launchPolicy?.executionPlan,\n\t\tcapabilityGrant: launchPolicy?.capabilityGrant,\n\t};\n\tconst selectedAssistantOutput = () =>\n\t\tterminalAssistantOutput !== undefined\n\t\t\t? terminalAssistantOutput\n\t\t\t: latestAssistantOutput || getFinalOutput(currentResult.messages);\n\tconst setErrorMessage = (message: string) => {\n\t\tconst bounded = truncateUtf8(message, DEFAULT_MAX_STDERR_BYTES);\n\t\tcurrentResult.errorMessage = bounded.text;\n\t\tcurrentResult.truncated ||= bounded.truncated;\n\t\treturn bounded.text;\n\t};\n\n\tconst emitUpdate = () => {\n\t\tconst latest = truncateUtf8(selectedAssistantOutput(), DEFAULT_MAX_OUTPUT_BYTES);\n\t\tcurrentResult.finalOutput = latest.text;\n\t\tcurrentResult.truncated ||= latest.truncated;\n\t\tif (onUpdate) {\n\t\t\tonUpdate({\n\t\t\t\tcontent: [{ type: \"text\", text: currentResult.finalOutput || \"(running...)\" }],\n\t\t\t\tdetails: makeDetails([currentResult]),\n\t\t\t});\n\t\t}\n\t};\n\n\ttry {\n\t\tconst effectiveCwd = cwd ?? defaultCwd;\n\t\ttry {\n\t\t\tif (!fs.statSync(effectiveCwd).isDirectory()) throw new Error(\"not a directory\");\n\t\t} catch (error) {\n\t\t\tcurrentResult.exitCode = 1;\n\t\t\tcurrentResult.stopReason = \"error\";\n\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\tcurrentResult.stderr = setErrorMessage(`Invalid subagent cwd: ${effectiveCwd} (${reason})`);\n\t\t\treturn currentResult;\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\tcurrentResult.exitCode = 130;\n\t\t\tcurrentResult.aborted = true;\n\t\t\tcurrentResult.stopReason = \"aborted\";\n\t\t\tsetErrorMessage(\"Subagent was aborted before start\");\n\t\t\treturn currentResult;\n\t\t}\n\t\tif (!Number.isFinite(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_SUBAGENT_TIMEOUT_MS) {\n\t\t\tcurrentResult.exitCode = 1;\n\t\t\tcurrentResult.stopReason = \"error\";\n\t\t\tsetErrorMessage(\n\t\t\t\t`Invalid subagent timeout: expected 1-${MAX_SUBAGENT_TIMEOUT_MS}ms, received ${timeoutMs}`,\n\t\t\t);\n\t\t\treturn currentResult;\n\t\t}\n\n\t\tif (launchPolicy?.baseSystemPrompt?.trim()) {\n\t\t\tconst tmp = await writePromptToTempFile(`${agent.name}-base`, launchPolicy.baseSystemPrompt);\n\t\t\ttemporaryPrompts.push(tmp);\n\t\t\tbaseSystemPromptPath = tmp.filePath;\n\t\t}\n\t\tif (agent.systemPrompt.trim()) {\n\t\t\tconst tmp = await writePromptToTempFile(agent.name, agent.systemPrompt);\n\t\t\ttemporaryPrompts.push(tmp);\n\t\t\ttmpPromptPath = tmp.filePath;\n\t\t}\n\t\tif (signal?.aborted) {\n\t\t\tcurrentResult.exitCode = 130;\n\t\t\tcurrentResult.aborted = true;\n\t\t\tcurrentResult.stopReason = \"aborted\";\n\t\t\tsetErrorMessage(\"Subagent was aborted before launch\");\n\t\t\treturn currentResult;\n\t\t}\n\n\t\tconst effectiveTools =\n\t\t\tlaunchPolicy && Object.hasOwn(launchPolicy, \"tools\") ? launchPolicy.tools : agent.tools;\n\t\tconst selectedTools =\n\t\t\teffectiveTools === undefined\n\t\t\t\t? undefined\n\t\t\t\t: [...new Set([...effectiveTools, ...(launchPolicy?.additionalTools ?? [])])];\n\t\tconst args = buildPiArgs({\n\t\t\tmodel: agent.model,\n\t\t\tthinkingLevel,\n\t\t\ttools: selectedTools,\n\t\t\tdisableExtensions: launchPolicy?.disableExtensions,\n\t\t\tdisableSkills: launchPolicy?.disableSkills,\n\t\t\tdisablePromptTemplates: launchPolicy?.disablePromptTemplates,\n\t\t\tdisableContextFiles: launchPolicy?.disableContextFiles,\n\t\t\tprojectTrust: launchPolicy?.projectTrust,\n\t\t\tbaseSystemPromptPath: baseSystemPromptPath ?? undefined,\n\t\t\tappendSystemPromptPaths: launchPolicy?.appendSystemPromptPaths,\n\t\t\textensionPaths: launchPolicy?.extensionPaths,\n\t\t\tsystemPromptPath: tmpPromptPath ?? undefined,\n\t\t\ttask,\n\t\t});\n\t\tlet invocation: { command: string; args: string[] };\n\t\ttry {\n\t\t\tinvocation = invocationOverride\n\t\t\t\t? {\n\t\t\t\t\t\tcommand: invocationOverride.command,\n\t\t\t\t\t\targs: [...(invocationOverride.argsPrefix ?? []), ...args],\n\t\t\t\t\t}\n\t\t\t\t: resolvePiInvocation(args);\n\t\t} catch (error) {\n\t\t\tcurrentResult.launchFailed = true;\n\t\t\tcurrentResult.exitCode = 1;\n\t\t\tcurrentResult.stderr = setErrorMessage(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t);\n\t\t\treturn currentResult;\n\t\t}\n\t\tlet wasAborted = false;\n\t\tlet timedOut = false;\n\t\tlet budgetStop:\n\t\t\t| TurnBudgetStop\n\t\t\t| { reason: \"work_timeout\" | \"orchestration_timeout\"; limit: number }\n\t\t\t| undefined;\n\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tlet cleanupTermination: (() => void) | undefined;\n\t\t\tlet timeout: NodeJS.Timeout | undefined;\n\t\t\tlet terminationDeadline: NodeJS.Timeout | undefined;\n\t\t\tlet abortHandler: (() => void) | undefined;\n\t\t\tlet budgetMonitor: TurnBudgetMonitor | undefined;\n\t\t\tconst finish = (code: number) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\t\tif (terminationDeadline) clearTimeout(terminationDeadline);\n\t\t\t\tcleanupTermination?.();\n\t\t\t\tbudgetMonitor?.dispose();\n\t\t\t\tif (signal && abortHandler) signal.removeEventListener(\"abort\", abortHandler);\n\t\t\t\tresolve(code);\n\t\t\t};\n\t\t\tlet proc: ReturnType<typeof spawn>;\n\t\t\ttry {\n\t\t\t\tproc = spawn(invocation.command, invocation.args, {\n\t\t\t\t\tcwd: effectiveCwd,\n\t\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\t\tshell: false,\n\t\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\t\tenv: {\n\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t...launchPolicy?.env,\n\t\t\t\t\t\tPI_SUBAGENT_DEPTH: String(\n\t\t\t\t\t\t\t(Number.parseInt(process.env.PI_SUBAGENT_DEPTH ?? \"0\", 10) || 0) + 1,\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tcurrentResult.launchFailed = true;\n\t\t\t\tcurrentResult.stderr = setErrorMessage(\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t);\n\t\t\t\tfinish(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst addMessage = (msg: Message) => {\n\t\t\t\tconst boundedMessage = boundMessageText(msg, DEFAULT_MAX_OUTPUT_BYTES - 2);\n\t\t\t\tcurrentResult.truncated ||= boundedMessage.truncated;\n\t\t\t\tif (!boundedMessage.message) return;\n\t\t\t\twhile (\n\t\t\t\t\tcurrentResult.messages.length >= DEFAULT_MAX_MESSAGES ||\n\t\t\t\t\tBuffer.byteLength(\n\t\t\t\t\t\tJSON.stringify([...currentResult.messages, boundedMessage.message]),\n\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t) > DEFAULT_MAX_OUTPUT_BYTES\n\t\t\t\t) {\n\t\t\t\t\tconst removed = currentResult.messages.shift();\n\t\t\t\t\tif (!removed) break;\n\t\t\t\t\tcurrentResult.truncated = true;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tBuffer.byteLength(\n\t\t\t\t\t\tJSON.stringify([...currentResult.messages, boundedMessage.message]),\n\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t) > DEFAULT_MAX_OUTPUT_BYTES\n\t\t\t\t) {\n\t\t\t\t\tcurrentResult.truncated = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcurrentResult.messages.push(boundedMessage.message);\n\t\t\t};\n\t\t\tconst processEvent = (raw: unknown) => {\n\t\t\t\tif (!raw || typeof raw !== \"object\") return;\n\t\t\t\tconst event = raw as { type?: string; message?: Message };\n\t\t\t\tif (event.type === \"message_end\" && event.message) {\n\t\t\t\t\tconst msg = event.message;\n\t\t\t\t\tjournalMessages(progressJournal, [msg]);\n\t\t\t\t\tif (msg.role === \"assistant\") {\n\t\t\t\t\t\tconst output = truncateUtf8(getFinalOutput([msg]), DEFAULT_MAX_OUTPUT_BYTES);\n\t\t\t\t\t\tcurrentResult.truncated ||= output.truncated;\n\t\t\t\t\t\tif (output.text) latestAssistantOutput = output.text;\n\t\t\t\t\t\tif (msg.stopReason === \"stop\" || msg.stopReason === \"length\") {\n\t\t\t\t\t\t\tterminalAssistantOutput = output.text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tappendRecentActivity(currentResult, msg);\n\t\t\t\t\taddMessage(msg);\n\t\t\t\t\tif (msg.role === \"assistant\") {\n\t\t\t\t\t\tcurrentResult.usage.turns++;\n\t\t\t\t\t\tbudgetMonitor?.recordToolCalls(\n\t\t\t\t\t\t\tmsg.content.filter((part) => part.type === \"toolCall\").length,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbudgetMonitor?.recordAssistantTurn(msg.stopReason);\n\t\t\t\t\t\tconst usage = msg.usage;\n\t\t\t\t\t\tif (usage && typeof usage === \"object\") {\n\t\t\t\t\t\t\tconst input = protocolUsageCount(usage.input);\n\t\t\t\t\t\t\tconst output = protocolUsageCount(usage.output);\n\t\t\t\t\t\t\tconst cacheRead = protocolUsageCount(usage.cacheRead);\n\t\t\t\t\t\t\tconst cacheWrite = protocolUsageCount(usage.cacheWrite);\n\t\t\t\t\t\t\tconst reportedTotal = protocolUsageCount(usage.totalTokens);\n\t\t\t\t\t\t\tconst turnTotal =\n\t\t\t\t\t\t\t\treportedTotal ||\n\t\t\t\t\t\t\t\taddUsageValue(addUsageValue(input, output), addUsageValue(cacheRead, cacheWrite));\n\t\t\t\t\t\t\tconst cost = usage.cost && typeof usage.cost === \"object\" ? usage.cost : undefined;\n\t\t\t\t\t\t\tcurrentResult.usage.input = addUsageValue(currentResult.usage.input, input);\n\t\t\t\t\t\t\tcurrentResult.usage.output = addUsageValue(currentResult.usage.output, output);\n\t\t\t\t\t\t\tcurrentResult.usage.cacheRead = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.cacheRead,\n\t\t\t\t\t\t\t\tcacheRead,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.cacheWrite = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.cacheWrite,\n\t\t\t\t\t\t\t\tcacheWrite,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.cost = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.cost,\n\t\t\t\t\t\t\t\tprotocolUsageCost(cost?.total),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.costInput = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.costInput ?? 0,\n\t\t\t\t\t\t\t\tprotocolUsageCost(cost?.input),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.costOutput = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.costOutput ?? 0,\n\t\t\t\t\t\t\t\tprotocolUsageCost(cost?.output),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.costCacheRead = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.costCacheRead ?? 0,\n\t\t\t\t\t\t\t\tprotocolUsageCost(cost?.cacheRead),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.costCacheWrite = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.costCacheWrite ?? 0,\n\t\t\t\t\t\t\t\tprotocolUsageCost(cost?.cacheWrite),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.totalTokens = addUsageValue(\n\t\t\t\t\t\t\t\tcurrentResult.usage.totalTokens ?? 0,\n\t\t\t\t\t\t\t\tturnTotal,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcurrentResult.usage.contextTokens = turnTotal;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof msg.provider === \"string\") currentResult.actualProvider = msg.provider;\n\t\t\t\t\t\tconst actualModel =\n\t\t\t\t\t\t\ttypeof msg.responseModel === \"string\"\n\t\t\t\t\t\t\t\t? msg.responseModel\n\t\t\t\t\t\t\t\t: typeof msg.model === \"string\"\n\t\t\t\t\t\t\t\t\t? msg.model\n\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (actualModel) currentResult.actualModel = actualModel;\n\t\t\t\t\t\tif (typeof msg.stopReason === \"string\") currentResult.stopReason = msg.stopReason;\n\t\t\t\t\t\tif (typeof msg.errorMessage === \"string\") setErrorMessage(msg.errorMessage);\n\t\t\t\t\t}\n\t\t\t\t\temitUpdate();\n\t\t\t\t} else if (event.type === \"tool_result_end\" && event.message) {\n\t\t\t\t\tjournalMessages(progressJournal, [event.message]);\n\t\t\t\t\tbudgetMonitor?.recordActivity();\n\t\t\t\t\taddMessage(event.message);\n\t\t\t\t\temitUpdate();\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst decoder = new JsonLineDecoder({\n\t\t\t\tonValue: processEvent,\n\t\t\t\tonMalformed: () => {\n\t\t\t\t\tcurrentResult.malformedEvents = (currentResult.malformedEvents ?? 0) + 1;\n\t\t\t\t},\n\t\t\t\tonOversized: () => {\n\t\t\t\t\tcurrentResult.truncated = true;\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst beginTermination = (exitCode: number) => {\n\t\t\t\tif (cleanupTermination || settled) return;\n\t\t\t\tcleanupTermination = terminateProcess(proc);\n\t\t\t\tterminationDeadline = setTimeout(() => {\n\t\t\t\t\tdecoder.finish();\n\t\t\t\t\tproc.stdin?.destroy();\n\t\t\t\t\tproc.stdout?.destroy();\n\t\t\t\t\tproc.stderr?.destroy();\n\t\t\t\t\tfinish(exitCode);\n\t\t\t\t}, KILL_GRACE_MS + 1_000);\n\t\t\t};\n\t\t\tconst stopForBudget = (\n\t\t\t\tstop: TurnBudgetStop | { reason: \"work_timeout\" | \"orchestration_timeout\"; limit: number },\n\t\t\t) => {\n\t\t\t\tif (budgetStop || settled || wasAborted) return;\n\t\t\t\tbudgetStop = stop;\n\t\t\t\ttimedOut = stop.reason.endsWith(\"timeout\");\n\t\t\t\tcurrentResult.timedOut = timedOut || undefined;\n\t\t\t\tcurrentResult.stopReason = timedOut ? \"timeout\" : \"limit\";\n\t\t\t\tconst message = formatTurnTerminationMessage(stop.reason, stop.limit);\n\t\t\t\tsetErrorMessage(message);\n\t\t\t\tconst bounded = appendBounded(\n\t\t\t\t\tcurrentResult.stderr,\n\t\t\t\t\t`\\n${message}.`,\n\t\t\t\t\tDEFAULT_MAX_STDERR_BYTES,\n\t\t\t\t);\n\t\t\t\tcurrentResult.stderr = bounded.text;\n\t\t\t\tcurrentResult.truncated ||= bounded.truncated;\n\t\t\t\temitUpdate();\n\t\t\t\tbeginTermination(124);\n\t\t\t};\n\t\t\tbudgetMonitor = new TurnBudgetMonitor({\n\t\t\t\t...launchPolicy?.turnLimits,\n\t\t\t\tonExceeded: stopForBudget,\n\t\t\t});\n\n\t\t\tproc.once(\"spawn\", () => {\n\t\t\t\tcurrentResult.processStarted = true;\n\t\t\t\tif (settled || budgetStop || wasAborted) return;\n\t\t\t\ttimeout = setTimeout(() => {\n\t\t\t\t\tstopForBudget({\n\t\t\t\t\t\treason: launchPolicy?.workTimeoutReason ?? \"work_timeout\",\n\t\t\t\t\t\tlimit: launchPolicy?.workTimeoutReportLimit ?? timeoutMs,\n\t\t\t\t\t});\n\t\t\t\t}, timeoutMs);\n\t\t\t\ttimeout.unref();\n\t\t\t});\n\t\t\tproc.stdout?.on(\"data\", (data) => decoder.push(data));\n\t\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\t\tconst bounded = appendBounded(\n\t\t\t\t\tcurrentResult.stderr,\n\t\t\t\t\tdata.toString(),\n\t\t\t\t\tDEFAULT_MAX_STDERR_BYTES,\n\t\t\t\t);\n\t\t\t\tcurrentResult.stderr = bounded.text;\n\t\t\t\tcurrentResult.truncated ||= bounded.truncated;\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => {\n\t\t\t\tdecoder.finish();\n\t\t\t\tfinish(budgetStop ? 124 : wasAborted ? 130 : (code ?? 0));\n\t\t\t});\n\t\t\tproc.on(\"error\", (error) => {\n\t\t\t\tcurrentResult.launchFailed = currentResult.processStarted ? undefined : true;\n\t\t\t\tconst message = setErrorMessage(error.message);\n\t\t\t\tconst bounded = appendBounded(\n\t\t\t\t\tcurrentResult.stderr,\n\t\t\t\t\t`${currentResult.stderr ? \"\\n\" : \"\"}${message}`,\n\t\t\t\t\tDEFAULT_MAX_STDERR_BYTES,\n\t\t\t\t);\n\t\t\t\tcurrentResult.stderr = bounded.text;\n\t\t\t\tcurrentResult.truncated ||= bounded.truncated;\n\t\t\t\tif (currentResult.processStarted) beginTermination(1);\n\t\t\t\telse finish(1);\n\t\t\t});\n\n\t\t\tif (signal) {\n\t\t\t\tabortHandler = () => {\n\t\t\t\t\tif (budgetStop || settled) return;\n\t\t\t\t\twasAborted = true;\n\t\t\t\t\tcurrentResult.aborted = true;\n\t\t\t\t\tcurrentResult.stopReason = \"aborted\";\n\t\t\t\t\tsetErrorMessage(\"Subagent was aborted\");\n\t\t\t\t\tbeginTermination(130);\n\t\t\t\t};\n\t\t\t\tif (signal.aborted) abortHandler();\n\t\t\t\telse signal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t}\n\t\t});\n\n\t\tif (signal?.aborted && budgetStop) {\n\t\t\tbudgetStop = undefined;\n\t\t\ttimedOut = false;\n\t\t\tcurrentResult.timedOut = undefined;\n\t\t\tcurrentResult.aborted = true;\n\t\t\tcurrentResult.stopReason = \"aborted\";\n\t\t\tsetErrorMessage(\"Subagent was aborted\");\n\t\t}\n\t\tcurrentResult.exitCode = currentResult.aborted ? 130 : exitCode;\n\t\tconst final = truncateUtf8(selectedAssistantOutput(), DEFAULT_MAX_OUTPUT_BYTES);\n\t\tcurrentResult.finalOutput = final.text;\n\t\tcurrentResult.truncated ||= final.truncated;\n\t\tif (budgetStop) {\n\t\t\tcurrentResult.partialOutput = currentResult.finalOutput || undefined;\n\t\t\tcurrentResult.termination = {\n\t\t\t\tversion: TURN_TERMINATION_VERSION,\n\t\t\t\treason: budgetStop.reason,\n\t\t\t\tlimit: budgetStop.limit,\n\t\t\t\tcheckpoint: progressJournal.checkpoint(task, currentResult.partialOutput),\n\t\t\t\tfinalization: { attempted: false, status: \"skipped\", durationMs: 0 },\n\t\t\t};\n\t\t}\n\t\tconst remainingFinalizationMs = launchPolicy?.orchestrationDeadlineAt\n\t\t\t? Math.floor(launchPolicy.orchestrationDeadlineAt - Date.now())\n\t\t\t: undefined;\n\t\tif (\n\t\t\tbudgetStop &&\n\t\t\tbudgetStop.reason !== \"orchestration_timeout\" &&\n\t\t\tlaunchPolicy?.finalizeOnTimeout !== false &&\n\t\t\t!signal?.aborted &&\n\t\t\t(remainingFinalizationMs === undefined || remainingFinalizationMs > 0)\n\t\t) {\n\t\t\tconst finalizationStartedAt = Date.now();\n\t\t\tconst requestedFinalizationMs = resolveTimeoutFinalizationMs(\n\t\t\t\ttimeoutMs,\n\t\t\t\tlaunchPolicy?.timeoutFinalizationMs,\n\t\t\t);\n\t\t\tconst finalizationMs = Math.min(\n\t\t\t\trequestedFinalizationMs,\n\t\t\t\tremainingFinalizationMs ?? requestedFinalizationMs,\n\t\t\t);\n\t\t\tconst summary = await runSingleAgent(\n\t\t\t\tdefaultCwd,\n\t\t\t\tagents,\n\t\t\t\tagentName,\n\t\t\t\tbuildTimeoutFinalizationPrompt({\n\t\t\t\t\ttask,\n\t\t\t\t\tpartialOutput: currentResult.partialOutput,\n\t\t\t\t\trecentActivity: currentResult.recentActivity,\n\t\t\t\t\tcheckpoint: currentResult.termination?.checkpoint,\n\t\t\t\t\tterminationReason: budgetStop.reason,\n\t\t\t\t\tresultFormat: launchPolicy?.timeoutResultFormat,\n\t\t\t\t}),\n\t\t\t\tcwd,\n\t\t\t\tstep,\n\t\t\t\tsignal,\n\t\t\t\tthinkingLevel,\n\t\t\t\tfinalizationMs,\n\t\t\t\tundefined,\n\t\t\t\tmakeDetails,\n\t\t\t\tinvocationOverride,\n\t\t\t\t{\n\t\t\t\t\t...launchPolicy,\n\t\t\t\t\ttools: [],\n\t\t\t\t\tdisableExtensions: true,\n\t\t\t\t\tdisableSkills: true,\n\t\t\t\t\tdisablePromptTemplates: true,\n\t\t\t\t\tdisableContextFiles: true,\n\t\t\t\t\tappendSystemPromptPaths: undefined,\n\t\t\t\t\tfinalizeOnTimeout: false,\n\t\t\t\t\tturnLimits: undefined,\n\t\t\t\t\tworkTimeoutReason: \"work_timeout\",\n\t\t\t\t\tworkTimeoutReportLimit: finalizationMs,\n\t\t\t\t\torchestrationDeadlineAt: undefined,\n\t\t\t\t},\n\t\t\t);\n\t\t\tmergeUsageStats(currentResult.usage, summary.usage);\n\t\t\tconst summaryOutput = getResultFinalOutput(summary).trim();\n\t\t\tif (summary.exitCode === 0 && summaryOutput) {\n\t\t\t\tcurrentResult.timeoutSummary = summaryOutput;\n\t\t\t\tcurrentResult.finalOutput = summaryOutput;\n\t\t\t\tif (currentResult.termination) {\n\t\t\t\t\tcurrentResult.termination.finalization = {\n\t\t\t\t\t\tattempted: true,\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tdurationMs: Date.now() - finalizationStartedAt,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcurrentResult.timeoutSummaryError =\n\t\t\t\t\tsummary.errorMessage || summary.stderr.trim() || \"Summary produced no final text\";\n\t\t\t\tif (currentResult.termination) {\n\t\t\t\t\tcurrentResult.termination.finalization = {\n\t\t\t\t\t\tattempted: true,\n\t\t\t\t\t\tstatus: summary.timedOut ? \"timed_out\" : \"failed\",\n\t\t\t\t\t\tdurationMs: Date.now() - finalizationStartedAt,\n\t\t\t\t\t\terror: currentResult.timeoutSummaryError,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrentResult.truncated ||= summary.truncated;\n\t\t}\n\t\tif (currentResult.termination && !currentResult.finalOutput.trim()) {\n\t\t\tcurrentResult.finalOutput = formatTimeoutCheckpoint(currentResult.termination.checkpoint);\n\t\t}\n\t\tif (currentResult.exitCode === 0 && launchPolicy?.resultFormat !== undefined) {\n\t\t\tcurrentResult.structuredResult = parseAnyStructuredSubagentResult(\n\t\t\t\tcurrentResult.finalOutput ?? \"\",\n\t\t\t\tlaunchPolicy.resultFormat,\n\t\t\t);\n\t\t\tcurrentResult.resultContractInvalid =\n\t\t\t\tlaunchPolicy.resultFormat !== \"text\" && currentResult.structuredResult === undefined;\n\t\t\tif (\n\t\t\t\tcurrentResult.structuredResult?.version === \"pi-subagents:result:v2\" &&\n\t\t\t\tlaunchPolicy.executionPlan\n\t\t\t) {\n\t\t\t\tcurrentResult.structuredResult.provenance = {\n\t\t\t\t\t...currentResult.structuredResult.provenance,\n\t\t\t\t\t...(launchPolicy.executionPlan.taskId\n\t\t\t\t\t\t? { taskId: launchPolicy.executionPlan.taskId }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\ttaskGeneration: launchPolicy.executionPlan.taskGeneration,\n\t\t\t\t\texecutionPlanId: launchPolicy.executionPlan.id,\n\t\t\t\t\tcancellationLineage: [...launchPolicy.executionPlan.cancellationLineage],\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (currentResult.structuredResult?.version === \"pi-subagents:result:v2\") {\n\t\t\t\tcurrentResult.outcome = classifyStructuredOutcome(\n\t\t\t\t\tcurrentResult.structuredResult.status,\n\t\t\t\t\tcurrentResult.structuredResult.reasonCode,\n\t\t\t\t);\n\t\t\t} else if (currentResult.resultContractInvalid) {\n\t\t\t\tcurrentResult.outcome = classifyStructuredOutcome(\n\t\t\t\t\t\"contract-invalid\",\n\t\t\t\t\t\"malformed-structured-result\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\tcurrentResult.exitCode === 0 &&\n\t\t\tcurrentResult.stopReason !== \"error\" &&\n\t\t\t(currentResult.stopReason === \"toolUse\" || !currentResult.finalOutput.trim())\n\t\t) {\n\t\t\tcurrentResult.exitCode = 1;\n\t\t\tcurrentResult.stopReason = \"error\";\n\t\t\tsetErrorMessage(\"Subagent completed without final text\");\n\t\t}\n\t\tif (currentResult.capabilityGrant?.state === \"active\") {\n\t\t\tcurrentResult.capabilityGrant = revokeCapabilityGrant(\n\t\t\t\tcurrentResult.capabilityGrant,\n\t\t\t\t\"turn-settled\",\n\t\t\t\tDate.now(),\n\t\t\t);\n\t\t}\n\t\tcurrentResult.policy = {\n\t\t\tinherited: [\"environment\"],\n\t\t\toverridden: [\n\t\t\t\t\"cwd\",\n\t\t\t\t...(agent.model ? [\"model\"] : []),\n\t\t\t\t...(thinkingLevel ? [\"thinkingLevel\"] : []),\n\t\t\t\t...(effectiveTools !== undefined ? [\"tools\"] : []),\n\t\t\t\t...(launchPolicy?.disableExtensions ? [\"extensions\"] : []),\n\t\t\t\t...(launchPolicy?.disableSkills ? [\"skills\"] : []),\n\t\t\t\t...(launchPolicy?.disablePromptTemplates ? [\"promptTemplates\"] : []),\n\t\t\t\t...(launchPolicy?.disableContextFiles ? [\"contextFiles\"] : []),\n\t\t\t],\n\t\t\tunsupported: [\"approvalPolicy\", \"sandboxProfile\", \"providerHeaders\"],\n\t\t};\n\t\treturn currentResult;\n\t} finally {\n\t\tfor (const temporary of temporaryPrompts.reverse()) {\n\t\t\ttry {\n\t\t\t\tfs.unlinkSync(temporary.filePath);\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tfs.rmdirSync(temporary.dir);\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\t}\n}\n", "import type { SubagentThinkingLevel } from \"./agents/types.js\";\n\nexport interface PiArgsOptions {\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttools?: string[];\n\tdisableExtensions?: boolean;\n\tdisableSkills?: boolean;\n\tdisablePromptTemplates?: boolean;\n\tdisableContextFiles?: boolean;\n\tprojectTrust?: boolean;\n\tbaseSystemPromptPath?: string;\n\tappendSystemPromptPaths?: string[];\n\textensionPaths?: string[];\n\t/** Existing single append prompt path retained for compatibility. */\n\tsystemPromptPath?: string;\n\ttask: string;\n}\n\nexport function buildPiArgs(options: PiArgsOptions): string[] {\n\tconst args: string[] = [\"--mode\", \"json\", \"-p\", \"--no-session\"];\n\tif (options.model) args.push(\"--model\", options.model);\n\tif (options.thinkingLevel) args.push(\"--thinking\", options.thinkingLevel);\n\tif (options.disableExtensions) args.push(\"--no-extensions\");\n\tfor (const extensionPath of options.extensionPaths ?? []) args.push(\"-e\", extensionPath);\n\tif (options.disableSkills) args.push(\"--no-skills\");\n\tif (options.disablePromptTemplates) args.push(\"--no-prompt-templates\");\n\tif (options.disableContextFiles) args.push(\"--no-context-files\");\n\tif (options.projectTrust !== undefined) {\n\t\targs.push(options.projectTrust ? \"--approve\" : \"--no-approve\");\n\t}\n\tif (Array.isArray(options.tools)) {\n\t\tif (options.tools.length > 0) args.push(\"--tools\", options.tools.join(\",\"));\n\t\telse args.push(\"--no-tools\");\n\t}\n\tif (options.baseSystemPromptPath) args.push(\"--system-prompt\", options.baseSystemPromptPath);\n\tfor (const promptPath of options.appendSystemPromptPaths ?? []) {\n\t\targs.push(\"--append-system-prompt\", promptPath);\n\t}\n\tif (options.systemPromptPath) args.push(\"--append-system-prompt\", options.systemPromptPath);\n\targs.push(`Task: ${options.task}`);\n\treturn args;\n}\n", "export interface UsageStats {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tcostInput?: number;\n\tcostOutput?: number;\n\tcostCacheRead?: number;\n\tcostCacheWrite?: number;\n\ttotalTokens?: number;\n\tcontextTokens: number;\n\tturns: number;\n}\n\nconst MAX_USAGE_VALUE = Number.MAX_SAFE_INTEGER;\n\nexport function protocolUsageCount(value: unknown): number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : 0;\n}\n\nexport function protocolUsageCost(value: unknown): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0\n\t\t? Math.min(value, MAX_USAGE_VALUE)\n\t\t: 0;\n}\n\nexport function addUsageValue(current: number, addition: number): number {\n\treturn Math.min(MAX_USAGE_VALUE, current + addition);\n}\n\nexport function mergeUsageStats(target: UsageStats, addition: UsageStats): void {\n\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"cost\", \"turns\"] as const) {\n\t\ttarget[key] = addUsageValue(target[key], addition[key]);\n\t}\n\tfor (const key of [\n\t\t\"costInput\",\n\t\t\"costOutput\",\n\t\t\"costCacheRead\",\n\t\t\"costCacheWrite\",\n\t\t\"totalTokens\",\n\t] as const) {\n\t\tif (addition[key] !== undefined) {\n\t\t\ttarget[key] = addUsageValue(target[key] ?? 0, addition[key]);\n\t\t}\n\t}\n\ttarget.contextTokens = addition.contextTokens || target.contextTokens;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["exitCode"]
7
+ }
@@ -119,6 +119,7 @@ function renderStatus(state) {
119
119
  return "interrupted";
120
120
  case "closed":
121
121
  return "closed";
122
+ case "partial":
122
123
  case "blocked":
123
124
  case "needs-input":
124
125
  case "abstained":
@@ -168,4 +169,4 @@ export {
168
169
  SUBAGENT_COMPLETION_MESSAGE_TYPE,
169
170
  renderCompletionMessage
170
171
  };
171
- //# sourceMappingURL=chunk-QDVGH2X7.ts.map
172
+ //# sourceMappingURL=chunk-IWC32VPY.ts.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/completion-render.ts"],
4
- "sourcesContent": ["import type { MessageRenderer, Theme } from \"@earendil-works/pi-coding-agent\";\nimport { Box, type Component, Spacer, sliceByColumn, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { MAX_TOOL_MESSAGE_BYTES } from \"./limits.js\";\nimport {\n\tCOLLAPSED_LIST_LIMIT,\n\texpansionHint,\n\ttype RenderStatus,\n\trecordList,\n\trecordValue,\n\tsafeBlock,\n\tsafeLine,\n\tstatusBadge,\n} from \"./render-common.js\";\n\nexport const SUBAGENT_COMPLETION_MESSAGE_TYPE = \"pi-subagent-completion\";\n\nexport const renderCompletionMessage: MessageRenderer = (message, options, theme) => {\n\tconst box = new Box(options.outputPad, 1, (text) => theme.bg(\"customMessageBg\", text));\n\tif (options.expanded) {\n\t\tbox.addChild(\n\t\t\tnew ExactText(\n\t\t\t\ttheme.fg(\"customMessageLabel\", theme.bold(`[${SUBAGENT_COMPLETION_MESSAGE_TYPE}]`)),\n\t\t\t),\n\t\t);\n\t\tbox.addChild(new Spacer(1));\n\t\tbox.addChild(\n\t\t\tnew ExactText(\n\t\t\t\tsafeBlock(messageText(message.content), \"(no completion content)\", MAX_TOOL_MESSAGE_BYTES),\n\t\t\t\t(text) => theme.fg(\"customMessageText\", text),\n\t\t\t),\n\t\t);\n\t\treturn box;\n\t}\n\n\tbox.addChild(new ExactText(collapsedCompletion(message.content, message.details, theme)));\n\treturn box;\n};\n\nfunction collapsedCompletion(contentValue: unknown, detailsValue: unknown, theme: Theme): string {\n\tconst content = safeBlock(messageText(contentValue), \"\", MAX_TOOL_MESSAGE_BYTES);\n\tconst details = recordValue(detailsValue) ?? {};\n\tconst completions = recordList(details.completions);\n\tif (completions.length > 0 || details.completionCount !== undefined) {\n\t\treturn collapsedBatch(details, completions, theme);\n\t}\n\treturn collapsedSingle(content, details, theme);\n}\n\nfunction collapsedSingle(content: string, details: Record<string, unknown>, theme: Theme): string {\n\tconst agent = optionalLine(details.agent) || extractedField(content, \"Agent\") || \"subagent\";\n\tconst state = optionalLine(details.state) || extractedField(content, \"State\") || \"completed\";\n\tconst task = optionalLine(details.task) || extractedField(content, \"Task\");\n\tconst payload = payloadPreview(content);\n\tconst lines = [\n\t\t`${statusBadge(theme, renderStatus(state))}${theme.fg(\"muted\", \" \u00B7 \")}${theme.fg(\"customMessageLabel\", theme.bold(agent))}`,\n\t];\n\tif (task) lines.push(`${theme.fg(\"muted\", \"Task: \")}${theme.fg(\"customMessageText\", task)}`);\n\tif (payload) {\n\t\tlines.push(`${theme.fg(\"muted\", \"Payload: \")}${theme.fg(\"customMessageText\", payload)}`);\n\t}\n\tlines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction collapsedBatch(\n\tdetails: Record<string, unknown>,\n\tcompletions: Record<string, unknown>[],\n\ttheme: Theme,\n): string {\n\tconst declaredCount =\n\t\ttypeof details.completionCount === \"number\" && Number.isFinite(details.completionCount)\n\t\t\t? Math.max(0, Math.floor(details.completionCount))\n\t\t\t: completions.length;\n\tconst count = Math.max(declaredCount, completions.length);\n\tconst statuses = completions.map((completion) => renderStatus(optionalLine(completion.state)));\n\tconst icon = statuses.includes(\"failed\")\n\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t: statuses.some((status) => status !== \"completed\" && status !== \"closed\")\n\t\t\t? theme.fg(\"warning\", \"\u25D0\")\n\t\t\t: theme.fg(\"success\", \"\u2713\");\n\tconst lines = [\n\t\t`${icon} ${theme.fg(\"customMessageLabel\", theme.bold(`${count} subagent completions`))}`,\n\t];\n\tfor (const completion of completions.slice(0, COLLAPSED_LIST_LIMIT)) {\n\t\tconst agent = optionalLine(completion.agent) || \"subagent\";\n\t\tconst state = optionalLine(completion.state) || \"completed\";\n\t\tconst task = optionalLine(completion.task);\n\t\tlines.push(\n\t\t\t`${theme.fg(\"muted\", \"\u2022 \")}${theme.fg(\"accent\", agent)} \u00B7 ${statusBadge(theme, renderStatus(state))}${task ? theme.fg(\"dim\", ` \u2014 ${task}`) : \"\"}`,\n\t\t);\n\t}\n\tconst visibleCount = Math.min(completions.length, COLLAPSED_LIST_LIMIT);\n\tif (count > visibleCount) {\n\t\tlines.push(theme.fg(\"muted\", `\u2026 ${count - visibleCount} more`));\n\t}\n\tlines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction messageText(value: unknown): string {\n\tif (typeof value === \"string\") return value;\n\tif (!Array.isArray(value)) return \"\";\n\treturn value\n\t\t.flatMap((part) => {\n\t\t\tconst record = recordValue(part);\n\t\t\treturn record?.type === \"text\" && typeof record.text === \"string\" ? [record.text] : [];\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction extractedField(content: string, label: string): string {\n\tconst prefix = `${label}:`;\n\tconst line = content.split(\"\\n\").find((candidate) => candidate.startsWith(prefix));\n\treturn line ? safeLine(line.slice(prefix.length), \"\", 512) : \"\";\n}\n\nfunction payloadPreview(content: string): string {\n\tconst marker = \"\\nPayload:\\n\";\n\tconst start = content.indexOf(marker);\n\tif (start < 0) return \"\";\n\tfor (const line of content.slice(start + marker.length).split(\"\\n\")) {\n\t\tconst preview = safeLine(line, \"\", 1024);\n\t\tif (preview) return preview;\n\t}\n\treturn \"\";\n}\n\nfunction optionalLine(value: unknown): string {\n\treturn typeof value === \"string\" ? safeLine(value, \"\", 512) : \"\";\n}\n\nfunction renderStatus(state: string): RenderStatus {\n\tswitch (state) {\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tcase \"cancelled\":\n\t\t\treturn \"cancelled\";\n\t\tcase \"interrupted\":\n\t\t\treturn \"interrupted\";\n\t\tcase \"closed\":\n\t\t\treturn \"closed\";\n\t\tcase \"blocked\":\n\t\tcase \"needs-input\":\n\t\tcase \"abstained\":\n\t\tcase \"stale\":\n\t\t\treturn \"warning\";\n\t\tdefault:\n\t\t\treturn \"completed\";\n\t}\n}\n\nclass ExactText implements Component {\n\tconstructor(\n\t\tprivate readonly value: string,\n\t\tprivate readonly style: (text: string) => string = (text) => text,\n\t) {}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\treturn this.value\n\t\t\t.split(\"\\n\")\n\t\t\t.flatMap((line) => hardWrapExact(line, safeWidth))\n\t\t\t.map(this.style);\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction hardWrapExact(value: string, width: number): string[] {\n\tif (value.length === 0) return [\"\"];\n\tconst columns = visibleWidth(value);\n\tif (columns === 0) return [value];\n\tconst lines: string[] = [];\n\tlet column = 0;\n\twhile (column < columns) {\n\t\tconst chunk = sliceByColumn(value, column, width, true);\n\t\tconst chunkWidth = visibleWidth(chunk);\n\t\tif (chunkWidth > 0) {\n\t\t\tlines.push(chunk);\n\t\t\tcolumn += chunkWidth;\n\t\t\tcontinue;\n\t\t}\n\t\tconst oversized = sliceByColumn(value, column, width, false);\n\t\tconst oversizedWidth = visibleWidth(oversized);\n\t\tlines.push(\"?\".repeat(width));\n\t\tcolumn += Math.max(1, oversizedWidth);\n\t}\n\treturn lines;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { MessageRenderer, Theme } from \"@earendil-works/pi-coding-agent\";\nimport { Box, type Component, Spacer, sliceByColumn, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { MAX_TOOL_MESSAGE_BYTES } from \"./limits.js\";\nimport {\n\tCOLLAPSED_LIST_LIMIT,\n\texpansionHint,\n\ttype RenderStatus,\n\trecordList,\n\trecordValue,\n\tsafeBlock,\n\tsafeLine,\n\tstatusBadge,\n} from \"./render-common.js\";\n\nexport const SUBAGENT_COMPLETION_MESSAGE_TYPE = \"pi-subagent-completion\";\n\nexport const renderCompletionMessage: MessageRenderer = (message, options, theme) => {\n\tconst box = new Box(options.outputPad, 1, (text) => theme.bg(\"customMessageBg\", text));\n\tif (options.expanded) {\n\t\tbox.addChild(\n\t\t\tnew ExactText(\n\t\t\t\ttheme.fg(\"customMessageLabel\", theme.bold(`[${SUBAGENT_COMPLETION_MESSAGE_TYPE}]`)),\n\t\t\t),\n\t\t);\n\t\tbox.addChild(new Spacer(1));\n\t\tbox.addChild(\n\t\t\tnew ExactText(\n\t\t\t\tsafeBlock(messageText(message.content), \"(no completion content)\", MAX_TOOL_MESSAGE_BYTES),\n\t\t\t\t(text) => theme.fg(\"customMessageText\", text),\n\t\t\t),\n\t\t);\n\t\treturn box;\n\t}\n\n\tbox.addChild(new ExactText(collapsedCompletion(message.content, message.details, theme)));\n\treturn box;\n};\n\nfunction collapsedCompletion(contentValue: unknown, detailsValue: unknown, theme: Theme): string {\n\tconst content = safeBlock(messageText(contentValue), \"\", MAX_TOOL_MESSAGE_BYTES);\n\tconst details = recordValue(detailsValue) ?? {};\n\tconst completions = recordList(details.completions);\n\tif (completions.length > 0 || details.completionCount !== undefined) {\n\t\treturn collapsedBatch(details, completions, theme);\n\t}\n\treturn collapsedSingle(content, details, theme);\n}\n\nfunction collapsedSingle(content: string, details: Record<string, unknown>, theme: Theme): string {\n\tconst agent = optionalLine(details.agent) || extractedField(content, \"Agent\") || \"subagent\";\n\tconst state = optionalLine(details.state) || extractedField(content, \"State\") || \"completed\";\n\tconst task = optionalLine(details.task) || extractedField(content, \"Task\");\n\tconst payload = payloadPreview(content);\n\tconst lines = [\n\t\t`${statusBadge(theme, renderStatus(state))}${theme.fg(\"muted\", \" \u00B7 \")}${theme.fg(\"customMessageLabel\", theme.bold(agent))}`,\n\t];\n\tif (task) lines.push(`${theme.fg(\"muted\", \"Task: \")}${theme.fg(\"customMessageText\", task)}`);\n\tif (payload) {\n\t\tlines.push(`${theme.fg(\"muted\", \"Payload: \")}${theme.fg(\"customMessageText\", payload)}`);\n\t}\n\tlines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction collapsedBatch(\n\tdetails: Record<string, unknown>,\n\tcompletions: Record<string, unknown>[],\n\ttheme: Theme,\n): string {\n\tconst declaredCount =\n\t\ttypeof details.completionCount === \"number\" && Number.isFinite(details.completionCount)\n\t\t\t? Math.max(0, Math.floor(details.completionCount))\n\t\t\t: completions.length;\n\tconst count = Math.max(declaredCount, completions.length);\n\tconst statuses = completions.map((completion) => renderStatus(optionalLine(completion.state)));\n\tconst icon = statuses.includes(\"failed\")\n\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t: statuses.some((status) => status !== \"completed\" && status !== \"closed\")\n\t\t\t? theme.fg(\"warning\", \"\u25D0\")\n\t\t\t: theme.fg(\"success\", \"\u2713\");\n\tconst lines = [\n\t\t`${icon} ${theme.fg(\"customMessageLabel\", theme.bold(`${count} subagent completions`))}`,\n\t];\n\tfor (const completion of completions.slice(0, COLLAPSED_LIST_LIMIT)) {\n\t\tconst agent = optionalLine(completion.agent) || \"subagent\";\n\t\tconst state = optionalLine(completion.state) || \"completed\";\n\t\tconst task = optionalLine(completion.task);\n\t\tlines.push(\n\t\t\t`${theme.fg(\"muted\", \"\u2022 \")}${theme.fg(\"accent\", agent)} \u00B7 ${statusBadge(theme, renderStatus(state))}${task ? theme.fg(\"dim\", ` \u2014 ${task}`) : \"\"}`,\n\t\t);\n\t}\n\tconst visibleCount = Math.min(completions.length, COLLAPSED_LIST_LIMIT);\n\tif (count > visibleCount) {\n\t\tlines.push(theme.fg(\"muted\", `\u2026 ${count - visibleCount} more`));\n\t}\n\tlines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction messageText(value: unknown): string {\n\tif (typeof value === \"string\") return value;\n\tif (!Array.isArray(value)) return \"\";\n\treturn value\n\t\t.flatMap((part) => {\n\t\t\tconst record = recordValue(part);\n\t\t\treturn record?.type === \"text\" && typeof record.text === \"string\" ? [record.text] : [];\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction extractedField(content: string, label: string): string {\n\tconst prefix = `${label}:`;\n\tconst line = content.split(\"\\n\").find((candidate) => candidate.startsWith(prefix));\n\treturn line ? safeLine(line.slice(prefix.length), \"\", 512) : \"\";\n}\n\nfunction payloadPreview(content: string): string {\n\tconst marker = \"\\nPayload:\\n\";\n\tconst start = content.indexOf(marker);\n\tif (start < 0) return \"\";\n\tfor (const line of content.slice(start + marker.length).split(\"\\n\")) {\n\t\tconst preview = safeLine(line, \"\", 1024);\n\t\tif (preview) return preview;\n\t}\n\treturn \"\";\n}\n\nfunction optionalLine(value: unknown): string {\n\treturn typeof value === \"string\" ? safeLine(value, \"\", 512) : \"\";\n}\n\nfunction renderStatus(state: string): RenderStatus {\n\tswitch (state) {\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tcase \"cancelled\":\n\t\t\treturn \"cancelled\";\n\t\tcase \"interrupted\":\n\t\t\treturn \"interrupted\";\n\t\tcase \"closed\":\n\t\t\treturn \"closed\";\n\t\tcase \"partial\":\n\t\tcase \"blocked\":\n\t\tcase \"needs-input\":\n\t\tcase \"abstained\":\n\t\tcase \"stale\":\n\t\t\treturn \"warning\";\n\t\tdefault:\n\t\t\treturn \"completed\";\n\t}\n}\n\nclass ExactText implements Component {\n\tconstructor(\n\t\tprivate readonly value: string,\n\t\tprivate readonly style: (text: string) => string = (text) => text,\n\t) {}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\treturn this.value\n\t\t\t.split(\"\\n\")\n\t\t\t.flatMap((line) => hardWrapExact(line, safeWidth))\n\t\t\t.map(this.style);\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction hardWrapExact(value: string, width: number): string[] {\n\tif (value.length === 0) return [\"\"];\n\tconst columns = visibleWidth(value);\n\tif (columns === 0) return [value];\n\tconst lines: string[] = [];\n\tlet column = 0;\n\twhile (column < columns) {\n\t\tconst chunk = sliceByColumn(value, column, width, true);\n\t\tconst chunkWidth = visibleWidth(chunk);\n\t\tif (chunkWidth > 0) {\n\t\t\tlines.push(chunk);\n\t\t\tcolumn += chunkWidth;\n\t\t\tcontinue;\n\t\t}\n\t\tconst oversized = sliceByColumn(value, column, width, false);\n\t\tconst oversizedWidth = visibleWidth(oversized);\n\t\tlines.push(\"?\".repeat(width));\n\t\tcolumn += Math.max(1, oversizedWidth);\n\t}\n\treturn lines;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -43,14 +43,45 @@ var DelegationContractSchema = Type.Object(
43
43
  requestedAuthority: Type.Optional(
44
44
  Type.Object(
45
45
  {
46
- capabilities: Type.Optional(BoundedItems),
47
- tools: Type.Optional(BoundedItems),
48
- readPaths: Type.Optional(BoundedItems),
49
- writePaths: Type.Optional(BoundedItems),
50
- network: Type.Optional(StringEnum(AUTHORITY_REQUIREMENTS)),
51
- secrets: Type.Optional(StringEnum(AUTHORITY_REQUIREMENTS))
46
+ capabilities: Type.Optional(
47
+ Type.Array(BoundedItem, {
48
+ maxItems: MAX_ITEMS,
49
+ description: "Capabilities requested from the selected agent manifest."
50
+ })
51
+ ),
52
+ tools: Type.Optional(
53
+ Type.Array(BoundedItem, {
54
+ maxItems: MAX_ITEMS,
55
+ description: "Tools that enforcement may narrow to the selected agent's available set."
56
+ })
57
+ ),
58
+ readPaths: Type.Optional(
59
+ Type.Array(BoundedItem, {
60
+ maxItems: MAX_ITEMS,
61
+ description: 'Audit metadata only; enforcement "enforce" rejects non-empty readPaths because path scope is unsupported.'
62
+ })
63
+ ),
64
+ writePaths: Type.Optional(
65
+ Type.Array(BoundedItem, {
66
+ maxItems: MAX_ITEMS,
67
+ description: 'Audit metadata only; enforcement "enforce" rejects non-empty writePaths because path scope is unsupported.'
68
+ })
69
+ ),
70
+ network: Type.Optional(
71
+ StringEnum(AUTHORITY_REQUIREMENTS, {
72
+ description: 'Audit metadata only; enforcement "enforce" rejects denied or required network guarantees as unsupported.'
73
+ })
74
+ ),
75
+ secrets: Type.Optional(
76
+ StringEnum(AUTHORITY_REQUIREMENTS, {
77
+ description: 'Audit metadata only; enforcement "enforce" rejects denied or required secret guarantees as unsupported.'
78
+ })
79
+ )
52
80
  },
53
- { additionalProperties: false }
81
+ {
82
+ additionalProperties: false,
83
+ description: "Only capabilities and tools have executor enforcement; readPaths, writePaths, network, and secrets are unsupported guarantees."
84
+ }
54
85
  )
55
86
  ),
56
87
  acceptanceCriteria: Type.Optional(BoundedItems),
@@ -80,9 +111,16 @@ var DelegationContractSchema = Type.Object(
80
111
  )
81
112
  ),
82
113
  sideEffectPolicy: Type.Optional(StringEnum(DELEGATION_SIDE_EFFECT_POLICIES)),
83
- enforcement: Type.Optional(StringEnum(DELEGATION_ENFORCEMENT_MODES))
114
+ enforcement: Type.Optional(
115
+ StringEnum(DELEGATION_ENFORCEMENT_MODES, {
116
+ description: "Defaults to audit; enforce rejects unsupported requestedAuthority guarantees before child launch."
117
+ })
118
+ )
84
119
  },
85
- { additionalProperties: false }
120
+ {
121
+ additionalProperties: false,
122
+ description: "Advanced delegation contract. For ordinary delegation omit this object; use it only for explicit acceptance, authority, evidence, or admission semantics."
123
+ }
86
124
  );
87
125
  function normalizeDelegationContract(value) {
88
126
  if (!isPlainObject(value)) return void 0;
@@ -321,4 +359,4 @@ export {
321
359
  normalizeDelegationContract,
322
360
  appendDelegationContract
323
361
  };
324
- //# sourceMappingURL=chunk-I2FAK44T.ts.map
362
+ //# sourceMappingURL=chunk-JSZIP73U.ts.map