@astralyn/pi 0.99.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/CHANGELOG.md +39 -3
  2. package/dist/bundle/chunks/anthropic-messages-CG2BSDQS.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +2 -2
  4. package/dist/bundle/chunks/{azure-openai-responses-RPBERDXD.js → azure-openai-responses-PBA4QKCM.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  6. package/dist/bundle/chunks/{chunk-ABVRAYXT.js → chunk-6UFFVA7M.js} +2 -2
  7. package/dist/bundle/chunks/chunk-GIG5IHES.js +2 -0
  8. package/dist/bundle/chunks/{chunk-VW2P3X6P.js → chunk-HESRDUKO.js} +414 -666
  9. package/dist/bundle/chunks/{chunk-A576H74Y.js → chunk-PFZKRUMO.js} +1 -1
  10. package/dist/bundle/chunks/chunk-SGLYRVQL.js +2 -0
  11. package/dist/bundle/chunks/chunk-TRHTWM3C.js +2 -0
  12. package/dist/bundle/chunks/{chunk-DEWXBB6W.js → chunk-V66VGGOM.js} +1 -1
  13. package/dist/bundle/chunks/chunk-Z2RKSI3O.js +2 -0
  14. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-ZYSAFXXL.js → cloudflare-workers-ai-system-one-YB7XPPP4.js} +1 -1
  15. package/dist/bundle/chunks/codemode-worker.js +67 -8
  16. package/dist/bundle/chunks/github-copilot.js +1 -1
  17. package/dist/bundle/chunks/{google-generative-ai-SDNQVVXA.js → google-generative-ai-V5ZM5MCL.js} +1 -1
  18. package/dist/bundle/chunks/{google-vertex-LZXOLBIO.js → google-vertex-22THOFP5.js} +1 -1
  19. package/dist/bundle/chunks/{llama-cpp-classify-7IYGGPND.js → llama-cpp-classify-R7DQLTQN.js} +1 -1
  20. package/dist/bundle/chunks/{mistral-conversations-VYKPSSAM.js → mistral-conversations-WHSCJJWP.js} +1 -1
  21. package/dist/bundle/chunks/openai-chatgpt.js +1 -1
  22. package/dist/bundle/chunks/{openai-codex-responses-HZ4VUDXD.js → openai-codex-responses-N7GDPBPP.js} +1 -1
  23. package/dist/bundle/chunks/openai-codex.js +1 -1
  24. package/dist/bundle/chunks/{openai-completions-SKDGF6OE.js → openai-completions-RGGQK5UW.js} +1 -1
  25. package/dist/bundle/chunks/{openai-responses-FPML4SSG.js → openai-responses-3ZLD5JYI.js} +1 -1
  26. package/dist/bundle/chunks/{openrouter-images-5524IQHX.js → openrouter-images-YP3YVB54.js} +1 -1
  27. package/dist/bundle/chunks/openrouter.js +1 -1
  28. package/dist/bundle/chunks/radius.js +1 -1
  29. package/dist/bundle/chunks/{typesafe-system-one-Z2CDLKEY.js → typesafe-system-one-RREJAKWB.js} +1 -1
  30. package/dist/bundle/chunks/virtual-modules-4RQ2L6W4.js +2 -0
  31. package/dist/bundle/cli.js +1 -1
  32. package/dist/bundle/index.js +1 -1
  33. package/dist/bundle/rpc-entry.js +1 -1
  34. package/dist/cli/args.js +1 -1
  35. package/dist/cli/args.js.map +1 -1
  36. package/dist/config.d.ts +5 -8
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +16 -13
  39. package/dist/config.js.map +1 -1
  40. package/dist/core/agent-session.d.ts +21 -1
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +64 -11
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/extensions/index.d.ts +1 -1
  45. package/dist/core/extensions/index.d.ts.map +1 -1
  46. package/dist/core/extensions/index.js.map +1 -1
  47. package/dist/core/extensions/loader.d.ts.map +1 -1
  48. package/dist/core/extensions/loader.js +13 -1
  49. package/dist/core/extensions/loader.js.map +1 -1
  50. package/dist/core/extensions/types.d.ts +6 -1
  51. package/dist/core/extensions/types.d.ts.map +1 -1
  52. package/dist/core/extensions/types.js.map +1 -1
  53. package/dist/core/keybindings.d.ts +51 -11
  54. package/dist/core/keybindings.d.ts.map +1 -1
  55. package/dist/core/keybindings.js +11 -3
  56. package/dist/core/keybindings.js.map +1 -1
  57. package/dist/core/mcp-servers.d.ts +34 -7
  58. package/dist/core/mcp-servers.d.ts.map +1 -1
  59. package/dist/core/mcp-servers.js +52 -11
  60. package/dist/core/mcp-servers.js.map +1 -1
  61. package/dist/core/model-registry.d.ts +3 -1
  62. package/dist/core/model-registry.d.ts.map +1 -1
  63. package/dist/core/model-registry.js +4 -0
  64. package/dist/core/model-registry.js.map +1 -1
  65. package/dist/core/model-runtime.d.ts +6 -0
  66. package/dist/core/model-runtime.d.ts.map +1 -1
  67. package/dist/core/model-runtime.js +22 -18
  68. package/dist/core/model-runtime.js.map +1 -1
  69. package/dist/core/radius.d.ts +2 -0
  70. package/dist/core/radius.d.ts.map +1 -1
  71. package/dist/core/radius.js +2 -0
  72. package/dist/core/radius.js.map +1 -1
  73. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  74. package/dist/core/remote-catalog-provider.js +4 -9
  75. package/dist/core/remote-catalog-provider.js.map +1 -1
  76. package/dist/core/sdk.d.ts.map +1 -1
  77. package/dist/core/sdk.js +1 -0
  78. package/dist/core/sdk.js.map +1 -1
  79. package/dist/core/settings-manager.d.ts +7 -5
  80. package/dist/core/settings-manager.d.ts.map +1 -1
  81. package/dist/core/settings-manager.js +2 -1
  82. package/dist/core/settings-manager.js.map +1 -1
  83. package/dist/core/system-prompt.js +1 -1
  84. package/dist/core/system-prompt.js.map +1 -1
  85. package/dist/core/tasks/format.d.ts +7 -0
  86. package/dist/core/tasks/format.d.ts.map +1 -0
  87. package/dist/core/tasks/format.js +14 -0
  88. package/dist/core/tasks/format.js.map +1 -0
  89. package/dist/core/tasks/history.d.ts.map +1 -1
  90. package/dist/core/tasks/history.js +0 -19
  91. package/dist/core/tasks/history.js.map +1 -1
  92. package/dist/core/tasks/output.d.ts +8 -0
  93. package/dist/core/tasks/output.d.ts.map +1 -1
  94. package/dist/core/tasks/output.js +19 -0
  95. package/dist/core/tasks/output.js.map +1 -1
  96. package/dist/core/tasks/presentation.d.ts +1 -3
  97. package/dist/core/tasks/presentation.d.ts.map +1 -1
  98. package/dist/core/tasks/presentation.js +79 -166
  99. package/dist/core/tasks/presentation.js.map +1 -1
  100. package/dist/core/tasks/runtime.d.ts +16 -9
  101. package/dist/core/tasks/runtime.d.ts.map +1 -1
  102. package/dist/core/tasks/runtime.js +89 -106
  103. package/dist/core/tasks/runtime.js.map +1 -1
  104. package/dist/core/tasks/session.d.ts.map +1 -1
  105. package/dist/core/tasks/session.js +13 -4
  106. package/dist/core/tasks/session.js.map +1 -1
  107. package/dist/core/tasks/store.d.ts +20 -6
  108. package/dist/core/tasks/store.d.ts.map +1 -1
  109. package/dist/core/tasks/store.js +45 -18
  110. package/dist/core/tasks/store.js.map +1 -1
  111. package/dist/core/tasks/types.d.ts +14 -54
  112. package/dist/core/tasks/types.d.ts.map +1 -1
  113. package/dist/core/tasks/types.js +1 -5
  114. package/dist/core/tasks/types.js.map +1 -1
  115. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  116. package/dist/core/tools/renderers/bash.js +11 -34
  117. package/dist/core/tools/renderers/bash.js.map +1 -1
  118. package/dist/core/tools/shell-execution.d.ts +0 -1
  119. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  120. package/dist/core/tools/shell-execution.js +3 -10
  121. package/dist/core/tools/shell-execution.js.map +1 -1
  122. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  123. package/dist/core/tools/shell-tool.js +2 -4
  124. package/dist/core/tools/shell-tool.js.map +1 -1
  125. package/dist/core/tools/tasks/actions.d.ts +1 -1
  126. package/dist/core/tools/tasks/actions.d.ts.map +1 -1
  127. package/dist/core/tools/tasks/actions.js +26 -12
  128. package/dist/core/tools/tasks/actions.js.map +1 -1
  129. package/dist/core/tools/tasks/constants.d.ts +2 -6
  130. package/dist/core/tools/tasks/constants.d.ts.map +1 -1
  131. package/dist/core/tools/tasks/constants.js +2 -6
  132. package/dist/core/tools/tasks/constants.js.map +1 -1
  133. package/dist/core/tools/tasks/schema.d.ts +1 -1
  134. package/dist/core/tools/tasks/schema.d.ts.map +1 -1
  135. package/dist/core/tools/tasks/schema.js +8 -7
  136. package/dist/core/tools/tasks/schema.js.map +1 -1
  137. package/dist/core/tools/tasks/types.d.ts +8 -38
  138. package/dist/core/tools/tasks/types.d.ts.map +1 -1
  139. package/dist/core/tools/tasks/types.js +6 -11
  140. package/dist/core/tools/tasks/types.js.map +1 -1
  141. package/dist/core/virtual-models.d.ts +2 -0
  142. package/dist/core/virtual-models.d.ts.map +1 -1
  143. package/dist/core/virtual-models.js +19 -12
  144. package/dist/core/virtual-models.js.map +1 -1
  145. package/dist/extensions/btw/agent.d.ts +17 -8
  146. package/dist/extensions/btw/agent.d.ts.map +1 -1
  147. package/dist/extensions/btw/agent.js +74 -76
  148. package/dist/extensions/btw/agent.js.map +1 -1
  149. package/dist/extensions/btw/controller.d.ts +0 -1
  150. package/dist/extensions/btw/controller.d.ts.map +1 -1
  151. package/dist/extensions/btw/controller.js +26 -33
  152. package/dist/extensions/btw/controller.js.map +1 -1
  153. package/dist/extensions/btw/panel.d.ts +13 -14
  154. package/dist/extensions/btw/panel.d.ts.map +1 -1
  155. package/dist/extensions/btw/panel.js +38 -29
  156. package/dist/extensions/btw/panel.js.map +1 -1
  157. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  158. package/dist/extensions/codemode/execute.js +197 -51
  159. package/dist/extensions/codemode/execute.js.map +1 -1
  160. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  161. package/dist/extensions/codemode/renderer.js +43 -25
  162. package/dist/extensions/codemode/renderer.js.map +1 -1
  163. package/dist/extensions/codemode/tool.d.ts +12 -11
  164. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  165. package/dist/extensions/codemode/tool.js +73 -129
  166. package/dist/extensions/codemode/tool.js.map +1 -1
  167. package/dist/extensions/codemode/worker.d.ts +1 -1
  168. package/dist/extensions/codemode/worker.js +1 -1
  169. package/dist/extensions/codemode/worker.js.map +1 -1
  170. package/dist/extensions/deepwiki/schema.d.ts +1 -1
  171. package/dist/extensions/index.d.ts.map +1 -1
  172. package/dist/extensions/index.js +0 -2
  173. package/dist/extensions/index.js.map +1 -1
  174. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  175. package/dist/extensions/mcp/cli.js +20 -5
  176. package/dist/extensions/mcp/cli.js.map +1 -1
  177. package/dist/extensions/mcp/config.d.ts +4 -2
  178. package/dist/extensions/mcp/config.d.ts.map +1 -1
  179. package/dist/extensions/mcp/config.js +14 -2
  180. package/dist/extensions/mcp/config.js.map +1 -1
  181. package/dist/extensions/mcp/index.d.ts +32 -8
  182. package/dist/extensions/mcp/index.d.ts.map +1 -1
  183. package/dist/extensions/mcp/index.js +235 -61
  184. package/dist/extensions/mcp/index.js.map +1 -1
  185. package/dist/extensions/mcp/oauth.d.ts +10 -7
  186. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  187. package/dist/extensions/mcp/oauth.js +56 -31
  188. package/dist/extensions/mcp/oauth.js.map +1 -1
  189. package/dist/extensions/mcp/runtime.d.ts +2 -0
  190. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  191. package/dist/extensions/mcp/runtime.js +16 -9
  192. package/dist/extensions/mcp/runtime.js.map +1 -1
  193. package/dist/extensions/mcp/tools.d.ts +5 -4
  194. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  195. package/dist/extensions/mcp/tools.js +33 -15
  196. package/dist/extensions/mcp/tools.js.map +1 -1
  197. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  198. package/dist/extensions/mcp/ui.js +4 -2
  199. package/dist/extensions/mcp/ui.js.map +1 -1
  200. package/dist/extensions/provider/catalog.d.ts +8 -1
  201. package/dist/extensions/provider/catalog.d.ts.map +1 -1
  202. package/dist/extensions/provider/catalog.js +31 -0
  203. package/dist/extensions/provider/catalog.js.map +1 -1
  204. package/dist/extensions/provider/connection.d.ts +4 -1
  205. package/dist/extensions/provider/connection.d.ts.map +1 -1
  206. package/dist/extensions/provider/connection.js +1 -5
  207. package/dist/extensions/provider/connection.js.map +1 -1
  208. package/dist/extensions/provider/editing.d.ts +36 -0
  209. package/dist/extensions/provider/editing.d.ts.map +1 -0
  210. package/dist/extensions/provider/editing.js +99 -0
  211. package/dist/extensions/provider/editing.js.map +1 -0
  212. package/dist/extensions/provider/json-fields.d.ts +5 -0
  213. package/dist/extensions/provider/json-fields.d.ts.map +1 -0
  214. package/dist/extensions/provider/json-fields.js +31 -0
  215. package/dist/extensions/provider/json-fields.js.map +1 -0
  216. package/dist/extensions/provider/store.d.ts +1 -4
  217. package/dist/extensions/provider/store.d.ts.map +1 -1
  218. package/dist/extensions/provider/store.js +2 -30
  219. package/dist/extensions/provider/store.js.map +1 -1
  220. package/dist/extensions/provider/ui/builtin-data.d.ts +0 -2
  221. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  222. package/dist/extensions/provider/ui/builtin-data.js +14 -79
  223. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  224. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  225. package/dist/extensions/provider/ui/compat.js +6 -9
  226. package/dist/extensions/provider/ui/compat.js.map +1 -1
  227. package/dist/extensions/provider/ui/controls.d.ts +48 -0
  228. package/dist/extensions/provider/ui/controls.d.ts.map +1 -0
  229. package/dist/extensions/provider/ui/controls.js +108 -0
  230. package/dist/extensions/provider/ui/controls.js.map +1 -0
  231. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  232. package/dist/extensions/provider/ui/dictionary.js +6 -9
  233. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  234. package/dist/extensions/provider/ui/editor.d.ts +3 -3
  235. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  236. package/dist/extensions/provider/ui/editor.js +35 -140
  237. package/dist/extensions/provider/ui/editor.js.map +1 -1
  238. package/dist/extensions/provider/ui/fetch-models.d.ts +0 -3
  239. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  240. package/dist/extensions/provider/ui/fetch-models.js +49 -44
  241. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  242. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  243. package/dist/extensions/provider/ui/model-fields.js +11 -14
  244. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  245. package/dist/extensions/provider/ui/model-options.d.ts +4 -34
  246. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  247. package/dist/extensions/provider/ui/model-options.js +90 -271
  248. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  249. package/dist/extensions/provider/ui/pane.d.ts +4 -18
  250. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  251. package/dist/extensions/provider/ui/pane.js.map +1 -1
  252. package/dist/extensions/provider/ui/provider-fields.d.ts +2 -19
  253. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  254. package/dist/extensions/provider/ui/provider-fields.js +58 -171
  255. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  256. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  257. package/dist/extensions/provider/ui/thinking-map.js +6 -9
  258. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  259. package/dist/extensions/question/detail-pane.d.ts +7 -2
  260. package/dist/extensions/question/detail-pane.d.ts.map +1 -1
  261. package/dist/extensions/question/detail-pane.js +16 -5
  262. package/dist/extensions/question/detail-pane.js.map +1 -1
  263. package/dist/extensions/question/dialog-view.d.ts +41 -0
  264. package/dist/extensions/question/dialog-view.d.ts.map +1 -0
  265. package/dist/extensions/question/dialog-view.js +329 -0
  266. package/dist/extensions/question/dialog-view.js.map +1 -0
  267. package/dist/extensions/question/dialog.d.ts +3 -3
  268. package/dist/extensions/question/dialog.d.ts.map +1 -1
  269. package/dist/extensions/question/dialog.js +220 -634
  270. package/dist/extensions/question/dialog.js.map +1 -1
  271. package/dist/extensions/question/index.d.ts.map +1 -1
  272. package/dist/extensions/question/index.js +2 -3
  273. package/dist/extensions/question/index.js.map +1 -1
  274. package/dist/extensions/question/render.d.ts.map +1 -1
  275. package/dist/extensions/question/render.js +22 -32
  276. package/dist/extensions/question/render.js.map +1 -1
  277. package/dist/extensions/question/results.d.ts.map +1 -1
  278. package/dist/extensions/question/results.js +56 -12
  279. package/dist/extensions/question/results.js.map +1 -1
  280. package/dist/extensions/question/schema.d.ts +21 -6
  281. package/dist/extensions/question/schema.d.ts.map +1 -1
  282. package/dist/extensions/question/schema.js.map +1 -1
  283. package/dist/extensions/question/state.d.ts +9 -7
  284. package/dist/extensions/question/state.d.ts.map +1 -1
  285. package/dist/extensions/question/state.js +63 -54
  286. package/dist/extensions/question/state.js.map +1 -1
  287. package/dist/extensions/question/types.d.ts +41 -18
  288. package/dist/extensions/question/types.d.ts.map +1 -1
  289. package/dist/extensions/question/types.js.map +1 -1
  290. package/dist/extensions/statusline/index.d.ts +4 -0
  291. package/dist/extensions/statusline/index.d.ts.map +1 -1
  292. package/dist/extensions/statusline/index.js +18 -355
  293. package/dist/extensions/statusline/index.js.map +1 -1
  294. package/dist/extensions/statusline/render.d.ts +19 -0
  295. package/dist/extensions/statusline/render.d.ts.map +1 -0
  296. package/dist/extensions/statusline/render.js +163 -0
  297. package/dist/extensions/statusline/render.js.map +1 -0
  298. package/dist/extensions/statusline/usage.d.ts +12 -0
  299. package/dist/extensions/statusline/usage.d.ts.map +1 -0
  300. package/dist/extensions/statusline/usage.js +36 -0
  301. package/dist/extensions/statusline/usage.js.map +1 -0
  302. package/dist/extensions/tool-search/tool.d.ts +5 -4
  303. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  304. package/dist/extensions/tool-search/tool.js +7 -28
  305. package/dist/extensions/tool-search/tool.js.map +1 -1
  306. package/dist/extensions/web-search/execute.d.ts +1 -5
  307. package/dist/extensions/web-search/execute.d.ts.map +1 -1
  308. package/dist/extensions/web-search/execute.js +4 -9
  309. package/dist/extensions/web-search/execute.js.map +1 -1
  310. package/dist/extensions/web-search/format.d.ts +12 -3
  311. package/dist/extensions/web-search/format.d.ts.map +1 -1
  312. package/dist/extensions/web-search/format.js +33 -25
  313. package/dist/extensions/web-search/format.js.map +1 -1
  314. package/dist/extensions/web-search/index.d.ts.map +1 -1
  315. package/dist/extensions/web-search/index.js +6 -29
  316. package/dist/extensions/web-search/index.js.map +1 -1
  317. package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
  318. package/dist/extensions/web-search/providers/deepseek.js +0 -1
  319. package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
  320. package/dist/extensions/web-search/providers/http.d.ts +1 -1
  321. package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
  322. package/dist/extensions/web-search/providers/http.js.map +1 -1
  323. package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
  324. package/dist/extensions/web-search/providers/minimax.js +0 -1
  325. package/dist/extensions/web-search/providers/minimax.js.map +1 -1
  326. package/dist/extensions/web-search/render.d.ts +7 -2
  327. package/dist/extensions/web-search/render.d.ts.map +1 -1
  328. package/dist/extensions/web-search/render.js +32 -4
  329. package/dist/extensions/web-search/render.js.map +1 -1
  330. package/dist/extensions/web-search/results.d.ts.map +1 -1
  331. package/dist/extensions/web-search/results.js +3 -8
  332. package/dist/extensions/web-search/results.js.map +1 -1
  333. package/dist/extensions/web-search/types.d.ts +4 -2
  334. package/dist/extensions/web-search/types.d.ts.map +1 -1
  335. package/dist/extensions/web-search/types.js.map +1 -1
  336. package/dist/index.d.ts +2 -4
  337. package/dist/index.d.ts.map +1 -1
  338. package/dist/index.js +0 -1
  339. package/dist/index.js.map +1 -1
  340. package/dist/main.d.ts.map +1 -1
  341. package/dist/main.js +6 -0
  342. package/dist/main.js.map +1 -1
  343. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  344. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  345. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  346. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  347. package/dist/modes/interactive/components/pi-logo-animation.d.ts +68 -0
  348. package/dist/modes/interactive/components/pi-logo-animation.d.ts.map +1 -0
  349. package/dist/modes/interactive/components/pi-logo-animation.js +1076 -0
  350. package/dist/modes/interactive/components/pi-logo-animation.js.map +1 -0
  351. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts +7 -0
  352. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts.map +1 -0
  353. package/dist/modes/interactive/components/pi-logo-animation.lazy.js +12 -0
  354. package/dist/modes/interactive/components/pi-logo-animation.lazy.js.map +1 -0
  355. package/dist/modes/interactive/components/pi-logo.d.ts +7 -0
  356. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -1
  357. package/dist/modes/interactive/components/pi-logo.js +13 -1
  358. package/dist/modes/interactive/components/pi-logo.js.map +1 -1
  359. package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
  360. package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
  361. package/dist/modes/interactive/components/radius-login-selector.js +83 -0
  362. package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
  363. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  364. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  365. package/dist/modes/interactive/components/settings-selector.js +5 -5
  366. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  367. package/dist/modes/interactive/components/status-marker.d.ts +0 -2
  368. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  369. package/dist/modes/interactive/components/status-marker.js +0 -4
  370. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  371. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  372. package/dist/modes/interactive/components/user-message.js +5 -4
  373. package/dist/modes/interactive/components/user-message.js.map +1 -1
  374. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  375. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/visual-truncate.js +36 -6
  377. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  378. package/dist/modes/interactive/interactive-mode.d.ts +10 -0
  379. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  380. package/dist/modes/interactive/interactive-mode.js +167 -40
  381. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  382. package/dist/modes/interactive/tasks/completion-render.d.ts +1 -1
  383. package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -1
  384. package/dist/modes/interactive/tasks/completion-render.js +28 -82
  385. package/dist/modes/interactive/tasks/completion-render.js.map +1 -1
  386. package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
  387. package/dist/modes/interactive/tasks/index.js +18 -13
  388. package/dist/modes/interactive/tasks/index.js.map +1 -1
  389. package/dist/modes/interactive/tasks/inspector.d.ts +35 -0
  390. package/dist/modes/interactive/tasks/inspector.d.ts.map +1 -0
  391. package/dist/modes/interactive/tasks/inspector.js +93 -0
  392. package/dist/modes/interactive/tasks/inspector.js.map +1 -0
  393. package/dist/modes/interactive/tasks/layout.d.ts +40 -0
  394. package/dist/modes/interactive/tasks/layout.d.ts.map +1 -0
  395. package/dist/modes/interactive/tasks/layout.js +212 -0
  396. package/dist/modes/interactive/tasks/layout.js.map +1 -0
  397. package/dist/modes/interactive/tasks/list.d.ts +21 -0
  398. package/dist/modes/interactive/tasks/list.d.ts.map +1 -0
  399. package/dist/modes/interactive/tasks/list.js +96 -0
  400. package/dist/modes/interactive/tasks/list.js.map +1 -0
  401. package/dist/modes/interactive/tasks/manager.d.ts +29 -36
  402. package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
  403. package/dist/modes/interactive/tasks/manager.js +315 -315
  404. package/dist/modes/interactive/tasks/manager.js.map +1 -1
  405. package/dist/modes/interactive/tasks/model.d.ts +21 -0
  406. package/dist/modes/interactive/tasks/model.d.ts.map +1 -0
  407. package/dist/modes/interactive/tasks/model.js +41 -0
  408. package/dist/modes/interactive/tasks/model.js.map +1 -0
  409. package/dist/modes/interactive/tasks/render.d.ts +5 -19
  410. package/dist/modes/interactive/tasks/render.d.ts.map +1 -1
  411. package/dist/modes/interactive/tasks/render.js +18 -102
  412. package/dist/modes/interactive/tasks/render.js.map +1 -1
  413. package/dist/modes/interactive/tasks/task-view.d.ts +8 -48
  414. package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -1
  415. package/dist/modes/interactive/tasks/task-view.js +11 -51
  416. package/dist/modes/interactive/tasks/task-view.js.map +1 -1
  417. package/dist/modes/interactive/tasks/text.d.ts +1 -7
  418. package/dist/modes/interactive/tasks/text.d.ts.map +1 -1
  419. package/dist/modes/interactive/tasks/text.js +6 -29
  420. package/dist/modes/interactive/tasks/text.js.map +1 -1
  421. package/dist/modes/interactive/tasks/viewport.d.ts +2 -0
  422. package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -1
  423. package/dist/modes/interactive/tasks/viewport.js +17 -7
  424. package/dist/modes/interactive/tasks/viewport.js.map +1 -1
  425. package/dist/modes/interactive/tasks/views.d.ts +9 -0
  426. package/dist/modes/interactive/tasks/views.d.ts.map +1 -0
  427. package/dist/modes/interactive/tasks/views.js +42 -0
  428. package/dist/modes/interactive/tasks/views.js.map +1 -0
  429. package/dist/modes/interactive/theme/system-theme.d.ts +2 -1
  430. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
  431. package/dist/modes/interactive/theme/system-theme.js +16 -5
  432. package/dist/modes/interactive/theme/system-theme.js.map +1 -1
  433. package/docs/bundled/README.md +0 -1
  434. package/docs/bundled/extensions/question.md +2 -2
  435. package/docs/bundled/extensions/statusline.md +24 -15
  436. package/docs/bundled/tasks.md +34 -48
  437. package/docs/codemode.md +207 -0
  438. package/docs/docs.json +4 -4
  439. package/docs/environment-variables.md +1 -1
  440. package/docs/extensions.md +7 -9
  441. package/docs/keybindings.md +13 -6
  442. package/docs/mcp.md +142 -82
  443. package/docs/models.md +21 -0
  444. package/docs/providers.md +8 -0
  445. package/docs/sdk.md +2 -2
  446. package/docs/session-format.md +12 -22
  447. package/docs/settings.md +4 -2
  448. package/docs/tui.md +1 -1
  449. package/docs/usage.md +6 -16
  450. package/examples/README.md +1 -1
  451. package/examples/extensions/README.md +1 -2
  452. package/examples/extensions/built-in-tool-renderer.ts +16 -40
  453. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  454. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  455. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  456. package/examples/extensions/gondolin/package-lock.json +2 -2
  457. package/examples/extensions/gondolin/package.json +1 -1
  458. package/examples/extensions/minimal-mode.ts +24 -96
  459. package/examples/extensions/sandbox/package-lock.json +2 -2
  460. package/examples/extensions/sandbox/package.json +1 -1
  461. package/examples/extensions/with-deps/package-lock.json +2 -2
  462. package/examples/extensions/with-deps/package.json +1 -1
  463. package/examples/sdk/14-codemode-mcp.ts +2 -2
  464. package/npm-shrinkwrap.json +69 -58
  465. package/package.json +11 -10
  466. package/dist/bundle/chunks/anthropic-messages-KIXY7EDT.js +0 -6
  467. package/dist/bundle/chunks/chunk-CLLDCO64.js +0 -2
  468. package/dist/bundle/chunks/chunk-UUSTLCVC.js +0 -2
  469. package/dist/bundle/chunks/chunk-VWCWZD6E.js +0 -2
  470. package/dist/bundle/chunks/virtual-modules-TQRORWJQ.js +0 -2
  471. package/dist/core/tasks/view-data.d.ts +0 -8
  472. package/dist/core/tasks/view-data.d.ts.map +0 -1
  473. package/dist/core/tasks/view-data.js +0 -61
  474. package/dist/core/tasks/view-data.js.map +0 -1
  475. package/dist/core/tasks/view.d.ts +0 -30
  476. package/dist/core/tasks/view.d.ts.map +0 -1
  477. package/dist/core/tasks/view.js +0 -50
  478. package/dist/core/tasks/view.js.map +0 -1
  479. package/dist/core/tools/renderers/shell-task.d.ts +0 -4
  480. package/dist/core/tools/renderers/shell-task.d.ts.map +0 -1
  481. package/dist/core/tools/renderers/shell-task.js +0 -35
  482. package/dist/core/tools/renderers/shell-task.js.map +0 -1
  483. package/dist/extensions/todo/constants.d.ts +0 -16
  484. package/dist/extensions/todo/constants.d.ts.map +0 -1
  485. package/dist/extensions/todo/constants.js +0 -30
  486. package/dist/extensions/todo/constants.js.map +0 -1
  487. package/dist/extensions/todo/index.d.ts +0 -3
  488. package/dist/extensions/todo/index.d.ts.map +0 -1
  489. package/dist/extensions/todo/index.js +0 -98
  490. package/dist/extensions/todo/index.js.map +0 -1
  491. package/dist/extensions/todo/schema.d.ts +0 -60
  492. package/dist/extensions/todo/schema.d.ts.map +0 -1
  493. package/dist/extensions/todo/schema.js +0 -56
  494. package/dist/extensions/todo/schema.js.map +0 -1
  495. package/dist/extensions/todo/state.d.ts +0 -34
  496. package/dist/extensions/todo/state.d.ts.map +0 -1
  497. package/dist/extensions/todo/state.js +0 -425
  498. package/dist/extensions/todo/state.js.map +0 -1
  499. package/dist/extensions/todo/view.d.ts +0 -36
  500. package/dist/extensions/todo/view.d.ts.map +0 -1
  501. package/dist/extensions/todo/view.js +0 -580
  502. package/dist/extensions/todo/view.js.map +0 -1
  503. package/dist/extensions/todo/widget.d.ts +0 -15
  504. package/dist/extensions/todo/widget.d.ts.map +0 -1
  505. package/dist/extensions/todo/widget.js +0 -50
  506. package/dist/extensions/todo/widget.js.map +0 -1
  507. package/dist/modes/interactive/tasks/fallback-view.d.ts +0 -4
  508. package/dist/modes/interactive/tasks/fallback-view.d.ts.map +0 -1
  509. package/dist/modes/interactive/tasks/fallback-view.js +0 -27
  510. package/dist/modes/interactive/tasks/fallback-view.js.map +0 -1
  511. package/docs/bundled/extensions/todo.md +0 -104
  512. package/examples/extensions/todo.ts +0 -297
