@ebowwa/coder 0.7.63 → 0.7.65

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 (364) hide show
  1. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  2. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  3. package/dist/core/__tests__/permissions.test.js +851 -0
  4. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  7. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  10. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  12. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  13. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  16. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  19. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  22. package/dist/core/agent-loop/compaction.d.ts +39 -0
  23. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  24. package/dist/core/agent-loop/compaction.js +51 -0
  25. package/dist/core/agent-loop/formatters.d.ts +21 -0
  26. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  27. package/dist/core/agent-loop/formatters.js +42 -0
  28. package/dist/core/agent-loop/index.d.ts +25 -0
  29. package/dist/core/agent-loop/index.d.ts.map +1 -0
  30. package/dist/core/agent-loop/index.js +83 -0
  31. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  32. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  33. package/dist/core/agent-loop/loop-state.js +147 -0
  34. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  35. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  36. package/dist/core/agent-loop/message-builder.js +49 -0
  37. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  39. package/dist/core/agent-loop/tool-executor.js +152 -0
  40. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  42. package/dist/core/agent-loop/turn-executor.js +124 -0
  43. package/dist/core/agent-loop/types.d.ts +141 -0
  44. package/dist/core/agent-loop/types.d.ts.map +1 -0
  45. package/dist/core/agent-loop/types.js +4 -0
  46. package/dist/core/agent-loop.d.ts +17 -0
  47. package/dist/core/agent-loop.d.ts.map +1 -0
  48. package/dist/core/agent-loop.js +16 -0
  49. package/dist/core/api-client-impl.d.ts +62 -0
  50. package/dist/core/api-client-impl.d.ts.map +1 -0
  51. package/dist/core/api-client-impl.js +479 -0
  52. package/dist/core/api-client.d.ts +6 -0
  53. package/dist/core/api-client.d.ts.map +1 -0
  54. package/dist/core/api-client.js +5 -0
  55. package/dist/core/checkpoints.d.ts +128 -0
  56. package/dist/core/checkpoints.d.ts.map +1 -0
  57. package/dist/core/checkpoints.js +438 -0
  58. package/dist/core/claude-md.d.ts +71 -0
  59. package/dist/core/claude-md.d.ts.map +1 -0
  60. package/dist/core/claude-md.js +198 -0
  61. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  62. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  63. package/dist/core/cognitive-security/hooks.js +389 -0
  64. package/dist/core/cognitive-security/index.d.ts +751 -0
  65. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  66. package/dist/core/cognitive-security/index.js +1123 -0
  67. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  68. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  69. package/dist/core/cognitive-security/middleware.js +376 -0
  70. package/dist/core/config-loader.d.ts +127 -0
  71. package/dist/core/config-loader.d.ts.map +1 -0
  72. package/dist/core/config-loader.js +219 -0
  73. package/dist/core/context-compaction.d.ts +87 -0
  74. package/dist/core/context-compaction.d.ts.map +1 -0
  75. package/dist/core/context-compaction.js +428 -0
  76. package/dist/core/git-status.d.ts +25 -0
  77. package/dist/core/git-status.d.ts.map +1 -0
  78. package/dist/core/git-status.js +204 -0
  79. package/dist/core/image.d.ts +69 -0
  80. package/dist/core/image.d.ts.map +1 -0
  81. package/dist/core/image.js +290 -0
  82. package/dist/core/image.test.d.ts +2 -0
  83. package/dist/core/image.test.d.ts.map +1 -0
  84. package/dist/core/image.test.js +149 -0
  85. package/dist/core/models.d.ts +123 -0
  86. package/dist/core/models.d.ts.map +1 -0
  87. package/dist/core/models.js +325 -0
  88. package/dist/core/permissions.d.ts +81 -0
  89. package/dist/core/permissions.d.ts.map +1 -0
  90. package/dist/core/permissions.js +327 -0
  91. package/dist/core/retry.d.ts +25 -0
  92. package/dist/core/retry.d.ts.map +1 -0
  93. package/dist/core/retry.js +121 -0
  94. package/dist/core/session-store.d.ts +9 -0
  95. package/dist/core/session-store.d.ts.map +1 -0
  96. package/dist/core/session-store.js +10 -0
  97. package/dist/core/sessions/export.d.ts +47 -0
  98. package/dist/core/sessions/export.d.ts.map +1 -0
  99. package/dist/core/sessions/export.js +256 -0
  100. package/dist/core/sessions/index.d.ts +132 -0
  101. package/dist/core/sessions/index.d.ts.map +1 -0
  102. package/dist/core/sessions/index.js +442 -0
  103. package/dist/core/sessions/metadata.d.ts +77 -0
  104. package/dist/core/sessions/metadata.d.ts.map +1 -0
  105. package/dist/core/sessions/metadata.js +233 -0
  106. package/dist/core/sessions/persistence.d.ts +72 -0
  107. package/dist/core/sessions/persistence.d.ts.map +1 -0
  108. package/dist/core/sessions/persistence.js +201 -0
  109. package/dist/core/sessions/types.d.ts +110 -0
  110. package/dist/core/sessions/types.d.ts.map +1 -0
  111. package/dist/core/sessions/types.js +4 -0
  112. package/dist/core/stream-highlighter.d.ts +18 -0
  113. package/dist/core/stream-highlighter.d.ts.map +1 -0
  114. package/dist/core/stream-highlighter.js +916 -0
  115. package/dist/core/system-reminders.d.ts +89 -0
  116. package/dist/core/system-reminders.d.ts.map +1 -0
  117. package/dist/core/system-reminders.js +285 -0
  118. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  121. package/dist/ecosystem/hooks/index.d.ts +59 -0
  122. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  123. package/dist/ecosystem/hooks/index.js +294 -0
  124. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  127. package/dist/ecosystem/skills/index.d.ts +55 -0
  128. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  129. package/dist/ecosystem/skills/index.js +258 -0
  130. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  133. package/dist/ecosystem/tools/index.d.ts +24 -0
  134. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  135. package/dist/ecosystem/tools/index.js +1709 -0
  136. package/dist/index.d.ts +24 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +33688 -49712
  139. package/dist/interfaces/mcp/client.d.ts +40 -0
  140. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  141. package/dist/interfaces/mcp/client.js +309 -0
  142. package/dist/interfaces/ui/index.d.ts +36 -0
  143. package/dist/interfaces/ui/index.d.ts.map +1 -0
  144. package/dist/interfaces/ui/index.js +61 -0
  145. package/dist/interfaces/ui/spinner.d.ts +140 -0
  146. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  147. package/dist/interfaces/ui/spinner.js +342 -0
  148. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  150. package/dist/interfaces/ui/terminal/cli/index.js +32012 -50526
  151. package/dist/interfaces/ui/terminal/native/README.md +53 -0
  152. package/dist/interfaces/ui/terminal/native/claude_code_native.darwin-x64.node +0 -0
  153. package/dist/interfaces/ui/terminal/native/claude_code_native.dylib +0 -0
  154. package/dist/interfaces/ui/terminal/native/index.d.ts +0 -0
  155. package/dist/interfaces/ui/terminal/native/index.darwin-arm64.node +0 -0
  156. package/dist/interfaces/ui/terminal/native/index.js +43 -0
  157. package/dist/interfaces/ui/terminal/native/index.node +0 -0
  158. package/dist/interfaces/ui/terminal/native/package.json +34 -0
  159. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  160. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  161. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  162. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  163. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  164. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  165. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  166. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  167. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  168. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  169. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  170. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  171. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  172. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  173. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  174. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  175. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  176. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  177. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  178. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  179. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  180. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  181. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  182. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  183. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  184. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  185. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  186. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  187. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  188. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  189. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  190. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  191. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  192. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  193. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  194. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  195. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  196. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  197. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  198. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  199. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  200. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  201. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  202. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  203. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  204. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  205. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  206. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  207. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  208. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  209. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  210. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  211. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  212. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  213. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  214. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  215. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  216. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  217. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  218. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  219. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  220. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  221. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  222. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  223. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  224. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  225. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  226. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  227. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  228. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  229. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  230. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  231. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  232. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  233. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  234. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  235. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  236. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  237. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  238. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  239. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  240. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  241. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  242. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  243. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  244. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  245. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  246. package/dist/native/README.md +53 -0
  247. package/dist/native/claude_code_native.darwin-x64.node +0 -0
  248. package/dist/native/claude_code_native.dylib +0 -0
  249. package/dist/native/index.d.ts +0 -0
  250. package/dist/native/index.d.ts.map +1 -0
  251. package/dist/native/index.darwin-arm64.node +0 -0
  252. package/dist/native/index.js +43 -0
  253. package/dist/native/index.node +0 -0
  254. package/dist/native/package.json +34 -0
  255. package/dist/teammates/index.d.ts +161 -0
  256. package/dist/teammates/index.d.ts.map +1 -0
  257. package/dist/teammates/index.js +827 -0
  258. package/dist/types/index.d.ts +482 -0
  259. package/dist/types/index.d.ts.map +1 -0
  260. package/dist/types/index.js +52 -0
  261. package/native/index.darwin-arm64.node +0 -0
  262. package/native/index.js +33 -19
  263. package/package.json +6 -3
  264. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  265. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +283 -0
  266. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  267. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  268. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  269. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  270. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  271. package/packages/src/core/agent-loop/compaction.ts +92 -0
  272. package/packages/src/core/agent-loop/formatters.ts +50 -0
  273. package/packages/src/core/agent-loop/index.ts +137 -0
  274. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  275. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  276. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  277. package/packages/src/core/agent-loop/turn-executor.ts +226 -0
  278. package/packages/src/core/agent-loop/types.ts +152 -0
  279. package/packages/src/core/agent-loop.ts +18 -0
  280. package/packages/src/core/api-client-impl.ts +729 -0
  281. package/packages/src/core/api-client.ts +6 -0
  282. package/packages/src/core/checkpoints.ts +606 -0
  283. package/packages/src/core/claude-md.ts +272 -0
  284. package/packages/src/core/cognitive-security/hooks.ts +591 -0
  285. package/packages/src/core/cognitive-security/index.ts +2041 -0
  286. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  287. package/packages/src/core/config/todo +7 -0
  288. package/packages/src/core/config-loader.ts +324 -0
  289. package/packages/src/core/context/__tests__/integration.test.ts +334 -0
  290. package/packages/src/core/context/compaction.ts +170 -0
  291. package/packages/src/core/context/constants.ts +58 -0
  292. package/packages/src/core/context/extraction.ts +85 -0
  293. package/packages/src/core/context/index.ts +66 -0
  294. package/packages/src/core/context/summarization.ts +251 -0
  295. package/packages/src/core/context/token-estimation.ts +98 -0
  296. package/packages/src/core/context/types.ts +59 -0
  297. package/packages/src/core/git-status.ts +262 -0
  298. package/packages/src/core/image.test.ts +180 -0
  299. package/packages/src/core/image.ts +350 -0
  300. package/packages/src/core/lmdb.db +0 -0
  301. package/packages/src/core/lmdb.db-lock +0 -0
  302. package/packages/src/core/models.ts +507 -0
  303. package/packages/src/core/normalizers/todo +8 -0
  304. package/packages/src/core/permissions.ts +431 -0
  305. package/packages/src/core/providers/README.md +230 -0
  306. package/packages/src/core/providers/__tests__/providers.test.ts +135 -0
  307. package/packages/src/core/providers/index.ts +419 -0
  308. package/packages/src/core/providers/types.ts +132 -0
  309. package/packages/src/core/retry.ts +180 -0
  310. package/packages/src/core/session-store.ts +36 -0
  311. package/packages/src/core/sessions/export.ts +329 -0
  312. package/packages/src/core/sessions/index.ts +587 -0
  313. package/packages/src/core/sessions/metadata.ts +309 -0
  314. package/packages/src/core/sessions/persistence.ts +244 -0
  315. package/packages/src/core/sessions/types.ts +169 -0
  316. package/packages/src/core/stream-highlighter.ts +1123 -0
  317. package/packages/src/core/system-reminders.ts +402 -0
  318. package/packages/src/core/todo +8 -0
  319. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  320. package/packages/src/ecosystem/hooks/index.ts +341 -0
  321. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  322. package/packages/src/ecosystem/skills/index.ts +295 -0
  323. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  324. package/packages/src/ecosystem/tools/index.ts +2051 -0
  325. package/packages/src/index.ts +141 -0
  326. package/packages/src/interfaces/mcp/client.ts +389 -0
  327. package/packages/src/interfaces/ui/index.ts +158 -0
  328. package/packages/src/interfaces/ui/lmdb.db +0 -0
  329. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  330. package/packages/src/interfaces/ui/spinner.ts +451 -0
  331. package/packages/src/interfaces/ui/terminal/bridge/index.ts +370 -0
  332. package/packages/src/interfaces/ui/terminal/bridge/ipc.ts +829 -0
  333. package/packages/src/interfaces/ui/terminal/bridge/screen-export.ts +968 -0
  334. package/packages/src/interfaces/ui/terminal/bridge/types.ts +226 -0
  335. package/packages/src/interfaces/ui/terminal/bridge/useBridge.ts +210 -0
  336. package/packages/src/interfaces/ui/terminal/cli/bootstrap.ts +132 -0
  337. package/packages/src/interfaces/ui/terminal/cli/index.ts +415 -0
  338. package/packages/src/interfaces/ui/terminal/cli/interactive/index.ts +110 -0
  339. package/packages/src/interfaces/ui/terminal/cli/interactive/input-handler.ts +393 -0
  340. package/packages/src/interfaces/ui/terminal/cli/interactive/interactive-runner.ts +820 -0
  341. package/packages/src/interfaces/ui/terminal/cli/interactive/message-store.ts +299 -0
  342. package/packages/src/interfaces/ui/terminal/cli/interactive/types.ts +274 -0
  343. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  344. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  345. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  346. package/packages/src/interfaces/ui/terminal/shared/index.ts +84 -0
  347. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  348. package/packages/src/interfaces/ui/terminal/shared/query.ts +152 -0
  349. package/packages/src/interfaces/ui/terminal/shared/setup.ts +299 -0
  350. package/packages/src/interfaces/ui/terminal/shared/spinner-frames.ts +73 -0
  351. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +366 -0
  352. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  353. package/packages/src/lmdb.db +0 -0
  354. package/packages/src/lmdb.db-lock +0 -0
  355. package/packages/src/native/index.ts +2722 -0
  356. package/packages/src/native/tui_v2_types.ts +39 -0
  357. package/packages/src/teammates/coordination.test.ts +279 -0
  358. package/packages/src/teammates/coordination.ts +646 -0
  359. package/packages/src/teammates/index.ts +1052 -0
  360. package/packages/src/teammates/integration.test.ts +272 -0
  361. package/packages/src/teammates/runner.test.ts +235 -0
  362. package/packages/src/teammates/runner.ts +750 -0
  363. package/packages/src/teammates/schemas.ts +673 -0
  364. package/packages/src/types/index.ts +723 -0
@@ -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"}