deepseek-coder-agent-cli 1.0.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 (501) hide show
  1. package/README.md +58 -0
  2. package/dist/bin/cliMode.d.ts +8 -0
  3. package/dist/bin/cliMode.d.ts.map +1 -0
  4. package/dist/bin/cliMode.js +20 -0
  5. package/dist/bin/cliMode.js.map +1 -0
  6. package/dist/bin/deepseek.d.ts +6 -0
  7. package/dist/bin/deepseek.d.ts.map +1 -0
  8. package/dist/bin/deepseek.js +136 -0
  9. package/dist/bin/deepseek.js.map +1 -0
  10. package/dist/config.d.ts +25 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +155 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/contracts/agent-profiles.schema.json +43 -0
  15. package/dist/contracts/agent-schemas.json +460 -0
  16. package/dist/contracts/models.schema.json +9 -0
  17. package/dist/contracts/module-schema.json +419 -0
  18. package/dist/contracts/schemas/agent-profile.schema.json +157 -0
  19. package/dist/contracts/schemas/agent-rules.schema.json +238 -0
  20. package/dist/contracts/schemas/agent-schemas.schema.json +528 -0
  21. package/dist/contracts/schemas/agent.schema.json +90 -0
  22. package/dist/contracts/schemas/tool-selection.schema.json +174 -0
  23. package/dist/contracts/tools.schema.json +82 -0
  24. package/dist/contracts/unified-schema.json +750 -0
  25. package/dist/contracts/v1/agent.d.ts +179 -0
  26. package/dist/contracts/v1/agent.d.ts.map +1 -0
  27. package/dist/contracts/v1/agent.js +8 -0
  28. package/dist/contracts/v1/agent.js.map +1 -0
  29. package/dist/contracts/v1/agentProfileManifest.d.ts +60 -0
  30. package/dist/contracts/v1/agentProfileManifest.d.ts.map +1 -0
  31. package/dist/contracts/v1/agentProfileManifest.js +9 -0
  32. package/dist/contracts/v1/agentProfileManifest.js.map +1 -0
  33. package/dist/contracts/v1/agentRules.d.ts +60 -0
  34. package/dist/contracts/v1/agentRules.d.ts.map +1 -0
  35. package/dist/contracts/v1/agentRules.js +10 -0
  36. package/dist/contracts/v1/agentRules.js.map +1 -0
  37. package/dist/contracts/v1/provider.d.ts +149 -0
  38. package/dist/contracts/v1/provider.d.ts.map +1 -0
  39. package/dist/contracts/v1/provider.js +7 -0
  40. package/dist/contracts/v1/provider.js.map +1 -0
  41. package/dist/contracts/v1/tool.d.ts +136 -0
  42. package/dist/contracts/v1/tool.d.ts.map +1 -0
  43. package/dist/contracts/v1/tool.js +7 -0
  44. package/dist/contracts/v1/tool.js.map +1 -0
  45. package/dist/contracts/v1/toolAccess.d.ts +43 -0
  46. package/dist/contracts/v1/toolAccess.d.ts.map +1 -0
  47. package/dist/contracts/v1/toolAccess.js +9 -0
  48. package/dist/contracts/v1/toolAccess.js.map +1 -0
  49. package/dist/core/agent.d.ts +287 -0
  50. package/dist/core/agent.d.ts.map +1 -0
  51. package/dist/core/agent.js +1563 -0
  52. package/dist/core/agent.js.map +1 -0
  53. package/dist/core/agentProfileManifest.d.ts +3 -0
  54. package/dist/core/agentProfileManifest.d.ts.map +1 -0
  55. package/dist/core/agentProfileManifest.js +188 -0
  56. package/dist/core/agentProfileManifest.js.map +1 -0
  57. package/dist/core/agentProfiles.d.ts +22 -0
  58. package/dist/core/agentProfiles.d.ts.map +1 -0
  59. package/dist/core/agentProfiles.js +35 -0
  60. package/dist/core/agentProfiles.js.map +1 -0
  61. package/dist/core/agentRulebook.d.ts +11 -0
  62. package/dist/core/agentRulebook.d.ts.map +1 -0
  63. package/dist/core/agentRulebook.js +136 -0
  64. package/dist/core/agentRulebook.js.map +1 -0
  65. package/dist/core/agentSchemaLoader.d.ts +131 -0
  66. package/dist/core/agentSchemaLoader.d.ts.map +1 -0
  67. package/dist/core/agentSchemaLoader.js +235 -0
  68. package/dist/core/agentSchemaLoader.js.map +1 -0
  69. package/dist/core/agiCore.d.ts +290 -0
  70. package/dist/core/agiCore.d.ts.map +1 -0
  71. package/dist/core/agiCore.js +1348 -0
  72. package/dist/core/agiCore.js.map +1 -0
  73. package/dist/core/aiErrorFixer.d.ts +57 -0
  74. package/dist/core/aiErrorFixer.d.ts.map +1 -0
  75. package/dist/core/aiErrorFixer.js +214 -0
  76. package/dist/core/aiErrorFixer.js.map +1 -0
  77. package/dist/core/antiTermination.d.ts +226 -0
  78. package/dist/core/antiTermination.d.ts.map +1 -0
  79. package/dist/core/antiTermination.js +713 -0
  80. package/dist/core/antiTermination.js.map +1 -0
  81. package/dist/core/bashCommandGuidance.d.ts +16 -0
  82. package/dist/core/bashCommandGuidance.d.ts.map +1 -0
  83. package/dist/core/bashCommandGuidance.js +40 -0
  84. package/dist/core/bashCommandGuidance.js.map +1 -0
  85. package/dist/core/constants.d.ts +31 -0
  86. package/dist/core/constants.d.ts.map +1 -0
  87. package/dist/core/constants.js +62 -0
  88. package/dist/core/constants.js.map +1 -0
  89. package/dist/core/contextManager.d.ts +271 -0
  90. package/dist/core/contextManager.d.ts.map +1 -0
  91. package/dist/core/contextManager.js +1073 -0
  92. package/dist/core/contextManager.js.map +1 -0
  93. package/dist/core/contextWindow.d.ts +42 -0
  94. package/dist/core/contextWindow.d.ts.map +1 -0
  95. package/dist/core/contextWindow.js +123 -0
  96. package/dist/core/contextWindow.js.map +1 -0
  97. package/dist/core/customCommands.d.ts +19 -0
  98. package/dist/core/customCommands.d.ts.map +1 -0
  99. package/dist/core/customCommands.js +85 -0
  100. package/dist/core/customCommands.js.map +1 -0
  101. package/dist/core/deepBugAnalyzer.d.ts +25 -0
  102. package/dist/core/deepBugAnalyzer.d.ts.map +1 -0
  103. package/dist/core/deepBugAnalyzer.js +44 -0
  104. package/dist/core/deepBugAnalyzer.js.map +1 -0
  105. package/dist/core/dualTournament.d.ts +110 -0
  106. package/dist/core/dualTournament.d.ts.map +1 -0
  107. package/dist/core/dualTournament.js +270 -0
  108. package/dist/core/dualTournament.js.map +1 -0
  109. package/dist/core/dynamicGuardrails.d.ts +207 -0
  110. package/dist/core/dynamicGuardrails.d.ts.map +1 -0
  111. package/dist/core/dynamicGuardrails.js +516 -0
  112. package/dist/core/dynamicGuardrails.js.map +1 -0
  113. package/dist/core/embeddingProviders.d.ts +80 -0
  114. package/dist/core/embeddingProviders.d.ts.map +1 -0
  115. package/dist/core/embeddingProviders.js +241 -0
  116. package/dist/core/embeddingProviders.js.map +1 -0
  117. package/dist/core/episodicMemory.d.ts +259 -0
  118. package/dist/core/episodicMemory.d.ts.map +1 -0
  119. package/dist/core/episodicMemory.js +833 -0
  120. package/dist/core/episodicMemory.js.map +1 -0
  121. package/dist/core/errors/apiKeyErrors.d.ts +11 -0
  122. package/dist/core/errors/apiKeyErrors.d.ts.map +1 -0
  123. package/dist/core/errors/apiKeyErrors.js +159 -0
  124. package/dist/core/errors/apiKeyErrors.js.map +1 -0
  125. package/dist/core/errors/errorTypes.d.ts +111 -0
  126. package/dist/core/errors/errorTypes.d.ts.map +1 -0
  127. package/dist/core/errors/errorTypes.js +345 -0
  128. package/dist/core/errors/errorTypes.js.map +1 -0
  129. package/dist/core/errors/index.d.ts +50 -0
  130. package/dist/core/errors/index.d.ts.map +1 -0
  131. package/dist/core/errors/index.js +156 -0
  132. package/dist/core/errors/index.js.map +1 -0
  133. package/dist/core/errors/networkErrors.d.ts +14 -0
  134. package/dist/core/errors/networkErrors.d.ts.map +1 -0
  135. package/dist/core/errors/networkErrors.js +53 -0
  136. package/dist/core/errors/networkErrors.js.map +1 -0
  137. package/dist/core/errors/safetyValidator.d.ts +115 -0
  138. package/dist/core/errors/safetyValidator.d.ts.map +1 -0
  139. package/dist/core/errors/safetyValidator.js +302 -0
  140. package/dist/core/errors/safetyValidator.js.map +1 -0
  141. package/dist/core/errors.d.ts +4 -0
  142. package/dist/core/errors.d.ts.map +1 -0
  143. package/dist/core/errors.js +33 -0
  144. package/dist/core/errors.js.map +1 -0
  145. package/dist/core/finalResponseFormatter.d.ts +10 -0
  146. package/dist/core/finalResponseFormatter.d.ts.map +1 -0
  147. package/dist/core/finalResponseFormatter.js +14 -0
  148. package/dist/core/finalResponseFormatter.js.map +1 -0
  149. package/dist/core/flowProtection.d.ts +154 -0
  150. package/dist/core/flowProtection.d.ts.map +1 -0
  151. package/dist/core/flowProtection.js +436 -0
  152. package/dist/core/flowProtection.js.map +1 -0
  153. package/dist/core/gitWorktreeManager.d.ts +126 -0
  154. package/dist/core/gitWorktreeManager.d.ts.map +1 -0
  155. package/dist/core/gitWorktreeManager.js +403 -0
  156. package/dist/core/gitWorktreeManager.js.map +1 -0
  157. package/dist/core/guardrails.d.ts +150 -0
  158. package/dist/core/guardrails.d.ts.map +1 -0
  159. package/dist/core/guardrails.js +360 -0
  160. package/dist/core/guardrails.js.map +1 -0
  161. package/dist/core/hallucinationGuard.d.ts +57 -0
  162. package/dist/core/hallucinationGuard.d.ts.map +1 -0
  163. package/dist/core/hallucinationGuard.js +237 -0
  164. package/dist/core/hallucinationGuard.js.map +1 -0
  165. package/dist/core/hitlEnforcement.d.ts +143 -0
  166. package/dist/core/hitlEnforcement.d.ts.map +1 -0
  167. package/dist/core/hitlEnforcement.js +583 -0
  168. package/dist/core/hitlEnforcement.js.map +1 -0
  169. package/dist/core/hooks.d.ts +113 -0
  170. package/dist/core/hooks.d.ts.map +1 -0
  171. package/dist/core/hooks.js +364 -0
  172. package/dist/core/hooks.js.map +1 -0
  173. package/dist/core/hotReload.d.ts +154 -0
  174. package/dist/core/hotReload.d.ts.map +1 -0
  175. package/dist/core/hotReload.js +451 -0
  176. package/dist/core/hotReload.js.map +1 -0
  177. package/dist/core/hypothesisEngine.d.ts +27 -0
  178. package/dist/core/hypothesisEngine.d.ts.map +1 -0
  179. package/dist/core/hypothesisEngine.js +58 -0
  180. package/dist/core/hypothesisEngine.js.map +1 -0
  181. package/dist/core/index.d.ts +26 -0
  182. package/dist/core/index.d.ts.map +1 -0
  183. package/dist/core/index.js +54 -0
  184. package/dist/core/index.js.map +1 -0
  185. package/dist/core/inputProtection.d.ts +122 -0
  186. package/dist/core/inputProtection.d.ts.map +1 -0
  187. package/dist/core/inputProtection.js +421 -0
  188. package/dist/core/inputProtection.js.map +1 -0
  189. package/dist/core/liveGCPVerification.d.ts +41 -0
  190. package/dist/core/liveGCPVerification.d.ts.map +1 -0
  191. package/dist/core/liveGCPVerification.js +745 -0
  192. package/dist/core/liveGCPVerification.js.map +1 -0
  193. package/dist/core/modelDiscovery.d.ts +105 -0
  194. package/dist/core/modelDiscovery.d.ts.map +1 -0
  195. package/dist/core/modelDiscovery.js +740 -0
  196. package/dist/core/modelDiscovery.js.map +1 -0
  197. package/dist/core/multilinePasteHandler.d.ts +35 -0
  198. package/dist/core/multilinePasteHandler.d.ts.map +1 -0
  199. package/dist/core/multilinePasteHandler.js +80 -0
  200. package/dist/core/multilinePasteHandler.js.map +1 -0
  201. package/dist/core/parallel.d.ts +85 -0
  202. package/dist/core/parallel.d.ts.map +1 -0
  203. package/dist/core/parallel.js +150 -0
  204. package/dist/core/parallel.js.map +1 -0
  205. package/dist/core/parallelCoordinator.d.ts +21 -0
  206. package/dist/core/parallelCoordinator.d.ts.map +1 -0
  207. package/dist/core/parallelCoordinator.js +42 -0
  208. package/dist/core/parallelCoordinator.js.map +1 -0
  209. package/dist/core/parallelExecutor.d.ts +215 -0
  210. package/dist/core/parallelExecutor.d.ts.map +1 -0
  211. package/dist/core/parallelExecutor.js +584 -0
  212. package/dist/core/parallelExecutor.js.map +1 -0
  213. package/dist/core/platformSecurityIntegration.d.ts +133 -0
  214. package/dist/core/platformSecurityIntegration.d.ts.map +1 -0
  215. package/dist/core/platformSecurityIntegration.js +419 -0
  216. package/dist/core/platformSecurityIntegration.js.map +1 -0
  217. package/dist/core/preferences.d.ts +71 -0
  218. package/dist/core/preferences.d.ts.map +1 -0
  219. package/dist/core/preferences.js +341 -0
  220. package/dist/core/preferences.js.map +1 -0
  221. package/dist/core/productTestHarness.d.ts +46 -0
  222. package/dist/core/productTestHarness.d.ts.map +1 -0
  223. package/dist/core/productTestHarness.js +128 -0
  224. package/dist/core/productTestHarness.js.map +1 -0
  225. package/dist/core/providerKeys.d.ts +20 -0
  226. package/dist/core/providerKeys.d.ts.map +1 -0
  227. package/dist/core/providerKeys.js +40 -0
  228. package/dist/core/providerKeys.js.map +1 -0
  229. package/dist/core/realityScore.d.ts +159 -0
  230. package/dist/core/realityScore.d.ts.map +1 -0
  231. package/dist/core/realityScore.js +734 -0
  232. package/dist/core/realityScore.js.map +1 -0
  233. package/dist/core/repoUpgradeOrchestrator.d.ts +223 -0
  234. package/dist/core/repoUpgradeOrchestrator.d.ts.map +1 -0
  235. package/dist/core/repoUpgradeOrchestrator.js +1003 -0
  236. package/dist/core/repoUpgradeOrchestrator.js.map +1 -0
  237. package/dist/core/resultVerification.d.ts +47 -0
  238. package/dist/core/resultVerification.d.ts.map +1 -0
  239. package/dist/core/resultVerification.js +126 -0
  240. package/dist/core/resultVerification.js.map +1 -0
  241. package/dist/core/revenueEnvValidator.d.ts +30 -0
  242. package/dist/core/revenueEnvValidator.d.ts.map +1 -0
  243. package/dist/core/revenueEnvValidator.js +241 -0
  244. package/dist/core/revenueEnvValidator.js.map +1 -0
  245. package/dist/core/schemaValidator.d.ts +49 -0
  246. package/dist/core/schemaValidator.d.ts.map +1 -0
  247. package/dist/core/schemaValidator.js +234 -0
  248. package/dist/core/schemaValidator.js.map +1 -0
  249. package/dist/core/secretStore.d.ts +48 -0
  250. package/dist/core/secretStore.d.ts.map +1 -0
  251. package/dist/core/secretStore.js +295 -0
  252. package/dist/core/secretStore.js.map +1 -0
  253. package/dist/core/securityTournament.d.ts +83 -0
  254. package/dist/core/securityTournament.d.ts.map +1 -0
  255. package/dist/core/securityTournament.js +357 -0
  256. package/dist/core/securityTournament.js.map +1 -0
  257. package/dist/core/selfUpgrade.d.ts +253 -0
  258. package/dist/core/selfUpgrade.d.ts.map +1 -0
  259. package/dist/core/selfUpgrade.js +669 -0
  260. package/dist/core/selfUpgrade.js.map +1 -0
  261. package/dist/core/sessionStorage.d.ts +10 -0
  262. package/dist/core/sessionStorage.d.ts.map +1 -0
  263. package/dist/core/sessionStorage.js +46 -0
  264. package/dist/core/sessionStorage.js.map +1 -0
  265. package/dist/core/sessionStore.d.ts +35 -0
  266. package/dist/core/sessionStore.d.ts.map +1 -0
  267. package/dist/core/sessionStore.js +191 -0
  268. package/dist/core/sessionStore.js.map +1 -0
  269. package/dist/core/taskCompletionDetector.d.ts +112 -0
  270. package/dist/core/taskCompletionDetector.d.ts.map +1 -0
  271. package/dist/core/taskCompletionDetector.js +469 -0
  272. package/dist/core/taskCompletionDetector.js.map +1 -0
  273. package/dist/core/toolPreconditions.d.ts +34 -0
  274. package/dist/core/toolPreconditions.d.ts.map +1 -0
  275. package/dist/core/toolPreconditions.js +242 -0
  276. package/dist/core/toolPreconditions.js.map +1 -0
  277. package/dist/core/toolRuntime.d.ts +185 -0
  278. package/dist/core/toolRuntime.d.ts.map +1 -0
  279. package/dist/core/toolRuntime.js +412 -0
  280. package/dist/core/toolRuntime.js.map +1 -0
  281. package/dist/core/tournamentStrategy.d.ts +12 -0
  282. package/dist/core/tournamentStrategy.d.ts.map +1 -0
  283. package/dist/core/tournamentStrategy.js +41 -0
  284. package/dist/core/tournamentStrategy.js.map +1 -0
  285. package/dist/core/types/utilityTypes.d.ts +192 -0
  286. package/dist/core/types/utilityTypes.d.ts.map +1 -0
  287. package/dist/core/types/utilityTypes.js +272 -0
  288. package/dist/core/types/utilityTypes.js.map +1 -0
  289. package/dist/core/types.d.ts +334 -0
  290. package/dist/core/types.d.ts.map +1 -0
  291. package/dist/core/types.js +76 -0
  292. package/dist/core/types.js.map +1 -0
  293. package/dist/core/unifiedOrchestrator.d.ts +47 -0
  294. package/dist/core/unifiedOrchestrator.d.ts.map +1 -0
  295. package/dist/core/unifiedOrchestrator.js +103 -0
  296. package/dist/core/unifiedOrchestrator.js.map +1 -0
  297. package/dist/core/universalSecurityAudit.d.ts +104 -0
  298. package/dist/core/universalSecurityAudit.d.ts.map +1 -0
  299. package/dist/core/universalSecurityAudit.js +2190 -0
  300. package/dist/core/universalSecurityAudit.js.map +1 -0
  301. package/dist/core/updateChecker.d.ts +148 -0
  302. package/dist/core/updateChecker.d.ts.map +1 -0
  303. package/dist/core/updateChecker.js +593 -0
  304. package/dist/core/updateChecker.js.map +1 -0
  305. package/dist/core/variantExecution.d.ts +23 -0
  306. package/dist/core/variantExecution.d.ts.map +1 -0
  307. package/dist/core/variantExecution.js +58 -0
  308. package/dist/core/variantExecution.js.map +1 -0
  309. package/dist/core/verificationFirst.d.ts +110 -0
  310. package/dist/core/verificationFirst.d.ts.map +1 -0
  311. package/dist/core/verificationFirst.js +312 -0
  312. package/dist/core/verificationFirst.js.map +1 -0
  313. package/dist/core/winnerStrategy.d.ts +15 -0
  314. package/dist/core/winnerStrategy.d.ts.map +1 -0
  315. package/dist/core/winnerStrategy.js +18 -0
  316. package/dist/core/winnerStrategy.js.map +1 -0
  317. package/dist/core/zeroDayDiscovery.d.ts +96 -0
  318. package/dist/core/zeroDayDiscovery.d.ts.map +1 -0
  319. package/dist/core/zeroDayDiscovery.js +358 -0
  320. package/dist/core/zeroDayDiscovery.js.map +1 -0
  321. package/dist/headless/interactiveShell.d.ts +22 -0
  322. package/dist/headless/interactiveShell.d.ts.map +1 -0
  323. package/dist/headless/interactiveShell.js +3832 -0
  324. package/dist/headless/interactiveShell.js.map +1 -0
  325. package/dist/headless/quickMode.d.ts +26 -0
  326. package/dist/headless/quickMode.d.ts.map +1 -0
  327. package/dist/headless/quickMode.js +226 -0
  328. package/dist/headless/quickMode.js.map +1 -0
  329. package/dist/providers/baseProvider.d.ts +148 -0
  330. package/dist/providers/baseProvider.d.ts.map +1 -0
  331. package/dist/providers/baseProvider.js +284 -0
  332. package/dist/providers/baseProvider.js.map +1 -0
  333. package/dist/providers/deepseekReasonerProvider.d.ts +57 -0
  334. package/dist/providers/deepseekReasonerProvider.d.ts.map +1 -0
  335. package/dist/providers/deepseekReasonerProvider.js +87 -0
  336. package/dist/providers/deepseekReasonerProvider.js.map +1 -0
  337. package/dist/providers/openaiChatCompletionsProvider.d.ts +64 -0
  338. package/dist/providers/openaiChatCompletionsProvider.d.ts.map +1 -0
  339. package/dist/providers/openaiChatCompletionsProvider.js +1000 -0
  340. package/dist/providers/openaiChatCompletionsProvider.js.map +1 -0
  341. package/dist/providers/providerFactory.d.ts +24 -0
  342. package/dist/providers/providerFactory.d.ts.map +1 -0
  343. package/dist/providers/providerFactory.js +27 -0
  344. package/dist/providers/providerFactory.js.map +1 -0
  345. package/dist/providers/resilientProvider.d.ts +103 -0
  346. package/dist/providers/resilientProvider.d.ts.map +1 -0
  347. package/dist/providers/resilientProvider.js +462 -0
  348. package/dist/providers/resilientProvider.js.map +1 -0
  349. package/dist/runtime/agentController.d.ts +114 -0
  350. package/dist/runtime/agentController.d.ts.map +1 -0
  351. package/dist/runtime/agentController.js +693 -0
  352. package/dist/runtime/agentController.js.map +1 -0
  353. package/dist/runtime/agentHost.d.ts +61 -0
  354. package/dist/runtime/agentHost.d.ts.map +1 -0
  355. package/dist/runtime/agentHost.js +157 -0
  356. package/dist/runtime/agentHost.js.map +1 -0
  357. package/dist/runtime/agentSession.d.ts +45 -0
  358. package/dist/runtime/agentSession.d.ts.map +1 -0
  359. package/dist/runtime/agentSession.js +214 -0
  360. package/dist/runtime/agentSession.js.map +1 -0
  361. package/dist/runtime/agentWorkerPool.d.ts +167 -0
  362. package/dist/runtime/agentWorkerPool.d.ts.map +1 -0
  363. package/dist/runtime/agentWorkerPool.js +435 -0
  364. package/dist/runtime/agentWorkerPool.js.map +1 -0
  365. package/dist/runtime/node.d.ts +7 -0
  366. package/dist/runtime/node.d.ts.map +1 -0
  367. package/dist/runtime/node.js +18 -0
  368. package/dist/runtime/node.js.map +1 -0
  369. package/dist/runtime/universal.d.ts +18 -0
  370. package/dist/runtime/universal.d.ts.map +1 -0
  371. package/dist/runtime/universal.js +21 -0
  372. package/dist/runtime/universal.js.map +1 -0
  373. package/dist/ui/PromptController.d.ts +174 -0
  374. package/dist/ui/PromptController.d.ts.map +1 -0
  375. package/dist/ui/PromptController.js +351 -0
  376. package/dist/ui/PromptController.js.map +1 -0
  377. package/dist/ui/UnifiedUIRenderer.d.ts +779 -0
  378. package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -0
  379. package/dist/ui/UnifiedUIRenderer.js +5458 -0
  380. package/dist/ui/UnifiedUIRenderer.js.map +1 -0
  381. package/dist/ui/animatedStatus.d.ts +140 -0
  382. package/dist/ui/animatedStatus.d.ts.map +1 -0
  383. package/dist/ui/animatedStatus.js +480 -0
  384. package/dist/ui/animatedStatus.js.map +1 -0
  385. package/dist/ui/animation/AnimationScheduler.d.ts +197 -0
  386. package/dist/ui/animation/AnimationScheduler.d.ts.map +1 -0
  387. package/dist/ui/animation/AnimationScheduler.js +440 -0
  388. package/dist/ui/animation/AnimationScheduler.js.map +1 -0
  389. package/dist/ui/codeHighlighter.d.ts +6 -0
  390. package/dist/ui/codeHighlighter.d.ts.map +1 -0
  391. package/dist/ui/codeHighlighter.js +855 -0
  392. package/dist/ui/codeHighlighter.js.map +1 -0
  393. package/dist/ui/designSystem.d.ts +26 -0
  394. package/dist/ui/designSystem.d.ts.map +1 -0
  395. package/dist/ui/designSystem.js +114 -0
  396. package/dist/ui/designSystem.js.map +1 -0
  397. package/dist/ui/errorFormatter.d.ts +64 -0
  398. package/dist/ui/errorFormatter.d.ts.map +1 -0
  399. package/dist/ui/errorFormatter.js +316 -0
  400. package/dist/ui/errorFormatter.js.map +1 -0
  401. package/dist/ui/globalWriteLock.d.ts +63 -0
  402. package/dist/ui/globalWriteLock.d.ts.map +1 -0
  403. package/dist/ui/globalWriteLock.js +173 -0
  404. package/dist/ui/globalWriteLock.js.map +1 -0
  405. package/dist/ui/index.d.ts +32 -0
  406. package/dist/ui/index.d.ts.map +1 -0
  407. package/dist/ui/index.js +54 -0
  408. package/dist/ui/index.js.map +1 -0
  409. package/dist/ui/interrupts/InterruptManager.d.ts +157 -0
  410. package/dist/ui/interrupts/InterruptManager.d.ts.map +1 -0
  411. package/dist/ui/interrupts/InterruptManager.js +501 -0
  412. package/dist/ui/interrupts/InterruptManager.js.map +1 -0
  413. package/dist/ui/layout.d.ts +27 -0
  414. package/dist/ui/layout.d.ts.map +1 -0
  415. package/dist/ui/layout.js +184 -0
  416. package/dist/ui/layout.js.map +1 -0
  417. package/dist/ui/maxOffensiveUkraineUI.d.ts +94 -0
  418. package/dist/ui/maxOffensiveUkraineUI.d.ts.map +1 -0
  419. package/dist/ui/maxOffensiveUkraineUI.js +316 -0
  420. package/dist/ui/maxOffensiveUkraineUI.js.map +1 -0
  421. package/dist/ui/outputMode.d.ts +44 -0
  422. package/dist/ui/outputMode.d.ts.map +1 -0
  423. package/dist/ui/outputMode.js +123 -0
  424. package/dist/ui/outputMode.js.map +1 -0
  425. package/dist/ui/overlay/OverlayManager.d.ts +105 -0
  426. package/dist/ui/overlay/OverlayManager.d.ts.map +1 -0
  427. package/dist/ui/overlay/OverlayManager.js +291 -0
  428. package/dist/ui/overlay/OverlayManager.js.map +1 -0
  429. package/dist/ui/premiumComponents.d.ts +54 -0
  430. package/dist/ui/premiumComponents.d.ts.map +1 -0
  431. package/dist/ui/premiumComponents.js +241 -0
  432. package/dist/ui/premiumComponents.js.map +1 -0
  433. package/dist/ui/richText.d.ts +13 -0
  434. package/dist/ui/richText.d.ts.map +1 -0
  435. package/dist/ui/richText.js +444 -0
  436. package/dist/ui/richText.js.map +1 -0
  437. package/dist/ui/telemetry/ResponseTracker.d.ts +22 -0
  438. package/dist/ui/telemetry/ResponseTracker.d.ts.map +1 -0
  439. package/dist/ui/telemetry/ResponseTracker.js +60 -0
  440. package/dist/ui/telemetry/ResponseTracker.js.map +1 -0
  441. package/dist/ui/telemetry/UITelemetry.d.ts +181 -0
  442. package/dist/ui/telemetry/UITelemetry.d.ts.map +1 -0
  443. package/dist/ui/telemetry/UITelemetry.js +446 -0
  444. package/dist/ui/telemetry/UITelemetry.js.map +1 -0
  445. package/dist/ui/textHighlighter.d.ts +83 -0
  446. package/dist/ui/textHighlighter.d.ts.map +1 -0
  447. package/dist/ui/textHighlighter.js +267 -0
  448. package/dist/ui/textHighlighter.js.map +1 -0
  449. package/dist/ui/theme.d.ts +364 -0
  450. package/dist/ui/theme.d.ts.map +1 -0
  451. package/dist/ui/theme.js +471 -0
  452. package/dist/ui/theme.js.map +1 -0
  453. package/dist/ui/toolDisplay.d.ts +221 -0
  454. package/dist/ui/toolDisplay.d.ts.map +1 -0
  455. package/dist/ui/toolDisplay.js +1654 -0
  456. package/dist/ui/toolDisplay.js.map +1 -0
  457. package/dist/ui/uiConstants.d.ts +288 -0
  458. package/dist/ui/uiConstants.d.ts.map +1 -0
  459. package/dist/ui/uiConstants.js +472 -0
  460. package/dist/ui/uiConstants.js.map +1 -0
  461. package/dist/utils/askUserPrompt.d.ts +21 -0
  462. package/dist/utils/askUserPrompt.d.ts.map +1 -0
  463. package/dist/utils/askUserPrompt.js +87 -0
  464. package/dist/utils/askUserPrompt.js.map +1 -0
  465. package/dist/utils/asyncUtils.d.ts +95 -0
  466. package/dist/utils/asyncUtils.d.ts.map +1 -0
  467. package/dist/utils/asyncUtils.js +286 -0
  468. package/dist/utils/asyncUtils.js.map +1 -0
  469. package/dist/utils/debugLogger.d.ts +6 -0
  470. package/dist/utils/debugLogger.d.ts.map +1 -0
  471. package/dist/utils/debugLogger.js +39 -0
  472. package/dist/utils/debugLogger.js.map +1 -0
  473. package/dist/utils/errorUtils.d.ts +12 -0
  474. package/dist/utils/errorUtils.d.ts.map +1 -0
  475. package/dist/utils/errorUtils.js +83 -0
  476. package/dist/utils/errorUtils.js.map +1 -0
  477. package/dist/utils/frontmatter.d.ts +10 -0
  478. package/dist/utils/frontmatter.d.ts.map +1 -0
  479. package/dist/utils/frontmatter.js +78 -0
  480. package/dist/utils/frontmatter.js.map +1 -0
  481. package/dist/utils/packageInfo.d.ts +14 -0
  482. package/dist/utils/packageInfo.d.ts.map +1 -0
  483. package/dist/utils/packageInfo.js +45 -0
  484. package/dist/utils/packageInfo.js.map +1 -0
  485. package/dist/utils/planFormatter.d.ts +34 -0
  486. package/dist/utils/planFormatter.d.ts.map +1 -0
  487. package/dist/utils/planFormatter.js +141 -0
  488. package/dist/utils/planFormatter.js.map +1 -0
  489. package/dist/utils/securityUtils.d.ts +132 -0
  490. package/dist/utils/securityUtils.d.ts.map +1 -0
  491. package/dist/utils/securityUtils.js +324 -0
  492. package/dist/utils/securityUtils.js.map +1 -0
  493. package/dist/workspace.d.ts +8 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +134 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/dist/workspace.validator.d.ts +49 -0
  498. package/dist/workspace.validator.d.ts.map +1 -0
  499. package/dist/workspace.validator.js +215 -0
  500. package/dist/workspace.validator.js.map +1 -0
  501. package/package.json +60 -0
