@noorm/marie-cli 0.1.17 → 0.1.25

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 (299) hide show
  1. package/README.md +7 -15
  2. package/SENTINEL.md +4 -7
  3. package/dist/cli-new/components/AgenticSpinner.js +28 -0
  4. package/dist/cli-new/components/AgenticSpinner.js.map +1 -0
  5. package/dist/cli-new/components/App.js +16 -63
  6. package/dist/cli-new/components/App.js.map +1 -1
  7. package/dist/cli-new/components/ApprovalDialog.js +3 -2
  8. package/dist/cli-new/components/ApprovalDialog.js.map +1 -1
  9. package/dist/cli-new/components/Banner.js +16 -5
  10. package/dist/cli-new/components/Banner.js.map +1 -1
  11. package/dist/cli-new/components/ChatArea.js +6 -7
  12. package/dist/cli-new/components/ChatArea.js.map +1 -1
  13. package/dist/cli-new/components/Header.js +14 -8
  14. package/dist/cli-new/components/Header.js.map +1 -1
  15. package/dist/cli-new/components/InputArea.js +98 -31
  16. package/dist/cli-new/components/InputArea.js.map +1 -1
  17. package/dist/cli-new/components/MessageBubble.js +28 -19
  18. package/dist/cli-new/components/MessageBubble.js.map +1 -1
  19. package/dist/cli-new/components/SessionSwitcher.js +6 -9
  20. package/dist/cli-new/components/SessionSwitcher.js.map +1 -1
  21. package/dist/cli-new/components/SetupWizard.js +80 -257
  22. package/dist/cli-new/components/SetupWizard.js.map +1 -1
  23. package/dist/cli-new/components/ToolCallDisplay.js +20 -5
  24. package/dist/cli-new/components/ToolCallDisplay.js.map +1 -1
  25. package/dist/cli-new/components/WizardSteps.js +22 -0
  26. package/dist/cli-new/components/WizardSteps.js.map +1 -0
  27. package/dist/cli-new/constants/SetupConstants.js +42 -0
  28. package/dist/cli-new/constants/SetupConstants.js.map +1 -0
  29. package/dist/cli-new/hooks/useGit.js +19 -62
  30. package/dist/cli-new/hooks/useGit.js.map +1 -1
  31. package/dist/cli-new/hooks/useMarie.js +26 -18
  32. package/dist/cli-new/hooks/useMarie.js.map +1 -1
  33. package/dist/cli-new/hooks/useSessions.js +1 -1
  34. package/dist/cli-new/hooks/useSessions.js.map +1 -1
  35. package/dist/cli-new/hooks/useSetupWizard.js +88 -0
  36. package/dist/cli-new/hooks/useSetupWizard.js.map +1 -0
  37. package/dist/cli-new/hooks/useUpdateCheck.js +4 -3
  38. package/dist/cli-new/hooks/useUpdateCheck.js.map +1 -1
  39. package/dist/cli-new/index.js +2 -4
  40. package/dist/cli-new/index.js.map +1 -1
  41. package/dist/cli-new/services/CommandService.js +104 -0
  42. package/dist/cli-new/services/CommandService.js.map +1 -0
  43. package/dist/cli-new/services/GitService.js +91 -0
  44. package/dist/cli-new/services/GitService.js.map +1 -0
  45. package/dist/cli-new/services/MarieService.js +77 -0
  46. package/dist/cli-new/services/MarieService.js.map +1 -0
  47. package/dist/cli-new/services/auth-server.js +128 -0
  48. package/dist/cli-new/services/auth-server.js.map +1 -0
  49. package/dist/cli-new/styles/theme.js +17 -17
  50. package/dist/cli-new/styles/theme.js.map +1 -1
  51. package/dist/cli-new/utils/version.js +24 -0
  52. package/dist/cli-new/utils/version.js.map +1 -0
  53. package/dist/monolith/adapters/CliMarieAdapter.js +19 -18
  54. package/dist/monolith/adapters/CliMarieAdapter.js.map +1 -1
  55. package/dist/monolith/cli/CliFileSystemPort.js +17 -3
  56. package/dist/monolith/cli/CliFileSystemPort.js.map +1 -1
  57. package/dist/monolith/cli/MarieToolDefinitionsCLI.js +44 -33
  58. package/dist/monolith/cli/MarieToolDefinitionsCLI.js.map +1 -1
  59. package/dist/monolith/cli/index.js +11 -20
  60. package/dist/monolith/cli/index.js.map +1 -1
  61. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js +15 -62
  62. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js.map +1 -1
  63. package/dist/monolith/cli/storage.js +154 -65
  64. package/dist/monolith/cli/storage.js.map +1 -1
  65. package/dist/monolith/domain/joy/RitualService.js +44 -46
  66. package/dist/monolith/domain/joy/RitualService.js.map +1 -1
  67. package/dist/monolith/domain/marie/MarieCortex.js +148 -0
  68. package/dist/monolith/domain/marie/MarieCortex.js.map +1 -0
  69. package/dist/monolith/domain/marie/PersonalityRenderer.js +97 -0
  70. package/dist/monolith/domain/marie/PersonalityRenderer.js.map +1 -0
  71. package/dist/monolith/infrastructure/Configuration.js +68 -0
  72. package/dist/monolith/infrastructure/Configuration.js.map +1 -0
  73. package/dist/monolith/infrastructure/CoreInfrastructure.js +204 -0
  74. package/dist/monolith/infrastructure/CoreInfrastructure.js.map +1 -0
  75. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js +3 -3
  76. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js.map +1 -1
  77. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js +51 -57
  78. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js.map +1 -1
  79. package/dist/monolith/infrastructure/ai/context/ContextManager.js +142 -98
  80. package/dist/monolith/infrastructure/ai/context/ContextManager.js.map +1 -1
  81. package/dist/monolith/infrastructure/ai/core/MarieEngine.js +104 -556
  82. package/dist/monolith/infrastructure/ai/core/MarieEngine.js.map +1 -1
  83. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js +1 -37
  84. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js.map +1 -1
  85. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js +30 -5
  86. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js.map +1 -1
  87. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js +176 -196
  88. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js.map +1 -1
  89. package/dist/monolith/infrastructure/ai/core/MariePulseService.js +41 -7
  90. package/dist/monolith/infrastructure/ai/core/MariePulseService.js.map +1 -1
  91. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js +303 -63
  92. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js.map +1 -1
  93. package/dist/monolith/infrastructure/ai/core/MarieSemaphore.js +47 -4
  94. package/dist/monolith/infrastructure/ai/core/MarieSemaphore.js.map +1 -1
  95. package/dist/monolith/infrastructure/ai/core/MarieSession.js +95 -15
  96. package/dist/monolith/infrastructure/ai/core/MarieSession.js.map +1 -1
  97. package/dist/monolith/infrastructure/ai/core/MarieStabilityMonitor.js +21 -0
  98. package/dist/monolith/infrastructure/ai/core/MarieStabilityMonitor.js.map +1 -1
  99. package/dist/monolith/infrastructure/ai/core/MarieToolMender.js +12 -0
  100. package/dist/monolith/infrastructure/ai/core/MarieToolMender.js.map +1 -1
  101. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js +339 -481
  102. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js.map +1 -1
  103. package/dist/monolith/infrastructure/ai/core/MarieVitality.js +238 -0
  104. package/dist/monolith/infrastructure/ai/core/MarieVitality.js.map +1 -0
  105. package/dist/monolith/infrastructure/ai/core/ReasoningBudget.js +23 -12
  106. package/dist/monolith/infrastructure/ai/core/ReasoningBudget.js.map +1 -1
  107. package/dist/monolith/infrastructure/ai/core/SessionLogService.js +9 -2
  108. package/dist/monolith/infrastructure/ai/core/SessionLogService.js.map +1 -1
  109. package/dist/monolith/infrastructure/ai/providers/AIProvider.js +402 -1
  110. package/dist/monolith/infrastructure/ai/providers/AIProvider.js.map +1 -1
  111. package/dist/monolith/infrastructure/ai/providers/DreamBeesProvider.js +114 -0
  112. package/dist/monolith/infrastructure/ai/providers/DreamBeesProvider.js.map +1 -0
  113. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js +426 -370
  114. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js.map +1 -1
  115. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js +235 -241
  116. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js.map +1 -1
  117. package/dist/monolith/infrastructure/ai/workerAi.js +185 -0
  118. package/dist/monolith/infrastructure/ai/workerAi.js.map +1 -0
  119. package/dist/monolith/infrastructure/config/ConfigService.js +216 -359
  120. package/dist/monolith/infrastructure/config/ConfigService.js.map +1 -1
  121. package/dist/monolith/infrastructure/joy/CognitiveRituals.js +8 -0
  122. package/dist/monolith/infrastructure/joy/CognitiveRituals.js.map +1 -0
  123. package/dist/monolith/infrastructure/joy/JoyTools.js +23 -43
  124. package/dist/monolith/infrastructure/joy/JoyTools.js.map +1 -1
  125. package/dist/monolith/infrastructure/persistence/MarieMindAutonomics.js +4 -0
  126. package/dist/monolith/infrastructure/persistence/MarieMindAutonomics.js.map +1 -0
  127. package/dist/monolith/infrastructure/persistence/MarieMindEngine.js +11 -0
  128. package/dist/monolith/infrastructure/persistence/MarieMindEngine.js.map +1 -0
  129. package/dist/monolith/infrastructure/persistence/NoormmeAutonomics.js +135 -0
  130. package/dist/monolith/infrastructure/persistence/NoormmeAutonomics.js.map +1 -0
  131. package/dist/monolith/infrastructure/persistence/NoormmeEngine.js +523 -0
  132. package/dist/monolith/infrastructure/persistence/NoormmeEngine.js.map +1 -0
  133. package/dist/monolith/infrastructure/persistence/NoormmeSchema.js +179 -0
  134. package/dist/monolith/infrastructure/persistence/NoormmeSchema.js.map +1 -0
  135. package/dist/monolith/infrastructure/persistence/NoormmeSeeder.js +94 -0
  136. package/dist/monolith/infrastructure/persistence/NoormmeSeeder.js.map +1 -0
  137. package/dist/monolith/infrastructure/persistence/NoormmeTools.js +371 -0
  138. package/dist/monolith/infrastructure/persistence/NoormmeTools.js.map +1 -0
  139. package/dist/monolith/infrastructure/services/MarieMemoryStore.js +133 -134
  140. package/dist/monolith/infrastructure/services/MarieMemoryStore.js.map +1 -1
  141. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js +6 -1578
  142. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js.map +1 -1
  143. package/dist/monolith/infrastructure/tools/PureStreamParser.js +68 -80
  144. package/dist/monolith/infrastructure/tools/PureStreamParser.js.map +1 -1
  145. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js +12 -11
  146. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js.map +1 -1
  147. package/dist/monolith/infrastructure/tools/SovereignTools.js +326 -0
  148. package/dist/monolith/infrastructure/tools/SovereignTools.js.map +1 -0
  149. package/dist/monolith/infrastructure/tools/ToolRegistry.js +45 -26
  150. package/dist/monolith/infrastructure/tools/ToolRegistry.js.map +1 -1
  151. package/dist/monolith/infrastructure/tools/definitions/AnalysisTools.js +232 -0
  152. package/dist/monolith/infrastructure/tools/definitions/AnalysisTools.js.map +1 -0
  153. package/dist/monolith/infrastructure/tools/definitions/AutomationTools.js +274 -0
  154. package/dist/monolith/infrastructure/tools/definitions/AutomationTools.js.map +1 -0
  155. package/dist/monolith/infrastructure/tools/definitions/ContextTools.js +71 -0
  156. package/dist/monolith/infrastructure/tools/definitions/ContextTools.js.map +1 -0
  157. package/dist/monolith/infrastructure/tools/definitions/CoreTools.js +37 -0
  158. package/dist/monolith/infrastructure/tools/definitions/CoreTools.js.map +1 -0
  159. package/dist/monolith/infrastructure/tools/definitions/DiagnosticTools.js +154 -0
  160. package/dist/monolith/infrastructure/tools/definitions/DiagnosticTools.js.map +1 -0
  161. package/dist/monolith/infrastructure/tools/definitions/NavigationTools.js +197 -0
  162. package/dist/monolith/infrastructure/tools/definitions/NavigationTools.js.map +1 -0
  163. package/dist/monolith/infrastructure/tools/definitions/PlanningTools.js +300 -0
  164. package/dist/monolith/infrastructure/tools/definitions/PlanningTools.js.map +1 -0
  165. package/dist/monolith/plumbing/Plumbing.js +238 -0
  166. package/dist/monolith/plumbing/Plumbing.js.map +1 -0
  167. package/dist/monolith/plumbing/PlumbingAnalysis.js +109 -0
  168. package/dist/monolith/plumbing/PlumbingAnalysis.js.map +1 -0
  169. package/dist/monolith/plumbing/PlumbingSystem.js +169 -0
  170. package/dist/monolith/plumbing/PlumbingSystem.js.map +1 -0
  171. package/dist/monolith/plumbing/analysis/ComplexityService.js +30 -34
  172. package/dist/monolith/plumbing/analysis/ComplexityService.js.map +1 -1
  173. package/dist/monolith/plumbing/analysis/DependencyService.js +55 -44
  174. package/dist/monolith/plumbing/analysis/DependencyService.js.map +1 -1
  175. package/dist/monolith/plumbing/analysis/DiscoveryService.js +40 -42
  176. package/dist/monolith/plumbing/analysis/DiscoveryService.js.map +1 -1
  177. package/dist/monolith/plumbing/analysis/JoyMapService.js +52 -56
  178. package/dist/monolith/plumbing/analysis/JoyMapService.js.map +1 -1
  179. package/dist/monolith/plumbing/analysis/LintService.js +118 -118
  180. package/dist/monolith/plumbing/analysis/LintService.js.map +1 -1
  181. package/dist/monolith/plumbing/analysis/MarieSentinelService.js +278 -269
  182. package/dist/monolith/plumbing/analysis/MarieSentinelService.js.map +1 -1
  183. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js +116 -114
  184. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js.map +1 -1
  185. package/dist/monolith/plumbing/analysis/SurgicalMender.js +57 -59
  186. package/dist/monolith/plumbing/analysis/SurgicalMender.js.map +1 -1
  187. package/dist/monolith/plumbing/analysis/TestService.js +89 -89
  188. package/dist/monolith/plumbing/analysis/TestService.js.map +1 -1
  189. package/dist/monolith/plumbing/filesystem/FileService.js +123 -195
  190. package/dist/monolith/plumbing/filesystem/FileService.js.map +1 -1
  191. package/dist/monolith/plumbing/filesystem/PathResolver.js +7 -8
  192. package/dist/monolith/plumbing/filesystem/PathResolver.js.map +1 -1
  193. package/dist/monolith/plumbing/git/GitService.js +4 -4
  194. package/dist/monolith/plumbing/git/GitService.js.map +1 -1
  195. package/dist/monolith/plumbing/lsp/SymbolService.js +5 -34
  196. package/dist/monolith/plumbing/lsp/SymbolService.js.map +1 -1
  197. package/dist/monolith/plumbing/terminal/ProcessRegistry.js +20 -22
  198. package/dist/monolith/plumbing/terminal/ProcessRegistry.js.map +1 -1
  199. package/dist/monolith/plumbing/terminal/TerminalService.js +127 -136
  200. package/dist/monolith/plumbing/terminal/TerminalService.js.map +1 -1
  201. package/dist/monolith/plumbing/utils/EnvironmentUtils.js +3 -23
  202. package/dist/monolith/plumbing/utils/EnvironmentUtils.js.map +1 -1
  203. package/dist/monolith/plumbing/utils/JsonUtils.js +252 -311
  204. package/dist/monolith/plumbing/utils/JsonUtils.js.map +1 -1
  205. package/dist/monolith/plumbing/utils/MutexUtils.js.map +1 -1
  206. package/dist/monolith/plumbing/utils/PlumbingCore.js +549 -0
  207. package/dist/monolith/plumbing/utils/PlumbingCore.js.map +1 -0
  208. package/dist/monolith/plumbing/utils/PrefixTree.js +61 -114
  209. package/dist/monolith/plumbing/utils/PrefixTree.js.map +1 -1
  210. package/dist/monolith/plumbing/utils/StreamTagDetector.js +89 -127
  211. package/dist/monolith/plumbing/utils/StreamTagDetector.js.map +1 -1
  212. package/dist/monolith/plumbing/utils/StringUtils.js +87 -89
  213. package/dist/monolith/plumbing/utils/StringUtils.js.map +1 -1
  214. package/dist/monolith/runtime/MarieRuntime.js +76 -417
  215. package/dist/monolith/runtime/MarieRuntime.js.map +1 -1
  216. package/dist/monolith/runtime/RuntimeAdapterBase.js +1 -1
  217. package/dist/monolith/runtime/RuntimeAdapterBase.js.map +1 -1
  218. package/dist/monolith/runtime/providerFactory.js +1 -7
  219. package/dist/monolith/runtime/providerFactory.js.map +1 -1
  220. package/dist/monolith/services/HealthService.js +29 -32
  221. package/dist/monolith/services/HealthService.js.map +1 -1
  222. package/dist/monolith/services/JoyAutomationService.js +58 -95
  223. package/dist/monolith/services/JoyAutomationService.js.map +1 -1
  224. package/dist/monolith/services/MarieAutomationService.js +59 -0
  225. package/dist/monolith/services/MarieAutomationService.js.map +1 -0
  226. package/dist/monolith/services/MarieGhostService.js +46 -161
  227. package/dist/monolith/services/MarieGhostService.js.map +1 -1
  228. package/dist/monolith/services/MarieServices.js +102 -0
  229. package/dist/monolith/services/MarieServices.js.map +1 -0
  230. package/dist/monolith/services/MarieTypes.js +2 -0
  231. package/dist/monolith/services/MarieTypes.js.map +1 -0
  232. package/dist/monolith/services/UpdateService.js +47 -49
  233. package/dist/monolith/services/UpdateService.js.map +1 -1
  234. package/dist/prompts.js +11 -5
  235. package/dist/prompts.js.map +1 -1
  236. package/dist/test_prefix_tree.js +9 -9
  237. package/dist/test_prefix_tree.js.map +1 -1
  238. package/package.json +18 -88
  239. package/run_test.js +5 -0
  240. package/.marie_visual_verify_1771225696548/progress_bar_check.txt +0 -1
  241. package/dist/extension.cjs +0 -635
  242. package/dist/extension.js +0 -473
  243. package/dist/extension.js.map +0 -1
  244. package/dist/monolith/adapters/VscodeMarieAdapter.js +0 -81
  245. package/dist/monolith/adapters/VscodeMarieAdapter.js.map +0 -1
  246. package/dist/monolith/domain/joy/JoyTools.js +0 -535
  247. package/dist/monolith/domain/joy/JoyTools.js.map +0 -1
  248. package/dist/monolith/infrastructure/ai/agents/MarieYOLO.js +0 -207
  249. package/dist/monolith/infrastructure/ai/agents/MarieYOLO.js.map +0 -1
  250. package/dist/monolith/infrastructure/ai/core/GhostPort.js +0 -2
  251. package/dist/monolith/infrastructure/ai/core/GhostPort.js.map +0 -1
  252. package/dist/monolith/infrastructure/ai/core/MarieYOLOTypes.js +0 -2
  253. package/dist/monolith/infrastructure/ai/core/MarieYOLOTypes.js.map +0 -1
  254. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js +0 -33
  255. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js.map +0 -1
  256. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js +0 -148
  257. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js.map +0 -1
  258. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js +0 -208
  259. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js.map +0 -1
  260. package/dist/monolith/plumbing/ui/DecorationService.js +0 -54
  261. package/dist/monolith/plumbing/ui/DecorationService.js.map +0 -1
  262. package/dist/monolith/services/JoyLogService.js +0 -48
  263. package/dist/monolith/services/JoyLogService.js.map +0 -1
  264. package/dist/monolith/services/JoyService.js +0 -209
  265. package/dist/monolith/services/JoyService.js.map +0 -1
  266. package/dist/monolith/services/MarieSCMProvider.js +0 -41
  267. package/dist/monolith/services/MarieSCMProvider.js.map +0 -1
  268. package/dist/test_agent_stream_control_plane.js +0 -170
  269. package/dist/test_agent_stream_control_plane.js.map +0 -1
  270. package/dist/test_strategy_integration.js +0 -114
  271. package/dist/test_strategy_integration.js.map +0 -1
  272. package/dist/test_streaming_fragility.js +0 -191
  273. package/dist/test_streaming_fragility.js.map +0 -1
  274. package/dist/webview-ui/App.js +0 -16
  275. package/dist/webview-ui/App.js.map +0 -1
  276. package/dist/webview-ui/Providers.js +0 -6
  277. package/dist/webview-ui/Providers.js.map +0 -1
  278. package/dist/webview-ui/components/ApprovalPanel.js +0 -8
  279. package/dist/webview-ui/components/ApprovalPanel.js.map +0 -1
  280. package/dist/webview-ui/components/ChatPanel.js +0 -19
  281. package/dist/webview-ui/components/ChatPanel.js.map +0 -1
  282. package/dist/webview-ui/components/Composer.js +0 -19
  283. package/dist/webview-ui/components/Composer.js.map +0 -1
  284. package/dist/webview-ui/components/HeaderBar.js +0 -5
  285. package/dist/webview-ui/components/HeaderBar.js.map +0 -1
  286. package/dist/webview-ui/components/SessionList.js +0 -14
  287. package/dist/webview-ui/components/SessionList.js.map +0 -1
  288. package/dist/webview-ui/context/WebviewStateContext.js +0 -146
  289. package/dist/webview-ui/context/WebviewStateContext.js.map +0 -1
  290. package/dist/webview-ui/main.css +0 -1
  291. package/dist/webview-ui/main.js +0 -108
  292. package/dist/webview-ui/main.js.map +0 -1
  293. package/dist/webview-ui/types.js +0 -2
  294. package/dist/webview-ui/types.js.map +0 -1
  295. package/dist/webview-ui/vscode.js +0 -4
  296. package/dist/webview-ui/vscode.js.map +0 -1
  297. package/lint_output.txt +0 -705
  298. package/lint_output_v2.txt +0 -711
  299. package/marie-coder-0.1.16.vsix +0 -0
