@astralyn/pi 1.4.11 → 1.5.1

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 (564) hide show
  1. package/CHANGELOG.md +79 -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-TH3QDDPD.js → chunk-3YGNXVKM.js} +1 -1
  6. package/dist/bundle/chunks/chunk-AXX7FFFD.js +2 -0
  7. package/dist/bundle/chunks/chunk-FNGB3ASD.js +2 -0
  8. package/dist/bundle/chunks/chunk-FPALVF3F.js +4 -0
  9. package/dist/bundle/chunks/chunk-H3UF54OB.js +9 -0
  10. package/dist/bundle/chunks/{chunk-NUQMVNKQ.js → chunk-HLVMLRZJ.js} +58 -62
  11. package/dist/bundle/chunks/chunk-IC6JXX2J.js +10 -0
  12. package/dist/bundle/chunks/{chunk-MZJC45TM.js → chunk-J7L6O5XA.js} +3 -3
  13. package/dist/bundle/chunks/{chunk-DLVLAQEG.js → chunk-KBFO53OG.js} +3 -3
  14. package/dist/bundle/chunks/chunk-M3D4ADUT.js +1503 -0
  15. package/dist/bundle/chunks/{chunk-TPVFPFJP.js → chunk-P7VXFB2M.js} +1 -1
  16. package/dist/bundle/chunks/chunk-PSYLMRL6.js +9 -0
  17. package/dist/bundle/chunks/chunk-QNZARXLE.js +82 -0
  18. package/dist/bundle/chunks/chunk-RAIYJ5FC.js +4 -0
  19. package/dist/bundle/chunks/{chunk-OV2VMHBX.js → chunk-SR6EWNPW.js} +1 -1
  20. package/dist/bundle/chunks/chunk-TA3YH2ZI.js +16 -0
  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-VLAIP26K.js → execute-SSRW6NGS.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-NFDW2JKH.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 -93
  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 +1 -1
  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 +7 -6
  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/activity.d.ts +14 -0
  160. package/dist/core/tasks/activity.d.ts.map +1 -0
  161. package/dist/core/tasks/activity.js +58 -0
  162. package/dist/core/tasks/activity.js.map +1 -0
  163. package/dist/core/tasks/codec.d.ts +14 -0
  164. package/dist/core/tasks/codec.d.ts.map +1 -1
  165. package/dist/core/tasks/codec.js +57 -4
  166. package/dist/core/tasks/codec.js.map +1 -1
  167. package/dist/core/tasks/execution.d.ts.map +1 -1
  168. package/dist/core/tasks/execution.js +2 -2
  169. package/dist/core/tasks/execution.js.map +1 -1
  170. package/dist/core/tasks/output.d.ts +4 -1
  171. package/dist/core/tasks/output.d.ts.map +1 -1
  172. package/dist/core/tasks/output.js +33 -0
  173. package/dist/core/tasks/output.js.map +1 -1
  174. package/dist/core/tasks/record.d.ts +1 -7
  175. package/dist/core/tasks/record.d.ts.map +1 -1
  176. package/dist/core/tasks/record.js +0 -18
  177. package/dist/core/tasks/record.js.map +1 -1
  178. package/dist/core/tasks/reminder.d.ts +3 -2
  179. package/dist/core/tasks/reminder.d.ts.map +1 -1
  180. package/dist/core/tasks/reminder.js +4 -3
  181. package/dist/core/tasks/reminder.js.map +1 -1
  182. package/dist/core/tasks/runtime.d.ts +0 -2
  183. package/dist/core/tasks/runtime.d.ts.map +1 -1
  184. package/dist/core/tasks/runtime.js +2 -15
  185. package/dist/core/tasks/runtime.js.map +1 -1
  186. package/dist/core/tasks/session.d.ts +9 -2
  187. package/dist/core/tasks/session.d.ts.map +1 -1
  188. package/dist/core/tasks/session.js +23 -9
  189. package/dist/core/tasks/session.js.map +1 -1
  190. package/dist/core/tasks/types.d.ts +20 -20
  191. package/dist/core/tasks/types.d.ts.map +1 -1
  192. package/dist/core/tasks/types.js +1 -1
  193. package/dist/core/tasks/types.js.map +1 -1
  194. package/dist/core/tools/bash.d.ts +8 -7
  195. package/dist/core/tools/bash.d.ts.map +1 -1
  196. package/dist/core/tools/bash.js +6 -5
  197. package/dist/core/tools/bash.js.map +1 -1
  198. package/dist/core/tools/edit.d.ts +3 -3
  199. package/dist/core/tools/edit.d.ts.map +1 -1
  200. package/dist/core/tools/edit.js +2 -4
  201. package/dist/core/tools/edit.js.map +1 -1
  202. package/dist/core/tools/find.d.ts +2 -2
  203. package/dist/core/tools/find.d.ts.map +1 -1
  204. package/dist/core/tools/find.js.map +1 -1
  205. package/dist/core/tools/grep.d.ts +2 -2
  206. package/dist/core/tools/grep.d.ts.map +1 -1
  207. package/dist/core/tools/grep.js +1 -1
  208. package/dist/core/tools/grep.js.map +1 -1
  209. package/dist/core/tools/ls.d.ts +2 -2
  210. package/dist/core/tools/ls.d.ts.map +1 -1
  211. package/dist/core/tools/ls.js.map +1 -1
  212. package/dist/core/tools/powershell.d.ts +1 -5
  213. package/dist/core/tools/powershell.d.ts.map +1 -1
  214. package/dist/core/tools/read.d.ts +2 -2
  215. package/dist/core/tools/read.d.ts.map +1 -1
  216. package/dist/core/tools/read.js.map +1 -1
  217. package/dist/core/tools/render-utils.d.ts +4 -6
  218. package/dist/core/tools/render-utils.d.ts.map +1 -1
  219. package/dist/core/tools/render-utils.js +19 -41
  220. package/dist/core/tools/render-utils.js.map +1 -1
  221. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  222. package/dist/core/tools/renderers/bash.js +3 -25
  223. package/dist/core/tools/renderers/bash.js.map +1 -1
  224. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  225. package/dist/core/tools/renderers/write.js +18 -19
  226. package/dist/core/tools/renderers/write.js.map +1 -1
  227. package/dist/core/tools/shell-execution.d.ts +20 -13
  228. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  229. package/dist/core/tools/shell-execution.js +165 -183
  230. package/dist/core/tools/shell-execution.js.map +1 -1
  231. package/dist/core/tools/shell-tool.d.ts +9 -14
  232. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  233. package/dist/core/tools/shell-tool.js +38 -66
  234. package/dist/core/tools/shell-tool.js.map +1 -1
  235. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -4
  236. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  237. package/dist/core/tools/tool-definition-wrapper.js +2 -3
  238. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  239. package/dist/core/tools/write.d.ts +2 -2
  240. package/dist/core/tools/write.d.ts.map +1 -1
  241. package/dist/core/tools/write.js.map +1 -1
  242. package/dist/core/trust-manager.d.ts.map +1 -1
  243. package/dist/core/trust-manager.js +30 -13
  244. package/dist/core/trust-manager.js.map +1 -1
  245. package/dist/core/usage-totals.d.ts +0 -9
  246. package/dist/core/usage-totals.d.ts.map +1 -1
  247. package/dist/core/usage-totals.js +24 -91
  248. package/dist/core/usage-totals.js.map +1 -1
  249. package/dist/extensions/agent/activity-lines.d.ts +2 -7
  250. package/dist/extensions/agent/activity-lines.d.ts.map +1 -1
  251. package/dist/extensions/agent/activity-lines.js +6 -74
  252. package/dist/extensions/agent/activity-lines.js.map +1 -1
  253. package/dist/extensions/agent/activity.d.ts +0 -21
  254. package/dist/extensions/agent/activity.d.ts.map +1 -1
  255. package/dist/extensions/agent/activity.js +0 -63
  256. package/dist/extensions/agent/activity.js.map +1 -1
  257. package/dist/extensions/agent/progress.d.ts +0 -3
  258. package/dist/extensions/agent/progress.d.ts.map +1 -1
  259. package/dist/extensions/agent/progress.js +11 -10
  260. package/dist/extensions/agent/progress.js.map +1 -1
  261. package/dist/extensions/agent/render.js +1 -1
  262. package/dist/extensions/agent/render.js.map +1 -1
  263. package/dist/extensions/agent/tool.d.ts.map +1 -1
  264. package/dist/extensions/agent/tool.js +0 -6
  265. package/dist/extensions/agent/tool.js.map +1 -1
  266. package/dist/extensions/agent/types.d.ts +3 -11
  267. package/dist/extensions/agent/types.d.ts.map +1 -1
  268. package/dist/extensions/agent/types.js.map +1 -1
  269. package/dist/{core/isolated-session.d.ts → extensions/agent/worker-session.d.ts} +6 -6
  270. package/dist/extensions/agent/worker-session.d.ts.map +1 -0
  271. package/dist/{core/isolated-session.js → extensions/agent/worker-session.js} +9 -9
  272. package/dist/extensions/agent/worker-session.js.map +1 -0
  273. package/dist/extensions/agent/worker.d.ts +0 -3
  274. package/dist/extensions/agent/worker.d.ts.map +1 -1
  275. package/dist/extensions/agent/worker.js +2 -3
  276. package/dist/extensions/agent/worker.js.map +1 -1
  277. package/dist/extensions/btw/agent.d.ts.map +1 -1
  278. package/dist/extensions/btw/agent.js +2 -1
  279. package/dist/extensions/btw/agent.js.map +1 -1
  280. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  281. package/dist/extensions/cached-compaction/render.js +3 -3
  282. package/dist/extensions/cached-compaction/render.js.map +1 -1
  283. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  284. package/dist/extensions/codemode/renderer.js +6 -2
  285. package/dist/extensions/codemode/renderer.js.map +1 -1
  286. package/dist/extensions/codemode/tool.d.ts +2 -1
  287. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  288. package/dist/extensions/codemode/tool.js +33 -8
  289. package/dist/extensions/codemode/tool.js.map +1 -1
  290. package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
  291. package/dist/extensions/deepwiki/schema.js +1 -1
  292. package/dist/extensions/deepwiki/schema.js.map +1 -1
  293. package/dist/extensions/llama/ui.d.ts.map +1 -1
  294. package/dist/extensions/llama/ui.js +16 -4
  295. package/dist/extensions/llama/ui.js.map +1 -1
  296. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  297. package/dist/extensions/mcp/cli.js +34 -8
  298. package/dist/extensions/mcp/cli.js.map +1 -1
  299. package/dist/extensions/mcp/oauth.d.ts +1 -1
  300. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  301. package/dist/extensions/mcp/oauth.js +36 -13
  302. package/dist/extensions/mcp/oauth.js.map +1 -1
  303. package/dist/extensions/mcp/ui.d.ts +1 -0
  304. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  305. package/dist/extensions/mcp/ui.js +33 -24
  306. package/dist/extensions/mcp/ui.js.map +1 -1
  307. package/dist/extensions/run-summary/index.d.ts +1 -1
  308. package/dist/extensions/run-summary/index.d.ts.map +1 -1
  309. package/dist/extensions/run-summary/index.js +11 -23
  310. package/dist/extensions/run-summary/index.js.map +1 -1
  311. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  312. package/dist/extensions/statusline/usage.js +2 -1
  313. package/dist/extensions/statusline/usage.js.map +1 -1
  314. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  315. package/dist/extensions/tasks/tool/schema.js +1 -1
  316. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  317. package/dist/extensions/tasks/ui/completion-render.d.ts +5 -1
  318. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  319. package/dist/extensions/tasks/ui/completion-render.js +25 -70
  320. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  321. package/dist/extensions/tasks/ui/inspector.d.ts +1 -1
  322. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  323. package/dist/extensions/tasks/ui/inspector.js +3 -7
  324. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  325. package/dist/extensions/tasks/ui/manager.d.ts +1 -1
  326. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  327. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  328. package/dist/extensions/tasks/ui/views.d.ts +3 -4
  329. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  330. package/dist/extensions/tasks/ui/views.js +15 -14
  331. package/dist/extensions/tasks/ui/views.js.map +1 -1
  332. package/dist/extensions/tool-presentation/fallback.d.ts.map +1 -0
  333. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.js +5 -5
  334. package/dist/extensions/tool-presentation/fallback.js.map +1 -0
  335. package/dist/extensions/tool-presentation/index.js +1 -1
  336. package/dist/extensions/tool-presentation/index.js.map +1 -1
  337. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.d.ts +1 -1
  338. package/dist/extensions/tool-presentation/shell.d.ts.map +1 -0
  339. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.js +3 -3
  340. package/dist/extensions/tool-presentation/shell.js.map +1 -0
  341. package/dist/extensions/tool-search/tool.d.ts +21 -6
  342. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  343. package/dist/extensions/tool-search/tool.js +104 -36
  344. package/dist/extensions/tool-search/tool.js.map +1 -1
  345. package/dist/index.d.ts +3 -3
  346. package/dist/index.d.ts.map +1 -1
  347. package/dist/index.js.map +1 -1
  348. package/dist/main.d.ts.map +1 -1
  349. package/dist/main.js +15 -8
  350. package/dist/main.js.map +1 -1
  351. package/dist/modes/interactive/components/assistant-message.d.ts +5 -3
  352. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  353. package/dist/modes/interactive/components/assistant-message.js +61 -45
  354. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  355. package/dist/modes/interactive/components/config-selector-skills.d.ts +54 -0
  356. package/dist/modes/interactive/components/config-selector-skills.d.ts.map +1 -0
  357. package/dist/modes/interactive/components/config-selector-skills.js +178 -0
  358. package/dist/modes/interactive/components/config-selector-skills.js.map +1 -0
  359. package/dist/modes/interactive/components/config-selector.d.ts +2 -11
  360. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  361. package/dist/modes/interactive/components/config-selector.js +31 -181
  362. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  363. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/custom-editor.js +7 -0
  365. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  366. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  367. package/dist/modes/interactive/components/custom-entry.js +2 -1
  368. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  369. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  370. package/dist/modes/interactive/components/custom-message.js +2 -1
  371. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  372. package/dist/modes/interactive/components/extension-editor.d.ts +2 -0
  373. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  374. package/dist/modes/interactive/components/extension-editor.js +4 -0
  375. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  376. package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
  377. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  378. package/dist/modes/interactive/components/login-dialog.js +103 -10
  379. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  380. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -1
  381. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  382. package/dist/modes/interactive/components/markdown-transform.js +3 -2
  383. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  384. package/dist/modes/interactive/components/model-selector.d.ts +1 -0
  385. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/model-selector.js +17 -6
  387. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  388. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -0
  389. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  390. package/dist/modes/interactive/components/oauth-selector.js +13 -4
  391. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  392. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -0
  393. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  394. package/dist/modes/interactive/components/scoped-models-selector.js +14 -3
  395. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  396. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  397. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  398. package/dist/modes/interactive/components/session-selector-search.js +86 -22
  399. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  400. package/dist/modes/interactive/components/session-selector.d.ts +2 -1
  401. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  402. package/dist/modes/interactive/components/session-selector.js +15 -23
  403. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  404. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  405. package/dist/modes/interactive/components/settings-submenu.js +2 -0
  406. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  407. package/dist/modes/interactive/components/task-activity-list.d.ts +5 -0
  408. package/dist/modes/interactive/components/task-activity-list.d.ts.map +1 -0
  409. package/dist/modes/interactive/components/task-activity-list.js +68 -0
  410. package/dist/modes/interactive/components/task-activity-list.js.map +1 -0
  411. package/dist/modes/interactive/components/tool-execution.d.ts +7 -0
  412. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  413. package/dist/modes/interactive/components/tool-execution.js +48 -9
  414. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  415. package/dist/modes/interactive/components/tree-selector.d.ts +1 -0
  416. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  417. package/dist/modes/interactive/components/tree-selector.js +5 -6
  418. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  419. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -0
  420. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/user-message-selector.js +9 -1
  422. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  423. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  424. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  425. package/dist/modes/interactive/components/user-message.js +4 -2
  426. package/dist/modes/interactive/components/user-message.js.map +1 -1
  427. package/dist/modes/interactive/editor-host.d.ts.map +1 -1
  428. package/dist/modes/interactive/editor-host.js +3 -2
  429. package/dist/modes/interactive/editor-host.js.map +1 -1
  430. package/dist/modes/interactive/external-editor.d.ts +1 -0
  431. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  432. package/dist/modes/interactive/external-editor.js +17 -5
  433. package/dist/modes/interactive/external-editor.js.map +1 -1
  434. package/dist/modes/interactive/interactive-mode.d.ts +8 -12
  435. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  436. package/dist/modes/interactive/interactive-mode.js +169 -112
  437. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  438. package/dist/modes/interactive/model-search.d.ts +10 -0
  439. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  440. package/dist/modes/interactive/model-search.js +21 -0
  441. package/dist/modes/interactive/model-search.js.map +1 -1
  442. package/dist/modes/interactive/theme/theme.d.ts +10 -0
  443. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  444. package/dist/modes/interactive/theme/theme.js +30 -23
  445. package/dist/modes/interactive/theme/theme.js.map +1 -1
  446. package/dist/modes/interactive/tool-view/chat.d.ts +2 -2
  447. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  448. package/dist/modes/interactive/tool-view/chat.js +22 -19
  449. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  450. package/dist/modes/interactive/transcript-layout.d.ts +2 -0
  451. package/dist/modes/interactive/transcript-layout.d.ts.map +1 -1
  452. package/dist/modes/interactive/transcript-layout.js +5 -2
  453. package/dist/modes/interactive/transcript-layout.js.map +1 -1
  454. package/dist/modes/rpc/rpc-client.d.ts +9 -1
  455. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  456. package/dist/modes/rpc/rpc-client.js +23 -23
  457. package/dist/modes/rpc/rpc-client.js.map +1 -1
  458. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  459. package/dist/modes/rpc/rpc-mode.js +0 -3
  460. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  461. package/dist/package-manager-cli.d.ts.map +1 -1
  462. package/dist/package-manager-cli.js +55 -4
  463. package/dist/package-manager-cli.js.map +1 -1
  464. package/dist/utils/ansi.d.ts.map +1 -1
  465. package/dist/utils/ansi.js +5 -2
  466. package/dist/utils/ansi.js.map +1 -1
  467. package/dist/utils/clipboard-command.d.ts.map +1 -1
  468. package/dist/utils/clipboard-command.js +4 -0
  469. package/dist/utils/clipboard-command.js.map +1 -1
  470. package/dist/utils/git.d.ts +1 -1
  471. package/dist/utils/git.d.ts.map +1 -1
  472. package/dist/utils/git.js.map +1 -1
  473. package/dist/utils/image-resize-core.d.ts.map +1 -1
  474. package/dist/utils/image-resize-core.js +5 -3
  475. package/dist/utils/image-resize-core.js.map +1 -1
  476. package/dist/utils/open-browser.d.ts.map +1 -1
  477. package/dist/utils/open-browser.js +4 -1
  478. package/dist/utils/open-browser.js.map +1 -1
  479. package/dist/utils/paths.d.ts +17 -0
  480. package/dist/utils/paths.d.ts.map +1 -1
  481. package/dist/utils/paths.js +42 -1
  482. package/dist/utils/paths.js.map +1 -1
  483. package/dist/utils/shell.d.ts.map +1 -1
  484. package/dist/utils/shell.js +14 -0
  485. package/dist/utils/shell.js.map +1 -1
  486. package/dist/utils/syntax-highlight.d.ts +5 -0
  487. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  488. package/dist/utils/syntax-highlight.js +7 -0
  489. package/dist/utils/syntax-highlight.js.map +1 -1
  490. package/dist/utils/tools-manager.d.ts.map +1 -1
  491. package/dist/utils/tools-manager.js +30 -35
  492. package/dist/utils/tools-manager.js.map +1 -1
  493. package/dist/utils/usage.d.ts +5 -0
  494. package/dist/utils/usage.d.ts.map +1 -0
  495. package/dist/utils/usage.js +16 -0
  496. package/dist/utils/usage.js.map +1 -0
  497. package/docs/bundled/README.md +1 -1
  498. package/docs/bundled/extensions/agent.md +5 -5
  499. package/docs/bundled/extensions/run-summary.md +4 -4
  500. package/docs/bundled/tasks.md +2 -4
  501. package/docs/bundled/tool-presentation.md +2 -2
  502. package/docs/custom-provider.md +1 -1
  503. package/docs/environment-variables.md +2 -0
  504. package/docs/extensions.md +38 -21
  505. package/docs/keybindings.md +1 -1
  506. package/docs/llama-cpp.md +17 -12
  507. package/docs/mcp.md +6 -4
  508. package/docs/packages.md +26 -1
  509. package/docs/rpc.md +1 -1
  510. package/docs/sdk.md +7 -5
  511. package/docs/session-format.md +2 -2
  512. package/docs/sessions.md +10 -0
  513. package/docs/settings.md +5 -4
  514. package/docs/terminal-setup.md +2 -2
  515. package/docs/tmux.md +6 -0
  516. package/docs/tui.md +12 -7
  517. package/docs/usage.md +19 -9
  518. package/docs/windows.md +29 -0
  519. package/examples/extensions/README.md +2 -1
  520. package/examples/extensions/custom-provider-anthropic/index.ts +27 -31
  521. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  522. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  523. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  524. package/examples/extensions/debug-provider.ts +2 -2
  525. package/examples/extensions/gondolin/package-lock.json +19 -29
  526. package/examples/extensions/gondolin/package.json +2 -2
  527. package/examples/extensions/preset.ts +2 -0
  528. package/examples/extensions/reload-runtime.ts +17 -5
  529. package/examples/extensions/tools.ts +2 -0
  530. package/examples/extensions/with-deps/package-lock.json +2 -2
  531. package/examples/extensions/with-deps/package.json +1 -1
  532. package/package.json +9 -9
  533. package/schemas/models.schema.json +36 -36
  534. package/schemas/settings.schema.json +17 -0
  535. package/dist/bundle/chunks/anthropic-messages-HWL6AS7T.js +0 -6
  536. package/dist/bundle/chunks/azure-openai-responses-4YYPDYV5.js +0 -2
  537. package/dist/bundle/chunks/chunk-6JS2SOFO.js +0 -11
  538. package/dist/bundle/chunks/chunk-ANCZPKX7.js +0 -2
  539. package/dist/bundle/chunks/chunk-FEZ5RM2B.js +0 -2
  540. package/dist/bundle/chunks/chunk-LPF7HQ3S.js +0 -4
  541. package/dist/bundle/chunks/chunk-MMNIHCU7.js +0 -2
  542. package/dist/bundle/chunks/chunk-PUU43PDV.js +0 -1484
  543. package/dist/bundle/chunks/chunk-R267VV5T.js +0 -82
  544. package/dist/bundle/chunks/chunk-RVKT7OUB.js +0 -9
  545. package/dist/bundle/chunks/chunk-SA2AQYEI.js +0 -7
  546. package/dist/bundle/chunks/chunk-ZAIGBRV5.js +0 -16
  547. package/dist/bundle/chunks/mistral-conversations-V2JJTMJ5.js +0 -5
  548. package/dist/bundle/chunks/openai-completions-TXZXILJR.js +0 -7
  549. package/dist/bundle/chunks/pi-messages-LBJQ4NGP.js +0 -8
  550. package/dist/bundle/chunks/virtual-modules-63XNTSVN.js +0 -2
  551. package/dist/core/isolated-session.d.ts.map +0 -1
  552. package/dist/core/isolated-session.js.map +0 -1
  553. package/dist/modes/interactive/tool-view/fallback.d.ts.map +0 -1
  554. package/dist/modes/interactive/tool-view/fallback.js.map +0 -1
  555. package/dist/modes/interactive/tool-view/shell.d.ts.map +0 -1
  556. package/dist/modes/interactive/tool-view/shell.js.map +0 -1
  557. package/dist/utils/path-identity.d.ts +0 -12
  558. package/dist/utils/path-identity.d.ts.map +0 -1
  559. package/dist/utils/path-identity.js +0 -63
  560. package/dist/utils/path-identity.js.map +0 -1
  561. package/examples/extensions/sandbox/index.ts +0 -321
  562. package/examples/extensions/sandbox/package-lock.json +0 -92
  563. package/examples/extensions/sandbox/package.json +0 -19
  564. /package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/** Panel lifecycle and input routing; selection, output ownership and layout have separate owners. */\nimport \"../keybindings.ts\";\nimport {\n\ttype Component,\n\ttype Focusable,\n\tInput,\n\ttype TuiMouseEvent,\n\ttype TuiMouseEventResult,\n} from \"@earendil-works/pi-tui\";\nimport type { AppKeybinding, KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { isTaskTerminal, type TaskSnapshot, type TasksContext } from \"../../../core/tasks/types.ts\";\nimport { STATUS_SPINNER_INTERVAL_MS } from \"../../../modes/interactive/components/status-marker.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { Feedback } from \"./footer.ts\";\nimport { TaskInspector } from \"./inspector.ts\";\nimport { renderTasksLayout, type TasksLayout } from \"./layout.ts\";\nimport { TaskList } from \"./list.ts\";\nimport { type PanelFocus, type PanelMode, type TaskAction, TaskSelection, type TasksPanelState } from \"./model.ts\";\nimport { cleanTaskText } from \"./text.ts\";\nimport { TaskViewport } from \"./viewport.ts\";\n\nexport type TasksManagerHost = Pick<\n\tTasksContext,\n\t\"list\" | \"read\" | \"kill\" | \"subscribe\" | \"retain\" | \"canDetach\" | \"detach\" | \"presentOutput\"\n>;\nexport interface TasksMenuOptions {\n\ttui: { requestRender(): void; terminal: { rows: number; columns: number } };\n\ttheme: Theme;\n\tkeybindings: Pick<KeybindingsManager, \"matches\" | \"getKeys\">;\n\thost: TasksManagerHost;\n\tstate?: TasksPanelState;\n\tonClose(): void;\n\tpollIntervalMs?: number;\n}\n\nconst BROWSE: PanelMode = { kind: \"browse\" };\n/** Feedback outlives a glance but not the next thing the user does. */\nconst FEEDBACK_MS = 4000;\nconst QUERY_LIMIT = 512;\nconst actions: AppKeybinding[] = [\n\t\"app.tasks.search\",\n\t\"app.tasks.kill\",\n\t\"app.tasks.detachSelected\",\n\t\"app.tasks.previousTab\",\n\t\"app.tasks.nextTab\",\n\t\"app.tasks.follow\",\n\t\"app.tasks.top\",\n\t\"app.tasks.bottom\",\n\t\"app.tasks.nextFocus\",\n\t\"app.tasks.previousFocus\",\n\t\"app.tasks.help\",\n];\n\n/** Why a stop or background request cannot apply to this task, for the states the footer does not offer. */\nfunction unavailableReason(task: TaskSnapshot): string | undefined {\n\tif (isTaskTerminal(task.status)) return \"Task already finished.\";\n\tif (task.status === \"stopping\") return \"Task is already stopping.\";\n\treturn undefined;\n}\n\nexport class TasksMenu implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: TasksMenuOptions;\n\tprivate readonly selection: TaskSelection;\n\tprivate readonly inspector: TaskInspector;\n\tprivate readonly list = new TaskList();\n\tprivate readonly unsubscribe: () => void;\n\tprivate readonly pollTimer: ReturnType<typeof setInterval>;\n\tprivate animationTimer?: ReturnType<typeof setInterval>;\n\tprivate feedbackTimer?: ReturnType<typeof setTimeout>;\n\tprivate mode: PanelMode = BROWSE;\n\tprivate feedback?: Feedback;\n\tprivate focus: PanelFocus = \"list\";\n\tprivate dirty = true;\n\tprivate tickQueued = false;\n\tprivate refreshQueued = false;\n\tprivate disposed = false;\n\tprivate width: number;\n\tprivate layout?: TasksLayout;\n\tconstructor(options: TasksMenuOptions) {\n\t\tthis.options = options;\n\t\tthis.width = options.tui.terminal.columns;\n\t\tthis.selection = new TaskSelection(options.state ?? { tab: \"output\" });\n\t\tthis.inspector = new TaskInspector({\n\t\t\thost: options.host,\n\t\t\ttheme: options.theme,\n\t\t\trequestRender: () => options.tui.requestRender(),\n\t\t});\n\t\tthis.sync();\n\t\tthis.selection.selectStartedSinceClose();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.list.showSelection();\n\t\tthis.unsubscribe = options.host.subscribe(() => {\n\t\t\tthis.dirty = true;\n\t\t\tthis.queueTick();\n\t\t\toptions.tui.requestRender();\n\t\t});\n\t\tthis.pollTimer = setInterval(() => {\n\t\t\tthis.queueTick(true);\n\t\t\tif (this.selection.activeCount) options.tui.requestRender();\n\t\t}, options.pollIntervalMs ?? 1000);\n\t\tthis.pollTimer.unref?.();\n\t\tthis.queueTick(true);\n\t}\n\t/** The search text, owned by the search mode: browsing always sees every retained task. */\n\tprivate get query(): string {\n\t\treturn this.mode.kind === \"search\" ? this.mode.input.getValue().slice(0, QUERY_LIMIT) : \"\";\n\t}\n\tprivate select(id: string | undefined): void {\n\t\tthis.selection.select(id, this.query);\n\t}\n\tprivate sync(): void {\n\t\tif (this.disposed || !this.dirty) return;\n\t\tthis.dirty = false;\n\t\tthis.selection.sync(this.options.host.list(), this.query);\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.inspector.prune(new Set(this.selection.all.map((task) => task.id)));\n\t\tconst selected = this.selection.selected;\n\t\tif (this.mode.kind === \"confirmStop\" && (this.mode.taskId !== selected?.id || isTaskTerminal(selected.status)))\n\t\t\tthis.setMode(BROWSE);\n\t\tconst animates = this.selection.all.some((task) => task.status === \"running\");\n\t\tif (animates && !this.animationTimer) {\n\t\t\tthis.animationTimer = setInterval(() => this.options.tui.requestRender(), STATUS_SPINNER_INTERVAL_MS);\n\t\t\tthis.animationTimer.unref?.();\n\t\t} else if (!animates) {\n\t\t\tclearInterval(this.animationTimer);\n\t\t\tthis.animationTimer = undefined;\n\t\t}\n\t}\n\tprivate queueTick(refresh = false): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshQueued ||= refresh;\n\t\tif (this.tickQueued) return;\n\t\tthis.tickQueued = true;\n\t\tvoid Promise.resolve()\n\t\t\t.then(async () => {\n\t\t\t\tthis.tickQueued = false;\n\t\t\t\tif (this.disposed) return;\n\t\t\t\tconst refresh = this.refreshQueued;\n\t\t\t\tthis.refreshQueued = false;\n\t\t\t\tthis.sync();\n\t\t\t\tif (refresh || (this.inspector.task && isTaskTerminal(this.inspector.task.status)))\n\t\t\t\t\tawait this.inspector.refresh();\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t/* Task observers cannot reject execution. */\n\t\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.inspector.invalidate();\n\t}\n\tprivate setMode(next: PanelMode): void {\n\t\tthis.mode = next;\n\t}\n\t/** Reports an action that did not do what was asked; it clears on the next input or after a few seconds. */\n\tprivate notify(tone: Feedback[\"tone\"], text: string): void {\n\t\tthis.clearFeedback();\n\t\tthis.feedback = { tone, text };\n\t\tthis.feedbackTimer = setTimeout(() => {\n\t\t\tthis.feedbackTimer = undefined;\n\t\t\tthis.feedback = undefined;\n\t\t\tif (!this.disposed) this.options.tui.requestRender();\n\t\t}, FEEDBACK_MS);\n\t\tthis.feedbackTimer.unref?.();\n\t}\n\tprivate clearFeedback(): void {\n\t\tclearTimeout(this.feedbackTimer);\n\t\tthis.feedbackTimer = undefined;\n\t\tthis.feedback = undefined;\n\t}\n\t/**\n\t * Unwinds exactly one layer: search, help or a confirmation; then the inspector back to the\n\t * list when the list is hidden; from plain browsing it closes the panel.\n\t */\n\tprivate escape(): void {\n\t\tswitch (this.mode.kind) {\n\t\t\tcase \"search\":\n\t\t\t\tthis.finishSearch(true);\n\t\t\t\tbreak;\n\t\t\tcase \"help\":\n\t\t\tcase \"confirmStop\":\n\t\t\t\tthis.setMode(BROWSE);\n\t\t\t\tbreak;\n\t\t\tcase \"browse\":\n\t\t\t\tif (this.layout && !this.layout.tooSmall && !this.layout.split && this.focus === \"inspector\")\n\t\t\t\t\tthis.focus = \"list\";\n\t\t\t\telse this.close();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate close(): void {\n\t\tthis.dispose();\n\t\tthis.options.onClose();\n\t}\n\tprivate selectedChanged(): void {\n\t\tif (this.mode.kind === \"confirmStop\") this.setMode(BROWSE);\n\t\tthis.list.showSelection();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.queueTick(true);\n\t}\n\tprivate requestStop(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason = unavailableReason(task);\n\t\tif (reason) this.notify(\"warning\", reason);\n\t\telse this.setMode({ kind: \"confirmStop\", taskId: task.id });\n\t}\n\tprivate confirmStop(): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"confirmStop\") return;\n\t\tthis.setMode(BROWSE);\n\t\tconst task = this.selection.selected;\n\t\tif (mode.taskId !== task?.id || isTaskTerminal(task.status)) return;\n\t\t// A granted request shows as Stopping on the row and header; only a refusal needs saying.\n\t\tif (!this.options.host.kill(mode.taskId)) this.notify(\"warning\", \"No new cancellation requested.\");\n\t}\n\tprivate detachSelected(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason =\n\t\t\tunavailableReason(task) ?? (task.mode === \"background\" ? \"Task is already in the background.\" : \"\");\n\t\tif (reason) {\n\t\t\tthis.notify(\"warning\", reason);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\t// The core decides; a full background lane throws its own explanation.\n\t\t\tif (!this.options.host.detach(task.id)) this.notify(\"warning\", \"This task cannot move to background.\");\n\t\t} catch (error) {\n\t\t\tthis.notify(\"warning\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t}\n\tprivate startSearch(): void {\n\t\tconst input = new Input({ prompt: \"Find task: \", placeholder: \"title, command, kind or ID\" });\n\t\tinput.focused = true;\n\t\tthis.setMode({ kind: \"search\", restore: { id: this.selection.state.selectedId, focus: this.focus }, input });\n\t\tthis.focus = \"list\";\n\t}\n\tprivate finishSearch(cancel: boolean): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"search\") return;\n\t\tconst id = cancel ? mode.restore.id : this.selection.state.selectedId;\n\t\tif (!cancel && !id) return;\n\t\tthis.focus = cancel ? mode.restore.focus : \"list\";\n\t\tthis.setMode(BROWSE);\n\t\tthis.select(id);\n\t\tthis.selectedChanged();\n\t}\n\tprivate open(): void {\n\t\tif (this.focus === \"list\" && this.selection.selected) this.focus = \"inspector\";\n\t}\n\tprivate action(key: AppKeybinding): void {\n\t\tswitch (key) {\n\t\t\tcase \"app.tasks.search\":\n\t\t\t\tthis.startSearch();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.previousTab\":\n\t\t\tcase \"app.tasks.nextTab\":\n\t\t\t\tif (this.focus === \"inspector\")\n\t\t\t\t\tthis.selection.state.tab = key === \"app.tasks.previousTab\" ? \"output\" : \"info\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.nextFocus\":\n\t\t\tcase \"app.tasks.previousFocus\":\n\t\t\t\tthis.focus = this.focus === \"list\" ? \"inspector\" : \"list\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.follow\":\n\t\t\t\tif (this.focus === \"inspector\" && this.selection.state.tab === \"output\") {\n\t\t\t\t\tthis.inspector.position.output.jump(true);\n\t\t\t\t\tthis.queueTick(true);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.top\":\n\t\t\tcase \"app.tasks.bottom\":\n\t\t\t\tif (this.focus === \"list\") {\n\t\t\t\t\tthis.select(key === \"app.tasks.top\" ? this.selection.rows[0]?.id : this.selection.rows.at(-1)?.id);\n\t\t\t\t\tthis.selectedChanged();\n\t\t\t\t} else this.inspector.position[this.selection.state.tab].jump(key === \"app.tasks.bottom\");\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.kill\":\n\t\t\t\tthis.requestStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.confirmStop\":\n\t\t\t\tthis.confirmStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.detachSelected\":\n\t\t\t\tthis.detachSelected();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.help\":\n\t\t\t\tthis.setMode({ kind: \"help\", viewport: new TaskViewport() });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t/** Performs what a click on a rendered target asks for. */\n\tprivate perform(action: TaskAction): void {\n\t\tswitch (action.kind) {\n\t\t\tcase \"select\":\n\t\t\t\tthis.select(action.taskId);\n\t\t\t\tthis.selectedChanged();\n\t\t\t\tthis.focus = \"list\";\n\t\t\t\tif (this.mode.kind === \"search\") this.finishSearch(false);\n\t\t\t\tbreak;\n\t\t\tcase \"tab\":\n\t\t\t\tthis.focus = \"inspector\";\n\t\t\t\tthis.selection.state.tab = action.tab;\n\t\t\t\tbreak;\n\t\t\tcase \"key\":\n\t\t\t\tif (action.key === \"app.tasks.follow\") this.focus = \"inspector\";\n\t\t\t\tthis.action(action.key);\n\t\t\t\tbreak;\n\t\t\tcase \"open\":\n\t\t\t\tthis.open();\n\t\t\t\tbreak;\n\t\t\tcase \"back\":\n\t\t\t\tthis.escape();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate move(direction: number, page = false): void {\n\t\tif (this.mode.kind === \"help\") {\n\t\t\tthis.mode.viewport.move(direction, page);\n\t\t\treturn;\n\t\t}\n\t\tif (this.focus === \"list\") {\n\t\t\tconst rows = this.selection.rows;\n\t\t\tif (!rows.length) return;\n\t\t\tconst index = rows.findIndex((task) => task.id === this.selection.state.selectedId);\n\t\t\tconst next = page\n\t\t\t\t? Math.max(0, Math.min(rows.length - 1, index + direction * (this.layout?.listPageSize ?? 1)))\n\t\t\t\t: (index + direction + rows.length) % rows.length;\n\t\t\tthis.select(rows[next]?.id);\n\t\t\tthis.selectedChanged();\n\t\t} else this.inspector.position[this.selection.state.tab].move(direction, page);\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.disposed) return;\n\t\tthis.sync();\n\t\tthis.render(this.width);\n\t\tthis.clearFeedback();\n\t\ttry {\n\t\t\tif (this.layout?.tooSmall) {\n\t\t\t\t// The resize notice owns the screen; keys must not act on the hidden panel.\n\t\t\t\tif (this.options.keybindings.matches(data, \"tui.select.cancel\")) this.escape();\n\t\t\t} else {\n\t\t\t\tswitch (this.mode.kind) {\n\t\t\t\t\tcase \"help\":\n\t\t\t\t\t\tthis.helpInput(this.mode.viewport, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"search\":\n\t\t\t\t\t\tthis.searchInput(this.mode.input, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"confirmStop\":\n\t\t\t\t\t\tthis.confirmInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"browse\":\n\t\t\t\t\t\tthis.browseInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t\tif (this.disposed) return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t}\n\tprivate helpInput(viewport: TaskViewport, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\") || kb.matches(data, \"app.tasks.help\")) this.setMode(BROWSE);\n\t\telse if (kb.matches(data, \"app.tasks.top\") || kb.matches(data, \"app.tasks.bottom\"))\n\t\t\tviewport.jump(kb.matches(data, \"app.tasks.bottom\"));\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.editor.pageUp\"))\n\t\t\tviewport.move(-1, kb.matches(data, \"tui.editor.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.editor.pageDown\"))\n\t\t\tviewport.move(1, kb.matches(data, \"tui.editor.pageDown\"));\n\t}\n\tprivate searchInput(input: Input, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.finishSearch(false);\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.pageUp\"))\n\t\t\tthis.move(-1, kb.matches(data, \"tui.select.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.select.pageDown\"))\n\t\t\tthis.move(1, kb.matches(data, \"tui.select.pageDown\"));\n\t\telse {\n\t\t\tinput.handleInput(data);\n\t\t\tthis.selection.refresh(this.query);\n\t\t\tthis.selectedChanged();\n\t\t}\n\t}\n\tprivate confirmInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"app.tasks.confirmStop\")) this.confirmStop();\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t}\n\tprivate browseInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.escape();\n\t\t\treturn;\n\t\t}\n\t\tconst pageUp = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\");\n\t\tconst pageDown = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\");\n\t\tif (pageUp || kb.matches(data, \"tui.select.up\")) this.move(-1, pageUp);\n\t\telse if (pageDown || kb.matches(data, \"tui.select.down\")) this.move(1, pageDown);\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.open();\n\t\telse {\n\t\t\tconst key = actions.find((key) => kb.matches(data, key));\n\t\t\tif (key) this.action(key);\n\t\t}\n\t}\n\thandleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined {\n\t\tif (this.disposed || event.ctrl || event.alt || event.shift) return;\n\t\t// Feedback is transient: a click retracts it and acts, exactly like a keypress does.\n\t\tthis.clearFeedback();\n\t\tthis.render(event.width);\n\t\tconst layout = this.layout!;\n\t\tconst region = layout.regions.find(\n\t\t\t(r) => event.y >= r.y && event.y < r.y + r.height && event.x >= r.x && event.x < r.x + r.width,\n\t\t);\n\t\tif (event.type === \"wheel\" && event.wheelDelta) {\n\t\t\tif (region) {\n\t\t\t\tconst delta = Math.sign(event.wheelDelta) * Math.min(20, Math.abs(event.wheelDelta));\n\t\t\t\tif (region.pane === \"help\") {\n\t\t\t\t\tif (this.mode.kind === \"help\") this.mode.viewport.move(delta, false);\n\t\t\t\t} else if (region.pane === \"list\") this.list.scroll(delta);\n\t\t\t\telse this.inspector.position[this.selection.state.tab].move(delta, false);\n\t\t\t}\n\t\t} else if (event.type === \"click\" && event.button === \"left\") {\n\t\t\tconst hit = layout.hits.find((hit) => hit.y === event.y && event.x >= hit.x && event.x < hit.x + hit.width);\n\t\t\ttry {\n\t\t\t\tif (hit) this.perform(hit.action);\n\t\t\t\telse if (region && region.pane !== \"help\") this.focus = region.pane;\n\t\t\t} catch (error) {\n\t\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t\t}\n\t\t} else return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t\treturn { handled: true, focus: event.type === \"click\" };\n\t}\n\trender(width: number): string[] {\n\t\tthis.width = width;\n\t\tthis.sync();\n\t\tthis.layout = renderTasksLayout({\n\t\t\twidth,\n\t\t\theight: this.options.tui.terminal.rows,\n\t\t\ttheme: this.options.theme,\n\t\t\tkeybindings: this.options.keybindings,\n\t\t\tselection: this.selection,\n\t\t\tinspector: this.inspector,\n\t\t\tlist: this.list,\n\t\t\tfocus: this.focus,\n\t\t\tmode: this.mode,\n\t\t\tfeedback: this.feedback,\n\t\t\tcanDetach: (id) => this.canDetach(id),\n\t\t});\n\t\treturn this.layout.lines;\n\t}\n\t/** The panel's selection can lag the runtime by a notification; a task that is gone cannot move. */\n\tprivate canDetach(id: string): boolean {\n\t\ttry {\n\t\t\treturn this.options.host.canDetach(id);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.selection.state.closedAt = Date.now();\n\t\tclearInterval(this.pollTimer);\n\t\tclearInterval(this.animationTimer);\n\t\tthis.clearFeedback();\n\t\tthis.unsubscribe();\n\t\tthis.inspector.dispose();\n\t}\n}\n"]}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/** Panel lifecycle and input routing; selection, output ownership and layout have separate owners. */\nimport \"../keybindings.ts\";\nimport {\n\ttype Component,\n\ttype Focusable,\n\tInput,\n\ttype TuiMouseEvent,\n\ttype TuiMouseEventResult,\n} from \"@earendil-works/pi-tui\";\nimport type { AppKeybinding, KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { isTaskTerminal, type TaskSnapshot, type TasksContext } from \"../../../core/tasks/types.ts\";\nimport { STATUS_SPINNER_INTERVAL_MS } from \"../../../modes/interactive/components/status-marker.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { Feedback } from \"./footer.ts\";\nimport { TaskInspector } from \"./inspector.ts\";\nimport { renderTasksLayout, type TasksLayout } from \"./layout.ts\";\nimport { TaskList } from \"./list.ts\";\nimport { type PanelFocus, type PanelMode, type TaskAction, TaskSelection, type TasksPanelState } from \"./model.ts\";\nimport { cleanTaskText } from \"./text.ts\";\nimport { TaskViewport } from \"./viewport.ts\";\n\nexport type TasksManagerHost = Pick<\n\tTasksContext,\n\t\"list\" | \"read\" | \"kill\" | \"subscribe\" | \"retain\" | \"canDetach\" | \"detach\"\n>;\nexport interface TasksMenuOptions {\n\ttui: { requestRender(): void; terminal: { rows: number; columns: number } };\n\ttheme: Theme;\n\tkeybindings: Pick<KeybindingsManager, \"matches\" | \"getKeys\">;\n\thost: TasksManagerHost;\n\tstate?: TasksPanelState;\n\tonClose(): void;\n\tpollIntervalMs?: number;\n}\n\nconst BROWSE: PanelMode = { kind: \"browse\" };\n/** Feedback outlives a glance but not the next thing the user does. */\nconst FEEDBACK_MS = 4000;\nconst QUERY_LIMIT = 512;\nconst actions: AppKeybinding[] = [\n\t\"app.tasks.search\",\n\t\"app.tasks.kill\",\n\t\"app.tasks.detachSelected\",\n\t\"app.tasks.previousTab\",\n\t\"app.tasks.nextTab\",\n\t\"app.tasks.follow\",\n\t\"app.tasks.top\",\n\t\"app.tasks.bottom\",\n\t\"app.tasks.nextFocus\",\n\t\"app.tasks.previousFocus\",\n\t\"app.tasks.help\",\n];\n\n/** Why a stop or background request cannot apply to this task, for the states the footer does not offer. */\nfunction unavailableReason(task: TaskSnapshot): string | undefined {\n\tif (isTaskTerminal(task.status)) return \"Task already finished.\";\n\tif (task.status === \"stopping\") return \"Task is already stopping.\";\n\treturn undefined;\n}\n\nexport class TasksMenu implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: TasksMenuOptions;\n\tprivate readonly selection: TaskSelection;\n\tprivate readonly inspector: TaskInspector;\n\tprivate readonly list = new TaskList();\n\tprivate readonly unsubscribe: () => void;\n\tprivate readonly pollTimer: ReturnType<typeof setInterval>;\n\tprivate animationTimer?: ReturnType<typeof setInterval>;\n\tprivate feedbackTimer?: ReturnType<typeof setTimeout>;\n\tprivate mode: PanelMode = BROWSE;\n\tprivate feedback?: Feedback;\n\tprivate focus: PanelFocus = \"list\";\n\tprivate dirty = true;\n\tprivate tickQueued = false;\n\tprivate refreshQueued = false;\n\tprivate disposed = false;\n\tprivate width: number;\n\tprivate layout?: TasksLayout;\n\tconstructor(options: TasksMenuOptions) {\n\t\tthis.options = options;\n\t\tthis.width = options.tui.terminal.columns;\n\t\tthis.selection = new TaskSelection(options.state ?? { tab: \"output\" });\n\t\tthis.inspector = new TaskInspector({\n\t\t\thost: options.host,\n\t\t\ttheme: options.theme,\n\t\t\trequestRender: () => options.tui.requestRender(),\n\t\t});\n\t\tthis.sync();\n\t\tthis.selection.selectStartedSinceClose();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.list.showSelection();\n\t\tthis.unsubscribe = options.host.subscribe(() => {\n\t\t\tthis.dirty = true;\n\t\t\tthis.queueTick();\n\t\t\toptions.tui.requestRender();\n\t\t});\n\t\tthis.pollTimer = setInterval(() => {\n\t\t\tthis.queueTick(true);\n\t\t\tif (this.selection.activeCount) options.tui.requestRender();\n\t\t}, options.pollIntervalMs ?? 1000);\n\t\tthis.pollTimer.unref?.();\n\t\tthis.queueTick(true);\n\t}\n\t/** The search text, owned by the search mode: browsing always sees every retained task. */\n\tprivate get query(): string {\n\t\treturn this.mode.kind === \"search\" ? this.mode.input.getValue().slice(0, QUERY_LIMIT) : \"\";\n\t}\n\tprivate select(id: string | undefined): void {\n\t\tthis.selection.select(id, this.query);\n\t}\n\tprivate sync(): void {\n\t\tif (this.disposed || !this.dirty) return;\n\t\tthis.dirty = false;\n\t\tthis.selection.sync(this.options.host.list(), this.query);\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.inspector.prune(new Set(this.selection.all.map((task) => task.id)));\n\t\tconst selected = this.selection.selected;\n\t\tif (this.mode.kind === \"confirmStop\" && (this.mode.taskId !== selected?.id || isTaskTerminal(selected.status)))\n\t\t\tthis.setMode(BROWSE);\n\t\tconst animates = this.selection.all.some((task) => task.status === \"running\");\n\t\tif (animates && !this.animationTimer) {\n\t\t\tthis.animationTimer = setInterval(() => this.options.tui.requestRender(), STATUS_SPINNER_INTERVAL_MS);\n\t\t\tthis.animationTimer.unref?.();\n\t\t} else if (!animates) {\n\t\t\tclearInterval(this.animationTimer);\n\t\t\tthis.animationTimer = undefined;\n\t\t}\n\t}\n\tprivate queueTick(refresh = false): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshQueued ||= refresh;\n\t\tif (this.tickQueued) return;\n\t\tthis.tickQueued = true;\n\t\tvoid Promise.resolve()\n\t\t\t.then(async () => {\n\t\t\t\tthis.tickQueued = false;\n\t\t\t\tif (this.disposed) return;\n\t\t\t\tconst refresh = this.refreshQueued;\n\t\t\t\tthis.refreshQueued = false;\n\t\t\t\tthis.sync();\n\t\t\t\tif (refresh || (this.inspector.task && isTaskTerminal(this.inspector.task.status)))\n\t\t\t\t\tawait this.inspector.refresh();\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t/* Task observers cannot reject execution. */\n\t\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.inspector.invalidate();\n\t}\n\tprivate setMode(next: PanelMode): void {\n\t\tthis.mode = next;\n\t}\n\t/** Reports an action that did not do what was asked; it clears on the next input or after a few seconds. */\n\tprivate notify(tone: Feedback[\"tone\"], text: string): void {\n\t\tthis.clearFeedback();\n\t\tthis.feedback = { tone, text };\n\t\tthis.feedbackTimer = setTimeout(() => {\n\t\t\tthis.feedbackTimer = undefined;\n\t\t\tthis.feedback = undefined;\n\t\t\tif (!this.disposed) this.options.tui.requestRender();\n\t\t}, FEEDBACK_MS);\n\t\tthis.feedbackTimer.unref?.();\n\t}\n\tprivate clearFeedback(): void {\n\t\tclearTimeout(this.feedbackTimer);\n\t\tthis.feedbackTimer = undefined;\n\t\tthis.feedback = undefined;\n\t}\n\t/**\n\t * Unwinds exactly one layer: search, help or a confirmation; then the inspector back to the\n\t * list when the list is hidden; from plain browsing it closes the panel.\n\t */\n\tprivate escape(): void {\n\t\tswitch (this.mode.kind) {\n\t\t\tcase \"search\":\n\t\t\t\tthis.finishSearch(true);\n\t\t\t\tbreak;\n\t\t\tcase \"help\":\n\t\t\tcase \"confirmStop\":\n\t\t\t\tthis.setMode(BROWSE);\n\t\t\t\tbreak;\n\t\t\tcase \"browse\":\n\t\t\t\tif (this.layout && !this.layout.tooSmall && !this.layout.split && this.focus === \"inspector\")\n\t\t\t\t\tthis.focus = \"list\";\n\t\t\t\telse this.close();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate close(): void {\n\t\tthis.dispose();\n\t\tthis.options.onClose();\n\t}\n\tprivate selectedChanged(): void {\n\t\tif (this.mode.kind === \"confirmStop\") this.setMode(BROWSE);\n\t\tthis.list.showSelection();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.queueTick(true);\n\t}\n\tprivate requestStop(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason = unavailableReason(task);\n\t\tif (reason) this.notify(\"warning\", reason);\n\t\telse this.setMode({ kind: \"confirmStop\", taskId: task.id });\n\t}\n\tprivate confirmStop(): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"confirmStop\") return;\n\t\tthis.setMode(BROWSE);\n\t\tconst task = this.selection.selected;\n\t\tif (mode.taskId !== task?.id || isTaskTerminal(task.status)) return;\n\t\t// A granted request shows as Stopping on the row and header; only a refusal needs saying.\n\t\tif (!this.options.host.kill(mode.taskId)) this.notify(\"warning\", \"No new cancellation requested.\");\n\t}\n\tprivate detachSelected(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason =\n\t\t\tunavailableReason(task) ?? (task.mode === \"background\" ? \"Task is already in the background.\" : \"\");\n\t\tif (reason) {\n\t\t\tthis.notify(\"warning\", reason);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\t// The core decides; a full background lane throws its own explanation.\n\t\t\tif (!this.options.host.detach(task.id)) this.notify(\"warning\", \"This task cannot move to background.\");\n\t\t} catch (error) {\n\t\t\tthis.notify(\"warning\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t}\n\tprivate startSearch(): void {\n\t\tconst input = new Input({ prompt: \"Find task: \", placeholder: \"title, command, kind or ID\" });\n\t\tinput.focused = true;\n\t\tthis.setMode({ kind: \"search\", restore: { id: this.selection.state.selectedId, focus: this.focus }, input });\n\t\tthis.focus = \"list\";\n\t}\n\tprivate finishSearch(cancel: boolean): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"search\") return;\n\t\tconst id = cancel ? mode.restore.id : this.selection.state.selectedId;\n\t\tif (!cancel && !id) return;\n\t\tthis.focus = cancel ? mode.restore.focus : \"list\";\n\t\tthis.setMode(BROWSE);\n\t\tthis.select(id);\n\t\tthis.selectedChanged();\n\t}\n\tprivate open(): void {\n\t\tif (this.focus === \"list\" && this.selection.selected) this.focus = \"inspector\";\n\t}\n\tprivate action(key: AppKeybinding): void {\n\t\tswitch (key) {\n\t\t\tcase \"app.tasks.search\":\n\t\t\t\tthis.startSearch();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.previousTab\":\n\t\t\tcase \"app.tasks.nextTab\":\n\t\t\t\tif (this.focus === \"inspector\")\n\t\t\t\t\tthis.selection.state.tab = key === \"app.tasks.previousTab\" ? \"output\" : \"info\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.nextFocus\":\n\t\t\tcase \"app.tasks.previousFocus\":\n\t\t\t\tthis.focus = this.focus === \"list\" ? \"inspector\" : \"list\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.follow\":\n\t\t\t\tif (this.focus === \"inspector\" && this.selection.state.tab === \"output\") {\n\t\t\t\t\tthis.inspector.position.output.jump(true);\n\t\t\t\t\tthis.queueTick(true);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.top\":\n\t\t\tcase \"app.tasks.bottom\":\n\t\t\t\tif (this.focus === \"list\") {\n\t\t\t\t\tthis.select(key === \"app.tasks.top\" ? this.selection.rows[0]?.id : this.selection.rows.at(-1)?.id);\n\t\t\t\t\tthis.selectedChanged();\n\t\t\t\t} else this.inspector.position[this.selection.state.tab].jump(key === \"app.tasks.bottom\");\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.kill\":\n\t\t\t\tthis.requestStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.confirmStop\":\n\t\t\t\tthis.confirmStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.detachSelected\":\n\t\t\t\tthis.detachSelected();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.help\":\n\t\t\t\tthis.setMode({ kind: \"help\", viewport: new TaskViewport() });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t/** Performs what a click on a rendered target asks for. */\n\tprivate perform(action: TaskAction): void {\n\t\tswitch (action.kind) {\n\t\t\tcase \"select\":\n\t\t\t\tthis.select(action.taskId);\n\t\t\t\tthis.selectedChanged();\n\t\t\t\tthis.focus = \"list\";\n\t\t\t\tif (this.mode.kind === \"search\") this.finishSearch(false);\n\t\t\t\tbreak;\n\t\t\tcase \"tab\":\n\t\t\t\tthis.focus = \"inspector\";\n\t\t\t\tthis.selection.state.tab = action.tab;\n\t\t\t\tbreak;\n\t\t\tcase \"key\":\n\t\t\t\tif (action.key === \"app.tasks.follow\") this.focus = \"inspector\";\n\t\t\t\tthis.action(action.key);\n\t\t\t\tbreak;\n\t\t\tcase \"open\":\n\t\t\t\tthis.open();\n\t\t\t\tbreak;\n\t\t\tcase \"back\":\n\t\t\t\tthis.escape();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate move(direction: number, page = false): void {\n\t\tif (this.mode.kind === \"help\") {\n\t\t\tthis.mode.viewport.move(direction, page);\n\t\t\treturn;\n\t\t}\n\t\tif (this.focus === \"list\") {\n\t\t\tconst rows = this.selection.rows;\n\t\t\tif (!rows.length) return;\n\t\t\tconst index = rows.findIndex((task) => task.id === this.selection.state.selectedId);\n\t\t\tconst next = page\n\t\t\t\t? Math.max(0, Math.min(rows.length - 1, index + direction * (this.layout?.listPageSize ?? 1)))\n\t\t\t\t: (index + direction + rows.length) % rows.length;\n\t\t\tthis.select(rows[next]?.id);\n\t\t\tthis.selectedChanged();\n\t\t} else this.inspector.position[this.selection.state.tab].move(direction, page);\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.disposed) return;\n\t\tthis.sync();\n\t\tthis.render(this.width);\n\t\tthis.clearFeedback();\n\t\ttry {\n\t\t\tif (this.layout?.tooSmall) {\n\t\t\t\t// The resize notice owns the screen; keys must not act on the hidden panel.\n\t\t\t\tif (this.options.keybindings.matches(data, \"tui.select.cancel\")) this.escape();\n\t\t\t} else {\n\t\t\t\tswitch (this.mode.kind) {\n\t\t\t\t\tcase \"help\":\n\t\t\t\t\t\tthis.helpInput(this.mode.viewport, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"search\":\n\t\t\t\t\t\tthis.searchInput(this.mode.input, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"confirmStop\":\n\t\t\t\t\t\tthis.confirmInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"browse\":\n\t\t\t\t\t\tthis.browseInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t\tif (this.disposed) return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t}\n\tprivate helpInput(viewport: TaskViewport, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\") || kb.matches(data, \"app.tasks.help\")) this.setMode(BROWSE);\n\t\telse if (kb.matches(data, \"app.tasks.top\") || kb.matches(data, \"app.tasks.bottom\"))\n\t\t\tviewport.jump(kb.matches(data, \"app.tasks.bottom\"));\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.editor.pageUp\"))\n\t\t\tviewport.move(-1, kb.matches(data, \"tui.editor.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.editor.pageDown\"))\n\t\t\tviewport.move(1, kb.matches(data, \"tui.editor.pageDown\"));\n\t}\n\tprivate searchInput(input: Input, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.finishSearch(false);\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.pageUp\"))\n\t\t\tthis.move(-1, kb.matches(data, \"tui.select.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.select.pageDown\"))\n\t\t\tthis.move(1, kb.matches(data, \"tui.select.pageDown\"));\n\t\telse {\n\t\t\tinput.handleInput(data);\n\t\t\tthis.selection.refresh(this.query);\n\t\t\tthis.selectedChanged();\n\t\t}\n\t}\n\tprivate confirmInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"app.tasks.confirmStop\")) this.confirmStop();\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t}\n\tprivate browseInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.escape();\n\t\t\treturn;\n\t\t}\n\t\tconst pageUp = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\");\n\t\tconst pageDown = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\");\n\t\tif (pageUp || kb.matches(data, \"tui.select.up\")) this.move(-1, pageUp);\n\t\telse if (pageDown || kb.matches(data, \"tui.select.down\")) this.move(1, pageDown);\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.open();\n\t\telse {\n\t\t\tconst key = actions.find((key) => kb.matches(data, key));\n\t\t\tif (key) this.action(key);\n\t\t}\n\t}\n\thandleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined {\n\t\tif (this.disposed || event.ctrl || event.alt || event.shift) return;\n\t\t// Feedback is transient: a click retracts it and acts, exactly like a keypress does.\n\t\tthis.clearFeedback();\n\t\tthis.render(event.width);\n\t\tconst layout = this.layout!;\n\t\tconst region = layout.regions.find(\n\t\t\t(r) => event.y >= r.y && event.y < r.y + r.height && event.x >= r.x && event.x < r.x + r.width,\n\t\t);\n\t\tif (event.type === \"wheel\" && event.wheelDelta) {\n\t\t\tif (region) {\n\t\t\t\tconst delta = Math.sign(event.wheelDelta) * Math.min(20, Math.abs(event.wheelDelta));\n\t\t\t\tif (region.pane === \"help\") {\n\t\t\t\t\tif (this.mode.kind === \"help\") this.mode.viewport.move(delta, false);\n\t\t\t\t} else if (region.pane === \"list\") this.list.scroll(delta);\n\t\t\t\telse this.inspector.position[this.selection.state.tab].move(delta, false);\n\t\t\t}\n\t\t} else if (event.type === \"click\" && event.button === \"left\") {\n\t\t\tconst hit = layout.hits.find((hit) => hit.y === event.y && event.x >= hit.x && event.x < hit.x + hit.width);\n\t\t\ttry {\n\t\t\t\tif (hit) this.perform(hit.action);\n\t\t\t\telse if (region && region.pane !== \"help\") this.focus = region.pane;\n\t\t\t} catch (error) {\n\t\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t\t}\n\t\t} else return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t\treturn { handled: true, focus: event.type === \"click\" };\n\t}\n\trender(width: number): string[] {\n\t\tthis.width = width;\n\t\tthis.sync();\n\t\tthis.layout = renderTasksLayout({\n\t\t\twidth,\n\t\t\theight: this.options.tui.terminal.rows,\n\t\t\ttheme: this.options.theme,\n\t\t\tkeybindings: this.options.keybindings,\n\t\t\tselection: this.selection,\n\t\t\tinspector: this.inspector,\n\t\t\tlist: this.list,\n\t\t\tfocus: this.focus,\n\t\t\tmode: this.mode,\n\t\t\tfeedback: this.feedback,\n\t\t\tcanDetach: (id) => this.canDetach(id),\n\t\t});\n\t\treturn this.layout.lines;\n\t}\n\t/** The panel's selection can lag the runtime by a notification; a task that is gone cannot move. */\n\tprivate canDetach(id: string): boolean {\n\t\ttry {\n\t\t\treturn this.options.host.canDetach(id);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.selection.state.closedAt = Date.now();\n\t\tclearInterval(this.pollTimer);\n\t\tclearInterval(this.animationTimer);\n\t\tthis.clearFeedback();\n\t\tthis.unsubscribe();\n\t\tthis.inspector.dispose();\n\t}\n}\n"]}