@@ -0,0 +1,693 @@
1
+ import { createNodeRuntime } from './node.js';
2
+ import { AGENT_CONTRACT_VERSION } from '../contracts/v1/agent.js';
3
+ import { logDebug } from '../utils/debugLogger.js';
4
+ import { isFallbackEligibleError, getFallbackReason } from '../providers/resilientProvider.js';
5
+ import { getConfiguredProviders, getLatestModelForProvider } from '../core/modelDiscovery.js';
6
+ class EventStream {
7
+ queue = [];
8
+ pending = null;
9
+ closed = false;
10
+ failure = null;
11
+ push(value) {
12
+ if (this.closed || this.failure) {
13
+ return;
14
+ }
15
+ if (this.pending) {
16
+ this.pending.resolve({ value, done: false });
17
+ this.pending = null;
18
+ return;
19
+ }
20
+ this.queue.push(value);
21
+ }
22
+ close() {
23
+ if (this.closed || this.failure) {
24
+ return;
25
+ }
26
+ this.closed = true;
27
+ if (this.pending) {
28
+ this.pending.resolve({ value: undefined, done: true });
29
+ this.pending = null;
30
+ }
31
+ }
32
+ fail(error) {
33
+ if (this.closed || this.failure) {
34
+ return;
35
+ }
36
+ this.failure = error;
37
+ this.closed = true; // Mark as closed to prevent new pending promises
38
+ if (this.pending) {
39
+ this.pending.reject(error);
40
+ this.pending = null;
41
+ }
42
+ }
43
+ next() {
44
+ if (this.queue.length) {
45
+ const value = this.queue.shift();
46
+ return Promise.resolve({ value, done: false });
47
+ }
48
+ if (this.failure) {
49
+ const error = this.failure;
50
+ this.failure = null;
51
+ return Promise.reject(error);
52
+ }
53
+ if (this.closed) {
54
+ return Promise.resolve({ value: undefined, done: true });
55
+ }
56
+ return new Promise((resolve, reject) => {
57
+ this.pending = { resolve, reject };
58
+ });
59
+ }
60
+ return() {
61
+ this.close();
62
+ return Promise.resolve({ value: undefined, done: true });
63
+ }
64
+ throw(error) {
65
+ const err = error instanceof Error ? error : new Error(String(error));
66
+ this.fail(err);
67
+ return Promise.reject(err);
68
+ }
69
+ [Symbol.asyncIterator]() {
70
+ return this;
71
+ }
72
+ }
73
+ function mergeToolObservers(primary, secondary) {
74
+ if (!secondary) {
75
+ return primary;
76
+ }
77
+ return {
78
+ onToolStart(call) {
79
+ primary.onToolStart?.(call);
80
+ secondary.onToolStart?.(call);
81
+ },
82
+ onToolResult(call, output) {
83
+ primary.onToolResult?.(call, output);
84
+ secondary.onToolResult?.(call, output);
85
+ },
86
+ onToolProgress(call, progress) {
87
+ primary.onToolProgress?.(call, progress);
88
+ secondary.onToolProgress?.(call, progress);
89
+ },
90
+ onToolError(call, error) {
91
+ primary.onToolError?.(call, error);
92
+ secondary.onToolError?.(call, error);
93
+ },
94
+ onCacheHit(call) {
95
+ primary.onCacheHit?.(call);
96
+ secondary.onCacheHit?.(call);
97
+ },
98
+ onToolWarning(call, warning) {
99
+ primary.onToolWarning?.(call, warning);
100
+ secondary.onToolWarning?.(call, warning);
101
+ },
102
+ };
103
+ }
104
+ function createControllerToolObserver(ref) {
105
+ const emit = (event) => {
106
+ ref.current?.push(event);
107
+ };
108
+ const timestamp = () => Date.now();
109
+ return {
110
+ onToolStart(call) {
111
+ emit({
112
+ type: 'tool.start',
113
+ timestamp: timestamp(),
114
+ toolName: call.name,
115
+ toolCallId: call.id,
116
+ parameters: { ...call.arguments },
117
+ });
118
+ },
119
+ onToolResult(call, output) {
120
+ emit({
121
+ type: 'tool.complete',
122
+ timestamp: timestamp(),
123
+ toolName: call.name,
124
+ toolCallId: call.id,
125
+ result: output,
126
+ });
127
+ },
128
+ onToolError(call, error) {
129
+ emit({
130
+ type: 'tool.error',
131
+ timestamp: timestamp(),
132
+ toolName: call.name,
133
+ toolCallId: call.id,
134
+ error,
135
+ });
136
+ },
137
+ };
138
+ }
139
+ export async function createAgentController(options, additionalObserver) {
140
+ const sinkRef = { current: null };
141
+ const observer = createControllerToolObserver(sinkRef);
142
+ const runtime = await createNodeRuntime({
143
+ profile: options.profile,
144
+ workspaceContext: options.workspaceContext,
145
+ workingDir: options.workingDir,
146
+ env: options.env,
147
+ toolObserver: mergeToolObservers(observer, additionalObserver),
148
+ additionalModules: options.modules,
149
+ });
150
+ return new AgentController({ runtime, sinkRef, externalCallbacks: options.callbacks });
151
+ }
152
+ export class AgentController {
153
+ session;
154
+ sinkRef;
155
+ externalCallbacks;
156
+ activeSink = null;
157
+ agent = null;
158
+ cachedHistory = [];
159
+ selection;
160
+ /** Set of providers that have failed with non-retryable errors in this session */
161
+ failedProviders = new Set();
162
+ /** Maximum fallback attempts per send() call */
163
+ static MAX_FALLBACK_ATTEMPTS = 3;
164
+ activeTimeout = null;
165
+ inflightReject = null;
166
+ constructor(dependencies) {
167
+ this.session = dependencies.runtime.session;
168
+ this.sinkRef = dependencies.sinkRef;
169
+ this.externalCallbacks = dependencies.externalCallbacks;
170
+ this.selection = this.buildInitialSelection();
171
+ }
172
+ buildInitialSelection() {
173
+ const config = this.session.profileConfig;
174
+ return {
175
+ provider: config.provider,
176
+ model: config.model,
177
+ temperature: config.temperature,
178
+ maxTokens: config.maxTokens,
179
+ systemPrompt: config.systemPrompt,
180
+ };
181
+ }
182
+ ensureAgent() {
183
+ if (this.agent) {
184
+ return this.agent;
185
+ }
186
+ const agent = this.session.createAgent(this.selection, this.createAgentCallbacks(), undefined, {
187
+ explainEdits: true,
188
+ });
189
+ if (this.cachedHistory.length) {
190
+ agent.loadHistory(this.cachedHistory);
191
+ }
192
+ this.agent = agent;
193
+ return agent;
194
+ }
195
+ createAgentCallbacks() {
196
+ return {
197
+ onRequestReceived: (requestPreview) => {
198
+ // Signal to UI that request was received - let model handle natural acknowledgment
199
+ // Don't emit verbatim echo - it's redundant and the model's response should acknowledge contextually
200
+ this.externalCallbacks?.onRequestReceived?.(requestPreview);
201
+ },
202
+ onAssistantMessage: (content, metadata) => {
203
+ this.handleAssistantMessage(content, metadata);
204
+ this.externalCallbacks?.onAssistantMessage?.(content, metadata);
205
+ },
206
+ onStreamChunk: (chunk, type) => {
207
+ if (type === 'content') {
208
+ // Content chunks go to message.delta for streaming display
209
+ this.emitDelta(chunk, false);
210
+ }
211
+ else if (type === 'reasoning') {
212
+ // Reasoning chunks go to reasoning event for thought display
213
+ this.emitReasoning(chunk);
214
+ }
215
+ // Pass all chunks to external callbacks
216
+ this.externalCallbacks?.onStreamChunk?.(chunk, type);
217
+ },
218
+ onUsage: (usage) => {
219
+ this.emitUsage(usage);
220
+ this.externalCallbacks?.onUsage?.(usage);
221
+ },
222
+ onContextPruned: (removedCount, stats) => {
223
+ this.externalCallbacks?.onContextPruned?.(removedCount, stats);
224
+ },
225
+ onContextSquishing: (message) => {
226
+ this.externalCallbacks?.onContextSquishing?.(message);
227
+ },
228
+ onContextRecovery: (attempt, maxAttempts, message) => {
229
+ this.externalCallbacks?.onContextRecovery?.(attempt, maxAttempts, message);
230
+ },
231
+ onContinueAfterRecovery: () => {
232
+ this.externalCallbacks?.onContinueAfterRecovery?.();
233
+ },
234
+ onMultilinePaste: (summary, metadata) => {
235
+ this.externalCallbacks?.onMultilinePaste?.(summary, metadata);
236
+ },
237
+ onEditExplanation: (payload) => {
238
+ this.handleEditExplanation(payload);
239
+ this.externalCallbacks?.onEditExplanation?.(payload);
240
+ },
241
+ onRetrying: (attempt, maxAttempts, error) => {
242
+ // Emit delta event to show retry status
243
+ this.emitDelta(`[Retrying ${attempt}/${maxAttempts}: ${error.message}]`, false);
244
+ this.externalCallbacks?.onRetrying?.(attempt, maxAttempts, error);
245
+ },
246
+ // onBeforeFirstToolCall not needed - model's reasoning is now emitted as thought events
247
+ };
248
+ }
249
+ /**
250
+ * Check if content looks like garbage/leaked reasoning fragments.
251
+ * Returns true if the content should be filtered out.
252
+ * NOTE: Keep this minimal to avoid suppressing legitimate short responses.
253
+ */
254
+ isGarbageContent(content) {
255
+ const trimmed = content.trim();
256
+ if (!trimmed)
257
+ return true;
258
+ // Only filter pure punctuation/markdown artifacts
259
+ if (/^[)\]}>*`'".:,!?|│┃─━═\s]+$/.test(trimmed))
260
+ return true;
261
+ // Just newlines or whitespace
262
+ if (/^[\s\n\r]+$/.test(trimmed))
263
+ return true;
264
+ // Removed aggressive short fragment filtering - was suppressing legitimate content
265
+ return false;
266
+ }
267
+ emitDelta(content, isFinal) {
268
+ if (!content?.trim()) {
269
+ return;
270
+ }
271
+ // Filter out garbage/leaked reasoning fragments
272
+ if (this.isGarbageContent(content)) {
273
+ return;
274
+ }
275
+ this.activeSink?.push({
276
+ type: 'message.delta',
277
+ timestamp: Date.now(),
278
+ content,
279
+ isFinal,
280
+ });
281
+ }
282
+ emitError(message) {
283
+ this.activeSink?.push({
284
+ type: 'error',
285
+ timestamp: Date.now(),
286
+ error: message,
287
+ });
288
+ }
289
+ emitReasoning(content) {
290
+ if (!content?.trim()) {
291
+ return;
292
+ }
293
+ // Filter out garbage/leaked formatting fragments in reasoning too
294
+ if (this.isGarbageContent(content)) {
295
+ return;
296
+ }
297
+ this.activeSink?.push({
298
+ type: 'reasoning',
299
+ timestamp: Date.now(),
300
+ content,
301
+ });
302
+ }
303
+ emitUsage(usage) {
304
+ if (!usage) {
305
+ return;
306
+ }
307
+ this.activeSink?.push({
308
+ type: 'usage',
309
+ timestamp: Date.now(),
310
+ inputTokens: usage.inputTokens,
311
+ outputTokens: usage.outputTokens,
312
+ totalTokens: usage.totalTokens,
313
+ });
314
+ }
315
+ handleEditExplanation(payload) {
316
+ if (!this.activeSink) {
317
+ return;
318
+ }
319
+ if (!payload.explanation?.trim()) {
320
+ return;
321
+ }
322
+ this.activeSink.push({
323
+ type: 'edit.explanation',
324
+ timestamp: Date.now(),
325
+ content: payload.explanation,
326
+ files: payload.files,
327
+ toolName: payload.toolName,
328
+ toolCallId: payload.toolCallId,
329
+ });
330
+ }
331
+ handleAssistantMessage(content, metadata) {
332
+ if (!this.activeSink) {
333
+ return;
334
+ }
335
+ if (!content.trim()) {
336
+ return;
337
+ }
338
+ if (metadata.suppressDisplay) {
339
+ return;
340
+ }
341
+ if (!metadata.isFinal) {
342
+ this.emitDelta(content, false);
343
+ return;
344
+ }
345
+ const elapsedMs = metadata.elapsedMs ?? 0;
346
+ this.activeSink.push({
347
+ type: 'message.complete',
348
+ timestamp: Date.now(),
349
+ content,
350
+ elapsedMs,
351
+ });
352
+ this.emitUsage(metadata.usage ?? null);
353
+ }
354
+ updateCachedHistory() {
355
+ if (this.agent) {
356
+ this.cachedHistory = this.agent.getHistory();
357
+ }
358
+ }
359
+ cancel(reason) {
360
+ if (!this.activeSink) {
361
+ return;
362
+ }
363
+ const error = new Error(reason ?? 'Run cancelled');
364
+ try {
365
+ this.agent?.cancel?.(reason);
366
+ }
367
+ catch {
368
+ // ignore cancellation errors
369
+ }
370
+ this.rejectInflight(error);
371
+ this.activeSink.fail(error);
372
+ this.activeSink = null;
373
+ this.sinkRef.current = null;
374
+ this.clearActiveTimeout();
375
+ }
376
+ clearActiveTimeout() {
377
+ if (this.activeTimeout) {
378
+ clearTimeout(this.activeTimeout);
379
+ this.activeTimeout = null;
380
+ }
381
+ }
382
+ rejectInflight(error) {
383
+ if (this.inflightReject) {
384
+ this.inflightReject(error);
385
+ this.inflightReject = null;
386
+ }
387
+ }
388
+ async *send(message) {
389
+ if (this.activeSink) {
390
+ throw new Error('Agent runtime is already processing a message. Please wait for the current run to finish.');
391
+ }
392
+ // Reset failed providers at the start of each new message
393
+ // (providers might have recovered, quotas might have reset, etc.)
394
+ this.failedProviders.clear();
395
+ let fallbackAttempts = 0;
396
+ // Retry loop for fallback handling
397
+ while (fallbackAttempts < AgentController.MAX_FALLBACK_ATTEMPTS) {
398
+ const agent = this.ensureAgent();
399
+ const sink = new EventStream();
400
+ this.activeSink = sink;
401
+ this.sinkRef.current = sink;
402
+ sink.push({ type: 'message.start', timestamp: Date.now() });
403
+ const timeoutMsRaw = process.env['AGI_AGENT_RUN_TIMEOUT_MS'];
404
+ const timeoutMs = timeoutMsRaw ? Number(timeoutMsRaw) : NaN;
405
+ if (!Number.isNaN(timeoutMs) && timeoutMs > 0 && timeoutMs < 24 * 60 * 60 * 1000) {
406
+ // Only set timeout if less than 24 hours (practically infinite)
407
+ this.activeTimeout = setTimeout(() => {
408
+ const err = new Error(`Run timed out after ${timeoutMs}ms`);
409
+ this.rejectInflight(err);
410
+ sink.fail(err);
411
+ try {
412
+ this.agent?.cancel?.('timeout');
413
+ }
414
+ catch {
415
+ // ignore
416
+ }
417
+ }, timeoutMs);
418
+ }
419
+ else {
420
+ // Set a very large timeout (24 hours) as fallback
421
+ this.activeTimeout = setTimeout(() => {
422
+ const err = new Error(`Run timed out after 24h`);
423
+ this.rejectInflight(err);
424
+ sink.fail(err);
425
+ try {
426
+ this.agent?.cancel?.('timeout');
427
+ }
428
+ catch {
429
+ // ignore
430
+ }
431
+ }, 24 * 60 * 60 * 1000);
432
+ }
433
+ let caughtError = null;
434
+ let fallbackSucceeded = false;
435
+ let cancelRun = null;
436
+ const cancelPromise = new Promise((_, reject) => {
437
+ cancelRun = reject;
438
+ });
439
+ this.inflightReject = (error) => {
440
+ cancelRun?.(error);
441
+ };
442
+ const run = Promise.race([
443
+ agent.send(message, true),
444
+ cancelPromise,
445
+ ])
446
+ .then(() => {
447
+ this.updateCachedHistory();
448
+ this.clearActiveTimeout();
449
+ sink.close();
450
+ })
451
+ .catch(async (error) => {
452
+ const errorObj = error instanceof Error ? error : new Error(String(error));
453
+ caughtError = errorObj;
454
+ this.clearActiveTimeout();
455
+ const cancelled = /cancel/i.test(errorObj.message);
456
+ const timedOut = /timed out/i.test(errorObj.message);
457
+ if (cancelled || timedOut) {
458
+ this.emitError(errorObj.message);
459
+ sink.fail(errorObj);
460
+ return;
461
+ }
462
+ // Check if this error is eligible for fallback
463
+ if (isFallbackEligibleError(error) && fallbackAttempts < AgentController.MAX_FALLBACK_ATTEMPTS - 1) {
464
+ logDebug(`[AgentController] Fallback-eligible error detected: ${errorObj.message}`);
465
+ fallbackSucceeded = await this.attemptFallback(errorObj);
466
+ if (fallbackSucceeded) {
467
+ // Close this sink without error - we'll retry with new provider
468
+ sink.close();
469
+ return;
470
+ }
471
+ }
472
+ // Not fallback-eligible or no fallback available - emit error and fail
473
+ this.emitError(errorObj.message);
474
+ sink.fail(errorObj);
475
+ })
476
+ .finally(() => {
477
+ this.clearActiveTimeout();
478
+ this.inflightReject = null;
479
+ if (this.activeSink === sink) {
480
+ this.activeSink = null;
481
+ this.sinkRef.current = null;
482
+ }
483
+ });
484
+ try {
485
+ for await (const event of sink) {
486
+ yield event;
487
+ }
488
+ }
489
+ finally {
490
+ await run;
491
+ }
492
+ // If we successfully fell back, increment counter and continue loop
493
+ if (fallbackSucceeded && caughtError) {
494
+ fallbackAttempts++;
495
+ logDebug(`[AgentController] Retrying with fallback provider (attempt ${fallbackAttempts}/${AgentController.MAX_FALLBACK_ATTEMPTS})`);
496
+ continue;
497
+ }
498
+ // No fallback happened or it failed - exit loop
499
+ break;
500
+ }
501
+ }
502
+ async switchModel(config) {
503
+ this.updateCachedHistory();
504
+ this.agent = null;
505
+ this.selection = {
506
+ provider: config.provider,
507
+ model: config.model,
508
+ temperature: config.temperature,
509
+ maxTokens: config.maxTokens,
510
+ systemPrompt: this.selection.systemPrompt,
511
+ };
512
+ this.session.updateToolContext(this.selection);
513
+ }
514
+ getCapabilities() {
515
+ const tools = this.session.toolRuntime.listProviderTools();
516
+ const manifestTools = tools.map((tool) => ({
517
+ name: tool.name,
518
+ description: tool.description,
519
+ category: 'general',
520
+ }));
521
+ return {
522
+ contractVersion: AGENT_CONTRACT_VERSION,
523
+ profile: this.session.profile,
524
+ model: this.toModelConfig(this.selection),
525
+ tools: manifestTools,
526
+ features: ['streaming', 'tool-calls'],
527
+ };
528
+ }
529
+ registerToolSuite(suiteId, suite) {
530
+ this.session.toolRuntime.registerSuite({ ...suite, id: suiteId });
531
+ }
532
+ unregisterToolSuite(suiteId) {
533
+ this.session.toolRuntime.unregisterSuite(suiteId);
534
+ }
535
+ getHistory() {
536
+ if (this.agent) {
537
+ return this.agent.getHistory();
538
+ }
539
+ return [...this.cachedHistory];
540
+ }
541
+ clearHistory() {
542
+ this.cachedHistory = [];
543
+ this.agent?.clearHistory();
544
+ }
545
+ /**
546
+ * Check if the controller is currently processing a message.
547
+ */
548
+ isProcessing() {
549
+ return this.activeSink !== null;
550
+ }
551
+ /**
552
+ * Force-clear any lingering active state. Use this before starting a new
553
+ * operation (like attack tournament) to ensure clean state.
554
+ * This will close any active sink without waiting for completion.
555
+ */
556
+ forceReset() {
557
+ if (this.activeSink) {
558
+ try {
559
+ this.activeSink.close();
560
+ }
561
+ catch {
562
+ // Ignore errors - sink may already be closed
563
+ }
564
+ this.activeSink = null;
565
+ this.sinkRef.current = null;
566
+ }
567
+ }
568
+ /**
569
+ * Sanitize history by fixing orphaned tool calls (tool_calls without corresponding tool results).
570
+ * This can happen when a run is interrupted mid-tool-execution.
571
+ * We add placeholder error results for any orphaned tool calls to keep history valid.
572
+ */
573
+ sanitizeHistory() {
574
+ const history = this.getHistory();
575
+ if (history.length === 0)
576
+ return;
577
+ const sanitized = [];
578
+ for (let i = 0; i < history.length; i++) {
579
+ const msg = history[i];
580
+ sanitized.push(msg);
581
+ // Check if this is an assistant message with tool_calls
582
+ if (msg.role === 'assistant' && msg.toolCalls?.length) {
583
+ // Look ahead for tool results
584
+ const toolCallIds = new Set(msg.toolCalls.map(tc => tc.id));
585
+ let nextIdx = i + 1;
586
+ // Consume any following tool messages
587
+ while (nextIdx < history.length && history[nextIdx].role === 'tool') {
588
+ const toolMsg = history[nextIdx];
589
+ if (toolMsg.toolCallId) {
590
+ toolCallIds.delete(toolMsg.toolCallId);
591
+ }
592
+ sanitized.push(history[nextIdx]);
593
+ nextIdx++;
594
+ }
595
+ // Add placeholder results for any orphaned tool calls
596
+ for (const orphanedId of toolCallIds) {
597
+ const orphanedCall = msg.toolCalls.find(tc => tc.id === orphanedId);
598
+ const toolName = orphanedCall?.name ?? 'unknown';
599
+ sanitized.push({
600
+ role: 'tool',
601
+ name: toolName,
602
+ toolCallId: orphanedId,
603
+ content: `[Interrupted: ${toolName} execution was cancelled]`,
604
+ });
605
+ }
606
+ // Skip the tool messages we already processed
607
+ i = nextIdx - 1;
608
+ }
609
+ }
610
+ // Update both cached history and agent history
611
+ this.cachedHistory = sanitized;
612
+ if (this.agent) {
613
+ this.agent.loadHistory(sanitized);
614
+ }
615
+ }
616
+ toModelConfig(selection) {
617
+ return {
618
+ provider: selection.provider,
619
+ model: selection.model,
620
+ temperature: selection.temperature,
621
+ maxTokens: selection.maxTokens,
622
+ };
623
+ }
624
+ /**
625
+ * Find the next available provider for fallback.
626
+ * Excludes providers that have already failed in this session.
627
+ */
628
+ findFallbackProvider() {
629
+ const configured = getConfiguredProviders();
630
+ const currentProvider = this.selection.provider;
631
+ // Provider preference order (excluding current and failed)
632
+ // deepseek-reasoner is default, grok (xai) is backup
633
+ const preferenceOrder = ['deepseek', 'xai'];
634
+ for (const providerId of preferenceOrder) {
635
+ // Skip current provider and already failed providers
636
+ if (providerId === currentProvider || this.failedProviders.has(providerId)) {
637
+ continue;
638
+ }
639
+ // Check if this provider is configured
640
+ const provider = configured.find(p => p.id === providerId);
641
+ if (provider) {
642
+ const model = getLatestModelForProvider(providerId);
643
+ if (model) {
644
+ return { provider: providerId, model };
645
+ }
646
+ }
647
+ }
648
+ return null;
649
+ }
650
+ /**
651
+ * Emit a provider fallback event
652
+ */
653
+ emitFallbackEvent(fromProvider, fromModel, toProvider, toModel, reason, error) {
654
+ this.activeSink?.push({
655
+ type: 'provider.fallback',
656
+ timestamp: Date.now(),
657
+ fromProvider,
658
+ fromModel,
659
+ toProvider,
660
+ toModel,
661
+ reason,
662
+ error,
663
+ });
664
+ }
665
+ /**
666
+ * Attempt to switch to a fallback provider
667
+ */
668
+ async attemptFallback(error) {
669
+ const fallback = this.findFallbackProvider();
670
+ if (!fallback) {
671
+ logDebug('[AgentController] No fallback provider available');
672
+ return false;
673
+ }
674
+ const reason = getFallbackReason(error);
675
+ const fromProvider = this.selection.provider;
676
+ const fromModel = this.selection.model;
677
+ // Mark current provider as failed
678
+ this.failedProviders.add(fromProvider);
679
+ // Emit fallback event
680
+ this.emitFallbackEvent(fromProvider, fromModel, fallback.provider, fallback.model, reason, error.message);
681
+ logDebug(`[AgentController] Falling back from ${fromProvider}/${fromModel} to ${fallback.provider}/${fallback.model}: ${reason}`);
682
+ // Switch to fallback provider
683
+ await this.switchModel({
684
+ provider: fallback.provider,
685
+ model: fallback.model,
686
+ });
687
+ return true;
688
+ }
689
+ getToolSuites() {
690
+ return this.session.toolSuites;
691
+ }
692
+ }
693
+ //# sourceMappingURL=agentController.js.map