@astralyn/pi 1.4.10 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/bundle/chunks/anthropic-messages-G5ZGBHOH.js +6 -0
  3. package/dist/bundle/chunks/azure-openai-responses-EMPTMYNF.js +2 -0
  4. package/dist/bundle/chunks/bedrock-converse-stream.js +22 -15
  5. package/dist/bundle/chunks/chunk-AXX7FFFD.js +2 -0
  6. package/dist/bundle/chunks/chunk-FNGB3ASD.js +2 -0
  7. package/dist/bundle/chunks/chunk-FPALVF3F.js +4 -0
  8. package/dist/bundle/chunks/chunk-H3UF54OB.js +9 -0
  9. package/dist/bundle/chunks/chunk-IC6JXX2J.js +10 -0
  10. package/dist/bundle/chunks/{chunk-UCH27AVQ.js → chunk-IRUUTK4W.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-MZJC45TM.js → chunk-J7L6O5XA.js} +3 -3
  12. package/dist/bundle/chunks/{chunk-DLVLAQEG.js → chunk-KBFO53OG.js} +3 -3
  13. package/dist/bundle/chunks/{chunk-TPVFPFJP.js → chunk-P7VXFB2M.js} +1 -1
  14. package/dist/bundle/chunks/chunk-PSYLMRL6.js +9 -0
  15. package/dist/bundle/chunks/chunk-QNZARXLE.js +82 -0
  16. package/dist/bundle/chunks/chunk-R3YHAMWH.js +1503 -0
  17. package/dist/bundle/chunks/chunk-RAIYJ5FC.js +4 -0
  18. package/dist/bundle/chunks/{chunk-OV2VMHBX.js → chunk-SR6EWNPW.js} +1 -1
  19. package/dist/bundle/chunks/chunk-TA3YH2ZI.js +16 -0
  20. package/dist/bundle/chunks/{chunk-MF3T3ETJ.js → chunk-THAJ4BZF.js} +58 -62
  21. package/dist/bundle/chunks/{chunk-24FY4C5S.js → chunk-TRSJS3FM.js} +1 -1
  22. package/dist/bundle/chunks/chunk-ZRI3ICDE.js +2 -0
  23. package/dist/bundle/chunks/{cli-MBFCFGI2.js → cli-LAZQG54B.js} +11 -9
  24. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-7BKATOEJ.js → cloudflare-workers-ai-system-one-4L2ABUJE.js} +1 -1
  25. package/dist/bundle/chunks/{execute-FQKRO4XJ.js → execute-ACWDKC3C.js} +1 -1
  26. package/dist/bundle/chunks/github-copilot.js +1 -1
  27. package/dist/bundle/chunks/{google-generative-ai-HTUSU45F.js → google-generative-ai-OOVDGS5W.js} +1 -1
  28. package/dist/bundle/chunks/{google-vertex-AVQV4P76.js → google-vertex-IK5RNG7J.js} +1 -1
  29. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  30. package/dist/bundle/chunks/kimi-coding.js +1 -1
  31. package/dist/bundle/chunks/{llama-cpp-classify-27QYLJZY.js → llama-cpp-classify-XHAVT37C.js} +1 -1
  32. package/dist/bundle/chunks/meta.js +1 -1
  33. package/dist/bundle/chunks/mistral-conversations-Z56KY4OJ.js +5 -0
  34. package/dist/bundle/chunks/{openai-codex-responses-Q25MHDFX.js → openai-codex-responses-5NAH3SK6.js} +1 -1
  35. package/dist/bundle/chunks/openai-completions-S7S6PO3J.js +7 -0
  36. package/dist/bundle/chunks/{openai-decisions-3WYFPGSK.js → openai-decisions-7A36EAHE.js} +1 -1
  37. package/dist/bundle/chunks/{openai-responses-E4BNZIQK.js → openai-responses-ZQRZJKH4.js} +1 -1
  38. package/dist/bundle/chunks/{openrouter-images-CBP3OPOD.js → openrouter-images-X7PX72ON.js} +1 -1
  39. package/dist/bundle/chunks/pi-messages-TXNWPLI4.js +8 -0
  40. package/dist/bundle/chunks/radius.js +1 -1
  41. package/dist/bundle/chunks/{runtime-3RPOJS5T.js → runtime-X3XOMNXQ.js} +1 -1
  42. package/dist/bundle/chunks/{typesafe-system-one-BNICP2LS.js → typesafe-system-one-XJGMSHWL.js} +1 -1
  43. package/dist/bundle/chunks/virtual-modules-T2KLVAFL.js +2 -0
  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/cli/args.d.ts.map +1 -1
  48. package/dist/cli/args.js +8 -7
  49. package/dist/cli/args.js.map +1 -1
  50. package/dist/config.d.ts +10 -0
  51. package/dist/config.d.ts.map +1 -1
  52. package/dist/config.js +24 -5
  53. package/dist/config.js.map +1 -1
  54. package/dist/core/agent-session-runtime.d.ts +0 -5
  55. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  56. package/dist/core/agent-session-runtime.js +12 -28
  57. package/dist/core/agent-session-runtime.js.map +1 -1
  58. package/dist/core/agent-session.d.ts +21 -14
  59. package/dist/core/agent-session.d.ts.map +1 -1
  60. package/dist/core/agent-session.js +67 -96
  61. package/dist/core/agent-session.js.map +1 -1
  62. package/dist/core/compaction/branch-summarization.d.ts +4 -2
  63. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  64. package/dist/core/compaction/branch-summarization.js +16 -4
  65. package/dist/core/compaction/branch-summarization.js.map +1 -1
  66. package/dist/core/exec.d.ts +9 -1
  67. package/dist/core/exec.d.ts.map +1 -1
  68. package/dist/core/exec.js +104 -60
  69. package/dist/core/exec.js.map +1 -1
  70. package/dist/core/export-html/template.css +9 -0
  71. package/dist/core/export-html/template.js +165 -45
  72. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  73. package/dist/core/export-html/tool-renderer.js +5 -0
  74. package/dist/core/export-html/tool-renderer.js.map +1 -1
  75. package/dist/core/extensions/index.d.ts +2 -2
  76. package/dist/core/extensions/index.d.ts.map +1 -1
  77. package/dist/core/extensions/index.js.map +1 -1
  78. package/dist/core/extensions/loader.d.ts.map +1 -1
  79. package/dist/core/extensions/loader.js +20 -12
  80. package/dist/core/extensions/loader.js.map +1 -1
  81. package/dist/core/extensions/pi-ai-extension-view.d.ts +19 -0
  82. package/dist/core/extensions/pi-ai-extension-view.d.ts.map +1 -0
  83. package/dist/core/extensions/pi-ai-extension-view.js +22 -0
  84. package/dist/core/extensions/pi-ai-extension-view.js.map +1 -0
  85. package/dist/core/extensions/runner.d.ts +0 -1
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +7 -12
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +41 -23
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js.map +1 -1
  92. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  93. package/dist/core/extensions/virtual-modules.js +8 -7
  94. package/dist/core/extensions/virtual-modules.js.map +1 -1
  95. package/dist/core/mcp-servers.d.ts +11 -4
  96. package/dist/core/mcp-servers.d.ts.map +1 -1
  97. package/dist/core/mcp-servers.js +15 -5
  98. package/dist/core/mcp-servers.js.map +1 -1
  99. package/dist/core/model-config.d.ts +1678 -2029
  100. package/dist/core/model-config.d.ts.map +1 -1
  101. package/dist/core/model-config.js +2 -3
  102. package/dist/core/model-config.js.map +1 -1
  103. package/dist/core/model-resolver.d.ts.map +1 -1
  104. package/dist/core/model-resolver.js +16 -10
  105. package/dist/core/model-resolver.js.map +1 -1
  106. package/dist/core/package-manager.d.ts +14 -0
  107. package/dist/core/package-manager.d.ts.map +1 -1
  108. package/dist/core/package-manager.js +160 -46
  109. package/dist/core/package-manager.js.map +1 -1
  110. package/dist/core/pi-ai-schemas.d.ts +163 -0
  111. package/dist/core/pi-ai-schemas.d.ts.map +1 -0
  112. package/dist/core/pi-ai-schemas.js +21 -0
  113. package/dist/core/pi-ai-schemas.js.map +1 -0
  114. package/dist/core/pi-manifest.d.ts +1 -0
  115. package/dist/core/pi-manifest.d.ts.map +1 -1
  116. package/dist/core/pi-manifest.js +4 -0
  117. package/dist/core/pi-manifest.js.map +1 -1
  118. package/dist/core/project-trust.js +1 -1
  119. package/dist/core/project-trust.js.map +1 -1
  120. package/dist/core/quiescence.d.ts +24 -0
  121. package/dist/core/quiescence.d.ts.map +1 -0
  122. package/dist/core/quiescence.js +81 -0
  123. package/dist/core/quiescence.js.map +1 -0
  124. package/dist/core/resource-loader.d.ts +4 -1
  125. package/dist/core/resource-loader.d.ts.map +1 -1
  126. package/dist/core/resource-loader.js +41 -28
  127. package/dist/core/resource-loader.js.map +1 -1
  128. package/dist/core/sdk.d.ts.map +1 -1
  129. package/dist/core/sdk.js +3 -1
  130. package/dist/core/sdk.js.map +1 -1
  131. package/dist/core/session-manager.d.ts +7 -0
  132. package/dist/core/session-manager.d.ts.map +1 -1
  133. package/dist/core/session-manager.js +32 -13
  134. package/dist/core/session-manager.js.map +1 -1
  135. package/dist/core/settings-manager.d.ts +2 -0
  136. package/dist/core/settings-manager.d.ts.map +1 -1
  137. package/dist/core/settings-manager.js +11 -0
  138. package/dist/core/settings-manager.js.map +1 -1
  139. package/dist/core/settings-schema.d.ts +4 -2
  140. package/dist/core/settings-schema.d.ts.map +1 -1
  141. package/dist/core/settings-schema.js +8 -1
  142. package/dist/core/settings-schema.js.map +1 -1
  143. package/dist/core/skills.d.ts.map +1 -1
  144. package/dist/core/skills.js +6 -14
  145. package/dist/core/skills.js.map +1 -1
  146. package/dist/core/slash-command-name.d.ts +6 -0
  147. package/dist/core/slash-command-name.d.ts.map +1 -0
  148. package/dist/core/slash-command-name.js +11 -0
  149. package/dist/core/slash-command-name.js.map +1 -0
  150. package/dist/core/slash-commands.js +2 -2
  151. package/dist/core/slash-commands.js.map +1 -1
  152. package/dist/core/source-info.d.ts +9 -0
  153. package/dist/core/source-info.d.ts.map +1 -1
  154. package/dist/core/source-info.js +13 -0
  155. package/dist/core/source-info.js.map +1 -1
  156. package/dist/core/system-prompt.d.ts.map +1 -1
  157. package/dist/core/system-prompt.js +5 -6
  158. package/dist/core/system-prompt.js.map +1 -1
  159. package/dist/core/tasks/codec.d.ts +14 -0
  160. package/dist/core/tasks/codec.d.ts.map +1 -1
  161. package/dist/core/tasks/codec.js +57 -4
  162. package/dist/core/tasks/codec.js.map +1 -1
  163. package/dist/core/tasks/delivery.d.ts +4 -20
  164. package/dist/core/tasks/delivery.d.ts.map +1 -1
  165. package/dist/core/tasks/delivery.js +5 -58
  166. package/dist/core/tasks/delivery.js.map +1 -1
  167. package/dist/core/tasks/limits.d.ts +3 -19
  168. package/dist/core/tasks/limits.d.ts.map +1 -1
  169. package/dist/core/tasks/limits.js +3 -24
  170. package/dist/core/tasks/limits.js.map +1 -1
  171. package/dist/core/tasks/record.d.ts +1 -7
  172. package/dist/core/tasks/record.d.ts.map +1 -1
  173. package/dist/core/tasks/record.js +0 -18
  174. package/dist/core/tasks/record.js.map +1 -1
  175. package/dist/core/tasks/reminder.d.ts +3 -2
  176. package/dist/core/tasks/reminder.d.ts.map +1 -1
  177. package/dist/core/tasks/reminder.js +4 -3
  178. package/dist/core/tasks/reminder.js.map +1 -1
  179. package/dist/core/tasks/runtime.d.ts +1 -14
  180. package/dist/core/tasks/runtime.d.ts.map +1 -1
  181. package/dist/core/tasks/runtime.js +3 -96
  182. package/dist/core/tasks/runtime.js.map +1 -1
  183. package/dist/core/tasks/session.d.ts +9 -5
  184. package/dist/core/tasks/session.d.ts.map +1 -1
  185. package/dist/core/tasks/session.js +22 -24
  186. package/dist/core/tasks/session.js.map +1 -1
  187. package/dist/core/tasks/types.d.ts +3 -92
  188. package/dist/core/tasks/types.d.ts.map +1 -1
  189. package/dist/core/tasks/types.js +3 -3
  190. package/dist/core/tasks/types.js.map +1 -1
  191. package/dist/core/tools/bash.d.ts +8 -7
  192. package/dist/core/tools/bash.d.ts.map +1 -1
  193. package/dist/core/tools/bash.js +6 -5
  194. package/dist/core/tools/bash.js.map +1 -1
  195. package/dist/core/tools/edit.d.ts +3 -3
  196. package/dist/core/tools/edit.d.ts.map +1 -1
  197. package/dist/core/tools/edit.js +2 -4
  198. package/dist/core/tools/edit.js.map +1 -1
  199. package/dist/core/tools/find.d.ts +2 -2
  200. package/dist/core/tools/find.d.ts.map +1 -1
  201. package/dist/core/tools/find.js.map +1 -1
  202. package/dist/core/tools/grep.d.ts +2 -2
  203. package/dist/core/tools/grep.d.ts.map +1 -1
  204. package/dist/core/tools/grep.js +1 -1
  205. package/dist/core/tools/grep.js.map +1 -1
  206. package/dist/core/tools/ls.d.ts +2 -2
  207. package/dist/core/tools/ls.d.ts.map +1 -1
  208. package/dist/core/tools/ls.js.map +1 -1
  209. package/dist/core/tools/powershell.d.ts +1 -5
  210. package/dist/core/tools/powershell.d.ts.map +1 -1
  211. package/dist/core/tools/read.d.ts +2 -2
  212. package/dist/core/tools/read.d.ts.map +1 -1
  213. package/dist/core/tools/read.js.map +1 -1
  214. package/dist/core/tools/render-utils.d.ts +4 -6
  215. package/dist/core/tools/render-utils.d.ts.map +1 -1
  216. package/dist/core/tools/render-utils.js +19 -41
  217. package/dist/core/tools/render-utils.js.map +1 -1
  218. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  219. package/dist/core/tools/renderers/bash.js +3 -25
  220. package/dist/core/tools/renderers/bash.js.map +1 -1
  221. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  222. package/dist/core/tools/renderers/write.js +18 -19
  223. package/dist/core/tools/renderers/write.js.map +1 -1
  224. package/dist/core/tools/shell-execution.d.ts +20 -13
  225. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  226. package/dist/core/tools/shell-execution.js +165 -183
  227. package/dist/core/tools/shell-execution.js.map +1 -1
  228. package/dist/core/tools/shell-tool.d.ts +9 -14
  229. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  230. package/dist/core/tools/shell-tool.js +38 -66
  231. package/dist/core/tools/shell-tool.js.map +1 -1
  232. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -4
  233. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  234. package/dist/core/tools/tool-definition-wrapper.js +2 -3
  235. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  236. package/dist/core/tools/write.d.ts +2 -2
  237. package/dist/core/tools/write.d.ts.map +1 -1
  238. package/dist/core/tools/write.js.map +1 -1
  239. package/dist/core/trust-manager.d.ts.map +1 -1
  240. package/dist/core/trust-manager.js +30 -13
  241. package/dist/core/trust-manager.js.map +1 -1
  242. package/dist/core/usage-totals.d.ts +0 -9
  243. package/dist/core/usage-totals.d.ts.map +1 -1
  244. package/dist/core/usage-totals.js +24 -91
  245. package/dist/core/usage-totals.js.map +1 -1
  246. package/dist/extensions/agent/activity-lines.d.ts +2 -3
  247. package/dist/extensions/agent/activity-lines.d.ts.map +1 -1
  248. package/dist/extensions/agent/activity-lines.js +5 -9
  249. package/dist/extensions/agent/activity-lines.js.map +1 -1
  250. package/dist/extensions/agent/activity.d.ts +0 -2
  251. package/dist/extensions/agent/activity.d.ts.map +1 -1
  252. package/dist/extensions/agent/activity.js +1 -1
  253. package/dist/extensions/agent/activity.js.map +1 -1
  254. package/dist/extensions/agent/progress.d.ts +0 -3
  255. package/dist/extensions/agent/progress.d.ts.map +1 -1
  256. package/dist/extensions/agent/progress.js +2 -8
  257. package/dist/extensions/agent/progress.js.map +1 -1
  258. package/dist/extensions/agent/render.js +1 -1
  259. package/dist/extensions/agent/render.js.map +1 -1
  260. package/dist/extensions/agent/tool.d.ts.map +1 -1
  261. package/dist/extensions/agent/tool.js +0 -6
  262. package/dist/extensions/agent/tool.js.map +1 -1
  263. package/dist/{core/isolated-session.d.ts → extensions/agent/worker-session.d.ts} +6 -6
  264. package/dist/extensions/agent/worker-session.d.ts.map +1 -0
  265. package/dist/{core/isolated-session.js → extensions/agent/worker-session.js} +9 -9
  266. package/dist/extensions/agent/worker-session.js.map +1 -0
  267. package/dist/extensions/agent/worker.d.ts +0 -3
  268. package/dist/extensions/agent/worker.d.ts.map +1 -1
  269. package/dist/extensions/agent/worker.js +2 -3
  270. package/dist/extensions/agent/worker.js.map +1 -1
  271. package/dist/extensions/btw/agent.d.ts.map +1 -1
  272. package/dist/extensions/btw/agent.js +2 -1
  273. package/dist/extensions/btw/agent.js.map +1 -1
  274. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  275. package/dist/extensions/cached-compaction/render.js +3 -3
  276. package/dist/extensions/cached-compaction/render.js.map +1 -1
  277. package/dist/extensions/cached-compaction/summary.d.ts +1 -1
  278. package/dist/extensions/cached-compaction/summary.d.ts.map +1 -1
  279. package/dist/extensions/cached-compaction/summary.js +13 -16
  280. package/dist/extensions/cached-compaction/summary.js.map +1 -1
  281. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  282. package/dist/extensions/codemode/renderer.js +6 -2
  283. package/dist/extensions/codemode/renderer.js.map +1 -1
  284. package/dist/extensions/codemode/tool.d.ts +2 -1
  285. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  286. package/dist/extensions/codemode/tool.js +33 -8
  287. package/dist/extensions/codemode/tool.js.map +1 -1
  288. package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
  289. package/dist/extensions/deepwiki/schema.js +1 -1
  290. package/dist/extensions/deepwiki/schema.js.map +1 -1
  291. package/dist/extensions/llama/ui.d.ts.map +1 -1
  292. package/dist/extensions/llama/ui.js +16 -4
  293. package/dist/extensions/llama/ui.js.map +1 -1
  294. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  295. package/dist/extensions/mcp/cli.js +34 -8
  296. package/dist/extensions/mcp/cli.js.map +1 -1
  297. package/dist/extensions/mcp/oauth.d.ts +1 -1
  298. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  299. package/dist/extensions/mcp/oauth.js +36 -13
  300. package/dist/extensions/mcp/oauth.js.map +1 -1
  301. package/dist/extensions/mcp/ui.d.ts +1 -0
  302. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  303. package/dist/extensions/mcp/ui.js +33 -24
  304. package/dist/extensions/mcp/ui.js.map +1 -1
  305. package/dist/extensions/run-summary/index.d.ts +1 -1
  306. package/dist/extensions/run-summary/index.d.ts.map +1 -1
  307. package/dist/extensions/run-summary/index.js +11 -23
  308. package/dist/extensions/run-summary/index.js.map +1 -1
  309. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  310. package/dist/extensions/statusline/usage.js +2 -1
  311. package/dist/extensions/statusline/usage.js.map +1 -1
  312. package/dist/extensions/tasks/tool/actions.d.ts +1 -2
  313. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  314. package/dist/extensions/tasks/tool/actions.js +7 -79
  315. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  316. package/dist/extensions/tasks/tool/constants.d.ts +1 -3
  317. package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
  318. package/dist/extensions/tasks/tool/constants.js +1 -3
  319. package/dist/extensions/tasks/tool/constants.js.map +1 -1
  320. package/dist/extensions/tasks/tool/schema.d.ts +1 -2
  321. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  322. package/dist/extensions/tasks/tool/schema.js +7 -15
  323. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  324. package/dist/extensions/tasks/tool/types.d.ts +1 -19
  325. package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
  326. package/dist/extensions/tasks/tool/types.js.map +1 -1
  327. package/dist/extensions/tasks/tool.d.ts +1 -2
  328. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  329. package/dist/extensions/tasks/tool.js +2 -4
  330. package/dist/extensions/tasks/tool.js.map +1 -1
  331. package/dist/extensions/tasks/ui/completion-render.d.ts +5 -1
  332. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  333. package/dist/extensions/tasks/ui/completion-render.js +25 -70
  334. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  335. package/dist/extensions/tasks/ui/inspector.d.ts +1 -1
  336. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  337. package/dist/extensions/tasks/ui/inspector.js +0 -6
  338. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  339. package/dist/extensions/tasks/ui/manager.d.ts +1 -1
  340. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  341. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  342. package/dist/extensions/tasks/ui/render.d.ts +2 -16
  343. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  344. package/dist/extensions/tasks/ui/render.js +3 -79
  345. package/dist/extensions/tasks/ui/render.js.map +1 -1
  346. package/dist/extensions/tasks/ui/views.d.ts +2 -4
  347. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  348. package/dist/extensions/tasks/ui/views.js +3 -7
  349. package/dist/extensions/tasks/ui/views.js.map +1 -1
  350. package/dist/extensions/tool-presentation/fallback.d.ts.map +1 -0
  351. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.js +5 -5
  352. package/dist/extensions/tool-presentation/fallback.js.map +1 -0
  353. package/dist/extensions/tool-presentation/index.js +1 -1
  354. package/dist/extensions/tool-presentation/index.js.map +1 -1
  355. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.d.ts +1 -1
  356. package/dist/extensions/tool-presentation/shell.d.ts.map +1 -0
  357. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.js +3 -3
  358. package/dist/extensions/tool-presentation/shell.js.map +1 -0
  359. package/dist/extensions/tool-search/tool.d.ts +21 -6
  360. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  361. package/dist/extensions/tool-search/tool.js +104 -36
  362. package/dist/extensions/tool-search/tool.js.map +1 -1
  363. package/dist/index.d.ts +3 -3
  364. package/dist/index.d.ts.map +1 -1
  365. package/dist/index.js.map +1 -1
  366. package/dist/main.d.ts.map +1 -1
  367. package/dist/main.js +15 -8
  368. package/dist/main.js.map +1 -1
  369. package/dist/modes/interactive/components/assistant-message.d.ts +5 -3
  370. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  371. package/dist/modes/interactive/components/assistant-message.js +61 -45
  372. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  373. package/dist/modes/interactive/components/config-selector-skills.d.ts +54 -0
  374. package/dist/modes/interactive/components/config-selector-skills.d.ts.map +1 -0
  375. package/dist/modes/interactive/components/config-selector-skills.js +178 -0
  376. package/dist/modes/interactive/components/config-selector-skills.js.map +1 -0
  377. package/dist/modes/interactive/components/config-selector.d.ts +2 -11
  378. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  379. package/dist/modes/interactive/components/config-selector.js +31 -181
  380. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  381. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  382. package/dist/modes/interactive/components/custom-editor.js +7 -0
  383. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  384. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  385. package/dist/modes/interactive/components/custom-entry.js +2 -1
  386. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  387. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  388. package/dist/modes/interactive/components/custom-message.js +2 -1
  389. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  390. package/dist/modes/interactive/components/extension-editor.d.ts +2 -0
  391. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  392. package/dist/modes/interactive/components/extension-editor.js +4 -0
  393. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  394. package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
  395. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  396. package/dist/modes/interactive/components/login-dialog.js +103 -10
  397. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  398. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -1
  399. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  400. package/dist/modes/interactive/components/markdown-transform.js +3 -2
  401. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  402. package/dist/modes/interactive/components/model-selector.d.ts +1 -0
  403. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  404. package/dist/modes/interactive/components/model-selector.js +17 -6
  405. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  406. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -0
  407. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  408. package/dist/modes/interactive/components/oauth-selector.js +13 -4
  409. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  410. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -0
  411. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  412. package/dist/modes/interactive/components/scoped-models-selector.js +14 -3
  413. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  414. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  415. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  416. package/dist/modes/interactive/components/session-selector-search.js +86 -22
  417. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  418. package/dist/modes/interactive/components/session-selector.d.ts +2 -1
  419. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  420. package/dist/modes/interactive/components/session-selector.js +15 -23
  421. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  422. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  423. package/dist/modes/interactive/components/settings-submenu.js +2 -0
  424. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  425. package/dist/modes/interactive/components/tool-execution.d.ts +7 -0
  426. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/tool-execution.js +48 -9
  428. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  429. package/dist/modes/interactive/components/tree-selector.d.ts +1 -0
  430. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  431. package/dist/modes/interactive/components/tree-selector.js +5 -6
  432. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  433. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -0
  434. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/user-message-selector.js +9 -1
  436. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  437. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  438. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/user-message.js +4 -2
  440. package/dist/modes/interactive/components/user-message.js.map +1 -1
  441. package/dist/modes/interactive/editor-host.d.ts.map +1 -1
  442. package/dist/modes/interactive/editor-host.js +3 -2
  443. package/dist/modes/interactive/editor-host.js.map +1 -1
  444. package/dist/modes/interactive/external-editor.d.ts +1 -0
  445. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  446. package/dist/modes/interactive/external-editor.js +17 -5
  447. package/dist/modes/interactive/external-editor.js.map +1 -1
  448. package/dist/modes/interactive/interactive-mode.d.ts +8 -12
  449. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  450. package/dist/modes/interactive/interactive-mode.js +169 -112
  451. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  452. package/dist/modes/interactive/model-search.d.ts +10 -0
  453. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  454. package/dist/modes/interactive/model-search.js +21 -0
  455. package/dist/modes/interactive/model-search.js.map +1 -1
  456. package/dist/modes/interactive/theme/theme.d.ts +10 -0
  457. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  458. package/dist/modes/interactive/theme/theme.js +30 -23
  459. package/dist/modes/interactive/theme/theme.js.map +1 -1
  460. package/dist/modes/interactive/tool-view/chat.d.ts +2 -2
  461. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  462. package/dist/modes/interactive/tool-view/chat.js +22 -19
  463. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  464. package/dist/modes/interactive/transcript-layout.d.ts +2 -0
  465. package/dist/modes/interactive/transcript-layout.d.ts.map +1 -1
  466. package/dist/modes/interactive/transcript-layout.js +5 -2
  467. package/dist/modes/interactive/transcript-layout.js.map +1 -1
  468. package/dist/modes/print-mode.d.ts.map +1 -1
  469. package/dist/modes/print-mode.js +1 -0
  470. package/dist/modes/print-mode.js.map +1 -1
  471. package/dist/modes/rpc/rpc-client.d.ts +9 -1
  472. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  473. package/dist/modes/rpc/rpc-client.js +23 -23
  474. package/dist/modes/rpc/rpc-client.js.map +1 -1
  475. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  476. package/dist/modes/rpc/rpc-mode.js +1 -3
  477. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  478. package/dist/package-manager-cli.d.ts.map +1 -1
  479. package/dist/package-manager-cli.js +55 -4
  480. package/dist/package-manager-cli.js.map +1 -1
  481. package/dist/utils/ansi.d.ts.map +1 -1
  482. package/dist/utils/ansi.js +5 -2
  483. package/dist/utils/ansi.js.map +1 -1
  484. package/dist/utils/clipboard-command.d.ts.map +1 -1
  485. package/dist/utils/clipboard-command.js +4 -0
  486. package/dist/utils/clipboard-command.js.map +1 -1
  487. package/dist/utils/git.d.ts +1 -1
  488. package/dist/utils/git.d.ts.map +1 -1
  489. package/dist/utils/git.js.map +1 -1
  490. package/dist/utils/image-resize-core.d.ts.map +1 -1
  491. package/dist/utils/image-resize-core.js +5 -3
  492. package/dist/utils/image-resize-core.js.map +1 -1
  493. package/dist/utils/open-browser.d.ts.map +1 -1
  494. package/dist/utils/open-browser.js +4 -1
  495. package/dist/utils/open-browser.js.map +1 -1
  496. package/dist/utils/paths.d.ts +17 -0
  497. package/dist/utils/paths.d.ts.map +1 -1
  498. package/dist/utils/paths.js +42 -1
  499. package/dist/utils/paths.js.map +1 -1
  500. package/dist/utils/shell.d.ts.map +1 -1
  501. package/dist/utils/shell.js +14 -0
  502. package/dist/utils/shell.js.map +1 -1
  503. package/dist/utils/syntax-highlight.d.ts +5 -0
  504. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  505. package/dist/utils/syntax-highlight.js +7 -0
  506. package/dist/utils/syntax-highlight.js.map +1 -1
  507. package/dist/utils/tools-manager.d.ts.map +1 -1
  508. package/dist/utils/tools-manager.js +30 -35
  509. package/dist/utils/tools-manager.js.map +1 -1
  510. package/dist/utils/usage.d.ts +5 -0
  511. package/dist/utils/usage.d.ts.map +1 -0
  512. package/dist/utils/usage.js +16 -0
  513. package/dist/utils/usage.js.map +1 -0
  514. package/docs/bundled/README.md +1 -1
  515. package/docs/bundled/extensions/agent.md +7 -7
  516. package/docs/bundled/extensions/run-summary.md +4 -4
  517. package/docs/bundled/extensions/statusline.md +1 -1
  518. package/docs/bundled/tasks.md +12 -27
  519. package/docs/bundled/tool-presentation.md +2 -2
  520. package/docs/custom-provider.md +1 -1
  521. package/docs/environment-variables.md +2 -0
  522. package/docs/extensions.md +41 -28
  523. package/docs/keybindings.md +1 -1
  524. package/docs/llama-cpp.md +17 -12
  525. package/docs/mcp.md +6 -4
  526. package/docs/models-configuration.md +1 -1
  527. package/docs/models.md +7 -85
  528. package/docs/packages.md +26 -1
  529. package/docs/rpc.md +1 -1
  530. package/docs/sdk.md +10 -8
  531. package/docs/session-format.md +3 -3
  532. package/docs/sessions.md +10 -0
  533. package/docs/settings.md +5 -4
  534. package/docs/terminal-setup.md +2 -2
  535. package/docs/tmux.md +6 -0
  536. package/docs/tui.md +12 -7
  537. package/docs/usage.md +19 -9
  538. package/docs/windows.md +29 -0
  539. package/examples/extensions/README.md +2 -1
  540. package/examples/extensions/custom-provider-anthropic/index.ts +27 -31
  541. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  542. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  543. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  544. package/examples/extensions/debug-provider.ts +2 -2
  545. package/examples/extensions/gondolin/package-lock.json +19 -29
  546. package/examples/extensions/gondolin/package.json +2 -2
  547. package/examples/extensions/preset.ts +2 -0
  548. package/examples/extensions/reload-runtime.ts +17 -5
  549. package/examples/extensions/tools.ts +2 -0
  550. package/examples/extensions/with-deps/package-lock.json +2 -2
  551. package/examples/extensions/with-deps/package.json +1 -1
  552. package/package.json +11 -12
  553. package/schemas/models.schema.json +36 -36
  554. package/schemas/settings.schema.json +17 -0
  555. package/dist/bundle/chunks/anthropic-messages-HWL6AS7T.js +0 -6
  556. package/dist/bundle/chunks/azure-openai-responses-4YYPDYV5.js +0 -2
  557. package/dist/bundle/chunks/chunk-6GTUUUCJ.js +0 -1499
  558. package/dist/bundle/chunks/chunk-6JS2SOFO.js +0 -11
  559. package/dist/bundle/chunks/chunk-ANCZPKX7.js +0 -2
  560. package/dist/bundle/chunks/chunk-FEZ5RM2B.js +0 -2
  561. package/dist/bundle/chunks/chunk-LPF7HQ3S.js +0 -4
  562. package/dist/bundle/chunks/chunk-MMNIHCU7.js +0 -2
  563. package/dist/bundle/chunks/chunk-R267VV5T.js +0 -82
  564. package/dist/bundle/chunks/chunk-RVKT7OUB.js +0 -9
  565. package/dist/bundle/chunks/chunk-SA2AQYEI.js +0 -7
  566. package/dist/bundle/chunks/chunk-ZAIGBRV5.js +0 -16
  567. package/dist/bundle/chunks/mistral-conversations-V2JJTMJ5.js +0 -5
  568. package/dist/bundle/chunks/openai-completions-TXZXILJR.js +0 -7
  569. package/dist/bundle/chunks/pi-messages-LBJQ4NGP.js +0 -8
  570. package/dist/bundle/chunks/virtual-modules-6IJ6V2CG.js +0 -2
  571. package/dist/core/isolated-session.d.ts.map +0 -1
  572. package/dist/core/isolated-session.js.map +0 -1
  573. package/dist/core/tasks/wait.d.ts +0 -19
  574. package/dist/core/tasks/wait.d.ts.map +0 -1
  575. package/dist/core/tasks/wait.js +0 -45
  576. package/dist/core/tasks/wait.js.map +0 -1
  577. package/dist/modes/interactive/tool-view/fallback.d.ts.map +0 -1
  578. package/dist/modes/interactive/tool-view/fallback.js.map +0 -1
  579. package/dist/modes/interactive/tool-view/shell.d.ts.map +0 -1
  580. package/dist/modes/interactive/tool-view/shell.js.map +0 -1
  581. package/dist/modes/interactive/tool-view/tool-execution.d.ts +0 -14
  582. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +0 -1
  583. package/dist/modes/interactive/tool-view/tool-execution.js +0 -13
  584. package/dist/modes/interactive/tool-view/tool-execution.js.map +0 -1
  585. package/dist/utils/path-identity.d.ts +0 -12
  586. package/dist/utils/path-identity.d.ts.map +0 -1
  587. package/dist/utils/path-identity.js +0 -63
  588. package/dist/utils/path-identity.js.map +0 -1
  589. package/docs/images/doom-extension.png +0 -0
  590. package/docs/images/exy.png +0 -0
  591. package/examples/extensions/sandbox/index.ts +0 -321
  592. package/examples/extensions/sandbox/package-lock.json +0 -92
  593. package/examples/extensions/sandbox/package.json +0 -19
  594. package/npm-shrinkwrap.json +0 -4207
  595. /package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.d.ts +0 -0
