@narumitw/pi-subagents 2.0.1 → 2.0.3

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 (148) hide show
  1. package/README.md +20 -7
  2. package/dist/chunks/auto-transport-SY2VHUFH.ts +109 -0
  3. package/dist/chunks/auto-transport-SY2VHUFH.ts.map +7 -0
  4. package/dist/chunks/capability-grant-CGEWOEKE.ts +19 -0
  5. package/dist/chunks/capability-grant-CGEWOEKE.ts.map +7 -0
  6. package/dist/chunks/chunk-434NII74.ts +282 -0
  7. package/dist/chunks/chunk-434NII74.ts.map +7 -0
  8. package/dist/chunks/chunk-47SK2QYC.ts +56 -0
  9. package/dist/chunks/chunk-47SK2QYC.ts.map +7 -0
  10. package/dist/chunks/chunk-6KJ34M6S.ts +159 -0
  11. package/dist/chunks/chunk-6KJ34M6S.ts.map +7 -0
  12. package/dist/chunks/chunk-7OBINKFM.ts +80 -0
  13. package/dist/chunks/chunk-7OBINKFM.ts.map +7 -0
  14. package/dist/chunks/chunk-7QPPBBXZ.ts +335 -0
  15. package/dist/chunks/chunk-7QPPBBXZ.ts.map +7 -0
  16. package/dist/chunks/chunk-AEUYS7JC.ts +73 -0
  17. package/dist/chunks/chunk-AEUYS7JC.ts.map +7 -0
  18. package/dist/chunks/chunk-BFK2Z4ZF.ts +189 -0
  19. package/dist/chunks/chunk-BFK2Z4ZF.ts.map +7 -0
  20. package/dist/chunks/chunk-BOAXY55Y.ts +153 -0
  21. package/dist/chunks/chunk-BOAXY55Y.ts.map +7 -0
  22. package/dist/chunks/chunk-C4L6P266.ts +22 -0
  23. package/dist/chunks/chunk-C4L6P266.ts.map +7 -0
  24. package/dist/chunks/chunk-DPPVEQAM.ts +29 -0
  25. package/dist/chunks/chunk-DPPVEQAM.ts.map +7 -0
  26. package/dist/chunks/chunk-DQMN4OYM.ts +913 -0
  27. package/dist/chunks/chunk-DQMN4OYM.ts.map +7 -0
  28. package/dist/chunks/chunk-DSOOH73Y.ts +238 -0
  29. package/dist/chunks/chunk-DSOOH73Y.ts.map +7 -0
  30. package/dist/chunks/chunk-EFBPISNT.ts +421 -0
  31. package/dist/chunks/chunk-EFBPISNT.ts.map +7 -0
  32. package/dist/chunks/chunk-EWWXFU7N.ts +150 -0
  33. package/dist/chunks/chunk-EWWXFU7N.ts.map +7 -0
  34. package/dist/chunks/chunk-F4L2UVSK.ts +380 -0
  35. package/dist/chunks/chunk-F4L2UVSK.ts.map +7 -0
  36. package/dist/chunks/chunk-F5YWVHQX.ts +1543 -0
  37. package/dist/chunks/chunk-F5YWVHQX.ts.map +7 -0
  38. package/dist/chunks/chunk-G3RSMSXJ.ts +63 -0
  39. package/dist/chunks/chunk-G3RSMSXJ.ts.map +7 -0
  40. package/dist/chunks/chunk-G6VZTCFH.ts +70 -0
  41. package/dist/chunks/chunk-G6VZTCFH.ts.map +7 -0
  42. package/dist/chunks/chunk-H3FP6DLR.ts +160 -0
  43. package/dist/chunks/chunk-H3FP6DLR.ts.map +7 -0
  44. package/dist/chunks/chunk-HA36LPCO.ts +130 -0
  45. package/dist/chunks/chunk-HA36LPCO.ts.map +7 -0
  46. package/dist/chunks/chunk-HKC4ES4B.ts +65 -0
  47. package/dist/chunks/chunk-HKC4ES4B.ts.map +7 -0
  48. package/dist/chunks/chunk-HOP5FXDT.ts +27 -0
  49. package/dist/chunks/chunk-HOP5FXDT.ts.map +7 -0
  50. package/dist/chunks/chunk-I2FAK44T.ts +324 -0
  51. package/dist/chunks/chunk-I2FAK44T.ts.map +7 -0
  52. package/dist/chunks/chunk-IGAMVWFN.ts +139 -0
  53. package/dist/chunks/chunk-IGAMVWFN.ts.map +7 -0
  54. package/dist/chunks/chunk-KMGKCEO4.ts +38 -0
  55. package/dist/chunks/chunk-KMGKCEO4.ts.map +7 -0
  56. package/dist/chunks/chunk-N7BLVXKK.ts +73 -0
  57. package/dist/chunks/chunk-N7BLVXKK.ts.map +7 -0
  58. package/dist/chunks/chunk-NIF42QMF.ts +297 -0
  59. package/dist/chunks/chunk-NIF42QMF.ts.map +7 -0
  60. package/dist/chunks/chunk-O4VO6JUJ.ts +52 -0
  61. package/dist/chunks/chunk-O4VO6JUJ.ts.map +7 -0
  62. package/dist/chunks/chunk-ONDTY4EL.ts +91 -0
  63. package/dist/chunks/chunk-ONDTY4EL.ts.map +7 -0
  64. package/dist/chunks/chunk-OVPHFGKO.ts +1769 -0
  65. package/dist/chunks/chunk-OVPHFGKO.ts.map +7 -0
  66. package/dist/chunks/chunk-P7OH4XMF.ts +60 -0
  67. package/dist/chunks/chunk-P7OH4XMF.ts.map +7 -0
  68. package/dist/chunks/chunk-PSK43Y6A.ts +339 -0
  69. package/dist/chunks/chunk-PSK43Y6A.ts.map +7 -0
  70. package/dist/chunks/chunk-QBORTI4W.ts +468 -0
  71. package/dist/chunks/chunk-QBORTI4W.ts.map +7 -0
  72. package/dist/chunks/chunk-QDVGH2X7.ts +171 -0
  73. package/dist/chunks/chunk-QDVGH2X7.ts.map +7 -0
  74. package/dist/chunks/chunk-RHRQMT7Q.ts +490 -0
  75. package/dist/chunks/chunk-RHRQMT7Q.ts.map +7 -0
  76. package/dist/chunks/chunk-RRR66UWR.ts +28 -0
  77. package/dist/chunks/chunk-RRR66UWR.ts.map +7 -0
  78. package/dist/chunks/chunk-RSUXZD6S.ts +275 -0
  79. package/dist/chunks/chunk-RSUXZD6S.ts.map +7 -0
  80. package/dist/chunks/chunk-RTCVYIZA.ts +221 -0
  81. package/dist/chunks/chunk-RTCVYIZA.ts.map +7 -0
  82. package/dist/chunks/chunk-S2IWVK3J.ts +44 -0
  83. package/dist/chunks/chunk-S2IWVK3J.ts.map +7 -0
  84. package/dist/chunks/chunk-SCZ33MYW.ts +52 -0
  85. package/dist/chunks/chunk-SCZ33MYW.ts.map +7 -0
  86. package/dist/chunks/chunk-SWGQLFSD.ts +60 -0
  87. package/dist/chunks/chunk-SWGQLFSD.ts.map +7 -0
  88. package/dist/chunks/chunk-UMBPMVJW.ts +22 -0
  89. package/dist/chunks/chunk-UMBPMVJW.ts.map +7 -0
  90. package/dist/chunks/chunk-UVFVHIOP.ts +735 -0
  91. package/dist/chunks/chunk-UVFVHIOP.ts.map +7 -0
  92. package/dist/chunks/completion-delivery-YPOWSSV3.ts +16 -0
  93. package/dist/chunks/completion-delivery-YPOWSSV3.ts.map +7 -0
  94. package/dist/chunks/config-status-J4GPWP46.ts +34 -0
  95. package/dist/chunks/config-status-J4GPWP46.ts.map +7 -0
  96. package/dist/chunks/config-ui-3IBMHTQB.ts +1146 -0
  97. package/dist/chunks/config-ui-3IBMHTQB.ts.map +7 -0
  98. package/dist/chunks/consult-NYXVDN5G.ts +518 -0
  99. package/dist/chunks/consult-NYXVDN5G.ts.map +7 -0
  100. package/dist/chunks/context-QDKLVQXE.ts +11 -0
  101. package/dist/chunks/context-QDKLVQXE.ts.map +7 -0
  102. package/dist/chunks/create-stateful-transport-4WKZHRSI.ts +130 -0
  103. package/dist/chunks/create-stateful-transport-4WKZHRSI.ts.map +7 -0
  104. package/dist/chunks/cwd-policy-NB6XZ5GF.ts +17 -0
  105. package/dist/chunks/cwd-policy-NB6XZ5GF.ts.map +7 -0
  106. package/dist/chunks/delegation-contract-WJPT4FVS.ts +24 -0
  107. package/dist/chunks/delegation-contract-WJPT4FVS.ts.map +7 -0
  108. package/dist/chunks/discovery-K25T3SH4.ts +12 -0
  109. package/dist/chunks/discovery-K25T3SH4.ts.map +7 -0
  110. package/dist/chunks/execution-DS2DEIQZ.ts +4034 -0
  111. package/dist/chunks/execution-DS2DEIQZ.ts.map +7 -0
  112. package/dist/chunks/in-process-transport-TEYAWSEC.ts +38 -0
  113. package/dist/chunks/in-process-transport-TEYAWSEC.ts.map +7 -0
  114. package/dist/chunks/inspect-UOQQ3KNL.ts +619 -0
  115. package/dist/chunks/inspect-UOQQ3KNL.ts.map +7 -0
  116. package/dist/chunks/peer-communication-KL36Z6CO.ts +294 -0
  117. package/dist/chunks/peer-communication-KL36Z6CO.ts.map +7 -0
  118. package/dist/chunks/persistence-VSGXAW4P.ts +344 -0
  119. package/dist/chunks/persistence-VSGXAW4P.ts.map +7 -0
  120. package/dist/chunks/registry-E6XPJB7L.ts +1324 -0
  121. package/dist/chunks/registry-E6XPJB7L.ts.map +7 -0
  122. package/dist/chunks/retained-semantic-state-7WXSGRJU.ts +81 -0
  123. package/dist/chunks/retained-semantic-state-7WXSGRJU.ts.map +7 -0
  124. package/dist/chunks/rpc-transport-Y6LA5BOP.ts +1154 -0
  125. package/dist/chunks/rpc-transport-Y6LA5BOP.ts.map +7 -0
  126. package/dist/chunks/runtime-policy-5YELCOVC.ts +15 -0
  127. package/dist/chunks/runtime-policy-5YELCOVC.ts.map +7 -0
  128. package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts +19 -0
  129. package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts.map +7 -0
  130. package/dist/chunks/spawn-idempotency-QGHO2WKC.ts +13 -0
  131. package/dist/chunks/spawn-idempotency-QGHO2WKC.ts.map +7 -0
  132. package/dist/chunks/stateful-lifecycle-JAR6K55H.ts +15 -0
  133. package/dist/chunks/stateful-lifecycle-JAR6K55H.ts.map +7 -0
  134. package/dist/chunks/subprocess-transport-C2XVR25R.ts +158 -0
  135. package/dist/chunks/subprocess-transport-C2XVR25R.ts.map +7 -0
  136. package/dist/chunks/workspace-WDKLN72J.ts +11 -0
  137. package/dist/chunks/workspace-WDKLN72J.ts.map +7 -0
  138. package/dist/index.ts +1057 -0
  139. package/dist/index.ts.map +7 -0
  140. package/package.json +9 -5
  141. package/src/index.ts +1 -1
  142. package/src/settings-reader.ts +208 -0
  143. package/src/settings.ts +22 -187
  144. package/src/stateful-registration.ts +1230 -0
  145. package/src/stateful-safety.ts +1 -1
  146. package/src/stateful.ts +2 -1234
  147. package/src/subagents-extension.ts +307 -0
  148. package/src/subagents.ts +1 -308
@@ -0,0 +1,73 @@
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
+ import {
4
+ formatTimeoutCheckpoint
5
+ } from "./chunk-RTCVYIZA.ts";
6
+ import {
7
+ DEFAULT_MAX_CONTEXT_BYTES,
8
+ truncateUtf8
9
+ } from "./chunk-H3FP6DLR.ts";
10
+
11
+ // src/runner-result.ts
12
+ function getFinalOutput(messages) {
13
+ for (let i = messages.length - 1; i >= 0; i--) {
14
+ const msg = messages[i];
15
+ if (msg?.role === "assistant") {
16
+ const text = msg.content.filter((part) => part.type === "text").map((part) => part.text).join("\n");
17
+ if (text) return text;
18
+ }
19
+ }
20
+ return "";
21
+ }
22
+ function getResultFinalOutput(result) {
23
+ return result.finalOutput ?? getFinalOutput(result.messages);
24
+ }
25
+ function isResultError(result) {
26
+ return result.exitCode !== 0 && result.exitCode !== -1 || result.timedOut === true || result.stopReason === "timeout" || result.stopReason === "error" || result.stopReason === "aborted";
27
+ }
28
+ function formatResultFailure(result) {
29
+ const error = result.errorMessage || result.stderr.trim();
30
+ const output = getResultFinalOutput(result);
31
+ const sections = [error];
32
+ if (result.timeoutSummary) sections.push(`Timed-out work summary:
33
+ ${result.timeoutSummary}`);
34
+ else if (output) sections.push(`Partial output:
35
+ ${output}`);
36
+ if (result.partialOutput && result.partialOutput !== output) {
37
+ sections.push(`Partial output before finalization:
38
+ ${result.partialOutput}`);
39
+ }
40
+ if (result.termination && !result.timeoutSummary) {
41
+ sections.push(
42
+ `Termination checkpoint:
43
+ ${formatTimeoutCheckpoint(result.termination.checkpoint)}`
44
+ );
45
+ }
46
+ if (result.timeoutSummaryError) {
47
+ sections.push(`Summary finalization failed: ${result.timeoutSummaryError}`);
48
+ }
49
+ return truncateUtf8(
50
+ sections.filter(Boolean).join("\n\n") || "(no output)",
51
+ DEFAULT_MAX_CONTEXT_BYTES
52
+ ).text;
53
+ }
54
+
55
+ // src/runner-outcome.ts
56
+ function getResultFinalOutput2(result) {
57
+ return getResultFinalOutput(result);
58
+ }
59
+ function isResultError2(result) {
60
+ return isResultError(result) || result.resultContractInvalid === true || result.outcome !== void 0 && result.outcome.status !== "completed" && result.outcome.status !== "partial";
61
+ }
62
+ function formatResultFailure2(result) {
63
+ const contractError = result.resultContractInvalid ? `Subagent returned an invalid ${result.resultFormat ?? "structured"} result contract` : result.outcome && !["completed", "partial"].includes(result.outcome.status) ? `Subagent outcome ${result.outcome.status}${result.outcome.reasonCode ? ` (${result.outcome.reasonCode})` : ""}; recovery: ${result.outcome.recoveryActions.join(", ") || "none"}` : void 0;
64
+ return contractError ? formatResultFailure({ ...result, errorMessage: contractError }) : formatResultFailure(result);
65
+ }
66
+
67
+ export {
68
+ getFinalOutput,
69
+ getResultFinalOutput2 as getResultFinalOutput,
70
+ isResultError2 as isResultError,
71
+ formatResultFailure2 as formatResultFailure
72
+ };
73
+ //# sourceMappingURL=chunk-AEUYS7JC.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/runner-result.ts", "../../src/runner-outcome.ts"],
4
+ "sourcesContent": ["import type { Message } from \"@earendil-works/pi-ai\";\nimport { DEFAULT_MAX_CONTEXT_BYTES, truncateUtf8 } from \"./limits.js\";\nimport type { SingleResult } from \"./runner.js\";\nimport { formatTimeoutCheckpoint } from \"./timeout-checkpoint.js\";\n\nexport function getFinalOutput(messages: Message[]): string {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg?.role === \"assistant\") {\n\t\t\tconst text = msg.content\n\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\\n\");\n\t\t\tif (text) return text;\n\t\t}\n\t}\n\treturn \"\";\n}\n\nexport function getResultFinalOutput(result: SingleResult): string {\n\treturn result.finalOutput ?? getFinalOutput(result.messages);\n}\n\nexport function isResultError(result: SingleResult): boolean {\n\treturn (\n\t\t(result.exitCode !== 0 && result.exitCode !== -1) ||\n\t\tresult.timedOut === true ||\n\t\tresult.stopReason === \"timeout\" ||\n\t\tresult.stopReason === \"error\" ||\n\t\tresult.stopReason === \"aborted\"\n\t);\n}\n\nexport function formatResultFailure(result: SingleResult): string {\n\tconst error = result.errorMessage || result.stderr.trim();\n\tconst output = getResultFinalOutput(result);\n\tconst sections = [error];\n\tif (result.timeoutSummary) sections.push(`Timed-out work summary:\\n${result.timeoutSummary}`);\n\telse if (output) sections.push(`Partial output:\\n${output}`);\n\tif (result.partialOutput && result.partialOutput !== output) {\n\t\tsections.push(`Partial output before finalization:\\n${result.partialOutput}`);\n\t}\n\tif (result.termination && !result.timeoutSummary) {\n\t\tsections.push(\n\t\t\t`Termination checkpoint:\\n${formatTimeoutCheckpoint(result.termination.checkpoint)}`,\n\t\t);\n\t}\n\tif (result.timeoutSummaryError) {\n\t\tsections.push(`Summary finalization failed: ${result.timeoutSummaryError}`);\n\t}\n\treturn truncateUtf8(\n\t\tsections.filter(Boolean).join(\"\\n\\n\") || \"(no output)\",\n\t\tDEFAULT_MAX_CONTEXT_BYTES,\n\t).text;\n}\n", "import type { SingleResult } from \"./runner.js\";\nimport {\n\tformatResultFailure as formatBaseResultFailure,\n\tgetResultFinalOutput as getBaseResultFinalOutput,\n\tisResultError as isBaseResultError,\n} from \"./runner-result.js\";\n\nexport function getResultFinalOutput(result: SingleResult): string {\n\treturn getBaseResultFinalOutput(result);\n}\n\nexport function isResultError(result: SingleResult): boolean {\n\treturn (\n\t\tisBaseResultError(result) ||\n\t\tresult.resultContractInvalid === true ||\n\t\t(result.outcome !== undefined &&\n\t\t\tresult.outcome.status !== \"completed\" &&\n\t\t\tresult.outcome.status !== \"partial\")\n\t);\n}\n\nexport function formatResultFailure(result: SingleResult): string {\n\tconst contractError = result.resultContractInvalid\n\t\t? `Subagent returned an invalid ${result.resultFormat ?? \"structured\"} result contract`\n\t\t: result.outcome && ![\"completed\", \"partial\"].includes(result.outcome.status)\n\t\t\t? `Subagent outcome ${result.outcome.status}${result.outcome.reasonCode ? ` (${result.outcome.reasonCode})` : \"\"}; recovery: ${result.outcome.recoveryActions.join(\", \") || \"none\"}`\n\t\t\t: undefined;\n\treturn contractError\n\t\t? formatBaseResultFailure({ ...result, errorMessage: contractError })\n\t\t: formatBaseResultFailure(result);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AAKO,SAAS,eAAe,UAA6B;AAC3D,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC9C,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,KAAK,SAAS,aAAa;AAC9B,YAAM,OAAO,IAAI,QACf,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,IAAI;AACX,UAAI,KAAM,QAAO;AAAA,IAClB;AAAA,EACD;AACA,SAAO;AACR;AAEO,SAAS,qBAAqB,QAA8B;AAClE,SAAO,OAAO,eAAe,eAAe,OAAO,QAAQ;AAC5D;AAEO,SAAS,cAAc,QAA+B;AAC5D,SACE,OAAO,aAAa,KAAK,OAAO,aAAa,MAC9C,OAAO,aAAa,QACpB,OAAO,eAAe,aACtB,OAAO,eAAe,WACtB,OAAO,eAAe;AAExB;AAEO,SAAS,oBAAoB,QAA8B;AACjE,QAAM,QAAQ,OAAO,gBAAgB,OAAO,OAAO,KAAK;AACxD,QAAM,SAAS,qBAAqB,MAAM;AAC1C,QAAM,WAAW,CAAC,KAAK;AACvB,MAAI,OAAO,eAAgB,UAAS,KAAK;AAAA,EAA4B,OAAO,cAAc,EAAE;AAAA,WACnF,OAAQ,UAAS,KAAK;AAAA,EAAoB,MAAM,EAAE;AAC3D,MAAI,OAAO,iBAAiB,OAAO,kBAAkB,QAAQ;AAC5D,aAAS,KAAK;AAAA,EAAwC,OAAO,aAAa,EAAE;AAAA,EAC7E;AACA,MAAI,OAAO,eAAe,CAAC,OAAO,gBAAgB;AACjD,aAAS;AAAA,MACR;AAAA,EAA4B,wBAAwB,OAAO,YAAY,UAAU,CAAC;AAAA,IACnF;AAAA,EACD;AACA,MAAI,OAAO,qBAAqB;AAC/B,aAAS,KAAK,gCAAgC,OAAO,mBAAmB,EAAE;AAAA,EAC3E;AACA,SAAO;AAAA,IACN,SAAS,OAAO,OAAO,EAAE,KAAK,MAAM,KAAK;AAAA,IACzC;AAAA,EACD,EAAE;AACH;;;AC/CO,SAASA,sBAAqB,QAA8B;AAClE,SAAO,qBAAyB,MAAM;AACvC;AAEO,SAASC,eAAc,QAA+B;AAC5D,SACC,cAAkB,MAAM,KACxB,OAAO,0BAA0B,QAChC,OAAO,YAAY,UACnB,OAAO,QAAQ,WAAW,eAC1B,OAAO,QAAQ,WAAW;AAE7B;AAEO,SAASC,qBAAoB,QAA8B;AACjE,QAAM,gBAAgB,OAAO,wBAC1B,gCAAgC,OAAO,gBAAgB,YAAY,qBACnE,OAAO,WAAW,CAAC,CAAC,aAAa,SAAS,EAAE,SAAS,OAAO,QAAQ,MAAM,IACzE,oBAAoB,OAAO,QAAQ,MAAM,GAAG,OAAO,QAAQ,aAAa,KAAK,OAAO,QAAQ,UAAU,MAAM,EAAE,eAAe,OAAO,QAAQ,gBAAgB,KAAK,IAAI,KAAK,MAAM,KAChL;AACJ,SAAO,gBACJ,oBAAwB,EAAE,GAAG,QAAQ,cAAc,cAAc,CAAC,IAClE,oBAAwB,MAAM;AAClC;",
6
+ "names": ["getResultFinalOutput", "isResultError", "formatResultFailure"]
7
+ }
@@ -0,0 +1,189 @@
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
+ import {
4
+ boundedPrivateText,
5
+ safeTerminalLine
6
+ } from "./chunk-SWGQLFSD.ts";
7
+
8
+ // src/render-common.ts
9
+ import * as os from "node:os";
10
+ import {
11
+ keyHint
12
+ } from "@earendil-works/pi-coding-agent";
13
+ import { Text } from "@earendil-works/pi-tui";
14
+ var COLLAPSED_LIST_LIMIT = 5;
15
+ var COLLAPSED_ANSWER_LINES = 3;
16
+ var STATUS_PRESENTATION = {
17
+ starting: { icon: "\u23F3", label: "Starting", color: "warning" },
18
+ running: { icon: "\u23F3", label: "Running", color: "warning" },
19
+ completed: { icon: "\u2713", label: "Completed", color: "success" },
20
+ failed: { icon: "\u2717", label: "Failed", color: "error" },
21
+ cancelled: { icon: "\u25A0", label: "Cancelled", color: "warning" },
22
+ interrupted: { icon: "\u25A0", label: "Interrupted", color: "warning" },
23
+ idle: { icon: "\u25CB", label: "Idle", color: "muted" },
24
+ closed: { icon: "\u2713", label: "Closed", color: "muted" },
25
+ warning: { icon: "\u25D0", label: "Warning", color: "warning" }
26
+ };
27
+ function recordValue(value) {
28
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
29
+ }
30
+ function recordList(value) {
31
+ return Array.isArray(value) ? value.flatMap((item) => {
32
+ const record = recordValue(item);
33
+ return record ? [record] : [];
34
+ }) : [];
35
+ }
36
+ function stringValue(value, fallback = "") {
37
+ return typeof value === "string" ? value : fallback;
38
+ }
39
+ function numberValue(value, fallback = 0) {
40
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
41
+ }
42
+ function booleanValue(value) {
43
+ return value === true;
44
+ }
45
+ function safeLine(value, fallback = "...", maxBytes = 2 * 1024) {
46
+ if (typeof value !== "string" || !value.trim()) return fallback;
47
+ return safeTerminalLine(value, maxBytes) || fallback;
48
+ }
49
+ function safeBlock(value, fallback = "", maxBytes = 50 * 1024) {
50
+ if (typeof value !== "string" || !value) return fallback;
51
+ return boundedPrivateText(value, maxBytes);
52
+ }
53
+ function previewLines(value, maxLines = COLLAPSED_ANSWER_LINES) {
54
+ const text = safeBlock(value, "", 8 * 1024).trim();
55
+ return text.split("\n").slice(0, maxLines).join("\n");
56
+ }
57
+ function textResult(result) {
58
+ return result.content.flatMap((part) => part.type === "text" ? [part.text] : []).join("\n").trim();
59
+ }
60
+ function toolHeader(theme, toolName, primary, metadata = []) {
61
+ let text = theme.fg("toolTitle", theme.bold(`${toolName} `));
62
+ if (primary !== void 0) text += theme.fg("accent", safeLine(primary));
63
+ const safeMetadata = metadata.filter(Boolean).map((item) => safeLine(item, "", 512));
64
+ if (safeMetadata.length > 0) text += theme.fg("muted", ` \xB7 ${safeMetadata.join(" \xB7 ")}`);
65
+ return text.trimEnd();
66
+ }
67
+ function statusBadge(theme, status, suffix) {
68
+ const presentation = STATUS_PRESENTATION[status];
69
+ const label = suffix ? `${presentation.label} \xB7 ${safeLine(suffix, "", 2 * 1024)}` : presentation.label;
70
+ return `${theme.fg(presentation.color, presentation.icon)} ${theme.fg(presentation.color, label)}`;
71
+ }
72
+ function renderFallbackResult(result, options, theme, isError = false) {
73
+ const status = isError ? "failed" : options.isPartial ? "running" : "completed";
74
+ const content = safeBlock(textResult(result), "(no output)", 8 * 1024);
75
+ return new Text(`${statusBadge(theme, status)}
76
+ ${theme.fg("toolOutput", content)}`, 0, 0);
77
+ }
78
+ function expansionHint() {
79
+ return keyHint("app.tools.expand", "to expand");
80
+ }
81
+ function projectRenderActivity(value) {
82
+ if (!Array.isArray(value)) return [];
83
+ const items = [];
84
+ for (const item of value) {
85
+ const record = recordValue(item);
86
+ if (!record) continue;
87
+ if (record.type === "text" && typeof record.text === "string") {
88
+ items.push({ type: "text", text: safeBlock(record.text, "", 1024) });
89
+ continue;
90
+ }
91
+ if (record.type === "toolCall" && typeof record.name === "string") {
92
+ items.push({
93
+ type: "toolCall",
94
+ name: safeLine(record.name, "tool", 256),
95
+ args: recordValue(record.args) ?? {}
96
+ });
97
+ }
98
+ }
99
+ return items;
100
+ }
101
+ function renderActivityLines(items, theme, limit, total = items.length) {
102
+ const selected = limit === void 0 ? items : items.slice(-limit);
103
+ const lines = [];
104
+ const skipped = Math.max(0, total - selected.length);
105
+ if (skipped > 0) lines.push(theme.fg("muted", `\u2026 ${skipped} earlier activities`));
106
+ for (const item of selected) {
107
+ if (item.type === "text") {
108
+ const text = safeBlock(item.text, "", 1024).trim();
109
+ if (text) lines.push(theme.fg("toolOutput", text));
110
+ } else {
111
+ lines.push(
112
+ theme.fg("muted", "\u2192 ") + formatToolActivity(item.name ?? "tool", item.args ?? {}, theme.fg.bind(theme))
113
+ );
114
+ }
115
+ }
116
+ return lines.join("\n");
117
+ }
118
+ function formatToolActivity(toolNameValue, argsValue, themeFg) {
119
+ const toolName = safeLine(toolNameValue, "tool", 256);
120
+ const args = recordValue(argsValue) ?? {};
121
+ const shortenPath = (value, fallback = ".") => {
122
+ const filePath = safeLine(value, fallback, 2 * 1024);
123
+ const home = os.homedir();
124
+ return filePath.startsWith(home) ? `~${filePath.slice(home.length)}` : filePath;
125
+ };
126
+ switch (toolName) {
127
+ case "bash": {
128
+ const command = safeLine(args.command, "...", 512);
129
+ return themeFg("muted", "$ ") + themeFg("toolOutput", command);
130
+ }
131
+ case "read": {
132
+ const filePath = shortenPath(args.file_path ?? args.path, "...");
133
+ const offset = typeof args.offset === "number" ? args.offset : void 0;
134
+ const limit = typeof args.limit === "number" ? args.limit : void 0;
135
+ let text = themeFg("accent", filePath);
136
+ if (offset !== void 0 || limit !== void 0) {
137
+ const startLine = offset ?? 1;
138
+ const endLine = limit !== void 0 ? startLine + limit - 1 : "";
139
+ text += themeFg("warning", `:${startLine}${endLine ? `-${endLine}` : ""}`);
140
+ }
141
+ return themeFg("muted", "read ") + text;
142
+ }
143
+ case "write": {
144
+ const filePath = shortenPath(args.file_path ?? args.path, "...");
145
+ const content = safeBlock(args.content, "", 2 * 1024);
146
+ const lines = content ? content.split("\n").length : 0;
147
+ return themeFg("muted", "write ") + themeFg("accent", filePath) + (lines > 1 ? themeFg("dim", ` (${lines} lines)`) : "");
148
+ }
149
+ case "edit":
150
+ return themeFg("muted", "edit ") + themeFg("accent", shortenPath(args.file_path ?? args.path, "..."));
151
+ case "ls":
152
+ return themeFg("muted", "ls ") + themeFg("accent", shortenPath(args.path));
153
+ case "find":
154
+ return themeFg("muted", "find ") + themeFg("accent", safeLine(args.pattern, "*", 512)) + themeFg("dim", ` in ${shortenPath(args.path)}`);
155
+ case "grep":
156
+ return themeFg("muted", "grep ") + themeFg("accent", `/${safeLine(args.pattern, "", 512)}/`) + themeFg("dim", ` in ${shortenPath(args.path)}`);
157
+ default: {
158
+ let serialized = "{}";
159
+ try {
160
+ serialized = JSON.stringify(args);
161
+ } catch {
162
+ serialized = "{\u2026}";
163
+ }
164
+ return themeFg("accent", toolName) + themeFg("dim", ` ${safeLine(serialized, "{}", 512)}`);
165
+ }
166
+ }
167
+ }
168
+
169
+ export {
170
+ COLLAPSED_LIST_LIMIT,
171
+ COLLAPSED_ANSWER_LINES,
172
+ recordValue,
173
+ recordList,
174
+ stringValue,
175
+ numberValue,
176
+ booleanValue,
177
+ safeLine,
178
+ safeBlock,
179
+ previewLines,
180
+ textResult,
181
+ toolHeader,
182
+ statusBadge,
183
+ renderFallbackResult,
184
+ expansionHint,
185
+ projectRenderActivity,
186
+ renderActivityLines,
187
+ formatToolActivity
188
+ };
189
+ //# sourceMappingURL=chunk-BFK2Z4ZF.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/render-common.ts"],
4
+ "sourcesContent": ["import * as os from \"node:os\";\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\tkeyHint,\n\ttype Theme,\n\ttype ThemeColor,\n\ttype ToolRenderResultOptions,\n} from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { boundedPrivateText, safeTerminalLine } from \"./safe-text.js\";\n\nexport const COLLAPSED_LIST_LIMIT = 5;\nexport const COLLAPSED_ANSWER_LINES = 3;\n\nexport interface ToolRendererContext<TArgs> {\n\targs: TArgs;\n\tisError: boolean;\n}\n\nexport type RenderStatus =\n\t| \"starting\"\n\t| \"running\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"cancelled\"\n\t| \"interrupted\"\n\t| \"idle\"\n\t| \"closed\"\n\t| \"warning\";\n\nconst STATUS_PRESENTATION: Record<\n\tRenderStatus,\n\t{ icon: string; label: string; color: ThemeColor }\n> = {\n\tstarting: { icon: \"\u23F3\", label: \"Starting\", color: \"warning\" },\n\trunning: { icon: \"\u23F3\", label: \"Running\", color: \"warning\" },\n\tcompleted: { icon: \"\u2713\", label: \"Completed\", color: \"success\" },\n\tfailed: { icon: \"\u2717\", label: \"Failed\", color: \"error\" },\n\tcancelled: { icon: \"\u25A0\", label: \"Cancelled\", color: \"warning\" },\n\tinterrupted: { icon: \"\u25A0\", label: \"Interrupted\", color: \"warning\" },\n\tidle: { icon: \"\u25CB\", label: \"Idle\", color: \"muted\" },\n\tclosed: { icon: \"\u2713\", label: \"Closed\", color: \"muted\" },\n\twarning: { icon: \"\u25D0\", label: \"Warning\", color: \"warning\" },\n};\n\nexport function recordValue(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nexport function recordList(value: unknown): Record<string, unknown>[] {\n\treturn Array.isArray(value)\n\t\t? value.flatMap((item) => {\n\t\t\t\tconst record = recordValue(item);\n\t\t\t\treturn record ? [record] : [];\n\t\t\t})\n\t\t: [];\n}\n\nexport function stringValue(value: unknown, fallback = \"\"): string {\n\treturn typeof value === \"string\" ? value : fallback;\n}\n\nexport function numberValue(value: unknown, fallback = 0): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nexport function booleanValue(value: unknown): boolean {\n\treturn value === true;\n}\n\nexport function safeLine(value: unknown, fallback = \"...\", maxBytes = 2 * 1024): string {\n\tif (typeof value !== \"string\" || !value.trim()) return fallback;\n\treturn safeTerminalLine(value, maxBytes) || fallback;\n}\n\nexport function safeBlock(value: unknown, fallback = \"\", maxBytes = 50 * 1024): string {\n\tif (typeof value !== \"string\" || !value) return fallback;\n\treturn boundedPrivateText(value, maxBytes);\n}\n\nexport function previewLines(value: unknown, maxLines = COLLAPSED_ANSWER_LINES): string {\n\tconst text = safeBlock(value, \"\", 8 * 1024).trim();\n\treturn text.split(\"\\n\").slice(0, maxLines).join(\"\\n\");\n}\n\nexport function textResult(result: AgentToolResult<unknown>): string {\n\treturn result.content\n\t\t.flatMap((part) => (part.type === \"text\" ? [part.text] : []))\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nexport function toolHeader(\n\ttheme: Theme,\n\ttoolName: string,\n\tprimary?: unknown,\n\tmetadata: readonly string[] = [],\n): string {\n\tlet text = theme.fg(\"toolTitle\", theme.bold(`${toolName} `));\n\tif (primary !== undefined) text += theme.fg(\"accent\", safeLine(primary));\n\tconst safeMetadata = metadata.filter(Boolean).map((item) => safeLine(item, \"\", 512));\n\tif (safeMetadata.length > 0) text += theme.fg(\"muted\", ` \u00B7 ${safeMetadata.join(\" \u00B7 \")}`);\n\treturn text.trimEnd();\n}\n\nexport function statusBadge(theme: Theme, status: RenderStatus, suffix?: string): string {\n\tconst presentation = STATUS_PRESENTATION[status];\n\tconst label = suffix\n\t\t? `${presentation.label} \u00B7 ${safeLine(suffix, \"\", 2 * 1024)}`\n\t\t: presentation.label;\n\treturn `${theme.fg(presentation.color, presentation.icon)} ${theme.fg(presentation.color, label)}`;\n}\n\nexport function renderFallbackResult(\n\tresult: AgentToolResult<unknown>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tisError = false,\n) {\n\tconst status: RenderStatus = isError ? \"failed\" : options.isPartial ? \"running\" : \"completed\";\n\tconst content = safeBlock(textResult(result), \"(no output)\", 8 * 1024);\n\treturn new Text(`${statusBadge(theme, status)}\\n${theme.fg(\"toolOutput\", content)}`, 0, 0);\n}\n\nexport function expansionHint(): string {\n\treturn keyHint(\"app.tools.expand\", \"to expand\");\n}\n\nexport interface RenderActivityItem {\n\ttype: \"text\" | \"toolCall\";\n\ttext?: string;\n\tname?: string;\n\targs?: Record<string, unknown>;\n}\n\nexport function projectRenderActivity(value: unknown): RenderActivityItem[] {\n\tif (!Array.isArray(value)) return [];\n\tconst items: RenderActivityItem[] = [];\n\tfor (const item of value) {\n\t\tconst record = recordValue(item);\n\t\tif (!record) continue;\n\t\tif (record.type === \"text\" && typeof record.text === \"string\") {\n\t\t\titems.push({ type: \"text\", text: safeBlock(record.text, \"\", 1024) });\n\t\t\tcontinue;\n\t\t}\n\t\tif (record.type === \"toolCall\" && typeof record.name === \"string\") {\n\t\t\titems.push({\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tname: safeLine(record.name, \"tool\", 256),\n\t\t\t\targs: recordValue(record.args) ?? {},\n\t\t\t});\n\t\t}\n\t}\n\treturn items;\n}\n\nexport function renderActivityLines(\n\titems: readonly RenderActivityItem[],\n\ttheme: Theme,\n\tlimit?: number,\n\ttotal = items.length,\n): string {\n\tconst selected = limit === undefined ? items : items.slice(-limit);\n\tconst lines: string[] = [];\n\tconst skipped = Math.max(0, total - selected.length);\n\tif (skipped > 0) lines.push(theme.fg(\"muted\", `\u2026 ${skipped} earlier activities`));\n\tfor (const item of selected) {\n\t\tif (item.type === \"text\") {\n\t\t\tconst text = safeBlock(item.text, \"\", 1024).trim();\n\t\t\tif (text) lines.push(theme.fg(\"toolOutput\", text));\n\t\t} else {\n\t\t\tlines.push(\n\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\tformatToolActivity(item.name ?? \"tool\", item.args ?? {}, theme.fg.bind(theme)),\n\t\t\t);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport function formatToolActivity(\n\ttoolNameValue: unknown,\n\targsValue: unknown,\n\tthemeFg: (color: ThemeColor, text: string) => string,\n): string {\n\tconst toolName = safeLine(toolNameValue, \"tool\", 256);\n\tconst args = recordValue(argsValue) ?? {};\n\tconst shortenPath = (value: unknown, fallback = \".\") => {\n\t\tconst filePath = safeLine(value, fallback, 2 * 1024);\n\t\tconst home = os.homedir();\n\t\treturn filePath.startsWith(home) ? `~${filePath.slice(home.length)}` : filePath;\n\t};\n\n\tswitch (toolName) {\n\t\tcase \"bash\": {\n\t\t\tconst command = safeLine(args.command, \"...\", 512);\n\t\t\treturn themeFg(\"muted\", \"$ \") + themeFg(\"toolOutput\", command);\n\t\t}\n\t\tcase \"read\": {\n\t\t\tconst filePath = shortenPath(args.file_path ?? args.path, \"...\");\n\t\t\tconst offset = typeof args.offset === \"number\" ? args.offset : undefined;\n\t\t\tconst limit = typeof args.limit === \"number\" ? args.limit : undefined;\n\t\t\tlet text = themeFg(\"accent\", filePath);\n\t\t\tif (offset !== undefined || limit !== undefined) {\n\t\t\t\tconst startLine = offset ?? 1;\n\t\t\t\tconst endLine = limit !== undefined ? startLine + limit - 1 : \"\";\n\t\t\t\ttext += themeFg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n\t\t\t}\n\t\t\treturn themeFg(\"muted\", \"read \") + text;\n\t\t}\n\t\tcase \"write\": {\n\t\t\tconst filePath = shortenPath(args.file_path ?? args.path, \"...\");\n\t\t\tconst content = safeBlock(args.content, \"\", 2 * 1024);\n\t\t\tconst lines = content ? content.split(\"\\n\").length : 0;\n\t\t\treturn (\n\t\t\t\tthemeFg(\"muted\", \"write \") +\n\t\t\t\tthemeFg(\"accent\", filePath) +\n\t\t\t\t(lines > 1 ? themeFg(\"dim\", ` (${lines} lines)`) : \"\")\n\t\t\t);\n\t\t}\n\t\tcase \"edit\":\n\t\t\treturn (\n\t\t\t\tthemeFg(\"muted\", \"edit \") +\n\t\t\t\tthemeFg(\"accent\", shortenPath(args.file_path ?? args.path, \"...\"))\n\t\t\t);\n\t\tcase \"ls\":\n\t\t\treturn themeFg(\"muted\", \"ls \") + themeFg(\"accent\", shortenPath(args.path));\n\t\tcase \"find\":\n\t\t\treturn (\n\t\t\t\tthemeFg(\"muted\", \"find \") +\n\t\t\t\tthemeFg(\"accent\", safeLine(args.pattern, \"*\", 512)) +\n\t\t\t\tthemeFg(\"dim\", ` in ${shortenPath(args.path)}`)\n\t\t\t);\n\t\tcase \"grep\":\n\t\t\treturn (\n\t\t\t\tthemeFg(\"muted\", \"grep \") +\n\t\t\t\tthemeFg(\"accent\", `/${safeLine(args.pattern, \"\", 512)}/`) +\n\t\t\t\tthemeFg(\"dim\", ` in ${shortenPath(args.path)}`)\n\t\t\t);\n\t\tdefault: {\n\t\t\tlet serialized = \"{}\";\n\t\t\ttry {\n\t\t\t\tserialized = JSON.stringify(args);\n\t\t\t} catch {\n\t\t\t\tserialized = \"{\u2026}\";\n\t\t\t}\n\t\t\treturn themeFg(\"accent\", toolName) + themeFg(\"dim\", ` ${safeLine(serialized, \"{}\", 512)}`);\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,153 @@
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/semantic-snapshot.ts
5
+ import { execFile } from "node:child_process";
6
+ import { createHash, randomUUID } from "node:crypto";
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import { promisify } from "node:util";
10
+ var execFileAsync = promisify(execFile);
11
+ var SEMANTIC_SNAPSHOT_VERSION = "pi-subagents:semantic-snapshot:v1";
12
+ var SEMANTIC_COMPONENT_KEYS = [
13
+ "agent",
14
+ "rolePrompt",
15
+ "tools",
16
+ "model",
17
+ "thinkingLevel",
18
+ "transport",
19
+ "trust",
20
+ "repository",
21
+ "artifacts",
22
+ "workflowGeneration",
23
+ "schedulerPolicy"
24
+ ];
25
+ async function captureRepositoryGeneration(cwd) {
26
+ const resolved = await fs.promises.realpath(path.resolve(cwd));
27
+ try {
28
+ const result = await execFileAsync(
29
+ "git",
30
+ ["-C", resolved, "status", "--porcelain=v2", "--branch", "--untracked-files=all"],
31
+ { encoding: "utf8", timeout: 2e3, maxBuffer: 256 * 1024 }
32
+ );
33
+ const lines = result.stdout.split("\n");
34
+ const head = lines.find((line) => line.startsWith("# branch.oid "))?.slice("# branch.oid ".length).trim();
35
+ if (!head || head === "(initial)") throw new Error("Repository has no stable HEAD");
36
+ const status = lines.filter((line) => line && !line.startsWith("# ")).join("\n");
37
+ return status ? { kind: "git-dirty", generation: digest({ head, status }) } : { kind: "git-commit", generation: head };
38
+ } catch {
39
+ return {
40
+ kind: "filesystem",
41
+ generation: digest({ path: resolved, failClosedNonce: randomUUID() })
42
+ };
43
+ }
44
+ }
45
+ async function captureSemanticResourceGeneration(paths) {
46
+ const entries = [];
47
+ let totalBytes = 0;
48
+ const visit = async (candidate, label) => {
49
+ if (entries.length >= 256 || totalBytes > 1024 * 1024) {
50
+ throw new Error("Semantic resource snapshot exceeds bounds");
51
+ }
52
+ let stat;
53
+ try {
54
+ stat = await fs.promises.lstat(candidate);
55
+ } catch (error) {
56
+ if (error.code === "ENOENT") return;
57
+ throw error;
58
+ }
59
+ if (stat.isSymbolicLink()) return;
60
+ if (stat.isDirectory()) {
61
+ const children = (await fs.promises.readdir(candidate)).sort();
62
+ for (const child of children) await visit(path.join(candidate, child), `${label}/${child}`);
63
+ return;
64
+ }
65
+ if (!stat.isFile()) return;
66
+ totalBytes += stat.size;
67
+ if (totalBytes > 1024 * 1024) throw new Error("Semantic resource snapshot exceeds bounds");
68
+ entries.push({ path: label, digest: digestBytes(await fs.promises.readFile(candidate)) });
69
+ };
70
+ try {
71
+ for (const [index, candidate] of paths.entries()) {
72
+ await visit(path.resolve(candidate), `resource-${index}`);
73
+ }
74
+ return digest(entries);
75
+ } catch {
76
+ return digest({ failClosedNonce: randomUUID() });
77
+ }
78
+ }
79
+ function captureSemanticSnapshot(input) {
80
+ if (!Number.isSafeInteger(input.workflowGeneration) || input.workflowGeneration < 0) {
81
+ throw new Error("workflowGeneration must be a non-negative safe integer");
82
+ }
83
+ const components = {
84
+ agent: digest({ name: input.agentName, manifest: input.agentManifest ?? null }),
85
+ rolePrompt: digest(input.rolePrompt),
86
+ tools: digest([...input.tools ?? []].sort()),
87
+ model: digest(input.model ?? null),
88
+ thinkingLevel: digest(input.thinkingLevel ?? null),
89
+ transport: digest(input.transport),
90
+ trust: digest(input.trust),
91
+ repository: digest(input.repository),
92
+ artifacts: digest(input.artifacts),
93
+ workflowGeneration: digest(input.workflowGeneration),
94
+ schedulerPolicy: digest(input.schedulerPolicy)
95
+ };
96
+ return {
97
+ version: SEMANTIC_SNAPSHOT_VERSION,
98
+ digest: digest(components),
99
+ components
100
+ };
101
+ }
102
+ function isSemanticSnapshot(value) {
103
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
104
+ const snapshot = value;
105
+ return snapshot.version === SEMANTIC_SNAPSHOT_VERSION && typeof snapshot.digest === "string" && /^[a-f0-9]{64}$/u.test(snapshot.digest) && Boolean(snapshot.components) && Object.keys(snapshot.components ?? {}).length === SEMANTIC_COMPONENT_KEYS.length && SEMANTIC_COMPONENT_KEYS.every(
106
+ (key) => /^[a-f0-9]{64}$/u.test(snapshot.components?.[key] ?? "")
107
+ ) && digest(snapshot.components) === snapshot.digest;
108
+ }
109
+ function evaluateSemanticCompatibility(previous, current) {
110
+ if (previous.version !== SEMANTIC_SNAPSHOT_VERSION || current.version !== SEMANTIC_SNAPSHOT_VERSION) {
111
+ return { status: "rejected", changedComponents: ["version"] };
112
+ }
113
+ if (!isSemanticSnapshot(previous) || !isSemanticSnapshot(current)) {
114
+ return { status: "rejected", changedComponents: ["invalid-snapshot"] };
115
+ }
116
+ if (previous.digest === current.digest) {
117
+ return { status: "compatible", changedComponents: [] };
118
+ }
119
+ const changedComponents = SEMANTIC_COMPONENT_KEYS.filter(
120
+ (key) => previous.components[key] !== current.components[key]
121
+ ).sort();
122
+ const warningOnly = changedComponents.every((key) => key === "schedulerPolicy");
123
+ return {
124
+ status: warningOnly ? "warning" : "needs-revalidation",
125
+ changedComponents
126
+ };
127
+ }
128
+ function digest(value) {
129
+ return digestBytes(stableStringify(value));
130
+ }
131
+ function digestBytes(value) {
132
+ return createHash("sha256").update(value).digest("hex");
133
+ }
134
+ function stableStringify(value) {
135
+ return JSON.stringify(sortValue(value));
136
+ }
137
+ function sortValue(value) {
138
+ if (Array.isArray(value)) return value.map(sortValue);
139
+ if (!value || typeof value !== "object") return value;
140
+ return Object.fromEntries(
141
+ Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, sortValue(entry)])
142
+ );
143
+ }
144
+
145
+ export {
146
+ SEMANTIC_SNAPSHOT_VERSION,
147
+ captureRepositoryGeneration,
148
+ captureSemanticResourceGeneration,
149
+ captureSemanticSnapshot,
150
+ isSemanticSnapshot,
151
+ evaluateSemanticCompatibility
152
+ };
153
+ //# sourceMappingURL=chunk-BOAXY55Y.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/semantic-snapshot.ts"],
4
+ "sourcesContent": ["import { execFile } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const SEMANTIC_SNAPSHOT_VERSION = \"pi-subagents:semantic-snapshot:v1\" as const;\nconst SEMANTIC_COMPONENT_KEYS = [\n\t\"agent\",\n\t\"rolePrompt\",\n\t\"tools\",\n\t\"model\",\n\t\"thinkingLevel\",\n\t\"transport\",\n\t\"trust\",\n\t\"repository\",\n\t\"artifacts\",\n\t\"workflowGeneration\",\n\t\"schedulerPolicy\",\n] as const;\n\nexport interface SemanticSnapshotInput {\n\tagentName: string;\n\tagentManifest?: unknown;\n\trolePrompt: string;\n\ttools?: string[];\n\tmodel?: string;\n\tthinkingLevel?: string;\n\ttransport: string;\n\ttrust: { kind: string; projectTrusted: boolean };\n\trepository: { kind: string; generation: string };\n\tartifacts: Record<string, string>;\n\tworkflowGeneration: number;\n\tschedulerPolicy: string;\n}\n\nexport interface SemanticSnapshot {\n\tversion: typeof SEMANTIC_SNAPSHOT_VERSION;\n\tdigest: string;\n\tcomponents: {\n\t\tagent: string;\n\t\trolePrompt: string;\n\t\ttools: string;\n\t\tmodel: string;\n\t\tthinkingLevel: string;\n\t\ttransport: string;\n\t\ttrust: string;\n\t\trepository: string;\n\t\tartifacts: string;\n\t\tworkflowGeneration: string;\n\t\tschedulerPolicy: string;\n\t};\n}\n\nexport interface RepositoryGeneration {\n\tkind: \"git-commit\" | \"git-dirty\" | \"filesystem\";\n\tgeneration: string;\n}\n\nexport interface SemanticCompatibility {\n\tstatus: \"compatible\" | \"warning\" | \"needs-revalidation\" | \"rejected\";\n\tchangedComponents: string[];\n}\n\nexport async function captureRepositoryGeneration(cwd: string): Promise<RepositoryGeneration> {\n\tconst resolved = await fs.promises.realpath(path.resolve(cwd));\n\ttry {\n\t\tconst result = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"-C\", resolved, \"status\", \"--porcelain=v2\", \"--branch\", \"--untracked-files=all\"],\n\t\t\t{ encoding: \"utf8\", timeout: 2_000, maxBuffer: 256 * 1024 },\n\t\t);\n\t\tconst lines = result.stdout.split(\"\\n\");\n\t\tconst head = lines\n\t\t\t.find((line) => line.startsWith(\"# branch.oid \"))\n\t\t\t?.slice(\"# branch.oid \".length)\n\t\t\t.trim();\n\t\tif (!head || head === \"(initial)\") throw new Error(\"Repository has no stable HEAD\");\n\t\tconst status = lines.filter((line) => line && !line.startsWith(\"# \")).join(\"\\n\");\n\t\treturn status\n\t\t\t? { kind: \"git-dirty\", generation: digest({ head, status }) }\n\t\t\t: { kind: \"git-commit\", generation: head };\n\t} catch {\n\t\treturn {\n\t\t\tkind: \"filesystem\",\n\t\t\tgeneration: digest({ path: resolved, failClosedNonce: randomUUID() }),\n\t\t};\n\t}\n}\n\nexport async function captureSemanticResourceGeneration(paths: string[]): Promise<string> {\n\tconst entries: Array<{ path: string; digest: string }> = [];\n\tlet totalBytes = 0;\n\tconst visit = async (candidate: string, label: string): Promise<void> => {\n\t\tif (entries.length >= 256 || totalBytes > 1024 * 1024) {\n\t\t\tthrow new Error(\"Semantic resource snapshot exceeds bounds\");\n\t\t}\n\t\tlet stat: fs.Stats;\n\t\ttry {\n\t\t\tstat = await fs.promises.lstat(candidate);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n\t\t\tthrow error;\n\t\t}\n\t\tif (stat.isSymbolicLink()) return;\n\t\tif (stat.isDirectory()) {\n\t\t\tconst children = (await fs.promises.readdir(candidate)).sort();\n\t\t\tfor (const child of children) await visit(path.join(candidate, child), `${label}/${child}`);\n\t\t\treturn;\n\t\t}\n\t\tif (!stat.isFile()) return;\n\t\ttotalBytes += stat.size;\n\t\tif (totalBytes > 1024 * 1024) throw new Error(\"Semantic resource snapshot exceeds bounds\");\n\t\tentries.push({ path: label, digest: digestBytes(await fs.promises.readFile(candidate)) });\n\t};\n\ttry {\n\t\tfor (const [index, candidate] of paths.entries()) {\n\t\t\tawait visit(path.resolve(candidate), `resource-${index}`);\n\t\t}\n\t\treturn digest(entries);\n\t} catch {\n\t\treturn digest({ failClosedNonce: randomUUID() });\n\t}\n}\n\nexport function captureSemanticSnapshot(input: SemanticSnapshotInput): SemanticSnapshot {\n\tif (!Number.isSafeInteger(input.workflowGeneration) || input.workflowGeneration < 0) {\n\t\tthrow new Error(\"workflowGeneration must be a non-negative safe integer\");\n\t}\n\tconst components = {\n\t\tagent: digest({ name: input.agentName, manifest: input.agentManifest ?? null }),\n\t\trolePrompt: digest(input.rolePrompt),\n\t\ttools: digest([...(input.tools ?? [])].sort()),\n\t\tmodel: digest(input.model ?? null),\n\t\tthinkingLevel: digest(input.thinkingLevel ?? null),\n\t\ttransport: digest(input.transport),\n\t\ttrust: digest(input.trust),\n\t\trepository: digest(input.repository),\n\t\tartifacts: digest(input.artifacts),\n\t\tworkflowGeneration: digest(input.workflowGeneration),\n\t\tschedulerPolicy: digest(input.schedulerPolicy),\n\t};\n\treturn {\n\t\tversion: SEMANTIC_SNAPSHOT_VERSION,\n\t\tdigest: digest(components),\n\t\tcomponents,\n\t};\n}\n\nexport function isSemanticSnapshot(value: unknown): value is SemanticSnapshot {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst snapshot = value as Partial<SemanticSnapshot>;\n\treturn (\n\t\tsnapshot.version === SEMANTIC_SNAPSHOT_VERSION &&\n\t\ttypeof snapshot.digest === \"string\" &&\n\t\t/^[a-f0-9]{64}$/u.test(snapshot.digest) &&\n\t\tBoolean(snapshot.components) &&\n\t\tObject.keys(snapshot.components ?? {}).length === SEMANTIC_COMPONENT_KEYS.length &&\n\t\tSEMANTIC_COMPONENT_KEYS.every((key) =>\n\t\t\t/^[a-f0-9]{64}$/u.test(snapshot.components?.[key] ?? \"\"),\n\t\t) &&\n\t\tdigest(snapshot.components) === snapshot.digest\n\t);\n}\n\nexport function evaluateSemanticCompatibility(\n\tprevious: SemanticSnapshot,\n\tcurrent: SemanticSnapshot,\n): SemanticCompatibility {\n\tif (\n\t\tprevious.version !== SEMANTIC_SNAPSHOT_VERSION ||\n\t\tcurrent.version !== SEMANTIC_SNAPSHOT_VERSION\n\t) {\n\t\treturn { status: \"rejected\", changedComponents: [\"version\"] };\n\t}\n\tif (!isSemanticSnapshot(previous) || !isSemanticSnapshot(current)) {\n\t\treturn { status: \"rejected\", changedComponents: [\"invalid-snapshot\"] };\n\t}\n\tif (previous.digest === current.digest) {\n\t\treturn { status: \"compatible\", changedComponents: [] };\n\t}\n\tconst changedComponents = SEMANTIC_COMPONENT_KEYS.filter(\n\t\t(key) => previous.components[key] !== current.components[key],\n\t).sort();\n\tconst warningOnly = changedComponents.every((key) => key === \"schedulerPolicy\");\n\treturn {\n\t\tstatus: warningOnly ? \"warning\" : \"needs-revalidation\",\n\t\tchangedComponents,\n\t};\n}\n\nfunction digest(value: unknown): string {\n\treturn digestBytes(stableStringify(value));\n}\n\nfunction digestBytes(value: string | Buffer): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction stableStringify(value: unknown): string {\n\treturn JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(sortValue);\n\tif (!value || typeof value !== \"object\") return value;\n\treturn Object.fromEntries(\n\t\tObject.entries(value as Record<string, unknown>)\n\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t.map(([key, entry]) => [key, sortValue(entry)]),\n\t);\n}\n"],
5
+ "mappings": ";;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,YAAY,kBAAkB;AACvC,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,iBAAiB;AAE1B,IAAM,gBAAgB,UAAU,QAAQ;AAEjC,IAAM,4BAA4B;AACzC,IAAM,0BAA0B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AA6CA,eAAsB,4BAA4B,KAA4C;AAC7F,QAAM,WAAW,MAAS,YAAS,SAAc,aAAQ,GAAG,CAAC;AAC7D,MAAI;AACH,UAAM,SAAS,MAAM;AAAA,MACpB;AAAA,MACA,CAAC,MAAM,UAAU,UAAU,kBAAkB,YAAY,uBAAuB;AAAA,MAChF,EAAE,UAAU,QAAQ,SAAS,KAAO,WAAW,MAAM,KAAK;AAAA,IAC3D;AACA,UAAM,QAAQ,OAAO,OAAO,MAAM,IAAI;AACtC,UAAM,OAAO,MACX,KAAK,CAAC,SAAS,KAAK,WAAW,eAAe,CAAC,GAC9C,MAAM,gBAAgB,MAAM,EAC7B,KAAK;AACP,QAAI,CAAC,QAAQ,SAAS,YAAa,OAAM,IAAI,MAAM,+BAA+B;AAClF,UAAM,SAAS,MAAM,OAAO,CAAC,SAAS,QAAQ,CAAC,KAAK,WAAW,IAAI,CAAC,EAAE,KAAK,IAAI;AAC/E,WAAO,SACJ,EAAE,MAAM,aAAa,YAAY,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE,IAC1D,EAAE,MAAM,cAAc,YAAY,KAAK;AAAA,EAC3C,QAAQ;AACP,WAAO;AAAA,MACN,MAAM;AAAA,MACN,YAAY,OAAO,EAAE,MAAM,UAAU,iBAAiB,WAAW,EAAE,CAAC;AAAA,IACrE;AAAA,EACD;AACD;AAEA,eAAsB,kCAAkC,OAAkC;AACzF,QAAM,UAAmD,CAAC;AAC1D,MAAI,aAAa;AACjB,QAAM,QAAQ,OAAO,WAAmB,UAAiC;AACxE,QAAI,QAAQ,UAAU,OAAO,aAAa,OAAO,MAAM;AACtD,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC5D;AACA,QAAI;AACJ,QAAI;AACH,aAAO,MAAS,YAAS,MAAM,SAAS;AAAA,IACzC,SAAS,OAAO;AACf,UAAK,MAAgC,SAAS,SAAU;AACxD,YAAM;AAAA,IACP;AACA,QAAI,KAAK,eAAe,EAAG;AAC3B,QAAI,KAAK,YAAY,GAAG;AACvB,YAAM,YAAY,MAAS,YAAS,QAAQ,SAAS,GAAG,KAAK;AAC7D,iBAAW,SAAS,SAAU,OAAM,MAAW,UAAK,WAAW,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,EAAE;AAC1F;AAAA,IACD;AACA,QAAI,CAAC,KAAK,OAAO,EAAG;AACpB,kBAAc,KAAK;AACnB,QAAI,aAAa,OAAO,KAAM,OAAM,IAAI,MAAM,2CAA2C;AACzF,YAAQ,KAAK,EAAE,MAAM,OAAO,QAAQ,YAAY,MAAS,YAAS,SAAS,SAAS,CAAC,EAAE,CAAC;AAAA,EACzF;AACA,MAAI;AACH,eAAW,CAAC,OAAO,SAAS,KAAK,MAAM,QAAQ,GAAG;AACjD,YAAM,MAAW,aAAQ,SAAS,GAAG,YAAY,KAAK,EAAE;AAAA,IACzD;AACA,WAAO,OAAO,OAAO;AAAA,EACtB,QAAQ;AACP,WAAO,OAAO,EAAE,iBAAiB,WAAW,EAAE,CAAC;AAAA,EAChD;AACD;AAEO,SAAS,wBAAwB,OAAgD;AACvF,MAAI,CAAC,OAAO,cAAc,MAAM,kBAAkB,KAAK,MAAM,qBAAqB,GAAG;AACpF,UAAM,IAAI,MAAM,wDAAwD;AAAA,EACzE;AACA,QAAM,aAAa;AAAA,IAClB,OAAO,OAAO,EAAE,MAAM,MAAM,WAAW,UAAU,MAAM,iBAAiB,KAAK,CAAC;AAAA,IAC9E,YAAY,OAAO,MAAM,UAAU;AAAA,IACnC,OAAO,OAAO,CAAC,GAAI,MAAM,SAAS,CAAC,CAAE,EAAE,KAAK,CAAC;AAAA,IAC7C,OAAO,OAAO,MAAM,SAAS,IAAI;AAAA,IACjC,eAAe,OAAO,MAAM,iBAAiB,IAAI;AAAA,IACjD,WAAW,OAAO,MAAM,SAAS;AAAA,IACjC,OAAO,OAAO,MAAM,KAAK;AAAA,IACzB,YAAY,OAAO,MAAM,UAAU;AAAA,IACnC,WAAW,OAAO,MAAM,SAAS;AAAA,IACjC,oBAAoB,OAAO,MAAM,kBAAkB;AAAA,IACnD,iBAAiB,OAAO,MAAM,eAAe;AAAA,EAC9C;AACA,SAAO;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,OAAO,UAAU;AAAA,IACzB;AAAA,EACD;AACD;AAEO,SAAS,mBAAmB,OAA2C;AAC7E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,WAAW;AACjB,SACC,SAAS,YAAY,6BACrB,OAAO,SAAS,WAAW,YAC3B,kBAAkB,KAAK,SAAS,MAAM,KACtC,QAAQ,SAAS,UAAU,KAC3B,OAAO,KAAK,SAAS,cAAc,CAAC,CAAC,EAAE,WAAW,wBAAwB,UAC1E,wBAAwB;AAAA,IAAM,CAAC,QAC9B,kBAAkB,KAAK,SAAS,aAAa,GAAG,KAAK,EAAE;AAAA,EACxD,KACA,OAAO,SAAS,UAAU,MAAM,SAAS;AAE3C;AAEO,SAAS,8BACf,UACA,SACwB;AACxB,MACC,SAAS,YAAY,6BACrB,QAAQ,YAAY,2BACnB;AACD,WAAO,EAAE,QAAQ,YAAY,mBAAmB,CAAC,SAAS,EAAE;AAAA,EAC7D;AACA,MAAI,CAAC,mBAAmB,QAAQ,KAAK,CAAC,mBAAmB,OAAO,GAAG;AAClE,WAAO,EAAE,QAAQ,YAAY,mBAAmB,CAAC,kBAAkB,EAAE;AAAA,EACtE;AACA,MAAI,SAAS,WAAW,QAAQ,QAAQ;AACvC,WAAO,EAAE,QAAQ,cAAc,mBAAmB,CAAC,EAAE;AAAA,EACtD;AACA,QAAM,oBAAoB,wBAAwB;AAAA,IACjD,CAAC,QAAQ,SAAS,WAAW,GAAG,MAAM,QAAQ,WAAW,GAAG;AAAA,EAC7D,EAAE,KAAK;AACP,QAAM,cAAc,kBAAkB,MAAM,CAAC,QAAQ,QAAQ,iBAAiB;AAC9E,SAAO;AAAA,IACN,QAAQ,cAAc,YAAY;AAAA,IAClC;AAAA,EACD;AACD;AAEA,SAAS,OAAO,OAAwB;AACvC,SAAO,YAAY,gBAAgB,KAAK,CAAC;AAC1C;AAEA,SAAS,YAAY,OAAgC;AACpD,SAAO,WAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACvD;AAEA,SAAS,gBAAgB,OAAwB;AAChD,SAAO,KAAK,UAAU,UAAU,KAAK,CAAC;AACvC;AAEA,SAAS,UAAU,OAAyB;AAC3C,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,SAAS;AACpD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAO,OAAO;AAAA,IACb,OAAO,QAAQ,KAAgC,EAC7C,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,EAChD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
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/transport-types.ts
5
+ var PI_SUBAGENTS_RPC_PROTOCOL = "pi-subagents:v1";
6
+ function emptyTransportUsage() {
7
+ return {
8
+ input: 0,
9
+ output: 0,
10
+ cacheRead: 0,
11
+ cacheWrite: 0,
12
+ totalTokens: 0,
13
+ cost: 0,
14
+ turns: 0
15
+ };
16
+ }
17
+
18
+ export {
19
+ PI_SUBAGENTS_RPC_PROTOCOL,
20
+ emptyTransportUsage
21
+ };
22
+ //# sourceMappingURL=chunk-C4L6P266.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transport-types.ts"],
4
+ "sourcesContent": ["import type { SubagentThinkingLevel } from \"./agents/types.js\";\n\nexport const PI_SUBAGENTS_RPC_PROTOCOL = \"pi-subagents:v1\" as const;\n\nexport type EffectiveSubagentTransportKind = \"subprocess\" | \"in-process\" | \"rpc\";\n\nexport type TransportProgressPhase =\n\t| \"queued\"\n\t| \"starting\"\n\t| \"ready\"\n\t| \"accepted\"\n\t| \"running\"\n\t| \"finalizing\"\n\t| \"retrying\"\n\t| \"compacting\"\n\t| \"settled\"\n\t| \"failed\"\n\t| \"interrupted\";\n\nexport interface TransportUsage {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tcost: number;\n\tturns: number;\n}\n\nexport interface TransportTiming {\n\tqueuedAt?: number;\n\tstartedAt?: number;\n\ttransportStartedAt?: number;\n\treadyAt?: number;\n\tpromptAcceptedAt?: number;\n\tfirstActivityAt?: number;\n\tsettledAt?: number;\n\tcompletionDeliveredAt?: number;\n}\n\nexport interface TransportTelemetry {\n\ttransport?: EffectiveSubagentTransportKind;\n\tselectionReason?: string;\n\tprotocol?: typeof PI_SUBAGENTS_RPC_PROTOCOL;\n\tphase: TransportProgressPhase;\n\tqueuePosition?: number;\n\tupdatedAt: number;\n\ttiming: TransportTiming;\n\tprovider?: string;\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\tusage?: TransportUsage;\n\tfailurePhase?: TransportProgressPhase;\n}\n\nexport type TransportProgressCallback = (progress: TransportTelemetry) => void;\n\nexport function emptyTransportUsage(): TransportUsage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: 0,\n\t\tturns: 0,\n\t};\n}\n"],
5
+ "mappings": ";;;;AAEO,IAAM,4BAA4B;AAuDlC,SAAS,sBAAsC;AACrD,SAAO;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,EACR;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
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/agents/types.ts
5
+ var THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
6
+ function isThinkingLevel(value) {
7
+ return typeof value === "string" && THINKING_LEVELS.includes(value);
8
+ }
9
+ var DEFAULT_PI_TOOL_NAMES = ["read", "bash", "edit", "write"];
10
+ function resolveAgentToolNames(tools) {
11
+ return [...new Set(tools ?? DEFAULT_PI_TOOL_NAMES)];
12
+ }
13
+ var CONSULT_RESOURCE_POLICIES = ["project-context", "none", "all"];
14
+ var CONSULTATION_CWD_POLICIES = ["anywhere", "current-workspace"];
15
+ var DELEGATION_CWD_POLICIES = [
16
+ "trusted-targets",
17
+ "current-workspace",
18
+ "anywhere"
19
+ ];
20
+
21
+ export {
22
+ THINKING_LEVELS,
23
+ isThinkingLevel,
24
+ resolveAgentToolNames,
25
+ CONSULT_RESOURCE_POLICIES,
26
+ CONSULTATION_CWD_POLICIES,
27
+ DELEGATION_CWD_POLICIES
28
+ };
29
+ //# sourceMappingURL=chunk-DPPVEQAM.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/agents/types.ts"],
4
+ "sourcesContent": ["/**\n * Foundational agent and settings types with dependency-light validation helpers.\n */\n\nimport type { AgentCapabilityManifest } from \"../capabilities.js\";\n\nexport const THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\nexport type SubagentThinkingLevel = (typeof THINKING_LEVELS)[number];\n\nexport function isThinkingLevel(value: unknown): value is SubagentThinkingLevel {\n\treturn typeof value === \"string\" && THINKING_LEVELS.includes(value as SubagentThinkingLevel);\n}\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\n\nexport type AgentSource = \"built-in\" | \"user\" | \"project\";\n\nexport const DEFAULT_PI_TOOL_NAMES = [\"read\", \"bash\", \"edit\", \"write\"] as const;\n\nexport function resolveAgentToolNames(tools: readonly string[] | undefined): string[] {\n\treturn [...new Set(tools ?? DEFAULT_PI_TOOL_NAMES)];\n}\n\nexport interface AgentConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttimeoutMs?: number;\n\tcapabilityManifest?: AgentCapabilityManifest;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n}\n\nexport interface SubagentAgentConfig {\n\ttools?: string[];\n\tmodel?: string | null;\n\tthinkingLevel?: SubagentThinkingLevel | null;\n\ttimeoutMs?: number | null;\n}\n\nexport type SubagentTransportKind = \"subprocess\" | \"in-process\" | \"rpc\" | \"auto\";\n\nexport type CompletionDelivery = \"next-turn\" | \"auto-resume\";\n\nexport const CONSULT_RESOURCE_POLICIES = [\"project-context\", \"none\", \"all\"] as const;\n\nexport type ConsultResourcePolicy = (typeof CONSULT_RESOURCE_POLICIES)[number];\n\nexport interface SubagentConsultSettings {\n\tresources?: ConsultResourcePolicy;\n}\n\nexport const CONSULTATION_CWD_POLICIES = [\"anywhere\", \"current-workspace\"] as const;\nexport type ConsultationCwdPolicy = (typeof CONSULTATION_CWD_POLICIES)[number];\n\nexport const DELEGATION_CWD_POLICIES = [\n\t\"trusted-targets\",\n\t\"current-workspace\",\n\t\"anywhere\",\n] as const;\nexport type DelegationCwdPolicy = (typeof DELEGATION_CWD_POLICIES)[number];\n\nexport interface SubagentCwdPolicySettings {\n\tconsultation?: ConsultationCwdPolicy;\n\tdelegation?: DelegationCwdPolicy;\n}\n\nexport interface SubagentBlockingSettings {\n\tenabled?: boolean;\n\tmaxParallelTasks?: number;\n}\n\nexport interface SubagentRuntimeSettings {\n\tenabled?: boolean;\n\ttransport?: SubagentTransportKind;\n\tcompletionDelivery?: CompletionDelivery;\n\tmaxAgents?: number;\n\tmaxActiveTurns?: number;\n\tmaxDepth?: number;\n\tmaxChildrenPerAgent?: number;\n\tmaxMailboxMessages?: number;\n\tmaxMailboxMessageBytes?: number;\n\tidleTtlMs?: number;\n\tretentionDays?: number;\n\tmaxStoredAgents?: number;\n}\n\nexport interface SubagentSettings {\n\tagents?: Record<string, SubagentAgentConfig>;\n\tblocking?: SubagentBlockingSettings;\n\tstateful?: SubagentRuntimeSettings;\n\tconsult?: SubagentConsultSettings;\n\tcwdPolicy?: SubagentCwdPolicySettings;\n}\n"],
5
+ "mappings": ";;;;AAMO,IAAM,kBAAkB,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,SAAS,KAAK;AAIlF,SAAS,gBAAgB,OAAgD;AAC/E,SAAO,OAAO,UAAU,YAAY,gBAAgB,SAAS,KAA8B;AAC5F;AAMO,IAAM,wBAAwB,CAAC,QAAQ,QAAQ,QAAQ,OAAO;AAE9D,SAAS,sBAAsB,OAAgD;AACrF,SAAO,CAAC,GAAG,IAAI,IAAI,SAAS,qBAAqB,CAAC;AACnD;AA0BO,IAAM,4BAA4B,CAAC,mBAAmB,QAAQ,KAAK;AAQnE,IAAM,4BAA4B,CAAC,YAAY,mBAAmB;AAGlE,IAAM,0BAA0B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACD;",
6
+ "names": []
7
+ }