@stackmemoryai/stackmemory 0.5.57 → 0.5.59

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 (611) hide show
  1. package/bin/codex-smd +6 -0
  2. package/dist/cli/codex-sm-danger.js +21 -0
  3. package/dist/cli/codex-sm-danger.js.map +7 -0
  4. package/dist/cli/commands/handoff.js +33 -3
  5. package/dist/cli/commands/handoff.js.map +2 -2
  6. package/dist/cli/commands/search.js +20 -3
  7. package/dist/cli/commands/search.js.map +2 -2
  8. package/dist/core/database/sqlite-adapter.js +13 -3
  9. package/dist/core/database/sqlite-adapter.js.map +2 -2
  10. package/dist/core/errors/error-utils.js +208 -0
  11. package/dist/core/errors/error-utils.js.map +7 -0
  12. package/dist/core/errors/index.js +13 -4
  13. package/dist/core/errors/index.js.map +2 -2
  14. package/dist/core/merge/unified-merge-resolver.js +303 -0
  15. package/dist/core/merge/unified-merge-resolver.js.map +7 -0
  16. package/dist/core/monitoring/logger.js +61 -9
  17. package/dist/core/monitoring/logger.js.map +2 -2
  18. package/dist/core/security/index.js +35 -0
  19. package/dist/core/security/index.js.map +7 -0
  20. package/dist/core/security/input-sanitizer.js +321 -0
  21. package/dist/core/security/input-sanitizer.js.map +7 -0
  22. package/dist/core/session/enhanced-handoff.js +136 -2
  23. package/dist/core/session/enhanced-handoff.js.map +3 -3
  24. package/dist/integrations/linear/client.js +5 -1
  25. package/dist/integrations/linear/client.js.map +2 -2
  26. package/dist/integrations/mcp/remote-server.js +27 -36
  27. package/dist/integrations/mcp/remote-server.js.map +2 -2
  28. package/dist/integrations/mcp/server.js +44 -29
  29. package/dist/integrations/mcp/server.js.map +3 -3
  30. package/dist/scripts/benchmark-performance.js +48 -0
  31. package/dist/scripts/benchmark-performance.js.map +7 -0
  32. package/dist/scripts/check-redis.js +42 -0
  33. package/dist/scripts/check-redis.js.map +7 -0
  34. package/dist/scripts/initialize.js +116 -0
  35. package/dist/scripts/initialize.js.map +7 -0
  36. package/dist/scripts/list-linear-tasks.js +124 -0
  37. package/dist/scripts/list-linear-tasks.js.map +7 -0
  38. package/dist/scripts/measure-handoff-impact.js +340 -0
  39. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  40. package/dist/scripts/query-chromadb.js +160 -0
  41. package/dist/scripts/query-chromadb.js.map +7 -0
  42. package/dist/scripts/show-linear-summary.js +119 -0
  43. package/dist/scripts/show-linear-summary.js.map +7 -0
  44. package/dist/scripts/simple-swarm-demo.js +90 -0
  45. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  46. package/dist/scripts/status.js +155 -0
  47. package/dist/scripts/status.js.map +7 -0
  48. package/dist/scripts/test-chromadb-sync.js +192 -0
  49. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  50. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  51. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  52. package/dist/scripts/test-ralph-iterations.js +121 -0
  53. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  54. package/dist/scripts/test-redis-storage.js +389 -0
  55. package/dist/scripts/test-redis-storage.js.map +7 -0
  56. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  57. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  58. package/dist/scripts/test-swarm-fixes.js +125 -0
  59. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  60. package/dist/scripts/test-swarm-tui.js +23 -0
  61. package/dist/scripts/test-swarm-tui.js.map +7 -0
  62. package/dist/scripts/test-tui-shortcuts.js +52 -0
  63. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  64. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  65. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  66. package/dist/src/agents/core/agent-task-manager.js +527 -0
  67. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  68. package/dist/src/agents/verifiers/base-verifier.js +133 -0
  69. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  70. package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
  71. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  72. package/dist/src/agents/verifiers/llm-judge.js +252 -0
  73. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  74. package/dist/src/cli/auto-detect.js +321 -0
  75. package/dist/src/cli/auto-detect.js.map +7 -0
  76. package/dist/src/cli/claude-sm-danger.js +21 -0
  77. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  78. package/dist/src/cli/claude-sm.js +1156 -0
  79. package/dist/src/cli/claude-sm.js.map +7 -0
  80. package/dist/src/cli/codex-sm-danger.js +21 -0
  81. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  82. package/dist/src/cli/codex-sm.js +349 -0
  83. package/dist/src/cli/codex-sm.js.map +7 -0
  84. package/dist/src/cli/commands/api.js +232 -0
  85. package/dist/src/cli/commands/api.js.map +7 -0
  86. package/dist/src/cli/commands/auto-background.js +180 -0
  87. package/dist/src/cli/commands/auto-background.js.map +7 -0
  88. package/dist/src/cli/commands/cleanup-processes.js +68 -0
  89. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  90. package/dist/src/cli/commands/clear.js +202 -0
  91. package/dist/src/cli/commands/clear.js.map +7 -0
  92. package/dist/src/cli/commands/config.js +445 -0
  93. package/dist/src/cli/commands/config.js.map +7 -0
  94. package/dist/src/cli/commands/context-rehydrate.js +751 -0
  95. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  96. package/dist/src/cli/commands/context.js +343 -0
  97. package/dist/src/cli/commands/context.js.map +7 -0
  98. package/dist/src/cli/commands/daemon.js +392 -0
  99. package/dist/src/cli/commands/daemon.js.map +7 -0
  100. package/dist/src/cli/commands/dashboard.js +210 -0
  101. package/dist/src/cli/commands/dashboard.js.map +7 -0
  102. package/dist/src/cli/commands/db.js +147 -0
  103. package/dist/src/cli/commands/db.js.map +7 -0
  104. package/dist/src/cli/commands/decision.js +266 -0
  105. package/dist/src/cli/commands/decision.js.map +7 -0
  106. package/dist/src/cli/commands/discovery.js +279 -0
  107. package/dist/src/cli/commands/discovery.js.map +7 -0
  108. package/dist/src/cli/commands/handoff.js +624 -0
  109. package/dist/src/cli/commands/handoff.js.map +7 -0
  110. package/dist/src/cli/commands/hooks.js +298 -0
  111. package/dist/src/cli/commands/hooks.js.map +7 -0
  112. package/dist/src/cli/commands/linear.js +529 -0
  113. package/dist/src/cli/commands/linear.js.map +7 -0
  114. package/dist/src/cli/commands/log.js +169 -0
  115. package/dist/src/cli/commands/log.js.map +7 -0
  116. package/dist/src/cli/commands/login.js +172 -0
  117. package/dist/src/cli/commands/login.js.map +7 -0
  118. package/dist/src/cli/commands/migrate.js +240 -0
  119. package/dist/src/cli/commands/migrate.js.map +7 -0
  120. package/dist/src/cli/commands/model.js +533 -0
  121. package/dist/src/cli/commands/model.js.map +7 -0
  122. package/dist/src/cli/commands/onboard.js +536 -0
  123. package/dist/src/cli/commands/onboard.js.map +7 -0
  124. package/dist/src/cli/commands/projects.js +199 -0
  125. package/dist/src/cli/commands/projects.js.map +7 -0
  126. package/dist/src/cli/commands/ralph.js +909 -0
  127. package/dist/src/cli/commands/ralph.js.map +7 -0
  128. package/dist/src/cli/commands/retrieval.js +248 -0
  129. package/dist/src/cli/commands/retrieval.js.map +7 -0
  130. package/dist/src/cli/commands/search.js +173 -0
  131. package/dist/src/cli/commands/search.js.map +7 -0
  132. package/dist/src/cli/commands/service.js +749 -0
  133. package/dist/src/cli/commands/service.js.map +7 -0
  134. package/dist/src/cli/commands/session.js +200 -0
  135. package/dist/src/cli/commands/session.js.map +7 -0
  136. package/dist/src/cli/commands/settings.js +306 -0
  137. package/dist/src/cli/commands/settings.js.map +7 -0
  138. package/dist/src/cli/commands/setup.js +701 -0
  139. package/dist/src/cli/commands/setup.js.map +7 -0
  140. package/dist/src/cli/commands/shell.js +249 -0
  141. package/dist/src/cli/commands/shell.js.map +7 -0
  142. package/dist/src/cli/commands/signup.js +50 -0
  143. package/dist/src/cli/commands/signup.js.map +7 -0
  144. package/dist/src/cli/commands/skills.js +470 -0
  145. package/dist/src/cli/commands/skills.js.map +7 -0
  146. package/dist/src/cli/commands/sms-notify.js +795 -0
  147. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  148. package/dist/src/cli/commands/storage-tier.js +183 -0
  149. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  150. package/dist/src/cli/commands/sweep.js +249 -0
  151. package/dist/src/cli/commands/sweep.js.map +7 -0
  152. package/dist/src/cli/commands/tasks.js +213 -0
  153. package/dist/src/cli/commands/tasks.js.map +7 -0
  154. package/dist/src/cli/commands/worktree.js +319 -0
  155. package/dist/src/cli/commands/worktree.js.map +7 -0
  156. package/dist/src/cli/index.js +594 -0
  157. package/dist/src/cli/index.js.map +7 -0
  158. package/dist/src/cli/opencode-sm.js +448 -0
  159. package/dist/src/cli/opencode-sm.js.map +7 -0
  160. package/dist/src/cli/utils/viewer.js +96 -0
  161. package/dist/src/cli/utils/viewer.js.map +7 -0
  162. package/dist/src/core/config/config-manager.js +398 -0
  163. package/dist/src/core/config/config-manager.js.map +7 -0
  164. package/dist/src/core/config/feature-flags.js +76 -0
  165. package/dist/src/core/config/feature-flags.js.map +7 -0
  166. package/dist/src/core/config/storage-config.js +115 -0
  167. package/dist/src/core/config/storage-config.js.map +7 -0
  168. package/dist/src/core/config/types.js +144 -0
  169. package/dist/src/core/config/types.js.map +7 -0
  170. package/dist/src/core/context/auto-context.js +80 -0
  171. package/dist/src/core/context/auto-context.js.map +7 -0
  172. package/dist/src/core/context/dual-stack-manager.js +870 -0
  173. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  174. package/dist/src/core/context/enhanced-rehydration.js +994 -0
  175. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  176. package/dist/src/core/context/frame-database.js +479 -0
  177. package/dist/src/core/context/frame-database.js.map +7 -0
  178. package/dist/src/core/context/frame-digest.js +250 -0
  179. package/dist/src/core/context/frame-digest.js.map +7 -0
  180. package/dist/src/core/context/frame-handoff-manager.js +778 -0
  181. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  182. package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
  183. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  184. package/dist/src/core/context/frame-recovery.js +302 -0
  185. package/dist/src/core/context/frame-recovery.js.map +7 -0
  186. package/dist/src/core/context/frame-stack.js +314 -0
  187. package/dist/src/core/context/frame-stack.js.map +7 -0
  188. package/dist/src/core/context/frame-types.js +5 -0
  189. package/dist/src/core/context/frame-types.js.map +7 -0
  190. package/dist/src/core/context/index.js +25 -0
  191. package/dist/src/core/context/index.js.map +7 -0
  192. package/dist/src/core/context/permission-manager.js +185 -0
  193. package/dist/src/core/context/permission-manager.js.map +7 -0
  194. package/dist/src/core/context/recursive-context-manager.js +592 -0
  195. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  196. package/dist/src/core/context/refactored-frame-manager.js +754 -0
  197. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  198. package/dist/src/core/context/shared-context-layer.js +621 -0
  199. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  200. package/dist/src/core/context/stack-merge-resolver.js +749 -0
  201. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  202. package/dist/src/core/context/validation.js +130 -0
  203. package/dist/src/core/context/validation.js.map +7 -0
  204. package/dist/src/core/database/batch-operations.js +384 -0
  205. package/dist/src/core/database/batch-operations.js.map +7 -0
  206. package/dist/src/core/database/connection-pool.js +330 -0
  207. package/dist/src/core/database/connection-pool.js.map +7 -0
  208. package/dist/src/core/database/database-adapter.js +60 -0
  209. package/dist/src/core/database/database-adapter.js.map +7 -0
  210. package/dist/src/core/database/migration-manager.js +614 -0
  211. package/dist/src/core/database/migration-manager.js.map +7 -0
  212. package/dist/src/core/database/query-cache.js +298 -0
  213. package/dist/src/core/database/query-cache.js.map +7 -0
  214. package/dist/src/core/database/query-router.js +430 -0
  215. package/dist/src/core/database/query-router.js.map +7 -0
  216. package/dist/src/core/database/sqlite-adapter.js +738 -0
  217. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  218. package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
  219. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  220. package/dist/src/core/digest/frame-digest-integration.js +176 -0
  221. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  222. package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
  223. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  224. package/dist/src/core/digest/index.js +9 -0
  225. package/dist/src/core/digest/index.js.map +7 -0
  226. package/dist/src/core/digest/types.js +25 -0
  227. package/dist/src/core/digest/types.js.map +7 -0
  228. package/dist/src/core/errors/error-utils.js +208 -0
  229. package/dist/src/core/errors/error-utils.js.map +7 -0
  230. package/dist/src/core/errors/index.js +521 -0
  231. package/dist/src/core/errors/index.js.map +7 -0
  232. package/dist/src/core/errors/recovery.js +269 -0
  233. package/dist/src/core/errors/recovery.js.map +7 -0
  234. package/dist/src/core/execution/parallel-executor.js +258 -0
  235. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  236. package/dist/src/core/frame/workflow-templates.js +319 -0
  237. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  238. package/dist/src/core/merge/conflict-detector.js +431 -0
  239. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  240. package/dist/src/core/merge/index.js +9 -0
  241. package/dist/src/core/merge/index.js.map +7 -0
  242. package/dist/src/core/merge/resolution-engine.js +558 -0
  243. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  244. package/dist/src/core/merge/stack-diff.js +532 -0
  245. package/dist/src/core/merge/stack-diff.js.map +7 -0
  246. package/dist/src/core/merge/types.js +5 -0
  247. package/dist/src/core/merge/types.js.map +7 -0
  248. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  249. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  250. package/dist/src/core/models/fallback-monitor.js +232 -0
  251. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  252. package/dist/src/core/models/model-router.js +340 -0
  253. package/dist/src/core/models/model-router.js.map +7 -0
  254. package/dist/src/core/monitoring/error-handler.js +49 -0
  255. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  256. package/dist/src/core/monitoring/logger.js +202 -0
  257. package/dist/src/core/monitoring/logger.js.map +7 -0
  258. package/dist/src/core/monitoring/metrics.js +172 -0
  259. package/dist/src/core/monitoring/metrics.js.map +7 -0
  260. package/dist/src/core/monitoring/progress-tracker.js +189 -0
  261. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  262. package/dist/src/core/monitoring/session-monitor.js +300 -0
  263. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  264. package/dist/src/core/performance/context-cache.js +273 -0
  265. package/dist/src/core/performance/context-cache.js.map +7 -0
  266. package/dist/src/core/performance/index.js +11 -0
  267. package/dist/src/core/performance/index.js.map +7 -0
  268. package/dist/src/core/performance/lazy-context-loader.js +327 -0
  269. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  270. package/dist/src/core/performance/monitor.js +221 -0
  271. package/dist/src/core/performance/monitor.js.map +7 -0
  272. package/dist/src/core/performance/optimized-frame-context.js +345 -0
  273. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  274. package/dist/src/core/performance/performance-benchmark.js +277 -0
  275. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  276. package/dist/src/core/performance/performance-profiler.js +370 -0
  277. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  278. package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
  279. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  280. package/dist/src/core/persistence/postgres-adapter.js +349 -0
  281. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  282. package/dist/src/core/projects/project-isolation.js +201 -0
  283. package/dist/src/core/projects/project-isolation.js.map +7 -0
  284. package/dist/src/core/projects/project-manager.js +697 -0
  285. package/dist/src/core/projects/project-manager.js.map +7 -0
  286. package/dist/src/core/query/query-parser.js +370 -0
  287. package/dist/src/core/query/query-parser.js.map +7 -0
  288. package/dist/src/core/query/query-templates.js +321 -0
  289. package/dist/src/core/query/query-templates.js.map +7 -0
  290. package/dist/src/core/retrieval/context-retriever.js +479 -0
  291. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  292. package/dist/src/core/retrieval/index.js +8 -0
  293. package/dist/src/core/retrieval/index.js.map +7 -0
  294. package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
  295. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  296. package/dist/src/core/retrieval/llm-provider.js +151 -0
  297. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  298. package/dist/src/core/retrieval/retrieval-audit.js +236 -0
  299. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  300. package/dist/src/core/retrieval/summary-generator.js +589 -0
  301. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  302. package/dist/src/core/retrieval/types.js +21 -0
  303. package/dist/src/core/retrieval/types.js.map +7 -0
  304. package/dist/src/core/security/index.js +35 -0
  305. package/dist/src/core/security/index.js.map +7 -0
  306. package/dist/src/core/security/input-sanitizer.js +321 -0
  307. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  308. package/dist/src/core/session/clear-survival.js +465 -0
  309. package/dist/src/core/session/clear-survival.js.map +7 -0
  310. package/dist/src/core/session/enhanced-handoff.js +792 -0
  311. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  312. package/dist/src/core/session/handoff-generator.js +343 -0
  313. package/dist/src/core/session/handoff-generator.js.map +7 -0
  314. package/dist/src/core/session/index.js +15 -0
  315. package/dist/src/core/session/index.js.map +7 -0
  316. package/dist/src/core/session/session-manager.js +347 -0
  317. package/dist/src/core/session/session-manager.js.map +7 -0
  318. package/dist/src/core/skills/index.js +7 -0
  319. package/dist/src/core/skills/index.js.map +7 -0
  320. package/dist/src/core/skills/skill-storage.js +764 -0
  321. package/dist/src/core/skills/skill-storage.js.map +7 -0
  322. package/dist/src/core/skills/types.js +193 -0
  323. package/dist/src/core/skills/types.js.map +7 -0
  324. package/dist/src/core/storage/chromadb-adapter.js +354 -0
  325. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  326. package/dist/src/core/storage/infinite-storage.js +510 -0
  327. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  328. package/dist/src/core/storage/remote-storage.js +489 -0
  329. package/dist/src/core/storage/remote-storage.js.map +7 -0
  330. package/dist/src/core/storage/two-tier-storage.js +766 -0
  331. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  332. package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
  333. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  334. package/dist/src/core/trace/db-trace-wrapper.js +247 -0
  335. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  336. package/dist/src/core/trace/debug-trace.js +417 -0
  337. package/dist/src/core/trace/debug-trace.js.map +7 -0
  338. package/dist/src/core/trace/index.js +109 -0
  339. package/dist/src/core/trace/index.js.map +7 -0
  340. package/dist/src/core/trace/linear-api-wrapper.js +178 -0
  341. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  342. package/dist/src/core/trace/trace-detector.js +528 -0
  343. package/dist/src/core/trace/trace-detector.js.map +7 -0
  344. package/dist/src/core/trace/trace-store.js +345 -0
  345. package/dist/src/core/trace/trace-store.js.map +7 -0
  346. package/dist/src/core/trace/types.js +77 -0
  347. package/dist/src/core/trace/types.js.map +7 -0
  348. package/dist/src/core/types.js +5 -0
  349. package/dist/src/core/types.js.map +7 -0
  350. package/dist/src/core/utils/async-mutex.js +114 -0
  351. package/dist/src/core/utils/async-mutex.js.map +7 -0
  352. package/dist/src/core/utils/compression.js +83 -0
  353. package/dist/src/core/utils/compression.js.map +7 -0
  354. package/dist/src/core/utils/update-checker.js +218 -0
  355. package/dist/src/core/utils/update-checker.js.map +7 -0
  356. package/dist/src/core/worktree/worktree-manager.js +465 -0
  357. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  358. package/dist/src/daemon/daemon-config.js +149 -0
  359. package/dist/src/daemon/daemon-config.js.map +7 -0
  360. package/dist/src/daemon/services/context-service.js +122 -0
  361. package/dist/src/daemon/services/context-service.js.map +7 -0
  362. package/dist/src/daemon/services/linear-service.js +136 -0
  363. package/dist/src/daemon/services/linear-service.js.map +7 -0
  364. package/dist/src/daemon/session-daemon.js +312 -0
  365. package/dist/src/daemon/session-daemon.js.map +7 -0
  366. package/dist/src/daemon/unified-daemon.js +276 -0
  367. package/dist/src/daemon/unified-daemon.js.map +7 -0
  368. package/dist/src/features/analytics/api/analytics-api.js +287 -0
  369. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  370. package/dist/src/features/analytics/core/analytics-service.js +282 -0
  371. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  372. package/dist/src/features/analytics/index.js +18 -0
  373. package/dist/src/features/analytics/index.js.map +7 -0
  374. package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
  375. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  376. package/dist/src/features/analytics/types/metrics.js +5 -0
  377. package/dist/src/features/analytics/types/metrics.js.map +7 -0
  378. package/dist/src/features/browser/browser-mcp.js +492 -0
  379. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  380. package/dist/src/features/sweep/index.js +20 -0
  381. package/dist/src/features/sweep/index.js.map +7 -0
  382. package/dist/src/features/sweep/prediction-client.js +155 -0
  383. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  384. package/dist/src/features/sweep/prompt-builder.js +85 -0
  385. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  386. package/dist/src/features/sweep/pty-wrapper.js +171 -0
  387. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  388. package/dist/src/features/sweep/state-watcher.js +87 -0
  389. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  390. package/dist/src/features/sweep/status-bar.js +88 -0
  391. package/dist/src/features/sweep/status-bar.js.map +7 -0
  392. package/dist/src/features/sweep/sweep-server-manager.js +226 -0
  393. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  394. package/dist/src/features/sweep/tab-interceptor.js +38 -0
  395. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  396. package/dist/src/features/sweep/types.js +18 -0
  397. package/dist/src/features/sweep/types.js.map +7 -0
  398. package/dist/src/features/tasks/linear-task-manager.js +487 -0
  399. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  400. package/dist/src/features/tasks/task-aware-context.js +410 -0
  401. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  402. package/dist/src/features/tui/simple-monitor.js +116 -0
  403. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  404. package/dist/src/features/tui/swarm-monitor.js +648 -0
  405. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  406. package/dist/src/features/web/client/stores/task-store.js +26 -0
  407. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  408. package/dist/src/features/web/server/index.js +194 -0
  409. package/dist/src/features/web/server/index.js.map +7 -0
  410. package/dist/src/hooks/auto-background.js +151 -0
  411. package/dist/src/hooks/auto-background.js.map +7 -0
  412. package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
  413. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  414. package/dist/src/hooks/config.js +150 -0
  415. package/dist/src/hooks/config.js.map +7 -0
  416. package/dist/src/hooks/daemon.js +364 -0
  417. package/dist/src/hooks/daemon.js.map +7 -0
  418. package/dist/src/hooks/events.js +58 -0
  419. package/dist/src/hooks/events.js.map +7 -0
  420. package/dist/src/hooks/index.js +12 -0
  421. package/dist/src/hooks/index.js.map +7 -0
  422. package/dist/src/hooks/linear-task-picker.js +186 -0
  423. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  424. package/dist/src/hooks/schemas.js +197 -0
  425. package/dist/src/hooks/schemas.js.map +7 -0
  426. package/dist/src/hooks/secure-fs.js +49 -0
  427. package/dist/src/hooks/secure-fs.js.map +7 -0
  428. package/dist/src/hooks/security-logger.js +155 -0
  429. package/dist/src/hooks/security-logger.js.map +7 -0
  430. package/dist/src/hooks/session-summary.js +222 -0
  431. package/dist/src/hooks/session-summary.js.map +7 -0
  432. package/dist/src/hooks/sms-action-runner.js +371 -0
  433. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  434. package/dist/src/hooks/sms-notify.js +506 -0
  435. package/dist/src/hooks/sms-notify.js.map +7 -0
  436. package/dist/src/hooks/sms-watcher.js +93 -0
  437. package/dist/src/hooks/sms-watcher.js.map +7 -0
  438. package/dist/src/hooks/sms-webhook.js +555 -0
  439. package/dist/src/hooks/sms-webhook.js.map +7 -0
  440. package/dist/src/hooks/whatsapp-commands.js +479 -0
  441. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  442. package/dist/src/hooks/whatsapp-scheduler.js +317 -0
  443. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  444. package/dist/src/hooks/whatsapp-sync.js +409 -0
  445. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  446. package/dist/src/index.js +25 -0
  447. package/dist/src/index.js.map +7 -0
  448. package/dist/src/integrations/anthropic/client.js +263 -0
  449. package/dist/src/integrations/anthropic/client.js.map +7 -0
  450. package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
  451. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  452. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
  453. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  454. package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
  455. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  456. package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
  457. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  458. package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
  459. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  460. package/dist/src/integrations/claude-code/subagent-client.js +511 -0
  461. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  462. package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
  463. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  464. package/dist/src/integrations/linear/auth.js +337 -0
  465. package/dist/src/integrations/linear/auth.js.map +7 -0
  466. package/dist/src/integrations/linear/auto-sync.js +258 -0
  467. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  468. package/dist/src/integrations/linear/client.js +634 -0
  469. package/dist/src/integrations/linear/client.js.map +7 -0
  470. package/dist/src/integrations/linear/config.js +130 -0
  471. package/dist/src/integrations/linear/config.js.map +7 -0
  472. package/dist/src/integrations/linear/migration.js +361 -0
  473. package/dist/src/integrations/linear/migration.js.map +7 -0
  474. package/dist/src/integrations/linear/oauth-server.js +454 -0
  475. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  476. package/dist/src/integrations/linear/rest-client.js +213 -0
  477. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  478. package/dist/src/integrations/linear/sync-manager.js +236 -0
  479. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  480. package/dist/src/integrations/linear/sync-service.js +231 -0
  481. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  482. package/dist/src/integrations/linear/sync.js +782 -0
  483. package/dist/src/integrations/linear/sync.js.map +7 -0
  484. package/dist/src/integrations/linear/types.js +5 -0
  485. package/dist/src/integrations/linear/types.js.map +7 -0
  486. package/dist/src/integrations/linear/unified-sync.js +589 -0
  487. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  488. package/dist/src/integrations/linear/webhook-handler.js +219 -0
  489. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  490. package/dist/src/integrations/linear/webhook-server.js +218 -0
  491. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  492. package/dist/src/integrations/linear/webhook.js +291 -0
  493. package/dist/src/integrations/linear/webhook.js.map +7 -0
  494. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
  495. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  496. package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
  497. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  498. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
  499. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  500. package/dist/src/integrations/mcp/handlers/index.js +166 -0
  501. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  502. package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
  503. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  504. package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
  505. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  506. package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
  507. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  508. package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
  509. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  510. package/dist/src/integrations/mcp/index.js +23 -0
  511. package/dist/src/integrations/mcp/index.js.map +7 -0
  512. package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
  513. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  514. package/dist/src/integrations/mcp/refactored-server.js +374 -0
  515. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  516. package/dist/src/integrations/mcp/remote-server.js +682 -0
  517. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  518. package/dist/src/integrations/mcp/schemas.js +147 -0
  519. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  520. package/dist/src/integrations/mcp/server.js +1975 -0
  521. package/dist/src/integrations/mcp/server.js.map +7 -0
  522. package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
  523. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  524. package/dist/src/integrations/mcp/tool-definitions.js +702 -0
  525. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  526. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
  527. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  528. package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
  529. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  530. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
  531. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  532. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
  533. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  534. package/dist/src/integrations/ralph/index.js +18 -0
  535. package/dist/src/integrations/ralph/index.js.map +7 -0
  536. package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
  537. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  538. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
  539. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  540. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
  541. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  542. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
  543. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  544. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
  545. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  546. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
  547. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  548. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
  549. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  550. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
  551. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  552. package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
  553. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  554. package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
  555. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  556. package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
  557. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  558. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
  559. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  560. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
  561. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  562. package/dist/src/integrations/ralph/types.js +5 -0
  563. package/dist/src/integrations/ralph/types.js.map +7 -0
  564. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
  565. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  566. package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
  567. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  568. package/dist/src/middleware/exponential-rate-limiter.js +289 -0
  569. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  570. package/dist/src/models/user.model.js +358 -0
  571. package/dist/src/models/user.model.js.map +7 -0
  572. package/dist/src/servers/production/auth-middleware.js +528 -0
  573. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  574. package/dist/src/services/config-service.js +65 -0
  575. package/dist/src/services/config-service.js.map +7 -0
  576. package/dist/src/services/context-service.js +194 -0
  577. package/dist/src/services/context-service.js.map +7 -0
  578. package/dist/src/skills/api-discovery.js +354 -0
  579. package/dist/src/skills/api-discovery.js.map +7 -0
  580. package/dist/src/skills/api-skill.js +475 -0
  581. package/dist/src/skills/api-skill.js.map +7 -0
  582. package/dist/src/skills/claude-skills.js +1061 -0
  583. package/dist/src/skills/claude-skills.js.map +7 -0
  584. package/dist/src/skills/dashboard-launcher.js +216 -0
  585. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  586. package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
  587. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  588. package/dist/src/skills/repo-ingestion-skill.js +609 -0
  589. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  590. package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
  591. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  592. package/dist/src/types/task.js +5 -0
  593. package/dist/src/types/task.js.map +7 -0
  594. package/dist/src/utils/env.js +50 -0
  595. package/dist/src/utils/env.js.map +7 -0
  596. package/dist/src/utils/formatting.js +62 -0
  597. package/dist/src/utils/formatting.js.map +7 -0
  598. package/dist/src/utils/process-cleanup.js +136 -0
  599. package/dist/src/utils/process-cleanup.js.map +7 -0
  600. package/package.json +4 -3
  601. package/scripts/create-cleanup-issues.js +302 -0
  602. package/scripts/demos/browser-test.ts +39 -0
  603. package/scripts/demos/ralph-integration-demo.ts +244 -0
  604. package/scripts/demos/trace-demo.ts +214 -0
  605. package/scripts/demos/trace-detector.demo.ts +171 -0
  606. package/scripts/demos/trace-test.ts +67 -0
  607. package/scripts/initialize.ts +16 -7
  608. package/scripts/install.sh +14 -62
  609. package/scripts/status.ts +111 -46
  610. package/scripts/test-claude-config.sh +123 -0
  611. package/scripts/validate-claude-config.sh +155 -0
