gencode-ai 0.4.1 → 0.5.0

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 (1076) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +6 -1
  3. package/dist/base/config/index.d.ts.map +1 -0
  4. package/dist/base/config/index.js.map +1 -0
  5. package/dist/base/config/levels.d.ts +47 -0
  6. package/dist/base/config/levels.d.ts.map +1 -0
  7. package/dist/base/config/levels.js +175 -0
  8. package/dist/base/config/levels.js.map +1 -0
  9. package/dist/base/config/loader.d.ts.map +1 -0
  10. package/dist/base/config/loader.js.map +1 -0
  11. package/dist/base/config/manager.d.ts.map +1 -0
  12. package/dist/base/config/manager.js.map +1 -0
  13. package/dist/base/config/merger.d.ts.map +1 -0
  14. package/dist/base/config/merger.js.map +1 -0
  15. package/dist/base/config/providers-config.d.ts.map +1 -0
  16. package/dist/base/config/providers-config.js +76 -0
  17. package/dist/base/config/providers-config.js.map +1 -0
  18. package/dist/base/config/test-utils.d.ts.map +1 -0
  19. package/dist/base/config/test-utils.js.map +1 -0
  20. package/dist/base/config/types.d.ts +156 -0
  21. package/dist/base/config/types.d.ts.map +1 -0
  22. package/dist/base/config/types.js +34 -0
  23. package/dist/base/config/types.js.map +1 -0
  24. package/dist/base/discovery/base-loader.d.ts +63 -0
  25. package/dist/base/discovery/base-loader.d.ts.map +1 -0
  26. package/dist/base/discovery/base-loader.js +176 -0
  27. package/dist/base/discovery/base-loader.js.map +1 -0
  28. package/dist/base/discovery/file-scanner.d.ts +28 -0
  29. package/dist/base/discovery/file-scanner.d.ts.map +1 -0
  30. package/dist/base/discovery/file-scanner.js +175 -0
  31. package/dist/base/discovery/file-scanner.js.map +1 -0
  32. package/dist/base/discovery/index.d.ts +10 -0
  33. package/dist/base/discovery/index.d.ts.map +1 -0
  34. package/dist/base/discovery/index.js +12 -0
  35. package/dist/base/discovery/index.js.map +1 -0
  36. package/dist/base/discovery/path-resolver.d.ts +31 -0
  37. package/dist/base/discovery/path-resolver.d.ts.map +1 -0
  38. package/dist/base/discovery/path-resolver.js +92 -0
  39. package/dist/base/discovery/path-resolver.js.map +1 -0
  40. package/dist/base/discovery/types.d.ts +132 -0
  41. package/dist/base/discovery/types.d.ts.map +1 -0
  42. package/dist/base/discovery/types.js +14 -0
  43. package/dist/base/discovery/types.js.map +1 -0
  44. package/dist/base/utils/config-validator.d.ts +128 -0
  45. package/dist/base/utils/config-validator.d.ts.map +1 -0
  46. package/dist/base/utils/config-validator.js +143 -0
  47. package/dist/base/utils/config-validator.js.map +1 -0
  48. package/dist/base/utils/debug.d.ts +50 -0
  49. package/dist/base/utils/debug.d.ts.map +1 -0
  50. package/dist/base/utils/debug.js +80 -0
  51. package/dist/base/utils/debug.js.map +1 -0
  52. package/dist/base/utils/format-utils.d.ts +41 -0
  53. package/dist/base/utils/format-utils.d.ts.map +1 -0
  54. package/dist/base/utils/format-utils.js +57 -0
  55. package/dist/base/utils/format-utils.js.map +1 -0
  56. package/dist/base/utils/index.d.ts +12 -0
  57. package/dist/base/utils/index.d.ts.map +1 -0
  58. package/dist/base/utils/index.js +12 -0
  59. package/dist/base/utils/index.js.map +1 -0
  60. package/dist/base/utils/loading-reporter.d.ts +70 -0
  61. package/dist/base/utils/loading-reporter.d.ts.map +1 -0
  62. package/dist/base/utils/loading-reporter.js +164 -0
  63. package/dist/base/utils/loading-reporter.js.map +1 -0
  64. package/dist/base/utils/logger.d.ts +32 -0
  65. package/dist/base/utils/logger.d.ts.map +1 -0
  66. package/dist/base/utils/logger.js +77 -0
  67. package/dist/base/utils/logger.js.map +1 -0
  68. package/dist/base/utils/path-utils.d.ts +25 -0
  69. package/dist/base/utils/path-utils.d.ts.map +1 -0
  70. package/dist/base/utils/path-utils.js +71 -0
  71. package/dist/base/utils/path-utils.js.map +1 -0
  72. package/dist/base/utils/stream-utils.d.ts +28 -0
  73. package/dist/base/utils/stream-utils.d.ts.map +1 -0
  74. package/dist/base/utils/stream-utils.js +58 -0
  75. package/dist/base/utils/stream-utils.js.map +1 -0
  76. package/dist/base/utils/validation.d.ts +20 -0
  77. package/dist/base/utils/validation.d.ts.map +1 -0
  78. package/dist/base/utils/validation.js +22 -0
  79. package/dist/base/utils/validation.js.map +1 -0
  80. package/dist/cli/components/App.d.ts +16 -2
  81. package/dist/cli/components/App.d.ts.map +1 -1
  82. package/dist/cli/components/App.js +314 -15
  83. package/dist/cli/components/App.js.map +1 -1
  84. package/dist/cli/components/CommandSuggestions.d.ts +5 -3
  85. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  86. package/dist/cli/components/CommandSuggestions.js +74 -11
  87. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  88. package/dist/cli/components/DiffPreview.d.ts +17 -0
  89. package/dist/cli/components/DiffPreview.d.ts.map +1 -0
  90. package/dist/cli/components/DiffPreview.js +72 -0
  91. package/dist/cli/components/DiffPreview.js.map +1 -0
  92. package/dist/cli/components/Input.d.ts +2 -1
  93. package/dist/cli/components/Input.d.ts.map +1 -1
  94. package/dist/cli/components/Input.js +2 -2
  95. package/dist/cli/components/Input.js.map +1 -1
  96. package/dist/cli/components/Messages.d.ts +16 -2
  97. package/dist/cli/components/Messages.d.ts.map +1 -1
  98. package/dist/cli/components/Messages.js +65 -24
  99. package/dist/cli/components/Messages.js.map +1 -1
  100. package/dist/cli/components/ModeIndicator.d.ts +1 -1
  101. package/dist/cli/components/ModeIndicator.d.ts.map +1 -1
  102. package/dist/cli/components/ModelSelector.d.ts +1 -1
  103. package/dist/cli/components/ModelSelector.d.ts.map +1 -1
  104. package/dist/cli/components/ModelSelector.js +2 -2
  105. package/dist/cli/components/ModelSelector.js.map +1 -1
  106. package/dist/cli/components/PermissionPrompt.d.ts +20 -12
  107. package/dist/cli/components/PermissionPrompt.d.ts.map +1 -1
  108. package/dist/cli/components/PermissionPrompt.js +51 -52
  109. package/dist/cli/components/PermissionPrompt.js.map +1 -1
  110. package/dist/cli/components/PlanApproval.d.ts +1 -1
  111. package/dist/cli/components/PlanApproval.d.ts.map +1 -1
  112. package/dist/cli/components/PlanApproval.js +18 -6
  113. package/dist/cli/components/PlanApproval.js.map +1 -1
  114. package/dist/cli/components/ProviderManager.d.ts +1 -1
  115. package/dist/cli/components/ProviderManager.d.ts.map +1 -1
  116. package/dist/cli/components/ProviderManager.js +4 -4
  117. package/dist/cli/components/ProviderManager.js.map +1 -1
  118. package/dist/cli/components/QuestionPrompt.d.ts +1 -1
  119. package/dist/cli/components/QuestionPrompt.d.ts.map +1 -1
  120. package/dist/cli/components/TodoList.d.ts +1 -1
  121. package/dist/cli/components/TodoList.d.ts.map +1 -1
  122. package/dist/cli/components/index.d.ts +2 -1
  123. package/dist/cli/components/index.d.ts.map +1 -1
  124. package/dist/cli/components/index.js +2 -1
  125. package/dist/cli/components/index.js.map +1 -1
  126. package/dist/cli/components/markdown.d.ts.map +1 -1
  127. package/dist/cli/components/markdown.js +50 -6
  128. package/dist/cli/components/markdown.js.map +1 -1
  129. package/dist/cli/components/theme.d.ts +41 -0
  130. package/dist/cli/components/theme.d.ts.map +1 -1
  131. package/dist/cli/components/theme.js +52 -0
  132. package/dist/cli/components/theme.js.map +1 -1
  133. package/dist/cli/index.js +50 -15
  134. package/dist/cli/index.js.map +1 -1
  135. package/dist/cli/planning/index.d.ts.map +1 -0
  136. package/dist/cli/planning/index.js.map +1 -0
  137. package/dist/cli/planning/plan-file.d.ts.map +1 -0
  138. package/dist/cli/planning/plan-file.js.map +1 -0
  139. package/dist/cli/planning/state.d.ts.map +1 -0
  140. package/dist/cli/planning/state.js.map +1 -0
  141. package/dist/cli/planning/tools/enter-plan-mode.d.ts +25 -0
  142. package/dist/cli/planning/tools/enter-plan-mode.d.ts.map +1 -0
  143. package/dist/cli/planning/tools/enter-plan-mode.js.map +1 -0
  144. package/dist/cli/planning/tools/exit-plan-mode.d.ts +24 -0
  145. package/dist/cli/planning/tools/exit-plan-mode.d.ts.map +1 -0
  146. package/dist/cli/planning/tools/exit-plan-mode.js.map +1 -0
  147. package/dist/cli/planning/types.d.ts +102 -0
  148. package/dist/cli/planning/types.d.ts.map +1 -0
  149. package/dist/cli/planning/types.js +31 -0
  150. package/dist/cli/planning/types.js.map +1 -0
  151. package/dist/cli/prompts/index.d.ts +115 -0
  152. package/dist/cli/prompts/index.d.ts.map +1 -0
  153. package/dist/cli/prompts/index.js +315 -0
  154. package/dist/cli/prompts/index.js.map +1 -0
  155. package/dist/core/agent/agent.d.ts +215 -0
  156. package/dist/core/agent/agent.d.ts.map +1 -0
  157. package/dist/core/agent/agent.js +877 -0
  158. package/dist/core/agent/agent.js.map +1 -0
  159. package/dist/core/agent/index.d.ts.map +1 -0
  160. package/dist/core/agent/index.js.map +1 -0
  161. package/dist/core/agent/types.d.ts.map +1 -0
  162. package/dist/core/agent/types.js.map +1 -0
  163. package/dist/core/memory/import-resolver.d.ts.map +1 -0
  164. package/dist/core/memory/import-resolver.js.map +1 -0
  165. package/dist/core/memory/index.d.ts.map +1 -0
  166. package/dist/core/memory/index.js.map +1 -0
  167. package/dist/core/memory/init-prompt.d.ts.map +1 -0
  168. package/dist/core/memory/init-prompt.js.map +1 -0
  169. package/dist/core/memory/memory-manager.d.ts.map +1 -0
  170. package/dist/core/memory/memory-manager.js +716 -0
  171. package/dist/core/memory/memory-manager.js.map +1 -0
  172. package/dist/core/memory/rules-parser.d.ts.map +1 -0
  173. package/dist/core/memory/rules-parser.js.map +1 -0
  174. package/dist/core/memory/test-utils.d.ts.map +1 -0
  175. package/dist/core/memory/test-utils.js.map +1 -0
  176. package/dist/core/memory/types.d.ts.map +1 -0
  177. package/dist/core/memory/types.js.map +1 -0
  178. package/dist/core/permissions/audit.d.ts.map +1 -0
  179. package/dist/core/permissions/audit.js.map +1 -0
  180. package/dist/core/permissions/index.d.ts.map +1 -0
  181. package/dist/core/permissions/index.js.map +1 -0
  182. package/dist/core/permissions/manager.d.ts.map +1 -0
  183. package/dist/core/permissions/manager.js.map +1 -0
  184. package/dist/core/permissions/persistence.d.ts.map +1 -0
  185. package/dist/core/permissions/persistence.js.map +1 -0
  186. package/dist/core/permissions/prompt-matcher.d.ts.map +1 -0
  187. package/dist/core/permissions/prompt-matcher.js.map +1 -0
  188. package/dist/core/permissions/types.d.ts.map +1 -0
  189. package/dist/core/permissions/types.js.map +1 -0
  190. package/dist/core/pricing/calculator.d.ts.map +1 -0
  191. package/dist/core/pricing/calculator.js.map +1 -0
  192. package/dist/core/pricing/index.d.ts.map +1 -0
  193. package/dist/core/pricing/index.js.map +1 -0
  194. package/dist/core/pricing/models.d.ts.map +1 -0
  195. package/dist/core/pricing/models.js.map +1 -0
  196. package/dist/core/pricing/types.d.ts.map +1 -0
  197. package/dist/core/pricing/types.js.map +1 -0
  198. package/dist/core/providers/anthropic-vertex.d.ts +41 -0
  199. package/dist/core/providers/anthropic-vertex.d.ts.map +1 -0
  200. package/dist/core/providers/anthropic-vertex.js +462 -0
  201. package/dist/core/providers/anthropic-vertex.js.map +1 -0
  202. package/dist/core/providers/anthropic.d.ts.map +1 -0
  203. package/dist/core/providers/anthropic.js.map +1 -0
  204. package/dist/core/providers/google.d.ts.map +1 -0
  205. package/dist/core/providers/google.js +314 -0
  206. package/dist/core/providers/google.js.map +1 -0
  207. package/dist/core/providers/index.d.ts +46 -0
  208. package/dist/core/providers/index.d.ts.map +1 -0
  209. package/dist/core/providers/index.js +108 -0
  210. package/dist/core/providers/index.js.map +1 -0
  211. package/dist/core/providers/openai.d.ts.map +1 -0
  212. package/dist/core/providers/openai.js.map +1 -0
  213. package/dist/core/providers/registry.d.ts.map +1 -0
  214. package/dist/core/providers/registry.js +142 -0
  215. package/dist/core/providers/registry.js.map +1 -0
  216. package/dist/core/providers/search/brave.d.ts.map +1 -0
  217. package/dist/core/providers/search/brave.js.map +1 -0
  218. package/dist/core/providers/search/exa.d.ts.map +1 -0
  219. package/dist/core/providers/search/exa.js +161 -0
  220. package/dist/core/providers/search/exa.js.map +1 -0
  221. package/dist/core/providers/search/index.d.ts.map +1 -0
  222. package/dist/core/providers/search/index.js.map +1 -0
  223. package/dist/core/providers/search/serper.d.ts.map +1 -0
  224. package/dist/core/providers/search/serper.js.map +1 -0
  225. package/dist/core/providers/search/types.d.ts.map +1 -0
  226. package/dist/core/providers/search/types.js.map +1 -0
  227. package/dist/core/providers/store.d.ts.map +1 -0
  228. package/dist/core/providers/store.js.map +1 -0
  229. package/dist/core/providers/types.d.ts.map +1 -0
  230. package/dist/core/providers/types.js.map +1 -0
  231. package/dist/core/providers/vertex-ai.d.ts.map +1 -0
  232. package/dist/core/providers/vertex-ai.js +462 -0
  233. package/dist/core/providers/vertex-ai.js.map +1 -0
  234. package/dist/core/session/checkpointing/checkpoint-manager.d.ts.map +1 -0
  235. package/dist/core/session/checkpointing/checkpoint-manager.js.map +1 -0
  236. package/dist/core/session/checkpointing/index.d.ts.map +1 -0
  237. package/dist/core/session/checkpointing/index.js.map +1 -0
  238. package/dist/core/session/checkpointing/types.d.ts.map +1 -0
  239. package/dist/core/session/checkpointing/types.js.map +1 -0
  240. package/dist/core/session/compression/engine.d.ts.map +1 -0
  241. package/dist/core/session/compression/engine.js.map +1 -0
  242. package/dist/core/session/compression/index.d.ts.map +1 -0
  243. package/dist/core/session/compression/index.js.map +1 -0
  244. package/dist/core/session/compression/types.d.ts.map +1 -0
  245. package/dist/core/session/compression/types.js.map +1 -0
  246. package/dist/core/session/index.d.ts +10 -0
  247. package/dist/core/session/index.d.ts.map +1 -0
  248. package/dist/core/session/index.js +10 -0
  249. package/dist/core/session/index.js.map +1 -0
  250. package/dist/core/session/input/history-manager.d.ts.map +1 -0
  251. package/dist/core/session/input/history-manager.js.map +1 -0
  252. package/dist/core/session/input/index.d.ts.map +1 -0
  253. package/dist/core/session/input/index.js.map +1 -0
  254. package/dist/core/session/manager.d.ts +169 -0
  255. package/dist/core/session/manager.d.ts.map +1 -0
  256. package/dist/core/session/manager.js +560 -0
  257. package/dist/core/session/manager.js.map +1 -0
  258. package/dist/core/session/tasks/index.d.ts +7 -0
  259. package/dist/core/session/tasks/index.d.ts.map +1 -0
  260. package/dist/core/session/tasks/index.js +7 -0
  261. package/dist/core/session/tasks/index.js.map +1 -0
  262. package/dist/core/session/tasks/output-streamer.d.ts +63 -0
  263. package/dist/core/session/tasks/output-streamer.d.ts.map +1 -0
  264. package/dist/core/session/tasks/output-streamer.js +211 -0
  265. package/dist/core/session/tasks/output-streamer.js.map +1 -0
  266. package/dist/core/session/tasks/task-manager.d.ts +90 -0
  267. package/dist/core/session/tasks/task-manager.d.ts.map +1 -0
  268. package/dist/core/session/tasks/task-manager.js +512 -0
  269. package/dist/core/session/tasks/task-manager.js.map +1 -0
  270. package/dist/core/session/tasks/types.d.ts +113 -0
  271. package/dist/core/session/tasks/types.d.ts.map +1 -0
  272. package/dist/core/session/tasks/types.js +7 -0
  273. package/dist/core/session/tasks/types.js.map +1 -0
  274. package/dist/core/session/types.d.ts +63 -0
  275. package/dist/core/session/types.d.ts.map +1 -0
  276. package/dist/core/session/types.js.map +1 -0
  277. package/dist/core/tools/builtin/ask-user.d.ts.map +1 -0
  278. package/dist/core/tools/builtin/ask-user.js +148 -0
  279. package/dist/core/tools/builtin/ask-user.js.map +1 -0
  280. package/dist/core/tools/builtin/bash.d.ts.map +1 -0
  281. package/dist/core/tools/builtin/bash.js +107 -0
  282. package/dist/core/tools/builtin/bash.js.map +1 -0
  283. package/dist/core/tools/builtin/edit.d.ts.map +1 -0
  284. package/dist/core/tools/builtin/edit.js +79 -0
  285. package/dist/core/tools/builtin/edit.js.map +1 -0
  286. package/dist/core/tools/builtin/glob.d.ts.map +1 -0
  287. package/dist/core/tools/builtin/glob.js +37 -0
  288. package/dist/core/tools/builtin/glob.js.map +1 -0
  289. package/dist/core/tools/builtin/grep.d.ts.map +1 -0
  290. package/dist/core/tools/builtin/grep.js +60 -0
  291. package/dist/core/tools/builtin/grep.js.map +1 -0
  292. package/dist/core/tools/builtin/read.d.ts.map +1 -0
  293. package/dist/core/tools/builtin/read.js +30 -0
  294. package/dist/core/tools/builtin/read.js.map +1 -0
  295. package/dist/core/tools/builtin/taskoutput.d.ts +17 -0
  296. package/dist/core/tools/builtin/taskoutput.d.ts.map +1 -0
  297. package/dist/core/tools/builtin/taskoutput.js +277 -0
  298. package/dist/core/tools/builtin/taskoutput.js.map +1 -0
  299. package/dist/core/tools/builtin/todowrite.d.ts.map +1 -0
  300. package/dist/core/tools/builtin/todowrite.js +90 -0
  301. package/dist/core/tools/builtin/todowrite.js.map +1 -0
  302. package/dist/core/tools/builtin/webfetch.d.ts.map +1 -0
  303. package/dist/core/tools/builtin/webfetch.js +228 -0
  304. package/dist/core/tools/builtin/webfetch.js.map +1 -0
  305. package/dist/core/tools/builtin/websearch.d.ts.map +1 -0
  306. package/dist/core/tools/builtin/websearch.js +87 -0
  307. package/dist/core/tools/builtin/websearch.js.map +1 -0
  308. package/dist/core/tools/builtin/write.d.ts +9 -0
  309. package/dist/core/tools/builtin/write.d.ts.map +1 -0
  310. package/dist/core/tools/builtin/write.js +40 -0
  311. package/dist/core/tools/builtin/write.js.map +1 -0
  312. package/dist/core/tools/factories/mcp-tool-factory.d.ts +16 -0
  313. package/dist/core/tools/factories/mcp-tool-factory.d.ts.map +1 -0
  314. package/dist/core/tools/factories/mcp-tool-factory.js +92 -0
  315. package/dist/core/tools/factories/mcp-tool-factory.js.map +1 -0
  316. package/dist/core/tools/factories/skill-tool-factory.d.ts +28 -0
  317. package/dist/core/tools/factories/skill-tool-factory.d.ts.map +1 -0
  318. package/dist/core/tools/factories/skill-tool-factory.js +154 -0
  319. package/dist/core/tools/factories/skill-tool-factory.js.map +1 -0
  320. package/dist/core/tools/factories/task-tool-factory.d.ts +13 -0
  321. package/dist/core/tools/factories/task-tool-factory.d.ts.map +1 -0
  322. package/dist/core/tools/factories/task-tool-factory.js +387 -0
  323. package/dist/core/tools/factories/task-tool-factory.js.map +1 -0
  324. package/dist/core/tools/index.d.ts +87 -0
  325. package/dist/core/tools/index.d.ts.map +1 -0
  326. package/dist/core/tools/index.js +133 -0
  327. package/dist/core/tools/index.js.map +1 -0
  328. package/dist/core/tools/registry.d.ts +36 -0
  329. package/dist/core/tools/registry.d.ts.map +1 -0
  330. package/dist/core/tools/registry.js +150 -0
  331. package/dist/core/tools/registry.js.map +1 -0
  332. package/dist/core/tools/types.d.ts +148 -0
  333. package/dist/core/tools/types.d.ts.map +1 -0
  334. package/dist/core/tools/types.js +193 -0
  335. package/dist/core/tools/types.js.map +1 -0
  336. package/dist/core/tools/utils/ssrf.d.ts.map +1 -0
  337. package/dist/core/tools/utils/ssrf.js.map +1 -0
  338. package/dist/ext/commands/discovery.d.ts +23 -0
  339. package/dist/ext/commands/discovery.d.ts.map +1 -0
  340. package/dist/ext/commands/discovery.js +36 -0
  341. package/dist/ext/commands/discovery.js.map +1 -0
  342. package/dist/ext/commands/expander.d.ts +25 -0
  343. package/dist/ext/commands/expander.d.ts.map +1 -0
  344. package/dist/ext/commands/expander.js +140 -0
  345. package/dist/ext/commands/expander.js.map +1 -0
  346. package/dist/ext/commands/index.d.ts +12 -0
  347. package/dist/ext/commands/index.d.ts.map +1 -0
  348. package/dist/ext/commands/index.js +12 -0
  349. package/dist/ext/commands/index.js.map +1 -0
  350. package/dist/ext/commands/manager.d.ts +50 -0
  351. package/dist/ext/commands/manager.d.ts.map +1 -0
  352. package/dist/ext/commands/manager.js +174 -0
  353. package/dist/ext/commands/manager.js.map +1 -0
  354. package/dist/ext/commands/parser.d.ts +31 -0
  355. package/dist/ext/commands/parser.d.ts.map +1 -0
  356. package/dist/ext/commands/parser.js +113 -0
  357. package/dist/ext/commands/parser.js.map +1 -0
  358. package/dist/ext/commands/types.d.ts +62 -0
  359. package/dist/ext/commands/types.d.ts.map +1 -0
  360. package/dist/ext/commands/types.js +8 -0
  361. package/dist/ext/commands/types.js.map +1 -0
  362. package/dist/ext/hooks/executor.d.ts +20 -0
  363. package/dist/ext/hooks/executor.d.ts.map +1 -0
  364. package/dist/ext/hooks/executor.js +251 -0
  365. package/dist/ext/hooks/executor.js.map +1 -0
  366. package/dist/ext/hooks/hooks-manager.d.ts +112 -0
  367. package/dist/ext/hooks/hooks-manager.d.ts.map +1 -0
  368. package/dist/ext/hooks/hooks-manager.js +200 -0
  369. package/dist/ext/hooks/hooks-manager.js.map +1 -0
  370. package/dist/ext/hooks/index.d.ts +17 -0
  371. package/dist/ext/hooks/index.d.ts.map +1 -0
  372. package/dist/ext/hooks/index.js +20 -0
  373. package/dist/ext/hooks/index.js.map +1 -0
  374. package/dist/ext/hooks/matcher.d.ts +38 -0
  375. package/dist/ext/hooks/matcher.d.ts.map +1 -0
  376. package/dist/ext/hooks/matcher.js +72 -0
  377. package/dist/ext/hooks/matcher.js.map +1 -0
  378. package/dist/ext/hooks/types.d.ts +152 -0
  379. package/dist/ext/hooks/types.d.ts.map +1 -0
  380. package/dist/ext/hooks/types.js +10 -0
  381. package/dist/ext/hooks/types.js.map +1 -0
  382. package/dist/ext/hooks/utils.d.ts +75 -0
  383. package/dist/ext/hooks/utils.d.ts.map +1 -0
  384. package/dist/ext/hooks/utils.js +198 -0
  385. package/dist/ext/hooks/utils.js.map +1 -0
  386. package/dist/ext/mcp/auth.d.ts +34 -0
  387. package/dist/ext/mcp/auth.d.ts.map +1 -0
  388. package/dist/ext/mcp/auth.js +98 -0
  389. package/dist/ext/mcp/auth.js.map +1 -0
  390. package/dist/ext/mcp/client.d.ts +18 -0
  391. package/dist/ext/mcp/client.d.ts.map +1 -0
  392. package/dist/ext/mcp/client.js +40 -0
  393. package/dist/ext/mcp/client.js.map +1 -0
  394. package/dist/ext/mcp/config.d.ts +33 -0
  395. package/dist/ext/mcp/config.d.ts.map +1 -0
  396. package/dist/ext/mcp/config.js +147 -0
  397. package/dist/ext/mcp/config.js.map +1 -0
  398. package/dist/ext/mcp/connection.d.ts +16 -0
  399. package/dist/ext/mcp/connection.d.ts.map +1 -0
  400. package/dist/ext/mcp/connection.js +96 -0
  401. package/dist/ext/mcp/connection.js.map +1 -0
  402. package/dist/ext/mcp/env-expand.d.ts +24 -0
  403. package/dist/ext/mcp/env-expand.d.ts.map +1 -0
  404. package/dist/ext/mcp/env-expand.js +53 -0
  405. package/dist/ext/mcp/env-expand.js.map +1 -0
  406. package/dist/ext/mcp/index.d.ts +15 -0
  407. package/dist/ext/mcp/index.d.ts.map +1 -0
  408. package/dist/ext/mcp/index.js +22 -0
  409. package/dist/ext/mcp/index.js.map +1 -0
  410. package/dist/ext/mcp/manager.d.ts +87 -0
  411. package/dist/ext/mcp/manager.d.ts.map +1 -0
  412. package/dist/ext/mcp/manager.js +246 -0
  413. package/dist/ext/mcp/manager.js.map +1 -0
  414. package/dist/ext/mcp/oauth-callback.d.ts +21 -0
  415. package/dist/ext/mcp/oauth-callback.d.ts.map +1 -0
  416. package/dist/ext/mcp/oauth-callback.js +123 -0
  417. package/dist/ext/mcp/oauth-callback.js.map +1 -0
  418. package/dist/ext/mcp/oauth-provider.d.ts +44 -0
  419. package/dist/ext/mcp/oauth-provider.d.ts.map +1 -0
  420. package/dist/ext/mcp/oauth-provider.js +159 -0
  421. package/dist/ext/mcp/oauth-provider.js.map +1 -0
  422. package/dist/ext/mcp/types.d.ts +122 -0
  423. package/dist/ext/mcp/types.d.ts.map +1 -0
  424. package/dist/ext/mcp/types.js +6 -0
  425. package/dist/ext/mcp/types.js.map +1 -0
  426. package/dist/ext/skills/index.d.ts +7 -0
  427. package/dist/ext/skills/index.d.ts.map +1 -0
  428. package/dist/ext/skills/index.js +7 -0
  429. package/dist/ext/skills/index.js.map +1 -0
  430. package/dist/ext/skills/manager.d.ts +20 -0
  431. package/dist/ext/skills/manager.d.ts.map +1 -0
  432. package/dist/ext/skills/manager.js +27 -0
  433. package/dist/ext/skills/manager.js.map +1 -0
  434. package/dist/ext/skills/parser.d.ts +27 -0
  435. package/dist/ext/skills/parser.d.ts.map +1 -0
  436. package/dist/ext/skills/parser.js +87 -0
  437. package/dist/ext/skills/parser.js.map +1 -0
  438. package/dist/ext/skills/types.d.ts +34 -0
  439. package/dist/ext/skills/types.d.ts.map +1 -0
  440. package/dist/ext/skills/types.js +8 -0
  441. package/dist/ext/skills/types.js.map +1 -0
  442. package/dist/ext/subagents/configs.d.ts +35 -0
  443. package/dist/ext/subagents/configs.d.ts.map +1 -0
  444. package/dist/ext/subagents/configs.js +201 -0
  445. package/dist/ext/subagents/configs.js.map +1 -0
  446. package/dist/ext/subagents/index.d.ts +12 -0
  447. package/dist/ext/subagents/index.d.ts.map +1 -0
  448. package/dist/ext/subagents/index.js +12 -0
  449. package/dist/ext/subagents/index.js.map +1 -0
  450. package/dist/ext/subagents/manager.d.ts +66 -0
  451. package/dist/ext/subagents/manager.d.ts.map +1 -0
  452. package/dist/ext/subagents/manager.js +107 -0
  453. package/dist/ext/subagents/manager.js.map +1 -0
  454. package/dist/ext/subagents/parser.d.ts +17 -0
  455. package/dist/ext/subagents/parser.d.ts.map +1 -0
  456. package/dist/ext/subagents/parser.js +144 -0
  457. package/dist/ext/subagents/parser.js.map +1 -0
  458. package/dist/ext/subagents/result-cache.d.ts +78 -0
  459. package/dist/ext/subagents/result-cache.d.ts.map +1 -0
  460. package/dist/ext/subagents/result-cache.js +224 -0
  461. package/dist/ext/subagents/result-cache.js.map +1 -0
  462. package/dist/ext/subagents/subagent-session-manager.d.ts +68 -0
  463. package/dist/ext/subagents/subagent-session-manager.d.ts.map +1 -0
  464. package/dist/ext/subagents/subagent-session-manager.js +195 -0
  465. package/dist/ext/subagents/subagent-session-manager.js.map +1 -0
  466. package/dist/ext/subagents/subagent.d.ts +121 -0
  467. package/dist/ext/subagents/subagent.d.ts.map +1 -0
  468. package/dist/ext/subagents/subagent.js +425 -0
  469. package/dist/ext/subagents/subagent.js.map +1 -0
  470. package/dist/ext/subagents/types.d.ts +185 -0
  471. package/dist/ext/subagents/types.d.ts.map +1 -0
  472. package/dist/ext/subagents/types.js +19 -0
  473. package/dist/ext/subagents/types.js.map +1 -0
  474. package/dist/index.d.ts +6 -6
  475. package/dist/index.d.ts.map +1 -1
  476. package/dist/index.js +6 -6
  477. package/dist/index.js.map +1 -1
  478. package/docs/README.md +48 -6
  479. package/docs/command-environment-variables.md +150 -0
  480. package/docs/custom-agents.md +243 -0
  481. package/docs/custom-commands.md +329 -0
  482. package/docs/hooks.md +341 -0
  483. package/docs/mcp.md +496 -0
  484. package/docs/operating-modes.md +52 -11
  485. package/docs/permissions.md +31 -0
  486. package/docs/proposals/0003-task-subagents.md +144 -2
  487. package/docs/proposals/0004-plan-mode.md +58 -2
  488. package/docs/proposals/0008-checkpointing.md +154 -2
  489. package/docs/proposals/0009-hooks-system.md +141 -2
  490. package/docs/proposals/0010-mcp-integration.md +153 -2
  491. package/docs/proposals/0017-background-tasks.md +113 -2
  492. package/docs/proposals/0021-skills-system.md +124 -1
  493. package/docs/proposals/README.md +4 -4
  494. package/examples/custom-agents/README.md +126 -0
  495. package/examples/custom-agents/code-reviewer.json +10 -0
  496. package/examples/custom-agents/test-architect.md +63 -0
  497. package/examples/hooks-example.json +59 -0
  498. package/package.json +22 -3
  499. package/scripts/README.md +90 -0
  500. package/scripts/tests/test-commands-functional.ts +318 -0
  501. package/scripts/tests/test-commands-loading.ts +83 -0
  502. package/scripts/tests/test-component-loading.ts +281 -0
  503. package/scripts/tests/test-functional-all.ts +178 -0
  504. package/scripts/tests/test-hooks-functional.ts +342 -0
  505. package/scripts/tests/test-hooks-loading.ts +97 -0
  506. package/scripts/tests/test-mcp-loading.ts +118 -0
  507. package/scripts/tests/test-skills-functional.ts +256 -0
  508. package/scripts/tests/test-skills-loading.ts +75 -0
  509. package/scripts/tests/test-subagents-functional.ts +302 -0
  510. package/scripts/tests/test-subagents-loading.ts +80 -0
  511. package/src/base/config/levels.ts +237 -0
  512. package/src/base/config/providers-config.ts +87 -0
  513. package/src/base/config/types.ts +230 -0
  514. package/src/base/discovery/base-loader.ts +241 -0
  515. package/src/base/discovery/file-scanner.ts +221 -0
  516. package/src/base/discovery/index.ts +26 -0
  517. package/src/base/discovery/path-resolver.ts +130 -0
  518. package/src/base/discovery/types.ts +159 -0
  519. package/src/base/utils/config-validator.ts +191 -0
  520. package/src/base/utils/debug.ts +103 -0
  521. package/src/base/utils/format-utils.ts +71 -0
  522. package/src/base/utils/index.ts +12 -0
  523. package/src/base/utils/loading-reporter.ts +227 -0
  524. package/src/base/utils/logger.ts +99 -0
  525. package/src/base/utils/path-utils.ts +84 -0
  526. package/src/base/utils/stream-utils.ts +75 -0
  527. package/src/base/utils/validation.ts +22 -0
  528. package/src/cli/components/App.tsx +434 -22
  529. package/src/cli/components/CommandSuggestions.tsx +89 -13
  530. package/src/cli/components/DiffPreview.tsx +134 -0
  531. package/src/cli/components/Input.tsx +3 -1
  532. package/src/cli/components/Messages.tsx +148 -72
  533. package/src/cli/components/ModeIndicator.tsx +1 -1
  534. package/src/cli/components/ModelSelector.tsx +3 -3
  535. package/src/cli/components/PermissionPrompt.tsx +101 -70
  536. package/src/cli/components/PlanApproval.tsx +17 -7
  537. package/src/cli/components/ProviderManager.tsx +5 -5
  538. package/src/cli/components/QuestionPrompt.tsx +1 -1
  539. package/src/cli/components/TodoList.tsx +1 -1
  540. package/src/cli/components/index.ts +2 -1
  541. package/src/cli/components/markdown.ts +58 -6
  542. package/src/cli/components/theme.ts +63 -0
  543. package/src/cli/index.tsx +58 -17
  544. package/src/cli/planning/tools/enter-plan-mode.ts +111 -0
  545. package/src/cli/planning/tools/exit-plan-mode.ts +170 -0
  546. package/src/cli/planning/types.ts +154 -0
  547. package/src/cli/prompts/index.ts +400 -0
  548. package/src/cli/prompts/system/base.txt +191 -0
  549. package/src/cli/prompts/system/plan-mode.txt +96 -0
  550. package/src/core/agent/agent.ts +1050 -0
  551. package/src/core/memory/memory-manager.ts +845 -0
  552. package/src/core/permissions/validation.test.ts +619 -0
  553. package/src/core/providers/anthropic-vertex.ts +656 -0
  554. package/src/core/providers/google.ts +404 -0
  555. package/src/core/providers/index.ts +155 -0
  556. package/src/core/providers/registry.ts +203 -0
  557. package/src/core/providers/search/exa.ts +220 -0
  558. package/src/core/session/index.ts +10 -0
  559. package/src/core/session/manager.ts +692 -0
  560. package/src/core/session/tasks/index.ts +7 -0
  561. package/src/core/session/tasks/output-streamer.ts +245 -0
  562. package/src/core/session/tasks/task-manager.ts +619 -0
  563. package/src/core/session/tasks/types.ts +140 -0
  564. package/src/core/session/types.ts +80 -0
  565. package/src/core/tools/builtin/ask-user.ts +185 -0
  566. package/src/core/tools/builtin/bash.ts +125 -0
  567. package/src/core/tools/builtin/edit.ts +97 -0
  568. package/src/core/tools/builtin/glob.ts +43 -0
  569. package/src/core/tools/builtin/grep.ts +68 -0
  570. package/src/core/tools/builtin/read.ts +35 -0
  571. package/src/core/tools/builtin/taskoutput.ts +317 -0
  572. package/src/core/tools/builtin/todowrite.ts +104 -0
  573. package/src/core/tools/builtin/webfetch.ts +261 -0
  574. package/src/core/tools/builtin/websearch.ts +103 -0
  575. package/src/core/tools/builtin/write.ts +45 -0
  576. package/src/core/tools/factories/mcp-tool-factory.ts +109 -0
  577. package/src/core/tools/factories/skill-tool-factory.ts +181 -0
  578. package/src/core/tools/factories/task-tool-factory.ts +457 -0
  579. package/src/core/tools/index.ts +158 -0
  580. package/src/core/tools/registry.ts +179 -0
  581. package/src/core/tools/types.ts +306 -0
  582. package/src/ext/commands/discovery.ts +42 -0
  583. package/src/ext/commands/expander.ts +170 -0
  584. package/src/ext/commands/index.ts +12 -0
  585. package/src/ext/commands/manager.ts +210 -0
  586. package/src/ext/commands/parser.ts +136 -0
  587. package/src/ext/commands/types.ts +78 -0
  588. package/src/ext/hooks/executor.ts +284 -0
  589. package/src/ext/hooks/hooks-manager.ts +254 -0
  590. package/src/ext/hooks/index.ts +36 -0
  591. package/src/ext/hooks/matcher.ts +76 -0
  592. package/src/ext/hooks/types.ts +211 -0
  593. package/src/ext/hooks/utils.ts +230 -0
  594. package/src/ext/mcp/auth.ts +124 -0
  595. package/src/ext/mcp/client.ts +45 -0
  596. package/src/ext/mcp/config.ts +193 -0
  597. package/src/ext/mcp/connection.ts +111 -0
  598. package/src/ext/mcp/env-expand.ts +61 -0
  599. package/src/ext/mcp/index.ts +62 -0
  600. package/src/ext/mcp/manager.ts +287 -0
  601. package/src/ext/mcp/oauth-callback.ts +148 -0
  602. package/src/ext/mcp/oauth-provider.ts +211 -0
  603. package/src/ext/mcp/types.ts +146 -0
  604. package/src/ext/skills/index.ts +7 -0
  605. package/src/ext/skills/manager.test.ts +288 -0
  606. package/src/ext/skills/manager.ts +29 -0
  607. package/src/ext/skills/parser.test.ts +173 -0
  608. package/src/ext/skills/parser.ts +102 -0
  609. package/src/ext/skills/skill-tool.test.ts +172 -0
  610. package/src/ext/skills/types.ts +37 -0
  611. package/src/ext/subagents/configs.ts +214 -0
  612. package/src/ext/subagents/index.ts +12 -0
  613. package/src/ext/subagents/manager.ts +121 -0
  614. package/src/ext/subagents/parser.ts +160 -0
  615. package/src/ext/subagents/result-cache.ts +309 -0
  616. package/src/ext/subagents/subagent-session-manager.ts +250 -0
  617. package/src/ext/subagents/subagent.ts +536 -0
  618. package/src/ext/subagents/types.ts +241 -0
  619. package/src/index.ts +6 -6
  620. package/tests/config/hooks-config.test.ts +324 -0
  621. package/tests/hooks/executor.test.ts +132 -0
  622. package/tests/hooks/hooks-manager.test.ts +307 -0
  623. package/tests/hooks/matcher.test.ts +65 -0
  624. package/tests/hooks/utils.test.ts +224 -0
  625. package/tests/integration/hooks-config-loading.test.ts +363 -0
  626. package/tests/integration/hooks-integration.test.ts +249 -0
  627. package/RELEASE_NOTES_v0.4.0.md +0 -140
  628. package/dist/agent/agent.d.ts +0 -190
  629. package/dist/agent/agent.d.ts.map +0 -1
  630. package/dist/agent/agent.js +0 -668
  631. package/dist/agent/agent.js.map +0 -1
  632. package/dist/agent/index.d.ts.map +0 -1
  633. package/dist/agent/index.js.map +0 -1
  634. package/dist/agent/types.d.ts.map +0 -1
  635. package/dist/agent/types.js.map +0 -1
  636. package/dist/checkpointing/checkpoint-manager.d.ts.map +0 -1
  637. package/dist/checkpointing/checkpoint-manager.js.map +0 -1
  638. package/dist/checkpointing/index.d.ts.map +0 -1
  639. package/dist/checkpointing/index.js.map +0 -1
  640. package/dist/checkpointing/types.d.ts.map +0 -1
  641. package/dist/checkpointing/types.js.map +0 -1
  642. package/dist/cli/components/AllModelsSelector.d.ts +0 -11
  643. package/dist/cli/components/AllModelsSelector.d.ts.map +0 -1
  644. package/dist/cli/components/AllModelsSelector.js +0 -153
  645. package/dist/cli/components/AllModelsSelector.js.map +0 -1
  646. package/dist/cli/index-legacy.d.ts +0 -7
  647. package/dist/cli/index-legacy.d.ts.map +0 -1
  648. package/dist/cli/index-legacy.js +0 -431
  649. package/dist/cli/index-legacy.js.map +0 -1
  650. package/dist/cli/ink-cli.d.ts +0 -7
  651. package/dist/cli/ink-cli.d.ts.map +0 -1
  652. package/dist/cli/ink-cli.js +0 -105
  653. package/dist/cli/ink-cli.js.map +0 -1
  654. package/dist/cli/session-picker.d.ts +0 -16
  655. package/dist/cli/session-picker.d.ts.map +0 -1
  656. package/dist/cli/session-picker.js +0 -280
  657. package/dist/cli/session-picker.js.map +0 -1
  658. package/dist/cli/ui.d.ts +0 -61
  659. package/dist/cli/ui.d.ts.map +0 -1
  660. package/dist/cli/ui.js +0 -364
  661. package/dist/cli/ui.js.map +0 -1
  662. package/dist/config/index.d.ts.map +0 -1
  663. package/dist/config/index.js.map +0 -1
  664. package/dist/config/levels.d.ts +0 -49
  665. package/dist/config/levels.d.ts.map +0 -1
  666. package/dist/config/levels.js +0 -222
  667. package/dist/config/levels.js.map +0 -1
  668. package/dist/config/loader.d.ts.map +0 -1
  669. package/dist/config/loader.js.map +0 -1
  670. package/dist/config/manager.d.ts.map +0 -1
  671. package/dist/config/manager.js.map +0 -1
  672. package/dist/config/manager.test.d.ts +0 -5
  673. package/dist/config/manager.test.d.ts.map +0 -1
  674. package/dist/config/manager.test.js +0 -192
  675. package/dist/config/manager.test.js.map +0 -1
  676. package/dist/config/merger.d.ts.map +0 -1
  677. package/dist/config/merger.js.map +0 -1
  678. package/dist/config/providers-config.d.ts.map +0 -1
  679. package/dist/config/providers-config.js +0 -76
  680. package/dist/config/providers-config.js.map +0 -1
  681. package/dist/config/test-utils.d.ts.map +0 -1
  682. package/dist/config/test-utils.js.map +0 -1
  683. package/dist/config/types.d.ts +0 -146
  684. package/dist/config/types.d.ts.map +0 -1
  685. package/dist/config/types.js +0 -57
  686. package/dist/config/types.js.map +0 -1
  687. package/dist/input/history-manager.d.ts.map +0 -1
  688. package/dist/input/history-manager.js.map +0 -1
  689. package/dist/input/index.d.ts.map +0 -1
  690. package/dist/input/index.js.map +0 -1
  691. package/dist/memory/import-resolver.d.ts.map +0 -1
  692. package/dist/memory/import-resolver.js.map +0 -1
  693. package/dist/memory/index.d.ts.map +0 -1
  694. package/dist/memory/index.js.map +0 -1
  695. package/dist/memory/init-prompt.d.ts.map +0 -1
  696. package/dist/memory/init-prompt.js.map +0 -1
  697. package/dist/memory/init.d.ts +0 -20
  698. package/dist/memory/init.d.ts.map +0 -1
  699. package/dist/memory/init.js +0 -332
  700. package/dist/memory/init.js.map +0 -1
  701. package/dist/memory/manager.d.ts +0 -85
  702. package/dist/memory/manager.d.ts.map +0 -1
  703. package/dist/memory/manager.js +0 -234
  704. package/dist/memory/manager.js.map +0 -1
  705. package/dist/memory/memory-manager.d.ts.map +0 -1
  706. package/dist/memory/memory-manager.js +0 -716
  707. package/dist/memory/memory-manager.js.map +0 -1
  708. package/dist/memory/rules-parser.d.ts.map +0 -1
  709. package/dist/memory/rules-parser.js.map +0 -1
  710. package/dist/memory/test-utils.d.ts.map +0 -1
  711. package/dist/memory/test-utils.js.map +0 -1
  712. package/dist/memory/types.d.ts.map +0 -1
  713. package/dist/memory/types.js.map +0 -1
  714. package/dist/migration/migrate.d.ts +0 -24
  715. package/dist/migration/migrate.d.ts.map +0 -1
  716. package/dist/migration/migrate.js +0 -164
  717. package/dist/migration/migrate.js.map +0 -1
  718. package/dist/permissions/audit.d.ts.map +0 -1
  719. package/dist/permissions/audit.js.map +0 -1
  720. package/dist/permissions/index.d.ts.map +0 -1
  721. package/dist/permissions/index.js.map +0 -1
  722. package/dist/permissions/manager.d.ts.map +0 -1
  723. package/dist/permissions/manager.js.map +0 -1
  724. package/dist/permissions/manager.test.d.ts +0 -5
  725. package/dist/permissions/manager.test.d.ts.map +0 -1
  726. package/dist/permissions/manager.test.js +0 -213
  727. package/dist/permissions/manager.test.js.map +0 -1
  728. package/dist/permissions/persistence.d.ts.map +0 -1
  729. package/dist/permissions/persistence.js.map +0 -1
  730. package/dist/permissions/persistence.test.d.ts +0 -5
  731. package/dist/permissions/persistence.test.d.ts.map +0 -1
  732. package/dist/permissions/persistence.test.js +0 -171
  733. package/dist/permissions/persistence.test.js.map +0 -1
  734. package/dist/permissions/prompt-matcher.d.ts.map +0 -1
  735. package/dist/permissions/prompt-matcher.js.map +0 -1
  736. package/dist/permissions/prompt-matcher.test.d.ts +0 -5
  737. package/dist/permissions/prompt-matcher.test.d.ts.map +0 -1
  738. package/dist/permissions/prompt-matcher.test.js +0 -107
  739. package/dist/permissions/prompt-matcher.test.js.map +0 -1
  740. package/dist/permissions/types.d.ts.map +0 -1
  741. package/dist/permissions/types.js.map +0 -1
  742. package/dist/planning/index.d.ts.map +0 -1
  743. package/dist/planning/index.js.map +0 -1
  744. package/dist/planning/plan-file.d.ts.map +0 -1
  745. package/dist/planning/plan-file.js.map +0 -1
  746. package/dist/planning/state.d.ts.map +0 -1
  747. package/dist/planning/state.js.map +0 -1
  748. package/dist/planning/tools/enter-plan-mode.d.ts +0 -25
  749. package/dist/planning/tools/enter-plan-mode.d.ts.map +0 -1
  750. package/dist/planning/tools/enter-plan-mode.js.map +0 -1
  751. package/dist/planning/tools/exit-plan-mode.d.ts +0 -24
  752. package/dist/planning/tools/exit-plan-mode.d.ts.map +0 -1
  753. package/dist/planning/tools/exit-plan-mode.js.map +0 -1
  754. package/dist/planning/types.d.ts +0 -100
  755. package/dist/planning/types.d.ts.map +0 -1
  756. package/dist/planning/types.js +0 -28
  757. package/dist/planning/types.js.map +0 -1
  758. package/dist/pricing/calculator.d.ts.map +0 -1
  759. package/dist/pricing/calculator.js.map +0 -1
  760. package/dist/pricing/index.d.ts.map +0 -1
  761. package/dist/pricing/index.js.map +0 -1
  762. package/dist/pricing/models.d.ts.map +0 -1
  763. package/dist/pricing/models.js.map +0 -1
  764. package/dist/pricing/types.d.ts.map +0 -1
  765. package/dist/pricing/types.js.map +0 -1
  766. package/dist/prompts/index.d.ts +0 -93
  767. package/dist/prompts/index.d.ts.map +0 -1
  768. package/dist/prompts/index.js +0 -244
  769. package/dist/prompts/index.js.map +0 -1
  770. package/dist/providers/anthropic.d.ts.map +0 -1
  771. package/dist/providers/anthropic.js.map +0 -1
  772. package/dist/providers/gemini.d.ts +0 -22
  773. package/dist/providers/gemini.d.ts.map +0 -1
  774. package/dist/providers/gemini.js +0 -297
  775. package/dist/providers/gemini.js.map +0 -1
  776. package/dist/providers/google.d.ts.map +0 -1
  777. package/dist/providers/google.js +0 -297
  778. package/dist/providers/google.js.map +0 -1
  779. package/dist/providers/index.d.ts +0 -46
  780. package/dist/providers/index.d.ts.map +0 -1
  781. package/dist/providers/index.js +0 -108
  782. package/dist/providers/index.js.map +0 -1
  783. package/dist/providers/openai.d.ts.map +0 -1
  784. package/dist/providers/openai.js.map +0 -1
  785. package/dist/providers/registry.d.ts.map +0 -1
  786. package/dist/providers/registry.js +0 -142
  787. package/dist/providers/registry.js.map +0 -1
  788. package/dist/providers/search/brave.d.ts.map +0 -1
  789. package/dist/providers/search/brave.js.map +0 -1
  790. package/dist/providers/search/exa.d.ts.map +0 -1
  791. package/dist/providers/search/exa.js +0 -158
  792. package/dist/providers/search/exa.js.map +0 -1
  793. package/dist/providers/search/index.d.ts.map +0 -1
  794. package/dist/providers/search/index.js.map +0 -1
  795. package/dist/providers/search/serper.d.ts.map +0 -1
  796. package/dist/providers/search/serper.js.map +0 -1
  797. package/dist/providers/search/types.d.ts.map +0 -1
  798. package/dist/providers/search/types.js.map +0 -1
  799. package/dist/providers/store.d.ts.map +0 -1
  800. package/dist/providers/store.js.map +0 -1
  801. package/dist/providers/types.d.ts.map +0 -1
  802. package/dist/providers/types.js.map +0 -1
  803. package/dist/providers/vertex-ai.d.ts.map +0 -1
  804. package/dist/providers/vertex-ai.js +0 -447
  805. package/dist/providers/vertex-ai.js.map +0 -1
  806. package/dist/session/compression/engine.d.ts.map +0 -1
  807. package/dist/session/compression/engine.js.map +0 -1
  808. package/dist/session/compression/index.d.ts.map +0 -1
  809. package/dist/session/compression/index.js.map +0 -1
  810. package/dist/session/compression/types.d.ts.map +0 -1
  811. package/dist/session/compression/types.js.map +0 -1
  812. package/dist/session/index.d.ts +0 -6
  813. package/dist/session/index.d.ts.map +0 -1
  814. package/dist/session/index.js +0 -6
  815. package/dist/session/index.js.map +0 -1
  816. package/dist/session/manager.d.ts +0 -166
  817. package/dist/session/manager.d.ts.map +0 -1
  818. package/dist/session/manager.js +0 -555
  819. package/dist/session/manager.js.map +0 -1
  820. package/dist/session/types.d.ts +0 -55
  821. package/dist/session/types.d.ts.map +0 -1
  822. package/dist/session/types.js.map +0 -1
  823. package/dist/tools/builtin/ask-user.d.ts.map +0 -1
  824. package/dist/tools/builtin/ask-user.js +0 -148
  825. package/dist/tools/builtin/ask-user.js.map +0 -1
  826. package/dist/tools/builtin/bash.d.ts.map +0 -1
  827. package/dist/tools/builtin/bash.js +0 -81
  828. package/dist/tools/builtin/bash.js.map +0 -1
  829. package/dist/tools/builtin/edit.d.ts.map +0 -1
  830. package/dist/tools/builtin/edit.js +0 -33
  831. package/dist/tools/builtin/edit.js.map +0 -1
  832. package/dist/tools/builtin/glob.d.ts.map +0 -1
  833. package/dist/tools/builtin/glob.js +0 -37
  834. package/dist/tools/builtin/glob.js.map +0 -1
  835. package/dist/tools/builtin/grep.d.ts.map +0 -1
  836. package/dist/tools/builtin/grep.js +0 -60
  837. package/dist/tools/builtin/grep.js.map +0 -1
  838. package/dist/tools/builtin/read.d.ts.map +0 -1
  839. package/dist/tools/builtin/read.js +0 -30
  840. package/dist/tools/builtin/read.js.map +0 -1
  841. package/dist/tools/builtin/todowrite.d.ts.map +0 -1
  842. package/dist/tools/builtin/todowrite.js +0 -88
  843. package/dist/tools/builtin/todowrite.js.map +0 -1
  844. package/dist/tools/builtin/webfetch.d.ts.map +0 -1
  845. package/dist/tools/builtin/webfetch.js +0 -228
  846. package/dist/tools/builtin/webfetch.js.map +0 -1
  847. package/dist/tools/builtin/websearch.d.ts.map +0 -1
  848. package/dist/tools/builtin/websearch.js +0 -87
  849. package/dist/tools/builtin/websearch.js.map +0 -1
  850. package/dist/tools/builtin/write.d.ts +0 -7
  851. package/dist/tools/builtin/write.d.ts.map +0 -1
  852. package/dist/tools/builtin/write.js +0 -25
  853. package/dist/tools/builtin/write.js.map +0 -1
  854. package/dist/tools/index.d.ts +0 -74
  855. package/dist/tools/index.d.ts.map +0 -1
  856. package/dist/tools/index.js +0 -69
  857. package/dist/tools/index.js.map +0 -1
  858. package/dist/tools/registry.d.ts +0 -35
  859. package/dist/tools/registry.d.ts.map +0 -1
  860. package/dist/tools/registry.js +0 -148
  861. package/dist/tools/registry.js.map +0 -1
  862. package/dist/tools/types.d.ts +0 -120
  863. package/dist/tools/types.d.ts.map +0 -1
  864. package/dist/tools/types.js +0 -142
  865. package/dist/tools/types.js.map +0 -1
  866. package/dist/tools/utils/ssrf.d.ts.map +0 -1
  867. package/dist/tools/utils/ssrf.js.map +0 -1
  868. package/docs/config-system-comparison.md +0 -707
  869. package/docs/cost-tracking-comparison.md +0 -904
  870. package/examples/test-ask-user.ts +0 -167
  871. package/examples/test-checkpointing.ts +0 -121
  872. package/examples/test-cost-tracking.ts +0 -77
  873. package/examples/test-interrupt-cleanup.ts +0 -94
  874. package/src/agent/agent.ts +0 -808
  875. package/src/config/levels.ts +0 -285
  876. package/src/config/providers-config.ts +0 -87
  877. package/src/config/types.ts +0 -237
  878. package/src/memory/memory-manager.ts +0 -845
  879. package/src/planning/tools/enter-plan-mode.ts +0 -111
  880. package/src/planning/tools/exit-plan-mode.ts +0 -170
  881. package/src/planning/types.ts +0 -150
  882. package/src/prompts/index.ts +0 -310
  883. package/src/prompts/system/base.txt +0 -166
  884. package/src/providers/google.ts +0 -382
  885. package/src/providers/index.ts +0 -155
  886. package/src/providers/registry.ts +0 -203
  887. package/src/providers/search/exa.ts +0 -217
  888. package/src/providers/vertex-ai.ts +0 -641
  889. package/src/session/index.ts +0 -6
  890. package/src/session/manager.ts +0 -686
  891. package/src/session/types.ts +0 -70
  892. package/src/tools/builtin/ask-user.ts +0 -185
  893. package/src/tools/builtin/bash.ts +0 -93
  894. package/src/tools/builtin/edit.ts +0 -38
  895. package/src/tools/builtin/glob.ts +0 -43
  896. package/src/tools/builtin/grep.ts +0 -68
  897. package/src/tools/builtin/read.ts +0 -35
  898. package/src/tools/builtin/todowrite.ts +0 -102
  899. package/src/tools/builtin/webfetch.ts +0 -261
  900. package/src/tools/builtin/websearch.ts +0 -103
  901. package/src/tools/builtin/write.ts +0 -28
  902. package/src/tools/index.ts +0 -85
  903. package/src/tools/registry.ts +0 -176
  904. package/src/tools/types.ts +0 -222
  905. /package/dist/{config → base/config}/index.d.ts +0 -0
  906. /package/dist/{config → base/config}/index.js +0 -0
  907. /package/dist/{config → base/config}/loader.d.ts +0 -0
  908. /package/dist/{config → base/config}/loader.js +0 -0
  909. /package/dist/{config → base/config}/manager.d.ts +0 -0
  910. /package/dist/{config → base/config}/manager.js +0 -0
  911. /package/dist/{config → base/config}/merger.d.ts +0 -0
  912. /package/dist/{config → base/config}/merger.js +0 -0
  913. /package/dist/{config → base/config}/providers-config.d.ts +0 -0
  914. /package/dist/{config → base/config}/test-utils.d.ts +0 -0
  915. /package/dist/{config → base/config}/test-utils.js +0 -0
  916. /package/dist/{planning → cli/planning}/index.d.ts +0 -0
  917. /package/dist/{planning → cli/planning}/index.js +0 -0
  918. /package/dist/{planning → cli/planning}/plan-file.d.ts +0 -0
  919. /package/dist/{planning → cli/planning}/plan-file.js +0 -0
  920. /package/dist/{planning → cli/planning}/state.d.ts +0 -0
  921. /package/dist/{planning → cli/planning}/state.js +0 -0
  922. /package/dist/{planning → cli/planning}/tools/enter-plan-mode.js +0 -0
  923. /package/dist/{planning → cli/planning}/tools/exit-plan-mode.js +0 -0
  924. /package/dist/{agent → core/agent}/index.d.ts +0 -0
  925. /package/dist/{agent → core/agent}/index.js +0 -0
  926. /package/dist/{agent → core/agent}/types.d.ts +0 -0
  927. /package/dist/{agent → core/agent}/types.js +0 -0
  928. /package/dist/{memory → core/memory}/import-resolver.d.ts +0 -0
  929. /package/dist/{memory → core/memory}/import-resolver.js +0 -0
  930. /package/dist/{memory → core/memory}/index.d.ts +0 -0
  931. /package/dist/{memory → core/memory}/index.js +0 -0
  932. /package/dist/{memory → core/memory}/init-prompt.d.ts +0 -0
  933. /package/dist/{memory → core/memory}/init-prompt.js +0 -0
  934. /package/dist/{memory → core/memory}/memory-manager.d.ts +0 -0
  935. /package/dist/{memory → core/memory}/rules-parser.d.ts +0 -0
  936. /package/dist/{memory → core/memory}/rules-parser.js +0 -0
  937. /package/dist/{memory → core/memory}/test-utils.d.ts +0 -0
  938. /package/dist/{memory → core/memory}/test-utils.js +0 -0
  939. /package/dist/{memory → core/memory}/types.d.ts +0 -0
  940. /package/dist/{memory → core/memory}/types.js +0 -0
  941. /package/dist/{permissions → core/permissions}/audit.d.ts +0 -0
  942. /package/dist/{permissions → core/permissions}/audit.js +0 -0
  943. /package/dist/{permissions → core/permissions}/index.d.ts +0 -0
  944. /package/dist/{permissions → core/permissions}/index.js +0 -0
  945. /package/dist/{permissions → core/permissions}/manager.d.ts +0 -0
  946. /package/dist/{permissions → core/permissions}/manager.js +0 -0
  947. /package/dist/{permissions → core/permissions}/persistence.d.ts +0 -0
  948. /package/dist/{permissions → core/permissions}/persistence.js +0 -0
  949. /package/dist/{permissions → core/permissions}/prompt-matcher.d.ts +0 -0
  950. /package/dist/{permissions → core/permissions}/prompt-matcher.js +0 -0
  951. /package/dist/{permissions → core/permissions}/types.d.ts +0 -0
  952. /package/dist/{permissions → core/permissions}/types.js +0 -0
  953. /package/dist/{pricing → core/pricing}/calculator.d.ts +0 -0
  954. /package/dist/{pricing → core/pricing}/calculator.js +0 -0
  955. /package/dist/{pricing → core/pricing}/index.d.ts +0 -0
  956. /package/dist/{pricing → core/pricing}/index.js +0 -0
  957. /package/dist/{pricing → core/pricing}/models.d.ts +0 -0
  958. /package/dist/{pricing → core/pricing}/models.js +0 -0
  959. /package/dist/{pricing → core/pricing}/types.d.ts +0 -0
  960. /package/dist/{pricing → core/pricing}/types.js +0 -0
  961. /package/dist/{providers → core/providers}/anthropic.d.ts +0 -0
  962. /package/dist/{providers → core/providers}/anthropic.js +0 -0
  963. /package/dist/{providers → core/providers}/google.d.ts +0 -0
  964. /package/dist/{providers → core/providers}/openai.d.ts +0 -0
  965. /package/dist/{providers → core/providers}/openai.js +0 -0
  966. /package/dist/{providers → core/providers}/registry.d.ts +0 -0
  967. /package/dist/{providers → core/providers}/search/brave.d.ts +0 -0
  968. /package/dist/{providers → core/providers}/search/brave.js +0 -0
  969. /package/dist/{providers → core/providers}/search/exa.d.ts +0 -0
  970. /package/dist/{providers → core/providers}/search/index.d.ts +0 -0
  971. /package/dist/{providers → core/providers}/search/index.js +0 -0
  972. /package/dist/{providers → core/providers}/search/serper.d.ts +0 -0
  973. /package/dist/{providers → core/providers}/search/serper.js +0 -0
  974. /package/dist/{providers → core/providers}/search/types.d.ts +0 -0
  975. /package/dist/{providers → core/providers}/search/types.js +0 -0
  976. /package/dist/{providers → core/providers}/store.d.ts +0 -0
  977. /package/dist/{providers → core/providers}/store.js +0 -0
  978. /package/dist/{providers → core/providers}/types.d.ts +0 -0
  979. /package/dist/{providers → core/providers}/types.js +0 -0
  980. /package/dist/{providers → core/providers}/vertex-ai.d.ts +0 -0
  981. /package/dist/{checkpointing → core/session/checkpointing}/checkpoint-manager.d.ts +0 -0
  982. /package/dist/{checkpointing → core/session/checkpointing}/checkpoint-manager.js +0 -0
  983. /package/dist/{checkpointing → core/session/checkpointing}/index.d.ts +0 -0
  984. /package/dist/{checkpointing → core/session/checkpointing}/index.js +0 -0
  985. /package/dist/{checkpointing → core/session/checkpointing}/types.d.ts +0 -0
  986. /package/dist/{checkpointing → core/session/checkpointing}/types.js +0 -0
  987. /package/dist/{session → core/session}/compression/engine.d.ts +0 -0
  988. /package/dist/{session → core/session}/compression/engine.js +0 -0
  989. /package/dist/{session → core/session}/compression/index.d.ts +0 -0
  990. /package/dist/{session → core/session}/compression/index.js +0 -0
  991. /package/dist/{session → core/session}/compression/types.d.ts +0 -0
  992. /package/dist/{session → core/session}/compression/types.js +0 -0
  993. /package/dist/{input → core/session/input}/history-manager.d.ts +0 -0
  994. /package/dist/{input → core/session/input}/history-manager.js +0 -0
  995. /package/dist/{input → core/session/input}/index.d.ts +0 -0
  996. /package/dist/{input → core/session/input}/index.js +0 -0
  997. /package/dist/{session → core/session}/types.js +0 -0
  998. /package/dist/{tools → core/tools}/builtin/ask-user.d.ts +0 -0
  999. /package/dist/{tools → core/tools}/builtin/bash.d.ts +0 -0
  1000. /package/dist/{tools → core/tools}/builtin/edit.d.ts +0 -0
  1001. /package/dist/{tools → core/tools}/builtin/glob.d.ts +0 -0
  1002. /package/dist/{tools → core/tools}/builtin/grep.d.ts +0 -0
  1003. /package/dist/{tools → core/tools}/builtin/read.d.ts +0 -0
  1004. /package/dist/{tools → core/tools}/builtin/todowrite.d.ts +0 -0
  1005. /package/dist/{tools → core/tools}/builtin/webfetch.d.ts +0 -0
  1006. /package/dist/{tools → core/tools}/builtin/websearch.d.ts +0 -0
  1007. /package/dist/{tools → core/tools}/utils/ssrf.d.ts +0 -0
  1008. /package/dist/{tools → core/tools}/utils/ssrf.js +0 -0
  1009. /package/src/{config → base/config}/index.ts +0 -0
  1010. /package/src/{config → base/config}/levels.test.ts +0 -0
  1011. /package/src/{config → base/config}/loader.test.ts +0 -0
  1012. /package/src/{config → base/config}/loader.ts +0 -0
  1013. /package/src/{config → base/config}/manager.test.ts +0 -0
  1014. /package/src/{config → base/config}/manager.ts +0 -0
  1015. /package/src/{config → base/config}/merger.test.ts +0 -0
  1016. /package/src/{config → base/config}/merger.ts +0 -0
  1017. /package/src/{config → base/config}/test-utils.ts +0 -0
  1018. /package/src/{planning → cli/planning}/index.ts +0 -0
  1019. /package/src/{planning → cli/planning}/plan-file.ts +0 -0
  1020. /package/src/{planning → cli/planning}/state.ts +0 -0
  1021. /package/src/{prompts → cli/prompts}/index.test.ts +0 -0
  1022. /package/src/{prompts → cli/prompts}/system/anthropic.txt +0 -0
  1023. /package/src/{prompts → cli/prompts}/system/gemini.txt +0 -0
  1024. /package/src/{prompts → cli/prompts}/system/generic.txt +0 -0
  1025. /package/src/{prompts → cli/prompts}/system/openai.txt +0 -0
  1026. /package/src/{prompts → cli/prompts}/tools/ask-user.txt +0 -0
  1027. /package/src/{prompts → cli/prompts}/tools/bash.txt +0 -0
  1028. /package/src/{prompts → cli/prompts}/tools/edit.txt +0 -0
  1029. /package/src/{prompts → cli/prompts}/tools/glob.txt +0 -0
  1030. /package/src/{prompts → cli/prompts}/tools/grep.txt +0 -0
  1031. /package/src/{prompts → cli/prompts}/tools/read.txt +0 -0
  1032. /package/src/{prompts → cli/prompts}/tools/todowrite.txt +0 -0
  1033. /package/src/{prompts → cli/prompts}/tools/webfetch.txt +0 -0
  1034. /package/src/{prompts → cli/prompts}/tools/websearch.txt +0 -0
  1035. /package/src/{prompts → cli/prompts}/tools/write.txt +0 -0
  1036. /package/src/{agent → core/agent}/index.ts +0 -0
  1037. /package/src/{agent → core/agent}/types.ts +0 -0
  1038. /package/src/{memory → core/memory}/import-resolver.test.ts +0 -0
  1039. /package/src/{memory → core/memory}/import-resolver.ts +0 -0
  1040. /package/src/{memory → core/memory}/index.ts +0 -0
  1041. /package/src/{memory → core/memory}/init-prompt.ts +0 -0
  1042. /package/src/{memory → core/memory}/memory-manager.test.ts +0 -0
  1043. /package/src/{memory → core/memory}/rules-parser.test.ts +0 -0
  1044. /package/src/{memory → core/memory}/rules-parser.ts +0 -0
  1045. /package/src/{memory → core/memory}/test-utils.ts +0 -0
  1046. /package/src/{memory → core/memory}/types.ts +0 -0
  1047. /package/src/{permissions → core/permissions}/audit.ts +0 -0
  1048. /package/src/{permissions → core/permissions}/index.ts +0 -0
  1049. /package/src/{permissions → core/permissions}/manager.test.ts +0 -0
  1050. /package/src/{permissions → core/permissions}/manager.ts +0 -0
  1051. /package/src/{permissions → core/permissions}/persistence.test.ts +0 -0
  1052. /package/src/{permissions → core/permissions}/persistence.ts +0 -0
  1053. /package/src/{permissions → core/permissions}/prompt-matcher.test.ts +0 -0
  1054. /package/src/{permissions → core/permissions}/prompt-matcher.ts +0 -0
  1055. /package/src/{permissions → core/permissions}/types.ts +0 -0
  1056. /package/src/{pricing → core/pricing}/calculator.ts +0 -0
  1057. /package/src/{pricing → core/pricing}/index.ts +0 -0
  1058. /package/src/{pricing → core/pricing}/models.ts +0 -0
  1059. /package/src/{pricing → core/pricing}/types.ts +0 -0
  1060. /package/src/{providers → core/providers}/anthropic.ts +0 -0
  1061. /package/src/{providers → core/providers}/openai.ts +0 -0
  1062. /package/src/{providers → core/providers}/search/brave.ts +0 -0
  1063. /package/src/{providers → core/providers}/search/index.ts +0 -0
  1064. /package/src/{providers → core/providers}/search/serper.ts +0 -0
  1065. /package/src/{providers → core/providers}/search/types.ts +0 -0
  1066. /package/src/{providers → core/providers}/store.ts +0 -0
  1067. /package/src/{providers → core/providers}/types.ts +0 -0
  1068. /package/src/{checkpointing → core/session/checkpointing}/checkpoint-manager.ts +0 -0
  1069. /package/src/{checkpointing → core/session/checkpointing}/index.ts +0 -0
  1070. /package/src/{checkpointing → core/session/checkpointing}/types.ts +0 -0
  1071. /package/src/{session → core/session}/compression/engine.ts +0 -0
  1072. /package/src/{session → core/session}/compression/index.ts +0 -0
  1073. /package/src/{session → core/session}/compression/types.ts +0 -0
  1074. /package/src/{input → core/session/input}/history-manager.ts +0 -0
  1075. /package/src/{input → core/session/input}/index.ts +0 -0
  1076. /package/src/{tools → core/tools}/utils/ssrf.ts +0 -0
