indusagi 0.12.23 → 0.12.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 (782) hide show
  1. package/README.md +393 -10
  2. package/local-dist/bot/actions/composio/accounts.d.ts +23 -0
  3. package/local-dist/bot/actions/composio/accounts.d.ts.map +1 -0
  4. package/local-dist/bot/actions/composio/accounts.js +40 -0
  5. package/local-dist/bot/actions/composio/accounts.js.map +1 -0
  6. package/local-dist/bot/actions/composio/client.d.ts +40 -0
  7. package/local-dist/bot/actions/composio/client.d.ts.map +1 -0
  8. package/local-dist/bot/actions/composio/client.js +361 -0
  9. package/local-dist/bot/actions/composio/client.js.map +1 -0
  10. package/local-dist/bot/actions/composio/connect.d.ts +20 -0
  11. package/local-dist/bot/actions/composio/connect.d.ts.map +1 -0
  12. package/local-dist/bot/actions/composio/connect.js +41 -0
  13. package/local-dist/bot/actions/composio/connect.js.map +1 -0
  14. package/local-dist/bot/actions/composio/enable.d.ts +26 -0
  15. package/local-dist/bot/actions/composio/enable.d.ts.map +1 -0
  16. package/local-dist/bot/actions/composio/enable.js +66 -0
  17. package/local-dist/bot/actions/composio/enable.js.map +1 -0
  18. package/local-dist/bot/actions/composio/execute.d.ts +27 -0
  19. package/local-dist/bot/actions/composio/execute.d.ts.map +1 -0
  20. package/local-dist/bot/actions/composio/execute.js +46 -0
  21. package/local-dist/bot/actions/composio/execute.js.map +1 -0
  22. package/local-dist/bot/actions/composio/helpers.d.ts +17 -0
  23. package/local-dist/bot/actions/composio/helpers.d.ts.map +1 -0
  24. package/local-dist/bot/actions/composio/helpers.js +533 -0
  25. package/local-dist/bot/actions/composio/helpers.js.map +1 -0
  26. package/local-dist/bot/actions/composio/index.d.ts +10 -0
  27. package/local-dist/bot/actions/composio/index.d.ts.map +1 -0
  28. package/local-dist/bot/actions/composio/index.js +9 -0
  29. package/local-dist/bot/actions/composio/index.js.map +1 -0
  30. package/local-dist/bot/actions/composio/provider.d.ts +9 -0
  31. package/local-dist/bot/actions/composio/provider.d.ts.map +1 -0
  32. package/local-dist/bot/actions/composio/provider.js +54 -0
  33. package/local-dist/bot/actions/composio/provider.js.map +1 -0
  34. package/local-dist/bot/actions/composio/toolkits.d.ts +23 -0
  35. package/local-dist/bot/actions/composio/toolkits.d.ts.map +1 -0
  36. package/local-dist/bot/actions/composio/toolkits.js +40 -0
  37. package/local-dist/bot/actions/composio/toolkits.js.map +1 -0
  38. package/local-dist/bot/actions/composio/tools.d.ts +29 -0
  39. package/local-dist/bot/actions/composio/tools.d.ts.map +1 -0
  40. package/local-dist/bot/actions/composio/tools.js +72 -0
  41. package/local-dist/bot/actions/composio/tools.js.map +1 -0
  42. package/local-dist/bot/actions/composio/types.d.ts +126 -0
  43. package/local-dist/bot/actions/composio/types.d.ts.map +1 -0
  44. package/local-dist/bot/actions/composio/types.js +2 -0
  45. package/local-dist/bot/actions/composio/types.js.map +1 -0
  46. package/{dist → local-dist}/bot/actions/crew/activity-tracker.js +1 -1
  47. package/{dist → local-dist}/bot/actions/crew/activity-tracker.js.map +1 -1
  48. package/{dist → local-dist}/bot/actions/crew/worktree.js +2 -2
  49. package/local-dist/bot/actions/crew/worktree.js.map +1 -0
  50. package/{dist → local-dist}/bot/actions/index.d.ts +111 -0
  51. package/local-dist/bot/actions/index.d.ts.map +1 -0
  52. package/{dist → local-dist}/bot/actions/index.js +108 -2
  53. package/local-dist/bot/actions/index.js.map +1 -0
  54. package/{dist → local-dist}/bot/actions/process-manager.js +1 -1
  55. package/{dist → local-dist}/bot/actions/process-manager.js.map +1 -1
  56. package/{dist → local-dist}/index.d.ts +1 -0
  57. package/{dist → local-dist}/index.d.ts.map +1 -1
  58. package/{dist → local-dist}/index.js +1 -0
  59. package/{dist → local-dist}/index.js.map +1 -1
  60. package/{dist → local-dist}/mcp/client-pool.d.ts +1 -1
  61. package/{dist → local-dist}/mcp/client-pool.js +1 -1
  62. package/{dist → local-dist}/mcp/client.d.ts +1 -1
  63. package/{dist → local-dist}/mcp/client.js +1 -1
  64. package/{dist → local-dist}/mcp/config.d.ts +1 -1
  65. package/{dist → local-dist}/mcp/config.js +1 -1
  66. package/{dist → local-dist}/mcp/errors.d.ts +1 -1
  67. package/{dist → local-dist}/mcp/errors.js +1 -1
  68. package/{dist → local-dist}/mcp/schema-converter.d.ts +1 -1
  69. package/{dist → local-dist}/mcp/schema-converter.js +1 -1
  70. package/{dist → local-dist}/mcp/server.d.ts +1 -1
  71. package/{dist → local-dist}/mcp/server.js +1 -1
  72. package/{dist → local-dist}/mcp/tool-factory.d.ts +1 -1
  73. package/{dist → local-dist}/mcp/tool-factory.js +1 -1
  74. package/{dist → local-dist}/mcp/types.d.ts +1 -1
  75. package/{dist → local-dist}/mcp/types.js +1 -1
  76. package/{dist → local-dist}/ml/adapters/openai-codex-responses.js +4 -2
  77. package/{dist → local-dist}/ml/adapters/openai-codex-responses.js.map +1 -1
  78. package/{dist → local-dist}/ml/kit/auth/openai-codex.d.ts +1 -1
  79. package/{dist → local-dist}/ml/kit/auth/openai-codex.js +2 -2
  80. package/{dist → local-dist}/ml/kit/auth/openai-codex.js.map +1 -1
  81. package/local-dist/react-host/index.d.ts +10 -0
  82. package/local-dist/react-host/index.d.ts.map +1 -0
  83. package/local-dist/react-host/index.js +9 -0
  84. package/local-dist/react-host/index.js.map +1 -0
  85. package/local-dist/react-host/ink.d.ts +5 -0
  86. package/local-dist/react-host/ink.d.ts.map +1 -0
  87. package/local-dist/react-host/ink.js +6 -0
  88. package/local-dist/react-host/ink.js.map +1 -0
  89. package/local-dist/react-host/jsx-runtime.d.ts +5 -0
  90. package/local-dist/react-host/jsx-runtime.d.ts.map +1 -0
  91. package/local-dist/react-host/jsx-runtime.js +6 -0
  92. package/local-dist/react-host/jsx-runtime.js.map +1 -0
  93. package/local-dist/react-host/loader.d.ts +4 -0
  94. package/local-dist/react-host/loader.d.ts.map +1 -0
  95. package/local-dist/react-host/loader.js +83 -0
  96. package/local-dist/react-host/loader.js.map +1 -0
  97. package/local-dist/react-ink/components/ChangelogBlock.d.ts +9 -0
  98. package/local-dist/react-ink/components/ChangelogBlock.d.ts.map +1 -0
  99. package/local-dist/react-ink/components/ChangelogBlock.js +58 -0
  100. package/local-dist/react-ink/components/ChangelogBlock.js.map +1 -0
  101. package/local-dist/react-ink/components/DisplayBlockView.d.ts +9 -0
  102. package/local-dist/react-ink/components/DisplayBlockView.d.ts.map +1 -0
  103. package/local-dist/react-ink/components/DisplayBlockView.js +11 -0
  104. package/local-dist/react-ink/components/DisplayBlockView.js.map +1 -0
  105. package/local-dist/react-ink/components/Footer.d.ts +12 -0
  106. package/local-dist/react-ink/components/Footer.d.ts.map +1 -0
  107. package/local-dist/react-ink/components/Footer.js +109 -0
  108. package/local-dist/react-ink/components/Footer.js.map +1 -0
  109. package/local-dist/react-ink/components/MessageList.d.ts +15 -0
  110. package/local-dist/react-ink/components/MessageList.d.ts.map +1 -0
  111. package/local-dist/react-ink/components/MessageList.js +43 -0
  112. package/local-dist/react-ink/components/MessageList.js.map +1 -0
  113. package/local-dist/react-ink/components/MessageRow.d.ts +14 -0
  114. package/local-dist/react-ink/components/MessageRow.d.ts.map +1 -0
  115. package/local-dist/react-ink/components/MessageRow.js +35 -0
  116. package/local-dist/react-ink/components/MessageRow.js.map +1 -0
  117. package/local-dist/react-ink/components/StatusLine.d.ts +10 -0
  118. package/local-dist/react-ink/components/StatusLine.d.ts.map +1 -0
  119. package/local-dist/react-ink/components/StatusLine.js +39 -0
  120. package/local-dist/react-ink/components/StatusLine.js.map +1 -0
  121. package/local-dist/react-ink/components/TaskPanel.d.ts +12 -0
  122. package/local-dist/react-ink/components/TaskPanel.d.ts.map +1 -0
  123. package/local-dist/react-ink/components/TaskPanel.js +23 -0
  124. package/local-dist/react-ink/components/TaskPanel.js.map +1 -0
  125. package/local-dist/react-ink/components/ToolEventBlock.d.ts +18 -0
  126. package/local-dist/react-ink/components/ToolEventBlock.d.ts.map +1 -0
  127. package/local-dist/react-ink/components/ToolEventBlock.js +61 -0
  128. package/local-dist/react-ink/components/ToolEventBlock.js.map +1 -0
  129. package/local-dist/react-ink/components/dialogs/DialogFrame.d.ts +9 -0
  130. package/local-dist/react-ink/components/dialogs/DialogFrame.d.ts.map +1 -0
  131. package/local-dist/react-ink/components/dialogs/DialogFrame.js +6 -0
  132. package/local-dist/react-ink/components/dialogs/DialogFrame.js.map +1 -0
  133. package/local-dist/react-ink/components/dialogs/LoginDialog.d.ts +15 -0
  134. package/local-dist/react-ink/components/dialogs/LoginDialog.d.ts.map +1 -0
  135. package/local-dist/react-ink/components/dialogs/LoginDialog.js +10 -0
  136. package/local-dist/react-ink/components/dialogs/LoginDialog.js.map +1 -0
  137. package/local-dist/react-ink/components/dialogs/ModelDialog.d.ts +10 -0
  138. package/local-dist/react-ink/components/dialogs/ModelDialog.d.ts.map +1 -0
  139. package/local-dist/react-ink/components/dialogs/ModelDialog.js +64 -0
  140. package/local-dist/react-ink/components/dialogs/ModelDialog.js.map +1 -0
  141. package/local-dist/react-ink/components/dialogs/OAuthDialog.d.ts +10 -0
  142. package/local-dist/react-ink/components/dialogs/OAuthDialog.d.ts.map +1 -0
  143. package/local-dist/react-ink/components/dialogs/OAuthDialog.js +24 -0
  144. package/local-dist/react-ink/components/dialogs/OAuthDialog.js.map +1 -0
  145. package/local-dist/react-ink/components/dialogs/ScopedModelsDialog.d.ts +10 -0
  146. package/local-dist/react-ink/components/dialogs/ScopedModelsDialog.d.ts.map +1 -0
  147. package/local-dist/react-ink/components/dialogs/ScopedModelsDialog.js +95 -0
  148. package/local-dist/react-ink/components/dialogs/ScopedModelsDialog.js.map +1 -0
  149. package/local-dist/react-ink/components/dialogs/SelectableDialog.d.ts +17 -0
  150. package/local-dist/react-ink/components/dialogs/SelectableDialog.d.ts.map +1 -0
  151. package/local-dist/react-ink/components/dialogs/SelectableDialog.js +66 -0
  152. package/local-dist/react-ink/components/dialogs/SelectableDialog.js.map +1 -0
  153. package/local-dist/react-ink/components/dialogs/SessionDialog.d.ts +14 -0
  154. package/local-dist/react-ink/components/dialogs/SessionDialog.d.ts.map +1 -0
  155. package/local-dist/react-ink/components/dialogs/SessionDialog.js +201 -0
  156. package/local-dist/react-ink/components/dialogs/SessionDialog.js.map +1 -0
  157. package/local-dist/react-ink/components/dialogs/SettingsDialog.d.ts +15 -0
  158. package/local-dist/react-ink/components/dialogs/SettingsDialog.d.ts.map +1 -0
  159. package/local-dist/react-ink/components/dialogs/SettingsDialog.js +79 -0
  160. package/local-dist/react-ink/components/dialogs/SettingsDialog.js.map +1 -0
  161. package/local-dist/react-ink/components/dialogs/StartupSessionPicker.d.ts +10 -0
  162. package/local-dist/react-ink/components/dialogs/StartupSessionPicker.d.ts.map +1 -0
  163. package/local-dist/react-ink/components/dialogs/StartupSessionPicker.js +100 -0
  164. package/local-dist/react-ink/components/dialogs/StartupSessionPicker.js.map +1 -0
  165. package/local-dist/react-ink/components/dialogs/ThemeDialog.d.ts +8 -0
  166. package/local-dist/react-ink/components/dialogs/ThemeDialog.d.ts.map +1 -0
  167. package/local-dist/react-ink/components/dialogs/ThemeDialog.js +7 -0
  168. package/local-dist/react-ink/components/dialogs/ThemeDialog.js.map +1 -0
  169. package/local-dist/react-ink/components/dialogs/TreeDialog.d.ts +9 -0
  170. package/local-dist/react-ink/components/dialogs/TreeDialog.d.ts.map +1 -0
  171. package/local-dist/react-ink/components/dialogs/TreeDialog.js +7 -0
  172. package/local-dist/react-ink/components/dialogs/TreeDialog.js.map +1 -0
  173. package/local-dist/react-ink/components/dialogs/UserMessageDialog.d.ts +9 -0
  174. package/local-dist/react-ink/components/dialogs/UserMessageDialog.d.ts.map +1 -0
  175. package/local-dist/react-ink/components/dialogs/UserMessageDialog.js +7 -0
  176. package/local-dist/react-ink/components/dialogs/UserMessageDialog.js.map +1 -0
  177. package/local-dist/react-ink/components/messages/AssistantMessage.d.ts +13 -0
  178. package/local-dist/react-ink/components/messages/AssistantMessage.d.ts.map +1 -0
  179. package/local-dist/react-ink/components/messages/AssistantMessage.js +20 -0
  180. package/local-dist/react-ink/components/messages/AssistantMessage.js.map +1 -0
  181. package/local-dist/react-ink/components/messages/BashMessage.d.ts +9 -0
  182. package/local-dist/react-ink/components/messages/BashMessage.d.ts.map +1 -0
  183. package/local-dist/react-ink/components/messages/BashMessage.js +11 -0
  184. package/local-dist/react-ink/components/messages/BashMessage.js.map +1 -0
  185. package/local-dist/react-ink/components/messages/BranchSummaryMessage.d.ts +9 -0
  186. package/local-dist/react-ink/components/messages/BranchSummaryMessage.d.ts.map +1 -0
  187. package/local-dist/react-ink/components/messages/BranchSummaryMessage.js +6 -0
  188. package/local-dist/react-ink/components/messages/BranchSummaryMessage.js.map +1 -0
  189. package/local-dist/react-ink/components/messages/CompactionMessage.d.ts +9 -0
  190. package/local-dist/react-ink/components/messages/CompactionMessage.d.ts.map +1 -0
  191. package/local-dist/react-ink/components/messages/CompactionMessage.js +6 -0
  192. package/local-dist/react-ink/components/messages/CompactionMessage.js.map +1 -0
  193. package/local-dist/react-ink/components/messages/CustomMessage.d.ts +10 -0
  194. package/local-dist/react-ink/components/messages/CustomMessage.d.ts.map +1 -0
  195. package/local-dist/react-ink/components/messages/CustomMessage.js +9 -0
  196. package/local-dist/react-ink/components/messages/CustomMessage.js.map +1 -0
  197. package/local-dist/react-ink/components/messages/SkillInvocationMessage.d.ts +8 -0
  198. package/local-dist/react-ink/components/messages/SkillInvocationMessage.d.ts.map +1 -0
  199. package/local-dist/react-ink/components/messages/SkillInvocationMessage.js +10 -0
  200. package/local-dist/react-ink/components/messages/SkillInvocationMessage.js.map +1 -0
  201. package/local-dist/react-ink/components/messages/ToolCallMessage.d.ts +9 -0
  202. package/local-dist/react-ink/components/messages/ToolCallMessage.d.ts.map +1 -0
  203. package/local-dist/react-ink/components/messages/ToolCallMessage.js +8 -0
  204. package/local-dist/react-ink/components/messages/ToolCallMessage.js.map +1 -0
  205. package/local-dist/react-ink/components/messages/ToolResultBlock.d.ts +13 -0
  206. package/local-dist/react-ink/components/messages/ToolResultBlock.d.ts.map +1 -0
  207. package/local-dist/react-ink/components/messages/ToolResultBlock.js +8 -0
  208. package/local-dist/react-ink/components/messages/ToolResultBlock.js.map +1 -0
  209. package/local-dist/react-ink/components/messages/UserMessage.d.ts +10 -0
  210. package/local-dist/react-ink/components/messages/UserMessage.d.ts.map +1 -0
  211. package/local-dist/react-ink/components/messages/UserMessage.js +9 -0
  212. package/local-dist/react-ink/components/messages/UserMessage.js.map +1 -0
  213. package/local-dist/react-ink/index.d.ts +35 -0
  214. package/local-dist/react-ink/index.d.ts.map +1 -0
  215. package/local-dist/react-ink/index.js +35 -0
  216. package/local-dist/react-ink/index.js.map +1 -0
  217. package/local-dist/react-ink/theme-adapter.d.ts +10 -0
  218. package/local-dist/react-ink/theme-adapter.d.ts.map +1 -0
  219. package/local-dist/react-ink/theme-adapter.js +44 -0
  220. package/local-dist/react-ink/theme-adapter.js.map +1 -0
  221. package/local-dist/react-ink/types.d.ts +134 -0
  222. package/local-dist/react-ink/types.d.ts.map +1 -0
  223. package/local-dist/react-ink/types.js +2 -0
  224. package/local-dist/react-ink/types.js.map +1 -0
  225. package/local-dist/react-ink/utils/message-groups.d.ts +26 -0
  226. package/local-dist/react-ink/utils/message-groups.d.ts.map +1 -0
  227. package/local-dist/react-ink/utils/message-groups.js +240 -0
  228. package/local-dist/react-ink/utils/message-groups.js.map +1 -0
  229. package/local-dist/react-ink/utils/selection-dialog.d.ts +3 -0
  230. package/local-dist/react-ink/utils/selection-dialog.d.ts.map +1 -0
  231. package/local-dist/react-ink/utils/selection-dialog.js +18 -0
  232. package/local-dist/react-ink/utils/selection-dialog.js.map +1 -0
  233. package/local-dist/react-ink/utils/session-browser.d.ts +28 -0
  234. package/local-dist/react-ink/utils/session-browser.d.ts.map +1 -0
  235. package/local-dist/react-ink/utils/session-browser.js +191 -0
  236. package/local-dist/react-ink/utils/session-browser.js.map +1 -0
  237. package/local-dist/react-ink/utils/tool-display.d.ts +22 -0
  238. package/local-dist/react-ink/utils/tool-display.d.ts.map +1 -0
  239. package/local-dist/react-ink/utils/tool-display.js +349 -0
  240. package/local-dist/react-ink/utils/tool-display.js.map +1 -0
  241. package/local-dist/react-ink.d.ts +3 -0
  242. package/local-dist/react-ink.d.ts.map +1 -0
  243. package/local-dist/react-ink.js +2 -0
  244. package/local-dist/react-ink.js.map +1 -0
  245. package/local-dist/tui.d.ts +9 -0
  246. package/local-dist/tui.d.ts.map +1 -0
  247. package/local-dist/tui.js +8 -0
  248. package/local-dist/tui.js.map +1 -0
  249. package/local-dist/ui/contracts.d.ts +39 -0
  250. package/local-dist/ui/contracts.d.ts.map +1 -0
  251. package/local-dist/ui/contracts.js +2 -0
  252. package/local-dist/ui/contracts.js.map +1 -0
  253. package/{dist → local-dist}/ui/editor-component.d.ts +1 -1
  254. package/local-dist/ui/editor-component.d.ts.map +1 -0
  255. package/local-dist/ui/index.d.ts +9 -0
  256. package/local-dist/ui/index.d.ts.map +1 -0
  257. package/local-dist/ui/index.js +6 -0
  258. package/local-dist/ui/index.js.map +1 -0
  259. package/local-dist/ui/theme-types.d.ts +37 -0
  260. package/local-dist/ui/theme-types.d.ts.map +1 -0
  261. package/local-dist/ui/theme-types.js +2 -0
  262. package/local-dist/ui/theme-types.js.map +1 -0
  263. package/package.json +39 -17
  264. package/dist/bot/actions/crew/worktree.js.map +0 -1
  265. package/dist/bot/actions/index.d.ts.map +0 -1
  266. package/dist/bot/actions/index.js.map +0 -1
  267. package/dist/tui.d.ts +0 -6
  268. package/dist/tui.d.ts.map +0 -1
  269. package/dist/tui.js +0 -6
  270. package/dist/tui.js.map +0 -1
  271. package/dist/ui/editor-component.d.ts.map +0 -1
  272. package/dist/ui/index.d.ts +0 -23
  273. package/dist/ui/index.d.ts.map +0 -1
  274. package/dist/ui/index.js +0 -32
  275. package/dist/ui/index.js.map +0 -1
  276. package/dist/ui/parts/box.d.ts +0 -19
  277. package/dist/ui/parts/box.d.ts.map +0 -1
  278. package/dist/ui/parts/box.js +0 -134
  279. package/dist/ui/parts/box.js.map +0 -1
  280. package/dist/ui/parts/cancellable-loader.d.ts +0 -26
  281. package/dist/ui/parts/cancellable-loader.d.ts.map +0 -1
  282. package/dist/ui/parts/cancellable-loader.js +0 -39
  283. package/dist/ui/parts/cancellable-loader.js.map +0 -1
  284. package/dist/ui/parts/editor.d.ts +0 -189
  285. package/dist/ui/parts/editor.d.ts.map +0 -1
  286. package/dist/ui/parts/editor.js +0 -1546
  287. package/dist/ui/parts/editor.js.map +0 -1
  288. package/dist/ui/parts/image.d.ts +0 -30
  289. package/dist/ui/parts/image.d.ts.map +0 -1
  290. package/dist/ui/parts/image.js +0 -105
  291. package/dist/ui/parts/image.js.map +0 -1
  292. package/dist/ui/parts/input.d.ts +0 -21
  293. package/dist/ui/parts/input.d.ts.map +0 -1
  294. package/dist/ui/parts/input.js +0 -305
  295. package/dist/ui/parts/input.js.map +0 -1
  296. package/dist/ui/parts/loader.d.ts +0 -23
  297. package/dist/ui/parts/loader.d.ts.map +0 -1
  298. package/dist/ui/parts/loader.js +0 -57
  299. package/dist/ui/parts/loader.js.map +0 -1
  300. package/dist/ui/parts/markdown.d.ts +0 -59
  301. package/dist/ui/parts/markdown.d.ts.map +0 -1
  302. package/dist/ui/parts/markdown.js +0 -511
  303. package/dist/ui/parts/markdown.js.map +0 -1
  304. package/dist/ui/parts/select-list.d.ts +0 -33
  305. package/dist/ui/parts/select-list.d.ts.map +0 -1
  306. package/dist/ui/parts/select-list.js +0 -157
  307. package/dist/ui/parts/select-list.js.map +0 -1
  308. package/dist/ui/parts/settings-list.d.ts +0 -50
  309. package/dist/ui/parts/settings-list.d.ts.map +0 -1
  310. package/dist/ui/parts/settings-list.js +0 -196
  311. package/dist/ui/parts/settings-list.js.map +0 -1
  312. package/dist/ui/parts/spacer.d.ts +0 -13
  313. package/dist/ui/parts/spacer.d.ts.map +0 -1
  314. package/dist/ui/parts/spacer.js +0 -42
  315. package/dist/ui/parts/spacer.js.map +0 -1
  316. package/dist/ui/parts/text-renderer.d.ts +0 -7
  317. package/dist/ui/parts/text-renderer.d.ts.map +0 -1
  318. package/dist/ui/parts/text-renderer.js +0 -25
  319. package/dist/ui/parts/text-renderer.js.map +0 -1
  320. package/dist/ui/parts/text.d.ts +0 -17
  321. package/dist/ui/parts/text.d.ts.map +0 -1
  322. package/dist/ui/parts/text.js +0 -89
  323. package/dist/ui/parts/text.js.map +0 -1
  324. package/dist/ui/parts/truncated-text.d.ts +0 -17
  325. package/dist/ui/parts/truncated-text.d.ts.map +0 -1
  326. package/dist/ui/parts/truncated-text.js +0 -54
  327. package/dist/ui/parts/truncated-text.js.map +0 -1
  328. package/dist/ui/stdin-buffer.d.ts +0 -53
  329. package/dist/ui/stdin-buffer.d.ts.map +0 -1
  330. package/dist/ui/stdin-buffer.js +0 -332
  331. package/dist/ui/stdin-buffer.js.map +0 -1
  332. package/dist/ui/terminal-image.d.ts +0 -72
  333. package/dist/ui/terminal-image.d.ts.map +0 -1
  334. package/dist/ui/terminal-image.js +0 -291
  335. package/dist/ui/terminal-image.js.map +0 -1
  336. package/dist/ui/terminal.d.ts +0 -55
  337. package/dist/ui/terminal.d.ts.map +0 -1
  338. package/dist/ui/terminal.js +0 -210
  339. package/dist/ui/terminal.js.map +0 -1
  340. package/dist/ui/tui.d.ts +0 -250
  341. package/dist/ui/tui.d.ts.map +0 -1
  342. package/dist/ui/tui.js +0 -937
  343. package/dist/ui/tui.js.map +0 -1
  344. /package/{dist → local-dist}/agent.d.ts +0 -0
  345. /package/{dist → local-dist}/agent.d.ts.map +0 -0
  346. /package/{dist → local-dist}/agent.js +0 -0
  347. /package/{dist → local-dist}/agent.js.map +0 -0
  348. /package/{dist → local-dist}/ai.d.ts +0 -0
  349. /package/{dist → local-dist}/ai.d.ts.map +0 -0
  350. /package/{dist → local-dist}/ai.js +0 -0
  351. /package/{dist → local-dist}/ai.js.map +0 -0
  352. /package/{dist → local-dist}/bot/actions/bash.d.ts +0 -0
  353. /package/{dist → local-dist}/bot/actions/bash.d.ts.map +0 -0
  354. /package/{dist → local-dist}/bot/actions/bash.js +0 -0
  355. /package/{dist → local-dist}/bot/actions/bash.js.map +0 -0
  356. /package/{dist → local-dist}/bot/actions/crew/activity-tracker.d.ts +0 -0
  357. /package/{dist → local-dist}/bot/actions/crew/activity-tracker.d.ts.map +0 -0
  358. /package/{dist → local-dist}/bot/actions/crew/cleanup.d.ts +0 -0
  359. /package/{dist → local-dist}/bot/actions/crew/cleanup.d.ts.map +0 -0
  360. /package/{dist → local-dist}/bot/actions/crew/cleanup.js +0 -0
  361. /package/{dist → local-dist}/bot/actions/crew/cleanup.js.map +0 -0
  362. /package/{dist → local-dist}/bot/actions/crew/fs-lock.d.ts +0 -0
  363. /package/{dist → local-dist}/bot/actions/crew/fs-lock.d.ts.map +0 -0
  364. /package/{dist → local-dist}/bot/actions/crew/fs-lock.js +0 -0
  365. /package/{dist → local-dist}/bot/actions/crew/fs-lock.js.map +0 -0
  366. /package/{dist → local-dist}/bot/actions/crew/index.d.ts +0 -0
  367. /package/{dist → local-dist}/bot/actions/crew/index.d.ts.map +0 -0
  368. /package/{dist → local-dist}/bot/actions/crew/index.js +0 -0
  369. /package/{dist → local-dist}/bot/actions/crew/index.js.map +0 -0
  370. /package/{dist → local-dist}/bot/actions/crew/mailbox.d.ts +0 -0
  371. /package/{dist → local-dist}/bot/actions/crew/mailbox.d.ts.map +0 -0
  372. /package/{dist → local-dist}/bot/actions/crew/mailbox.js +0 -0
  373. /package/{dist → local-dist}/bot/actions/crew/mailbox.js.map +0 -0
  374. /package/{dist → local-dist}/bot/actions/crew/model-policy.d.ts +0 -0
  375. /package/{dist → local-dist}/bot/actions/crew/model-policy.d.ts.map +0 -0
  376. /package/{dist → local-dist}/bot/actions/crew/model-policy.js +0 -0
  377. /package/{dist → local-dist}/bot/actions/crew/model-policy.js.map +0 -0
  378. /package/{dist → local-dist}/bot/actions/crew/names.d.ts +0 -0
  379. /package/{dist → local-dist}/bot/actions/crew/names.d.ts.map +0 -0
  380. /package/{dist → local-dist}/bot/actions/crew/names.js +0 -0
  381. /package/{dist → local-dist}/bot/actions/crew/names.js.map +0 -0
  382. /package/{dist → local-dist}/bot/actions/crew/protocol.d.ts +0 -0
  383. /package/{dist → local-dist}/bot/actions/crew/protocol.d.ts.map +0 -0
  384. /package/{dist → local-dist}/bot/actions/crew/protocol.js +0 -0
  385. /package/{dist → local-dist}/bot/actions/crew/protocol.js.map +0 -0
  386. /package/{dist → local-dist}/bot/actions/crew/task-store.d.ts +0 -0
  387. /package/{dist → local-dist}/bot/actions/crew/task-store.d.ts.map +0 -0
  388. /package/{dist → local-dist}/bot/actions/crew/task-store.js +0 -0
  389. /package/{dist → local-dist}/bot/actions/crew/task-store.js.map +0 -0
  390. /package/{dist → local-dist}/bot/actions/crew/team-attach-claim.d.ts +0 -0
  391. /package/{dist → local-dist}/bot/actions/crew/team-attach-claim.d.ts.map +0 -0
  392. /package/{dist → local-dist}/bot/actions/crew/team-attach-claim.js +0 -0
  393. /package/{dist → local-dist}/bot/actions/crew/team-attach-claim.js.map +0 -0
  394. /package/{dist → local-dist}/bot/actions/crew/team-config.d.ts +0 -0
  395. /package/{dist → local-dist}/bot/actions/crew/team-config.d.ts.map +0 -0
  396. /package/{dist → local-dist}/bot/actions/crew/team-config.js +0 -0
  397. /package/{dist → local-dist}/bot/actions/crew/team-config.js.map +0 -0
  398. /package/{dist → local-dist}/bot/actions/crew/worktree.d.ts +0 -0
  399. /package/{dist → local-dist}/bot/actions/crew/worktree.d.ts.map +0 -0
  400. /package/{dist → local-dist}/bot/actions/edit-diff.d.ts +0 -0
  401. /package/{dist → local-dist}/bot/actions/edit-diff.d.ts.map +0 -0
  402. /package/{dist → local-dist}/bot/actions/edit-diff.js +0 -0
  403. /package/{dist → local-dist}/bot/actions/edit-diff.js.map +0 -0
  404. /package/{dist → local-dist}/bot/actions/edit.d.ts +0 -0
  405. /package/{dist → local-dist}/bot/actions/edit.d.ts.map +0 -0
  406. /package/{dist → local-dist}/bot/actions/edit.js +0 -0
  407. /package/{dist → local-dist}/bot/actions/edit.js.map +0 -0
  408. /package/{dist → local-dist}/bot/actions/find.d.ts +0 -0
  409. /package/{dist → local-dist}/bot/actions/find.d.ts.map +0 -0
  410. /package/{dist → local-dist}/bot/actions/find.js +0 -0
  411. /package/{dist → local-dist}/bot/actions/find.js.map +0 -0
  412. /package/{dist → local-dist}/bot/actions/grep.d.ts +0 -0
  413. /package/{dist → local-dist}/bot/actions/grep.d.ts.map +0 -0
  414. /package/{dist → local-dist}/bot/actions/grep.js +0 -0
  415. /package/{dist → local-dist}/bot/actions/grep.js.map +0 -0
  416. /package/{dist → local-dist}/bot/actions/kit/hook-runner.d.ts +0 -0
  417. /package/{dist → local-dist}/bot/actions/kit/hook-runner.d.ts.map +0 -0
  418. /package/{dist → local-dist}/bot/actions/kit/hook-runner.js +0 -0
  419. /package/{dist → local-dist}/bot/actions/kit/hook-runner.js.map +0 -0
  420. /package/{dist → local-dist}/bot/actions/kit/image-resize.d.ts +0 -0
  421. /package/{dist → local-dist}/bot/actions/kit/image-resize.d.ts.map +0 -0
  422. /package/{dist → local-dist}/bot/actions/kit/image-resize.js +0 -0
  423. /package/{dist → local-dist}/bot/actions/kit/image-resize.js.map +0 -0
  424. /package/{dist → local-dist}/bot/actions/kit/mime.d.ts +0 -0
  425. /package/{dist → local-dist}/bot/actions/kit/mime.d.ts.map +0 -0
  426. /package/{dist → local-dist}/bot/actions/kit/mime.js +0 -0
  427. /package/{dist → local-dist}/bot/actions/kit/mime.js.map +0 -0
  428. /package/{dist → local-dist}/bot/actions/kit/shell.d.ts +0 -0
  429. /package/{dist → local-dist}/bot/actions/kit/shell.d.ts.map +0 -0
  430. /package/{dist → local-dist}/bot/actions/kit/shell.js +0 -0
  431. /package/{dist → local-dist}/bot/actions/kit/shell.js.map +0 -0
  432. /package/{dist → local-dist}/bot/actions/ls.d.ts +0 -0
  433. /package/{dist → local-dist}/bot/actions/ls.d.ts.map +0 -0
  434. /package/{dist → local-dist}/bot/actions/ls.js +0 -0
  435. /package/{dist → local-dist}/bot/actions/ls.js.map +0 -0
  436. /package/{dist → local-dist}/bot/actions/path-utils.d.ts +0 -0
  437. /package/{dist → local-dist}/bot/actions/path-utils.d.ts.map +0 -0
  438. /package/{dist → local-dist}/bot/actions/path-utils.js +0 -0
  439. /package/{dist → local-dist}/bot/actions/path-utils.js.map +0 -0
  440. /package/{dist → local-dist}/bot/actions/process-controller.d.ts +0 -0
  441. /package/{dist → local-dist}/bot/actions/process-controller.d.ts.map +0 -0
  442. /package/{dist → local-dist}/bot/actions/process-controller.js +0 -0
  443. /package/{dist → local-dist}/bot/actions/process-controller.js.map +0 -0
  444. /package/{dist → local-dist}/bot/actions/process-manager.d.ts +0 -0
  445. /package/{dist → local-dist}/bot/actions/process-manager.d.ts.map +0 -0
  446. /package/{dist → local-dist}/bot/actions/process-types.d.ts +0 -0
  447. /package/{dist → local-dist}/bot/actions/process-types.d.ts.map +0 -0
  448. /package/{dist → local-dist}/bot/actions/process-types.js +0 -0
  449. /package/{dist → local-dist}/bot/actions/process-types.js.map +0 -0
  450. /package/{dist → local-dist}/bot/actions/process.d.ts +0 -0
  451. /package/{dist → local-dist}/bot/actions/process.d.ts.map +0 -0
  452. /package/{dist → local-dist}/bot/actions/process.js +0 -0
  453. /package/{dist → local-dist}/bot/actions/process.js.map +0 -0
  454. /package/{dist → local-dist}/bot/actions/read.d.ts +0 -0
  455. /package/{dist → local-dist}/bot/actions/read.d.ts.map +0 -0
  456. /package/{dist → local-dist}/bot/actions/read.js +0 -0
  457. /package/{dist → local-dist}/bot/actions/read.js.map +0 -0
  458. /package/{dist → local-dist}/bot/actions/registry.d.ts +0 -0
  459. /package/{dist → local-dist}/bot/actions/registry.d.ts.map +0 -0
  460. /package/{dist → local-dist}/bot/actions/registry.js +0 -0
  461. /package/{dist → local-dist}/bot/actions/registry.js.map +0 -0
  462. /package/{dist → local-dist}/bot/actions/todo-store.d.ts +0 -0
  463. /package/{dist → local-dist}/bot/actions/todo-store.d.ts.map +0 -0
  464. /package/{dist → local-dist}/bot/actions/todo-store.js +0 -0
  465. /package/{dist → local-dist}/bot/actions/todo-store.js.map +0 -0
  466. /package/{dist → local-dist}/bot/actions/todo-types.d.ts +0 -0
  467. /package/{dist → local-dist}/bot/actions/todo-types.d.ts.map +0 -0
  468. /package/{dist → local-dist}/bot/actions/todo-types.js +0 -0
  469. /package/{dist → local-dist}/bot/actions/todo-types.js.map +0 -0
  470. /package/{dist → local-dist}/bot/actions/todo.d.ts +0 -0
  471. /package/{dist → local-dist}/bot/actions/todo.d.ts.map +0 -0
  472. /package/{dist → local-dist}/bot/actions/todo.js +0 -0
  473. /package/{dist → local-dist}/bot/actions/todo.js.map +0 -0
  474. /package/{dist → local-dist}/bot/actions/truncate.d.ts +0 -0
  475. /package/{dist → local-dist}/bot/actions/truncate.d.ts.map +0 -0
  476. /package/{dist → local-dist}/bot/actions/truncate.js +0 -0
  477. /package/{dist → local-dist}/bot/actions/truncate.js.map +0 -0
  478. /package/{dist → local-dist}/bot/actions/webfetch.d.ts +0 -0
  479. /package/{dist → local-dist}/bot/actions/webfetch.d.ts.map +0 -0
  480. /package/{dist → local-dist}/bot/actions/webfetch.js +0 -0
  481. /package/{dist → local-dist}/bot/actions/webfetch.js.map +0 -0
  482. /package/{dist → local-dist}/bot/actions/websearch.d.ts +0 -0
  483. /package/{dist → local-dist}/bot/actions/websearch.d.ts.map +0 -0
  484. /package/{dist → local-dist}/bot/actions/websearch.js +0 -0
  485. /package/{dist → local-dist}/bot/actions/websearch.js.map +0 -0
  486. /package/{dist → local-dist}/bot/actions/write.d.ts +0 -0
  487. /package/{dist → local-dist}/bot/actions/write.d.ts.map +0 -0
  488. /package/{dist → local-dist}/bot/actions/write.js +0 -0
  489. /package/{dist → local-dist}/bot/actions/write.js.map +0 -0
  490. /package/{dist → local-dist}/bot/agent-loop.d.ts +0 -0
  491. /package/{dist → local-dist}/bot/agent-loop.d.ts.map +0 -0
  492. /package/{dist → local-dist}/bot/agent-loop.js +0 -0
  493. /package/{dist → local-dist}/bot/agent-loop.js.map +0 -0
  494. /package/{dist → local-dist}/bot/agent.d.ts +0 -0
  495. /package/{dist → local-dist}/bot/agent.d.ts.map +0 -0
  496. /package/{dist → local-dist}/bot/agent.js +0 -0
  497. /package/{dist → local-dist}/bot/agent.js.map +0 -0
  498. /package/{dist → local-dist}/bot/error-handler.d.ts +0 -0
  499. /package/{dist → local-dist}/bot/error-handler.d.ts.map +0 -0
  500. /package/{dist → local-dist}/bot/error-handler.js +0 -0
  501. /package/{dist → local-dist}/bot/error-handler.js.map +0 -0
  502. /package/{dist → local-dist}/bot/event-bus.d.ts +0 -0
  503. /package/{dist → local-dist}/bot/event-bus.d.ts.map +0 -0
  504. /package/{dist → local-dist}/bot/event-bus.js +0 -0
  505. /package/{dist → local-dist}/bot/event-bus.js.map +0 -0
  506. /package/{dist → local-dist}/bot/index.d.ts +0 -0
  507. /package/{dist → local-dist}/bot/index.d.ts.map +0 -0
  508. /package/{dist → local-dist}/bot/index.js +0 -0
  509. /package/{dist → local-dist}/bot/index.js.map +0 -0
  510. /package/{dist → local-dist}/bot/messages.d.ts +0 -0
  511. /package/{dist → local-dist}/bot/messages.d.ts.map +0 -0
  512. /package/{dist → local-dist}/bot/messages.js +0 -0
  513. /package/{dist → local-dist}/bot/messages.js.map +0 -0
  514. /package/{dist → local-dist}/bot/proxy.d.ts +0 -0
  515. /package/{dist → local-dist}/bot/proxy.d.ts.map +0 -0
  516. /package/{dist → local-dist}/bot/proxy.js +0 -0
  517. /package/{dist → local-dist}/bot/proxy.js.map +0 -0
  518. /package/{dist → local-dist}/bot/session-manager.d.ts +0 -0
  519. /package/{dist → local-dist}/bot/session-manager.d.ts.map +0 -0
  520. /package/{dist → local-dist}/bot/session-manager.js +0 -0
  521. /package/{dist → local-dist}/bot/session-manager.js.map +0 -0
  522. /package/{dist → local-dist}/bot/state-manager.d.ts +0 -0
  523. /package/{dist → local-dist}/bot/state-manager.d.ts.map +0 -0
  524. /package/{dist → local-dist}/bot/state-manager.js +0 -0
  525. /package/{dist → local-dist}/bot/state-manager.js.map +0 -0
  526. /package/{dist → local-dist}/bot/telemetry.d.ts +0 -0
  527. /package/{dist → local-dist}/bot/telemetry.d.ts.map +0 -0
  528. /package/{dist → local-dist}/bot/telemetry.js +0 -0
  529. /package/{dist → local-dist}/bot/telemetry.js.map +0 -0
  530. /package/{dist → local-dist}/bot/types.d.ts +0 -0
  531. /package/{dist → local-dist}/bot/types.d.ts.map +0 -0
  532. /package/{dist → local-dist}/bot/types.js +0 -0
  533. /package/{dist → local-dist}/bot/types.js.map +0 -0
  534. /package/{dist → local-dist}/cli.d.ts +0 -0
  535. /package/{dist → local-dist}/cli.d.ts.map +0 -0
  536. /package/{dist → local-dist}/cli.js +0 -0
  537. /package/{dist → local-dist}/cli.js.map +0 -0
  538. /package/{dist → local-dist}/mcp/client-pool.d.ts.map +0 -0
  539. /package/{dist → local-dist}/mcp/client-pool.js.map +0 -0
  540. /package/{dist → local-dist}/mcp/client.d.ts.map +0 -0
  541. /package/{dist → local-dist}/mcp/client.js.map +0 -0
  542. /package/{dist → local-dist}/mcp/config.d.ts.map +0 -0
  543. /package/{dist → local-dist}/mcp/config.js.map +0 -0
  544. /package/{dist → local-dist}/mcp/errors.d.ts.map +0 -0
  545. /package/{dist → local-dist}/mcp/errors.js.map +0 -0
  546. /package/{dist → local-dist}/mcp/index.d.ts +0 -0
  547. /package/{dist → local-dist}/mcp/index.d.ts.map +0 -0
  548. /package/{dist → local-dist}/mcp/index.js +0 -0
  549. /package/{dist → local-dist}/mcp/index.js.map +0 -0
  550. /package/{dist → local-dist}/mcp/schema-converter.d.ts.map +0 -0
  551. /package/{dist → local-dist}/mcp/schema-converter.js.map +0 -0
  552. /package/{dist → local-dist}/mcp/server.d.ts.map +0 -0
  553. /package/{dist → local-dist}/mcp/server.js.map +0 -0
  554. /package/{dist → local-dist}/mcp/tool-factory.d.ts.map +0 -0
  555. /package/{dist → local-dist}/mcp/tool-factory.js.map +0 -0
  556. /package/{dist → local-dist}/mcp/types.d.ts.map +0 -0
  557. /package/{dist → local-dist}/mcp/types.js.map +0 -0
  558. /package/{dist → local-dist}/mcp.d.ts +0 -0
  559. /package/{dist → local-dist}/mcp.d.ts.map +0 -0
  560. /package/{dist → local-dist}/mcp.js +0 -0
  561. /package/{dist → local-dist}/mcp.js.map +0 -0
  562. /package/{dist → local-dist}/ml/adapters/amazon-bedrock.d.ts +0 -0
  563. /package/{dist → local-dist}/ml/adapters/amazon-bedrock.d.ts.map +0 -0
  564. /package/{dist → local-dist}/ml/adapters/amazon-bedrock.js +0 -0
  565. /package/{dist → local-dist}/ml/adapters/amazon-bedrock.js.map +0 -0
  566. /package/{dist → local-dist}/ml/adapters/anthropic.d.ts +0 -0
  567. /package/{dist → local-dist}/ml/adapters/anthropic.d.ts.map +0 -0
  568. /package/{dist → local-dist}/ml/adapters/anthropic.js +0 -0
  569. /package/{dist → local-dist}/ml/adapters/anthropic.js.map +0 -0
  570. /package/{dist → local-dist}/ml/adapters/azure-openai-responses.d.ts +0 -0
  571. /package/{dist → local-dist}/ml/adapters/azure-openai-responses.d.ts.map +0 -0
  572. /package/{dist → local-dist}/ml/adapters/azure-openai-responses.js +0 -0
  573. /package/{dist → local-dist}/ml/adapters/azure-openai-responses.js.map +0 -0
  574. /package/{dist → local-dist}/ml/adapters/google-shared.d.ts +0 -0
  575. /package/{dist → local-dist}/ml/adapters/google-shared.d.ts.map +0 -0
  576. /package/{dist → local-dist}/ml/adapters/google-shared.js +0 -0
  577. /package/{dist → local-dist}/ml/adapters/google-shared.js.map +0 -0
  578. /package/{dist → local-dist}/ml/adapters/google-vertex.d.ts +0 -0
  579. /package/{dist → local-dist}/ml/adapters/google-vertex.d.ts.map +0 -0
  580. /package/{dist → local-dist}/ml/adapters/google-vertex.js +0 -0
  581. /package/{dist → local-dist}/ml/adapters/google-vertex.js.map +0 -0
  582. /package/{dist → local-dist}/ml/adapters/google.d.ts +0 -0
  583. /package/{dist → local-dist}/ml/adapters/google.d.ts.map +0 -0
  584. /package/{dist → local-dist}/ml/adapters/google.js +0 -0
  585. /package/{dist → local-dist}/ml/adapters/google.js.map +0 -0
  586. /package/{dist → local-dist}/ml/adapters/kimi.d.ts +0 -0
  587. /package/{dist → local-dist}/ml/adapters/kimi.d.ts.map +0 -0
  588. /package/{dist → local-dist}/ml/adapters/kimi.js +0 -0
  589. /package/{dist → local-dist}/ml/adapters/kimi.js.map +0 -0
  590. /package/{dist → local-dist}/ml/adapters/mock.d.ts +0 -0
  591. /package/{dist → local-dist}/ml/adapters/mock.d.ts.map +0 -0
  592. /package/{dist → local-dist}/ml/adapters/mock.js +0 -0
  593. /package/{dist → local-dist}/ml/adapters/mock.js.map +0 -0
  594. /package/{dist → local-dist}/ml/adapters/openai-codex-responses.d.ts +0 -0
  595. /package/{dist → local-dist}/ml/adapters/openai-codex-responses.d.ts.map +0 -0
  596. /package/{dist → local-dist}/ml/adapters/openai-completions.d.ts +0 -0
  597. /package/{dist → local-dist}/ml/adapters/openai-completions.d.ts.map +0 -0
  598. /package/{dist → local-dist}/ml/adapters/openai-completions.js +0 -0
  599. /package/{dist → local-dist}/ml/adapters/openai-completions.js.map +0 -0
  600. /package/{dist → local-dist}/ml/adapters/openai-responses-shared.d.ts +0 -0
  601. /package/{dist → local-dist}/ml/adapters/openai-responses-shared.d.ts.map +0 -0
  602. /package/{dist → local-dist}/ml/adapters/openai-responses-shared.js +0 -0
  603. /package/{dist → local-dist}/ml/adapters/openai-responses-shared.js.map +0 -0
  604. /package/{dist → local-dist}/ml/adapters/openai-responses.d.ts +0 -0
  605. /package/{dist → local-dist}/ml/adapters/openai-responses.d.ts.map +0 -0
  606. /package/{dist → local-dist}/ml/adapters/openai-responses.js +0 -0
  607. /package/{dist → local-dist}/ml/adapters/openai-responses.js.map +0 -0
  608. /package/{dist → local-dist}/ml/adapters/openai-scaffold.d.ts +0 -0
  609. /package/{dist → local-dist}/ml/adapters/openai-scaffold.d.ts.map +0 -0
  610. /package/{dist → local-dist}/ml/adapters/openai-scaffold.js +0 -0
  611. /package/{dist → local-dist}/ml/adapters/openai-scaffold.js.map +0 -0
  612. /package/{dist → local-dist}/ml/adapters/register-builtins.d.ts +0 -0
  613. /package/{dist → local-dist}/ml/adapters/register-builtins.d.ts.map +0 -0
  614. /package/{dist → local-dist}/ml/adapters/register-builtins.js +0 -0
  615. /package/{dist → local-dist}/ml/adapters/register-builtins.js.map +0 -0
  616. /package/{dist → local-dist}/ml/adapters/simple-options.d.ts +0 -0
  617. /package/{dist → local-dist}/ml/adapters/simple-options.d.ts.map +0 -0
  618. /package/{dist → local-dist}/ml/adapters/simple-options.js +0 -0
  619. /package/{dist → local-dist}/ml/adapters/simple-options.js.map +0 -0
  620. /package/{dist → local-dist}/ml/adapters/transform-messages.d.ts +0 -0
  621. /package/{dist → local-dist}/ml/adapters/transform-messages.d.ts.map +0 -0
  622. /package/{dist → local-dist}/ml/adapters/transform-messages.js +0 -0
  623. /package/{dist → local-dist}/ml/adapters/transform-messages.js.map +0 -0
  624. /package/{dist → local-dist}/ml/api-registry.d.ts +0 -0
  625. /package/{dist → local-dist}/ml/api-registry.d.ts.map +0 -0
  626. /package/{dist → local-dist}/ml/api-registry.js +0 -0
  627. /package/{dist → local-dist}/ml/api-registry.js.map +0 -0
  628. /package/{dist → local-dist}/ml/cli.d.ts +0 -0
  629. /package/{dist → local-dist}/ml/cli.d.ts.map +0 -0
  630. /package/{dist → local-dist}/ml/cli.js +0 -0
  631. /package/{dist → local-dist}/ml/cli.js.map +0 -0
  632. /package/{dist → local-dist}/ml/env-api-keys.d.ts +0 -0
  633. /package/{dist → local-dist}/ml/env-api-keys.d.ts.map +0 -0
  634. /package/{dist → local-dist}/ml/env-api-keys.js +0 -0
  635. /package/{dist → local-dist}/ml/env-api-keys.js.map +0 -0
  636. /package/{dist → local-dist}/ml/index.d.ts +0 -0
  637. /package/{dist → local-dist}/ml/index.d.ts.map +0 -0
  638. /package/{dist → local-dist}/ml/index.js +0 -0
  639. /package/{dist → local-dist}/ml/index.js.map +0 -0
  640. /package/{dist → local-dist}/ml/kit/auth/anthropic.d.ts +0 -0
  641. /package/{dist → local-dist}/ml/kit/auth/anthropic.d.ts.map +0 -0
  642. /package/{dist → local-dist}/ml/kit/auth/anthropic.js +0 -0
  643. /package/{dist → local-dist}/ml/kit/auth/anthropic.js.map +0 -0
  644. /package/{dist → local-dist}/ml/kit/auth/github-copilot.d.ts +0 -0
  645. /package/{dist → local-dist}/ml/kit/auth/github-copilot.d.ts.map +0 -0
  646. /package/{dist → local-dist}/ml/kit/auth/github-copilot.js +0 -0
  647. /package/{dist → local-dist}/ml/kit/auth/github-copilot.js.map +0 -0
  648. /package/{dist → local-dist}/ml/kit/auth/index.d.ts +0 -0
  649. /package/{dist → local-dist}/ml/kit/auth/index.d.ts.map +0 -0
  650. /package/{dist → local-dist}/ml/kit/auth/index.js +0 -0
  651. /package/{dist → local-dist}/ml/kit/auth/index.js.map +0 -0
  652. /package/{dist → local-dist}/ml/kit/auth/kimi.d.ts +0 -0
  653. /package/{dist → local-dist}/ml/kit/auth/kimi.d.ts.map +0 -0
  654. /package/{dist → local-dist}/ml/kit/auth/kimi.js +0 -0
  655. /package/{dist → local-dist}/ml/kit/auth/kimi.js.map +0 -0
  656. /package/{dist → local-dist}/ml/kit/auth/openai-codex.d.ts.map +0 -0
  657. /package/{dist → local-dist}/ml/kit/auth/pkce.d.ts +0 -0
  658. /package/{dist → local-dist}/ml/kit/auth/pkce.d.ts.map +0 -0
  659. /package/{dist → local-dist}/ml/kit/auth/pkce.js +0 -0
  660. /package/{dist → local-dist}/ml/kit/auth/pkce.js.map +0 -0
  661. /package/{dist → local-dist}/ml/kit/auth/types.d.ts +0 -0
  662. /package/{dist → local-dist}/ml/kit/auth/types.d.ts.map +0 -0
  663. /package/{dist → local-dist}/ml/kit/auth/types.js +0 -0
  664. /package/{dist → local-dist}/ml/kit/auth/types.js.map +0 -0
  665. /package/{dist → local-dist}/ml/kit/base-stream-handler.d.ts +0 -0
  666. /package/{dist → local-dist}/ml/kit/base-stream-handler.d.ts.map +0 -0
  667. /package/{dist → local-dist}/ml/kit/base-stream-handler.js +0 -0
  668. /package/{dist → local-dist}/ml/kit/base-stream-handler.js.map +0 -0
  669. /package/{dist → local-dist}/ml/kit/event-stream.d.ts +0 -0
  670. /package/{dist → local-dist}/ml/kit/event-stream.d.ts.map +0 -0
  671. /package/{dist → local-dist}/ml/kit/event-stream.js +0 -0
  672. /package/{dist → local-dist}/ml/kit/event-stream.js.map +0 -0
  673. /package/{dist → local-dist}/ml/kit/index.d.ts +0 -0
  674. /package/{dist → local-dist}/ml/kit/index.d.ts.map +0 -0
  675. /package/{dist → local-dist}/ml/kit/index.js +0 -0
  676. /package/{dist → local-dist}/ml/kit/index.js.map +0 -0
  677. /package/{dist → local-dist}/ml/kit/json-parse.d.ts +0 -0
  678. /package/{dist → local-dist}/ml/kit/json-parse.d.ts.map +0 -0
  679. /package/{dist → local-dist}/ml/kit/json-parse.js +0 -0
  680. /package/{dist → local-dist}/ml/kit/json-parse.js.map +0 -0
  681. /package/{dist → local-dist}/ml/kit/message-transform.d.ts +0 -0
  682. /package/{dist → local-dist}/ml/kit/message-transform.d.ts.map +0 -0
  683. /package/{dist → local-dist}/ml/kit/message-transform.js +0 -0
  684. /package/{dist → local-dist}/ml/kit/message-transform.js.map +0 -0
  685. /package/{dist → local-dist}/ml/kit/output-factory.d.ts +0 -0
  686. /package/{dist → local-dist}/ml/kit/output-factory.d.ts.map +0 -0
  687. /package/{dist → local-dist}/ml/kit/output-factory.js +0 -0
  688. /package/{dist → local-dist}/ml/kit/output-factory.js.map +0 -0
  689. /package/{dist → local-dist}/ml/kit/overflow.d.ts +0 -0
  690. /package/{dist → local-dist}/ml/kit/overflow.d.ts.map +0 -0
  691. /package/{dist → local-dist}/ml/kit/overflow.js +0 -0
  692. /package/{dist → local-dist}/ml/kit/overflow.js.map +0 -0
  693. /package/{dist → local-dist}/ml/kit/provider-adapter.d.ts +0 -0
  694. /package/{dist → local-dist}/ml/kit/provider-adapter.d.ts.map +0 -0
  695. /package/{dist → local-dist}/ml/kit/provider-adapter.js +0 -0
  696. /package/{dist → local-dist}/ml/kit/provider-adapter.js.map +0 -0
  697. /package/{dist → local-dist}/ml/kit/provider-client-builder.d.ts +0 -0
  698. /package/{dist → local-dist}/ml/kit/provider-client-builder.d.ts.map +0 -0
  699. /package/{dist → local-dist}/ml/kit/provider-client-builder.js +0 -0
  700. /package/{dist → local-dist}/ml/kit/provider-client-builder.js.map +0 -0
  701. /package/{dist → local-dist}/ml/kit/provider-consolidation.d.ts +0 -0
  702. /package/{dist → local-dist}/ml/kit/provider-consolidation.d.ts.map +0 -0
  703. /package/{dist → local-dist}/ml/kit/provider-consolidation.js +0 -0
  704. /package/{dist → local-dist}/ml/kit/provider-consolidation.js.map +0 -0
  705. /package/{dist → local-dist}/ml/kit/provider-constants.d.ts +0 -0
  706. /package/{dist → local-dist}/ml/kit/provider-constants.d.ts.map +0 -0
  707. /package/{dist → local-dist}/ml/kit/provider-constants.js +0 -0
  708. /package/{dist → local-dist}/ml/kit/provider-constants.js.map +0 -0
  709. /package/{dist → local-dist}/ml/kit/provider-errors.d.ts +0 -0
  710. /package/{dist → local-dist}/ml/kit/provider-errors.d.ts.map +0 -0
  711. /package/{dist → local-dist}/ml/kit/provider-errors.js +0 -0
  712. /package/{dist → local-dist}/ml/kit/provider-errors.js.map +0 -0
  713. /package/{dist → local-dist}/ml/kit/sanitize-unicode.d.ts +0 -0
  714. /package/{dist → local-dist}/ml/kit/sanitize-unicode.d.ts.map +0 -0
  715. /package/{dist → local-dist}/ml/kit/sanitize-unicode.js +0 -0
  716. /package/{dist → local-dist}/ml/kit/sanitize-unicode.js.map +0 -0
  717. /package/{dist → local-dist}/ml/kit/stream-event-helper.d.ts +0 -0
  718. /package/{dist → local-dist}/ml/kit/stream-event-helper.d.ts.map +0 -0
  719. /package/{dist → local-dist}/ml/kit/stream-event-helper.js +0 -0
  720. /package/{dist → local-dist}/ml/kit/stream-event-helper.js.map +0 -0
  721. /package/{dist → local-dist}/ml/kit/stream-handler-types.d.ts +0 -0
  722. /package/{dist → local-dist}/ml/kit/stream-handler-types.d.ts.map +0 -0
  723. /package/{dist → local-dist}/ml/kit/stream-handler-types.js +0 -0
  724. /package/{dist → local-dist}/ml/kit/stream-handler-types.js.map +0 -0
  725. /package/{dist → local-dist}/ml/kit/streaming-state-manager.d.ts +0 -0
  726. /package/{dist → local-dist}/ml/kit/streaming-state-manager.d.ts.map +0 -0
  727. /package/{dist → local-dist}/ml/kit/streaming-state-manager.js +0 -0
  728. /package/{dist → local-dist}/ml/kit/streaming-state-manager.js.map +0 -0
  729. /package/{dist → local-dist}/ml/kit/tool-converter.d.ts +0 -0
  730. /package/{dist → local-dist}/ml/kit/tool-converter.d.ts.map +0 -0
  731. /package/{dist → local-dist}/ml/kit/tool-converter.js +0 -0
  732. /package/{dist → local-dist}/ml/kit/tool-converter.js.map +0 -0
  733. /package/{dist → local-dist}/ml/kit/typebox-helpers.d.ts +0 -0
  734. /package/{dist → local-dist}/ml/kit/typebox-helpers.d.ts.map +0 -0
  735. /package/{dist → local-dist}/ml/kit/typebox-helpers.js +0 -0
  736. /package/{dist → local-dist}/ml/kit/typebox-helpers.js.map +0 -0
  737. /package/{dist → local-dist}/ml/kit/validation.d.ts +0 -0
  738. /package/{dist → local-dist}/ml/kit/validation.d.ts.map +0 -0
  739. /package/{dist → local-dist}/ml/kit/validation.js +0 -0
  740. /package/{dist → local-dist}/ml/kit/validation.js.map +0 -0
  741. /package/{dist → local-dist}/ml/models.d.ts +0 -0
  742. /package/{dist → local-dist}/ml/models.d.ts.map +0 -0
  743. /package/{dist → local-dist}/ml/models.generated.d.ts +0 -0
  744. /package/{dist → local-dist}/ml/models.generated.d.ts.map +0 -0
  745. /package/{dist → local-dist}/ml/models.generated.js +0 -0
  746. /package/{dist → local-dist}/ml/models.generated.js.map +0 -0
  747. /package/{dist → local-dist}/ml/models.js +0 -0
  748. /package/{dist → local-dist}/ml/models.js.map +0 -0
  749. /package/{dist → local-dist}/ml/stream.d.ts +0 -0
  750. /package/{dist → local-dist}/ml/stream.d.ts.map +0 -0
  751. /package/{dist → local-dist}/ml/stream.js +0 -0
  752. /package/{dist → local-dist}/ml/stream.js.map +0 -0
  753. /package/{dist → local-dist}/ml/types.d.ts +0 -0
  754. /package/{dist → local-dist}/ml/types.d.ts.map +0 -0
  755. /package/{dist → local-dist}/ml/types.js +0 -0
  756. /package/{dist → local-dist}/ml/types.js.map +0 -0
  757. /package/{dist → local-dist}/observability.d.ts +0 -0
  758. /package/{dist → local-dist}/observability.d.ts.map +0 -0
  759. /package/{dist → local-dist}/observability.js +0 -0
  760. /package/{dist → local-dist}/observability.js.map +0 -0
  761. /package/{dist → local-dist}/ui/autocomplete.d.ts +0 -0
  762. /package/{dist → local-dist}/ui/autocomplete.d.ts.map +0 -0
  763. /package/{dist → local-dist}/ui/autocomplete.js +0 -0
  764. /package/{dist → local-dist}/ui/autocomplete.js.map +0 -0
  765. /package/{dist → local-dist}/ui/editor-component.js +0 -0
  766. /package/{dist → local-dist}/ui/editor-component.js.map +0 -0
  767. /package/{dist → local-dist}/ui/fuzzy.d.ts +0 -0
  768. /package/{dist → local-dist}/ui/fuzzy.d.ts.map +0 -0
  769. /package/{dist → local-dist}/ui/fuzzy.js +0 -0
  770. /package/{dist → local-dist}/ui/fuzzy.js.map +0 -0
  771. /package/{dist → local-dist}/ui/keybindings.d.ts +0 -0
  772. /package/{dist → local-dist}/ui/keybindings.d.ts.map +0 -0
  773. /package/{dist → local-dist}/ui/keybindings.js +0 -0
  774. /package/{dist → local-dist}/ui/keybindings.js.map +0 -0
  775. /package/{dist → local-dist}/ui/keys.d.ts +0 -0
  776. /package/{dist → local-dist}/ui/keys.d.ts.map +0 -0
  777. /package/{dist → local-dist}/ui/keys.js +0 -0
  778. /package/{dist → local-dist}/ui/keys.js.map +0 -0
  779. /package/{dist → local-dist}/ui/utils.d.ts +0 -0
  780. /package/{dist → local-dist}/ui/utils.d.ts.map +0 -0
  781. /package/{dist → local-dist}/ui/utils.js +0 -0
  782. /package/{dist → local-dist}/ui/utils.js.map +0 -0