@@ -1,53 +1,13 @@
1
- /**
2
- * background — how a task is described, everywhere.
3
- *
4
- * Every output this extension produces (four tool actions, two notification
5
- * renderers, the /tasks list and detail header) is the same thing: a TasksTask
6
- * projected into a medium. The values those projections derive — runtime, exit
7
- * suffix, label, glyph — live here once, so the media can differ without the
8
- * vocabulary drifting. Pure functions; no TUI components, no theme.
9
- */
10
- import type { TasksTaskStatus } from "../../../core/tools/tasks/types.ts";
1
+ /** Human-facing status labels shared by the /tasks panel and transcript renderers. */
2
+ import type { TaskStatus } from "../../../core/tasks/types.ts";
11
3
  import { type StatusMarkerColor } from "../components/status-marker.ts";
12
- /** How long a task has run, or ran. A running task has no `endedAt`, so it measures to `now`. */
13
- export declare function runtimeMs(task: {
14
- startedAt: number;
15
- endedAt?: number;
16
- }, now?: number): number;
17
- export declare function runtimeLabel(task: {
18
- startedAt: number;
19
- endedAt?: number;
20
- }, now?: number): string;
4
+ export declare function statusName(status: string): string;
21
5
  /**
22
- * Whether a task produced an exit code. Three-state by necessity: `undefined`
23
- * while running or when the run produced none, `null` when reaped by a signal —
24
- * and historical session entries still hold `null`, so this must keep accepting it.
6
+ * `<separator>exit <code>`, or nothing. `exitCode` is three-state: `undefined`
7
+ * while running or when the run produced none, `null` when reaped by a signal.
25
8
  */
