@ebowwa/coder 0.7.63 → 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 (341) 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 +32 -52192
  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 +159 -52768
  151. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  152. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  153. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  154. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  155. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  156. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  157. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  158. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  159. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  160. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  161. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  162. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  163. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  164. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  165. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  166. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  167. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  168. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  169. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  170. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  171. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  172. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  173. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  174. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  175. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  176. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  177. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  178. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  179. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  180. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  181. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  182. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  183. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  184. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  185. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  186. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  187. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  188. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  189. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  190. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  191. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  192. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  193. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  194. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  195. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  196. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  197. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  198. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  199. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  200. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  201. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  202. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  203. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  204. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  205. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  206. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  207. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  208. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  209. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  210. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  211. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  212. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  213. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  214. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  215. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  216. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  217. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  218. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  219. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  220. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  221. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  222. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  223. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  224. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  225. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  226. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  227. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  228. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  229. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  230. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  231. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  232. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  233. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  234. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  235. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  236. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  237. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  238. package/dist/native/index.d.ts +480 -0
  239. package/dist/native/index.d.ts.map +1 -0
  240. package/dist/native/index.js +1625 -0
  241. package/dist/teammates/index.d.ts +161 -0
  242. package/dist/teammates/index.d.ts.map +1 -0
  243. package/dist/teammates/index.js +827 -0
  244. package/dist/types/index.d.ts +482 -0
  245. package/dist/types/index.d.ts.map +1 -0
  246. package/dist/types/index.js +52 -0
  247. package/package.json +4 -2
  248. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  249. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
  250. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  251. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  252. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  253. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  254. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  255. package/packages/src/core/agent-loop/compaction.ts +88 -0
  256. package/packages/src/core/agent-loop/formatters.ts +50 -0
  257. package/packages/src/core/agent-loop/index.ts +135 -0
  258. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  259. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  260. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  261. package/packages/src/core/agent-loop/turn-executor.ts +222 -0
  262. package/packages/src/core/agent-loop/types.ts +148 -0
  263. package/packages/src/core/agent-loop.ts +18 -0
  264. package/packages/src/core/api-client-impl.ts +619 -0
  265. package/packages/src/core/api-client.ts +6 -0
  266. package/packages/src/core/checkpoints.ts +606 -0
  267. package/packages/src/core/claude-md.ts +272 -0
  268. package/packages/src/core/cognitive-security/hooks.ts +590 -0
  269. package/packages/src/core/cognitive-security/index.ts +2041 -0
  270. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  271. package/packages/src/core/config-loader.ts +324 -0
  272. package/packages/src/core/context-compaction.ts +578 -0
  273. package/packages/src/core/git-status.ts +262 -0
  274. package/packages/src/core/image.test.ts +180 -0
  275. package/packages/src/core/image.ts +350 -0
  276. package/packages/src/core/lmdb.db +0 -0
  277. package/packages/src/core/lmdb.db-lock +0 -0
  278. package/packages/src/core/models.ts +430 -0
  279. package/packages/src/core/normalizers/todo +4 -0
  280. package/packages/src/core/permissions.ts +431 -0
  281. package/packages/src/core/retry.ts +170 -0
  282. package/packages/src/core/session-store.ts +36 -0
  283. package/packages/src/core/sessions/export.ts +329 -0
  284. package/packages/src/core/sessions/index.ts +587 -0
  285. package/packages/src/core/sessions/metadata.ts +309 -0
  286. package/packages/src/core/sessions/persistence.ts +244 -0
  287. package/packages/src/core/sessions/types.ts +169 -0
  288. package/packages/src/core/stream-highlighter.ts +1123 -0
  289. package/packages/src/core/system-reminders.ts +402 -0
  290. package/packages/src/core/todo +8 -0
  291. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  292. package/packages/src/ecosystem/hooks/index.ts +341 -0
  293. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  294. package/packages/src/ecosystem/skills/index.ts +295 -0
  295. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  296. package/packages/src/ecosystem/tools/index.ts +1877 -0
  297. package/packages/src/index.ts +120 -0
  298. package/packages/src/interfaces/mcp/client.ts +389 -0
  299. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  300. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  301. package/packages/src/interfaces/ui/index.ts +161 -0
  302. package/packages/src/interfaces/ui/lmdb.db +0 -0
  303. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  304. package/packages/src/interfaces/ui/spinner.ts +451 -0
  305. package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
  306. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  307. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  308. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  309. package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
  310. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  311. package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
  312. package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
  313. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
  314. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  315. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
  316. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
  317. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
  318. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
  319. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
  320. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
  321. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
  322. package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
  323. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
  324. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
  325. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
  326. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
  327. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
  328. package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
  329. package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
  330. package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
  331. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
  332. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
  333. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
  334. package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
  335. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
  336. package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
  337. package/packages/src/lmdb.db +0 -0
  338. package/packages/src/lmdb.db-lock +0 -0
  339. package/packages/src/native/index.ts +2345 -0
  340. package/packages/src/teammates/index.ts +982 -0
  341. package/packages/src/types/index.ts +722 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * MCP Client - Model Context Protocol implementation
