@code-yeongyu/senpi 2026.7.25 → 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 (575) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +1 -1
  3. package/dist/beta/omo-local-update.d.ts +207 -0
  4. package/dist/beta/omo-local-update.d.ts.map +1 -0
  5. package/dist/beta/omo-local-update.js +708 -0
  6. package/dist/beta/omo-local-update.js.map +1 -0
  7. package/dist/cli/args.d.ts +4 -16
  8. package/dist/cli/args.d.ts.map +1 -1
  9. package/dist/cli/args.js +9 -25
  10. package/dist/cli/args.js.map +1 -1
  11. package/dist/cli/grok-neo-gate.d.ts +12 -0
  12. package/dist/cli/grok-neo-gate.d.ts.map +1 -0
  13. package/dist/cli/grok-neo-gate.js +18 -0
  14. package/dist/cli/grok-neo-gate.js.map +1 -0
  15. package/dist/cli-main.js +4 -0
  16. package/dist/cli-main.js.map +1 -1
  17. package/dist/cli.js +2 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/core/agent-session-runtime.d.ts +2 -0
  20. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  21. package/dist/core/agent-session-runtime.js +33 -8
  22. package/dist/core/agent-session-runtime.js.map +1 -1
  23. package/dist/core/agent-session.d.ts +22 -3
  24. package/dist/core/agent-session.d.ts.map +1 -1
  25. package/dist/core/agent-session.js +202 -58
  26. package/dist/core/agent-session.js.map +1 -1
  27. package/dist/core/auth-providers.d.ts +2 -2
  28. package/dist/core/auth-providers.js +2 -2
  29. package/dist/core/auth-providers.js.map +1 -1
  30. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/bash-timeout/timeout.js +3 -2
  32. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  33. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/compaction/index.js +30 -2
  35. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  36. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/compaction/speculative.js +28 -0
  38. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  39. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/config-reload/index.js +20 -17
  41. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  42. package/dist/core/extensions/builtin/config-reload/log.d.ts +4 -1
  43. package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/config-reload/log.js +3 -0
  45. package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
  46. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts +15 -0
  47. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -0
  48. package/dist/core/extensions/builtin/config-reload/routine-settings.js +102 -0
  49. package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -0
  50. package/dist/core/extensions/builtin/goal/command-registration.js +2 -2
  51. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  52. package/dist/core/extensions/builtin/goal/format.d.ts +1 -1
  53. package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/goal/format.js +9 -2
  55. package/dist/core/extensions/builtin/goal/format.js.map +1 -1
  56. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/goal/index.js +38 -23
  58. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  59. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +6 -0
  60. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -0
  61. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +19 -0
  62. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -0
  63. package/dist/core/extensions/builtin/goal/persistence.d.ts +6 -0
  64. package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -0
  65. package/dist/core/extensions/builtin/goal/persistence.js +141 -0
  66. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -0
  67. package/dist/core/extensions/builtin/goal/store.d.ts +7 -3
  68. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/goal/store.js +66 -181
  70. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  71. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
  72. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/goal/tool-registration.js +26 -15
  74. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  75. package/dist/core/extensions/builtin/goal/transitions.d.ts +3 -0
  76. package/dist/core/extensions/builtin/goal/transitions.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/goal/transitions.js +45 -0
  78. package/dist/core/extensions/builtin/goal/transitions.js.map +1 -0
  79. package/dist/core/extensions/builtin/goal/types.d.ts +10 -4
  80. package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/goal/types.js +2 -2
  82. package/dist/core/extensions/builtin/goal/types.js.map +1 -1
  83. package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/goal/ui.js +2 -0
  85. package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
  86. package/dist/core/extensions/builtin/goal/validation.d.ts +8 -1
  87. package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/goal/validation.js +24 -12
  89. package/dist/core/extensions/builtin/goal/validation.js.map +1 -1
  90. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  91. package/dist/core/extensions/builtin/index.js +0 -2
  92. package/dist/core/extensions/builtin/index.js.map +1 -1
  93. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/mcp/index.js +8 -5
  95. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  96. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  97. package/dist/core/extensions/builtin/permission-system/parsers.js +1 -0
  98. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  99. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +48 -0
  100. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +88 -64
  102. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  103. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  104. package/dist/core/extensions/builtin/terminal/extension.js +32 -0
  105. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  106. package/dist/core/extensions/builtin/terminal/index.d.ts +1 -1
  107. package/dist/core/extensions/builtin/terminal/index.d.ts.map +1 -1
  108. package/dist/core/extensions/builtin/terminal/index.js +1 -1
  109. package/dist/core/extensions/builtin/terminal/index.js.map +1 -1
  110. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +29 -0
  111. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -0
  112. package/dist/core/extensions/builtin/terminal/monitor-notify.js +185 -0
  113. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -0
  114. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +35 -0
  115. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -0
  116. package/dist/core/extensions/builtin/terminal/monitor-registry.js +98 -0
  117. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -0
  118. package/dist/core/extensions/builtin/terminal/notify.d.ts +9 -0
  119. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/terminal/notify.js +30 -14
  121. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  122. package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
  123. package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/terminal/prompt.js +13 -5
  125. package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
  126. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -12
  127. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/terminal/runtime-session.js +4 -59
  129. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  130. package/dist/core/extensions/builtin/terminal/settings.d.ts +8 -0
  131. package/dist/core/extensions/builtin/terminal/settings.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/terminal/settings.js +16 -2
  133. package/dist/core/extensions/builtin/terminal/settings.js.map +1 -1
  134. package/dist/core/extensions/builtin/terminal/shared.d.ts +2 -2
  135. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  136. package/dist/core/extensions/builtin/terminal/shared.js +2 -1
  137. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  138. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +10 -4
  139. package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/terminal/tools/bash-output.js +17 -96
  141. package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
  142. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -0
  143. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  144. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  145. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +41 -0
  146. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -0
  147. package/dist/core/extensions/builtin/terminal/tools/monitor.js +97 -0
  148. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -0
  149. package/dist/core/extensions/builtin/terminal/tools/render.d.ts +3 -0
  150. package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
  151. package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
  152. package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
  153. package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts +19 -0
  154. package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts.map +1 -0
  155. package/dist/core/extensions/builtin/todotools/fuzzy-match.js +70 -0
  156. package/dist/core/extensions/builtin/todotools/fuzzy-match.js.map +1 -0
  157. package/dist/core/extensions/builtin/todotools/normalize.d.ts +8 -0
  158. package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -0
  159. package/dist/core/extensions/builtin/todotools/normalize.js +174 -0
  160. package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -0
  161. package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
  162. package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/todotools/prompt.js +4 -2
  164. package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
  165. package/dist/core/extensions/builtin/todotools/state.d.ts +9 -8
  166. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/todotools/state.js +99 -48
  168. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  169. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +1 -1
  170. package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/todotools/tools/todo.js +65 -38
  172. package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
  173. package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
  174. package/dist/core/extensions/builtin/websearch/index.js +2 -4
  175. package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
  176. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
  177. package/dist/core/extensions/builtin/websearch/websearch/config.js +4 -1
  178. package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
  179. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/websearch/websearch/native.js +2 -4
  181. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  182. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  183. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +20 -8
  184. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  185. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +6 -1
  186. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/websearch/websearch/search.js +15 -11
  188. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  189. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/websearch/websearch/tool.js +5 -10
  191. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  192. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -0
  193. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  194. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  195. package/dist/core/extensions/loader.d.ts.map +1 -1
  196. package/dist/core/extensions/loader.js +12 -0
  197. package/dist/core/extensions/loader.js.map +1 -1
  198. package/dist/core/extensions/runner.d.ts +5 -0
  199. package/dist/core/extensions/runner.d.ts.map +1 -1
  200. package/dist/core/extensions/runner.js +12 -1
  201. package/dist/core/extensions/runner.js.map +1 -1
  202. package/dist/core/extensions/types.d.ts +25 -1
  203. package/dist/core/extensions/types.d.ts.map +1 -1
  204. package/dist/core/extensions/types.js.map +1 -1
  205. package/dist/core/keybindings.d.ts +0 -5
  206. package/dist/core/keybindings.d.ts.map +1 -1
  207. package/dist/core/keybindings.js +0 -2
  208. package/dist/core/keybindings.js.map +1 -1
  209. package/dist/core/messages.d.ts +32 -0
  210. package/dist/core/messages.d.ts.map +1 -1
  211. package/dist/core/messages.js +91 -0
  212. package/dist/core/messages.js.map +1 -1
  213. package/dist/core/model-resolver.d.ts +10 -1
  214. package/dist/core/model-resolver.d.ts.map +1 -1
  215. package/dist/core/model-resolver.js +13 -3
  216. package/dist/core/model-resolver.js.map +1 -1
  217. package/dist/core/model-runtime.d.ts +2 -0
  218. package/dist/core/model-runtime.d.ts.map +1 -1
  219. package/dist/core/model-runtime.js +4 -3
  220. package/dist/core/model-runtime.js.map +1 -1
  221. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  222. package/dist/core/remote-catalog-provider.js +19 -1
  223. package/dist/core/remote-catalog-provider.js.map +1 -1
  224. package/dist/core/resource-loader.d.ts +9 -0
  225. package/dist/core/resource-loader.d.ts.map +1 -1
  226. package/dist/core/resource-loader.js +13 -2
  227. package/dist/core/resource-loader.js.map +1 -1
  228. package/dist/core/retry-fallback/controller.d.ts +7 -0
  229. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  230. package/dist/core/retry-fallback/controller.js +13 -0
  231. package/dist/core/retry-fallback/controller.js.map +1 -1
  232. package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
  233. package/dist/core/retry-fallback/cooldown.js +5 -0
  234. package/dist/core/retry-fallback/cooldown.js.map +1 -1
  235. package/dist/core/sdk.d.ts.map +1 -1
  236. package/dist/core/sdk.js +11 -35
  237. package/dist/core/sdk.js.map +1 -1
  238. package/dist/core/settings-manager.d.ts +12 -16
  239. package/dist/core/settings-manager.d.ts.map +1 -1
  240. package/dist/core/settings-manager.js +10 -13
  241. package/dist/core/settings-manager.js.map +1 -1
  242. package/dist/core/slash-commands.d.ts.map +1 -1
  243. package/dist/core/slash-commands.js +1 -0
  244. package/dist/core/slash-commands.js.map +1 -1
  245. package/dist/core/thinking-levels.d.ts.map +1 -1
  246. package/dist/core/thinking-levels.js +9 -2
  247. package/dist/core/thinking-levels.js.map +1 -1
  248. package/dist/core/timings.d.ts +7 -2
  249. package/dist/core/timings.d.ts.map +1 -1
  250. package/dist/core/timings.js +11 -0
  251. package/dist/core/timings.js.map +1 -1
  252. package/dist/extensions/llama/provider.d.ts.map +1 -1
  253. package/dist/extensions/llama/provider.js +6 -0
  254. package/dist/extensions/llama/provider.js.map +1 -1
  255. package/dist/inspector-policy.d.ts +22 -0
  256. package/dist/inspector-policy.d.ts.map +1 -0
  257. package/dist/inspector-policy.js +84 -0
  258. package/dist/inspector-policy.js.map +1 -0
  259. package/dist/main.d.ts +6 -0
  260. package/dist/main.d.ts.map +1 -1
  261. package/dist/main.js +20 -23
  262. package/dist/main.js.map +1 -1
  263. package/dist/modes/app-server/runtime.d.ts.map +1 -1
  264. package/dist/modes/app-server/runtime.js +1 -0
  265. package/dist/modes/app-server/runtime.js.map +1 -1
  266. package/dist/modes/app-server/threads/goal-handlers.js +4 -2
  267. package/dist/modes/app-server/threads/goal-handlers.js.map +1 -1
  268. package/dist/modes/app-server/threads/goal-wire.d.ts.map +1 -1
  269. package/dist/modes/app-server/threads/goal-wire.js +1 -0
  270. package/dist/modes/app-server/threads/goal-wire.js.map +1 -1
  271. package/dist/modes/app-server/threads/handlers.d.ts +1 -0
  272. package/dist/modes/app-server/threads/handlers.d.ts.map +1 -1
  273. package/dist/modes/app-server/threads/handlers.js +2 -0
  274. package/dist/modes/app-server/threads/handlers.js.map +1 -1
  275. package/dist/modes/app-server/threads/turn-runtime.d.ts +1 -0
  276. package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
  277. package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
  278. package/dist/modes/app-server/threads/turns.d.ts.map +1 -1
  279. package/dist/modes/app-server/threads/turns.js +47 -3
  280. package/dist/modes/app-server/threads/turns.js.map +1 -1
  281. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  282. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/custom-message.js +9 -2
  284. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  285. package/dist/modes/interactive/components/status-indicator.d.ts +1 -0
  286. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/status-indicator.js +29 -4
  288. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  289. package/dist/modes/interactive/components/tool-execution.d.ts +5 -1
  290. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  291. package/dist/modes/interactive/components/tool-execution.js +43 -17
  292. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  293. package/dist/modes/interactive/grok/chrome-tokens.d.ts +22 -0
  294. package/dist/modes/interactive/grok/chrome-tokens.d.ts.map +1 -0
  295. package/dist/modes/interactive/grok/chrome-tokens.js +27 -0
  296. package/dist/modes/interactive/grok/chrome-tokens.js.map +1 -0
  297. package/dist/modes/interactive/grok/chrome.d.ts +51 -0
  298. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -0
  299. package/dist/modes/interactive/grok/chrome.js +105 -0
  300. package/dist/modes/interactive/grok/chrome.js.map +1 -0
  301. package/dist/modes/interactive/grok/footer.d.ts +14 -0
  302. package/dist/modes/interactive/grok/footer.d.ts.map +1 -0
  303. package/dist/modes/interactive/grok/footer.js +27 -0
  304. package/dist/modes/interactive/grok/footer.js.map +1 -0
  305. package/dist/modes/interactive/grok/input-card.d.ts +9 -0
  306. package/dist/modes/interactive/grok/input-card.d.ts.map +1 -0
  307. package/dist/modes/interactive/grok/input-card.js +30 -0
  308. package/dist/modes/interactive/grok/input-card.js.map +1 -0
  309. package/dist/modes/interactive/grok/palette.d.ts +145 -0
  310. package/dist/modes/interactive/grok/palette.d.ts.map +1 -0
  311. package/dist/modes/interactive/grok/palette.js +92 -0
  312. package/dist/modes/interactive/grok/palette.js.map +1 -0
  313. package/dist/modes/interactive/grok/tool-row.d.ts +17 -0
  314. package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -0
  315. package/dist/modes/interactive/grok/tool-row.js +26 -0
  316. package/dist/modes/interactive/grok/tool-row.js.map +1 -0
  317. package/dist/modes/interactive/grok/welcome-card.d.ts +10 -0
  318. package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -0
  319. package/dist/modes/interactive/grok/welcome-card.js +30 -0
  320. package/dist/modes/interactive/grok/welcome-card.js.map +1 -0
  321. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  322. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  323. package/dist/modes/interactive/interactive-mode.js +117 -54
  324. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  325. package/dist/modes/interactive/theme/grok-day.json +77 -0
  326. package/dist/modes/interactive/theme/grok-night.json +93 -0
  327. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  328. package/dist/modes/interactive/theme/theme.js +4 -0
  329. package/dist/modes/interactive/theme/theme.js.map +1 -1
  330. package/dist/modes/rpc/connection-handler.d.ts +3 -3
  331. package/dist/modes/rpc/connection-handler.js +6 -6
  332. package/dist/modes/rpc/connection-handler.js.map +1 -1
  333. package/dist/modes/rpc/custom-capability.d.ts +6 -7
  334. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  335. package/dist/modes/rpc/custom-capability.js +6 -7
  336. package/dist/modes/rpc/custom-capability.js.map +1 -1
  337. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  338. package/dist/modes/rpc/rpc-mode.js +5 -5
  339. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  340. package/dist/package-manager-cli.d.ts.map +1 -1
  341. package/dist/package-manager-cli.js +11 -0
  342. package/dist/package-manager-cli.js.map +1 -1
  343. package/dist/senpi +2 -0
  344. package/docs/docs.json +4 -0
  345. package/docs/environment-variables.md +1 -0
  346. package/docs/extensions.md +2 -2
  347. package/docs/grok-neo.md +77 -0
  348. package/docs/keybindings.md +0 -1
  349. package/docs/settings.md +14 -3
  350. package/docs/terminal-tools.md +6 -3
  351. package/docs/usage.md +1 -1
  352. package/examples/extensions/message-renderer.ts +2 -2
  353. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +47 -0
  354. package/node_modules/@code-yeongyu/senpi-codemode/README.md +39 -19
  355. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  356. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +6 -1
  357. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +0 -1
  358. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-notifier.ts +40 -0
  359. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +46 -66
  360. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +5 -2
  361. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -0
  362. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +19 -4
  363. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +7 -0
  364. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +8 -5
  365. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +23 -5
  366. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +322 -0
  367. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +253 -18
  368. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +58 -0
  369. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +28 -6
  370. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +20 -0
  371. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +65 -22
  372. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  373. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -41
  374. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  375. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +6 -0
  376. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  377. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +4 -0
  378. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  379. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +10 -0
  380. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -0
  381. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +38 -0
  382. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -0
  383. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
  384. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  385. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  387. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +210 -26
  389. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  390. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +16 -8
  392. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  394. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +39 -20
  395. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  396. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts.map +1 -1
  397. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +9 -2
  398. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
  400. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +4 -3
  401. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
  402. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts.map +1 -1
  403. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +12 -2
  404. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  406. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +19 -11
  407. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  408. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +121 -23
  410. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  411. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +67 -31
  414. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +13 -8
  417. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  418. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +3 -2
  422. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -1
  423. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +37 -35
  424. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  426. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +11 -1
  427. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  428. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  430. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  431. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  432. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +5 -0
  433. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/models.js +5 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  446. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +9 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  448. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
  450. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +8 -3
  451. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
  452. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  453. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
  454. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +30 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -0
  457. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +70 -0
  458. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -0
  459. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +1 -1
  460. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -1
  461. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +7 -3
  462. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -1
  463. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts +9 -0
  464. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts.map +1 -0
  465. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js +16 -0
  466. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js.map +1 -0
  467. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  468. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  469. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
  470. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  471. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +35 -3
  472. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  473. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -0
  474. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  475. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  476. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +32 -0
  477. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  478. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +15 -7
  479. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  480. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  481. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  482. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  483. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  484. package/package.json +8 -8
  485. package/dist/cli/neo/build-argv.d.ts +0 -19
  486. package/dist/cli/neo/build-argv.d.ts.map +0 -1
  487. package/dist/cli/neo/build-argv.js +0 -84
  488. package/dist/cli/neo/build-argv.js.map +0 -1
  489. package/dist/cli/neo/daemon-launch.d.ts +0 -25
  490. package/dist/cli/neo/daemon-launch.d.ts.map +0 -1
  491. package/dist/cli/neo/daemon-launch.js +0 -97
  492. package/dist/cli/neo/daemon-launch.js.map +0 -1
  493. package/dist/cli/neo/gate.d.ts +0 -15
  494. package/dist/cli/neo/gate.d.ts.map +0 -1
  495. package/dist/cli/neo/gate.js +0 -21
  496. package/dist/cli/neo/gate.js.map +0 -1
  497. package/dist/cli/neo/launch.d.ts +0 -24
  498. package/dist/cli/neo/launch.d.ts.map +0 -1
  499. package/dist/cli/neo/launch.js +0 -66
  500. package/dist/cli/neo/launch.js.map +0 -1
  501. package/dist/cli/neo/platform.d.ts +0 -38
  502. package/dist/cli/neo/platform.d.ts.map +0 -1
  503. package/dist/cli/neo/platform.js +0 -54
  504. package/dist/cli/neo/platform.js.map +0 -1
  505. package/dist/cli/neo/resolve-binary.d.ts +0 -39
  506. package/dist/cli/neo/resolve-binary.d.ts.map +0 -1
  507. package/dist/cli/neo/resolve-binary.js +0 -66
  508. package/dist/cli/neo/resolve-binary.js.map +0 -1
  509. package/dist/core/extensions/builtin/session-observer/index.d.ts +0 -5
  510. package/dist/core/extensions/builtin/session-observer/index.d.ts.map +0 -1
  511. package/dist/core/extensions/builtin/session-observer/index.js +0 -36
  512. package/dist/core/extensions/builtin/session-observer/index.js.map +0 -1
  513. package/dist/core/extensions/builtin/session-observer/loader.d.ts +0 -3
  514. package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +0 -1
  515. package/dist/core/extensions/builtin/session-observer/loader.js +0 -20
  516. package/dist/core/extensions/builtin/session-observer/loader.js.map +0 -1
  517. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts +0 -7
  518. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +0 -1
  519. package/dist/core/extensions/builtin/session-observer/overlay-format.js +0 -30
  520. package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +0 -1
  521. package/dist/core/extensions/builtin/session-observer/overlay.d.ts +0 -51
  522. package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +0 -1
  523. package/dist/core/extensions/builtin/session-observer/overlay.js +0 -229
  524. package/dist/core/extensions/builtin/session-observer/overlay.js.map +0 -1
  525. package/dist/core/extensions/builtin/session-observer/scanner.d.ts +0 -10
  526. package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +0 -1
  527. package/dist/core/extensions/builtin/session-observer/scanner.js +0 -142
  528. package/dist/core/extensions/builtin/session-observer/scanner.js.map +0 -1
  529. package/dist/core/extensions/builtin/session-observer/text.d.ts +0 -7
  530. package/dist/core/extensions/builtin/session-observer/text.d.ts.map +0 -1
  531. package/dist/core/extensions/builtin/session-observer/text.js +0 -37
  532. package/dist/core/extensions/builtin/session-observer/text.js.map +0 -1
  533. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts +0 -7
  534. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +0 -1
  535. package/dist/core/extensions/builtin/session-observer/transcript-entries.js +0 -71
  536. package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +0 -1
  537. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts +0 -11
  538. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +0 -1
  539. package/dist/core/extensions/builtin/session-observer/transcript-format.js +0 -65
  540. package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +0 -1
  541. package/dist/core/extensions/builtin/session-observer/transcript.d.ts +0 -4
  542. package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +0 -1
  543. package/dist/core/extensions/builtin/session-observer/transcript.js +0 -81
  544. package/dist/core/extensions/builtin/session-observer/transcript.js.map +0 -1
  545. package/dist/core/extensions/builtin/session-observer/types.d.ts +0 -33
  546. package/dist/core/extensions/builtin/session-observer/types.d.ts.map +0 -1
  547. package/dist/core/extensions/builtin/session-observer/types.js +0 -2
  548. package/dist/core/extensions/builtin/session-observer/types.js.map +0 -1
  549. package/dist/modes/rpc/neo-daemon-child-worker.d.ts +0 -29
  550. package/dist/modes/rpc/neo-daemon-child-worker.d.ts.map +0 -1
  551. package/dist/modes/rpc/neo-daemon-child-worker.js +0 -95
  552. package/dist/modes/rpc/neo-daemon-child-worker.js.map +0 -1
  553. package/dist/modes/rpc/neo-daemon-mode.d.ts +0 -110
  554. package/dist/modes/rpc/neo-daemon-mode.d.ts.map +0 -1
  555. package/dist/modes/rpc/neo-daemon-mode.js +0 -267
  556. package/dist/modes/rpc/neo-daemon-mode.js.map +0 -1
  557. package/dist/modes/rpc/neo-daemon-protocol.d.ts +0 -50
  558. package/dist/modes/rpc/neo-daemon-protocol.d.ts.map +0 -1
  559. package/dist/modes/rpc/neo-daemon-protocol.js +0 -66
  560. package/dist/modes/rpc/neo-daemon-protocol.js.map +0 -1
  561. package/dist/modes/rpc/neo-daemon-registry.d.ts +0 -98
  562. package/dist/modes/rpc/neo-daemon-registry.d.ts.map +0 -1
  563. package/dist/modes/rpc/neo-daemon-registry.js +0 -209
  564. package/dist/modes/rpc/neo-daemon-registry.js.map +0 -1
  565. package/dist/modes/rpc/neo-runtime-options-argv.d.ts +0 -17
  566. package/dist/modes/rpc/neo-runtime-options-argv.d.ts.map +0 -1
  567. package/dist/modes/rpc/neo-runtime-options-argv.js +0 -79
  568. package/dist/modes/rpc/neo-runtime-options-argv.js.map +0 -1
  569. package/dist/modes/rpc/neo-runtime-options.d.ts +0 -84
  570. package/dist/modes/rpc/neo-runtime-options.d.ts.map +0 -1
  571. package/dist/modes/rpc/neo-runtime-options.js +0 -92
  572. package/dist/modes/rpc/neo-runtime-options.js.map +0 -1
  573. package/docs/neo.md +0 -111
  574. package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/runtime.ts +0 -258
  575. package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/tools.ts +0 -106
