@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,330 @@
1
+ /**
2
+ * TUI Footer Component for Coder CLI
3
+ * Provides a persistent status bar at the bottom of the terminal
4
+ *
5
+ * Uses ANSI escape codes for cursor positioning:
6
+ * - ESC[s Save cursor position
7
+ * - ESC[u Restore cursor position
8
+ * - ESC[#;#H Move cursor to row, col
9
+ * - ESC[2K Clear entire line
10
+ * - ESC[J Clear from cursor to end of screen
11
+ */
12
+ import chalk from "chalk";
13
+ import { calculateContextInfo, formatPermissionMode, } from "../shared/status-line.js";
14
+ import { spinnerFrames } from "./spinner.js";
15
+ // ============================================
16
+ // ANSI ESCAPE CODES
17
+ // ============================================
18
+ const ANSI = {
19
+ // Cursor
20
+ SAVE_CURSOR: "\x1b[s",
21
+ RESTORE_CURSOR: "\x1b[u",
22
+ MOVE_TO: (row, col) => `\x1b[${row};${col}H`,
23
+ MOVE_TO_BOTTOM: (offset = 0) => `\x1b[999;1H\x1b[${offset + 1}A`,
24
+ // Clear
25
+ CLEAR_LINE: "\x1b[2K",
26
+ CLEAR_TO_END: "\x1b[J",
27
+ CLEAR_SCREEN: "\x1b[2J",
28
+ // Scrolling
29
+ SCROLL_UP: (lines) => `\x1b[${lines}S`,
30
+ SCROLL_DOWN: (lines) => `\x1b[${lines}T`,
31
+ // Colors reset
32
+ RESET: "\x1b[0m",
33
+ // Alternate screen buffer
34
+ ENTER_ALT_SCREEN: "\x1b[?1049h",
35
+ EXIT_ALT_SCREEN: "\x1b[?1049l",
36
+ // Cursor visibility
37
+ HIDE_CURSOR: "\x1b[?25l",
38
+ SHOW_CURSOR: "\x1b[?25h",
39
+ };
40
+ // Export ANSI for external use
41
+ export { ANSI };
42
+ // ============================================
43
+ // FOOTER RENDERER
44
+ // ============================================
45
+ /**
46
+ * Render footer content (without positioning)
47
+ */
48
+ function renderFooterContent(options, spinnerFrame) {
49
+ const { permissionMode, tokensUsed, model, isLoading, verbose, showVersion } = options;
50
+ const contextInfo = calculateContextInfo(tokensUsed, model);
51
+ // Build status parts
52
+ const parts = [];
53
+ // 1. Loading spinner if active
54
+ if (isLoading && spinnerFrame) {
55
+ parts.push(chalk.cyan(spinnerFrame));
56
+ }
57
+ // 2. Context percentage with color
58
+ const contextValue = contextInfo.isCritical
59
+ ? chalk.red(`${contextInfo.percentRemaining.toFixed(0)}%`)
60
+ : contextInfo.isLow
61
+ ? chalk.yellow(`${contextInfo.percentRemaining.toFixed(0)}%`)
62
+ : chalk.dim(`${contextInfo.percentRemaining.toFixed(0)}%`);
63
+ parts.push(`Context: ${contextValue}`);
64
+ // 3. Permission mode
65
+ const permDisplay = formatPermissionMode(permissionMode);
66
+ parts.push(permDisplay);
67
+ // 4. Version (if verbose or showVersion)
68
+ if (verbose || showVersion) {
69
+ parts.push(chalk.dim(`v${getVersion()}`));
70
+ }
71
+ return parts.join(chalk.dim(" | "));
72
+ }
73
+ /**
74
+ * Get VERSION dynamically to avoid circular imports
75
+ */
76
+ function getVersion() {
77
+ try {
78
+ // Dynamic import to avoid circular dependency
79
+ const statusLine = require("../shared/status-line.js");
80
+ return statusLine.VERSION || "0.0.0";
81
+ }
82
+ catch {
83
+ return "0.0.0";
84
+ }
85
+ }
86
+ // ============================================
87
+ // TUI FOOTER CLASS
88
+ // ============================================
89
+ export class TUIFooter {
90
+ state;
91
+ static instance = null;
92
+ constructor() {
93
+ this.state = {
94
+ isEnabled: false,
95
+ lastRender: "",
96
+ lastOptions: null,
97
+ renderInterval: null,
98
+ spinnerFrame: 0,
99
+ terminalHeight: process.stdout.rows || 24,
100
+ terminalWidth: process.stdout.columns || 80,
101
+ };
102
+ }
103
+ /**
104
+ * Get singleton instance
105
+ */
106
+ static getInstance() {
107
+ if (!TUIFooter.instance) {
108
+ TUIFooter.instance = new TUIFooter();
109
+ }
110
+ return TUIFooter.instance;
111
+ }
112
+ /**
113
+ * Reset singleton (for testing)
114
+ */
115
+ static reset() {
116
+ if (TUIFooter.instance) {
117
+ TUIFooter.instance.disable();
118
+ TUIFooter.instance = null;
119
+ }
120
+ }
121
+ /**
122
+ * Enable the footer (start tracking terminal size)
123
+ */
124
+ enable() {
125
+ if (this.state.isEnabled)
126
+ return;
127
+ this.state.isEnabled = true;
128
+ this.updateTerminalSize();
129
+ // Listen for terminal resize
130
+ process.stdout.on("resize", this.handleResize);
131
+ }
132
+ /**
133
+ * Disable the footer and clear it
134
+ */
135
+ disable() {
136
+ if (!this.state.isEnabled)
137
+ return;
138
+ this.stopSpinner();
139
+ this.clear();
140
+ process.stdout.off("resize", this.handleResize);
141
+ this.state.isEnabled = false;
142
+ }
143
+ /**
144
+ * Check if footer is enabled
145
+ */
146
+ isEnabled() {
147
+ return this.state.isEnabled;
148
+ }
149
+ /**
150
+ * Update terminal dimensions
151
+ */
152
+ updateTerminalSize() {
153
+ this.state.terminalHeight = process.stdout.rows || 24;
154
+ this.state.terminalWidth = process.stdout.columns || 80;
155
+ }
156
+ /**
157
+ * Handle terminal resize
158
+ */
159
+ handleResize = () => {
160
+ this.updateTerminalSize();
161
+ if (this.state.lastOptions) {
162
+ this.render(this.state.lastOptions);
163
+ }
164
+ };
165
+ /**
166
+ * Render the footer at the bottom of the screen
167
+ * Saves cursor position, moves to bottom, renders, restores cursor
168
+ */
169
+ render(options) {
170
+ if (!this.state.isEnabled)
171
+ return;
172
+ this.state.lastOptions = options;
173
+ // Build footer content
174
+ const content = renderFooterContent(options);
175
+ // Skip if content unchanged (optimization)
176
+ if (content === this.state.lastRender && !options.isLoading) {
177
+ return;
178
+ }
179
+ this.state.lastRender = content;
180
+ // Build ANSI sequence:
181
+ // 1. Save cursor position
182
+ // 2. Move to bottom of screen
183
+ // 3. Clear the line
184
+ // 4. Render footer content
185
+ // 5. Restore cursor position
186
+ const output = ANSI.SAVE_CURSOR +
187
+ ANSI.MOVE_TO_BOTTOM() +
188
+ ANSI.CLEAR_LINE +
189
+ "\r" + // Go to start of line
190
+ chalk.dim("┌") +
191
+ content +
192
+ ANSI.RESTORE_CURSOR;
193
+ process.stdout.write(output);
194
+ }
195
+ /**
196
+ * Render with loading spinner animation
197
+ */
198
+ renderLoading(options) {
199
+ const frame = spinnerFrames[this.state.spinnerFrame];
200
+ this.state.spinnerFrame = (this.state.spinnerFrame + 1) % spinnerFrames.length;
201
+ const content = renderFooterContent(options, frame);
202
+ this.state.lastRender = content;
203
+ if (!this.state.isEnabled)
204
+ return;
205
+ const output = ANSI.SAVE_CURSOR +
206
+ ANSI.MOVE_TO_BOTTOM() +
207
+ ANSI.CLEAR_LINE +
208
+ "\r" +
209
+ chalk.dim("┌") +
210
+ content +
211
+ ANSI.RESTORE_CURSOR;
212
+ process.stdout.write(output);
213
+ }
214
+ /**
215
+ * Start spinner animation for loading state
216
+ */
217
+ startSpinner(options, interval = 80) {
218
+ this.stopSpinner();
219
+ this.state.renderInterval = setInterval(() => {
220
+ this.renderLoading(options);
221
+ }, interval);
222
+ }
223
+ /**
224
+ * Stop spinner animation
225
+ */
226
+ stopSpinner() {
227
+ if (this.state.renderInterval) {
228
+ clearInterval(this.state.renderInterval);
229
+ this.state.renderInterval = null;
230
+ }
231
+ }
232
+ /**
233
+ * Clear the footer line
234
+ */
235
+ clear() {
236
+ if (!this.state.isEnabled)
237
+ return;
238
+ const output = ANSI.SAVE_CURSOR +
239
+ ANSI.MOVE_TO_BOTTOM() +
240
+ ANSI.CLEAR_LINE +
241
+ ANSI.RESTORE_CURSOR;
242
+ process.stdout.write(output);
243
+ this.state.lastRender = "";
244
+ }
245
+ /**
246
+ * Update just the token count (for incremental updates)
247
+ */
248
+ updateTokens(tokensUsed) {
249
+ if (this.state.lastOptions) {
250
+ this.render({
251
+ ...this.state.lastOptions,
252
+ tokensUsed,
253
+ });
254
+ }
255
+ }
256
+ /**
257
+ * Update loading state
258
+ */
259
+ setLoading(isLoading) {
260
+ if (this.state.lastOptions) {
261
+ const options = {
262
+ ...this.state.lastOptions,
263
+ isLoading,
264
+ };
265
+ if (isLoading) {
266
+ this.startSpinner(options);
267
+ }
268
+ else {
269
+ this.stopSpinner();
270
+ this.render(options);
271
+ }
272
+ }
273
+ }
274
+ /**
275
+ * Get terminal dimensions
276
+ */
277
+ getTerminalSize() {
278
+ return {
279
+ width: this.state.terminalWidth,
280
+ height: this.state.terminalHeight,
281
+ };
282
+ }
283
+ }
284
+ // ============================================
285
+ // CONVENIENCE EXPORTS
286
+ // ============================================
287
+ /**
288
+ * Get the global TUI footer instance
289
+ */
290
+ export function getTUIFooter() {
291
+ return TUIFooter.getInstance();
292
+ }
293
+ /**
294
+ * Enable TUI footer
295
+ */
296
+ export function enableTUIFooter() {
297
+ const footer = TUIFooter.getInstance();
298
+ footer.enable();
299
+ return footer;
300
+ }
301
+ /**
302
+ * Disable TUI footer
303
+ */
304
+ export function disableTUIFooter() {
305
+ TUIFooter.getInstance().disable();
306
+ }
307
+ /**
308
+ * Render footer status (convenience function)
309
+ */
310
+ export function renderTUIFooter(options) {
311
+ TUIFooter.getInstance().render(options);
312
+ }
313
+ /**
314
+ * Clear the footer line
315
+ */
316
+ export function clearTUIFooter() {
317
+ TUIFooter.getInstance().clear();
318
+ }
319
+ // ============================================
320
+ // EXPORTS
321
+ // ============================================
322
+ export default {
323
+ TUIFooter,
324
+ getTUIFooter,
325
+ enableTUIFooter,
326
+ disableTUIFooter,
327
+ renderTUIFooter,
328
+ clearTUIFooter,
329
+ ANSI,
330
+ };
@@ -0,0 +1,165 @@
1
+ /**
2
+ * TUI Types
3
+ * Type definitions for the interactive TUI components
4
+ */
5
+ import type { PermissionMode, ClaudeModel, Message as ApiMessage, ToolDefinition } from "../../../../types/index.js";
6
+ import type { HookManager } from "../../../../ecosystem/hooks/index.js";
7
+ import type { LoadedSession, SessionSummary } from "../../../../core/sessions/types.js";
8
+ /**
9
+ * Message sub-type for granular categorization
10
+ * - tool_call: Assistant is invoking a tool
11
+ * - tool_result: Tool execution result (success or error)
12
+ * - hook: Hook intercept/decision message
13
+ * - info: General system info (session start, commands, etc.)
14
+ * - error: Error messages
15
+ * - thinking: Extended thinking output
16
+ */
17
+ export type MessageSubType = "tool_call" | "tool_result" | "hook" | "info" | "error" | "thinking";
18
+ /**
19
+ * UI-specific message representation
20
+ */
21
+ export interface UIMessage {
22
+ id: string;
23
+ /** Base role: user, assistant, or system */
24
+ role: "user" | "assistant" | "system";
25
+ /** Message content for display */
26
+ content: string;
27
+ /** Timestamp in milliseconds */
28
+ timestamp: number;
29
+ /** Optional sub-type for granular display labels */
30
+ subType?: MessageSubType;
31
+ /** For tool messages: the tool name */
32
+ toolName?: string;
33
+ /** For tool_result: whether it was an error */
34
+ isError?: boolean;
35
+ }
36
+ /**
37
+ * Props for the main InteractiveTUI component
38
+ */
39
+ export interface InteractiveTUIProps {
40
+ apiKey: string;
41
+ model: ClaudeModel;
42
+ permissionMode: PermissionMode;
43
+ maxTokens: number;
44
+ systemPrompt: string;
45
+ tools: ToolDefinition[];
46
+ hookManager: HookManager;
47
+ sessionStore: SessionStore;
48
+ sessionId: string;
49
+ setSessionId: (id: string) => void;
50
+ initialMessages: ApiMessage[];
51
+ workingDirectory: string;
52
+ onExit: () => void;
53
+ }
54
+ /**
55
+ * Session store interface (subset used by TUI)
56
+ */
57
+ export interface SessionStore {
58
+ saveMessage(message: ApiMessage): Promise<void>;
59
+ saveMetrics(metrics: unknown): Promise<void>;
60
+ exportSession(sessionId: string, format: "jsonl" | "json" | "markdown"): Promise<string>;
61
+ listSessions(limit?: number): Promise<SessionSummary[]>;
62
+ resumeSession(sessionId: string): Promise<LoadedSession | null>;
63
+ createSession(options: {
64
+ model: string;
65
+ workingDirectory: string;
66
+ agentName?: string;
67
+ agentColor?: string;
68
+ teamName?: string;
69
+ }): Promise<string>;
70
+ }
71
+ /**
72
+ * Session info for listing
73
+ */
74
+ export interface SessionInfo {
75
+ id: string;
76
+ messageCount: number;
77
+ lastActivity?: number;
78
+ metadata?: Record<string, unknown>;
79
+ }
80
+ /**
81
+ * Message area component props
82
+ */
83
+ export interface MessageAreaProps {
84
+ messages: UIMessage[];
85
+ isLoading: boolean;
86
+ spinnerFrame: string;
87
+ height: number;
88
+ scrollOffset: number;
89
+ contextWarning: string | null;
90
+ streamingText?: string;
91
+ }
92
+ /**
93
+ * Status bar component props
94
+ */
95
+ export interface StatusBarProps {
96
+ permissionMode: PermissionMode;
97
+ tokensUsed: number;
98
+ model: string;
99
+ isLoading: boolean;
100
+ spinnerFrame: string;
101
+ }
102
+ /**
103
+ * Input field component props
104
+ */
105
+ export interface InputFieldProps {
106
+ value: string;
107
+ cursorPos: number;
108
+ placeholder: string;
109
+ isActive: boolean;
110
+ }
111
+ /**
112
+ * Terminal layout configuration
113
+ */
114
+ export interface TerminalLayout {
115
+ terminalHeight: number;
116
+ inputHeight: number;
117
+ statusHeight: number;
118
+ messageHeight: number;
119
+ }
120
+ /**
121
+ * Command handler context
122
+ */
123
+ export interface CommandContext {
124
+ sessionId: string;
125
+ setSessionId: (id: string) => void;
126
+ model: ClaudeModel;
127
+ setModel: (model: ClaudeModel) => void;
128
+ apiMessages: ApiMessage[];
129
+ setApiMessages: (messages: ApiMessage[]) => void;
130
+ setMessages: (messages: UIMessage[]) => void;
131
+ processedCountRef: React.MutableRefObject<number>;
132
+ totalCost: number;
133
+ setTotalCost: (cost: number) => void;
134
+ totalTokens: number;
135
+ setTotalTokens: (tokens: number) => void;
136
+ permissionMode: PermissionMode;
137
+ tools: ToolDefinition[];
138
+ workingDirectory: string;
139
+ sessionStore: SessionStore;
140
+ addSystemMessage: (content: string) => void;
141
+ messagesLength: number;
142
+ onExit: () => void;
143
+ exit: () => void;
144
+ sessionSelectMode: boolean;
145
+ setSessionSelectMode: (mode: boolean) => void;
146
+ setSelectableSessions: (sessions: SessionInfo[]) => void;
147
+ helpMode: boolean;
148
+ setHelpMode: (mode: boolean) => void;
149
+ helpSection: number;
150
+ setHelpSection: (section: number) => void;
151
+ }
152
+ /**
153
+ * Context info from status-line
154
+ */
155
+ export interface ContextInfo {
156
+ percentRemaining: number;
157
+ isLow: boolean;
158
+ isCritical: boolean;
159
+ }
160
+ /**
161
+ * Re-export types from parent for convenience
162
+ */
163
+ export type { PermissionMode, ClaudeModel, Message as ApiMessage, ToolDefinition } from "../../../../types/index.js";
164
+ export type { HookManager } from "../../../../ecosystem/hooks/index.js";
165
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,IAAI,UAAU,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAExF;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,aAAa,GACb,MAAM,GACN,MAAM,GACN,OAAO,GACP,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzF,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAChE,aAAa,CAAC,OAAO,EAAE;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,cAAc,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,qBAAqB,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAEzD,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,IAAI,UAAU,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrH,YAAY,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * TUI Types
3
+ * Type definitions for the interactive TUI components
4
+ */
5
+ export {};
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TUI Input Handler Hook
3
+ * Custom hook for handling keyboard input in TUI
4
+ */
5
+ interface UseInputHandlerOptions {
6
+ isLoading: boolean;
7
+ inputValue: string;
8
+ cursorPos: number;
9
+ setInputValue: (value: string | ((prev: string) => string)) => void;
10
+ setCursorPos: (value: number | ((prev: number) => number)) => void;
11
+ onSubmit: (value: string) => void;
12
+ onCommand: (cmd: string) => void;
13
+ }
14
+ /**
15
+ * Hook for handling keyboard input in the TUI
16
+ */
17
+ export declare function useInputHandler({ isLoading, inputValue, cursorPos, setInputValue, setCursorPos, onSubmit, onCommand, }: UseInputHandlerOptions): void;
18
+ /**
19
+ * Hook for handling exit shortcuts (Ctrl+C)
20
+ */
21
+ export declare function useExitHandler(onExit: () => void, exit: () => void): void;
22
+ export {};
23
+ //# sourceMappingURL=useInputHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputHandler.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/useInputHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,sBAAsB;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IACpE,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,SAAS,GACV,EAAE,sBAAsB,QA2DxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,QAUlE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * TUI Input Handler Hook
3
+ * Custom hook for handling keyboard input in TUI
4
+ */
5
+ import { useCallback } from "react";
6
+ import { useInput } from "ink";
7
+ /**
8
+ * Hook for handling keyboard input in the TUI
9
+ */
10
+ export function useInputHandler({ isLoading, inputValue, cursorPos, setInputValue, setCursorPos, onSubmit, onCommand, }) {
11
+ // Main input handler
12
+ useInput((input, key) => {
13
+ if (isLoading)
14
+ return;
15
+ // Submit on Enter
16
+ if (key.return) {
17
+ if (inputValue.trim()) {
18
+ if (inputValue.startsWith("/")) {
19
+ onCommand(inputValue);
20
+ }
21
+ else {
22
+ onSubmit(inputValue);
23
+ }
24
+ setInputValue("");
25
+ setCursorPos(0);
26
+ }
27
+ return;
28
+ }
29
+ // Backspace
30
+ if (key.backspace || key.delete) {
31
+ if (cursorPos > 0) {
32
+ setInputValue((v) => v.slice(0, cursorPos - 1) + v.slice(cursorPos));
33
+ setCursorPos((p) => p - 1);
34
+ }
35
+ return;
36
+ }
37
+ // Arrow keys
38
+ if (key.leftArrow) {
39
+ setCursorPos((p) => Math.max(0, p - 1));
40
+ return;
41
+ }
42
+ if (key.rightArrow) {
43
+ setCursorPos((p) => Math.min(inputValue.length, p + 1));
44
+ return;
45
+ }
46
+ // Home/End keys (Ctrl+A / Ctrl+E)
47
+ if (key.ctrl && input === "a") {
48
+ setCursorPos(0);
49
+ return;
50
+ }
51
+ if (key.ctrl && input === "e") {
52
+ setCursorPos(inputValue.length);
53
+ return;
54
+ }
55
+ // Regular character
56
+ if (input && !key.ctrl && !key.meta) {
57
+ setInputValue((v) => v.slice(0, cursorPos) + input + v.slice(cursorPos));
58
+ setCursorPos((p) => p + input.length);
59
+ }
60
+ }, { isActive: !isLoading });
61
+ }
62
+ /**
63
+ * Hook for handling exit shortcuts (Ctrl+C)
64
+ */
65
+ export function useExitHandler(onExit, exit) {
66
+ useInput((input, key) => {
67
+ if (key.ctrl && input === "c") {
68
+ onExit();
69
+ exit();
70
+ }
71
+ }, { isActive: true });
72
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Native terminal input hook
3
+ *
4
+ * Reads key events from stdin without managing raw mode.
5
+ * Ink handles raw mode - we just read the key events.
6
+ *
7
+ * IMPORTANT: This hook does NOT manage raw mode. Ink does that.
8
+ * We only read events from stdin via the native module.
9
+ */
10
+ import { type NativeKeyEvent, type TerminalHandle } from "../../../../native/index.js";
11
+ interface UseNativeInputOptions {
12
+ /** Whether the hook is active (default: true) */
13
+ isActive?: boolean;
14
+ /** Callback for key events */
15
+ onKey: (event: NativeKeyEvent) => void;
16
+ }
17
+ interface UseNativeInputResult {
18
+ /** Whether the terminal is ready for input */
19
+ isReady: boolean;
20
+ /** Whether there was an error initializing */
21
+ error: Error | null;
22
+ }
23
+ /**
24
+ * React hook for terminal keyboard input
25
+ *
26
+ * Uses native Rust TerminalHandle to read key events from stdin.
27
+ * Does NOT manage raw mode - let Ink handle that.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * useNativeInput({
32
+ * isActive: !isLoading,
33
+ * onKey: (event) => {
34
+ * if (KeyEvents.isEnter(event)) {
35
+ * handleSubmit();
36
+ * } else if (KeyEvents.isPrintable(event)) {
37
+ * handleChar(event.code);
38
+ * }
39
+ * },
40
+ * });
41
+ * ```
42
+ */
43
+ export declare function useNativeInput({ isActive, onKey, }: UseNativeInputOptions): UseNativeInputResult;
44
+ /**
45
+ * Key event helper functions
46
+ */
47
+ export declare const KeyEvents: {
48
+ /** Check if event is Enter key */
49
+ isEnter(event: NativeKeyEvent): boolean;
50
+ /** Check if event is Backspace key */
51
+ isBackspace(event: NativeKeyEvent): boolean;
52
+ /** Check if event is Delete key */
53
+ isDelete(event: NativeKeyEvent): boolean;
54
+ /** Check if event is Escape key */
55
+ isEscape(event: NativeKeyEvent): boolean;
56
+ /** Check if event is Tab key */
57
+ isTab(event: NativeKeyEvent): boolean;
58
+ /** Check if event is BackTab (Shift+Tab) key */
59
+ isBackTab(event: NativeKeyEvent): boolean;
60
+ /** Check if event is Arrow Up key */
61
+ isUp(event: NativeKeyEvent): boolean;
62
+ /** Check if event is Arrow Down key */
63
+ isDown(event: NativeKeyEvent): boolean;
64
+ /** Check if event is Arrow Left key */
65
+ isLeft(event: NativeKeyEvent): boolean;
66
+ /** Check if event is Arrow Right key */
67
+ isRight(event: NativeKeyEvent): boolean;
68
+ /** Check if event is Page Up key */
69
+ isPageUp(event: NativeKeyEvent): boolean;
70
+ /** Check if event is Page Down key */
71
+ isPageDown(event: NativeKeyEvent): boolean;
72
+ /** Check if event is Home key */
73
+ isHome(event: NativeKeyEvent): boolean;
74
+ /** Check if event is End key */
75
+ isEnd(event: NativeKeyEvent): boolean;
76
+ /** Check if event is Ctrl+C */
77
+ isCtrlC(event: NativeKeyEvent): boolean;
78
+ /** Check if event is Ctrl+A (beginning of line) */
79
+ isCtrlA(event: NativeKeyEvent): boolean;
80
+ /** Check if event is Ctrl+E (end of line) */
81
+ isCtrlE(event: NativeKeyEvent): boolean;
82
+ /** Check if event is a printable character */
83
+ isPrintable(event: NativeKeyEvent): boolean;
84
+ /** Check if event is Shift+Up */
85
+ isShiftUp(event: NativeKeyEvent): boolean;
86
+ /** Check if event is Shift+Down */
87
+ isShiftDown(event: NativeKeyEvent): boolean;
88
+ };
89
+ export type { NativeKeyEvent, TerminalHandle };
90
+ //# sourceMappingURL=useNativeInput.d.ts.map