@@ -0,0 +1,303 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { v4 as uuidv4 } from "uuid";
6
+ import { ConflictDetector } from "./conflict-detector.js";
7
+ import { StackDiffVisualizer } from "./stack-diff.js";
8
+ import { ResolutionEngine } from "./resolution-engine.js";
9
+ import { logger } from "../monitoring/logger.js";
10
+ class UnifiedMergeResolver {
11
+ conflictDetector;
12
+ diffVisualizer;
13
+ resolutionEngine;
14
+ activeSessions = /* @__PURE__ */ new Map();
15
+ rollbackSnapshots = /* @__PURE__ */ new Map();
16
+ statistics = {
17
+ totalConflicts: 0,
18
+ resolvedConflicts: 0,
19
+ averageResolutionTime: 0,
20
+ successRate: 0,
21
+ rollbackCount: 0
22
+ };
23
+ constructor() {
24
+ this.conflictDetector = new ConflictDetector();
25
+ this.diffVisualizer = new StackDiffVisualizer();
26
+ this.resolutionEngine = new ResolutionEngine();
27
+ logger.debug("UnifiedMergeResolver initialized");
28
+ }
29
+ /**
30
+ * Start a new merge session with automatic conflict detection
31
+ */
32
+ async startMergeSession(stack1, stack2, options) {
33
+ const sessionId = `unified-merge-${Date.now()}-${uuidv4().substring(0, 8)}`;
34
+ const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);
35
+ let rollbackPoint;
36
+ if (options?.preserveRollback !== false) {
37
+ rollbackPoint = this.createRollbackSnapshot(sessionId, stack1, stack2);
38
+ }
39
+ const session = {
40
+ sessionId,
41
+ stack1,
42
+ stack2,
43
+ conflicts,
44
+ status: "analyzing",
45
+ rollbackPoint,
46
+ startedAt: Date.now(),
47
+ metadata: {
48
+ totalFrames: stack1.frames.length + stack2.frames.length,
49
+ conflictCount: conflicts.length,
50
+ resolvedCount: 0
51
+ }
52
+ };
53
+ this.activeSessions.set(sessionId, session);
54
+ this.statistics.totalConflicts += conflicts.length;
55
+ logger.info(`Merge session started: ${sessionId}`, {
56
+ stack1Id: stack1.id,
57
+ stack2Id: stack2.id,
58
+ conflictCount: conflicts.length
59
+ });
60
+ if (options?.autoResolve && conflicts.length > 0 && options.context) {
61
+ const defaultStrategy = options.strategy || "ai_suggest";
62
+ await this.resolveConflicts(sessionId, defaultStrategy, options.context);
63
+ }
64
+ return sessionId;
65
+ }
66
+ /**
67
+ * Generate a preview of the merge result
68
+ */
69
+ async generatePreview(sessionId, strategy) {
70
+ const session = this.activeSessions.get(sessionId);
71
+ if (!session) {
72
+ throw new Error(`Session not found: ${sessionId}`);
73
+ }
74
+ const preview = this.diffVisualizer.generateMergePreview(
75
+ session.stack1,
76
+ session.stack2,
77
+ strategy
78
+ );
79
+ session.preview = preview;
80
+ session.status = "preview";
81
+ session.metadata.strategyUsed = strategy;
82
+ this.activeSessions.set(sessionId, session);
83
+ logger.info(`Preview generated for session: ${sessionId}`, {
84
+ mergedFrameCount: preview.mergedFrames.length,
85
+ estimatedSuccess: preview.estimatedSuccess
86
+ });
87
+ return preview;
88
+ }
89
+ /**
90
+ * Resolve conflicts using the specified strategy
91
+ */
92
+ async resolveConflicts(sessionId, strategy, context) {
93
+ const session = this.activeSessions.get(sessionId);
94
+ if (!session) {
95
+ throw new Error(`Session not found: ${sessionId}`);
96
+ }
97
+ session.status = "resolving";
98
+ try {
99
+ const result = await this.resolutionEngine.resolveConflicts(
100
+ session.stack1,
101
+ session.stack2,
102
+ strategy,
103
+ context
104
+ );
105
+ session.resolution = result.resolution;
106
+ session.status = result.success ? "completed" : "failed";
107
+ session.completedAt = Date.now();
108
+ session.metadata.resolvedCount = session.conflicts.filter(
109
+ (c) => c.resolution !== void 0
110
+ ).length;
111
+ session.metadata.strategyUsed = strategy;
112
+ this.activeSessions.set(sessionId, session);
113
+ if (result.success) {
114
+ this.statistics.resolvedConflicts += session.metadata.resolvedCount;
115
+ this.updateSuccessRate();
116
+ this.updateAverageResolutionTime(session);
117
+ }
118
+ logger.info(`Conflicts resolved for session: ${sessionId}`, {
119
+ success: result.success,
120
+ strategy,
121
+ resolvedCount: session.metadata.resolvedCount
122
+ });
123
+ return result;
124
+ } catch (error) {
125
+ session.status = "failed";
126
+ this.activeSessions.set(sessionId, session);
127
+ logger.error(
128
+ `Failed to resolve conflicts for session: ${sessionId}`,
129
+ error
130
+ );
131
+ throw error;
132
+ }
133
+ }
134
+ /**
135
+ * Rollback a merge to its original state
136
+ */
137
+ async rollback(sessionId) {
138
+ const session = this.activeSessions.get(sessionId);
139
+ if (!session || !session.rollbackPoint) {
140
+ logger.warn(`Cannot rollback session: ${sessionId} - no rollback point`);
141
+ return false;
142
+ }
143
+ const snapshot = this.rollbackSnapshots.get(session.rollbackPoint);
144
+ if (!snapshot) {
145
+ logger.error(`Rollback snapshot not found: ${session.rollbackPoint}`);
146
+ return false;
147
+ }
148
+ session.stack1 = snapshot.stack1;
149
+ session.stack2 = snapshot.stack2;
150
+ session.status = "rolled_back";
151
+ session.resolution = void 0;
152
+ session.conflicts = this.conflictDetector.detectConflicts(
153
+ snapshot.stack1,
154
+ snapshot.stack2
155
+ );
156
+ session.metadata.resolvedCount = 0;
157
+ this.activeSessions.set(sessionId, session);
158
+ this.statistics.rollbackCount++;
159
+ logger.info(`Session rolled back: ${sessionId}`);
160
+ return true;
161
+ }
162
+ /**
163
+ * Get merge session details
164
+ */
165
+ getSession(sessionId) {
166
+ return this.activeSessions.get(sessionId);
167
+ }
168
+ /**
169
+ * List all active merge sessions
170
+ */
171
+ listActiveSessions() {
172
+ return Array.from(this.activeSessions.values()).filter(
173
+ (s) => s.status !== "completed" && s.status !== "rolled_back" && s.status !== "failed"
174
+ );
175
+ }
176
+ /**
177
+ * Get merge statistics
178
+ */
179
+ getStatistics() {
180
+ return { ...this.statistics };
181
+ }
182
+ /**
183
+ * Analyze parallel solutions across stacks
184
+ */
185
+ analyzeParallelSolutions(frames) {
186
+ const solutions = this.conflictDetector.analyzeParallelSolutions(frames);
187
+ const recommendations = [];
188
+ if (solutions.length > 1) {
189
+ const grouped = /* @__PURE__ */ new Map();
190
+ for (const sol of solutions) {
191
+ const key = sol.approach.toLowerCase();
192
+ if (!grouped.has(key)) {
193
+ grouped.set(key, []);
194
+ }
195
+ grouped.get(key).push(sol);
196
+ }
197
+ for (const [approach, group] of grouped) {
198
+ if (group.length > 1) {
199
+ const avgEffectiveness = group.reduce((sum, s) => sum + (s.effectiveness || 0), 0) / group.length;
200
+ recommendations.push(
201
+ `${group.length} parallel solutions using "${approach}" approach (avg effectiveness: ${(avgEffectiveness * 100).toFixed(1)}%)`
202
+ );
203
+ }
204
+ }
205
+ const best = solutions.reduce(
206
+ (a, b) => (a.effectiveness || 0) > (b.effectiveness || 0) ? a : b,
207
+ solutions[0]
208
+ );
209
+ if (best && best.effectiveness && best.effectiveness > 0.7) {
210
+ recommendations.push(
211
+ `Recommended: Use solution from frame "${best.frameId}" (${(best.effectiveness * 100).toFixed(1)}% effectiveness)`
212
+ );
213
+ }
214
+ }
215
+ return {
216
+ solutions: solutions.map((s) => ({
217
+ frameId: s.frameId,
218
+ approach: s.approach,
219
+ effectiveness: s.effectiveness || 0
220
+ })),
221
+ recommendations
222
+ };
223
+ }
224
+ /**
225
+ * Create a visual diff between two stacks
226
+ */
227
+ createVisualDiff(baseFrame, stack1, stack2) {
228
+ const diff = this.diffVisualizer.visualizeDivergence(
229
+ baseFrame,
230
+ stack1,
231
+ stack2
232
+ );
233
+ const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);
234
+ return {
235
+ nodes: diff.nodes.map((n) => ({
236
+ id: n.id,
237
+ type: n.type,
238
+ depth: n.frame?.depth
239
+ })),
240
+ edges: diff.edges.map((e) => ({
241
+ source: e.source,
242
+ target: e.target,
243
+ type: e.type
244
+ })),
245
+ conflicts: conflicts.map((c) => ({
246
+ frameId1: c.frameId1,
247
+ frameId2: c.frameId2,
248
+ severity: c.severity
249
+ }))
250
+ };
251
+ }
252
+ /**
253
+ * Close a merge session and clean up resources
254
+ */
255
+ closeSession(sessionId) {
256
+ const session = this.activeSessions.get(sessionId);
257
+ if (session) {
258
+ if (session.rollbackPoint) {
259
+ this.rollbackSnapshots.delete(session.rollbackPoint);
260
+ }
261
+ this.activeSessions.delete(sessionId);
262
+ logger.debug(`Session closed: ${sessionId}`);
263
+ }
264
+ }
265
+ // Private helpers
266
+ createRollbackSnapshot(sessionId, stack1, stack2) {
267
+ const snapshotId = `rollback-${sessionId}`;
268
+ this.rollbackSnapshots.set(snapshotId, {
269
+ stack1: this.deepCloneStack(stack1),
270
+ stack2: this.deepCloneStack(stack2)
271
+ });
272
+ return snapshotId;
273
+ }
274
+ deepCloneStack(stack) {
275
+ return {
276
+ ...stack,
277
+ frames: stack.frames.map((f) => ({ ...f })),
278
+ events: stack.events.map((e) => ({ ...e }))
279
+ };
280
+ }
281
+ updateSuccessRate() {
282
+ if (this.statistics.totalConflicts > 0) {
283
+ this.statistics.successRate = this.statistics.resolvedConflicts / this.statistics.totalConflicts;
284
+ }
285
+ }
286
+ updateAverageResolutionTime(session) {
287
+ if (session.completedAt && session.startedAt) {
288
+ const duration = session.completedAt - session.startedAt;
289
+ const completedSessions = Array.from(this.activeSessions.values()).filter(
290
+ (s) => s.completedAt
291
+ ).length;
292
+ if (completedSessions === 1) {
293
+ this.statistics.averageResolutionTime = duration;
294
+ } else {
295
+ this.statistics.averageResolutionTime = (this.statistics.averageResolutionTime * (completedSessions - 1) + duration) / completedSessions;
296
+ }
297
+ }
298
+ }
299
+ }
300
+ export {
301
+ UnifiedMergeResolver
302
+ };
303
+ //# sourceMappingURL=unified-merge-resolver.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/merge/unified-merge-resolver.ts"],
4
+ "sourcesContent": ["/**\n * Unified Merge Resolver - STA-101\n * Bridges StackMergeResolver with advanced ConflictDetector and ResolutionEngine\n * Provides a unified interface for all merge conflict resolution scenarios\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport type { Frame, Event } from '../context/frame-types.js';\nimport { ConflictDetector } from './conflict-detector.js';\nimport { StackDiffVisualizer, PreviewResult } from './stack-diff.js';\nimport { ResolutionEngine, ResolutionContext } from './resolution-engine.js';\nimport {\n MergeConflict,\n ConflictResolution,\n ResolutionStrategy,\n FrameStack,\n MergeResult,\n MergeStatistics,\n} from './types.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface UnifiedMergeSession {\n sessionId: string;\n stack1: FrameStack;\n stack2: FrameStack;\n conflicts: MergeConflict[];\n resolution?: ConflictResolution;\n status:\n | 'analyzing'\n | 'preview'\n | 'resolving'\n | 'completed'\n | 'failed'\n | 'rolled_back';\n preview?: PreviewResult;\n rollbackPoint?: string;\n startedAt: number;\n completedAt?: number;\n metadata: {\n totalFrames: number;\n conflictCount: number;\n resolvedCount: number;\n strategyUsed?: ResolutionStrategy['type'];\n };\n}\n\nexport interface MergeOptions {\n strategy?: ResolutionStrategy['type'];\n autoResolve?: boolean;\n preserveRollback?: boolean;\n notifyOnComplete?: boolean;\n context?: ResolutionContext;\n}\n\nexport class UnifiedMergeResolver {\n private conflictDetector: ConflictDetector;\n private diffVisualizer: StackDiffVisualizer;\n private resolutionEngine: ResolutionEngine;\n private activeSessions: Map<string, UnifiedMergeSession> = new Map();\n private rollbackSnapshots: Map<\n string,\n { stack1: FrameStack; stack2: FrameStack }\n > = new Map();\n private statistics: MergeStatistics = {\n totalConflicts: 0,\n resolvedConflicts: 0,\n averageResolutionTime: 0,\n successRate: 0,\n rollbackCount: 0,\n };\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n this.diffVisualizer = new StackDiffVisualizer();\n this.resolutionEngine = new ResolutionEngine();\n logger.debug('UnifiedMergeResolver initialized');\n }\n\n /**\n * Start a new merge session with automatic conflict detection\n */\n async startMergeSession(\n stack1: FrameStack,\n stack2: FrameStack,\n options?: MergeOptions\n ): Promise<string> {\n const sessionId = `unified-merge-${Date.now()}-${uuidv4().substring(0, 8)}`;\n\n // Detect conflicts\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n // Create rollback snapshot if requested\n let rollbackPoint: string | undefined;\n if (options?.preserveRollback !== false) {\n rollbackPoint = this.createRollbackSnapshot(sessionId, stack1, stack2);\n }\n\n const session: UnifiedMergeSession = {\n sessionId,\n stack1,\n stack2,\n conflicts,\n status: 'analyzing',\n rollbackPoint,\n startedAt: Date.now(),\n metadata: {\n totalFrames: stack1.frames.length + stack2.frames.length,\n conflictCount: conflicts.length,\n resolvedCount: 0,\n },\n };\n\n this.activeSessions.set(sessionId, session);\n this.statistics.totalConflicts += conflicts.length;\n\n logger.info(`Merge session started: ${sessionId}`, {\n stack1Id: stack1.id,\n stack2Id: stack2.id,\n conflictCount: conflicts.length,\n });\n\n // Auto-resolve if requested and possible\n if (options?.autoResolve && conflicts.length > 0 && options.context) {\n const defaultStrategy = options.strategy || 'ai_suggest';\n await this.resolveConflicts(sessionId, defaultStrategy, options.context);\n }\n\n return sessionId;\n }\n\n /**\n * Generate a preview of the merge result\n */\n async generatePreview(\n sessionId: string,\n strategy: ResolutionStrategy['type']\n ): Promise<PreviewResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const preview = this.diffVisualizer.generateMergePreview(\n session.stack1,\n session.stack2,\n strategy\n );\n\n session.preview = preview;\n session.status = 'preview';\n session.metadata.strategyUsed = strategy;\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Preview generated for session: ${sessionId}`, {\n mergedFrameCount: preview.mergedFrames.length,\n estimatedSuccess: preview.estimatedSuccess,\n });\n\n return preview;\n }\n\n /**\n * Resolve conflicts using the specified strategy\n */\n async resolveConflicts(\n sessionId: string,\n strategy: ResolutionStrategy['type'],\n context: ResolutionContext\n ): Promise<MergeResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n session.status = 'resolving';\n\n try {\n const result = await this.resolutionEngine.resolveConflicts(\n session.stack1,\n session.stack2,\n strategy,\n context\n );\n\n session.resolution = result.resolution;\n session.status = result.success ? 'completed' : 'failed';\n session.completedAt = Date.now();\n session.metadata.resolvedCount = session.conflicts.filter(\n (c) => c.resolution !== undefined\n ).length;\n session.metadata.strategyUsed = strategy;\n\n this.activeSessions.set(sessionId, session);\n\n // Update statistics\n if (result.success) {\n this.statistics.resolvedConflicts += session.metadata.resolvedCount;\n this.updateSuccessRate();\n this.updateAverageResolutionTime(session);\n }\n\n logger.info(`Conflicts resolved for session: ${sessionId}`, {\n success: result.success,\n strategy,\n resolvedCount: session.metadata.resolvedCount,\n });\n\n return result;\n } catch (error) {\n session.status = 'failed';\n this.activeSessions.set(sessionId, session);\n\n logger.error(\n `Failed to resolve conflicts for session: ${sessionId}`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Rollback a merge to its original state\n */\n async rollback(sessionId: string): Promise<boolean> {\n const session = this.activeSessions.get(sessionId);\n if (!session || !session.rollbackPoint) {\n logger.warn(`Cannot rollback session: ${sessionId} - no rollback point`);\n return false;\n }\n\n const snapshot = this.rollbackSnapshots.get(session.rollbackPoint);\n if (!snapshot) {\n logger.error(`Rollback snapshot not found: ${session.rollbackPoint}`);\n return false;\n }\n\n // Restore original state\n session.stack1 = snapshot.stack1;\n session.stack2 = snapshot.stack2;\n session.status = 'rolled_back';\n session.resolution = undefined;\n session.conflicts = this.conflictDetector.detectConflicts(\n snapshot.stack1,\n snapshot.stack2\n );\n session.metadata.resolvedCount = 0;\n\n this.activeSessions.set(sessionId, session);\n this.statistics.rollbackCount++;\n\n logger.info(`Session rolled back: ${sessionId}`);\n return true;\n }\n\n /**\n * Get merge session details\n */\n getSession(sessionId: string): UnifiedMergeSession | undefined {\n return this.activeSessions.get(sessionId);\n }\n\n /**\n * List all active merge sessions\n */\n listActiveSessions(): UnifiedMergeSession[] {\n return Array.from(this.activeSessions.values()).filter(\n (s) =>\n s.status !== 'completed' &&\n s.status !== 'rolled_back' &&\n s.status !== 'failed'\n );\n }\n\n /**\n * Get merge statistics\n */\n getStatistics(): MergeStatistics {\n return { ...this.statistics };\n }\n\n /**\n * Analyze parallel solutions across stacks\n */\n analyzeParallelSolutions(frames: Frame[]): {\n solutions: Array<{\n frameId: string;\n approach: string;\n effectiveness: number;\n }>;\n recommendations: string[];\n } {\n const solutions = this.conflictDetector.analyzeParallelSolutions(frames);\n\n const recommendations: string[] = [];\n if (solutions.length > 1) {\n // Group by similar solutions\n const grouped = new Map<string, typeof solutions>();\n for (const sol of solutions) {\n const key = sol.approach.toLowerCase();\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(sol);\n }\n\n // Generate recommendations\n for (const [approach, group] of grouped) {\n if (group.length > 1) {\n const avgEffectiveness =\n group.reduce((sum, s) => sum + (s.effectiveness || 0), 0) /\n group.length;\n recommendations.push(\n `${group.length} parallel solutions using \"${approach}\" approach (avg effectiveness: ${(avgEffectiveness * 100).toFixed(1)}%)`\n );\n }\n }\n\n // Find best solution\n const best = solutions.reduce(\n (a, b) => ((a.effectiveness || 0) > (b.effectiveness || 0) ? a : b),\n solutions[0]\n );\n if (best && best.effectiveness && best.effectiveness > 0.7) {\n recommendations.push(\n `Recommended: Use solution from frame \"${best.frameId}\" (${(best.effectiveness * 100).toFixed(1)}% effectiveness)`\n );\n }\n }\n\n return {\n solutions: solutions.map((s) => ({\n frameId: s.frameId,\n approach: s.approach,\n effectiveness: s.effectiveness || 0,\n })),\n recommendations,\n };\n }\n\n /**\n * Create a visual diff between two stacks\n */\n createVisualDiff(\n baseFrame: Frame,\n stack1: FrameStack,\n stack2: FrameStack\n ): {\n nodes: Array<{ id: string; type: string; depth?: number }>;\n edges: Array<{ source: string; target: string; type: string }>;\n conflicts: Array<{ frameId1: string; frameId2: string; severity: string }>;\n } {\n const diff = this.diffVisualizer.visualizeDivergence(\n baseFrame,\n stack1,\n stack2\n );\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n return {\n nodes: diff.nodes.map((n) => ({\n id: n.id,\n type: n.type,\n depth: n.frame?.depth,\n })),\n edges: diff.edges.map((e) => ({\n source: e.source,\n target: e.target,\n type: e.type,\n })),\n conflicts: conflicts.map((c) => ({\n frameId1: c.frameId1,\n frameId2: c.frameId2,\n severity: c.severity,\n })),\n };\n }\n\n /**\n * Close a merge session and clean up resources\n */\n closeSession(sessionId: string): void {\n const session = this.activeSessions.get(sessionId);\n if (session) {\n // Clean up rollback snapshot\n if (session.rollbackPoint) {\n this.rollbackSnapshots.delete(session.rollbackPoint);\n }\n this.activeSessions.delete(sessionId);\n\n logger.debug(`Session closed: ${sessionId}`);\n }\n }\n\n // Private helpers\n\n private createRollbackSnapshot(\n sessionId: string,\n stack1: FrameStack,\n stack2: FrameStack\n ): string {\n const snapshotId = `rollback-${sessionId}`;\n\n // Deep clone stacks\n this.rollbackSnapshots.set(snapshotId, {\n stack1: this.deepCloneStack(stack1),\n stack2: this.deepCloneStack(stack2),\n });\n\n return snapshotId;\n }\n\n private deepCloneStack(stack: FrameStack): FrameStack {\n return {\n ...stack,\n frames: stack.frames.map((f) => ({ ...f })),\n events: stack.events.map((e) => ({ ...e })),\n };\n }\n\n private updateSuccessRate(): void {\n if (this.statistics.totalConflicts > 0) {\n this.statistics.successRate =\n this.statistics.resolvedConflicts / this.statistics.totalConflicts;\n }\n }\n\n private updateAverageResolutionTime(session: UnifiedMergeSession): void {\n if (session.completedAt && session.startedAt) {\n const duration = session.completedAt - session.startedAt;\n const completedSessions = Array.from(this.activeSessions.values()).filter(\n (s) => s.completedAt\n ).length;\n\n if (completedSessions === 1) {\n this.statistics.averageResolutionTime = duration;\n } else {\n // Running average\n this.statistics.averageResolutionTime =\n (this.statistics.averageResolutionTime * (completedSessions - 1) +\n duration) /\n completedSessions;\n }\n }\n }\n}\n"],
5
+ "mappings": ";;;;AAMA,SAAS,MAAM,cAAc;AAE7B,SAAS,wBAAwB;AACjC,SAAS,2BAA0C;AACnD,SAAS,wBAA2C;AASpD,SAAS,cAAc;AAmChB,MAAM,qBAAqB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAmD,oBAAI,IAAI;AAAA,EAC3D,oBAGJ,oBAAI,IAAI;AAAA,EACJ,aAA8B;AAAA,IACpC,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EAEA,cAAc;AACZ,SAAK,mBAAmB,IAAI,iBAAiB;AAC7C,SAAK,iBAAiB,IAAI,oBAAoB;AAC9C,SAAK,mBAAmB,IAAI,iBAAiB;AAC7C,WAAO,MAAM,kCAAkC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACJ,QACA,QACA,SACiB;AACjB,UAAM,YAAY,iBAAiB,KAAK,IAAI,CAAC,IAAI,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC;AAGzE,UAAM,YAAY,KAAK,iBAAiB,gBAAgB,QAAQ,MAAM;AAGtE,QAAI;AACJ,QAAI,SAAS,qBAAqB,OAAO;AACvC,sBAAgB,KAAK,uBAAuB,WAAW,QAAQ,MAAM;AAAA,IACvE;AAEA,UAAM,UAA+B;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,UAAU;AAAA,QACR,aAAa,OAAO,OAAO,SAAS,OAAO,OAAO;AAAA,QAClD,eAAe,UAAU;AAAA,QACzB,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,SAAK,eAAe,IAAI,WAAW,OAAO;AAC1C,SAAK,WAAW,kBAAkB,UAAU;AAE5C,WAAO,KAAK,0BAA0B,SAAS,IAAI;AAAA,MACjD,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,eAAe,UAAU;AAAA,IAC3B,CAAC;AAGD,QAAI,SAAS,eAAe,UAAU,SAAS,KAAK,QAAQ,SAAS;AACnE,YAAM,kBAAkB,QAAQ,YAAY;AAC5C,YAAM,KAAK,iBAAiB,WAAW,iBAAiB,QAAQ,OAAO;AAAA,IACzE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,WACA,UACwB;AACxB,UAAM,UAAU,KAAK,eAAe,IAAI,SAAS;AACjD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,sBAAsB,SAAS,EAAE;AAAA,IACnD;AAEA,UAAM,UAAU,KAAK,eAAe;AAAA,MAClC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,YAAQ,UAAU;AAClB,YAAQ,SAAS;AACjB,YAAQ,SAAS,eAAe;AAEhC,SAAK,eAAe,IAAI,WAAW,OAAO;AAE1C,WAAO,KAAK,kCAAkC,SAAS,IAAI;AAAA,MACzD,kBAAkB,QAAQ,aAAa;AAAA,MACvC,kBAAkB,QAAQ;AAAA,IAC5B,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,WACA,UACA,SACsB;AACtB,UAAM,UAAU,KAAK,eAAe,IAAI,SAAS;AACjD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,sBAAsB,SAAS,EAAE;AAAA,IACnD;AAEA,YAAQ,SAAS;AAEjB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,iBAAiB;AAAA,QACzC,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAEA,cAAQ,aAAa,OAAO;AAC5B,cAAQ,SAAS,OAAO,UAAU,cAAc;AAChD,cAAQ,cAAc,KAAK,IAAI;AAC/B,cAAQ,SAAS,gBAAgB,QAAQ,UAAU;AAAA,QACjD,CAAC,MAAM,EAAE,eAAe;AAAA,MAC1B,EAAE;AACF,cAAQ,SAAS,eAAe;AAEhC,WAAK,eAAe,IAAI,WAAW,OAAO;AAG1C,UAAI,OAAO,SAAS;AAClB,aAAK,WAAW,qBAAqB,QAAQ,SAAS;AACtD,aAAK,kBAAkB;AACvB,aAAK,4BAA4B,OAAO;AAAA,MAC1C;AAEA,aAAO,KAAK,mCAAmC,SAAS,IAAI;AAAA,QAC1D,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,eAAe,QAAQ,SAAS;AAAA,MAClC,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,SAAS;AACjB,WAAK,eAAe,IAAI,WAAW,OAAO;AAE1C,aAAO;AAAA,QACL,4CAA4C,SAAS;AAAA,QACrD;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,WAAqC;AAClD,UAAM,UAAU,KAAK,eAAe,IAAI,SAAS;AACjD,QAAI,CAAC,WAAW,CAAC,QAAQ,eAAe;AACtC,aAAO,KAAK,4BAA4B,SAAS,sBAAsB;AACvE,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,kBAAkB,IAAI,QAAQ,aAAa;AACjE,QAAI,CAAC,UAAU;AACb,aAAO,MAAM,gCAAgC,QAAQ,aAAa,EAAE;AACpE,aAAO;AAAA,IACT;AAGA,YAAQ,SAAS,SAAS;AAC1B,YAAQ,SAAS,SAAS;AAC1B,YAAQ,SAAS;AACjB,YAAQ,aAAa;AACrB,YAAQ,YAAY,KAAK,iBAAiB;AAAA,MACxC,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AACA,YAAQ,SAAS,gBAAgB;AAEjC,SAAK,eAAe,IAAI,WAAW,OAAO;AAC1C,SAAK,WAAW;AAEhB,WAAO,KAAK,wBAAwB,SAAS,EAAE;AAC/C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAoD;AAC7D,WAAO,KAAK,eAAe,IAAI,SAAS;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA4C;AAC1C,WAAO,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,EAAE;AAAA,MAC9C,CAAC,MACC,EAAE,WAAW,eACb,EAAE,WAAW,iBACb,EAAE,WAAW;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAiC;AAC/B,WAAO,EAAE,GAAG,KAAK,WAAW;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,QAOvB;AACA,UAAM,YAAY,KAAK,iBAAiB,yBAAyB,MAAM;AAEvE,UAAM,kBAA4B,CAAC;AACnC,QAAI,UAAU,SAAS,GAAG;AAExB,YAAM,UAAU,oBAAI,IAA8B;AAClD,iBAAW,OAAO,WAAW;AAC3B,cAAM,MAAM,IAAI,SAAS,YAAY;AACrC,YAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACrB,kBAAQ,IAAI,KAAK,CAAC,CAAC;AAAA,QACrB;AACA,gBAAQ,IAAI,GAAG,EAAG,KAAK,GAAG;AAAA,MAC5B;AAGA,iBAAW,CAAC,UAAU,KAAK,KAAK,SAAS;AACvC,YAAI,MAAM,SAAS,GAAG;AACpB,gBAAM,mBACJ,MAAM,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,iBAAiB,IAAI,CAAC,IACxD,MAAM;AACR,0BAAgB;AAAA,YACd,GAAG,MAAM,MAAM,8BAA8B,QAAQ,mCAAmC,mBAAmB,KAAK,QAAQ,CAAC,CAAC;AAAA,UAC5H;AAAA,QACF;AAAA,MACF;AAGA,YAAM,OAAO,UAAU;AAAA,QACrB,CAAC,GAAG,OAAQ,EAAE,iBAAiB,MAAM,EAAE,iBAAiB,KAAK,IAAI;AAAA,QACjE,UAAU,CAAC;AAAA,MACb;AACA,UAAI,QAAQ,KAAK,iBAAiB,KAAK,gBAAgB,KAAK;AAC1D,wBAAgB;AAAA,UACd,yCAAyC,KAAK,OAAO,OAAO,KAAK,gBAAgB,KAAK,QAAQ,CAAC,CAAC;AAAA,QAClG;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,UAAU,IAAI,CAAC,OAAO;AAAA,QAC/B,SAAS,EAAE;AAAA,QACX,UAAU,EAAE;AAAA,QACZ,eAAe,EAAE,iBAAiB;AAAA,MACpC,EAAE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBACE,WACA,QACA,QAKA;AACA,UAAM,OAAO,KAAK,eAAe;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAY,KAAK,iBAAiB,gBAAgB,QAAQ,MAAM;AAEtE,WAAO;AAAA,MACL,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO;AAAA,QAC5B,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,OAAO,EAAE,OAAO;AAAA,MAClB,EAAE;AAAA,MACF,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO;AAAA,QAC5B,QAAQ,EAAE;AAAA,QACV,QAAQ,EAAE;AAAA,QACV,MAAM,EAAE;AAAA,MACV,EAAE;AAAA,MACF,WAAW,UAAU,IAAI,CAAC,OAAO;AAAA,QAC/B,UAAU,EAAE;AAAA,QACZ,UAAU,EAAE;AAAA,QACZ,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAyB;AACpC,UAAM,UAAU,KAAK,eAAe,IAAI,SAAS;AACjD,QAAI,SAAS;AAEX,UAAI,QAAQ,eAAe;AACzB,aAAK,kBAAkB,OAAO,QAAQ,aAAa;AAAA,MACrD;AACA,WAAK,eAAe,OAAO,SAAS;AAEpC,aAAO,MAAM,mBAAmB,SAAS,EAAE;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA,EAIQ,uBACN,WACA,QACA,QACQ;AACR,UAAM,aAAa,YAAY,SAAS;AAGxC,SAAK,kBAAkB,IAAI,YAAY;AAAA,MACrC,QAAQ,KAAK,eAAe,MAAM;AAAA,MAClC,QAAQ,KAAK,eAAe,MAAM;AAAA,IACpC,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAA+B;AACpD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,MAC1C,QAAQ,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,IAC5C;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,WAAW,iBAAiB,GAAG;AACtC,WAAK,WAAW,cACd,KAAK,WAAW,oBAAoB,KAAK,WAAW;AAAA,IACxD;AAAA,EACF;AAAA,EAEQ,4BAA4B,SAAoC;AACtE,QAAI,QAAQ,eAAe,QAAQ,WAAW;AAC5C,YAAM,WAAW,QAAQ,cAAc,QAAQ;AAC/C,YAAM,oBAAoB,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,EAAE;AAAA,QACjE,CAAC,MAAM,EAAE;AAAA,MACX,EAAE;AAEF,UAAI,sBAAsB,GAAG;AAC3B,aAAK,WAAW,wBAAwB;AAAA,MAC1C,OAAO;AAEL,aAAK,WAAW,yBACb,KAAK,WAAW,yBAAyB,oBAAoB,KAC5D,YACF;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,232 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { spawn } from "child_process";
6
+ import {
7
+ loadModelRouterConfig,
8
+ buildModelEnv
9
+ } from "./model-router.js";
10
+ const DEFAULT_ERROR_PATTERNS = [
11
+ /rate.?limit/i,
12
+ /429/,
13
+ /too.?many.?requests/i,
14
+ /overloaded/i,
15
+ /capacity/i,
16
+ /temporarily.?unavailable/i,
17
+ /503/,
18
+ /502/,
19
+ /500/,
20
+ /internal.?server.?error/i,
21
+ /timeout/i,
22
+ /ETIMEDOUT/,
23
+ /ESOCKETTIMEDOUT/,
24
+ /ECONNRESET/,
25
+ /ECONNREFUSED/
26
+ ];
27
+ class FallbackMonitor {
28
+ config;
29
+ routerConfig = loadModelRouterConfig();
30
+ currentProvider = "anthropic";
31
+ restartCount = 0;
32
+ inFallback = false;
33
+ errorBuffer = "";
34
+ lastErrorTime = 0;
35
+ errorCount = 0;
36
+ constructor(config = {}) {
37
+ this.config = {
38
+ enabled: true,
39
+ maxRestarts: 3,
40
+ restartDelayMs: 2e3,
41
+ errorPatterns: DEFAULT_ERROR_PATTERNS,
42
+ ...config
43
+ };
44
+ }
45
+ /**
46
+ * Check if text contains error patterns that should trigger fallback
47
+ */
48
+ detectError(text) {
49
+ for (const pattern of this.config.errorPatterns) {
50
+ if (pattern.test(text)) {
51
+ return {
52
+ shouldFallback: true,
53
+ reason: pattern.source
54
+ };
55
+ }
56
+ }
57
+ return { shouldFallback: false, reason: "" };
58
+ }
59
+ /**
60
+ * Get environment variables for fallback provider
61
+ */
62
+ getFallbackEnv() {
63
+ const fallbackProvider = this.routerConfig.fallback?.provider || "qwen";
64
+ const providerConfig = this.routerConfig.providers[fallbackProvider];
65
+ if (!providerConfig) {
66
+ console.error(`[fallback] Provider not configured: ${fallbackProvider}`);
67
+ return {};
68
+ }
69
+ return buildModelEnv(providerConfig);
70
+ }
71
+ /**
72
+ * Check if fallback is available (has API key)
73
+ */
74
+ isFallbackAvailable() {
75
+ const fallbackProvider = this.routerConfig.fallback?.provider || "qwen";
76
+ const providerConfig = this.routerConfig.providers[fallbackProvider];
77
+ if (!providerConfig) return false;
78
+ return !!process.env[providerConfig.apiKeyEnv];
79
+ }
80
+ /**
81
+ * Wrap a Claude process with fallback monitoring
82
+ * Returns a function to spawn the process with automatic restart on failure
83
+ */
84
+ wrapProcess(command, args, options = {}) {
85
+ let currentProcess = null;
86
+ let stopped = false;
87
+ const startProcess = () => {
88
+ const env = { ...process.env, ...options.env };
89
+ if (this.inFallback) {
90
+ const fallbackEnv = this.getFallbackEnv();
91
+ Object.assign(env, fallbackEnv);
92
+ this.currentProvider = this.routerConfig.fallback?.provider || "qwen";
93
+ }
94
+ const isTTY = process.stdout.isTTY;
95
+ currentProcess = spawn(command, args, {
96
+ stdio: isTTY ? "inherit" : ["inherit", "pipe", "pipe"],
97
+ env,
98
+ cwd: options.cwd
99
+ });
100
+ if (!isTTY) {
101
+ currentProcess.stdout?.on("data", (data) => {
102
+ const text = data.toString();
103
+ process.stdout.write(data);
104
+ this.checkForErrors(text);
105
+ });
106
+ currentProcess.stderr?.on("data", (data) => {
107
+ const text = data.toString();
108
+ process.stderr.write(data);
109
+ this.checkForErrors(text);
110
+ });
111
+ }
112
+ currentProcess.on("exit", (code, _signal) => {
113
+ if (stopped) return;
114
+ if (code !== 0 && this.shouldRestart()) {
115
+ console.log(
116
+ `
117
+ [fallback] Process exited with code ${code}, restarting with fallback...`
118
+ );
119
+ this.activateFallback("exit_code");
120
+ setTimeout(() => {
121
+ if (!stopped) {
122
+ startProcess();
123
+ }
124
+ }, this.config.restartDelayMs);
125
+ }
126
+ });
127
+ return currentProcess;
128
+ };
129
+ return {
130
+ start: startProcess,
131
+ stop: () => {
132
+ stopped = true;
133
+ currentProcess?.kill();
134
+ },
135
+ isInFallback: () => this.inFallback,
136
+ getCurrentProvider: () => this.currentProvider
137
+ };
138
+ }
139
+ /**
140
+ * Check output text for errors and trigger fallback if needed
141
+ */
142
+ checkForErrors(text) {
143
+ this.errorBuffer += text;
144
+ if (this.errorBuffer.length > 1e4) {
145
+ this.errorBuffer = this.errorBuffer.slice(-5e3);
146
+ }
147
+ const { shouldFallback, reason } = this.detectError(text);
148
+ if (shouldFallback) {
149
+ const now = Date.now();
150
+ if (now - this.lastErrorTime < 1e3) {
151
+ this.errorCount++;
152
+ } else {
153
+ this.errorCount = 1;
154
+ }
155
+ this.lastErrorTime = now;
156
+ if (this.errorCount >= 2 && !this.inFallback && this.isFallbackAvailable()) {
157
+ console.log(`
158
+ [fallback] Detected error pattern: ${reason}`);
159
+ this.activateFallback(reason);
160
+ }
161
+ }
162
+ }
163
+ /**
164
+ * Activate fallback mode
165
+ */
166
+ activateFallback(reason) {
167
+ if (this.inFallback) return;
168
+ this.inFallback = true;
169
+ this.restartCount++;
170
+ this.currentProvider = this.routerConfig.fallback?.provider || "qwen";
171
+ console.log(
172
+ `[fallback] Switching to ${this.currentProvider} (reason: ${reason})`
173
+ );
174
+ if (this.config.onFallback) {
175
+ this.config.onFallback(this.currentProvider, reason);
176
+ }
177
+ }
178
+ /**
179
+ * Check if we should restart
180
+ */
181
+ shouldRestart() {
182
+ return this.config.enabled && this.restartCount < this.config.maxRestarts && this.isFallbackAvailable();
183
+ }
184
+ /**
185
+ * Reset fallback state
186
+ */
187
+ reset() {
188
+ this.inFallback = false;
189
+ this.restartCount = 0;
190
+ this.errorCount = 0;
191
+ this.errorBuffer = "";
192
+ this.currentProvider = "anthropic";
193
+ }
194
+ /**
195
+ * Get current status
196
+ */
197
+ getStatus() {
198
+ return {
199
+ inFallback: this.inFallback,
200
+ currentProvider: this.currentProvider,
201
+ restartCount: this.restartCount,
202
+ fallbackAvailable: this.isFallbackAvailable()
203
+ };
204
+ }
205
+ }
206
+ function spawnWithFallback(command, args, options = {}) {
207
+ const monitor = new FallbackMonitor({
208
+ onFallback: options.onFallback
209
+ });
210
+ const wrapper = monitor.wrapProcess(command, args, options);
211
+ return wrapper.start();
212
+ }
213
+ function getEnvWithFallback() {
214
+ const config = loadModelRouterConfig();
215
+ const env = {};
216
+ if (config.fallback?.enabled) {
217
+ const fallbackProvider = config.providers[config.fallback.provider];
218
+ if (fallbackProvider) {
219
+ env["STACKMEMORY_FALLBACK_PROVIDER"] = config.fallback.provider;
220
+ env["STACKMEMORY_FALLBACK_MODEL"] = fallbackProvider.model;
221
+ env["STACKMEMORY_FALLBACK_URL"] = fallbackProvider.baseUrl || "";
222
+ env["STACKMEMORY_FALLBACK_KEY_ENV"] = fallbackProvider.apiKeyEnv;
223
+ }
224
+ }
225
+ return env;
226
+ }
227
+ export {
228
+ FallbackMonitor,
229
+ getEnvWithFallback,
230
+ spawnWithFallback
231
+ };
232
+ //# sourceMappingURL=fallback-monitor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/models/fallback-monitor.ts"],
4
+ "sourcesContent": ["/**\n * Fallback Monitor - Watches Claude output for errors and triggers automatic fallback\n * Restarts session with Qwen when Claude fails\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport {\n loadModelRouterConfig,\n buildModelEnv,\n type ModelProvider,\n} from './model-router.js';\n\nexport interface FallbackMonitorConfig {\n enabled: boolean;\n maxRestarts: number;\n restartDelayMs: number;\n errorPatterns: RegExp[];\n onFallback?: (provider: ModelProvider, reason: string) => void;\n onRestore?: (provider: ModelProvider) => void;\n}\n\nconst DEFAULT_ERROR_PATTERNS = [\n /rate.?limit/i,\n /429/,\n /too.?many.?requests/i,\n /overloaded/i,\n /capacity/i,\n /temporarily.?unavailable/i,\n /503/,\n /502/,\n /500/,\n /internal.?server.?error/i,\n /timeout/i,\n /ETIMEDOUT/,\n /ESOCKETTIMEDOUT/,\n /ECONNRESET/,\n /ECONNREFUSED/,\n];\n\n/**\n * FallbackMonitor watches a Claude process and restarts with fallback on errors\n */\nexport class FallbackMonitor {\n private config: FallbackMonitorConfig;\n private routerConfig = loadModelRouterConfig();\n private currentProvider: ModelProvider = 'anthropic';\n private restartCount = 0;\n private inFallback = false;\n private errorBuffer = '';\n private lastErrorTime = 0;\n private errorCount = 0;\n\n constructor(config: Partial<FallbackMonitorConfig> = {}) {\n this.config = {\n enabled: true,\n maxRestarts: 3,\n restartDelayMs: 2000,\n errorPatterns: DEFAULT_ERROR_PATTERNS,\n ...config,\n };\n }\n\n /**\n * Check if text contains error patterns that should trigger fallback\n */\n detectError(text: string): { shouldFallback: boolean; reason: string } {\n for (const pattern of this.config.errorPatterns) {\n if (pattern.test(text)) {\n return {\n shouldFallback: true,\n reason: pattern.source,\n };\n }\n }\n return { shouldFallback: false, reason: '' };\n }\n\n /**\n * Get environment variables for fallback provider\n */\n getFallbackEnv(): Record<string, string> {\n const fallbackProvider = this.routerConfig.fallback?.provider || 'qwen';\n const providerConfig = this.routerConfig.providers[fallbackProvider];\n\n if (!providerConfig) {\n console.error(`[fallback] Provider not configured: ${fallbackProvider}`);\n return {};\n }\n\n return buildModelEnv(providerConfig);\n }\n\n /**\n * Check if fallback is available (has API key)\n */\n isFallbackAvailable(): boolean {\n const fallbackProvider = this.routerConfig.fallback?.provider || 'qwen';\n const providerConfig = this.routerConfig.providers[fallbackProvider];\n\n if (!providerConfig) return false;\n\n return !!process.env[providerConfig.apiKeyEnv];\n }\n\n /**\n * Wrap a Claude process with fallback monitoring\n * Returns a function to spawn the process with automatic restart on failure\n */\n wrapProcess(\n command: string,\n args: string[],\n options: { env?: NodeJS.ProcessEnv; cwd?: string } = {}\n ): {\n start: () => ChildProcess;\n stop: () => void;\n isInFallback: () => boolean;\n getCurrentProvider: () => ModelProvider;\n } {\n let currentProcess: ChildProcess | null = null;\n let stopped = false;\n\n const startProcess = (): ChildProcess => {\n const env = { ...process.env, ...options.env };\n\n // Apply fallback env if in fallback mode\n if (this.inFallback) {\n const fallbackEnv = this.getFallbackEnv();\n Object.assign(env, fallbackEnv);\n this.currentProvider = this.routerConfig.fallback?.provider || 'qwen';\n }\n\n // Use 'inherit' for TTY to preserve interactive mode\n // Claude CLI checks stdout TTY to decide interactive vs print mode\n const isTTY = process.stdout.isTTY;\n\n currentProcess = spawn(command, args, {\n stdio: isTTY ? 'inherit' : ['inherit', 'pipe', 'pipe'],\n env,\n cwd: options.cwd,\n });\n\n // Only monitor output in non-TTY mode (fallback detection still works via exit code)\n if (!isTTY) {\n // Monitor stdout\n currentProcess.stdout?.on('data', (data: Buffer) => {\n const text = data.toString();\n process.stdout.write(data);\n this.checkForErrors(text);\n });\n\n // Monitor stderr\n currentProcess.stderr?.on('data', (data: Buffer) => {\n const text = data.toString();\n process.stderr.write(data);\n this.checkForErrors(text);\n });\n }\n\n // Handle exit\n currentProcess.on('exit', (code, _signal) => {\n if (stopped) return;\n\n // Check if we should restart with fallback\n if (code !== 0 && this.shouldRestart()) {\n console.log(\n `\\n[fallback] Process exited with code ${code}, restarting with fallback...`\n );\n this.activateFallback('exit_code');\n setTimeout(() => {\n if (!stopped) {\n startProcess();\n }\n }, this.config.restartDelayMs);\n }\n });\n\n return currentProcess;\n };\n\n return {\n start: startProcess,\n stop: () => {\n stopped = true;\n currentProcess?.kill();\n },\n isInFallback: () => this.inFallback,\n getCurrentProvider: () => this.currentProvider,\n };\n }\n\n /**\n * Check output text for errors and trigger fallback if needed\n */\n private checkForErrors(text: string): void {\n this.errorBuffer += text;\n\n // Keep buffer manageable\n if (this.errorBuffer.length > 10000) {\n this.errorBuffer = this.errorBuffer.slice(-5000);\n }\n\n const { shouldFallback, reason } = this.detectError(text);\n\n if (shouldFallback) {\n const now = Date.now();\n\n // Debounce rapid errors\n if (now - this.lastErrorTime < 1000) {\n this.errorCount++;\n } else {\n this.errorCount = 1;\n }\n this.lastErrorTime = now;\n\n // Trigger fallback after multiple rapid errors\n if (\n this.errorCount >= 2 &&\n !this.inFallback &&\n this.isFallbackAvailable()\n ) {\n console.log(`\\n[fallback] Detected error pattern: ${reason}`);\n this.activateFallback(reason);\n }\n }\n }\n\n /**\n * Activate fallback mode\n */\n private activateFallback(reason: string): void {\n if (this.inFallback) return;\n\n this.inFallback = true;\n this.restartCount++;\n this.currentProvider = this.routerConfig.fallback?.provider || 'qwen';\n\n console.log(\n `[fallback] Switching to ${this.currentProvider} (reason: ${reason})`\n );\n\n if (this.config.onFallback) {\n this.config.onFallback(this.currentProvider, reason);\n }\n }\n\n /**\n * Check if we should restart\n */\n private shouldRestart(): boolean {\n return (\n this.config.enabled &&\n this.restartCount < this.config.maxRestarts &&\n this.isFallbackAvailable()\n );\n }\n\n /**\n * Reset fallback state\n */\n reset(): void {\n this.inFallback = false;\n this.restartCount = 0;\n this.errorCount = 0;\n this.errorBuffer = '';\n this.currentProvider = 'anthropic';\n }\n\n /**\n * Get current status\n */\n getStatus(): {\n inFallback: boolean;\n currentProvider: ModelProvider;\n restartCount: number;\n fallbackAvailable: boolean;\n } {\n return {\n inFallback: this.inFallback,\n currentProvider: this.currentProvider,\n restartCount: this.restartCount,\n fallbackAvailable: this.isFallbackAvailable(),\n };\n }\n}\n\n/**\n * Create a simple fallback-aware spawn function\n */\nexport function spawnWithFallback(\n command: string,\n args: string[],\n options: {\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n onFallback?: (provider: ModelProvider, reason: string) => void;\n } = {}\n): ChildProcess {\n const monitor = new FallbackMonitor({\n onFallback: options.onFallback,\n });\n\n const wrapper = monitor.wrapProcess(command, args, options);\n return wrapper.start();\n}\n\n/**\n * Quick helper to get env vars with fallback pre-configured\n */\nexport function getEnvWithFallback(): Record<string, string> {\n const config = loadModelRouterConfig();\n const env: Record<string, string> = {};\n\n // Set fallback provider info for error recovery\n if (config.fallback?.enabled) {\n const fallbackProvider = config.providers[config.fallback.provider];\n if (fallbackProvider) {\n env['STACKMEMORY_FALLBACK_PROVIDER'] = config.fallback.provider;\n env['STACKMEMORY_FALLBACK_MODEL'] = fallbackProvider.model;\n env['STACKMEMORY_FALLBACK_URL'] = fallbackProvider.baseUrl || '';\n env['STACKMEMORY_FALLBACK_KEY_ENV'] = fallbackProvider.apiKeyEnv;\n }\n }\n\n return env;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }