@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,587 @@
1
+ /**
2
+ * Session Store - Composable session management
3
+ * Composes persistence, metadata, and export modules
4
+ */
5
+
6
+ import { homedir } from "os";
7
+ import { join } from "path";
8
+ import type {
9
+ Message,
10
+ QueryMetrics,
11
+ ContentBlock,
12
+ ToolUseBlock,
13
+ ToolResultBlock,
14
+ } from "../../types/index.js";
15
+ import type {
16
+ SessionMetadata,
17
+ SessionMessage,
18
+ SessionToolUse,
19
+ SessionMetrics,
20
+ SessionContext,
21
+ SessionEntry,
22
+ SessionCheckpoint,
23
+ LoadedSession,
24
+ SessionSummary,
25
+ SessionFilter,
26
+ SessionEventHandler,
27
+ ExportFormat,
28
+ } from "./types.js";
29
+ import { SessionPersistence } from "./persistence.js";
30
+ import { SessionMetadataManager } from "./metadata.js";
31
+ import { SessionExporter } from "./export.js";
32
+
33
+ // Re-export types for convenience
34
+ export * from "./types.js";
35
+ export { SessionPersistence } from "./persistence.js";
36
+ export { SessionMetadataManager } from "./metadata.js";
37
+ export { SessionExporter } from "./export.js";
38
+
39
+ /**
40
+ * Main SessionStore class
41
+ * Composes persistence, metadata, and export functionality
42
+ */
43
+ export class SessionStore {
44
+ private persistence: SessionPersistence;
45
+ private metadataManager: SessionMetadataManager;
46
+ private exporter: SessionExporter;
47
+
48
+ private currentSessionId: string | null = null;
49
+ private currentMetadata: SessionMetadata | null = null;
50
+ private eventHandlers: Set<SessionEventHandler> = new Set();
51
+
52
+ constructor(sessionsDir?: string) {
53
+ const dir = sessionsDir ?? join(homedir(), ".claude", "sessions");
54
+ this.persistence = new SessionPersistence(dir);
55
+ this.metadataManager = new SessionMetadataManager(this.persistence);
56
+ this.exporter = new SessionExporter(this.persistence);
57
+ }
58
+
59
+ // ============================================
60
+ // INITIALIZATION
61
+ // ============================================
62
+
63
+ /**
64
+ * Initialize the sessions directory
65
+ */
66
+ async init(): Promise<void> {
67
+ await this.persistence.init();
68
+ }
69
+
70
+ /**
71
+ * Get the sessions directory path
72
+ */
73
+ getSessionsDir(): string {
74
+ return this.persistence.getSessionsDir();
75
+ }
76
+
77
+ /**
78
+ * Get the file path for a specific session
79
+ */
80
+ getSessionPath(sessionId: string): string {
81
+ return this.persistence.getSessionPath(sessionId);
82
+ }
83
+
84
+ // ============================================
85
+ // EVENT HANDLING
86
+ // ============================================
87
+
88
+ /**
89
+ * Subscribe to session events
90
+ */
91
+ onEvent(handler: SessionEventHandler): () => void {
92
+ this.eventHandlers.add(handler);
93
+ return () => this.eventHandlers.delete(handler);
94
+ }
95
+
96
+ /**
97
+ * Emit a session event
98
+ */
99
+ private async emit(
100
+ type: SessionEventHandler extends (event: infer E) => void ? E : never
101
+ ): Promise<void> {
102
+ const event = { ...type, timestamp: type.timestamp ?? Date.now() };
103
+
104
+ await Promise.all(
105
+ [...this.eventHandlers].map((handler) => handler(event))
106
+ );
107
+ }
108
+
109
+ // ============================================
110
+ // SESSION CREATION & MANAGEMENT
111
+ // ============================================
112
+
113
+ /**
114
+ * Create a new session (or reuse existing empty session)
115
+ */
116
+ async createSession(options: {
117
+ model: string;
118
+ workingDirectory: string;
119
+ agentName?: string;
120
+ agentColor?: string;
121
+ teamName?: string;
122
+ }): Promise<string> {
123
+ await this.init();
124
+
125
+ // Try to find an existing empty session to reuse
126
+ const sessions = await this.listSessions(20);
127
+ const emptySession = sessions.find((s) => s.messageCount === 0);
128
+
129
+ if (emptySession) {
130
+ // Reuse the empty session
131
+ this.currentSessionId = emptySession.id;
132
+ this.currentMetadata = this.metadataManager.createMetadata({
133
+ id: emptySession.id,
134
+ ...options,
135
+ });
136
+
137
+ await this.persistence.append(emptySession.id, this.currentMetadata);
138
+
139
+ await this.emit({
140
+ type: "resumed",
141
+ sessionId: emptySession.id,
142
+ timestamp: Date.now(),
143
+ data: { reused: true },
144
+ });
145
+
146
+ return emptySession.id;
147
+ }
148
+
149
+ // No empty session found, create new
150
+ const sessionId = this.metadataManager.generateId();
151
+ this.currentSessionId = sessionId;
152
+ this.currentMetadata = this.metadataManager.createMetadata({
153
+ id: sessionId,
154
+ ...options,
155
+ });
156
+
157
+ await this.persistence.append(sessionId, this.currentMetadata);
158
+
159
+ // Write context entry
160
+ const context: SessionContext = {
161
+ type: "context",
162
+ timestamp: Date.now(),
163
+ workingDirectory: options.workingDirectory,
164
+ };
165
+ await this.persistence.append(sessionId, context);
166
+
167
+ await this.emit({
168
+ type: "created",
169
+ sessionId,
170
+ timestamp: Date.now(),
171
+ data: this.currentMetadata,
172
+ });
173
+
174
+ return sessionId;
175
+ }
176
+
177
+ /**
178
+ * Resume an existing session
179
+ */
180
+ async resumeSession(sessionId: string): Promise<LoadedSession | null> {
181
+ const entries = await this.persistence.read(sessionId);
182
+
183
+ if (entries.length === 0) {
184
+ return null;
185
+ }
186
+
187
+ const session = this.parseEntries(entries);
188
+ session.metadata.id = sessionId; // Ensure ID is set
189
+
190
+ this.currentSessionId = sessionId;
191
+ this.currentMetadata = session.metadata;
192
+
193
+ await this.emit({
194
+ type: "resumed",
195
+ sessionId,
196
+ timestamp: Date.now(),
197
+ data: session.metadata,
198
+ });
199
+
200
+ return session;
201
+ }
202
+
203
+ /**
204
+ * Parse session entries into structured session
205
+ */
206
+ private parseEntries(entries: SessionEntry[]): LoadedSession {
207
+ let metadata: SessionMetadata | null = null;
208
+ const messages: Message[] = [];
209
+ const tools: SessionToolUse[] = [];
210
+ const metrics: QueryMetrics[] = [];
211
+ let context: SessionContext | null = null;
212
+ const checkpoints: SessionCheckpoint[] = [];
213
+
214
+ for (const entry of entries) {
215
+ // All entries have explicit type field now
216
+ switch (entry.type) {
217
+ case "metadata":
218
+ metadata = entry as SessionMetadata;
219
+ break;
220
+ case "message":
221
+ messages.push((entry as SessionMessage).data);
222
+ break;
223
+ case "tool_use":
224
+ tools.push(entry as SessionToolUse);
225
+ break;
226
+ case "metrics":
227
+ metrics.push((entry as SessionMetrics).data);
228
+ break;
229
+ case "context":
230
+ context = entry as SessionContext;
231
+ break;
232
+ case "checkpoint":
233
+ checkpoints.push(entry as SessionCheckpoint);
234
+ break;
235
+ }
236
+ }
237
+
238
+ if (!metadata) {
239
+ metadata = this.metadataManager.createMetadata({
240
+ model: "claude-sonnet-4-6",
241
+ workingDirectory: process.cwd(),
242
+ });
243
+ }
244
+
245
+ return {
246
+ metadata,
247
+ messages,
248
+ tools,
249
+ metrics,
250
+ context,
251
+ checkpoints,
252
+ };
253
+ }
254
+
255
+ /**
256
+ * Delete a session
257
+ */
258
+ async deleteSession(sessionId: string): Promise<boolean> {
259
+ const deleted = await this.persistence.delete(sessionId);
260
+
261
+ if (deleted) {
262
+ await this.emit({
263
+ type: "deleted",
264
+ sessionId,
265
+ timestamp: Date.now(),
266
+ });
267
+
268
+ if (this.currentSessionId === sessionId) {
269
+ this.currentSessionId = null;
270
+ this.currentMetadata = null;
271
+ }
272
+ }
273
+
274
+ return deleted;
275
+ }
276
+
277
+ // ============================================
278
+ // DATA SAVING
279
+ // ============================================
280
+
281
+ /**
282
+ * Save a message to the current session
283
+ */
284
+ async saveMessage(message: Message): Promise<void> {
285
+ if (!this.currentSessionId) {
286
+ throw new Error("No active session");
287
+ }
288
+
289
+ const entry: SessionMessage = {
290
+ type: "message",
291
+ timestamp: Date.now(),
292
+ data: message,
293
+ };
294
+
295
+ await this.persistence.append(this.currentSessionId, entry);
296
+
297
+ await this.emit({
298
+ type: "message_saved",
299
+ sessionId: this.currentSessionId,
300
+ timestamp: Date.now(),
301
+ data: message,
302
+ });
303
+ }
304
+
305
+ /**
306
+ * Save a tool use to the current session
307
+ */
308
+ async saveToolUse(
309
+ toolId: string,
310
+ toolName: string,
311
+ input: Record<string, unknown>,
312
+ result?: string,
313
+ isError?: boolean
314
+ ): Promise<void> {
315
+ if (!this.currentSessionId) {
316
+ throw new Error("No active session");
317
+ }
318
+
319
+ const entry: SessionToolUse = {
320
+ type: "tool_use",
321
+ timestamp: Date.now(),
322
+ toolId,
323
+ toolName,
324
+ input,
325
+ result,
326
+ isError,
327
+ };
328
+
329
+ await this.persistence.append(this.currentSessionId, entry);
330
+ }
331
+
332
+ /**
333
+ * Save metrics to the current session
334
+ */
335
+ async saveMetrics(metrics: QueryMetrics): Promise<void> {
336
+ if (!this.currentSessionId) {
337
+ throw new Error("No active session");
338
+ }
339
+
340
+ const entry: SessionMetrics = {
341
+ type: "metrics",
342
+ timestamp: Date.now(),
343
+ data: metrics,
344
+ };
345
+
346
+ await this.persistence.append(this.currentSessionId, entry);
347
+
348
+ // Update running totals in metadata
349
+ if (this.currentMetadata) {
350
+ this.currentMetadata.totalCost =
351
+ (this.currentMetadata.totalCost ?? 0) + metrics.costUSD;
352
+ this.currentMetadata.totalTokens = {
353
+ input:
354
+ (this.currentMetadata.totalTokens?.input ?? 0) +
355
+ metrics.usage.input_tokens,
356
+ output:
357
+ (this.currentMetadata.totalTokens?.output ?? 0) +
358
+ metrics.usage.output_tokens,
359
+ };
360
+ }
361
+
362
+ await this.emit({
363
+ type: "metrics_saved",
364
+ sessionId: this.currentSessionId,
365
+ timestamp: Date.now(),
366
+ data: metrics,
367
+ });
368
+ }
369
+
370
+ // ============================================
371
+ // LISTING & QUERYING
372
+ // ============================================
373
+
374
+ /**
375
+ * List recent sessions
376
+ */
377
+ async listSessions(limit: number = 20, filter?: SessionFilter): Promise<SessionSummary[]> {
378
+ await this.init();
379
+
380
+ const files = await this.persistence.listFiles();
381
+
382
+ // Get modification times for sorting
383
+ const modTimes = await this.persistence.getModificationTimes(files);
384
+
385
+ // Sort by modification time (newest first)
386
+ const sortedFiles = files.sort((a, b) => {
387
+ const timeA = modTimes.get(a)?.getTime() ?? 0;
388
+ const timeB = modTimes.get(b)?.getTime() ?? 0;
389
+ return timeB - timeA;
390
+ });
391
+
392
+ // Parse summaries
393
+ const sessions: SessionSummary[] = [];
394
+
395
+ for (const sessionId of sortedFiles.slice(0, limit * 2)) {
396
+ const summary = await this.metadataManager.getSummary(sessionId);
397
+ if (summary) {
398
+ sessions.push(summary);
399
+ }
400
+ }
401
+
402
+ // Apply filter if provided
403
+ const filtered = filter
404
+ ? this.metadataManager.filterSessions(sessions, filter)
405
+ : sessions;
406
+
407
+ // Sort by last activity
408
+ const sorted = this.metadataManager.sortSessions(
409
+ filtered,
410
+ "lastActivity",
411
+ "desc"
412
+ );
413
+
414
+ return sorted.slice(0, limit);
415
+ }
416
+
417
+ /**
418
+ * Get session summary by ID
419
+ */
420
+ async getSessionSummary(sessionId: string): Promise<SessionSummary | null> {
421
+ return this.metadataManager.getSummary(sessionId);
422
+ }
423
+
424
+ /**
425
+ * Find empty sessions
426
+ */
427
+ async findEmptySessions(): Promise<SessionSummary[]> {
428
+ const sessions = await this.listSessions(100);
429
+ return this.metadataManager.findEmptySessions(sessions);
430
+ }
431
+
432
+ /**
433
+ * Clean up empty sessions (delete them)
434
+ */
435
+ async cleanupEmptySessions(): Promise<number> {
436
+ const empty = await this.findEmptySessions();
437
+ let deleted = 0;
438
+
439
+ for (const session of empty) {
440
+ // Don't delete the current session even if empty
441
+ if (session.id === this.currentSessionId) {
442
+ continue;
443
+ }
444
+
445
+ const success = await this.deleteSession(session.id);
446
+ if (success) {
447
+ deleted++;
448
+ }
449
+ }
450
+
451
+ return deleted;
452
+ }
453
+
454
+ // ============================================
455
+ // EXPORT
456
+ // ============================================
457
+
458
+ /**
459
+ * Export session to a file
460
+ */
461
+ async exportSession(
462
+ sessionId: string,
463
+ format: ExportFormat,
464
+ outputPath?: string
465
+ ): Promise<string> {
466
+ const session = await this.resumeSession(sessionId);
467
+ if (!session) {
468
+ throw new Error(`Session not found: ${sessionId}`);
469
+ }
470
+
471
+ let content: string;
472
+ let defaultExt: string;
473
+
474
+ switch (format) {
475
+ case "jsonl": {
476
+ const sessionFile = this.persistence.getSessionPath(sessionId);
477
+ content = await Bun.file(sessionFile).text();
478
+ defaultExt = "jsonl";
479
+ break;
480
+ }
481
+
482
+ case "json": {
483
+ content = this.exporter.export(session, "json");
484
+ defaultExt = "json";
485
+ break;
486
+ }
487
+
488
+ case "markdown": {
489
+ content = this.exporter.export(session, "markdown");
490
+ defaultExt = "md";
491
+ break;
492
+ }
493
+
494
+ default:
495
+ throw new Error(`Unsupported format: ${format}`);
496
+ }
497
+
498
+ const finalPath =
499
+ outputPath ?? join(process.cwd(), `session-${sessionId}.${defaultExt}`);
500
+ await Bun.write(finalPath, content);
501
+
502
+ return finalPath;
503
+ }
504
+
505
+ // ============================================
506
+ // CURRENT SESSION ACCESSORS
507
+ // ============================================
508
+
509
+ /**
510
+ * Get the current session ID
511
+ */
512
+ getCurrentSessionId(): string | null {
513
+ return this.currentSessionId;
514
+ }
515
+
516
+ /**
517
+ * Get the current session metadata
518
+ */
519
+ getCurrentMetadata(): SessionMetadata | null {
520
+ return this.currentMetadata;
521
+ }
522
+
523
+ /**
524
+ * Update current session metadata
525
+ */
526
+ updateMetadata(updates: Partial<SessionMetadata>): void {
527
+ if (this.currentMetadata) {
528
+ this.currentMetadata = this.metadataManager.merge(
529
+ this.currentMetadata,
530
+ updates
531
+ );
532
+ }
533
+ }
534
+
535
+ // ============================================
536
+ // UTILITY
537
+ // ============================================
538
+
539
+ /**
540
+ * Check if a session exists
541
+ */
542
+ async sessionExists(sessionId: string): Promise<boolean> {
543
+ return this.persistence.exists(sessionId);
544
+ }
545
+
546
+ /**
547
+ * Get session statistics
548
+ */
549
+ async getStats(): Promise<{
550
+ totalSessions: number;
551
+ totalMessages: number;
552
+ totalCost: number;
553
+ emptySessions: number;
554
+ }> {
555
+ const sessions = await this.listSessions(1000);
556
+ const stats = this.metadataManager.calculateStats(sessions);
557
+ const empty = this.metadataManager.findEmptySessions(sessions);
558
+
559
+ return {
560
+ totalSessions: stats.totalSessions,
561
+ totalMessages: stats.totalMessages,
562
+ totalCost: stats.totalCost,
563
+ emptySessions: empty.length,
564
+ };
565
+ }
566
+ }
567
+
568
+ // ============================================
569
+ // HELPER FUNCTIONS (for CLI compatibility)
570
+ // ============================================
571
+
572
+ /**
573
+ * Format a session summary for display
574
+ */
575
+ export function formatSessionSummary(session: SessionSummary): string {
576
+ return SessionExporter.formatSummary(session);
577
+ }
578
+
579
+ /**
580
+ * Print sessions list for CLI
581
+ */
582
+ export function printSessionsList(sessions: SessionSummary[]): void {
583
+ SessionExporter.printList(sessions);
584
+ }
585
+
586
+ // Default export for convenience
587
+ export default SessionStore;