@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,5 @@
1
+ /**
2
+ * Compaction Tests - Context compaction strategies
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=compaction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/compaction.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Compaction Tests - Context compaction strategies
3
+ */
4
+ import { describe, it, expect, beforeEach } from "bun:test";
5
+ import { handleProactiveCompaction, handleReactiveCompaction, needsCompaction, DEFAULT_PROACTIVE_OPTIONS, DEFAULT_REACTIVE_OPTIONS, } from "../compaction.js";
6
+ import { LoopState } from "../loop-state.js";
7
+ // Helper to create messages with specific token counts
8
+ function createMessages(count, tokensPerMessage = 100) {
9
+ const messages = [];
10
+ const charsPerMessage = tokensPerMessage * 4; // ~4 chars per token
11
+ for (let i = 0; i < count; i++) {
12
+ messages.push({
13
+ role: i % 2 === 0 ? "user" : "assistant",
14
+ content: [{
15
+ type: "text",
16
+ text: "x".repeat(charsPerMessage) + ` Message ${i}`,
17
+ }],
18
+ });
19
+ }
20
+ return messages;
21
+ }
22
+ describe("DEFAULT_PROACTIVE_OPTIONS", () => {
23
+ it("should have correct default values", () => {
24
+ expect(DEFAULT_PROACTIVE_OPTIONS.keepFirst).toBe(0);
25
+ expect(DEFAULT_PROACTIVE_OPTIONS.keepLast).toBe(3);
26
+ expect(DEFAULT_PROACTIVE_OPTIONS.preserveToolPairs).toBe(true);
27
+ });
28
+ });
29
+ describe("DEFAULT_REACTIVE_OPTIONS", () => {
30
+ it("should have correct default values", () => {
31
+ expect(DEFAULT_REACTIVE_OPTIONS.keepFirst).toBe(0);
32
+ expect(DEFAULT_REACTIVE_OPTIONS.keepLast).toBe(3);
33
+ expect(DEFAULT_REACTIVE_OPTIONS.preserveToolPairs).toBe(true);
34
+ });
35
+ });
36
+ describe("needsCompaction", () => {
37
+ it("should return false for small message sets", () => {
38
+ const messages = createMessages(5, 1000); // 5 messages, high tokens
39
+ // Should not need compaction because not enough messages
40
+ expect(needsCompaction(messages, 4096)).toBe(false);
41
+ });
42
+ it("should return false when under threshold", () => {
43
+ const messages = createMessages(10, 50); // 10 messages, low tokens each
44
+ // Under 90% threshold
45
+ expect(needsCompaction(messages, 4096)).toBe(false);
46
+ });
47
+ it("should return true when over threshold", () => {
48
+ const messages = createMessages(10, 500); // 10 messages, high tokens
49
+ // Over 90% threshold
50
+ expect(needsCompaction(messages, 4096)).toBe(true);
51
+ });
52
+ it("should respect custom threshold", () => {
53
+ // Create messages that are exactly at a specific token count
54
+ // 10 messages * 200 tokens = 2000 tokens total
55
+ const messages = createMessages(10, 200);
56
+ // Total ~2000 tokens, at 90% of 2000 = 1800 threshold
57
+ // 2000 >= 1800, so needs compaction at 0.9 threshold
58
+ expect(needsCompaction(messages, 2000, 0.9)).toBe(true);
59
+ // At 99% threshold (1980), 2000 >= 1980, so still needs compaction
60
+ expect(needsCompaction(messages, 2000, 0.99)).toBe(true);
61
+ // At 101% threshold (2020), 2000 < 2020, so no compaction needed
62
+ expect(needsCompaction(messages, 2000, 1.01)).toBe(false);
63
+ });
64
+ });
65
+ describe("handleProactiveCompaction", () => {
66
+ let state;
67
+ beforeEach(() => {
68
+ // Create state with enough messages for compaction
69
+ const messages = createMessages(12, 500);
70
+ state = new LoopState(messages);
71
+ });
72
+ it("should return false when compaction not needed", async () => {
73
+ const smallState = new LoopState(createMessages(5, 50));
74
+ const result = await handleProactiveCompaction(smallState, 4096);
75
+ expect(result).toBe(false);
76
+ expect(smallState.compactionCount).toBe(0);
77
+ });
78
+ it("should apply compaction when needed", async () => {
79
+ const result = await handleProactiveCompaction(state, 4096);
80
+ // May or may not compact depending on actual token counts
81
+ // Just verify it doesn't throw
82
+ expect(typeof result).toBe("boolean");
83
+ });
84
+ it("should respect custom options", async () => {
85
+ const customOptions = {
86
+ keepFirst: 2,
87
+ keepLast: 5,
88
+ preserveToolPairs: false,
89
+ };
90
+ const result = await handleProactiveCompaction(state, 4096, customOptions);
91
+ expect(typeof result).toBe("boolean");
92
+ });
93
+ });
94
+ describe("handleReactiveCompaction", () => {
95
+ let state;
96
+ beforeEach(() => {
97
+ const messages = createMessages(12, 500);
98
+ state = new LoopState(messages);
99
+ });
100
+ it("should attempt compaction on any message set", async () => {
101
+ const result = await handleReactiveCompaction(state, 4096);
102
+ expect(typeof result).toBe("boolean");
103
+ });
104
+ it("should return false if compaction does not reduce tokens", async () => {
105
+ // Very small state that can't be compacted meaningfully
106
+ const smallState = new LoopState(createMessages(2, 100));
107
+ const result = await handleReactiveCompaction(smallState, 4096);
108
+ expect(result).toBe(false);
109
+ });
110
+ it("should increment compaction count on success", async () => {
111
+ const initialCount = state.compactionCount;
112
+ await handleReactiveCompaction(state, 1000); // Force compaction with low limit
113
+ // If compaction succeeded, count should increase
114
+ // (depends on actual token counts)
115
+ });
116
+ });
117
+ describe("compaction with tool pairs", () => {
118
+ it("should preserve tool use/result pairs when enabled", async () => {
119
+ const messages = [
120
+ { role: "user", content: [{ type: "text", text: "x".repeat(4000) }] },
121
+ { role: "assistant", content: [
122
+ { type: "tool_use", id: "tool1", name: "Read", input: { file_path: "/test" } },
123
+ ] },
124
+ { role: "user", content: [
125
+ { type: "tool_result", tool_use_id: "tool1", content: "result" },
126
+ ] },
127
+ { role: "assistant", content: [{ type: "text", text: "Done" }] },
128
+ ];
129
+ const state = new LoopState(messages);
130
+ // With preserveToolPairs: true
131
+ const result = await handleProactiveCompaction(state, 1000, {
132
+ keepFirst: 0,
133
+ keepLast: 1,
134
+ preserveToolPairs: true,
135
+ });
136
+ // Tool pairs should be considered for preservation
137
+ expect(typeof result).toBe("boolean");
138
+ });
139
+ });
140
+ describe("compaction state updates", () => {
141
+ it("should update state messages on successful compaction", async () => {
142
+ const messages = createMessages(15, 500);
143
+ const state = new LoopState(messages);
144
+ const originalLength = state.messages.length;
145
+ await handleProactiveCompaction(state, 2000); // Force compaction
146
+ // If compaction occurred, message count should decrease
147
+ // (depends on actual implementation)
148
+ });
149
+ it("should track total tokens compacted", async () => {
150
+ const messages = createMessages(15, 500);
151
+ const state = new LoopState(messages);
152
+ const initialCompacted = state.totalTokensCompacted;
153
+ await handleProactiveCompaction(state, 2000);
154
+ // If compaction succeeded, this should increase
155
+ // (depends on actual implementation)
156
+ });
157
+ });
158
+ describe("edge cases", () => {
159
+ it("should handle empty messages", async () => {
160
+ const state = new LoopState([]);
161
+ const result = await handleProactiveCompaction(state, 4096);
162
+ expect(result).toBe(false);
163
+ });
164
+ it("should handle single message", async () => {
165
+ const state = new LoopState(createMessages(1, 1000));
166
+ const result = await handleProactiveCompaction(state, 4096);
167
+ expect(result).toBe(false);
168
+ });
169
+ it("should handle messages exactly at threshold", async () => {
170
+ // Create messages that are exactly at the threshold
171
+ const messages = createMessages(8, 460); // ~3680 tokens, at 90% of 4096
172
+ const state = new LoopState(messages);
173
+ const result = await handleProactiveCompaction(state, 4096);
174
+ // Should need compaction at exactly 90%
175
+ expect(typeof result).toBe("boolean");
176
+ });
177
+ it("should handle very large individual messages", async () => {
178
+ const messages = [
179
+ { role: "user", content: [{ type: "text", text: "x".repeat(100000) }] },
180
+ { role: "assistant", content: [{ type: "text", text: "Response" }] },
181
+ { role: "user", content: [{ type: "text", text: "Follow up" }] },
182
+ ];
183
+ const state = new LoopState(messages);
184
+ const result = await handleReactiveCompaction(state, 4096);
185
+ expect(typeof result).toBe("boolean");
186
+ });
187
+ it("should handle messages with mixed content types", async () => {
188
+ const messages = [
189
+ { role: "user", content: [{ type: "text", text: "x".repeat(2000) }] },
190
+ { role: "assistant", content: [
191
+ { type: "tool_use", id: "t1", name: "Read", input: {} },
192
+ { type: "text", text: "Text after tool" },
193
+ ] },
194
+ { role: "user", content: [
195
+ { type: "tool_result", tool_use_id: "t1", content: "result" },
196
+ { type: "image", source: { type: "base64", data: "imagedata", media_type: "image/png" } },
197
+ ] },
198
+ ];
199
+ for (let i = 0; i < 6; i++) {
200
+ messages.push({
201
+ role: i % 2 === 0 ? "user" : "assistant",
202
+ content: [{ type: "text", text: "x".repeat(500) }],
203
+ });
204
+ }
205
+ const state = new LoopState(messages);
206
+ const result = await handleProactiveCompaction(state, 4096);
207
+ expect(typeof result).toBe("boolean");
208
+ });
209
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Formatters Tests - Cost and metrics display utilities
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=formatters.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/formatters.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Formatters Tests - Cost and metrics display utilities
3
+ */
4
+ import { describe, it, expect } from "bun:test";
5
+ import { formatCost, formatMetrics, formatCostBrief, formatCacheMetrics, } from "../formatters.js";
6
+ describe("formatCost", () => {
7
+ it("should format small costs with 4 decimal places", () => {
8
+ expect(formatCost(0.001)).toBe("$0.0010");
9
+ expect(formatCost(0.0099)).toBe("$0.0099");
10
+ expect(formatCost(0.005)).toBe("$0.0050");
11
+ });
12
+ it("should format larger costs with 2 decimal places", () => {
13
+ expect(formatCost(0.01)).toBe("$0.01");
14
+ expect(formatCost(0.5)).toBe("$0.50");
15
+ expect(formatCost(1.0)).toBe("$1.00");
16
+ expect(formatCost(10.99)).toBe("$10.99");
17
+ expect(formatCost(100.0)).toBe("$100.00");
18
+ });
19
+ it("should handle zero cost", () => {
20
+ expect(formatCost(0)).toBe("$0.0000");
21
+ });
22
+ it("should handle very large costs", () => {
23
+ expect(formatCost(1000.0)).toBe("$1000.00");
24
+ expect(formatCost(9999.99)).toBe("$9999.99");
25
+ });
26
+ });
27
+ describe("formatMetrics", () => {
28
+ it("should format basic metrics without cache", () => {
29
+ const metrics = {
30
+ model: "claude-sonnet-4-6",
31
+ messageCount: 5,
32
+ messageTokens: 1500,
33
+ usage: { input_tokens: 1000, output_tokens: 500 },
34
+ durationMs: 2000,
35
+ ttftMs: 150,
36
+ costUSD: 0.05,
37
+ stopReason: "end_turn",
38
+ requestId: "req-123",
39
+ };
40
+ const result = formatMetrics(metrics);
41
+ expect(result).toContain("Cost: $0.05");
42
+ expect(result).toContain("1,000 input");
43
+ expect(result).toContain("500 output");
44
+ expect(result).not.toContain("Cache:");
45
+ });
46
+ it("should format metrics with cache information", () => {
47
+ const metrics = {
48
+ model: "claude-sonnet-4-6",
49
+ messageCount: 5,
50
+ messageTokens: 1500,
51
+ usage: {
52
+ input_tokens: 1000,
53
+ output_tokens: 500,
54
+ cache_read_input_tokens: 800,
55
+ cache_creation_input_tokens: 200,
56
+ },
57
+ durationMs: 2000,
58
+ ttftMs: 150,
59
+ costUSD: 0.03,
60
+ stopReason: "end_turn",
61
+ requestId: "req-123",
62
+ };
63
+ const result = formatMetrics(metrics);
64
+ expect(result).toContain("Cost: $0.03");
65
+ expect(result).toContain("800 read");
66
+ expect(result).toContain("200 write");
67
+ expect(result).toContain("Cache:");
68
+ });
69
+ it("should handle small costs with 4 decimals", () => {
70
+ const metrics = {
71
+ model: "claude-sonnet-4-6",
72
+ messageCount: 1,
73
+ messageTokens: 100,
74
+ usage: { input_tokens: 50, output_tokens: 50 },
75
+ durationMs: 500,
76
+ ttftMs: 100,
77
+ costUSD: 0.005,
78
+ stopReason: "end_turn",
79
+ requestId: "req-1",
80
+ };
81
+ const result = formatMetrics(metrics);
82
+ expect(result).toContain("$0.0050");
83
+ });
84
+ it("should format large token counts with locale separators", () => {
85
+ const metrics = {
86
+ model: "claude-sonnet-4-6",
87
+ messageCount: 100,
88
+ messageTokens: 500000,
89
+ usage: { input_tokens: 400000, output_tokens: 100000 },
90
+ durationMs: 10000,
91
+ ttftMs: 500,
92
+ costUSD: 5.0,
93
+ stopReason: "end_turn",
94
+ requestId: "req-123",
95
+ };
96
+ const result = formatMetrics(metrics);
97
+ expect(result).toContain("400,000 input");
98
+ expect(result).toContain("100,000 output");
99
+ });
100
+ });
101
+ describe("formatCostBrief", () => {
102
+ it("should format brief cost with total tokens", () => {
103
+ const metrics = {
104
+ model: "claude-sonnet-4-6",
105
+ messageCount: 5,
106
+ messageTokens: 1500,
107
+ usage: { input_tokens: 1000, output_tokens: 500 },
108
+ durationMs: 2000,
109
+ ttftMs: 150,
110
+ costUSD: 0.05,
111
+ stopReason: "end_turn",
112
+ requestId: "req-123",
113
+ };
114
+ const result = formatCostBrief(metrics);
115
+ expect(result).toContain("Cost: $0.05");
116
+ expect(result).toContain("1,500"); // Total tokens
117
+ expect(result).not.toContain("input");
118
+ expect(result).not.toContain("output");
119
+ });
120
+ it("should handle small costs", () => {
121
+ const metrics = {
122
+ model: "claude-sonnet-4-6",
123
+ messageCount: 1,
124
+ messageTokens: 100,
125
+ usage: { input_tokens: 50, output_tokens: 50 },
126
+ durationMs: 500,
127
+ ttftMs: 100,
128
+ costUSD: 0.001,
129
+ stopReason: "end_turn",
130
+ requestId: "req-1",
131
+ };
132
+ const result = formatCostBrief(metrics);
133
+ expect(result).toContain("$0.0010");
134
+ });
135
+ });
136
+ describe("formatCacheMetrics", () => {
137
+ it("should format cache metrics with all fields", () => {
138
+ const cacheMetrics = {
139
+ cacheHits: 50,
140
+ cacheMisses: 10,
141
+ totalCacheReadTokens: 50000,
142
+ totalCacheWriteTokens: 5000,
143
+ cacheHitRate: 0.833,
144
+ estimatedSavingsUSD: 0.25,
145
+ };
146
+ const result = formatCacheMetrics(cacheMetrics);
147
+ expect(result).toContain("83.3% hit rate");
148
+ expect(result).toContain("50,000 read");
149
+ expect(result).toContain("5,000 written");
150
+ expect(result).toContain("Saved: $0.25");
151
+ });
152
+ it("should handle zero cache activity", () => {
153
+ const cacheMetrics = {
154
+ cacheHits: 0,
155
+ cacheMisses: 0,
156
+ totalCacheReadTokens: 0,
157
+ totalCacheWriteTokens: 0,
158
+ cacheHitRate: 0,
159
+ estimatedSavingsUSD: 0,
160
+ };
161
+ const result = formatCacheMetrics(cacheMetrics);
162
+ expect(result).toContain("0.0% hit rate");
163
+ expect(result).toContain("0 read");
164
+ expect(result).toContain("0 written");
165
+ expect(result).toContain("Saved: $0.0000");
166
+ });
167
+ it("should handle 100% hit rate", () => {
168
+ const cacheMetrics = {
169
+ cacheHits: 100,
170
+ cacheMisses: 0,
171
+ totalCacheReadTokens: 100000,
172
+ totalCacheWriteTokens: 0,
173
+ cacheHitRate: 1.0,
174
+ estimatedSavingsUSD: 1.50,
175
+ };
176
+ const result = formatCacheMetrics(cacheMetrics);
177
+ expect(result).toContain("100.0% hit rate");
178
+ expect(result).toContain("100,000 read");
179
+ expect(result).toContain("Saved: $1.50");
180
+ });
181
+ it("should format large numbers with separators", () => {
182
+ const cacheMetrics = {
183
+ cacheHits: 1000,
184
+ cacheMisses: 100,
185
+ totalCacheReadTokens: 1000000,
186
+ totalCacheWriteTokens: 100000,
187
+ cacheHitRate: 0.909,
188
+ estimatedSavingsUSD: 10.0,
189
+ };
190
+ const result = formatCacheMetrics(cacheMetrics);
191
+ expect(result).toContain("1,000,000 read");
192
+ expect(result).toContain("100,000 written");
193
+ expect(result).toContain("90.9% hit rate");
194
+ });
195
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Agent Loop Index Tests - Main entry point and exports
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Agent Loop Index Tests - Main entry point and exports
3
+ */
4
+ import { describe, it, expect } from "bun:test";
5
+ import { agentLoop, formatCost, formatMetrics, formatCostBrief, formatCacheMetrics, LoopState, executeTools, buildAPIMessages, injectReminderIntoContent, handleProactiveCompaction, handleReactiveCompaction, needsCompaction, estimateMessagesTokens, DEFAULT_PROACTIVE_OPTIONS, DEFAULT_REACTIVE_OPTIONS, } from "../index.js";
6
+ describe("exports", () => {
7
+ it("should export agentLoop function", () => {
8
+ expect(typeof agentLoop).toBe("function");
9
+ });
10
+ it("should export formatter functions", () => {
11
+ expect(typeof formatCost).toBe("function");
12
+ expect(typeof formatMetrics).toBe("function");
13
+ expect(typeof formatCostBrief).toBe("function");
14
+ expect(typeof formatCacheMetrics).toBe("function");
15
+ });
16
+ it("should export LoopState class", () => {
17
+ expect(LoopState).toBeDefined();
18
+ expect(typeof LoopState).toBe("function");
19
+ });
20
+ it("should export executeTools function", () => {
21
+ expect(typeof executeTools).toBe("function");
22
+ });
23
+ it("should export message builder functions", () => {
24
+ expect(typeof buildAPIMessages).toBe("function");
25
+ expect(typeof injectReminderIntoContent).toBe("function");
26
+ });
27
+ it("should export compaction functions and constants", () => {
28
+ expect(typeof handleProactiveCompaction).toBe("function");
29
+ expect(typeof handleReactiveCompaction).toBe("function");
30
+ expect(typeof needsCompaction).toBe("function");
31
+ expect(typeof estimateMessagesTokens).toBe("function");
32
+ expect(DEFAULT_PROACTIVE_OPTIONS).toBeDefined();
33
+ expect(DEFAULT_REACTIVE_OPTIONS).toBeDefined();
34
+ });
35
+ });
36
+ describe("AgentLoopOptions type", () => {
37
+ it("should have required apiKey field", () => {
38
+ const options = {
39
+ apiKey: "test-key",
40
+ systemPrompt: "Test prompt",
41
+ tools: [],
42
+ permissionMode: "bypassPermissions",
43
+ workingDirectory: "/test",
44
+ };
45
+ expect(options.apiKey).toBe("test-key");
46
+ });
47
+ it("should have optional fields with defaults", () => {
48
+ const options = {
49
+ apiKey: "test-key",
50
+ systemPrompt: "Test prompt",
51
+ tools: [],
52
+ permissionMode: "default",
53
+ workingDirectory: "/test",
54
+ };
55
+ // Optional fields should be accessible
56
+ expect(options.model).toBeUndefined();
57
+ expect(options.maxTokens).toBeUndefined();
58
+ expect(options.hookManager).toBeUndefined();
59
+ });
60
+ });
61
+ describe("AgentLoopResult type", () => {
62
+ it("should contain all expected fields", () => {
63
+ // Create a result via LoopState to verify type compatibility
64
+ const state = new LoopState([]);
65
+ const result = state.toResult();
66
+ expect(result.messages).toBeDefined();
67
+ expect(result.metrics).toBeDefined();
68
+ expect(typeof result.totalCost).toBe("number");
69
+ expect(typeof result.totalDuration).toBe("number");
70
+ expect(result.totalCacheMetrics).toBeDefined();
71
+ expect(typeof result.compactionCount).toBe("number");
72
+ expect(typeof result.totalTokensCompacted).toBe("number");
73
+ });
74
+ });
75
+ describe("agentLoop function signature", () => {
76
+ it("should accept AgentLoopOptions and return Promise<AgentLoopResult>", () => {
77
+ // Type check only - don't actually run it
78
+ const checkSignature = async () => {
79
+ const options = {
80
+ apiKey: "test",
81
+ systemPrompt: "test",
82
+ tools: [],
83
+ permissionMode: "bypassPermissions",
84
+ workingDirectory: "/test",
85
+ };
86
+ // This would actually call the API, so we just verify the type
87
+ const _typeCheck = () => agentLoop([], options);
88
+ // Verify the function exists and has correct signature
89
+ expect(typeof agentLoop).toBe("function");
90
+ };
91
+ // Just verify no type errors
92
+ expect(checkSignature).toBeDefined();
93
+ });
94
+ });
95
+ describe("re-exports from submodules", () => {
96
+ it("should re-export LoopState correctly", () => {
97
+ const state = new LoopState([
98
+ { role: "user", content: [{ type: "text", text: "test" }] },
99
+ ]);
100
+ expect(state.messages).toHaveLength(1);
101
+ expect(state.turnNumber).toBe(0);
102
+ });
103
+ it("should re-export formatters with correct behavior", () => {
104
+ expect(formatCost(0.005)).toBe("$0.0050");
105
+ expect(formatCost(1.5)).toBe("$1.50");
106
+ });
107
+ it("should re-export message builder functions", () => {
108
+ const messages = [
109
+ { role: "user", content: [{ type: "text", text: "Hello" }] },
110
+ ];
111
+ const result = buildAPIMessages(messages, "System", "Reminder");
112
+ expect(result).toHaveLength(1);
113
+ expect((result[0]?.content[0]).text).toContain("Reminder");
114
+ });
115
+ it("should re-export compaction constants", () => {
116
+ expect(DEFAULT_PROACTIVE_OPTIONS.keepFirst).toBe(0);
117
+ expect(DEFAULT_PROACTIVE_OPTIONS.keepLast).toBe(3);
118
+ expect(DEFAULT_REACTIVE_OPTIONS.keepFirst).toBe(0);
119
+ expect(DEFAULT_REACTIVE_OPTIONS.keepLast).toBe(3);
120
+ });
121
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * LoopState Tests - State management for the agent loop
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=loop-state.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-state.test.d.ts","sourceRoot":"","sources":["../../../../packages/src/core/agent-loop/__tests__/loop-state.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}