@code-yeongyu/senpi 2026.7.25-2 → 2026.7.26

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 (463) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +1 -1
  3. package/dist/cli/args.d.ts +4 -16
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +9 -25
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/grok-neo-gate.d.ts +12 -0
  8. package/dist/cli/grok-neo-gate.d.ts.map +1 -0
  9. package/dist/cli/grok-neo-gate.js +18 -0
  10. package/dist/cli/grok-neo-gate.js.map +1 -0
  11. package/dist/cli-main.js +4 -0
  12. package/dist/cli-main.js.map +1 -1
  13. package/dist/cli.js +2 -0
  14. package/dist/cli.js.map +1 -1
  15. package/dist/core/agent-session-runtime.d.ts +2 -0
  16. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  17. package/dist/core/agent-session-runtime.js +33 -8
  18. package/dist/core/agent-session-runtime.js.map +1 -1
  19. package/dist/core/agent-session.d.ts +9 -3
  20. package/dist/core/agent-session.d.ts.map +1 -1
  21. package/dist/core/agent-session.js +179 -57
  22. package/dist/core/agent-session.js.map +1 -1
  23. package/dist/core/auth-providers.d.ts +2 -2
  24. package/dist/core/auth-providers.js +2 -2
  25. package/dist/core/auth-providers.js.map +1 -1
  26. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/bash-timeout/timeout.js +3 -2
  28. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  29. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/compaction/index.js +30 -2
  31. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  32. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/compaction/speculative.js +28 -0
  34. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  35. package/dist/core/extensions/builtin/goal/command-registration.js +2 -2
  36. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  37. package/dist/core/extensions/builtin/goal/format.d.ts +1 -1
  38. package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
  39. package/dist/core/extensions/builtin/goal/format.js +9 -2
  40. package/dist/core/extensions/builtin/goal/format.js.map +1 -1
  41. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  42. package/dist/core/extensions/builtin/goal/index.js +38 -23
  43. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  44. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +6 -0
  45. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -0
  46. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +19 -0
  47. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -0
  48. package/dist/core/extensions/builtin/goal/persistence.d.ts +6 -0
  49. package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -0
  50. package/dist/core/extensions/builtin/goal/persistence.js +141 -0
  51. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -0
  52. package/dist/core/extensions/builtin/goal/store.d.ts +7 -3
  53. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/goal/store.js +66 -181
  55. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  56. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
  57. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/goal/tool-registration.js +26 -15
  59. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  60. package/dist/core/extensions/builtin/goal/transitions.d.ts +3 -0
  61. package/dist/core/extensions/builtin/goal/transitions.d.ts.map +1 -0
  62. package/dist/core/extensions/builtin/goal/transitions.js +45 -0
  63. package/dist/core/extensions/builtin/goal/transitions.js.map +1 -0
  64. package/dist/core/extensions/builtin/goal/types.d.ts +10 -4
  65. package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
  66. package/dist/core/extensions/builtin/goal/types.js +2 -2
  67. package/dist/core/extensions/builtin/goal/types.js.map +1 -1
  68. package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/goal/ui.js +2 -0
  70. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  71. package/dist/core/extensions/builtin/goal/validation.d.ts +8 -1
  72. package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/goal/validation.js +24 -12
  74. package/dist/core/extensions/builtin/goal/validation.js.map +1 -1
  75. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  76. package/dist/core/extensions/builtin/index.js +0 -2
  77. package/dist/core/extensions/builtin/index.js.map +1 -1
  78. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  79. package/dist/core/extensions/builtin/mcp/index.js +8 -5
  80. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  81. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  82. package/dist/core/extensions/builtin/permission-system/parsers.js +1 -0
  83. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  84. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  85. package/dist/core/extensions/builtin/terminal/extension.js +32 -0
  86. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  87. package/dist/core/extensions/builtin/terminal/index.d.ts +1 -1
  88. package/dist/core/extensions/builtin/terminal/index.d.ts.map +1 -1
  89. package/dist/core/extensions/builtin/terminal/index.js +1 -1
  90. package/dist/core/extensions/builtin/terminal/index.js.map +1 -1
  91. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +29 -0
  92. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -0
  93. package/dist/core/extensions/builtin/terminal/monitor-notify.js +185 -0
  94. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -0
  95. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +35 -0
  96. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -0
  97. package/dist/core/extensions/builtin/terminal/monitor-registry.js +98 -0
  98. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -0
  99. package/dist/core/extensions/builtin/terminal/notify.d.ts +9 -0
  100. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/terminal/notify.js +30 -14
  102. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  103. package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
  104. package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/terminal/prompt.js +13 -5
  106. package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
  107. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -12
  108. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/terminal/runtime-session.js +4 -59
  110. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  111. package/dist/core/extensions/builtin/terminal/settings.d.ts +8 -0
  112. package/dist/core/extensions/builtin/terminal/settings.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/terminal/settings.js +16 -2
  114. package/dist/core/extensions/builtin/terminal/settings.js.map +1 -1
  115. package/dist/core/extensions/builtin/terminal/shared.d.ts +2 -2
  116. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/terminal/shared.js +2 -1
  118. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  119. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +10 -4
  120. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  121. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +17 -96
  122. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  123. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -0
  124. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  126. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +41 -0
  127. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -0
  128. package/dist/core/extensions/builtin/terminal/tools/monitor.js +97 -0
  129. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -0
  130. package/dist/core/extensions/builtin/terminal/tools/render.d.ts +3 -0
  131. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
  133. package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
  134. package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts +19 -0
  135. package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts.map +1 -0
  136. package/dist/core/extensions/builtin/todotools/fuzzy-match.js +70 -0
  137. package/dist/core/extensions/builtin/todotools/fuzzy-match.js.map +1 -0
  138. package/dist/core/extensions/builtin/todotools/normalize.d.ts +8 -0
  139. package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -0
  140. package/dist/core/extensions/builtin/todotools/normalize.js +174 -0
  141. package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -0
  142. package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
  143. package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
  144. package/dist/core/extensions/builtin/todotools/prompt.js +4 -2
  145. package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
  146. package/dist/core/extensions/builtin/todotools/state.d.ts +9 -8
  147. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  148. package/dist/core/extensions/builtin/todotools/state.js +99 -48
  149. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  150. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +1 -1
  151. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  152. package/dist/core/extensions/builtin/todotools/tools/todo.js +65 -38
  153. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  154. package/dist/core/extensions/loader.d.ts.map +1 -1
  155. package/dist/core/extensions/loader.js +12 -0
  156. package/dist/core/extensions/loader.js.map +1 -1
  157. package/dist/core/extensions/runner.d.ts +5 -0
  158. package/dist/core/extensions/runner.d.ts.map +1 -1
  159. package/dist/core/extensions/runner.js +12 -1
  160. package/dist/core/extensions/runner.js.map +1 -1
  161. package/dist/core/extensions/types.d.ts +23 -1
  162. package/dist/core/extensions/types.d.ts.map +1 -1
  163. package/dist/core/extensions/types.js.map +1 -1
  164. package/dist/core/keybindings.d.ts +0 -5
  165. package/dist/core/keybindings.d.ts.map +1 -1
  166. package/dist/core/keybindings.js +0 -2
  167. package/dist/core/keybindings.js.map +1 -1
  168. package/dist/core/messages.d.ts +32 -0
  169. package/dist/core/messages.d.ts.map +1 -1
  170. package/dist/core/messages.js +91 -0
  171. package/dist/core/messages.js.map +1 -1
  172. package/dist/core/model-resolver.d.ts +9 -1
  173. package/dist/core/model-resolver.d.ts.map +1 -1
  174. package/dist/core/model-resolver.js.map +1 -1
  175. package/dist/core/model-runtime.d.ts +2 -0
  176. package/dist/core/model-runtime.d.ts.map +1 -1
  177. package/dist/core/model-runtime.js +4 -3
  178. package/dist/core/model-runtime.js.map +1 -1
  179. package/dist/core/resource-loader.d.ts +9 -0
  180. package/dist/core/resource-loader.d.ts.map +1 -1
  181. package/dist/core/resource-loader.js +10 -2
  182. package/dist/core/resource-loader.js.map +1 -1
  183. package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
  184. package/dist/core/retry-fallback/cooldown.js +5 -0
  185. package/dist/core/retry-fallback/cooldown.js.map +1 -1
  186. package/dist/core/sdk.d.ts.map +1 -1
  187. package/dist/core/sdk.js +11 -35
  188. package/dist/core/sdk.js.map +1 -1
  189. package/dist/core/settings-manager.d.ts +5 -16
  190. package/dist/core/settings-manager.d.ts.map +1 -1
  191. package/dist/core/settings-manager.js +0 -13
  192. package/dist/core/settings-manager.js.map +1 -1
  193. package/dist/core/slash-commands.d.ts.map +1 -1
  194. package/dist/core/slash-commands.js +1 -0
  195. package/dist/core/slash-commands.js.map +1 -1
  196. package/dist/core/timings.d.ts +7 -2
  197. package/dist/core/timings.d.ts.map +1 -1
  198. package/dist/core/timings.js +11 -0
  199. package/dist/core/timings.js.map +1 -1
  200. package/dist/inspector-policy.d.ts +22 -0
  201. package/dist/inspector-policy.d.ts.map +1 -0
  202. package/dist/inspector-policy.js +84 -0
  203. package/dist/inspector-policy.js.map +1 -0
  204. package/dist/main.d.ts +6 -0
  205. package/dist/main.d.ts.map +1 -1
  206. package/dist/main.js +20 -23
  207. package/dist/main.js.map +1 -1
  208. package/dist/modes/app-server/runtime.d.ts.map +1 -1
  209. package/dist/modes/app-server/runtime.js +1 -0
  210. package/dist/modes/app-server/runtime.js.map +1 -1
  211. package/dist/modes/app-server/threads/goal-handlers.js +4 -2
  212. package/dist/modes/app-server/threads/goal-handlers.js.map +1 -1
  213. package/dist/modes/app-server/threads/goal-wire.d.ts.map +1 -1
  214. package/dist/modes/app-server/threads/goal-wire.js +1 -0
  215. package/dist/modes/app-server/threads/goal-wire.js.map +1 -1
  216. package/dist/modes/app-server/threads/handlers.d.ts +1 -0
  217. package/dist/modes/app-server/threads/handlers.d.ts.map +1 -1
  218. package/dist/modes/app-server/threads/handlers.js +2 -0
  219. package/dist/modes/app-server/threads/handlers.js.map +1 -1
  220. package/dist/modes/app-server/threads/turn-runtime.d.ts +1 -0
  221. package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
  222. package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
  223. package/dist/modes/app-server/threads/turns.d.ts.map +1 -1
  224. package/dist/modes/app-server/threads/turns.js +47 -3
  225. package/dist/modes/app-server/threads/turns.js.map +1 -1
  226. package/dist/modes/interactive/components/status-indicator.d.ts +1 -0
  227. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  228. package/dist/modes/interactive/components/status-indicator.js +29 -4
  229. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  230. package/dist/modes/interactive/components/tool-execution.d.ts +5 -1
  231. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  232. package/dist/modes/interactive/components/tool-execution.js +43 -17
  233. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  234. package/dist/modes/interactive/grok/chrome-tokens.d.ts +22 -0
  235. package/dist/modes/interactive/grok/chrome-tokens.d.ts.map +1 -0
  236. package/dist/modes/interactive/grok/chrome-tokens.js +27 -0
  237. package/dist/modes/interactive/grok/chrome-tokens.js.map +1 -0
  238. package/dist/modes/interactive/grok/chrome.d.ts +51 -0
  239. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -0
  240. package/dist/modes/interactive/grok/chrome.js +105 -0
  241. package/dist/modes/interactive/grok/chrome.js.map +1 -0
  242. package/dist/modes/interactive/grok/footer.d.ts +14 -0
  243. package/dist/modes/interactive/grok/footer.d.ts.map +1 -0
  244. package/dist/modes/interactive/grok/footer.js +27 -0
  245. package/dist/modes/interactive/grok/footer.js.map +1 -0
  246. package/dist/modes/interactive/grok/input-card.d.ts +9 -0
  247. package/dist/modes/interactive/grok/input-card.d.ts.map +1 -0
  248. package/dist/modes/interactive/grok/input-card.js +30 -0
  249. package/dist/modes/interactive/grok/input-card.js.map +1 -0
  250. package/dist/modes/interactive/grok/palette.d.ts +145 -0
  251. package/dist/modes/interactive/grok/palette.d.ts.map +1 -0
  252. package/dist/modes/interactive/grok/palette.js +92 -0
  253. package/dist/modes/interactive/grok/palette.js.map +1 -0
  254. package/dist/modes/interactive/grok/tool-row.d.ts +17 -0
  255. package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -0
  256. package/dist/modes/interactive/grok/tool-row.js +26 -0
  257. package/dist/modes/interactive/grok/tool-row.js.map +1 -0
  258. package/dist/modes/interactive/grok/welcome-card.d.ts +10 -0
  259. package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -0
  260. package/dist/modes/interactive/grok/welcome-card.js +30 -0
  261. package/dist/modes/interactive/grok/welcome-card.js.map +1 -0
  262. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  263. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  264. package/dist/modes/interactive/interactive-mode.js +108 -52
  265. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  266. package/dist/modes/interactive/theme/grok-day.json +77 -0
  267. package/dist/modes/interactive/theme/grok-night.json +93 -0
  268. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  269. package/dist/modes/interactive/theme/theme.js +4 -0
  270. package/dist/modes/interactive/theme/theme.js.map +1 -1
  271. package/dist/modes/rpc/connection-handler.d.ts +3 -3
  272. package/dist/modes/rpc/connection-handler.js +6 -6
  273. package/dist/modes/rpc/connection-handler.js.map +1 -1
  274. package/dist/modes/rpc/custom-capability.d.ts +6 -7
  275. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  276. package/dist/modes/rpc/custom-capability.js +6 -7
  277. package/dist/modes/rpc/custom-capability.js.map +1 -1
  278. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  279. package/dist/modes/rpc/rpc-mode.js +5 -5
  280. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  281. package/dist/senpi +2 -0
  282. package/docs/docs.json +4 -0
  283. package/docs/environment-variables.md +1 -0
  284. package/docs/grok-neo.md +77 -0
  285. package/docs/keybindings.md +0 -1
  286. package/docs/settings.md +3 -3
  287. package/docs/terminal-tools.md +6 -3
  288. package/docs/usage.md +1 -1
  289. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +35 -0
  290. package/node_modules/@code-yeongyu/senpi-codemode/README.md +39 -19
  291. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  292. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +6 -1
  293. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +0 -1
  294. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-notifier.ts +40 -0
  295. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +46 -66
  296. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +5 -2
  297. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -0
  298. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +19 -4
  299. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +7 -0
  300. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +8 -5
  301. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +23 -5
  302. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +322 -0
  303. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +253 -18
  304. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +58 -0
  305. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +28 -6
  306. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +20 -0
  307. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +65 -22
  308. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  309. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -41
  310. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  311. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +3 -0
  312. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  313. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -0
  314. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  315. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +10 -0
  316. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -0
  317. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +38 -0
  318. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -0
  319. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  320. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  321. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  322. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  323. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  324. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +135 -16
  325. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  326. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +1 -1
  327. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  328. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  329. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +1 -4
  330. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  331. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
  332. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +4 -3
  333. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +2 -2
  335. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  336. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
  337. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  338. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +67 -31
  339. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  340. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -1
  341. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  343. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  345. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
  346. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  347. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +1 -1
  348. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -1
  349. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +7 -3
  350. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -1
  351. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts +9 -0
  352. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts.map +1 -0
  353. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js +16 -0
  354. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js.map +1 -0
  355. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  356. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  357. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
  358. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  359. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +35 -3
  360. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  361. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -0
  362. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  363. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  364. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +32 -0
  365. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  366. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +15 -7
  367. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  368. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  369. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  370. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  371. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  372. package/package.json +8 -8
  373. package/dist/cli/neo/build-argv.d.ts +0 -19
  374. package/dist/cli/neo/build-argv.d.ts.map +0 -1
  375. package/dist/cli/neo/build-argv.js +0 -84
  376. package/dist/cli/neo/build-argv.js.map +0 -1
  377. package/dist/cli/neo/daemon-launch.d.ts +0 -25
  378. package/dist/cli/neo/daemon-launch.d.ts.map +0 -1
  379. package/dist/cli/neo/daemon-launch.js +0 -97
  380. package/dist/cli/neo/daemon-launch.js.map +0 -1
  381. package/dist/cli/neo/gate.d.ts +0 -15
  382. package/dist/cli/neo/gate.d.ts.map +0 -1
  383. package/dist/cli/neo/gate.js +0 -21
  384. package/dist/cli/neo/gate.js.map +0 -1
  385. package/dist/cli/neo/launch.d.ts +0 -24
  386. package/dist/cli/neo/launch.d.ts.map +0 -1
  387. package/dist/cli/neo/launch.js +0 -66
  388. package/dist/cli/neo/launch.js.map +0 -1
  389. package/dist/cli/neo/platform.d.ts +0 -38
  390. package/dist/cli/neo/platform.d.ts.map +0 -1
  391. package/dist/cli/neo/platform.js +0 -54
  392. package/dist/cli/neo/platform.js.map +0 -1
  393. package/dist/cli/neo/resolve-binary.d.ts +0 -39
  394. package/dist/cli/neo/resolve-binary.d.ts.map +0 -1
  395. package/dist/cli/neo/resolve-binary.js +0 -66
  396. package/dist/cli/neo/resolve-binary.js.map +0 -1
  397. package/dist/core/extensions/builtin/session-observer/index.d.ts +0 -5
  398. package/dist/core/extensions/builtin/session-observer/index.d.ts.map +0 -1
  399. package/dist/core/extensions/builtin/session-observer/index.js +0 -36
  400. package/dist/core/extensions/builtin/session-observer/index.js.map +0 -1
  401. package/dist/core/extensions/builtin/session-observer/loader.d.ts +0 -3
  402. package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +0 -1
  403. package/dist/core/extensions/builtin/session-observer/loader.js +0 -20
  404. package/dist/core/extensions/builtin/session-observer/loader.js.map +0 -1
  405. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts +0 -7
  406. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +0 -1
  407. package/dist/core/extensions/builtin/session-observer/overlay-format.js +0 -30
  408. package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +0 -1
  409. package/dist/core/extensions/builtin/session-observer/overlay.d.ts +0 -51
  410. package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +0 -1
  411. package/dist/core/extensions/builtin/session-observer/overlay.js +0 -229
  412. package/dist/core/extensions/builtin/session-observer/overlay.js.map +0 -1
  413. package/dist/core/extensions/builtin/session-observer/scanner.d.ts +0 -10
  414. package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +0 -1
  415. package/dist/core/extensions/builtin/session-observer/scanner.js +0 -142
  416. package/dist/core/extensions/builtin/session-observer/scanner.js.map +0 -1
  417. package/dist/core/extensions/builtin/session-observer/text.d.ts +0 -7
  418. package/dist/core/extensions/builtin/session-observer/text.d.ts.map +0 -1
  419. package/dist/core/extensions/builtin/session-observer/text.js +0 -37
  420. package/dist/core/extensions/builtin/session-observer/text.js.map +0 -1
  421. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts +0 -7
  422. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +0 -1
  423. package/dist/core/extensions/builtin/session-observer/transcript-entries.js +0 -71
  424. package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +0 -1
  425. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts +0 -11
  426. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +0 -1
  427. package/dist/core/extensions/builtin/session-observer/transcript-format.js +0 -65
  428. package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +0 -1
  429. package/dist/core/extensions/builtin/session-observer/transcript.d.ts +0 -4
  430. package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +0 -1
  431. package/dist/core/extensions/builtin/session-observer/transcript.js +0 -81
  432. package/dist/core/extensions/builtin/session-observer/transcript.js.map +0 -1
  433. package/dist/core/extensions/builtin/session-observer/types.d.ts +0 -33
  434. package/dist/core/extensions/builtin/session-observer/types.d.ts.map +0 -1
  435. package/dist/core/extensions/builtin/session-observer/types.js +0 -2
  436. package/dist/core/extensions/builtin/session-observer/types.js.map +0 -1
  437. package/dist/modes/rpc/neo-daemon-child-worker.d.ts +0 -29
  438. package/dist/modes/rpc/neo-daemon-child-worker.d.ts.map +0 -1
  439. package/dist/modes/rpc/neo-daemon-child-worker.js +0 -95
  440. package/dist/modes/rpc/neo-daemon-child-worker.js.map +0 -1
  441. package/dist/modes/rpc/neo-daemon-mode.d.ts +0 -110
  442. package/dist/modes/rpc/neo-daemon-mode.d.ts.map +0 -1
  443. package/dist/modes/rpc/neo-daemon-mode.js +0 -267
  444. package/dist/modes/rpc/neo-daemon-mode.js.map +0 -1
  445. package/dist/modes/rpc/neo-daemon-protocol.d.ts +0 -50
  446. package/dist/modes/rpc/neo-daemon-protocol.d.ts.map +0 -1
  447. package/dist/modes/rpc/neo-daemon-protocol.js +0 -66
  448. package/dist/modes/rpc/neo-daemon-protocol.js.map +0 -1
  449. package/dist/modes/rpc/neo-daemon-registry.d.ts +0 -98
  450. package/dist/modes/rpc/neo-daemon-registry.d.ts.map +0 -1
  451. package/dist/modes/rpc/neo-daemon-registry.js +0 -209
  452. package/dist/modes/rpc/neo-daemon-registry.js.map +0 -1
  453. package/dist/modes/rpc/neo-runtime-options-argv.d.ts +0 -17
  454. package/dist/modes/rpc/neo-runtime-options-argv.d.ts.map +0 -1
  455. package/dist/modes/rpc/neo-runtime-options-argv.js +0 -79
  456. package/dist/modes/rpc/neo-runtime-options-argv.js.map +0 -1
  457. package/dist/modes/rpc/neo-runtime-options.d.ts +0 -84
  458. package/dist/modes/rpc/neo-runtime-options.d.ts.map +0 -1
  459. package/dist/modes/rpc/neo-runtime-options.js +0 -92
  460. package/dist/modes/rpc/neo-runtime-options.js.map +0 -1
  461. package/docs/neo.md +0 -111
  462. package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/runtime.ts +0 -258
  463. package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/tools.ts +0 -106
