@ebowwa/coder 0.2.1 → 0.7.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/README.md +31 -32
  2. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  3. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  4. package/dist/core/__tests__/permissions.test.js +851 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  7. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  10. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  12. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  13. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  16. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  19. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  22. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  23. package/dist/core/agent-loop/compaction.d.ts +39 -0
  24. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  25. package/dist/core/agent-loop/compaction.js +51 -0
  26. package/dist/core/agent-loop/formatters.d.ts +21 -0
  27. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  28. package/dist/core/agent-loop/formatters.js +42 -0
  29. package/dist/core/agent-loop/index.d.ts +25 -0
  30. package/dist/core/agent-loop/index.d.ts.map +1 -0
  31. package/dist/core/agent-loop/index.js +83 -0
  32. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  33. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  34. package/dist/core/agent-loop/loop-state.js +147 -0
  35. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  36. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  37. package/dist/core/agent-loop/message-builder.js +49 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  39. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  40. package/dist/core/agent-loop/tool-executor.js +152 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  42. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  43. package/dist/core/agent-loop/turn-executor.js +124 -0
  44. package/dist/core/agent-loop/types.d.ts +141 -0
  45. package/dist/core/agent-loop/types.d.ts.map +1 -0
  46. package/dist/core/agent-loop/types.js +4 -0
  47. package/dist/core/agent-loop.d.ts +17 -0
  48. package/dist/core/agent-loop.d.ts.map +1 -0
  49. package/dist/core/agent-loop.js +16 -0
  50. package/dist/core/api-client-impl.d.ts +62 -0
  51. package/dist/core/api-client-impl.d.ts.map +1 -0
  52. package/dist/core/api-client-impl.js +479 -0
  53. package/dist/core/api-client.d.ts +6 -0
  54. package/dist/core/api-client.d.ts.map +1 -0
  55. package/dist/core/api-client.js +5 -0
  56. package/dist/core/checkpoints.d.ts +128 -0
  57. package/dist/core/checkpoints.d.ts.map +1 -0
  58. package/dist/core/checkpoints.js +438 -0
  59. package/dist/core/claude-md.d.ts +71 -0
  60. package/dist/core/claude-md.d.ts.map +1 -0
  61. package/dist/core/claude-md.js +198 -0
  62. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  63. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  64. package/dist/core/cognitive-security/hooks.js +389 -0
  65. package/dist/core/cognitive-security/index.d.ts +751 -0
  66. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  67. package/dist/core/cognitive-security/index.js +1123 -0
  68. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  69. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  70. package/dist/core/cognitive-security/middleware.js +376 -0
  71. package/dist/core/config-loader.d.ts +127 -0
  72. package/dist/core/config-loader.d.ts.map +1 -0
  73. package/dist/core/config-loader.js +219 -0
  74. package/dist/core/context-compaction.d.ts +87 -0
  75. package/dist/core/context-compaction.d.ts.map +1 -0
  76. package/dist/core/context-compaction.js +428 -0
  77. package/dist/core/git-status.d.ts +25 -0
  78. package/dist/core/git-status.d.ts.map +1 -0
  79. package/dist/core/git-status.js +204 -0
  80. package/dist/core/image.d.ts +69 -0
  81. package/dist/core/image.d.ts.map +1 -0
  82. package/dist/core/image.js +290 -0
  83. package/dist/core/image.test.d.ts +2 -0
  84. package/dist/core/image.test.d.ts.map +1 -0
  85. package/dist/core/image.test.js +149 -0
  86. package/dist/core/models.d.ts +123 -0
  87. package/dist/core/models.d.ts.map +1 -0
  88. package/dist/core/models.js +325 -0
  89. package/dist/core/permissions.d.ts +81 -0
  90. package/dist/core/permissions.d.ts.map +1 -0
  91. package/dist/core/permissions.js +327 -0
  92. package/dist/core/retry.d.ts +25 -0
  93. package/dist/core/retry.d.ts.map +1 -0
  94. package/dist/core/retry.js +121 -0
  95. package/dist/core/session-store.d.ts +9 -0
  96. package/dist/core/session-store.d.ts.map +1 -0
  97. package/dist/core/session-store.js +10 -0
  98. package/dist/core/sessions/export.d.ts +47 -0
  99. package/dist/core/sessions/export.d.ts.map +1 -0
  100. package/dist/core/sessions/export.js +256 -0
  101. package/dist/core/sessions/index.d.ts +132 -0
  102. package/dist/core/sessions/index.d.ts.map +1 -0
  103. package/dist/core/sessions/index.js +442 -0
  104. package/dist/core/sessions/metadata.d.ts +77 -0
  105. package/dist/core/sessions/metadata.d.ts.map +1 -0
  106. package/dist/core/sessions/metadata.js +233 -0
  107. package/dist/core/sessions/persistence.d.ts +72 -0
  108. package/dist/core/sessions/persistence.d.ts.map +1 -0
  109. package/dist/core/sessions/persistence.js +201 -0
  110. package/dist/core/sessions/types.d.ts +110 -0
  111. package/dist/core/sessions/types.d.ts.map +1 -0
  112. package/dist/core/sessions/types.js +4 -0
  113. package/dist/core/stream-highlighter.d.ts +18 -0
  114. package/dist/core/stream-highlighter.d.ts.map +1 -0
  115. package/dist/core/stream-highlighter.js +916 -0
  116. package/dist/core/system-reminders.d.ts +89 -0
  117. package/dist/core/system-reminders.d.ts.map +1 -0
  118. package/dist/core/system-reminders.js +285 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  121. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  122. package/dist/ecosystem/hooks/index.d.ts +59 -0
  123. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  124. package/dist/ecosystem/hooks/index.js +294 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  127. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  128. package/dist/ecosystem/skills/index.d.ts +55 -0
  129. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  130. package/dist/ecosystem/skills/index.js +258 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  133. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  134. package/dist/ecosystem/tools/index.d.ts +24 -0
  135. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  136. package/dist/ecosystem/tools/index.js +1709 -0
  137. package/dist/index.d.ts +24 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +32 -2
  140. package/dist/interfaces/mcp/client.d.ts +40 -0
  141. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  142. package/dist/interfaces/mcp/client.js +309 -0
  143. package/dist/interfaces/ui/index.d.ts +36 -0
  144. package/dist/interfaces/ui/index.d.ts.map +1 -0
  145. package/dist/interfaces/ui/index.js +61 -0
  146. package/dist/interfaces/ui/spinner.d.ts +140 -0
  147. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  148. package/dist/interfaces/ui/spinner.js +342 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  150. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  151. package/dist/interfaces/ui/terminal/cli/index.js +167 -0
  152. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  153. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  154. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  155. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  156. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  157. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  158. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  159. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  160. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  161. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  162. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  163. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  164. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  165. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  166. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  167. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  168. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  169. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  170. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  171. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  172. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  173. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  174. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  175. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  176. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  177. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  178. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  179. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  180. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  181. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  182. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  183. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  184. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  185. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  186. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  187. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  188. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  189. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  190. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  191. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  192. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  193. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  194. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  195. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  196. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  197. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  198. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  199. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  200. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  201. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  202. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  203. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  204. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  205. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  206. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  207. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  208. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  209. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  210. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  211. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  212. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  213. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  214. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  215. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  216. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  217. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  218. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  219. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  220. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  221. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  222. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  223. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  224. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  225. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  226. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  227. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  228. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  229. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  230. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  231. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  232. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  233. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  234. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  235. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  236. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  237. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  238. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  239. package/dist/native/index.d.ts +480 -0
  240. package/dist/native/index.d.ts.map +1 -0
  241. package/dist/native/index.js +1625 -0
  242. package/dist/teammates/index.d.ts +161 -0
  243. package/dist/teammates/index.d.ts.map +1 -0
  244. package/dist/teammates/index.js +827 -0
  245. package/dist/types/index.d.ts +482 -0
  246. package/dist/types/index.d.ts.map +1 -0
  247. package/dist/types/index.js +52 -0
  248. package/native/README.md +5 -5
  249. package/native/index.darwin-arm64.node +0 -0
  250. package/native/index.node +0 -0
  251. package/native/package.json +4 -4
  252. package/package.json +33 -16
  253. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  254. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
  255. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  256. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  257. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  258. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  259. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  260. package/packages/src/core/agent-loop/compaction.ts +88 -0
  261. package/packages/src/core/agent-loop/formatters.ts +50 -0
  262. package/packages/src/core/agent-loop/index.ts +135 -0
  263. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  264. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  265. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  266. package/packages/src/core/agent-loop/turn-executor.ts +222 -0
  267. package/packages/src/core/agent-loop/types.ts +148 -0
  268. package/packages/src/core/agent-loop.ts +18 -0
  269. package/packages/src/core/api-client-impl.ts +619 -0
  270. package/packages/src/core/api-client.ts +6 -0
  271. package/packages/src/core/checkpoints.ts +606 -0
  272. package/packages/src/core/claude-md.ts +272 -0
  273. package/packages/src/core/cognitive-security/hooks.ts +590 -0
  274. package/packages/src/core/cognitive-security/index.ts +2041 -0
  275. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  276. package/packages/src/core/config-loader.ts +324 -0
  277. package/packages/src/core/context-compaction.ts +578 -0
  278. package/packages/src/core/git-status.ts +262 -0
  279. package/packages/src/core/image.test.ts +180 -0
  280. package/packages/src/core/image.ts +350 -0
  281. package/packages/src/core/lmdb.db +0 -0
  282. package/packages/src/core/lmdb.db-lock +0 -0
  283. package/packages/src/core/models.ts +430 -0
  284. package/packages/src/core/normalizers/todo +4 -0
  285. package/packages/src/core/permissions.ts +431 -0
  286. package/packages/src/core/retry.ts +170 -0
  287. package/packages/src/core/session-store.ts +36 -0
  288. package/packages/src/core/sessions/export.ts +329 -0
  289. package/packages/src/core/sessions/index.ts +587 -0
  290. package/packages/src/core/sessions/metadata.ts +309 -0
  291. package/packages/src/core/sessions/persistence.ts +244 -0
  292. package/packages/src/core/sessions/types.ts +169 -0
  293. package/packages/src/core/stream-highlighter.ts +1123 -0
  294. package/packages/src/core/system-reminders.ts +402 -0
  295. package/packages/src/core/todo +8 -0
  296. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  297. package/packages/src/ecosystem/hooks/index.ts +341 -0
  298. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  299. package/packages/src/ecosystem/skills/index.ts +295 -0
  300. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  301. package/packages/src/ecosystem/tools/index.ts +1877 -0
  302. package/packages/src/index.ts +120 -0
  303. package/packages/src/interfaces/mcp/client.ts +389 -0
  304. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  305. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  306. package/packages/src/interfaces/ui/index.ts +161 -0
  307. package/packages/src/interfaces/ui/lmdb.db +0 -0
  308. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  309. package/packages/src/interfaces/ui/spinner.ts +451 -0
  310. package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
  311. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  312. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  313. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  314. package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
  315. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  316. package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
  317. package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
  318. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
  319. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  320. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
  321. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
  322. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
  323. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
  324. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
  325. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
  326. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
  327. package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
  328. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
  329. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
  330. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
  331. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
  332. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
  333. package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
  334. package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
  335. package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
  336. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
  337. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
  338. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
  339. package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
  340. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
  341. package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
  342. package/packages/src/lmdb.db +0 -0
  343. package/packages/src/lmdb.db-lock +0 -0
  344. package/packages/src/native/index.ts +2345 -0
  345. package/packages/src/teammates/index.ts +982 -0
  346. package/packages/src/types/index.ts +722 -0
  347. package/dist/cli.js +0 -148
  348. package/dist/index-0pkak453.js +0 -136
  349. package/dist/index-0qd0x8b4.js +0 -110
  350. package/dist/index-0x3kprq6.js +0 -240
  351. package/dist/index-1eawy937.js +0 -308
  352. package/dist/index-24m2aygy.js +0 -240
  353. package/dist/index-29xcjnne.js +0 -280
  354. package/dist/index-2avyytn5.js +0 -349
  355. package/dist/index-4ms367ey.js +0 -136
  356. package/dist/index-4w2t3b0m.js +0 -240
  357. package/dist/index-4xfgd8nz.js +0 -261
  358. package/dist/index-5acjp9gc.js +0 -157
  359. package/dist/index-5s15hr56.js +0 -136
  360. package/dist/index-6e4wf341.js +0 -349
  361. package/dist/index-6fvnkedw.js +0 -240
  362. package/dist/index-6rqpmd4g.js +0 -128
  363. package/dist/index-77ckwnbm.js +0 -280
  364. package/dist/index-9knxy49k.js +0 -128
  365. package/dist/index-9zrnw4zx.js +0 -128
  366. package/dist/index-bk21w99v.js +0 -280
  367. package/dist/index-c41n76fv.js +0 -240
  368. package/dist/index-cb4ppjdt.js +0 -255
  369. package/dist/index-cfb2edt6.js +0 -240
  370. package/dist/index-cmfa38hh.js +0 -308
  371. package/dist/index-datjz8q1.js +0 -257
  372. package/dist/index-eadf4wvn.js +0 -240
  373. package/dist/index-em5k0m3z.js +0 -345
  374. package/dist/index-gh8r333a.js +0 -110
  375. package/dist/index-gkx6k2tr.js +0 -261
  376. package/dist/index-h5cabfks.js +0 -155
  377. package/dist/index-hcrpwyy3.js +0 -261
  378. package/dist/index-hk7fwwa8.js +0 -257
  379. package/dist/index-jb8cw7f8.js +0 -136
  380. package/dist/index-kbyw4th1.js +0 -347
  381. package/dist/index-kgj5gqnm.js +0 -345
  382. package/dist/index-mdf6xp1z.js +0 -255
  383. package/dist/index-mrhv8kvc.js +0 -280
  384. package/dist/index-mt4743dd.js +0 -161
  385. package/dist/index-qnwsg97q.js +0 -240
  386. package/dist/index-qwdy6x44.js +0 -261
  387. package/dist/index-rmj77261.js +0 -157
  388. package/dist/index-sbbw1a61.js +0 -349
  389. package/dist/index-svy5bcpn.js +0 -345
  390. package/dist/index-tvmy7tm9.js +0 -261
  391. package/dist/index-tzz4vzkj.js +0 -312
  392. package/dist/index-vz80zmhe.js +0 -110
  393. package/dist/index-wed2fk67.js +0 -240
  394. package/dist/index-wksgzz8e.js +0 -280
  395. package/dist/index-wn2m4wma.js +0 -240
  396. package/dist/index-xha05vjc.js +0 -257
  397. package/dist/index-yc6eh8p8.js +0 -136
  398. package/dist/index-ycjxx9ft.js +0 -240
  399. package/dist/index-z0gzd0fc.js +0 -110
  400. package/dist/index-z8cwtf8j.js +0 -240
  401. package/dist/index-zy5mtt00.js +0 -128
