@code-yeongyu/senpi 2026.9.21-2 → 2026.9.22

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 (239) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/bundle/chunks/{anthropic-messages-C3ZY2ANT.js → anthropic-messages-2P7APOOQ.js} +1 -1
  3. package/dist/bundle/chunks/{app-server-command-HSX5RFAP.js → app-server-command-DLBXJ5K5.js} +1 -1
  4. package/dist/bundle/chunks/{azure-openai-responses-7TAGS2VU.js → azure-openai-responses-3AH7MJWF.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-3SLCHXZO.js → chunk-4AXZDO3E.js} +2 -2
  6. package/dist/bundle/chunks/{chunk-Z3KQB2R3.js → chunk-7ICH7UFW.js} +12 -12
  7. package/dist/bundle/chunks/{chunk-KNM6SRPE.js → chunk-AAVNXTGQ.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-IDTLJYJ5.js → chunk-AY37SZJZ.js} +4 -4
  9. package/dist/bundle/chunks/{chunk-XHMOFY4T.js → chunk-BUPX33Q4.js} +3 -3
  10. package/dist/bundle/chunks/{chunk-GLKVDRNP.js → chunk-CWCY7LXK.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-POMPEGWQ.js → chunk-F3DXL5MX.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-GVI2HP7N.js → chunk-I2HIIJPI.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-T6XA2IZR.js → chunk-JR4X6ECO.js} +1 -1
  14. package/dist/bundle/chunks/{chunk-M2XAY6I7.js → chunk-M2HSO7MH.js} +1 -1
  15. package/dist/bundle/chunks/{chunk-MIVOQT3Q.js → chunk-N5AQJAQ2.js} +1 -1
  16. package/dist/bundle/chunks/{chunk-UYVPLEOL.js → chunk-NK2RNX25.js} +1 -1
  17. package/dist/bundle/chunks/chunk-NMB4C6ZZ.js +2 -0
  18. package/dist/bundle/chunks/{chunk-B7W62BM7.js → chunk-P4OHEJ7P.js} +1 -1
  19. package/dist/bundle/chunks/{chunk-I425CMTO.js → chunk-VBNHBSBD.js} +1 -1
  20. package/dist/bundle/chunks/{chunk-B2IM56LB.js → chunk-VYIJQQ5I.js} +1 -1
  21. package/dist/bundle/chunks/chunk-XRHUMMIW.js +8 -0
  22. package/dist/bundle/chunks/{chunk-47GF6XYZ.js → chunk-YT2ZSZOY.js} +1 -1
  23. package/dist/bundle/chunks/{chunk-OSDJ2SYO.js → chunk-ZCBX2K34.js} +1 -1
  24. package/dist/bundle/chunks/{chunk-D5CL7PPD.js → chunk-ZMVXBX33.js} +2 -2
  25. package/dist/bundle/chunks/{cli-main-GQTEEZ2V.js → cli-main-D2VPNIQ3.js} +1 -1
  26. package/dist/bundle/chunks/{google-generative-ai-JWIH75VF.js → google-generative-ai-Y2IYMUVC.js} +1 -1
  27. package/dist/bundle/chunks/{google-vertex-IRGAY5XR.js → google-vertex-TKBBMPHV.js} +1 -1
  28. package/dist/bundle/chunks/{host-command-KOEKIHIZ.js → host-command-IFIIOX5S.js} +1 -1
  29. package/dist/bundle/chunks/host-lifecycle-3OJZA4QQ.js +3 -0
  30. package/dist/bundle/chunks/host-lifecycle.js +3 -3
  31. package/dist/bundle/chunks/{interactive-host-runtime-2KTFEW7O.js → interactive-host-runtime-V7PBDIOJ.js} +1 -1
  32. package/dist/bundle/chunks/{interactive-mode-I3ILWXQB.js → interactive-mode-RFMMGQCT.js} +1 -1
  33. package/dist/bundle/chunks/kimi-coding.js +2 -2
  34. package/dist/bundle/chunks/{mistral-conversations-VOBYATVJ.js → mistral-conversations-ZYDVFRYF.js} +1 -1
  35. package/dist/bundle/chunks/{multi-session-host-S5FWCIWE.js → multi-session-host-45YMCQIH.js} +8 -7
  36. package/dist/bundle/chunks/openai-codex-responses-MEIUNROM.js +10 -0
  37. package/dist/bundle/chunks/{openai-completions-YK6QTYOH.js → openai-completions-4V76L5ZJ.js} +1 -1
  38. package/dist/bundle/chunks/openai-responses-YR7WRBG3.js +2 -0
  39. package/dist/bundle/chunks/{package-manager-cli-HOL6CAI6.js → package-manager-cli-7DQKRSI5.js} +1 -1
  40. package/dist/bundle/chunks/rotation-stream-YPZP3VJS.js +2 -0
  41. package/dist/bundle/chunks/{rpc-mode-L3DSGTVM.js → rpc-mode-4GWZCJKI.js} +1 -1
  42. package/dist/bundle/chunks/{session-picker-L3FYEQBL.js → session-picker-ZKRYWZGC.js} +1 -1
  43. package/dist/bundle/chunks/session-worker.js +38 -37
  44. package/dist/bundle/cli.js +1 -1
  45. package/dist/bundle/index.js +1 -1
  46. package/dist/bundle/rpc-entry.js +1 -1
  47. package/dist/core/agent-session.d.ts +6 -4
  48. package/dist/core/agent-session.d.ts.map +1 -1
  49. package/dist/core/agent-session.js +9 -7
  50. package/dist/core/agent-session.js.map +1 -1
  51. package/dist/core/credential-pool/classify.d.ts.map +1 -1
  52. package/dist/core/credential-pool/classify.js +12 -0
  53. package/dist/core/credential-pool/classify.js.map +1 -1
  54. package/dist/core/credential-pool/failover.d.ts +37 -5
  55. package/dist/core/credential-pool/failover.d.ts.map +1 -1
  56. package/dist/core/credential-pool/failover.js +60 -24
  57. package/dist/core/credential-pool/failover.js.map +1 -1
  58. package/dist/core/credential-pool/rotation-events.d.ts +5 -0
  59. package/dist/core/credential-pool/rotation-events.d.ts.map +1 -0
  60. package/dist/core/credential-pool/rotation-events.js +25 -0
  61. package/dist/core/credential-pool/rotation-events.js.map +1 -0
  62. package/dist/core/credential-pool/rotation-stream.d.ts +4 -3
  63. package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
  64. package/dist/core/credential-pool/rotation-stream.js +8 -11
  65. package/dist/core/credential-pool/rotation-stream.js.map +1 -1
  66. package/dist/core/extensions/builtin/ask-user/schema.d.ts +2 -25
  67. package/dist/core/extensions/builtin/ask-user/schema.d.ts.map +1 -1
  68. package/dist/core/extensions/builtin/ask-user/schema.js.map +1 -1
  69. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +2 -7
  70. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  71. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +2 -8
  72. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  73. package/dist/core/extensions/builtin/mcp/expose/naming.d.ts +0 -1
  74. package/dist/core/extensions/builtin/mcp/expose/naming.d.ts.map +1 -1
  75. package/dist/core/extensions/builtin/mcp/expose/naming.js +0 -3
  76. package/dist/core/extensions/builtin/mcp/expose/naming.js.map +1 -1
  77. package/dist/core/extensions/builtin/mcp/expose/register.d.ts +1 -2
  78. package/dist/core/extensions/builtin/mcp/expose/register.d.ts.map +1 -1
  79. package/dist/core/extensions/builtin/mcp/expose/register.js +0 -21
  80. package/dist/core/extensions/builtin/mcp/expose/register.js.map +1 -1
  81. package/dist/core/extensions/builtin/mcp/expose/schema-compat.d.ts +2 -2
  82. package/dist/core/extensions/builtin/mcp/expose/schema-compat.d.ts.map +1 -1
  83. package/dist/core/extensions/builtin/mcp/expose/schema-compat.js +2 -2
  84. package/dist/core/extensions/builtin/mcp/expose/schema-compat.js.map +1 -1
  85. package/dist/core/http-dispatcher.d.ts +29 -0
  86. package/dist/core/http-dispatcher.d.ts.map +1 -1
  87. package/dist/core/http-dispatcher.js +30 -3
  88. package/dist/core/http-dispatcher.js.map +1 -1
  89. package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/assistant-render-descriptors.js +8 -7
  91. package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
  92. package/dist/modes/print-mode.d.ts.map +1 -1
  93. package/dist/modes/print-mode.js +7 -5
  94. package/dist/modes/print-mode.js.map +1 -1
  95. package/dist/modes/rpc/handoff-activity.d.ts +4 -0
  96. package/dist/modes/rpc/handoff-activity.d.ts.map +1 -0
  97. package/dist/modes/rpc/handoff-activity.js +6 -0
  98. package/dist/modes/rpc/handoff-activity.js.map +1 -0
  99. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  100. package/dist/modes/rpc/host-ensure.js +60 -17
  101. package/dist/modes/rpc/host-ensure.js.map +1 -1
  102. package/dist/modes/rpc/host-lifecycle.d.ts +3 -0
  103. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  104. package/dist/modes/rpc/host-lifecycle.js +25 -5
  105. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  106. package/dist/modes/rpc/multi-session-host.d.ts +1 -0
  107. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  108. package/dist/modes/rpc/multi-session-host.js +40 -7
  109. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  110. package/dist/modes/rpc/rpc-types.d.ts +13 -0
  111. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  112. package/dist/modes/rpc/rpc-types.js.map +1 -1
  113. package/dist/modes/rpc/session-command-router.d.ts +10 -4
  114. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  115. package/dist/modes/rpc/session-command-router.js +90 -18
  116. package/dist/modes/rpc/session-command-router.js.map +1 -1
  117. package/dist/modes/rpc/session-event-writer.d.ts +5 -3
  118. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  119. package/dist/modes/rpc/session-event-writer.js +21 -2
  120. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  121. package/dist/modes/rpc/session-worker-client.d.ts +1 -0
  122. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  123. package/dist/modes/rpc/session-worker-client.js +3 -0
  124. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  125. package/dist/modes/rpc/session-worker-protocol.d.ts +3 -1
  126. package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
  127. package/dist/modes/rpc/session-worker-protocol.js.map +1 -1
  128. package/dist/modes/rpc/session-worker.js +7 -1
  129. package/dist/modes/rpc/session-worker.js.map +1 -1
  130. package/docs/providers.md +9 -1
  131. package/docs/rpc.md +58 -8
  132. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +15 -0
  133. package/node_modules/@code-yeongyu/senpi-codemode/README.md +51 -13
  134. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  135. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +53 -9
  136. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/reserved-dispatch.ts +1 -0
  137. package/node_modules/@code-yeongyu/senpi-codemode/src/config/settings.ts +18 -0
  138. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +9 -4
  139. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +3 -0
  140. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/AGENTS.md +2 -2
  141. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +10 -0
  142. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +18 -6
  143. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +2 -6
  144. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +1 -1
  145. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/run-queue.ts +17 -7
  146. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +6 -1
  147. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -5
  148. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +37 -5
  149. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +11 -2
  150. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +6 -0
  151. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +2 -5
  152. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +14 -4
  153. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +18 -5
  154. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +3 -2
  155. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -1
  156. package/node_modules/@code-yeongyu/senpi-codemode/src/timeouts/idle-timeout.ts +9 -2
  157. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/AGENTS.md +2 -0
  158. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-execution.ts +19 -2
  159. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +11 -3
  160. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-contract.ts +6 -1
  161. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +72 -20
  162. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +28 -4
  163. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-state.ts +5 -4
  164. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-status.ts +5 -2
  165. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +76 -25
  166. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-execution-event.ts +4 -0
  167. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-kernel-reset-refused-error.ts +12 -0
  168. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +2 -1
  169. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +3 -1
  170. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +58 -37
  171. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/managed-cell.ts +15 -8
  172. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +20 -6
  173. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +89 -25
  174. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/terminal-snapshot-store.ts +4 -0
  175. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +51 -10
  176. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  177. package/node_modules/@earendil-works/pi-ai/README.md +1 -1
  178. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +14 -56
  179. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  180. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  181. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +18 -27
  182. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.d.ts +40 -0
  184. package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.d.ts.map +1 -0
  185. package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.js +102 -0
  186. package/node_modules/@earendil-works/pi-ai/dist/api/websocket-transport-failure.js.map +1 -0
  187. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts +4 -3
  188. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  189. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +28 -14
  190. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -1
  191. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.d.ts +44 -0
  192. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.d.ts.map +1 -0
  193. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.js +120 -0
  194. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-region.js.map +1 -0
  195. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts +2 -2
  196. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -1
  197. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js +2 -2
  198. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js.map +1 -1
  199. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +3 -0
  200. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
  201. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +21 -15
  202. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
  203. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  204. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  205. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  206. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  207. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  208. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  209. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  211. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  212. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  213. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  214. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.d.ts +9 -0
  215. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.d.ts.map +1 -0
  216. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.js +43 -0
  217. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding-auth.js.map +1 -0
  218. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.d.ts.map +1 -1
  219. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js +3 -2
  220. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js.map +1 -1
  221. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.d.ts +19 -0
  222. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.d.ts.map +1 -0
  223. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.js +63 -0
  224. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-failure-description.js.map +1 -0
  225. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +1 -0
  226. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  227. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -1
  228. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  229. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  230. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  231. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  232. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  233. package/package.json +7 -7
  234. package/dist/bundle/chunks/chunk-5J5R5AMP.js +0 -8
  235. package/dist/bundle/chunks/chunk-I3F6VZZF.js +0 -2
  236. package/dist/bundle/chunks/host-lifecycle-DGZJTBDJ.js +0 -3
  237. package/dist/bundle/chunks/openai-codex-responses-L2PO2D6F.js +0 -10
  238. package/dist/bundle/chunks/openai-responses-YDUBVF4S.js +0 -2
  239. package/dist/bundle/chunks/rotation-stream-Y4YU6HV4.js +0 -2
@@ -1,29 +1,6 @@
1
+ import type { QuestionRequest } from "../../types.ts";
2
+ export type { QuestionRequest, QuestionResponse } from "../../types.ts";
1
3
  export { CLAUDE_PARAMS, CODEX_PARAMS } from "./params.ts";
2
- export interface QuestionRequest {
3
- requestId: string;
4
- questions: Array<{
5
- id: string;
6
- header: string;
7
- question: string;
8
- options: Array<{
9
- label: string;
10
- description?: string;
11
- }>;
12
- multiSelect: boolean;
13
- }>;
14
- waitForAnswer: boolean;
15
- timeoutMs: number;
16
- }
17
- export interface QuestionResponse {
18
- status: "answered" | "comment-submitted" | "timed_out" | "cancelled" | "orphaned-after-restart" | "unavailable";
19
- answers: Record<string, {
20
- selected: string[];
21
- text?: string;
22
- }>;
23
- comment?: string;
24
- unanswered: string[];
25
- autoResolvedAfterMs?: number;
26
- }
27
4
  export type AskUserVariant = "codex" | "claude";
28
5
  export type Question = QuestionRequest["questions"][number];
