@yeshwanthyk/coding-agent 0.3.0 → 0.3.3

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 (379) hide show
  1. package/README.md +8 -6
  2. package/dist/adapters/acp/index.d.ts +10 -0
  3. package/dist/adapters/acp/index.d.ts.map +1 -0
  4. package/dist/adapters/acp/index.js +250 -0
  5. package/dist/adapters/acp/index.js.map +1 -0
  6. package/dist/adapters/acp/protocol.d.ts +171 -0
  7. package/dist/adapters/acp/protocol.d.ts.map +1 -0
  8. package/dist/adapters/acp/protocol.js +25 -0
  9. package/dist/adapters/acp/protocol.js.map +1 -0
  10. package/dist/adapters/acp/session.d.ts +33 -0
  11. package/dist/adapters/acp/session.d.ts.map +1 -0
  12. package/dist/adapters/acp/session.js +216 -0
  13. package/dist/adapters/acp/session.js.map +1 -0
  14. package/dist/adapters/acp/updates.d.ts +17 -0
  15. package/dist/adapters/acp/updates.d.ts.map +1 -0
  16. package/dist/adapters/acp/updates.js +62 -0
  17. package/dist/adapters/acp/updates.js.map +1 -0
  18. package/dist/adapters/cli/headless.d.ts +7 -0
  19. package/dist/adapters/cli/headless.d.ts.map +1 -0
  20. package/dist/adapters/cli/headless.js +93 -0
  21. package/dist/adapters/cli/headless.js.map +1 -0
  22. package/dist/adapters/cli/validate.d.ts +3 -0
  23. package/dist/adapters/cli/validate.d.ts.map +1 -0
  24. package/dist/adapters/cli/validate.js +40 -0
  25. package/dist/adapters/cli/validate.js.map +1 -0
  26. package/dist/adapters/tui/app.d.ts +8 -0
  27. package/dist/adapters/tui/app.d.ts.map +1 -0
  28. package/dist/adapters/tui/app.jsx +25 -0
  29. package/dist/adapters/tui/app.jsx.map +1 -0
  30. package/dist/agent-events.d.ts +63 -0
  31. package/dist/agent-events.d.ts.map +1 -0
  32. package/dist/agent-events.js +510 -0
  33. package/dist/agent-events.js.map +1 -0
  34. package/dist/args.d.ts +18 -0
  35. package/dist/args.d.ts.map +1 -0
  36. package/dist/args.js +87 -0
  37. package/dist/args.js.map +1 -0
  38. package/dist/autocomplete-commands.d.ts +26 -0
  39. package/dist/autocomplete-commands.d.ts.map +1 -0
  40. package/dist/autocomplete-commands.js +82 -0
  41. package/dist/autocomplete-commands.js.map +1 -0
  42. package/dist/commands.d.ts +10 -0
  43. package/dist/commands.d.ts.map +1 -0
  44. package/dist/commands.js +17 -0
  45. package/dist/commands.js.map +1 -0
  46. package/dist/compact-handler.d.ts +42 -0
  47. package/dist/compact-handler.d.ts.map +1 -0
  48. package/dist/compact-handler.js +211 -0
  49. package/dist/compact-handler.js.map +1 -0
  50. package/dist/components/Footer.d.ts +9 -0
  51. package/dist/components/Footer.d.ts.map +1 -0
  52. package/dist/components/Footer.jsx +36 -0
  53. package/dist/components/Footer.jsx.map +1 -0
  54. package/dist/components/Header.d.ts +23 -0
  55. package/dist/components/Header.d.ts.map +1 -0
  56. package/dist/components/Header.jsx +174 -0
  57. package/dist/components/Header.jsx.map +1 -0
  58. package/dist/components/MessageList.d.ts +19 -0
  59. package/dist/components/MessageList.d.ts.map +1 -0
  60. package/dist/components/MessageList.jsx +237 -0
  61. package/dist/components/MessageList.jsx.map +1 -0
  62. package/dist/config.d.ts +2 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +2 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/domain/commands/builtin/clear.d.ts +3 -0
  67. package/dist/domain/commands/builtin/clear.d.ts.map +1 -0
  68. package/dist/domain/commands/builtin/clear.js +13 -0
  69. package/dist/domain/commands/builtin/clear.js.map +1 -0
  70. package/dist/domain/commands/builtin/compact.d.ts +3 -0
  71. package/dist/domain/commands/builtin/compact.d.ts.map +1 -0
  72. package/dist/domain/commands/builtin/compact.js +84 -0
  73. package/dist/domain/commands/builtin/compact.js.map +1 -0
  74. package/dist/domain/commands/builtin/conceal.d.ts +3 -0
  75. package/dist/domain/commands/builtin/conceal.d.ts.map +1 -0
  76. package/dist/domain/commands/builtin/conceal.js +8 -0
  77. package/dist/domain/commands/builtin/conceal.js.map +1 -0
  78. package/dist/domain/commands/builtin/diffwrap.d.ts +3 -0
  79. package/dist/domain/commands/builtin/diffwrap.d.ts.map +1 -0
  80. package/dist/domain/commands/builtin/diffwrap.js +8 -0
  81. package/dist/domain/commands/builtin/diffwrap.js.map +1 -0
  82. package/dist/domain/commands/builtin/editor.d.ts +3 -0
  83. package/dist/domain/commands/builtin/editor.d.ts.map +1 -0
  84. package/dist/domain/commands/builtin/editor.js +22 -0
  85. package/dist/domain/commands/builtin/editor.js.map +1 -0
  86. package/dist/domain/commands/builtin/exit.d.ts +3 -0
  87. package/dist/domain/commands/builtin/exit.d.ts.map +1 -0
  88. package/dist/domain/commands/builtin/exit.js +14 -0
  89. package/dist/domain/commands/builtin/exit.js.map +1 -0
  90. package/dist/domain/commands/builtin/followup.d.ts +3 -0
  91. package/dist/domain/commands/builtin/followup.d.ts.map +1 -0
  92. package/dist/domain/commands/builtin/followup.js +20 -0
  93. package/dist/domain/commands/builtin/followup.js.map +1 -0
  94. package/dist/domain/commands/builtin/index.d.ts +2 -0
  95. package/dist/domain/commands/builtin/index.d.ts.map +1 -0
  96. package/dist/domain/commands/builtin/index.js +29 -0
  97. package/dist/domain/commands/builtin/index.js.map +1 -0
  98. package/dist/domain/commands/builtin/login.d.ts +3 -0
  99. package/dist/domain/commands/builtin/login.d.ts.map +1 -0
  100. package/dist/domain/commands/builtin/login.js +92 -0
  101. package/dist/domain/commands/builtin/login.js.map +1 -0
  102. package/dist/domain/commands/builtin/model.d.ts +3 -0
  103. package/dist/domain/commands/builtin/model.d.ts.map +1 -0
  104. package/dist/domain/commands/builtin/model.js +53 -0
  105. package/dist/domain/commands/builtin/model.js.map +1 -0
  106. package/dist/domain/commands/builtin/status.d.ts +3 -0
  107. package/dist/domain/commands/builtin/status.d.ts.map +1 -0
  108. package/dist/domain/commands/builtin/status.js +30 -0
  109. package/dist/domain/commands/builtin/status.js.map +1 -0
  110. package/dist/domain/commands/builtin/steer.d.ts +3 -0
  111. package/dist/domain/commands/builtin/steer.d.ts.map +1 -0
  112. package/dist/domain/commands/builtin/steer.js +20 -0
  113. package/dist/domain/commands/builtin/steer.js.map +1 -0
  114. package/dist/domain/commands/builtin/theme.d.ts +3 -0
  115. package/dist/domain/commands/builtin/theme.d.ts.map +1 -0
  116. package/dist/domain/commands/builtin/theme.js +19 -0
  117. package/dist/domain/commands/builtin/theme.js.map +1 -0
  118. package/dist/domain/commands/builtin/thinking.d.ts +3 -0
  119. package/dist/domain/commands/builtin/thinking.d.ts.map +1 -0
  120. package/dist/domain/commands/builtin/thinking.js +16 -0
  121. package/dist/domain/commands/builtin/thinking.js.map +1 -0
  122. package/dist/domain/commands/helpers.d.ts +7 -0
  123. package/dist/domain/commands/helpers.d.ts.map +1 -0
  124. package/dist/domain/commands/helpers.js +34 -0
  125. package/dist/domain/commands/helpers.js.map +1 -0
  126. package/dist/domain/commands/registry.d.ts +10 -0
  127. package/dist/domain/commands/registry.d.ts.map +1 -0
  128. package/dist/domain/commands/registry.js +36 -0
  129. package/dist/domain/commands/registry.js.map +1 -0
  130. package/dist/domain/commands/types.d.ts +62 -0
  131. package/dist/domain/commands/types.d.ts.map +1 -0
  132. package/dist/domain/commands/types.js +2 -0
  133. package/dist/domain/commands/types.js.map +1 -0
  134. package/dist/domain/messaging/content.d.ts +37 -0
  135. package/dist/domain/messaging/content.d.ts.map +1 -0
  136. package/dist/domain/messaging/content.js +103 -0
  137. package/dist/domain/messaging/content.js.map +1 -0
  138. package/dist/editor.d.ts +26 -0
  139. package/dist/editor.d.ts.map +1 -0
  140. package/dist/editor.js +81 -0
  141. package/dist/editor.js.map +1 -0
  142. package/dist/extensibility/schema.d.ts +2 -0
  143. package/dist/extensibility/schema.d.ts.map +1 -0
  144. package/{src/extensibility/schema.ts → dist/extensibility/schema.js} +2 -1
  145. package/dist/extensibility/schema.js.map +1 -0
  146. package/dist/extensibility/validation.d.ts +2 -0
  147. package/dist/extensibility/validation.d.ts.map +1 -0
  148. package/{src/extensibility/validation.ts → dist/extensibility/validation.js} +2 -1
  149. package/dist/extensibility/validation.js.map +1 -0
  150. package/dist/hooks/index.d.ts +2 -0
  151. package/dist/hooks/index.d.ts.map +1 -0
  152. package/dist/hooks/index.js +2 -0
  153. package/dist/hooks/index.js.map +1 -0
  154. package/dist/hooks/useAgentEvents.d.ts +8 -0
  155. package/dist/hooks/useAgentEvents.d.ts.map +1 -0
  156. package/dist/hooks/useAgentEvents.js +22 -0
  157. package/dist/hooks/useAgentEvents.js.map +1 -0
  158. package/dist/hooks/useEditorBridge.d.ts +20 -0
  159. package/dist/hooks/useEditorBridge.d.ts.map +1 -0
  160. package/dist/hooks/useEditorBridge.js +80 -0
  161. package/dist/hooks/useEditorBridge.js.map +1 -0
  162. package/dist/hooks/useGitStatus.d.ts +2 -0
  163. package/dist/hooks/useGitStatus.d.ts.map +1 -0
  164. package/dist/hooks/useGitStatus.js +26 -0
  165. package/dist/hooks/useGitStatus.js.map +1 -0
  166. package/dist/hooks/usePromptQueue.d.ts +2 -0
  167. package/dist/hooks/usePromptQueue.d.ts.map +1 -0
  168. package/dist/hooks/usePromptQueue.js +2 -0
  169. package/dist/hooks/usePromptQueue.js.map +1 -0
  170. package/dist/hooks/useSessionController.d.ts +2 -0
  171. package/dist/hooks/useSessionController.d.ts.map +1 -0
  172. package/dist/hooks/useSessionController.js +2 -0
  173. package/dist/hooks/useSessionController.js.map +1 -0
  174. package/dist/hooks/useSpinner.d.ts +4 -0
  175. package/dist/hooks/useSpinner.d.ts.map +1 -0
  176. package/dist/hooks/useSpinner.js +25 -0
  177. package/dist/hooks/useSpinner.js.map +1 -0
  178. package/dist/hooks/useToastManager.d.ts +6 -0
  179. package/dist/hooks/useToastManager.d.ts.map +1 -0
  180. package/dist/hooks/useToastManager.js +22 -0
  181. package/dist/hooks/useToastManager.js.map +1 -0
  182. package/dist/index.d.ts +3 -0
  183. package/dist/index.d.ts.map +1 -0
  184. package/dist/index.js +156 -0
  185. package/dist/index.js.map +1 -0
  186. package/dist/keyboard-handler.d.ts +30 -0
  187. package/dist/keyboard-handler.d.ts.map +1 -0
  188. package/dist/keyboard-handler.js +96 -0
  189. package/dist/keyboard-handler.js.map +1 -0
  190. package/dist/profiler.d.ts +2 -0
  191. package/dist/profiler.d.ts.map +1 -0
  192. package/dist/profiler.js +41 -0
  193. package/dist/profiler.js.map +1 -0
  194. package/dist/runtime/context.d.ts +8 -0
  195. package/dist/runtime/context.d.ts.map +1 -0
  196. package/dist/runtime/context.jsx +11 -0
  197. package/dist/runtime/context.jsx.map +1 -0
  198. package/dist/runtime/factory.d.ts +12 -0
  199. package/dist/runtime/factory.d.ts.map +1 -0
  200. package/dist/runtime/factory.js +37 -0
  201. package/dist/runtime/factory.js.map +1 -0
  202. package/dist/runtime/git/git-info.d.ts +3 -0
  203. package/dist/runtime/git/git-info.d.ts.map +1 -0
  204. package/dist/runtime/git/git-info.js +29 -0
  205. package/dist/runtime/git/git-info.js.map +1 -0
  206. package/dist/runtime/session/session-controller.d.ts +48 -0
  207. package/dist/runtime/session/session-controller.d.ts.map +1 -0
  208. package/dist/runtime/session/session-controller.js +159 -0
  209. package/dist/runtime/session/session-controller.js.map +1 -0
  210. package/dist/session-manager.d.ts +2 -0
  211. package/dist/session-manager.d.ts.map +1 -0
  212. package/dist/session-manager.js +2 -0
  213. package/dist/session-manager.js.map +1 -0
  214. package/dist/session-picker.d.ts +6 -0
  215. package/dist/session-picker.d.ts.map +1 -0
  216. package/dist/session-picker.jsx +96 -0
  217. package/dist/session-picker.jsx.map +1 -0
  218. package/dist/shell-runner.d.ts +21 -0
  219. package/dist/shell-runner.d.ts.map +1 -0
  220. package/dist/shell-runner.js +106 -0
  221. package/dist/shell-runner.js.map +1 -0
  222. package/dist/syntax-highlighting.d.ts +4 -0
  223. package/dist/syntax-highlighting.d.ts.map +1 -0
  224. package/dist/syntax-highlighting.js +108 -0
  225. package/dist/syntax-highlighting.js.map +1 -0
  226. package/dist/theme-names.d.ts +7 -0
  227. package/dist/theme-names.d.ts.map +1 -0
  228. package/dist/theme-names.js +38 -0
  229. package/dist/theme-names.js.map +1 -0
  230. package/dist/tool-ui-contracts.d.ts +30 -0
  231. package/dist/tool-ui-contracts.d.ts.map +1 -0
  232. package/dist/tool-ui-contracts.js +53 -0
  233. package/dist/tool-ui-contracts.js.map +1 -0
  234. package/dist/tui-open-rendering.d.ts +37 -0
  235. package/dist/tui-open-rendering.d.ts.map +1 -0
  236. package/dist/tui-open-rendering.jsx +462 -0
  237. package/dist/tui-open-rendering.jsx.map +1 -0
  238. package/dist/types.d.ts +117 -0
  239. package/dist/types.d.ts.map +1 -0
  240. package/dist/types.js +4 -0
  241. package/dist/types.js.map +1 -0
  242. package/dist/ui/app-shell/TuiApp.d.ts +6 -0
  243. package/dist/ui/app-shell/TuiApp.d.ts.map +1 -0
  244. package/dist/ui/app-shell/TuiApp.jsx +480 -0
  245. package/dist/ui/app-shell/TuiApp.jsx.map +1 -0
  246. package/dist/ui/clipboard/osc52.d.ts +2 -0
  247. package/dist/ui/clipboard/osc52.d.ts.map +1 -0
  248. package/dist/ui/clipboard/osc52.js +19 -0
  249. package/dist/ui/clipboard/osc52.js.map +1 -0
  250. package/dist/ui/components/modals/ConfirmModal.d.ts +8 -0
  251. package/dist/ui/components/modals/ConfirmModal.d.ts.map +1 -0
  252. package/dist/ui/components/modals/ConfirmModal.jsx +39 -0
  253. package/dist/ui/components/modals/ConfirmModal.jsx.map +1 -0
  254. package/dist/ui/components/modals/EditorModal.d.ts +8 -0
  255. package/dist/ui/components/modals/EditorModal.d.ts.map +1 -0
  256. package/dist/ui/components/modals/EditorModal.jsx +23 -0
  257. package/dist/ui/components/modals/EditorModal.jsx.map +1 -0
  258. package/dist/ui/components/modals/InputModal.d.ts +8 -0
  259. package/dist/ui/components/modals/InputModal.d.ts.map +1 -0
  260. package/dist/ui/components/modals/InputModal.jsx +15 -0
  261. package/dist/ui/components/modals/InputModal.jsx.map +1 -0
  262. package/dist/ui/components/modals/ModalContainer.d.ts +8 -0
  263. package/dist/ui/components/modals/ModalContainer.d.ts.map +1 -0
  264. package/dist/ui/components/modals/ModalContainer.jsx +34 -0
  265. package/dist/ui/components/modals/ModalContainer.jsx.map +1 -0
  266. package/dist/ui/components/modals/SelectModal.d.ts +8 -0
  267. package/dist/ui/components/modals/SelectModal.d.ts.map +1 -0
  268. package/dist/ui/components/modals/SelectModal.jsx +32 -0
  269. package/dist/ui/components/modals/SelectModal.jsx.map +1 -0
  270. package/{src/ui/components/modals/index.ts → dist/ui/components/modals/index.d.ts} +5 -4
  271. package/dist/ui/components/modals/index.d.ts.map +1 -0
  272. package/dist/ui/components/modals/index.js +5 -0
  273. package/dist/ui/components/modals/index.js.map +1 -0
  274. package/dist/ui/features/composer/Composer.d.ts +16 -0
  275. package/dist/ui/features/composer/Composer.d.ts.map +1 -0
  276. package/dist/ui/features/composer/Composer.jsx +39 -0
  277. package/dist/ui/features/composer/Composer.jsx.map +1 -0
  278. package/dist/ui/features/composer/SlashCommandHandler.d.ts +14 -0
  279. package/dist/ui/features/composer/SlashCommandHandler.d.ts.map +1 -0
  280. package/dist/ui/features/composer/SlashCommandHandler.js +43 -0
  281. package/dist/ui/features/composer/SlashCommandHandler.js.map +1 -0
  282. package/dist/ui/features/composer/keyboard.d.ts +3 -0
  283. package/dist/ui/features/composer/keyboard.d.ts.map +1 -0
  284. package/dist/ui/features/composer/keyboard.js +3 -0
  285. package/dist/ui/features/composer/keyboard.js.map +1 -0
  286. package/dist/ui/features/main-view/MainView.d.ts +52 -0
  287. package/dist/ui/features/main-view/MainView.d.ts.map +1 -0
  288. package/dist/ui/features/main-view/MainView.jsx +269 -0
  289. package/dist/ui/features/main-view/MainView.jsx.map +1 -0
  290. package/dist/ui/features/message-pane/MessagePane.d.ts +15 -0
  291. package/dist/ui/features/message-pane/MessagePane.d.ts.map +1 -0
  292. package/dist/ui/features/message-pane/MessagePane.jsx +7 -0
  293. package/dist/ui/features/message-pane/MessagePane.jsx.map +1 -0
  294. package/dist/ui/hooks/useModals.d.ts +35 -0
  295. package/dist/ui/hooks/useModals.d.ts.map +1 -0
  296. package/dist/ui/hooks/useModals.js +36 -0
  297. package/dist/ui/hooks/useModals.js.map +1 -0
  298. package/dist/ui/state/app-store.d.ts +42 -0
  299. package/dist/ui/state/app-store.d.ts.map +1 -0
  300. package/dist/ui/state/app-store.js +28 -0
  301. package/dist/ui/state/app-store.js.map +1 -0
  302. package/dist/utils.d.ts +3 -0
  303. package/dist/utils.d.ts.map +1 -0
  304. package/dist/utils.js +3 -0
  305. package/dist/utils.js.map +1 -0
  306. package/package.json +20 -7
  307. package/src/adapters/acp/index.ts +0 -305
  308. package/src/adapters/acp/protocol.ts +0 -191
  309. package/src/adapters/acp/session.ts +0 -289
  310. package/src/adapters/acp/updates.ts +0 -96
  311. package/src/adapters/cli/headless.ts +0 -112
  312. package/src/adapters/cli/validate.ts +0 -50
  313. package/src/adapters/tui/app.tsx +0 -39
  314. package/src/agent-events.ts +0 -671
  315. package/src/args.ts +0 -102
  316. package/src/autocomplete-commands.ts +0 -102
  317. package/src/commands.ts +0 -23
  318. package/src/compact-handler.ts +0 -272
  319. package/src/components/Footer.tsx +0 -49
  320. package/src/components/Header.tsx +0 -218
  321. package/src/components/MessageList.tsx +0 -380
  322. package/src/config.ts +0 -1
  323. package/src/domain/commands/builtin/clear.ts +0 -14
  324. package/src/domain/commands/builtin/compact.ts +0 -96
  325. package/src/domain/commands/builtin/conceal.ts +0 -9
  326. package/src/domain/commands/builtin/diffwrap.ts +0 -9
  327. package/src/domain/commands/builtin/editor.ts +0 -24
  328. package/src/domain/commands/builtin/exit.ts +0 -14
  329. package/src/domain/commands/builtin/followup.ts +0 -24
  330. package/src/domain/commands/builtin/index.ts +0 -29
  331. package/src/domain/commands/builtin/login.ts +0 -118
  332. package/src/domain/commands/builtin/model.ts +0 -66
  333. package/src/domain/commands/builtin/status.ts +0 -32
  334. package/src/domain/commands/builtin/steer.ts +0 -24
  335. package/src/domain/commands/builtin/theme.ts +0 -23
  336. package/src/domain/commands/builtin/thinking.ts +0 -16
  337. package/src/domain/commands/helpers.ts +0 -41
  338. package/src/domain/commands/registry.ts +0 -42
  339. package/src/domain/commands/types.ts +0 -69
  340. package/src/domain/messaging/content.ts +0 -117
  341. package/src/editor.ts +0 -103
  342. package/src/hooks/index.ts +0 -1
  343. package/src/hooks/useAgentEvents.ts +0 -28
  344. package/src/hooks/useEditorBridge.ts +0 -101
  345. package/src/hooks/useGitStatus.ts +0 -28
  346. package/src/hooks/usePromptQueue.ts +0 -7
  347. package/src/hooks/useSessionController.ts +0 -5
  348. package/src/hooks/useSpinner.ts +0 -28
  349. package/src/hooks/useToastManager.ts +0 -26
  350. package/src/index.ts +0 -188
  351. package/src/keyboard-handler.ts +0 -134
  352. package/src/profiler.ts +0 -40
  353. package/src/runtime/context.tsx +0 -16
  354. package/src/runtime/factory.ts +0 -63
  355. package/src/runtime/git/git-info.ts +0 -25
  356. package/src/runtime/session/session-controller.ts +0 -208
  357. package/src/session-manager.ts +0 -1
  358. package/src/session-picker.tsx +0 -134
  359. package/src/shell-runner.ts +0 -134
  360. package/src/syntax-highlighting.ts +0 -114
  361. package/src/theme-names.ts +0 -37
  362. package/src/tool-ui-contracts.ts +0 -77
  363. package/src/tui-open-rendering.tsx +0 -565
  364. package/src/types.ts +0 -89
  365. package/src/ui/app-shell/TuiApp.tsx +0 -586
  366. package/src/ui/clipboard/osc52.ts +0 -18
  367. package/src/ui/components/modals/ConfirmModal.tsx +0 -52
  368. package/src/ui/components/modals/EditorModal.tsx +0 -39
  369. package/src/ui/components/modals/InputModal.tsx +0 -30
  370. package/src/ui/components/modals/ModalContainer.tsx +0 -67
  371. package/src/ui/components/modals/SelectModal.tsx +0 -48
  372. package/src/ui/features/composer/Composer.tsx +0 -73
  373. package/src/ui/features/composer/SlashCommandHandler.ts +0 -58
  374. package/src/ui/features/composer/keyboard.ts +0 -3
  375. package/src/ui/features/main-view/MainView.tsx +0 -367
  376. package/src/ui/features/message-pane/MessagePane.tsx +0 -34
  377. package/src/ui/hooks/useModals.ts +0 -74
  378. package/src/ui/state/app-store.ts +0 -67
  379. package/src/utils.ts +0 -14