@@ -1 +1 @@
1
- {"version":3,"file":"turns.js","sourceRoot":"","sources":["../../../../src/modes/app-server/threads/turns.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionEvent } from \"../../../core/agent-session.ts\";\nimport type {\n\tJsonValue,\n\tThreadId,\n\tTurnInterruptParams,\n\tTurnInterruptResponse,\n\tTurnStartParams,\n\tTurnStartResponse,\n\tTurnSteerParams,\n\tTurnSteerResponse,\n} from \"../protocol/index.ts\";\nimport { EventProjector } from \"./projection.ts\";\nimport type { ProjectedNotification } from \"./projection-types.ts\";\nimport type { TurnLog, WireItem } from \"./turn-log.ts\";\nimport {\n\tbuildTurn,\n\tbuildUserMessage,\n\tcreateTurnId,\n\tinvalidRequest,\n\ttype LoggedStartStatus,\n\ttype PendingTurn,\n\tparseInput,\n\treadLoggedItems,\n\ttype TurnEngineApi,\n\ttype TurnEngineNotification,\n\ttype TurnEngineOptions,\n\ttype TurnEngineSessionEvent,\n\ttype TurnEngineStore,\n\ttype TurnEngineThreadEntry,\n\ttype TurnNotificationDeferral,\n\ttype TurnWireStatus,\n\ttoTurnEngineError,\n\twireItemToJson,\n} from \"./turn-runtime.ts\";\nimport { emitTurnTerminalNotifications } from \"./turn-terminal.ts\";\n\nexport {\n\ttype TurnEngineApi,\n\tTurnEngineError,\n\ttype TurnEngineNotification,\n\ttype TurnEngineOptions,\n\ttype TurnEngineSession,\n\ttype TurnEngineSessionEvent,\n\ttype TurnEngineStore,\n\ttype TurnEngineThreadEntry,\n\ttype TurnEngineThreadStatus,\n} from \"./turn-runtime.ts\";\n\nexport function createTurnEngine<Entry extends TurnEngineThreadEntry = TurnEngineThreadEntry>(\n\toptions: TurnEngineOptions<Entry>,\n): TurnEngineApi {\n\treturn new TurnEngine(options);\n}\n\nclass TurnEngine<Entry extends TurnEngineThreadEntry> {\n\tprivate readonly store: TurnEngineStore<Entry>;\n\tprivate readonly turnLog: TurnLog;\n\tprivate readonly emitToThread: (threadId: string, notification: TurnEngineNotification) => void;\n\tprivate readonly broadcast: (notification: TurnEngineNotification) => void;\n\tprivate readonly pendingByThreadId = new Map<ThreadId, PendingTurn>();\n\tprivate readonly subscribedThreadIds = new Set<ThreadId>();\n\tprivate readonly projectorByThreadId = new Map<\n\t\tThreadId,\n\t\t{ readonly turnId: string; readonly projector: EventProjector }\n\t>();\n\n\tconstructor(options: TurnEngineOptions<Entry>) {\n\t\tthis.store = options.store;\n\t\tthis.turnLog = options.turnLog;\n\t\tthis.emitToThread = options.emitToThread;\n\t\tthis.broadcast = options.broadcast;\n\t}\n\n\tstartTurn(params: TurnStartParams, deferNotifications?: TurnNotificationDeferral): Promise<TurnStartResponse> {\n\t\tthis.getLoadedThreadOrThrow(params.threadId);\n\n\t\tlet didSettle = false;\n\t\tconst accepted = new Promise<TurnStartResponse>((resolve, reject) => {\n\t\t\tconst run = this.store.runThreadTask(params.threadId, async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsedInput = parseInput(params.input);\n\t\t\t\t\tconst entry = this.getLoadedThreadOrThrow(params.threadId);\n\t\t\t\t\tthis.ensureSessionSubscription(params.threadId, entry);\n\t\t\t\t\tconst turnId = createTurnId();\n\t\t\t\t\tconst startedAtMs = Date.now();\n\t\t\t\t\tconst startedAt = new Date(startedAtMs).toISOString();\n\t\t\t\t\tconst turn = buildTurn(turnId, \"inProgress\", startedAtMs, null, []);\n\t\t\t\t\tconst userMessage = buildUserMessage(params.clientUserMessageId ?? null, parsedInput.content);\n\n\t\t\t\t\tentry.activeTurn = { turnId, startedAt };\n\t\t\t\t\tentry.status = \"active\";\n\t\t\t\t\tentry.updatedAt = startedAt;\n\t\t\t\t\tthis.turnLog.recordTurn(params.threadId, {\n\t\t\t\t\t\tturnId,\n\t\t\t\t\t\tstartedAt,\n\t\t\t\t\t\tstatus: \"running\" satisfies LoggedStartStatus,\n\t\t\t\t\t});\n\t\t\t\t\tconst emitInitialNotifications = (): void => {\n\t\t\t\t\t\tthis.broadcast({\n\t\t\t\t\t\t\tmethod: \"thread/status/changed\",\n\t\t\t\t\t\t\tparams: { threadId: params.threadId, status: { type: \"active\", activeFlags: [] } },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.emitToThread(params.threadId, {\n\t\t\t\t\t\t\tmethod: \"turn/started\",\n\t\t\t\t\t\t\tparams: { threadId: params.threadId, turn },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.emitUserMessage(params.threadId, turnId, startedAtMs, userMessage);\n\t\t\t\t\t};\n\t\t\t\t\tif (deferNotifications?.(emitInitialNotifications) !== true) emitInitialNotifications();\n\n\t\t\t\t\tlet pendingTurn: PendingTurn;\n\t\t\t\t\tconst completion = new Promise<void>((complete) => {\n\t\t\t\t\t\tpendingTurn = {\n\t\t\t\t\t\t\tturnId,\n\t\t\t\t\t\t\tstartedAt,\n\t\t\t\t\t\t\tstartedAtMs,\n\t\t\t\t\t\t\tresolve: complete,\n\t\t\t\t\t\t\tinterrupted: false,\n\t\t\t\t\t\t\tcompleted: false,\n\t\t\t\t\t\t\tdeferTerminalNotifications: undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.pendingByThreadId.set(params.threadId, pendingTurn);\n\t\t\t\t\t});\n\n\t\t\t\t\tvoid entry.session\n\t\t\t\t\t\t.prompt(parsedInput.text, {\n\t\t\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\t\t\tpreflightResult: (success) => {\n\t\t\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\t\t\t\t\tresolve({ turn });\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!pendingTurn.completed) {\n\t\t\t\t\t\t\t\t\tthis.completeTurn(params.threadId, \"failed\", \"Prompt preflight failed\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\t\t\treject(toTurnEngineError(new Error(\"Prompt preflight failed\")));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\t\t\treject(toTurnEngineError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.completeTurn(\n\t\t\t\t\t\t\t\tparams.threadId,\n\t\t\t\t\t\t\t\t\"failed\",\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\tawait completion;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\treject(toTurnEngineError(error instanceof Error ? error : new Error(String(error))));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\trun.catch((error: unknown) => {\n\t\t\t\tif (!didSettle) {\n\t\t\t\t\tdidSettle = true;\n\t\t\t\t\treject(toTurnEngineError(error));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn accepted;\n\t}\n\n\tasync steerTurn(params: TurnSteerParams): Promise<TurnSteerResponse> {\n\t\tconst entry = this.getLoadedThreadOrThrow(params.threadId);\n\t\tconst activeTurn = entry.activeTurn;\n\t\tif (!activeTurn) {\n\t\t\tthrow invalidRequest(`No active turn for thread ${params.threadId}`);\n\t\t}\n\t\tif (activeTurn.turnId !== params.expectedTurnId) {\n\t\t\tthrow invalidRequest(\n\t\t\t\t`Turn id mismatch: expected ${params.expectedTurnId} but active turn is ${activeTurn.turnId}`,\n\t\t\t);\n\t\t}\n\t\tconst parsedInput = parseInput(params.input);\n\t\tawait entry.session.steer(parsedInput.text);\n\t\tthis.emitUserMessage(\n\t\t\tparams.threadId,\n\t\t\tactiveTurn.turnId,\n\t\t\tDate.now(),\n\t\t\tbuildUserMessage(params.clientUserMessageId ?? null, parsedInput.content),\n\t\t);\n\t\treturn { turnId: activeTurn.turnId };\n\t}\n\n\tasync interruptTurn(\n\t\tparams: TurnInterruptParams,\n\t\tdeferNotifications?: TurnNotificationDeferral,\n\t): Promise<TurnInterruptResponse> {\n\t\tconst entry = this.getLoadedThreadOrThrow(params.threadId);\n\t\tconst activeTurn = entry.activeTurn;\n\t\tif (!activeTurn) {\n\t\t\treturn {};\n\t\t}\n\t\tif (activeTurn.turnId !== params.turnId) {\n\t\t\tthrow invalidRequest(`Turn id mismatch: expected ${params.turnId} but active turn is ${activeTurn.turnId}`);\n\t\t}\n\t\tconst pending = this.pendingByThreadId.get(params.threadId);\n\t\tif (pending?.turnId === params.turnId) {\n\t\t\tpending.interrupted = true;\n\t\t\tpending.deferTerminalNotifications = deferNotifications;\n\t\t}\n\t\tawait entry.session.abort();\n\t\tif (entry.activeTurn?.turnId === params.turnId) {\n\t\t\tthis.completeTurn(params.threadId, \"interrupted\");\n\t\t}\n\t\treturn {};\n\t}\n\n\tcompleteTurn(\n\t\tthreadId: ThreadId,\n\t\tstatus: Exclude<TurnWireStatus, \"inProgress\"> = \"completed\",\n\t\tmessage?: string,\n\t): void {\n\t\tconst entry = this.getLoadedThreadOrThrow(threadId);\n\t\tconst activeTurn = entry.activeTurn;\n\t\tconst pending = this.pendingByThreadId.get(threadId);\n\t\tif (!activeTurn || !pending || pending.completed || pending.turnId !== activeTurn.turnId) {\n\t\t\treturn;\n\t\t}\n\n\t\tpending.completed = true;\n\t\t// Close dangling projected items first so they land on the wire and in the\n\t\t// turn log before turn/completed reads the logged items.\n\t\tthis.finalizeProjection(threadId);\n\t\tconst completedStatus = pending.interrupted && status === \"completed\" ? \"interrupted\" : status;\n\t\tconst completedAtMs = Date.now();\n\t\tthis.turnLog.completeTurn(threadId, pending.turnId, {\n\t\t\tstatus: completedStatus,\n\t\t\tcompletedAt: new Date(completedAtMs).toISOString(),\n\t\t\terror: message ?? null,\n\t\t});\n\t\tconst turn = buildTurn(\n\t\t\tpending.turnId,\n\t\t\tcompletedStatus,\n\t\t\tpending.startedAtMs,\n\t\t\tcompletedAtMs,\n\t\t\treadLoggedItems(this.turnLog, threadId, pending.turnId),\n\t\t\tmessage,\n\t\t);\n\n\t\tentry.activeTurn = null;\n\t\tentry.status = \"idle\";\n\t\tentry.updatedAt = new Date(completedAtMs).toISOString();\n\t\tthis.pendingByThreadId.delete(threadId);\n\t\tconst emitTerminalNotifications = (): void => {\n\t\t\tthis.broadcast({ method: \"thread/status/changed\", params: { threadId, status: { type: \"idle\" } } });\n\t\t\temitTurnTerminalNotifications(threadId, turn, this.emitToThread);\n\t\t};\n\t\tif (pending.deferTerminalNotifications?.(emitTerminalNotifications) !== true) emitTerminalNotifications();\n\t\tpending.resolve();\n\t}\n\n\tprivate emitUserMessage(threadId: ThreadId, turnId: string, startedAtMs: number, userMessage: WireItem): void {\n\t\tconst wireUserMessage = wireItemToJson(userMessage);\n\t\tthis.emitToThread(threadId, {\n\t\t\tmethod: \"item/started\",\n\t\t\tparams: { threadId, turnId, item: wireUserMessage, startedAtMs },\n\t\t});\n\t\tthis.emitToThread(threadId, {\n\t\t\tmethod: \"item/completed\",\n\t\t\tparams: { threadId, turnId, item: wireUserMessage, completedAtMs: startedAtMs },\n\t\t});\n\t\tthis.turnLog.appendItem(threadId, turnId, userMessage);\n\t}\n\n\tprivate ensureSessionSubscription(threadId: ThreadId, entry: Entry): void {\n\t\tif (this.subscribedThreadIds.has(threadId)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.subscribedThreadIds.add(threadId);\n\t\tentry.session.subscribe((event) => {\n\t\t\tthis.projectSessionEvent(threadId, event);\n\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\tthis.completeTurn(threadId);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate projectSessionEvent(threadId: ThreadId, event: TurnEngineSessionEvent): void {\n\t\tlet entry: Entry;\n\t\ttry {\n\t\t\tentry = this.getLoadedThreadOrThrow(threadId);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tconst activeTurn = entry.activeTurn;\n\t\tif (!activeTurn) {\n\t\t\treturn;\n\t\t}\n\t\tlet state = this.projectorByThreadId.get(threadId);\n\t\tif (!state || state.turnId !== activeTurn.turnId) {\n\t\t\tstate = {\n\t\t\t\tturnId: activeTurn.turnId,\n\t\t\t\tprojector: new EventProjector({\n\t\t\t\t\tthreadId,\n\t\t\t\t\tturnId: activeTurn.turnId,\n\t\t\t\t\tturnLog: this.turnLog,\n\t\t\t\t\tcwd: entry.cwd,\n\t\t\t\t}),\n\t\t\t};\n\t\t\tthis.projectorByThreadId.set(threadId, state);\n\t\t}\n\t\t// The engine only ever sees real AgentSession events at runtime; the\n\t\t// narrow TurnEngineSessionEvent supertype exists so unit tests can drive\n\t\t// the engine with minimal fakes. Unknown event types project to nothing.\n\t\tconst result = state.projector.project(event as AgentSessionEvent);\n\t\tthis.emitProjected(threadId, result.notifications);\n\t\tconst completion = result.turnCompletion;\n\t\tif (completion && completion.status !== \"completed\" && completion.status !== \"running\") {\n\t\t\tthis.completeTurn(threadId, completion.status, completion.errorMessage);\n\t\t}\n\t}\n\n\tprivate finalizeProjection(threadId: ThreadId): void {\n\t\tconst state = this.projectorByThreadId.get(threadId);\n\t\tif (!state) {\n\t\t\treturn;\n\t\t}\n\t\tthis.projectorByThreadId.delete(threadId);\n\t\tthis.emitProjected(threadId, state.projector.finalize());\n\t}\n\n\tprivate emitProjected(threadId: ThreadId, notifications: readonly ProjectedNotification[]): void {\n\t\tfor (const notification of notifications) {\n\t\t\tthis.emitToThread(threadId, { method: notification.method, params: notification.params as JsonValue });\n\t\t}\n\t}\n\n\tprivate getLoadedThreadOrThrow(threadId: ThreadId): Entry {\n\t\ttry {\n\t\t\treturn this.store.getLoadedThread(threadId);\n\t\t} catch {\n\t\t\tthrow invalidRequest(`Thread not found: ${threadId}`);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"turns.js","sourceRoot":"","sources":["../../../../src/modes/app-server/threads/turns.ts"],"names":[],"mappings":"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","sourcesContent":["import type { UserMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentSessionEvent } from \"../../../core/agent-session.ts\";\nimport type {\n\tJsonValue,\n\tThreadId,\n\tTurnInterruptParams,\n\tTurnInterruptResponse,\n\tTurnStartParams,\n\tTurnStartResponse,\n\tTurnSteerParams,\n\tTurnSteerResponse,\n\tUserInput,\n} from \"../protocol/index.ts\";\nimport { EventProjector } from \"./projection.ts\";\nimport type { ProjectedNotification } from \"./projection-types.ts\";\nimport type { TurnLog, WireItem } from \"./turn-log.ts\";\nimport {\n\tbuildTurn,\n\tbuildUserMessage,\n\tcreateTurnId,\n\tinvalidRequest,\n\ttype LoggedStartStatus,\n\ttype PendingTurn,\n\tparseInput,\n\treadLoggedItems,\n\ttype TurnEngineApi,\n\ttype TurnEngineNotification,\n\ttype TurnEngineOptions,\n\ttype TurnEngineSessionEvent,\n\ttype TurnEngineStore,\n\ttype TurnEngineThreadEntry,\n\ttype TurnNotificationDeferral,\n\ttype TurnWireStatus,\n\ttoTurnEngineError,\n\twireItemToJson,\n} from \"./turn-runtime.ts\";\nimport { emitTurnTerminalNotifications } from \"./turn-terminal.ts\";\n\nexport {\n\ttype TurnEngineApi,\n\tTurnEngineError,\n\ttype TurnEngineNotification,\n\ttype TurnEngineOptions,\n\ttype TurnEngineSession,\n\ttype TurnEngineSessionEvent,\n\ttype TurnEngineStore,\n\ttype TurnEngineThreadEntry,\n\ttype TurnEngineThreadStatus,\n} from \"./turn-runtime.ts\";\n\nexport function createTurnEngine<Entry extends TurnEngineThreadEntry = TurnEngineThreadEntry>(\n\toptions: TurnEngineOptions<Entry>,\n): TurnEngineApi {\n\treturn new TurnEngine(options);\n}\n\nclass TurnEngine<Entry extends TurnEngineThreadEntry> {\n\tprivate readonly store: TurnEngineStore<Entry>;\n\tprivate readonly turnLog: TurnLog;\n\tprivate readonly emitToThread: (threadId: string, notification: TurnEngineNotification) => void;\n\tprivate readonly broadcast: (notification: TurnEngineNotification) => void;\n\tprivate readonly pendingByThreadId = new Map<ThreadId, PendingTurn>();\n\tprivate readonly subscribedThreadIds = new Set<ThreadId>();\n\tprivate readonly projectorByThreadId = new Map<\n\t\tThreadId,\n\t\t{ readonly turnId: string; readonly projector: EventProjector }\n\t>();\n\n\tconstructor(options: TurnEngineOptions<Entry>) {\n\t\tthis.store = options.store;\n\t\tthis.turnLog = options.turnLog;\n\t\tthis.emitToThread = options.emitToThread;\n\t\tthis.broadcast = options.broadcast;\n\t}\n\n\tobserveThread(threadId: ThreadId): void {\n\t\tthis.ensureSessionSubscription(threadId, this.getLoadedThreadOrThrow(threadId));\n\t}\n\n\tstartTurn(params: TurnStartParams, deferNotifications?: TurnNotificationDeferral): Promise<TurnStartResponse> {\n\t\tthis.getLoadedThreadOrThrow(params.threadId);\n\n\t\tlet didSettle = false;\n\t\tconst accepted = new Promise<TurnStartResponse>((resolve, reject) => {\n\t\t\tconst run = this.store.runThreadTask(params.threadId, async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsedInput = parseInput(params.input);\n\t\t\t\t\tconst entry = this.getLoadedThreadOrThrow(params.threadId);\n\t\t\t\t\tthis.observeThread(params.threadId);\n\t\t\t\t\tconst turnId = createTurnId();\n\t\t\t\t\tconst startedAtMs = Date.now();\n\t\t\t\t\tconst startedAt = new Date(startedAtMs).toISOString();\n\t\t\t\t\tconst turn = buildTurn(turnId, \"inProgress\", startedAtMs, null, []);\n\t\t\t\t\tconst userMessage = buildUserMessage(params.clientUserMessageId ?? null, parsedInput.content);\n\n\t\t\t\t\tentry.activeTurn = { turnId, startedAt };\n\t\t\t\t\tentry.status = \"active\";\n\t\t\t\t\tentry.updatedAt = startedAt;\n\t\t\t\t\tthis.turnLog.recordTurn(params.threadId, {\n\t\t\t\t\t\tturnId,\n\t\t\t\t\t\tstartedAt,\n\t\t\t\t\t\tstatus: \"running\" satisfies LoggedStartStatus,\n\t\t\t\t\t});\n\t\t\t\t\tconst emitInitialNotifications = (): void => {\n\t\t\t\t\t\tthis.broadcast({\n\t\t\t\t\t\t\tmethod: \"thread/status/changed\",\n\t\t\t\t\t\t\tparams: { threadId: params.threadId, status: { type: \"active\", activeFlags: [] } },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.emitToThread(params.threadId, {\n\t\t\t\t\t\t\tmethod: \"turn/started\",\n\t\t\t\t\t\t\tparams: { threadId: params.threadId, turn },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.emitUserMessage(params.threadId, turnId, startedAtMs, userMessage);\n\t\t\t\t\t};\n\t\t\t\t\tif (deferNotifications?.(emitInitialNotifications) !== true) emitInitialNotifications();\n\n\t\t\t\t\tlet pendingTurn: PendingTurn;\n\t\t\t\t\tconst completion = new Promise<void>((complete) => {\n\t\t\t\t\t\tpendingTurn = {\n\t\t\t\t\t\t\tturnId,\n\t\t\t\t\t\t\tstartedAt,\n\t\t\t\t\t\t\tstartedAtMs,\n\t\t\t\t\t\t\tresolve: complete,\n\t\t\t\t\t\t\tinterrupted: false,\n\t\t\t\t\t\t\tcompleted: false,\n\t\t\t\t\t\t\tdeferTerminalNotifications: undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.pendingByThreadId.set(params.threadId, pendingTurn);\n\t\t\t\t\t});\n\n\t\t\t\t\tvoid entry.session\n\t\t\t\t\t\t.prompt(parsedInput.text, {\n\t\t\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\t\t\tpreflightResult: (success) => {\n\t\t\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\t\t\t\t\tresolve({ turn });\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!pendingTurn.completed) {\n\t\t\t\t\t\t\t\t\tthis.completeTurn(params.threadId, \"failed\", \"Prompt preflight failed\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\t\t\treject(toTurnEngineError(new Error(\"Prompt preflight failed\")));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\t\t\treject(toTurnEngineError(error));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.completeTurn(\n\t\t\t\t\t\t\t\tparams.threadId,\n\t\t\t\t\t\t\t\t\"failed\",\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\tawait completion;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!didSettle) {\n\t\t\t\t\t\tdidSettle = true;\n\t\t\t\t\t\treject(toTurnEngineError(error instanceof Error ? error : new Error(String(error))));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\trun.catch((error: unknown) => {\n\t\t\t\tif (!didSettle) {\n\t\t\t\t\tdidSettle = true;\n\t\t\t\t\treject(toTurnEngineError(error));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn accepted;\n\t}\n\n\tasync steerTurn(params: TurnSteerParams): Promise<TurnSteerResponse> {\n\t\tconst entry = this.getLoadedThreadOrThrow(params.threadId);\n\t\tconst activeTurn = entry.activeTurn;\n\t\tif (!activeTurn) {\n\t\t\tthrow invalidRequest(`No active turn for thread ${params.threadId}`);\n\t\t}\n\t\tif (activeTurn.turnId !== params.expectedTurnId) {\n\t\t\tthrow invalidRequest(\n\t\t\t\t`Turn id mismatch: expected ${params.expectedTurnId} but active turn is ${activeTurn.turnId}`,\n\t\t\t);\n\t\t}\n\t\tconst parsedInput = parseInput(params.input);\n\t\tawait entry.session.steer(parsedInput.text);\n\t\tthis.emitUserMessage(\n\t\t\tparams.threadId,\n\t\t\tactiveTurn.turnId,\n\t\t\tDate.now(),\n\t\t\tbuildUserMessage(params.clientUserMessageId ?? null, parsedInput.content),\n\t\t);\n\t\treturn { turnId: activeTurn.turnId };\n\t}\n\n\tasync interruptTurn(\n\t\tparams: TurnInterruptParams,\n\t\tdeferNotifications?: TurnNotificationDeferral,\n\t): Promise<TurnInterruptResponse> {\n\t\tconst entry = this.getLoadedThreadOrThrow(params.threadId);\n\t\tconst activeTurn = entry.activeTurn;\n\t\tif (!activeTurn) {\n\t\t\treturn {};\n\t\t}\n\t\tif (activeTurn.turnId !== params.turnId) {\n\t\t\tthrow invalidRequest(`Turn id mismatch: expected ${params.turnId} but active turn is ${activeTurn.turnId}`);\n\t\t}\n\t\tconst pending = this.pendingByThreadId.get(params.threadId);\n\t\tif (pending?.turnId === params.turnId) {\n\t\t\tpending.interrupted = true;\n\t\t\tpending.deferTerminalNotifications = deferNotifications;\n\t\t}\n\t\tawait entry.session.abort();\n\t\tif (entry.activeTurn?.turnId === params.turnId) {\n\t\t\tthis.completeTurn(params.threadId, \"interrupted\");\n\t\t}\n\t\treturn {};\n\t}\n\n\tcompleteTurn(\n\t\tthreadId: ThreadId,\n\t\tstatus: Exclude<TurnWireStatus, \"inProgress\"> = \"completed\",\n\t\tmessage?: string,\n\t): void {\n\t\tconst entry = this.getLoadedThreadOrThrow(threadId);\n\t\tconst activeTurn = entry.activeTurn;\n\t\tconst pending = this.pendingByThreadId.get(threadId);\n\t\tif (!activeTurn || !pending || pending.completed || pending.turnId !== activeTurn.turnId) {\n\t\t\treturn;\n\t\t}\n\n\t\tpending.completed = true;\n\t\t// Close dangling projected items first so they land on the wire and in the\n\t\t// turn log before turn/completed reads the logged items.\n\t\tthis.finalizeProjection(threadId);\n\t\tconst completedStatus = pending.interrupted && status === \"completed\" ? \"interrupted\" : status;\n\t\tconst completedAtMs = Date.now();\n\t\tthis.turnLog.completeTurn(threadId, pending.turnId, {\n\t\t\tstatus: completedStatus,\n\t\t\tcompletedAt: new Date(completedAtMs).toISOString(),\n\t\t\terror: message ?? null,\n\t\t});\n\t\tconst turn = buildTurn(\n\t\t\tpending.turnId,\n\t\t\tcompletedStatus,\n\t\t\tpending.startedAtMs,\n\t\t\tcompletedAtMs,\n\t\t\treadLoggedItems(this.turnLog, threadId, pending.turnId),\n\t\t\tmessage,\n\t\t);\n\n\t\tentry.activeTurn = null;\n\t\tentry.status = \"idle\";\n\t\tentry.updatedAt = new Date(completedAtMs).toISOString();\n\t\tthis.pendingByThreadId.delete(threadId);\n\t\tconst emitTerminalNotifications = (): void => {\n\t\t\tthis.broadcast({ method: \"thread/status/changed\", params: { threadId, status: { type: \"idle\" } } });\n\t\t\temitTurnTerminalNotifications(threadId, turn, this.emitToThread);\n\t\t};\n\t\tif (pending.deferTerminalNotifications?.(emitTerminalNotifications) !== true) emitTerminalNotifications();\n\t\tpending.resolve();\n\t}\n\n\tprivate emitUserMessage(threadId: ThreadId, turnId: string, startedAtMs: number, userMessage: WireItem): void {\n\t\tconst wireUserMessage = wireItemToJson(userMessage);\n\t\tthis.emitToThread(threadId, {\n\t\t\tmethod: \"item/started\",\n\t\t\tparams: { threadId, turnId, item: wireUserMessage, startedAtMs },\n\t\t});\n\t\tthis.emitToThread(threadId, {\n\t\t\tmethod: \"item/completed\",\n\t\t\tparams: { threadId, turnId, item: wireUserMessage, completedAtMs: startedAtMs },\n\t\t});\n\t\tthis.turnLog.appendItem(threadId, turnId, userMessage);\n\t}\n\n\tprivate ensureSessionSubscription(threadId: ThreadId, entry: Entry): void {\n\t\tif (this.subscribedThreadIds.has(threadId)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.subscribedThreadIds.add(threadId);\n\t\tentry.session.subscribe((event) => {\n\t\t\tthis.projectSessionEvent(threadId, event);\n\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\tthis.completeTurn(threadId);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate projectSessionEvent(threadId: ThreadId, event: TurnEngineSessionEvent): void {\n\t\tlet entry: Entry;\n\t\ttry {\n\t\t\tentry = this.getLoadedThreadOrThrow(threadId);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tlet activeTurn = entry.activeTurn;\n\t\tif (!activeTurn) {\n\t\t\tactiveTurn = this.startExtensionTurn(threadId, entry, event);\n\t\t\tif (!activeTurn) return;\n\t\t}\n\t\tlet state = this.projectorByThreadId.get(threadId);\n\t\tif (!state || state.turnId !== activeTurn.turnId) {\n\t\t\tstate = {\n\t\t\t\tturnId: activeTurn.turnId,\n\t\t\t\tprojector: new EventProjector({\n\t\t\t\t\tthreadId,\n\t\t\t\t\tturnId: activeTurn.turnId,\n\t\t\t\t\tturnLog: this.turnLog,\n\t\t\t\t\tcwd: entry.cwd,\n\t\t\t\t}),\n\t\t\t};\n\t\t\tthis.projectorByThreadId.set(threadId, state);\n\t\t}\n\t\t// The engine only ever sees real AgentSession events at runtime; the\n\t\t// narrow TurnEngineSessionEvent supertype exists so unit tests can drive\n\t\t// the engine with minimal fakes. Unknown event types project to nothing.\n\t\tconst result = state.projector.project(event as AgentSessionEvent);\n\t\tthis.emitProjected(threadId, result.notifications);\n\t\tconst completion = result.turnCompletion;\n\t\tif (completion && completion.status !== \"completed\" && completion.status !== \"running\") {\n\t\t\tthis.completeTurn(threadId, completion.status, completion.errorMessage);\n\t\t}\n\t}\n\n\tprivate startExtensionTurn(\n\t\tthreadId: ThreadId,\n\t\tentry: Entry,\n\t\tevent: TurnEngineSessionEvent,\n\t): { readonly turnId: string; readonly startedAt: string } | null {\n\t\tconst sessionEvent = event as AgentSessionEvent;\n\t\tif (sessionEvent.type !== \"message_start\" || sessionEvent.message.role !== \"user\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst turnId = createTurnId();\n\t\tconst startedAtMs = Date.now();\n\t\tconst startedAt = new Date(startedAtMs).toISOString();\n\t\tconst turn = buildTurn(turnId, \"inProgress\", startedAtMs, null, []);\n\t\tconst userMessage = buildExtensionUserMessage(sessionEvent.message);\n\t\tentry.activeTurn = { turnId, startedAt };\n\t\tentry.status = \"active\";\n\t\tentry.updatedAt = startedAt;\n\t\tthis.turnLog.recordTurn(threadId, { turnId, startedAt, status: \"running\" });\n\t\tthis.pendingByThreadId.set(threadId, {\n\t\t\tturnId,\n\t\t\tstartedAt,\n\t\t\tstartedAtMs,\n\t\t\tresolve: () => {},\n\t\t\tinterrupted: false,\n\t\t\tcompleted: false,\n\t\t\tdeferTerminalNotifications: undefined,\n\t\t});\n\t\tthis.broadcast({\n\t\t\tmethod: \"thread/status/changed\",\n\t\t\tparams: { threadId, status: { type: \"active\", activeFlags: [] } },\n\t\t});\n\t\tthis.emitToThread(threadId, { method: \"turn/started\", params: { threadId, turn } });\n\t\tthis.emitUserMessage(threadId, turnId, startedAtMs, userMessage);\n\t\treturn entry.activeTurn;\n\t}\n\n\tprivate finalizeProjection(threadId: ThreadId): void {\n\t\tconst state = this.projectorByThreadId.get(threadId);\n\t\tif (!state) {\n\t\t\treturn;\n\t\t}\n\t\tthis.projectorByThreadId.delete(threadId);\n\t\tthis.emitProjected(threadId, state.projector.finalize());\n\t}\n\n\tprivate emitProjected(threadId: ThreadId, notifications: readonly ProjectedNotification[]): void {\n\t\tfor (const notification of notifications) {\n\t\t\tthis.emitToThread(threadId, { method: notification.method, params: notification.params as JsonValue });\n\t\t}\n\t}\n\n\tprivate getLoadedThreadOrThrow(threadId: ThreadId): Entry {\n\t\ttry {\n\t\t\treturn this.store.getLoadedThread(threadId);\n\t\t} catch {\n\t\t\tthrow invalidRequest(`Thread not found: ${threadId}`);\n\t\t}\n\t}\n}\n\nfunction buildExtensionUserMessage(message: UserMessage): WireItem {\n\tconst content: UserInput[] =\n\t\ttypeof message.content === \"string\"\n\t\t\t? [{ type: \"text\", text: message.content, text_elements: [] }]\n\t\t\t: message.content.map((part) =>\n\t\t\t\t\tpart.type === \"text\"\n\t\t\t\t\t\t? { type: \"text\", text: part.text, text_elements: [] }\n\t\t\t\t\t\t: { type: \"image\", url: `data:${part.mimeType};base64,${part.data}` },\n\t\t\t\t);\n\treturn buildUserMessage(null, content);\n}\n"]}
@@ -17,6 +17,7 @@ export declare class RetryStatusIndicator extends StatusIndicator {
17
17
  export type CompactionStatusReason = "manual" | "threshold" | "overflow" | "pre_prompt" | "branch" | "extension";
18
18
  export declare class CompactionStatusIndicator extends StatusIndicator {
19
19
  private progressText;
20
+ private readonly progressLabel;
20
21
  constructor(ui: TUI, reason: CompactionStatusReason);
21
22
  setProgressText(progressText: string): void;
22
23
  render(width: number): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"status-indicator.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/status-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,EAAE,KAAK,sBAAsB,EAAE,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAKvG,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,eAAe,CAAC;AAEvF,qBAAa,eAAgB,SAAQ,MAAM;IAC1C,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAEnC,YACC,IAAI,EAAE,mBAAmB,EACzB,EAAE,EAAE,GAAG,EACP,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,sBAAsB,EAIlC;IAED,OAAO,IAAI,IAAI,CAEd;IAED,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAE3C;CACD;AAED,qBAAa,sBAAuB,SAAQ,eAAe;IAC1D,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,sBAAsB,EASvE;CACD;AAED,qBAAa,oBAAqB,SAAQ,eAAe;IACxD,OAAO,CAAC,SAAS,CAA6B;IAE9C,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAoBzE;IAEQ,OAAO,IAAI,IAAI,CAIvB;CACD;AAED,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEjH,qBAAa,yBAA0B,SAAQ,eAAe;IAC7D,OAAO,CAAC,YAAY,CAAM;IAE1B,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,sBAAsB,EAmBlD;IAED,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAE1C;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIvC;CACD;AAED,qBAAa,4BAA6B,SAAQ,eAAe;IAChE,YAAY,EAAE,EAAE,GAAG,EAQlB;CACD;AAED,qBAAa,UAAW,YAAW,SAAS;IAC3C,UAAU,IAAI,IAAI,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAG9B;CACD"}
1
+ {"version":3,"file":"status-indicator.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/status-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EACd,MAAM,EACN,KAAK,sBAAsB,EAE3B,KAAK,GAAG,EAGR,MAAM,wBAAwB,CAAC;AAKhC,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,eAAe,CAAC;AAEvF,qBAAa,eAAgB,SAAQ,MAAM;IAC1C,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAEnC,YACC,IAAI,EAAE,mBAAmB,EACzB,EAAE,EAAE,GAAG,EACP,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,sBAAsB,EAIlC;IAED,OAAO,IAAI,IAAI,CAEd;IAED,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAE3C;CACD;AAED,qBAAa,sBAAuB,SAAQ,eAAe;IAC1D,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,sBAAsB,EASvE;CACD;AAED,qBAAa,oBAAqB,SAAQ,eAAe;IACxD,OAAO,CAAC,SAAS,CAA6B;IAE9C,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAoBzE;IAEQ,OAAO,IAAI,IAAI,CAIvB;CACD;AAED,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEjH,qBAAa,yBAA0B,SAAQ,eAAe;IAC7D,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,sBAAsB,EAsBlD;IAED,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAG1C;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBvC;CACD;AAED,qBAAa,4BAA6B,SAAQ,eAAe;IAChE,YAAY,EAAE,EAAE,GAAG,EAQlB;CACD;AAED,qBAAa,UAAW,YAAW,SAAS;IAC3C,UAAU,IAAI,IAAI,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAG9B;CACD"}
@@ -1,4 +1,4 @@
1
- import { Loader } from "@earendil-works/pi-tui";
1
+ import { Loader, sliceByColumn, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
2
2
  import { theme } from "../theme/theme.js";
3
3
  import { CountdownTimer } from "./countdown-timer.js";
4
4
  import { keyText } from "./keybinding-hints.js";
@@ -49,15 +49,40 @@ export class CompactionStatusIndicator extends StatusIndicator {
49
49
  : `Compacting context... ${cancelHint}`;
50
50
  super("compaction", ui, (spinner) => theme.fg("accent", spinner), (text) => theme.fg("muted", text), label);
51
51
  this.progressText = "";
52
+ // Once a streamed preview needs room, the reason-specific label collapses to the
53
+ // shortest form that still keeps the cancellation hint fully visible.
54
+ this.progressLabel = `Compacting... ${cancelHint}`;
52
55
  }
53
56
  setProgressText(progressText) {
57
+ if (!this.progressText && progressText)
58
+ this.setMessage(this.progressLabel);
54
59
  this.progressText = progressText;
55
60
  }
56
61
  render(width) {
57
- const status = super.render(width).join(" ");
62
+ // Loader.render() prepends a spacer row; joining keeps this indicator a single row
63
+ // whether or not a preview is present, so the composer never shifts between states.
64
+ // Text pads rows to the full width, so trailing padding is stripped before measuring.
65
+ let status = super.render(width).join(" ").trimEnd();
66
+ // On narrow terminals the reason-specific label can wrap even before any preview
67
+ // arrives, and head-truncating the joined rows would drop the cancellation hint.
68
+ // Collapse to the compact label whenever the full status cannot fit on one row.
69
+ if (visibleWidth(status) > width) {
70
+ this.setMessage(this.progressLabel);
71
+ status = super.render(width).join(" ").trimEnd();
72
+ }
58
73
  if (!this.progressText)
59
- return [status];
60
- return [`${status} ${theme.fg("muted", this.progressText)}`];
74
+ return [truncateToWidth(status, width)];
75
+ // The status label (with its cancellation hint) is allocated first; the preview only
76
+ // receives whatever width is left over instead of starving the hint out of the row.
77
+ const progressWidth = Math.min(visibleWidth(this.progressText), width - visibleWidth(status) - 1);
78
+ if (progressWidth <= 0)
79
+ return [truncateToWidth(status, width)];
80
+ // The preview is accumulated summary text, so keep the newest trailing columns.
81
+ const totalProgressWidth = visibleWidth(this.progressText);
82
+ const progressTail = totalProgressWidth > progressWidth
83
+ ? sliceByColumn(this.progressText, totalProgressWidth - progressWidth, progressWidth)
84
+ : this.progressText;
85
+ return [truncateToWidth(`${status} ${theme.fg("muted", progressTail)}`, width)];
61
86
  }
62
87
  }
63
88
  export class BranchSummaryStatusIndicator extends StatusIndicator {
@@ -1 +1 @@
1
- {"version":3,"file":"status-indicator.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/status-indicator.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, Loader, type LoaderIndicatorOptions, type TUI } from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { CountdownTimer } from \"./countdown-timer.ts\";\nimport { keyText } from \"./keybinding-hints.ts\";\n\nexport type StatusIndicatorKind = \"working\" | \"retry\" | \"compaction\" | \"branchSummary\";\n\nexport class StatusIndicator extends Loader {\n\treadonly kind: StatusIndicatorKind;\n\n\tconstructor(\n\t\tkind: StatusIndicatorKind,\n\t\tui: TUI,\n\t\tspinnerColorFn: (str: string) => string,\n\t\tmessageColorFn: (str: string) => string,\n\t\tmessage: string,\n\t\tindicator?: LoaderIndicatorOptions,\n\t) {\n\t\tsuper(ui, spinnerColorFn, messageColorFn, message, indicator);\n\t\tthis.kind = kind;\n\t}\n\n\tdispose(): void {\n\t\tthis.stop();\n\t}\n\n\tsetProgressText(_progressText: string): void {\n\t\t// Only compaction status renders progress.\n\t}\n}\n\nexport class WorkingStatusIndicator extends StatusIndicator {\n\tconstructor(ui: TUI, message: string, indicator?: LoaderIndicatorOptions) {\n\t\tsuper(\n\t\t\t\"working\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"accent\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\tmessage,\n\t\t\tindicator,\n\t\t);\n\t}\n}\n\nexport class RetryStatusIndicator extends StatusIndicator {\n\tprivate countdown: CountdownTimer | undefined;\n\n\tconstructor(ui: TUI, attempt: number, maxAttempts: number, delayMs: number) {\n\t\tconst retryMessage = (seconds: number) =>\n\t\t\t`Retrying (${attempt}/${maxAttempts}) in ${seconds}s... (${keyText(\"app.interrupt\")} to cancel)`;\n\t\tsuper(\n\t\t\t\"retry\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"warning\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\tretryMessage(Math.ceil(delayMs / 1000)),\n\t\t);\n\t\tthis.countdown = new CountdownTimer(\n\t\t\tdelayMs,\n\t\t\tui,\n\t\t\t(seconds) => {\n\t\t\t\tthis.setMessage(retryMessage(seconds));\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tthis.countdown = undefined;\n\t\t\t},\n\t\t);\n\t}\n\n\toverride dispose(): void {\n\t\tthis.countdown?.dispose();\n\t\tthis.countdown = undefined;\n\t\tsuper.dispose();\n\t}\n}\n\nexport type CompactionStatusReason = \"manual\" | \"threshold\" | \"overflow\" | \"pre_prompt\" | \"branch\" | \"extension\";\n\nexport class CompactionStatusIndicator extends StatusIndicator {\n\tprivate progressText = \"\";\n\n\tconstructor(ui: TUI, reason: CompactionStatusReason) {\n\t\tconst cancelHint = `(${keyText(\"app.interrupt\")} to cancel)`;\n\t\tconst label =\n\t\t\treason === \"manual\"\n\t\t\t\t? `Compacting context... ${cancelHint}`\n\t\t\t\t: reason === \"overflow\"\n\t\t\t\t\t? `Context overflow detected, compacting... ${cancelHint}`\n\t\t\t\t\t: reason === \"pre_prompt\"\n\t\t\t\t\t\t? `Compacting before next prompt... ${cancelHint}`\n\t\t\t\t\t\t: reason === \"threshold\"\n\t\t\t\t\t\t\t? `Auto-compacting... ${cancelHint}`\n\t\t\t\t\t\t\t: `Compacting context... ${cancelHint}`;\n\t\tsuper(\n\t\t\t\"compaction\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"accent\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\tlabel,\n\t\t);\n\t}\n\n\tsetProgressText(progressText: string): void {\n\t\tthis.progressText = progressText;\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst status = super.render(width).join(\" \");\n\t\tif (!this.progressText) return [status];\n\t\treturn [`${status} ${theme.fg(\"muted\", this.progressText)}`];\n\t}\n}\n\nexport class BranchSummaryStatusIndicator extends StatusIndicator {\n\tconstructor(ui: TUI) {\n\t\tsuper(\n\t\t\t\"branchSummary\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"accent\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\t`Summarizing branch... (${keyText(\"app.interrupt\")} to cancel)`,\n\t\t);\n\t}\n}\n\nexport class IdleStatus implements Component {\n\tinvalidate(): void {\n\t\t// No cached state to invalidate.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst emptyLine = \" \".repeat(width);\n\t\treturn [emptyLine, emptyLine];\n\t}\n}\n"]}
1
+ {"version":3,"file":"status-indicator.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/status-indicator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tLoader,\n\ttype LoaderIndicatorOptions,\n\tsliceByColumn,\n\ttype TUI,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport { theme } from \"../theme/theme.ts\";\nimport { CountdownTimer } from \"./countdown-timer.ts\";\nimport { keyText } from \"./keybinding-hints.ts\";\n\nexport type StatusIndicatorKind = \"working\" | \"retry\" | \"compaction\" | \"branchSummary\";\n\nexport class StatusIndicator extends Loader {\n\treadonly kind: StatusIndicatorKind;\n\n\tconstructor(\n\t\tkind: StatusIndicatorKind,\n\t\tui: TUI,\n\t\tspinnerColorFn: (str: string) => string,\n\t\tmessageColorFn: (str: string) => string,\n\t\tmessage: string,\n\t\tindicator?: LoaderIndicatorOptions,\n\t) {\n\t\tsuper(ui, spinnerColorFn, messageColorFn, message, indicator);\n\t\tthis.kind = kind;\n\t}\n\n\tdispose(): void {\n\t\tthis.stop();\n\t}\n\n\tsetProgressText(_progressText: string): void {\n\t\t// Only compaction status renders progress.\n\t}\n}\n\nexport class WorkingStatusIndicator extends StatusIndicator {\n\tconstructor(ui: TUI, message: string, indicator?: LoaderIndicatorOptions) {\n\t\tsuper(\n\t\t\t\"working\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"accent\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\tmessage,\n\t\t\tindicator,\n\t\t);\n\t}\n}\n\nexport class RetryStatusIndicator extends StatusIndicator {\n\tprivate countdown: CountdownTimer | undefined;\n\n\tconstructor(ui: TUI, attempt: number, maxAttempts: number, delayMs: number) {\n\t\tconst retryMessage = (seconds: number) =>\n\t\t\t`Retrying (${attempt}/${maxAttempts}) in ${seconds}s... (${keyText(\"app.interrupt\")} to cancel)`;\n\t\tsuper(\n\t\t\t\"retry\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"warning\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\tretryMessage(Math.ceil(delayMs / 1000)),\n\t\t);\n\t\tthis.countdown = new CountdownTimer(\n\t\t\tdelayMs,\n\t\t\tui,\n\t\t\t(seconds) => {\n\t\t\t\tthis.setMessage(retryMessage(seconds));\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tthis.countdown = undefined;\n\t\t\t},\n\t\t);\n\t}\n\n\toverride dispose(): void {\n\t\tthis.countdown?.dispose();\n\t\tthis.countdown = undefined;\n\t\tsuper.dispose();\n\t}\n}\n\nexport type CompactionStatusReason = \"manual\" | \"threshold\" | \"overflow\" | \"pre_prompt\" | \"branch\" | \"extension\";\n\nexport class CompactionStatusIndicator extends StatusIndicator {\n\tprivate progressText = \"\";\n\tprivate readonly progressLabel: string;\n\n\tconstructor(ui: TUI, reason: CompactionStatusReason) {\n\t\tconst cancelHint = `(${keyText(\"app.interrupt\")} to cancel)`;\n\t\tconst label =\n\t\t\treason === \"manual\"\n\t\t\t\t? `Compacting context... ${cancelHint}`\n\t\t\t\t: reason === \"overflow\"\n\t\t\t\t\t? `Context overflow detected, compacting... ${cancelHint}`\n\t\t\t\t\t: reason === \"pre_prompt\"\n\t\t\t\t\t\t? `Compacting before next prompt... ${cancelHint}`\n\t\t\t\t\t\t: reason === \"threshold\"\n\t\t\t\t\t\t\t? `Auto-compacting... ${cancelHint}`\n\t\t\t\t\t\t\t: `Compacting context... ${cancelHint}`;\n\t\tsuper(\n\t\t\t\"compaction\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"accent\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\tlabel,\n\t\t);\n\t\t// Once a streamed preview needs room, the reason-specific label collapses to the\n\t\t// shortest form that still keeps the cancellation hint fully visible.\n\t\tthis.progressLabel = `Compacting... ${cancelHint}`;\n\t}\n\n\tsetProgressText(progressText: string): void {\n\t\tif (!this.progressText && progressText) this.setMessage(this.progressLabel);\n\t\tthis.progressText = progressText;\n\t}\n\n\toverride render(width: number): string[] {\n\t\t// Loader.render() prepends a spacer row; joining keeps this indicator a single row\n\t\t// whether or not a preview is present, so the composer never shifts between states.\n\t\t// Text pads rows to the full width, so trailing padding is stripped before measuring.\n\t\tlet status = super.render(width).join(\" \").trimEnd();\n\t\t// On narrow terminals the reason-specific label can wrap even before any preview\n\t\t// arrives, and head-truncating the joined rows would drop the cancellation hint.\n\t\t// Collapse to the compact label whenever the full status cannot fit on one row.\n\t\tif (visibleWidth(status) > width) {\n\t\t\tthis.setMessage(this.progressLabel);\n\t\t\tstatus = super.render(width).join(\" \").trimEnd();\n\t\t}\n\t\tif (!this.progressText) return [truncateToWidth(status, width)];\n\t\t// The status label (with its cancellation hint) is allocated first; the preview only\n\t\t// receives whatever width is left over instead of starving the hint out of the row.\n\t\tconst progressWidth = Math.min(visibleWidth(this.progressText), width - visibleWidth(status) - 1);\n\t\tif (progressWidth <= 0) return [truncateToWidth(status, width)];\n\t\t// The preview is accumulated summary text, so keep the newest trailing columns.\n\t\tconst totalProgressWidth = visibleWidth(this.progressText);\n\t\tconst progressTail =\n\t\t\ttotalProgressWidth > progressWidth\n\t\t\t\t? sliceByColumn(this.progressText, totalProgressWidth - progressWidth, progressWidth)\n\t\t\t\t: this.progressText;\n\t\treturn [truncateToWidth(`${status} ${theme.fg(\"muted\", progressTail)}`, width)];\n\t}\n}\n\nexport class BranchSummaryStatusIndicator extends StatusIndicator {\n\tconstructor(ui: TUI) {\n\t\tsuper(\n\t\t\t\"branchSummary\",\n\t\t\tui,\n\t\t\t(spinner) => theme.fg(\"accent\", spinner),\n\t\t\t(text) => theme.fg(\"muted\", text),\n\t\t\t`Summarizing branch... (${keyText(\"app.interrupt\")} to cancel)`,\n\t\t);\n\t}\n}\n\nexport class IdleStatus implements Component {\n\tinvalidate(): void {\n\t\t// No cached state to invalidate.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst emptyLine = \" \".repeat(width);\n\t\treturn [emptyLine, emptyLine];\n\t}\n}\n"]}
@@ -5,11 +5,15 @@ export interface ToolExecutionOptions {
5
5
  showImages?: boolean;
6
6
  imageWidthCells?: number;
7
7
  }