26
- export declare function hasExitCode(exitCode: number | null | undefined): exitCode is number;
27
- /** `<separator>exit <code>`, or nothing. Callers pick the separator: " ", ", ", " · ". */
28
9
  export declare function exitSuffix(exitCode: number | null | undefined, separator: string): string;
29
- /** Label for listings: the context-provided description over the first command line. */
30
- export declare function taskLabel(task: {
31
- description?: string;
32
- command: string;
33
- }): string;
34
- /** Worker row label for listings: the "#1 explorer" ordinal label plus its description. */
35
- export declare function workerLabel(worker: {
36
- label: string;
37
- description?: string;
38
- }): string;
39
- /** A listing row's label, fitted to a visible-column budget. */
40
- export declare function taskLabelWithin(task: {
41
- description?: string;
42
- command: string;
43
- }, width: number): string;
44
- /** First command line fitted to a visible-column budget — wide characters count as two. */
45
- export declare function commandLabel(command: string, width: number): string;
46
- /**
47
- * Static marker for transcripts and snapshots; the /tasks panel animates running
48
- * rows via statusMarker(status, { now }) directly. Both delegate to the shared
49
- * status-marker vocabulary.
50
- */
51
- export declare function statusGlyph(status: TasksTaskStatus, stalled?: boolean): string;
52
- export declare function statusColor(status: TasksTaskStatus, stalled?: boolean): StatusMarkerColor;
10
+ /** Static marker for transcripts; the /tasks panel animates running rows via statusMarker(status, { now }). */
11
+ export declare function statusGlyph(status: TaskStatus): string;
12
+ export declare function statusColor(status: TaskStatus): StatusMarkerColor;
53
13
  //# sourceMappingURL=task-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-view.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/task-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,gCAAgC,CAAC;AAEtF,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,SAAa,GAAG,MAAM,CAEjG;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,SAAa,GAAG,MAAM,CAEpG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,IAAI,MAAM,CAEnF;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGjF;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEnF;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtG;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAE9E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAEzF"}