package/dist/ui/tui.js DELETED
@@ -1,937 +0,0 @@
1
- /**
2
- * Minimal TUI implementation with differential rendering
3
- */
4
- import * as fs from "node:fs";
5
- import * as os from "node:os";
6
- import * as path from "node:path";
7
- import { isKeyRelease, matchesKey } from "./keys.js";
8
- import { getCapabilities, setCellDimensions } from "./terminal-image.js";
9
- import { extractSegments, sliceByColumn, sliceWithWidth, visibleWidth } from "./utils.js";
10
- export class ComponentBase {
11
- _cachedWidth;
12
- _cachedRender;
13
- wantsKeyRelease;
14
- invalidate() {
15
- this._cachedWidth = undefined;
16
- this._cachedRender = undefined;
17
- }
18
- renderCached(width, renderFn) {
19
- if (this._cachedRender && this._cachedWidth === width) {
20
- return this._cachedRender;
21
- }
22
- const rendered = renderFn();
23
- this._cachedWidth = width;
24
- this._cachedRender = rendered;
25
- return rendered;
26
- }
27
- }
28
- /** Type guard to check if a component implements Focusable */
29
- export function isFocusable(component) {
30
- return component !== null && "focused" in component;
31
- }
32
- /**
33
- * Cursor position marker - APC (Application Program Command) sequence.
34
- * This is a zero-width escape sequence that terminals ignore.
35
- * Components emit this at the cursor position when focused.
36
- * TUI finds and strips this marker, then positions the hardware cursor there.
37
- */
38
- export const CURSOR_MARKER = "\x1b_pi:c\x07";
39
- export { visibleWidth };
40
- /** Parse a SizeValue into absolute value given a reference size */
41
- function parseSizeValue(value, referenceSize) {
42
- if (value === undefined)
43
- return undefined;
44
- if (typeof value === "number")
45
- return value;
46
- // Parse percentage string like "50%"
47
- const match = value.match(/^(\d+(?:\.\d+)?)%$/);
48
- if (match) {
49
- return Math.floor((referenceSize * parseFloat(match[1])) / 100);
50
- }
51
- return undefined;
52
- }
53
- export class FocusManager {
54
- focused = null;
55
- setFocus(component) {
56
- const previous = this.focused;
57
- if (isFocusable(previous))
58
- previous.focused = false;
59
- previous?.onBlur?.();
60
- this.focused = component;
61
- if (isFocusable(component))
62
- component.focused = true;
63
- component?.onFocus?.();
64
- return { previous, current: component };
65
- }
66
- getFocus() {
67
- return this.focused;
68
- }
69
- }
70
- export class RenderEngine {
71
- diffLines(oldLines, newLines) {
72
- let firstChanged = -1;
73
- let lastChanged = -1;
74
- const maxLines = Math.max(newLines.length, oldLines.length);
75
- for (let i = 0; i < maxLines; i++) {
76
- const oldLine = i < oldLines.length ? oldLines[i] : "";
77
- const newLine = i < newLines.length ? newLines[i] : "";
78
- if (oldLine !== newLine) {
79
- if (firstChanged === -1)
80
- firstChanged = i;
81
- lastChanged = i;
82
- }
83
- }
84
- const appended = newLines.length > oldLines.length;
85
- if (appended) {
86
- if (firstChanged === -1)
87
- firstChanged = oldLines.length;
88
- lastChanged = newLines.length - 1;
89
- }
90
- return { firstChanged, lastChanged, appended };
91
- }
92
- }
93
- export class LayoutEngine {
94
- resolveOverlayLayout(options, overlayHeight, termWidth, termHeight) {
95
- const opt = options ?? {};
96
- const margin = typeof opt.margin === "number"
97
- ? { top: opt.margin, right: opt.margin, bottom: opt.margin, left: opt.margin }
98
- : (opt.margin ?? {});
99
- const marginTop = Math.max(0, margin.top ?? 0);
100
- const marginRight = Math.max(0, margin.right ?? 0);
101
- const marginBottom = Math.max(0, margin.bottom ?? 0);
102
- const marginLeft = Math.max(0, margin.left ?? 0);
103
- const availWidth = Math.max(1, termWidth - marginLeft - marginRight);
104
- const availHeight = Math.max(1, termHeight - marginTop - marginBottom);
105
- let width = parseSizeValue(opt.width, termWidth) ?? Math.min(80, availWidth);
106
- if (opt.minWidth !== undefined)
107
- width = Math.max(width, opt.minWidth);
108
- width = Math.max(1, Math.min(width, availWidth));
109
- let maxHeight = parseSizeValue(opt.maxHeight, termHeight);
110
- if (maxHeight !== undefined)
111
- maxHeight = Math.max(1, Math.min(maxHeight, availHeight));
112
- const effectiveHeight = maxHeight !== undefined ? Math.min(overlayHeight, maxHeight) : overlayHeight;
113
- let row;
114
- let col;
115
- if (opt.row !== undefined) {
116
- if (typeof opt.row === "string") {
117
- const match = opt.row.match(/^(\d+(?:\.\d+)?)%$/);
118
- if (match) {
119
- const maxRow = Math.max(0, availHeight - effectiveHeight);
120
- row = marginTop + Math.floor(maxRow * (parseFloat(match[1]) / 100));
121
- }
122
- else
123
- row = this.resolveAnchorRow("center", effectiveHeight, availHeight, marginTop);
124
- }
125
- else
126
- row = opt.row;
127
- }
128
- else
129
- row = this.resolveAnchorRow(opt.anchor ?? "center", effectiveHeight, availHeight, marginTop);
130
- if (opt.col !== undefined) {
131
- if (typeof opt.col === "string") {
132
- const match = opt.col.match(/^(\d+(?:\.\d+)?)%$/);
133
- if (match) {
134
- const maxCol = Math.max(0, availWidth - width);
135
- col = marginLeft + Math.floor(maxCol * (parseFloat(match[1]) / 100));
136
- }
137
- else
138
- col = this.resolveAnchorCol("center", width, availWidth, marginLeft);
139
- }
140
- else
141
- col = opt.col;
142
- }
143
- else
144
- col = this.resolveAnchorCol(opt.anchor ?? "center", width, availWidth, marginLeft);
145
- if (opt.offsetY !== undefined)
146
- row += opt.offsetY;
147
- if (opt.offsetX !== undefined)
148
- col += opt.offsetX;
149
- row = Math.max(marginTop, Math.min(row, termHeight - marginBottom - effectiveHeight));
150
- col = Math.max(marginLeft, Math.min(col, termWidth - marginRight - width));
151
- return { width, row, col, maxHeight };
152
- }
153
- resolveAnchorRow(anchor, height, availHeight, marginTop) {
154
- switch (anchor) {
155
- case "top-left":
156
- case "top-center":
157
- case "top-right":
158
- return marginTop;
159
- case "bottom-left":
160
- case "bottom-center":
161
- case "bottom-right":
162
- return marginTop + availHeight - height;
163
- default:
164
- return marginTop + Math.floor((availHeight - height) / 2);
165
- }
166
- }
167
- resolveAnchorCol(anchor, width, availWidth, marginLeft) {
168
- switch (anchor) {
169
- case "top-left":
170
- case "left-center":
171
- case "bottom-left":
172
- return marginLeft;
173
- case "top-right":
174
- case "right-center":
175
- case "bottom-right":
176
- return marginLeft + availWidth - width;
177
- default:
178
- return marginLeft + Math.floor((availWidth - width) / 2);
179
- }
180
- }
181
- }
182
- /**
183
- * Container - a component that contains other components
184
- */
185
- export class Container extends ComponentBase {
186
- children = [];
187
- addChild(component) {
188
- this.children.push(component);
189
- component.onMount?.();
190
- }
191
- removeChild(component) {
192
- const index = this.children.indexOf(component);
193
- if (index !== -1) {
194
- this.children.splice(index, 1);
195
- component.onUnmount?.();
196
- }
197
- }
198
- clear() {
199
- for (const child of this.children)
200
- child.onUnmount?.();
201
- this.children = [];
202
- }
203
- invalidate() {
204
- for (const child of this.children) {
205
- child.invalidate?.();
206
- }
207
- }
208
- render(width) {
209
- const lines = [];
210
- for (const child of this.children) {
211
- lines.push(...child.render(width));
212
- }
213
- return lines;
214
- }
215
- }
216
- class OverlayRegistry {
217
- stack = [];
218
- create(component, options, preFocus) {
219
- const entry = { component, options, preFocus, hidden: false };
220
- this.stack.push(entry);
221
- return entry;
222
- }
223
- remove(entry) {
224
- const index = this.stack.indexOf(entry);
225
- if (index === -1)
226
- return false;
227
- this.stack.splice(index, 1);
228
- return true;
229
- }
230
- pop() {
231
- return this.stack.pop();
232
- }
233
- values() {
234
- return this.stack;
235
- }
236
- count() {
237
- return this.stack.length;
238
- }
239
- isVisible(entry, termWidth, termHeight) {
240
- if (entry.hidden)
241
- return false;
242
- if (!entry.options?.visible)
243
- return true;
244
- return entry.options.visible(termWidth, termHeight);
245
- }
246
- topVisible(termWidth, termHeight) {
247
- for (let i = this.stack.length - 1; i >= 0; i--) {
248
- const entry = this.stack[i];
249
- if (this.isVisible(entry, termWidth, termHeight))
250
- return entry;
251
- }
252
- return undefined;
253
- }
254
- hasVisible(termWidth, termHeight) {
255
- return this.stack.some((entry) => this.isVisible(entry, termWidth, termHeight));
256
- }
257
- }
258
- class InputDispatchEngine {
259
- applyListeners(data, listeners) {
260
- if (listeners.size === 0)
261
- return data;
262
- let current = data;
263
- for (const listener of listeners) {
264
- const result = listener(current);
265
- if (result?.consume)
266
- return null;
267
- if (result?.data !== undefined)
268
- current = result.data;
269
- }
270
- return current.length > 0 ? current : null;
271
- }
272
- dispatchToFocused(data, focused) {
273
- if (!focused?.handleInput)
274
- return false;
275
- if (isKeyRelease(data) && !focused.wantsKeyRelease)
276
- return false;
277
- focused.handleInput(data);
278
- return true;
279
- }
280
- }
281
- class CursorPlacementResolver {
282
- static extract(lines) {
283
- for (let row = 0; row < lines.length; row++) {
284
- const line = lines[row];
285
- const markerIndex = line.indexOf(CURSOR_MARKER);
286
- if (markerIndex === -1)
287
- continue;
288
- const col = visibleWidth(line.slice(0, markerIndex));
289
- lines[row] = line.slice(0, markerIndex) + line.slice(markerIndex + CURSOR_MARKER.length);
290
- return { row, col };
291
- }
292
- return null;
293
- }
294
- }
295
- /**
296
- * TUI - Main class for managing terminal UI with differential rendering
297
- */
298
- export class TUI extends Container {
299
- terminal;
300
- previousLines = [];
301
- previousWidth = 0;
302
- focusedComponent = null;
303
- inputListeners = new Set();
304
- focusManager = new FocusManager();
305
- renderEngine = new RenderEngine();
306
- layoutEngine = new LayoutEngine();
307
- inputDispatcher = new InputDispatchEngine();
308
- overlayRegistry = new OverlayRegistry();
309
- /** Global callback for debug key (Shift+Ctrl+D). Called before input is forwarded to focused component. */
310
- onDebug;
311
- renderRequested = false;
312
- cursorRow = 0; // Logical cursor row (end of rendered content)
313
- hardwareCursorRow = 0; // Actual terminal cursor row (may differ due to IME positioning)
314
- inputBuffer = ""; // Buffer for parsing terminal responses
315
- cellSizeQueryPending = false;
316
- showHardwareCursor = process.env.PI_HARDWARE_CURSOR === "1";
317
- maxLinesRendered = 0; // Track terminal's working area (max lines ever rendered)
318
- previousViewportTop = 0; // Track previous viewport top for resize-aware cursor moves
319
- fullRedrawCount = 0;
320
- // Overlay stack for modal components rendered on top of base content is maintained by OverlayRegistry
321
- constructor(terminal, showHardwareCursor) {
322
- super();
323
- this.terminal = terminal;
324
- if (showHardwareCursor !== undefined) {
325
- this.showHardwareCursor = showHardwareCursor;
326
- }
327
- }
328
- get fullRedraws() {
329
- return this.fullRedrawCount;
330
- }
331
- getShowHardwareCursor() {
332
- return this.showHardwareCursor;
333
- }
334
- setShowHardwareCursor(enabled) {
335
- if (this.showHardwareCursor === enabled)
336
- return;
337
- this.showHardwareCursor = enabled;
338
- if (!enabled) {
339
- this.terminal.hideCursor();
340
- }
341
- this.requestRender();
342
- }
343
- setFocus(component) {
344
- this.focusManager.setFocus(component);
345
- this.focusedComponent = this.focusManager.getFocus();
346
- }
347
- /**
348
- * Show an overlay component with configurable positioning and sizing.
349
- * Returns a handle to control the overlay's visibility.
350
- */
351
- showOverlay(component, options) {
352
- const entry = this.overlayRegistry.create(component, options, this.focusedComponent);
353
- if (this.isOverlayVisible(entry)) {
354
- this.setFocus(component);
355
- }
356
- this.terminal.hideCursor();
357
- this.requestRender();
358
- return {
359
- hide: () => {
360
- if (!this.overlayRegistry.remove(entry))
361
- return;
362
- if (this.focusedComponent === component) {
363
- const topVisible = this.getTopmostVisibleOverlay();
364
- this.setFocus(topVisible?.component ?? entry.preFocus);
365
- }
366
- if (this.overlayRegistry.count() === 0)
367
- this.terminal.hideCursor();
368
- this.requestRender();
369
- },
370
- setHidden: (hidden) => {
371
- if (entry.hidden === hidden)
372
- return;
373
- entry.hidden = hidden;
374
- if (hidden) {
375
- if (this.focusedComponent === component) {
376
- const topVisible = this.getTopmostVisibleOverlay();
377
- this.setFocus(topVisible?.component ?? entry.preFocus);
378
- }
379
- }
380
- else if (this.isOverlayVisible(entry)) {
381
- this.setFocus(component);
382
- }
383
- this.requestRender();
384
- },
385
- isHidden: () => entry.hidden,
386
- };
387
- }
388
- /** Hide the topmost overlay and restore previous focus. */
389
- hideOverlay() {
390
- const overlay = this.overlayRegistry.pop();
391
- if (!overlay)
392
- return;
393
- const topVisible = this.getTopmostVisibleOverlay();
394
- this.setFocus(topVisible?.component ?? overlay.preFocus);
395
- if (this.overlayRegistry.count() === 0)
396
- this.terminal.hideCursor();
397
- this.requestRender();
398
- }
399
- /** Check if there are any visible overlays */
400
- hasOverlay() {
401
- return this.overlayRegistry.hasVisible(this.terminal.columns, this.terminal.rows);
402
- }
403
- /** Check if an overlay entry is currently visible */
404
- isOverlayVisible(entry) {
405
- return this.overlayRegistry.isVisible(entry, this.terminal.columns, this.terminal.rows);
406
- }
407
- /** Find the topmost visible overlay, if any */
408
- getTopmostVisibleOverlay() {
409
- return this.overlayRegistry.topVisible(this.terminal.columns, this.terminal.rows);
410
- }
411
- invalidate() {
412
- super.invalidate();
413
- for (const overlay of this.overlayRegistry.values()) {
414
- overlay.component.invalidate?.();
415
- }
416
- }
417
- start() {
418
- this.terminal.start((data) => this.handleInput(data), () => this.requestRender());
419
- this.terminal.hideCursor();
420
- this.queryCellSize();
421
- this.requestRender();
422
- }
423
- addInputListener(listener) {
424
- this.inputListeners.add(listener);
425
- return () => {
426
- this.inputListeners.delete(listener);
427
- };
428
- }
429
- removeInputListener(listener) {
430
- this.inputListeners.delete(listener);
431
- }
432
- queryCellSize() {
433
- // Only query if terminal supports images (cell size is only used for image rendering)
434
- if (!getCapabilities().images) {
435
- return;
436
- }
437
- // Query terminal for cell size in pixels: CSI 16 t
438
- // Response format: CSI 6 ; height ; width t
439
- this.cellSizeQueryPending = true;
440
- this.terminal.write("\x1b[16t");
441
- }
442
- stop() {
443
- // Move cursor to the end of the content to prevent overwriting/artifacts on exit
444
- if (this.previousLines.length > 0) {
445
- const targetRow = this.previousLines.length; // Line after the last content
446
- const lineDiff = targetRow - this.hardwareCursorRow;
447
- if (lineDiff > 0) {
448
- this.terminal.write(`\x1b[${lineDiff}B`);
449
- }
450
- else if (lineDiff < 0) {
451
- this.terminal.write(`\x1b[${-lineDiff}A`);
452
- }
453
- this.terminal.write("\r\n");
454
- }
455
- this.terminal.showCursor();
456
- this.terminal.stop();
457
- }
458
- requestRender(force = false) {
459
- if (force) {
460
- this.previousLines = [];
461
- this.previousWidth = -1; // -1 triggers widthChanged, forcing a full clear
462
- this.cursorRow = 0;
463
- this.hardwareCursorRow = 0;
464
- this.maxLinesRendered = 0;
465
- this.previousViewportTop = 0;
466
- }
467
- if (this.renderRequested)
468
- return;
469
- this.renderRequested = true;
470
- process.nextTick(() => {
471
- this.renderRequested = false;
472
- this.doRender();
473
- });
474
- }
475
- handleInput(data) {
476
- const listenerData = this.inputDispatcher.applyListeners(data, this.inputListeners);
477
- if (listenerData === null)
478
- return;
479
- data = listenerData;
480
- if (this.cellSizeQueryPending) {
481
- this.inputBuffer += data;
482
- const filtered = this.parseCellSizeResponse();
483
- if (filtered.length === 0)
484
- return;
485
- data = filtered;
486
- }
487
- if (matchesKey(data, "shift+ctrl+d") && this.onDebug) {
488
- this.onDebug();
489
- return;
490
- }
491
- const focusedOverlay = this.overlayRegistry.values().find((entry) => entry.component === this.focusedComponent);
492
- if (focusedOverlay && !this.isOverlayVisible(focusedOverlay)) {
493
- const topVisible = this.getTopmostVisibleOverlay();
494
- this.setFocus(topVisible?.component ?? focusedOverlay.preFocus);
495
- }
496
- if (this.inputDispatcher.dispatchToFocused(data, this.focusedComponent)) {
497
- this.requestRender();
498
- }
499
- }
500
- parseCellSizeResponse() {
501
- // Response format: ESC [ 6 ; height ; width t
502
- // Match the response pattern
503
- const responsePattern = /\x1b\[6;(\d+);(\d+)t/;
504
- const match = this.inputBuffer.match(responsePattern);
505
- if (match) {
506
- const heightPx = parseInt(match[1], 10);
507
- const widthPx = parseInt(match[2], 10);
508
- if (heightPx > 0 && widthPx > 0) {
509
- setCellDimensions({ widthPx, heightPx });
510
- // Invalidate all components so images re-render with correct dimensions
511
- this.invalidate();
512
- this.requestRender();
513
- }
514
- // Remove the response from buffer
515
- this.inputBuffer = this.inputBuffer.replace(responsePattern, "");
516
- this.cellSizeQueryPending = false;
517
- }
518
- // Check if we have a partial cell size response starting (wait for more data)
519
- // Patterns that could be incomplete cell size response: \x1b, \x1b[, \x1b[6, \x1b[6;...(no t yet)
520
- const partialCellSizePattern = /\x1b(\[6?;?[\d;]*)?$/;
521
- if (partialCellSizePattern.test(this.inputBuffer)) {
522
- // Check if it's actually a complete different escape sequence (ends with a letter)
523
- // Cell size response ends with 't', Kitty keyboard ends with 'u', arrows end with A-D, etc.
524
- const lastChar = this.inputBuffer[this.inputBuffer.length - 1];
525
- if (!/[a-zA-Z~]/.test(lastChar)) {
526
- // Doesn't end with a terminator, might be incomplete - wait for more
527
- return "";
528
- }
529
- }
530
- // No cell size response found, return buffered data as user input
531
- const result = this.inputBuffer;
532
- this.inputBuffer = "";
533
- this.cellSizeQueryPending = false; // Give up waiting
534
- return result;
535
- }
536
- containsImage(line) {
537
- return line.includes("\x1b_G") || line.includes("\x1b]1337;File=");
538
- }
539
- /**
540
- * Resolve overlay layout from options.
541
- * Returns { width, row, col, maxHeight } for rendering.
542
- */
543
- resolveOverlayLayout(options, overlayHeight, termWidth, termHeight) {
544
- return this.layoutEngine.resolveOverlayLayout(options, overlayHeight, termWidth, termHeight);
545
- }
546
- /** Composite all overlays into content lines (in stack order, later = on top). */
547
- compositeOverlays(lines, termWidth, termHeight) {
548
- const overlays = this.overlayRegistry.values();
549
- if (overlays.length === 0)
550
- return lines;
551
- const result = [...lines];
552
- const rendered = this.collectRenderedOverlays(overlays, termWidth, termHeight, result.length);
553
- this.ensureOverlayWorkingHeight(result, rendered.minLinesNeeded);
554
- const viewportStart = Math.max(0, result.length - termHeight);
555
- const modified = this.compositeRenderedOverlays(result, rendered.items, viewportStart, termWidth);
556
- this.clampCompositeWidth(result, modified, termWidth);
557
- return result;
558
- }
559
- collectRenderedOverlays(overlays, termWidth, termHeight, initialMinLines) {
560
- const items = [];
561
- let minLinesNeeded = initialMinLines;
562
- for (const entry of overlays) {
563
- if (!this.isOverlayVisible(entry))
564
- continue;
565
- const { width, maxHeight } = this.resolveOverlayLayout(entry.options, 0, termWidth, termHeight);
566
- const rawLines = entry.component.render(width);
567
- const overlayLines = maxHeight !== undefined && rawLines.length > maxHeight ? rawLines.slice(0, maxHeight) : rawLines;
568
- const finalPos = this.resolveOverlayLayout(entry.options, overlayLines.length, termWidth, termHeight);
569
- items.push({ overlayLines, row: finalPos.row, col: finalPos.col, width });
570
- minLinesNeeded = Math.max(minLinesNeeded, finalPos.row + overlayLines.length);
571
- }
572
- return { items, minLinesNeeded };
573
- }
574
- ensureOverlayWorkingHeight(result, minLinesNeeded) {
575
- const workingHeight = Math.max(this.maxLinesRendered, minLinesNeeded);
576
- while (result.length < workingHeight) {
577
- result.push("");
578
- }
579
- }
580
- compositeRenderedOverlays(result, rendered, viewportStart, termWidth) {
581
- const modifiedLines = new Set();
582
- for (const renderedOverlay of rendered) {
583
- for (let localRow = 0; localRow < renderedOverlay.overlayLines.length; localRow++) {
584
- const targetRow = viewportStart + renderedOverlay.row + localRow;
585
- if (targetRow < 0 || targetRow >= result.length)
586
- continue;
587
- const originalOverlayLine = renderedOverlay.overlayLines[localRow];
588
- const overlayLine = visibleWidth(originalOverlayLine) > renderedOverlay.width
589
- ? sliceByColumn(originalOverlayLine, 0, renderedOverlay.width, true)
590
- : originalOverlayLine;
591
- result[targetRow] = this.compositeLineAt(result[targetRow], overlayLine, renderedOverlay.col, renderedOverlay.width, termWidth);
592
- modifiedLines.add(targetRow);
593
- }
594
- }
595
- return modifiedLines;
596
- }
597
- clampCompositeWidth(result, modified, termWidth) {
598
- for (const row of modified) {
599
- if (visibleWidth(result[row]) <= termWidth)
600
- continue;
601
- result[row] = sliceByColumn(result[row], 0, termWidth, true);
602
- }
603
- }
604
- static SEGMENT_RESET = "\x1b[0m\x1b]8;;\x07";
605
- applyLineResets(lines) {
606
- const reset = TUI.SEGMENT_RESET;
607
- return lines.map((line) => (this.containsImage(line) ? line : line + reset));
608
- }
609
- /** Splice overlay content into a base line at a specific column. Single-pass optimized. */
610
- compositeLineAt(baseLine, overlayLine, startCol, overlayWidth, totalWidth) {
611
- if (this.containsImage(baseLine))
612
- return baseLine;
613
- // Single pass through baseLine extracts both before and after segments
614
- const afterStart = startCol + overlayWidth;
615
- const base = extractSegments(baseLine, startCol, afterStart, totalWidth - afterStart, true);
616
- // Extract overlay with width tracking (strict=true to exclude wide chars at boundary)
617
- const overlay = sliceWithWidth(overlayLine, 0, overlayWidth, true);
618
- // Pad segments to target widths
619
- const beforePad = Math.max(0, startCol - base.beforeWidth);
620
- const overlayPad = Math.max(0, overlayWidth - overlay.width);
621
- const actualBeforeWidth = Math.max(startCol, base.beforeWidth);
622
- const actualOverlayWidth = Math.max(overlayWidth, overlay.width);
623
- const afterTarget = Math.max(0, totalWidth - actualBeforeWidth - actualOverlayWidth);
624
- const afterPad = Math.max(0, afterTarget - base.afterWidth);
625
- // Compose result
626
- const r = TUI.SEGMENT_RESET;
627
- const result = base.before +
628
- " ".repeat(beforePad) +
629
- r +
630
- overlay.text +
631
- " ".repeat(overlayPad) +
632
- r +
633
- base.after +
634
- " ".repeat(afterPad);
635
- // CRITICAL: Always verify and truncate to terminal width.
636
- // This is the final safeguard against width overflow which would crash the TUI.
637
- // Width tracking can drift from actual visible width due to:
638
- // - Complex ANSI/OSC sequences (hyperlinks, colors)
639
- // - Wide characters at segment boundaries
640
- // - Edge cases in segment extraction
641
- const resultWidth = visibleWidth(result);
642
- if (resultWidth <= totalWidth) {
643
- return result;
644
- }
645
- // Truncate with strict=true to ensure we don't exceed totalWidth
646
- return sliceByColumn(result, 0, totalWidth, true);
647
- }
648
- /**
649
- * Find and extract cursor position from rendered lines.
650
- * Searches for CURSOR_MARKER, calculates its position, and strips it from the output.
651
- * @returns Cursor position { row, col } or null if no marker found
652
- */
653
- extractCursorPosition(lines) {
654
- return CursorPlacementResolver.extract(lines);
655
- }
656
- renderFullFrame(newLines, width, height, cursorPos, clear) {
657
- this.fullRedrawCount += 1;
658
- let buffer = "\x1b[?2026h";
659
- if (clear)
660
- buffer += "\x1b[3J\x1b[2J\x1b[H";
661
- for (let i = 0; i < newLines.length; i++) {
662
- if (i > 0)
663
- buffer += "\r\n";
664
- buffer += newLines[i];
665
- }
666
- buffer += "\x1b[?2026l";
667
- this.terminal.write(buffer);
668
- this.cursorRow = Math.max(0, newLines.length - 1);
669
- this.hardwareCursorRow = this.cursorRow;
670
- if (clear) {
671
- this.maxLinesRendered = newLines.length;
672
- }
673
- else {
674
- this.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);
675
- }
676
- this.previousViewportTop = Math.max(0, this.maxLinesRendered - height);
677
- this.positionHardwareCursor(cursorPos, newLines.length);
678
- this.previousLines = newLines;
679
- this.previousWidth = width;
680
- }
681
- prepareRenderFrame(width, height) {
682
- let newLines = this.render(width);
683
- if (this.overlayRegistry.count() > 0) {
684
- newLines = this.compositeOverlays(newLines, width, height);
685
- }
686
- const cursorPos = this.extractCursorPosition(newLines);
687
- newLines = this.applyLineResets(newLines);
688
- return { newLines, cursorPos };
689
- }
690
- computeRenderDiff(newLines) {
691
- const { firstChanged, lastChanged, appended: appendedLines } = this.renderEngine.diffLines(this.previousLines, newLines);
692
- const appendStart = appendedLines && firstChanged === this.previousLines.length && firstChanged > 0;
693
- return { firstChanged, lastChanged, appendedLines, appendStart };
694
- }
695
- doRender() {
696
- const width = this.terminal.columns;
697
- const height = this.terminal.rows;
698
- let viewportTop = Math.max(0, this.maxLinesRendered - height);
699
- let prevViewportTop = this.previousViewportTop;
700
- let hardwareCursorRow = this.hardwareCursorRow;
701
- const computeLineDiff = (targetRow) => {
702
- const currentScreenRow = hardwareCursorRow - prevViewportTop;
703
- const targetScreenRow = targetRow - viewportTop;
704
- return targetScreenRow - currentScreenRow;
705
- };
706
- const { newLines, cursorPos } = this.prepareRenderFrame(width, height);
707
- // Width changed - need full re-render
708
- const widthChanged = this.previousWidth !== 0 && this.previousWidth !== width;
709
- const fullRender = (clear) => {
710
- this.renderFullFrame(newLines, width, height, cursorPos, clear);
711
- };
712
- // First render - just output everything without clearing (assumes clean screen)
713
- if (this.previousLines.length === 0 && !widthChanged) {
714
- fullRender(false);
715
- return;
716
- }
717
- // Width changed - full re-render
718
- if (widthChanged) {
719
- fullRender(true);
720
- return;
721
- }
722
- // Find first and last changed lines via RenderEngine
723
- let { firstChanged, lastChanged, appendedLines, appendStart } = this.computeRenderDiff(newLines);
724
- // No changes - but still need to update hardware cursor position if it moved
725
- if (firstChanged === -1) {
726
- this.positionHardwareCursor(cursorPos, newLines.length);
727
- this.previousViewportTop = Math.max(0, this.maxLinesRendered - height);
728
- return;
729
- }
730
- // All changes are in deleted lines (nothing to render, just clear)
731
- if (firstChanged >= newLines.length) {
732
- if (this.previousLines.length > newLines.length) {
733
- let buffer = "\x1b[?2026h";
734
- // Move to end of new content (clamp to 0 for empty content)
735
- const targetRow = Math.max(0, newLines.length - 1);
736
- const lineDiff = computeLineDiff(targetRow);
737
- if (lineDiff > 0)
738
- buffer += `\x1b[${lineDiff}B`;
739
- else if (lineDiff < 0)
740
- buffer += `\x1b[${-lineDiff}A`;
741
- buffer += "\r";
742
- // Clear extra lines without scrolling
743
- const extraLines = this.previousLines.length - newLines.length;
744
- if (extraLines > height) {
745
- fullRender(true);
746
- return;
747
- }
748
- if (extraLines > 0) {
749
- buffer += "\x1b[1B";
750
- }
751
- for (let i = 0; i < extraLines; i++) {
752
- buffer += "\r\x1b[2K";
753
- if (i < extraLines - 1)
754
- buffer += "\x1b[1B";
755
- }
756
- if (extraLines > 0) {
757
- buffer += `\x1b[${extraLines}A`;
758
- }
759
- buffer += "\x1b[?2026l";
760
- this.terminal.write(buffer);
761
- this.cursorRow = targetRow;
762
- this.hardwareCursorRow = targetRow;
763
- }
764
- this.positionHardwareCursor(cursorPos, newLines.length);
765
- this.previousLines = newLines;
766
- this.previousWidth = width;
767
- this.previousViewportTop = Math.max(0, this.maxLinesRendered - height);
768
- return;
769
- }
770
- // Check if firstChanged is outside the viewport
771
- // Viewport is based on max lines ever rendered (terminal's working area)
772
- if (firstChanged < viewportTop) {
773
- // First change is above viewport - need full re-render
774
- fullRender(true);
775
- return;
776
- }
777
- // Render from first changed line to end
778
- // Build buffer with all updates wrapped in synchronized output
779
- let buffer = "\x1b[?2026h"; // Begin synchronized output
780
- const prevViewportBottom = prevViewportTop + height - 1;
781
- const moveTargetRow = appendStart ? firstChanged - 1 : firstChanged;
782
- if (moveTargetRow > prevViewportBottom) {
783
- const currentScreenRow = Math.max(0, Math.min(height - 1, hardwareCursorRow - prevViewportTop));
784
- const moveToBottom = height - 1 - currentScreenRow;
785
- if (moveToBottom > 0) {
786
- buffer += `\x1b[${moveToBottom}B`;
787
- }
788
- const scroll = moveTargetRow - prevViewportBottom;
789
- buffer += "\r\n".repeat(scroll);
790
- prevViewportTop += scroll;
791
- viewportTop += scroll;
792
- hardwareCursorRow = moveTargetRow;
793
- }
794
- // Move cursor to first changed line (use hardwareCursorRow for actual position)
795
- const lineDiff = computeLineDiff(moveTargetRow);
796
- if (lineDiff > 0) {
797
- buffer += `\x1b[${lineDiff}B`; // Move down
798
- }
799
- else if (lineDiff < 0) {
800
- buffer += `\x1b[${-lineDiff}A`; // Move up
801
- }
802
- buffer += appendStart ? "\r\n" : "\r"; // Move to column 0
803
- // Only render changed lines (firstChanged to lastChanged), not all lines to end
804
- // This reduces flicker when only a single line changes (e.g., spinner animation)
805
- const renderEnd = Math.min(lastChanged, newLines.length - 1);
806
- for (let i = firstChanged; i <= renderEnd; i++) {
807
- if (i > firstChanged)
808
- buffer += "\r\n";
809
- buffer += "\x1b[2K"; // Clear current line
810
- const line = newLines[i];
811
- const isImageLine = this.containsImage(line);
812
- if (!isImageLine && visibleWidth(line) > width) {
813
- // Log all lines to crash file for debugging
814
- const crashLogPath = path.join(os.homedir(), ".pi", "agent", "pi-crash.log");
815
- const crashData = [
816
- `Crash at ${new Date().toISOString()}`,
817
- `Terminal width: ${width}`,
818
- `Line ${i} visible width: ${visibleWidth(line)}`,
819
- "",
820
- "=== All rendered lines ===",
821
- ...newLines.map((l, idx) => `[${idx}] (w=${visibleWidth(l)}) ${l}`),
822
- "",
823
- ].join("\n");
824
- fs.mkdirSync(path.dirname(crashLogPath), { recursive: true });
825
- fs.writeFileSync(crashLogPath, crashData);
826
- // Clean up terminal state before throwing
827
- this.stop();
828
- const errorMsg = [
829
- `Rendered line ${i} exceeds terminal width (${visibleWidth(line)} > ${width}).`,
830
- "",
831
- "This is likely caused by a custom TUI component not truncating its output.",
832
- "Use visibleWidth() to measure and truncateToWidth() to truncate lines.",
833
- "",
834
- `Debug log written to: ${crashLogPath}`,
835
- ].join("\n");
836
- throw new Error(errorMsg);
837
- }
838
- buffer += line;
839
- }
840
- // Track where cursor ended up after rendering
841
- let finalCursorRow = renderEnd;
842
- // If we had more lines before, clear them and move cursor back
843
- if (this.previousLines.length > newLines.length) {
844
- // Move to end of new content first if we stopped before it
845
- if (renderEnd < newLines.length - 1) {
846
- const moveDown = newLines.length - 1 - renderEnd;
847
- buffer += `\x1b[${moveDown}B`;
848
- finalCursorRow = newLines.length - 1;
849
- }
850
- const extraLines = this.previousLines.length - newLines.length;
851
- for (let i = newLines.length; i < this.previousLines.length; i++) {
852
- buffer += "\r\n\x1b[2K";
853
- }
854
- // Move cursor back to end of new content
855
- buffer += `\x1b[${extraLines}A`;
856
- }
857
- buffer += "\x1b[?2026l"; // End synchronized output
858
- if (process.env.PI_TUI_DEBUG === "1") {
859
- const debugDir = "/tmp/tui";
860
- fs.mkdirSync(debugDir, { recursive: true });
861
- const debugPath = path.join(debugDir, `render-${Date.now()}-${Math.random().toString(36).slice(2)}.log`);
862
- const debugData = [
863
- `firstChanged: ${firstChanged}`,
864
- `viewportTop: ${viewportTop}`,
865
- `cursorRow: ${this.cursorRow}`,
866
- `height: ${height}`,
867
- `lineDiff: ${lineDiff}`,
868
- `hardwareCursorRow: ${hardwareCursorRow}`,
869
- `renderEnd: ${renderEnd}`,
870
- `finalCursorRow: ${finalCursorRow}`,
871
- `cursorPos: ${JSON.stringify(cursorPos)}`,
872
- `newLines.length: ${newLines.length}`,
873
- `previousLines.length: ${this.previousLines.length}`,
874
- "",
875
- "=== newLines ===",
876
- JSON.stringify(newLines, null, 2),
877
- "",
878
- "=== previousLines ===",
879
- JSON.stringify(this.previousLines, null, 2),
880
- "",
881
- "=== buffer ===",
882
- JSON.stringify(buffer),
883
- ].join("\n");
884
- fs.writeFileSync(debugPath, debugData);
885
- }
886
- // Write entire buffer at once
887
- this.terminal.write(buffer);
888
- // Track cursor position for next render
889
- // cursorRow tracks end of content (for viewport calculation)
890
- // hardwareCursorRow tracks actual terminal cursor position (for movement)
891
- this.cursorRow = Math.max(0, newLines.length - 1);
892
- this.hardwareCursorRow = finalCursorRow;
893
- // Track terminal's working area (grows but doesn't shrink unless cleared)
894
- this.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);
895
- this.previousViewportTop = Math.max(0, this.maxLinesRendered - height);
896
- // Position hardware cursor for IME
897
- this.positionHardwareCursor(cursorPos, newLines.length);
898
- this.previousLines = newLines;
899
- this.previousWidth = width;
900
- }
901
- /**
902
- * Position the hardware cursor for IME candidate window.
903
- * @param cursorPos The cursor position extracted from rendered output, or null
904
- * @param totalLines Total number of rendered lines
905
- */
906
- positionHardwareCursor(cursorPos, totalLines) {
907
- if (!cursorPos || totalLines <= 0) {
908
- this.terminal.hideCursor();
909
- return;
910
- }
911
- // Clamp cursor position to valid range
912
- const targetRow = Math.max(0, Math.min(cursorPos.row, totalLines - 1));
913
- const targetCol = Math.max(0, cursorPos.col);
914
- // Move cursor from current position to target
915
- const rowDelta = targetRow - this.hardwareCursorRow;
916
- let buffer = "";
917
- if (rowDelta > 0) {
918
- buffer += `\x1b[${rowDelta}B`; // Move down
919
- }
920
- else if (rowDelta < 0) {
921
- buffer += `\x1b[${-rowDelta}A`; // Move up
922
- }
923
- // Move to absolute column (1-indexed)
924
- buffer += `\x1b[${targetCol + 1}G`;
925
- if (buffer) {
926
- this.terminal.write(buffer);
927
- }
928
- this.hardwareCursorRow = targetRow;
929
- if (this.showHardwareCursor) {
930
- this.terminal.showCursor();
931
- }
932
- else {
933
- this.terminal.hideCursor();
934
- }
935
- }
936
- }
937
- //# sourceMappingURL=tui.js.map