@stackmemoryai/stackmemory 0.8.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (788) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +15 -3
  3. package/dist/src/agents/core/agent-task-manager.js +0 -1
  4. package/dist/src/agents/verifiers/base-verifier.js +0 -1
  5. package/dist/src/agents/verifiers/formatter-verifier.js +0 -1
  6. package/dist/src/agents/verifiers/llm-judge.js +0 -1
  7. package/dist/src/cli/auto-detect.js +0 -1
  8. package/dist/src/cli/claude-sm-danger.js +0 -1
  9. package/dist/src/cli/claude-sm.js +0 -1
  10. package/dist/src/cli/codex-sm-danger.js +0 -1
  11. package/dist/src/cli/codex-sm.js +0 -1
  12. package/dist/src/cli/commands/api.js +0 -1
  13. package/dist/src/cli/commands/auto-background.js +0 -1
  14. package/dist/src/cli/commands/cleanup-processes.js +0 -1
  15. package/dist/src/cli/commands/clear.js +0 -1
  16. package/dist/src/cli/commands/config.js +0 -1
  17. package/dist/src/cli/commands/context-rehydrate.js +0 -1
  18. package/dist/src/cli/commands/context.js +0 -1
  19. package/dist/src/cli/commands/daemon.js +0 -1
  20. package/dist/src/cli/commands/dashboard.js +4 -5
  21. package/dist/src/cli/commands/db.js +0 -1
  22. package/dist/src/cli/commands/decision.js +0 -1
  23. package/dist/src/cli/commands/discovery.js +0 -1
  24. package/dist/src/cli/commands/handoff.js +0 -1
  25. package/dist/src/cli/commands/hooks.js +0 -1
  26. package/dist/src/cli/commands/linear.js +0 -1
  27. package/dist/src/cli/commands/log.js +0 -1
  28. package/dist/src/cli/commands/login.js +0 -1
  29. package/dist/src/cli/commands/migrate.js +0 -1
  30. package/dist/src/cli/commands/model.js +0 -1
  31. package/dist/src/cli/commands/onboard.js +0 -1
  32. package/dist/src/cli/commands/ping.js +0 -1
  33. package/dist/src/cli/commands/projects.js +0 -1
  34. package/dist/src/cli/commands/ralph.js +0 -1
  35. package/dist/src/cli/commands/retrieval.js +0 -1
  36. package/dist/src/cli/commands/search.js +0 -1
  37. package/dist/src/cli/commands/service.js +0 -1
  38. package/dist/src/cli/commands/session.js +0 -1
  39. package/dist/src/cli/commands/setup.js +0 -4
  40. package/dist/src/cli/commands/shell.js +0 -1
  41. package/dist/src/cli/commands/signup.js +0 -1
  42. package/dist/src/cli/commands/skills.js +4 -3
  43. package/dist/src/cli/commands/storage-tier.js +0 -1
  44. package/dist/src/cli/commands/sweep.js +0 -1
  45. package/dist/src/cli/commands/tasks.js +0 -1
  46. package/dist/src/cli/commands/worktree.js +10 -5
  47. package/dist/src/cli/index.js +8 -5
  48. package/dist/src/cli/opencode-sm.js +0 -1
  49. package/dist/src/cli/utils/viewer.js +0 -1
  50. package/dist/src/core/config/config-manager.js +0 -1
  51. package/dist/src/core/config/feature-flags.js +0 -1
  52. package/dist/src/core/config/storage-config.js +0 -1
  53. package/dist/src/core/config/types.js +0 -1
  54. package/dist/src/core/context/auto-context.js +0 -1
  55. package/dist/src/core/context/dual-stack-manager.js +0 -1
  56. package/dist/src/core/context/enhanced-rehydration.js +0 -2
  57. package/dist/src/core/context/frame-database.js +60 -6
  58. package/dist/src/core/context/frame-digest.js +0 -1
  59. package/dist/src/core/context/frame-handoff-manager.js +0 -1
  60. package/dist/src/core/context/frame-lifecycle-hooks.js +0 -1
  61. package/dist/src/core/context/frame-recovery.js +0 -1
  62. package/dist/src/core/context/frame-stack.js +0 -1
  63. package/dist/src/core/context/frame-types.js +0 -1
  64. package/dist/src/core/context/index.js +0 -1
  65. package/dist/src/core/context/permission-manager.js +0 -1
  66. package/dist/src/core/context/recursive-context-manager.js +3 -2
  67. package/dist/src/core/context/refactored-frame-manager.js +0 -1
  68. package/dist/src/core/context/shared-context-layer.js +0 -1
  69. package/dist/src/core/context/stack-merge-resolver.js +0 -1
  70. package/dist/src/core/context/validation.js +0 -1
  71. package/dist/src/core/database/batch-operations.js +0 -1
  72. package/dist/src/core/database/connection-pool.js +0 -1
  73. package/dist/src/core/database/database-adapter.js +0 -1
  74. package/dist/src/core/database/embedding-provider-factory.js +0 -1
  75. package/dist/src/core/database/embedding-provider.js +0 -1
  76. package/dist/src/core/database/migration-manager.js +0 -1
  77. package/dist/src/core/database/ollama-embedding-provider.js +0 -1
  78. package/dist/src/core/database/openai-embedding-provider.js +0 -1
  79. package/dist/src/core/database/query-cache.js +0 -1
  80. package/dist/src/core/database/query-router.js +0 -1
  81. package/dist/src/core/database/sqlite-adapter.js +18 -108
  82. package/dist/src/core/database/transformers-embedding-provider.js +0 -1
  83. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -1
  84. package/dist/src/core/digest/frame-digest-integration.js +0 -1
  85. package/dist/src/core/digest/hybrid-digest-generator.js +0 -1
  86. package/dist/src/core/digest/index.js +0 -1
  87. package/dist/src/core/digest/types.js +0 -1
  88. package/dist/src/core/errors/error-utils.js +0 -1
  89. package/dist/src/core/errors/index.js +0 -1
  90. package/dist/src/core/errors/recovery.js +0 -1
  91. package/dist/src/core/execution/parallel-executor.js +0 -1
  92. package/dist/src/core/extensions/custom-tools.js +0 -1
  93. package/dist/src/core/extensions/index.js +0 -1
  94. package/dist/src/core/extensions/loader.js +0 -1
  95. package/dist/src/core/extensions/plugin-system.js +0 -1
  96. package/dist/src/core/extensions/provider-adapter.js +0 -1
  97. package/dist/src/core/extensions/sandbox-runtime.js +0 -1
  98. package/dist/src/core/extensions/types.js +0 -1
  99. package/dist/src/core/frame/workflow-templates.js +0 -1
  100. package/dist/src/core/merge/conflict-detector.js +0 -1
  101. package/dist/src/core/merge/index.js +0 -1
  102. package/dist/src/core/merge/resolution-engine.js +0 -1
  103. package/dist/src/core/merge/stack-diff.js +0 -1
  104. package/dist/src/core/merge/types.js +0 -1
  105. package/dist/src/core/merge/unified-merge-resolver.js +0 -1
  106. package/dist/src/core/models/fallback-monitor.js +0 -1
  107. package/dist/src/core/models/model-router.js +0 -1
  108. package/dist/src/core/monitoring/error-handler.js +0 -1
  109. package/dist/src/core/monitoring/logger.js +0 -1
  110. package/dist/src/core/monitoring/metrics.js +0 -1
  111. package/dist/src/core/monitoring/progress-tracker.js +0 -1
  112. package/dist/src/core/monitoring/session-monitor.js +0 -1
  113. package/dist/src/core/performance/context-cache.js +0 -1
  114. package/dist/src/core/performance/index.js +0 -1
  115. package/dist/src/core/performance/lazy-context-loader.js +3 -8
  116. package/dist/src/core/performance/monitor.js +0 -1
  117. package/dist/src/core/performance/optimized-frame-context.js +0 -1
  118. package/dist/src/core/performance/performance-benchmark.js +0 -1
  119. package/dist/src/core/performance/performance-profiler.js +0 -1
  120. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -1
  121. package/dist/src/core/persistence/postgres-adapter.js +0 -1
  122. package/dist/src/core/projects/project-isolation.js +0 -1
  123. package/dist/src/core/projects/project-manager.js +0 -1
  124. package/dist/src/core/query/query-parser.js +0 -1
  125. package/dist/src/core/query/query-templates.js +0 -1
  126. package/dist/src/core/retrieval/context-retriever.js +0 -1
  127. package/dist/src/core/retrieval/index.js +0 -1
  128. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -1
  129. package/dist/src/core/retrieval/llm-provider.js +0 -1
  130. package/dist/src/core/retrieval/privacy-filter.js +0 -1
  131. package/dist/src/core/retrieval/retrieval-audit.js +0 -1
  132. package/dist/src/core/retrieval/summary-generator.js +15 -6
  133. package/dist/src/core/retrieval/types.js +0 -1
  134. package/dist/src/core/retrieval/unified-context-assembler.js +0 -1
  135. package/dist/src/core/security/index.js +0 -1
  136. package/dist/src/core/security/input-sanitizer.js +0 -1
  137. package/dist/src/core/session/clear-survival.js +0 -1
  138. package/dist/src/core/session/enhanced-handoff.js +0 -1
  139. package/dist/src/core/session/handoff-generator.js +0 -1
  140. package/dist/src/core/session/index.js +0 -1
  141. package/dist/src/core/session/session-manager.js +0 -1
  142. package/dist/src/core/skills/index.js +0 -1
  143. package/dist/src/core/skills/skill-storage.js +0 -1
  144. package/dist/src/core/skills/types.js +0 -1
  145. package/dist/src/core/storage/chromadb-adapter.js +0 -1
  146. package/dist/src/core/storage/infinite-storage.js +0 -1
  147. package/dist/src/core/storage/project-registry.js +0 -1
  148. package/dist/src/core/storage/remote-storage.js +4 -2
  149. package/dist/src/core/storage/storage-tier-manager.js +0 -1
  150. package/dist/src/core/storage/two-tier-storage.js +0 -1
  151. package/dist/src/core/trace/cli-trace-wrapper.js +0 -1
  152. package/dist/src/core/trace/db-trace-wrapper.js +0 -1
  153. package/dist/src/core/trace/debug-trace.js +0 -1
  154. package/dist/src/core/trace/index.js +0 -1
  155. package/dist/src/core/trace/linear-api-wrapper.js +0 -1
  156. package/dist/src/core/trace/trace-detector.js +0 -1
  157. package/dist/src/core/trace/trace-store.js +4 -5
  158. package/dist/src/core/trace/types.js +0 -1
  159. package/dist/src/core/types.js +0 -1
  160. package/dist/src/core/utils/async-mutex.js +0 -1
  161. package/dist/src/core/utils/compression.js +0 -1
  162. package/dist/src/core/utils/update-checker.js +0 -1
  163. package/dist/src/core/worktree/worktree-manager.js +0 -1
  164. package/dist/src/daemon/daemon-config.js +0 -1
  165. package/dist/src/daemon/services/context-service.js +0 -1
  166. package/dist/src/daemon/services/linear-service.js +0 -1
  167. package/dist/src/daemon/services/maintenance-service.js +0 -1
  168. package/dist/src/daemon/services/memory-service.js +0 -1
  169. package/dist/src/daemon/session-daemon.js +0 -1
  170. package/dist/src/daemon/unified-daemon.js +0 -1
  171. package/dist/src/features/analytics/api/analytics-api.js +0 -1
  172. package/dist/src/features/analytics/core/analytics-service.js +1 -2
  173. package/dist/src/features/analytics/index.js +0 -1
  174. package/dist/src/features/analytics/queries/metrics-queries.js +8 -9
  175. package/dist/src/features/analytics/types/metrics.js +0 -1
  176. package/dist/src/features/browser/browser-mcp.js +0 -1
  177. package/dist/src/features/sweep/index.js +0 -1
  178. package/dist/src/features/sweep/prediction-client.js +0 -1
  179. package/dist/src/features/sweep/prompt-builder.js +0 -1
  180. package/dist/src/features/sweep/pty-wrapper.js +0 -1
  181. package/dist/src/features/sweep/state-watcher.js +0 -1
  182. package/dist/src/features/sweep/status-bar.js +0 -1
  183. package/dist/src/features/sweep/sweep-server-manager.js +0 -1
  184. package/dist/src/features/sweep/tab-interceptor.js +0 -1
  185. package/dist/src/features/sweep/types.js +0 -1
  186. package/dist/src/features/tasks/linear-task-manager.js +0 -1
  187. package/dist/src/features/tasks/task-aware-context.js +0 -1
  188. package/dist/src/features/tui/simple-monitor.js +0 -1
  189. package/dist/src/features/tui/swarm-monitor.js +0 -1
  190. package/dist/src/features/web/client/stores/task-store.js +0 -1
  191. package/dist/src/features/web/server/index.js +0 -1
  192. package/dist/src/features/workers/tmux-manager.js +0 -1
  193. package/dist/src/features/workers/worker-registry.js +0 -1
  194. package/dist/src/hooks/auto-background.js +0 -1
  195. package/dist/src/hooks/config.js +0 -1
  196. package/dist/src/hooks/daemon.js +0 -1
  197. package/dist/src/hooks/diffmem-hooks.js +0 -1
  198. package/dist/src/hooks/events.js +0 -1
  199. package/dist/src/hooks/index.js +0 -1
  200. package/dist/src/hooks/linear-task-picker.js +0 -1
  201. package/dist/src/hooks/schemas.js +0 -1
  202. package/dist/src/hooks/secure-fs.js +0 -1
  203. package/dist/src/hooks/security-logger.js +0 -1
  204. package/dist/src/hooks/session-summary.js +0 -1
  205. package/dist/src/index.js +0 -1
  206. package/dist/src/integrations/anthropic/client.js +0 -1
  207. package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
  208. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
  209. package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
  210. package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
  211. package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
  212. package/dist/src/integrations/claude-code/subagent-client.js +0 -1
  213. package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
  214. package/dist/src/integrations/diffmem/client.js +0 -1
  215. package/dist/src/integrations/diffmem/config.js +0 -1
  216. package/dist/src/integrations/diffmem/index.js +0 -1
  217. package/dist/src/integrations/diffmem/types.js +0 -1
  218. package/dist/src/integrations/linear/auth.js +0 -1
  219. package/dist/src/integrations/linear/auto-sync.js +0 -1
  220. package/dist/src/integrations/linear/client.js +0 -1
  221. package/dist/src/integrations/linear/config.js +0 -1
  222. package/dist/src/integrations/linear/migration.js +0 -1
  223. package/dist/src/integrations/linear/oauth-server.js +0 -1
  224. package/dist/src/integrations/linear/rest-client.js +0 -1
  225. package/dist/src/integrations/linear/sync-manager.js +0 -1
  226. package/dist/src/integrations/linear/sync-service.js +0 -1
  227. package/dist/src/integrations/linear/sync.js +0 -1
  228. package/dist/src/integrations/linear/types.js +0 -1
  229. package/dist/src/integrations/linear/unified-sync.js +0 -1
  230. package/dist/src/integrations/linear/webhook-handler.js +0 -1
  231. package/dist/src/integrations/linear/webhook-server.js +0 -1
  232. package/dist/src/integrations/linear/webhook.js +0 -1
  233. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
  234. package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
  235. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
  236. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
  237. package/dist/src/integrations/mcp/handlers/index.js +1 -3
  238. package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
  239. package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
  240. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
  241. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
  242. package/dist/src/integrations/mcp/index.js +0 -1
  243. package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
  244. package/dist/src/integrations/mcp/pending-utils.js +0 -1
  245. package/dist/src/integrations/mcp/refactored-server.js +0 -1
  246. package/dist/src/integrations/mcp/remote-server.js +0 -1
  247. package/dist/src/integrations/mcp/schemas.js +0 -1
  248. package/dist/src/integrations/mcp/server.js +20 -24
  249. package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
  250. package/dist/src/integrations/mcp/tool-definitions.js +0 -1
  251. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
  252. package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
  253. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
  254. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
  255. package/dist/src/integrations/ralph/index.js +0 -1
  256. package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
  257. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
  258. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
  259. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
  260. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
  261. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
  262. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
  263. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
  264. package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
  265. package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
  266. package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
  267. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
  268. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
  269. package/dist/src/integrations/ralph/types.js +0 -1
  270. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
  271. package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
  272. package/dist/src/middleware/exponential-rate-limiter.js +0 -1
  273. package/dist/src/models/user.model.js +0 -1
  274. package/dist/src/orchestrators/multimodal/constants.js +0 -1
  275. package/dist/src/orchestrators/multimodal/harness.js +0 -1
  276. package/dist/src/orchestrators/multimodal/providers.js +0 -1
  277. package/dist/src/orchestrators/multimodal/types.js +0 -1
  278. package/dist/src/orchestrators/multimodal/utils.js +0 -1
  279. package/dist/src/servers/production/auth-middleware.js +0 -1
  280. package/dist/src/services/config-service.js +0 -1
  281. package/dist/src/services/context-service.js +0 -1
  282. package/dist/src/skills/api-discovery.js +0 -1
  283. package/dist/src/skills/api-skill.js +0 -1
  284. package/dist/src/skills/claude-skills.js +0 -1
  285. package/dist/src/skills/dashboard-launcher.js +0 -1
  286. package/dist/src/skills/linear-task-runner.js +0 -1
  287. package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
  288. package/dist/src/skills/repo-ingestion-skill.js +0 -1
  289. package/dist/src/skills/spec-generator-skill.js +0 -1
  290. package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
  291. package/dist/src/types/task.js +0 -1
  292. package/dist/src/utils/env.js +0 -1
  293. package/dist/src/utils/formatting.js +0 -1
  294. package/dist/src/utils/process-cleanup.js +0 -1
  295. package/package.json +32 -7
  296. package/dist/scripts/benchmark-performance.js +0 -48
  297. package/dist/scripts/benchmark-performance.js.map +0 -7
  298. package/dist/scripts/check-redis.js +0 -42
  299. package/dist/scripts/check-redis.js.map +0 -7
  300. package/dist/scripts/initialize.js +0 -183
  301. package/dist/scripts/initialize.js.map +0 -7
  302. package/dist/scripts/list-linear-tasks.js +0 -124
  303. package/dist/scripts/list-linear-tasks.js.map +0 -7
  304. package/dist/scripts/measure-handoff-impact.js +0 -340
  305. package/dist/scripts/measure-handoff-impact.js.map +0 -7
  306. package/dist/scripts/query-chromadb.js +0 -160
  307. package/dist/scripts/query-chromadb.js.map +0 -7
  308. package/dist/scripts/show-linear-summary.js +0 -119
  309. package/dist/scripts/show-linear-summary.js.map +0 -7
  310. package/dist/scripts/simple-swarm-demo.js +0 -90
  311. package/dist/scripts/simple-swarm-demo.js.map +0 -7
  312. package/dist/scripts/status.js +0 -155
  313. package/dist/scripts/status.js.map +0 -7
  314. package/dist/scripts/test-chromadb-sync.js +0 -192
  315. package/dist/scripts/test-chromadb-sync.js.map +0 -7
  316. package/dist/scripts/test-ralph-iteration-fix.js +0 -86
  317. package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
  318. package/dist/scripts/test-ralph-iterations.js +0 -121
  319. package/dist/scripts/test-ralph-iterations.js.map +0 -7
  320. package/dist/scripts/test-redis-storage.js +0 -389
  321. package/dist/scripts/test-redis-storage.js.map +0 -7
  322. package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
  323. package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
  324. package/dist/scripts/test-swarm-fixes.js +0 -125
  325. package/dist/scripts/test-swarm-fixes.js.map +0 -7
  326. package/dist/scripts/test-swarm-tui.js +0 -23
  327. package/dist/scripts/test-swarm-tui.js.map +0 -7
  328. package/dist/scripts/test-tui-shortcuts.js +0 -52
  329. package/dist/scripts/test-tui-shortcuts.js.map +0 -7
  330. package/dist/scripts/validate-tui-shortcuts.js +0 -60
  331. package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
  332. package/dist/src/agents/core/agent-task-manager.js.map +0 -7
  333. package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
  334. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
  335. package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
  336. package/dist/src/cli/auto-detect.js.map +0 -7
  337. package/dist/src/cli/claude-sm-danger.js.map +0 -7
  338. package/dist/src/cli/claude-sm.js.map +0 -7
  339. package/dist/src/cli/codex-sm-danger.js.map +0 -7
  340. package/dist/src/cli/codex-sm.js.map +0 -7
  341. package/dist/src/cli/commands/api.js.map +0 -7
  342. package/dist/src/cli/commands/auto-background.js.map +0 -7
  343. package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
  344. package/dist/src/cli/commands/clear.js.map +0 -7
  345. package/dist/src/cli/commands/config.js.map +0 -7
  346. package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
  347. package/dist/src/cli/commands/context.js.map +0 -7
  348. package/dist/src/cli/commands/daemon.js.map +0 -7
  349. package/dist/src/cli/commands/dashboard.js.map +0 -7
  350. package/dist/src/cli/commands/db.js.map +0 -7
  351. package/dist/src/cli/commands/decision.js.map +0 -7
  352. package/dist/src/cli/commands/discovery.js.map +0 -7
  353. package/dist/src/cli/commands/handoff.js.map +0 -7
  354. package/dist/src/cli/commands/hooks.js.map +0 -7
  355. package/dist/src/cli/commands/linear.js.map +0 -7
  356. package/dist/src/cli/commands/log.js.map +0 -7
  357. package/dist/src/cli/commands/login.js.map +0 -7
  358. package/dist/src/cli/commands/migrate.js.map +0 -7
  359. package/dist/src/cli/commands/model.js.map +0 -7
  360. package/dist/src/cli/commands/onboard.js.map +0 -7
  361. package/dist/src/cli/commands/ping.js.map +0 -7
  362. package/dist/src/cli/commands/projects.js.map +0 -7
  363. package/dist/src/cli/commands/ralph.js.map +0 -7
  364. package/dist/src/cli/commands/retrieval.js.map +0 -7
  365. package/dist/src/cli/commands/search.js.map +0 -7
  366. package/dist/src/cli/commands/service.js.map +0 -7
  367. package/dist/src/cli/commands/session.js.map +0 -7
  368. package/dist/src/cli/commands/settings.js +0 -306
  369. package/dist/src/cli/commands/settings.js.map +0 -7
  370. package/dist/src/cli/commands/setup.js.map +0 -7
  371. package/dist/src/cli/commands/shell.js.map +0 -7
  372. package/dist/src/cli/commands/signup.js.map +0 -7
  373. package/dist/src/cli/commands/skills.js.map +0 -7
  374. package/dist/src/cli/commands/sms-notify.js +0 -795
  375. package/dist/src/cli/commands/sms-notify.js.map +0 -7
  376. package/dist/src/cli/commands/storage-tier.js.map +0 -7
  377. package/dist/src/cli/commands/sweep.js.map +0 -7
  378. package/dist/src/cli/commands/tasks.js.map +0 -7
  379. package/dist/src/cli/commands/worktree.js.map +0 -7
  380. package/dist/src/cli/index.js.map +0 -7
  381. package/dist/src/cli/opencode-sm.js.map +0 -7
  382. package/dist/src/cli/utils/viewer.js.map +0 -7
  383. package/dist/src/core/config/config-manager.js.map +0 -7
  384. package/dist/src/core/config/feature-flags.js.map +0 -7
  385. package/dist/src/core/config/storage-config.js.map +0 -7
  386. package/dist/src/core/config/types.js.map +0 -7
  387. package/dist/src/core/context/auto-context.js.map +0 -7
  388. package/dist/src/core/context/dual-stack-manager.js.map +0 -7
  389. package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
  390. package/dist/src/core/context/frame-database.js.map +0 -7
  391. package/dist/src/core/context/frame-digest.js.map +0 -7
  392. package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
  393. package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
  394. package/dist/src/core/context/frame-recovery.js.map +0 -7
  395. package/dist/src/core/context/frame-stack.js.map +0 -7
  396. package/dist/src/core/context/frame-types.js.map +0 -7
  397. package/dist/src/core/context/index.js.map +0 -7
  398. package/dist/src/core/context/permission-manager.js.map +0 -7
  399. package/dist/src/core/context/recursive-context-manager.js.map +0 -7
  400. package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
  401. package/dist/src/core/context/shared-context-layer.js.map +0 -7
  402. package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
  403. package/dist/src/core/context/validation.js.map +0 -7
  404. package/dist/src/core/database/batch-operations.js.map +0 -7
  405. package/dist/src/core/database/connection-pool.js.map +0 -7
  406. package/dist/src/core/database/database-adapter.js.map +0 -7
  407. package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
  408. package/dist/src/core/database/embedding-provider.js.map +0 -7
  409. package/dist/src/core/database/migration-manager.js.map +0 -7
  410. package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
  411. package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
  412. package/dist/src/core/database/query-cache.js.map +0 -7
  413. package/dist/src/core/database/query-router.js.map +0 -7
  414. package/dist/src/core/database/sqlite-adapter.js.map +0 -7
  415. package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
  416. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
  417. package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
  418. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
  419. package/dist/src/core/digest/index.js.map +0 -7
  420. package/dist/src/core/digest/types.js.map +0 -7
  421. package/dist/src/core/errors/error-utils.js.map +0 -7
  422. package/dist/src/core/errors/index.js.map +0 -7
  423. package/dist/src/core/errors/recovery.js.map +0 -7
  424. package/dist/src/core/execution/parallel-executor.js.map +0 -7
  425. package/dist/src/core/extensions/custom-tools.js.map +0 -7
  426. package/dist/src/core/extensions/index.js.map +0 -7
  427. package/dist/src/core/extensions/loader.js.map +0 -7
  428. package/dist/src/core/extensions/plugin-system.js.map +0 -7
  429. package/dist/src/core/extensions/provider-adapter.js.map +0 -7
  430. package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
  431. package/dist/src/core/extensions/types.js.map +0 -7
  432. package/dist/src/core/frame/workflow-templates.js.map +0 -7
  433. package/dist/src/core/merge/conflict-detector.js.map +0 -7
  434. package/dist/src/core/merge/index.js.map +0 -7
  435. package/dist/src/core/merge/resolution-engine.js.map +0 -7
  436. package/dist/src/core/merge/stack-diff.js.map +0 -7
  437. package/dist/src/core/merge/types.js.map +0 -7
  438. package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
  439. package/dist/src/core/models/fallback-monitor.js.map +0 -7
  440. package/dist/src/core/models/model-router.js.map +0 -7
  441. package/dist/src/core/monitoring/error-handler.js.map +0 -7
  442. package/dist/src/core/monitoring/logger.js.map +0 -7
  443. package/dist/src/core/monitoring/metrics.js.map +0 -7
  444. package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
  445. package/dist/src/core/monitoring/session-monitor.js.map +0 -7
  446. package/dist/src/core/performance/context-cache.js.map +0 -7
  447. package/dist/src/core/performance/index.js.map +0 -7
  448. package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
  449. package/dist/src/core/performance/monitor.js.map +0 -7
  450. package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
  451. package/dist/src/core/performance/performance-benchmark.js.map +0 -7
  452. package/dist/src/core/performance/performance-profiler.js.map +0 -7
  453. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
  454. package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
  455. package/dist/src/core/projects/project-isolation.js.map +0 -7
  456. package/dist/src/core/projects/project-manager.js.map +0 -7
  457. package/dist/src/core/query/query-parser.js.map +0 -7
  458. package/dist/src/core/query/query-templates.js.map +0 -7
  459. package/dist/src/core/retrieval/context-retriever.js.map +0 -7
  460. package/dist/src/core/retrieval/index.js.map +0 -7
  461. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
  462. package/dist/src/core/retrieval/llm-provider.js.map +0 -7
  463. package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
  464. package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
  465. package/dist/src/core/retrieval/summary-generator.js.map +0 -7
  466. package/dist/src/core/retrieval/types.js.map +0 -7
  467. package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
  468. package/dist/src/core/security/index.js.map +0 -7
  469. package/dist/src/core/security/input-sanitizer.js.map +0 -7
  470. package/dist/src/core/session/clear-survival.js.map +0 -7
  471. package/dist/src/core/session/enhanced-handoff.js.map +0 -7
  472. package/dist/src/core/session/handoff-generator.js.map +0 -7
  473. package/dist/src/core/session/index.js.map +0 -7
  474. package/dist/src/core/session/session-manager.js.map +0 -7
  475. package/dist/src/core/skills/index.js.map +0 -7
  476. package/dist/src/core/skills/skill-storage.js.map +0 -7
  477. package/dist/src/core/skills/types.js.map +0 -7
  478. package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
  479. package/dist/src/core/storage/infinite-storage.js.map +0 -7
  480. package/dist/src/core/storage/project-registry.js.map +0 -7
  481. package/dist/src/core/storage/remote-storage.js.map +0 -7
  482. package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
  483. package/dist/src/core/storage/two-tier-storage.js.map +0 -7
  484. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
  485. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
  486. package/dist/src/core/trace/debug-trace.js.map +0 -7
  487. package/dist/src/core/trace/index.js.map +0 -7
  488. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
  489. package/dist/src/core/trace/trace-detector.js.map +0 -7
  490. package/dist/src/core/trace/trace-store.js.map +0 -7
  491. package/dist/src/core/trace/types.js.map +0 -7
  492. package/dist/src/core/types.js.map +0 -7
  493. package/dist/src/core/utils/async-mutex.js.map +0 -7
  494. package/dist/src/core/utils/compression.js.map +0 -7
  495. package/dist/src/core/utils/update-checker.js.map +0 -7
  496. package/dist/src/core/worktree/worktree-manager.js.map +0 -7
  497. package/dist/src/daemon/daemon-config.js.map +0 -7
  498. package/dist/src/daemon/services/context-service.js.map +0 -7
  499. package/dist/src/daemon/services/linear-service.js.map +0 -7
  500. package/dist/src/daemon/services/maintenance-service.js.map +0 -7
  501. package/dist/src/daemon/services/memory-service.js.map +0 -7
  502. package/dist/src/daemon/session-daemon.js.map +0 -7
  503. package/dist/src/daemon/unified-daemon.js.map +0 -7
  504. package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
  505. package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
  506. package/dist/src/features/analytics/index.js.map +0 -7
  507. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
  508. package/dist/src/features/analytics/types/metrics.js.map +0 -7
  509. package/dist/src/features/browser/browser-mcp.js.map +0 -7
  510. package/dist/src/features/sweep/index.js.map +0 -7
  511. package/dist/src/features/sweep/prediction-client.js.map +0 -7
  512. package/dist/src/features/sweep/prompt-builder.js.map +0 -7
  513. package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
  514. package/dist/src/features/sweep/state-watcher.js.map +0 -7
  515. package/dist/src/features/sweep/status-bar.js.map +0 -7
  516. package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
  517. package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
  518. package/dist/src/features/sweep/types.js.map +0 -7
  519. package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
  520. package/dist/src/features/tasks/task-aware-context.js.map +0 -7
  521. package/dist/src/features/tui/simple-monitor.js.map +0 -7
  522. package/dist/src/features/tui/swarm-monitor.js.map +0 -7
  523. package/dist/src/features/web/client/stores/task-store.js.map +0 -7
  524. package/dist/src/features/web/server/index.js.map +0 -7
  525. package/dist/src/features/workers/tmux-manager.js.map +0 -7
  526. package/dist/src/features/workers/worker-registry.js.map +0 -7
  527. package/dist/src/hooks/auto-background.js.map +0 -7
  528. package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
  529. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
  530. package/dist/src/hooks/config.js.map +0 -7
  531. package/dist/src/hooks/daemon.js.map +0 -7
  532. package/dist/src/hooks/diffmem-hooks.js.map +0 -7
  533. package/dist/src/hooks/events.js.map +0 -7
  534. package/dist/src/hooks/index.js.map +0 -7
  535. package/dist/src/hooks/linear-task-picker.js.map +0 -7
  536. package/dist/src/hooks/schemas.js.map +0 -7
  537. package/dist/src/hooks/secure-fs.js.map +0 -7
  538. package/dist/src/hooks/security-logger.js.map +0 -7
  539. package/dist/src/hooks/session-summary.js.map +0 -7
  540. package/dist/src/hooks/sms-action-runner.js +0 -371
  541. package/dist/src/hooks/sms-action-runner.js.map +0 -7
  542. package/dist/src/hooks/sms-notify.js +0 -506
  543. package/dist/src/hooks/sms-notify.js.map +0 -7
  544. package/dist/src/hooks/sms-watcher.js +0 -93
  545. package/dist/src/hooks/sms-watcher.js.map +0 -7
  546. package/dist/src/hooks/sms-webhook.js +0 -555
  547. package/dist/src/hooks/sms-webhook.js.map +0 -7
  548. package/dist/src/hooks/whatsapp-commands.js +0 -479
  549. package/dist/src/hooks/whatsapp-commands.js.map +0 -7
  550. package/dist/src/hooks/whatsapp-scheduler.js +0 -317
  551. package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
  552. package/dist/src/hooks/whatsapp-sync.js +0 -409
  553. package/dist/src/hooks/whatsapp-sync.js.map +0 -7
  554. package/dist/src/index.js.map +0 -7
  555. package/dist/src/integrations/anthropic/client.js.map +0 -7
  556. package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
  557. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  558. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  559. package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
  560. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
  561. package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
  562. package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
  563. package/dist/src/integrations/diffmem/client.js.map +0 -7
  564. package/dist/src/integrations/diffmem/config.js.map +0 -7
  565. package/dist/src/integrations/diffmem/index.js.map +0 -7
  566. package/dist/src/integrations/diffmem/types.js.map +0 -7
  567. package/dist/src/integrations/linear/auth.js.map +0 -7
  568. package/dist/src/integrations/linear/auto-sync.js.map +0 -7
  569. package/dist/src/integrations/linear/client.js.map +0 -7
  570. package/dist/src/integrations/linear/config.js.map +0 -7
  571. package/dist/src/integrations/linear/migration.js.map +0 -7
  572. package/dist/src/integrations/linear/oauth-server.js.map +0 -7
  573. package/dist/src/integrations/linear/rest-client.js.map +0 -7
  574. package/dist/src/integrations/linear/sync-manager.js.map +0 -7
  575. package/dist/src/integrations/linear/sync-service.js.map +0 -7
  576. package/dist/src/integrations/linear/sync.js.map +0 -7
  577. package/dist/src/integrations/linear/types.js.map +0 -7
  578. package/dist/src/integrations/linear/unified-sync.js.map +0 -7
  579. package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
  580. package/dist/src/integrations/linear/webhook-server.js.map +0 -7
  581. package/dist/src/integrations/linear/webhook.js.map +0 -7
  582. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  583. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
  584. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
  585. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  586. package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
  587. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  588. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  589. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
  590. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  591. package/dist/src/integrations/mcp/index.js.map +0 -7
  592. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  593. package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
  594. package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
  595. package/dist/src/integrations/mcp/remote-server.js.map +0 -7
  596. package/dist/src/integrations/mcp/schemas.js.map +0 -7
  597. package/dist/src/integrations/mcp/server.js.map +0 -7
  598. package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
  599. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
  600. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  601. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
  602. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  603. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  604. package/dist/src/integrations/ralph/index.js.map +0 -7
  605. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
  606. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  607. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  608. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  609. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  610. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  611. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  612. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  613. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  614. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  615. package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
  616. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  617. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  618. package/dist/src/integrations/ralph/types.js.map +0 -7
  619. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  620. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
  621. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
  622. package/dist/src/models/user.model.js.map +0 -7
  623. package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
  624. package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
  625. package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
  626. package/dist/src/orchestrators/multimodal/types.js.map +0 -7
  627. package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
  628. package/dist/src/servers/production/auth-middleware.js.map +0 -7
  629. package/dist/src/services/config-service.js.map +0 -7
  630. package/dist/src/services/context-service.js.map +0 -7
  631. package/dist/src/skills/api-discovery.js.map +0 -7
  632. package/dist/src/skills/api-skill.js.map +0 -7
  633. package/dist/src/skills/claude-skills.js.map +0 -7
  634. package/dist/src/skills/dashboard-launcher.js.map +0 -7
  635. package/dist/src/skills/linear-task-runner.js.map +0 -7
  636. package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
  637. package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
  638. package/dist/src/skills/spec-generator-skill.js.map +0 -7
  639. package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
  640. package/dist/src/types/task.js.map +0 -7
  641. package/dist/src/utils/env.js.map +0 -7
  642. package/dist/src/utils/formatting.js.map +0 -7
  643. package/dist/src/utils/process-cleanup.js.map +0 -7
  644. package/scripts/README-TESTING.md +0 -186
  645. package/scripts/analyze-cli-security.js +0 -288
  646. package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
  647. package/scripts/archive/analyze-linear-duplicates.js +0 -214
  648. package/scripts/archive/analyze-remaining-duplicates.js +0 -230
  649. package/scripts/archive/analyze-sta-duplicates.js +0 -292
  650. package/scripts/archive/analyze-sta-graphql.js +0 -399
  651. package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
  652. package/scripts/archive/check-all-duplicates.ts +0 -419
  653. package/scripts/archive/clean-duplicate-tasks.js +0 -114
  654. package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
  655. package/scripts/archive/create-phase-tasks.js +0 -387
  656. package/scripts/archive/delete-linear-duplicates.js +0 -182
  657. package/scripts/archive/delete-remaining-duplicates.js +0 -158
  658. package/scripts/archive/delete-sta-duplicates.js +0 -201
  659. package/scripts/archive/delete-sta-oauth.js +0 -201
  660. package/scripts/archive/export-sta-tasks.js +0 -62
  661. package/scripts/archive/install-auto-sync.js +0 -266
  662. package/scripts/archive/install-chromadb-hooks.sh +0 -133
  663. package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
  664. package/scripts/archive/install-post-task-hooks.sh +0 -289
  665. package/scripts/archive/install-stackmemory-hooks.sh +0 -420
  666. package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
  667. package/scripts/archive/merge-linear-duplicates.ts +0 -182
  668. package/scripts/archive/remove-sta-tasks.js +0 -70
  669. package/scripts/archive/setup-background-sync.sh +0 -168
  670. package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
  671. package/scripts/archive/setup-claude-autostart.sh +0 -305
  672. package/scripts/archive/setup-git-hooks.sh +0 -25
  673. package/scripts/archive/setup-linear-oauth.sh +0 -46
  674. package/scripts/archive/setup-mcp.sh +0 -113
  675. package/scripts/archive/setup-railway-deployment.sh +0 -81
  676. package/scripts/auto-handoff.sh +0 -262
  677. package/scripts/background-sync-manager.js +0 -478
  678. package/scripts/benchmark-performance.ts +0 -57
  679. package/scripts/check-redis.ts +0 -48
  680. package/scripts/chromadb-auto-loader.sh +0 -128
  681. package/scripts/chromadb-context-loader.js +0 -479
  682. package/scripts/claude-chromadb-hook.js +0 -460
  683. package/scripts/claude-linear-skill.js +0 -455
  684. package/scripts/claude-pre-commit.sh +0 -302
  685. package/scripts/claude-sm-autostart.js +0 -579
  686. package/scripts/claude-with-chromadb.sh +0 -69
  687. package/scripts/clean-linear-backlog.js +0 -273
  688. package/scripts/cleanup-old-sessions.sh +0 -57
  689. package/scripts/create-cleanup-issues.js +0 -302
  690. package/scripts/create-sandbox.sh +0 -269
  691. package/scripts/debug-linear-update.js +0 -174
  692. package/scripts/delete-linear-tasks.js +0 -167
  693. package/scripts/demos/browser-test.ts +0 -39
  694. package/scripts/demos/ralph-integration-demo.ts +0 -245
  695. package/scripts/demos/trace-demo.ts +0 -200
  696. package/scripts/demos/trace-detector.demo.ts +0 -171
  697. package/scripts/demos/trace-test.ts +0 -79
  698. package/scripts/deploy-ralph-swarm.sh +0 -365
  699. package/scripts/deploy.sh +0 -89
  700. package/scripts/deployment/test-deployment.js +0 -194
  701. package/scripts/detect-and-rehydrate.js +0 -162
  702. package/scripts/detect-and-rehydrate.mjs +0 -165
  703. package/scripts/development/create-demo-tasks.js +0 -143
  704. package/scripts/development/debug-frame-test.js +0 -16
  705. package/scripts/development/demo-auto-sync.js +0 -128
  706. package/scripts/development/fix-all-imports.js +0 -213
  707. package/scripts/development/fix-imports.js +0 -229
  708. package/scripts/development/fix-lint-loop.cjs +0 -103
  709. package/scripts/development/fix-project-id.ts +0 -161
  710. package/scripts/development/fix-strict-mode-issues.ts +0 -291
  711. package/scripts/development/reorganize-structure.sh +0 -228
  712. package/scripts/development/test-persistence-direct.js +0 -148
  713. package/scripts/development/test-persistence.js +0 -114
  714. package/scripts/development/test-tasks.js +0 -93
  715. package/scripts/development/update-imports.js +0 -212
  716. package/scripts/fetch-linear-status.js +0 -125
  717. package/scripts/initialize.ts +0 -220
  718. package/scripts/linear-auto-sync.js +0 -262
  719. package/scripts/linear-auto-sync.sh +0 -161
  720. package/scripts/linear-sync-daemon.js +0 -150
  721. package/scripts/linear-task-review.js +0 -237
  722. package/scripts/list-linear-tasks.ts +0 -178
  723. package/scripts/mcp-proxy.js +0 -66
  724. package/scripts/measure-handoff-impact.mjs +0 -395
  725. package/scripts/measure-handoff-impact.ts +0 -450
  726. package/scripts/publish-local.js +0 -74
  727. package/scripts/query-chromadb.ts +0 -201
  728. package/scripts/ralph-integration-test.js +0 -274
  729. package/scripts/reconcile-local-tasks.js +0 -170
  730. package/scripts/recreate-frames-db.js +0 -89
  731. package/scripts/show-linear-summary.ts +0 -172
  732. package/scripts/simple-swarm-demo.ts +0 -114
  733. package/scripts/stackmemory-auto-handoff.sh +0 -231
  734. package/scripts/start-linear-sync-daemon.sh +0 -141
  735. package/scripts/start-temporal-paradox.sh +0 -214
  736. package/scripts/status.ts +0 -224
  737. package/scripts/stop-notify-webhook.sh +0 -19
  738. package/scripts/swarm-monitor.js +0 -509
  739. package/scripts/sync-and-clean-tasks.js +0 -258
  740. package/scripts/sync-linear-graphql.js +0 -303
  741. package/scripts/sync-linear-tasks.js +0 -186
  742. package/scripts/test-auto-triggers.sh +0 -57
  743. package/scripts/test-browser-mcp.js +0 -74
  744. package/scripts/test-chromadb-full.js +0 -115
  745. package/scripts/test-chromadb-hooks.sh +0 -28
  746. package/scripts/test-chromadb-sync.ts +0 -245
  747. package/scripts/test-claude-config.sh +0 -123
  748. package/scripts/test-cli-security.js +0 -293
  749. package/scripts/test-code-execution.js +0 -143
  750. package/scripts/test-hooks-persistence.sh +0 -220
  751. package/scripts/test-installation-scenarios.sh +0 -359
  752. package/scripts/test-installation.sh +0 -224
  753. package/scripts/test-mcp.js +0 -163
  754. package/scripts/test-parallel-swarms.js +0 -443
  755. package/scripts/test-pre-publish-quick.sh +0 -69
  756. package/scripts/test-quality-gates.sh +0 -263
  757. package/scripts/test-ralph-iteration-fix.ts +0 -118
  758. package/scripts/test-ralph-iterations.ts +0 -164
  759. package/scripts/test-redis-storage.ts +0 -490
  760. package/scripts/test-rlm-basic.sh +0 -122
  761. package/scripts/test-rlm-comprehensive.sh +0 -260
  762. package/scripts/test-rlm-e2e.sh +0 -268
  763. package/scripts/test-rlm-simple.js +0 -90
  764. package/scripts/test-rlm.js +0 -110
  765. package/scripts/test-session-handoff.sh +0 -165
  766. package/scripts/test-setup-e2e.sh +0 -154
  767. package/scripts/test-shell-integration.sh +0 -275
  768. package/scripts/test-simple-ralph-state-sync.ts +0 -178
  769. package/scripts/test-swarm-fixes.ts +0 -161
  770. package/scripts/test-swarm-git-workflow.js +0 -338
  771. package/scripts/test-swarm-tui.ts +0 -34
  772. package/scripts/test-tui-shortcuts.ts +0 -66
  773. package/scripts/testing/ab-test-runner.ts +0 -510
  774. package/scripts/testing/collect-metrics.ts +0 -457
  775. package/scripts/testing/quick-effectiveness-demo.js +0 -187
  776. package/scripts/testing/ralph-cli-test.js +0 -88
  777. package/scripts/testing/ralph-integration-validation.js +0 -727
  778. package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
  779. package/scripts/testing/real-performance-test.js +0 -422
  780. package/scripts/testing/results/real-performance-results.json +0 -90
  781. package/scripts/testing/run-effectiveness-tests.sh +0 -176
  782. package/scripts/testing/simple-effectiveness-test.js +0 -310
  783. package/scripts/testing/test-tier-migration.js +0 -100
  784. package/scripts/update-linear-status.js +0 -268
  785. package/scripts/update-linear-tasks-fixed.js +0 -284
  786. package/scripts/validate-claude-config.sh +0 -155
  787. package/scripts/validate-swarm-implementation.js +0 -467
  788. package/scripts/validate-tui-shortcuts.ts +0 -83
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/context/shared-context-layer.ts"],
4
- "sourcesContent": ["/**\n * Shared Context Layer for Cross-Session Reference\n *\n * This layer maintains a lightweight shared context across sessions while\n * preserving run_id isolation for write operations. It enables:\n * - Read access to frames from other sessions\n * - Automatic context inheritance\n * - Efficient caching and indexing\n * - Safe concurrent access\n *\n * Also includes ContextBridge for automatic synchronization between sessions\n * and shared context.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { sessionManager } from '../session/session-manager.js';\nimport type { Frame } from './frame-types.js';\nimport type { FrameManager } from './index.js';\nimport { logger } from '../monitoring/logger.js';\n\n// Type-safe environment variable access\n\nexport interface SharedContext {\n projectId: string;\n branch?: string;\n lastUpdated: number;\n sessions: SharedSessionContext[];\n globalPatterns: ContextPattern[];\n decisionLog: Decision[];\n referenceIndex: ReferenceIndex;\n}\n\nexport interface SharedSessionContext {\n sessionId: string;\n runId: string;\n summary: string;\n keyFrames: FrameSummary[];\n createdAt: number;\n lastActiveAt: number;\n metadata: Record<string, any>;\n}\n\nexport interface FrameSummary {\n frameId: string;\n title: string;\n type: string;\n score: number;\n tags: string[];\n summary?: string;\n createdAt: number;\n}\n\nexport interface ContextPattern {\n pattern: string;\n type: 'error' | 'success' | 'decision' | 'learning';\n frequency: number;\n lastSeen: number;\n resolution?: string;\n}\n\nexport interface Decision {\n id: string;\n decision: string;\n reasoning: string;\n timestamp: number;\n sessionId: string;\n outcome?: 'success' | 'failure' | 'pending';\n}\n\nexport interface ReferenceIndex {\n byTag: Map<string, string[]>;\n byType: Map<string, string[]>;\n byScore: string[];\n recentlyAccessed: string[];\n}\n\nexport class SharedContextLayer {\n private static instance: SharedContextLayer;\n private contextDir: string;\n private cache: Map<string, SharedContext> = new Map();\n private readonly MAX_CACHE_SIZE = 100;\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private lastCacheClean = Date.now();\n\n private constructor() {\n const homeDir = process.env['HOME'] || process.env['USERPROFILE'] || '';\n this.contextDir = path.join(homeDir, '.stackmemory', 'shared-context');\n }\n\n static getInstance(): SharedContextLayer {\n if (!SharedContextLayer.instance) {\n SharedContextLayer.instance = new SharedContextLayer();\n }\n return SharedContextLayer.instance;\n }\n\n async initialize(): Promise<void> {\n await fs.mkdir(this.contextDir, { recursive: true });\n await fs.mkdir(path.join(this.contextDir, 'projects'), { recursive: true });\n await fs.mkdir(path.join(this.contextDir, 'patterns'), { recursive: true });\n await fs.mkdir(path.join(this.contextDir, 'decisions'), {\n recursive: true,\n });\n }\n\n /**\n * Get or create shared context for current project/branch\n */\n async getSharedContext(options?: {\n projectId?: string;\n branch?: string;\n includeOtherBranches?: boolean;\n }): Promise<SharedContext> {\n const session = sessionManager.getCurrentSession();\n const projectId = options?.projectId || session?.projectId || 'global';\n const branch = options?.branch || session?.branch;\n\n const cacheKey = `${projectId}:${branch || 'main'}`;\n\n // Check cache first\n if (this.cache.has(cacheKey)) {\n const cached = this.cache.get(cacheKey)!;\n if (Date.now() - cached.lastUpdated < this.CACHE_TTL) {\n return cached;\n }\n }\n\n // Load from disk\n const context = await this.loadProjectContext(projectId, branch);\n\n // Include other branches if requested\n if (options?.includeOtherBranches) {\n const otherBranches = await this.loadOtherBranchContexts(\n projectId,\n branch\n );\n context.sessions.push(...otherBranches);\n }\n\n // Update cache\n this.cache.set(cacheKey, context);\n this.cleanCache();\n\n return context;\n }\n\n /**\n * Add current session's important frames to shared context\n */\n async addToSharedContext(\n frames: Frame[],\n options?: {\n minScore?: number;\n tags?: string[];\n }\n ): Promise<void> {\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n const context = await this.getSharedContext();\n const minScore = options?.minScore || 0.7;\n\n // Filter important frames\n const importantFrames = frames.filter((f) => {\n const score = this.calculateFrameScore(f);\n return score >= minScore;\n });\n\n // Create session context\n const sessionContext: SharedSessionContext = {\n sessionId: session.sessionId,\n runId: session.runId,\n summary: this.generateSessionSummary(importantFrames),\n keyFrames: importantFrames.map((f) => this.summarizeFrame(f)),\n createdAt: session.startedAt,\n lastActiveAt: Date.now(),\n metadata: session.metadata,\n };\n\n // Update or add session context\n const existingIndex = context.sessions.findIndex(\n (s) => s.sessionId === session.sessionId\n );\n if (existingIndex >= 0) {\n context.sessions[existingIndex] = sessionContext;\n } else {\n context.sessions.push(sessionContext);\n }\n\n // Update patterns\n this.updatePatterns(context, importantFrames);\n\n // Update reference index\n this.updateReferenceIndex(context, importantFrames);\n\n // Save context\n await this.saveProjectContext(context);\n }\n\n /**\n * Query shared context for relevant frames\n */\n async querySharedContext(query: {\n tags?: string[];\n type?: string;\n minScore?: number;\n sessionId?: string;\n limit?: number;\n }): Promise<FrameSummary[]> {\n const context = await this.getSharedContext({ includeOtherBranches: true });\n let results: FrameSummary[] = [];\n\n // Collect all frames from all sessions\n for (const session of context.sessions) {\n if (query.sessionId && session.sessionId !== query.sessionId) continue;\n\n // Skip sessions without keyFrames\n if (!session.keyFrames || !Array.isArray(session.keyFrames)) continue;\n\n const filtered = session.keyFrames.filter((f) => {\n if (query.tags && !query.tags.some((tag) => f.tags.includes(tag)))\n return false;\n if (query.type && f.type !== query.type) return false;\n if (query.minScore && f.score < query.minScore) return false;\n return true;\n });\n\n results.push(...filtered);\n }\n\n // Sort by score and recency\n results.sort((a, b) => {\n const scoreWeight = 0.7;\n const recencyWeight = 0.3;\n\n const aScore =\n a.score * scoreWeight +\n (1 - (Date.now() - a.createdAt) / (30 * 24 * 60 * 60 * 1000)) *\n recencyWeight;\n const bScore =\n b.score * scoreWeight +\n (1 - (Date.now() - b.createdAt) / (30 * 24 * 60 * 60 * 1000)) *\n recencyWeight;\n\n return bScore - aScore;\n });\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n // Update recently accessed\n const index = context.referenceIndex;\n if (!index.recentlyAccessed) {\n index.recentlyAccessed = [];\n }\n\n // Add frameIds to recently accessed, removing duplicates\n if (results.length > 0) {\n const frameIds = results.map((r) => r.frameId);\n index.recentlyAccessed = [\n ...frameIds,\n ...index.recentlyAccessed.filter((id: any) => !frameIds.includes(id)),\n ].slice(0, 100);\n\n // Save the updated context with recently accessed frames\n await this.saveProjectContext(context);\n }\n\n return results;\n }\n\n /**\n * Get relevant patterns from shared context\n */\n async getPatterns(type?: ContextPattern['type']): Promise<ContextPattern[]> {\n const context = await this.getSharedContext();\n\n if (type) {\n return context.globalPatterns.filter((p) => p.type === type);\n }\n\n return context.globalPatterns;\n }\n\n /**\n * Add a decision to the shared context\n */\n async addDecision(\n decision: Omit<Decision, 'id' | 'timestamp' | 'sessionId'>\n ): Promise<void> {\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n const context = await this.getSharedContext();\n\n const newDecision: Decision = {\n id: uuidv4(),\n timestamp: Date.now(),\n sessionId: session.sessionId,\n outcome: 'pending',\n ...decision,\n };\n\n context.decisionLog.push(newDecision);\n\n // Keep only last 100 decisions\n if (context.decisionLog.length > 100) {\n context.decisionLog = context.decisionLog.slice(-100);\n }\n\n await this.saveProjectContext(context);\n }\n\n /**\n * Get recent decisions from shared context\n */\n async getDecisions(limit: number = 10): Promise<Decision[]> {\n const context = await this.getSharedContext();\n return context.decisionLog.slice(-limit);\n }\n\n /**\n * Automatic context discovery on CLI startup\n */\n async autoDiscoverContext(): Promise<{\n hasSharedContext: boolean;\n sessionCount: number;\n recentPatterns: ContextPattern[];\n lastDecisions: Decision[];\n suggestedFrames: FrameSummary[];\n }> {\n const context = await this.getSharedContext({\n includeOtherBranches: false,\n });\n\n // Get recent patterns (last 7 days)\n const recentPatterns = context.globalPatterns\n .filter((p) => Date.now() - p.lastSeen < 7 * 24 * 60 * 60 * 1000)\n .sort((a, b) => b.frequency - a.frequency)\n .slice(0, 5);\n\n // Get last 5 decisions\n const lastDecisions = context.decisionLog.slice(-5);\n\n // Get suggested frames based on recent access and score\n const suggestedFrames = await this.querySharedContext({\n minScore: 0.8,\n limit: 5,\n });\n\n return {\n hasSharedContext: context.sessions.length > 0,\n sessionCount: context.sessions.length,\n recentPatterns,\n lastDecisions,\n suggestedFrames,\n };\n }\n\n private async loadProjectContext(\n projectId: string,\n branch?: string\n ): Promise<SharedContext> {\n const contextFile = path.join(\n this.contextDir,\n 'projects',\n `${projectId}_${branch || 'main'}.json`\n );\n\n try {\n const data = await fs.readFile(contextFile, 'utf-8');\n const context = JSON.parse(data);\n\n // Reconstruct Maps\n context.referenceIndex.byTag = new Map(\n Object.entries(context.referenceIndex.byTag || {})\n );\n context.referenceIndex.byType = new Map(\n Object.entries(context.referenceIndex.byType || {})\n );\n\n return context;\n } catch {\n // Return empty context if file doesn't exist\n return {\n projectId,\n branch,\n lastUpdated: Date.now(),\n sessions: [],\n globalPatterns: [],\n decisionLog: [],\n referenceIndex: {\n byTag: new Map(),\n byType: new Map(),\n byScore: [],\n recentlyAccessed: [],\n },\n };\n }\n }\n\n private async saveProjectContext(context: SharedContext): Promise<void> {\n const contextFile = path.join(\n this.contextDir,\n 'projects',\n `${context.projectId}_${context.branch || 'main'}.json`\n );\n\n // Convert Maps to objects for JSON serialization\n const serializable = {\n ...context,\n lastUpdated: Date.now(),\n referenceIndex: {\n ...context.referenceIndex,\n byTag: Object.fromEntries(context.referenceIndex.byTag),\n byType: Object.fromEntries(context.referenceIndex.byType),\n },\n };\n\n await fs.writeFile(contextFile, JSON.stringify(serializable, null, 2));\n }\n\n private async loadOtherBranchContexts(\n projectId: string,\n currentBranch?: string\n ): Promise<SharedSessionContext[]> {\n const projectsDir = path.join(this.contextDir, 'projects');\n const files = await fs.readdir(projectsDir);\n const sessions: SharedSessionContext[] = [];\n\n for (const file of files) {\n if (\n file.startsWith(`${projectId}_`) &&\n !file.includes(currentBranch || 'main')\n ) {\n try {\n const data = await fs.readFile(path.join(projectsDir, file), 'utf-8');\n const context = JSON.parse(data);\n sessions.push(...context.sessions);\n } catch {\n // Skip invalid files\n }\n }\n }\n\n return sessions;\n }\n\n private calculateFrameScore(frame: Frame): number {\n // Simple scoring algorithm\n let score = 0.5;\n\n // Boost for certain types\n if (frame.type === 'task' || frame.type === 'review') score += 0.2;\n if (frame.type === 'debug' || frame.type === 'write') score += 0.15;\n if (frame.type === 'error') score += 0.15; // Error frames are important for pattern extraction\n\n // Check for data property (used in tests)\n const frameWithData = frame as any;\n if (frameWithData.data) score += 0.2;\n\n // Boost for having outputs (indicates completion/results)\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.2;\n if (\n frame.digest_text ||\n (frame.digest_json && Object.keys(frame.digest_json).length > 0)\n )\n score += 0.1;\n\n // Time decay (reduce score for older frames) - but handle missing created_at\n if (frame.created_at) {\n const age = Date.now() - frame.created_at;\n const daysSinceCreation = age / (24 * 60 * 60 * 1000);\n score *= Math.max(0.3, 1 - daysSinceCreation / 30);\n }\n\n return Math.min(1, score);\n }\n\n private summarizeFrame(frame: Frame): FrameSummary {\n return {\n frameId: frame.frame_id,\n title: frame.name,\n type: frame.type,\n score: this.calculateFrameScore(frame),\n tags: [],\n summary: this.generateFrameSummary(frame),\n createdAt: frame.created_at,\n };\n }\n\n private generateFrameSummary(frame: Frame): string {\n // Generate a brief summary of the frame\n const parts = [];\n const frameWithData = frame as any;\n\n if (frame.type) parts.push(`[${frame.type}]`);\n if (frame.name) parts.push(frame.name);\n if (frameWithData.title) parts.push(frameWithData.title);\n if (frameWithData.data?.error)\n parts.push(`Error: ${frameWithData.data.error}`);\n if (frameWithData.data?.resolution)\n parts.push(`Resolution: ${frameWithData.data.resolution}`);\n\n return parts.join(' - ').slice(0, 200);\n }\n\n private generateSessionSummary(frames: Frame[]): string {\n const types = [...new Set(frames.map((f) => f.type))];\n return `Session with ${frames.length} key frames: ${types.join(', ')}`;\n }\n\n private updatePatterns(context: SharedContext, frames: Frame[]): void {\n for (const frame of frames) {\n // Extract patterns from frame data\n // Handle frames with a data property (used in tests)\n const frameWithData = frame as any;\n if (frameWithData.data?.error) {\n this.addPattern(\n context,\n frameWithData.data.error,\n 'error',\n frameWithData.data?.resolution\n );\n } else if (frame.type === 'error' && frame.name) {\n // Only extract from name/outputs if no data.error property\n const errorText = frame.outputs?.error || frame.name;\n const resolution = frame.outputs?.resolution;\n if (errorText) {\n this.addPattern(context, errorText, 'error', resolution);\n }\n }\n\n if (frame.type === 'decision' && frameWithData.data?.decision) {\n this.addPattern(context, frameWithData.data.decision, 'decision');\n } else if (frame.digest_json?.decision) {\n // Only extract from digest_json if no data.decision\n this.addPattern(context, frame.digest_json.decision, 'decision');\n }\n }\n }\n\n private addPattern(\n context: SharedContext,\n pattern: string,\n type: ContextPattern['type'],\n resolution?: string\n ): void {\n const existing = context.globalPatterns.find(\n (p) => p.pattern === pattern && p.type === type\n );\n\n if (existing) {\n existing.frequency++;\n existing.lastSeen = Date.now();\n if (resolution) existing.resolution = resolution;\n } else {\n context.globalPatterns.push({\n pattern,\n type,\n frequency: 1,\n lastSeen: Date.now(),\n resolution,\n });\n }\n\n // Keep only top 100 patterns\n if (context.globalPatterns.length > 100) {\n context.globalPatterns.sort((a, b) => b.frequency - a.frequency);\n context.globalPatterns = context.globalPatterns.slice(0, 100);\n }\n }\n\n private updateReferenceIndex(context: SharedContext, frames: Frame[]): void {\n for (const frame of frames) {\n const summary = this.summarizeFrame(frame);\n\n // Index by tags\n for (const tag of summary.tags) {\n if (!context.referenceIndex.byTag.has(tag)) {\n context.referenceIndex.byTag.set(tag, []);\n }\n context.referenceIndex.byTag.get(tag)!.push(frame.frameId);\n }\n\n // Index by type\n if (!context.referenceIndex.byType.has(frame.type)) {\n context.referenceIndex.byType.set(frame.type, []);\n }\n context.referenceIndex.byType.get(frame.type)!.push(frame.frameId);\n\n // Update score index\n const scoreIndex = context.referenceIndex.byScore;\n const insertIndex = scoreIndex.findIndex((id) => {\n const otherFrame = context.sessions\n .flatMap((s) => s.keyFrames)\n .find((f) => f.frameId === id);\n return otherFrame && otherFrame.score < summary.score;\n });\n\n if (insertIndex >= 0) {\n scoreIndex.splice(insertIndex, 0, frame.frameId);\n } else {\n scoreIndex.push(frame.frameId);\n }\n\n // Keep only top 1000 by score\n context.referenceIndex.byScore = scoreIndex.slice(0, 1000);\n }\n }\n\n private cleanCache(): void {\n if (Date.now() - this.lastCacheClean < 60000) return; // Clean every minute\n\n if (this.cache.size > this.MAX_CACHE_SIZE) {\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => b[1].lastUpdated - a[1].lastUpdated\n );\n\n this.cache = new Map(entries.slice(0, this.MAX_CACHE_SIZE / 2));\n }\n\n this.lastCacheClean = Date.now();\n }\n}\n\nexport const sharedContextLayer = SharedContextLayer.getInstance();\n\n// ============================================================================\n// Context Bridge - Automatic synchronization between sessions and shared context\n// ============================================================================\n\nexport interface BridgeOptions {\n autoSync: boolean;\n syncInterval: number;\n minFrameScore: number;\n importantTags: string[];\n}\n\nexport class ContextBridge {\n private static instance: ContextBridge;\n private frameManager: FrameManager | null = null;\n private syncTimer: NodeJS.Timeout | null = null;\n private lastSyncTime: number = 0;\n private options: BridgeOptions = {\n autoSync: true,\n syncInterval: 60000, // 1 minute\n minFrameScore: 0.5, // Include frames with score above 0.5\n importantTags: ['decision', 'error', 'milestone', 'learning'],\n };\n\n private constructor() {}\n\n static getInstance(): ContextBridge {\n if (!ContextBridge.instance) {\n ContextBridge.instance = new ContextBridge();\n }\n return ContextBridge.instance;\n }\n\n /**\n * Initialize the bridge with a frame manager\n */\n async initialize(\n frameManager: FrameManager,\n options?: Partial<BridgeOptions>\n ): Promise<void> {\n this.frameManager = frameManager;\n this.options = { ...this.options, ...options };\n\n // Load shared context on initialization\n await this.loadSharedContext();\n\n // Start auto-sync if enabled\n if (this.options.autoSync) {\n this.startAutoSync();\n }\n\n logger.info('Context bridge initialized', {\n autoSync: this.options.autoSync,\n syncInterval: this.options.syncInterval,\n });\n }\n\n /**\n * Load relevant shared context into current session\n */\n async loadSharedContext(): Promise<void> {\n try {\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n // Get context discovery\n const discovery = await sharedContextLayer.autoDiscoverContext();\n\n if (!discovery.hasSharedContext) {\n logger.info('No shared context available to load');\n return;\n }\n\n // Load recent patterns as metadata\n if (discovery.recentPatterns.length > 0) {\n logger.info('Loaded recent patterns from shared context', {\n patternCount: discovery.recentPatterns.length,\n });\n }\n\n // Load last decisions for reference\n if (discovery.lastDecisions.length > 0) {\n logger.info('Loaded recent decisions from shared context', {\n decisionCount: discovery.lastDecisions.length,\n });\n }\n\n // Store suggested frames in metadata for quick reference\n if (discovery.suggestedFrames.length > 0) {\n const metadata = {\n suggestedFrames: discovery.suggestedFrames,\n loadedAt: Date.now(),\n };\n\n // Store in frame manager's context\n if (this.frameManager) {\n await this.frameManager.addContext(\n 'shared-context-suggestions',\n metadata\n );\n }\n\n logger.info('Loaded suggested frames from shared context', {\n frameCount: discovery.suggestedFrames.length,\n });\n }\n } catch (error: unknown) {\n logger.error('Failed to load shared context', error as Error);\n }\n }\n\n /**\n * Sync current session's important frames to shared context\n */\n async syncToSharedContext(): Promise<void> {\n try {\n if (!this.frameManager) return;\n\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n // Get all active frames (filter out any nulls from missing frames)\n const activeFrames = this.frameManager\n .getActiveFramePath()\n .filter(Boolean);\n\n // Get recent closed frames (last 100)\n const recentFrames = await this.frameManager.getRecentFrames(100);\n\n // Combine and filter important frames\n const allFrames = [...activeFrames, ...recentFrames].filter(Boolean);\n const importantFrames = this.filterImportantFrames(allFrames);\n\n if (importantFrames.length === 0) {\n logger.debug('No important frames to sync');\n return;\n }\n\n // Add to shared context\n await sharedContextLayer.addToSharedContext(importantFrames, {\n minScore: this.options.minFrameScore,\n tags: this.options.importantTags,\n });\n\n this.lastSyncTime = Date.now();\n\n logger.info('Synced frames to shared context', {\n frameCount: importantFrames.length,\n sessionId: session.sessionId,\n });\n } catch (error: unknown) {\n logger.error('Failed to sync to shared context', error as Error);\n }\n }\n\n /**\n * Query shared context for relevant frames\n */\n async querySharedFrames(query: {\n tags?: string[];\n type?: string;\n limit?: number;\n }): Promise<FrameSummary[]> {\n try {\n const results = await sharedContextLayer.querySharedContext({\n ...query,\n minScore: this.options.minFrameScore,\n });\n\n logger.info('Queried shared context', {\n query,\n resultCount: results.length,\n });\n\n return results;\n } catch (error: unknown) {\n logger.error('Failed to query shared context', error as Error);\n return [];\n }\n }\n\n /**\n * Add a decision to shared context\n */\n async addDecision(decision: string, reasoning: string): Promise<void> {\n try {\n await sharedContextLayer.addDecision({\n decision,\n reasoning,\n outcome: 'pending',\n });\n\n logger.info('Added decision to shared context', { decision });\n } catch (error: unknown) {\n logger.error('Failed to add decision', error as Error);\n }\n }\n\n /**\n * Start automatic synchronization\n */\n private startAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n }\n\n this.syncTimer = setInterval(() => {\n this.syncToSharedContext().catch((error) => {\n logger.error('Auto-sync failed', error as Error);\n });\n }, this.options.syncInterval);\n\n // Also sync on important events\n this.setupEventListeners();\n }\n\n /**\n * Stop automatic synchronization\n */\n stopAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = null;\n }\n }\n\n /**\n * Filter frames that are important enough to share\n */\n private filterImportantFrames(frames: Frame[]): Frame[] {\n return frames.filter((frame) => {\n // Check if frame has important tags\n const hasImportantTag = this.options.importantTags.some((tag) =>\n frame.metadata?.tags?.includes(tag)\n );\n\n // Check frame type importance\n const isImportantType = [\n 'task',\n 'milestone',\n 'error',\n 'resolution',\n 'decision',\n ].includes(frame.type);\n\n // Check metadata importance flag\n const markedImportant = frame.metadata?.importance === 'high';\n\n return hasImportantTag || isImportantType || markedImportant;\n });\n }\n\n /**\n * Setup event listeners for automatic syncing\n */\n private setupEventListeners(): void {\n if (!this.frameManager) return;\n\n // Sync when a frame is closed\n const originalClose = this.frameManager.closeFrame.bind(this.frameManager);\n this.frameManager.closeFrame = async (frameId: string, metadata?: any) => {\n const result = await originalClose(frameId, metadata);\n\n // Sync if it was an important frame\n const frame = await this.frameManager!.getFrame(frameId);\n if (frame && this.filterImportantFrames([frame]).length > 0) {\n await this.syncToSharedContext();\n }\n\n return result;\n };\n\n // Sync when a milestone is reached\n const originalMilestone = this.frameManager.createFrame.bind(\n this.frameManager\n );\n this.frameManager.createFrame = async (params: any) => {\n const result = await originalMilestone(params);\n\n if (params.type === 'milestone') {\n await this.syncToSharedContext();\n }\n\n return result;\n };\n }\n\n /**\n * Get sync statistics\n */\n getSyncStats(): {\n lastSyncTime: number;\n autoSyncEnabled: boolean;\n syncInterval: number;\n } {\n return {\n lastSyncTime: this.lastSyncTime,\n autoSyncEnabled: this.options.autoSync,\n syncInterval: this.options.syncInterval,\n };\n }\n\n /**\n * Manual trigger for immediate sync\n */\n async forceSyncNow(): Promise<void> {\n logger.info('Force sync triggered');\n await this.syncToSharedContext();\n }\n}\n\nexport const contextBridge = ContextBridge.getInstance();\n\n// Export for testing\nexport {\n SharedContext,\n SharedSessionContext,\n FrameSummary,\n ContextPattern,\n Decision,\n ReferenceIndex,\n BridgeOptions,\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/context/stack-merge-resolver.ts"],
4
- "sourcesContent": ["/**\n * Stack Merge Conflict Resolution - STA-101\n * Advanced conflict resolution for frame merging between individual and shared stacks\n */\n\nimport type { Frame, Anchor } from './frame-types.js';\nimport {\n DualStackManager,\n type StackSyncResult,\n} from './dual-stack-manager.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, DatabaseError, ErrorCode } from '../errors/index.js';\nimport {\n validateInput,\n StartMergeSessionSchema,\n CreateMergePolicySchema,\n ConflictResolutionSchema,\n} from './validation.js';\n\nexport interface MergeConflict {\n frameId: string;\n conflictType:\n | 'content'\n | 'metadata'\n | 'sequence'\n | 'dependency'\n | 'permission';\n sourceFrame: Frame;\n targetFrame: Frame;\n conflictDetails: {\n field: string;\n sourceValue: any;\n targetValue: any;\n lastModified: {\n source: Date;\n target: Date;\n };\n }[];\n severity: 'low' | 'medium' | 'high' | 'critical';\n autoResolvable: boolean;\n}\n\nexport interface MergeResolution {\n conflictId: string;\n strategy: 'source_wins' | 'target_wins' | 'merge_both' | 'manual' | 'skip';\n resolutionData?: Record<string, any>;\n resolvedBy: string;\n resolvedAt: Date;\n notes?: string;\n}\n\nexport interface MergePolicy {\n name: string;\n description: string;\n rules: Array<{\n condition: string; // JSONPath expression\n action: 'source_wins' | 'target_wins' | 'merge_both' | 'require_manual';\n priority: number;\n }>;\n autoApplyThreshold: 'low' | 'medium' | 'high' | 'never';\n}\n\nexport interface MergeSession {\n sessionId: string;\n sourceStackId: string;\n targetStackId: string;\n conflicts: MergeConflict[];\n resolutions: MergeResolution[];\n policy: MergePolicy;\n status: 'analyzing' | 'resolving' | 'completed' | 'failed' | 'manual_review';\n startedAt: Date;\n completedAt?: Date;\n metadata: {\n totalFrames: number;\n conflictFrames: number;\n autoResolvedConflicts: number;\n manualResolvedConflicts: number;\n };\n}\n\nexport class StackMergeResolver {\n private dualStackManager: DualStackManager;\n private activeSessions: Map<string, MergeSession> = new Map();\n private mergePolicies: Map<string, MergePolicy> = new Map();\n\n constructor(dualStackManager: DualStackManager) {\n this.dualStackManager = dualStackManager;\n this.initializeDefaultPolicies();\n logger.debug('StackMergeResolver initialized', {\n policies: Array.from(this.mergePolicies.keys()),\n });\n }\n\n /**\n * Start a merge session with conflict analysis\n */\n async startMergeSession(\n sourceStackId: string,\n targetStackId: string,\n frameIds?: string[],\n policyName: string = 'default'\n ): Promise<string> {\n // Validate input parameters\n const input = validateInput(StartMergeSessionSchema, {\n sourceStackId,\n targetStackId,\n frameIds,\n policyName,\n });\n const sessionId = `merge-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n logger.debug('Looking for merge policy', {\n policyName: input.policyName,\n availablePolicies: Array.from(this.mergePolicies.keys()),\n });\n const policy = this.mergePolicies.get(input.policyName);\n if (!policy) {\n logger.error('Merge policy not found', {\n requested: input.policyName,\n available: Array.from(this.mergePolicies.keys()),\n });\n throw new ValidationError(\n `Merge policy not found: ${input.policyName}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n // Check merge permissions on both stacks\n const currentUserId =\n this.dualStackManager.getCurrentContext().ownerId || 'unknown';\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.sourceStackId)\n );\n\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.targetStackId)\n );\n\n // Create merge session\n const session: MergeSession = {\n sessionId,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n conflicts: [],\n resolutions: [],\n policy,\n status: 'analyzing',\n startedAt: new Date(),\n metadata: {\n totalFrames: 0,\n conflictFrames: 0,\n autoResolvedConflicts: 0,\n manualResolvedConflicts: 0,\n },\n };\n\n this.activeSessions.set(sessionId, session);\n\n // Analyze conflicts\n await this.analyzeConflicts(sessionId, frameIds);\n\n // Auto-resolve conflicts where possible\n await this.autoResolveConflicts(sessionId);\n\n logger.info(`Merge session started: ${sessionId}`, {\n sourceStack: sourceStackId,\n targetStack: targetStackId,\n conflicts: session.conflicts.length,\n policy: policyName,\n });\n\n return sessionId;\n } catch (error: unknown) {\n logger.error('Failed to start merge session', {\n error: error instanceof Error ? error.message : error,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n policyName: input.policyName,\n });\n throw new DatabaseError(\n 'Failed to start merge session',\n ErrorCode.OPERATION_FAILED,\n { sourceStackId, targetStackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Analyze conflicts between source and target stacks\n */\n private async analyzeConflicts(\n sessionId: string,\n frameIds?: string[]\n ): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n const sourceStack = this.getStackManager(session.sourceStackId);\n const targetStack = this.getStackManager(session.targetStackId);\n\n // Get frames to analyze\n const framesToAnalyze =\n frameIds ||\n (await sourceStack.getActiveFrames()).map((f) => f.frame_id);\n\n session.metadata.totalFrames = framesToAnalyze.length;\n\n for (const frameId of framesToAnalyze) {\n const sourceFrame = await sourceStack.getFrame(frameId);\n if (!sourceFrame) continue;\n\n const targetFrame = await targetStack.getFrame(frameId);\n if (!targetFrame) continue; // No conflict if target doesn't exist\n\n // Analyze frame-level conflicts\n const conflicts = await this.analyzeFrameConflicts(\n sourceFrame,\n targetFrame\n );\n session.conflicts.push(...conflicts);\n }\n\n session.metadata.conflictFrames = new Set(\n session.conflicts.map((c) => c.frameId)\n ).size;\n session.status = 'resolving';\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict analysis completed: ${sessionId}`, {\n totalConflicts: session.conflicts.length,\n conflictFrames: session.metadata.conflictFrames,\n });\n } catch (error: unknown) {\n session.status = 'failed';\n this.activeSessions.set(sessionId, session);\n throw error;\n }\n }\n\n /**\n * Analyze conflicts within a single frame\n */\n private async analyzeFrameConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n // Content conflicts\n if (sourceFrame.name !== targetFrame.name) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'name',\n sourceValue: sourceFrame.name,\n targetValue: targetFrame.name,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // State conflicts\n if (sourceFrame.state !== targetFrame.state) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'metadata',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'state',\n sourceValue: sourceFrame.state,\n targetValue: targetFrame.state,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can auto-resolve based on timestamps\n });\n }\n\n // Input/Output conflicts\n if (\n JSON.stringify(sourceFrame.inputs) !== JSON.stringify(targetFrame.inputs)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'inputs',\n sourceValue: sourceFrame.inputs,\n targetValue: targetFrame.inputs,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // Analyze event conflicts\n const eventConflicts = await this.analyzeEventConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...eventConflicts);\n\n // Analyze anchor conflicts\n const anchorConflicts = await this.analyzeAnchorConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...anchorConflicts);\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame events\n */\n private async analyzeEventConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceEvents = await sourceStack.getFrameEvents(\n sourceFrame.frame_id\n );\n const targetEvents = await targetStack.getFrameEvents(\n targetFrame.frame_id\n );\n\n // Check for sequence conflicts\n if (sourceEvents.length !== targetEvents.length) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'sequence',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'event_count',\n sourceValue: sourceEvents.length,\n targetValue: targetEvents.length,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can merge events\n });\n }\n\n // Check for content conflicts in matching events\n const minLength = Math.min(sourceEvents.length, targetEvents.length);\n for (let i = 0; i < minLength; i++) {\n const sourceEvent = sourceEvents[i];\n const targetEvent = targetEvents[i];\n\n if (\n sourceEvent.text !== targetEvent.text ||\n JSON.stringify(sourceEvent.metadata) !==\n JSON.stringify(targetEvent.metadata)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `event_${i}`,\n sourceValue: {\n text: sourceEvent.text,\n metadata: sourceEvent.metadata,\n },\n targetValue: {\n text: targetEvent.text,\n metadata: targetEvent.metadata,\n },\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze event conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame anchors\n */\n private async analyzeAnchorConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceAnchors = await sourceStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n const targetAnchors = await targetStack.getFrameAnchors(\n targetFrame.frame_id\n );\n\n // Group anchors by type for comparison\n const sourceAnchorsByType = this.groupAnchorsByType(sourceAnchors);\n const targetAnchorsByType = this.groupAnchorsByType(targetAnchors);\n\n const allTypes = new Set([\n ...Object.keys(sourceAnchorsByType),\n ...Object.keys(targetAnchorsByType),\n ]);\n\n for (const type of allTypes) {\n const sourceTypeAnchors = sourceAnchorsByType[type] || [];\n const targetTypeAnchors = targetAnchorsByType[type] || [];\n\n if (\n sourceTypeAnchors.length !== targetTypeAnchors.length ||\n !this.anchorsEqual(sourceTypeAnchors, targetTypeAnchors)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `anchors_${type}`,\n sourceValue: sourceTypeAnchors,\n targetValue: targetTypeAnchors,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'low',\n autoResolvable: true, // Can merge anchors\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze anchor conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Auto-resolve conflicts based on merge policy\n */\n private async autoResolveConflicts(sessionId: string): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) return;\n\n const autoResolvableConflicts = session.conflicts.filter(\n (c) => c.autoResolvable\n );\n\n for (const conflict of autoResolvableConflicts) {\n const resolution = await this.applyMergePolicy(conflict, session.policy);\n if (resolution) {\n session.resolutions.push(resolution);\n session.metadata.autoResolvedConflicts++;\n\n logger.debug(`Auto-resolved conflict: ${conflict.frameId}`, {\n type: conflict.conflictType,\n strategy: resolution.strategy,\n });\n }\n }\n\n // Update session status\n const remainingConflicts = session.conflicts.filter(\n (c) => !session.resolutions.find((r) => r.conflictId === c.frameId)\n );\n\n if (remainingConflicts.length === 0) {\n session.status = 'completed';\n session.completedAt = new Date();\n } else if (remainingConflicts.every((c) => !c.autoResolvable)) {\n session.status = 'manual_review';\n }\n\n this.activeSessions.set(sessionId, session);\n }\n\n /**\n * Apply merge policy to resolve conflicts automatically\n */\n private async applyMergePolicy(\n conflict: MergeConflict,\n policy: MergePolicy\n ): Promise<MergeResolution | null> {\n // Sort rules by priority\n const sortedRules = policy.rules.sort((a, b) => b.priority - a.priority);\n\n for (const rule of sortedRules) {\n if (this.evaluateRuleCondition(conflict, rule.condition)) {\n return {\n conflictId: conflict.frameId,\n strategy:\n rule.action === 'require_manual' ? 'manual' : (rule.action as any),\n resolvedBy: 'system',\n resolvedAt: new Date(),\n notes: `Auto-resolved by policy: ${policy.name}`,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Manually resolve a specific conflict\n */\n async resolveConflict(\n sessionId: string,\n conflictId: string,\n resolution: Omit<MergeResolution, 'conflictId' | 'resolvedAt'>\n ): Promise<void> {\n // Validate input parameters\n const input = validateInput(ConflictResolutionSchema, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n notes: resolution.notes,\n });\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new ValidationError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.MERGE_SESSION_INVALID\n );\n }\n\n const conflict = session.conflicts.find((c) => c.frameId === conflictId);\n if (!conflict) {\n throw new ValidationError(\n `Conflict not found: ${conflictId}`,\n ErrorCode.MERGE_CONFLICT_UNRESOLVABLE\n );\n }\n\n const fullResolution: MergeResolution = {\n ...input,\n conflictId,\n resolvedAt: new Date(),\n };\n\n session.resolutions.push(fullResolution);\n session.metadata.manualResolvedConflicts++;\n\n // Check if all conflicts are resolved\n const resolvedConflictIds = new Set(\n session.resolutions.map((r) => r.conflictId)\n );\n const allResolved = session.conflicts.every((c) =>\n resolvedConflictIds.has(c.frameId)\n );\n\n if (allResolved) {\n session.status = 'completed';\n session.completedAt = new Date();\n }\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict manually resolved: ${conflictId}`, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n });\n }\n\n /**\n * Execute merge with resolved conflicts\n */\n async executeMerge(sessionId: string): Promise<StackSyncResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n if (session.status !== 'completed') {\n throw new DatabaseError(\n `Merge session not ready for execution: ${session.status}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n try {\n const resolutionMap = new Map(\n session.resolutions.map((r) => [r.conflictId, r])\n );\n\n const result: StackSyncResult = {\n success: true,\n conflictFrames: [],\n mergedFrames: [],\n errors: [],\n };\n\n const sourceStack = this.getStackManager(session.sourceStackId);\n const targetStack = this.getStackManager(session.targetStackId);\n\n // Group conflicts by frameId\n const conflictsByFrame = new Map<string, MergeConflict[]>();\n for (const conflict of session.conflicts) {\n const existing = conflictsByFrame.get(conflict.frameId) || [];\n existing.push(conflict);\n conflictsByFrame.set(conflict.frameId, existing);\n }\n\n // Process each frame according to its resolution\n for (const [frameId] of conflictsByFrame) {\n try {\n const resolution = resolutionMap.get(frameId);\n if (!resolution) {\n result.errors.push({\n frameId,\n error: 'No resolution found',\n resolution: 'skipped',\n });\n result.conflictFrames.push(frameId);\n continue;\n }\n\n const sourceFrame = await sourceStack.getFrame(frameId);\n const targetFrame = await targetStack.getFrame(frameId);\n\n if (!sourceFrame) {\n result.errors.push({\n frameId,\n error: 'Source frame not found',\n resolution: 'skipped',\n });\n continue;\n }\n\n switch (resolution.strategy) {\n case 'source_wins':\n if (targetFrame) await targetStack.deleteFrame(frameId);\n await this.copyFrameToStack(\n sourceFrame,\n sourceStack,\n targetStack\n );\n result.mergedFrames.push(frameId);\n break;\n\n case 'target_wins':\n result.mergedFrames.push(frameId);\n break;\n\n case 'merge_both':\n if (targetFrame) {\n await this.mergeFrameContents(\n sourceFrame,\n targetFrame,\n sourceStack,\n targetStack\n );\n } else {\n await this.copyFrameToStack(\n sourceFrame,\n sourceStack,\n targetStack\n );\n }\n result.mergedFrames.push(frameId);\n break;\n\n case 'skip':\n result.conflictFrames.push(frameId);\n break;\n\n case 'manual':\n result.errors.push({\n frameId,\n error: 'Manual resolution not applied',\n resolution: 'skipped',\n });\n result.conflictFrames.push(frameId);\n break;\n }\n } catch (error: unknown) {\n result.errors.push({\n frameId,\n error: error instanceof Error ? error.message : String(error),\n resolution: 'skipped',\n });\n result.success = false;\n }\n }\n\n logger.info(`Merge executed: ${sessionId}`, {\n mergedFrames: result.mergedFrames.length,\n conflicts: result.conflictFrames.length,\n errors: result.errors.length,\n });\n\n return result;\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to execute merge',\n ErrorCode.OPERATION_FAILED,\n { sessionId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async copyFrameToStack(\n frame: Frame,\n sourceStack: any,\n targetStack: any\n ): Promise<void> {\n await targetStack.createFrame({\n frame_id: frame.frame_id,\n name: frame.name,\n type: frame.type,\n parent_frame_id: frame.parent_frame_id,\n inputs: frame.inputs,\n outputs: frame.outputs,\n });\n\n const events = await sourceStack.getFrameEvents(frame.frame_id);\n for (const event of events) {\n await targetStack.addEvent(frame.frame_id, {\n type: event.type,\n text: event.text,\n metadata: event.metadata,\n });\n }\n\n const anchors = await sourceStack.getFrameAnchors(frame.frame_id);\n for (const anchor of anchors) {\n await targetStack.addAnchor(frame.frame_id, {\n type: anchor.type,\n text: anchor.text,\n priority: anchor.priority,\n metadata: anchor.metadata,\n });\n }\n }\n\n private async mergeFrameContents(\n sourceFrame: Frame,\n targetFrame: Frame,\n sourceStack: any,\n targetStack: any\n ): Promise<void> {\n // Merge events with deduplication\n const sourceEvents = await sourceStack.getFrameEvents(sourceFrame.frame_id);\n const targetEvents = await targetStack.getFrameEvents(targetFrame.frame_id);\n\n const existingSignatures = new Set(\n targetEvents.map((e: any) => `${e.type}:${e.text}`)\n );\n\n for (const event of sourceEvents) {\n const sig = `${event.type}:${event.text}`;\n if (!existingSignatures.has(sig)) {\n await targetStack.addEvent(targetFrame.frame_id, {\n type: event.type,\n text: event.text,\n metadata: { ...event.metadata, merged: true },\n });\n existingSignatures.add(sig);\n }\n }\n\n // Merge anchors with deduplication\n const sourceAnchors = await sourceStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n const targetAnchors = await targetStack.getFrameAnchors(\n targetFrame.frame_id\n );\n\n const existingAnchorSigs = new Set(\n targetAnchors.map((a: any) => `${a.type}:${a.text}:${a.priority}`)\n );\n\n for (const anchor of sourceAnchors) {\n const sig = `${anchor.type}:${anchor.text}:${anchor.priority}`;\n if (!existingAnchorSigs.has(sig)) {\n await targetStack.addAnchor(targetFrame.frame_id, {\n type: anchor.type,\n text: anchor.text,\n priority: anchor.priority,\n metadata: { ...anchor.metadata, merged: true },\n });\n existingAnchorSigs.add(sig);\n }\n }\n\n logger.debug(`Merged frame contents: ${sourceFrame.frame_id}`);\n }\n\n /**\n * Get merge session details\n */\n async getMergeSession(sessionId: string): Promise<MergeSession | null> {\n return this.activeSessions.get(sessionId) || null;\n }\n\n /**\n * Create custom merge policy\n */\n async createMergePolicy(policy: MergePolicy): Promise<void> {\n // Validate input parameters\n const input = validateInput(CreateMergePolicySchema, policy);\n\n this.mergePolicies.set(input.name, input);\n logger.info(`Created merge policy: ${input.name}`, {\n rules: input.rules.length,\n autoApplyThreshold: input.autoApplyThreshold,\n });\n }\n\n /**\n * Initialize default merge policies\n */\n private initializeDefaultPolicies(): void {\n // Conservative policy - prefer manual resolution\n this.mergePolicies.set('conservative', {\n name: 'conservative',\n description: 'Prefer manual resolution for most conflicts',\n rules: [\n {\n condition: '$.conflictType == \"metadata\" && $.severity == \"low\"',\n action: 'target_wins',\n priority: 1,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'never',\n });\n\n // Aggressive policy - auto-resolve when possible\n this.mergePolicies.set('aggressive', {\n name: 'aggressive',\n description: 'Auto-resolve conflicts when safe',\n rules: [\n {\n condition: '$.conflictType == \"sequence\"',\n action: 'merge_both',\n priority: 5,\n },\n {\n condition: '$.severity == \"low\"',\n action: 'source_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"medium\" && $.autoResolvable',\n action: 'merge_both',\n priority: 4,\n },\n ],\n autoApplyThreshold: 'medium',\n });\n\n // Default policy - balanced approach\n this.mergePolicies.set('default', {\n name: 'default',\n description: 'Balanced conflict resolution',\n rules: [\n {\n condition: '$.conflictType == \"sequence\" && $.severity == \"low\"',\n action: 'merge_both',\n priority: 3,\n },\n {\n condition: '$.conflictType == \"metadata\" && $.autoResolvable',\n action: 'target_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'low',\n });\n }\n\n // Helper methods\n private getStackManager(stackId: string): any {\n // Use DualStackManager's getStackManager method to get the right stack\n return this.dualStackManager.getStackManager(stackId);\n }\n\n private groupAnchorsByType(anchors: Anchor[]): Record<string, Anchor[]> {\n return anchors.reduce(\n (groups, anchor) => {\n if (!groups[anchor.type]) groups[anchor.type] = [];\n groups[anchor.type].push(anchor);\n return groups;\n },\n {} as Record<string, Anchor[]>\n );\n }\n\n private anchorsEqual(anchors1: Anchor[], anchors2: Anchor[]): boolean {\n if (anchors1.length !== anchors2.length) return false;\n\n // Sort by text for comparison\n const sorted1 = [...anchors1].sort((a, b) => a.text.localeCompare(b.text));\n const sorted2 = [...anchors2].sort((a, b) => a.text.localeCompare(b.text));\n\n return sorted1.every(\n (anchor, i) =>\n anchor.text === sorted2[i].text &&\n anchor.priority === sorted2[i].priority\n );\n }\n\n private evaluateRuleCondition(\n conflict: MergeConflict,\n condition: string\n ): boolean {\n // Simple condition evaluation - in real implementation would use JSONPath\n return (\n condition.includes(conflict.conflictType) ||\n condition.includes(conflict.severity)\n );\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/context/validation.ts"],
4
- "sourcesContent": ["/**\n * Input validation schemas for collaboration layer\n */\n\nimport { z } from 'zod';\nimport { ValidationError, ErrorCode } from '../errors/index.js';\n\n// Permission validation\nexport const StackPermissionsSchema = z.object({\n canRead: z.boolean(),\n canWrite: z.boolean(),\n canHandoff: z.boolean(),\n canMerge: z.boolean(),\n canAdminister: z.boolean(),\n});\n\n// Common string validations\nconst stackIdSchema = z.string().min(1).max(200);\nconst userIdSchema = z.string().min(1).max(100);\nconst frameIdSchema = z.string().min(1).max(100);\nconst teamIdSchema = z.string().min(1).max(100);\n\n// Dual Stack Manager validation\nexport const CreateSharedStackSchema = z.object({\n teamId: teamIdSchema,\n name: z.string().min(1).max(200),\n ownerId: userIdSchema,\n permissions: StackPermissionsSchema.optional(),\n});\n\nexport const SwitchStackSchema = z.object({\n stackId: stackIdSchema,\n});\n\n// Frame Handoff validation\nexport const FrameContextSchema = z.object({\n totalFrames: z.number().min(1).max(10000),\n frameTypes: z.array(z.string()).min(1).max(50),\n estimatedSize: z.number().min(0).max(1000000), // Max 1MB\n dependencies: z.array(z.string()).max(100),\n});\n\nexport const BusinessContextSchema = z.object({\n milestone: z.string().max(100).optional(),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional(),\n deadline: z.date().optional(),\n stakeholders: z.array(userIdSchema).max(20).optional(),\n});\n\nexport const HandoffRequestSchema = z.object({\n initiatedAt: z.date(),\n initiatorId: userIdSchema,\n frameContext: FrameContextSchema,\n businessContext: BusinessContextSchema.optional(),\n});\n\nexport const InitiateHandoffSchema = z.object({\n targetStackId: stackIdSchema,\n frameIds: z.array(frameIdSchema).min(1).max(1000),\n handoffRequest: HandoffRequestSchema,\n reviewerId: userIdSchema.optional(),\n description: z.string().max(1000).optional(),\n});\n\nexport const HandoffApprovalSchema = z.object({\n reviewerId: userIdSchema,\n decision: z.enum(['approved', 'rejected', 'needs_changes']),\n feedback: z.string().max(2000).optional(),\n suggestedChanges: z\n .array(\n z.object({\n frameId: frameIdSchema,\n suggestion: z.string().max(500),\n reason: z.string().max(300).optional(),\n })\n )\n .max(50)\n .optional(),\n});\n\n// Merge Resolution validation\nexport const ConflictResolutionSchema = z.object({\n strategy: z.enum(['source_wins', 'target_wins', 'merge_both', 'manual']),\n resolvedBy: userIdSchema,\n notes: z.string().max(1000).optional(),\n});\n\nexport const MergePolicyRuleSchema = z.object({\n condition: z.string().min(1).max(500),\n action: z.enum(['source_wins', 'target_wins', 'merge_both', 'manual_review']),\n priority: z.number().min(1).max(10),\n});\n\nexport const CreateMergePolicySchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n rules: z.array(MergePolicyRuleSchema).min(1).max(20),\n autoApplyThreshold: z.enum(['low', 'medium', 'high']),\n});\n\nexport const StartMergeSessionSchema = z.object({\n sourceStackId: stackIdSchema,\n targetStackId: stackIdSchema,\n frameIds: z.array(frameIdSchema).max(1000).optional(),\n policyName: z.string().max(100).optional(),\n});\n\n// Type exports for use in implementation\nexport type StackPermissions = z.infer<typeof StackPermissionsSchema>;\nexport type CreateSharedStackInput = z.infer<typeof CreateSharedStackSchema>;\nexport type SwitchStackInput = z.infer<typeof SwitchStackSchema>;\nexport type FrameContext = z.infer<typeof FrameContextSchema>;\nexport type BusinessContext = z.infer<typeof BusinessContextSchema>;\nexport type HandoffRequest = z.infer<typeof HandoffRequestSchema>;\nexport type InitiateHandoffInput = z.infer<typeof InitiateHandoffSchema>;\nexport type HandoffApprovalInput = z.infer<typeof HandoffApprovalSchema>;\nexport type ConflictResolutionInput = z.infer<typeof ConflictResolutionSchema>;\nexport type MergePolicyRule = z.infer<typeof MergePolicyRuleSchema>;\nexport type CreateMergePolicyInput = z.infer<typeof CreateMergePolicySchema>;\nexport type StartMergeSessionInput = z.infer<typeof StartMergeSessionSchema>;\n\n// Validation helper functions\nexport function validateInput<T>(schema: z.ZodSchema<T>, input: unknown): T {\n try {\n return schema.parse(input);\n } catch (error: unknown) {\n if (error instanceof z.ZodError) {\n const details = error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new ValidationError(\n `Validation failed: ${details}`,\n ErrorCode.VALIDATION_FAILED,\n { errors: error.errors }\n );\n }\n throw error;\n }\n}\n\nexport function validateInputSafe<T>(\n schema: z.ZodSchema<T>,\n input: unknown\n): { success: true; data: T } | { success: false; error: string } {\n try {\n const data = schema.parse(input);\n return { success: true, data };\n } catch (error: unknown) {\n if (error instanceof z.ZodError) {\n const details = error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n return { success: false, error: `Validation failed: ${details}` };\n }\n return { success: false, error: 'Unknown validation error' };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/batch-operations.ts"],
4
- "sourcesContent": ["/**\n * Batch Database Operations\n * High-performance bulk operations with transaction management\n */\n\nimport Database from 'better-sqlite3';\n// Connection pool imported when needed: getConnectionPool\nimport { logger } from '../monitoring/logger.js';\nimport { trace } from '../trace/index.js';\nimport { ErrorCode, wrapError } from '../errors/index.js';\n\nexport interface BatchOperation {\n table: string;\n operation: 'insert' | 'update' | 'delete';\n data: Record<string, any>[];\n onConflict?: 'ignore' | 'replace' | 'update';\n}\n\nexport interface BulkInsertOptions {\n batchSize?: number;\n onConflict?: 'ignore' | 'replace' | 'update';\n enableTransactions?: boolean;\n parallelTables?: boolean;\n}\n\nexport interface BatchStats {\n totalRecords: number;\n batchesProcessed: number;\n successfulInserts: number;\n failedInserts: number;\n totalTimeMs: number;\n avgBatchTimeMs: number;\n}\n\n/**\n * High-performance batch operations manager\n */\nexport class BatchOperationsManager {\n private db: Database.Database;\n private preparedStatements = new Map<string, Database.Statement>();\n private batchQueue: BatchOperation[] = [];\n private isProcessing = false;\n\n constructor(db?: Database.Database) {\n if (db) {\n this.db = db;\n this.initializePreparedStatements();\n } else {\n // Will be initialized when used with getConnectionPool().withConnection()\n this.db = undefined as any;\n }\n }\n\n /**\n * Add events in bulk with optimized batching\n */\n async bulkInsertEvents(\n events: Array<{\n frame_id: string;\n run_id: string;\n seq: number;\n event_type: string;\n payload: any;\n ts: number;\n }>,\n options: BulkInsertOptions = {}\n ): Promise<BatchStats> {\n const {\n batchSize = 100,\n onConflict = 'ignore',\n enableTransactions = true,\n } = options;\n\n return this.performBulkInsert('events', events, {\n batchSize,\n onConflict,\n enableTransactions,\n preprocessor: (event) => ({\n ...event,\n event_id: `evt_${event.frame_id}_${event.seq}_${Date.now()}`,\n payload: JSON.stringify(event.payload),\n }),\n });\n }\n\n /**\n * Add anchors in bulk\n */\n async bulkInsertAnchors(\n anchors: Array<{\n frame_id: string;\n type: string;\n text: string;\n priority: number;\n metadata: any;\n }>,\n options: BulkInsertOptions = {}\n ): Promise<BatchStats> {\n return this.performBulkInsert('anchors', anchors, {\n ...options,\n preprocessor: (anchor) => ({\n ...anchor,\n anchor_id: `anc_${anchor.frame_id}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n metadata: JSON.stringify(anchor.metadata),\n created_at: Date.now(),\n }),\n });\n }\n\n /**\n * Bulk update frame digests\n */\n async bulkUpdateFrameDigests(\n updates: Array<{\n frame_id: string;\n digest_text: string;\n digest_json: any;\n closed_at?: number;\n }>,\n options: BulkInsertOptions = {}\n ): Promise<BatchStats> {\n const { batchSize = 50, enableTransactions = true } = options;\n\n return trace.traceAsync(\n 'function',\n 'bulkUpdateFrameDigests',\n { count: updates.length },\n async () => {\n const startTime = performance.now();\n const stats: BatchStats = {\n totalRecords: updates.length,\n batchesProcessed: 0,\n successfulInserts: 0,\n failedInserts: 0,\n totalTimeMs: 0,\n avgBatchTimeMs: 0,\n };\n\n if (updates.length === 0) return stats;\n\n const stmt = this.db.prepare(`\n UPDATE frames \n SET digest_text = ?, \n digest_json = ?, \n closed_at = COALESCE(?, closed_at),\n state = CASE WHEN ? IS NOT NULL THEN 'closed' ELSE state END\n WHERE frame_id = ?\n `);\n\n const updateFn = (batch: typeof updates) => {\n for (const update of batch) {\n try {\n const result = stmt.run(\n update.digest_text,\n JSON.stringify(update.digest_json),\n update.closed_at,\n update.closed_at,\n update.frame_id\n );\n stats.successfulInserts += result.changes;\n } catch (error: unknown) {\n stats.failedInserts++;\n const wrappedError = wrapError(\n error,\n 'Failed to update frame digest',\n ErrorCode.DB_UPDATE_FAILED,\n { frameId: update.frame_id }\n );\n logger.warn('Failed to update frame digest', {\n frameId: update.frame_id,\n error: wrappedError.message,\n });\n }\n }\n };\n\n if (enableTransactions) {\n const transaction = this.db.transaction(updateFn);\n await this.processBatches(updates, batchSize, transaction, stats);\n } else {\n await this.processBatches(updates, batchSize, updateFn, stats);\n }\n\n stats.totalTimeMs = performance.now() - startTime;\n stats.avgBatchTimeMs =\n stats.batchesProcessed > 0\n ? stats.totalTimeMs / stats.batchesProcessed\n : 0;\n\n logger.info(\n 'Bulk frame digest update completed',\n stats as unknown as Record<string, unknown>\n );\n return stats;\n }\n );\n }\n\n /**\n * Generic bulk insert with preprocessing\n */\n private async performBulkInsert<T extends Record<string, any>>(\n table: string,\n records: T[],\n options: BulkInsertOptions & {\n preprocessor?: (record: T) => Record<string, any>;\n } = {}\n ): Promise<BatchStats> {\n const {\n batchSize = 100,\n onConflict = 'ignore',\n enableTransactions = true,\n preprocessor,\n } = options;\n\n return trace.traceAsync(\n 'function',\n `bulkInsert${table}`,\n { count: records.length },\n async () => {\n const startTime = performance.now();\n const stats: BatchStats = {\n totalRecords: records.length,\n batchesProcessed: 0,\n successfulInserts: 0,\n failedInserts: 0,\n totalTimeMs: 0,\n avgBatchTimeMs: 0,\n };\n\n if (records.length === 0) return stats;\n\n // Preprocess records if needed\n const processedRecords = preprocessor\n ? records.map(preprocessor)\n : records;\n\n // Build dynamic insert statement\n const firstRecord = processedRecords[0];\n const columns = Object.keys(firstRecord);\n const placeholders = columns.map(() => '?').join(', ');\n const conflictClause = this.getConflictClause(onConflict);\n\n const insertSql = `INSERT ${conflictClause} INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`;\n const stmt = this.db.prepare(insertSql);\n\n const insertFn = (batch: typeof processedRecords) => {\n for (const record of batch) {\n try {\n const values = columns.map((col: any) => record[col]);\n const result = stmt.run(...values);\n stats.successfulInserts += result.changes;\n } catch (error: unknown) {\n stats.failedInserts++;\n const wrappedError = wrapError(\n error,\n `Failed to insert ${table} record`,\n ErrorCode.DB_INSERT_FAILED,\n { table, record }\n );\n logger.warn(`Failed to insert ${table} record`, {\n record,\n error: wrappedError.message,\n });\n }\n }\n };\n\n if (enableTransactions) {\n const transaction = this.db.transaction(insertFn);\n await this.processBatches(\n processedRecords,\n batchSize,\n transaction,\n stats\n );\n } else {\n await this.processBatches(\n processedRecords,\n batchSize,\n insertFn,\n stats\n );\n }\n\n stats.totalTimeMs = performance.now() - startTime;\n stats.avgBatchTimeMs =\n stats.batchesProcessed > 0\n ? stats.totalTimeMs / stats.batchesProcessed\n : 0;\n\n logger.info(\n `Bulk ${table} insert completed`,\n stats as unknown as Record<string, unknown>\n );\n return stats;\n }\n );\n }\n\n /**\n * Process records in batches\n */\n private async processBatches<T>(\n records: T[],\n batchSize: number,\n processFn: (batch: T[]) => void,\n stats: BatchStats\n ): Promise<void> {\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n const batchStart = performance.now();\n\n try {\n processFn(batch);\n stats.batchesProcessed++;\n\n const batchTime = performance.now() - batchStart;\n logger.debug('Batch processed', {\n batchNumber: stats.batchesProcessed,\n records: batch.length,\n timeMs: batchTime.toFixed(2),\n });\n\n // Yield control to prevent blocking\n if (stats.batchesProcessed % 10 === 0) {\n await new Promise((resolve) => setImmediate(resolve));\n }\n } catch (error: unknown) {\n stats.failedInserts += batch.length;\n const wrappedError = wrapError(\n error,\n 'Batch processing failed',\n ErrorCode.DB_TRANSACTION_FAILED,\n { batchNumber: stats.batchesProcessed + 1, batchSize: batch.length }\n );\n logger.error('Batch processing failed', wrappedError, {\n batchNumber: stats.batchesProcessed + 1,\n batchSize: batch.length,\n });\n }\n }\n }\n\n /**\n * Queue batch operation for later processing\n */\n queueBatchOperation(operation: BatchOperation): void {\n this.batchQueue.push(operation);\n\n if (this.batchQueue.length >= 10 && !this.isProcessing) {\n setImmediate(() => this.processBatchQueue());\n }\n }\n\n /**\n * Process queued batch operations\n */\n async processBatchQueue(): Promise<void> {\n if (this.isProcessing || this.batchQueue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n const operations = [...this.batchQueue];\n this.batchQueue = [];\n\n try {\n const groupedOps = this.groupOperationsByTable(operations);\n\n for (const [table, tableOps] of groupedOps) {\n await this.processTableOperations(table, tableOps);\n }\n\n logger.info('Batch queue processed', {\n operations: operations.length,\n tables: groupedOps.size,\n });\n } catch (error: unknown) {\n const wrappedError = wrapError(\n error,\n 'Batch queue processing failed',\n ErrorCode.DB_TRANSACTION_FAILED,\n { operationsCount: operations.length }\n );\n logger.error('Batch queue processing failed', wrappedError);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Flush any remaining queued operations\n */\n async flush(): Promise<void> {\n if (this.batchQueue.length > 0) {\n await this.processBatchQueue();\n }\n }\n\n /**\n * Get SQL conflict clause\n */\n private getConflictClause(onConflict: string): string {\n switch (onConflict) {\n case 'ignore':\n return 'OR IGNORE';\n case 'replace':\n return 'OR REPLACE';\n case 'update':\n return 'ON CONFLICT DO UPDATE SET';\n default:\n return '';\n }\n }\n\n /**\n * Group operations by table for efficient processing\n */\n private groupOperationsByTable(\n operations: BatchOperation[]\n ): Map<string, BatchOperation[]> {\n const grouped = new Map<string, BatchOperation[]>();\n\n for (const op of operations) {\n if (!grouped.has(op.table)) {\n grouped.set(op.table, []);\n }\n grouped.get(op.table)!.push(op);\n }\n\n return grouped;\n }\n\n /**\n * Process all operations for a specific table\n */\n private async processTableOperations(\n table: string,\n operations: BatchOperation[]\n ): Promise<void> {\n for (const op of operations) {\n switch (op.operation) {\n case 'insert':\n await this.performBulkInsert(table, op.data, {\n onConflict: op.onConflict,\n });\n break;\n // Add update and delete operations as needed\n default:\n logger.warn('Unsupported batch operation', {\n table,\n operation: op.operation,\n });\n }\n }\n }\n\n /**\n * Initialize commonly used prepared statements\n */\n private initializePreparedStatements(): void {\n // Event insertion\n this.preparedStatements.set(\n 'insert_event',\n this.db.prepare(`\n INSERT OR IGNORE INTO events \n (event_id, frame_id, run_id, seq, event_type, payload, ts) \n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n );\n\n // Anchor insertion\n this.preparedStatements.set(\n 'insert_anchor',\n this.db.prepare(`\n INSERT OR IGNORE INTO anchors \n (anchor_id, frame_id, type, text, priority, metadata, created_at) \n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n );\n\n logger.info('Batch operations prepared statements initialized');\n }\n\n /**\n * Cleanup resources\n */\n cleanup(): void {\n // Modern better-sqlite3 automatically handles cleanup\n this.preparedStatements.clear();\n }\n}\n\n// Global batch operations manager\nlet globalBatchManager: BatchOperationsManager | null = null;\n\n/**\n * Get or create global batch operations manager\n */\nexport function getBatchManager(\n db?: Database.Database\n): BatchOperationsManager {\n if (!globalBatchManager) {\n globalBatchManager = new BatchOperationsManager(db);\n }\n return globalBatchManager;\n}\n\n/**\n * Convenience function for bulk event insertion\n */\nexport async function bulkInsertEvents(\n events: any[],\n options?: BulkInsertOptions\n): Promise<BatchStats> {\n const manager = getBatchManager();\n return manager.bulkInsertEvents(events, options);\n}\n\n/**\n * Convenience function for bulk anchor insertion\n */\nexport async function bulkInsertAnchors(\n anchors: any[],\n options?: BulkInsertOptions\n): Promise<BatchStats> {\n const manager = getBatchManager();\n return manager.bulkInsertAnchors(anchors, options);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/connection-pool.ts"],
4
- "sourcesContent": ["/**\n * Connection Pool Manager for ParadeDB\n * Manages PostgreSQL connection pooling with health checks and monitoring\n */\n\nimport { Pool, PoolClient, PoolConfig } from 'pg';\nimport { EventEmitter } from 'events';\nimport { logger } from '../monitoring/logger.js';\nimport { DatabaseError, ErrorCode } from '../errors/index.js';\n\nexport interface ConnectionPoolConfig extends PoolConfig {\n // Basic pool settings\n min?: number; // Minimum pool size (default: 2)\n max?: number; // Maximum pool size (default: 10)\n idleTimeoutMillis?: number; // Close idle connections after ms (default: 30000)\n connectionTimeoutMillis?: number; // Connection acquire timeout (default: 5000)\n\n // Health check settings\n healthCheckInterval?: number; // Health check frequency in ms (default: 30000)\n healthCheckQuery?: string; // Query to test connection health (default: 'SELECT 1')\n retryOnFailure?: boolean; // Retry failed connections (default: true)\n maxRetries?: number; // Max retry attempts (default: 3)\n retryDelayMs?: number; // Delay between retries (default: 1000)\n\n // Monitoring settings\n enableMetrics?: boolean; // Enable connection metrics (default: true)\n metricsInterval?: number; // Metrics collection interval (default: 60000)\n}\n\nexport interface ConnectionMetrics {\n totalConnections: number;\n idleConnections: number;\n activeConnections: number;\n waitingRequests: number;\n totalAcquired: number;\n totalReleased: number;\n totalErrors: number;\n averageAcquireTime: number;\n peakConnections: number;\n uptime: number;\n}\n\nexport interface ConnectionHealth {\n isHealthy: boolean;\n lastCheck: Date;\n consecutiveFailures: number;\n totalChecks: number;\n totalFailures: number;\n averageResponseTime: number;\n}\n\nexport class ConnectionPool extends EventEmitter {\n private pool: Pool;\n private config: Required<ConnectionPoolConfig>;\n private metrics: ConnectionMetrics;\n private health: ConnectionHealth;\n private healthCheckTimer?: NodeJS.Timeout;\n private metricsTimer?: NodeJS.Timeout;\n private startTime: Date;\n private badConnections = new Set<PoolClient>();\n private acquireTimes: number[] = [];\n\n constructor(config: ConnectionPoolConfig) {\n super();\n\n this.config = this.normalizeConfig(config);\n this.startTime = new Date();\n\n // Initialize metrics\n this.metrics = {\n totalConnections: 0,\n idleConnections: 0,\n activeConnections: 0,\n waitingRequests: 0,\n totalAcquired: 0,\n totalReleased: 0,\n totalErrors: 0,\n averageAcquireTime: 0,\n peakConnections: 0,\n uptime: 0,\n };\n\n // Initialize health\n this.health = {\n isHealthy: false,\n lastCheck: new Date(),\n consecutiveFailures: 0,\n totalChecks: 0,\n totalFailures: 0,\n averageResponseTime: 0,\n };\n\n // Create pool\n this.pool = new Pool(this.config);\n this.setupPoolEvents();\n\n // Start monitoring if enabled\n if (this.config.enableMetrics) {\n this.startMonitoring();\n }\n }\n\n private normalizeConfig(\n config: ConnectionPoolConfig\n ): Required<ConnectionPoolConfig> {\n return {\n ...config,\n min: config.min ?? 2,\n max: config.max ?? 10,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: config.connectionTimeoutMillis ?? 5000,\n healthCheckInterval: config.healthCheckInterval ?? 30000,\n healthCheckQuery: config.healthCheckQuery ?? 'SELECT 1',\n retryOnFailure: config.retryOnFailure ?? true,\n maxRetries: config.maxRetries ?? 3,\n retryDelayMs: config.retryDelayMs ?? 1000,\n enableMetrics: config.enableMetrics ?? true,\n metricsInterval: config.metricsInterval ?? 60000,\n };\n }\n\n private setupPoolEvents(): void {\n this.pool.on('connect', (client) => {\n logger.debug('New database connection established');\n this.metrics.totalConnections++;\n this.updatePeakConnections();\n this.emit('connect', client);\n });\n\n this.pool.on('acquire', (client) => {\n this.metrics.totalAcquired++;\n this.emit('acquire', client);\n });\n\n this.pool.on('release', (client) => {\n this.metrics.totalReleased++;\n this.emit('release', client);\n });\n\n this.pool.on('remove', (client) => {\n logger.debug('Database connection removed from pool');\n this.metrics.totalConnections--;\n this.emit('remove', client);\n });\n\n this.pool.on('error', (error) => {\n logger.error('Database pool error:', error);\n this.metrics.totalErrors++;\n this.emit('error', error);\n });\n }\n\n private updatePeakConnections(): void {\n const current = this.pool.totalCount;\n if (current > this.metrics.peakConnections) {\n this.metrics.peakConnections = current;\n }\n }\n\n private startMonitoring(): void {\n // Health checks\n if (this.config.healthCheckInterval > 0) {\n this.healthCheckTimer = setInterval(() => {\n this.performHealthCheck().catch((error) => {\n logger.error('Health check failed:', error);\n });\n }, this.config.healthCheckInterval);\n }\n\n // Metrics collection\n if (this.config.metricsInterval > 0) {\n this.metricsTimer = setInterval(() => {\n this.updateMetrics();\n this.emit('metrics', this.getMetrics());\n }, this.config.metricsInterval);\n }\n\n // Initial health check\n this.performHealthCheck().catch((error) => {\n logger.warn('Initial health check failed:', error);\n });\n }\n\n private async performHealthCheck(): Promise<void> {\n const startTime = Date.now();\n let client: PoolClient | undefined;\n\n try {\n this.health.totalChecks++;\n\n client = await this.pool.connect();\n await client.query(this.config.healthCheckQuery);\n\n const responseTime = Date.now() - startTime;\n this.updateHealthMetrics(true, responseTime);\n\n logger.debug(`Health check passed in ${responseTime}ms`);\n } catch (error: unknown) {\n const responseTime = Date.now() - startTime;\n this.updateHealthMetrics(false, responseTime);\n\n logger.warn(`Health check failed after ${responseTime}ms:`, error);\n\n if (\n this.config.retryOnFailure &&\n this.health.consecutiveFailures < this.config.maxRetries\n ) {\n setTimeout(() => {\n this.performHealthCheck().catch(() => {\n // Ignore retry failures\n });\n }, this.config.retryDelayMs);\n }\n } finally {\n if (client) {\n client.release();\n }\n }\n }\n\n private updateHealthMetrics(success: boolean, responseTime: number): void {\n this.health.lastCheck = new Date();\n\n if (success) {\n this.health.isHealthy = true;\n this.health.consecutiveFailures = 0;\n } else {\n this.health.isHealthy = false;\n this.health.consecutiveFailures++;\n this.health.totalFailures++;\n }\n\n // Update average response time (simple moving average of last 10 checks)\n const weight = Math.min(this.health.totalChecks, 10);\n this.health.averageResponseTime =\n (this.health.averageResponseTime * (weight - 1) + responseTime) / weight;\n }\n\n private updateMetrics(): void {\n this.metrics.idleConnections = this.pool.idleCount;\n this.metrics.activeConnections = this.pool.totalCount - this.pool.idleCount;\n this.metrics.waitingRequests = this.pool.waitingCount;\n this.metrics.uptime = Date.now() - this.startTime.getTime();\n\n // Update average acquire time\n if (this.acquireTimes.length > 0) {\n this.metrics.averageAcquireTime =\n this.acquireTimes.reduce((sum, time) => sum + time, 0) /\n this.acquireTimes.length;\n\n // Keep only recent acquire times (last 100)\n if (this.acquireTimes.length > 100) {\n this.acquireTimes = this.acquireTimes.slice(-100);\n }\n }\n }\n\n /**\n * Acquire a connection from the pool\n */\n async acquire(): Promise<PoolClient> {\n const startTime = Date.now();\n\n try {\n const client = await this.pool.connect();\n\n // Track acquire time\n const acquireTime = Date.now() - startTime;\n this.acquireTimes.push(acquireTime);\n\n // Check if connection is marked as bad\n if (this.badConnections.has(client)) {\n this.badConnections.delete(client);\n client.release(true); // Force removal\n return this.acquire(); // Try again\n }\n\n return client;\n } catch (error: unknown) {\n this.metrics.totalErrors++;\n logger.error('Failed to acquire connection:', error);\n throw new DatabaseError(\n 'Failed to acquire database connection',\n ErrorCode.DB_CONNECTION_FAILED,\n { pool: 'paradedb' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Release a connection back to the pool\n */\n release(client: PoolClient, error?: Error | boolean): void {\n if (error) {\n // Release with error - connection will be removed from pool\n client.release(true);\n } else {\n client.release();\n }\n }\n\n /**\n * Mark a connection as bad (will be removed on next acquire)\n */\n markConnectionAsBad(client: PoolClient): void {\n this.badConnections.add(client);\n logger.warn('Connection marked as bad and will be removed');\n }\n\n /**\n * Get current connection metrics\n */\n getMetrics(): ConnectionMetrics {\n this.updateMetrics();\n return { ...this.metrics };\n }\n\n /**\n * Get current health status\n */\n getHealth(): ConnectionHealth {\n return { ...this.health };\n }\n\n /**\n * Test connection to database\n */\n async ping(): Promise<boolean> {\n try {\n const client = await this.acquire();\n await client.query('SELECT 1');\n this.release(client);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get pool status information\n */\n getStatus() {\n return {\n totalCount: this.pool.totalCount,\n idleCount: this.pool.idleCount,\n waitingCount: this.pool.waitingCount,\n config: {\n min: this.config.min,\n max: this.config.max,\n idleTimeoutMillis: this.config.idleTimeoutMillis,\n connectionTimeoutMillis: this.config.connectionTimeoutMillis,\n },\n health: this.getHealth(),\n metrics: this.getMetrics(),\n };\n }\n\n /**\n * Close all connections and clean up\n */\n async close(): Promise<void> {\n logger.info('Closing connection pool');\n\n // Clear timers\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n }\n if (this.metricsTimer) {\n clearInterval(this.metricsTimer);\n }\n\n // Close pool\n await this.pool.end();\n\n // Clear bad connections set\n this.badConnections.clear();\n\n this.emit('close');\n logger.info('Connection pool closed');\n }\n\n /**\n * Drain pool gracefully (wait for active connections to finish)\n */\n async drain(timeoutMs = 30000): Promise<void> {\n logger.info('Draining connection pool');\n\n const startTime = Date.now();\n\n while (this.pool.totalCount - this.pool.idleCount > 0) {\n if (Date.now() - startTime > timeoutMs) {\n logger.warn('Pool drain timeout reached, forcing close');\n break;\n }\n\n // Wait a bit before checking again\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n await this.close();\n }\n\n /**\n * Execute a query using a pooled connection\n */\n async query<T = any>(\n text: string,\n params?: any[]\n ): Promise<{ rows: T[]; rowCount: number }> {\n const client = await this.acquire();\n\n try {\n const result = await client.query(text, params);\n return {\n rows: result.rows,\n rowCount: result.rowCount || 0,\n };\n } finally {\n this.release(client);\n }\n }\n\n /**\n * Execute multiple queries in a transaction\n */\n async transaction<T>(\n callback: (client: PoolClient) => Promise<T>\n ): Promise<T> {\n const client = await this.acquire();\n\n try {\n await client.query('BEGIN');\n const result = await callback(client);\n await client.query('COMMIT');\n return result;\n } catch (error: unknown) {\n try {\n await client.query('ROLLBACK');\n } catch (rollbackError: unknown) {\n logger.error('Transaction rollback failed:', rollbackError);\n this.markConnectionAsBad(client);\n }\n throw new DatabaseError(\n 'Transaction failed',\n ErrorCode.DB_TRANSACTION_FAILED,\n { operation: 'transaction' },\n error instanceof Error ? error : undefined\n );\n } finally {\n this.release(client);\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/database-adapter.ts"],
4
- "sourcesContent": ["/**\n * Database Adapter Interface\n * Provides abstraction layer for different database implementations\n * Supports SQLite (current) and ParadeDB (new) with seamless migration\n */\n\nimport type { Frame, Event, Anchor } from '../context/index.js';\nimport type { EmbeddingProvider } from './embedding-provider.js';\n\nexport interface QueryOptions {\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: 'ASC' | 'DESC';\n timeout?: number;\n}\n\nexport interface SearchOptions extends QueryOptions {\n query: string;\n searchType?: 'text' | 'vector' | 'hybrid';\n scoreThreshold?: number;\n fields?: string[];\n boost?: Record<string, number>;\n projectId?: string; // filter results to specific project\n}\n\nexport interface AggregationOptions {\n groupBy: string[];\n metrics: Array<{\n field: string;\n operation: 'count' | 'sum' | 'avg' | 'min' | 'max';\n alias?: string;\n }>;\n having?: Record<string, any>;\n}\n\nexport interface BulkOperation {\n type: 'insert' | 'update' | 'delete';\n table: string;\n data?: any;\n where?: Record<string, any>;\n}\n\nexport interface DatabaseStats {\n totalFrames: number;\n activeFrames: number;\n totalEvents: number;\n totalAnchors: number;\n diskUsage: number;\n lastVacuum?: Date;\n}\n\n// Database result type interfaces\nexport interface CountResult {\n count: number;\n}\n\nexport interface VersionResult {\n version: number;\n}\n\nexport interface FrameRow {\n frame_id: string;\n parent_frame_id?: string;\n project_id: string;\n run_id: string;\n type: string;\n name: string;\n state: string;\n depth: number;\n inputs: string;\n outputs: string;\n digest_text: string;\n digest_json: string;\n created_at: number;\n closed_at?: number;\n score?: number;\n}\n\nexport interface EventRow {\n event_id: string;\n frame_id: string;\n seq: number;\n type: string;\n text: string;\n metadata: string;\n}\n\nexport interface AnchorRow {\n anchor_id: string;\n frame_id: string;\n type: string;\n text: string;\n priority: number;\n created_at: number;\n metadata: string;\n}\n\nexport interface ProjectRegistryRow {\n project_id: string;\n repo_path: string;\n display_name: string | null;\n db_path: string;\n is_active: number;\n created_at: number;\n last_accessed: number;\n}\n\nexport abstract class DatabaseAdapter {\n protected readonly projectId: string;\n protected readonly config: any;\n\n constructor(projectId: string, config?: any) {\n this.projectId = projectId;\n this.config = config || {};\n }\n\n // Lifecycle methods\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n abstract isConnected(): boolean;\n abstract ping(): Promise<boolean>;\n\n // Schema management\n abstract initializeSchema(): Promise<void>;\n abstract migrateSchema(targetVersion: number): Promise<void>;\n abstract getSchemaVersion(): Promise<number>;\n\n // Frame operations\n abstract createFrame(frame: Partial<Frame>): Promise<string>;\n abstract getFrame(frameId: string): Promise<Frame | null>;\n abstract updateFrame(frameId: string, updates: Partial<Frame>): Promise<void>;\n abstract deleteFrame(frameId: string): Promise<void>;\n abstract getActiveFrames(runId?: string): Promise<Frame[]>;\n abstract closeFrame(frameId: string, outputs?: any): Promise<void>;\n\n // Event operations\n abstract createEvent(event: Partial<Event>): Promise<string>;\n abstract getFrameEvents(\n frameId: string,\n options?: QueryOptions\n ): Promise<Event[]>;\n abstract deleteFrameEvents(frameId: string): Promise<void>;\n\n // Anchor operations\n abstract createAnchor(anchor: Partial<Anchor>): Promise<string>;\n abstract getFrameAnchors(frameId: string): Promise<Anchor[]>;\n abstract deleteFrameAnchors(frameId: string): Promise<void>;\n\n // Search operations (enhanced for ParadeDB)\n abstract search(\n options: SearchOptions\n ): Promise<Array<Frame & { score: number }>>;\n abstract searchByVector(\n embedding: number[],\n options?: QueryOptions\n ): Promise<Array<Frame & { similarity: number }>>;\n abstract searchHybrid(\n textQuery: string,\n embedding: number[],\n weights?: { text: number; vector: number },\n mergeStrategy?: 'weighted' | 'rrf'\n ): Promise<Array<Frame & { score: number }>>;\n\n // Aggregation operations\n abstract aggregate(\n table: string,\n options: AggregationOptions\n ): Promise<Record<string, any>[]>;\n\n // Pattern detection\n abstract detectPatterns(timeRange?: { start: Date; end: Date }): Promise<\n Array<{\n pattern: string;\n type: string;\n frequency: number;\n lastSeen: Date;\n }>\n >;\n\n // Bulk operations\n abstract executeBulk(operations: BulkOperation[]): Promise<void>;\n abstract vacuum(): Promise<void>;\n abstract analyze(): Promise<void>;\n\n // Statistics\n abstract getStats(): Promise<DatabaseStats>;\n abstract getQueryStats(): Promise<\n Array<{\n query: string;\n calls: number;\n meanTime: number;\n totalTime: number;\n }>\n >;\n\n // Transaction support\n abstract beginTransaction(): Promise<void>;\n abstract commitTransaction(): Promise<void>;\n abstract rollbackTransaction(): Promise<void>;\n abstract inTransaction(\n callback: (adapter: DatabaseAdapter) => Promise<void>\n ): Promise<void>;\n\n // Export/Import for migration\n abstract exportData(\n tables: string[],\n format: 'json' | 'parquet' | 'csv'\n ): Promise<Buffer>;\n abstract importData(\n data: Buffer,\n format: 'json' | 'parquet' | 'csv',\n options?: { truncate?: boolean; upsert?: boolean }\n ): Promise<void>;\n\n /** Returns the configured embedding provider, if any */\n getEmbeddingProvider(): EmbeddingProvider | undefined {\n return undefined;\n }\n\n // Maintenance state (no-op defaults, overridden in SQLiteAdapter)\n async getMaintenanceState(_key: string): Promise<string | null> {\n return null;\n }\n\n async setMaintenanceState(_key: string, _value: string): Promise<void> {\n // No-op default \u2014 subclasses may override\n }\n\n // Garbage collection (no-op default, overridden in SQLiteAdapter)\n async runGC(_options?: {\n retentionDays?: number;\n batchSize?: number;\n dryRun?: boolean;\n }): Promise<{\n framesDeleted: number;\n eventsDeleted: number;\n anchorsDeleted: number;\n embeddingsDeleted: number;\n ftsEntriesDeleted: number;\n }> {\n return {\n framesDeleted: 0,\n eventsDeleted: 0,\n anchorsDeleted: 0,\n embeddingsDeleted: 0,\n ftsEntriesDeleted: 0,\n };\n }\n\n // Retrieval logging (no-op defaults, overridden in SQLiteAdapter)\n async logRetrieval(_entry: {\n queryText: string;\n strategy: string;\n resultsCount: number;\n topScore: number | null;\n latencyMs: number;\n resultFrameIds: string[];\n }): Promise<void> {\n // No-op default \u2014 subclasses may override\n }\n\n async getRetrievalStats(_sinceDays?: number): Promise<{\n totalQueries: number;\n avgLatencyMs: number;\n p95LatencyMs: number;\n strategyDistribution: Record<string, number>;\n avgResultsCount: number;\n queriesWithNoResults: number;\n }> {\n // No-op default\n return {\n totalQueries: 0,\n avgLatencyMs: 0,\n p95LatencyMs: 0,\n strategyDistribution: {},\n avgResultsCount: 0,\n queriesWithNoResults: 0,\n };\n }\n\n // Project registry (no-op defaults, overridden in SQLiteAdapter)\n async registerProject(_project: {\n projectId: string;\n repoPath: string;\n displayName?: string;\n dbPath: string;\n }): Promise<void> {\n // No-op default\n }\n\n async getRegisteredProjects(): Promise<\n Array<{\n projectId: string;\n repoPath: string;\n displayName: string | null;\n dbPath: string;\n isActive: boolean;\n createdAt: number;\n lastAccessed: number;\n }>\n > {\n return [];\n }\n\n async setActiveProject(_projectId: string): Promise<void> {\n // No-op default\n }\n\n async getActiveProject(): Promise<string | null> {\n return null;\n }\n\n async removeProject(_projectId: string): Promise<boolean> {\n return false;\n }\n\n async touchProject(_projectId: string): Promise<void> {\n // No-op default\n }\n\n // Utility methods\n protected generateId(): string {\n return crypto.randomUUID();\n }\n\n protected sanitizeQuery(query: string): string {\n // DEPRECATED: Use parameterized queries instead\n // This method is kept for legacy compatibility but should not be used\n console.warn(\n 'sanitizeQuery() is deprecated and unsafe - use parameterized queries'\n );\n return query.replace(/[;'\"\\\\]/g, '');\n }\n\n protected buildWhereClause(conditions: Record<string, any>): string {\n const clauses = Object.entries(conditions).map(([key, value]) => {\n if (value === null) {\n return `${key} IS NULL`;\n } else if (Array.isArray(value)) {\n return `${key} IN (${value.map(() => '?').join(',')})`;\n } else {\n return `${key} = ?`;\n }\n });\n return clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n }\n\n protected buildOrderByClause(\n orderBy?: string,\n direction?: 'ASC' | 'DESC'\n ): string {\n if (!orderBy) return '';\n // Whitelist validation: allow letters, numbers, underscore, dot (for table aliasing)\n const isSafe = /^[a-zA-Z0-9_.]+$/.test(orderBy);\n if (!isSafe) {\n // Drop ORDER BY if unsafe to prevent injection via column name\n return '';\n }\n const dir = direction === 'DESC' ? 'DESC' : 'ASC';\n return ` ORDER BY ${orderBy} ${dir}`;\n }\n\n protected buildLimitClause(limit?: number, offset?: number): string {\n if (!limit) return '';\n let clause = ` LIMIT ${limit}`;\n if (offset) clause += ` OFFSET ${offset}`;\n return clause;\n }\n}\n\n// Feature flags for gradual migration\nexport interface DatabaseFeatures {\n supportsFullTextSearch: boolean;\n supportsVectorSearch: boolean;\n supportsPartitioning: boolean;\n supportsAnalytics: boolean;\n supportsCompression: boolean;\n supportsMaterializedViews: boolean;\n supportsParallelQueries: boolean;\n}\n\nexport abstract class FeatureAwareDatabaseAdapter extends DatabaseAdapter {\n abstract getFeatures(): DatabaseFeatures;\n\n async canUseFeature(feature: keyof DatabaseFeatures): Promise<boolean> {\n const features = this.getFeatures();\n return features[feature] || false;\n }\n}\n"],
5
- "mappings": ";;;;AA4GO,MAAe,gBAAgB;AAAA,EACjB;AAAA,EACA;AAAA,EAEnB,YAAY,WAAmB,QAAc;AAC3C,SAAK,YAAY;AACjB,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AAAA;AAAA,EAqGA,uBAAsD;AACpD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,oBAAoB,MAAsC;AAC9D,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,MAAc,QAA+B;AAAA,EAEvE;AAAA;AAAA,EAGA,MAAM,MAAM,UAUT;AACD,WAAO;AAAA,MACL,eAAe;AAAA,MACf,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAa,QAOD;AAAA,EAElB;AAAA,EAEA,MAAM,kBAAkB,YAOrB;AAED,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,sBAAsB,CAAC;AAAA,MACvB,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,UAKJ;AAAA,EAElB;AAAA,EAEA,MAAM,wBAUJ;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,iBAAiB,YAAmC;AAAA,EAE1D;AAAA,EAEA,MAAM,mBAA2C;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,YAAsC;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,YAAmC;AAAA,EAEtD;AAAA;AAAA,EAGU,aAAqB;AAC7B,WAAO,OAAO,WAAW;AAAA,EAC3B;AAAA,EAEU,cAAc,OAAuB;AAG7C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO,MAAM,QAAQ,YAAY,EAAE;AAAA,EACrC;AAAA,EAEU,iBAAiB,YAAyC;AAClE,UAAM,UAAU,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/D,UAAI,UAAU,MAAM;AAClB,eAAO,GAAG,GAAG;AAAA,MACf,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,eAAO,GAAG,GAAG,QAAQ,MAAM,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA,MACrD,OAAO;AACL,eAAO,GAAG,GAAG;AAAA,MACf;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,SAAS,IAAI,SAAS,QAAQ,KAAK,OAAO,CAAC,KAAK;AAAA,EACjE;AAAA,EAEU,mBACR,SACA,WACQ;AACR,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,QAAI,CAAC,QAAQ;AAEX,aAAO;AAAA,IACT;AACA,UAAM,MAAM,cAAc,SAAS,SAAS;AAC5C,WAAO,aAAa,OAAO,IAAI,GAAG;AAAA,EACpC;AAAA,EAEU,iBAAiB,OAAgB,QAAyB;AAClE,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,SAAS,UAAU,KAAK;AAC5B,QAAI,OAAQ,WAAU,WAAW,MAAM;AACvC,WAAO;AAAA,EACT;AACF;AAaO,MAAe,oCAAoC,gBAAgB;AAAA,EAGxE,MAAM,cAAc,SAAmD;AACrE,UAAM,WAAW,KAAK,YAAY;AAClC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/embedding-provider-factory.ts"],
4
- "sourcesContent": ["/**\n * Embedding Provider Factory\n * Config-driven creation with fallback chain support.\n * Never throws \u2014 returns null when no provider is available.\n */\n\nimport type { EmbeddingProvider } from './embedding-provider.js';\nimport { OllamaEmbeddingProvider } from './ollama-embedding-provider.js';\nimport { OpenAIEmbeddingProvider } from './openai-embedding-provider.js';\n\nexport type EmbeddingProviderType =\n | 'transformers'\n | 'ollama'\n | 'openai'\n | 'none';\n\nexport interface EmbeddingProviderConfig {\n provider: EmbeddingProviderType;\n model?: string;\n dimension?: number;\n apiKey?: string;\n baseUrl?: string;\n fallbackProviders?: EmbeddingProviderType[];\n}\n\nexport class EmbeddingProviderFactory {\n /**\n * Create an embedding provider based on config.\n * Tries the primary provider first, then fallbacks in order.\n * Returns null if no provider is available.\n */\n static async create(\n config: EmbeddingProviderConfig\n ): Promise<EmbeddingProvider | null> {\n const providers: EmbeddingProviderType[] = [\n config.provider,\n ...(config.fallbackProviders ?? []),\n ];\n\n for (const p of providers) {\n if (p === 'none') return null;\n try {\n const provider = await EmbeddingProviderFactory.tryCreate(p, config);\n if (provider) return provider;\n } catch {\n // Swallow \u2014 try next fallback\n }\n }\n return null;\n }\n\n private static async tryCreate(\n type: EmbeddingProviderType,\n config: EmbeddingProviderConfig\n ): Promise<EmbeddingProvider | null> {\n switch (type) {\n case 'transformers': {\n const { createTransformersProvider } =\n await import('./transformers-embedding-provider.js');\n return createTransformersProvider(config.model, config.dimension);\n }\n case 'ollama':\n return EmbeddingProviderFactory.createOllamaProvider(config);\n case 'openai':\n return EmbeddingProviderFactory.createOpenAIProvider(config);\n case 'none':\n return null;\n default:\n return null;\n }\n }\n\n private static async createOllamaProvider(\n config: EmbeddingProviderConfig\n ): Promise<EmbeddingProvider | null> {\n try {\n const baseUrl = config.baseUrl ?? 'http://localhost:11434';\n const response = await fetch(`${baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n if (!response.ok) return null;\n return new OllamaEmbeddingProvider(\n baseUrl,\n config.model ?? 'nomic-embed-text',\n config.dimension ?? 768\n );\n } catch {\n return null;\n }\n }\n\n private static async createOpenAIProvider(\n config: EmbeddingProviderConfig\n ): Promise<EmbeddingProvider | null> {\n const apiKey = config.apiKey ?? process.env['OPENAI_API_KEY'];\n if (!apiKey) return null;\n return new OpenAIEmbeddingProvider(\n apiKey,\n config.model ?? 'text-embedding-3-small',\n config.dimension ?? 1536\n );\n }\n}\n"],
5
- "mappings": ";;;;AAOA,SAAS,+BAA+B;AACxC,SAAS,+BAA+B;AAiBjC,MAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpC,aAAa,OACX,QACmC;AACnC,UAAM,YAAqC;AAAA,MACzC,OAAO;AAAA,MACP,GAAI,OAAO,qBAAqB,CAAC;AAAA,IACnC;AAEA,eAAW,KAAK,WAAW;AACzB,UAAI,MAAM,OAAQ,QAAO;AACzB,UAAI;AACF,cAAM,WAAW,MAAM,yBAAyB,UAAU,GAAG,MAAM;AACnE,YAAI,SAAU,QAAO;AAAA,MACvB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAqB,UACnB,MACA,QACmC;AACnC,YAAQ,MAAM;AAAA,MACZ,KAAK,gBAAgB;AACnB,cAAM,EAAE,2BAA2B,IACjC,MAAM,OAAO,sCAAsC;AACrD,eAAO,2BAA2B,OAAO,OAAO,OAAO,SAAS;AAAA,MAClE;AAAA,MACA,KAAK;AACH,eAAO,yBAAyB,qBAAqB,MAAM;AAAA,MAC7D,KAAK;AACH,eAAO,yBAAyB,qBAAqB,MAAM;AAAA,MAC7D,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,aAAqB,qBACnB,QACmC;AACnC,QAAI;AACF,YAAM,UAAU,OAAO,WAAW;AAClC,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,aAAa;AAAA,QAClD,QAAQ,YAAY,QAAQ,GAAI;AAAA,MAClC,CAAC;AACD,UAAI,CAAC,SAAS,GAAI,QAAO;AACzB,aAAO,IAAI;AAAA,QACT;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,OAAO,aAAa;AAAA,MACtB;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAqB,qBACnB,QACmC;AACnC,UAAM,SAAS,OAAO,UAAU,QAAQ,IAAI,gBAAgB;AAC5D,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,IAAI;AAAA,MACT;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,OAAO,aAAa;AAAA,IACtB;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/embedding-provider.ts"],
4
- "sourcesContent": ["/**\n * Embedding Provider Interface\n * Abstraction for generating vector embeddings from text\n */\n\nexport interface EmbeddingProvider {\n /** Generate embedding for a single text */\n embed(text: string): Promise<number[]>;\n /** Generate embeddings for multiple texts */\n embedBatch(texts: string[]): Promise<number[][]>;\n /** Dimensionality of the embedding vectors */\n dimension: number;\n}\n\n/**\n * No-op provider that disables vector search.\n * Used as default when no real provider is configured.\n */\nexport class NoOpEmbeddingProvider implements EmbeddingProvider {\n readonly dimension = 0;\n\n async embed(_text: string): Promise<number[]> {\n return [];\n }\n\n async embedBatch(_texts: string[]): Promise<number[][]> {\n return [];\n }\n}\n"],
5
- "mappings": ";;;;AAkBO,MAAM,sBAAmD;AAAA,EACrD,YAAY;AAAA,EAErB,MAAM,MAAM,OAAkC;AAC5C,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,WAAW,QAAuC;AACtD,WAAO,CAAC;AAAA,EACV;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/migration-manager.ts"],
4
- "sourcesContent": ["/**\n * Migration Manager for Dual-Write Strategy\n * Enables seamless migration between SQLite and ParadeDB with zero downtime\n */\n\nimport { EventEmitter } from 'events';\nimport { DatabaseAdapter } from './database-adapter.js';\nimport { logger } from '../monitoring/logger.js';\nimport { DatabaseError, ErrorCode, wrapError } from '../errors/index.js';\n\nexport interface MigrationConfig {\n sourceAdapter: DatabaseAdapter;\n targetAdapter: DatabaseAdapter;\n batchSize?: number;\n retryAttempts?: number;\n retryDelayMs?: number;\n verifyData?: boolean;\n enableDualWrite?: boolean;\n progressCallback?: (progress: MigrationProgress) => void;\n}\n\nexport interface MigrationProgress {\n phase:\n | 'initializing'\n | 'migrating'\n | 'verifying'\n | 'completing'\n | 'completed'\n | 'failed';\n totalRecords: number;\n processedRecords: number;\n percentage: number;\n startTime: Date;\n estimatedEndTime?: Date;\n currentTable?: string;\n errors: Array<{ table: string; error: string; timestamp: Date }>;\n warnings: Array<{ table: string; warning: string; timestamp: Date }>;\n}\n\nexport interface MigrationStrategy {\n type: 'online' | 'offline' | 'dual-write';\n allowWrites: boolean;\n verifyIntegrity: boolean;\n fallbackOnError: boolean;\n}\n\nexport interface TableMigrationPlan {\n table: string;\n priority: number;\n estimatedRows: number;\n dependencies: string[];\n strategy: 'full' | 'incremental' | 'skip';\n}\n\nexport class MigrationManager extends EventEmitter {\n private config: Required<MigrationConfig>;\n private progress: MigrationProgress;\n private isRunning = false;\n private isPaused = false;\n private abortController?: AbortController;\n\n constructor(config: MigrationConfig) {\n super();\n\n this.validateConfig(config);\n this.config = this.normalizeConfig(config);\n this.progress = this.initializeProgress();\n }\n\n private validateConfig(config: MigrationConfig): void {\n if (!config.sourceAdapter || !config.targetAdapter) {\n throw new DatabaseError(\n 'Source and target adapters are required',\n ErrorCode.DB_MIGRATION_FAILED,\n { reason: 'missing_adapters' }\n );\n }\n\n if (\n config.batchSize &&\n (config.batchSize < 1 || config.batchSize > 10000)\n ) {\n throw new DatabaseError(\n 'Batch size must be between 1 and 10000',\n ErrorCode.DB_MIGRATION_FAILED,\n { batchSize: config.batchSize }\n );\n }\n\n if (\n config.retryAttempts &&\n (config.retryAttempts < 0 || config.retryAttempts > 10)\n ) {\n throw new DatabaseError(\n 'Retry attempts must be between 0 and 10',\n ErrorCode.DB_MIGRATION_FAILED,\n { retryAttempts: config.retryAttempts }\n );\n }\n\n if (\n config.retryDelayMs &&\n (config.retryDelayMs < 0 || config.retryDelayMs > 30000)\n ) {\n throw new DatabaseError(\n 'Retry delay must be between 0 and 30000ms',\n ErrorCode.DB_MIGRATION_FAILED,\n { retryDelayMs: config.retryDelayMs }\n );\n }\n }\n\n private normalizeConfig(config: MigrationConfig): Required<MigrationConfig> {\n return {\n ...config,\n batchSize: config.batchSize ?? 1000,\n retryAttempts: config.retryAttempts ?? 3,\n retryDelayMs: config.retryDelayMs ?? 1000,\n verifyData: config.verifyData ?? true,\n enableDualWrite: config.enableDualWrite ?? true,\n progressCallback: config.progressCallback ?? (() => {}),\n };\n }\n\n private initializeProgress(): MigrationProgress {\n return {\n phase: 'initializing',\n totalRecords: 0,\n processedRecords: 0,\n percentage: 0,\n startTime: new Date(),\n errors: [],\n warnings: [],\n };\n }\n\n async planMigration(): Promise<TableMigrationPlan[]> {\n logger.info('Planning migration strategy');\n\n const plan: TableMigrationPlan[] = [];\n const tables = ['frames', 'events', 'anchors'];\n\n for (const table of tables) {\n try {\n const stats = await this.config.sourceAdapter.getStats();\n const estimatedRows = this.estimateTableRows(table, stats);\n\n plan.push({\n table,\n priority: this.getTablePriority(table),\n estimatedRows,\n dependencies: this.getTableDependencies(table),\n strategy: 'full',\n });\n } catch (error: unknown) {\n logger.warn(`Failed to estimate rows for table ${table}:`, error);\n plan.push({\n table,\n priority: this.getTablePriority(table),\n estimatedRows: 0,\n dependencies: this.getTableDependencies(table),\n strategy: 'skip',\n });\n }\n }\n\n // Sort by priority (dependencies first)\n plan.sort((a, b) => a.priority - b.priority);\n\n const totalRecords = plan.reduce((sum, p) => sum + p.estimatedRows, 0);\n this.progress.totalRecords = totalRecords;\n\n logger.info(\n `Migration plan: ${plan.length} tables, ~${totalRecords} records`\n );\n return plan;\n }\n\n private estimateTableRows(table: string, stats: any): number {\n switch (table) {\n case 'frames':\n return stats.totalFrames || 0;\n case 'events':\n return stats.totalEvents || 0;\n case 'anchors':\n return stats.totalAnchors || 0;\n default:\n return 0;\n }\n }\n\n private getTablePriority(table: string): number {\n const priorities = { frames: 1, events: 2, anchors: 3 };\n return priorities[table as keyof typeof priorities] || 99;\n }\n\n private getTableDependencies(table: string): string[] {\n const dependencies = {\n frames: [],\n events: ['frames'],\n anchors: ['frames'],\n };\n return dependencies[table as keyof typeof dependencies] || [];\n }\n\n async migrate(\n strategy: MigrationStrategy = {\n type: 'online',\n allowWrites: true,\n verifyIntegrity: true,\n fallbackOnError: true,\n }\n ): Promise<void> {\n if (this.isRunning) {\n throw new DatabaseError(\n 'Migration already in progress',\n ErrorCode.DB_MIGRATION_FAILED,\n { reason: 'already_running' }\n );\n }\n\n this.isRunning = true;\n this.abortController = new AbortController();\n\n try {\n logger.info('Starting database migration', strategy);\n this.updateProgress({ phase: 'initializing' });\n\n // Validate adapters\n await this.validateAdapters();\n\n // Create migration plan\n const plan = await this.planMigration();\n\n // Initialize target schema\n await this.initializeTargetSchema();\n\n // Enable dual-write if requested\n if (strategy.type === 'dual-write' && this.config.enableDualWrite) {\n await this.enableDualWrite();\n }\n\n // Execute migration\n this.updateProgress({ phase: 'migrating' });\n await this.executeMigrationPlan(plan, strategy);\n\n // Verify data integrity\n if (strategy.verifyIntegrity) {\n this.updateProgress({ phase: 'verifying' });\n await this.verifyDataIntegrity(plan);\n }\n\n // Complete migration\n this.updateProgress({ phase: 'completing' });\n await this.completeMigration(strategy);\n\n this.updateProgress({ phase: 'completed', percentage: 100 });\n logger.info('Migration completed successfully');\n this.emit('completed', this.progress);\n } catch (error: unknown) {\n this.updateProgress({ phase: 'failed' });\n\n // Sanitize error for logging\n const sanitizedError = this.sanitizeError(error);\n logger.error('Migration failed:', sanitizedError);\n\n if (strategy.fallbackOnError) {\n try {\n await this.rollbackMigration();\n } catch (rollbackError: unknown) {\n logger.error('Rollback failed:', this.sanitizeError(rollbackError));\n }\n }\n\n // Create user-safe error message\n const userError = new DatabaseError(\n 'Migration failed. Check logs for details.',\n ErrorCode.DB_MIGRATION_FAILED,\n { phase: this.progress.phase },\n error instanceof Error ? error : undefined\n );\n this.emit('failed', userError);\n throw userError;\n } finally {\n this.isRunning = false;\n this.abortController = undefined;\n }\n }\n\n private async validateAdapters(): Promise<void> {\n logger.debug('Validating database adapters');\n\n // Check source adapter\n if (!this.config.sourceAdapter.isConnected()) {\n await this.config.sourceAdapter.connect();\n }\n\n if (!(await this.config.sourceAdapter.ping())) {\n throw new DatabaseError(\n 'Source adapter is not responding',\n ErrorCode.DB_CONNECTION_FAILED,\n { adapter: 'source' }\n );\n }\n\n // Check target adapter\n if (!this.config.targetAdapter.isConnected()) {\n await this.config.targetAdapter.connect();\n }\n\n if (!(await this.config.targetAdapter.ping())) {\n throw new DatabaseError(\n 'Target adapter is not responding',\n ErrorCode.DB_CONNECTION_FAILED,\n { adapter: 'target' }\n );\n }\n\n // Verify schema compatibility\n const sourceVersion = await this.config.sourceAdapter.getSchemaVersion();\n const targetVersion = await this.config.targetAdapter.getSchemaVersion();\n\n if (sourceVersion !== targetVersion) {\n logger.warn(\n `Schema version mismatch: source=${sourceVersion}, target=${targetVersion}`\n );\n this.addWarning('Schema version mismatch detected');\n }\n }\n\n private async initializeTargetSchema(): Promise<void> {\n logger.debug('Initializing target schema');\n\n try {\n await this.config.targetAdapter.initializeSchema();\n } catch (error: unknown) {\n logger.error('Failed to initialize target schema:', error);\n throw new DatabaseError(\n 'Target schema initialization failed',\n ErrorCode.DB_SCHEMA_ERROR,\n { operation: 'initializeSchema' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async enableDualWrite(): Promise<void> {\n logger.info('Enabling dual-write mode');\n // This would typically involve configuring the application to write to both databases\n // For now, we'll just log the intention\n this.addWarning(\n 'Dual-write mode enabled - ensure application routes writes to both adapters'\n );\n }\n\n private async executeMigrationPlan(\n plan: TableMigrationPlan[],\n strategy: MigrationStrategy\n ): Promise<void> {\n for (const tablePlan of plan) {\n if (this.abortController?.signal.aborted) {\n throw new DatabaseError(\n 'Migration aborted by user',\n ErrorCode.DB_MIGRATION_FAILED,\n { reason: 'user_abort' }\n );\n }\n\n if (tablePlan.strategy === 'skip') {\n logger.info(`Skipping table: ${tablePlan.table}`);\n continue;\n }\n\n this.updateProgress({ currentTable: tablePlan.table });\n await this.migrateTable(tablePlan, strategy);\n }\n }\n\n private async migrateTable(\n plan: TableMigrationPlan,\n _strategy: MigrationStrategy\n ): Promise<void> {\n logger.info(`Migrating table: ${plan.table} (~${plan.estimatedRows} rows)`);\n\n let offset = 0;\n let migratedRows = 0;\n\n while (true) {\n if (this.abortController?.signal.aborted || this.isPaused) {\n break;\n }\n\n try {\n // Get batch of data from source\n const batch = await this.getBatch(\n plan.table,\n offset,\n this.config.batchSize\n );\n\n if (batch.length === 0) {\n break; // No more data\n }\n\n // Migrate batch to target\n await this.migrateBatch(plan.table, batch);\n\n migratedRows += batch.length;\n offset += this.config.batchSize;\n\n this.progress.processedRecords += batch.length;\n this.updateProgressPercentage();\n\n // Adaptive delay based on system resources\n await this.sleep(this.calculateAdaptiveDelay());\n } catch (error: unknown) {\n this.addError(plan.table, `Batch migration failed: ${error}`);\n\n if (this.config.retryAttempts > 0) {\n await this.retryBatch(plan.table, offset, this.config.batchSize);\n } else {\n throw wrapError(\n error,\n `Batch migration failed for table ${plan.table}`,\n ErrorCode.DB_MIGRATION_FAILED,\n { table: plan.table, offset }\n );\n }\n }\n }\n\n logger.info(\n `Completed migrating table ${plan.table}: ${migratedRows} rows`\n );\n }\n\n private async getBatch(\n table: string,\n offset: number,\n limit: number\n ): Promise<any[]> {\n // Validate table name against whitelist\n const allowedTables = ['frames', 'events', 'anchors'] as const;\n if (!allowedTables.includes(table as any)) {\n throw new DatabaseError(\n `Invalid table name: ${table}`,\n ErrorCode.DB_QUERY_FAILED,\n { table, allowedTables }\n );\n }\n\n // Validate and bound parameters\n const safeLimit = Math.max(1, Math.min(limit, 10000));\n const safeOffset = Math.max(0, offset);\n\n // TODO: Use these options when adapter methods support pagination\n void safeLimit;\n void safeOffset;\n\n switch (table) {\n case 'frames':\n // This would need to be implemented in the adapter\n return []; // Placeholder\n case 'events':\n return []; // Placeholder\n case 'anchors':\n return []; // Placeholder\n default:\n throw new DatabaseError(\n `Unsupported table: ${table}`,\n ErrorCode.DB_QUERY_FAILED,\n { table }\n );\n }\n }\n\n private async migrateBatch(table: string, batch: any[]): Promise<void> {\n // Validate table name\n const allowedTables = ['frames', 'events', 'anchors'] as const;\n if (!allowedTables.includes(table as any)) {\n throw new DatabaseError(\n `Invalid table name: ${table}`,\n ErrorCode.DB_INSERT_FAILED,\n { table }\n );\n }\n\n // Use transaction for batch safety\n await this.config.targetAdapter.inTransaction(async (adapter) => {\n const operations = batch.map((row) => ({\n type: 'insert' as const,\n table,\n data: this.validateRowData(table, row),\n }));\n\n await adapter.executeBulk(operations);\n });\n }\n\n private validateRowData(table: string, row: any): any {\n if (!row || typeof row !== 'object') {\n throw new DatabaseError(\n `Invalid row data for table ${table}`,\n ErrorCode.DB_INSERT_FAILED,\n { table, rowType: typeof row }\n );\n }\n\n switch (table) {\n case 'frames':\n return this.validateFrameRow(row);\n case 'events':\n return this.validateEventRow(row);\n case 'anchors':\n return this.validateAnchorRow(row);\n default:\n throw new DatabaseError(\n `Unknown table: ${table}`,\n ErrorCode.DB_INSERT_FAILED,\n { table }\n );\n }\n }\n\n private validateFrameRow(row: any): any {\n const required = [\n 'frame_id',\n 'project_id',\n 'run_id',\n 'type',\n 'name',\n 'state',\n 'depth',\n ];\n for (const field of required) {\n if (!(field in row)) {\n throw new DatabaseError(\n `Missing required field ${field} in frame row`,\n ErrorCode.DB_CONSTRAINT_VIOLATION,\n { table: 'frames', missingField: field }\n );\n }\n }\n return row;\n }\n\n private validateEventRow(row: any): any {\n const required = ['event_id', 'frame_id', 'seq', 'type', 'text'];\n for (const field of required) {\n if (!(field in row)) {\n throw new DatabaseError(\n `Missing required field ${field} in event row`,\n ErrorCode.DB_CONSTRAINT_VIOLATION,\n { table: 'events', missingField: field }\n );\n }\n }\n return row;\n }\n\n private validateAnchorRow(row: any): any {\n const required = ['anchor_id', 'frame_id', 'type', 'text', 'priority'];\n for (const field of required) {\n if (!(field in row)) {\n throw new DatabaseError(\n `Missing required field ${field} in anchor row`,\n ErrorCode.DB_CONSTRAINT_VIOLATION,\n { table: 'anchors', missingField: field }\n );\n }\n }\n return row;\n }\n\n private async retryBatch(\n table: string,\n offset: number,\n batchSize: number\n ): Promise<void> {\n for (let attempt = 1; attempt <= this.config.retryAttempts; attempt++) {\n try {\n await this.sleep(this.config.retryDelayMs * attempt);\n\n const batch = await this.getBatch(table, offset, batchSize);\n await this.migrateBatch(table, batch);\n\n logger.info(`Retry successful for table ${table} at offset ${offset}`);\n return;\n } catch (error: unknown) {\n logger.warn(\n `Retry ${attempt}/${this.config.retryAttempts} failed:`,\n error\n );\n\n if (attempt === this.config.retryAttempts) {\n throw new DatabaseError(\n `Failed after ${this.config.retryAttempts} retries`,\n ErrorCode.DB_MIGRATION_FAILED,\n { table, offset, attempts: this.config.retryAttempts },\n error instanceof Error ? error : undefined\n );\n }\n }\n }\n }\n\n private async verifyDataIntegrity(plan: TableMigrationPlan[]): Promise<void> {\n logger.info('Verifying data integrity');\n\n for (const tablePlan of plan) {\n if (tablePlan.strategy === 'skip') continue;\n\n try {\n const sourceStats = await this.config.sourceAdapter.getStats();\n const targetStats = await this.config.targetAdapter.getStats();\n\n const sourceCount = this.estimateTableRows(\n tablePlan.table,\n sourceStats\n );\n const targetCount = this.estimateTableRows(\n tablePlan.table,\n targetStats\n );\n\n if (sourceCount !== targetCount) {\n this.addError(\n tablePlan.table,\n `Row count mismatch: source=${sourceCount}, target=${targetCount}`\n );\n } else {\n logger.debug(\n `Table ${tablePlan.table} verified: ${sourceCount} rows`\n );\n }\n } catch (error: unknown) {\n this.addError(tablePlan.table, `Verification failed: ${error}`);\n }\n }\n\n if (this.progress.errors.length > 0) {\n throw new DatabaseError(\n `Data integrity verification failed with ${this.progress.errors.length} errors`,\n ErrorCode.DB_MIGRATION_FAILED,\n {\n errorCount: this.progress.errors.length,\n errors: this.progress.errors,\n }\n );\n }\n }\n\n private async completeMigration(_strategy: MigrationStrategy): Promise<void> {\n logger.info('Completing migration');\n\n // Update target schema version if needed\n const sourceVersion = await this.config.sourceAdapter.getSchemaVersion();\n await this.config.targetAdapter.migrateSchema(sourceVersion);\n\n // Analyze target database for optimal performance\n await this.config.targetAdapter.analyze();\n\n logger.info('Migration completion tasks finished');\n }\n\n private async rollbackMigration(): Promise<void> {\n logger.warn('Rolling back migration');\n\n try {\n // This would typically involve cleaning up the target database\n // For now, we'll just log the intention\n logger.warn(\n 'Rollback would clean target database - implement based on strategy'\n );\n } catch (error: unknown) {\n logger.error('Rollback failed:', error);\n }\n }\n\n private updateProgress(updates: Partial<MigrationProgress>): void {\n Object.assign(this.progress, updates);\n this.updateProgressPercentage();\n\n if (this.progress.totalRecords > 0) {\n const elapsed = Date.now() - this.progress.startTime.getTime();\n const rate = this.progress.processedRecords / (elapsed / 1000);\n const remaining =\n this.progress.totalRecords - this.progress.processedRecords;\n\n if (rate > 0) {\n this.progress.estimatedEndTime = new Date(\n Date.now() + (remaining / rate) * 1000\n );\n }\n }\n\n this.config.progressCallback(this.progress);\n this.emit('progress', this.progress);\n }\n\n private updateProgressPercentage(): void {\n if (this.progress.totalRecords > 0) {\n this.progress.percentage = Math.min(\n 100,\n (this.progress.processedRecords / this.progress.totalRecords) * 100\n );\n }\n }\n\n private addError(table: string, error: string): void {\n this.progress.errors.push({\n table,\n error,\n timestamp: new Date(),\n });\n\n logger.error(`Migration error for table ${table}: ${error}`);\n }\n\n private addWarning(warning: string, table?: string): void {\n this.progress.warnings.push({\n table: table || 'general',\n warning,\n timestamp: new Date(),\n });\n\n logger.warn(`Migration warning: ${warning}`);\n }\n\n private sanitizeError(error: any): any {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n // Exclude stack traces and sensitive data for security\n };\n }\n return { message: 'Unknown error occurred' };\n }\n\n private calculateAdaptiveDelay(): number {\n const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;\n\n // Adaptive delay based on system resources\n if (memoryUsage > 400) return 100;\n if (memoryUsage > 300) return 50;\n return 10;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n pause(): void {\n if (!this.isRunning) {\n throw new DatabaseError(\n 'No migration in progress',\n ErrorCode.DB_MIGRATION_FAILED,\n { reason: 'not_running' }\n );\n }\n\n this.isPaused = true;\n logger.info('Migration paused');\n this.emit('paused');\n }\n\n resume(): void {\n if (!this.isRunning) {\n throw new DatabaseError(\n 'No migration in progress',\n ErrorCode.DB_MIGRATION_FAILED,\n { reason: 'not_running' }\n );\n }\n\n this.isPaused = false;\n logger.info('Migration resumed');\n this.emit('resumed');\n }\n\n abort(): void {\n if (!this.isRunning) {\n throw new DatabaseError(\n 'No migration in progress',\n ErrorCode.DB_MIGRATION_FAILED,\n { reason: 'not_running' }\n );\n }\n\n this.abortController?.abort();\n logger.info('Migration aborted');\n this.emit('aborted');\n }\n\n getProgress(): MigrationProgress {\n return { ...this.progress };\n }\n\n isActive(): boolean {\n return this.isRunning;\n }\n\n async estimateDuration(): Promise<{\n estimatedMinutes: number;\n confidence: 'low' | 'medium' | 'high';\n }> {\n const plan = await this.planMigration();\n const totalRecords = plan.reduce((sum, p) => sum + p.estimatedRows, 0);\n\n // Rough estimate: 1000 records per second\n const estimatedSeconds = totalRecords / 1000;\n const estimatedMinutes = Math.ceil(estimatedSeconds / 60);\n\n let confidence: 'low' | 'medium' | 'high' = 'medium';\n if (totalRecords < 10000) confidence = 'high';\n if (totalRecords > 100000) confidence = 'low';\n\n return { estimatedMinutes, confidence };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/ollama-embedding-provider.ts"],
4
- "sourcesContent": ["/**\n * Ollama Embedding Provider\n * Generates embeddings via a local Ollama server.\n */\n\nimport type { EmbeddingProvider } from './embedding-provider.js';\n\nexport class OllamaEmbeddingProvider implements EmbeddingProvider {\n readonly dimension: number;\n private baseUrl: string;\n private model: string;\n\n constructor(baseUrl: string, model: string, dimension: number) {\n this.baseUrl = baseUrl;\n this.model = model;\n this.dimension = dimension;\n }\n\n async embed(text: string): Promise<number[]> {\n const res = await fetch(`${this.baseUrl}/api/embeddings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: this.model, prompt: text }),\n });\n if (!res.ok) throw new Error(`Ollama embed failed: ${res.status}`);\n const data = (await res.json()) as { embedding: number[] };\n return data.embedding;\n }\n\n async embedBatch(texts: string[]): Promise<number[][]> {\n return Promise.all(texts.map((t) => this.embed(t)));\n }\n}\n"],
5
- "mappings": ";;;;AAOO,MAAM,wBAAqD;AAAA,EACvD;AAAA,EACD;AAAA,EACA;AAAA,EAER,YAAY,SAAiB,OAAe,WAAmB;AAC7D,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,MAAM,MAAiC;AAC3C,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,mBAAmB;AAAA,MACxD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,CAAC;AAAA,IAC1D,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,EAAE;AACjE,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,WAAW,OAAsC;AACrD,WAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,EACpD;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/database/openai-embedding-provider.ts"],
4
- "sourcesContent": ["/**\n * OpenAI Embedding Provider\n * Generates embeddings via the OpenAI API.\n */\n\nimport type { EmbeddingProvider } from './embedding-provider.js';\n\ninterface OpenAIEmbeddingResponse {\n data: Array<{ embedding: number[] }>;\n}\n\nexport class OpenAIEmbeddingProvider implements EmbeddingProvider {\n readonly dimension: number;\n private apiKey: string;\n private model: string;\n\n constructor(apiKey: string, model: string, dimension: number) {\n this.apiKey = apiKey;\n this.model = model;\n this.dimension = dimension;\n }\n\n async embed(text: string): Promise<number[]> {\n const res = await fetch('https://api.openai.com/v1/embeddings', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ model: this.model, input: text }),\n });\n if (!res.ok) throw new Error(`OpenAI embed failed: ${res.status}`);\n const data = (await res.json()) as OpenAIEmbeddingResponse;\n return data.data[0]!.embedding;\n }\n\n async embedBatch(texts: string[]): Promise<number[][]> {\n const res = await fetch('https://api.openai.com/v1/embeddings', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ model: this.model, input: texts }),\n });\n if (!res.ok) throw new Error(`OpenAI embed batch failed: ${res.status}`);\n const data = (await res.json()) as OpenAIEmbeddingResponse;\n return data.data.map((d) => d.embedding);\n }\n}\n"],
5
- "mappings": ";;;;AAWO,MAAM,wBAAqD;AAAA,EACvD;AAAA,EACD;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,OAAe,WAAmB;AAC5D,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,MAAM,MAAiC;AAC3C,UAAM,MAAM,MAAM,MAAM,wCAAwC;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,IACzD,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,EAAE;AACjE,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,KAAK,CAAC,EAAG;AAAA,EACvB;AAAA,EAEA,MAAM,WAAW,OAAsC;AACrD,UAAM,MAAM,MAAM,MAAM,wCAAwC;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,OAAO,OAAO,MAAM,CAAC;AAAA,IAC1D,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,8BAA8B,IAAI,MAAM,EAAE;AACvE,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EACzC;AACF;",
6
- "names": []
7
- }