8
+ /** Visual shell chosen by interactive chrome; classic remains the default. */
9
+ export type ToolExecutionPresentation = "classic" | "grok";
8
10
  export declare class ToolExecutionComponent extends Container {
9
11
  private readonly identity;
10
12
  private readonly ui;
11
13
  private readonly renderer;
12
14
  private readonly images;
15
+ private readonly grokRow;
16
+ private readonly presentation;
13
17
  private args;
14
18
  private expanded;
15
19
  private showImages;
@@ -25,7 +29,7 @@ export declare class ToolExecutionComponent extends Container {
25
29
  private cachedSignature?;
26
30
  private cachedWidth?;
27
31
  private lastDisplaySignature?;
28
- constructor(toolName: string, toolCallId: string, args: unknown, options: ToolExecutionOptions | undefined, toolDefinition: ToolDef | undefined, ui: TUI, cwd: string);
32
+ constructor(toolName: string, toolCallId: string, args: unknown, options: ToolExecutionOptions | undefined, toolDefinition: ToolDef | undefined, ui: TUI, cwd: string, presentation?: ToolExecutionPresentation);
29
33
  updateArgs(args: unknown): void;
30
34
  markExecutionStarted(): void;
31
35
  setArgsComplete(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAM5D,OAAO,KAAK,EAAmD,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEtH,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,kBAAkB,CAAC,CAAiB;IAC5C,OAAO,CAAC,MAAM,CAAC,CAAsB;IACrC,OAAO,CAAC,WAAW,CAAC,CAAW;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAS;IAEtC,YACC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,oBAAoB,YAAK,EAClC,cAAc,EAAE,OAAO,GAAG,SAAS,EACnC,EAAE,EAAE,GAAG,EACP,GAAG,EAAE,MAAM,EAsBX;IAED,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAK9B;IAED,oBAAoB,IAAI,IAAI,CAK3B;IAED,eAAe,IAAI,IAAI,CAKtB;IAED,YAAY,CAAC,MAAM,EAAE,mBAAmB,EAAE,SAAS,UAAQ,GAAG,IAAI,CAUjE;IAED,aAAa,IAAI,IAAI,CAGpB;IAEQ,OAAO,IAAI,IAAI,CAGvB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAGnC;IAED,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAGjC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGtC;IAEQ,UAAU,IAAI,IAAI,CAK1B;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBvC;IAED,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,yBAAyB;IA6BjC,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,qBAAqB;CAK7B"}
1
+ {"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAO5D,OAAO,KAAK,EAAmD,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEtH,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8EAA8E;AAC9E,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,MAAM,CAAC;AAI3D,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,kBAAkB,CAAC,CAAiB;IAC5C,OAAO,CAAC,MAAM,CAAC,CAAsB;IACrC,OAAO,CAAC,WAAW,CAAC,CAAW;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAS;IAEtC,YACC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,oBAAoB,YAAK,EAClC,cAAc,EAAE,OAAO,GAAG,SAAS,EACnC,EAAE,EAAE,GAAG,EACP,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,yBAAqC,EAiCnD;IAED,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAK9B;IAED,oBAAoB,IAAI,IAAI,CAK3B;IAED,eAAe,IAAI,IAAI,CAKtB;IAED,YAAY,CAAC,MAAM,EAAE,mBAAmB,EAAE,SAAS,UAAQ,GAAG,IAAI,CAUjE;IAED,aAAa,IAAI,IAAI,CAGpB;IAEQ,OAAO,IAAI,IAAI,CAGvB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAGnC;IAED,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAGjC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGtC;IAEQ,UAAU,IAAI,IAAI,CAK1B;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBvC;IAED,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,yBAAyB;IA6BjC,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,qBAAqB;CAK7B"}
@@ -1,4 +1,5 @@
1
1
  import { Container, Spacer } from "@earendil-works/pi-tui";
2
+ import { GrokToolRow } from "../grok/tool-row.js";
2
3
  import { readToolProgress } from "../tool-progress.js";
3
4
  import { createBoundedRenderSignature } from "./render-signature.js";
4
5
  import { hasCompletedTodoTasks, TODO_STRIKE_FRAME_INTERVAL_MS, TODO_STRIKE_TOTAL_FRAMES } from "./todo-strike.js";
@@ -6,7 +7,7 @@ import { ToolExecutionImages } from "./tool-execution-images.js";
6
7
  import { ToolExecutionRenderer } from "./tool-execution-renderer.js";
7
8
  const PENDING_RENDER_FRAME_INTERVAL_MS = 80;
8
9
  export class ToolExecutionComponent extends Container {
9
- constructor(toolName, toolCallId, args, options = {}, toolDefinition, ui, cwd) {
10
+ constructor(toolName, toolCallId, args, options = {}, toolDefinition, ui, cwd, presentation = "classic") {
10
11
  super();
11
12
  this.expanded = false;
12
13
  this.isPartial = true;
@@ -17,18 +18,30 @@ export class ToolExecutionComponent extends Container {
17
18
  this.showImages = options.showImages ?? true;
18
19
  this.imageWidthCells = options.imageWidthCells ?? 60;
19
20
  this.ui = ui;
21
+ this.presentation = presentation;
20
22
  const initialState = this.createRenderState();
21
- this.renderer = new ToolExecutionRenderer(this.identity, initialState, () => {
22
- this.invalidate();
23
- this.ui.requestRender();
24
- });
25
- this.images = new ToolExecutionImages(() => {
26
- this.invalidateRenderCache();
27
- this.ui.requestRender();
28
- });
29
- this.addChild(new Spacer(1));
30
- this.addChild(this.renderer);
31
- this.addChild(this.images);
23
+ if (this.presentation === "grok") {
24
+ this.grokRow = new GrokToolRow({
25
+ toolName: this.identity.toolName,
26
+ isPartial: initialState.isPartial,
27
+ result: initialState.result,
28
+ });
29
+ this.addChild(new Spacer(1));
30
+ this.addChild(this.grokRow);
31
+ }
32
+ else {
33
+ this.renderer = new ToolExecutionRenderer(this.identity, initialState, () => {
34
+ this.invalidate();
35
+ this.ui.requestRender();
36
+ });
37
+ this.images = new ToolExecutionImages(() => {
38
+ this.invalidateRenderCache();
39
+ this.ui.requestRender();
40
+ });
41
+ this.addChild(new Spacer(1));
42
+ this.addChild(this.renderer);
43
+ this.addChild(this.images);
44
+ }
32
45
  this.updateSpinnerAnimation();
33
46
  this.updateDisplay();
34
47
  }
@@ -59,7 +72,7 @@ export class ToolExecutionComponent extends Container {
59
72
  this.updateSpinnerAnimation();
60
73
  this.updateTodoStrikeAnimation();
61
74
  this.updateDisplay();
62
- this.images.updateResult(result);
75
+ this.images?.updateResult(result);
63
76
  this.invalidateRenderCache();
64
77
  }
65
78
  stopAnimation() {
@@ -89,14 +102,18 @@ export class ToolExecutionComponent extends Container {
89
102
  this.updateDisplay();
90
103
  }
91
104
  render(width) {
105
+ if (this.presentation === "grok")
106
+ return super.render(width);
92
107
  const signature = this.createRenderSignature();
93
108
  if (this.cachedLines && this.cachedWidth === width && this.cachedSignature === signature) {
94
109
  return [...this.cachedLines];
95
110
  }
96
111
  let lines;
97
- if (this.renderer.hasRendererDefinition && this.renderer.renderShell === "self") {
98
- const contentLines = this.renderer.render(width);
99
- const imageLines = this.images.render(width);
112
+ const renderer = this.renderer;
113
+ const images = this.images;
114
+ if (renderer.hasRendererDefinition && renderer.renderShell === "self") {
115
+ const contentLines = renderer.render(width);
116
+ const imageLines = images.render(width);
100
117
  if (contentLines.length === 0 && imageLines.length === 0)
101
118
  return [];
102
119
  lines = contentLines.length > 0 ? ["", ...contentLines, ...imageLines] : imageLines;
@@ -116,11 +133,20 @@ export class ToolExecutionComponent extends Container {
116
133
  this.lastDisplaySignature = displaySignature;
117
134
  this.invalidateRenderCache();
118
135
  const state = this.createRenderState();
136
+ if (this.grokRow) {
137
+ this.grokRow.update({
138
+ toolName: this.identity.toolName,
139
+ isPartial: state.isPartial,
140
+ result: state.result,
141
+ });
142
+ return;
143
+ }
144
+ const renderer = this.renderer;
119
145
  this.renderer.update(state);
120
146
  this.images.updateOptions({
121
147
  showImages: state.showImages,
122
148
  maxWidthCells: this.imageWidthCells,
123
- showRendererFallback: this.renderer.hasResultRenderer,
149
+ showRendererFallback: renderer.hasResultRenderer,
124
150
  });
125
151
  }
126
152
  createRenderState() {
@@ -1 +1 @@
1
- {"version":3,"file":"tool-execution.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, Spacer, type TUI } from \"@earendil-works/pi-tui\";\nimport type { ToolDef } from \"../../../core/tools/index.ts\";\nimport { readToolProgress } from \"../tool-progress.ts\";\nimport { createBoundedRenderSignature } from \"./render-signature.ts\";\nimport { hasCompletedTodoTasks, TODO_STRIKE_FRAME_INTERVAL_MS, TODO_STRIKE_TOTAL_FRAMES } from \"./todo-strike.ts\";\nimport { ToolExecutionImages } from \"./tool-execution-images.ts\";\nimport { ToolExecutionRenderer } from \"./tool-execution-renderer.ts\";\nimport type { ToolExecutionIdentity, ToolExecutionRenderState, ToolExecutionResult } from \"./tool-execution-types.ts\";\n\nexport interface ToolExecutionOptions {\n\tshowImages?: boolean;\n\timageWidthCells?: number;\n}\n\nconst PENDING_RENDER_FRAME_INTERVAL_MS = 80;\n\nexport class ToolExecutionComponent extends Container {\n\tprivate readonly identity: ToolExecutionIdentity;\n\tprivate readonly ui: TUI;\n\tprivate readonly renderer: ToolExecutionRenderer;\n\tprivate readonly images: ToolExecutionImages;\n\tprivate args: unknown;\n\tprivate expanded = false;\n\tprivate showImages: boolean;\n\tprivate imageWidthCells: number;\n\tprivate isPartial = true;\n\tprivate executionStarted = false;\n\tprivate argsComplete = false;\n\tprivate spinnerFrame?: number;\n\tprivate spinnerInterval?: NodeJS.Timeout;\n\tprivate todoStrikeInterval?: NodeJS.Timeout;\n\tprivate result?: ToolExecutionResult;\n\tprivate cachedLines?: string[];\n\tprivate cachedSignature?: string;\n\tprivate cachedWidth?: number;\n\tprivate lastDisplaySignature?: string;\n\n\tconstructor(\n\t\ttoolName: string,\n\t\ttoolCallId: string,\n\t\targs: unknown,\n\t\toptions: ToolExecutionOptions = {},\n\t\ttoolDefinition: ToolDef | undefined,\n\t\tui: TUI,\n\t\tcwd: string,\n\t) {\n\t\tsuper();\n\t\tthis.identity = { toolName, toolCallId, cwd, toolDefinition };\n\t\tthis.args = args;\n\t\tthis.showImages = options.showImages ?? true;\n\t\tthis.imageWidthCells = options.imageWidthCells ?? 60;\n\t\tthis.ui = ui;\n\t\tconst initialState = this.createRenderState();\n\t\tthis.renderer = new ToolExecutionRenderer(this.identity, initialState, () => {\n\t\t\tthis.invalidate();\n\t\t\tthis.ui.requestRender();\n\t\t});\n\t\tthis.images = new ToolExecutionImages(() => {\n\t\t\tthis.invalidateRenderCache();\n\t\t\tthis.ui.requestRender();\n\t\t});\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(this.renderer);\n\t\tthis.addChild(this.images);\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t}\n\n\tupdateArgs(args: unknown): void {\n\t\tthis.args = args;\n\t\tthis.lastDisplaySignature = undefined;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t}\n\n\tmarkExecutionStarted(): void {\n\t\tthis.executionStarted = true;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t\tthis.ui.requestRender();\n\t}\n\n\tsetArgsComplete(): void {\n\t\tthis.argsComplete = true;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t\tthis.ui.requestRender();\n\t}\n\n\tupdateResult(result: ToolExecutionResult, isPartial = false): void {\n\t\tthis.result = result;\n\t\tthis.isPartial = isPartial;\n\t\tif (!isPartial) this.argsComplete = true;\n\t\tthis.lastDisplaySignature = undefined;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateTodoStrikeAnimation();\n\t\tthis.updateDisplay();\n\t\tthis.images.updateResult(result);\n\t\tthis.invalidateRenderCache();\n\t}\n\n\tstopAnimation(): void {\n\t\tthis.stopSpinnerAnimation();\n\t\tthis.stopTodoStrikeAnimation();\n\t}\n\n\toverride dispose(): void {\n\t\tthis.stopAnimation();\n\t\tsuper.dispose();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetShowImages(show: boolean): void {\n\t\tthis.showImages = show;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetImageWidthCells(width: number): void {\n\t\tthis.imageWidthCells = Math.max(1, Math.floor(width));\n\t\tthis.updateDisplay();\n\t}\n\n\toverride invalidate(): void {\n\t\tthis.invalidateRenderCache();\n\t\tsuper.invalidate();\n\t\tthis.lastDisplaySignature = undefined;\n\t\tthis.updateDisplay();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst signature = this.createRenderSignature();\n\t\tif (this.cachedLines && this.cachedWidth === width && this.cachedSignature === signature) {\n\t\t\treturn [...this.cachedLines];\n\t\t}\n\n\t\tlet lines: string[];\n\t\tif (this.renderer.hasRendererDefinition && this.renderer.renderShell === \"self\") {\n\t\t\tconst contentLines = this.renderer.render(width);\n\t\t\tconst imageLines = this.images.render(width);\n\t\t\tif (contentLines.length === 0 && imageLines.length === 0) return [];\n\t\t\tlines = contentLines.length > 0 ? [\"\", ...contentLines, ...imageLines] : imageLines;\n\t\t} else {\n\t\t\tlines = super.render(width);\n\t\t}\n\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedSignature = signature;\n\t\tthis.cachedLines = [...lines];\n\t\treturn lines;\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tconst displaySignature = this.createRenderSignature();\n\t\tif (this.lastDisplaySignature === displaySignature) return;\n\t\tthis.lastDisplaySignature = displaySignature;\n\t\tthis.invalidateRenderCache();\n\t\tconst state = this.createRenderState();\n\t\tthis.renderer.update(state);\n\t\tthis.images.updateOptions({\n\t\t\tshowImages: state.showImages,\n\t\t\tmaxWidthCells: this.imageWidthCells,\n\t\t\tshowRendererFallback: this.renderer.hasResultRenderer,\n\t\t});\n\t}\n\n\tprivate createRenderState(): ToolExecutionRenderState {\n\t\treturn {\n\t\t\targs: this.args,\n\t\t\texecutionStarted: this.executionStarted,\n\t\t\targsComplete: this.argsComplete,\n\t\t\tisPartial: this.isPartial,\n\t\t\texpanded: this.expanded,\n\t\t\tshowImages: this.showImages,\n\t\t\tspinnerFrame: this.spinnerFrame,\n\t\t\tresult: this.result,\n\t\t};\n\t}\n\n\tprivate createRenderSignature(): string {\n\t\treturn createBoundedRenderSignature({\n\t\t\t...this.createRenderState(),\n\t\t\timageWidthCells: this.imageWidthCells,\n\t\t\ttoolCallId: this.identity.toolCallId,\n\t\t\ttoolName: this.identity.toolName,\n\t\t});\n\t}\n\n\tprivate updateSpinnerAnimation(): void {\n\t\tconst isStreamingArgs = !this.argsComplete && [\"edit\", \"write\", \"apply_patch\"].includes(this.identity.toolName);\n\t\tconst isPartialTask = this.isPartial && this.identity.toolName === \"task\" && this.result !== undefined;\n\t\tconst isPartialProgress =\n\t\t\tthis.isPartial && this.result !== undefined && readToolProgress(this.result.details) !== undefined;\n\t\tif (isStreamingArgs || isPartialTask || isPartialProgress) this.startSpinnerAnimation();\n\t\telse this.stopSpinnerAnimation();\n\t}\n\n\tprivate updateTodoStrikeAnimation(): void {\n\t\tconst shouldAnimate =\n\t\t\tthis.identity.toolName === \"todo\" &&\n\t\t\tthis.executionStarted &&\n\t\t\t!this.isPartial &&\n\t\t\tthis.result !== undefined &&\n\t\t\t!this.result.isError &&\n\t\t\thasCompletedTodoTasks(this.result.details);\n\t\tif (!shouldAnimate) {\n\t\t\tthis.stopTodoStrikeAnimation();\n\t\t\treturn;\n\t\t}\n\t\tif (this.todoStrikeInterval) return;\n\n\t\tthis.spinnerFrame = 0;\n\t\tthis.todoStrikeInterval = setInterval(() => {\n\t\t\tconst next = (this.spinnerFrame ?? 0) + 1;\n\t\t\tif (next > TODO_STRIKE_TOTAL_FRAMES) {\n\t\t\t\tthis.stopTodoStrikeAnimation();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.spinnerFrame = next;\n\t\t\tthis.invalidateRenderCache();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t}, TODO_STRIKE_FRAME_INTERVAL_MS);\n\t\tthis.todoStrikeInterval.unref?.();\n\t}\n\n\tprivate stopTodoStrikeAnimation(): void {\n\t\tif (this.todoStrikeInterval) {\n\t\t\tclearInterval(this.todoStrikeInterval);\n\t\t\tthis.todoStrikeInterval = undefined;\n\t\t}\n\t\tif (!this.spinnerInterval && this.spinnerFrame !== undefined) {\n\t\t\tthis.spinnerFrame = undefined;\n\t\t\tthis.invalidateRenderCache();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t}\n\t}\n\n\tprivate startSpinnerAnimation(): void {\n\t\tif (this.spinnerInterval) return;\n\t\tthis.spinnerInterval = setInterval(() => {\n\t\t\tthis.spinnerFrame = ((this.spinnerFrame ?? -1) + 1) % 10;\n\t\t\tthis.invalidateRenderCache();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t}, PENDING_RENDER_FRAME_INTERVAL_MS);\n\t\tthis.spinnerInterval.unref?.();\n\t}\n\n\tprivate stopSpinnerAnimation(): void {\n\t\tif (!this.spinnerInterval) return;\n\t\tclearInterval(this.spinnerInterval);\n\t\tthis.spinnerInterval = undefined;\n\t\tif (!this.todoStrikeInterval) this.spinnerFrame = undefined;\n\t\tthis.invalidateRenderCache();\n\t}\n\n\tprivate invalidateRenderCache(): void {\n\t\tthis.cachedLines = undefined;\n\t\tthis.cachedSignature = undefined;\n\t\tthis.cachedWidth = undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"tool-execution.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, Spacer, type TUI } from \"@earendil-works/pi-tui\";\nimport type { ToolDef } from \"../../../core/tools/index.ts\";\nimport { GrokToolRow } from \"../grok/tool-row.ts\";\nimport { readToolProgress } from \"../tool-progress.ts\";\nimport { createBoundedRenderSignature } from \"./render-signature.ts\";\nimport { hasCompletedTodoTasks, TODO_STRIKE_FRAME_INTERVAL_MS, TODO_STRIKE_TOTAL_FRAMES } from \"./todo-strike.ts\";\nimport { ToolExecutionImages } from \"./tool-execution-images.ts\";\nimport { ToolExecutionRenderer } from \"./tool-execution-renderer.ts\";\nimport type { ToolExecutionIdentity, ToolExecutionRenderState, ToolExecutionResult } from \"./tool-execution-types.ts\";\n\nexport interface ToolExecutionOptions {\n\tshowImages?: boolean;\n\timageWidthCells?: number;\n}\n\n/** Visual shell chosen by interactive chrome; classic remains the default. */\nexport type ToolExecutionPresentation = \"classic\" | \"grok\";\n\nconst PENDING_RENDER_FRAME_INTERVAL_MS = 80;\n\nexport class ToolExecutionComponent extends Container {\n\tprivate readonly identity: ToolExecutionIdentity;\n\tprivate readonly ui: TUI;\n\tprivate readonly renderer: ToolExecutionRenderer | undefined;\n\tprivate readonly images: ToolExecutionImages | undefined;\n\tprivate readonly grokRow: GrokToolRow | undefined;\n\tprivate readonly presentation: ToolExecutionPresentation;\n\tprivate args: unknown;\n\tprivate expanded = false;\n\tprivate showImages: boolean;\n\tprivate imageWidthCells: number;\n\tprivate isPartial = true;\n\tprivate executionStarted = false;\n\tprivate argsComplete = false;\n\tprivate spinnerFrame?: number;\n\tprivate spinnerInterval?: NodeJS.Timeout;\n\tprivate todoStrikeInterval?: NodeJS.Timeout;\n\tprivate result?: ToolExecutionResult;\n\tprivate cachedLines?: string[];\n\tprivate cachedSignature?: string;\n\tprivate cachedWidth?: number;\n\tprivate lastDisplaySignature?: string;\n\n\tconstructor(\n\t\ttoolName: string,\n\t\ttoolCallId: string,\n\t\targs: unknown,\n\t\toptions: ToolExecutionOptions = {},\n\t\ttoolDefinition: ToolDef | undefined,\n\t\tui: TUI,\n\t\tcwd: string,\n\t\tpresentation: ToolExecutionPresentation = \"classic\",\n\t) {\n\t\tsuper();\n\t\tthis.identity = { toolName, toolCallId, cwd, toolDefinition };\n\t\tthis.args = args;\n\t\tthis.showImages = options.showImages ?? true;\n\t\tthis.imageWidthCells = options.imageWidthCells ?? 60;\n\t\tthis.ui = ui;\n\t\tthis.presentation = presentation;\n\t\tconst initialState = this.createRenderState();\n\t\tif (this.presentation === \"grok\") {\n\t\t\tthis.grokRow = new GrokToolRow({\n\t\t\t\ttoolName: this.identity.toolName,\n\t\t\t\tisPartial: initialState.isPartial,\n\t\t\t\tresult: initialState.result,\n\t\t\t});\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(this.grokRow);\n\t\t} else {\n\t\t\tthis.renderer = new ToolExecutionRenderer(this.identity, initialState, () => {\n\t\t\t\tthis.invalidate();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t});\n\t\t\tthis.images = new ToolExecutionImages(() => {\n\t\t\t\tthis.invalidateRenderCache();\n\t\t\t\tthis.ui.requestRender();\n\t\t\t});\n\t\t\tthis.addChild(new Spacer(1));\n\t\t\tthis.addChild(this.renderer);\n\t\t\tthis.addChild(this.images);\n\t\t}\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t}\n\n\tupdateArgs(args: unknown): void {\n\t\tthis.args = args;\n\t\tthis.lastDisplaySignature = undefined;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t}\n\n\tmarkExecutionStarted(): void {\n\t\tthis.executionStarted = true;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t\tthis.ui.requestRender();\n\t}\n\n\tsetArgsComplete(): void {\n\t\tthis.argsComplete = true;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateDisplay();\n\t\tthis.ui.requestRender();\n\t}\n\n\tupdateResult(result: ToolExecutionResult, isPartial = false): void {\n\t\tthis.result = result;\n\t\tthis.isPartial = isPartial;\n\t\tif (!isPartial) this.argsComplete = true;\n\t\tthis.lastDisplaySignature = undefined;\n\t\tthis.updateSpinnerAnimation();\n\t\tthis.updateTodoStrikeAnimation();\n\t\tthis.updateDisplay();\n\t\tthis.images?.updateResult(result);\n\t\tthis.invalidateRenderCache();\n\t}\n\n\tstopAnimation(): void {\n\t\tthis.stopSpinnerAnimation();\n\t\tthis.stopTodoStrikeAnimation();\n\t}\n\n\toverride dispose(): void {\n\t\tthis.stopAnimation();\n\t\tsuper.dispose();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetShowImages(show: boolean): void {\n\t\tthis.showImages = show;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetImageWidthCells(width: number): void {\n\t\tthis.imageWidthCells = Math.max(1, Math.floor(width));\n\t\tthis.updateDisplay();\n\t}\n\n\toverride invalidate(): void {\n\t\tthis.invalidateRenderCache();\n\t\tsuper.invalidate();\n\t\tthis.lastDisplaySignature = undefined;\n\t\tthis.updateDisplay();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tif (this.presentation === \"grok\") return super.render(width);\n\n\t\tconst signature = this.createRenderSignature();\n\t\tif (this.cachedLines && this.cachedWidth === width && this.cachedSignature === signature) {\n\t\t\treturn [...this.cachedLines];\n\t\t}\n\n\t\tlet lines: string[];\n\t\tconst renderer = this.renderer!;\n\t\tconst images = this.images!;\n\t\tif (renderer.hasRendererDefinition && renderer.renderShell === \"self\") {\n\t\t\tconst contentLines = renderer.render(width);\n\t\t\tconst imageLines = images.render(width);\n\t\t\tif (contentLines.length === 0 && imageLines.length === 0) return [];\n\t\t\tlines = contentLines.length > 0 ? [\"\", ...contentLines, ...imageLines] : imageLines;\n\t\t} else {\n\t\t\tlines = super.render(width);\n\t\t}\n\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedSignature = signature;\n\t\tthis.cachedLines = [...lines];\n\t\treturn lines;\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tconst displaySignature = this.createRenderSignature();\n\t\tif (this.lastDisplaySignature === displaySignature) return;\n\t\tthis.lastDisplaySignature = displaySignature;\n\t\tthis.invalidateRenderCache();\n\t\tconst state = this.createRenderState();\n\t\tif (this.grokRow) {\n\t\t\tthis.grokRow.update({\n\t\t\t\ttoolName: this.identity.toolName,\n\t\t\t\tisPartial: state.isPartial,\n\t\t\t\tresult: state.result,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tconst renderer = this.renderer!;\n\t\tthis.renderer!.update(state);\n\t\tthis.images!.updateOptions({\n\t\t\tshowImages: state.showImages,\n\t\t\tmaxWidthCells: this.imageWidthCells,\n\t\t\tshowRendererFallback: renderer.hasResultRenderer,\n\t\t});\n\t}\n\n\tprivate createRenderState(): ToolExecutionRenderState {\n\t\treturn {\n\t\t\targs: this.args,\n\t\t\texecutionStarted: this.executionStarted,\n\t\t\targsComplete: this.argsComplete,\n\t\t\tisPartial: this.isPartial,\n\t\t\texpanded: this.expanded,\n\t\t\tshowImages: this.showImages,\n\t\t\tspinnerFrame: this.spinnerFrame,\n\t\t\tresult: this.result,\n\t\t};\n\t}\n\n\tprivate createRenderSignature(): string {\n\t\treturn createBoundedRenderSignature({\n\t\t\t...this.createRenderState(),\n\t\t\timageWidthCells: this.imageWidthCells,\n\t\t\ttoolCallId: this.identity.toolCallId,\n\t\t\ttoolName: this.identity.toolName,\n\t\t});\n\t}\n\n\tprivate updateSpinnerAnimation(): void {\n\t\tconst isStreamingArgs = !this.argsComplete && [\"edit\", \"write\", \"apply_patch\"].includes(this.identity.toolName);\n\t\tconst isPartialTask = this.isPartial && this.identity.toolName === \"task\" && this.result !== undefined;\n\t\tconst isPartialProgress =\n\t\t\tthis.isPartial && this.result !== undefined && readToolProgress(this.result.details) !== undefined;\n\t\tif (isStreamingArgs || isPartialTask || isPartialProgress) this.startSpinnerAnimation();\n\t\telse this.stopSpinnerAnimation();\n\t}\n\n\tprivate updateTodoStrikeAnimation(): void {\n\t\tconst shouldAnimate =\n\t\t\tthis.identity.toolName === \"todo\" &&\n\t\t\tthis.executionStarted &&\n\t\t\t!this.isPartial &&\n\t\t\tthis.result !== undefined &&\n\t\t\t!this.result.isError &&\n\t\t\thasCompletedTodoTasks(this.result.details);\n\t\tif (!shouldAnimate) {\n\t\t\tthis.stopTodoStrikeAnimation();\n\t\t\treturn;\n\t\t}\n\t\tif (this.todoStrikeInterval) return;\n\n\t\tthis.spinnerFrame = 0;\n\t\tthis.todoStrikeInterval = setInterval(() => {\n\t\t\tconst next = (this.spinnerFrame ?? 0) + 1;\n\t\t\tif (next > TODO_STRIKE_TOTAL_FRAMES) {\n\t\t\t\tthis.stopTodoStrikeAnimation();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.spinnerFrame = next;\n\t\t\tthis.invalidateRenderCache();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t}, TODO_STRIKE_FRAME_INTERVAL_MS);\n\t\tthis.todoStrikeInterval.unref?.();\n\t}\n\n\tprivate stopTodoStrikeAnimation(): void {\n\t\tif (this.todoStrikeInterval) {\n\t\t\tclearInterval(this.todoStrikeInterval);\n\t\t\tthis.todoStrikeInterval = undefined;\n\t\t}\n\t\tif (!this.spinnerInterval && this.spinnerFrame !== undefined) {\n\t\t\tthis.spinnerFrame = undefined;\n\t\t\tthis.invalidateRenderCache();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t}\n\t}\n\n\tprivate startSpinnerAnimation(): void {\n\t\tif (this.spinnerInterval) return;\n\t\tthis.spinnerInterval = setInterval(() => {\n\t\t\tthis.spinnerFrame = ((this.spinnerFrame ?? -1) + 1) % 10;\n\t\t\tthis.invalidateRenderCache();\n\t\t\tthis.updateDisplay();\n\t\t\tthis.ui.requestRender();\n\t\t}, PENDING_RENDER_FRAME_INTERVAL_MS);\n\t\tthis.spinnerInterval.unref?.();\n\t}\n\n\tprivate stopSpinnerAnimation(): void {\n\t\tif (!this.spinnerInterval) return;\n\t\tclearInterval(this.spinnerInterval);\n\t\tthis.spinnerInterval = undefined;\n\t\tif (!this.todoStrikeInterval) this.spinnerFrame = undefined;\n\t\tthis.invalidateRenderCache();\n\t}\n\n\tprivate invalidateRenderCache(): void {\n\t\tthis.cachedLines = undefined;\n\t\tthis.cachedSignature = undefined;\n\t\tthis.cachedWidth = undefined;\n\t}\n}\n"]}
@@ -0,0 +1,22 @@
1
+ export type ChromeTextStyle = (text: string) => string;
2
+ /**
3
+ * Chrome-only semantic tokens. Foreground/status tokens delegate to the active
4
+ * interactive theme; the panel token is the theme export's card background.
5
+ * This keeps grok chrome coherent for grok-day and custom themes instead of
6
+ * embedding the grok-night capture values in components.
7
+ */
8
+ export interface GrokChromeTokens {
9
+ readonly inputBorder: ChromeTextStyle;
10
+ readonly inputInterior: ChromeTextStyle;
11
+ readonly surface: ChromeTextStyle;
12
+ readonly cardBorder: ChromeTextStyle;
13
+ readonly modelLabel: ChromeTextStyle;
14
+ readonly cwd: ChromeTextStyle;
15
+ readonly primaryText: ChromeTextStyle;
16
+ readonly mutedText: ChromeTextStyle;
17
+ readonly success: ChromeTextStyle;
18
+ readonly error: ChromeTextStyle;
19
+ readonly warning: ChromeTextStyle;
20
+ }
21
+ export declare function getGrokChromeTokens(): GrokChromeTokens;
22
+ //# sourceMappingURL=chrome-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-tokens.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/grok/chrome-tokens.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CAClC;AAUD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAiBtD"}
@@ -0,0 +1,27 @@
1
+ import { getThemeExportColors, theme } from "../theme/theme.js";
2
+ function backgroundFromThemeExport(hex) {
3
+ const match = /^#([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i.exec(hex);
4
+ if (!match)
5
+ return undefined;
6
+ const [, red, green, blue] = match;
7
+ return (text) => `\x1b[48;2;${parseInt(red, 16)};${parseInt(green, 16)};${parseInt(blue, 16)}m${text}\x1b[49m`;
8
+ }
9
+ export function getGrokChromeTokens() {
10
+ const themeExport = getThemeExportColors();
11
+ const panelBackground = themeExport.cardBg;
12
+ const pageBackground = themeExport.pageBg;
13
+ return {
14
+ inputBorder: (text) => theme.fg("borderAccent", text),
15
+ inputInterior: backgroundFromThemeExport(panelBackground ?? "") ?? ((text) => theme.bg("toolPendingBg", text)),
16
+ surface: backgroundFromThemeExport(pageBackground ?? "") ?? ((text) => text),
17
+ cardBorder: (text) => theme.fg("borderMuted", text),
18
+ modelLabel: (text) => theme.fg("thinkingText", text),
19
+ cwd: (text) => theme.fg("dim", text),
20
+ primaryText: (text) => theme.fg("text", text),
21
+ mutedText: (text) => theme.fg("muted", text),
22
+ success: (text) => theme.fg("success", text),
23
+ error: (text) => theme.fg("error", text),
24
+ warning: (text) => theme.fg("warning", text),
25
+ };
26
+ }
27
+ //# sourceMappingURL=chrome-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-tokens.js","sourceRoot":"","sources":["../../../../src/modes/interactive/grok/chrome-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAwBhE,SAAS,yBAAyB,CAAC,GAAW;IAC7C,MAAM,KAAK,GAAG,0CAA0C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACnC,OAAO,CAAC,IAAY,EAAE,EAAE,CACvB,aAAa,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,UAAU,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,mBAAmB;IAClC,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC;IAC3C,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;IAC1C,OAAO;QACN,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC;QACrD,aAAa,EAAE,yBAAyB,CAAC,eAAe,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC9G,OAAO,EAAE,yBAAyB,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAC5E,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC;QACnD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC;QACpD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;QACpC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;QAC7C,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAC5C,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;QAC5C,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QACxC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;KAC5C,CAAC;AACH,CAAC","sourcesContent":["import { getThemeExportColors, theme } from \"../theme/theme.ts\";\n\nexport type ChromeTextStyle = (text: string) => string;\n\n/**\n * Chrome-only semantic tokens. Foreground/status tokens delegate to the active\n * interactive theme; the panel token is the theme export's card background.\n * This keeps grok chrome coherent for grok-day and custom themes instead of\n * embedding the grok-night capture values in components.\n */\nexport interface GrokChromeTokens {\n\treadonly inputBorder: ChromeTextStyle;\n\treadonly inputInterior: ChromeTextStyle;\n\treadonly surface: ChromeTextStyle;\n\treadonly cardBorder: ChromeTextStyle;\n\treadonly modelLabel: ChromeTextStyle;\n\treadonly cwd: ChromeTextStyle;\n\treadonly primaryText: ChromeTextStyle;\n\treadonly mutedText: ChromeTextStyle;\n\treadonly success: ChromeTextStyle;\n\treadonly error: ChromeTextStyle;\n\treadonly warning: ChromeTextStyle;\n}\n\nfunction backgroundFromThemeExport(hex: string): ChromeTextStyle | undefined {\n\tconst match = /^#([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})$/i.exec(hex);\n\tif (!match) return undefined;\n\tconst [, red, green, blue] = match;\n\treturn (text: string) =>\n\t\t`\\x1b[48;2;${parseInt(red, 16)};${parseInt(green, 16)};${parseInt(blue, 16)}m${text}\\x1b[49m`;\n}\n\nexport function getGrokChromeTokens(): GrokChromeTokens {\n\tconst themeExport = getThemeExportColors();\n\tconst panelBackground = themeExport.cardBg;\n\tconst pageBackground = themeExport.pageBg;\n\treturn {\n\t\tinputBorder: (text) => theme.fg(\"borderAccent\", text),\n\t\tinputInterior: backgroundFromThemeExport(panelBackground ?? \"\") ?? ((text) => theme.bg(\"toolPendingBg\", text)),\n\t\tsurface: backgroundFromThemeExport(pageBackground ?? \"\") ?? ((text) => text),\n\t\tcardBorder: (text) => theme.fg(\"borderMuted\", text),\n\t\tmodelLabel: (text) => theme.fg(\"thinkingText\", text),\n\t\tcwd: (text) => theme.fg(\"dim\", text),\n\t\tprimaryText: (text) => theme.fg(\"text\", text),\n\t\tmutedText: (text) => theme.fg(\"muted\", text),\n\t\tsuccess: (text) => theme.fg(\"success\", text),\n\t\terror: (text) => theme.fg(\"error\", text),\n\t\twarning: (text) => theme.fg(\"warning\", text),\n\t};\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import type { Component, EditorOptions, EditorTheme, TUI } from "@earendil-works/pi-tui";
2
+ import type { AgentSession } from "../../../core/agent-session.ts";
3
+ import type { WorkingIndicatorOptions } from "../../../core/extensions/index.ts";
4
+ import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provider.ts";
5
+ import type { KeybindingsManager } from "../../../core/keybindings.ts";
6
+ import { CustomEditor } from "../components/custom-editor.ts";
7
+ import { WorkingStatusIndicator } from "../components/status-indicator.ts";
8
+ import type { ToolExecutionPresentation } from "../components/tool-execution.ts";
9
+ export interface InteractiveFooter extends Component {
10
+ setSession(session: AgentSession): void;
11
+ setAutoCompactEnabled(enabled: boolean): void;
12
+ invalidate(): void;
13
+ dispose(): void;
14
+ }
15
+ export type EditorBorderContext = {
16
+ readonly isBashMode: boolean;
17
+ readonly thinkingLevel: string;
18
+ };
19
+ /**
20
+ * Mode-owned chrome seam for InteractiveMode. Extensions continue to own their
21
+ * editor factory; this strategy only creates and decorates the base editor.
22
+ */
23
+ export interface InteractiveChrome {
24
+ readonly toolPresentation: ToolExecutionPresentation;
25
+ createBaseEditor(context: {
26
+ ui: TUI;
27
+ keybindings: KeybindingsManager;
28
+ editorOptions: EditorOptions;
29
+ }): CustomEditor;
30
+ getEditorTheme(): EditorTheme;
31
+ createFooter(session: AgentSession, footerData: ReadonlyFooterDataProvider): InteractiveFooter;
32
+ createWelcomeContent(appName: string, version: string): Component;
33
+ createWorkingIndicator(ui: TUI, message: string, indicator?: WorkingIndicatorOptions): WorkingStatusIndicator;
34
+ getEditorBorderColor(context: EditorBorderContext): (text: string) => string;
35
+ arrangeRoot(children: readonly Component[], ui?: TUI): Component[];
36
+ }
37
+ export declare class GrokChrome implements InteractiveChrome {
38
+ readonly toolPresentation: "grok";
39
+ createBaseEditor({ ui, keybindings, editorOptions, }: {
40
+ ui: TUI;
41
+ keybindings: KeybindingsManager;
42
+ editorOptions: EditorOptions;
43
+ }): CustomEditor;
44
+ getEditorTheme(): EditorTheme;
45
+ createFooter(session: AgentSession, footerData: ReadonlyFooterDataProvider): InteractiveFooter;
46
+ createWelcomeContent(appName: string, version: string): Component;
47
+ createWorkingIndicator(ui: TUI, message: string, indicator?: WorkingIndicatorOptions): WorkingStatusIndicator;
48
+ getEditorBorderColor(_context: EditorBorderContext): (text: string) => string;
49
+ arrangeRoot(children: readonly Component[], ui?: TUI): Component[];
50
+ }
51
+ //# sourceMappingURL=chrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/grok/chrome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAQjF,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IACnD,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9C,UAAU,IAAI,IAAI,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;IACrD,gBAAgB,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,GAAG,CAAC;QAAC,WAAW,EAAE,kBAAkB,CAAC;QAAC,aAAa,EAAE,aAAa,CAAA;KAAE,GAAG,YAAY,CAAC;IACpH,cAAc,IAAI,WAAW,CAAC;IAC9B,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,0BAA0B,GAAG,iBAAiB,CAAC;IAC/F,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAClE,sBAAsB,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAAC;IAC9G,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,WAAW,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,SAAS,EAAE,CAAC;CACnE;AA8DD,qBAAa,UAAW,YAAW,iBAAiB;IACnD,QAAQ,CAAC,gBAAgB,EAAG,MAAM,CAAU;IAE5C,gBAAgB,CAAC,EAChB,EAAE,EACF,WAAW,EACX,aAAa,GACb,EAAE;QACF,EAAE,EAAE,GAAG,CAAC;QACR,WAAW,EAAE,kBAAkB,CAAC;QAChC,aAAa,EAAE,aAAa,CAAC;KAC7B,GAAG,YAAY,CAEf;IAED,cAAc,IAAI,WAAW,CAgB5B;IAED,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,0BAA0B,GAAG,iBAAiB,CAE7F;IAED,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAEhE;IAED,sBAAsB,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAM5G;IAED,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAE5E;IAED,WAAW,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,SAAS,EAAE,CAWjE;CACD"}