@@ -1,41 +1,10 @@
1
1
  /** Transcript rendering for the native tasks tool: its call/result rows, dispatched on action. */
2
2
  import { Container, Text, TruncatedText } from "@earendil-works/pi-tui";
3
- import { clampWaitMs } from "../../../core/tasks/limits.js";
4
3
  import { formatSize } from "../../../core/tools/truncate.js";
5
- import { formatDuration } from "../../../utils/duration.js";
6
4
  import { statusName, statusView } from "./status.js";
7
5
  import { fileNameOf } from "./text.js";
8
6
  /** Cap for expanded transcript views of tool-result text (already bounded at the source). */
9
7
  const RESULT_EXPAND_LIMIT = 4000;
10
- /** Live pending-wait line refresh cadence; the first settled render clears the timer. */
11
- const WAIT_REFRESH_MS = 1000;
12
- /**
13
- * Arm a one-shot 1s refresh while a wait call is pending, clear it once
14
- * settled. The timer fires → context.invalidate() → renderCall re-runs →
15
- * re-arms, so at most one armed timer exists per tool row. Unref'd: it can
16
- * never hold the process open.
17
- */
18
- export function scheduleWaitRefresh(context, pending) {
19
- const state = context.state;
20
- if (state === undefined)
21
- return; // Standalone render without shell state: nothing to schedule.
22
- if (pending) {
23
- state.dispose = () => scheduleWaitRefresh(context, false);
24
- if (state.refreshTimer === undefined) {
25
- state.refreshTimer = setTimeout(() => {
26
- state.refreshTimer = undefined;
27
- context.invalidate();
28
- }, WAIT_REFRESH_MS);
29
- state.refreshTimer.unref?.();
30
- }
31
- return;
32
- }
33
- if (state.refreshTimer !== undefined) {
34
- clearTimeout(state.refreshTimer);
35
- state.refreshTimer = undefined;
36
- }
37
- state.waitStartedAt = undefined;
38
- }
39
8
  /** Keep the end that was read: a report's summary or a log's outcome. */