@@ -11,9 +11,8 @@ 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. Structured live activities share the interactive renderer;
15
+ * their bounded text remains the fallback for other hosts and settled snapshots.
17
16
  */
18
- export declare function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number, live?: readonly string[]): string[];
17
+ export declare function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number): string[];
19
18
  //# 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;AAEhG,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;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BjH"}
@@ -1,6 +1,7 @@
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
+ import { taskActivityLines } from "../../../modes/interactive/components/task-activity-list.js";
4
5
  import { getMarkdownTheme, highlightCode } from "../../../modes/interactive/theme/theme.js";
5
6
  import { cleanTaskText } from "./text.js";
6
7
  /**
@@ -53,29 +54,29 @@ export function streamsLog(task) {
53
54
  /**
54
55
  * Output: a log streams from its file through bounded reads. Any other task shows what its
55
56
  * 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.
57
+ * otherwise the model-facing result. Structured live activities share the interactive renderer;
58
+ * their bounded text remains the fallback for other hosts and settled snapshots.
59
59
  */
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)));
60
+ export function outputLines(task, read, theme, width) {
63
61
  const empty = task.status === "completed"
64
62
  ? "Completed with no output."
65
63
  : isTaskTerminal(task.status)
66
64
  ? "No saved output."
67
65
  : "No output yet.";
68
66
  const fromLog = streamsLog(task) && read !== undefined && !read.readError;
69
- const human = task.display?.text ? task.display : undefined;
67
+ const human = task.display?.text || task.display?.activities?.length ? task.display : undefined;
70
68
  const published = human ?? task.result;
71
69
  const text = cleanTaskText((fromLog ? read.text : published?.text) || empty);
72
- // Logs and live progress keep their plain rendering; only a settled report's result is Markdown.
70
+ const activities = !fromLog && !isTaskTerminal(task.status) && human?.activities?.length ? human.activities : undefined;
71
+ // Logs and plain live progress keep their plain rendering; only a settled report's result is Markdown.
73
72
  const markdown = !fromLog && !human && task.output === "report" && task.status === "completed";
74
- const output = markdown
75
- ? new Markdown(text, 0, 0, getMarkdownTheme(), {
76
- color: (line) => theme.fg("toolOutput", line),
77
- }).render(Math.max(1, width))
78
- : text.split("\n").map((line) => theme.fg("toolOutput", line));
73
+ const output = activities
74
+ ? taskActivityLines(activities, Math.max(1, width), theme, human?.earlierActivities ?? 0)
75
+ : markdown
76
+ ? new Markdown(text, 0, 0, getMarkdownTheme(), {
77
+ color: (line) => theme.fg("toolOutput", line),
78
+ }).render(Math.max(1, width))
79
+ : text.split("\n").map((line) => theme.fg("toolOutput", line));
79
80
  if (read?.readError)
80
81
  output.unshift(theme.fg("warning", "Log unavailable; showing saved result."));
81
82
  if (!fromLog && published?.truncated)
@@ -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 { taskActivityLines } from \"../../../modes/interactive/components/task-activity-list.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. Structured live activities share the interactive renderer;\n * their bounded text remains the fallback for other hosts and settled snapshots.\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?.activities?.length ? task.display : undefined;\n\tconst published = human ?? task.result;\n\tconst text = cleanTaskText((fromLog ? read.text : published?.text) || empty);\n\tconst activities =\n\t\t!fromLog && !isTaskTerminal(task.status) && human?.activities?.length ? human.activities : undefined;\n\t// Logs and plain 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 = activities\n\t\t? taskActivityLines(activities, Math.max(1, width), theme, human?.earlierActivities ?? 0)\n\t\t: markdown\n\t\t\t? new Markdown(text, 0, 0, getMarkdownTheme(), {\n\t\t\t\t\tcolor: (line) => theme.fg(\"toolOutput\", line),\n\t\t\t\t}).render(Math.max(1, width))\n\t\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":"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","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"}