29
6
  export type QuestionOption = Question["options"][number];
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ask-user/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxD,WAAW,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,WAAW,GAAG,wBAAwB,GAAG,aAAa,CAAC;IAChH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,oBAAoB,+KAC4I,CAAC;AAE9K,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAS1D,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,MAAM,MAAM,kBAAkB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA+EF,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAajH"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ask-user/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,oBAAoB,+KAC4I,CAAC;AAE9K,eAAO,MAAM,2BAA2B,QAAiB,CAAC;AAS1D,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,MAAM,MAAM,kBAAkB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA+EF,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAajH"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ask-user/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6B1D,MAAM,CAAC,MAAM,oBAAoB,GAChC,4KAA4K,CAAC;AAE9K,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1D,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,+BAA+B,CAAC;AACnD,MAAM,MAAM,GAAG;IACd,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE;IAC/E,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE;CACxE,CAAC;AAEX,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IAClC,CAAC;CACD;AAOD,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,OAAuB,EAAE,IAA6B;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC9E,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CACpB,GAAY,EACZ,GAAW,EACX,GAAW,EACX,QAAiB,EACjB,kBAA2B;IAE3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,QAAQ;YAAE,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;QAC1F,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;IAClF,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,kBAAkB,CAC3B,QAAQ;YACP,CAAC,CAAC,wBAAwB,GAAG,OAAO,GAAG,QAAQ;YAC/C,CAAC,CAAC,wBAAwB,GAAG,OAAO,GAAG,qBAAqB,CAC7D,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,gCAAgC,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,IAAI,kBAAkB,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,kBAAkB,CAAC,gCAAgC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,OAAuB,EAAE,GAAY,EAAE,KAAa;IAC1E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,iCAAiC,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU;QAAE,MAAM,IAAI,kBAAkB,CAAC,uCAAuC,CAAC,CAAC;IACtG,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,YAAY,CAC3B,GAAG,CAAC,OAAO,EACX,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,eAAe,EACtB,OAAO,KAAK,OAAO,CACnB,CAAC;IACF,IAAI,EAAU,CAAC;IACf,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC1B,EAAE,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,EAAE,GAAG,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,uBAAuB,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,WAAoB,CAAC;IACzB,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,SAAS;YAAE,MAAM,IAAI,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;QAClG,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IAC/B,CAAC;SAAM,CAAC;QACP,WAAW,GAAG,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAuB,EAAE,IAAa,EAAE,OAA4B;IAC/F,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAChH,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,MAAM,CAAC,YAAY,QAAQ,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO;QACN,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE;QACpD,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3F,aAAa;QACb,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,2BAA2B;KAC5D,CAAC;AACH,CAAC","sourcesContent":["export { CLAUDE_PARAMS, CODEX_PARAMS } from \"./params.ts\";\n\n// TODO(t3-merge): re-export from ../../types.ts\nexport interface QuestionRequest {\n\trequestId: string;\n\tquestions: Array<{\n\t\tid: string;\n\t\theader: string;\n\t\tquestion: string;\n\t\toptions: Array<{ label: string; description?: string }>;\n\t\tmultiSelect: boolean;\n\t}>;\n\twaitForAnswer: boolean;\n\ttimeoutMs: number;\n}\n\n// TODO(t3-merge): re-export from ../../types.ts\nexport interface QuestionResponse {\n\tstatus: \"answered\" | \"comment-submitted\" | \"timed_out\" | \"cancelled\" | \"orphaned-after-restart\" | \"unavailable\";\n\tanswers: Record<string, { selected: string[]; text?: string }>;\n\tcomment?: string;\n\tunanswered: string[];\n\tautoResolvedAfterMs?: number;\n}\n\nexport type AskUserVariant = \"codex\" | \"claude\";\nexport type Question = QuestionRequest[\"questions\"][number];\nexport type QuestionOption = Question[\"options\"][number];\n\nexport const WAIT_FLAG_STEER_TEXT =\n\t\"This call omitted wait_for_answer (or waitForAnswer). Set true to pause here until the user answers, false to keep working and receive the answer later as a user message.\";\n\nexport const DEFAULT_ASK_USER_TIMEOUT_MS = 30 * 60 * 1000;\n\nconst HEADER_MAX = 12;\nconst SNAKE_CASE = /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;\nconst LIMITS = {\n\tcodex: { maxQuestions: 3, minOptions: 2, maxOptions: 3, optionsRequired: true },\n\tclaude: { maxQuestions: 4, minOptions: 2, maxOptions: 4, optionsRequired: false },\n} as const;\n\nexport class AskUserSchemaError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"AskUserSchemaError\";\n\t}\n}\n\nexport type ToCanonicalOptions = {\n\trequestId?: string;\n\ttimeoutMs?: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readWaitFlag(variant: AskUserVariant, args: Record<string, unknown>): boolean {\n\tconst value = args[variant === \"codex\" ? \"wait_for_answer\" : \"waitForAnswer\"];\n\tif (typeof value !== \"boolean\") {\n\t\tthrow new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);\n\t}\n\treturn value;\n}\n\nfunction parseOptions(\n\traw: unknown,\n\tmin: number,\n\tmax: number,\n\trequired: boolean,\n\trequireDescription: boolean,\n): QuestionOption[] {\n\tif (raw === undefined) {\n\t\tif (required) throw new AskUserSchemaError(`options must contain ${min} to ${max} items`);\n\t\treturn [];\n\t}\n\tif (!Array.isArray(raw)) throw new AskUserSchemaError(\"options must be an array\");\n\tif (raw.length < min || raw.length > max) {\n\t\tthrow new AskUserSchemaError(\n\t\t\trequired\n\t\t\t\t? `options must contain ${min} to ${max} items`\n\t\t\t\t: `options must contain ${min} to ${max} items when present`,\n\t\t);\n\t}\n\tconst options: QuestionOption[] = [];\n\tfor (const item of raw) {\n\t\tif (!isRecord(item)) throw new AskUserSchemaError(\"each option must be an object\");\n\t\tconst label = typeof item.label === \"string\" ? item.label.trim() : \"\";\n\t\tif (label.length === 0) throw new AskUserSchemaError(\"option label must be non-empty\");\n\t\tconst description = typeof item.description === \"string\" ? item.description.trim() : undefined;\n\t\tif (requireDescription && (description === undefined || description.length === 0)) {\n\t\t\tthrow new AskUserSchemaError(\"option description is required\");\n\t\t}\n\t\toptions.push(description === undefined || description.length === 0 ? { label } : { label, description });\n\t}\n\treturn options;\n}\n\nfunction parseQuestion(variant: AskUserVariant, raw: unknown, index: number): Question {\n\tif (!isRecord(raw)) throw new AskUserSchemaError(\"each question must be an object\");\n\tconst limits = LIMITS[variant];\n\tconst header = typeof raw.header === \"string\" ? raw.header.trim() : \"\";\n\tif (header.length === 0) throw new AskUserSchemaError(\"header must be non-empty\");\n\tif (header.length > HEADER_MAX) throw new AskUserSchemaError(\"header must be 12 or fewer characters\");\n\tconst question = typeof raw.question === \"string\" ? raw.question.trim() : \"\";\n\tif (question.length === 0) throw new AskUserSchemaError(\"question must be non-empty\");\n\tconst options = parseOptions(\n\t\traw.options,\n\t\tlimits.minOptions,\n\t\tlimits.maxOptions,\n\t\tlimits.optionsRequired,\n\t\tvariant === \"codex\",\n\t);\n\tlet id: string;\n\tif (variant === \"claude\") {\n\t\tid = `q${index + 1}`;\n\t} else {\n\t\tid = typeof raw.id === \"string\" ? raw.id.trim() : \"\";\n\t\tif (!SNAKE_CASE.test(id)) throw new AskUserSchemaError(\"id must be snake_case\");\n\t}\n\tlet multiSelect: boolean;\n\tif (variant === \"claude\") {\n\t\tif (typeof raw.multiSelect !== \"boolean\") throw new AskUserSchemaError(\"multiSelect is required\");\n\t\tmultiSelect = raw.multiSelect;\n\t} else {\n\t\tmultiSelect = raw.multiSelect === true;\n\t}\n\treturn { id, header, question, options, multiSelect };\n}\n\nexport function toCanonical(variant: AskUserVariant, args: unknown, options?: ToCanonicalOptions): QuestionRequest {\n\tif (!isRecord(args)) throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);\n\tconst waitForAnswer = readWaitFlag(variant, args);\n\tconst limits = LIMITS[variant];\n\tif (!Array.isArray(args.questions) || args.questions.length < 1 || args.questions.length > limits.maxQuestions) {\n\t\tthrow new AskUserSchemaError(`questions must contain 1 to ${limits.maxQuestions} items`);\n\t}\n\treturn {\n\t\trequestId: options?.requestId ?? crypto.randomUUID(),\n\t\tquestions: args.questions.map((question, index) => parseQuestion(variant, question, index)),\n\t\twaitForAnswer,\n\t\ttimeoutMs: options?.timeoutMs ?? DEFAULT_ASK_USER_TIMEOUT_MS,\n\t};\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/ask-user/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import type { QuestionRequest } from \"../../types.ts\";\n\nexport type { QuestionRequest, QuestionResponse } from \"../../types.ts\";\nexport { CLAUDE_PARAMS, CODEX_PARAMS } from \"./params.ts\";\n\nexport type AskUserVariant = \"codex\" | \"claude\";\nexport type Question = QuestionRequest[\"questions\"][number];\nexport type QuestionOption = Question[\"options\"][number];\n\nexport const WAIT_FLAG_STEER_TEXT =\n\t\"This call omitted wait_for_answer (or waitForAnswer). Set true to pause here until the user answers, false to keep working and receive the answer later as a user message.\";\n\nexport const DEFAULT_ASK_USER_TIMEOUT_MS = 30 * 60 * 1000;\n\nconst HEADER_MAX = 12;\nconst SNAKE_CASE = /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;\nconst LIMITS = {\n\tcodex: { maxQuestions: 3, minOptions: 2, maxOptions: 3, optionsRequired: true },\n\tclaude: { maxQuestions: 4, minOptions: 2, maxOptions: 4, optionsRequired: false },\n} as const;\n\nexport class AskUserSchemaError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"AskUserSchemaError\";\n\t}\n}\n\nexport type ToCanonicalOptions = {\n\trequestId?: string;\n\ttimeoutMs?: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readWaitFlag(variant: AskUserVariant, args: Record<string, unknown>): boolean {\n\tconst value = args[variant === \"codex\" ? \"wait_for_answer\" : \"waitForAnswer\"];\n\tif (typeof value !== \"boolean\") {\n\t\tthrow new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);\n\t}\n\treturn value;\n}\n\nfunction parseOptions(\n\traw: unknown,\n\tmin: number,\n\tmax: number,\n\trequired: boolean,\n\trequireDescription: boolean,\n): QuestionOption[] {\n\tif (raw === undefined) {\n\t\tif (required) throw new AskUserSchemaError(`options must contain ${min} to ${max} items`);\n\t\treturn [];\n\t}\n\tif (!Array.isArray(raw)) throw new AskUserSchemaError(\"options must be an array\");\n\tif (raw.length < min || raw.length > max) {\n\t\tthrow new AskUserSchemaError(\n\t\t\trequired\n\t\t\t\t? `options must contain ${min} to ${max} items`\n\t\t\t\t: `options must contain ${min} to ${max} items when present`,\n\t\t);\n\t}\n\tconst options: QuestionOption[] = [];\n\tfor (const item of raw) {\n\t\tif (!isRecord(item)) throw new AskUserSchemaError(\"each option must be an object\");\n\t\tconst label = typeof item.label === \"string\" ? item.label.trim() : \"\";\n\t\tif (label.length === 0) throw new AskUserSchemaError(\"option label must be non-empty\");\n\t\tconst description = typeof item.description === \"string\" ? item.description.trim() : undefined;\n\t\tif (requireDescription && (description === undefined || description.length === 0)) {\n\t\t\tthrow new AskUserSchemaError(\"option description is required\");\n\t\t}\n\t\toptions.push(description === undefined || description.length === 0 ? { label } : { label, description });\n\t}\n\treturn options;\n}\n\nfunction parseQuestion(variant: AskUserVariant, raw: unknown, index: number): Question {\n\tif (!isRecord(raw)) throw new AskUserSchemaError(\"each question must be an object\");\n\tconst limits = LIMITS[variant];\n\tconst header = typeof raw.header === \"string\" ? raw.header.trim() : \"\";\n\tif (header.length === 0) throw new AskUserSchemaError(\"header must be non-empty\");\n\tif (header.length > HEADER_MAX) throw new AskUserSchemaError(\"header must be 12 or fewer characters\");\n\tconst question = typeof raw.question === \"string\" ? raw.question.trim() : \"\";\n\tif (question.length === 0) throw new AskUserSchemaError(\"question must be non-empty\");\n\tconst options = parseOptions(\n\t\traw.options,\n\t\tlimits.minOptions,\n\t\tlimits.maxOptions,\n\t\tlimits.optionsRequired,\n\t\tvariant === \"codex\",\n\t);\n\tlet id: string;\n\tif (variant === \"claude\") {\n\t\tid = `q${index + 1}`;\n\t} else {\n\t\tid = typeof raw.id === \"string\" ? raw.id.trim() : \"\";\n\t\tif (!SNAKE_CASE.test(id)) throw new AskUserSchemaError(\"id must be snake_case\");\n\t}\n\tlet multiSelect: boolean;\n\tif (variant === \"claude\") {\n\t\tif (typeof raw.multiSelect !== \"boolean\") throw new AskUserSchemaError(\"multiSelect is required\");\n\t\tmultiSelect = raw.multiSelect;\n\t} else {\n\t\tmultiSelect = raw.multiSelect === true;\n\t}\n\treturn { id, header, question, options, multiSelect };\n}\n\nexport function toCanonical(variant: AskUserVariant, args: unknown, options?: ToCanonicalOptions): QuestionRequest {\n\tif (!isRecord(args)) throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);\n\tconst waitForAnswer = readWaitFlag(variant, args);\n\tconst limits = LIMITS[variant];\n\tif (!Array.isArray(args.questions) || args.questions.length < 1 || args.questions.length > limits.maxQuestions) {\n\t\tthrow new AskUserSchemaError(`questions must contain 1 to ${limits.maxQuestions} items`);\n\t}\n\treturn {\n\t\trequestId: options?.requestId ?? crypto.randomUUID(),\n\t\tquestions: args.questions.map((question, index) => parseQuestion(variant, question, index)),\n\t\twaitForAnswer,\n\t\ttimeoutMs: options?.timeoutMs ?? DEFAULT_ASK_USER_TIMEOUT_MS,\n\t};\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { stripTurnRetrySuppressionPrefix } from "@earendil-works/pi-ai";
1
2
  import { type CompactionPreparation, type CompactionResult } from "../../../compaction/index.ts";
2
3
  import { type SessionEntry } from "../../../session-manager.ts";
3
4
  export type RequiredCompactionFallbackFailure = "summarization-timeout" | "summarization-provider-failure" | "upstream-stream-truncated" | "summarization-overflow-exhausted" | "summarization-empty-summary";
@@ -32,12 +33,7 @@ export interface DeterministicFallbackDiagnostic {
32
33
  }
33
34
  export declare function formatRequiredCompactionFallbackRejection(diagnostics: DeterministicFallbackDiagnostic): string;
34
35
  export declare function classifyRequiredCompactionFallbackFailure(error: unknown): RequiredCompactionFallbackFailure | undefined;
35
- /**
36
- * `senpi:no-turn-retry:` is a session-internal replay-suppression signal read by
37
- * `_isRetryableError` / `_isHardErrorFallbackEligible`. It must stay on the error
38
- * object those predicates inspect and must never reach user-visible text.
39
- */
40
- export declare function stripTurnRetrySuppressionPrefix(message: string): string;
36
+ export { stripTurnRetrySuppressionPrefix };
41
37
  /**
42
38
  * What the user is told when a required compaction recovered through the
43
39
  * deterministic checkpoint. States the outcome plainly and never carries the
@@ -45,5 +41,4 @@ export declare function stripTurnRetrySuppressionPrefix(message: string): string
45
41
  */
46
42
  export declare function formatRequiredCompactionFallbackNotice(failureKind: RequiredCompactionFallbackFailure, cause?: unknown): string;
47
43
  export declare function createRequiredCompactionFallback(preparation: CompactionPreparation, contextWindow: number, failureKind: RequiredCompactionFallbackFailure, metadata: RecoveryMetadata, branchEntries?: SessionEntry[], diagnostics?: DeterministicFallbackDiagnostic): CompactionResult<DeterministicFallbackDetails> | undefined;