@@ -1,134 +0,0 @@
1
- /**
2
- * Keyboard event handling for TUI application
3
- */
4
-
5
- import type { KeyEvent } from "@opentui/core"
6
-
7
- export interface KeyboardHandlerConfig {
8
- // Autocomplete state getters
9
- showAutocomplete: () => boolean
10
- autocompleteItems: () => Array<{ label: string; description?: string }>
11
- setAutocompleteIndex: (updater: (i: number) => number) => void
12
- setShowAutocomplete: (v: boolean) => void
13
- applyAutocomplete: () => boolean
14
-
15
- // Responding state (getters for reactivity)
16
- isResponding: () => boolean
17
- retryStatus: () => string | null
18
-
19
- // Actions
20
- onAbort: () => string | null
21
- onToggleThinking: () => void
22
- onCycleModel: () => void
23
- onCycleThinking: () => void
24
- toggleLastToolExpanded: () => void
25
- copySelectionToClipboard: () => void
26
-
27
- // Editor control
28
- clearEditor: () => void
29
- setEditorText: (text: string) => void
30
-
31
- // Ctrl+C timing
32
- lastCtrlC: { current: number }
33
-
34
- // Exit handler (must be called for proper cleanup)
35
- onExit: () => void
36
- }
37
-
38
- export function createKeyboardHandler(config: KeyboardHandlerConfig): (e: KeyEvent) => void {
39
- return (e: KeyEvent) => {
40
- // Autocomplete navigation
41
- if (config.showAutocomplete()) {
42
- const items = config.autocompleteItems()
43
- if (e.name === "up") {
44
- config.setAutocompleteIndex((i) => (i > 0 ? i - 1 : items.length - 1))
45
- e.preventDefault()
46
- return
47
- }
48
- if (e.name === "down") {
49
- config.setAutocompleteIndex((i) => (i < items.length - 1 ? i + 1 : 0))
50
- e.preventDefault()
51
- return
52
- }
53
- if (e.name === "tab" || e.name === "return") {
54
- if (config.applyAutocomplete()) {
55
- e.preventDefault()
56
- return
57
- }
58
- }
59
- if (e.name === "escape") {
60
- config.setShowAutocomplete(false)
61
- e.preventDefault()
62
- return
63
- }
64
- }
65
-
66
- // Ctrl+N/Ctrl+P for autocomplete navigation
67
- if (config.showAutocomplete() && e.ctrl && (e.name === "n" || e.name === "p")) {
68
- const items = config.autocompleteItems()
69
- if (e.name === "n") {
70
- config.setAutocompleteIndex((i) => (i < items.length - 1 ? i + 1 : 0))
71
- } else {
72
- config.setAutocompleteIndex((i) => (i > 0 ? i - 1 : items.length - 1))
73
- }
74
- e.preventDefault()
75
- return
76
- }
77
-
78
- // Ctrl+C - clear or exit
79
- if (e.ctrl && e.name === "c") {
80
- const now = Date.now()
81
- if (now - config.lastCtrlC.current < 750) {
82
- config.onExit()
83
- } else {
84
- config.clearEditor()
85
- }
86
- config.lastCtrlC.current = now
87
- e.preventDefault()
88
- return
89
- }
90
-
91
- // Escape - abort if responding
92
- if (e.name === "escape" && (config.isResponding() || config.retryStatus())) {
93
- const restore = config.onAbort()
94
- if (restore) config.setEditorText(restore)
95
- e.preventDefault()
96
- return
97
- }
98
-
99
- // Ctrl+O - toggle latest tool block
100
- if (e.ctrl && e.name === "o") {
101
- config.toggleLastToolExpanded()
102
- e.preventDefault()
103
- return
104
- }
105
-
106
- // Ctrl+T - toggle thinking visibility
107
- if (e.ctrl && e.name === "t") {
108
- config.onToggleThinking()
109
- e.preventDefault()
110
- return
111
- }
112
-
113
- // Ctrl+P - cycle model
114
- if (e.ctrl && e.name === "p") {
115
- config.onCycleModel()
116
- e.preventDefault()
117
- return
118
- }
119
-
120
- // Ctrl+Y - copy selection to clipboard
121
- if (e.ctrl && e.name === "y") {
122
- config.copySelectionToClipboard()
123
- e.preventDefault()
124
- return
125
- }
126
-
127
- // Shift+Tab - cycle thinking level
128
- if (e.shift && e.name === "tab") {
129
- config.onCycleThinking()
130
- e.preventDefault()
131
- return
132
- }
133
- }
134
- }
package/src/profiler.ts DELETED
@@ -1,40 +0,0 @@
1
- import { performance } from "node:perf_hooks"
2
-
3
- type Stat = { count: number; totalMs: number; maxMs: number }
4
-
5
- const enabled = process.env["MARVIN_TUI_PROFILE"] === "1"
6
- const reportEveryMs = 2000
7
- const stats = new Map<string, Stat>()
8
- let lastReport = performance.now()
9
-
10
- function record(name: string, ms: number): void {
11
- if (!enabled) return
12
- const stat = stats.get(name) ?? { count: 0, totalMs: 0, maxMs: 0 }
13
- stat.count += 1
14
- stat.totalMs += ms
15
- if (ms > stat.maxMs) stat.maxMs = ms
16
- stats.set(name, stat)
17
-
18
- const now = performance.now()
19
- if (now - lastReport < reportEveryMs) return
20
- lastReport = now
21
- try {
22
- for (const [key, s] of stats) {
23
- const avg = s.totalMs / Math.max(1, s.count)
24
- process.stderr.write(`[perf] ${key} avg=${avg.toFixed(1)}ms max=${s.maxMs.toFixed(1)}ms n=${s.count}\n`)
25
- s.count = 0
26
- s.totalMs = 0
27
- s.maxMs = 0
28
- }
29
- } catch {}
30
- }
31
-
32
- export function profile<T>(name: string, fn: () => T): T {
33
- if (!enabled) return fn()
34
- const start = performance.now()
35
- try {
36
- return fn()
37
- } finally {
38
- record(name, performance.now() - start)
39
- }
40
- }
@@ -1,16 +0,0 @@
1
- import { createContext, useContext, type JSX } from "solid-js"
2
- import type { RuntimeContext as RuntimeServices } from "./factory.js"
3
-
4
- const RuntimeContext = createContext<RuntimeServices | null>(null)
5
-
6
- export const RuntimeProvider = (props: { runtime: RuntimeServices; children: JSX.Element }) => (
7
- <RuntimeContext.Provider value={props.runtime}>{props.children}</RuntimeContext.Provider>
8
- )
9
-
10
- export const useRuntime = (): RuntimeServices => {
11
- const ctx = useContext(RuntimeContext)
12
- if (!ctx) {
13
- throw new Error("RuntimeContext not found")
14
- }
15
- return ctx
16
- }
@@ -1,63 +0,0 @@
1
- import { Context, Effect, Exit, Layer, Scope } from "effect";
2
- import {
3
- RuntimeLayer,
4
- RuntimeServicesTag,
5
- type AdapterKind,
6
- type RuntimeLayerOptions,
7
- type RuntimeServices,
8
- } from "@yeshwanthyk/runtime-effect/runtime.js";
9
- import type { LoadConfigOptions } from "@yeshwanthyk/runtime-effect/config.js";
10
-
11
- export type RuntimeInitArgs = LoadConfigOptions;
12
-
13
- export type RuntimeContext = RuntimeServices & {
14
- /**
15
- * Explicitly shuts down the runtime scope, allowing services like the LSP
16
- * manager to flush state before the process exits.
17
- */
18
- close: () => Promise<void>;
19
- };
20
-
21
- const toLayerOptions = (args: RuntimeInitArgs | undefined, adapter: AdapterKind): RuntimeLayerOptions => ({
22
- adapter,
23
- configDir: args?.configDir,
24
- configPath: args?.configPath,
25
- provider: args?.provider,
26
- model: args?.model,
27
- thinking: args?.thinking,
28
- });
29
-
30
- export const createRuntime = async (
31
- args: RuntimeInitArgs = {},
32
- adapter: AdapterKind = "tui",
33
- ): Promise<RuntimeContext> => {
34
- const layer = RuntimeLayer(toLayerOptions(args, adapter)) as Layer.Layer<RuntimeServices, never, never>;
35
-
36
- const setupEffect = Effect.gen(function* () {
37
- const scope = yield* Scope.make();
38
- const context = yield* Layer.buildWithScope(layer, scope);
39
- const services = Context.get(context, RuntimeServicesTag);
40
- return { services, scope };
41
- });
42
-
43
- const { services, scope } = await Effect.runPromise(setupEffect);
44
-
45
- let closed = false;
46
- const close = async () => {
47
- if (closed) return;
48
- closed = true;
49
- process.removeListener("exit", exitHandler);
50
- await Effect.runPromise(Scope.close(scope, Exit.void));
51
- };
52
-
53
- const exitHandler = () => {
54
- void close();
55
- };
56
-
57
- process.once("exit", exitHandler);
58
-
59
- return {
60
- ...services,
61
- close,
62
- };
63
- };
@@ -1,25 +0,0 @@
1
- import { existsSync, readFileSync } from "fs"
2
- import { dirname, join } from "path"
3
-
4
- export const findGitHeadPath = (startDir: string = process.cwd()): string | null => {
5
- let dir = startDir
6
- while (true) {
7
- const gitHeadPath = join(dir, ".git", "HEAD")
8
- if (existsSync(gitHeadPath)) return gitHeadPath
9
- const parent = dirname(dir)
10
- if (parent === dir) return null
11
- dir = parent
12
- }
13
- }
14
-
15
- export const getCurrentBranch = (startDir?: string): string | null => {
16
- try {
17
- const gitHeadPath = findGitHeadPath(startDir)
18
- if (!gitHeadPath) return null
19
- const content = readFileSync(gitHeadPath, "utf8").trim()
20
- if (content.startsWith("ref: refs/heads/")) return content.slice(16)
21
- return "detached"
22
- } catch {
23
- return null
24
- }
25
- }
@@ -1,208 +0,0 @@
1
- import type { Agent, ThinkingLevel, AppMessage } from "@yeshwanthyk/agent-core"
2
- import type { Api, Model, KnownProvider } from "@yeshwanthyk/ai"
3
- import type { HookRunner } from "../../hooks/index.js"
4
- import type { SessionManager, LoadedSession } from "../../session-manager.js"
5
- import type { UIMessage, ToolBlock, UIContentBlock, UIShellMessage } from "../../types.js"
6
- import {
7
- extractOrderedBlocks,
8
- extractThinking,
9
- extractToolCalls,
10
- extractText,
11
- getEditDiffText,
12
- getToolText,
13
- } from "@domain/messaging/content.js"
14
- import { resolveProvider, resolveModel } from "@domain/commands/helpers.js"
15
- import type { PromptDeliveryMode, PromptQueue } from "@yeshwanthyk/runtime-effect/session/prompt-queue.js"
16
-
17
- export interface SessionControllerOptions {
18
- initialProvider: KnownProvider
19
- initialModel: Model<Api>
20
- initialModelId: string
21
- initialThinking: ThinkingLevel
22
- agent: Agent
23
- sessionManager: SessionManager
24
- hookRunner: HookRunner
25
- toolByName: Map<string, { label: string; source: "builtin" | "custom"; sourcePath?: string; renderCall?: any; renderResult?: any }>
26
- setMessages: (updater: (prev: UIMessage[]) => UIMessage[]) => void
27
- setContextTokens: (v: number) => void
28
- setDisplayProvider: (provider: KnownProvider) => void
29
- setDisplayModelId: (id: string) => void
30
- setDisplayThinking: (v: ThinkingLevel) => void
31
- setDisplayContextWindow: (v: number) => void
32
- shellInjectionPrefix: string
33
- promptQueue?: PromptQueue
34
- }
35
-
36
- export interface SessionControllerState {
37
- ensureSession: () => void
38
- restoreSession: (session: LoadedSession) => void
39
- currentProvider: () => KnownProvider
40
- setCurrentProvider: (p: KnownProvider) => void
41
- currentModelId: () => string
42
- setCurrentModelId: (id: string) => void
43
- currentThinking: () => ThinkingLevel
44
- setCurrentThinking: (t: ThinkingLevel) => void
45
- isSessionStarted: () => boolean
46
- followUp: (text: string) => Promise<void>
47
- steer: (text: string) => Promise<void>
48
- sendUserMessage: (text: string, options?: { deliverAs?: PromptDeliveryMode }) => Promise<void>
49
- }
50
-
51
- export function createSessionController(options: SessionControllerOptions): SessionControllerState {
52
- let sessionStarted = false
53
- let currentProvider = options.initialProvider
54
- let currentModelId = options.initialModelId
55
- let currentThinking = options.initialThinking
56
-
57
- options.setDisplayProvider(currentProvider)
58
-
59
- const ensureSession = () => {
60
- if (!sessionStarted) {
61
- options.sessionManager.startSession(currentProvider, currentModelId, currentThinking)
62
- sessionStarted = true
63
- void options.hookRunner.emit({ type: "session.start", sessionId: options.sessionManager.sessionId })
64
- }
65
- }
66
-
67
- const restoreSession = (session: LoadedSession) => {
68
- const { metadata } = session
69
- const sessionMessages = session.messages as AppMessage[]
70
- const resolvedProvider = resolveProvider(metadata.provider)
71
- if (resolvedProvider) {
72
- const resolvedModel = resolveModel(resolvedProvider, metadata.modelId)
73
- if (resolvedModel) {
74
- currentProvider = resolvedProvider
75
- currentModelId = resolvedModel.id
76
- currentThinking = metadata.thinkingLevel
77
- options.setDisplayProvider(resolvedProvider)
78
- options.agent.setModel(resolvedModel)
79
- options.agent.setThinkingLevel(metadata.thinkingLevel)
80
- options.setDisplayModelId(resolvedModel.id)
81
- options.setDisplayThinking(metadata.thinkingLevel)
82
- options.setDisplayContextWindow(resolvedModel.contextWindow)
83
- }
84
- }
85
- options.agent.replaceMessages(sessionMessages)
86
-
87
- for (let i = sessionMessages.length - 1; i >= 0; i--) {
88
- const msg = sessionMessages[i] as { role: string; usage?: { totalTokens?: number } }
89
- if (msg.role === "assistant" && msg.usage?.totalTokens) {
90
- options.setContextTokens(msg.usage.totalTokens)
91
- break
92
- }
93
- }
94
-
95
- const toolResultMap = new Map<string, { output: string; editDiff: string | null; isError: boolean }>()
96
- for (const msg of sessionMessages) {
97
- if (msg.role === "toolResult") {
98
- toolResultMap.set(msg.toolCallId, {
99
- output: getToolText(msg),
100
- editDiff: getEditDiffText(msg),
101
- isError: msg.isError ?? false,
102
- })
103
- }
104
- }
105
-
106
- const uiMessages: UIMessage[] = []
107
- for (const msg of sessionMessages) {
108
- if (msg.role === "user") {
109
- const contentText = typeof msg.content === "string" ? msg.content : extractText(msg.content as unknown[])
110
- if (contentText.startsWith(options.shellInjectionPrefix)) continue
111
- uiMessages.push({ id: crypto.randomUUID(), role: "user", content: contentText })
112
- } else if (msg.role === "assistant") {
113
- const text = extractText(msg.content as unknown[])
114
- const thinking = extractThinking(msg.content as unknown[])
115
- const toolCalls = extractToolCalls(msg.content as unknown[])
116
- const tools: ToolBlock[] = toolCalls.map((tc) => {
117
- const result = toolResultMap.get(tc.id)
118
- const meta = options.toolByName.get(tc.name)
119
- return {
120
- id: tc.id,
121
- name: tc.name,
122
- args: tc.args,
123
- output: result?.output,
124
- editDiff: result?.editDiff || undefined,
125
- isError: result?.isError ?? false,
126
- isComplete: true,
127
- label: meta?.label,
128
- source: meta?.source,
129
- sourcePath: meta?.sourcePath,
130
- renderCall: meta?.renderCall,
131
- renderResult: meta?.renderResult,
132
- }
133
- })
134
- const orderedBlocks = extractOrderedBlocks(msg.content as unknown[])
135
- const contentBlocks: UIContentBlock[] = orderedBlocks.map((block) => {
136
- if (block.type === "thinking") {
137
- return { type: "thinking", id: block.id, summary: block.summary, preview: block.preview, full: block.full }
138
- } else if (block.type === "text") {
139
- return { type: "text", text: block.text }
140
- } else {
141
- const tool = tools.find((t) => t.id === block.id)
142
- return {
143
- type: "tool",
144
- tool: tool || { id: block.id, name: block.name, args: block.args, isError: false, isComplete: false },
145
- }
146
- }
147
- })
148
- uiMessages.push({ id: crypto.randomUUID(), role: "assistant", content: text, thinking: thinking || undefined, isStreaming: false, tools, contentBlocks })
149
- } else if ((msg as { role: string }).role === "shell") {
150
- const shellMsg = msg as unknown as UIShellMessage
151
- uiMessages.push({
152
- id: crypto.randomUUID(),
153
- role: "shell",
154
- command: shellMsg.command,
155
- output: shellMsg.output,
156
- exitCode: shellMsg.exitCode,
157
- truncated: shellMsg.truncated,
158
- tempFilePath: shellMsg.tempFilePath,
159
- timestamp: shellMsg.timestamp,
160
- })
161
- }
162
- }
163
-
164
- options.setMessages(() => uiMessages)
165
- const sessionPath = options.sessionManager.listSessions().find((s) => s.id === metadata.id)?.path || ""
166
- options.sessionManager.continueSession(sessionPath, metadata.id)
167
- sessionStarted = true
168
- void options.hookRunner.emit({ type: "session.resume", sessionId: metadata.id })
169
- }
170
-
171
- const queueUserMessage = async (text: string, mode: PromptDeliveryMode) => {
172
- const trimmed = text
173
- if (!trimmed) return
174
- const message: AppMessage = {
175
- role: "user",
176
- content: [{ type: "text", text: trimmed }],
177
- timestamp: Date.now(),
178
- }
179
- options.promptQueue?.push({ text: trimmed, mode })
180
- if (mode === "steer") {
181
- await options.agent.steer(message)
182
- } else {
183
- await options.agent.followUp(message)
184
- }
185
- }
186
-
187
- return {
188
- ensureSession,
189
- restoreSession,
190
- currentProvider: () => currentProvider,
191
- setCurrentProvider: (p) => {
192
- currentProvider = p
193
- options.setDisplayProvider(p)
194
- },
195
- currentModelId: () => currentModelId,
196
- setCurrentModelId: (id) => {
197
- currentModelId = id
198
- },
199
- currentThinking: () => currentThinking,
200
- setCurrentThinking: (t) => {
201
- currentThinking = t
202
- },
203
- isSessionStarted: () => sessionStarted,
204
- followUp: (text) => queueUserMessage(text, "followUp"),
205
- steer: (text) => queueUserMessage(text, "steer"),
206
- sendUserMessage: (text, options) => queueUserMessage(text, options?.deliverAs ?? "followUp"),
207
- }
208
- }
@@ -1 +0,0 @@
1
- export * from "@yeshwanthyk/runtime-effect/session-manager";
@@ -1,134 +0,0 @@
1
- /**
2
- * OpenTUI-based session picker
3
- */
4
-
5
- import { render, useTerminalDimensions, useKeyboard } from "@opentui/solid"
6
- import { SelectList, ThemeProvider, useTheme, type SelectItem, type SelectListRef, type ThemeMode } from "@yeshwanthyk/open-tui"
7
- import type { SessionManager } from "./session-manager.js"
8
-
9
- /** Detect system dark/light mode (macOS only, defaults to dark) */
10
- function detectThemeMode(): ThemeMode {
11
- try {
12
- const result = Bun.spawnSync(["defaults", "read", "-g", "AppleInterfaceStyle"])
13
- return result.stdout.toString().trim().toLowerCase() === "dark" ? "dark" : "light"
14
- } catch {
15
- return "dark"
16
- }
17
- }
18
-
19
- interface SessionPickerProps {
20
- sessions: Array<{
21
- path: string
22
- firstMessage: string
23
- timestamp: number
24
- messageCount: number
25
- modelId: string
26
- }>
27
- onSelect: (path: string) => void
28
- onCancel: () => void
29
- }
30
-
31
- function SessionPickerApp(props: SessionPickerProps) {
32
- const { theme } = useTheme()
33
- const dimensions = useTerminalDimensions()
34
- let listRef: SelectListRef | undefined
35
-
36
- const items: SelectItem[] = props.sessions.map((s) => ({
37
- value: s.path,
38
- label: formatFirstMessage(s.firstMessage),
39
- description: formatMeta(s.timestamp, s.messageCount, s.modelId),
40
- }))
41
-
42
- useKeyboard((e: { name: string; ctrl?: boolean }) => {
43
- if (e.name === "up" || (e.ctrl && e.name === "p")) {
44
- listRef?.moveUp()
45
- } else if (e.name === "down" || (e.ctrl && e.name === "n")) {
46
- listRef?.moveDown()
47
- } else if (e.name === "return") {
48
- listRef?.select()
49
- } else if (e.name === "escape" || (e.ctrl && e.name === "c")) {
50
- props.onCancel()
51
- }
52
- })
53
-
54
- return (
55
- <box
56
- flexDirection="column"
57
- width={dimensions().width}
58
- height={dimensions().height}
59
- >
60
- <text fg={theme.textMuted}>Resume Session</text>
61
- <box height={1} />
62
- <SelectList
63
- ref={(r) => { listRef = r }}
64
- items={items}
65
- maxVisible={Math.min(10, dimensions().height - 4)}
66
- width={dimensions().width - 2}
67
- onSelect={(item) => props.onSelect(item.value)}
68
- onCancel={props.onCancel}
69
- />
70
- <box flexGrow={1} />
71
- <text fg={theme.textMuted}>↑/↓ navigate · Enter select · Esc cancel</text>
72
- </box>
73
- )
74
- }
75
-
76
- function formatFirstMessage(msg: string): string {
77
- return msg.replace(/\n/g, " ").slice(0, 60)
78
- }
79
-
80
- function formatMeta(ts: number, count: number, model: string): string {
81
- const ago = formatRelativeTime(ts)
82
- return `${ago} · ${count} msgs · ${model}`
83
- }
84
-
85
- function formatRelativeTime(ts: number): string {
86
- const seconds = Math.floor((Date.now() - ts) / 1000)
87
- if (seconds < 60) return `${seconds}s ago`
88
- const minutes = Math.floor(seconds / 60)
89
- if (minutes < 60) return `${minutes}m ago`
90
- const hours = Math.floor(minutes / 60)
91
- if (hours < 24) return `${hours}h ago`
92
- const days = Math.floor(hours / 24)
93
- return `${days}d ago`
94
- }
95
-
96
- export async function selectSession(sessionManager: SessionManager): Promise<string | null> {
97
- const sessions = sessionManager.loadAllSessions()
98
- if (sessions.length === 0) return null
99
- if (sessions.length === 1) return sessions[0]!.path
100
-
101
- return new Promise((resolve) => {
102
- let resolved = false
103
-
104
- const doResolve = (value: string | null) => {
105
- if (resolved) return
106
- resolved = true
107
- if (value === null) {
108
- // Cancel - exit immediately since we're done
109
- process.stdout.write("\nNo session selected\n")
110
- process.exit(0)
111
- }
112
- resolve(value)
113
- }
114
-
115
- const themeMode = detectThemeMode()
116
-
117
- render(
118
- () => (
119
- <ThemeProvider mode={themeMode}>
120
- <SessionPickerApp
121
- sessions={sessions}
122
- onSelect={(path) => doResolve(path)}
123
- onCancel={() => doResolve(null)}
124
- />
125
- </ThemeProvider>
126
- ),
127
- {
128
- targetFps: 30,
129
- exitOnCtrlC: false,
130
- useKittyKeyboard: {},
131
- }
132
- )
133
- })
134
- }