1
+ {"version":3,"file":"task-view.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/task-view.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,gCAAgC,CAAC;AAEtF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,+GAA+G;AAC/G,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,iBAAiB,CAEjE"}
@@ -1,60 +1,20 @@
1
- /**
2
- * background — how a task is described, everywhere.
3
- *
4
- * Every output this extension produces (four tool actions, two notification
5
- * renderers, the /tasks list and detail header) is the same thing: a TasksTask
6
- * projected into a medium. The values those projections derive — runtime, exit
7
- * suffix, label, glyph — live here once, so the media can differ without the
8
- * vocabulary drifting. Pure functions; no TUI components, no theme.
9
- */
10
- import { truncateToWidth } from "@earendil-works/pi-tui";
1
+ /** Human-facing status labels shared by the /tasks panel and transcript renderers. */
11
2
  import { statusMarker } from "../components/status-marker.js";
12
- import { firstCommandLine, formatDuration } from "./text.js";
13
- /** How long a task has run, or ran. A running task has no `endedAt`, so it measures to `now`. */
14
- export function runtimeMs(task, now = Date.now()) {
15
- return (task.endedAt ?? now) - task.startedAt;
16
- }
17
- export function runtimeLabel(task, now = Date.now()) {
18
- return formatDuration(runtimeMs(task, now));
3
+ export function statusName(status) {
4
+ return status === "timeout" ? "Timed out" : status ? status[0].toUpperCase() + status.slice(1) : "Unknown";
19
5
  }
20
6
  /**
21
- * Whether a task produced an exit code. Three-state by necessity: `undefined`
22
- * while running or when the run produced none, `null` when reaped by a signal —
23
- * and historical session entries still hold `null`, so this must keep accepting it.
7
+ * `<separator>exit <code>`, or nothing. `exitCode` is three-state: `undefined`
8
+ * while running or when the run produced none, `null` when reaped by a signal.
24
9
  */
25
- export function hasExitCode(exitCode) {
26
- return exitCode !== undefined && exitCode !== null;
27
- }
28
- /** `<separator>exit <code>`, or nothing. Callers pick the separator: " ", ", ", " · ". */
29
10
  export function exitSuffix(exitCode, separator) {
30
- return hasExitCode(exitCode) ? `${separator}exit ${exitCode}` : "";
31
- }
32
- /** Label for listings: the context-provided description over the first command line. */
33
- export function taskLabel(task) {
34
- const command = firstCommandLine(task.command);
35
- return task.description ? `${task.description} — ${command}` : command;
11
+ return exitCode !== undefined && exitCode !== null ? `${separator}exit ${exitCode}` : "";
36
12
  }
37
- /** Worker row label for listings: the "#1 explorer" ordinal label plus its description. */
38
- export function workerLabel(worker) {
39
- return worker.description ? `${worker.label} — ${worker.description}` : worker.label;
40
- }
41
- /** A listing row's label, fitted to a visible-column budget. */
42
- export function taskLabelWithin(task, width) {
43
- return truncateToWidth(taskLabel(task), width, "…");
44
- }
45
- /** First command line fitted to a visible-column budget — wide characters count as two. */
46
- export function commandLabel(command, width) {
47
- return truncateToWidth(firstCommandLine(command), width, "…");
48
- }
49
- /**
50
- * Static marker for transcripts and snapshots; the /tasks panel animates running
51
- * rows via statusMarker(status, { now }) directly. Both delegate to the shared
52
- * status-marker vocabulary.
53
- */
54
- export function statusGlyph(status, stalled) {
55
- return statusMarker(status, { stalled }).glyph;
13
+ /** Static marker for transcripts; the /tasks panel animates running rows via statusMarker(status, { now }). */
14
+ export function statusGlyph(status) {
15
+ return statusMarker(status).glyph;
56
16
  }
57
- export function statusColor(status, stalled) {
58
- return statusMarker(status, { stalled }).color;
17
+ export function statusColor(status) {
18
+ return statusMarker(status).color;
59
19
  }
60
20
  //# sourceMappingURL=task-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/task-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAA0B,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC7D,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACxF,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC3F,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAmC;IAC9D,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,QAAmC,EAAE,SAAiB;IAChF,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,IAA+C;IACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACxE,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,MAA+C;IAC1E,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACtF,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,IAA+C,EAAE,KAAa;IAC7F,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAa;IAC1D,OAAO,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuB,EAAE,OAAiB;IACrE,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAuB,EAAE,OAAiB;IACrE,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC","sourcesContent":["/**\n * background — how a task is described, everywhere.\n *\n * Every output this extension produces (four tool actions, two notification\n * renderers, the /tasks list and detail header) is the same thing: a TasksTask\n * projected into a medium. The values those projections derive — runtime, exit\n * suffix, label, glyph — live here once, so the media can differ without the\n * vocabulary drifting. Pure functions; no TUI components, no theme.\n */\n\nimport { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { TasksTaskStatus } from \"../../../core/tools/tasks/types.ts\";\nimport { type StatusMarkerColor, statusMarker } from \"../components/status-marker.ts\";\nimport { firstCommandLine, formatDuration } from \"./text.ts\";\n/** How long a task has run, or ran. A running task has no `endedAt`, so it measures to `now`. */\nexport function runtimeMs(task: { startedAt: number; endedAt?: number }, now = Date.now()): number {\n\treturn (task.endedAt ?? now) - task.startedAt;\n}\n\nexport function runtimeLabel(task: { startedAt: number; endedAt?: number }, now = Date.now()): string {\n\treturn formatDuration(runtimeMs(task, now));\n}\n\n/**\n * Whether a task produced an exit code. Three-state by necessity: `undefined`\n * while running or when the run produced none, `null` when reaped by a signal —\n * and historical session entries still hold `null`, so this must keep accepting it.\n */\nexport function hasExitCode(exitCode: number | null | undefined): exitCode is number {\n\treturn exitCode !== undefined && exitCode !== null;\n}\n\n/** `<separator>exit <code>`, or nothing. Callers pick the separator: \" \", \", \", \" · \". */\nexport function exitSuffix(exitCode: number | null | undefined, separator: string): string {\n\treturn hasExitCode(exitCode) ? `${separator}exit ${exitCode}` : \"\";\n}\n\n/** Label for listings: the context-provided description over the first command line. */\nexport function taskLabel(task: { description?: string; command: string }): string {\n\tconst command = firstCommandLine(task.command);\n\treturn task.description ? `${task.description} — ${command}` : command;\n}\n\n/** Worker row label for listings: the \"#1 explorer\" ordinal label plus its description. */\nexport function workerLabel(worker: { label: string; description?: string }): string {\n\treturn worker.description ? `${worker.label} — ${worker.description}` : worker.label;\n}\n\n/** A listing row's label, fitted to a visible-column budget. */\nexport function taskLabelWithin(task: { description?: string; command: string }, width: number): string {\n\treturn truncateToWidth(taskLabel(task), width, \"…\");\n}\n\n/** First command line fitted to a visible-column budget — wide characters count as two. */\nexport function commandLabel(command: string, width: number): string {\n\treturn truncateToWidth(firstCommandLine(command), width, \"…\");\n}\n\n/**\n * Static marker for transcripts and snapshots; the /tasks panel animates running\n * rows via statusMarker(status, { now }) directly. Both delegate to the shared\n * status-marker vocabulary.\n */\nexport function statusGlyph(status: TasksTaskStatus, stalled?: boolean): string {\n\treturn statusMarker(status, { stalled }).glyph;\n}\n\nexport function statusColor(status: TasksTaskStatus, stalled?: boolean): StatusMarkerColor {\n\treturn statusMarker(status, { stalled }).color;\n}\n"]}
1
+ {"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/task-view.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAGtF,OAAO,EAA0B,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEtF,MAAM,UAAU,UAAU,CAAC,MAAc;IACxC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAmC,EAAE,SAAiB;IAChF,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,WAAW,CAAC,MAAkB;IAC7C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAkB;IAC7C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;AACnC,CAAC","sourcesContent":["/** Human-facing status labels shared by the /tasks panel and transcript renderers. */\n\nimport type { TaskStatus } from \"../../../core/tasks/types.ts\";\nimport { type StatusMarkerColor, statusMarker } from \"../components/status-marker.ts\";\n\nexport function statusName(status: string): string {\n\treturn status === \"timeout\" ? \"Timed out\" : status ? status[0]!.toUpperCase() + status.slice(1) : \"Unknown\";\n}\n\n/**\n * `<separator>exit <code>`, or nothing. `exitCode` is three-state: `undefined`\n * while running or when the run produced none, `null` when reaped by a signal.\n */\nexport function exitSuffix(exitCode: number | null | undefined, separator: string): string {\n\treturn exitCode !== undefined && exitCode !== null ? `${separator}exit ${exitCode}` : \"\";\n}\n\n/** Static marker for transcripts; the /tasks panel animates running rows via statusMarker(status, { now }). */\nexport function statusGlyph(status: TaskStatus): string {\n\treturn statusMarker(status).glyph;\n}\n\nexport function statusColor(status: TaskStatus): StatusMarkerColor {\n\treturn statusMarker(status).color;\n}\n"]}
@@ -1,12 +1,6 @@
1
- /** Small presentation-only string helpers, including historical transcript formatting. */
1
+ export declare function cleanTaskText(text: string): string;
2
2
  /** First non-empty line of a command, trimmed — for one-line task labels. */
3
3
  export declare function firstCommandLine(command: string): string;
4
- /** Compact duration like Pi's own timers: 12s, 3m05s, 1h02m. */
5
- export declare function formatDuration(ms: number): string;
6
4
  /** Basename of a path, slash-normalized — compact display of output files. */
7
5
  export declare function fileNameOf(path: string): string;
8
- /** Relative age of a finished timestamp: 5s ago, 3m ago, 2h ago, 4d ago. */
9
- export declare function formatAge(endedAt: number, now?: number): string;
10
- /** The `[a · b · c]` status prefix shared by every context-facing output result. */
11
- export declare function noticeLine(parts: (string | false | undefined)[]): string;
12
6
  //# sourceMappingURL=text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/text.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAQnE;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAExE"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/text.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -1,39 +1,16 @@
1
- /** Small presentation-only string helpers, including historical transcript formatting. */
1
+ /** Small presentation-only string helpers. */
2
+ import { stripTerminalSequences } from "@earendil-works/pi-tui";
3
+ import { sanitizeBinaryOutput } from "../../../utils/shell.js";
4
+ export function cleanTaskText(text) {
5
+ return sanitizeBinaryOutput(stripTerminalSequences(text)).replace(/\r\n?/g, "\n");
6
+ }
2
7
  /** First non-empty line of a command, trimmed — for one-line task labels. */
3
8
  export function firstCommandLine(command) {
4
9
  const line = command.split(/\r?\n/).find((candidate) => candidate.trim().length > 0) ?? command;
5
10
  return line.trim();
6
11
  }
7
- /** Compact duration like Pi's own timers: 12s, 3m05s, 1h02m. */
8
- export function formatDuration(ms) {
9
- const totalSeconds = Math.max(0, Math.round(ms / 1000));
10
- if (totalSeconds < 60)
11
- return `${totalSeconds}s`;
12
- const minutes = Math.floor(totalSeconds / 60);
13
- const seconds = totalSeconds % 60;
14
- if (minutes < 60)
15
- return `${minutes}m${String(seconds).padStart(2, "0")}s`;
16
- return `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, "0")}m`;
17
- }
18
12
  /** Basename of a path, slash-normalized — compact display of output files. */
19
13
  export function fileNameOf(path) {
20
14
  return path.replace(/\\/g, "/").split("/").at(-1) ?? path;
21
15
  }
22
- /** Relative age of a finished timestamp: 5s ago, 3m ago, 2h ago, 4d ago. */
23
- export function formatAge(endedAt, now = Date.now()) {
24
- const seconds = Math.max(0, Math.round((now - endedAt) / 1000));
25
- if (seconds < 60)
26
- return `${seconds}s ago`;
27
- const minutes = Math.floor(seconds / 60);
28
- if (minutes < 60)
29
- return `${minutes}m ago`;
30
- const hours = Math.floor(minutes / 60);
31
- if (hours < 24)
32
- return `${hours}h ago`;
33
- return `${Math.floor(hours / 24)}d ago`;
34
- }
35
- /** The `[a · b · c]` status prefix shared by every context-facing output result. */
36
- export function noticeLine(parts) {
37
- return `[${parts.filter(Boolean).join(" · ")}]`;
38
- }
39
16
  //# sourceMappingURL=text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/text.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;IAChG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,EAAU;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,YAAY,GAAG,EAAE;QAAE,OAAO,GAAG,YAAY,GAAG,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IAC3E,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAChF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC3D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAChE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC;AACzC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,KAAqC;IAC/D,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACjD,CAAC","sourcesContent":["/** Small presentation-only string helpers, including historical transcript formatting. */\n\n/** First non-empty line of a command, trimmed — for one-line task labels. */\nexport function firstCommandLine(command: string): string {\n\tconst line = command.split(/\\r?\\n/).find((candidate) => candidate.trim().length > 0) ?? command;\n\treturn line.trim();\n}\n\n/** Compact duration like Pi's own timers: 12s, 3m05s, 1h02m. */\nexport function formatDuration(ms: number): string {\n\tconst totalSeconds = Math.max(0, Math.round(ms / 1000));\n\tif (totalSeconds < 60) return `${totalSeconds}s`;\n\tconst minutes = Math.floor(totalSeconds / 60);\n\tconst seconds = totalSeconds % 60;\n\tif (minutes < 60) return `${minutes}m${String(seconds).padStart(2, \"0\")}s`;\n\treturn `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, \"0\")}m`;\n}\n\n/** Basename of a path, slash-normalized — compact display of output files. */\nexport function fileNameOf(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\").split(\"/\").at(-1) ?? path;\n}\n\n/** Relative age of a finished timestamp: 5s ago, 3m ago, 2h ago, 4d ago. */\nexport function formatAge(endedAt: number, now = Date.now()): string {\n\tconst seconds = Math.max(0, Math.round((now - endedAt) / 1000));\n\tif (seconds < 60) return `${seconds}s ago`;\n\tconst minutes = Math.floor(seconds / 60);\n\tif (minutes < 60) return `${minutes}m ago`;\n\tconst hours = Math.floor(minutes / 60);\n\tif (hours < 24) return `${hours}h ago`;\n\treturn `${Math.floor(hours / 24)}d ago`;\n}\n\n/** The `[a · b · c]` status prefix shared by every context-facing output result. */\nexport function noticeLine(parts: (string | false | undefined)[]): string {\n\treturn `[${parts.filter(Boolean).join(\" · \")}]`;\n}\n"]}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/text.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,oBAAoB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACnF,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;IAChG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC3D,CAAC","sourcesContent":["/** Small presentation-only string helpers. */\nimport { stripTerminalSequences } from \"@earendil-works/pi-tui\";\nimport { sanitizeBinaryOutput } from \"../../../utils/shell.ts\";\n\nexport function cleanTaskText(text: string): string {\n\treturn sanitizeBinaryOutput(stripTerminalSequences(text)).replace(/\\r\\n?/g, \"\\n\");\n}\n\n/** First non-empty line of a command, trimmed — for one-line task labels. */\nexport function firstCommandLine(command: string): string {\n\tconst line = command.split(/\\r?\\n/).find((candidate) => candidate.trim().length > 0) ?? command;\n\treturn line.trim();\n}\n\n/** Basename of a path, slash-normalized — compact display of output files. */\nexport function fileNameOf(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\").split(\"/\").at(-1) ?? path;\n}\n"]}
@@ -4,12 +4,14 @@ export declare class TaskViewport {
4
4
  private scroll;
5
5
  private anchor?;
6
6
  private entries;
7
+ private wrapped?;
7
8
  private height;
8
9
  private start;
9
10
  constructor(follow?: boolean);
10
11
  layout(lines: string[], width: number, height: number): string[];
11
12
  private get max();
12
13
  move(direction: number, page: boolean, tail: boolean): void;
14
+ jump(bottom: boolean, tail: boolean): void;
13
15
  get range(): string;
14
16
  }
15
17
  //# sourceMappingURL=viewport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/viewport.ts"],"names":[],"mappings":"AAQA,sFAAsF;AACtF,qBAAa,YAAY;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAC,CAAmC;IAClD,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAK;gBACN,MAAM,UAAQ;IAG1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IA2BhE,OAAO,KAAK,GAAG,GAEd;IACD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAM3D,IAAI,KAAK,IAAI,MAAM,CAElB;CACD"}
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/viewport.ts"],"names":[],"mappings":"AAQA,sFAAsF;AACtF,qBAAa,YAAY;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAC,CAAmC;IAClD,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAK;gBACN,MAAM,UAAQ;IAG1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IA+BhE,OAAO,KAAK,GAAG,GAEd;IACD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAM3D,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAM1C,IAAI,KAAK,IAAI,MAAM,CAElB;CACD"}
@@ -10,14 +10,18 @@ export class TaskViewport {
10
10
  }
11
11
  layout(lines, width, height) {
12
12
  this.height = Math.max(1, height);
13
- this.entries = lines.flatMap((line, index) => {
14
- let column = 0;
15
- return wrapTextWithAnsi(line, Math.max(1, width)).map((text) => {
16
- const entry = { text, line: index, column };
17
- column += visibleWidth(text);
18
- return entry;
13
+ // Output can be 48 KiB; rewrap only when its lines or the width change, not per animation frame.
14
+ if (lines !== this.wrapped?.lines || width !== this.wrapped.width) {
15
+ this.wrapped = { lines, width };
16
+ this.entries = lines.flatMap((line, index) => {
17
+ let column = 0;
18
+ return wrapTextWithAnsi(line, Math.max(1, width)).map((text) => {
19
+ const entry = { text, line: index, column };
20
+ column += visibleWidth(text);
21
+ return entry;
22
+ });
19
23
  });
20
- });
24
+ }
21
25
  let offset = this.scroll;
22
26
  if (this.anchor) {
23
27
  const anchor = this.anchor;
@@ -42,6 +46,12 @@ export class TaskViewport {
42
46
  this.anchor = entry ? { line: entry.line, column: entry.column } : undefined;
43
47
  this.follow = tail && direction > 0 && this.scroll === this.max;
44
48
  }
49
+ jump(bottom, tail) {
50
+ this.scroll = bottom ? this.max : 0;
51
+ const entry = this.entries[this.scroll];
52
+ this.anchor = entry ? { line: entry.line, column: entry.column } : undefined;
53
+ this.follow = bottom && tail;
54
+ }
45
55
  get range() {
46
56
  return `${this.entries.length ? this.start + 1 : 0}–${Math.min(this.start + this.height, this.entries.length)}/${this.entries.length}`;
47
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/viewport.ts"],"names":[],"mappings":"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","sourcesContent":["import { visibleWidth, wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\n\ninterface Entry {\n\ttext: string;\n\tline: number;\n\tcolumn: number;\n}\n\n/** Independent scroll state for each region, with a source-line anchor for resize. */\nexport class TaskViewport {\n\tfollow: boolean;\n\tprivate scroll = 0;\n\tprivate anchor?: { line: number; column: number };\n\tprivate entries: Entry[] = [];\n\tprivate height = 1;\n\tprivate start = 0;\n\tconstructor(follow = false) {\n\t\tthis.follow = follow;\n\t}\n\tlayout(lines: string[], width: number, height: number): string[] {\n\t\tthis.height = Math.max(1, height);\n\t\tthis.entries = lines.flatMap((line, index) => {\n\t\t\tlet column = 0;\n\t\t\treturn wrapTextWithAnsi(line, Math.max(1, width)).map((text) => {\n\t\t\t\tconst entry = { text, line: index, column };\n\t\t\t\tcolumn += visibleWidth(text);\n\t\t\t\treturn entry;\n\t\t\t});\n\t\t});\n\t\tlet offset = this.scroll;\n\t\tif (this.anchor) {\n\t\t\tconst anchor = this.anchor;\n\t\t\tconst first = this.entries.findIndex((entry) => entry.line === anchor.line);\n\t\t\tif (first >= 0) {\n\t\t\t\toffset = first;\n\t\t\t\twhile (\n\t\t\t\t\toffset + 1 < this.entries.length &&\n\t\t\t\t\tthis.entries[offset + 1]!.line === anchor.line &&\n\t\t\t\t\tthis.entries[offset + 1]!.column <= anchor.column\n\t\t\t\t)\n\t\t\t\t\toffset++;\n\t\t\t}\n\t\t}\n\t\tthis.start = this.follow ? this.max : Math.min(offset, this.max);\n\t\treturn this.entries.slice(this.start, this.start + this.height).map((entry) => entry.text);\n\t}\n\tprivate get max(): number {\n\t\treturn Math.max(0, this.entries.length - this.height);\n\t}\n\tmove(direction: number, page: boolean, tail: boolean): void {\n\t\tthis.scroll = Math.max(0, Math.min(this.max, this.start + direction * (page ? this.height : 1)));\n\t\tconst entry = this.entries[this.scroll];\n\t\tthis.anchor = entry ? { line: entry.line, column: entry.column } : undefined;\n\t\tthis.follow = tail && direction > 0 && this.scroll === this.max;\n\t}\n\tget range(): string {\n\t\treturn `${this.entries.length ? this.start + 1 : 0}–${Math.min(this.start + this.height, this.entries.length)}/${this.entries.length}`;\n\t}\n}\n"]}
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/viewport.ts"],"names":[],"mappings":"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","sourcesContent":["import { visibleWidth, wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\n\ninterface Entry {\n\ttext: string;\n\tline: number;\n\tcolumn: number;\n}\n\n/** Independent scroll state for each region, with a source-line anchor for resize. */\nexport class TaskViewport {\n\tfollow: boolean;\n\tprivate scroll = 0;\n\tprivate anchor?: { line: number; column: number };\n\tprivate entries: Entry[] = [];\n\tprivate wrapped?: { lines: string[]; width: number };\n\tprivate height = 1;\n\tprivate start = 0;\n\tconstructor(follow = false) {\n\t\tthis.follow = follow;\n\t}\n\tlayout(lines: string[], width: number, height: number): string[] {\n\t\tthis.height = Math.max(1, height);\n\t\t// Output can be 48 KiB; rewrap only when its lines or the width change, not per animation frame.\n\t\tif (lines !== this.wrapped?.lines || width !== this.wrapped.width) {\n\t\t\tthis.wrapped = { lines, width };\n\t\t\tthis.entries = lines.flatMap((line, index) => {\n\t\t\t\tlet column = 0;\n\t\t\t\treturn wrapTextWithAnsi(line, Math.max(1, width)).map((text) => {\n\t\t\t\t\tconst entry = { text, line: index, column };\n\t\t\t\t\tcolumn += visibleWidth(text);\n\t\t\t\t\treturn entry;\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tlet offset = this.scroll;\n\t\tif (this.anchor) {\n\t\t\tconst anchor = this.anchor;\n\t\t\tconst first = this.entries.findIndex((entry) => entry.line === anchor.line);\n\t\t\tif (first >= 0) {\n\t\t\t\toffset = first;\n\t\t\t\twhile (\n\t\t\t\t\toffset + 1 < this.entries.length &&\n\t\t\t\t\tthis.entries[offset + 1]!.line === anchor.line &&\n\t\t\t\t\tthis.entries[offset + 1]!.column <= anchor.column\n\t\t\t\t)\n\t\t\t\t\toffset++;\n\t\t\t}\n\t\t}\n\t\tthis.start = this.follow ? this.max : Math.min(offset, this.max);\n\t\treturn this.entries.slice(this.start, this.start + this.height).map((entry) => entry.text);\n\t}\n\tprivate get max(): number {\n\t\treturn Math.max(0, this.entries.length - this.height);\n\t}\n\tmove(direction: number, page: boolean, tail: boolean): void {\n\t\tthis.scroll = Math.max(0, Math.min(this.max, this.start + direction * (page ? this.height : 1)));\n\t\tconst entry = this.entries[this.scroll];\n\t\tthis.anchor = entry ? { line: entry.line, column: entry.column } : undefined;\n\t\tthis.follow = tail && direction > 0 && this.scroll === this.max;\n\t}\n\tjump(bottom: boolean, tail: boolean): void {\n\t\tthis.scroll = bottom ? this.max : 0;\n\t\tconst entry = this.entries[this.scroll];\n\t\tthis.anchor = entry ? { line: entry.line, column: entry.column } : undefined;\n\t\tthis.follow = bottom && tail;\n\t}\n\tget range(): string {\n\t\treturn `${this.entries.length ? this.start + 1 : 0}–${Math.min(this.start + this.height, this.entries.length)}/${this.entries.length}`;\n\t}\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /** The inspector's Details and Output content, computed once per task snapshot and output read. */
2
+ import { type TaskRead, type TaskSnapshot } from "../../../core/tasks/types.ts";
3
+ import { type Theme } from "../theme/theme.ts";
4
+ export interface TaskLines {
5
+ info: string[];
6
+ output: string[];
7
+ }
8
+ export declare function taskLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme): TaskLines;
9
+ //# sourceMappingURL=views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/views.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG9D,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAgCjG"}
@@ -0,0 +1,42 @@
1
+ /** The inspector's Details and Output content, computed once per task snapshot and output read. */
2
+ import { isTaskTerminal } from "../../../core/tasks/types.js";
3
+ import { highlightCode } from "../theme/theme.js";
4
+ import { cleanTaskText } from "./text.js";
5
+ const SHELLS = {
6
+ bash: { name: "Bash", language: "bash" },
7
+ powershell: { name: "PowerShell", language: "powershell" },
8
+ };
9
+ export function taskLines(task, read, theme) {
10
+ const shell = SHELLS[task.kind];
11
+ const command = cleanTaskText(task.command ?? task.title);
12
+ const [first = "", ...rest] = shell ? highlightCode(command, shell.language) : command.split("\n");
13
+ const info = [
14
+ theme.fg("accent", shell?.name ?? task.kind),
15
+ `${task.command === undefined ? "Title " : "Command "}${first}`,
16
+ ...rest,
17
+ ...(task.commandTruncated ? ["[Saved command truncated.]"] : []),
18
+ ...(task.cwd ? [`Directory ${cleanTaskText(task.cwd)}`] : []),
19
+ ...(task.outputPath ? [`Log ${cleanTaskText(task.outputPath)}`] : []),
20
+ // The panel lists task and read diagnostics above these lines.
21
+ ...(task.exitCode !== undefined ? [`Exit ${task.exitCode ?? "signal"}`] : []),
22
+ ];
23
+ const saved = task.result?.content
24
+ .filter((block) => block.type === "text")
25
+ .map((block) => block.text)
26
+ .join("\n");
27
+ const empty = task.status === "completed"
28
+ ? "Completed with no output."
29
+ : isTaskTerminal(task.status)
30
+ ? "No saved output."
31
+ : "No output yet.";
32
+ // Color each line: the panel lays out and borders lines independently.
33
+ const output = cleanTaskText((read ? read.text : saved) || empty)
34
+ .split("\n")
35
+ .map((line) => theme.fg("toolOutput", line));
36
+ if (read?.readError)
37
+ output.unshift(theme.fg("warning", "Log unavailable; showing saved result."));
38
+ if ((!read || read.readError) && task.resultTruncated)
39
+ output.push(theme.fg("warning", "Saved result truncated."));
40
+ return { info, output };
41
+ }
42
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/views.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,cAAc,EAAoC,MAAM,8BAA8B,CAAC;AAChG,OAAO,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,MAAM,GAAuD;IAClE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;IACxC,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE;CAC1D,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAkB,EAAE,IAA0B,EAAE,KAAY;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnG,MAAM,IAAI,GAAG;QACZ,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;QAC5C,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,EAAE;QACrE,GAAG,IAAI;QACP,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,+DAA+D;QAC/D,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO;SAChC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,KAAK,GACV,IAAI,CAAC,MAAM,KAAK,WAAW;QAC1B,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,gBAAgB,CAAC;IACtB,uEAAuE;IACvE,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;SAC/D,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,EAAE,SAAS;QAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC,CAAC;IACnG,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,eAAe;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACnH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC","sourcesContent":["/** The inspector's Details and Output content, computed once per task snapshot and output read. */\nimport { isTaskTerminal, type TaskRead, type TaskSnapshot } from \"../../../core/tasks/types.ts\";\nimport { highlightCode, type Theme } from \"../theme/theme.ts\";\nimport { cleanTaskText } from \"./text.ts\";\n\nexport interface TaskLines {\n\tinfo: string[];\n\toutput: string[];\n}\n\nconst SHELLS: Record<string, { name: string; language: string }> = {\n\tbash: { name: \"Bash\", language: \"bash\" },\n\tpowershell: { name: \"PowerShell\", language: \"powershell\" },\n};\n\nexport function taskLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme): TaskLines {\n\tconst shell = SHELLS[task.kind];\n\tconst command = cleanTaskText(task.command ?? task.title);\n\tconst [first = \"\", ...rest] = shell ? highlightCode(command, shell.language) : command.split(\"\\n\");\n\tconst info = [\n\t\ttheme.fg(\"accent\", shell?.name ?? task.kind),\n\t\t`${task.command === undefined ? \"Title \" : \"Command \"}${first}`,\n\t\t...rest,\n\t\t...(task.commandTruncated ? [\"[Saved command truncated.]\"] : []),\n\t\t...(task.cwd ? [`Directory ${cleanTaskText(task.cwd)}`] : []),\n\t\t...(task.outputPath ? [`Log ${cleanTaskText(task.outputPath)}`] : []),\n\t\t// The panel lists task and read diagnostics above these lines.\n\t\t...(task.exitCode !== undefined ? [`Exit ${task.exitCode ?? \"signal\"}`] : []),\n\t];\n\n\tconst saved = task.result?.content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\");\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\t// Color each line: the panel lays out and borders lines independently.\n\tconst output = cleanTaskText((read ? read.text : saved) || empty)\n\t\t.split(\"\\n\")\n\t\t.map((line) => theme.fg(\"toolOutput\", line));\n\tif (read?.readError) output.unshift(theme.fg(\"warning\", \"Log unavailable; showing saved result.\"));\n\tif ((!read || read.readError) && task.resultTruncated) output.push(theme.fg(\"warning\", \"Saved result truncated.\"));\n\treturn { info, output };\n}\n"]}
@@ -5,7 +5,8 @@
5
5
  * on the background and on the panels it is drawn on. Hue and saturation come from the terminal's palette
6
6
  * color for the family's ANSI slot, or from the family's own hue when the terminal reports no palette.
7
7
  * Lightness comes from the rules alone. Colors are built in OKHSL, whose saturation is relative to the
8
- * sRGB gamut, and fade toward gray near black and white.
8
+ * sRGB gamut, and fade toward gray near black and white. A palette color never gains OKLCH chroma when it
9
+ * moves to another lightness, so pastel palettes stay pastel.
9
10
  *
10
11
  * A contrast level is a target-lightness curve: the OKLab lightness a token needs, given the lightness of
11
12
  * the surface below it. The curves were fitted to the reference theme design from the "Pi themes: system
@@ -1 +1 @@
1
- {"version":3,"file":"system-theme.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/system-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAMN,KAAK,QAAQ,EAEb,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAW,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAgV1C,MAAM,WAAW,gBAAgB;IAChC,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,wBAAwB;IACxB,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC;IACrB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gHAAgH;IAChH,cAAc,CAAC,EAAE,eAAe,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IACjC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC5C,0FAA0F;IAC1F,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC;CACxC;AAOD,iCAAiC;AACjC,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAM/D;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAItE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,eAAe,CAe/F;AA+BD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA0HpF"}
1
+ {"version":3,"file":"system-theme.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/system-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAQN,KAAK,QAAQ,EAEb,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAW,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAgV1C,MAAM,WAAW,gBAAgB;IAChC,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,wBAAwB;IACxB,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC;IACrB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gHAAgH;IAChH,cAAc,CAAC,EAAE,eAAe,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IACjC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC5C,0FAA0F;IAC1F,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC;CACxC;AAOD,iCAAiC;AACjC,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAM/D;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAItE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,eAAe,CAe/F;AA+BD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA0HpF"}
@@ -5,7 +5,8 @@
5
5
  * on the background and on the panels it is drawn on. Hue and saturation come from the terminal's palette
6
6
  * color for the family's ANSI slot, or from the family's own hue when the terminal reports no palette.
7
7
  * Lightness comes from the rules alone. Colors are built in OKHSL, whose saturation is relative to the
8
- * sRGB gamut, and fade toward gray near black and white.
8
+ * sRGB gamut, and fade toward gray near black and white. A palette color never gains OKLCH chroma when it
9
+ * moves to another lightness, so pastel palettes stay pastel.
9
10
  *
10
11
  * A contrast level is a target-lightness curve: the OKLab lightness a token needs, given the lightness of
11
12
  * the surface below it. The curves were fitted to the reference theme design from the "Pi themes: system
@@ -17,7 +18,7 @@
17
18
  * - background only: the families' own hues, lightness from the background;
18
19
  * - nothing: ANSI palette indices and the default colors, which the terminal renders itself.
19
20
  */
20
- import { colorToOkhsl, colorToOklch, okhslColor, oklabToOkhslLightness, rgbColor, } from "@earendil-works/pi-tui";
21
+ import { colorToOkhsl, colorToOklch, colorToRgb, okhslColor, oklabToOkhslLightness, oklchColor, rgbColor, } from "@earendil-works/pi-tui";
21
22
  export const SYSTEM_THEME_NAME = "system";
22
23
  const FAMILIES = {
23
24
  neutral: { hue: 231.49, saturation: { min: 0.02, max: 0.08 }, slot: 8 },
@@ -364,7 +365,7 @@ export function generateSystemThemeColors(input) {
364
365
  const { background, foreground } = input;
365
366
  if (!background)
366
367
  return indexedColors(saturation, input.appearanceHint);
367
- const palette = input.palette?.length === 16 ? input.palette.map(okhslOf) : undefined;
368
+ const palette = input.palette?.length === 16 ? input.palette.map(sourceOf) : undefined;
368
369
  const appearance = terminalAppearance(background, foreground);
369
370
  const lighter = appearance === "dark";
370
371
  const extreme = lighter ? 1 : 0;
@@ -471,7 +472,7 @@ export function generateSystemThemeColors(input) {
471
472
  result[token] = "";
472
473
  continue;
473
474
  }
474
- text = anchored(okhslOf(foreground), FAMILIES.neutral, oklabToOkhslLightness(needed), saturation);
475
+ text = anchored(sourceOf(foreground), FAMILIES.neutral, oklabToOkhslLightness(needed), saturation);
475
476
  }
476
477
  }
477
478
  // Body text keeps at least 4.5:1 on the surfaces it is drawn on, even on relaxed mid-gray backgrounds.
@@ -483,14 +484,24 @@ export function generateSystemThemeColors(input) {
483
484
  function okhslOf({ r, g, b }) {
484
485
  return colorToOkhsl(rgbColor(r, g, b));
485
486
  }
487
+ function sourceOf(color) {
488
+ return { ...okhslOf(color), chroma: colorToOklch(rgbColor(color.r, color.g, color.b)).c };
489
+ }
486
490
  /**
487
491
  * A source color's hue at another OKHSL lightness. Its saturation applies at its own lightness and falls off
488
492
  * toward black and white along the family's saturation curve, never rising above it.
493
+ *
494
+ * OKHSL saturation is relative to the most chroma sRGB allows at a lightness, so the same saturation can mean
495
+ * more chroma elsewhere: Catppuccin Frappe's pink #f4b8e4 (chroma 0.089) would become #eb76d1 (0.180) at the
496
+ * lightness the accent needs. Chroma is therefore also capped at the source's, with the same falloff.
489
497
  */
490
498
  function anchored(source, family, lightness, saturation) {
491
499
  const anchor = saturationCurve(family, source.l);
492
500
  const falloff = anchor > 0 ? Math.min(1, saturationCurve(family, lightness) / anchor) : 1;
493
- return okhslColor(source.h, source.s * falloff * saturation, lightness);
501
+ const color = okhslColor(source.h, source.s * falloff * saturation, lightness);
502
+ const cap = source.chroma * falloff * saturation;
503
+ const { l, c } = colorToOklch(color);
504
+ return c <= cap ? color : colorToRgb(oklchColor(l, cap, source.h));
494
505
  }
495
506
  /** Move a text color toward white or black until it reaches the WCAG minimum on every surface. */
496
507
  function withTextContrast(color, surfaces, lighter) {