48
- export {};
49
44
  //# sourceMappingURL=deterministic-fallback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAQjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;AAQrC,MAAM,MAAM,iCAAiC,GAC1C,uBAAuB,GACvB,gCAAgC,GAChC,2BAA2B,GAC3B,kCAAkC,GAClC,6BAA6B,CAAC;AAEjC,UAAU,gBAAgB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAC7C,8BAA8B,GAC9B,yBAAyB,GACzB,gCAAgC,GAChC,uBAAuB,GACvB,+BAA+B,CAAC;AAEnC,UAAU,4BAA4B;IACrC,MAAM,EAAE,4CAA4C,CAAC;IACrD,MAAM,EAAE,8BAA8B,CAAC;IACvC,WAAW,EAAE,iCAAiC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,UAAU,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC3E;AAED,MAAM,WAAW,+BAA+B;IAC/C,eAAe,CAAC,EAAE,oCAAoC,CAAC;IACvD,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,oCAAoC,CAAC;QACtD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,yCAAyC,CAAC,WAAW,EAAE,+BAA+B,GAAG,MAAM,CAoC9G;AAwED,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,OAAO,GACZ,iCAAiC,GAAG,SAAS,CAqB/C;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAUD;;;;GAIG;AACH,wBAAgB,sCAAsC,CACrD,WAAW,EAAE,iCAAiC,EAC9C,KAAK,CAAC,EAAE,OAAO,GACb,MAAM,CAUR;AAED,wBAAgB,gCAAgC,CAC/C,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,iCAAiC,EAC9C,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,GAAE,YAAY,EAAO,EAClC,WAAW,CAAC,EAAE,+BAA+B,GAC3C,gBAAgB,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAiS5D"}
1
+ {"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAQjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;AAQrC,MAAM,MAAM,iCAAiC,GAC1C,uBAAuB,GACvB,gCAAgC,GAChC,2BAA2B,GAC3B,kCAAkC,GAClC,6BAA6B,CAAC;AAEjC,UAAU,gBAAgB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAC7C,8BAA8B,GAC9B,yBAAyB,GACzB,gCAAgC,GAChC,uBAAuB,GACvB,+BAA+B,CAAC;AAEnC,UAAU,4BAA4B;IACrC,MAAM,EAAE,4CAA4C,CAAC;IACrD,MAAM,EAAE,8BAA8B,CAAC;IACvC,WAAW,EAAE,iCAAiC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,UAAU,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC3E;AAED,MAAM,WAAW,+BAA+B;IAC/C,eAAe,CAAC,EAAE,oCAAoC,CAAC;IACvD,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,oCAAoC,CAAC;QACtD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,yCAAyC,CAAC,WAAW,EAAE,+BAA+B,GAAG,MAAM,CAoC9G;AAwED,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,OAAO,GACZ,iCAAiC,GAAG,SAAS,CAqB/C;AAED,OAAO,EAAE,+BAA+B,EAAE,CAAC;AAU3C;;;;GAIG;AACH,wBAAgB,sCAAsC,CACrD,WAAW,EAAE,iCAAiC,EAC9C,KAAK,CAAC,EAAE,OAAO,GACb,MAAM,CAUR;AAED,wBAAgB,gCAAgC,CAC/C,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,iCAAiC,EAC9C,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,GAAE,YAAY,EAAO,EAClC,WAAW,CAAC,EAAE,+BAA+B,GAC3C,gBAAgB,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAiS5D"}
@@ -1,3 +1,4 @@
1
+ import { stripTurnRetrySuppressionPrefix } from "@earendil-works/pi-ai";
1
2
  import { estimateTokens } from "../../../compaction/index.js";
2
3
  import { StreamDurationBudgetError, StreamIdleTimeoutError, SummarizationTotalBudgetError, } from "../../../compaction/stream-watchdog.js";
3
4
  import { CredentialFailoverError, TURN_RETRY_SUPPRESSION_PREFIX } from "../../../credential-pool/failover.js";
@@ -141,14 +142,7 @@ export function classifyRequiredCompactionFallbackFailure(error) {
141
142
  }
142
143
  return undefined;
143
144
  }