3
+ */
4
+ import type { MCPServerConfig, MCPTool, ToolResult } from "../../types/index.js";
5
+ export interface MCPClientOptions {
6
+ name: string;
7
+ config: MCPServerConfig;
8
+ onLog?: (message: string) => void;
9
+ }
10
+ export declare class MCPClientImpl {
11
+ static readonly MCPClient: typeof MCPClientImpl;
12
+ name: string;
13
+ config: MCPServerConfig;
14
+ connected: boolean;
15
+ tools: MCPTool[];
16
+ private process;
17
+ private websocket;
18
+ private requestId;
19
+ private pendingRequests;
20
+ private buffer;
21
+ private onLog?;
22
+ constructor(options: MCPClientOptions);
23
+ connect(): Promise<void>;
24
+ private connectStdio;
25
+ private connectHttp;
26
+ private connectWebSocket;
27
+ private initialize;
28
+ private loadTools;
29
+ callTool(name: string, args: Record<string, unknown>): Promise<ToolResult>;
30
+ request(method: string, params: unknown): Promise<unknown>;
31
+ notify(method: string, params: unknown): void;
32
+ private handleData;
33
+ close(): Promise<void>;
34
+ private log;
35
+ }
36
+ /**
37
+ * Create MCP clients from config
38
+ */
39
+ export declare function createMCPClients(servers: Record<string, MCPServerConfig>, onLog?: (message: string) => void): Promise<Map<string, MCPClientImpl>>;
40
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../packages/src/interfaces/mcp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EAKP,UAAU,EACX,MAAM,sBAAsB,CAAC;AAI9B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,qBAAa,aAAa;IAExB,MAAM,CAAC,QAAQ,CAAC,SAAS,uBAAiB;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,UAAS;IAClB,KAAK,EAAE,OAAO,EAAE,CAAM;IAEtB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAMnB;IACJ,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAAC,CAA4B;gBAE9B,OAAO,EAAE,gBAAgB;IAM/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAUhB,YAAY;YAoCZ,WAAW;YA6CX,gBAAgB;YA+DhB,UAAU;YAwBV,SAAS;IAsBjB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAgB1E,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAoChE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAiB7C,OAAO,CAAC,UAAU;IA6BZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,OAAO,CAAC,GAAG;CAGZ;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAkBrC"}
@@ -0,0 +1,309 @@
1
+ /**
2
+ * MCP Client - Model Context Protocol implementation
3
+ */
4
+ import { spawn } from "child_process";
5
+ import WebSocket from "ws";
6
+ export class MCPClientImpl {
7
+ // Alias for backwards compatibility
8
+ static MCPClient = MCPClientImpl;
9
+ name;
10
+ config;
11
+ connected = false;
12
+ tools = [];
13
+ process = null;
14
+ websocket = null;
15
+ requestId = 0;
16
+ pendingRequests = new Map();
17
+ buffer = "";
18
+ onLog;
19
+ constructor(options) {
20
+ this.name = options.name;
21
+ this.config = options.config;
22
+ this.onLog = options.onLog;
23
+ }
24
+ async connect() {
25
+ if (this.config.type === "stdio") {
26
+ await this.connectStdio();
27
+ }
28
+ else if (this.config.type === "http" || this.config.type === "sse") {
29
+ await this.connectHttp();
30
+ }
31
+ else if (this.config.type === "ws") {
32
+ await this.connectWebSocket();
33
+ }
34
+ }
35
+ async connectStdio() {
36
+ if (!this.config.command) {
37
+ throw new Error("No command specified for stdio transport");
38
+ }
39
+ this.log(`Starting stdio transport: ${this.config.command}`);
40
+ this.process = spawn(this.config.command, this.config.args || [], {
41
+ env: { ...process.env, ...this.config.env },
42
+ stdio: ["pipe", "pipe", "pipe"],
43
+ });
44
+ this.process.stdout?.on("data", (data) => {
45
+ this.handleData(data.toString());
46
+ });
47
+ this.process.stderr?.on("data", (data) => {
48
+ this.log(`stderr: ${data.toString()}`);
49
+ });
50
+ this.process.on("error", (error) => {
51
+ this.log(`Process error: ${error.message}`);
52
+ });
53
+ this.process.on("close", (code) => {
54
+ this.log(`Process closed with code ${code}`);
55
+ this.connected = false;
56
+ });
57
+ // Wait for process to start
58
+ await new Promise((resolve) => setTimeout(resolve, 100));
59
+ // Initialize connection
60
+ await this.initialize();
61
+ }
62
+ async connectHttp() {
63
+ if (!this.config.url) {
64
+ throw new Error("No URL specified for HTTP transport");
65
+ }
66
+ this.log(`Starting HTTP transport: ${this.config.url}`);
67
+ // For HTTP transport, we just validate the endpoint
68
+ try {
69
+ const response = await fetch(this.config.url, {
70
+ method: "POST",
71
+ headers: {
72
+ "Content-Type": "application/json",
73
+ ...this.config.headers,
74
+ },
75
+ body: JSON.stringify({
76
+ jsonrpc: "2.0",
77
+ id: 1,
78
+ method: "initialize",
79
+ params: {
80
+ protocolVersion: "2024-11-05",
81
+ capabilities: {},
82
+ clientInfo: {
83
+ name: "coder",
84
+ version: "0.1.0",
85
+ },
86
+ },
87
+ }),
88
+ });
89
+ if (!response.ok) {
90
+ throw new Error(`HTTP error: ${response.status}`);
91
+ }
92
+ const result = (await response.json());
93
+ this.connected = true;
94
+ // Get tools
95
+ await this.loadTools();
96
+ }
97
+ catch (error) {
98
+ const errorMessage = error instanceof Error ? error.message : String(error);
99
+ throw new Error(`Failed to connect to HTTP server: ${errorMessage}`);
100
+ }
101
+ }
102
+ async connectWebSocket() {
103
+ if (!this.config.url) {
104
+ throw new Error("No URL specified for WebSocket transport");
105
+ }
106
+ const url = this.config.url;
107
+ this.log(`Starting WebSocket transport: ${url}`);
108
+ return new Promise((resolve, reject) => {
109
+ const headers = {
110
+ ...this.config.headers,
111
+ };
112
+ const ws = new WebSocket(url, {
113
+ headers,
114
+ handshakeTimeout: this.config.timeout || 30000,
115
+ });
116
+ ws.on("open", () => {
117
+ this.log("WebSocket connection established");
118
+ this.websocket = ws;
119
+ this.connected = true;
120
+ // Initialize the MCP connection
121
+ this.initialize()
122
+ .then(() => resolve())
123
+ .catch((error) => {
124
+ const errorMessage = error instanceof Error ? error.message : String(error);
125
+ this.log(`Initialization failed: ${errorMessage}`);
126
+ reject(error);
127
+ });
128
+ });
129
+ ws.on("message", (data, isBinary) => {
130
+ const message = isBinary ? data.toString() : data.toString();
131
+ this.handleData(message);
132
+ });
133
+ ws.on("error", (error) => {
134
+ this.log(`WebSocket error: ${error.message}`);
135
+ if (!this.connected) {
136
+ reject(new Error(`WebSocket connection failed: ${error.message}`));
137
+ }
138
+ });
139
+ ws.on("close", (code, reason) => {
140
+ this.log(`WebSocket closed: code=${code}, reason=${reason.toString()}`);
141
+ this.connected = false;
142
+ this.websocket = null;
143
+ // Reject any pending requests
144
+ for (const [id, pending] of this.pendingRequests) {
145
+ this.pendingRequests.delete(id);
146
+ pending.reject(new Error(`WebSocket closed: ${reason.toString()}`));
147
+ }
148
+ });
149
+ ws.on("ping", () => {
150
+ ws.pong();
151
+ });
152
+ });
153
+ }
154
+ async initialize() {
155
+ const result = await this.request("initialize", {
156
+ protocolVersion: "2024-11-05",
157
+ capabilities: {
158
+ tools: {},
159
+ resources: {},
160
+ prompts: {},
161
+ },
162
+ clientInfo: {
163
+ name: "coder",
164
+ version: "0.1.0",
165
+ },
166
+ });
167
+ this.log(`Initialized with: ${JSON.stringify(result)}`);
168
+ this.connected = true;
169
+ // Send initialized notification
170
+ this.notify("notifications/initialized", {});
171
+ // Load tools
172
+ await this.loadTools();
173
+ }
174
+ async loadTools() {
175
+ try {
176
+ const result = (await this.request("tools/list", {}));
177
+ this.tools = result.tools.map((tool) => ({
178
+ name: tool.name,
179
+ description: tool.description,
180
+ inputSchema: tool.inputSchema,
181
+ }));
182
+ this.log(`Loaded ${this.tools.length} tools`);
183
+ }
184
+ catch (error) {
185
+ this.log(`Failed to load tools: ${error}`);
186
+ }
187
+ }
188
+ async callTool(name, args) {
189
+ const result = (await this.request("tools/call", {
190
+ name,
191
+ arguments: args,
192
+ }));
193
+ const text = result.content
194
+ .filter((c) => c.type === "text")
195
+ .map((c) => c.text || "")
196
+ .join("\n");
197
+ return {
198
+ content: text,
199
+ };
200
+ }
201
+ async request(method, params) {
202
+ const id = ++this.requestId;
203
+ const request = {
204
+ jsonrpc: "2.0",
205
+ id,
206
+ method,
207
+ params,
208
+ };
209
+ return new Promise((resolve, reject) => {
210
+ this.pendingRequests.set(id, { resolve, reject });
211
+ const message = JSON.stringify(request);
212
+ // Send via WebSocket or stdio depending on transport type
213
+ if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
214
+ this.websocket.send(message);
215
+ }
216
+ else if (this.process?.stdin?.writable) {
217
+ this.process.stdin.write(message + "\n");
218
+ }
219
+ else {
220
+ this.pendingRequests.delete(id);
221
+ reject(new Error("No active connection to send request"));
222
+ return;
223
+ }
224
+ // Timeout
225
+ setTimeout(() => {
226
+ if (this.pendingRequests.has(id)) {
227
+ this.pendingRequests.delete(id);
228
+ reject(new Error(`Request timeout for ${method}`));
229
+ }
230
+ }, this.config.timeout || 120000);
231
+ });
232
+ }
233
+ notify(method, params) {
234
+ const notification = {
235
+ jsonrpc: "2.0",
236
+ method,
237
+ params,
238
+ };
239
+ const message = JSON.stringify(notification);
240
+ // Send via WebSocket or stdio depending on transport type
241
+ if (this.websocket && this.websocket.readyState === WebSocket.OPEN) {
242
+ this.websocket.send(message);
243
+ }
244
+ else if (this.process?.stdin?.writable) {
245
+ this.process.stdin.write(message + "\n");
246
+ }
247
+ }
248
+ handleData(data) {
249
+ this.buffer += data;
250
+ const lines = this.buffer.split("\n");
251
+ this.buffer = lines.pop() || "";
252
+ for (const line of lines) {
253
+ if (!line.trim())
254
+ continue;
255
+ try {
256
+ const response = JSON.parse(line);
257
+ if (response.id !== undefined) {
258
+ const pending = this.pendingRequests.get(response.id);
259
+ if (pending) {
260
+ this.pendingRequests.delete(response.id);
261
+ if (response.error) {
262
+ pending.reject(new Error(response.error.message));
263
+ }
264
+ else {
265
+ pending.resolve(response.result);
266
+ }
267
+ }
268
+ }
269
+ }
270
+ catch (error) {
271
+ this.log(`Parse error: ${error}`);
272
+ }
273
+ }
274
+ }
275
+ async close() {
276
+ if (this.websocket) {
277
+ this.websocket.close();
278
+ this.websocket = null;
279
+ }
280
+ if (this.process) {
281
+ this.process.kill();
282
+ this.process = null;
283
+ }
284
+ this.connected = false;
285
+ }
286
+ log(message) {
287
+ this.onLog?.(`[MCP:${this.name}] ${message}`);
288
+ }
289
+ }
290
+ /**
291
+ * Create MCP clients from config
292
+ */
293
+ export async function createMCPClients(servers, onLog) {
294
+ const clients = new Map();
295
+ for (const [name, config] of Object.entries(servers)) {
296
+ if (config.disabled)
297
+ continue;
298
+ const client = new MCPClientImpl({ name, config, onLog });
299
+ try {
300
+ await client.connect();
301
+ clients.set(name, client);
302
+ }
303
+ catch (error) {
304
+ const errorMessage = error instanceof Error ? error.message : String(error);
305
+ onLog?.(`[MCP:${name}] Failed to connect: ${errorMessage}`);
306
+ }
307
+ }
308
+ return clients;
309
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * UI Components for Coder CLI
3
+ */
4
+ export { Spinner, getSpinner, resetSpinner, defaultFrames, dotFrames, arrowFrames, defaultTips, toolTips, streamingTips, type SpinnerOptions, type SpinnerColor, type SpinnerState, } from "./spinner.js";
5
+ export { LoadingState, getLoadingState, setLoading, stopLoading, updateLoading, startTool, endTool, type LoadingPhase, type LoadingStateData, type LoadingStateEvents, } from "./terminal/shared/loading-state.js";
6
+ export { VERSION, BUILD_TIME, renderStatusLine, renderCompactStatusLine, renderMinimalStatusLine, renderFooterStatus, renderAutoCompactWarning, calculateContextInfo, formatPermissionMode, formatTokenCount, formatContextPercent, getContextWindow, shouldShowAutoCompactWarning, getModelDisplayName, getPermissionModeDisplay, type StatusLineOptions, type ContextInfo, } from "./terminal/shared/status-line.js";
7
+ export { TUIFooter, getTUIFooter, enableTUIFooter, disableTUIFooter, renderTUIFooter, clearTUIFooter, ANSI, type TUIFooterOptions, type TUIFooterState, } from "./terminal/tui/tui-footer.js";
8
+ export { createTUIApp, type TUIAppProps, type TUIAppHandle, type Message as TUIMessage, } from "./terminal/tui/tui-app.js";
9
+ export { default as TUIApp } from "./terminal/tui/tui-app.js";
10
+ /**
11
+ * Progress update for tool execution
12
+ */
13
+ export interface ProgressUpdate {
14
+ toolName: string;
15
+ status: "pending" | "running" | "complete" | "error";
16
+ message?: string;
17
+ progress?: number;
18
+ timestamp: number;
19
+ }
20
+ /**
21
+ * Progress callback type for tool context
22
+ */
23
+ export type ProgressCallback = (update: ProgressUpdate) => void;
24
+ /**
25
+ * Create a progress callback for a specific tool
26
+ */
27
+ export declare function createProgressCallback(toolName: string, onProgress?: (message: string) => void): ProgressCallback;
28
+ /**
29
+ * Format elapsed time for display
30
+ */
31
+ export declare function formatElapsedTime(ms: number): string;
32
+ /**
33
+ * Format a loading message with optional phase
34
+ */
35
+ export declare function formatLoadingMessage(phase: string, message?: string, elapsedTime?: number): string;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../packages/src/interfaces/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,WAAW,EACX,QAAQ,EACR,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,aAAa,EACb,SAAS,EACT,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EACL,OAAO,EACP,UAAU,EACV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,WAAW,GACjB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EACL,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,IAAI,EACJ,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,OAAO,IAAI,UAAU,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAM9D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAEhE;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,gBAAgB,CAOlB;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAoBpD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAYR"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * UI Components for Coder CLI
3
+ */
4
+ // Spinner
5
+ export { Spinner, getSpinner, resetSpinner, defaultFrames, dotFrames, arrowFrames, defaultTips, toolTips, streamingTips, } from "./spinner.js";
6
+ // Loading State (from shared)
7
+ export { LoadingState, getLoadingState, setLoading, stopLoading, updateLoading, startTool, endTool, } from "./terminal/shared/loading-state.js";
8
+ // Status Line (from shared)
9
+ export { VERSION, BUILD_TIME, renderStatusLine, renderCompactStatusLine, renderMinimalStatusLine, renderFooterStatus, renderAutoCompactWarning, calculateContextInfo, formatPermissionMode, formatTokenCount, formatContextPercent, getContextWindow, shouldShowAutoCompactWarning, getModelDisplayName, getPermissionModeDisplay, } from "./terminal/shared/status-line.js";
10
+ // TUI Footer (from tui)
11
+ export { TUIFooter, getTUIFooter, enableTUIFooter, disableTUIFooter, renderTUIFooter, clearTUIFooter, ANSI, } from "./terminal/tui/tui-footer.js";
12
+ // TUI App (Ink-based, from tui)
13
+ export { createTUIApp, } from "./terminal/tui/tui-app.js";
14
+ export { default as TUIApp } from "./terminal/tui/tui-app.js";
15
+ /**
16
+ * Create a progress callback for a specific tool
17
+ */
18
+ export function createProgressCallback(toolName, onProgress) {
19
+ return (update) => {
20
+ if (onProgress) {
21
+ const message = update.message || `${update.toolName}: ${update.status}`;
22
+ onProgress(message);
23
+ }
24
+ };
25
+ }
26
+ // ============================================
27
+ // UTILITY FUNCTIONS
28
+ // ============================================
29
+ /**
30
+ * Format elapsed time for display
31
+ */
32
+ export function formatElapsedTime(ms) {
33
+ if (ms < 1000) {
34
+ return `${ms}ms`;
35
+ }
36
+ const seconds = Math.floor(ms / 1000);
37
+ if (seconds < 60) {
38
+ return `${seconds}s`;
39
+ }
40
+ const minutes = Math.floor(seconds / 60);
41
+ const remainingSeconds = seconds % 60;
42
+ if (minutes < 60) {
43
+ return `${minutes}m${remainingSeconds}s`;
44
+ }
45
+ const hours = Math.floor(minutes / 60);
46
+ const remainingMinutes = minutes % 60;
47
+ return `${hours}h${remainingMinutes}m`;
48
+ }
49
+ /**
50
+ * Format a loading message with optional phase
51
+ */
52
+ export function formatLoadingMessage(phase, message, elapsedTime) {
53
+ let result = phase;
54
+ if (message) {
55
+ result = `${result}: ${message}`;
56
+ }
57
+ if (elapsedTime !== undefined && elapsedTime > 0) {
58
+ result = `${result} [${formatElapsedTime(elapsedTime)}]`;
59
+ }
60
+ return result;
61
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Spinner Component for Coder CLI
3
+ *
4
+ * Re-exports spinner frames from tui/spinner.ts for backward compatibility.
5
+ */
6
+ import { spinnerFrames, dotSpinnerFrames, asciiSpinnerFrames, arrowSpinnerFrames, simpleDotFrames } from "./terminal/tui/spinner.js";
7
+ export { spinnerFrames, dotSpinnerFrames, asciiSpinnerFrames, arrowSpinnerFrames, simpleDotFrames, };
8
+ export declare const defaultFrames: readonly ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
9
+ export declare const dotFrames: readonly [". ", ".. ", "...", " "];
10
+ export declare const arrowFrames: readonly ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"];
11
+ export interface SpinnerOptions {
12
+ /** Tip text shown below spinner */
13
+ tip?: string;
14
+ /** Color override */
15
+ color?: SpinnerColor;
16
+ /** Show elapsed time */
17
+ showTime?: boolean;
18
+ /** Tool activity indicator */
19
+ hasActiveTools?: boolean;
20
+ /** Suffix text after spinner */
21
+ suffix?: string;
22
+ /** Verbose mode - show more details */
23
+ verbose?: boolean;
24
+ /** Spinner text prefix */
25
+ prefix?: string;
26
+ /** Disable spinner (for --no-progress) */
27
+ disabled?: boolean;
28
+ }
29
+ export type SpinnerColor = "cyan" | "green" | "yellow" | "blue" | "magenta" | "red" | "white" | "gray";
30
+ export interface SpinnerState {
31
+ isSpinning: boolean;
32
+ startTime: number;
33
+ totalPausedMs: number;
34
+ pauseStartTime: number | null;
35
+ currentTip: string;
36
+ responseLength: number;
37
+ }
38
+ /** Rotating tips shown during loading */
39
+ export declare const defaultTips: string[];
40
+ /** Tips shown during tool execution */
41
+ export declare const toolTips: string[];
42
+ /** Tips shown during API streaming */
43
+ export declare const streamingTips: string[];
44
+ export declare class Spinner {
45
+ private ora;
46
+ private state;
47
+ private options;
48
+ private tipInterval;
49
+ private tipIndex;
50
+ private customTips;
51
+ constructor(options?: SpinnerOptions);
52
+ /**
53
+ * Start the spinner
54
+ */
55
+ start(text?: string): this;
56
+ /**
57
+ * Stop the spinner
58
+ */
59
+ stop(options?: {
60
+ clear?: boolean;
61
+ text?: string;
62
+ symbol?: string;
63
+ }): this;
64
+ /**
65
+ * Stop with success message
66
+ */
67
+ succeed(text?: string): this;
68
+ /**
69
+ * Stop with failure message
70
+ */
71
+ fail(text?: string): this;
72
+ /**
73
+ * Stop with warning message
74
+ */
75
+ warn(text?: string): this;
76
+ /**
77
+ * Stop with info message
78
+ */
79
+ info(text?: string): this;
80
+ /**
81
+ * Update spinner text
82
+ */
83
+ update(text: string): this;
84
+ /**
85
+ * Update the tip text (shown below main text)
86
+ */
87
+ updateTip(tip: string): this;
88
+ /**
89
+ * Set custom tips for rotation
90
+ */
91
+ setTips(tips: string[]): this;
92
+ /**
93
+ * Update response length (for streaming progress)
94
+ */
95
+ updateResponseLength(length: number): this;
96
+ /**
97
+ * Set tool activity state
98
+ */
99
+ setToolActivity(active: boolean): this;
100
+ /**
101
+ * Pause spinner (for user input, etc.)
102
+ */
103
+ pause(): this;
104
+ /**
105
+ * Resume spinner after pause
106
+ */
107
+ resume(): this;
108
+ /**
109
+ * Get elapsed time in seconds (excluding pauses)
110
+ */
111
+ getElapsedSeconds(): number;
112
+ /**
113
+ * Get current state
114
+ */
115
+ getState(): SpinnerState;
116
+ /**
117
+ * Check if spinner is active
118
+ */
119
+ isActive(): boolean;
120
+ /**
121
+ * Clear the spinner line
122
+ */
123
+ clear(): this;
124
+ /**
125
+ * Render spinner frame manually (for non-TTY)
126
+ */
127
+ renderFrame(): string;
128
+ private buildText;
129
+ private startTipRotation;
130
+ private stopTipRotation;
131
+ }
132
+ /**
133
+ * Get or create global spinner instance
134
+ */
135
+ export declare function getSpinner(options?: SpinnerOptions): Spinner;
136
+ /**
137
+ * Reset global spinner (for testing)
138
+ */
139
+ export declare function resetSpinner(): void;
140
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../packages/src/interfaces/ui/spinner.ts"],"names":[],"mappings":"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"}