@@ -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"}
@@ -0,0 +1,105 @@
1
+ import { CustomEditor } from "../components/custom-editor.js";
2
+ import { WorkingStatusIndicator } from "../components/status-indicator.js";
3
+ import { theme } from "../theme/theme.js";
4
+ import { getGrokChromeTokens } from "./chrome-tokens.js";
5
+ import { GrokFooter } from "./footer.js";
6
+ import { GrokInputCard } from "./input-card.js";
7
+ import { GROK_GLYPHS } from "./palette.js";
8
+ import { GrokWelcomeCard } from "./welcome-card.js";
9
+ class GrokFooterSurface {
10
+ constructor(content) {
11
+ this.content = content;
12
+ }
13
+ invalidate() {
14
+ this.content.invalidate();
15
+ }
16
+ render(width) {
17
+ const surface = getGrokChromeTokens().surface;
18
+ return this.content.render(width).map(surface);
19
+ }
20
+ dispose() {
21
+ this.content.dispose?.();
22
+ }
23
+ }
24
+ class GrokRootSpacer {
25
+ constructor(ui, content) {
26
+ this.ui = ui;
27
+ this.content = content;
28
+ }
29
+ invalidate() {
30
+ // The spacer derives its height from the current terminal dimensions.
31
+ }
32
+ render(width) {
33
+ const contentHeight = this.content.reduce((height, component) => height + component.render(width).length, 0);
34
+ return Array.from({ length: Math.max(0, this.ui.terminal.rows - contentHeight) }, () => "");
35
+ }
36
+ }
37
+ class GrokEditor extends CustomEditor {
38
+ constructor(ui, editorTheme, keybindings, options) {
39
+ super(ui, editorTheme, keybindings, options);
40
+ this.card = new GrokInputCard({
41
+ render: (width) => this.renderBase(width),
42
+ invalidate: () => super.invalidate(),
43
+ });
44
+ }
45
+ render(width) {
46
+ return this.card.render(width);
47
+ }
48
+ renderBase(width) {
49
+ return super.render(width);
50
+ }
51
+ }
52
+ export class GrokChrome {
53
+ constructor() {
54
+ this.toolPresentation = "grok";
55
+ }
56
+ createBaseEditor({ ui, keybindings, editorOptions, }) {
57
+ return new GrokEditor(ui, this.getEditorTheme(), keybindings, editorOptions);
58
+ }
59
+ getEditorTheme() {
60
+ const tokens = getGrokChromeTokens();
61
+ return {
62
+ borderColor: tokens.inputBorder,
63
+ selectList: {
64
+ selectedPrefix: (text) => theme.fg("accent", text),
65
+ selectedText: (text) => tokens.primaryText(text),
66
+ description: (text) => tokens.mutedText(text),
67
+ scrollInfo: (text) => tokens.mutedText(text),
68
+ noMatch: (text) => tokens.mutedText(text),
69
+ renderRow: ({ prefix, primary, description, isSelected }) => {
70
+ const row = `${prefix}${tokens.primaryText(primary)}${description ? tokens.mutedText(description) : ""}`;
71
+ return isSelected ? theme.bg("selectedBg", row) : row;
72
+ },
73
+ },
74
+ };
75
+ }
76
+ createFooter(session, footerData) {
77
+ return new GrokFooter(session, footerData);
78
+ }
79
+ createWelcomeContent(appName, version) {
80
+ return new GrokWelcomeCard(appName, version);
81
+ }
82
+ createWorkingIndicator(ui, message, indicator) {
83
+ return new WorkingStatusIndicator(ui, message, {
84
+ ...indicator,
85
+ frames: [GROK_GLYPHS.spinner],
86
+ indicatorFormatter: (frame) => theme.fg("accent", frame),
87
+ });
88
+ }
89
+ getEditorBorderColor(_context) {
90
+ return getGrokChromeTokens().inputBorder;
91
+ }
92
+ arrangeRoot(children, ui) {
93
+ // pi-tui concatenates root children without a layout pass. Keep transcript
94
+ // content first and calculate the remaining rows at render time from the TUI's
95
+ // terminal height, so the input tail is truly bottom-anchored when it fits.
96
+ const inputTailStart = Math.max(0, children.length - 3);
97
+ const content = children.slice(0, inputTailStart);
98
+ const inputTail = children.slice(inputTailStart);
99
+ const footer = inputTail.at(-1);
100
+ const tail = footer ? [...inputTail.slice(0, -1), new GrokFooterSurface(footer)] : [...inputTail];
101
+ const arranged = [...content, ...tail];
102
+ return ui ? [...content, new GrokRootSpacer(ui, arranged), ...tail] : arranged;
103
+ }
104
+ }
105
+ //# sourceMappingURL=chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../../src/modes/interactive/grok/chrome.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component, EditorOptions, EditorTheme, TUI } from \"@earendil-works/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { WorkingIndicatorOptions } from \"../../../core/extensions/index.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { CustomEditor } from \"../components/custom-editor.ts\";\nimport { WorkingStatusIndicator } from \"../components/status-indicator.ts\";\nimport type { ToolExecutionPresentation } from \"../components/tool-execution.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { getGrokChromeTokens } from \"./chrome-tokens.ts\";\nimport { GrokFooter } from \"./footer.ts\";\nimport { GrokInputCard } from \"./input-card.ts\";\nimport { GROK_GLYPHS } from \"./palette.ts\";\nimport { GrokWelcomeCard } from \"./welcome-card.ts\";\n\nexport interface InteractiveFooter extends Component {\n\tsetSession(session: AgentSession): void;\n\tsetAutoCompactEnabled(enabled: boolean): void;\n\tinvalidate(): void;\n\tdispose(): void;\n}\n\nexport type EditorBorderContext = {\n\treadonly isBashMode: boolean;\n\treadonly thinkingLevel: string;\n};\n\n/**\n * Mode-owned chrome seam for InteractiveMode. Extensions continue to own their\n * editor factory; this strategy only creates and decorates the base editor.\n */\nexport interface InteractiveChrome {\n\treadonly toolPresentation: ToolExecutionPresentation;\n\tcreateBaseEditor(context: { ui: TUI; keybindings: KeybindingsManager; editorOptions: EditorOptions }): CustomEditor;\n\tgetEditorTheme(): EditorTheme;\n\tcreateFooter(session: AgentSession, footerData: ReadonlyFooterDataProvider): InteractiveFooter;\n\tcreateWelcomeContent(appName: string, version: string): Component;\n\tcreateWorkingIndicator(ui: TUI, message: string, indicator?: WorkingIndicatorOptions): WorkingStatusIndicator;\n\tgetEditorBorderColor(context: EditorBorderContext): (text: string) => string;\n\tarrangeRoot(children: readonly Component[], ui?: TUI): Component[];\n}\n\nclass GrokFooterSurface implements Component {\n\tprivate readonly content: Component;\n\n\tconstructor(content: Component) {\n\t\tthis.content = content;\n\t}\n\n\tinvalidate(): void {\n\t\tthis.content.invalidate();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst surface = getGrokChromeTokens().surface;\n\t\treturn this.content.render(width).map(surface);\n\t}\n\n\tdispose(): void {\n\t\tthis.content.dispose?.();\n\t}\n}\n\nclass GrokRootSpacer implements Component {\n\tprivate readonly ui: TUI;\n\tprivate readonly content: readonly Component[];\n\n\tconstructor(ui: TUI, content: readonly Component[]) {\n\t\tthis.ui = ui;\n\t\tthis.content = content;\n\t}\n\n\tinvalidate(): void {\n\t\t// The spacer derives its height from the current terminal dimensions.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst contentHeight = this.content.reduce((height, component) => height + component.render(width).length, 0);\n\t\treturn Array.from({ length: Math.max(0, this.ui.terminal.rows - contentHeight) }, () => \"\");\n\t}\n}\n\nclass GrokEditor extends CustomEditor {\n\tprivate readonly card: GrokInputCard;\n\n\tconstructor(ui: TUI, editorTheme: EditorTheme, keybindings: KeybindingsManager, options: EditorOptions) {\n\t\tsuper(ui, editorTheme, keybindings, options);\n\t\tthis.card = new GrokInputCard({\n\t\t\trender: (width) => this.renderBase(width),\n\t\t\tinvalidate: () => super.invalidate(),\n\t\t});\n\t}\n\n\toverride render(width: number): string[] {\n\t\treturn this.card.render(width);\n\t}\n\n\tprivate renderBase(width: number): string[] {\n\t\treturn super.render(width);\n\t}\n}\n\nexport class GrokChrome implements InteractiveChrome {\n\treadonly toolPresentation = \"grok\" as const;\n\n\tcreateBaseEditor({\n\t\tui,\n\t\tkeybindings,\n\t\teditorOptions,\n\t}: {\n\t\tui: TUI;\n\t\tkeybindings: KeybindingsManager;\n\t\teditorOptions: EditorOptions;\n\t}): CustomEditor {\n\t\treturn new GrokEditor(ui, this.getEditorTheme(), keybindings, editorOptions);\n\t}\n\n\tgetEditorTheme(): EditorTheme {\n\t\tconst tokens = getGrokChromeTokens();\n\t\treturn {\n\t\t\tborderColor: tokens.inputBorder,\n\t\t\tselectList: {\n\t\t\t\tselectedPrefix: (text) => theme.fg(\"accent\", text),\n\t\t\t\tselectedText: (text) => tokens.primaryText(text),\n\t\t\t\tdescription: (text) => tokens.mutedText(text),\n\t\t\t\tscrollInfo: (text) => tokens.mutedText(text),\n\t\t\t\tnoMatch: (text) => tokens.mutedText(text),\n\t\t\t\trenderRow: ({ prefix, primary, description, isSelected }) => {\n\t\t\t\t\tconst row = `${prefix}${tokens.primaryText(primary)}${description ? tokens.mutedText(description) : \"\"}`;\n\t\t\t\t\treturn isSelected ? theme.bg(\"selectedBg\", row) : row;\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\tcreateFooter(session: AgentSession, footerData: ReadonlyFooterDataProvider): InteractiveFooter {\n\t\treturn new GrokFooter(session, footerData);\n\t}\n\n\tcreateWelcomeContent(appName: string, version: string): Component {\n\t\treturn new GrokWelcomeCard(appName, version);\n\t}\n\n\tcreateWorkingIndicator(ui: TUI, message: string, indicator?: WorkingIndicatorOptions): WorkingStatusIndicator {\n\t\treturn new WorkingStatusIndicator(ui, message, {\n\t\t\t...indicator,\n\t\t\tframes: [GROK_GLYPHS.spinner],\n\t\t\tindicatorFormatter: (frame) => theme.fg(\"accent\", frame),\n\t\t});\n\t}\n\n\tgetEditorBorderColor(_context: EditorBorderContext): (text: string) => string {\n\t\treturn getGrokChromeTokens().inputBorder;\n\t}\n\n\tarrangeRoot(children: readonly Component[], ui?: TUI): Component[] {\n\t\t// pi-tui concatenates root children without a layout pass. Keep transcript\n\t\t// content first and calculate the remaining rows at render time from the TUI's\n\t\t// terminal height, so the input tail is truly bottom-anchored when it fits.\n\t\tconst inputTailStart = Math.max(0, children.length - 3);\n\t\tconst content = children.slice(0, inputTailStart);\n\t\tconst inputTail = children.slice(inputTailStart);\n\t\tconst footer = inputTail.at(-1);\n\t\tconst tail = footer ? [...inputTail.slice(0, -1), new GrokFooterSurface(footer)] : [...inputTail];\n\t\tconst arranged = [...content, ...tail];\n\t\treturn ui ? [...content, new GrokRootSpacer(ui, arranged), ...tail] : arranged;\n\t}\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { type Component } from "@earendil-works/pi-tui";
2
+ import type { AgentSession } from "../../../core/agent-session.ts";
3
+ import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provider.ts";
4
+ /** Compact status footer for grok chrome. */
5
+ export declare class GrokFooter implements Component {
6
+ private session;
7
+ constructor(session: AgentSession, _footerData: ReadonlyFooterDataProvider);
8
+ setSession(session: AgentSession): void;
9
+ setAutoCompactEnabled(_enabled: boolean): void;
10
+ invalidate(): void;
11
+ dispose(): void;
12
+ render(width: number): string[];
13
+ }
14
+ //# sourceMappingURL=footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/grok/footer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAGxF,6CAA6C;AAC7C,qBAAa,UAAW,YAAW,SAAS;IAC3C,OAAO,CAAC,OAAO,CAAe;IAE9B,YAAY,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,0BAA0B,EAEzE;IAED,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAEtC;IAED,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAE7C;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,OAAO,IAAI,IAAI,CAEd;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK9B;CACD"}