@@ -0,0 +1,1050 @@
1
+ /**
2
+ * Agent - Core agent implementation with tool loop and session support
3
+ */
4
+
5
+ import type { LLMProvider, Message, ToolResultContent, Provider, AuthMethod } from '../providers/types.js';
6
+ import { createProvider, inferProvider, inferAuthMethod } from '../providers/index.js';
7
+ import { ToolRegistry, createDefaultRegistry } from '../tools/index.js';
8
+ import {
9
+ PermissionManager,
10
+ type ApprovalAction,
11
+ type ApprovalSuggestion,
12
+ type PromptPermission,
13
+ type PermissionSettings,
14
+ } from '../permissions/index.js';
15
+ import { SessionManager } from '../session/index.js';
16
+ import { MemoryManager, type LoadedMemory } from '../memory/index.js';
17
+ import type { AgentConfig, AgentEvent } from './types.js';
18
+ import { buildSystemPromptWithPlanMode, debugPromptLoading } from '../../cli/prompts/index.js';
19
+ import type { Question, QuestionAnswer } from '../tools/types.js';
20
+ import {
21
+ getPlanModeManager,
22
+ type PlanModeManager,
23
+ type ModeType,
24
+ type AllowedPrompt,
25
+ } from '../../cli/planning/index.js';
26
+ import { initCheckpointManager } from '../session/checkpointing/index.js';
27
+ import { HooksManager } from '../../ext/hooks/index.js';
28
+ import type { HooksConfig } from '../../ext/hooks/index.js';
29
+ import { CommandManager } from '../../ext/commands/manager.js';
30
+ import type { ParsedCommand } from '../../ext/commands/types.js';
31
+
32
+ // Type for askUser callback
33
+ export type AskUserCallback = (questions: Question[]) => Promise<QuestionAnswer[]>;
34
+
35
+ export class Agent {
36
+ private provider: LLMProvider;
37
+ private registry: ToolRegistry | null = null; // Lazy-initialized for async skill discovery
38
+ private registryPromise: Promise<ToolRegistry> | null = null; // Mutex for registry initialization
39
+ private commandManager: CommandManager | null = null; // Lazy-initialized for async command discovery
40
+ private commandManagerPromise: Promise<CommandManager> | null = null; // Mutex for command manager initialization
41
+ private permissions: PermissionManager;
42
+ private sessionManager: SessionManager;
43
+ private memoryManager: MemoryManager;
44
+ private planModeManager: PlanModeManager;
45
+ private hooksManager: HooksManager;
46
+ private config: AgentConfig;
47
+ private sessionId: string | null = null;
48
+ private loadedMemory: LoadedMemory | null = null;
49
+ private askUserCallback: AskUserCallback | null = null;
50
+ private askPermissionCallback: ((request: import('../tools/types.js').PermissionRequest) => Promise<ApprovalAction | undefined>) | null = null;
51
+
52
+ constructor(config: AgentConfig) {
53
+ this.config = {
54
+ maxTurns: 10,
55
+ cwd: process.cwd(),
56
+ ...config,
57
+ };
58
+
59
+ this.provider = createProvider({
60
+ provider: config.provider,
61
+ authMethod: config.authMethod,
62
+ });
63
+ // Registry is now initialized lazily in ensureRegistry()
64
+ this.permissions = new PermissionManager({
65
+ config: config.permissions,
66
+ projectPath: config.cwd,
67
+ });
68
+ this.sessionManager = new SessionManager({
69
+ compression: config.compression,
70
+ });
71
+ this.memoryManager = new MemoryManager();
72
+ this.planModeManager = getPlanModeManager();
73
+ this.hooksManager = new HooksManager();
74
+
75
+ // Set compression engine with current model
76
+ this.sessionManager.setCompressionEngine(this.provider, this.config.model);
77
+ }
78
+
79
+ /**
80
+ * Ensure tool registry is initialized (lazy loading for async skill discovery)
81
+ * Thread-safe: Prevents concurrent initialization using a mutex
82
+ */
83
+ private async ensureRegistry(): Promise<ToolRegistry> {
84
+ // If already initialized, return immediately
85
+ if (this.registry) {
86
+ return this.registry;
87
+ }
88
+
89
+ // If initialization is in progress, wait for it
90
+ if (this.registryPromise) {
91
+ return this.registryPromise;
92
+ }
93
+
94
+ // Start new initialization
95
+ this.registryPromise = createDefaultRegistry(this.config.cwd ?? process.cwd());
96
+
97
+ try {
98
+ this.registry = await this.registryPromise;
99
+ return this.registry;
100
+ } finally {
101
+ // Clear the promise after initialization completes
102
+ this.registryPromise = null;
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Ensure command manager is initialized (lazy loading for async command discovery)
108
+ * Thread-safe: Prevents concurrent initialization using a mutex
109
+ */
110
+ private async ensureCommandManager(): Promise<CommandManager> {
111
+ // If already initialized, return immediately
112
+ if (this.commandManager) {
113
+ return this.commandManager;
114
+ }
115
+
116
+ // If initialization is in progress, wait for it
117
+ if (this.commandManagerPromise) {
118
+ return this.commandManagerPromise;
119
+ }
120
+
121
+ // Start new initialization
122
+ const cwd = this.config.cwd ?? process.cwd();
123
+ this.commandManagerPromise = (async () => {
124
+ const manager = new CommandManager(cwd);
125
+ await manager.initialize();
126
+ return manager;
127
+ })();
128
+
129
+ try {
130
+ this.commandManager = await this.commandManagerPromise;
131
+ return this.commandManager;
132
+ } finally {
133
+ // Clear the promise after initialization completes
134
+ this.commandManagerPromise = null;
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Initialize permission system (load persisted rules)
140
+ */
141
+ async initializePermissions(settings?: PermissionSettings): Promise<void> {
142
+ await this.permissions.initialize(settings);
143
+ }
144
+
145
+ /**
146
+ * Initialize hooks system (load hooks configuration)
147
+ */
148
+ initializeHooks(hooksConfig?: HooksConfig): void {
149
+ if (hooksConfig) {
150
+ this.hooksManager.setConfig(hooksConfig);
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Set simple permission confirmation callback (backward compatible)
156
+ */
157
+ setConfirmCallback(callback: (tool: string, input: unknown) => Promise<boolean>): void {
158
+ this.permissions.setSimpleConfirmCallback(callback);
159
+ }
160
+
161
+ /**
162
+ * Set enhanced permission confirmation callback with approval options
163
+ */
164
+ setEnhancedConfirmCallback(
165
+ callback: (
166
+ tool: string,
167
+ input: unknown,
168
+ suggestions: ApprovalSuggestion[]
169
+ ) => Promise<ApprovalAction>
170
+ ): void {
171
+ this.permissions.setConfirmCallback(callback);
172
+ }
173
+
174
+ /**
175
+ * Add prompt-based permissions (Claude Code ExitPlanMode style)
176
+ */
177
+ addAllowedPrompts(prompts: PromptPermission[]): void {
178
+ this.permissions.addAllowedPrompts(prompts);
179
+ }
180
+
181
+ /**
182
+ * Clear prompt-based permissions
183
+ */
184
+ clearAllowedPrompts(): void {
185
+ this.permissions.clearAllowedPrompts();
186
+ }
187
+
188
+ /**
189
+ * Set callback to save permission rules to settings
190
+ * This enables saving rules to settings.local.json instead of permissions.json
191
+ */
192
+ setSaveRuleCallback(callback: (tool: string, pattern?: string) => Promise<void>): void {
193
+ this.permissions.setSaveRuleCallback(callback);
194
+ }
195
+
196
+ /**
197
+ * Get permission manager for direct access
198
+ */
199
+ getPermissionManager(): PermissionManager {
200
+ return this.permissions;
201
+ }
202
+
203
+ /**
204
+ * Set callback for AskUserQuestion tool
205
+ * This allows the CLI to handle user questioning
206
+ */
207
+ setAskUserCallback(callback: AskUserCallback): void {
208
+ this.askUserCallback = callback;
209
+ }
210
+
211
+ /**
212
+ * Set callback for tools to request permission with metadata (e.g., diff preview)
213
+ * This allows tools like Edit to show rich previews before execution
214
+ */
215
+ setAskPermissionCallback(
216
+ callback: (request: import('../tools/types.js').PermissionRequest) => Promise<ApprovalAction | undefined>
217
+ ): void {
218
+ this.askPermissionCallback = callback;
219
+ }
220
+
221
+ /**
222
+ * Get memory manager for direct access
223
+ */
224
+ getMemoryManager(): MemoryManager {
225
+ return this.memoryManager;
226
+ }
227
+
228
+ /**
229
+ * Get loaded memory (null if not loaded yet)
230
+ */
231
+ getLoadedMemory(): LoadedMemory | null {
232
+ return this.loadedMemory;
233
+ }
234
+
235
+ /**
236
+ * Load memory for the current working directory
237
+ */
238
+ async loadMemory(): Promise<LoadedMemory> {
239
+ const cwd = this.config.cwd ?? process.cwd();
240
+
241
+ // Determine memory merge strategy (priority: env var > config > default)
242
+ const envStrategy = process.env.GEN_MEMORY_STRATEGY as
243
+ | 'fallback'
244
+ | 'both'
245
+ | 'gen-only'
246
+ | 'claude-only'
247
+ | undefined;
248
+ const strategy =
249
+ envStrategy ?? this.config.memoryMergeStrategy ?? 'fallback';
250
+
251
+ this.loadedMemory = await this.memoryManager.load({ cwd, strategy });
252
+
253
+ // Log verbose summary if verbose mode is enabled
254
+ if (this.config.verbose) {
255
+ console.log(this.memoryManager.getVerboseSummary(strategy));
256
+ }
257
+
258
+ return this.loadedMemory;
259
+ }
260
+
261
+ // ============================================================================
262
+ // Plan Mode
263
+ // ============================================================================
264
+
265
+ /**
266
+ * Get plan mode manager for external access
267
+ */
268
+ getPlanModeManager(): PlanModeManager {
269
+ return this.planModeManager;
270
+ }
271
+
272
+ /**
273
+ * Check if plan mode is active
274
+ */
275
+ isPlanModeActive(): boolean {
276
+ return this.planModeManager.isActive();
277
+ }
278
+
279
+ /**
280
+ * Get current mode (build or plan)
281
+ */
282
+ getCurrentMode(): ModeType {
283
+ return this.planModeManager.getCurrentMode();
284
+ }
285
+
286
+ /**
287
+ * Enter plan mode programmatically
288
+ */
289
+ async enterPlanMode(taskDescription?: string): Promise<string> {
290
+ const { createPlanFile } = await import('../../cli/planning/index.js');
291
+ const cwd = this.config.cwd ?? process.cwd();
292
+ const planFile = await createPlanFile(cwd, taskDescription);
293
+ this.planModeManager.enter(planFile.path, taskDescription);
294
+ return planFile.path;
295
+ }
296
+
297
+ /**
298
+ * Exit plan mode
299
+ */
300
+ exitPlanMode(approved: boolean = false): void {
301
+ if (approved) {
302
+ // Add allowed prompts from plan mode to permissions
303
+ const allowedPrompts = this.planModeManager.getRequestedPermissions();
304
+ if (allowedPrompts.length > 0) {
305
+ this.permissions.addAllowedPrompts(allowedPrompts);
306
+ }
307
+ }
308
+ this.planModeManager.exit(approved);
309
+ }
310
+
311
+ /**
312
+ * Toggle plan mode
313
+ */
314
+ async togglePlanMode(): Promise<void> {
315
+ if (this.planModeManager.isActive()) {
316
+ this.planModeManager.exit(false);
317
+ } else {
318
+ await this.enterPlanMode();
319
+ }
320
+ }
321
+
322
+ /**
323
+ * Get plan mode requested permissions
324
+ */
325
+ getPlanModePermissions(): AllowedPrompt[] {
326
+ return this.planModeManager.getRequestedPermissions();
327
+ }
328
+
329
+ // ============================================================================
330
+ // Session Management
331
+ // ============================================================================
332
+
333
+ /**
334
+ * Get current session ID
335
+ */
336
+ getSessionId(): string | null {
337
+ return this.sessionId;
338
+ }
339
+
340
+ /**
341
+ * Get session manager for external access
342
+ */
343
+ getSessionManager(): SessionManager {
344
+ return this.sessionManager;
345
+ }
346
+
347
+ /**
348
+ * Set the model to use (auto-switches provider if needed)
349
+ * @param model Model ID to use
350
+ * @param provider Optional: explicit provider (otherwise inferred from model name)
351
+ * @param authMethod Optional: explicit auth method (otherwise inferred or use current)
352
+ */
353
+ setModel(model: string, provider?: string, authMethod?: string): void {
354
+ this.config.model = model;
355
+
356
+ // Determine new provider and authMethod
357
+ const newProvider = (provider as Provider | undefined) ?? inferProvider(model);
358
+ const newAuthMethod = (authMethod as AuthMethod | undefined) ??
359
+ inferAuthMethod(model) ??
360
+ this.config.authMethod;
361
+
362
+ // Recreate provider if either provider or authMethod changed
363
+ const providerChanged = newProvider !== this.config.provider;
364
+ const authMethodChanged = newAuthMethod !== this.config.authMethod;
365
+
366
+ if (providerChanged || authMethodChanged) {
367
+ this.config.provider = newProvider;
368
+ this.config.authMethod = newAuthMethod;
369
+ this.provider = createProvider({
370
+ provider: newProvider,
371
+ authMethod: newAuthMethod,
372
+ });
373
+ // Update compression engine with new provider and model
374
+ this.sessionManager.setCompressionEngine(this.provider, model);
375
+ }
376
+ }
377
+
378
+ /**
379
+ * Get current model
380
+ */
381
+ getModel(): string {
382
+ return this.config.model;
383
+ }
384
+
385
+ /**
386
+ * Get current provider
387
+ */
388
+ getProvider(): Provider {
389
+ return this.config.provider;
390
+ }
391
+
392
+ /**
393
+ * Get model information for compression
394
+ */
395
+ getModelInfo(): { contextWindow: number; outputLimit?: number } {
396
+ // Try to get from provider if available
397
+ if (this.provider.getModelInfo) {
398
+ const info = this.provider.getModelInfo(this.config.model);
399
+ if (info.contextWindow) {
400
+ return { contextWindow: info.contextWindow, outputLimit: info.outputLimit };
401
+ }
402
+ }
403
+
404
+ // Fallback: rough estimates based on model name
405
+ // These should eventually be moved to provider implementations
406
+ const model = this.config.model.toLowerCase();
407
+
408
+ if (model.includes('claude')) {
409
+ return { contextWindow: 200_000, outputLimit: 8192 };
410
+ }
411
+
412
+ if (model.includes('gpt-4') || model.includes('gpt-3.5')) {
413
+ return { contextWindow: 128_000, outputLimit: 4096 };
414
+ }
415
+
416
+ if (model.includes('gemini')) {
417
+ return { contextWindow: 1_000_000, outputLimit: 8192 };
418
+ }
419
+
420
+ // Default fallback
421
+ return { contextWindow: 128_000, outputLimit: 4096 };
422
+ }
423
+
424
+ /**
425
+ * List available models from the provider API
426
+ */
427
+ async listModels(): Promise<{ id: string; name: string }[]> {
428
+ return this.provider.listModels();
429
+ }
430
+
431
+ /**
432
+ * Start a new session
433
+ */
434
+ async startSession(title?: string): Promise<string> {
435
+ const session = await this.sessionManager.create({
436
+ provider: this.config.provider,
437
+ model: this.config.model,
438
+ cwd: this.config.cwd,
439
+ title,
440
+ });
441
+
442
+ this.sessionId = session.metadata.id;
443
+
444
+ // Initialize checkpoint manager for this session
445
+ initCheckpointManager(this.sessionId);
446
+
447
+ // Trigger SessionStart hooks
448
+ await this.hooksManager.trigger('SessionStart', {
449
+ event: 'SessionStart',
450
+ cwd: this.config.cwd ?? process.cwd(),
451
+ sessionId: this.sessionId,
452
+ timestamp: new Date(),
453
+ });
454
+
455
+ return this.sessionId;
456
+ }
457
+
458
+ /**
459
+ * Resume an existing session
460
+ */
461
+ async resumeSession(sessionId: string): Promise<boolean> {
462
+ const session = await this.sessionManager.load(sessionId);
463
+ if (!session) {
464
+ return false;
465
+ }
466
+
467
+ this.sessionId = session.metadata.id;
468
+
469
+ // CheckpointManager already restored by SessionManager.load()
470
+ // No need to call initCheckpointManager again
471
+
472
+ // Trigger SessionStart hooks (for resumed sessions)
473
+ await this.hooksManager.trigger('SessionStart', {
474
+ event: 'SessionStart',
475
+ cwd: this.config.cwd ?? process.cwd(),
476
+ sessionId: this.sessionId,
477
+ timestamp: new Date(),
478
+ });
479
+
480
+ return true;
481
+ }
482
+
483
+ /**
484
+ * Resume the most recent session
485
+ */
486
+ async resumeLatest(): Promise<boolean> {
487
+ const session = await this.sessionManager.resumeLatest();
488
+ if (!session) {
489
+ return false;
490
+ }
491
+
492
+ this.sessionId = session.metadata.id;
493
+
494
+ // CheckpointManager already restored by SessionManager.load()
495
+ // No need to call initCheckpointManager again
496
+
497
+ return true;
498
+ }
499
+
500
+ /**
501
+ * Fork current session
502
+ */
503
+ async forkSession(title?: string): Promise<string | null> {
504
+ if (!this.sessionId) {
505
+ return null;
506
+ }
507
+
508
+ const forked = await this.sessionManager.fork(this.sessionId, title);
509
+ this.sessionId = forked.metadata.id;
510
+
511
+ return this.sessionId;
512
+ }
513
+
514
+ /**
515
+ * List all sessions
516
+ */
517
+ async listSessions() {
518
+ return this.sessionManager.list();
519
+ }
520
+
521
+ /**
522
+ * Delete a session
523
+ */
524
+ async deleteSession(sessionId: string): Promise<boolean> {
525
+ return this.sessionManager.delete(sessionId);
526
+ }
527
+
528
+ /**
529
+ * Save current session
530
+ */
531
+ async saveSession(): Promise<void> {
532
+ const current = this.sessionManager.getCurrent();
533
+ if (current) {
534
+ await this.sessionManager.save(current);
535
+ }
536
+ }
537
+
538
+ /**
539
+ * Run a single query through the agent
540
+ */
541
+ async *run(prompt: string, signal?: AbortSignal): AsyncGenerator<AgentEvent, void, unknown> {
542
+ // Check for abort before starting
543
+ if (signal?.aborted) {
544
+ yield { type: 'error', error: new Error('Operation cancelled') };
545
+ return;
546
+ }
547
+
548
+ // Auto-create session if none exists
549
+ try {
550
+ if (!this.sessionId) {
551
+ await this.startSession();
552
+ }
553
+
554
+ // Load memory if not already loaded
555
+ if (!this.loadedMemory) {
556
+ await this.loadMemory();
557
+ }
558
+ } catch (error) {
559
+ yield {
560
+ type: 'error',
561
+ error: error instanceof Error ? error : new Error(String(error))
562
+ };
563
+ return;
564
+ }
565
+
566
+ // ============================================================================
567
+ // COMMAND DETECTION AND EXPANSION
568
+ // ============================================================================
569
+ let actualPrompt = prompt;
570
+ let parsedCommand: ParsedCommand | null = null;
571
+
572
+ // Check if input starts with / (command syntax)
573
+ if (prompt.trim().startsWith('/')) {
574
+ try {
575
+ const commandManager = await this.ensureCommandManager();
576
+
577
+ // Parse command: /name args
578
+ const trimmed = prompt.trim().slice(1); // Remove leading /
579
+ const firstSpaceIndex = trimmed.indexOf(' ');
580
+ const commandName = firstSpaceIndex === -1 ? trimmed : trimmed.slice(0, firstSpaceIndex);
581
+ const args = firstSpaceIndex === -1 ? '' : trimmed.slice(firstSpaceIndex + 1);
582
+
583
+ // Try to parse the command
584
+ parsedCommand = await commandManager.parseCommand(commandName, args);
585
+
586
+ if (parsedCommand) {
587
+ // Replace prompt with wrapped expanded template (Claude Code style)
588
+ // XML tags help LLM understand this is a command template, not user prose
589
+ actualPrompt = `<command-expansion name="${commandName}">
590
+ ${parsedCommand.expandedPrompt}
591
+ </command-expansion>
592
+
593
+ Follow the instructions in the command above.`;
594
+
595
+ // Apply pre-authorized tools (add to permission manager)
596
+ if (parsedCommand.preAuthorizedTools.length > 0) {
597
+ for (const toolPattern of parsedCommand.preAuthorizedTools) {
598
+ this.permissions.addAllowedPrompts([{
599
+ tool: 'Bash',
600
+ prompt: toolPattern,
601
+ }]);
602
+ }
603
+ }
604
+
605
+ // Apply model override if specified
606
+ if (parsedCommand.modelOverride) {
607
+ this.config.model = parsedCommand.modelOverride;
608
+ // Recreate provider with new model if needed
609
+ // (In practice, model is just passed to API calls, no need to recreate)
610
+ }
611
+
612
+ // Yield event to show command was recognized
613
+ // Include <command-running> tag to prevent LLM from re-invoking the same command
614
+ yield {
615
+ type: 'text',
616
+ text: `<command-running>${commandName}</command-running>\n[Command: /${commandName}${args ? ' ' + args : ''}]\n\n`,
617
+ };
618
+ }
619
+ // If command not found, continue with original prompt (LLM will handle it)
620
+ } catch (error) {
621
+ // Command parsing failed, continue with original prompt
622
+ console.warn('Command parsing failed:', error);
623
+ }
624
+ }
625
+
626
+ // Add user message (with expanded prompt if command was parsed)
627
+ const userMessage: Message = { role: 'user', content: actualPrompt };
628
+ try {
629
+ await this.sessionManager.addMessage(userMessage, this.getModelInfo());
630
+ } catch (error) {
631
+ yield {
632
+ type: 'error',
633
+ error: new Error(`Failed to save user message: ${error instanceof Error ? error.message : String(error)}`)
634
+ };
635
+ return;
636
+ }
637
+
638
+ let turns = 0;
639
+ const maxTurns = this.config.maxTurns ?? 10;
640
+
641
+ while (turns < maxTurns) {
642
+ turns++;
643
+
644
+ // Ensure tool registry is initialized (lazy loading)
645
+ const registry = await this.ensureRegistry();
646
+
647
+ // Get tool definitions (filtered by plan mode if active)
648
+ const toolDefs = registry.getFilteredDefinitions(this.config.tools);
649
+
650
+ // Call LLM
651
+ let response;
652
+ const processingStartTime = Date.now();
653
+ // Determine if streaming is enabled
654
+ const useStreaming = process.env.GEN_STREAM === '1' || this.config.streaming;
655
+
656
+ try {
657
+ // Debug prompt loading (enabled with GEN_DEBUG_PROMPTS=1 or =2)
658
+ debugPromptLoading(
659
+ this.config.model,
660
+ this.config.provider,
661
+ this.planModeManager.isActive(),
662
+ this.planModeManager.getPlanFilePath() ?? undefined
663
+ );
664
+
665
+ // Build system prompt based on model → provider → prompt flow
666
+ // Looks up provider from ~/.gencode/providers.json, falls back to config.provider
667
+ // Includes plan mode instructions if plan mode is active
668
+ const systemPrompt =
669
+ this.config.systemPrompt ??
670
+ buildSystemPromptWithPlanMode(
671
+ this.config.model,
672
+ this.config.cwd ?? process.cwd(),
673
+ true, // Assume git repo for now
674
+ this.loadedMemory?.context,
675
+ this.config.provider, // Fallback provider if model lookup fails
676
+ this.planModeManager.isActive(), // Plan mode active flag
677
+ this.planModeManager.getPlanFilePath() ?? undefined // Plan file path
678
+ );
679
+
680
+ if (useStreaming) {
681
+ // === STREAMING PATH ===
682
+ // Build response incrementally from stream chunks
683
+ const responseBuilder = {
684
+ content: [] as Array<{ type: 'text'; text: string } | { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }>,
685
+ textBuffer: '',
686
+ toolCalls: new Map<string, { id: string; name: string; inputBuffer: string }>(),
687
+ stopReason: 'end_turn' as 'end_turn' | 'max_tokens' | 'tool_use' | 'stop_sequence',
688
+ usage: undefined as { inputTokens: number; outputTokens: number } | undefined,
689
+ cost: undefined as { inputCost: number; outputCost: number; totalCost: number; currency: string } | undefined,
690
+ };
691
+
692
+ // Process stream chunks
693
+ for await (const chunk of this.provider.stream({
694
+ model: this.config.model,
695
+ messages: this.sessionManager.getMessagesForLLM(),
696
+ tools: toolDefs,
697
+ systemPrompt,
698
+ maxTokens: 4096,
699
+ signal, // Pass abort signal for cancellation
700
+ })) {
701
+ // Check for abort
702
+ if (signal?.aborted) {
703
+ yield { type: 'error', error: new Error('Operation cancelled by user') };
704
+ return;
705
+ }
706
+ switch (chunk.type) {
707
+ case 'text':
708
+ // Accumulate text and yield immediately for real-time display
709
+ responseBuilder.textBuffer += chunk.text;
710
+ yield { type: 'text', text: chunk.text };
711
+ break;
712
+
713
+ case 'reasoning':
714
+ // Forward reasoning content (o1/o3/Gemini 3+ thinking)
715
+ yield { type: 'reasoning_delta', text: chunk.text };
716
+ break;
717
+
718
+ case 'tool_start':
719
+ // Initialize tool call tracking
720
+ responseBuilder.toolCalls.set(chunk.id, {
721
+ id: chunk.id,
722
+ name: chunk.name,
723
+ inputBuffer: '',
724
+ });
725
+ break;
726
+
727
+ case 'tool_input':
728
+ // Accumulate incremental JSON input and forward delta
729
+ const tool = responseBuilder.toolCalls.get(chunk.id);
730
+ if (tool) {
731
+ tool.inputBuffer += chunk.input;
732
+ // Emit incremental tool input for progressive display
733
+ yield { type: 'tool_input_delta', id: chunk.id, delta: chunk.input };
734
+ }
735
+ break;
736
+
737
+ case 'done':
738
+ // Save final metadata
739
+ responseBuilder.stopReason = chunk.response.stopReason;
740
+ responseBuilder.usage = chunk.response.usage;
741
+ responseBuilder.cost = chunk.response.cost;
742
+ break;
743
+
744
+ case 'error':
745
+ yield { type: 'error', error: chunk.error };
746
+ return;
747
+ }
748
+ }
749
+
750
+ // Build complete response from accumulated data
751
+ if (responseBuilder.textBuffer) {
752
+ responseBuilder.content.push({
753
+ type: 'text',
754
+ text: responseBuilder.textBuffer,
755
+ });
756
+ }
757
+
758
+ for (const [_id, tool] of responseBuilder.toolCalls) {
759
+ try {
760
+ responseBuilder.content.push({
761
+ type: 'tool_use',
762
+ id: tool.id,
763
+ name: tool.name,
764
+ input: JSON.parse(tool.inputBuffer || '{}'),
765
+ });
766
+ } catch (error) {
767
+ // If JSON parsing fails, treat as malformed tool call
768
+ yield {
769
+ type: 'error',
770
+ error: new Error(`Failed to parse tool input for ${tool.name}: ${error instanceof Error ? error.message : String(error)}`),
771
+ };
772
+ return;
773
+ }
774
+ }
775
+
776
+ response = {
777
+ content: responseBuilder.content,
778
+ stopReason: responseBuilder.stopReason,
779
+ usage: responseBuilder.usage,
780
+ cost: responseBuilder.cost,
781
+ };
782
+
783
+ } else {
784
+ // === TRADITIONAL PATH (COMPLETE) ===
785
+ response = await this.provider.complete({
786
+ model: this.config.model,
787
+ messages: this.sessionManager.getMessagesForLLM(),
788
+ tools: toolDefs,
789
+ systemPrompt,
790
+ maxTokens: 4096,
791
+ });
792
+ }
793
+ } catch (error) {
794
+ yield { type: 'error', error: error as Error };
795
+ return;
796
+ }
797
+
798
+ // Validate response completeness
799
+ if (!response || !response.content) {
800
+ yield {
801
+ type: 'error',
802
+ error: new Error('Provider returned null or undefined response')
803
+ };
804
+ return;
805
+ }
806
+
807
+ // Validate content is not empty (excluding max_tokens case)
808
+ if (response.content.length === 0 && response.stopReason !== 'max_tokens') {
809
+ yield {
810
+ type: 'error',
811
+ error: new Error(
812
+ `Provider returned empty content (stopReason: ${response.stopReason}, ` +
813
+ `usage: ${JSON.stringify(response.usage)})`
814
+ )
815
+ };
816
+ return;
817
+ }
818
+
819
+ // Process response content
820
+ const toolCalls: Array<{ id: string; name: string; input: Record<string, unknown> }> = [];
821
+ let textContent = '';
822
+
823
+ for (const content of response.content) {
824
+ if (content.type === 'text') {
825
+ textContent += content.text;
826
+ // Only yield text if not in streaming mode (streaming already yielded chunks)
827
+ if (!useStreaming) {
828
+ yield { type: 'text', text: content.text };
829
+ }
830
+ } else if (content.type === 'tool_use') {
831
+ toolCalls.push({ id: content.id, name: content.name, input: content.input });
832
+ }
833
+ }
834
+
835
+ // Add assistant message and check if done
836
+ try {
837
+ await this.sessionManager.addMessage(
838
+ { role: 'assistant', content: response.content },
839
+ this.getModelInfo()
840
+ );
841
+ } catch (error) {
842
+ yield {
843
+ type: 'error',
844
+ error: new Error(`Failed to save assistant message: ${error instanceof Error ? error.message : String(error)}`)
845
+ };
846
+ return;
847
+ }
848
+
849
+ if (response.stopReason !== 'tool_use' || toolCalls.length === 0) {
850
+ yield { type: 'done', text: textContent, usage: response.usage, cost: response.cost };
851
+
852
+ // Save completion metadata for UI restoration
853
+ if (response.usage || response.cost) {
854
+ const current = this.sessionManager.getCurrent();
855
+ if (current) {
856
+ if (!current.metadata.completions) {
857
+ current.metadata.completions = [];
858
+ }
859
+ current.metadata.completions.push({
860
+ afterMessageIndex: current.messages.length - 1,
861
+ durationMs: Date.now() - processingStartTime,
862
+ usage: response.usage ? {
863
+ inputTokens: response.usage.inputTokens,
864
+ outputTokens: response.usage.outputTokens,
865
+ } : undefined,
866
+ cost: response.cost,
867
+ });
868
+ }
869
+ }
870
+
871
+ // Trigger Stop hooks when conversation ends
872
+ await this.hooksManager.trigger('Stop', {
873
+ event: 'Stop',
874
+ cwd: this.config.cwd ?? process.cwd(),
875
+ sessionId: this.sessionId ?? undefined,
876
+ timestamp: new Date(),
877
+ });
878
+
879
+ return;
880
+ }
881
+
882
+ // Execute tool calls
883
+ const toolResults: ToolResultContent[] = [];
884
+ const cwd = this.config.cwd ?? process.cwd();
885
+
886
+ // Build tool context with askUser callback and current agent info
887
+ const toolContext = {
888
+ cwd,
889
+ askUser: this.askUserCallback ?? undefined,
890
+ askPermission: this.askPermissionCallback ?? undefined,
891
+ currentProvider: this.config.provider,
892
+ currentModel: this.config.model,
893
+ currentAuthMethod: this.config.authMethod,
894
+ };
895
+
896
+ for (const call of toolCalls) {
897
+ yield { type: 'tool_start', id: call.id, name: call.name, input: call.input };
898
+
899
+ // Trigger PreToolUse hooks
900
+ const preHookResults = await this.hooksManager.trigger('PreToolUse', {
901
+ event: 'PreToolUse',
902
+ cwd,
903
+ toolName: call.name,
904
+ toolInput: call.input as Record<string, unknown>,
905
+ sessionId: this.sessionId ?? undefined,
906
+ timestamp: new Date(),
907
+ });
908
+
909
+ // Check if any PreToolUse hook blocked the action
910
+ const preHookBlocked = preHookResults.some(r => r.blocked);
911
+ if (preHookBlocked) {
912
+ const blockingHook = preHookResults.find(r => r.blocked);
913
+ const result = {
914
+ success: false,
915
+ output: '',
916
+ error: `Blocked by PreToolUse hook: ${blockingHook?.error || 'Hook returned exit code 2'}`,
917
+ };
918
+ yield { type: 'tool_result', id: call.id, name: call.name, result };
919
+ toolResults.push({
920
+ type: 'tool_result',
921
+ toolUseId: call.id,
922
+ content: result.error,
923
+ isError: true,
924
+ });
925
+ continue; // Skip to next tool
926
+ }
927
+
928
+ try {
929
+ // Ensure tool registry is initialized
930
+ const registry = await this.ensureRegistry();
931
+
932
+ // Protect permission check and tool execution
933
+ const allowed = await this.permissions.requestPermission(call.name, call.input);
934
+ const result = allowed
935
+ ? await registry.execute(call.name, call.input, toolContext)
936
+ : { success: false, output: '', error: 'Permission denied by user' };
937
+
938
+ yield { type: 'tool_result', id: call.id, name: call.name, result };
939
+ toolResults.push({
940
+ type: 'tool_result',
941
+ toolUseId: call.id,
942
+ content: result.success ? result.output : (result.error ?? 'Unknown error'),
943
+ isError: !result.success,
944
+ });
945
+
946
+ // Trigger PostToolUse or PostToolUseFailure hooks
947
+ const hookEvent = result.success ? 'PostToolUse' : 'PostToolUseFailure';
948
+ await this.hooksManager.trigger(hookEvent, {
949
+ event: hookEvent,
950
+ cwd,
951
+ toolName: call.name,
952
+ toolInput: call.input as Record<string, unknown>,
953
+ toolResult: result,
954
+ sessionId: this.sessionId ?? undefined,
955
+ timestamp: new Date(),
956
+ });
957
+ } catch (error) {
958
+ // Catch permission check or tool execution errors
959
+ const errorMsg = error instanceof Error ? error.message : String(error);
960
+ const errorResult = {
961
+ success: false,
962
+ output: '',
963
+ error: `Tool execution error: ${errorMsg}`
964
+ };
965
+ yield { type: 'tool_result', id: call.id, name: call.name, result: errorResult };
966
+ toolResults.push({
967
+ type: 'tool_result',
968
+ toolUseId: call.id,
969
+ content: errorMsg,
970
+ isError: true,
971
+ });
972
+
973
+ // Trigger PostToolUseFailure hooks
974
+ await this.hooksManager.trigger('PostToolUseFailure', {
975
+ event: 'PostToolUseFailure',
976
+ cwd,
977
+ toolName: call.name,
978
+ toolInput: call.input as Record<string, unknown>,
979
+ toolResult: errorResult,
980
+ sessionId: this.sessionId ?? undefined,
981
+ timestamp: new Date(),
982
+ });
983
+ }
984
+ }
985
+
986
+ // Add tool results as user message
987
+ try {
988
+ await this.sessionManager.addMessage(
989
+ { role: 'user', content: toolResults },
990
+ this.getModelInfo()
991
+ );
992
+ } catch (error) {
993
+ yield {
994
+ type: 'error',
995
+ error: new Error(`Failed to save tool results: ${error instanceof Error ? error.message : String(error)}`)
996
+ };
997
+ return;
998
+ }
999
+ }
1000
+
1001
+ yield { type: 'error', error: new Error(`Max turns (${maxTurns}) exceeded`) };
1002
+ }
1003
+
1004
+ /**
1005
+ * Clear conversation history
1006
+ */
1007
+ clearHistory(): void {
1008
+ this.sessionManager.clearMessages();
1009
+ }
1010
+
1011
+ /**
1012
+ * Clean up incomplete tool use messages (after interruption)
1013
+ * Removes the last assistant message if it contains tool_use without corresponding tool_result
1014
+ */
1015
+ cleanupIncompleteMessages(): void {
1016
+ const messages = this.sessionManager.getMessages();
1017
+ if (messages.length === 0) return;
1018
+
1019
+ const lastMessage = messages[messages.length - 1];
1020
+
1021
+ // Check if last message is an assistant message with tool_use
1022
+ if (lastMessage.role === 'assistant' && Array.isArray(lastMessage.content)) {
1023
+ const hasToolUse = lastMessage.content.some((c) => c.type === 'tool_use');
1024
+
1025
+ if (hasToolUse) {
1026
+ // Remove the incomplete assistant message from session manager
1027
+ this.sessionManager.removeLastMessage();
1028
+ }
1029
+ }
1030
+ }
1031
+
1032
+ /**
1033
+ * Get conversation history
1034
+ */
1035
+ getHistory(): Message[] {
1036
+ return this.sessionManager.getMessages();
1037
+ }
1038
+
1039
+ /**
1040
+ * Get compression statistics
1041
+ */
1042
+ getCompressionStats(): {
1043
+ totalMessages: number;
1044
+ activeMessages: number;
1045
+ summaryCount: number;
1046
+ compressionRatio: number;
1047
+ } | null {
1048
+ return this.sessionManager.getCompressionStats();
1049
+ }
1050
+ }