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,833 @@
1
+ /**
2
+ * Episodic Memory System - Cross-session pattern learning with semantic indexing
3
+ *
4
+ * Features:
5
+ * 1. Episode detection and boundary marking
6
+ * 2. Semantic indexing via vector embeddings (pluggable providers)
7
+ * 3. Cross-session pattern learning and retrieval
8
+ * 4. Task-specific memory with temporal decay
9
+ * 5. Memory consolidation and pruning
10
+ *
11
+ * Storage: ~/.agi/episodic-memory/
12
+ * - episodes.json (episode metadata index)
13
+ * - embeddings.bin (vector embeddings cache)
14
+ * - patterns.json (learned patterns)
15
+ */
16
+ import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ import { homedir } from 'node:os';
19
+ /**
20
+ * Default reward weights for each category
21
+ */
22
+ const DEFAULT_REWARD_WEIGHTS = {
23
+ bug_fix: {
24
+ executionSuccess: 0.30,
25
+ testsPassed: 0.35,
26
+ staticAnalysis: 0.10,
27
+ codeQuality: 0.05,
28
+ blastRadius: 0.15,
29
+ selfAssessment: 0.03,
30
+ speedBonus: 0.02,
31
+ },
32
+ feature_add: {
33
+ executionSuccess: 0.25,
34
+ testsPassed: 0.25,
35
+ staticAnalysis: 0.15,
36
+ codeQuality: 0.15,
37
+ blastRadius: 0.10,
38
+ selfAssessment: 0.05,
39
+ speedBonus: 0.05,
40
+ },
41
+ refactor: {
42
+ executionSuccess: 0.25,
43
+ testsPassed: 0.30,
44
+ staticAnalysis: 0.20,
45
+ codeQuality: 0.15,
46
+ blastRadius: 0.05,
47
+ selfAssessment: 0.03,
48
+ speedBonus: 0.02,
49
+ },
50
+ test_write: {
51
+ executionSuccess: 0.30,
52
+ testsPassed: 0.40,
53
+ staticAnalysis: 0.10,
54
+ codeQuality: 0.05,
55
+ blastRadius: 0.05,
56
+ selfAssessment: 0.05,
57
+ speedBonus: 0.05,
58
+ },
59
+ documentation: {
60
+ executionSuccess: 0.35,
61
+ testsPassed: 0.05,
62
+ staticAnalysis: 0.10,
63
+ codeQuality: 0.20,
64
+ blastRadius: 0.10,
65
+ selfAssessment: 0.10,
66
+ speedBonus: 0.10,
67
+ },
68
+ analysis: {
69
+ executionSuccess: 0.40,
70
+ testsPassed: 0.05,
71
+ staticAnalysis: 0.05,
72
+ codeQuality: 0.10,
73
+ blastRadius: 0.05,
74
+ selfAssessment: 0.20,
75
+ speedBonus: 0.15,
76
+ },
77
+ configuration: {
78
+ executionSuccess: 0.35,
79
+ testsPassed: 0.20,
80
+ staticAnalysis: 0.15,
81
+ codeQuality: 0.05,
82
+ blastRadius: 0.15,
83
+ selfAssessment: 0.05,
84
+ speedBonus: 0.05,
85
+ },
86
+ debugging: {
87
+ executionSuccess: 0.35,
88
+ testsPassed: 0.25,
89
+ staticAnalysis: 0.05,
90
+ codeQuality: 0.05,
91
+ blastRadius: 0.05,
92
+ selfAssessment: 0.15,
93
+ speedBonus: 0.10,
94
+ },
95
+ optimization: {
96
+ executionSuccess: 0.25,
97
+ testsPassed: 0.25,
98
+ staticAnalysis: 0.10,
99
+ codeQuality: 0.15,
100
+ blastRadius: 0.05,
101
+ selfAssessment: 0.05,
102
+ speedBonus: 0.15,
103
+ },
104
+ migration: {
105
+ executionSuccess: 0.30,
106
+ testsPassed: 0.30,
107
+ staticAnalysis: 0.15,
108
+ codeQuality: 0.05,
109
+ blastRadius: 0.10,
110
+ selfAssessment: 0.05,
111
+ speedBonus: 0.05,
112
+ },
113
+ unknown: {
114
+ executionSuccess: 0.25,
115
+ testsPassed: 0.30,
116
+ staticAnalysis: 0.15,
117
+ codeQuality: 0.10,
118
+ blastRadius: 0.10,
119
+ selfAssessment: 0.05,
120
+ speedBonus: 0.05,
121
+ },
122
+ };
123
+ // ============================================================================
124
+ // DEFAULT EMBEDDING PROVIDER (Simple TF-IDF style, no external deps)
125
+ // ============================================================================
126
+ class SimpleEmbeddingProvider {
127
+ dimension = 256;
128
+ name = 'simple-tfidf';
129
+ vocabulary = new Map();
130
+ idf = new Map();
131
+ async embed(text) {
132
+ const tokens = this.tokenize(text);
133
+ const vector = new Array(this.dimension).fill(0);
134
+ // Simple hash-based embedding (deterministic, no training needed)
135
+ for (const token of tokens) {
136
+ const hash = this.hashToken(token);
137
+ const idx = Math.abs(hash) % this.dimension;
138
+ vector[idx] += 1;
139
+ }
140
+ // Normalize to unit vector
141
+ const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
142
+ if (magnitude > 0) {
143
+ for (let i = 0; i < vector.length; i++) {
144
+ vector[i] /= magnitude;
145
+ }
146
+ }
147
+ return vector;
148
+ }
149
+ tokenize(text) {
150
+ return text
151
+ .toLowerCase()
152
+ .replace(/[^a-z0-9\s]/g, ' ')
153
+ .split(/\s+/)
154
+ .filter(t => t.length > 2);
155
+ }
156
+ hashToken(token) {
157
+ let hash = 0;
158
+ for (let i = 0; i < token.length; i++) {
159
+ const char = token.charCodeAt(i);
160
+ hash = ((hash << 5) - hash) + char;
161
+ hash = hash & hash; // Convert to 32-bit integer
162
+ }
163
+ return hash;
164
+ }
165
+ }
166
+ // ============================================================================
167
+ // EPISODIC MEMORY SYSTEM
168
+ // ============================================================================
169
+ export class EpisodicMemory {
170
+ config;
171
+ episodes = new Map();
172
+ approaches = new Map();
173
+ optimizationProfiles = new Map();
174
+ embeddingProvider;
175
+ dirty = false;
176
+ // In-memory episode being recorded
177
+ currentEpisode = null;
178
+ episodeToolsUsed = new Set();
179
+ episodeFilesModified = new Set();
180
+ constructor(config = {}) {
181
+ const dataRoot = process.env['AGI_DATA_DIR']?.trim() || join(homedir(), '.agi');
182
+ this.config = {
183
+ maxEpisodes: 1000,
184
+ maxApproaches: 200,
185
+ decayFactor: 0.95,
186
+ minSimilarity: 0.3,
187
+ useEmbeddings: true,
188
+ storageDir: join(dataRoot, 'episodic-memory'),
189
+ ...config,
190
+ };
191
+ this.embeddingProvider = config.embeddingProvider || new SimpleEmbeddingProvider();
192
+ this.load();
193
+ }
194
+ // ==========================================================================
195
+ // EPISODE LIFECYCLE
196
+ // ==========================================================================
197
+ /**
198
+ * Start recording a new episode
199
+ */
200
+ startEpisode(intent, sessionId, category) {
201
+ const id = this.generateId();
202
+ this.currentEpisode = {
203
+ id,
204
+ sessionId,
205
+ startTime: Date.now(),
206
+ intent,
207
+ category: category || this.inferCategory(intent),
208
+ toolsUsed: [],
209
+ filesModified: [],
210
+ success: false,
211
+ summary: '',
212
+ tags: this.extractTags(intent),
213
+ retrievalCount: 0,
214
+ lastRetrieved: 0,
215
+ };
216
+ this.episodeToolsUsed.clear();
217
+ this.episodeFilesModified.clear();
218
+ return id;
219
+ }
220
+ /**
221
+ * Record tool usage within current episode
222
+ */
223
+ recordToolUse(toolName) {
224
+ this.episodeToolsUsed.add(toolName);
225
+ }
226
+ /**
227
+ * Record file modification within current episode
228
+ */
229
+ recordFileModification(filePath) {
230
+ this.episodeFilesModified.add(filePath);
231
+ }
232
+ /**
233
+ * End current episode and save to memory
234
+ */
235
+ async endEpisode(success, summary) {
236
+ if (!this.currentEpisode)
237
+ return null;
238
+ const episode = {
239
+ ...this.currentEpisode,
240
+ endTime: Date.now(),
241
+ success,
242
+ summary,
243
+ toolsUsed: Array.from(this.episodeToolsUsed),
244
+ filesModified: Array.from(this.episodeFilesModified),
245
+ };
246
+ // Generate embedding for semantic search
247
+ if (this.config.useEmbeddings) {
248
+ const textForEmbedding = `${episode.intent} ${episode.summary} ${episode.tags.join(' ')}`;
249
+ episode.embedding = await this.embeddingProvider.embed(textForEmbedding);
250
+ }
251
+ this.episodes.set(episode.id, episode);
252
+ this.dirty = true;
253
+ // Learn from successful episodes
254
+ if (success) {
255
+ await this.learnFromEpisode(episode);
256
+ }
257
+ // Prune if needed
258
+ this.pruneEpisodes();
259
+ // Clear current episode
260
+ this.currentEpisode = null;
261
+ this.episodeToolsUsed.clear();
262
+ this.episodeFilesModified.clear();
263
+ // Auto-save
264
+ this.save();
265
+ return episode;
266
+ }
267
+ /**
268
+ * Abort current episode without saving
269
+ */
270
+ abortEpisode() {
271
+ this.currentEpisode = null;
272
+ this.episodeToolsUsed.clear();
273
+ this.episodeFilesModified.clear();
274
+ }
275
+ // ==========================================================================
276
+ // RETRIEVAL & SEARCH
277
+ // ==========================================================================
278
+ /**
279
+ * Search for similar past episodes
280
+ */
281
+ async search(query) {
282
+ const results = [];
283
+ const limit = query.limit || 10;
284
+ // Generate query embedding if using embeddings
285
+ let queryEmbedding = null;
286
+ if (this.config.useEmbeddings) {
287
+ queryEmbedding = await this.embeddingProvider.embed(query.query);
288
+ }
289
+ for (const episode of this.episodes.values()) {
290
+ // Apply filters
291
+ if (query.category && episode.category !== query.category)
292
+ continue;
293
+ if (query.successOnly && !episode.success)
294
+ continue;
295
+ if (query.since && episode.startTime < query.since)
296
+ continue;
297
+ if (query.tags && !query.tags.some(t => episode.tags.includes(t)))
298
+ continue;
299
+ // Calculate similarity
300
+ let similarity = 0;
301
+ let matchReason = '';
302
+ if (queryEmbedding && episode.embedding) {
303
+ // Cosine similarity for embeddings
304
+ similarity = this.cosineSimilarity(queryEmbedding, episode.embedding);
305
+ matchReason = 'semantic similarity';
306
+ }
307
+ else {
308
+ // Fallback to keyword matching
309
+ similarity = this.keywordSimilarity(query.query, episode.intent + ' ' + episode.summary);
310
+ matchReason = 'keyword match';
311
+ }
312
+ // Apply temporal decay
313
+ const ageInDays = (Date.now() - episode.endTime) / (1000 * 60 * 60 * 24);
314
+ const decayedSimilarity = similarity * Math.pow(this.config.decayFactor, ageInDays / 30);
315
+ // Boost for popularity
316
+ const popularityBoost = 1 + (episode.retrievalCount * 0.01);
317
+ const finalSimilarity = decayedSimilarity * popularityBoost;
318
+ if (finalSimilarity >= (query.minSimilarity || this.config.minSimilarity)) {
319
+ results.push({
320
+ episode,
321
+ similarity: finalSimilarity,
322
+ matchReason,
323
+ });
324
+ }
325
+ }
326
+ // Sort by similarity and limit
327
+ results.sort((a, b) => b.similarity - a.similarity);
328
+ const topResults = results.slice(0, limit);
329
+ // Update retrieval counts
330
+ for (const result of topResults) {
331
+ result.episode.retrievalCount++;
332
+ result.episode.lastRetrieved = Date.now();
333
+ this.dirty = true;
334
+ }
335
+ return topResults;
336
+ }
337
+ /**
338
+ * Get learned approach for a task
339
+ */
340
+ async getApproach(intent) {
341
+ const keywords = this.extractKeywords(intent);
342
+ // First try exact keyword match
343
+ for (const approach of this.approaches.values()) {
344
+ const overlapCount = keywords.filter(k => approach.keywords.includes(k)).length;
345
+ if (overlapCount >= Math.min(3, keywords.length * 0.5)) {
346
+ return approach;
347
+ }
348
+ }
349
+ // Try semantic search if embeddings enabled
350
+ if (this.config.useEmbeddings) {
351
+ const queryEmbedding = await this.embeddingProvider.embed(intent);
352
+ let bestMatch = null;
353
+ let bestSimilarity = 0;
354
+ for (const approach of this.approaches.values()) {
355
+ if (approach.embedding) {
356
+ const similarity = this.cosineSimilarity(queryEmbedding, approach.embedding);
357
+ if (similarity > bestSimilarity && similarity >= this.config.minSimilarity) {
358
+ bestSimilarity = similarity;
359
+ bestMatch = approach;
360
+ }
361
+ }
362
+ }
363
+ return bestMatch;
364
+ }
365
+ return null;
366
+ }
367
+ /**
368
+ * Get recent episodes for context
369
+ */
370
+ getRecentEpisodes(limit = 5, sessionId) {
371
+ const episodes = Array.from(this.episodes.values());
372
+ const filtered = sessionId
373
+ ? episodes.filter(e => e.sessionId === sessionId)
374
+ : episodes;
375
+ return filtered
376
+ .sort((a, b) => b.endTime - a.endTime)
377
+ .slice(0, limit);
378
+ }
379
+ // ==========================================================================
380
+ // LEARNING
381
+ // ==========================================================================
382
+ /**
383
+ * Learn patterns from a successful episode
384
+ */
385
+ async learnFromEpisode(episode) {
386
+ const keywords = this.extractKeywords(episode.intent);
387
+ const approachKey = keywords.sort().join('_');
388
+ const existing = this.approaches.get(approachKey);
389
+ if (existing) {
390
+ // Update existing approach
391
+ existing.useCount++;
392
+ existing.successRate = (existing.successRate * (existing.useCount - 1) + 1) / existing.useCount;
393
+ existing.sourceEpisodes.push(episode.id);
394
+ existing.tools = [...new Set([...existing.tools, ...episode.toolsUsed])];
395
+ existing.updatedAt = Date.now();
396
+ // Re-compute embedding
397
+ if (this.config.useEmbeddings) {
398
+ existing.embedding = await this.embeddingProvider.embed(existing.triggerPattern);
399
+ }
400
+ }
401
+ else {
402
+ // Create new approach
403
+ const approach = {
404
+ id: this.generateId(),
405
+ triggerPattern: episode.intent,
406
+ keywords,
407
+ approach: [episode.summary],
408
+ tools: episode.toolsUsed,
409
+ successRate: 1,
410
+ useCount: 1,
411
+ sourceEpisodes: [episode.id],
412
+ updatedAt: Date.now(),
413
+ };
414
+ if (this.config.useEmbeddings) {
415
+ approach.embedding = await this.embeddingProvider.embed(approach.triggerPattern);
416
+ }
417
+ this.approaches.set(approachKey, approach);
418
+ }
419
+ this.pruneApproaches();
420
+ this.dirty = true;
421
+ }
422
+ /**
423
+ * Record approach failure to update success rate
424
+ */
425
+ recordApproachFailure(approachId) {
426
+ for (const approach of this.approaches.values()) {
427
+ if (approach.id === approachId) {
428
+ approach.useCount++;
429
+ approach.successRate = (approach.successRate * (approach.useCount - 1)) / approach.useCount;
430
+ approach.updatedAt = Date.now();
431
+ this.dirty = true;
432
+ break;
433
+ }
434
+ }
435
+ }
436
+ // ==========================================================================
437
+ // HELPERS
438
+ // ==========================================================================
439
+ generateId() {
440
+ const timestamp = Date.now().toString(36);
441
+ const random = Math.random().toString(36).slice(2, 8);
442
+ return `ep_${timestamp}_${random}`;
443
+ }
444
+ inferCategory(intent) {
445
+ const lower = intent.toLowerCase();
446
+ if (/\b(fix|bug|error|issue|crash|broken)\b/.test(lower))
447
+ return 'bug_fix';
448
+ if (/\b(add|feature|implement|create|new)\b/.test(lower))
449
+ return 'feature_add';
450
+ if (/\b(refactor|clean|reorganize|restructure)\b/.test(lower))
451
+ return 'refactor';
452
+ if (/\b(test|spec|coverage)\b/.test(lower))
453
+ return 'test_write';
454
+ if (/\b(doc|readme|comment|explain)\b/.test(lower))
455
+ return 'documentation';
456
+ if (/\b(analyz|understand|explore|investigate)\b/.test(lower))
457
+ return 'analysis';
458
+ if (/\b(config|setup|install|env)\b/.test(lower))
459
+ return 'configuration';
460
+ if (/\b(debug|trace|log|inspect)\b/.test(lower))
461
+ return 'debugging';
462
+ if (/\b(optim|perf|speed|fast)\b/.test(lower))
463
+ return 'optimization';
464
+ if (/\b(migrat|upgrad|update|convert)\b/.test(lower))
465
+ return 'migration';
466
+ return 'unknown';
467
+ }
468
+ extractTags(text) {
469
+ const tags = [];
470
+ const lower = text.toLowerCase();
471
+ // Extract technology tags
472
+ const techPatterns = {
473
+ typescript: /\btypescript\b|\\.tsx?\b/,
474
+ javascript: /\bjavascript\b|\\.jsx?\b/,
475
+ python: /\bpython\b|\\.py\b/,
476
+ react: /\breact\b/,
477
+ node: /\bnode\.?js?\b/,
478
+ api: /\bapi\b|\brest\b|\bgraphql\b/,
479
+ database: /\bdb\b|\bdatabase\b|\bsql\b|\bmongo\b/,
480
+ test: /\btest\b|\bspec\b|\bjest\b|\bvitest\b/,
481
+ git: /\bgit\b|\bcommit\b|\bbranch\b/,
482
+ };
483
+ for (const [tag, pattern] of Object.entries(techPatterns)) {
484
+ if (pattern.test(lower)) {
485
+ tags.push(tag);
486
+ }
487
+ }
488
+ return tags;
489
+ }
490
+ extractKeywords(text) {
491
+ return text
492
+ .toLowerCase()
493
+ .replace(/[^a-z0-9\s]/g, ' ')
494
+ .split(/\s+/)
495
+ .filter(w => w.length > 3)
496
+ .filter(w => !['this', 'that', 'with', 'from', 'have', 'will', 'would', 'could', 'should'].includes(w));
497
+ }
498
+ cosineSimilarity(a, b) {
499
+ if (a.length !== b.length)
500
+ return 0;
501
+ let dotProduct = 0;
502
+ let magnitudeA = 0;
503
+ let magnitudeB = 0;
504
+ for (let i = 0; i < a.length; i++) {
505
+ dotProduct += a[i] * b[i];
506
+ magnitudeA += a[i] * a[i];
507
+ magnitudeB += b[i] * b[i];
508
+ }
509
+ const magnitude = Math.sqrt(magnitudeA) * Math.sqrt(magnitudeB);
510
+ return magnitude === 0 ? 0 : dotProduct / magnitude;
511
+ }
512
+ keywordSimilarity(query, text) {
513
+ const queryWords = new Set(this.extractKeywords(query));
514
+ const textWords = new Set(this.extractKeywords(text));
515
+ if (queryWords.size === 0 || textWords.size === 0)
516
+ return 0;
517
+ let matches = 0;
518
+ for (const word of queryWords) {
519
+ if (textWords.has(word))
520
+ matches++;
521
+ }
522
+ return matches / queryWords.size;
523
+ }
524
+ // ==========================================================================
525
+ // OPTIMIZATION PROFILES
526
+ // ==========================================================================
527
+ /**
528
+ * Get or create an optimization profile for a category.
529
+ * Used by the RL tournament system to get task-specific settings.
530
+ */
531
+ getOptimizationProfile(category, policyName) {
532
+ const existing = this.optimizationProfiles.get(category);
533
+ if (existing) {
534
+ return existing;
535
+ }
536
+ // Create default profile for this category
537
+ const profile = {
538
+ id: `profile_${category}_${Date.now().toString(36)}`,
539
+ category,
540
+ policyName: policyName || `${category}_default`,
541
+ preferredMode: this.inferPreferredMode(category),
542
+ useGitWorktrees: category === 'migration' || category === 'refactor',
543
+ rewardWeights: { ...DEFAULT_REWARD_WEIGHTS[category] },
544
+ preferredTools: this.inferPreferredTools(category),
545
+ autoApprovalThreshold: 0.85,
546
+ successCount: 0,
547
+ failureCount: 0,
548
+ updatedAt: Date.now(),
549
+ };
550
+ this.optimizationProfiles.set(category, profile);
551
+ this.dirty = true;
552
+ return profile;
553
+ }
554
+ /**
555
+ * Update optimization profile based on episode outcome.
556
+ * Called after an episode completes to adjust learned settings.
557
+ */
558
+ updateOptimizationProfile(category, success, options) {
559
+ const profile = this.getOptimizationProfile(category);
560
+ if (success) {
561
+ profile.successCount++;
562
+ // Update preferred tools based on successful episodes
563
+ if (options?.toolsUsed) {
564
+ for (const tool of options.toolsUsed) {
565
+ if (!profile.preferredTools.includes(tool)) {
566
+ profile.preferredTools.push(tool);
567
+ }
568
+ }
569
+ // Keep only top 10 preferred tools
570
+ profile.preferredTools = profile.preferredTools.slice(0, 10);
571
+ }
572
+ // Update mode preference if dual mode was successful
573
+ if (options?.mode && options.mode !== 'single-continuous') {
574
+ const successRate = profile.successCount / (profile.successCount + profile.failureCount);
575
+ if (successRate > 0.7 && profile.preferredMode === 'single-continuous') {
576
+ profile.preferredMode = 'dual-rl-continuous';
577
+ }
578
+ }
579
+ // Track git worktree success
580
+ if (options?.usedGitWorktrees && !profile.useGitWorktrees) {
581
+ profile.useGitWorktrees = true;
582
+ }
583
+ }
584
+ else {
585
+ profile.failureCount++;
586
+ // If success rate drops, adjust auto-approval threshold
587
+ const successRate = profile.successCount / (profile.successCount + profile.failureCount);
588
+ if (successRate < profile.autoApprovalThreshold) {
589
+ profile.autoApprovalThreshold = Math.max(0.5, successRate - 0.05);
590
+ }
591
+ }
592
+ profile.updatedAt = Date.now();
593
+ this.dirty = true;
594
+ this.save();
595
+ }
596
+ /**
597
+ * Get reward weights for a category, adjusted based on learned patterns.
598
+ */
599
+ getRewardWeights(category) {
600
+ const profile = this.getOptimizationProfile(category);
601
+ return profile.rewardWeights;
602
+ }
603
+ /**
604
+ * Update reward weights based on tournament outcomes.
605
+ * Adjusts weights to favor signals that correlated with successful outcomes.
606
+ */
607
+ adjustRewardWeights(category, winningSignals, success) {
608
+ const profile = this.getOptimizationProfile(category);
609
+ const learningRate = 0.1;
610
+ for (const [key, value] of Object.entries(winningSignals)) {
611
+ const k = key;
612
+ if (success) {
613
+ // Slightly increase weight for signals that contributed to success
614
+ profile.rewardWeights[k] = Math.min(0.5, profile.rewardWeights[k] + learningRate * value);
615
+ }
616
+ else {
617
+ // Slightly decrease weight for signals that didn't prevent failure
618
+ profile.rewardWeights[k] = Math.max(0.01, profile.rewardWeights[k] - learningRate * 0.5 * value);
619
+ }
620
+ }
621
+ // Normalize weights to sum to 1
622
+ const total = Object.values(profile.rewardWeights).reduce((sum, v) => sum + v, 0);
623
+ for (const key of Object.keys(profile.rewardWeights)) {
624
+ const k = key;
625
+ profile.rewardWeights[k] /= total;
626
+ }
627
+ profile.updatedAt = Date.now();
628
+ this.dirty = true;
629
+ }
630
+ /**
631
+ * Get all optimization profiles for inspection.
632
+ */
633
+ getAllOptimizationProfiles() {
634
+ return Array.from(this.optimizationProfiles.values());
635
+ }
636
+ inferPreferredMode(category) {
637
+ // Categories that benefit from dual-agent comparison
638
+ switch (category) {
639
+ case 'refactor':
640
+ case 'optimization':
641
+ case 'migration':
642
+ return 'dual-rl-tournament';
643
+ case 'feature_add':
644
+ case 'bug_fix':
645
+ return 'dual-rl-continuous';
646
+ default:
647
+ return 'single-continuous';
648
+ }
649
+ }
650
+ inferPreferredTools(category) {
651
+ switch (category) {
652
+ case 'bug_fix':
653
+ return ['Read', 'Grep', 'Edit', 'Bash'];
654
+ case 'feature_add':
655
+ return ['Read', 'Write', 'Edit', 'Bash'];
656
+ case 'refactor':
657
+ return ['Read', 'Edit', 'Grep', 'Bash'];
658
+ case 'test_write':
659
+ return ['Read', 'Write', 'Bash'];
660
+ case 'documentation':
661
+ return ['Read', 'Write', 'Edit'];
662
+ case 'analysis':
663
+ return ['Read', 'Grep', 'Glob'];
664
+ case 'debugging':
665
+ return ['Read', 'Grep', 'Bash', 'Edit'];
666
+ default:
667
+ return ['Read', 'Edit', 'Bash'];
668
+ }
669
+ }
670
+ // ==========================================================================
671
+ // PRUNING
672
+ // ==========================================================================
673
+ pruneEpisodes() {
674
+ if (this.episodes.size <= this.config.maxEpisodes)
675
+ return;
676
+ // Score episodes by value (recency + success + retrieval count)
677
+ const scored = Array.from(this.episodes.values()).map(ep => {
678
+ const ageScore = 1 - (Date.now() - ep.endTime) / (1000 * 60 * 60 * 24 * 365); // 1 year decay
679
+ const successScore = ep.success ? 0.3 : 0;
680
+ const retrievalScore = Math.min(ep.retrievalCount * 0.05, 0.2);
681
+ return { id: ep.id, score: ageScore + successScore + retrievalScore };
682
+ });
683
+ scored.sort((a, b) => b.score - a.score);
684
+ // Keep top episodes
685
+ const toKeep = new Set(scored.slice(0, this.config.maxEpisodes).map(s => s.id));
686
+ for (const id of this.episodes.keys()) {
687
+ if (!toKeep.has(id)) {
688
+ this.episodes.delete(id);
689
+ }
690
+ }
691
+ }
692
+ pruneApproaches() {
693
+ if (this.approaches.size <= this.config.maxApproaches)
694
+ return;
695
+ // Score approaches by usefulness
696
+ const scored = Array.from(this.approaches.entries()).map(([key, ap]) => {
697
+ const recencyScore = 1 - (Date.now() - ap.updatedAt) / (1000 * 60 * 60 * 24 * 180); // 6 month decay
698
+ const useScore = Math.min(ap.useCount * 0.1, 0.3);
699
+ const successScore = ap.successRate * 0.4;
700
+ return { key, score: recencyScore + useScore + successScore };
701
+ });
702
+ scored.sort((a, b) => b.score - a.score);
703
+ // Keep top approaches
704
+ const toKeep = new Set(scored.slice(0, this.config.maxApproaches).map(s => s.key));
705
+ for (const key of this.approaches.keys()) {
706
+ if (!toKeep.has(key)) {
707
+ this.approaches.delete(key);
708
+ }
709
+ }
710
+ }
711
+ // ==========================================================================
712
+ // PERSISTENCE
713
+ // ==========================================================================
714
+ load() {
715
+ try {
716
+ if (!existsSync(this.config.storageDir)) {
717
+ mkdirSync(this.config.storageDir, { recursive: true });
718
+ return;
719
+ }
720
+ const episodesPath = join(this.config.storageDir, 'episodes.json');
721
+ const approachesPath = join(this.config.storageDir, 'approaches.json');
722
+ const profilesPath = join(this.config.storageDir, 'optimization-profiles.json');
723
+ if (existsSync(episodesPath)) {
724
+ const data = JSON.parse(readFileSync(episodesPath, 'utf-8'));
725
+ for (const ep of data.episodes || []) {
726
+ this.episodes.set(ep.id, ep);
727
+ }
728
+ }
729
+ if (existsSync(approachesPath)) {
730
+ const data = JSON.parse(readFileSync(approachesPath, 'utf-8'));
731
+ for (const [key, ap] of Object.entries(data.approaches || {})) {
732
+ this.approaches.set(key, ap);
733
+ }
734
+ }
735
+ if (existsSync(profilesPath)) {
736
+ const data = JSON.parse(readFileSync(profilesPath, 'utf-8'));
737
+ for (const profile of data.profiles || []) {
738
+ this.optimizationProfiles.set(profile.category, profile);
739
+ }
740
+ }
741
+ }
742
+ catch (error) {
743
+ console.error('Failed to load episodic memory:', error);
744
+ }
745
+ }
746
+ save() {
747
+ if (!this.dirty)
748
+ return;
749
+ try {
750
+ mkdirSync(this.config.storageDir, { recursive: true });
751
+ const episodesPath = join(this.config.storageDir, 'episodes.json');
752
+ const approachesPath = join(this.config.storageDir, 'approaches.json');
753
+ const profilesPath = join(this.config.storageDir, 'optimization-profiles.json');
754
+ writeFileSync(episodesPath, JSON.stringify({
755
+ version: 1,
756
+ updatedAt: Date.now(),
757
+ episodes: Array.from(this.episodes.values()),
758
+ }, null, 2));
759
+ writeFileSync(approachesPath, JSON.stringify({
760
+ version: 1,
761
+ updatedAt: Date.now(),
762
+ approaches: Object.fromEntries(this.approaches),
763
+ }, null, 2));
764
+ writeFileSync(profilesPath, JSON.stringify({
765
+ version: 1,
766
+ updatedAt: Date.now(),
767
+ profiles: Array.from(this.optimizationProfiles.values()),
768
+ }, null, 2));
769
+ this.dirty = false;
770
+ }
771
+ catch (error) {
772
+ console.error('Failed to save episodic memory:', error);
773
+ }
774
+ }
775
+ // ==========================================================================
776
+ // STATS
777
+ // ==========================================================================
778
+ getStats() {
779
+ const categoryCounts = {};
780
+ const tagCounts = {};
781
+ let successCount = 0;
782
+ for (const episode of this.episodes.values()) {
783
+ categoryCounts[episode.category] = (categoryCounts[episode.category] || 0) + 1;
784
+ if (episode.success)
785
+ successCount++;
786
+ for (const tag of episode.tags) {
787
+ tagCounts[tag] = (tagCounts[tag] || 0) + 1;
788
+ }
789
+ }
790
+ const topTags = Object.entries(tagCounts)
791
+ .sort((a, b) => b[1] - a[1])
792
+ .slice(0, 10)
793
+ .map(([tag]) => tag);
794
+ const profileSummary = Array.from(this.optimizationProfiles.values())
795
+ .map(p => ({
796
+ category: p.category,
797
+ successRate: p.successCount + p.failureCount > 0
798
+ ? p.successCount / (p.successCount + p.failureCount)
799
+ : 0,
800
+ preferredMode: p.preferredMode,
801
+ }))
802
+ .sort((a, b) => b.successRate - a.successRate);
803
+ return {
804
+ totalEpisodes: this.episodes.size,
805
+ successfulEpisodes: successCount,
806
+ totalApproaches: this.approaches.size,
807
+ totalProfiles: this.optimizationProfiles.size,
808
+ categoryCounts,
809
+ topTags,
810
+ profileSummary,
811
+ };
812
+ }
813
+ }
814
+ // ============================================================================
815
+ // SINGLETON & FACTORY
816
+ // ============================================================================
817
+ let defaultInstance = null;
818
+ /**
819
+ * Get or create the default episodic memory instance
820
+ */
821
+ export function getEpisodicMemory(config) {
822
+ if (!defaultInstance) {
823
+ defaultInstance = new EpisodicMemory(config);
824
+ }
825
+ return defaultInstance;
826
+ }
827
+ /**
828
+ * Create a new episodic memory instance with custom config
829
+ */
830
+ export function createEpisodicMemory(config = {}) {
831
+ return new EpisodicMemory(config);
832
+ }
833
+ //# sourceMappingURL=episodicMemory.js.map