@@ -1,86 +1,326 @@
1
+ import { getSanitizationMaxDepth, getSanitizationStringLimit, getSanitizationBreadthLimit, getSanitizationGlobalMaxSize, getSanitizationMaxEnumKeys, } from "../../config/ConfigService.js";
1
2
  /**
2
3
  * QUANTUM RESILIENCE: MarieSanitizer
3
4
  * Purges circular references, enforces depth and breadth limits, and truncates massive strings.
4
5
  * Ensures the telemetry stream never crashes the VS Code bridge.
5
6
  */
6
- export class MarieSanitizer {
7
- static MAX_DEPTH = 10;
8
- static STRING_LIMIT = 5000;
9
- static BREADTH_LIMIT = 100;
10
- static GLOBAL_MAX_SIZE = 512 * 1024; // 512KB total safety cap
11
- /**
12
- * Sanitizes an object for safe JSON serialization and bridge transport.
13
- * @param obj The object to sanitize.
14
- */
15
- static sanitize(obj) {
16
- const seen = new WeakSet();
17
- let totalSize = 0;
18
- const sanitizer = (val, depth) => {
19
- if (totalSize > this.GLOBAL_MAX_SIZE)
20
- return "[Global Size Limit Reached]";
21
- if (depth > this.MAX_DEPTH)
22
- return "[Max Depth Reached]";
23
- if (val === null || val === undefined)
24
- return val;
25
- const type = typeof val;
26
- if (type === "string") {
27
- const effectiveLength = Math.min(val.length, this.STRING_LIMIT);
28
- totalSize += effectiveLength;
29
- if (val.length > this.STRING_LIMIT) {
30
- return val.substring(0, this.STRING_LIMIT) + "... [Truncated]";
31
- }
32
- return val;
33
- }
34
- if (type === "number") {
35
- totalSize += 8;
36
- return val;
7
+ const getMAX_DEPTH = () => getSanitizationMaxDepth();
8
+ const getSTRING_LIMIT = () => getSanitizationStringLimit();
9
+ const getBREADTH_LIMIT = () => getSanitizationBreadthLimit();
10
+ const getGLOBAL_MAX_SIZE = () => getSanitizationGlobalMaxSize();
11
+ const getMAX_ENUM_KEYS = () => getSanitizationMaxEnumKeys();
12
+ /**
13
+ * Safely gets a limited number of keys from an object to prevent 'Too many properties to enumerate'.
14
+ * Uses iterative for...in to avoid the overhead/crash of Object.keys() on massive objects/proxies.
15
+ */
16
+ export function safeGetKeys(obj, limit) {
17
+ const keys = [];
18
+ if (obj === null || obj === undefined || typeof obj !== "object")
19
+ return keys;
20
+ try {
21
+ let count = 0;
22
+ for (const key in obj) {
23
+ // PHASE 24: Extra safety for hostile proxies
24
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
25
+ keys.push(key);
26
+ count++;
37
27
  }
38
- if (type === "boolean") {
39
- totalSize += 4;
40
- return val;
28
+ if (count >= limit)
29
+ break;
30
+ }
31
+ }
32
+ catch (e) {
33
+ // Return whatever we managed to get before the crash
34
+ }
35
+ return keys;
36
+ }
37
+ /**
38
+ * Safely gets entries from an object with a limit.
39
+ */
40
+ export function safeGetEntries(obj, limit) {
41
+ const entries = [];
42
+ const keys = safeGetKeys(obj, limit);
43
+ for (const key of keys) {
44
+ try {
45
+ entries.push([key, obj[key]]);
46
+ }
47
+ catch {
48
+ entries.push([key, "[Unreadable Property]"]);
49
+ }
50
+ }
51
+ return entries;
52
+ }
53
+ /**
54
+ * Safely gets values from an object with a limit.
55
+ */
56
+ export function safeGetValues(obj, limit) {
57
+ const values = [];
58
+ const keys = safeGetKeys(obj, limit);
59
+ for (const key of keys) {
60
+ try {
61
+ values.push(obj[key]);
62
+ }
63
+ catch {
64
+ values.push("[Unreadable Property]");
65
+ }
66
+ }
67
+ return values;
68
+ }
69
+ /**
70
+ * Sanitizes an object for safe JSON serialization and bridge transport.
71
+ * @param obj The object to sanitize.
72
+ */
73
+ export function sanitize(obj) {
74
+ const seen = new WeakSet();
75
+ let totalSize = 0;
76
+ const sanitizer = (val, depth) => {
77
+ if (totalSize > getGLOBAL_MAX_SIZE())
78
+ return "[Global Size Limit Reached]";
79
+ if (depth > getMAX_DEPTH())
80
+ return "[Max Depth Reached]";
81
+ if (val === null || val === undefined)
82
+ return val;
83
+ const type = typeof val;
84
+ if (type === "string") {
85
+ // PHASE 14: Secret Scanning & Redaction
86
+ const sanitizedString = scanAndRedact(val);
87
+ const effectiveLength = Math.min(sanitizedString.length, getSTRING_LIMIT());
88
+ totalSize += effectiveLength;
89
+ if (sanitizedString.length > getSTRING_LIMIT()) {
90
+ return (sanitizedString.substring(0, getSTRING_LIMIT()) + "... [Truncated]");
41
91
  }
42
- if (type === "function")
43
- return "[Function]";
44
- if (type === "symbol")
45
- return "[Symbol]";
46
- if (type === "object") {
92
+ return sanitizedString;
93
+ }
94
+ if (type === "number") {
95
+ totalSize += 8;
96
+ return val;
97
+ }
98
+ if (type === "boolean") {
99
+ totalSize += 4;
100
+ return val;
101
+ }
102
+ if (type === "function")
103
+ return "[Function]";
104
+ if (type === "symbol")
105
+ return "[Symbol]";
106
+ if (type === "object") {
107
+ try {
47
108
  if (seen.has(val))
48
109
  return "[Circular Reference]";
49
110
  seen.add(val);
50
- if (Array.isArray(val)) {
111
+ }
112
+ catch (e) {
113
+ return "[Un-trackable Object]";
114
+ }
115
+ let isArr = false;
116
+ try {
117
+ isArr = Array.isArray(val);
118
+ }
119
+ catch (e) {
120
+ return "[Un-evaluable Array/Proxy]";
121
+ }
122
+ if (isArr) {
123
+ try {
124
+ // Use safe slice for arrays too
125
+ const arrayLimit = getBREADTH_LIMIT();
51
126
  const arr = val
52
- .slice(0, this.BREADTH_LIMIT)
127
+ .slice(0, arrayLimit)
53
128
  .map((item) => sanitizer(item, depth + 1));
54
- if (val.length > this.BREADTH_LIMIT) {
55
- arr.push(`... [${val.length - this.BREADTH_LIMIT} items truncated]`);
129
+ if (val.length > arrayLimit) {
130
+ arr.push(`... [${val.length - arrayLimit} items truncated]`);
56
131
  }
57
132
  return arr;
58
133
  }
59
- const sanitized = {};
60
- const keys = Object.keys(val);
61
- const limitedKeys = keys.slice(0, this.BREADTH_LIMIT);
62
- for (const key of limitedKeys) {
63
- if (key.startsWith("_") ||
64
- key === "extensionContext" ||
65
- key === "provider")
134
+ catch (e) {
135
+ return "[Un-iterable Array/Proxy]";
136
+ }
137
+ }
138
+ const sanitizedObj = {};
139
+ // QUANTUM RESILIENCE: Use safeGetKeys with the enum limit to avoid V8 enumeration explosion
140
+ const keys = safeGetKeys(val, getMAX_ENUM_KEYS() + 1);
141
+ if (keys.length > getMAX_ENUM_KEYS()) {
142
+ sanitizedObj["_enumeration_halted"] =
143
+ `Object has too many properties (truncated at ${getMAX_ENUM_KEYS()})`;
144
+ }
145
+ const limitedKeys = keys.slice(0, getBREADTH_LIMIT());
146
+ for (const key of limitedKeys) {
147
+ if (key.startsWith("_") ||
148
+ key === "extensionContext" ||
149
+ key === "provider" ||
150
+ key === "marie" ||
151
+ key === "runtime")
152
+ continue;
153
+ try {
154
+ // Extra safety for massive property access
155
+ const propertyVal = val[key];
156
+ if (typeof propertyVal === "function")
66
157
  continue;
67
- try {
68
- totalSize += key.length;
69
- sanitized[key] = sanitizer(val[key], depth + 1);
70
- }
71
- catch {
72
- sanitized[key] = "[Unreadable]";
73
- }
158
+ totalSize += key.length;
159
+ sanitizedObj[key] = sanitizer(propertyVal, depth + 1);
74
160
  }
75
- if (keys.length > this.BREADTH_LIMIT) {
76
- sanitized["_truncated"] =
77
- `${keys.length - this.BREADTH_LIMIT} properties truncated`;
161
+ catch {
162
+ sanitizedObj[key] = "[Unreadable Property]";
78
163
  }
79
- return sanitized;
80
164
  }
81
- return String(val);
82
- };
165
+ if (keys.length > getBREADTH_LIMIT() &&
166
+ !sanitizedObj["_enumeration_halted"]) {
167
+ sanitizedObj["_truncated"] =
168
+ `${keys.length - getBREADTH_LIMIT()} properties truncated`;
169
+ }
170
+ return sanitizedObj;
171
+ }
172
+ return String(val);
173
+ };
174
+ try {
83
175
  return sanitizer(obj, 0);
84
176
  }
177
+ catch (e) {
178
+ return `[Sanitization Failed: ${String(e)}]`;
179
+ }
180
+ }
181
+ /**
182
+ * Safely stringifies an object by sanitizing it first.
183
+ */
184
+ export function safeStringify(obj, space) {
185
+ try {
186
+ return JSON.stringify(sanitize(obj), null, space);
187
+ }
188
+ catch (e) {
189
+ return `[Stringify Failed: ${String(e)}]`;
190
+ }
191
+ }
192
+ /**
193
+ * Safely spreads an object into another by sanitizing it first.
194
+ * Prevents 'Too many properties to enumerate' during spread operations.
195
+ */
196
+ export function safeSpread(obj) {
197
+ const sanitized = sanitize(obj);
198
+ return typeof sanitized === "object" && sanitized !== null ? sanitized : {};
199
+ }
200
+ /**
201
+ * PHASE 14: Sovereign Redaction Logic
202
+ * Redacts sensitive patterns like API keys, Bearer tokens, etc.
203
+ */
204
+ function scanAndRedact(text) {
205
+ const patterns = [
206
+ /(api[\s_-]?key\s+(?:is\s+)?[:=\s]?\s*['"]?)[a-zA-Z0-9_\-]{20,}/gi, // API keys
207
+ /(auth[\s_-]?token\s+(?:is\s+)?[:=\s]?\s*['"]?)[a-zA-Z0-9_\-\.]{20,}/gi, // Auth tokens
208
+ /(Bearer\s+)[a-zA-Z0-9_\-\.]{20,}/gi, // Bearer tokens
209
+ /(password\s+(?:is\s+)?[:=\s]?\s*['"]?)[^'"]{4,}/gi, // Passwords (basic)
210
+ ];
211
+ let redacted = text;
212
+ for (const pattern of patterns) {
213
+ redacted = redacted.replace(pattern, "$1[REDACTED]");
214
+ }
215
+ return redacted;
216
+ }
217
+ /**
218
+ * PHASE 19: Skill Mutation Sanitization
219
+ * Strips known prompt injection sequences from evolved tool descriptions.
220
+ */
221
+ export function sanitizeSkillDescription(desc) {
222
+ if (!desc)
223
+ return desc;
224
+ const injectionPatterns = [
225
+ /ignore\s+previous\s+instructions/gi,
226
+ /instead\s+of\s+the\s+original\s+plan/gi,
227
+ /you\s+must\s+now\s+perform/gi,
228
+ /system\s+override/gi,
229
+ /elevate\s+privileges/gi,
230
+ ];
231
+ let sanitized = desc;
232
+ for (const pattern of injectionPatterns) {
233
+ sanitized = sanitized.replace(pattern, "[SEC_BLOCKED]");
234
+ }
235
+ // Enforce string limit for descriptions
236
+ if (sanitized.length > getSTRING_LIMIT()) {
237
+ sanitized = sanitized.substring(0, getSTRING_LIMIT()) + "... [Truncated]";
238
+ }
239
+ return sanitized;
240
+ }
241
+ /**
242
+ * PHASE 23: Deep Argument Scanning
243
+ * Scans tool arguments for adversarial patterns (shell injection, prompt injection).
244
+ */
245
+ export function scanToolArguments(name, input) {
246
+ const alerts = [];
247
+ // Use safeStringify to avoid enumeration errors
248
+ const inputStr = safeStringify(input);
249
+ // 1. Shell Injection Check (for run_command)
250
+ if (name === "run_command" || name === "run_shell") {
251
+ const cmd = (input && (input.CommandLine || input.command)) || "";
252
+ const shellInjectionPatterns = /[;&|`$\(\)]/g;
253
+ if (shellInjectionPatterns.test(cmd)) {
254
+ alerts.push(`Potential Shell Injection detected in command: "${cmd}"`);
255
+ }
256
+ const dangerousCmds = [
257
+ "sudo ",
258
+ "rm -rf ",
259
+ "kill -9 ",
260
+ "> /dev/",
261
+ "chmod 777",
262
+ ];
263
+ for (const dangerous of dangerousCmds) {
264
+ if (cmd.includes(dangerous)) {
265
+ alerts.push(`High-Entropy Command detected: "${dangerous.trim()}"`);
266
+ }
267
+ }
268
+ }
269
+ // 2. Prompt Injection Check (Global string scan)
270
+ const injectionPatterns = [
271
+ /ignore\s+previous\s+instructions/gi,
272
+ /instead\s+of\s+the\s+original\s+plan/gi,
273
+ /system\s+override/gi,
274
+ /elevate\s+privileges/gi,
275
+ /you\s+must\s+now\s+perform/gi,
276
+ ];
277
+ const scanString = (val) => {
278
+ if (typeof val === "string") {
279
+ for (const pattern of injectionPatterns) {
280
+ if (pattern.test(val)) {
281
+ alerts.push(`Cognitive Drift: Prompt injection sequence detected in argument.`);
282
+ break;
283
+ }
284
+ }
285
+ }
286
+ else if (typeof val === "object" && val !== null) {
287
+ try {
288
+ // Limited scanning for objects to avoid enumeration errors
289
+ const keys = safeGetKeys(val, 50);
290
+ for (const key of keys) {
291
+ scanString(val[key]);
292
+ }
293
+ }
294
+ catch (e) {
295
+ // Ignore enumeration errors during scanning
296
+ }
297
+ }
298
+ };
299
+ scanString(input);
300
+ return Array.from(new Set(alerts));
301
+ }
302
+ /**
303
+ * Deeply investigations objects for hostile proxy traps.
304
+ * Returns true if the object appears to be a hostile proxy.
305
+ */
306
+ export function isHostileProxy(obj) {
307
+ if (typeof obj !== "object" || obj === null)
308
+ return false;
309
+ // Attempt to check common proxy characteristics
310
+ try {
311
+ const start = performance.now();
312
+ // Hostile proxies might have slow getters
313
+ const keys = safeGetKeys(obj, 1);
314
+ if (keys.length > 0) {
315
+ const val = obj[keys[0]];
316
+ }
317
+ const end = performance.now();
318
+ if (end - start > 10)
319
+ return true; // Suspiciously slow property access
320
+ }
321
+ catch {
322
+ return true; // Throws on access
323
+ }
324
+ return false;
85
325
  }
86
326
  //# sourceMappingURL=MarieSanitizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarieSanitizer.js","sourceRoot":"","sources":["../../../../../src/monolith/infrastructure/ai/core/MarieSanitizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MarieSanitizer.js","sourceRoot":"","sources":["../../../../../src/monolith/infrastructure/ai/core/MarieSanitizer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
+ import { ConfigService } from "../../config/ConfigService.js";
2
+ import { NoormmeEngine } from "../../persistence/NoormmeEngine.js";
1
3
  /**
2
- * Simple async semaphore to limit global concurrency.
4
+ * Clean Fix Pattern: MarieSemaphore
5
+ * Async semaphore to limit global concurrency with timeout and abort support.
3
6
  */
4
7
  export class MarieSemaphore {
5
8
  maxConcurrency;
@@ -8,15 +11,55 @@ export class MarieSemaphore {
8
11
  constructor(maxConcurrency) {
9
12
  this.maxConcurrency = maxConcurrency;
10
13
  }
11
- async acquire() {
14
+ async acquire(signal) {
15
+ if (signal?.aborted)
16
+ throw new Error("Semaphore acquisition aborted.");
12
17
  if (this.activeCount < this.maxConcurrency) {
13
18
  this.activeCount++;
14
19
  return;
15
20
  }
16
- return new Promise((resolve) => {
17
- this.queue.push(resolve);
21
+ const startWait = Date.now();
22
+ const timeout = ConfigService.getSemaphoreTimeoutMs();
23
+ return new Promise((resolve, reject) => {
24
+ let timeoutId;
25
+ const cleanup = () => {
26
+ clearTimeout(timeoutId);
27
+ signal?.removeEventListener("abort", onAbort);
28
+ const idx = this.queue.indexOf(wrappedResolve);
29
+ if (idx > -1)
30
+ this.queue.splice(idx, 1);
31
+ };
32
+ const wrappedResolve = () => {
33
+ const waitDuration = Date.now() - startWait;
34
+ this.reportTelemetry(waitDuration, this.queue.length);
35
+ cleanup();
36
+ resolve();
37
+ };
38
+ const onAbort = () => {
39
+ cleanup();
40
+ reject(new Error("Semaphore acquisition aborted by signal."));
41
+ };
42
+ timeoutId = setTimeout(() => {
43
+ cleanup();
44
+ reject(new Error(`Extreme Stability: Semaphore Acquisition Timeout after ${timeout}ms`));
45
+ }, timeout);
46
+ signal?.addEventListener("abort", onAbort);
47
+ this.queue.push(wrappedResolve);
18
48
  });
19
49
  }
50
+ async reportTelemetry(waitMs, queueSize) {
51
+ if (waitMs < 100)
52
+ return; // Only report significant contention
53
+ try {
54
+ const db = await NoormmeEngine.getInstance();
55
+ await db.agent.cortex.metrics.recordMetric("semaphore_contention", waitMs, {
56
+ metadata: { queueSize, waitMs }
57
+ });
58
+ }
59
+ catch (e) {
60
+ // Background telemetry failure should not crash the turn
61
+ }
62
+ }
20
63
  release() {
21
64
  this.activeCount--;
22
65
  const next = this.queue.shift();
@@ -1 +1 @@
1
- {"version":3,"file":"MarieSemaphore.js","sourceRoot":"","sources":["../../../../../src/monolith/infrastructure/ai/core/MarieSemaphore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,cAAc;IAIL;IAHZ,WAAW,GAAG,CAAC,CAAC;IAChB,KAAK,GAAmB,EAAE,CAAC;IAEnC,YAAoB,cAAsB;QAAtB,mBAAc,GAAd,cAAc,CAAQ;IAAG,CAAC;IAEvC,KAAK,CAAC,OAAO;QAClB,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"MarieSemaphore.js","sourceRoot":"","sources":["../../../../../src/monolith/infrastructure/ai/core/MarieSemaphore.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { MarieSanitizer } from "./MarieSanitizer.js";
1
2
  import { ConfigService } from "../../config/ConfigService.js";
2
3
  import { ContextManager } from "../context/ContextManager.js";
3
4
  import { SYSTEM_CONTINUATION_PROMPT, SYSTEM_PROMPT, } from "../../../../prompts.js";
@@ -22,10 +23,88 @@ export class MarieSession {
22
23
  this.providerFactory = providerFactory;
23
24
  this.promptProfile = promptProfile;
24
25
  }
25
- resolveSystemPrompt() {
26
- return this.promptProfile === "continuation"
26
+ async resolveSystemPrompt() {
27
+ const basePrompt = this.promptProfile === "continuation"
27
28
  ? SYSTEM_CONTINUATION_PROMPT
28
29
  : SYSTEM_PROMPT;
30
+ try {
31
+ const { NoormmeEngine } = await import("../../persistence/NoormmeEngine.js");
32
+ const db = await NoormmeEngine.getInstance();
33
+ // Query for the active or verifying persona
34
+ const result = await db.execute(`
35
+ SELECT * FROM agent_personas
36
+ WHERE status = 'active'
37
+ OR json_extract(metadata, '$.evolution_status') = 'verifying'
38
+ ORDER BY CASE WHEN json_extract(metadata, '$.evolution_status') = 'verifying' THEN 0 ELSE 1 END, updated_at DESC
39
+ LIMIT 1
40
+ `);
41
+ let activePersona = result.length > 0 ? result[0] : null;
42
+ if (!activePersona) {
43
+ activePersona = await db.agent.cortex.personas.getPersona("Marie-Base");
44
+ }
45
+ if (activePersona?.role) {
46
+ const isVerifying = activePersona.metadata && (typeof activePersona.metadata === 'string'
47
+ ? JSON.parse(activePersona.metadata).evolution_status === 'verifying'
48
+ : activePersona.metadata.evolution_status === 'verifying');
49
+ let prompt = `[${isVerifying ? 'VERIFYING' : 'EVOLVED'} PERSONA: ${activePersona.name}]\n${activePersona.role}\n\n${basePrompt}`;
50
+ // PHASE 6: Systemic Lesson Injection
51
+ try {
52
+ const lessons = await db.agent.cortex.reasoner.synthesizeLessons();
53
+ const lessonHeadings = Object.keys(lessons);
54
+ if (lessonHeadings.length > 0) {
55
+ const lessonSummary = lessonHeadings
56
+ .slice(0, 3)
57
+ .map(topic => `* ${topic.toUpperCase()}: ${lessons[topic][0]}`)
58
+ .join("\n");
59
+ prompt = `[SYSTEMIC BEST PRACTICES]\n${lessonSummary}\n\n${prompt}`;
60
+ }
61
+ }
62
+ catch (e) {
63
+ console.warn("[MarieSession] Failed to load systemic lessons", e);
64
+ }
65
+ return prompt;
66
+ }
67
+ }
68
+ catch (e) {
69
+ console.warn("[MarieSession] Failed to load persona or lessons", e);
70
+ }
71
+ return basePrompt;
72
+ }
73
+ async getEvolvedTools() {
74
+ const baseTools = this.toolRegistry.getTools();
75
+ // PHASE 19: Skill Mutation Gate
76
+ if (!ConfigService.isSkillMutationEnabled()) {
77
+ return baseTools;
78
+ }
79
+ try {
80
+ const { NoormmeEngine } = await import("../../persistence/NoormmeEngine.js");
81
+ const db = await NoormmeEngine.getInstance();
82
+ const capabilities = await db.agent.cortex.capabilities.getCapabilities();
83
+ // Create a map of evolved descriptions (Verified > Experimental)
84
+ const evolvedMap = new Map();
85
+ for (const cap of capabilities) {
86
+ if (cap.status === 'verified' || !evolvedMap.has(cap.name)) {
87
+ if (cap.description)
88
+ evolvedMap.set(cap.name, cap.description);
89
+ }
90
+ }
91
+ return baseTools.map(tool => {
92
+ const evolvedDesc = evolvedMap.get(tool.name);
93
+ if (evolvedDesc) {
94
+ // PHASE 19: Mutation Sanitization
95
+ const cleanDesc = MarieSanitizer.sanitizeSkillDescription(evolvedDesc);
96
+ if (process.env.MARIE_DEBUG) {
97
+ console.log(`[MarieSession] Injecting evolved description for tool: ${tool.name}`);
98
+ }
99
+ return { ...tool, description: cleanDesc };
100
+ }
101
+ return tool;
102
+ });
103
+ }
104
+ catch (e) {
105
+ console.warn("[MarieSession] Failed to fetch evolved tools", e);
106
+ return baseTools;
107
+ }
29
108
  }
30
109
  async *executeLoop(messages, signal, state) {
31
110
  // PHASE 6: Generator Disposal Grace - Snapshot messages before modification
@@ -45,8 +124,8 @@ export class MarieSession {
45
124
  model: ConfigService.getModel(),
46
125
  max_tokens: 8192,
47
126
  messages: managedMessages,
48
- system: this.resolveSystemPrompt(),
49
- tools: this.toolRegistry.getTools(),
127
+ system: await this.resolveSystemPrompt(),
128
+ tools: await this.getEvolvedTools(),
50
129
  };
51
130
  const eventQueue = [];
52
131
  let resolver = null;
@@ -75,19 +154,20 @@ export class MarieSession {
75
154
  attempts++;
76
155
  const isRetryable = e.status === 429 ||
77
156
  e.status >= 500 ||
78
- e.message?.includes("rate limit");
157
+ e.message?.includes("rate limit") ||
158
+ e.message?.includes("timeout") ||
159
+ e.message?.includes("ECONNRESET");
79
160
  if (isRetryable && attempts < maxAttempts && this.providerFactory) {
80
- const currentType = ConfigService.getAiProvider();
81
- const failoverType = currentType === "anthropic"
82
- ? "openrouter"
83
- : currentType === "openrouter"
84
- ? "cerebras"
85
- : "anthropic";
86
- console.warn(`[SpectralFailover] Attempt ${attempts} failed for ${currentType}. Switching to ${failoverType}.`);
161
+ // Re-evaluating failover logic inside the catch block
162
+ const currentProviderName = this.provider.constructor.name.replace("Provider", "").toLowerCase();
163
+ const failoverPriority = ConfigService.getFailoverPriority();
164
+ const nextIndex = (failoverPriority.indexOf(currentProviderName) + 1) % failoverPriority.length;
165
+ const failoverType = failoverPriority[nextIndex];
166
+ console.warn(`[SpectralFailover] Attempt ${attempts} failed for ${currentProviderName}. Failover to ${failoverType}...`);
87
167
  this.tracker?.emitEvent({
88
168
  type: "reasoning",
89
169
  runId: this.tracker.getRun().runId,
90
- text: `🔄 SPECTRAL FAILOVER: ${currentType} is struggling. Switching to ${failoverType} mid-turn...`,
170
+ text: `🔄 SPECTRAL FAILOVER: ${currentProviderName} is struggling. Switching to ${failoverType} (Attempt ${attempts}/${maxAttempts})...`,
91
171
  elapsedMs: this.tracker.elapsedMs(),
92
172
  });
93
173
  this.provider = this.providerFactory(failoverType);
@@ -180,8 +260,8 @@ export class MarieSession {
180
260
  model: ConfigService.getModel(),
181
261
  max_tokens: 8192,
182
262
  messages: await ContextManager.manage(this.messages, this.provider, state),
183
- system: this.resolveSystemPrompt(),
184
- tools: this.toolRegistry.getTools(),
263
+ system: await this.resolveSystemPrompt(),
264
+ tools: await this.getEvolvedTools(),
185
265
  };
186
266
  const response = await this.provider.createMessageStream(params, () => { });
187
267
  let finalContent = response.content;