40
9
  function capForTranscript(text, limit, mode = "tail") {
41
10
  if (text.length <= limit)
@@ -43,7 +12,7 @@ function capForTranscript(text, limit, mode = "tail") {
43
12
  return mode === "head" ? `${text.slice(0, limit)}…` : `…${text.slice(-limit)}`;
44
13
  }
45
14
  // ── tool call ─────────────────────────────────────────────────────────────
46
- export function renderTasksCall(args, theme, context) {
15
+ export function renderTasksCall(args, theme, _context) {
47
16
  switch (args.action) {
48
17
  case "read": {
49
18
  // The default end depends on the task's output kind, which the call does not carry.
@@ -51,8 +20,6 @@ export function renderTasksCall(args, theme, context) {
51
20
  const size = args.bytes !== undefined ? ` ${formatSize(args.bytes)}` : "";
52
21
  return new Text(`${theme.fg("toolTitle", theme.bold("tasks read "))}${theme.fg("accent", args.taskId ?? "")}${theme.fg("muted", `${mode}${size}`)}`, 0, 0);
53
22
  }
54
- case "wait":
55
- return renderWaitCall(args, theme, context);
56
23
  case "kill":
57
24
  return new Text(`${theme.fg("toolTitle", theme.bold("tasks kill "))}${theme.fg("accent", args.taskId ?? "")}`, 0, 0);
58
25
  case "list":
@@ -63,36 +30,10 @@ export function renderTasksCall(args, theme, context) {
63
30
  }
64
31
  }
65
32
  }
66
- /**
67
- * Pending wait call: elapsed/wait-window, refreshed once per second by
68
- * scheduleWaitRefresh until the result settles and takes over the row.
69
- */
70
- function renderWaitCall(args, theme, context) {
71
- const taskId = typeof args.taskId === "string" ? args.taskId.trim() : "";
72
- // isPartial alone means "not settled", which also covers argument streaming
73
- // and replayed history rows that never settle; executionStarted narrows it to
74
- // a call that is actually running. The live display also needs shell-owned
75
- // state; without it (standalone renders) fall back to the static line.
76
- const pending = context.executionStarted === true && context.isPartial === true && context.state !== undefined;
77
- scheduleWaitRefresh(context, pending);
78
- if (!pending) {
79
- const ms = args.waitMs !== undefined ? ` ${formatDuration(clampWaitMs(args.waitMs))}` : "";
80
- return new Text(`${theme.fg("toolTitle", theme.bold("tasks wait "))}${theme.fg("accent", taskId || "any")}${theme.fg("muted", ms)}`, 0, 0);
81
- }
82
- const state = context.state;
83
- if (state.waitStartedAt === undefined)
84
- state.waitStartedAt = Date.now();
85
- const elapsed = `waiting ${formatDuration(Date.now() - state.waitStartedAt)} / ${formatDuration(clampWaitMs(args.waitMs))}`;
86
- return new Text(`${theme.fg("toolTitle", theme.bold("tasks wait "))}${theme.fg("accent", taskId || "any")} ${theme.fg("muted", elapsed)}`, 0, 0);
87
- }
88
33
  // ── tool result ───────────────────────────────────────────────────────────
89
34
  export function renderTasksResult(result, options, theme, context) {
90
- // Results are always settled today; clear defensively so no live-refresh
91
- // timer can outlive its row if a host ever streams partial results.
92
- if (context.args?.action === "wait" && !options.isPartial)
93
- scheduleWaitRefresh(context, false);
94
35
  const details = result.details;
95
- // Results from older tool versions, such as `bg create`, keep their saved text.
36
+ // Results from older tool versions, such as `bg create` or `wait`, keep their saved text.
96
37
  const summary = details && !context.isError ? resultSummaryLine(details, theme, options.expanded) : undefined;
97
38
  if (summary === undefined || details === undefined) {
98
39
  const text = result.content.find((part) => part.type === "text")?.text ?? "";
@@ -102,7 +43,7 @@ export function renderTasksResult(result, options, theme, context) {
102
43
  container.addChild(new TruncatedText(summary, 1, 0));
103
44
  if (options.expanded) {
104
45
  const text = result.content.find((part) => part.type === "text")?.text ?? "";
105
- const mode = details.action === "read" || details.action === "wait" ? details.mode : undefined;
46
+ const mode = details.action === "read" ? details.mode : undefined;
106
47
  container.addChild(new Text("", 0, 0));
107
48
  container.addChild(new Text(theme.fg("toolOutput", capForTranscript(text, RESULT_EXPAND_LIMIT, mode).trimEnd()), 1, 0));
108
49
  }
@@ -123,23 +64,6 @@ function resultSummaryLine(details, theme, expanded) {
123
64
  : formatSize(details.totalBytes);
124
65
  return `${theme.fg("muted", "→ ")}${theme.fg("accent", details.taskId)}${theme.fg("muted", `${details.status ? ` ${statusName(details.status)} ·` : ""} ${size}${details.outputPath ? ` · ${shownPath(details.outputPath)}` : ""}`)}`;
125
66
  }
126
- case "wait": {
127
- const outcome = details.outcome;
128
- if (outcome === "no_tasks")
129
- return theme.fg("muted", "→ No background tasks running");
130
- const taskId = details.taskId ?? "any";
131
- if (outcome === "interrupted") {
132
- const running = details.running ? ` · ${details.running} still running` : "";
133
- return `${mark("cancelled")} ${theme.fg("accent", taskId)}${theme.fg("muted", ` wait interrupted after ${formatDuration(details.waitedMs)}${running}`)}`;
134
- }
135
- if (outcome === "timed_out") {
136
- const status = details.status ?? "running";
137
- const running = details.taskId ? formatSize(details.totalBytes) : `${details.running ?? 0} still running`;
138
- return `${mark(status)} ${theme.fg("accent", taskId)}${theme.fg("muted", ` ${statusName(status)} · wait ended after ${formatDuration(details.waitedMs)} · ${running}`)}`;
139
- }
140
- const status = details.status ?? "completed";
141
- return `${mark(status)} ${theme.fg("accent", taskId)}${theme.fg("muted", ` ${statusName(status)} · waited ${formatDuration(details.waitedMs)} · +${formatSize(details.deltaBytes)}`)}`;
142
- }
143
67
  case "kill": {
144
68
  const status = details.status ?? (details.requested ? "stopping" : "cancelled");
145
69
  return `${mark(status)} ${theme.fg("accent", details.taskId)}${theme.fg("muted", ` ${statusName(status)}${details.requested ? " · cancellation requested" : ""}`)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/render.ts"],"names":[],"mappings":"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","sourcesContent":["/** Transcript rendering for the native tasks tool: its call/result rows, dispatched on action. */\n\nimport { type Component, Container, Text, TruncatedText } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from \"../../../core/extensions/types.ts\";\nimport { clampWaitMs } from \"../../../core/tasks/limits.ts\";\nimport type { TaskStatus } from \"../../../core/tasks/types.ts\";\nimport { formatSize } from \"../../../core/tools/truncate.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport { formatDuration } from \"../../../utils/duration.ts\";\nimport type { TasksInput } from \"../tool/schema.ts\";\nimport type { TasksDetails } from \"../tool/types.ts\";\nimport { statusName, statusView } from \"./status.ts\";\nimport { fileNameOf } from \"./text.ts\";\n\n/** Arguments arrive incrementally, so `action` may not be valid yet. */\ntype TasksRenderInput = Omit<TasksInput, \"action\"> & { action?: string };\n\n/** Cap for expanded transcript views of tool-result text (already bounded at the source). */\nconst RESULT_EXPAND_LIMIT = 4000;\n/** Live pending-wait line refresh cadence; the first settled render clears the timer. */\nconst WAIT_REFRESH_MS = 1000;\n\n/** Per-call live-refresh state owned by the shell's render context. */\nexport interface TasksRenderState {\n\tdispose?: () => void;\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n\t/** First pending render of a wait call; anchors the elapsed display. */\n\twaitStartedAt?: number;\n}\n\n/**\n * Arm a one-shot 1s refresh while a wait call is pending, clear it once\n * settled. The timer fires → context.invalidate() → renderCall re-runs →\n * re-arms, so at most one armed timer exists per tool row. Unref'd: it can\n * never hold the process open.\n */\nexport function scheduleWaitRefresh(context: ToolRenderContext<TasksRenderState>, pending: boolean): void {\n\tconst state = context.state;\n\tif (state === undefined) return; // Standalone render without shell state: nothing to schedule.\n\tif (pending) {\n\t\tstate.dispose = () => scheduleWaitRefresh(context, false);\n\t\tif (state.refreshTimer === undefined) {\n\t\t\tstate.refreshTimer = setTimeout(() => {\n\t\t\t\tstate.refreshTimer = undefined;\n\t\t\t\tcontext.invalidate();\n\t\t\t}, WAIT_REFRESH_MS);\n\t\t\tstate.refreshTimer.unref?.();\n\t\t}\n\t\treturn;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\tclearTimeout(state.refreshTimer);\n\t\tstate.refreshTimer = undefined;\n\t}\n\tstate.waitStartedAt = undefined;\n}\n\n/** Keep the end that was read: a report's summary or a log's outcome. */\nfunction capForTranscript(text: string, limit: number, mode: \"head\" | \"tail\" = \"tail\"): string {\n\tif (text.length <= limit) return text;\n\treturn mode === \"head\" ? `${text.slice(0, limit)}…` : `…${text.slice(-limit)}`;\n}\n\n// ── tool call ─────────────────────────────────────────────────────────────\n\nexport function renderTasksCall(\n\targs: TasksRenderInput,\n\ttheme: Theme,\n\tcontext: ToolRenderContext<TasksRenderState>,\n): Component {\n\tswitch (args.action) {\n\t\tcase \"read\": {\n\t\t\t// The default end depends on the task's output kind, which the call does not carry.\n\t\t\tconst mode = args.mode ? ` ${args.mode}` : \"\";\n\t\t\tconst size = args.bytes !== undefined ? ` ${formatSize(args.bytes)}` : \"\";\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"tasks read \"))}${theme.fg(\"accent\", args.taskId ?? \"\")}${theme.fg(\"muted\", `${mode}${size}`)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\tcase \"wait\":\n\t\t\treturn renderWaitCall(args, theme, context);\n\t\tcase \"kill\":\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"tasks kill \"))}${theme.fg(\"accent\", args.taskId ?? \"\")}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\tcase \"list\":\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"tasks list\")), 0, 0);\n\t\tdefault: {\n\t\t\tconst action = typeof args.action === \"string\" ? ` ${theme.fg(\"dim\", args.action)}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"toolTitle\", theme.bold(\"tasks\"))}${action}`, 0, 0);\n\t\t}\n\t}\n}\n\n/**\n * Pending wait call: elapsed/wait-window, refreshed once per second by\n * scheduleWaitRefresh until the result settles and takes over the row.\n */\nfunction renderWaitCall(args: TasksRenderInput, theme: Theme, context: ToolRenderContext<TasksRenderState>): Component {\n\tconst taskId = typeof args.taskId === \"string\" ? args.taskId.trim() : \"\";\n\t// isPartial alone means \"not settled\", which also covers argument streaming\n\t// and replayed history rows that never settle; executionStarted narrows it to\n\t// a call that is actually running. The live display also needs shell-owned\n\t// state; without it (standalone renders) fall back to the static line.\n\tconst pending = context.executionStarted === true && context.isPartial === true && context.state !== undefined;\n\tscheduleWaitRefresh(context, pending);\n\tif (!pending) {\n\t\tconst ms = args.waitMs !== undefined ? ` ${formatDuration(clampWaitMs(args.waitMs))}` : \"\";\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"tasks wait \"))}${theme.fg(\"accent\", taskId || \"any\")}${theme.fg(\"muted\", ms)}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst state = context.state;\n\tif (state.waitStartedAt === undefined) state.waitStartedAt = Date.now();\n\tconst elapsed = `waiting ${formatDuration(Date.now() - state.waitStartedAt)} / ${formatDuration(clampWaitMs(args.waitMs))}`;\n\treturn new Text(\n\t\t`${theme.fg(\"toolTitle\", theme.bold(\"tasks wait \"))}${theme.fg(\"accent\", taskId || \"any\")} ${theme.fg(\"muted\", elapsed)}`,\n\t\t0,\n\t\t0,\n\t);\n}\n\n// ── tool result ───────────────────────────────────────────────────────────\n\nexport function renderTasksResult(\n\tresult: AgentToolResult<TasksDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcontext: ToolRenderContext<TasksRenderState>,\n): Component {\n\t// Results are always settled today; clear defensively so no live-refresh\n\t// timer can outlive its row if a host ever streams partial results.\n\tif (context.args?.action === \"wait\" && !options.isPartial) scheduleWaitRefresh(context, false);\n\tconst details = result.details;\n\t// Results from older tool versions, such as `bg create`, keep their saved text.\n\tconst summary = details && !context.isError ? resultSummaryLine(details, theme, options.expanded) : undefined;\n\tif (summary === undefined || details === undefined) {\n\t\tconst text = result.content.find((part) => part.type === \"text\")?.text ?? \"\";\n\t\treturn new Text(theme.fg(\"toolOutput\", text.trimEnd()), 0, 0);\n\t}\n\n\tconst container = new Container();\n\tcontainer.addChild(new TruncatedText(summary, 1, 0));\n\tif (options.expanded) {\n\t\tconst text = result.content.find((part) => part.type === \"text\")?.text ?? \"\";\n\t\tconst mode = details.action === \"read\" || details.action === \"wait\" ? details.mode : undefined;\n\t\tcontainer.addChild(new Text(\"\", 0, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(theme.fg(\"toolOutput\", capForTranscript(text, RESULT_EXPAND_LIMIT, mode).trimEnd()), 1, 0),\n\t\t);\n\t}\n\treturn container;\n}\n\nfunction resultSummaryLine(details: TasksDetails, theme: Theme, expanded: boolean): string | undefined {\n\t// Collapsed rows stay compact with the log's file name; the full path\n\t// (context-relevant, human-rarely) shows when expanded.\n\tconst shownPath = (path: string) => (expanded ? path : fileNameOf(path));\n\tconst mark = (status: TaskStatus) => {\n\t\tconst { color, glyph } = statusView(status);\n\t\treturn theme.fg(color, glyph);\n\t};\n\tswitch (details.action) {\n\t\tcase \"read\": {\n\t\t\tconst size =\n\t\t\t\tdetails.sliceBytes !== details.totalBytes\n\t\t\t\t\t? `${details.mode} ${formatSize(details.sliceBytes)} of ${formatSize(details.totalBytes)}`\n\t\t\t\t\t: formatSize(details.totalBytes);\n\t\t\treturn `${theme.fg(\"muted\", \"→ \")}${theme.fg(\"accent\", details.taskId)}${theme.fg(\"muted\", `${details.status ? ` ${statusName(details.status)} ·` : \"\"} ${size}${details.outputPath ? ` · ${shownPath(details.outputPath)}` : \"\"}`)}`;\n\t\t}\n\t\tcase \"wait\": {\n\t\t\tconst outcome = details.outcome;\n\t\t\tif (outcome === \"no_tasks\") return theme.fg(\"muted\", \"→ No background tasks running\");\n\t\t\tconst taskId = details.taskId ?? \"any\";\n\t\t\tif (outcome === \"interrupted\") {\n\t\t\t\tconst running = details.running ? ` · ${details.running} still running` : \"\";\n\t\t\t\treturn `${mark(\"cancelled\")} ${theme.fg(\"accent\", taskId)}${theme.fg(\"muted\", ` wait interrupted after ${formatDuration(details.waitedMs)}${running}`)}`;\n\t\t\t}\n\t\t\tif (outcome === \"timed_out\") {\n\t\t\t\tconst status = details.status ?? \"running\";\n\t\t\t\tconst running = details.taskId ? formatSize(details.totalBytes) : `${details.running ?? 0} still running`;\n\t\t\t\treturn `${mark(status)} ${theme.fg(\"accent\", taskId)}${theme.fg(\"muted\", ` ${statusName(status)} · wait ended after ${formatDuration(details.waitedMs)} · ${running}`)}`;\n\t\t\t}\n\t\t\tconst status = details.status ?? \"completed\";\n\t\t\treturn `${mark(status)} ${theme.fg(\"accent\", taskId)}${theme.fg(\"muted\", ` ${statusName(status)} · waited ${formatDuration(details.waitedMs)} · +${formatSize(details.deltaBytes)}`)}`;\n\t\t}\n\t\tcase \"kill\": {\n\t\t\tconst status = details.status ?? (details.requested ? \"stopping\" : \"cancelled\");\n\t\t\treturn `${mark(status)} ${theme.fg(\"accent\", details.taskId)}${theme.fg(\"muted\", ` ${statusName(status)}${details.requested ? \" · cancellation requested\" : \"\"}`)}`;\n\t\t}\n\t\tcase \"list\": {\n\t\t\tconst hidden = details.hidden > 0 ? ` · ${details.hidden} more finished` : \"\";\n\t\t\tconst omitted = details.foregroundOmitted ? ` · ${details.foregroundOmitted} foreground omitted` : \"\";\n\t\t\treturn theme.fg(\"muted\", `${details.running} running · ${details.finished} finished${hidden}${omitted}`);\n\t\t}\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/render.ts"],"names":[],"mappings":"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","sourcesContent":["/** Transcript rendering for the native tasks tool: its call/result rows, dispatched on action. */\n\nimport { type Component, Container, Text, TruncatedText } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from \"../../../core/extensions/types.ts\";\nimport type { TaskStatus } from \"../../../core/tasks/types.ts\";\nimport { formatSize } from \"../../../core/tools/truncate.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { TasksInput } from \"../tool/schema.ts\";\nimport type { TasksDetails } from \"../tool/types.ts\";\nimport { statusName, statusView } from \"./status.ts\";\nimport { fileNameOf } from \"./text.ts\";\n\n/** Arguments arrive incrementally, so `action` may not be valid yet. */\ntype TasksRenderInput = Omit<TasksInput, \"action\"> & { action?: string };\n\n/** Cap for expanded transcript views of tool-result text (already bounded at the source). */\nconst RESULT_EXPAND_LIMIT = 4000;\n\n/** Keep the end that was read: a report's summary or a log's outcome. */\nfunction capForTranscript(text: string, limit: number, mode: \"head\" | \"tail\" = \"tail\"): string {\n\tif (text.length <= limit) return text;\n\treturn mode === \"head\" ? `${text.slice(0, limit)}…` : `…${text.slice(-limit)}`;\n}\n\n// ── tool call ─────────────────────────────────────────────────────────────\n\nexport function renderTasksCall(args: TasksRenderInput, theme: Theme, _context: ToolRenderContext): Component {\n\tswitch (args.action) {\n\t\tcase \"read\": {\n\t\t\t// The default end depends on the task's output kind, which the call does not carry.\n\t\t\tconst mode = args.mode ? ` ${args.mode}` : \"\";\n\t\t\tconst size = args.bytes !== undefined ? ` ${formatSize(args.bytes)}` : \"\";\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"tasks read \"))}${theme.fg(\"accent\", args.taskId ?? \"\")}${theme.fg(\"muted\", `${mode}${size}`)}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\tcase \"kill\":\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"tasks kill \"))}${theme.fg(\"accent\", args.taskId ?? \"\")}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\tcase \"list\":\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"tasks list\")), 0, 0);\n\t\tdefault: {\n\t\t\tconst action = typeof args.action === \"string\" ? ` ${theme.fg(\"dim\", args.action)}` : \"\";\n\t\t\treturn new Text(`${theme.fg(\"toolTitle\", theme.bold(\"tasks\"))}${action}`, 0, 0);\n\t\t}\n\t}\n}\n\n// ── tool result ───────────────────────────────────────────────────────────\n\nexport function renderTasksResult(\n\tresult: AgentToolResult<TasksDetails | undefined>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcontext: ToolRenderContext,\n): Component {\n\tconst details = result.details;\n\t// Results from older tool versions, such as `bg create` or `wait`, keep their saved text.\n\tconst summary = details && !context.isError ? resultSummaryLine(details, theme, options.expanded) : undefined;\n\tif (summary === undefined || details === undefined) {\n\t\tconst text = result.content.find((part) => part.type === \"text\")?.text ?? \"\";\n\t\treturn new Text(theme.fg(\"toolOutput\", text.trimEnd()), 0, 0);\n\t}\n\n\tconst container = new Container();\n\tcontainer.addChild(new TruncatedText(summary, 1, 0));\n\tif (options.expanded) {\n\t\tconst text = result.content.find((part) => part.type === \"text\")?.text ?? \"\";\n\t\tconst mode = details.action === \"read\" ? details.mode : undefined;\n\t\tcontainer.addChild(new Text(\"\", 0, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(theme.fg(\"toolOutput\", capForTranscript(text, RESULT_EXPAND_LIMIT, mode).trimEnd()), 1, 0),\n\t\t);\n\t}\n\treturn container;\n}\n\nfunction resultSummaryLine(details: TasksDetails, theme: Theme, expanded: boolean): string | undefined {\n\t// Collapsed rows stay compact with the log's file name; the full path\n\t// (context-relevant, human-rarely) shows when expanded.\n\tconst shownPath = (path: string) => (expanded ? path : fileNameOf(path));\n\tconst mark = (status: TaskStatus) => {\n\t\tconst { color, glyph } = statusView(status);\n\t\treturn theme.fg(color, glyph);\n\t};\n\tswitch (details.action) {\n\t\tcase \"read\": {\n\t\t\tconst size =\n\t\t\t\tdetails.sliceBytes !== details.totalBytes\n\t\t\t\t\t? `${details.mode} ${formatSize(details.sliceBytes)} of ${formatSize(details.totalBytes)}`\n\t\t\t\t\t: formatSize(details.totalBytes);\n\t\t\treturn `${theme.fg(\"muted\", \"→ \")}${theme.fg(\"accent\", details.taskId)}${theme.fg(\"muted\", `${details.status ? ` ${statusName(details.status)} ·` : \"\"} ${size}${details.outputPath ? ` · ${shownPath(details.outputPath)}` : \"\"}`)}`;\n\t\t}\n\t\tcase \"kill\": {\n\t\t\tconst status = details.status ?? (details.requested ? \"stopping\" : \"cancelled\");\n\t\t\treturn `${mark(status)} ${theme.fg(\"accent\", details.taskId)}${theme.fg(\"muted\", ` ${statusName(status)}${details.requested ? \" · cancellation requested\" : \"\"}`)}`;\n\t\t}\n\t\tcase \"list\": {\n\t\t\tconst hidden = details.hidden > 0 ? ` · ${details.hidden} more finished` : \"\";\n\t\t\tconst omitted = details.foregroundOmitted ? ` · ${details.foregroundOmitted} foreground omitted` : \"\";\n\t\t\treturn theme.fg(\"muted\", `${details.running} running · ${details.finished} finished${hidden}${omitted}`);\n\t\t}\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n"]}
@@ -11,9 +11,7 @@ export declare function streamsLog(task: TaskSnapshot): boolean;
11
11
  /**
12
12
  * Output: a log streams from its file through bounded reads. Any other task shows what its
13
13
  * executor published, current with every snapshot: the human `display` when there is one,
14
- * otherwise the model-facing result. A running task whose executor renders its own Output passes
15
- * those `live` lines: they come from trusted extension code, so they are shown as they are, only
16
- * clipped to the width.
14
+ * otherwise the model-facing result.
17
15
  */
18
- export declare function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number, live?: readonly string[]): string[];
16
+ export declare function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number): string[];
19
17
  //# sourceMappingURL=views.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAmC,KAAK,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAKxG;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiCrF;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GACtB,MAAM,EAAE,CAuBV"}
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAmC,KAAK,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAKxG;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiCrF;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBjH"}
@@ -1,5 +1,5 @@
1
1
  /** The inspector's Details and Output content, computed once per task snapshot and output read. */
2
- import { Markdown, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
2
+ import { Markdown, visibleWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
3
3
  import { isTaskTerminal } from "../../../core/tasks/types.js";
4
4
  import { getMarkdownTheme, highlightCode } from "../../../modes/interactive/theme/theme.js";
5
5
  import { cleanTaskText } from "./text.js";
@@ -53,13 +53,9 @@ export function streamsLog(task) {
53
53
  /**
54
54
  * Output: a log streams from its file through bounded reads. Any other task shows what its
55
55
  * executor published, current with every snapshot: the human `display` when there is one,
56
- * otherwise the model-facing result. A running task whose executor renders its own Output passes
57
- * those `live` lines: they come from trusted extension code, so they are shown as they are, only
58
- * clipped to the width.
56
+ * otherwise the model-facing result.
59
57
  */
60
- export function outputLines(task, read, theme, width, live) {
61
- if (live && !isTaskTerminal(task.status))
62
- return live.map((line) => truncateToWidth(line, Math.max(1, width)));
58
+ export function outputLines(task, read, theme, width) {
63
59
  const empty = task.status === "completed"
64
60
  ? "Completed with no output."
65
61
  : isTaskTerminal(task.status)
@@ -1 +1 @@
1
- {"version":3,"file":"views.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"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","sourcesContent":["/** The inspector's Details and Output content, computed once per task snapshot and output read. */\nimport { Markdown, truncateToWidth, visibleWidth, wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport { isTaskTerminal, type TaskRead, type TaskSnapshot } from \"../../../core/tasks/types.ts\";\nimport { getMarkdownTheme, highlightCode, type Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport { cleanTaskText } from \"./text.ts\";\n\ntype DetailRow = [label: string, value: string, tone?: \"warning\"];\n\n/**\n * Details: identity first, then the executor's input and facts as aligned rows whose values wrap\n * within their own column to `width`, then a multi-line input block. The source, status and\n * runtime are in the inspector header.\n */\nexport function detailLines(task: TaskSnapshot, theme: Theme, width: number): string[] {\n\tconst input = task.input && {\n\t\t...task.input,\n\t\tlabel: cleanTaskText(task.input.label),\n\t\ttext: cleanTaskText(task.input.text),\n\t};\n\tconst inputLines = input\n\t\t? input.language\n\t\t\t? highlightCode(input.text, input.language)\n\t\t\t: input.text.split(\"\\n\")\n\t\t: [];\n\tconst rows: DetailRow[] = [[\"Task ID\", task.id]];\n\tif (task.error) rows.push([\"Error\", cleanTaskText(task.error).replace(/\\n/g, \" \"), \"warning\"]);\n\t// Without an input, the title is the only complete description of the work.\n\tif (!input) rows.push([\"Title\", cleanTaskText(task.title)]);\n\telse if (inputLines.length <= 1) rows.push([input.label, inputLines[0] ?? \"\"]);\n\tfor (const [label, value] of task.facts ?? []) rows.push([cleanTaskText(label), cleanTaskText(value)]);\n\t// A fact that already names the output file would repeat it.\n\tconst shownAsFact = task.facts?.some(([, value]) => value === task.outputPath);\n\tif (task.outputPath && !shownAsFact)\n\t\trows.push([task.output === \"log\" ? \"Log\" : \"Full report\", cleanTaskText(task.outputPath)]);\n\tconst labelWidth = Math.max(9, ...rows.map(([label]) => visibleWidth(label))) + 1;\n\t// Values wrap inside their own column, so continuation lines hang under the first value line.\n\tconst valueWidth = Math.max(1, width - labelWidth);\n\tconst lines = rows.flatMap(([label, value, tone]) =>\n\t\twrapTextWithAnsi(value, valueWidth).map((line, index) => {\n\t\t\tconst lead = index ? \" \".repeat(labelWidth) : label + \" \".repeat(labelWidth - visibleWidth(label));\n\t\t\treturn lead + (tone ? theme.fg(tone, line) : line);\n\t\t}),\n\t);\n\tif (input && inputLines.length > 1) lines.push(\"\", theme.fg(\"accent\", input.label), ...inputLines);\n\tif (input?.truncated) lines.push(theme.fg(\"warning\", `[Saved ${input.label.toLowerCase()} truncated.]`));\n\treturn lines;\n}\n\n/** Whether Output streams from a file; any other task shows what its executor published. */\nexport function streamsLog(task: TaskSnapshot): boolean {\n\treturn task.output === \"log\" && task.outputPath !== undefined;\n}\n\n/**\n * Output: a log streams from its file through bounded reads. Any other task shows what its\n * executor published, current with every snapshot: the human `display` when there is one,\n * otherwise the model-facing result. A running task whose executor renders its own Output passes\n * those `live` lines: they come from trusted extension code, so they are shown as they are, only\n * clipped to the width.\n */\nexport function outputLines(\n\ttask: TaskSnapshot,\n\tread: TaskRead | undefined,\n\ttheme: Theme,\n\twidth: number,\n\tlive?: readonly string[],\n): string[] {\n\tif (live && !isTaskTerminal(task.status)) return live.map((line) => truncateToWidth(line, Math.max(1, width)));\n\tconst empty =\n\t\ttask.status === \"completed\"\n\t\t\t? \"Completed with no output.\"\n\t\t\t: isTaskTerminal(task.status)\n\t\t\t\t? \"No saved output.\"\n\t\t\t\t: \"No output yet.\";\n\tconst fromLog = streamsLog(task) && read !== undefined && !read.readError;\n\tconst human = task.display?.text ? task.display : undefined;\n\tconst published = human ?? task.result;\n\tconst text = cleanTaskText((fromLog ? read.text : published?.text) || empty);\n\t// Logs and live progress keep their plain rendering; only a settled report's result is Markdown.\n\tconst markdown = !fromLog && !human && task.output === \"report\" && task.status === \"completed\";\n\tconst output = markdown\n\t\t? new Markdown(text, 0, 0, getMarkdownTheme(), {\n\t\t\t\tcolor: (line) => theme.fg(\"toolOutput\", line),\n\t\t\t}).render(Math.max(1, width))\n\t\t: text.split(\"\\n\").map((line) => theme.fg(\"toolOutput\", line));\n\tif (read?.readError) output.unshift(theme.fg(\"warning\", \"Log unavailable; showing saved result.\"));\n\tif (!fromLog && published?.truncated)\n\t\toutput.push(theme.fg(\"warning\", human ? \"Output truncated.\" : \"Saved result truncated.\"));\n\treturn output;\n}\n"]}
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"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","sourcesContent":["/** The inspector's Details and Output content, computed once per task snapshot and output read. */\nimport { Markdown, visibleWidth, wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport { isTaskTerminal, type TaskRead, type TaskSnapshot } from \"../../../core/tasks/types.ts\";\nimport { getMarkdownTheme, highlightCode, type Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport { cleanTaskText } from \"./text.ts\";\n\ntype DetailRow = [label: string, value: string, tone?: \"warning\"];\n\n/**\n * Details: identity first, then the executor's input and facts as aligned rows whose values wrap\n * within their own column to `width`, then a multi-line input block. The source, status and\n * runtime are in the inspector header.\n */\nexport function detailLines(task: TaskSnapshot, theme: Theme, width: number): string[] {\n\tconst input = task.input && {\n\t\t...task.input,\n\t\tlabel: cleanTaskText(task.input.label),\n\t\ttext: cleanTaskText(task.input.text),\n\t};\n\tconst inputLines = input\n\t\t? input.language\n\t\t\t? highlightCode(input.text, input.language)\n\t\t\t: input.text.split(\"\\n\")\n\t\t: [];\n\tconst rows: DetailRow[] = [[\"Task ID\", task.id]];\n\tif (task.error) rows.push([\"Error\", cleanTaskText(task.error).replace(/\\n/g, \" \"), \"warning\"]);\n\t// Without an input, the title is the only complete description of the work.\n\tif (!input) rows.push([\"Title\", cleanTaskText(task.title)]);\n\telse if (inputLines.length <= 1) rows.push([input.label, inputLines[0] ?? \"\"]);\n\tfor (const [label, value] of task.facts ?? []) rows.push([cleanTaskText(label), cleanTaskText(value)]);\n\t// A fact that already names the output file would repeat it.\n\tconst shownAsFact = task.facts?.some(([, value]) => value === task.outputPath);\n\tif (task.outputPath && !shownAsFact)\n\t\trows.push([task.output === \"log\" ? \"Log\" : \"Full report\", cleanTaskText(task.outputPath)]);\n\tconst labelWidth = Math.max(9, ...rows.map(([label]) => visibleWidth(label))) + 1;\n\t// Values wrap inside their own column, so continuation lines hang under the first value line.\n\tconst valueWidth = Math.max(1, width - labelWidth);\n\tconst lines = rows.flatMap(([label, value, tone]) =>\n\t\twrapTextWithAnsi(value, valueWidth).map((line, index) => {\n\t\t\tconst lead = index ? \" \".repeat(labelWidth) : label + \" \".repeat(labelWidth - visibleWidth(label));\n\t\t\treturn lead + (tone ? theme.fg(tone, line) : line);\n\t\t}),\n\t);\n\tif (input && inputLines.length > 1) lines.push(\"\", theme.fg(\"accent\", input.label), ...inputLines);\n\tif (input?.truncated) lines.push(theme.fg(\"warning\", `[Saved ${input.label.toLowerCase()} truncated.]`));\n\treturn lines;\n}\n\n/** Whether Output streams from a file; any other task shows what its executor published. */\nexport function streamsLog(task: TaskSnapshot): boolean {\n\treturn task.output === \"log\" && task.outputPath !== undefined;\n}\n\n/**\n * Output: a log streams from its file through bounded reads. Any other task shows what its\n * executor published, current with every snapshot: the human `display` when there is one,\n * otherwise the model-facing result.\n */\nexport function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number): string[] {\n\tconst empty =\n\t\ttask.status === \"completed\"\n\t\t\t? \"Completed with no output.\"\n\t\t\t: isTaskTerminal(task.status)\n\t\t\t\t? \"No saved output.\"\n\t\t\t\t: \"No output yet.\";\n\tconst fromLog = streamsLog(task) && read !== undefined && !read.readError;\n\tconst human = task.display?.text ? task.display : undefined;\n\tconst published = human ?? task.result;\n\tconst text = cleanTaskText((fromLog ? read.text : published?.text) || empty);\n\t// Logs and live progress keep their plain rendering; only a settled report's result is Markdown.\n\tconst markdown = !fromLog && !human && task.output === \"report\" && task.status === \"completed\";\n\tconst output = markdown\n\t\t? new Markdown(text, 0, 0, getMarkdownTheme(), {\n\t\t\t\tcolor: (line) => theme.fg(\"toolOutput\", line),\n\t\t\t}).render(Math.max(1, width))\n\t\t: text.split(\"\\n\").map((line) => theme.fg(\"toolOutput\", line));\n\tif (read?.readError) output.unshift(theme.fg(\"warning\", \"Log unavailable; showing saved result.\"));\n\tif (!fromLog && published?.truncated)\n\t\toutput.push(theme.fg(\"warning\", human ? \"Output truncated.\" : \"Saved result truncated.\"));\n\treturn output;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/fallback.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAO/E,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAexD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,UAAQ,GAAG,SAAS,CAK/F;AAED,oGAAoG;AACpG,qBAAa,uBAAwB,YAAW,SAAS;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAU;gBAEd,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IAK7C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAa/B,UAAU,IAAI,IAAI;CAClB"}
@@ -1,10 +1,10 @@
1
1
  /** Generic call and result presentation for a tool that supplies no renderer. */
2
2
  import { Text, truncateToWidth } from "@earendil-works/pi-tui";
3
- import { formatToolCallWithArgs } from "../../../core/tools/render-utils.js";
4
- import { keyHint } from "../components/keybinding-hints.js";
5
- import { truncateToVisualLines } from "../components/visual-truncate.js";
6
- import { theme } from "../theme/theme.js";
7
- import { toolStyle } from "./style.js";
3
+ import { formatToolCallWithArgs } from "../../core/tools/render-utils.js";
4
+ import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
5
+ import { truncateToVisualLines } from "../../modes/interactive/components/visual-truncate.js";
6
+ import { theme } from "../../modes/interactive/theme/theme.js";
7
+ import { toolStyle } from "../../modes/interactive/tool-view/style.js";
8
8
  /** One-line `key=value` summary of a call's arguments, bounded by `toolStyle.fallbackArgsWidth`. */
9
9
  export function formatFallbackArgs(args) {
10
10
  if (!args || typeof args !== "object")
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/fallback.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAkB,IAAI,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAC9F,OAAO,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAC;AAEvE,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC/C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO;SACrB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC;YACJ,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,CAAC;IACF,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvB,OAAO,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,IAAa,EAAE,QAAQ,GAAG,KAAK;IACnF,IAAI,QAAQ;QAAE,OAAO,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,oGAAoG;AACpG,MAAM,OAAO,uBAAuB;IAInC,YAAY,MAAc,EAAE,QAAiB;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErE,MAAM,OAAO,GAAG,qBAAqB,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC9F,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,WAAW,CAAC;QAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3D,MAAM,IAAI,GACT,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,OAAO,CAAC,YAAY,YAAY,IAAI,GAAG,CAAC;YAClE,IAAI,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtE,CAAC;IAED,UAAU,KAAU,CAAC;CACrB","sourcesContent":["/** Generic call and result presentation for a tool that supplies no renderer. */\n\nimport { type Component, Text, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { formatToolCallWithArgs } from \"../../core/tools/render-utils.ts\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { truncateToVisualLines } from \"../../modes/interactive/components/visual-truncate.ts\";\nimport { theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { toolStyle } from \"../../modes/interactive/tool-view/style.ts\";\n\n/** One-line `key=value` summary of a call's arguments, bounded by `toolStyle.fallbackArgsWidth`. */\nexport function formatFallbackArgs(args: unknown): string {\n\tif (!args || typeof args !== \"object\") return \"\";\n\tconst entries = Object.entries(args);\n\tif (entries.length === 0) return \"\";\n\tconst summary = entries\n\t\t.map(([key, value]) => {\n\t\t\ttry {\n\t\t\t\treturn `${key}=${JSON.stringify(value) ?? String(value)}`;\n\t\t\t} catch {\n\t\t\t\treturn `${key}=${String(value)}`;\n\t\t\t}\n\t\t})\n\t\t.join(\" \")\n\t\t.replace(/\\s+/g, \" \");\n\treturn truncateToWidth(summary, toolStyle.fallbackArgsWidth, \"...\");\n}\n\nexport function createCallFallback(toolName: string, args: unknown, expanded = false): Component {\n\tif (expanded) return new Text(formatToolCallWithArgs(toolName, args, theme, true), 0, 0);\n\tconst summary = formatFallbackArgs(args);\n\tconst suffix = summary ? theme.fg(\"dim\", `(${summary})`) : \"\";\n\treturn new Text(`${theme.fg(\"toolTitle\", theme.bold(toolName))}${suffix}`, 0, 0);\n}\n\n/** The last `toolStyle.collapsed.fallbackLines` lines of the output, or all of it when expanded. */\nexport class FallbackResultComponent implements Component {\n\tprivate output: string;\n\tprivate expanded: boolean;\n\n\tconstructor(output: string, expanded: boolean) {\n\t\tthis.output = output;\n\t\tthis.expanded = expanded;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst styledOutput = theme.fg(\"toolOutput\", this.output);\n\t\tif (this.expanded) return new Text(styledOutput, 0, 0).render(width);\n\n\t\tconst preview = truncateToVisualLines(styledOutput, toolStyle.collapsed.fallbackLines, width);\n\t\tif (preview.skippedCount <= 0) return preview.visualLines;\n\t\tconst noun = preview.skippedCount === 1 ? \"line\" : \"lines\";\n\t\tconst hint =\n\t\t\ttheme.fg(\"muted\", `... (${preview.skippedCount} earlier ${noun},`) +\n\t\t\t` ${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\treturn [truncateToWidth(hint, width, \"...\"), ...preview.visualLines];\n\t}\n\n\tinvalidate(): void {}\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { withToolShell } from "../../modes/interactive/tool-view/shell.js";
1
+ import { withToolShell } from "./shell.js";
2
2
  /**
3
3
  * Distribution tool chrome. Only TUI shell metadata is attached here: renderer functions,
4
4
  * execution, and HTML export remain owned by their original providers.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAE3E;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAgB;IACxD,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { withToolShell } from \"../../modes/interactive/tool-view/shell.ts\";\n\n/**\n * Distribution tool chrome. Only TUI shell metadata is attached here: renderer functions,\n * execution, and HTML export remain owned by their original providers.\n */\nexport default function toolPresentation(pi: ExtensionAPI): void {\n\tpi.registerToolRenderer((toolName, next) => withToolShell(toolName, next()));\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAgB;IACxD,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { withToolShell } from \"./shell.ts\";\n\n/**\n * Distribution tool chrome. Only TUI shell metadata is attached here: renderer functions,\n * execution, and HTML export remain owned by their original providers.\n */\nexport default function toolPresentation(pi: ExtensionAPI): void {\n\tpi.registerToolRenderer((toolName, next) => withToolShell(toolName, next()));\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ToolDefinition, ToolExecutionShell, ToolRenderers } from "../../../core/extensions/types.ts";
1
+ import type { ToolDefinition, ToolExecutionShell, ToolRenderers } from "../../core/extensions/types.ts";
2
2
  export type ToolDefinitionLike = ToolRenderers | ToolDefinition<any, any, any>;
3
3
  /**
4
4
  * Create the distribution's TUI chrome without changing a tool's call or result renderers.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/shell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,cAAc,EACd,kBAAkB,EAElB,aAAa,EACb,MAAM,gCAAgC,CAAC;AAMxC,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAS/E;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,kBAAkB,CAuBhH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,kBAAkB,CAG9G"}
@@ -1,8 +1,8 @@
1
1
  import { Container } from "@earendil-works/pi-tui";
2
- import { getTextOutput as getRenderedTextOutput } from "../../../core/tools/render-utils.js";
3
- import { createAllToolRenderers } from "../../../core/tools/renderers/index.js";
2
+ import { getTextOutput as getRenderedTextOutput } from "../../core/tools/render-utils.js";
3
+ import { createAllToolRenderers } from "../../core/tools/renderers/index.js";
4
+ import { FramedComponent, toolMarkerColor, toolStatus, toolStyle } from "../../modes/interactive/tool-view/style.js";
4
5
  import { createCallFallback, FallbackResultComponent } from "./fallback.js";
5
- import { FramedComponent, toolMarkerColor, toolStatus, toolStyle } from "./style.js";
6
6
  let builtInRenderers;
7
7
  function builtInResultRenderer(toolName) {
8
8
  builtInRenderers ??= createAllToolRenderers();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAOnE,OAAO,EAAE,aAAa,IAAI,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAC;AACrH,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAI5E,IAAI,gBAAuE,CAAC;AAE5E,SAAS,qBAAqB,CAAC,QAAgB;IAC9C,gBAAgB,KAAK,sBAAsB,EAAE,CAAC;IAC9C,OAAQ,gBAAkD,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;AACpF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,UAA0C;IAC3F,MAAM,cAAc,GAAG,UAAU,EAAE,YAAY,CAAC;IAChD,OAAO;QACN,IAAI,GAAG;YACN,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,SAAoB,EAAE,IAAuB,EAAE,OAA0B;YAC9E,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO;YAC/B,OAAO,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO;YAC7C,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YACjE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;QACzF,CAAC;QACD,gBAAgB,CAAC,OAAO;YACvB,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvG,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAChD,iGAAiG;YACjG,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,cAAc,CAAC;QAC5D,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,UAA0C;IACzF,IAAI,UAAU,EAAE,WAAW,KAAK,MAAM,IAAI,UAAU,EAAE,KAAK;QAAE,OAAO,UAAU,CAAC;IAC/E,OAAO,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;AAChF,CAAC","sourcesContent":["import { type Component, Container } from \"@earendil-works/pi-tui\";\nimport type {\n\tToolDefinition,\n\tToolExecutionShell,\n\tToolRenderContext,\n\tToolRenderers,\n} from \"../../core/extensions/types.ts\";\nimport { getTextOutput as getRenderedTextOutput } from \"../../core/tools/render-utils.ts\";\nimport { createAllToolRenderers } from \"../../core/tools/renderers/index.ts\";\nimport { FramedComponent, toolMarkerColor, toolStatus, toolStyle } from \"../../modes/interactive/tool-view/style.ts\";\nimport { createCallFallback, FallbackResultComponent } from \"./fallback.ts\";\n\nexport type ToolDefinitionLike = ToolRenderers | ToolDefinition<any, any, any>;\n\nlet builtInRenderers: ReturnType<typeof createAllToolRenderers> | undefined;\n\nfunction builtInResultRenderer(toolName: string): ToolRenderers[\"renderResult\"] {\n\tbuiltInRenderers ??= createAllToolRenderers();\n\treturn (builtInRenderers as Record<string, ToolRenderers>)[toolName]?.renderResult;\n}\n\n/**\n * Create the distribution's TUI chrome without changing a tool's call or result renderers.\n * The native component invokes these fallbacks only when the corresponding renderer slot is empty\n * or fails. HTML export never reads this object.\n */\nexport function createToolShell(toolName: string, definition: ToolDefinitionLike | undefined): ToolExecutionShell {\n\tconst resultRenderer = definition?.renderResult;\n\treturn {\n\t\tget gap() {\n\t\t\treturn toolStyle.gap;\n\t\t},\n\t\tframe(component: Component, kind: \"header\" | \"body\", context: ToolRenderContext): Component {\n\t\t\treturn new FramedComponent(component, kind, () => toolMarkerColor(toolStatus(context)));\n\t\t},\n\t\trenderCall(args, _theme, context) {\n\t\t\treturn createCallFallback(toolName, args, context.expanded);\n\t\t},\n\t\trenderResult(result, _options, _theme, context) {\n\t\t\tconst output = getRenderedTextOutput(result, context.showImages);\n\t\t\treturn output ? new FallbackResultComponent(output, context.expanded) : new Container();\n\t\t},\n\t\tshouldHideResult(context) {\n\t\t\tif (context.expanded || context.isError || !toolStyle.collapsed.headerOnly.has(toolName)) return false;\n\t\t\tconst builtIn = builtInResultRenderer(toolName);\n\t\t\t// Only fold the built-in result renderer. An extension that replaces it owns its collapsed view.\n\t\t\treturn builtIn !== undefined && builtIn === resultRenderer;\n\t\t},\n\t};\n}\n\n/**\n * Attach the distribution shell while preserving renderer identity and explicit shell ownership.\n * In particular, this does not set renderShell or wrap renderCall/renderResult, so HTML export and\n * other renderer resolvers continue to see the original functions.\n */\nexport function withToolShell(toolName: string, definition: ToolDefinitionLike | undefined): ToolDefinitionLike {\n\tif (definition?.renderShell === \"self\" || definition?.shell) return definition;\n\treturn { ...(definition ?? {}), shell: createToolShell(toolName, definition) };\n}\n"]}
@@ -11,10 +11,13 @@ import { type Static, Type } from "typebox";
11
11
  import type { ExtensionAPI, ToolDefinition, ToolInfo, ToolNamespace } from "../../core/extensions/types.ts";
12
12
  export declare const TOOL_SEARCH_TOOL_NAME = "tool_search";
13
13
  export declare const DEFAULT_TOOL_SEARCH_LIMIT = 8;
14
- /** A tool as the ranker sees it: its name and the text built by {@link createToolSearchDocument}. */
14
+ /** A tool as the ranker sees it: its name and the texts built by {@link createToolSearchDocument}. */
15
15
  export interface ToolSearchDocument {
16
16
  name: string;
17
+ /** Description, schema descriptions, and property names. */
17
18
  text: string;
19
+ /** Name, description, and instructions of the tool's namespace. */
20
+ namespaceText?: string;
18
21
  }
19
22
  export interface ToolSearchMatch {
20
23
  name: string;
@@ -24,15 +27,27 @@ export interface ToolSearchMatch {
24
27
  export interface ToolRanker {
25
28
  rank(query: string, documents: readonly ToolSearchDocument[], limit: number): ToolSearchMatch[];
26
29
  }
27
- /** Lowercase terms, split at camelCase boundaries and non-alphanumerics, without stop words. */
30
+ /** Unicode word segmentation with identifier boundaries and English stop words/singular forms. */
28
31
  export declare function tokenize(text: string): string[];
29
32
  /**
30
- * Search text of a tool: the name, the name with `_`
31
- * as spaces, the description, schema descriptions and property names, and the namespace with its
32
- * description and instructions.
33
+ * Search text of a tool: the description and the schema descriptions and property names, and
34
+ * separately the namespace name, description, and instructions. The ranker reads the name from `name`.
33
35
  */
34
36
  export declare function createToolSearchDocument(tool: Pick<ToolInfo, "name" | "description" | "parameters">, namespace?: ToolNamespace): ToolSearchDocument;
35
- /** Okapi BM25 with the usual parameters. Ties keep document order. */
37
+ /**
38
+ * Okapi BM25 over the description, with the name and the namespace as separate fields:
39
+ * - a tool that matches more of the query's terms, in any field, ranks above one that matches
40
+ * fewer, whatever their scores: for `screenshot window`, a tool whose description has both words
41
+ * beats `window`, whose name has one;
42
+ * - a query term in the name scores more than any number of mentions in the description;
43
+ * - a tool whose whole local name is in the query (`app` in `peekaboo app` for
44
+ * `mcp__peekaboo__app`) gets a bonus worth one more match of every query term, so among tools
45
+ * matching as many terms it mostly wins over tools that only mention the words;
46
+ * - a query that is exactly a tool's name ranks that tool first, before coverage.
47
+ *
48
+ * The description alone is length-normalized, so a long name or long namespace instructions do
49
+ * not lower a tool's score. Ties keep document order.
50
+ */
36
51
  export declare class Bm25Ranker implements ToolRanker {
37
52
  private readonly k1;
38
53
  private readonly b;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-search/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EACX,YAAY,EACZ,cAAc,EAEd,QAAQ,EACR,aAAa,EACb,MAAM,gCAAgC,CAAC;AAExC,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AACnD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,qGAAqG;AACrG,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;CAChG;AAkCD,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ/C;AAuBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC,EAC3D,SAAS,CAAC,EAAE,aAAa,GACvB,kBAAkB,CAKpB;AAED,sEAAsE;AACtE,qBAAa,UAAW,YAAW,UAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;gBAEf,OAAO,GAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAO;IAKrD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;CA6B/F;AAED,eAAO,MAAM,gBAAgB;;;EAK3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACrC,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,CAAC;CAChF;AA2BD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,2VAAyX,CAAC;AAE9Z,wBAAgB,8BAA8B,CAC7C,OAAO,GAAE,qBAA0B,GACjC,cAAc,CAAC,OAAO,gBAAgB,EAAE,qBAAqB,CAAC,CAyBhE"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-search/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EACX,YAAY,EACZ,cAAc,EAEd,QAAQ,EACR,aAAa,EACb,MAAM,gCAAgC,CAAC;AAExC,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AACnD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,sGAAsG;AACtG,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;CAChG;AAoCD,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAe/C;AAuBD;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC,EAC3D,SAAS,CAAC,EAAE,aAAa,GACvB,kBAAkB,CAOpB;AA0DD;;;;;;;;;;;;;GAaG;AACH,qBAAa,UAAW,YAAW,UAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;gBAEf,OAAO,GAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAO;IAKrD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;CAwC/F;AAED,eAAO,MAAM,gBAAgB;;;EAK3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACrC,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,CAAC;CAChF;AA2BD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,2VAAyX,CAAC;AAE9Z,wBAAgB,8BAA8B,CAC7C,OAAO,GAAE,qBAA0B,GACjC,cAAc,CAAC,OAAO,gBAAgB,EAAE,qBAAqB,CAAC,CAyBhE"}