144
- /**
145
- * `senpi:no-turn-retry:` is a session-internal replay-suppression signal read by
146
- * `_isRetryableError` / `_isHardErrorFallbackEligible`. It must stay on the error
147
- * object those predicates inspect and must never reach user-visible text.
148
- */
149
- export function stripTurnRetrySuppressionPrefix(message) {
150
- return message.replaceAll(TURN_RETRY_SUPPRESSION_PREFIX, "");
151
- }
145
+ export { stripTurnRetrySuppressionPrefix };
152
146
  const FALLBACK_FAILURE_CAUSE = {
153
147
  "summarization-timeout": "the summary stream ran out of its time budget",
154
148
  "summarization-provider-failure": "the provider ended the summary stream with an error",
@@ -1 +1 @@
1
- {"version":3,"file":"deterministic-fallback.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["import { type CompactionPreparation, type CompactionResult, estimateTokens } from \"../../../compaction/index.ts\";\nimport {\n\tStreamDurationBudgetError,\n\tStreamIdleTimeoutError,\n\tSummarizationTotalBudgetError,\n} from \"../../../compaction/stream-watchdog.ts\";\nimport { CredentialFailoverError, TURN_RETRY_SUPPRESSION_PREFIX } from \"../../../credential-pool/failover.ts\";\nimport { filterContextExcludedMessages } from \"../../../messages.ts\";\nimport {\n\tbuildSessionContext,\n\ttype CompactionEntry,\n\tgetSessionContextEntryId,\n\ttype SessionEntry,\n} from \"../../../session-manager.ts\";\nimport { markFailedTurnFragments } from \"./fallback-failed-turn-normalization.ts\";\nimport { SummarizationOverflowExhaustedError } from \"./overflow-retry.ts\";\nimport { resolveEffectiveReserveTokens } from \"./policy.ts\";\nimport { hasUnsafeRetainedContent } from \"./retained-message-safety.ts\";\nimport { SummaryGenerationError, SummaryRequestError } from \"./speculative.ts\";\nimport { capUtf8Bytes } from \"./task-intent.ts\";\n\nexport type RequiredCompactionFallbackFailure =\n\t| \"summarization-timeout\"\n\t| \"summarization-provider-failure\"\n\t| \"upstream-stream-truncated\"\n\t| \"summarization-overflow-exhausted\"\n\t| \"summarization-empty-summary\";\n\ninterface RecoveryMetadata {\n\ttaskIntent?: string;\n\ttodoSnapshot?: unknown;\n\tcheckpoint?: unknown;\n}\n\nexport type DeterministicFallbackRejectionReason =\n\t| \"missing-preparation-boundary\"\n\t| \"unsafe-retained-content\"\n\t| \"retained-token-budget-exceeded\"\n\t| \"atomic-tool-chain-cut\"\n\t| \"context-reconstruction-failed\";\n\ninterface DeterministicFallbackDetails {\n\tschema: \"senpi.compaction.deterministic-fallback.v1\";\n\torigin: \"required-compaction-recovery\";\n\tfailureKind: RequiredCompactionFallbackFailure;\n\ttaskIntent?: string;\n\tretainedSuffix?: \"prepared\" | \"latest-user-turn\" | \"earlier-safe-boundary\";\n}\n\nexport interface DeterministicFallbackDiagnostic {\n\trejectionReason?: DeterministicFallbackRejectionReason;\n\tcandidateRejections?: Array<{\n\t\tfirstKeptEntryId: string;\n\t\trejectionReason: DeterministicFallbackRejectionReason;\n\t\testimatedTokens?: number;\n\t\tunsafeMessageIndex?: number;\n\t\tunsafeEntryId?: string;\n\t\tunsafeMessageRole?: string;\n\t}>;\n\tcandidatesChecked?: number;\n\tbudgetExceeded?: boolean;\n\tcontextWindow?: number;\n\treserveTokens?: number;\n\tbudgetTokens?: number;\n}\n\nexport function formatRequiredCompactionFallbackRejection(diagnostics: DeterministicFallbackDiagnostic): string {\n\tconst candidate = diagnostics.candidateRejections?.at(-1);\n\tconst reason = diagnostics.rejectionReason ?? \"context-reconstruction-failed\";\n\tconst recovery: Record<DeterministicFallbackRejectionReason, string> = {\n\t\t\"retained-token-budget-exceeded\":\n\t\t\t\"The retained turn exceeds the usable context. Select a model with a larger context and run /compact, or start a new session with an explicit checkpoint.\",\n\t\t\"atomic-tool-chain-cut\":\n\t\t\t\"The retained tool calls and results do not form complete pairs. Finish the pending tool operation before /compact; if the transcript is damaged, start a new session with an explicit checkpoint.\",\n\t\t\"unsafe-retained-content\":\n\t\t\t\"The retained message cannot be replayed safely. Inspect the identified entry; start a new session with an explicit checkpoint if it cannot be repaired.\",\n\t\t\"missing-preparation-boundary\":\n\t\t\t\"The prepared boundary is absent from the branch. Reload the session and run /compact.\",\n\t\t\"context-reconstruction-failed\":\n\t\t\t\"The retained context could not be reconstructed. Reload the session and run /compact.\",\n\t};\n\tconst diagnostic = {\n\t\trejectionReason: reason,\n\t\tcontextWindow: diagnostics.contextWindow,\n\t\treserveTokens: diagnostics.reserveTokens,\n\t\tbudgetTokens: diagnostics.budgetTokens,\n\t\tbudgetExceeded: diagnostics.budgetExceeded ?? false,\n\t\tcandidatesChecked: diagnostics.candidatesChecked ?? 0,\n\t\t...(candidate\n\t\t\t? {\n\t\t\t\t\tcandidate: {\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\tfirstKeptEntryId: capUtf8Bytes(candidate.firstKeptEntryId, 128),\n\t\t\t\t\t\t...(candidate.unsafeEntryId ? { unsafeEntryId: capUtf8Bytes(candidate.unsafeEntryId, 128) } : {}),\n\t\t\t\t\t\t...(candidate.unsafeMessageRole\n\t\t\t\t\t\t\t? { unsafeMessageRole: capUtf8Bytes(candidate.unsafeMessageRole, 32) }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\treturn `deterministic compaction fallback could not retain a safe suffix\\n${JSON.stringify(diagnostic)}\\n${recovery[reason]} The original transcript has not been changed.`;\n}\n\nconst NON_VISIBLE_USER_TEXT = /[\\p{White_Space}\\p{Default_Ignorable_Code_Point}]/gu;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction hasMeaningfulUserText(entry: SessionEntry): boolean {\n\tif (entry.type !== \"message\" || !isRecord(entry.message) || entry.message.role !== \"user\") return false;\n\tconst content = entry.message.content;\n\tconst hasVisibleText = (text: unknown): boolean =>\n\t\ttypeof text === \"string\" && text.normalize(\"NFKC\").replace(NON_VISIBLE_USER_TEXT, \"\").length > 0;\n\tif (typeof content === \"string\") return hasVisibleText(content);\n\tif (!Array.isArray(content)) return false;\n\treturn content.some((block) => isRecord(block) && block.type === \"text\" && hasVisibleText(block.text));\n}\n\n/**\n * Bound a value graph that came from persisted, potentially hostile session data.\n * Returns false when the graph contains anything we must not read (accessors,\n * non-plain prototypes, cycles, functions, symbols) so callers fail closed\n * instead of executing persisted code or walking unbounded structures.\n */\nfunction isSafeBoundedValue(value: unknown, seen = new Set<object>(), depth = 0): boolean {\n\tif (depth > 32) return false;\n\tif (value === null || value === undefined) return true;\n\tconst kind = typeof value;\n\tif (kind === \"string\" || kind === \"number\" || kind === \"boolean\") return true;\n\tif (kind !== \"object\") return false;\n\tif (seen.has(value as object)) return false;\n\tseen.add(value as object);\n\tif (Array.isArray(value)) {\n\t\tfor (const item of value) if (!isSafeBoundedValue(item, seen, depth + 1)) return false;\n\t\treturn true;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return false;\n\tfor (const descriptor of Object.values(Object.getOwnPropertyDescriptors(value))) {\n\t\tif (descriptor.get !== undefined || descriptor.set !== undefined) return false;\n\t\tif (typeof descriptor.value === \"function\" || typeof descriptor.value === \"symbol\") return false;\n\t\tif (!isSafeBoundedValue(descriptor.value, seen, depth + 1)) return false;\n\t}\n\treturn true;\n}\n\n/**\n * A provider or credential fault that ended the summary stream with no usable\n * summary and no cheaper recovery left.\n *\n * Credential rotation rethrows EVERY terminal outcome as `CredentialFailoverError`,\n * and once any event past `start` reached the caller it prepends the\n * `senpi:no-turn-retry:` marker so the session layer never replays a partially\n * delivered turn. That marker also disables session retry and model fallback, so\n * before #1741 such an error left required compaction with no recovery at all:\n * it applied no summary, authorized no fallback, and repeated identically on the\n * next prompt because the context stayed above the threshold. Single-key\n * providers have no rotation wrapper and surface the same outage as a\n * non-transient `SummaryRequestError`, so the authorization keys on the outcome\n * (\"the summary stream is dead\") rather than on the marker alone.\n *\n * Deliberately NOT authorized: user aborts (they resolve `undefined` upstream),\n * policy refusals (reducing context would not make the model comply), missing\n * credentials (a configuration fault with an actionable message), and ordinary\n * bugs - destructive context reduction must never be a bug's recovery path.\n */\nfunction isTerminalSummarizationProviderFailure(error: unknown): boolean {\n\tif (error instanceof CredentialFailoverError) return true;\n\tif (error instanceof Error && error.message.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)) return true;\n\treturn error instanceof SummaryRequestError && !error.transient && !error.refused && error.failureKind === undefined;\n}\n\nexport function classifyRequiredCompactionFallbackFailure(\n\terror: unknown,\n): RequiredCompactionFallbackFailure | undefined {\n\tif (\n\t\terror instanceof StreamDurationBudgetError ||\n\t\terror instanceof StreamIdleTimeoutError ||\n\t\terror instanceof SummarizationTotalBudgetError\n\t) {\n\t\treturn \"summarization-timeout\";\n\t}\n\tif (error instanceof SummaryRequestError && error.transient && error.failureKind === \"upstream-stream-truncated\") {\n\t\treturn \"upstream-stream-truncated\";\n\t}\n\tif (error instanceof SummarizationOverflowExhaustedError) {\n\t\treturn \"summarization-overflow-exhausted\";\n\t}\n\tif (error instanceof SummaryGenerationError && error.kind === \"empty-summary\") {\n\t\treturn \"summarization-empty-summary\";\n\t}\n\tif (isTerminalSummarizationProviderFailure(error)) {\n\t\treturn \"summarization-provider-failure\";\n\t}\n\treturn undefined;\n}\n\n/**\n * `senpi:no-turn-retry:` is a session-internal replay-suppression signal read by\n * `_isRetryableError` / `_isHardErrorFallbackEligible`. It must stay on the error\n * object those predicates inspect and must never reach user-visible text.\n */\nexport function stripTurnRetrySuppressionPrefix(message: string): string {\n\treturn message.replaceAll(TURN_RETRY_SUPPRESSION_PREFIX, \"\");\n}\n\nconst FALLBACK_FAILURE_CAUSE: Record<RequiredCompactionFallbackFailure, string> = {\n\t\"summarization-timeout\": \"the summary stream ran out of its time budget\",\n\t\"summarization-provider-failure\": \"the provider ended the summary stream with an error\",\n\t\"upstream-stream-truncated\": \"the provider truncated the summary stream\",\n\t\"summarization-overflow-exhausted\": \"the summary input stayed over the provider's context limit\",\n\t\"summarization-empty-summary\": \"the provider returned no summary text\",\n};\n\n/**\n * What the user is told when a required compaction recovered through the\n * deterministic checkpoint. States the outcome plainly and never carries the\n * internal retry-suppression marker.\n */\nexport function formatRequiredCompactionFallbackNotice(\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tcause?: unknown,\n): string {\n\tconst detail = cause instanceof Error ? stripTurnRetrySuppressionPrefix(cause.message).trim() : \"\";\n\treturn [\n\t\t`Compaction could not complete a provider summary: ${FALLBACK_FAILURE_CAUSE[failureKind]}.`,\n\t\t\"A deterministic checkpoint was applied and older transcript detail was dropped, so it is safe to continue.\",\n\t\tdetail ? `Provider reported: ${capUtf8Bytes(detail, 512)}.` : \"\",\n\t\t\"Run /compact on a different model for a richer summary.\",\n\t]\n\t\t.filter((part) => part.length > 0)\n\t\t.join(\" \");\n}\n\nexport function createRequiredCompactionFallback(\n\tpreparation: CompactionPreparation,\n\tcontextWindow: number,\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tmetadata: RecoveryMetadata,\n\tbranchEntries: SessionEntry[] = [],\n\tdiagnostics?: DeterministicFallbackDiagnostic,\n): CompactionResult<DeterministicFallbackDetails> | undefined {\n\tconst reserveTokens = resolveEffectiveReserveTokens(contextWindow, preparation.settings);\n\tconst budget = contextWindow - reserveTokens;\n\tconst preparedBoundaryIndex = branchEntries.findIndex((entry) => entry.id === preparation.firstKeptEntryId);\n\tif (!preparation.firstKeptEntryId || preparedBoundaryIndex === -1) {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"missing-preparation-boundary\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconst marker = [\n\t\t\"[Deterministic compaction recovery checkpoint]\",\n\t\t\"Generated summarization did not complete, so older context was reduced without another provider request.\",\n\t\t\"Continue from the retained messages after this checkpoint. Treat omitted transcript details as unknown.\",\n\t].join(\"\\n\");\n\tconst taskIntent = metadata.taskIntent?.trim();\n\tconst fixedText = taskIntent ? `${marker}\\n\\nTask intent:\\n${taskIntent}` : marker;\n\tconst maxSummaryBytes = Math.max(1_024, Math.floor(contextWindow * 0.4));\n\tconst previousSummary = preparation.previousSummary?.trim();\n\tlet summary = fixedText;\n\tif (previousSummary) {\n\t\tconst availableBytes = Math.max(0, maxSummaryBytes - Buffer.byteLength(`${fixedText}\\n\\nPrevious checkpoint:\\n`));\n\t\tconst truncationMarker = \"\\n[Older checkpoint truncated]\";\n\t\tconst boundedPrevious =\n\t\t\tBuffer.byteLength(previousSummary) <= availableBytes\n\t\t\t\t? previousSummary\n\t\t\t\t: `${capUtf8Bytes(previousSummary, Math.max(0, availableBytes - Buffer.byteLength(truncationMarker)))}${truncationMarker}`;\n\t\tsummary = `${fixedText}\\n\\nPrevious checkpoint:\\n${boundedPrevious}`;\n\t}\n\n\tconst baseDetails: DeterministicFallbackDetails = {\n\t\tschema: \"senpi.compaction.deterministic-fallback.v1\",\n\t\torigin: \"required-compaction-recovery\",\n\t\tfailureKind,\n\t\t...(taskIntent ? { taskIntent } : {}),\n\t};\n\tlet candidateCount = 0;\n\n\tconst syntheticCompaction: CompactionEntry = {\n\t\ttype: \"compaction\",\n\t\tid: \"__senpi_deterministic_fallback_preview__\",\n\t\tparentId: branchEntries.at(-1)?.id ?? null,\n\t\ttimestamp: new Date(0).toISOString(),\n\t\tsummary,\n\t\tfirstKeptEntryId: branchEntries[0]?.id ?? preparation.firstKeptEntryId,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\tdetails: { ...baseDetails, retainedSuffix: \"prepared\" },\n\t\tfromHook: true,\n\t};\n\n\tlet projectedMessages: ReturnType<typeof filterContextExcludedMessages>;\n\ttry {\n\t\tprojectedMessages = filterContextExcludedMessages(\n\t\t\tbuildSessionContext([...branchEntries, syntheticCompaction]).messages,\n\t\t);\n\t} catch {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"context-reconstruction-failed\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t// Evaluate the candidate the provider would actually receive: `convertToLlm`\n\t// drops failed/aborted assistant turns (and their orphaned tool results) before\n\t// every request, so their dangling toolCall blocks are neither incomplete calls\n\t// nor retained tokens here. Raw session history stays untouched - this mask is\n\t// local to the fallback projection (code-yeongyu/oh-my-openagent#7921).\n\tconst droppedByFailedTurnNormalization = markFailedTurnFragments(projectedMessages);\n\n\tconst messageIndexesByEntryId = new Map<string, number>();\n\tfor (const [index, message] of projectedMessages.entries()) {\n\t\tconst entryId = getSessionContextEntryId(message);\n\t\tif (entryId !== undefined) messageIndexesByEntryId.set(entryId, index);\n\t}\n\tconst summaryIndex = messageIndexesByEntryId.get(syntheticCompaction.id);\n\tconst unsafeSuffix = new Array(projectedMessages.length + 1).fill(false);\n\tconst unsafeIndexSuffix = new Int32Array(projectedMessages.length + 1).fill(-1);\n\tconst tokenSuffix = new Array(projectedMessages.length + 1).fill(0);\n\tconst toolCalls = new Map<string, { indexes: number[]; newestIncomplete: boolean }>();\n\tconst toolResults = new Map<string, number[]>();\n\tfor (let index = projectedMessages.length - 1; index >= 0; index--) {\n\t\tconst message = projectedMessages[index];\n\t\ttokenSuffix[index] = tokenSuffix[index + 1];\n\t\tunsafeIndexSuffix[index] = unsafeIndexSuffix[index + 1];\n\t\tif (droppedByFailedTurnNormalization[index]) {\n\t\t\tunsafeSuffix[index] = unsafeSuffix[index + 1];\n\t\t\tcontinue;\n\t\t}\n\t\tlet messageUnsafe = false;\n\t\tlet serialized: string | undefined;\n\t\ttry {\n\t\t\tmessageUnsafe = hasUnsafeRetainedContent([message]);\n\t\t\tconst bounded = isSafeBoundedValue(message);\n\t\t\tmessageUnsafe ||= !bounded;\n\t\t\tlet imageTokens = 0;\n\t\t\tif (!messageUnsafe && message.role === \"toolResult\") {\n\t\t\t\tconst content = message.content.map((block) => {\n\t\t\t\t\tif (block.type !== \"image\") return block;\n\t\t\t\t\timageTokens += estimateTokens({ ...message, content: [block] });\n\t\t\t\t\treturn { ...block, data: \"\" };\n\t\t\t\t});\n\t\t\t\tserialized = JSON.stringify({ ...message, content });\n\t\t\t} else {\n\t\t\t\tserialized = bounded ? JSON.stringify(message) : undefined;\n\t\t\t}\n\t\t\t// Apply the shared weighted chars/4 estimator to the envelope too.\n\t\t\t// Storage bytes are not tokens; opaque text and image costs still count.\n\t\t\ttokenSuffix[index] +=\n\t\t\t\tserialized === undefined\n\t\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t\t: Math.max(\n\t\t\t\t\t\t\testimateTokens(message),\n\t\t\t\t\t\t\testimateTokens({ role: \"user\", content: serialized, timestamp: 0 }) + imageTokens,\n\t\t\t\t\t\t);\n\t\t} catch {\n\t\t\tmessageUnsafe = true;\n\t\t\ttokenSuffix[index] = Number.POSITIVE_INFINITY;\n\t\t}\n\t\tunsafeSuffix[index] = unsafeSuffix[index + 1] || messageUnsafe;\n\t\tif (messageUnsafe) unsafeIndexSuffix[index] = index;\n\t\tif (!isRecord(message)) continue;\n\t\tif (message.role === \"toolResult\" && typeof message.toolCallId === \"string\") {\n\t\t\tconst indexes = toolResults.get(message.toolCallId) ?? [];\n\t\t\tindexes.push(index);\n\t\t\ttoolResults.set(message.toolCallId, indexes);\n\t\t} else if (message.role === \"assistant\" && Array.isArray(message.content)) {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (!isRecord(block) || block.type !== \"toolCall\" || typeof block.id !== \"string\") continue;\n\t\t\t\tconst call = toolCalls.get(block.id) ?? { indexes: [], newestIncomplete: block.incomplete === true };\n\t\t\t\tcall.indexes.push(index);\n\t\t\t\ttoolCalls.set(block.id, call);\n\t\t\t}\n\t\t}\n\t}\n\tconst invalidToolChainDiff = new Int32Array(projectedMessages.length + 2);\n\tconst markInvalidRange = (start: number, endExclusive: number) => {\n\t\tconst boundedStart = Math.max(0, start);\n\t\tconst boundedEnd = Math.min(projectedMessages.length + 1, endExclusive);\n\t\tif (boundedStart >= boundedEnd) return;\n\t\tinvalidToolChainDiff[boundedStart]++;\n\t\tinvalidToolChainDiff[boundedEnd]--;\n\t};\n\tfor (const [id, call] of toolCalls) {\n\t\tconst results = toolResults.get(id) ?? [];\n\t\tif (results.length === 0) {\n\t\t\tmarkInvalidRange(0, Math.max(call.indexes[0] ?? -1, results[0] ?? -1) + 1);\n\t\t\tcontinue;\n\t\t}\n\t\tconst callIndex = call.indexes[0];\n\t\tconst resultIndex = results[0];\n\t\t// Indexes are newest-first. Older duplicate IDs matter only while retained;\n\t\t// dropping an entire historical pair leaves the newest pair valid.\n\t\tmarkInvalidRange(0, Math.max(call.indexes[1] ?? -1, results[1] ?? -1) + 1);\n\t\tif (call.newestIncomplete || callIndex >= resultIndex) {\n\t\t\tmarkInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t\t} else {\n\t\t\tmarkInvalidRange(callIndex + 1, resultIndex + 1);\n\t\t}\n\t}\n\tfor (const [id, results] of toolResults) {\n\t\tif (toolCalls.has(id)) continue;\n\t\tmarkInvalidRange(0, results[0] + 1);\n\t}\n\tconst toolChainValidAt = new Array(projectedMessages.length + 1).fill(true);\n\tlet invalidToolChainCount = 0;\n\tfor (let index = 0; index < toolChainValidAt.length; index++) {\n\t\tinvalidToolChainCount += invalidToolChainDiff[index];\n\t\ttoolChainValidAt[index] = invalidToolChainCount === 0;\n\t}\n\n\tconst projectCandidate = (\n\t\tfirstKeptEntryId: string,\n\t\tretainedSuffix: NonNullable<DeterministicFallbackDetails[\"retainedSuffix\"]>,\n\t): CompactionResult<DeterministicFallbackDetails> | undefined => {\n\t\tcandidateCount++;\n\t\tconst details = { ...baseDetails, retainedSuffix };\n\t\tconst reject = (\n\t\t\trejectionReason: DeterministicFallbackRejectionReason,\n\t\t\tdetail: Omit<\n\t\t\t\tNonNullable<DeterministicFallbackDiagnostic[\"candidateRejections\"]>[number],\n\t\t\t\t\"firstKeptEntryId\" | \"rejectionReason\"\n\t\t\t> = {},\n\t\t): undefined => {\n\t\t\tif (diagnostics) {\n\t\t\t\tdiagnostics.rejectionReason = rejectionReason;\n\t\t\t\tdiagnostics.contextWindow = contextWindow;\n\t\t\t\tdiagnostics.reserveTokens = reserveTokens;\n\t\t\t\tdiagnostics.budgetTokens = budget;\n\t\t\t\tdiagnostics.candidateRejections ??= [];\n\t\t\t\tdiagnostics.candidateRejections.push({ firstKeptEntryId, rejectionReason, ...detail });\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\t\tconst result: CompactionResult<DeterministicFallbackDetails> = {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\tdetails,\n\t\t};\n\t\tconst startIndex = messageIndexesByEntryId.get(firstKeptEntryId);\n\t\tif (startIndex === undefined) return reject(\"context-reconstruction-failed\");\n\t\tconst retainedStart = Math.min(startIndex, projectedMessages.length);\n\t\tif (unsafeSuffix[retainedStart]) {\n\t\t\tconst unsafeMessageIndex = unsafeIndexSuffix[retainedStart];\n\t\t\tconst unsafeMessage = projectedMessages[unsafeMessageIndex];\n\t\t\treturn reject(\"unsafe-retained-content\", {\n\t\t\t\tunsafeMessageIndex,\n\t\t\t\tunsafeEntryId: getSessionContextEntryId(unsafeMessage),\n\t\t\t\tunsafeMessageRole: unsafeMessage.role,\n\t\t\t});\n\t\t}\n\t\tif (!toolChainValidAt[retainedStart]) return reject(\"atomic-tool-chain-cut\");\n\t\t// The hard-limit valve reserves the scaled budget, so accepting against the raw\n\t\t// configured reserve would admit a context that valve immediately compacts again.\n\t\tconst summaryTokens =\n\t\t\tsummaryIndex === undefined\n\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t: Math.max(\n\t\t\t\t\t\testimateTokens(projectedMessages[summaryIndex]),\n\t\t\t\t\t\testimateTokens({\n\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\tcontent: JSON.stringify(projectedMessages[summaryIndex]),\n\t\t\t\t\t\t\ttimestamp: 0,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\tconst retainedTokens = (tokenSuffix[retainedStart] ?? Number.POSITIVE_INFINITY) + summaryTokens;\n\t\tif (retainedTokens > budget) {\n\t\t\tif (diagnostics) diagnostics.budgetExceeded = true;\n\t\t\treturn reject(\"retained-token-budget-exceeded\", { estimatedTokens: retainedTokens });\n\t\t}\n\t\treturn { ...result, estimatedTokensAfter: retainedTokens };\n\t};\n\n\t// 1. Try prepared boundary\n\tconst prepared = projectCandidate(preparation.firstKeptEntryId, \"prepared\");\n\tif (prepared) {\n\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\treturn prepared;\n\t}\n\n\t// 2. If prepared boundary cut an atomic signed chain or was rejected, walk backward\n\t// to the actual chain boundary. The chain length is determined by the session.\n\tfor (let index = preparedBoundaryIndex - 1; index >= 0; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (entry.type === \"compaction\") break;\n\t\t// Only consider message turn starts or assistant call starts\n\t\tconst earlier = projectCandidate(entry.id, \"earlier-safe-boundary\");\n\t\tif (earlier) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn earlier;\n\t\t}\n\t}\n\n\t// 3. Try latest meaningful user turn\n\tfor (let index = branchEntries.length - 1; index > preparedBoundaryIndex; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (!hasMeaningfulUserText(entry)) continue;\n\t\tconst latestUser = projectCandidate(entry.id, \"latest-user-turn\");\n\t\tif (latestUser) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn latestUser;\n\t\t}\n\t\t// A steering user message can occur inside a tool chain. Keep that request\n\t\t// and walk back to its declaring assistant instead of orphaning the result.\n\t\tfor (let earlierIndex = index - 1; earlierIndex > preparedBoundaryIndex; earlierIndex--) {\n\t\t\tconst earlierEntry = branchEntries[earlierIndex];\n\t\t\tif (earlierEntry.type === \"compaction\") break;\n\t\t\tconst earlier = projectCandidate(earlierEntry.id, \"earlier-safe-boundary\");\n\t\t\tif (earlier) {\n\t\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\t\treturn earlier;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\treturn undefined;\n}\n"]}
1
+ {"version":3,"file":"deterministic-fallback.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["import { stripTurnRetrySuppressionPrefix } from \"@earendil-works/pi-ai\";\nimport { type CompactionPreparation, type CompactionResult, estimateTokens } from \"../../../compaction/index.ts\";\nimport {\n\tStreamDurationBudgetError,\n\tStreamIdleTimeoutError,\n\tSummarizationTotalBudgetError,\n} from \"../../../compaction/stream-watchdog.ts\";\nimport { CredentialFailoverError, TURN_RETRY_SUPPRESSION_PREFIX } from \"../../../credential-pool/failover.ts\";\nimport { filterContextExcludedMessages } from \"../../../messages.ts\";\nimport {\n\tbuildSessionContext,\n\ttype CompactionEntry,\n\tgetSessionContextEntryId,\n\ttype SessionEntry,\n} from \"../../../session-manager.ts\";\nimport { markFailedTurnFragments } from \"./fallback-failed-turn-normalization.ts\";\nimport { SummarizationOverflowExhaustedError } from \"./overflow-retry.ts\";\nimport { resolveEffectiveReserveTokens } from \"./policy.ts\";\nimport { hasUnsafeRetainedContent } from \"./retained-message-safety.ts\";\nimport { SummaryGenerationError, SummaryRequestError } from \"./speculative.ts\";\nimport { capUtf8Bytes } from \"./task-intent.ts\";\n\nexport type RequiredCompactionFallbackFailure =\n\t| \"summarization-timeout\"\n\t| \"summarization-provider-failure\"\n\t| \"upstream-stream-truncated\"\n\t| \"summarization-overflow-exhausted\"\n\t| \"summarization-empty-summary\";\n\ninterface RecoveryMetadata {\n\ttaskIntent?: string;\n\ttodoSnapshot?: unknown;\n\tcheckpoint?: unknown;\n}\n\nexport type DeterministicFallbackRejectionReason =\n\t| \"missing-preparation-boundary\"\n\t| \"unsafe-retained-content\"\n\t| \"retained-token-budget-exceeded\"\n\t| \"atomic-tool-chain-cut\"\n\t| \"context-reconstruction-failed\";\n\ninterface DeterministicFallbackDetails {\n\tschema: \"senpi.compaction.deterministic-fallback.v1\";\n\torigin: \"required-compaction-recovery\";\n\tfailureKind: RequiredCompactionFallbackFailure;\n\ttaskIntent?: string;\n\tretainedSuffix?: \"prepared\" | \"latest-user-turn\" | \"earlier-safe-boundary\";\n}\n\nexport interface DeterministicFallbackDiagnostic {\n\trejectionReason?: DeterministicFallbackRejectionReason;\n\tcandidateRejections?: Array<{\n\t\tfirstKeptEntryId: string;\n\t\trejectionReason: DeterministicFallbackRejectionReason;\n\t\testimatedTokens?: number;\n\t\tunsafeMessageIndex?: number;\n\t\tunsafeEntryId?: string;\n\t\tunsafeMessageRole?: string;\n\t}>;\n\tcandidatesChecked?: number;\n\tbudgetExceeded?: boolean;\n\tcontextWindow?: number;\n\treserveTokens?: number;\n\tbudgetTokens?: number;\n}\n\nexport function formatRequiredCompactionFallbackRejection(diagnostics: DeterministicFallbackDiagnostic): string {\n\tconst candidate = diagnostics.candidateRejections?.at(-1);\n\tconst reason = diagnostics.rejectionReason ?? \"context-reconstruction-failed\";\n\tconst recovery: Record<DeterministicFallbackRejectionReason, string> = {\n\t\t\"retained-token-budget-exceeded\":\n\t\t\t\"The retained turn exceeds the usable context. Select a model with a larger context and run /compact, or start a new session with an explicit checkpoint.\",\n\t\t\"atomic-tool-chain-cut\":\n\t\t\t\"The retained tool calls and results do not form complete pairs. Finish the pending tool operation before /compact; if the transcript is damaged, start a new session with an explicit checkpoint.\",\n\t\t\"unsafe-retained-content\":\n\t\t\t\"The retained message cannot be replayed safely. Inspect the identified entry; start a new session with an explicit checkpoint if it cannot be repaired.\",\n\t\t\"missing-preparation-boundary\":\n\t\t\t\"The prepared boundary is absent from the branch. Reload the session and run /compact.\",\n\t\t\"context-reconstruction-failed\":\n\t\t\t\"The retained context could not be reconstructed. Reload the session and run /compact.\",\n\t};\n\tconst diagnostic = {\n\t\trejectionReason: reason,\n\t\tcontextWindow: diagnostics.contextWindow,\n\t\treserveTokens: diagnostics.reserveTokens,\n\t\tbudgetTokens: diagnostics.budgetTokens,\n\t\tbudgetExceeded: diagnostics.budgetExceeded ?? false,\n\t\tcandidatesChecked: diagnostics.candidatesChecked ?? 0,\n\t\t...(candidate\n\t\t\t? {\n\t\t\t\t\tcandidate: {\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\tfirstKeptEntryId: capUtf8Bytes(candidate.firstKeptEntryId, 128),\n\t\t\t\t\t\t...(candidate.unsafeEntryId ? { unsafeEntryId: capUtf8Bytes(candidate.unsafeEntryId, 128) } : {}),\n\t\t\t\t\t\t...(candidate.unsafeMessageRole\n\t\t\t\t\t\t\t? { unsafeMessageRole: capUtf8Bytes(candidate.unsafeMessageRole, 32) }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\treturn `deterministic compaction fallback could not retain a safe suffix\\n${JSON.stringify(diagnostic)}\\n${recovery[reason]} The original transcript has not been changed.`;\n}\n\nconst NON_VISIBLE_USER_TEXT = /[\\p{White_Space}\\p{Default_Ignorable_Code_Point}]/gu;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction hasMeaningfulUserText(entry: SessionEntry): boolean {\n\tif (entry.type !== \"message\" || !isRecord(entry.message) || entry.message.role !== \"user\") return false;\n\tconst content = entry.message.content;\n\tconst hasVisibleText = (text: unknown): boolean =>\n\t\ttypeof text === \"string\" && text.normalize(\"NFKC\").replace(NON_VISIBLE_USER_TEXT, \"\").length > 0;\n\tif (typeof content === \"string\") return hasVisibleText(content);\n\tif (!Array.isArray(content)) return false;\n\treturn content.some((block) => isRecord(block) && block.type === \"text\" && hasVisibleText(block.text));\n}\n\n/**\n * Bound a value graph that came from persisted, potentially hostile session data.\n * Returns false when the graph contains anything we must not read (accessors,\n * non-plain prototypes, cycles, functions, symbols) so callers fail closed\n * instead of executing persisted code or walking unbounded structures.\n */\nfunction isSafeBoundedValue(value: unknown, seen = new Set<object>(), depth = 0): boolean {\n\tif (depth > 32) return false;\n\tif (value === null || value === undefined) return true;\n\tconst kind = typeof value;\n\tif (kind === \"string\" || kind === \"number\" || kind === \"boolean\") return true;\n\tif (kind !== \"object\") return false;\n\tif (seen.has(value as object)) return false;\n\tseen.add(value as object);\n\tif (Array.isArray(value)) {\n\t\tfor (const item of value) if (!isSafeBoundedValue(item, seen, depth + 1)) return false;\n\t\treturn true;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return false;\n\tfor (const descriptor of Object.values(Object.getOwnPropertyDescriptors(value))) {\n\t\tif (descriptor.get !== undefined || descriptor.set !== undefined) return false;\n\t\tif (typeof descriptor.value === \"function\" || typeof descriptor.value === \"symbol\") return false;\n\t\tif (!isSafeBoundedValue(descriptor.value, seen, depth + 1)) return false;\n\t}\n\treturn true;\n}\n\n/**\n * A provider or credential fault that ended the summary stream with no usable\n * summary and no cheaper recovery left.\n *\n * Credential rotation rethrows EVERY terminal outcome as `CredentialFailoverError`,\n * and once any event past `start` reached the caller it prepends the\n * `senpi:no-turn-retry:` marker so the session layer never replays a partially\n * delivered turn. That marker also disables session retry and model fallback, so\n * before #1741 such an error left required compaction with no recovery at all:\n * it applied no summary, authorized no fallback, and repeated identically on the\n * next prompt because the context stayed above the threshold. Single-key\n * providers have no rotation wrapper and surface the same outage as a\n * non-transient `SummaryRequestError`, so the authorization keys on the outcome\n * (\"the summary stream is dead\") rather than on the marker alone.\n *\n * Deliberately NOT authorized: user aborts (they resolve `undefined` upstream),\n * policy refusals (reducing context would not make the model comply), missing\n * credentials (a configuration fault with an actionable message), and ordinary\n * bugs - destructive context reduction must never be a bug's recovery path.\n */\nfunction isTerminalSummarizationProviderFailure(error: unknown): boolean {\n\tif (error instanceof CredentialFailoverError) return true;\n\tif (error instanceof Error && error.message.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)) return true;\n\treturn error instanceof SummaryRequestError && !error.transient && !error.refused && error.failureKind === undefined;\n}\n\nexport function classifyRequiredCompactionFallbackFailure(\n\terror: unknown,\n): RequiredCompactionFallbackFailure | undefined {\n\tif (\n\t\terror instanceof StreamDurationBudgetError ||\n\t\terror instanceof StreamIdleTimeoutError ||\n\t\terror instanceof SummarizationTotalBudgetError\n\t) {\n\t\treturn \"summarization-timeout\";\n\t}\n\tif (error instanceof SummaryRequestError && error.transient && error.failureKind === \"upstream-stream-truncated\") {\n\t\treturn \"upstream-stream-truncated\";\n\t}\n\tif (error instanceof SummarizationOverflowExhaustedError) {\n\t\treturn \"summarization-overflow-exhausted\";\n\t}\n\tif (error instanceof SummaryGenerationError && error.kind === \"empty-summary\") {\n\t\treturn \"summarization-empty-summary\";\n\t}\n\tif (isTerminalSummarizationProviderFailure(error)) {\n\t\treturn \"summarization-provider-failure\";\n\t}\n\treturn undefined;\n}\n\nexport { stripTurnRetrySuppressionPrefix };\n\nconst FALLBACK_FAILURE_CAUSE: Record<RequiredCompactionFallbackFailure, string> = {\n\t\"summarization-timeout\": \"the summary stream ran out of its time budget\",\n\t\"summarization-provider-failure\": \"the provider ended the summary stream with an error\",\n\t\"upstream-stream-truncated\": \"the provider truncated the summary stream\",\n\t\"summarization-overflow-exhausted\": \"the summary input stayed over the provider's context limit\",\n\t\"summarization-empty-summary\": \"the provider returned no summary text\",\n};\n\n/**\n * What the user is told when a required compaction recovered through the\n * deterministic checkpoint. States the outcome plainly and never carries the\n * internal retry-suppression marker.\n */\nexport function formatRequiredCompactionFallbackNotice(\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tcause?: unknown,\n): string {\n\tconst detail = cause instanceof Error ? stripTurnRetrySuppressionPrefix(cause.message).trim() : \"\";\n\treturn [\n\t\t`Compaction could not complete a provider summary: ${FALLBACK_FAILURE_CAUSE[failureKind]}.`,\n\t\t\"A deterministic checkpoint was applied and older transcript detail was dropped, so it is safe to continue.\",\n\t\tdetail ? `Provider reported: ${capUtf8Bytes(detail, 512)}.` : \"\",\n\t\t\"Run /compact on a different model for a richer summary.\",\n\t]\n\t\t.filter((part) => part.length > 0)\n\t\t.join(\" \");\n}\n\nexport function createRequiredCompactionFallback(\n\tpreparation: CompactionPreparation,\n\tcontextWindow: number,\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tmetadata: RecoveryMetadata,\n\tbranchEntries: SessionEntry[] = [],\n\tdiagnostics?: DeterministicFallbackDiagnostic,\n): CompactionResult<DeterministicFallbackDetails> | undefined {\n\tconst reserveTokens = resolveEffectiveReserveTokens(contextWindow, preparation.settings);\n\tconst budget = contextWindow - reserveTokens;\n\tconst preparedBoundaryIndex = branchEntries.findIndex((entry) => entry.id === preparation.firstKeptEntryId);\n\tif (!preparation.firstKeptEntryId || preparedBoundaryIndex === -1) {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"missing-preparation-boundary\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconst marker = [\n\t\t\"[Deterministic compaction recovery checkpoint]\",\n\t\t\"Generated summarization did not complete, so older context was reduced without another provider request.\",\n\t\t\"Continue from the retained messages after this checkpoint. Treat omitted transcript details as unknown.\",\n\t].join(\"\\n\");\n\tconst taskIntent = metadata.taskIntent?.trim();\n\tconst fixedText = taskIntent ? `${marker}\\n\\nTask intent:\\n${taskIntent}` : marker;\n\tconst maxSummaryBytes = Math.max(1_024, Math.floor(contextWindow * 0.4));\n\tconst previousSummary = preparation.previousSummary?.trim();\n\tlet summary = fixedText;\n\tif (previousSummary) {\n\t\tconst availableBytes = Math.max(0, maxSummaryBytes - Buffer.byteLength(`${fixedText}\\n\\nPrevious checkpoint:\\n`));\n\t\tconst truncationMarker = \"\\n[Older checkpoint truncated]\";\n\t\tconst boundedPrevious =\n\t\t\tBuffer.byteLength(previousSummary) <= availableBytes\n\t\t\t\t? previousSummary\n\t\t\t\t: `${capUtf8Bytes(previousSummary, Math.max(0, availableBytes - Buffer.byteLength(truncationMarker)))}${truncationMarker}`;\n\t\tsummary = `${fixedText}\\n\\nPrevious checkpoint:\\n${boundedPrevious}`;\n\t}\n\n\tconst baseDetails: DeterministicFallbackDetails = {\n\t\tschema: \"senpi.compaction.deterministic-fallback.v1\",\n\t\torigin: \"required-compaction-recovery\",\n\t\tfailureKind,\n\t\t...(taskIntent ? { taskIntent } : {}),\n\t};\n\tlet candidateCount = 0;\n\n\tconst syntheticCompaction: CompactionEntry = {\n\t\ttype: \"compaction\",\n\t\tid: \"__senpi_deterministic_fallback_preview__\",\n\t\tparentId: branchEntries.at(-1)?.id ?? null,\n\t\ttimestamp: new Date(0).toISOString(),\n\t\tsummary,\n\t\tfirstKeptEntryId: branchEntries[0]?.id ?? preparation.firstKeptEntryId,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\tdetails: { ...baseDetails, retainedSuffix: \"prepared\" },\n\t\tfromHook: true,\n\t};\n\n\tlet projectedMessages: ReturnType<typeof filterContextExcludedMessages>;\n\ttry {\n\t\tprojectedMessages = filterContextExcludedMessages(\n\t\t\tbuildSessionContext([...branchEntries, syntheticCompaction]).messages,\n\t\t);\n\t} catch {\n\t\tif (diagnostics) {\n\t\t\tObject.assign(diagnostics, {\n\t\t\t\trejectionReason: \"context-reconstruction-failed\",\n\t\t\t\tcontextWindow,\n\t\t\t\treserveTokens,\n\t\t\t\tbudgetTokens: budget,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t// Evaluate the candidate the provider would actually receive: `convertToLlm`\n\t// drops failed/aborted assistant turns (and their orphaned tool results) before\n\t// every request, so their dangling toolCall blocks are neither incomplete calls\n\t// nor retained tokens here. Raw session history stays untouched - this mask is\n\t// local to the fallback projection (code-yeongyu/oh-my-openagent#7921).\n\tconst droppedByFailedTurnNormalization = markFailedTurnFragments(projectedMessages);\n\n\tconst messageIndexesByEntryId = new Map<string, number>();\n\tfor (const [index, message] of projectedMessages.entries()) {\n\t\tconst entryId = getSessionContextEntryId(message);\n\t\tif (entryId !== undefined) messageIndexesByEntryId.set(entryId, index);\n\t}\n\tconst summaryIndex = messageIndexesByEntryId.get(syntheticCompaction.id);\n\tconst unsafeSuffix = new Array(projectedMessages.length + 1).fill(false);\n\tconst unsafeIndexSuffix = new Int32Array(projectedMessages.length + 1).fill(-1);\n\tconst tokenSuffix = new Array(projectedMessages.length + 1).fill(0);\n\tconst toolCalls = new Map<string, { indexes: number[]; newestIncomplete: boolean }>();\n\tconst toolResults = new Map<string, number[]>();\n\tfor (let index = projectedMessages.length - 1; index >= 0; index--) {\n\t\tconst message = projectedMessages[index];\n\t\ttokenSuffix[index] = tokenSuffix[index + 1];\n\t\tunsafeIndexSuffix[index] = unsafeIndexSuffix[index + 1];\n\t\tif (droppedByFailedTurnNormalization[index]) {\n\t\t\tunsafeSuffix[index] = unsafeSuffix[index + 1];\n\t\t\tcontinue;\n\t\t}\n\t\tlet messageUnsafe = false;\n\t\tlet serialized: string | undefined;\n\t\ttry {\n\t\t\tmessageUnsafe = hasUnsafeRetainedContent([message]);\n\t\t\tconst bounded = isSafeBoundedValue(message);\n\t\t\tmessageUnsafe ||= !bounded;\n\t\t\tlet imageTokens = 0;\n\t\t\tif (!messageUnsafe && message.role === \"toolResult\") {\n\t\t\t\tconst content = message.content.map((block) => {\n\t\t\t\t\tif (block.type !== \"image\") return block;\n\t\t\t\t\timageTokens += estimateTokens({ ...message, content: [block] });\n\t\t\t\t\treturn { ...block, data: \"\" };\n\t\t\t\t});\n\t\t\t\tserialized = JSON.stringify({ ...message, content });\n\t\t\t} else {\n\t\t\t\tserialized = bounded ? JSON.stringify(message) : undefined;\n\t\t\t}\n\t\t\t// Apply the shared weighted chars/4 estimator to the envelope too.\n\t\t\t// Storage bytes are not tokens; opaque text and image costs still count.\n\t\t\ttokenSuffix[index] +=\n\t\t\t\tserialized === undefined\n\t\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t\t: Math.max(\n\t\t\t\t\t\t\testimateTokens(message),\n\t\t\t\t\t\t\testimateTokens({ role: \"user\", content: serialized, timestamp: 0 }) + imageTokens,\n\t\t\t\t\t\t);\n\t\t} catch {\n\t\t\tmessageUnsafe = true;\n\t\t\ttokenSuffix[index] = Number.POSITIVE_INFINITY;\n\t\t}\n\t\tunsafeSuffix[index] = unsafeSuffix[index + 1] || messageUnsafe;\n\t\tif (messageUnsafe) unsafeIndexSuffix[index] = index;\n\t\tif (!isRecord(message)) continue;\n\t\tif (message.role === \"toolResult\" && typeof message.toolCallId === \"string\") {\n\t\t\tconst indexes = toolResults.get(message.toolCallId) ?? [];\n\t\t\tindexes.push(index);\n\t\t\ttoolResults.set(message.toolCallId, indexes);\n\t\t} else if (message.role === \"assistant\" && Array.isArray(message.content)) {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (!isRecord(block) || block.type !== \"toolCall\" || typeof block.id !== \"string\") continue;\n\t\t\t\tconst call = toolCalls.get(block.id) ?? { indexes: [], newestIncomplete: block.incomplete === true };\n\t\t\t\tcall.indexes.push(index);\n\t\t\t\ttoolCalls.set(block.id, call);\n\t\t\t}\n\t\t}\n\t}\n\tconst invalidToolChainDiff = new Int32Array(projectedMessages.length + 2);\n\tconst markInvalidRange = (start: number, endExclusive: number) => {\n\t\tconst boundedStart = Math.max(0, start);\n\t\tconst boundedEnd = Math.min(projectedMessages.length + 1, endExclusive);\n\t\tif (boundedStart >= boundedEnd) return;\n\t\tinvalidToolChainDiff[boundedStart]++;\n\t\tinvalidToolChainDiff[boundedEnd]--;\n\t};\n\tfor (const [id, call] of toolCalls) {\n\t\tconst results = toolResults.get(id) ?? [];\n\t\tif (results.length === 0) {\n\t\t\tmarkInvalidRange(0, Math.max(call.indexes[0] ?? -1, results[0] ?? -1) + 1);\n\t\t\tcontinue;\n\t\t}\n\t\tconst callIndex = call.indexes[0];\n\t\tconst resultIndex = results[0];\n\t\t// Indexes are newest-first. Older duplicate IDs matter only while retained;\n\t\t// dropping an entire historical pair leaves the newest pair valid.\n\t\tmarkInvalidRange(0, Math.max(call.indexes[1] ?? -1, results[1] ?? -1) + 1);\n\t\tif (call.newestIncomplete || callIndex >= resultIndex) {\n\t\t\tmarkInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t\t} else {\n\t\t\tmarkInvalidRange(callIndex + 1, resultIndex + 1);\n\t\t}\n\t}\n\tfor (const [id, results] of toolResults) {\n\t\tif (toolCalls.has(id)) continue;\n\t\tmarkInvalidRange(0, results[0] + 1);\n\t}\n\tconst toolChainValidAt = new Array(projectedMessages.length + 1).fill(true);\n\tlet invalidToolChainCount = 0;\n\tfor (let index = 0; index < toolChainValidAt.length; index++) {\n\t\tinvalidToolChainCount += invalidToolChainDiff[index];\n\t\ttoolChainValidAt[index] = invalidToolChainCount === 0;\n\t}\n\n\tconst projectCandidate = (\n\t\tfirstKeptEntryId: string,\n\t\tretainedSuffix: NonNullable<DeterministicFallbackDetails[\"retainedSuffix\"]>,\n\t): CompactionResult<DeterministicFallbackDetails> | undefined => {\n\t\tcandidateCount++;\n\t\tconst details = { ...baseDetails, retainedSuffix };\n\t\tconst reject = (\n\t\t\trejectionReason: DeterministicFallbackRejectionReason,\n\t\t\tdetail: Omit<\n\t\t\t\tNonNullable<DeterministicFallbackDiagnostic[\"candidateRejections\"]>[number],\n\t\t\t\t\"firstKeptEntryId\" | \"rejectionReason\"\n\t\t\t> = {},\n\t\t): undefined => {\n\t\t\tif (diagnostics) {\n\t\t\t\tdiagnostics.rejectionReason = rejectionReason;\n\t\t\t\tdiagnostics.contextWindow = contextWindow;\n\t\t\t\tdiagnostics.reserveTokens = reserveTokens;\n\t\t\t\tdiagnostics.budgetTokens = budget;\n\t\t\t\tdiagnostics.candidateRejections ??= [];\n\t\t\t\tdiagnostics.candidateRejections.push({ firstKeptEntryId, rejectionReason, ...detail });\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\t\tconst result: CompactionResult<DeterministicFallbackDetails> = {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\tdetails,\n\t\t};\n\t\tconst startIndex = messageIndexesByEntryId.get(firstKeptEntryId);\n\t\tif (startIndex === undefined) return reject(\"context-reconstruction-failed\");\n\t\tconst retainedStart = Math.min(startIndex, projectedMessages.length);\n\t\tif (unsafeSuffix[retainedStart]) {\n\t\t\tconst unsafeMessageIndex = unsafeIndexSuffix[retainedStart];\n\t\t\tconst unsafeMessage = projectedMessages[unsafeMessageIndex];\n\t\t\treturn reject(\"unsafe-retained-content\", {\n\t\t\t\tunsafeMessageIndex,\n\t\t\t\tunsafeEntryId: getSessionContextEntryId(unsafeMessage),\n\t\t\t\tunsafeMessageRole: unsafeMessage.role,\n\t\t\t});\n\t\t}\n\t\tif (!toolChainValidAt[retainedStart]) return reject(\"atomic-tool-chain-cut\");\n\t\t// The hard-limit valve reserves the scaled budget, so accepting against the raw\n\t\t// configured reserve would admit a context that valve immediately compacts again.\n\t\tconst summaryTokens =\n\t\t\tsummaryIndex === undefined\n\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t: Math.max(\n\t\t\t\t\t\testimateTokens(projectedMessages[summaryIndex]),\n\t\t\t\t\t\testimateTokens({\n\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\tcontent: JSON.stringify(projectedMessages[summaryIndex]),\n\t\t\t\t\t\t\ttimestamp: 0,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\tconst retainedTokens = (tokenSuffix[retainedStart] ?? Number.POSITIVE_INFINITY) + summaryTokens;\n\t\tif (retainedTokens > budget) {\n\t\t\tif (diagnostics) diagnostics.budgetExceeded = true;\n\t\t\treturn reject(\"retained-token-budget-exceeded\", { estimatedTokens: retainedTokens });\n\t\t}\n\t\treturn { ...result, estimatedTokensAfter: retainedTokens };\n\t};\n\n\t// 1. Try prepared boundary\n\tconst prepared = projectCandidate(preparation.firstKeptEntryId, \"prepared\");\n\tif (prepared) {\n\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\treturn prepared;\n\t}\n\n\t// 2. If prepared boundary cut an atomic signed chain or was rejected, walk backward\n\t// to the actual chain boundary. The chain length is determined by the session.\n\tfor (let index = preparedBoundaryIndex - 1; index >= 0; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (entry.type === \"compaction\") break;\n\t\t// Only consider message turn starts or assistant call starts\n\t\tconst earlier = projectCandidate(entry.id, \"earlier-safe-boundary\");\n\t\tif (earlier) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn earlier;\n\t\t}\n\t}\n\n\t// 3. Try latest meaningful user turn\n\tfor (let index = branchEntries.length - 1; index > preparedBoundaryIndex; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (!hasMeaningfulUserText(entry)) continue;\n\t\tconst latestUser = projectCandidate(entry.id, \"latest-user-turn\");\n\t\tif (latestUser) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn latestUser;\n\t\t}\n\t\t// A steering user message can occur inside a tool chain. Keep that request\n\t\t// and walk back to its declaring assistant instead of orphaning the result.\n\t\tfor (let earlierIndex = index - 1; earlierIndex > preparedBoundaryIndex; earlierIndex--) {\n\t\t\tconst earlierEntry = branchEntries[earlierIndex];\n\t\t\tif (earlierEntry.type === \"compaction\") break;\n\t\t\tconst earlier = projectCandidate(earlierEntry.id, \"earlier-safe-boundary\");\n\t\t\tif (earlier) {\n\t\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\t\treturn earlier;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\treturn undefined;\n}\n"]}
@@ -5,6 +5,5 @@ export interface McpToolNameEntry {
5
5
  export declare const MCP_TOOL_NAME_MAX_LENGTH = 64;
6
6
  type WarnFn = (message: string) => void;
7
7
  export declare function buildMcpToolNames(entries: readonly McpToolNameEntry[], warn?: WarnFn): string[];
8
- export declare function buildMcpToolName(entry: McpToolNameEntry): string;
9
8
  export {};
10
9
  //# sourceMappingURL=naming.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B/F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAEhE"}
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B/F"}
@@ -28,9 +28,6 @@ export function buildMcpToolNames(entries, warn) {
28
28
  }
29
29
  return names;
30
30
  }
31
- export function buildMcpToolName(entry) {
32
- return ellipsizeMiddle(buildBaseName(entry), MCP_TOOL_NAME_MAX_LENGTH);
33
- }
34
31
  function buildBaseName(entry) {
35
32
  return `mcp_${sanitizeNamePart(entry.serverName)}_${sanitizeNamePart(entry.toolName)}`;
36
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport interface McpToolNameEntry {\n\tserverName: string;\n\ttoolName: string;\n}\n\nexport const MCP_TOOL_NAME_MAX_LENGTH = 64;\n\ntype WarnFn = (message: string) => void;\n\nexport function buildMcpToolNames(entries: readonly McpToolNameEntry[], warn?: WarnFn): string[] {\n\tconst items = entries.map((entry, index) => ({\n\t\tbase: ellipsizeMiddle(buildBaseName(entry), MCP_TOOL_NAME_MAX_LENGTH),\n\t\tentry,\n\t\tindex,\n\t}));\n\tconst groups = new Map<string, typeof items>();\n\tfor (const item of items) {\n\t\tconst key = matcherKey(item.base);\n\t\tconst group = groups.get(key) ?? [];\n\t\tgroup.push(item);\n\t\tgroups.set(key, group);\n\t}\n\n\tconst names = items.map((item) => item.base);\n\tfor (const group of groups.values()) {\n\t\tif (group.length < 2) continue;\n\t\tconst [first] = group;\n\t\tif (!first) continue;\n\t\twarn?.(`MCP tool name collision after normalization for '${first.base}'; appended deterministic suffixes.`);\n\t\tfor (const item of group) {\n\t\t\tconst suffix = hashSuffix(item.entry);\n\t\t\tnames[item.index] = `${ellipsizeMiddle(item.base, MCP_TOOL_NAME_MAX_LENGTH - suffix.length)}${suffix}`;\n\t\t}\n\t}\n\treturn names;\n}\n\nexport function buildMcpToolName(entry: McpToolNameEntry): string {\n\treturn ellipsizeMiddle(buildBaseName(entry), MCP_TOOL_NAME_MAX_LENGTH);\n}\n\nfunction buildBaseName(entry: McpToolNameEntry): string {\n\treturn `mcp_${sanitizeNamePart(entry.serverName)}_${sanitizeNamePart(entry.toolName)}`;\n}\n\nfunction sanitizeNamePart(name: string): string {\n\treturn name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction matcherKey(name: string): string {\n\treturn name.replace(/-/g, \"_\");\n}\n\nfunction hashSuffix(entry: McpToolNameEntry): string {\n\treturn `_${createHash(\"sha1\").update(`${entry.serverName}\\0${entry.toolName}`).digest(\"hex\").slice(0, 4)}`;\n}\n\nfunction ellipsizeMiddle(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) return value;\n\tif (maxLength <= 3) return value.slice(0, maxLength);\n\tconst marker = \"...\";\n\tconst remaining = maxLength - marker.length;\n\tconst prefixLength = Math.ceil(remaining / 2);\n\tconst suffixLength = Math.floor(remaining / 2);\n\treturn `${value.slice(0, prefixLength)}${marker}${value.slice(value.length - suffixLength)}`;\n}\n"]}
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/naming.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport interface McpToolNameEntry {\n\tserverName: string;\n\ttoolName: string;\n}\n\nexport const MCP_TOOL_NAME_MAX_LENGTH = 64;\n\ntype WarnFn = (message: string) => void;\n\nexport function buildMcpToolNames(entries: readonly McpToolNameEntry[], warn?: WarnFn): string[] {\n\tconst items = entries.map((entry, index) => ({\n\t\tbase: ellipsizeMiddle(buildBaseName(entry), MCP_TOOL_NAME_MAX_LENGTH),\n\t\tentry,\n\t\tindex,\n\t}));\n\tconst groups = new Map<string, typeof items>();\n\tfor (const item of items) {\n\t\tconst key = matcherKey(item.base);\n\t\tconst group = groups.get(key) ?? [];\n\t\tgroup.push(item);\n\t\tgroups.set(key, group);\n\t}\n\n\tconst names = items.map((item) => item.base);\n\tfor (const group of groups.values()) {\n\t\tif (group.length < 2) continue;\n\t\tconst [first] = group;\n\t\tif (!first) continue;\n\t\twarn?.(`MCP tool name collision after normalization for '${first.base}'; appended deterministic suffixes.`);\n\t\tfor (const item of group) {\n\t\t\tconst suffix = hashSuffix(item.entry);\n\t\t\tnames[item.index] = `${ellipsizeMiddle(item.base, MCP_TOOL_NAME_MAX_LENGTH - suffix.length)}${suffix}`;\n\t\t}\n\t}\n\treturn names;\n}\n\nfunction buildBaseName(entry: McpToolNameEntry): string {\n\treturn `mcp_${sanitizeNamePart(entry.serverName)}_${sanitizeNamePart(entry.toolName)}`;\n}\n\nfunction sanitizeNamePart(name: string): string {\n\treturn name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction matcherKey(name: string): string {\n\treturn name.replace(/-/g, \"_\");\n}\n\nfunction hashSuffix(entry: McpToolNameEntry): string {\n\treturn `_${createHash(\"sha1\").update(`${entry.serverName}\\0${entry.toolName}`).digest(\"hex\").slice(0, 4)}`;\n}\n\nfunction ellipsizeMiddle(value: string, maxLength: number): string {\n\tif (value.length <= maxLength) return value;\n\tif (maxLength <= 3) return value.slice(0, maxLength);\n\tconst marker = \"...\";\n\tconst remaining = maxLength - marker.length;\n\tconst prefixLength = Math.ceil(remaining / 2);\n\tconst suffixLength = Math.floor(remaining / 2);\n\treturn `${value.slice(0, prefixLength)}${marker}${value.slice(value.length - suffixLength)}`;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { AgentToolResult } from "@earendil-works/pi-agent-core";
2
2
  import type { Progress } from "@modelcontextprotocol/sdk/types.js";
3
3
  import type { TSchema } from "typebox";
4
- import type { ExtensionAPI, ToolDefinition } from "../../../types.ts";
4
+ import type { ToolDefinition } from "../../../types.ts";
5
5
  import type { McpToolCatalogEntry } from "../catalog.ts";
6
6
  export interface McpToolDetails {
7
7
  server: string;
@@ -14,7 +14,6 @@ type WarnFn = (message: string) => void;
14
14
  export interface McpCatalogRegistrationOptions {
15
15
  readonly refreshActiveSetWhenEmpty?: boolean;
16
16
  }
17
- export declare function registerMcpCatalogTools(pi: Pick<ExtensionAPI, "getActiveTools" | "setActiveTools" | "registerTool">, entries: readonly McpToolCatalogEntry[], activeEntries: readonly McpToolCatalogEntry[], warn?: WarnFn, options?: McpCatalogRegistrationOptions): void;
18
17
  export interface McpNamedCatalogEntry {
19
18
  readonly entry: McpToolCatalogEntry;
20
19
  readonly name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAczD,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACpB;AAGD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;AAC7F,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAgB,uBAAuB,CACtC,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,CAAC,EAC5E,OAAO,EAAE,SAAS,mBAAmB,EAAE,EACvC,aAAa,EAAE,SAAS,mBAAmB,EAAE,EAC7C,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,GAAE,6BAAkC,GACzC,IAAI,CAMN;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED;;4BAE4B;AAC5B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAOjH;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAEnH;AA2BD;4EAC4E;AAC5E,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GACnD,OAAO,CAAC,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC,CAetD"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAczD,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACpB;AAGD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;AAC7F,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAExC,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED;;4BAE4B;AAC5B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAOjH;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAEnH;AA2BD;4EAC4E;AAC5E,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GACnD,OAAO,CAAC,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC,CAetD"}
@@ -1,18 +1,9 @@
1
1
  import { Text } from "@earendil-works/pi-tui";
2
- import { registerToolsPreservingActiveSet } from "../active-set.js";
3
2
  import { ToolExecError } from "../errors.js";
4
3
  import { applyMcpOutputGuard } from "../guard/output-guard.js";
5
4
  import { ensureMcpToolCallConnection, withMcpRetriableFailedSendRetry, withMcpSessionExpiryRetry } from "../health.js";
6
5
  import { runMcpConnectionLifecycleCall } from "../idle.js";
7
6
  import { buildMcpToolNames, convertJsonSchemaToTypeBox, mapMcpToolResult, } from "./schema-compat.js";
8
- export function registerMcpCatalogTools(pi, entries, activeEntries, warn, options = {}) {
9
- if (entries.length === 0 && activeEntries.length === 0 && options.refreshActiveSetWhenEmpty !== true)
10
- return;
11
- const tools = buildMcpToolDefinitions(entries, warn);
12
- const currentActive = pi.getActiveTools().filter((name) => !name.startsWith("mcp_"));
13
- const mcpNames = buildActiveToolNames(entries, activeEntries, warn);
14
- registerToolsPreservingActiveSet(pi, tools, [...currentActive, ...mcpNames]);
15
- }
16
7
  /** Pair each catalog entry with its stable, collision-resolved mcp tool name.
17
8
  * Shared by the full-tool builder and the Tier-B search catalog so names never
18
9
  * drift between the two. */
@@ -144,16 +135,4 @@ function truncatePreview(value) {
144
135
  function compareCatalogEntries(left, right) {
145
136
  return left.server.localeCompare(right.server) || left.tool.localeCompare(right.tool);
146
137
  }
147
- function buildActiveToolNames(entries, activeEntries, warn) {
148
- const activeKeys = new Set(activeEntries.map(catalogEntryKey));
149
- const sorted = [...entries].sort(compareCatalogEntries);
150
- const names = buildMcpToolNames(sorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })), warn);
151
- return sorted
152
- .map((entry, index) => (activeKeys.has(catalogEntryKey(entry)) ? (names[index] ?? "") : ""))
153
- .filter((name) => name.length > 0)
154
- .sort();
155
- }
156
- function catalogEntryKey(entry) {
157
- return `${entry.server}\0${entry.tool}`;
158
- }
159
138
  //# sourceMappingURL=register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAI9C,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACvH,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EACN,iBAAiB,EACjB,0BAA0B,EAI1B,gBAAgB,GAChB,MAAM,oBAAoB,CAAC;AAiB5B,MAAM,UAAU,uBAAuB,CACtC,EAA4E,EAC5E,OAAuC,EACvC,aAA6C,EAC7C,IAAa,EACb,OAAO,GAAkC,EAAE;IAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,yBAAyB,KAAK,IAAI;QAAE,OAAO;IAC7G,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACpE,gCAAgC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AAC9E,CAAC;AAOD;;4BAE4B;AAC5B,MAAM,UAAU,kBAAkB,CAAC,OAAuC,EAAE,IAAa;IACxF,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,iBAAiB,CAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAC3E,IAAI,CACJ,CAAC;IACF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAuC,EAAE,IAAa;IAC7F,OAAO,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,SAAS,uBAAuB,CAAC,KAA0B,EAAE,IAAY;IACxE,MAAM,SAAS,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO;QACN,IAAI;QACJ,KAAK;QACL,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,YAAY,KAAK,EAAE;QACrD,UAAU,EAAE,SAAS,CAAC,MAAM;QAC5B,aAAa,EAAE,UAAU;QACzB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;YAClD,MAAM,IAAI,GAA4B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,MAAM,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,KAAK;YACrB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK;YAClC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;gBAC9B,CAAC,CAAC,GAAG,IAAI,WAAW;gBACpB,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,CAAC;YAC7D,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;KACD,CAAC;AACH,CAAC;AAED;4EAC4E;AAC5E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,KAA0B,EAC1B,IAA6B,EAC7B,MAA+B,EAC/B,QAAqD;IAErD,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE;QACzD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3G,CAAC;AAED,KAAK,UAAU,WAAW,CACzB,KAA0B,EAC1B,IAA6B,EAC7B,MAA+B,EAC/B,QAAqD,EACrD,KAAa;IAEb,IAAI,CAAC;QACJ,OAAO,MAAM,6BAA6B,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CACjE,yBAAyB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,2BAA2B,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC;YAChC,OAAO,MAAM,+BAA+B,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;gBACzE,OAAO,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE;oBAC/F,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACxB,QAAQ,EAAE,CAAC;4BACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;4BAClE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;yBAC7D,CAAC,CAAC;oBACJ,CAAC;oBACD,MAAM;oBACN,OAAO,EAAE,KAAK,CAAC,gBAAgB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,aAAa,CAAC,kBAAkB,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE;YAC9D,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,KAAK,CAAC,MAAM;SACxB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAC/B,MAAoF;IAEpF,IAAI,SAAS,IAAI,MAAM,IAAI,mBAAmB,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACjF,MAAM,SAAS,GAAG,MAAiC,CAAC;QACpD,MAAM,UAAU,GAAsB,EAAE,CAAC;QACzC,IAAI,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QACtF,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,SAAS;YAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QACnF,IAAI,mBAAmB,IAAI,SAAS;YAAE,UAAU,CAAC,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,CAAC;QACjG,OAAO,UAAU,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,MAAwC;IAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAmC;IAC1D,OAAO,eAAe,CACrB,OAAO;SACL,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,SAAS,CAAC,CAAC;SAClF,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,IAAI,gBAAgB,CAC5B,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,QAAkB;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC7E,OAAO,GAAG,KAAK,aAAa,QAAQ,CAAC,QAAQ,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;AAClE,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAyB,EAAE,KAA0B;IACnF,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,oBAAoB,CAC5B,OAAuC,EACvC,aAA6C,EAC7C,IAAa;IAEb,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,iBAAiB,CAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAC3E,IAAI,CACJ,CAAC;IACF,OAAO,MAAM;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC3F,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,eAAe,CAAC,KAA0B;IAClD,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { Progress } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { TSchema } from \"typebox\";\nimport type { ExtensionAPI, ToolDefinition } from \"../../../types.ts\";\nimport { registerToolsPreservingActiveSet } from \"../active-set.ts\";\nimport type { McpToolCatalogEntry } from \"../catalog.ts\";\nimport { ToolExecError } from \"../errors.ts\";\nimport { applyMcpOutputGuard } from \"../guard/output-guard.ts\";\nimport { ensureMcpToolCallConnection, withMcpRetriableFailedSendRetry, withMcpSessionExpiryRetry } from \"../health.ts\";\nimport { runMcpConnectionLifecycleCall } from \"../idle.ts\";\nimport {\n\tbuildMcpToolNames,\n\tconvertJsonSchemaToTypeBox,\n\ttype McpContentBlock,\n\ttype McpMappedContentBlock,\n\ttype McpToolResultLike,\n\tmapMcpToolResult,\n} from \"./schema-compat.ts\";\n\nexport interface McpToolDetails {\n\tserver: string;\n\ttool: string;\n\tpreview?: string;\n\tprogress?: Progress;\n}\n\ntype McpAgentContent = TextContent | ImageContent;\nexport type McpToolDefinition = ToolDefinition<TSchema, McpToolDetails | undefined, unknown>;\ntype WarnFn = (message: string) => void;\n\nexport interface McpCatalogRegistrationOptions {\n\treadonly refreshActiveSetWhenEmpty?: boolean;\n}\n\nexport function registerMcpCatalogTools(\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tentries: readonly McpToolCatalogEntry[],\n\tactiveEntries: readonly McpToolCatalogEntry[],\n\twarn?: WarnFn,\n\toptions: McpCatalogRegistrationOptions = {},\n): void {\n\tif (entries.length === 0 && activeEntries.length === 0 && options.refreshActiveSetWhenEmpty !== true) return;\n\tconst tools = buildMcpToolDefinitions(entries, warn);\n\tconst currentActive = pi.getActiveTools().filter((name) => !name.startsWith(\"mcp_\"));\n\tconst mcpNames = buildActiveToolNames(entries, activeEntries, warn);\n\tregisterToolsPreservingActiveSet(pi, tools, [...currentActive, ...mcpNames]);\n}\n\nexport interface McpNamedCatalogEntry {\n\treadonly entry: McpToolCatalogEntry;\n\treadonly name: string;\n}\n\n/** Pair each catalog entry with its stable, collision-resolved mcp tool name.\n * Shared by the full-tool builder and the Tier-B search catalog so names never\n * drift between the two. */\nexport function mapMcpCatalogNames(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpNamedCatalogEntry[] {\n\tconst sorted = [...entries].sort(compareCatalogEntries);\n\tconst names = buildMcpToolNames(\n\t\tsorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })),\n\t\twarn,\n\t);\n\treturn sorted.map((entry, index) => ({ entry, name: names[index] ?? \"\" }));\n}\n\nexport function buildMcpToolDefinitions(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpToolDefinition[] {\n\treturn mapMcpCatalogNames(entries, warn).map(({ entry, name }) => createMcpToolDefinition(entry, name));\n}\n\nfunction createMcpToolDefinition(entry: McpToolCatalogEntry, name: string): McpToolDefinition {\n\tconst converted = convertJsonSchemaToTypeBox(entry.schema);\n\tconst label = `${entry.server}/${entry.tool}`;\n\treturn {\n\t\tname,\n\t\tlabel,\n\t\tdescription: entry.description ?? `MCP tool ${label}`,\n\t\tparameters: converted.schema,\n\t\texecutionMode: \"parallel\",\n\t\tasync execute(_toolCallId, params, signal, onUpdate): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\t\t\tconst args: Record<string, unknown> = isRecord(params) ? params : {};\n\t\t\treturn await executeMcpCatalogEntry(entry, args, signal, onUpdate);\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(`${name} ${previewArgs(args)}`.trim())), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme) {\n\t\t\tconst title = options.isPartial\n\t\t\t\t? `${name}: running`\n\t\t\t\t: `${name}: ${result.details?.preview ?? \"(empty result)\"}`;\n\t\t\treturn new Text(theme.fg(\"toolOutput\", title), 0, 0);\n\t\t},\n\t};\n}\n\n/** Full guarded call path for one catalog entry (lifecycle + retry + output\n * guard). Shared by direct/search tool definitions and the Tier-C proxy. */\nexport async function executeMcpCatalogEntry(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\tconst label = `${entry.server}/${entry.tool}`;\n\tconst result = await callMcpTool(entry, args, signal, onUpdate, label);\n\tconst mapped = mapMcpToolResult(normalizeCallToolResult(result));\n\tif (!mapped.ok) {\n\t\tthrow new ToolExecError(mapped.error.message, { phase: \"call\", serverName: entry.server });\n\t}\n\tconst guarded = await applyMcpOutputGuard(mapped.content, {\n\t\tagentDir: entry.agentDir,\n\t\tartifacts: entry.artifacts,\n\t\toutputGuard: entry.outputGuard,\n\t\tserver: entry.server,\n\t});\n\tconst content = toAgentContent(guarded);\n\treturn { content, details: { preview: previewContent(content), server: entry.server, tool: entry.tool } };\n}\n\nasync function callMcpTool(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n\tlabel: string,\n): Promise<Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>> {\n\ttry {\n\t\treturn await runMcpConnectionLifecycleCall(entry.connection, () =>\n\t\t\twithMcpSessionExpiryRetry(entry.connection, async () => {\n\t\t\t\tawait ensureMcpToolCallConnection(entry.connection, entry.ensureFresh);\n\t\t\t\tawait entry.ensureConnected?.();\n\t\t\t\treturn await withMcpRetriableFailedSendRetry(entry.connection, async () => {\n\t\t\t\t\treturn await entry.connection.client.callTool({ name: entry.tool, arguments: args }, undefined, {\n\t\t\t\t\t\tonprogress: (progress) => {\n\t\t\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: formatProgress(label, progress) }],\n\t\t\t\t\t\t\t\tdetails: { progress, server: entry.server, tool: entry.tool },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\ttimeout: entry.requestTimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t} catch (error) {\n\t\tthrow new ToolExecError(`ToolExecError: ${errorLabel(error)}`, {\n\t\t\tcause: error,\n\t\t\tphase: \"call\",\n\t\t\tserverName: entry.server,\n\t\t});\n\t}\n}\n\nfunction normalizeCallToolResult(\n\tresult: Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>,\n): McpToolResultLike {\n\tif (\"content\" in result || \"structuredContent\" in result || \"isError\" in result) {\n\t\tconst candidate = result as Record<string, unknown>;\n\t\tconst normalized: McpToolResultLike = {};\n\t\tif (isMcpContentBlockArray(candidate.content)) normalized.content = candidate.content;\n\t\tif (typeof candidate.isError === \"boolean\") normalized.isError = candidate.isError;\n\t\tif (\"structuredContent\" in candidate) normalized.structuredContent = candidate.structuredContent;\n\t\treturn normalized;\n\t}\n\treturn { structuredContent: result.toolResult };\n}\n\nfunction isMcpContentBlockArray(value: unknown): value is McpContentBlock[] {\n\treturn Array.isArray(value);\n}\n\nfunction toAgentContent(blocks: readonly McpMappedContentBlock[]): McpAgentContent[] {\n\treturn blocks.map((block) => {\n\t\tif (block.type === \"text\" || block.type === \"image\") return block;\n\t\treturn { type: \"text\", text: JSON.stringify(block) };\n\t});\n}\n\nfunction previewContent(content: readonly McpAgentContent[]): string {\n\treturn truncatePreview(\n\t\tcontent\n\t\t\t.map((block) => (block.type === \"text\" ? block.text : `[${block.mimeType} image]`))\n\t\t\t.join(\" \")\n\t\t\t.trim() || \"(empty result)\",\n\t);\n}\n\nfunction previewArgs(args: unknown): string {\n\tconst text = JSON.stringify(args);\n\treturn text === undefined ? \"\" : truncatePreview(text);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorLabel(error: unknown): string {\n\treturn error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n}\n\nfunction formatProgress(label: string, progress: Progress): string {\n\tconst total = progress.total === undefined ? \"\" : `/${progress.total}`;\n\tconst message = progress.message === undefined ? \"\" : ` ${progress.message}`;\n\treturn `${label} progress ${progress.progress}${total}${message}`.trim();\n}\n\nfunction truncatePreview(value: string): string {\n\treturn value.length <= 120 ? value : `${value.slice(0, 117)}...`;\n}\n\nfunction compareCatalogEntries(left: McpToolCatalogEntry, right: McpToolCatalogEntry): number {\n\treturn left.server.localeCompare(right.server) || left.tool.localeCompare(right.tool);\n}\n\nfunction buildActiveToolNames(\n\tentries: readonly McpToolCatalogEntry[],\n\tactiveEntries: readonly McpToolCatalogEntry[],\n\twarn?: WarnFn,\n): string[] {\n\tconst activeKeys = new Set(activeEntries.map(catalogEntryKey));\n\tconst sorted = [...entries].sort(compareCatalogEntries);\n\tconst names = buildMcpToolNames(\n\t\tsorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })),\n\t\twarn,\n\t);\n\treturn sorted\n\t\t.map((entry, index) => (activeKeys.has(catalogEntryKey(entry)) ? (names[index] ?? \"\") : \"\"))\n\t\t.filter((name) => name.length > 0)\n\t\t.sort();\n}\n\nfunction catalogEntryKey(entry: McpToolCatalogEntry): string {\n\treturn `${entry.server}\\0${entry.tool}`;\n}\n"]}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/register.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAK9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACvH,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EACN,iBAAiB,EACjB,0BAA0B,EAI1B,gBAAgB,GAChB,MAAM,oBAAoB,CAAC;AAsB5B;;4BAE4B;AAC5B,MAAM,UAAU,kBAAkB,CAAC,OAAuC,EAAE,IAAa;IACxF,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,iBAAiB,CAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAC3E,IAAI,CACJ,CAAC;IACF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAuC,EAAE,IAAa;IAC7F,OAAO,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,SAAS,uBAAuB,CAAC,KAA0B,EAAE,IAAY;IACxE,MAAM,SAAS,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO;QACN,IAAI;QACJ,KAAK;QACL,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,YAAY,KAAK,EAAE;QACrD,UAAU,EAAE,SAAS,CAAC,MAAM;QAC5B,aAAa,EAAE,UAAU;QACzB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;YAClD,MAAM,IAAI,GAA4B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,MAAM,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,KAAK;YACrB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK;YAClC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;gBAC9B,CAAC,CAAC,GAAG,IAAI,WAAW;gBACpB,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,CAAC;YAC7D,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;KACD,CAAC;AACH,CAAC;AAED;4EAC4E;AAC5E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,KAA0B,EAC1B,IAA6B,EAC7B,MAA+B,EAC/B,QAAqD;IAErD,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE;QACzD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3G,CAAC;AAED,KAAK,UAAU,WAAW,CACzB,KAA0B,EAC1B,IAA6B,EAC7B,MAA+B,EAC/B,QAAqD,EACrD,KAAa;IAEb,IAAI,CAAC;QACJ,OAAO,MAAM,6BAA6B,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CACjE,yBAAyB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,2BAA2B,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC;YAChC,OAAO,MAAM,+BAA+B,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;gBACzE,OAAO,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE;oBAC/F,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACxB,QAAQ,EAAE,CAAC;4BACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;4BAClE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;yBAC7D,CAAC,CAAC;oBACJ,CAAC;oBACD,MAAM;oBACN,OAAO,EAAE,KAAK,CAAC,gBAAgB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,aAAa,CAAC,kBAAkB,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE;YAC9D,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,KAAK,CAAC,MAAM;SACxB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAC/B,MAAoF;IAEpF,IAAI,SAAS,IAAI,MAAM,IAAI,mBAAmB,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACjF,MAAM,SAAS,GAAG,MAAiC,CAAC;QACpD,MAAM,UAAU,GAAsB,EAAE,CAAC;QACzC,IAAI,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QACtF,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,SAAS;YAAE,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QACnF,IAAI,mBAAmB,IAAI,SAAS;YAAE,UAAU,CAAC,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,CAAC;QACjG,OAAO,UAAU,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,MAAwC;IAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAmC;IAC1D,OAAO,eAAe,CACrB,OAAO;SACL,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,SAAS,CAAC,CAAC;SAClF,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,IAAI,gBAAgB,CAC5B,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,QAAkB;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC7E,OAAO,GAAG,KAAK,aAAa,QAAQ,CAAC,QAAQ,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;AAClE,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAyB,EAAE,KAA0B;IACnF,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvF,CAAC","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { Progress } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { TSchema } from \"typebox\";\nimport type { ToolDefinition } from \"../../../types.ts\";\nimport type { McpToolCatalogEntry } from \"../catalog.ts\";\nimport { ToolExecError } from \"../errors.ts\";\nimport { applyMcpOutputGuard } from \"../guard/output-guard.ts\";\nimport { ensureMcpToolCallConnection, withMcpRetriableFailedSendRetry, withMcpSessionExpiryRetry } from \"../health.ts\";\nimport { runMcpConnectionLifecycleCall } from \"../idle.ts\";\nimport {\n\tbuildMcpToolNames,\n\tconvertJsonSchemaToTypeBox,\n\ttype McpContentBlock,\n\ttype McpMappedContentBlock,\n\ttype McpToolResultLike,\n\tmapMcpToolResult,\n} from \"./schema-compat.ts\";\n\nexport interface McpToolDetails {\n\tserver: string;\n\ttool: string;\n\tpreview?: string;\n\tprogress?: Progress;\n}\n\ntype McpAgentContent = TextContent | ImageContent;\nexport type McpToolDefinition = ToolDefinition<TSchema, McpToolDetails | undefined, unknown>;\ntype WarnFn = (message: string) => void;\n\nexport interface McpCatalogRegistrationOptions {\n\treadonly refreshActiveSetWhenEmpty?: boolean;\n}\n\nexport interface McpNamedCatalogEntry {\n\treadonly entry: McpToolCatalogEntry;\n\treadonly name: string;\n}\n\n/** Pair each catalog entry with its stable, collision-resolved mcp tool name.\n * Shared by the full-tool builder and the Tier-B search catalog so names never\n * drift between the two. */\nexport function mapMcpCatalogNames(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpNamedCatalogEntry[] {\n\tconst sorted = [...entries].sort(compareCatalogEntries);\n\tconst names = buildMcpToolNames(\n\t\tsorted.map((entry) => ({ serverName: entry.server, toolName: entry.tool })),\n\t\twarn,\n\t);\n\treturn sorted.map((entry, index) => ({ entry, name: names[index] ?? \"\" }));\n}\n\nexport function buildMcpToolDefinitions(entries: readonly McpToolCatalogEntry[], warn?: WarnFn): McpToolDefinition[] {\n\treturn mapMcpCatalogNames(entries, warn).map(({ entry, name }) => createMcpToolDefinition(entry, name));\n}\n\nfunction createMcpToolDefinition(entry: McpToolCatalogEntry, name: string): McpToolDefinition {\n\tconst converted = convertJsonSchemaToTypeBox(entry.schema);\n\tconst label = `${entry.server}/${entry.tool}`;\n\treturn {\n\t\tname,\n\t\tlabel,\n\t\tdescription: entry.description ?? `MCP tool ${label}`,\n\t\tparameters: converted.schema,\n\t\texecutionMode: \"parallel\",\n\t\tasync execute(_toolCallId, params, signal, onUpdate): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\t\t\tconst args: Record<string, unknown> = isRecord(params) ? params : {};\n\t\t\treturn await executeMcpCatalogEntry(entry, args, signal, onUpdate);\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(`${name} ${previewArgs(args)}`.trim())), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme) {\n\t\t\tconst title = options.isPartial\n\t\t\t\t? `${name}: running`\n\t\t\t\t: `${name}: ${result.details?.preview ?? \"(empty result)\"}`;\n\t\t\treturn new Text(theme.fg(\"toolOutput\", title), 0, 0);\n\t\t},\n\t};\n}\n\n/** Full guarded call path for one catalog entry (lifecycle + retry + output\n * guard). Shared by direct/search tool definitions and the Tier-C proxy. */\nexport async function executeMcpCatalogEntry(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n): Promise<AgentToolResult<McpToolDetails | undefined>> {\n\tconst label = `${entry.server}/${entry.tool}`;\n\tconst result = await callMcpTool(entry, args, signal, onUpdate, label);\n\tconst mapped = mapMcpToolResult(normalizeCallToolResult(result));\n\tif (!mapped.ok) {\n\t\tthrow new ToolExecError(mapped.error.message, { phase: \"call\", serverName: entry.server });\n\t}\n\tconst guarded = await applyMcpOutputGuard(mapped.content, {\n\t\tagentDir: entry.agentDir,\n\t\tartifacts: entry.artifacts,\n\t\toutputGuard: entry.outputGuard,\n\t\tserver: entry.server,\n\t});\n\tconst content = toAgentContent(guarded);\n\treturn { content, details: { preview: previewContent(content), server: entry.server, tool: entry.tool } };\n}\n\nasync function callMcpTool(\n\tentry: McpToolCatalogEntry,\n\targs: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: Parameters<McpToolDefinition[\"execute\"]>[3],\n\tlabel: string,\n): Promise<Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>> {\n\ttry {\n\t\treturn await runMcpConnectionLifecycleCall(entry.connection, () =>\n\t\t\twithMcpSessionExpiryRetry(entry.connection, async () => {\n\t\t\t\tawait ensureMcpToolCallConnection(entry.connection, entry.ensureFresh);\n\t\t\t\tawait entry.ensureConnected?.();\n\t\t\t\treturn await withMcpRetriableFailedSendRetry(entry.connection, async () => {\n\t\t\t\t\treturn await entry.connection.client.callTool({ name: entry.tool, arguments: args }, undefined, {\n\t\t\t\t\t\tonprogress: (progress) => {\n\t\t\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: formatProgress(label, progress) }],\n\t\t\t\t\t\t\t\tdetails: { progress, server: entry.server, tool: entry.tool },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\ttimeout: entry.requestTimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t} catch (error) {\n\t\tthrow new ToolExecError(`ToolExecError: ${errorLabel(error)}`, {\n\t\t\tcause: error,\n\t\t\tphase: \"call\",\n\t\t\tserverName: entry.server,\n\t\t});\n\t}\n}\n\nfunction normalizeCallToolResult(\n\tresult: Awaited<ReturnType<McpToolCatalogEntry[\"connection\"][\"client\"][\"callTool\"]>>,\n): McpToolResultLike {\n\tif (\"content\" in result || \"structuredContent\" in result || \"isError\" in result) {\n\t\tconst candidate = result as Record<string, unknown>;\n\t\tconst normalized: McpToolResultLike = {};\n\t\tif (isMcpContentBlockArray(candidate.content)) normalized.content = candidate.content;\n\t\tif (typeof candidate.isError === \"boolean\") normalized.isError = candidate.isError;\n\t\tif (\"structuredContent\" in candidate) normalized.structuredContent = candidate.structuredContent;\n\t\treturn normalized;\n\t}\n\treturn { structuredContent: result.toolResult };\n}\n\nfunction isMcpContentBlockArray(value: unknown): value is McpContentBlock[] {\n\treturn Array.isArray(value);\n}\n\nfunction toAgentContent(blocks: readonly McpMappedContentBlock[]): McpAgentContent[] {\n\treturn blocks.map((block) => {\n\t\tif (block.type === \"text\" || block.type === \"image\") return block;\n\t\treturn { type: \"text\", text: JSON.stringify(block) };\n\t});\n}\n\nfunction previewContent(content: readonly McpAgentContent[]): string {\n\treturn truncatePreview(\n\t\tcontent\n\t\t\t.map((block) => (block.type === \"text\" ? block.text : `[${block.mimeType} image]`))\n\t\t\t.join(\" \")\n\t\t\t.trim() || \"(empty result)\",\n\t);\n}\n\nfunction previewArgs(args: unknown): string {\n\tconst text = JSON.stringify(args);\n\treturn text === undefined ? \"\" : truncatePreview(text);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorLabel(error: unknown): string {\n\treturn error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n}\n\nfunction formatProgress(label: string, progress: Progress): string {\n\tconst total = progress.total === undefined ? \"\" : `/${progress.total}`;\n\tconst message = progress.message === undefined ? \"\" : ` ${progress.message}`;\n\treturn `${label} progress ${progress.progress}${total}${message}`.trim();\n}\n\nfunction truncatePreview(value: string): string {\n\treturn value.length <= 120 ? value : `${value.slice(0, 117)}...`;\n}\n\nfunction compareCatalogEntries(left: McpToolCatalogEntry, right: McpToolCatalogEntry): number {\n\treturn left.server.localeCompare(right.server) || left.tool.localeCompare(right.tool);\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
2
2
  import { type TSchema } from "typebox";
3
- import { buildMcpToolName, buildMcpToolNames, type McpToolNameEntry } from "./naming.ts";
3
+ import { buildMcpToolNames, type McpToolNameEntry } from "./naming.ts";
4
4
  import { collectAllPages, type McpListPage, type McpPaginationResult } from "./pagination.ts";
5
5
  export type { McpListPage, McpPaginationResult, McpToolNameEntry };
6
- export { buildMcpToolName, buildMcpToolNames, collectAllPages };
6
+ export { buildMcpToolNames, collectAllPages };
7
7
  interface SchemaConversionResult {
8
8
  schema: TSchema;
9
9
  warnings: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"schema-compat.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/schema-compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,OAAO,EAAQ,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE9F,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AAEhE,UAAU,sBAAsB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,UAAU,uBAAuB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACnG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3B,MAAM,MAAM,qBAAqB,GAC9B,WAAW,GACX,YAAY,GACZ;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAI/E,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB,CAalF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,uBAAuB,CAYjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,CAM/E"}
1
+ {"version":3,"file":"schema-compat.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/schema-compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,OAAO,EAAQ,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE9F,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AAE9C,UAAU,sBAAsB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,UAAU,uBAAuB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACnG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3B,MAAM,MAAM,qBAAqB,GAC9B,WAAW,GACX,YAAY,GACZ;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAI/E,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB,CAalF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,uBAAuB,CAYjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,CAM/E"}
@@ -1,7 +1,7 @@
1
1
  import { Type } from "typebox";
2
- import { buildMcpToolName, buildMcpToolNames } from "./naming.js";
2
+ import { buildMcpToolNames } from "./naming.js";
3
3
  import { collectAllPages } from "./pagination.js";
4
- export { buildMcpToolName, buildMcpToolNames, collectAllPages };
4
+ export { buildMcpToolNames, collectAllPages };
5
5
  const PERMISSIVE_OBJECT_SCHEMA = { type: "object", properties: {} };
6
6
  export function convertJsonSchemaToTypeBox(schema) {
7
7
  const warnings = [];