@ebowwa/coder 0.2.1 → 0.7.64

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 (401) hide show
  1. package/README.md +31 -32
  2. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  3. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  4. package/dist/core/__tests__/permissions.test.js +851 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  7. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  10. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  12. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  13. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  16. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  19. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  22. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  23. package/dist/core/agent-loop/compaction.d.ts +39 -0
  24. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  25. package/dist/core/agent-loop/compaction.js +51 -0
  26. package/dist/core/agent-loop/formatters.d.ts +21 -0
  27. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  28. package/dist/core/agent-loop/formatters.js +42 -0
  29. package/dist/core/agent-loop/index.d.ts +25 -0
  30. package/dist/core/agent-loop/index.d.ts.map +1 -0
  31. package/dist/core/agent-loop/index.js +83 -0
  32. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  33. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  34. package/dist/core/agent-loop/loop-state.js +147 -0
  35. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  36. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  37. package/dist/core/agent-loop/message-builder.js +49 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  39. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  40. package/dist/core/agent-loop/tool-executor.js +152 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  42. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  43. package/dist/core/agent-loop/turn-executor.js +124 -0
  44. package/dist/core/agent-loop/types.d.ts +141 -0
  45. package/dist/core/agent-loop/types.d.ts.map +1 -0
  46. package/dist/core/agent-loop/types.js +4 -0
  47. package/dist/core/agent-loop.d.ts +17 -0
  48. package/dist/core/agent-loop.d.ts.map +1 -0
  49. package/dist/core/agent-loop.js +16 -0
  50. package/dist/core/api-client-impl.d.ts +62 -0
  51. package/dist/core/api-client-impl.d.ts.map +1 -0
  52. package/dist/core/api-client-impl.js +479 -0
  53. package/dist/core/api-client.d.ts +6 -0
  54. package/dist/core/api-client.d.ts.map +1 -0
  55. package/dist/core/api-client.js +5 -0
  56. package/dist/core/checkpoints.d.ts +128 -0
  57. package/dist/core/checkpoints.d.ts.map +1 -0
  58. package/dist/core/checkpoints.js +438 -0
  59. package/dist/core/claude-md.d.ts +71 -0
  60. package/dist/core/claude-md.d.ts.map +1 -0
  61. package/dist/core/claude-md.js +198 -0
  62. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  63. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  64. package/dist/core/cognitive-security/hooks.js +389 -0
  65. package/dist/core/cognitive-security/index.d.ts +751 -0
  66. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  67. package/dist/core/cognitive-security/index.js +1123 -0
  68. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  69. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  70. package/dist/core/cognitive-security/middleware.js +376 -0
  71. package/dist/core/config-loader.d.ts +127 -0
  72. package/dist/core/config-loader.d.ts.map +1 -0
  73. package/dist/core/config-loader.js +219 -0
  74. package/dist/core/context-compaction.d.ts +87 -0
  75. package/dist/core/context-compaction.d.ts.map +1 -0
  76. package/dist/core/context-compaction.js +428 -0
  77. package/dist/core/git-status.d.ts +25 -0
  78. package/dist/core/git-status.d.ts.map +1 -0
  79. package/dist/core/git-status.js +204 -0
  80. package/dist/core/image.d.ts +69 -0
  81. package/dist/core/image.d.ts.map +1 -0
  82. package/dist/core/image.js +290 -0
  83. package/dist/core/image.test.d.ts +2 -0
  84. package/dist/core/image.test.d.ts.map +1 -0
  85. package/dist/core/image.test.js +149 -0
  86. package/dist/core/models.d.ts +123 -0
  87. package/dist/core/models.d.ts.map +1 -0
  88. package/dist/core/models.js +325 -0
  89. package/dist/core/permissions.d.ts +81 -0
  90. package/dist/core/permissions.d.ts.map +1 -0
  91. package/dist/core/permissions.js +327 -0
  92. package/dist/core/retry.d.ts +25 -0
  93. package/dist/core/retry.d.ts.map +1 -0
  94. package/dist/core/retry.js +121 -0
  95. package/dist/core/session-store.d.ts +9 -0
  96. package/dist/core/session-store.d.ts.map +1 -0
  97. package/dist/core/session-store.js +10 -0
  98. package/dist/core/sessions/export.d.ts +47 -0
  99. package/dist/core/sessions/export.d.ts.map +1 -0
  100. package/dist/core/sessions/export.js +256 -0
  101. package/dist/core/sessions/index.d.ts +132 -0
  102. package/dist/core/sessions/index.d.ts.map +1 -0
  103. package/dist/core/sessions/index.js +442 -0
  104. package/dist/core/sessions/metadata.d.ts +77 -0
  105. package/dist/core/sessions/metadata.d.ts.map +1 -0
  106. package/dist/core/sessions/metadata.js +233 -0
  107. package/dist/core/sessions/persistence.d.ts +72 -0
  108. package/dist/core/sessions/persistence.d.ts.map +1 -0
  109. package/dist/core/sessions/persistence.js +201 -0
  110. package/dist/core/sessions/types.d.ts +110 -0
  111. package/dist/core/sessions/types.d.ts.map +1 -0
  112. package/dist/core/sessions/types.js +4 -0
  113. package/dist/core/stream-highlighter.d.ts +18 -0
  114. package/dist/core/stream-highlighter.d.ts.map +1 -0
  115. package/dist/core/stream-highlighter.js +916 -0
  116. package/dist/core/system-reminders.d.ts +89 -0
  117. package/dist/core/system-reminders.d.ts.map +1 -0
  118. package/dist/core/system-reminders.js +285 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  121. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  122. package/dist/ecosystem/hooks/index.d.ts +59 -0
  123. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  124. package/dist/ecosystem/hooks/index.js +294 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  127. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  128. package/dist/ecosystem/skills/index.d.ts +55 -0
  129. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  130. package/dist/ecosystem/skills/index.js +258 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  133. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  134. package/dist/ecosystem/tools/index.d.ts +24 -0
  135. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  136. package/dist/ecosystem/tools/index.js +1709 -0
  137. package/dist/index.d.ts +24 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +32 -2
  140. package/dist/interfaces/mcp/client.d.ts +40 -0
  141. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  142. package/dist/interfaces/mcp/client.js +309 -0
  143. package/dist/interfaces/ui/index.d.ts +36 -0
  144. package/dist/interfaces/ui/index.d.ts.map +1 -0
  145. package/dist/interfaces/ui/index.js +61 -0
  146. package/dist/interfaces/ui/spinner.d.ts +140 -0
  147. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  148. package/dist/interfaces/ui/spinner.js +342 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  150. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  151. package/dist/interfaces/ui/terminal/cli/index.js +167 -0
  152. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  153. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  154. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  155. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  156. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  157. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  158. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  159. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  160. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  161. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  162. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  163. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  164. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  165. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  166. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  167. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  168. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  169. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  170. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  171. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  172. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  173. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  174. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  175. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  176. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  177. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  178. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  179. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  180. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  181. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  182. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  183. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  184. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  185. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  186. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  187. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  188. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  189. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  190. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  191. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  192. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  193. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  194. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  195. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  196. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  197. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  198. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  199. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  200. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  201. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  202. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  203. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  204. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  205. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  206. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  207. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  208. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  209. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  210. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  211. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  212. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  213. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  214. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  215. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  216. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  217. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  218. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  219. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  220. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  221. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  222. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  223. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  224. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  225. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  226. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  227. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  228. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  229. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  230. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  231. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  232. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  233. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  234. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  235. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  236. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  237. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  238. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  239. package/dist/native/index.d.ts +480 -0
  240. package/dist/native/index.d.ts.map +1 -0
  241. package/dist/native/index.js +1625 -0
  242. package/dist/teammates/index.d.ts +161 -0
  243. package/dist/teammates/index.d.ts.map +1 -0
  244. package/dist/teammates/index.js +827 -0
  245. package/dist/types/index.d.ts +482 -0
  246. package/dist/types/index.d.ts.map +1 -0
  247. package/dist/types/index.js +52 -0
  248. package/native/README.md +5 -5
  249. package/native/index.darwin-arm64.node +0 -0
  250. package/native/index.node +0 -0
  251. package/native/package.json +4 -4
  252. package/package.json +33 -16
  253. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  254. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
  255. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  256. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  257. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  258. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  259. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  260. package/packages/src/core/agent-loop/compaction.ts +88 -0
  261. package/packages/src/core/agent-loop/formatters.ts +50 -0
  262. package/packages/src/core/agent-loop/index.ts +135 -0
  263. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  264. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  265. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  266. package/packages/src/core/agent-loop/turn-executor.ts +222 -0
  267. package/packages/src/core/agent-loop/types.ts +148 -0
  268. package/packages/src/core/agent-loop.ts +18 -0
  269. package/packages/src/core/api-client-impl.ts +619 -0
  270. package/packages/src/core/api-client.ts +6 -0
  271. package/packages/src/core/checkpoints.ts +606 -0
  272. package/packages/src/core/claude-md.ts +272 -0
  273. package/packages/src/core/cognitive-security/hooks.ts +590 -0
  274. package/packages/src/core/cognitive-security/index.ts +2041 -0
  275. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  276. package/packages/src/core/config-loader.ts +324 -0
  277. package/packages/src/core/context-compaction.ts +578 -0
  278. package/packages/src/core/git-status.ts +262 -0
  279. package/packages/src/core/image.test.ts +180 -0
  280. package/packages/src/core/image.ts +350 -0
  281. package/packages/src/core/lmdb.db +0 -0
  282. package/packages/src/core/lmdb.db-lock +0 -0
  283. package/packages/src/core/models.ts +430 -0
  284. package/packages/src/core/normalizers/todo +4 -0
  285. package/packages/src/core/permissions.ts +431 -0
  286. package/packages/src/core/retry.ts +170 -0
  287. package/packages/src/core/session-store.ts +36 -0
  288. package/packages/src/core/sessions/export.ts +329 -0
  289. package/packages/src/core/sessions/index.ts +587 -0
  290. package/packages/src/core/sessions/metadata.ts +309 -0
  291. package/packages/src/core/sessions/persistence.ts +244 -0
  292. package/packages/src/core/sessions/types.ts +169 -0
  293. package/packages/src/core/stream-highlighter.ts +1123 -0
  294. package/packages/src/core/system-reminders.ts +402 -0
  295. package/packages/src/core/todo +8 -0
  296. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  297. package/packages/src/ecosystem/hooks/index.ts +341 -0
  298. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  299. package/packages/src/ecosystem/skills/index.ts +295 -0
  300. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  301. package/packages/src/ecosystem/tools/index.ts +1877 -0
  302. package/packages/src/index.ts +120 -0
  303. package/packages/src/interfaces/mcp/client.ts +389 -0
  304. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  305. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  306. package/packages/src/interfaces/ui/index.ts +161 -0
  307. package/packages/src/interfaces/ui/lmdb.db +0 -0
  308. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  309. package/packages/src/interfaces/ui/spinner.ts +451 -0
  310. package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
  311. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  312. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  313. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  314. package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
  315. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  316. package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
  317. package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
  318. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
  319. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  320. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
  321. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
  322. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
  323. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
  324. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
  325. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
  326. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
  327. package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
  328. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
  329. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
  330. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
  331. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
  332. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
  333. package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
  334. package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
  335. package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
  336. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
  337. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
  338. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
  339. package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
  340. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
  341. package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
  342. package/packages/src/lmdb.db +0 -0
  343. package/packages/src/lmdb.db-lock +0 -0
  344. package/packages/src/native/index.ts +2345 -0
  345. package/packages/src/teammates/index.ts +982 -0
  346. package/packages/src/types/index.ts +722 -0
  347. package/dist/cli.js +0 -148
  348. package/dist/index-0pkak453.js +0 -136
  349. package/dist/index-0qd0x8b4.js +0 -110
  350. package/dist/index-0x3kprq6.js +0 -240
  351. package/dist/index-1eawy937.js +0 -308
  352. package/dist/index-24m2aygy.js +0 -240
  353. package/dist/index-29xcjnne.js +0 -280
  354. package/dist/index-2avyytn5.js +0 -349
  355. package/dist/index-4ms367ey.js +0 -136
  356. package/dist/index-4w2t3b0m.js +0 -240
  357. package/dist/index-4xfgd8nz.js +0 -261
  358. package/dist/index-5acjp9gc.js +0 -157
  359. package/dist/index-5s15hr56.js +0 -136
  360. package/dist/index-6e4wf341.js +0 -349
  361. package/dist/index-6fvnkedw.js +0 -240
  362. package/dist/index-6rqpmd4g.js +0 -128
  363. package/dist/index-77ckwnbm.js +0 -280
  364. package/dist/index-9knxy49k.js +0 -128
  365. package/dist/index-9zrnw4zx.js +0 -128
  366. package/dist/index-bk21w99v.js +0 -280
  367. package/dist/index-c41n76fv.js +0 -240
  368. package/dist/index-cb4ppjdt.js +0 -255
  369. package/dist/index-cfb2edt6.js +0 -240
  370. package/dist/index-cmfa38hh.js +0 -308
  371. package/dist/index-datjz8q1.js +0 -257
  372. package/dist/index-eadf4wvn.js +0 -240
  373. package/dist/index-em5k0m3z.js +0 -345
  374. package/dist/index-gh8r333a.js +0 -110
  375. package/dist/index-gkx6k2tr.js +0 -261
  376. package/dist/index-h5cabfks.js +0 -155
  377. package/dist/index-hcrpwyy3.js +0 -261
  378. package/dist/index-hk7fwwa8.js +0 -257
  379. package/dist/index-jb8cw7f8.js +0 -136
  380. package/dist/index-kbyw4th1.js +0 -347
  381. package/dist/index-kgj5gqnm.js +0 -345
  382. package/dist/index-mdf6xp1z.js +0 -255
  383. package/dist/index-mrhv8kvc.js +0 -280
  384. package/dist/index-mt4743dd.js +0 -161
  385. package/dist/index-qnwsg97q.js +0 -240
  386. package/dist/index-qwdy6x44.js +0 -261
  387. package/dist/index-rmj77261.js +0 -157
  388. package/dist/index-sbbw1a61.js +0 -349
  389. package/dist/index-svy5bcpn.js +0 -345
  390. package/dist/index-tvmy7tm9.js +0 -261
  391. package/dist/index-tzz4vzkj.js +0 -312
  392. package/dist/index-vz80zmhe.js +0 -110
  393. package/dist/index-wed2fk67.js +0 -240
  394. package/dist/index-wksgzz8e.js +0 -280
  395. package/dist/index-wn2m4wma.js +0 -240
  396. package/dist/index-xha05vjc.js +0 -257
  397. package/dist/index-yc6eh8p8.js +0 -136
  398. package/dist/index-ycjxx9ft.js +0 -240
  399. package/dist/index-z0gzd0fc.js +0 -110
  400. package/dist/index-z8cwtf8j.js +0 -240
  401. package/dist/index-zy5mtt00.js +0 -128
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Main Interactive TUI Component
3
+ * Orchestrates all sub-components and manages state and agent loop
4
+ *
5
+ * Uses:
6
+ * - MessageStore: Centralized message state management
7
+ * - InputContext: Centralized keyboard input handling
8
+ */
9
+ import React, { useState, useEffect, useCallback, useRef, useMemo } from "react";
10
+ import { Box, Text, useApp, useStdout } from "ink";
11
+ import { agentLoop } from "../../../../core/agent-loop.js";
12
+ import { getGitStatus } from "../../../../core/git-status.js";
13
+ import { createStreamHighlighter } from "../../../../core/stream-highlighter.js";
14
+ import { calculateContextInfo } from "../shared/status-line.js";
15
+ import { spinnerFrames } from "./spinner.js";
16
+ import { MessageArea } from "./MessageArea.js";
17
+ import { InputField, setGlobalInput } from "./InputField.js";
18
+ import { handleCommand } from "./commands.js";
19
+ import { useNativeInput, KeyEvents } from "./useNativeInput.js";
20
+ import { InputProvider } from "./InputContext.js";
21
+ import { MessageStoreProvider, useMessageStore } from "./MessageStore.js";
22
+ /**
23
+ * Estimate token count from text
24
+ * Uses ~4 characters per token as rough approximation
25
+ */
26
+ function estimateTokens(text) {
27
+ if (!text)
28
+ return 0;
29
+ return Math.ceil(text.length / 4);
30
+ }
31
+ /**
32
+ * Estimate total tokens from messages
33
+ */
34
+ function estimateMessagesTokens(messages) {
35
+ let total = 0;
36
+ for (const msg of messages) {
37
+ if (typeof msg.content === "string") {
38
+ total += estimateTokens(msg.content);
39
+ }
40
+ else if (Array.isArray(msg.content)) {
41
+ for (const block of msg.content) {
42
+ if (block.type === "text") {
43
+ total += estimateTokens(block.text);
44
+ }
45
+ else if (block.type === "tool_use") {
46
+ total += estimateTokens(JSON.stringify(block.input));
47
+ }
48
+ else if (block.type === "tool_result") {
49
+ if (typeof block.content === "string") {
50
+ total += estimateTokens(block.content);
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ return total;
57
+ }
58
+ /**
59
+ * Inner component that uses MessageStore
60
+ */
61
+ function InteractiveTUIInner({ apiKey, model: initialModel, permissionMode, maxTokens, systemPrompt: initialSystemPrompt, tools, hookManager, sessionStore, sessionId, setSessionId, workingDirectory, onExit, }) {
62
+ // Message store
63
+ const { messages, apiMessages, addMessage, addApiMessages, addSystem, tokenCount, setTokenCount, } = useMessageStore();
64
+ // UI state - use refs for immediate input display updates
65
+ const inputRef = useRef("");
66
+ const cursorRef = useRef(0);
67
+ const [isLoading, setIsLoading] = useState(false);
68
+ // Update input and sync to global state for InputField
69
+ // NOTE: Use inputRef.current and cursorRef.current directly in callbacks
70
+ // to avoid stale closure values. Don't use inputValue/cursorPos variables.
71
+ const setInputValue = useCallback((value) => {
72
+ inputRef.current = value;
73
+ setGlobalInput(value, cursorRef.current);
74
+ }, []);
75
+ const setCursorPos = useCallback((pos) => {
76
+ const newPos = typeof pos === "function" ? pos(cursorRef.current) : pos;
77
+ cursorRef.current = newPos;
78
+ setGlobalInput(inputRef.current, newPos);
79
+ }, []);
80
+ const [totalCost, setTotalCost] = useState(0);
81
+ const [spinnerFrame, setSpinnerFrame] = useState("⠋");
82
+ const [model, setModel] = useState(initialModel);
83
+ const [systemPrompt] = useState(initialSystemPrompt);
84
+ const [streamingText, setStreamingText] = useState("");
85
+ const [scrollOffset, setScrollOffset] = useState(0);
86
+ const [sessionSelectMode, setSessionSelectMode] = useState(false);
87
+ const [selectableSessions, setSelectableSessions] = useState([]);
88
+ const [helpMode, setHelpMode] = useState(false);
89
+ const [helpSection, setHelpSection] = useState(0);
90
+ // Input history
91
+ const [inputHistory, setInputHistory] = useState([]);
92
+ const [historyIndex, setHistoryIndex] = useState(-1);
93
+ const [savedInput, setSavedInput] = useState("");
94
+ const { exit } = useApp();
95
+ const { stdout } = useStdout();
96
+ const frameRef = useRef(0);
97
+ const isProcessingRef = useRef(false);
98
+ const highlighterRef = useRef(createStreamHighlighter());
99
+ // Calculate terminal layout
100
+ const terminalHeight = stdout.rows || 24;
101
+ const inputHeight = 3;
102
+ const statusHeight = 3;
103
+ const messageHeight = terminalHeight - inputHeight - statusHeight;
104
+ // Calculate context warning
105
+ const contextInfo = calculateContextInfo(tokenCount, model);
106
+ const contextWarning = contextInfo.isCritical
107
+ ? "Context critical! Use /compact or start new conversation"
108
+ : contextInfo.isLow
109
+ ? `Context low: ${contextInfo.percentRemaining.toFixed(0)}% remaining`
110
+ : null;
111
+ // Auto-scroll to bottom when new messages arrive
112
+ useEffect(() => {
113
+ setScrollOffset(0);
114
+ }, [messages.length]);
115
+ // Spinner animation
116
+ useEffect(() => {
117
+ if (!isLoading)
118
+ return;
119
+ const interval = setInterval(() => {
120
+ frameRef.current = (frameRef.current + 1) % spinnerFrames.length;
121
+ const frame = spinnerFrames[frameRef.current];
122
+ if (frame)
123
+ setSpinnerFrame(frame);
124
+ }, 80);
125
+ return () => clearInterval(interval);
126
+ }, [isLoading]);
127
+ // Process a message
128
+ const processMessage = useCallback(async (input, messageAlreadyAdded = false) => {
129
+ if (isProcessingRef.current)
130
+ return;
131
+ isProcessingRef.current = true;
132
+ // Add user message to UI if not already added
133
+ if (!messageAlreadyAdded) {
134
+ addMessage({ role: "user", content: input });
135
+ }
136
+ setIsLoading(true);
137
+ setStreamingText("");
138
+ highlighterRef.current = createStreamHighlighter();
139
+ try {
140
+ // Execute UserPromptSubmit hook
141
+ const hookResult = await hookManager.execute("UserPromptSubmit", {
142
+ prompt: input,
143
+ session_id: sessionId,
144
+ });
145
+ if (hookResult.decision === "deny" || hookResult.decision === "block") {
146
+ addSystem(`Input blocked: ${hookResult.reason || "Security policy"}`);
147
+ return;
148
+ }
149
+ const processedInput = hookResult.modified_input?.prompt ?? input;
150
+ // Build messages for API
151
+ const newUserMsg = {
152
+ role: "user",
153
+ content: [{ type: "text", text: processedInput }],
154
+ };
155
+ const messagesForApi = [...apiMessages, newUserMsg];
156
+ // Get git status
157
+ const gitStatus = await getGitStatus(workingDirectory);
158
+ // Run agent loop
159
+ const result = await agentLoop(messagesForApi, {
160
+ apiKey,
161
+ model,
162
+ maxTokens,
163
+ systemPrompt,
164
+ tools,
165
+ permissionMode,
166
+ workingDirectory,
167
+ gitStatus,
168
+ extendedThinking: undefined,
169
+ hookManager,
170
+ sessionId,
171
+ onText: (text) => {
172
+ setStreamingText((prev) => prev + text);
173
+ },
174
+ onThinking: () => {
175
+ // Could show thinking in UI
176
+ },
177
+ onToolUse: (toolUse) => {
178
+ addSystem(`[Using: ${toolUse.name}]`, "tool_call", toolUse.name);
179
+ },
180
+ onToolResult: (toolResult) => {
181
+ if (toolResult.result.is_error) {
182
+ addSystem(`[Tool ${toolResult.id}: Error]`, "tool_result", undefined, true);
183
+ }
184
+ },
185
+ onMetrics: async (metrics) => {
186
+ const apiTokens = metrics.usage.input_tokens + metrics.usage.output_tokens;
187
+ if (apiTokens > 0) {
188
+ setTokenCount(apiTokens);
189
+ }
190
+ await sessionStore.saveMetrics(metrics);
191
+ },
192
+ });
193
+ // Update API messages (MessageStore will convert to UI messages)
194
+ // Note: result.messages already includes newUserMsg, so we don't add it again
195
+ // Only add the NEW messages from the result (skip ones we already have)
196
+ addApiMessages(result.messages.slice(apiMessages.length));
197
+ setTotalCost((prev) => prev + result.totalCost);
198
+ // Estimate tokens from final messages
199
+ const estimatedTokens = estimateMessagesTokens(result.messages);
200
+ setTokenCount(estimatedTokens);
201
+ // Save to session
202
+ const lastUserMsg = result.messages[result.messages.length - 2];
203
+ const lastAssistantMsg = result.messages[result.messages.length - 1];
204
+ if (lastUserMsg)
205
+ await sessionStore.saveMessage(lastUserMsg);
206
+ if (lastAssistantMsg)
207
+ await sessionStore.saveMessage(lastAssistantMsg);
208
+ }
209
+ catch (error) {
210
+ const errorMessage = error instanceof Error ? error.message : String(error);
211
+ addSystem(`Error: ${errorMessage}`, "error");
212
+ }
213
+ finally {
214
+ setIsLoading(false);
215
+ isProcessingRef.current = false;
216
+ setStreamingText("");
217
+ }
218
+ }, [apiMessages, apiKey, model, maxTokens, systemPrompt, tools, permissionMode, workingDirectory, hookManager, sessionId, sessionStore, addMessage, addSystem, addApiMessages, setTokenCount]);
219
+ // Handle commands
220
+ const handleCommandWrapper = useCallback(async (cmd) => {
221
+ // Import command context dynamically to avoid circular deps
222
+ const { setMessages: setExternalMessages, processedCountRef } = {
223
+ setMessages: () => { }, // MessageStore handles this now
224
+ processedCountRef: { current: apiMessages.length },
225
+ };
226
+ await handleCommand(cmd, {
227
+ sessionId,
228
+ setSessionId,
229
+ model,
230
+ setModel,
231
+ apiMessages,
232
+ setApiMessages: (msgs) => addApiMessages(msgs.slice(apiMessages.length)),
233
+ setMessages: setExternalMessages,
234
+ processedCountRef,
235
+ totalCost,
236
+ setTotalCost,
237
+ totalTokens: tokenCount,
238
+ setTotalTokens: setTokenCount,
239
+ permissionMode,
240
+ tools,
241
+ workingDirectory,
242
+ sessionStore,
243
+ addSystemMessage: (content, subType, toolName, isError) => {
244
+ addSystem(content, subType, toolName, isError);
245
+ },
246
+ messagesLength: messages.length,
247
+ onExit,
248
+ exit,
249
+ sessionSelectMode,
250
+ setSessionSelectMode,
251
+ setSelectableSessions,
252
+ helpMode,
253
+ setHelpMode,
254
+ helpSection,
255
+ setHelpSection,
256
+ });
257
+ }, [sessionId, setSessionId, model, apiMessages, addApiMessages, totalCost, tokenCount, setTokenCount, permissionMode, tools, workingDirectory, sessionStore, addSystem, messages.length, onExit, exit, sessionSelectMode, helpMode, helpSection]);
258
+ // Handle input with native terminal input
259
+ useNativeInput({
260
+ isActive: true,
261
+ onKey: (event) => {
262
+ // Scroll handling
263
+ if (KeyEvents.isPageUp(event)) {
264
+ setScrollOffset((prev) => prev + 5);
265
+ return;
266
+ }
267
+ if (KeyEvents.isPageDown(event)) {
268
+ setScrollOffset((prev) => Math.max(0, prev - 5));
269
+ return;
270
+ }
271
+ if (KeyEvents.isShiftUp(event)) {
272
+ setScrollOffset((prev) => prev + 1);
273
+ return;
274
+ }
275
+ if (KeyEvents.isShiftDown(event)) {
276
+ setScrollOffset((prev) => Math.max(0, prev - 1));
277
+ return;
278
+ }
279
+ // Ctrl+C to exit
280
+ if (KeyEvents.isCtrlC(event)) {
281
+ onExit();
282
+ exit();
283
+ return;
284
+ }
285
+ if (isLoading)
286
+ return;
287
+ // Help mode navigation
288
+ if (helpMode) {
289
+ const HELP_SECTIONS_COUNT = 5;
290
+ if (event.code === "escape" || event.code === "q") {
291
+ setHelpMode(false);
292
+ return;
293
+ }
294
+ if (event.code === "tab" || KeyEvents.isRight(event)) {
295
+ setHelpSection((prev) => (prev + 1) % HELP_SECTIONS_COUNT);
296
+ return;
297
+ }
298
+ if (KeyEvents.isLeft(event)) {
299
+ setHelpSection((prev) => (prev - 1 + HELP_SECTIONS_COUNT) % HELP_SECTIONS_COUNT);
300
+ return;
301
+ }
302
+ return;
303
+ }
304
+ // Session selection mode
305
+ if (sessionSelectMode) {
306
+ const num = parseInt(event.code, 10);
307
+ if (!isNaN(num) && num >= 1 && num <= selectableSessions.length) {
308
+ const selectedSession = selectableSessions[num - 1];
309
+ if (selectedSession) {
310
+ setSessionSelectMode(false);
311
+ setSelectableSessions([]);
312
+ handleCommandWrapper(`/resume ${selectedSession.id}`);
313
+ }
314
+ }
315
+ else if (KeyEvents.isEnter(event) || (event.code && isNaN(num))) {
316
+ setSessionSelectMode(false);
317
+ setSelectableSessions([]);
318
+ addSystem("Session selection cancelled.");
319
+ }
320
+ return;
321
+ }
322
+ // Submit on Enter
323
+ if (KeyEvents.isEnter(event)) {
324
+ // Prevent duplicate submissions while processing
325
+ if (isProcessingRef.current)
326
+ return;
327
+ const currentInput = inputRef.current;
328
+ if (currentInput.trim()) {
329
+ // Capture value BEFORE clearing
330
+ const valueToSubmit = currentInput;
331
+ // Clear input IMMEDIATELY to prevent duplicate submissions
332
+ // This must happen before any async operations
333
+ inputRef.current = "";
334
+ setGlobalInput("", 0);
335
+ // Add user message to UI
336
+ addMessage({ role: "user", content: valueToSubmit });
337
+ // Clear cursor and history state
338
+ setCursorPos(0);
339
+ setHistoryIndex(-1);
340
+ setSavedInput("");
341
+ // Update history
342
+ if (!valueToSubmit.startsWith("/") && valueToSubmit !== inputHistory[0]) {
343
+ setInputHistory((prev) => [valueToSubmit, ...prev].slice(0, 100));
344
+ }
345
+ // Process after UI updates
346
+ setTimeout(() => {
347
+ if (valueToSubmit.startsWith("/")) {
348
+ handleCommandWrapper(valueToSubmit);
349
+ }
350
+ else {
351
+ processMessage(valueToSubmit, true); // true = message already added
352
+ }
353
+ }, 50);
354
+ }
355
+ return;
356
+ }
357
+ // History navigation
358
+ if (KeyEvents.isUp(event)) {
359
+ if (inputHistory.length > 0) {
360
+ if (historyIndex === -1) {
361
+ setSavedInput(inputRef.current);
362
+ }
363
+ const newIndex = Math.min(historyIndex + 1, inputHistory.length - 1);
364
+ setHistoryIndex(newIndex);
365
+ setInputValue(inputHistory[newIndex] ?? "");
366
+ setCursorPos((inputHistory[newIndex] ?? "").length);
367
+ }
368
+ return;
369
+ }
370
+ if (KeyEvents.isDown(event)) {
371
+ if (historyIndex > 0) {
372
+ const newIndex = historyIndex - 1;
373
+ setHistoryIndex(newIndex);
374
+ setInputValue(inputHistory[newIndex] ?? "");
375
+ setCursorPos((inputHistory[newIndex] ?? "").length);
376
+ }
377
+ else if (historyIndex === 0) {
378
+ setHistoryIndex(-1);
379
+ setInputValue(savedInput);
380
+ setCursorPos(savedInput.length);
381
+ }
382
+ return;
383
+ }
384
+ // Text editing
385
+ if (KeyEvents.isBackspace(event)) {
386
+ const currentInput = inputRef.current;
387
+ const currentCursor = cursorRef.current;
388
+ if (currentCursor > 0) {
389
+ const newVal = currentInput.slice(0, currentCursor - 1) + currentInput.slice(currentCursor);
390
+ setInputValue(newVal);
391
+ setCursorPos((p) => p - 1);
392
+ }
393
+ return;
394
+ }
395
+ if (KeyEvents.isDelete(event)) {
396
+ const currentInput = inputRef.current;
397
+ const currentCursor = cursorRef.current;
398
+ if (currentCursor < currentInput.length) {
399
+ const newVal = currentInput.slice(0, currentCursor) + currentInput.slice(currentCursor + 1);
400
+ setInputValue(newVal);
401
+ }
402
+ return;
403
+ }
404
+ if (KeyEvents.isLeft(event)) {
405
+ setCursorPos((p) => Math.max(0, p - 1));
406
+ return;
407
+ }
408
+ if (KeyEvents.isRight(event)) {
409
+ setCursorPos((p) => Math.min(inputRef.current.length, p + 1));
410
+ return;
411
+ }
412
+ if (KeyEvents.isHome(event) || KeyEvents.isCtrlA(event)) {
413
+ setCursorPos(0);
414
+ return;
415
+ }
416
+ if (KeyEvents.isEnd(event) || KeyEvents.isCtrlE(event)) {
417
+ setCursorPos(inputRef.current.length);
418
+ return;
419
+ }
420
+ // Regular character
421
+ if (KeyEvents.isPrintable(event)) {
422
+ if (historyIndex !== -1) {
423
+ setHistoryIndex(-1);
424
+ setSavedInput("");
425
+ }
426
+ const currentInput = inputRef.current;
427
+ const currentCursor = cursorRef.current;
428
+ setInputValue(currentInput.slice(0, currentCursor) + event.code + currentInput.slice(currentCursor));
429
+ setCursorPos((p) => p + 1);
430
+ }
431
+ },
432
+ });
433
+ return (React.createElement(InputProvider, { initialBlocked: isLoading },
434
+ React.createElement(Box, { flexDirection: "column", width: "100%" },
435
+ React.createElement(MessageArea, { messages: messages, isLoading: isLoading, spinnerFrame: spinnerFrame, height: messageHeight, scrollOffset: scrollOffset, contextWarning: contextWarning, streamingText: streamingText }),
436
+ React.createElement(Text, { dimColor: true },
437
+ isLoading ? spinnerFrame : "",
438
+ " Context: ",
439
+ tokenCount,
440
+ " tokens | ",
441
+ permissionMode),
442
+ React.createElement(InputField, { placeholder: "Type your message... (/help for commands)", isActive: !isLoading }))));
443
+ }
444
+ /**
445
+ * Main Interactive TUI Component with providers
446
+ */
447
+ function InteractiveTUI(props) {
448
+ return (React.createElement(MessageStoreProvider, { initialMessages: props.initialMessages },
449
+ React.createElement(InteractiveTUIInner, { ...props })));
450
+ }
451
+ export default InteractiveTUI;
@@ -0,0 +1,10 @@
1
+ /** @jsx React.createElement */
2
+ /** @jsxFrag React.Fragment */
3
+ /**
4
+ * Message Area Component - Simple plain text display
5
+ */
6
+ import React from "react";
7
+ import type { MessageAreaProps } from "./types.js";
8
+ export declare function MessageArea({ messages, isLoading, spinnerFrame, height, scrollOffset, contextWarning, streamingText, }: MessageAreaProps): React.JSX.Element;
9
+ export default MessageArea;
10
+ //# sourceMappingURL=MessageArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageArea.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/MessageArea.tsx"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,8BAA8B;AAC9B;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,gBAAgB,EAA6B,MAAM,YAAY,CAAC;AA0C9E,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,EACN,YAAgB,EAChB,cAAc,EACd,aAAa,GACd,EAAE,gBAAgB,qBA8ClB;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,91 @@
1
+ /** @jsx React.createElement */
2
+ /** @jsxFrag React.Fragment */
3
+ /**
4
+ * Message Area Component - Simple plain text display
5
+ */
6
+ import React from "react";
7
+ import { Text } from "ink";
8
+ import { VERSION } from "../shared/status-line.js";
9
+ function getMessageColor(role, subType, isError) {
10
+ if (role === "system") {
11
+ if (isError || subType === "error")
12
+ return "red";
13
+ if (subType === "tool_call")
14
+ return "blue";
15
+ if (subType === "tool_result")
16
+ return "green";
17
+ if (subType === "hook")
18
+ return "yellow";
19
+ if (subType === "thinking")
20
+ return "gray";
21
+ if (subType === "info")
22
+ return "cyan";
23
+ return "yellow";
24
+ }
25
+ switch (role) {
26
+ case "user": return "cyan";
27
+ case "assistant": return "magenta";
28
+ default: return "white";
29
+ }
30
+ }
31
+ function getMessageLabel(message) {
32
+ const { role, subType, toolName, isError } = message;
33
+ if (role === "system" && subType) {
34
+ switch (subType) {
35
+ case "tool_call": return toolName ? `[${toolName}]` : "[Tool]";
36
+ case "tool_result": return isError ? "[Error]" : "[Result]";
37
+ case "hook": return "[Hook]";
38
+ case "error": return "[Error]";
39
+ case "thinking": return "[Thinking]";
40
+ case "info": return "[Info]";
41
+ }
42
+ }
43
+ switch (role) {
44
+ case "user": return "You:";
45
+ case "system": return "[System]";
46
+ case "assistant": return "Claude:";
47
+ default: return "";
48
+ }
49
+ }
50
+ export function MessageArea({ messages, isLoading, spinnerFrame, height, scrollOffset = 0, contextWarning, streamingText, }) {
51
+ const totalMessages = messages.length;
52
+ const maxVisibleMessages = 50;
53
+ const endIdx = totalMessages - scrollOffset;
54
+ const startIdx = Math.max(0, endIdx - maxVisibleMessages);
55
+ const visibleMessages = messages.slice(startIdx, endIdx);
56
+ const isEmpty = visibleMessages.length === 0 && !isLoading && !streamingText;
57
+ return (React.createElement(React.Fragment, null,
58
+ contextWarning && (React.createElement(Text, { color: "yellow", bold: true },
59
+ "Warning: ",
60
+ contextWarning,
61
+ "\n")),
62
+ isEmpty && (React.createElement(Text, { dimColor: true },
63
+ "Welcome to Coder v",
64
+ VERSION,
65
+ ". Type your message or /help for commands.",
66
+ "\n")),
67
+ visibleMessages.map((msg) => {
68
+ const displayContent = msg.content.length > 2000
69
+ ? msg.content.slice(0, 2000) + "..."
70
+ : msg.content;
71
+ const color = getMessageColor(msg.role, msg.subType, msg.isError);
72
+ const label = getMessageLabel(msg);
73
+ return (React.createElement(Text, { key: msg.id },
74
+ React.createElement(Text, { bold: true, color: color },
75
+ label,
76
+ " "),
77
+ React.createElement(Text, { dimColor: msg.role === "system" },
78
+ displayContent,
79
+ "\n")));
80
+ }),
81
+ streamingText && (React.createElement(Text, null,
82
+ React.createElement(Text, { bold: true, color: "magenta" }, "Claude: "),
83
+ React.createElement(Text, { dimColor: true },
84
+ streamingText.length > 500 ? "..." + streamingText.slice(-500) : streamingText,
85
+ "\n"))),
86
+ isLoading && !streamingText && (React.createElement(Text, { color: "cyan" },
87
+ spinnerFrame,
88
+ " Processing...",
89
+ "\n"))));
90
+ }
91
+ export default MessageArea;
@@ -0,0 +1,48 @@
1
+ /** @jsx React.createElement */
2
+ /**
3
+ * Message Store - Centralized message state management
4
+ *
5
+ * Single source of truth for all messages in the TUI.
6
+ * Replaces the fragmented message handling with a clean, * append-only store with efficient updates.
7
+ */
8
+ import React from "react";
9
+ import type { Message as ApiMessage } from "../../../../types/index.js";
10
+ export type MessageSubType = "tool_call" | "tool_result" | "hook" | "info" | "error" | "thinking";
11
+ export interface UIMessage {
12
+ id: string;
13
+ role: "user" | "assistant" | "system";
14
+ content: string;
15
+ timestamp: number;
16
+ subType?: MessageSubType;
17
+ toolName?: string;
18
+ isError?: boolean;
19
+ }
20
+ export interface MessageStoreValue {
21
+ /** UI messages for display */
22
+ messages: UIMessage[];
23
+ /** API messages for context */
24
+ apiMessages: ApiMessage[];
25
+ /** Add a UI message */
26
+ addMessage: (msg: Omit<UIMessage, "id" | "timestamp">) => string;
27
+ /** Add multiple messages from API response */
28
+ addApiMessages: (msgs: ApiMessage[]) => void;
29
+ /** Add system message (convenience) */
30
+ addSystem: (content: string, subType?: MessageSubType, toolName?: string, isError?: boolean) => string;
31
+ /** Clear all messages */
32
+ clear: () => void;
33
+ /** Replace messages (for undo/redo) */
34
+ replace: (ui: UIMessage[], api: ApiMessage[]) => void;
35
+ /** Total token count */
36
+ tokenCount: number;
37
+ /** Update token count */
38
+ setTokenCount: (count: number) => void;
39
+ }
40
+ declare const MessageStoreContext: React.Context<MessageStoreValue | null>;
41
+ export declare function useMessageStore(): MessageStoreValue;
42
+ export interface MessageStoreProviderProps {
43
+ children: React.ReactNode;
44
+ initialMessages?: ApiMessage[];
45
+ }
46
+ export declare function MessageStoreProvider({ children, initialMessages, }: MessageStoreProviderProps): React.JSX.Element;
47
+ export default MessageStoreContext;
48
+ //# sourceMappingURL=MessageStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageStore.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/MessageStore.tsx"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;;GAKG;AAEH,OAAO,KAAmE,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAMxE,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,aAAa,GACb,MAAM,GACN,MAAM,GACN,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,+BAA+B;IAC/B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,uBAAuB;IACvB,UAAU,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,CAAC,KAAK,MAAM,CAAC;IACjE,8CAA8C;IAC9C,cAAc,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC7C,uCAAuC;IACvC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACvG,yBAAyB;IACzB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACtD,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAMD,QAAA,MAAM,mBAAmB,yCAAgD,CAAC;AAE1E,wBAAgB,eAAe,IAAI,iBAAiB,CAMnD;AAMD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC;CAChC;AA4DD,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,eAAoB,GACrB,EAAE,yBAAyB,qBAmG3B;AAED,eAAe,mBAAmB,CAAC"}