@@ -0,0 +1,340 @@
1
+ /** @jsx React.createElement */
2
+ /**
3
+ * Sidebar Component
4
+ * Collapsible sidebar for sessions, files, todos, and tools
5
+ *
6
+ * Features:
7
+ * - Collapsible with keyboard shortcut
8
+ * - Tabbed sections (sessions, files, todos, tools)
9
+ * - Keyboard navigation
10
+ * - Context-aware content
11
+ */
12
+ import React, { useState, useEffect, useCallback, useRef } from "react";
13
+ import { Box, Text, useStdout } from "ink";
14
+ import chalk from "chalk";
15
+ // ============================================
16
+ // TAB CONFIGURATION
17
+ // ============================================
18
+ const TABS = [
19
+ { id: "sessions", label: "Sessions", icon: "◈" },
20
+ { id: "files", label: "Files", icon: "◇" },
21
+ { id: "todos", label: "Todos", icon: "○" },
22
+ { id: "tools", label: "Tools", icon: "◆" },
23
+ ];
24
+ function TabBar({ activeTab, onTabChange }) {
25
+ return (React.createElement(Box, { flexDirection: "row", borderBottom: true }, TABS.map((tab) => {
26
+ const isActive = tab.id === activeTab;
27
+ return (React.createElement(Box, { key: tab.id, paddingX: 1, borderStyle: isActive ? "single" : undefined, borderBottom: isActive },
28
+ React.createElement(Text, { color: isActive ? "cyan" : "gray", bold: isActive },
29
+ tab.icon,
30
+ " ",
31
+ tab.label)));
32
+ })));
33
+ }
34
+ function SessionsTab({ sessions, currentSessionId, onSelect }) {
35
+ const [selectedIndex, setSelectedIndex] = useState(0);
36
+ useEffect(() => {
37
+ const handleKey = (data) => {
38
+ const key = data.toString();
39
+ if (key === "\x1b[A" || key === "k") {
40
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
41
+ }
42
+ else if (key === "\x1b[B" || key === "j") {
43
+ setSelectedIndex((prev) => Math.min(sessions.length - 1, prev + 1));
44
+ }
45
+ else if (key === "\r" || key === "\n" || key === "l") {
46
+ const session = sessions[selectedIndex];
47
+ if (session) {
48
+ onSelect?.(session.id);
49
+ }
50
+ }
51
+ };
52
+ process.stdin.on("data", handleKey);
53
+ return () => {
54
+ process.stdin.off("data", handleKey);
55
+ };
56
+ }, [sessions, selectedIndex, onSelect]);
57
+ if (sessions.length === 0) {
58
+ return (React.createElement(Box, { paddingX: 1 },
59
+ React.createElement(Text, { dimColor: true }, "No recent sessions")));
60
+ }
61
+ return (React.createElement(Box, { flexDirection: "column" }, sessions.slice(0, 15).map((session, index) => {
62
+ const isSelected = index === selectedIndex;
63
+ const isCurrent = session.id === currentSessionId;
64
+ const timeAgo = session.lastActivity
65
+ ? formatTimeAgo(session.lastActivity)
66
+ : "unknown";
67
+ return (React.createElement(Box, { key: session.id, paddingX: 1, flexDirection: "column" },
68
+ React.createElement(Box, null,
69
+ isSelected && React.createElement(Text, { color: "cyan" }, "\u2192 "),
70
+ !isSelected && React.createElement(Text, null, " "),
71
+ isCurrent && React.createElement(Text, { color: "green" }, "\u25CF "),
72
+ !isCurrent && React.createElement(Text, { dimColor: true }, "\u25CB "),
73
+ React.createElement(Text, { color: isSelected ? "cyan" : "white", bold: isSelected }, session.id.slice(0, 8)),
74
+ React.createElement(Text, { dimColor: true },
75
+ " ",
76
+ session.model?.slice(0, 10) || "unknown")),
77
+ React.createElement(Box, { marginLeft: 3 },
78
+ React.createElement(Text, { dimColor: true },
79
+ session.messageCount,
80
+ " msgs \u00B7 ",
81
+ timeAgo)),
82
+ session.preview && (React.createElement(Box, { marginLeft: 3 },
83
+ React.createElement(Text, { dimColor: true }, session.preview.slice(0, 30))))));
84
+ })));
85
+ }
86
+ // ============================================
87
+ // FILES TAB
88
+ // ============================================
89
+ const FILE_STATUS_COLORS = {
90
+ modified: "yellow",
91
+ added: "green",
92
+ deleted: "red",
93
+ untracked: "gray",
94
+ };
95
+ const FILE_STATUS_ICONS = {
96
+ modified: "M",
97
+ added: "A",
98
+ deleted: "D",
99
+ untracked: "?",
100
+ };
101
+ function FilesTab({ files, onSelect }) {
102
+ const [selectedIndex, setSelectedIndex] = useState(0);
103
+ useEffect(() => {
104
+ const handleKey = (data) => {
105
+ const key = data.toString();
106
+ if (key === "\x1b[A" || key === "k") {
107
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
108
+ }
109
+ else if (key === "\x1b[B" || key === "j") {
110
+ setSelectedIndex((prev) => Math.min(files.length - 1, prev + 1));
111
+ }
112
+ else if (key === "\r" || key === "\n" || key === "l") {
113
+ const file = files[selectedIndex];
114
+ if (file) {
115
+ onSelect?.(file.path);
116
+ }
117
+ }
118
+ };
119
+ process.stdin.on("data", handleKey);
120
+ return () => {
121
+ process.stdin.off("data", handleKey);
122
+ };
123
+ }, [files, selectedIndex, onSelect]);
124
+ if (files.length === 0) {
125
+ return (React.createElement(Box, { paddingX: 1 },
126
+ React.createElement(Text, { dimColor: true }, "No modified files")));
127
+ }
128
+ return (React.createElement(Box, { flexDirection: "column" }, files.slice(0, 15).map((file, index) => {
129
+ const isSelected = index === selectedIndex;
130
+ const color = FILE_STATUS_COLORS[file.status];
131
+ const icon = FILE_STATUS_ICONS[file.status];
132
+ return (React.createElement(Box, { key: file.path, paddingX: 1 },
133
+ isSelected && React.createElement(Text, { color: "cyan" }, "\u2192 "),
134
+ !isSelected && React.createElement(Text, null, " "),
135
+ React.createElement(Text, { color: color, bold: true },
136
+ icon,
137
+ " "),
138
+ React.createElement(Text, { color: isSelected ? "cyan" : "white" }, truncatePath(file.path, 25)),
139
+ file.lineCount && (React.createElement(Text, { dimColor: true },
140
+ " (",
141
+ file.lineCount,
142
+ " lines)"))));
143
+ })));
144
+ }
145
+ // ============================================
146
+ // TODOS TAB
147
+ // ============================================
148
+ const TODO_STATUS_COLORS = {
149
+ pending: "gray",
150
+ in_progress: "yellow",
151
+ completed: "green",
152
+ };
153
+ const TODO_STATUS_ICONS = {
154
+ pending: "○",
155
+ in_progress: "◐",
156
+ completed: "●",
157
+ };
158
+ function TodosTab({ todos, onToggle }) {
159
+ const [selectedIndex, setSelectedIndex] = useState(0);
160
+ useEffect(() => {
161
+ const handleKey = (data) => {
162
+ const key = data.toString();
163
+ if (key === "\x1b[A" || key === "k") {
164
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
165
+ }
166
+ else if (key === "\x1b[B" || key === "j") {
167
+ setSelectedIndex((prev) => Math.min(todos.length - 1, prev + 1));
168
+ }
169
+ else if (key === "\r" || key === "\n" || key === " " || key === "l") {
170
+ const todo = todos[selectedIndex];
171
+ if (todo) {
172
+ onToggle?.(todo.id);
173
+ }
174
+ }
175
+ };
176
+ process.stdin.on("data", handleKey);
177
+ return () => {
178
+ process.stdin.off("data", handleKey);
179
+ };
180
+ }, [todos, selectedIndex, onToggle]);
181
+ if (todos.length === 0) {
182
+ return (React.createElement(Box, { paddingX: 1 },
183
+ React.createElement(Text, { dimColor: true }, "No active todos")));
184
+ }
185
+ const pending = todos.filter((t) => t.status === "pending").length;
186
+ const completed = todos.filter((t) => t.status === "completed").length;
187
+ return (React.createElement(Box, { flexDirection: "column" },
188
+ React.createElement(Box, { paddingX: 1, marginBottom: 1 },
189
+ React.createElement(Text, { dimColor: true },
190
+ completed,
191
+ "/",
192
+ todos.length,
193
+ " completed \u00B7 ",
194
+ pending,
195
+ " pending")),
196
+ todos.slice(0, 15).map((todo, index) => {
197
+ const isSelected = index === selectedIndex;
198
+ const color = TODO_STATUS_COLORS[todo.status];
199
+ const icon = TODO_STATUS_ICONS[todo.status];
200
+ return (React.createElement(Box, { key: todo.id, paddingX: 1 },
201
+ isSelected && React.createElement(Text, { color: "cyan" }, "\u2192 "),
202
+ !isSelected && React.createElement(Text, null, " "),
203
+ React.createElement(Text, { color: color },
204
+ icon,
205
+ " "),
206
+ React.createElement(Text, { color: isSelected ? "cyan" : "white", dimColor: todo.status === "completed", strikethrough: todo.status === "completed" }, truncateText(todo.text, 28))));
207
+ })));
208
+ }
209
+ // ============================================
210
+ // TOOLS TAB
211
+ // ============================================
212
+ const TOOL_STATUS_COLORS = {
213
+ available: "green",
214
+ running: "yellow",
215
+ error: "red",
216
+ };
217
+ const TOOL_STATUS_ICONS = {
218
+ available: "●",
219
+ running: "◐",
220
+ error: "○",
221
+ };
222
+ function ToolsTab({ tools, onSelect }) {
223
+ const [selectedIndex, setSelectedIndex] = useState(0);
224
+ useEffect(() => {
225
+ const handleKey = (data) => {
226
+ const key = data.toString();
227
+ if (key === "\x1b[A" || key === "k") {
228
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
229
+ }
230
+ else if (key === "\x1b[B" || key === "j") {
231
+ setSelectedIndex((prev) => Math.min(tools.length - 1, prev + 1));
232
+ }
233
+ else if (key === "\r" || key === "\n" || key === "l") {
234
+ const tool = tools[selectedIndex];
235
+ if (tool) {
236
+ onSelect?.(tool.name);
237
+ }
238
+ }
239
+ };
240
+ process.stdin.on("data", handleKey);
241
+ return () => {
242
+ process.stdin.off("data", handleKey);
243
+ };
244
+ }, [tools, selectedIndex, onSelect]);
245
+ if (tools.length === 0) {
246
+ return (React.createElement(Box, { paddingX: 1 },
247
+ React.createElement(Text, { dimColor: true }, "No tools available")));
248
+ }
249
+ // Group by server
250
+ const byServer = tools.reduce((acc, tool) => {
251
+ const server = tool.server;
252
+ if (!acc[server])
253
+ acc[server] = [];
254
+ acc[server].push(tool);
255
+ return acc;
256
+ }, {});
257
+ return (React.createElement(Box, { flexDirection: "column" }, Object.entries(byServer).map(([server, serverTools]) => (React.createElement(Box, { key: server, flexDirection: "column", marginBottom: 1 },
258
+ React.createElement(Box, { paddingX: 1 },
259
+ React.createElement(Text, { dimColor: true, bold: true }, server)),
260
+ serverTools.slice(0, 10).map((tool) => {
261
+ const index = tools.indexOf(tool);
262
+ const isSelected = index === selectedIndex;
263
+ const color = TOOL_STATUS_COLORS[tool.status];
264
+ const icon = TOOL_STATUS_ICONS[tool.status];
265
+ return (React.createElement(Box, { key: tool.name, paddingX: 1 },
266
+ isSelected && React.createElement(Text, { color: "cyan" }, "\u2192 "),
267
+ !isSelected && React.createElement(Text, null, " "),
268
+ React.createElement(Text, { color: color },
269
+ icon,
270
+ " "),
271
+ React.createElement(Text, { color: isSelected ? "cyan" : "white" }, tool.name)));
272
+ }))))));
273
+ }
274
+ // ============================================
275
+ // MAIN SIDEBAR COMPONENT
276
+ // ============================================
277
+ export function Sidebar({ isOpen, activeTab = "sessions", width = 30, sessions = [], files = [], todos = [], tools = [], currentSessionId, onTabChange, onSessionSelect, onFileSelect, onTodoToggle, onToolSelect, onClose, }) {
278
+ const [internalTab, setInternalTab] = useState(activeTab);
279
+ const { stdout } = useStdout();
280
+ useEffect(() => {
281
+ setInternalTab(activeTab);
282
+ }, [activeTab]);
283
+ // Tab change handler
284
+ const handleTabChange = useCallback((tab) => {
285
+ setInternalTab(tab);
286
+ onTabChange?.(tab);
287
+ }, [onTabChange]);
288
+ if (!isOpen) {
289
+ return (React.createElement(Box, { width: 3, borderStyle: "single", borderColor: "gray" },
290
+ React.createElement(Text, { dimColor: true }, "\u2502")));
291
+ }
292
+ const sidebarWidth = Math.min(width, (stdout.columns || 80) - 20);
293
+ return (React.createElement(Box, { flexDirection: "column", width: sidebarWidth, borderStyle: "single", borderColor: "gray" },
294
+ React.createElement(Box, { borderBottom: true, borderStyle: "single", borderColor: "gray", paddingX: 1 },
295
+ React.createElement(Text, { bold: true, color: "cyan" }, "Coder"),
296
+ React.createElement(Text, { dimColor: true }, " | "),
297
+ React.createElement(Text, { dimColor: true }, "Ctrl+B to close")),
298
+ React.createElement(TabBar, { activeTab: internalTab, onTabChange: handleTabChange }),
299
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1, paddingY: 1 },
300
+ internalTab === "sessions" && (React.createElement(SessionsTab, { sessions: sessions, currentSessionId: currentSessionId, onSelect: onSessionSelect })),
301
+ internalTab === "files" && (React.createElement(FilesTab, { files: files, onSelect: onFileSelect })),
302
+ internalTab === "todos" && (React.createElement(TodosTab, { todos: todos, onToggle: onTodoToggle })),
303
+ internalTab === "tools" && (React.createElement(ToolsTab, { tools: tools, onSelect: onToolSelect }))),
304
+ React.createElement(Box, { borderTop: true, borderStyle: "single", borderColor: "gray", paddingX: 1 },
305
+ React.createElement(Text, { dimColor: true }, "Tab: switch | \u2191\u2193: nav | Enter: select"))));
306
+ }
307
+ // ============================================
308
+ // HELPERS
309
+ // ============================================
310
+ function formatTimeAgo(timestamp) {
311
+ const seconds = Math.floor((Date.now() - timestamp) / 1000);
312
+ if (seconds < 60)
313
+ return "just now";
314
+ if (seconds < 3600)
315
+ return `${Math.floor(seconds / 60)}m ago`;
316
+ if (seconds < 86400)
317
+ return `${Math.floor(seconds / 3600)}h ago`;
318
+ return `${Math.floor(seconds / 86400)}d ago`;
319
+ }
320
+ function truncatePath(path, maxLength) {
321
+ if (path.length <= maxLength)
322
+ return path;
323
+ const filename = path.split("/").pop() || path;
324
+ if (filename.length >= maxLength - 3) {
325
+ return `...${filename.slice(-(maxLength - 3))}`;
326
+ }
327
+ const parts = path.split("/");
328
+ const firstPart = parts[0];
329
+ const remaining = parts.slice(1).join("/");
330
+ if (firstPart && remaining) {
331
+ return `${firstPart}/.../${parts.pop()}`;
332
+ }
333
+ return `...${path.slice(-(maxLength - 3))}`;
334
+ }
335
+ function truncateText(text, maxLength) {
336
+ if (text.length <= maxLength)
337
+ return text;
338
+ return `${text.slice(0, maxLength - 3)}...`;
339
+ }
340
+ export default Sidebar;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TUI Components Module
3
+ * Composable components for building rich terminal UIs
4
+ *
5
+ * Components:
6
+ * - PaneManager: Resizable split pane layout
7
+ * - MultilineInput: Enhanced text input with autocomplete
8
+ * - Toast: Notification messages
9
+ * - Modal: Dialog overlays
10
+ * - SelectableList: Keyboard-navigable lists
11
+ * - Link: OSC 8 hyperlinks
12
+ * - Sidebar: Collapsible sidebar with tabs
13
+ *
14
+ * IMPORTANT: All keyboard input is handled via InputContext.
15
+ * Do NOT use process.stdin directly - it conflicts with the main input loop.
16
+ */
17
+ export { InputProvider, useInputContext, useInputRegistration, useInputRegistration as useInputHandler, useInputFocus, useInputBlock, InputPriority, type InputHandler, type InputHandlerOptions, type InputContextValue, type NativeKeyEvent, } from "../InputContext.js";
18
+ export { PaneManager, type PaneConfig, type PaneDirection, type PaneManagerProps, usePane, PaneContext, } from "./PaneManager.js";
19
+ export { MultilineInput, useMultilineInputHandler, filterSuggestions, highlightSyntax, type MultilineInputProps, type MultilineInputState, type UseMultilineInputOptions, type AutocompleteSuggestion, } from "./MultilineInput.js";
20
+ export { Toast, useToast, type ToastMessage, type ToastType, type ToastProps, type ToastManager, Modal, ConfirmModal, type ModalAction, type ModalProps, type ConfirmModalProps, SelectableList, type SelectableItem, type SelectableListProps, Link, createOsc8Link, type LinkProps, InteractiveProvider, useInteractive, } from "./InteractiveElements.js";
21
+ export { Sidebar, type SidebarTab, type SidebarSession, type SidebarFile, type SidebarTodo, type SidebarTool, type SidebarProps, } from "./Sidebar.js";
22
+ export { Box, Text, useApp, useInput, useStdout, type Key } from "ink";
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/src/interfaces/ui/terminal/tui/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EACL,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,oBAAoB,IAAI,eAAe,EACvC,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EACL,WAAW,EACX,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,OAAO,EACP,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAEL,KAAK,EACL,QAAQ,EACR,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EAGjB,KAAK,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,iBAAiB,EAGtB,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAGxB,IAAI,EACJ,cAAc,EACd,KAAK,SAAS,EAGd,mBAAmB,EACnB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EACL,OAAO,EACP,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AAOtB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * TUI Components Module
3
+ * Composable components for building rich terminal UIs
4
+ *
5
+ * Components:
6
+ * - PaneManager: Resizable split pane layout
7
+ * - MultilineInput: Enhanced text input with autocomplete
8
+ * - Toast: Notification messages
9
+ * - Modal: Dialog overlays
10
+ * - SelectableList: Keyboard-navigable lists
11
+ * - Link: OSC 8 hyperlinks
12
+ * - Sidebar: Collapsible sidebar with tabs
13
+ *
14
+ * IMPORTANT: All keyboard input is handled via InputContext.
15
+ * Do NOT use process.stdin directly - it conflicts with the main input loop.
16
+ */
17
+ // ============================================
18
+ // INPUT CONTEXT (centralized input management)
19
+ // ============================================
20
+ export { InputProvider, useInputContext, useInputRegistration, useInputRegistration as useInputHandler, useInputFocus, useInputBlock, InputPriority, } from "../InputContext.js";
21
+ // ============================================
22
+ // PANE MANAGER
23
+ // ============================================
24
+ export { PaneManager, usePane, PaneContext, } from "./PaneManager.js";
25
+ // ============================================
26
+ // MULTILINE INPUT
27
+ // ============================================
28
+ export { MultilineInput, useMultilineInputHandler, filterSuggestions, highlightSyntax, } from "./MultilineInput.js";
29
+ // ============================================
30
+ // INTERACTIVE ELEMENTS
31
+ // ============================================
32
+ export {
33
+ // Toast
34
+ Toast, useToast,
35
+ // Modal
36
+ Modal, ConfirmModal,
37
+ // SelectableList
38
+ SelectableList,
39
+ // Link
40
+ Link, createOsc8Link,
41
+ // Context
42
+ InteractiveProvider, useInteractive, } from "./InteractiveElements.js";
43
+ // ============================================
44
+ // SIDEBAR
45
+ // ============================================
46
+ export { Sidebar, } from "./Sidebar.js";
47
+ // ============================================
48
+ // RE-EXPORT INK COMPONENTS (convenience)
49
+ // ============================================
50
+ // Re-export commonly used Ink components for convenience
51
+ export { Box, Text, useApp, useInput, useStdout } from "ink";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Console Suppression Utilities
3
+ * Manages console output suppression during TUI mode
4
+ */
5
+ /**
6
+ * Suppress all console output during TUI mode
7
+ * Prevents TUI corruption from stray console output
8
+ */
9
+ export declare function suppressConsole(): void;
10
+ /**
11
+ * Restore original console methods
12
+ * Call when exiting TUI mode
13
+ */
14
+ export declare function restoreConsole(): void;
15
+ /**
16
+ * Execute a function with console suppressed
17
+ * Automatically restores console after execution
18
+ */
19
+ export declare function withSuppressedConsole<T>(fn: () => Promise<T>): Promise<T>;
20
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/console.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO/E"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Console Suppression Utilities
3
+ * Manages console output suppression during TUI mode
4
+ */
5
+ /**
6
+ * Store original console methods for restoration
7
+ */
8
+ const originalConsole = {
9
+ log: console.log,
10
+ error: console.error,
11
+ warn: console.warn,
12
+ info: console.info,
13
+ };
14
+ /**
15
+ * Suppress all console output during TUI mode
16
+ * Prevents TUI corruption from stray console output
17
+ */
18
+ export function suppressConsole() {
19
+ console.log = () => { };
20
+ console.error = () => { };
21
+ console.warn = () => { };
22
+ console.info = () => { };
23
+ }
24
+ /**
25
+ * Restore original console methods
26
+ * Call when exiting TUI mode
27
+ */
28
+ export function restoreConsole() {
29
+ console.log = originalConsole.log;
30
+ console.error = originalConsole.error;
31
+ console.warn = originalConsole.warn;
32
+ console.info = originalConsole.info;
33
+ }
34
+ /**
35
+ * Execute a function with console suppressed
36
+ * Automatically restores console after execution
37
+ */
38
+ export async function withSuppressedConsole(fn) {
39
+ suppressConsole();
40
+ try {
41
+ return await fn();
42
+ }
43
+ finally {
44
+ restoreConsole();
45
+ }
46
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * TUI Module Exports
3
+ * Re-exports all components and utilities from the modular TUI package
4
+ */
5
+ export type { InteractiveTUIProps, SessionStore, MessageAreaProps, StatusBarProps, InputFieldProps, TerminalLayout, CommandContext, ContextInfo, } from "./types.js";
6
+ export { suppressConsole, restoreConsole, withSuppressedConsole } from "./console.js";
7
+ export { spinnerFrames, dotSpinnerFrames, asciiSpinnerFrames, arrowSpinnerFrames, simpleDotFrames, nextFrame, getFrame, createSpinnerIterator, } from "./spinner.js";
8
+ export { MessageArea } from "./MessageArea.js";
9
+ export { StatusBar } from "./StatusBar.js";
10
+ export { InputField } from "./InputField.js";
11
+ export { useInputHandler as useInputFieldHandler, useExitHandler } from "./useInputHandler.js";
12
+ export { handleCommand, getHelpText } from "./commands.js";
13
+ export { default as InteractiveTUI } from "./InteractiveTUI.js";
14
+ export { runInteractiveTUI } from "./run.js";
15
+ export { createTUIApp, type TUIAppProps, type TUIAppHandle, type Message as TUIMessage, } from "./tui-app.js";
16
+ export { default as TUIApp } from "./tui-app.js";
17
+ export { TUIFooter, getTUIFooter, enableTUIFooter, disableTUIFooter, renderTUIFooter, clearTUIFooter, ANSI, type TUIFooterOptions, type TUIFooterState, } from "./tui-footer.js";
18
+ export { InputProvider, useInputContext, useInputHandler, useInputFocus, useInputBlock, InputPriority, type InputHandler, type InputHandlerOptions, type InputContextValue, } from "./InputContext.js";
19
+ export { MessageStoreProvider, useMessageStore, type UIMessage, type MessageSubType, type MessageStoreValue, } from "./MessageStore.js";
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGtF,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG/F,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,OAAO,IAAI,UAAU,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,IAAI,EACJ,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * TUI Module Exports
3
+ * Re-exports all components and utilities from the modular TUI package
4
+ */
5
+ // Console utilities
6
+ export { suppressConsole, restoreConsole, withSuppressedConsole } from "./console.js";
7
+ // Spinner utilities
8
+ export { spinnerFrames, dotSpinnerFrames, asciiSpinnerFrames, arrowSpinnerFrames, simpleDotFrames, nextFrame, getFrame, createSpinnerIterator, } from "./spinner.js";
9
+ // Components
10
+ export { MessageArea } from "./MessageArea.js";
11
+ export { StatusBar } from "./StatusBar.js";
12
+ export { InputField } from "./InputField.js";
13
+ // Hooks
14
+ export { useInputHandler as useInputFieldHandler, useExitHandler } from "./useInputHandler.js";
15
+ // Commands
16
+ export { handleCommand, getHelpText } from "./commands.js";
17
+ // Main component and entry point
18
+ export { default as InteractiveTUI } from "./InteractiveTUI.js";
19
+ export { runInteractiveTUI } from "./run.js";
20
+ // TUI App (Ink-based)
21
+ export { createTUIApp, } from "./tui-app.js";
22
+ export { default as TUIApp } from "./tui-app.js";
23
+ // TUI Footer
24
+ export { TUIFooter, getTUIFooter, enableTUIFooter, disableTUIFooter, renderTUIFooter, clearTUIFooter, ANSI, } from "./tui-footer.js";
25
+ // Input Context (centralized keyboard input management)
26
+ export { InputProvider, useInputContext, useInputHandler, useInputFocus, useInputBlock, InputPriority, } from "./InputContext.js";
27
+ // Message Store (centralized message state management)
28
+ export { MessageStoreProvider, useMessageStore, } from "./MessageStore.js";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * TUI Entry Point
3
+ * Renders and runs the InteractiveTUI
4
+ *
5
+ * IMPORTANT: Ink manages terminal state (raw mode, stdin).
6
+ * The native input hook reads events without managing raw mode.
7
+ */
8
+ import type { InteractiveTUIProps } from "./types.js";
9
+ /**
10
+ * Run the interactive TUI
11
+ */
12
+ export declare function runInteractiveTUI(options: InteractiveTUIProps): Promise<void>;
13
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/run.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * TUI Entry Point
3
+ * Renders and runs the InteractiveTUI
4
+ *
5
+ * IMPORTANT: Ink manages terminal state (raw mode, stdin).
6
+ * The native input hook reads events without managing raw mode.
7
+ */
8
+ import React from "react";
9
+ import { render } from "ink";
10
+ import InteractiveTUI from "./InteractiveTUI.js";
11
+ import { suppressConsole, restoreConsole } from "./console.js";
12
+ /**
13
+ * Run the interactive TUI
14
+ */
15
+ export async function runInteractiveTUI(options) {
16
+ // Suppress console output to prevent TUI corruption
17
+ suppressConsole();
18
+ // Ink manages raw mode and stdin
19
+ // Native input reads events without touching raw mode
20
+ const { unmount, waitUntilExit } = render(React.createElement(InteractiveTUI, { ...options }), {
21
+ exitOnCtrlC: false,
22
+ // Ensure Ink uses stdin properly
23
+ stdin: process.stdin,
24
+ stdout: process.stdout,
25
+ stderr: process.stderr,
26
+ });
27
+ await waitUntilExit();
28
+ unmount();
29
+ // Restore console output
30
+ restoreConsole();
31
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Spinner Animation
3
+ * Provides animated spinner frames for loading indicators
4
+ *
5
+ * This is the single source of truth for all spinner frames in Coder.
6
+ * Other modules should import from here rather than defining their own.
7
+ */
8
+ /**
9
+ * Standard braille spinner frames (default)
10
+ * Used by: ora spinner, TUI footer, Ink components
11
+ */
12
+ export declare const spinnerFrames: readonly ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
13
+ /**
14
+ * Alternative dot spinner frames
15
+ * Rising dots pattern
16
+ */
17
+ export declare const dotSpinnerFrames: readonly ["⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈"];
18
+ /**
19
+ * Simple ASCII spinner frames
20
+ * Fallback for limited terminal support
21
+ */
22
+ export declare const asciiSpinnerFrames: readonly ["|", "/", "-", "\\"];
23
+ /**
24
+ * Arrow spinner frames
25
+ * Used for tool execution indicators
26
+ */
27
+ export declare const arrowSpinnerFrames: readonly ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"];
28
+ /**
29
+ * Simple dots for minimal display
30
+ */
31
+ export declare const simpleDotFrames: readonly [". ", ".. ", "...", " "];
32
+ /**
33
+ * Get the next spinner frame index
34
+ */
35
+ export declare function nextFrame(currentIndex: number, frames?: readonly string[]): number;
36
+ /**
37
+ * Get a spinner frame by index (with wraparound)
38
+ */
39
+ export declare function getFrame(index: number, frames?: readonly string[]): string;
40
+ /**
41
+ * Create a spinner iterator
42
+ */
43
+ export declare function createSpinnerIterator(frames?: readonly string[]): Generator<string, never, unknown>;
44
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../../packages/src/interfaces/ui/terminal/tui/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;GAGG;AACH,eAAO,MAAM,aAAa,6DAA8D,CAAC;AAEzF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,mDAAoD,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,gCAAiC,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,mDAAoD,CAAC;AAEpF;;GAEG;AACH,eAAO,MAAM,eAAe,uCAAwC,CAAC;AAMrE;;GAEG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAkB,GAAG,MAAM,CAEjG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAkB,GAAG,MAAM,CAEzF;AAED;;GAEG;AACH,wBAAiB,qBAAqB,CAAC,MAAM,GAAE,SAAS,MAAM,EAAkB,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAMnH"}