@stackmemoryai/stackmemory 0.5.58 → 0.5.61

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 (932) hide show
  1. package/README.md +105 -1
  2. package/dist/scripts/benchmark-performance.js +48 -0
  3. package/dist/scripts/benchmark-performance.js.map +7 -0
  4. package/dist/scripts/check-redis.js +42 -0
  5. package/dist/scripts/check-redis.js.map +7 -0
  6. package/dist/scripts/initialize.js +116 -0
  7. package/dist/scripts/initialize.js.map +7 -0
  8. package/dist/scripts/list-linear-tasks.js +124 -0
  9. package/dist/scripts/list-linear-tasks.js.map +7 -0
  10. package/dist/scripts/measure-handoff-impact.js +340 -0
  11. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  12. package/dist/scripts/query-chromadb.js +160 -0
  13. package/dist/scripts/query-chromadb.js.map +7 -0
  14. package/dist/scripts/show-linear-summary.js +119 -0
  15. package/dist/scripts/show-linear-summary.js.map +7 -0
  16. package/dist/scripts/simple-swarm-demo.js +90 -0
  17. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  18. package/dist/scripts/status.js +155 -0
  19. package/dist/scripts/status.js.map +7 -0
  20. package/dist/scripts/test-chromadb-sync.js +192 -0
  21. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  22. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  23. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  24. package/dist/scripts/test-ralph-iterations.js +121 -0
  25. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  26. package/dist/scripts/test-redis-storage.js +389 -0
  27. package/dist/scripts/test-redis-storage.js.map +7 -0
  28. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  29. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  30. package/dist/scripts/test-swarm-fixes.js +125 -0
  31. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  32. package/dist/scripts/test-swarm-tui.js +23 -0
  33. package/dist/scripts/test-swarm-tui.js.map +7 -0
  34. package/dist/scripts/test-tui-shortcuts.js +52 -0
  35. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  36. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  37. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  38. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  39. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  40. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  41. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  42. package/dist/src/cli/auto-detect.js.map +7 -0
  43. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  44. package/dist/src/cli/claude-sm.js +1236 -0
  45. package/dist/src/cli/claude-sm.js.map +7 -0
  46. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  47. package/dist/src/cli/codex-sm.js.map +7 -0
  48. package/dist/src/cli/commands/api.js.map +7 -0
  49. package/dist/src/cli/commands/auto-background.js.map +7 -0
  50. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  51. package/dist/src/cli/commands/clear.js.map +7 -0
  52. package/dist/src/cli/commands/config.js.map +7 -0
  53. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  54. package/dist/src/cli/commands/context.js.map +7 -0
  55. package/dist/src/cli/commands/daemon.js.map +7 -0
  56. package/dist/src/cli/commands/dashboard.js.map +7 -0
  57. package/dist/src/cli/commands/db.js.map +7 -0
  58. package/dist/src/cli/commands/decision.js.map +7 -0
  59. package/dist/src/cli/commands/discovery.js.map +7 -0
  60. package/dist/src/cli/commands/handoff.js.map +7 -0
  61. package/dist/src/cli/commands/hooks.js.map +7 -0
  62. package/dist/src/cli/commands/linear.js.map +7 -0
  63. package/dist/src/cli/commands/log.js.map +7 -0
  64. package/dist/src/cli/commands/login.js.map +7 -0
  65. package/dist/src/cli/commands/migrate.js.map +7 -0
  66. package/dist/src/cli/commands/model.js.map +7 -0
  67. package/dist/src/cli/commands/onboard.js.map +7 -0
  68. package/dist/src/cli/commands/projects.js.map +7 -0
  69. package/dist/src/cli/commands/ralph.js.map +7 -0
  70. package/dist/src/cli/commands/retrieval.js.map +7 -0
  71. package/dist/src/cli/commands/search.js +173 -0
  72. package/dist/src/cli/commands/search.js.map +7 -0
  73. package/dist/src/cli/commands/service.js.map +7 -0
  74. package/dist/src/cli/commands/session.js.map +7 -0
  75. package/dist/src/cli/commands/settings.js.map +7 -0
  76. package/dist/src/cli/commands/setup.js.map +7 -0
  77. package/dist/src/cli/commands/shell.js.map +7 -0
  78. package/dist/src/cli/commands/signup.js.map +7 -0
  79. package/dist/src/cli/commands/skills.js.map +7 -0
  80. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  81. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  82. package/dist/src/cli/commands/sweep.js.map +7 -0
  83. package/dist/src/cli/commands/tasks.js.map +7 -0
  84. package/dist/src/cli/commands/worktree.js.map +7 -0
  85. package/dist/src/cli/index.js +609 -0
  86. package/dist/src/cli/index.js.map +7 -0
  87. package/dist/src/cli/opencode-sm.js.map +7 -0
  88. package/dist/src/cli/utils/viewer.js.map +7 -0
  89. package/dist/src/core/config/config-manager.js.map +7 -0
  90. package/dist/src/core/config/feature-flags.js.map +7 -0
  91. package/dist/src/core/config/storage-config.js.map +7 -0
  92. package/dist/src/core/config/types.js.map +7 -0
  93. package/dist/src/core/context/auto-context.js.map +7 -0
  94. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  95. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  96. package/dist/src/core/context/frame-database.js.map +7 -0
  97. package/dist/src/core/context/frame-digest.js.map +7 -0
  98. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  99. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  100. package/dist/src/core/context/frame-recovery.js.map +7 -0
  101. package/dist/src/core/context/frame-stack.js.map +7 -0
  102. package/dist/src/core/context/index.js.map +7 -0
  103. package/dist/src/core/context/permission-manager.js.map +7 -0
  104. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  105. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  106. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  107. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  108. package/dist/src/core/context/validation.js.map +7 -0
  109. package/dist/src/core/database/batch-operations.js.map +7 -0
  110. package/dist/src/core/database/connection-pool.js.map +7 -0
  111. package/dist/src/core/database/database-adapter.js.map +7 -0
  112. package/dist/src/core/database/migration-manager.js.map +7 -0
  113. package/dist/src/core/database/query-cache.js.map +7 -0
  114. package/dist/src/core/database/query-router.js.map +7 -0
  115. package/dist/src/core/database/sqlite-adapter.js +738 -0
  116. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  117. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  118. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  119. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  120. package/dist/src/core/digest/index.js.map +7 -0
  121. package/dist/src/core/digest/types.js.map +7 -0
  122. package/dist/src/core/errors/error-utils.js +208 -0
  123. package/dist/src/core/errors/error-utils.js.map +7 -0
  124. package/dist/src/core/errors/index.js +521 -0
  125. package/dist/src/core/errors/index.js.map +7 -0
  126. package/dist/src/core/errors/recovery.js.map +7 -0
  127. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  128. package/dist/src/core/extensions/custom-tools.js +567 -0
  129. package/dist/src/core/extensions/custom-tools.js.map +7 -0
  130. package/dist/src/core/extensions/index.js +55 -0
  131. package/dist/src/core/extensions/index.js.map +7 -0
  132. package/dist/src/core/extensions/loader.js +709 -0
  133. package/dist/src/core/extensions/loader.js.map +7 -0
  134. package/dist/src/core/extensions/plugin-system.js +506 -0
  135. package/dist/src/core/extensions/plugin-system.js.map +7 -0
  136. package/dist/src/core/extensions/provider-adapter.js +617 -0
  137. package/dist/src/core/extensions/provider-adapter.js.map +7 -0
  138. package/dist/src/core/extensions/sandbox-runtime.js +664 -0
  139. package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
  140. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  141. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  142. package/dist/src/core/merge/index.js.map +7 -0
  143. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  144. package/dist/src/core/merge/stack-diff.js.map +7 -0
  145. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  146. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  147. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  148. package/dist/src/core/models/model-router.js.map +7 -0
  149. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  150. package/dist/src/core/monitoring/logger.js +202 -0
  151. package/dist/src/core/monitoring/logger.js.map +7 -0
  152. package/dist/src/core/monitoring/metrics.js.map +7 -0
  153. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  154. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  155. package/dist/src/core/performance/context-cache.js.map +7 -0
  156. package/dist/src/core/performance/index.js.map +7 -0
  157. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  158. package/dist/src/core/performance/monitor.js.map +7 -0
  159. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  160. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  161. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  162. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  163. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  164. package/dist/src/core/projects/project-isolation.js.map +7 -0
  165. package/dist/src/core/projects/project-manager.js.map +7 -0
  166. package/dist/src/core/query/query-parser.js.map +7 -0
  167. package/dist/src/core/query/query-templates.js.map +7 -0
  168. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  169. package/dist/src/core/retrieval/index.js.map +7 -0
  170. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  171. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  172. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  173. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  174. package/dist/src/core/retrieval/types.js.map +7 -0
  175. package/dist/src/core/security/index.js +35 -0
  176. package/dist/src/core/security/index.js.map +7 -0
  177. package/dist/src/core/security/input-sanitizer.js +321 -0
  178. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  179. package/dist/src/core/session/clear-survival.js.map +7 -0
  180. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  181. package/dist/src/core/session/handoff-generator.js.map +7 -0
  182. package/dist/src/core/session/index.js.map +7 -0
  183. package/dist/src/core/session/session-manager.js.map +7 -0
  184. package/dist/src/core/skills/index.js.map +7 -0
  185. package/dist/src/core/skills/skill-storage.js.map +7 -0
  186. package/dist/src/core/skills/types.js.map +7 -0
  187. package/dist/src/core/storage/chromadb-adapter.js +380 -0
  188. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  189. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  190. package/dist/src/core/storage/remote-storage.js.map +7 -0
  191. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  192. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  193. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  194. package/dist/src/core/trace/debug-trace.js.map +7 -0
  195. package/dist/src/core/trace/index.js.map +7 -0
  196. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  197. package/dist/src/core/trace/trace-detector.js.map +7 -0
  198. package/dist/src/core/trace/trace-store.js.map +7 -0
  199. package/dist/src/core/trace/types.js.map +7 -0
  200. package/dist/src/core/utils/async-mutex.js.map +7 -0
  201. package/dist/src/core/utils/compression.js.map +7 -0
  202. package/dist/src/core/utils/update-checker.js.map +7 -0
  203. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  204. package/dist/src/daemon/daemon-config.js.map +7 -0
  205. package/dist/src/daemon/services/context-service.js.map +7 -0
  206. package/dist/src/daemon/services/linear-service.js.map +7 -0
  207. package/dist/src/daemon/session-daemon.js.map +7 -0
  208. package/dist/src/daemon/unified-daemon.js.map +7 -0
  209. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  210. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  211. package/dist/src/features/analytics/index.js.map +7 -0
  212. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  213. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  214. package/dist/src/features/sweep/index.js.map +7 -0
  215. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  216. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  217. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  218. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  219. package/dist/src/features/sweep/status-bar.js.map +7 -0
  220. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  221. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  222. package/dist/src/features/sweep/types.js.map +7 -0
  223. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  224. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  225. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  226. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  227. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  228. package/dist/src/features/web/server/index.js.map +7 -0
  229. package/dist/src/hooks/auto-background.js.map +7 -0
  230. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  231. package/dist/src/hooks/config.js.map +7 -0
  232. package/dist/src/hooks/daemon.js.map +7 -0
  233. package/dist/src/hooks/events.js.map +7 -0
  234. package/dist/src/hooks/index.js.map +7 -0
  235. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  236. package/dist/src/hooks/schemas.js.map +7 -0
  237. package/dist/src/hooks/secure-fs.js.map +7 -0
  238. package/dist/src/hooks/security-logger.js.map +7 -0
  239. package/dist/src/hooks/session-summary.js.map +7 -0
  240. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  241. package/dist/src/hooks/sms-notify.js.map +7 -0
  242. package/dist/src/hooks/sms-watcher.js.map +7 -0
  243. package/dist/src/hooks/sms-webhook.js.map +7 -0
  244. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  245. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  246. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  247. package/dist/src/index.js.map +7 -0
  248. package/dist/src/integrations/anthropic/client.js.map +7 -0
  249. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  250. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  251. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  252. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  253. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  254. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  255. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  256. package/dist/src/integrations/linear/auth.js.map +7 -0
  257. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  258. package/dist/src/integrations/linear/client.js +634 -0
  259. package/dist/src/integrations/linear/client.js.map +7 -0
  260. package/dist/src/integrations/linear/config.js.map +7 -0
  261. package/dist/src/integrations/linear/migration.js.map +7 -0
  262. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  263. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  264. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  265. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  266. package/dist/src/integrations/linear/sync.js.map +7 -0
  267. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  268. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  269. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  270. package/dist/src/integrations/linear/webhook.js.map +7 -0
  271. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  272. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  273. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  274. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  275. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  276. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  277. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  278. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  279. package/dist/src/integrations/mcp/index.js.map +7 -0
  280. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  281. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  282. package/dist/src/integrations/mcp/remote-server.js +682 -0
  283. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  284. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  285. package/dist/src/integrations/mcp/server.js +1975 -0
  286. package/dist/src/integrations/mcp/server.js.map +7 -0
  287. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  288. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  289. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  290. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  291. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  292. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  293. package/dist/src/integrations/ralph/index.js.map +7 -0
  294. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  295. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  296. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  297. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  298. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  299. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  300. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  301. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  302. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  303. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  304. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  305. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  306. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  307. package/dist/src/integrations/ralph/types.js +5 -0
  308. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  309. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  310. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  311. package/dist/src/models/user.model.js.map +7 -0
  312. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  313. package/dist/src/services/config-service.js.map +7 -0
  314. package/dist/src/services/context-service.js.map +7 -0
  315. package/dist/src/skills/api-discovery.js.map +7 -0
  316. package/dist/src/skills/api-skill.js.map +7 -0
  317. package/dist/src/skills/claude-skills.js.map +7 -0
  318. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  319. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  320. package/dist/src/skills/repo-ingestion-skill.js +632 -0
  321. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  322. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  323. package/dist/src/types/task.js.map +7 -0
  324. package/dist/src/utils/env.js.map +7 -0
  325. package/dist/src/utils/formatting.js.map +7 -0
  326. package/dist/src/utils/process-cleanup.js.map +7 -0
  327. package/package.json +13 -9
  328. package/scripts/background-sync-manager.js +145 -83
  329. package/scripts/claude-sm-autostart.js +17 -12
  330. package/scripts/gepa/README.md +275 -0
  331. package/scripts/gepa/config.json +53 -0
  332. package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
  333. package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
  334. package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
  335. package/scripts/gepa/generations/gen-000/baseline.md +124 -0
  336. package/scripts/gepa/hooks/auto-optimize.js +494 -0
  337. package/scripts/gepa/hooks/eval-tracker.js +203 -0
  338. package/scripts/gepa/hooks/reflect.js +311 -0
  339. package/scripts/gepa/optimize.js +611 -0
  340. package/scripts/gepa/state.json +14 -0
  341. package/scripts/initialize.ts +16 -7
  342. package/scripts/install.sh +14 -62
  343. package/scripts/status.ts +111 -46
  344. package/scripts/test-pre-publish-quick.sh +1 -1
  345. package/dist/agents/core/agent-task-manager.js.map +0 -7
  346. package/dist/agents/testing-agent.js +0 -614
  347. package/dist/agents/testing-agent.js.map +0 -7
  348. package/dist/agents/verifiers/base-verifier.js.map +0 -7
  349. package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
  350. package/dist/agents/verifiers/llm-judge.js.map +0 -7
  351. package/dist/cli/auto-detect.js.map +0 -7
  352. package/dist/cli/browser-test.js +0 -33
  353. package/dist/cli/browser-test.js.map +0 -7
  354. package/dist/cli/claude-sm-danger.js.map +0 -7
  355. package/dist/cli/claude-sm.js +0 -1156
  356. package/dist/cli/claude-sm.js.map +0 -7
  357. package/dist/cli/codex-sm-danger.js.map +0 -7
  358. package/dist/cli/codex-sm.js.map +0 -7
  359. package/dist/cli/commands/api.js.map +0 -7
  360. package/dist/cli/commands/auto-background.js.map +0 -7
  361. package/dist/cli/commands/cleanup-processes.js.map +0 -7
  362. package/dist/cli/commands/clear.js.map +0 -7
  363. package/dist/cli/commands/config.js.map +0 -7
  364. package/dist/cli/commands/context-rehydrate.js.map +0 -7
  365. package/dist/cli/commands/context.js.map +0 -7
  366. package/dist/cli/commands/daemon.js.map +0 -7
  367. package/dist/cli/commands/dashboard.js.map +0 -7
  368. package/dist/cli/commands/db.js.map +0 -7
  369. package/dist/cli/commands/decision.js.map +0 -7
  370. package/dist/cli/commands/discovery.js.map +0 -7
  371. package/dist/cli/commands/handoff.js.map +0 -7
  372. package/dist/cli/commands/hooks.js.map +0 -7
  373. package/dist/cli/commands/linear-unified.js +0 -353
  374. package/dist/cli/commands/linear-unified.js.map +0 -7
  375. package/dist/cli/commands/linear.js.map +0 -7
  376. package/dist/cli/commands/log.js.map +0 -7
  377. package/dist/cli/commands/login.js.map +0 -7
  378. package/dist/cli/commands/migrate.js.map +0 -7
  379. package/dist/cli/commands/model.js.map +0 -7
  380. package/dist/cli/commands/monitor.js +0 -313
  381. package/dist/cli/commands/monitor.js.map +0 -7
  382. package/dist/cli/commands/onboard.js.map +0 -7
  383. package/dist/cli/commands/projects.js.map +0 -7
  384. package/dist/cli/commands/quality.js +0 -413
  385. package/dist/cli/commands/quality.js.map +0 -7
  386. package/dist/cli/commands/ralph.js.map +0 -7
  387. package/dist/cli/commands/retrieval.js.map +0 -7
  388. package/dist/cli/commands/search.js +0 -156
  389. package/dist/cli/commands/search.js.map +0 -7
  390. package/dist/cli/commands/service.js.map +0 -7
  391. package/dist/cli/commands/session.js.map +0 -7
  392. package/dist/cli/commands/settings.js.map +0 -7
  393. package/dist/cli/commands/setup.js.map +0 -7
  394. package/dist/cli/commands/shell.js.map +0 -7
  395. package/dist/cli/commands/signup.js.map +0 -7
  396. package/dist/cli/commands/skills.js.map +0 -7
  397. package/dist/cli/commands/sms-notify.js.map +0 -7
  398. package/dist/cli/commands/storage-tier.js.map +0 -7
  399. package/dist/cli/commands/storage.js +0 -360
  400. package/dist/cli/commands/storage.js.map +0 -7
  401. package/dist/cli/commands/sweep.js.map +0 -7
  402. package/dist/cli/commands/tasks.js.map +0 -7
  403. package/dist/cli/commands/test.js +0 -286
  404. package/dist/cli/commands/test.js.map +0 -7
  405. package/dist/cli/commands/workflow.js +0 -142
  406. package/dist/cli/commands/workflow.js.map +0 -7
  407. package/dist/cli/commands/worktree.js.map +0 -7
  408. package/dist/cli/index.js +0 -594
  409. package/dist/cli/index.js.map +0 -7
  410. package/dist/cli/opencode-sm.js.map +0 -7
  411. package/dist/cli/utils/viewer.js.map +0 -7
  412. package/dist/core/analytics/team-analytics.js +0 -378
  413. package/dist/core/analytics/team-analytics.js.map +0 -7
  414. package/dist/core/config/config-manager.js.map +0 -7
  415. package/dist/core/config/feature-flags.js.map +0 -7
  416. package/dist/core/config/storage-config.js.map +0 -7
  417. package/dist/core/config/types.js.map +0 -7
  418. package/dist/core/context/auto-context.js.map +0 -7
  419. package/dist/core/context/dual-stack-manager.js.map +0 -7
  420. package/dist/core/context/enhanced-rehydration.js.map +0 -7
  421. package/dist/core/context/frame-database.js.map +0 -7
  422. package/dist/core/context/frame-digest.js.map +0 -7
  423. package/dist/core/context/frame-handoff-manager.js.map +0 -7
  424. package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
  425. package/dist/core/context/frame-manager.js +0 -1069
  426. package/dist/core/context/frame-manager.js.map +0 -7
  427. package/dist/core/context/frame-recovery.js.map +0 -7
  428. package/dist/core/context/frame-stack.js.map +0 -7
  429. package/dist/core/context/incremental-gc.js +0 -290
  430. package/dist/core/context/incremental-gc.js.map +0 -7
  431. package/dist/core/context/index.js.map +0 -7
  432. package/dist/core/context/model-aware-compaction.js +0 -623
  433. package/dist/core/context/model-aware-compaction.js.map +0 -7
  434. package/dist/core/context/permission-manager.js.map +0 -7
  435. package/dist/core/context/recursive-context-manager.js.map +0 -7
  436. package/dist/core/context/refactored-frame-manager.js.map +0 -7
  437. package/dist/core/context/shared-context-layer.js.map +0 -7
  438. package/dist/core/context/stack-merge-resolver.js.map +0 -7
  439. package/dist/core/context/validation.js.map +0 -7
  440. package/dist/core/database/batch-operations.js.map +0 -7
  441. package/dist/core/database/connection-pool.js.map +0 -7
  442. package/dist/core/database/database-adapter.js.map +0 -7
  443. package/dist/core/database/migration-manager.js.map +0 -7
  444. package/dist/core/database/paradedb-adapter.js +0 -990
  445. package/dist/core/database/paradedb-adapter.js.map +0 -7
  446. package/dist/core/database/query-cache.js.map +0 -7
  447. package/dist/core/database/query-router.js.map +0 -7
  448. package/dist/core/database/sqlite-adapter.js +0 -728
  449. package/dist/core/database/sqlite-adapter.js.map +0 -7
  450. package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
  451. package/dist/core/digest/frame-digest-integration.js.map +0 -7
  452. package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
  453. package/dist/core/digest/index.js.map +0 -7
  454. package/dist/core/digest/types.js.map +0 -7
  455. package/dist/core/errors/index.js +0 -512
  456. package/dist/core/errors/index.js.map +0 -7
  457. package/dist/core/errors/recovery.js.map +0 -7
  458. package/dist/core/execution/parallel-executor.js.map +0 -7
  459. package/dist/core/frame/workflow-templates.js.map +0 -7
  460. package/dist/core/merge/conflict-detector.js.map +0 -7
  461. package/dist/core/merge/index.js.map +0 -7
  462. package/dist/core/merge/resolution-engine.js.map +0 -7
  463. package/dist/core/merge/stack-diff.js.map +0 -7
  464. package/dist/core/models/fallback-monitor.js.map +0 -7
  465. package/dist/core/models/model-router.js.map +0 -7
  466. package/dist/core/monitoring/error-handler.js.map +0 -7
  467. package/dist/core/monitoring/logger.js +0 -150
  468. package/dist/core/monitoring/logger.js.map +0 -7
  469. package/dist/core/monitoring/metrics.js.map +0 -7
  470. package/dist/core/monitoring/progress-tracker.js.map +0 -7
  471. package/dist/core/monitoring/session-monitor.js.map +0 -7
  472. package/dist/core/performance/context-cache.js.map +0 -7
  473. package/dist/core/performance/index.js.map +0 -7
  474. package/dist/core/performance/lazy-context-loader.js.map +0 -7
  475. package/dist/core/performance/monitor.js.map +0 -7
  476. package/dist/core/performance/optimized-frame-context.js.map +0 -7
  477. package/dist/core/performance/performance-benchmark.js.map +0 -7
  478. package/dist/core/performance/performance-profiler.js.map +0 -7
  479. package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
  480. package/dist/core/persistence/postgres-adapter.js.map +0 -7
  481. package/dist/core/projects/project-isolation.js.map +0 -7
  482. package/dist/core/projects/project-manager.js.map +0 -7
  483. package/dist/core/query/query-parser.js.map +0 -7
  484. package/dist/core/query/query-templates.js.map +0 -7
  485. package/dist/core/retrieval/context-retriever.js.map +0 -7
  486. package/dist/core/retrieval/graph-retrieval.js +0 -662
  487. package/dist/core/retrieval/graph-retrieval.js.map +0 -7
  488. package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
  489. package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
  490. package/dist/core/retrieval/index.js.map +0 -7
  491. package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
  492. package/dist/core/retrieval/llm-provider.js.map +0 -7
  493. package/dist/core/retrieval/retrieval-audit.js.map +0 -7
  494. package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
  495. package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
  496. package/dist/core/retrieval/summary-generator.js.map +0 -7
  497. package/dist/core/retrieval/types.js.map +0 -7
  498. package/dist/core/session/clear-survival.js.map +0 -7
  499. package/dist/core/session/enhanced-handoff.js.map +0 -7
  500. package/dist/core/session/handoff-generator.js.map +0 -7
  501. package/dist/core/session/index.js.map +0 -7
  502. package/dist/core/session/session-manager.js.map +0 -7
  503. package/dist/core/skills/index.js.map +0 -7
  504. package/dist/core/skills/skill-storage.js.map +0 -7
  505. package/dist/core/skills/types.js.map +0 -7
  506. package/dist/core/storage/chromadb-adapter.js +0 -354
  507. package/dist/core/storage/chromadb-adapter.js.map +0 -7
  508. package/dist/core/storage/infinite-storage.js.map +0 -7
  509. package/dist/core/storage/railway-optimized-storage.js +0 -591
  510. package/dist/core/storage/railway-optimized-storage.js.map +0 -7
  511. package/dist/core/storage/remote-storage.js.map +0 -7
  512. package/dist/core/storage/two-tier-storage.js.map +0 -7
  513. package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
  514. package/dist/core/trace/db-trace-wrapper.js.map +0 -7
  515. package/dist/core/trace/debug-trace.js.map +0 -7
  516. package/dist/core/trace/index.js.map +0 -7
  517. package/dist/core/trace/linear-api-wrapper.js.map +0 -7
  518. package/dist/core/trace/trace-demo.js +0 -154
  519. package/dist/core/trace/trace-demo.js.map +0 -7
  520. package/dist/core/trace/trace-detector.demo.js +0 -142
  521. package/dist/core/trace/trace-detector.demo.js.map +0 -7
  522. package/dist/core/trace/trace-detector.js.map +0 -7
  523. package/dist/core/trace/trace-store.js.map +0 -7
  524. package/dist/core/trace/types.js.map +0 -7
  525. package/dist/core/utils/async-mutex.js.map +0 -7
  526. package/dist/core/utils/compression.js.map +0 -7
  527. package/dist/core/utils/update-checker.js.map +0 -7
  528. package/dist/core/worktree/worktree-manager.js.map +0 -7
  529. package/dist/daemon/daemon-config.js.map +0 -7
  530. package/dist/daemon/services/context-service.js.map +0 -7
  531. package/dist/daemon/services/linear-service.js.map +0 -7
  532. package/dist/daemon/session-daemon.js.map +0 -7
  533. package/dist/daemon/unified-daemon.js.map +0 -7
  534. package/dist/features/analytics/api/analytics-api.js.map +0 -7
  535. package/dist/features/analytics/core/analytics-service.js.map +0 -7
  536. package/dist/features/analytics/index.js.map +0 -7
  537. package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
  538. package/dist/features/browser/browser-mcp.js.map +0 -7
  539. package/dist/features/sweep/index.js.map +0 -7
  540. package/dist/features/sweep/prediction-client.js.map +0 -7
  541. package/dist/features/sweep/prompt-builder.js.map +0 -7
  542. package/dist/features/sweep/pty-wrapper.js.map +0 -7
  543. package/dist/features/sweep/state-watcher.js.map +0 -7
  544. package/dist/features/sweep/status-bar.js.map +0 -7
  545. package/dist/features/sweep/sweep-server-manager.js.map +0 -7
  546. package/dist/features/sweep/tab-interceptor.js.map +0 -7
  547. package/dist/features/sweep/types.js.map +0 -7
  548. package/dist/features/tasks/linear-task-manager.js.map +0 -7
  549. package/dist/features/tasks/task-aware-context.js.map +0 -7
  550. package/dist/features/tui/simple-monitor.js.map +0 -7
  551. package/dist/features/tui/swarm-monitor.js.map +0 -7
  552. package/dist/features/web/client/stores/task-store.js.map +0 -7
  553. package/dist/features/web/server/index.js.map +0 -7
  554. package/dist/hooks/auto-background.js.map +0 -7
  555. package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
  556. package/dist/hooks/config.js.map +0 -7
  557. package/dist/hooks/daemon.js.map +0 -7
  558. package/dist/hooks/events.js.map +0 -7
  559. package/dist/hooks/index.js.map +0 -7
  560. package/dist/hooks/linear-task-picker.js.map +0 -7
  561. package/dist/hooks/schemas.js.map +0 -7
  562. package/dist/hooks/secure-fs.js.map +0 -7
  563. package/dist/hooks/security-logger.js.map +0 -7
  564. package/dist/hooks/session-summary.js.map +0 -7
  565. package/dist/hooks/sms-action-runner.js.map +0 -7
  566. package/dist/hooks/sms-notify.js.map +0 -7
  567. package/dist/hooks/sms-watcher.js.map +0 -7
  568. package/dist/hooks/sms-webhook.js.map +0 -7
  569. package/dist/hooks/whatsapp-commands.js.map +0 -7
  570. package/dist/hooks/whatsapp-scheduler.js.map +0 -7
  571. package/dist/hooks/whatsapp-sync.js.map +0 -7
  572. package/dist/index.js.map +0 -7
  573. package/dist/integrations/anthropic/client.js.map +0 -7
  574. package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
  575. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  576. package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  577. package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
  578. package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
  579. package/dist/integrations/claude-code/subagent-client.js.map +0 -7
  580. package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
  581. package/dist/integrations/linear/auth.js.map +0 -7
  582. package/dist/integrations/linear/auto-sync.js.map +0 -7
  583. package/dist/integrations/linear/client.js +0 -630
  584. package/dist/integrations/linear/client.js.map +0 -7
  585. package/dist/integrations/linear/config.js.map +0 -7
  586. package/dist/integrations/linear/migration.js.map +0 -7
  587. package/dist/integrations/linear/oauth-server.js.map +0 -7
  588. package/dist/integrations/linear/rest-client.js.map +0 -7
  589. package/dist/integrations/linear/sync-manager.js.map +0 -7
  590. package/dist/integrations/linear/sync-service.js.map +0 -7
  591. package/dist/integrations/linear/sync.js.map +0 -7
  592. package/dist/integrations/linear/unified-sync.js.map +0 -7
  593. package/dist/integrations/linear/webhook-handler.js.map +0 -7
  594. package/dist/integrations/linear/webhook-server.js.map +0 -7
  595. package/dist/integrations/linear/webhook.js.map +0 -7
  596. package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  597. package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
  598. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  599. package/dist/integrations/mcp/handlers/index.js.map +0 -7
  600. package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  601. package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  602. package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
  603. package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  604. package/dist/integrations/mcp/index.js.map +0 -7
  605. package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  606. package/dist/integrations/mcp/refactored-server.js.map +0 -7
  607. package/dist/integrations/mcp/remote-server.js +0 -691
  608. package/dist/integrations/mcp/remote-server.js.map +0 -7
  609. package/dist/integrations/mcp/schemas.js.map +0 -7
  610. package/dist/integrations/mcp/server.js +0 -1960
  611. package/dist/integrations/mcp/server.js.map +0 -7
  612. package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
  613. package/dist/integrations/mcp/tool-definitions.js.map +0 -7
  614. package/dist/integrations/mcp/trace-test.js +0 -48
  615. package/dist/integrations/mcp/trace-test.js.map +0 -7
  616. package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
  617. package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
  618. package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
  619. package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
  620. package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
  621. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
  622. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  623. package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
  624. package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  625. package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  626. package/dist/integrations/ralph/index.js.map +0 -7
  627. package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
  628. package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  629. package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  630. package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  631. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  632. package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  633. package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  634. package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  635. package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  636. package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
  637. package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
  638. package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  639. package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
  640. package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  641. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  642. package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  643. package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
  644. package/dist/middleware/exponential-rate-limiter.js.map +0 -7
  645. package/dist/models/user.model.js.map +0 -7
  646. package/dist/servers/production/auth-middleware.js.map +0 -7
  647. package/dist/servers/railway/config.js +0 -55
  648. package/dist/servers/railway/config.js.map +0 -7
  649. package/dist/servers/railway/index-enhanced.js +0 -160
  650. package/dist/servers/railway/index-enhanced.js.map +0 -7
  651. package/dist/servers/railway/index.js +0 -1349
  652. package/dist/servers/railway/index.js.map +0 -7
  653. package/dist/servers/railway/simple.js +0 -64
  654. package/dist/servers/railway/simple.js.map +0 -7
  655. package/dist/servers/railway/storage-test.js +0 -459
  656. package/dist/servers/railway/storage-test.js.map +0 -7
  657. package/dist/services/config-service.js.map +0 -7
  658. package/dist/services/context-service.js.map +0 -7
  659. package/dist/skills/api-discovery.js.map +0 -7
  660. package/dist/skills/api-skill.js.map +0 -7
  661. package/dist/skills/claude-skills.js.map +0 -7
  662. package/dist/skills/dashboard-launcher.js.map +0 -7
  663. package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
  664. package/dist/skills/repo-ingestion-skill.js +0 -609
  665. package/dist/skills/repo-ingestion-skill.js.map +0 -7
  666. package/dist/skills/security-secrets-scanner.js +0 -284
  667. package/dist/skills/security-secrets-scanner.js.map +0 -7
  668. package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
  669. package/dist/utils/env.js.map +0 -7
  670. package/dist/utils/formatting.js.map +0 -7
  671. package/dist/utils/process-cleanup.js.map +0 -7
  672. package/dist/validation/schemas.js +0 -222
  673. package/dist/validation/schemas.js.map +0 -7
  674. /package/dist/{agents → src/agents}/core/agent-task-manager.js +0 -0
  675. /package/dist/{agents → src/agents}/verifiers/base-verifier.js +0 -0
  676. /package/dist/{agents → src/agents}/verifiers/formatter-verifier.js +0 -0
  677. /package/dist/{agents → src/agents}/verifiers/llm-judge.js +0 -0
  678. /package/dist/{cli → src/cli}/auto-detect.js +0 -0
  679. /package/dist/{cli → src/cli}/claude-sm-danger.js +0 -0
  680. /package/dist/{cli → src/cli}/codex-sm-danger.js +0 -0
  681. /package/dist/{cli → src/cli}/codex-sm.js +0 -0
  682. /package/dist/{cli → src/cli}/commands/api.js +0 -0
  683. /package/dist/{cli → src/cli}/commands/auto-background.js +0 -0
  684. /package/dist/{cli → src/cli}/commands/cleanup-processes.js +0 -0
  685. /package/dist/{cli → src/cli}/commands/clear.js +0 -0
  686. /package/dist/{cli → src/cli}/commands/config.js +0 -0
  687. /package/dist/{cli → src/cli}/commands/context-rehydrate.js +0 -0
  688. /package/dist/{cli → src/cli}/commands/context.js +0 -0
  689. /package/dist/{cli → src/cli}/commands/daemon.js +0 -0
  690. /package/dist/{cli → src/cli}/commands/dashboard.js +0 -0
  691. /package/dist/{cli → src/cli}/commands/db.js +0 -0
  692. /package/dist/{cli → src/cli}/commands/decision.js +0 -0
  693. /package/dist/{cli → src/cli}/commands/discovery.js +0 -0
  694. /package/dist/{cli → src/cli}/commands/handoff.js +0 -0
  695. /package/dist/{cli → src/cli}/commands/hooks.js +0 -0
  696. /package/dist/{cli → src/cli}/commands/linear.js +0 -0
  697. /package/dist/{cli → src/cli}/commands/log.js +0 -0
  698. /package/dist/{cli → src/cli}/commands/login.js +0 -0
  699. /package/dist/{cli → src/cli}/commands/migrate.js +0 -0
  700. /package/dist/{cli → src/cli}/commands/model.js +0 -0
  701. /package/dist/{cli → src/cli}/commands/onboard.js +0 -0
  702. /package/dist/{cli → src/cli}/commands/projects.js +0 -0
  703. /package/dist/{cli → src/cli}/commands/ralph.js +0 -0
  704. /package/dist/{cli → src/cli}/commands/retrieval.js +0 -0
  705. /package/dist/{cli → src/cli}/commands/service.js +0 -0
  706. /package/dist/{cli → src/cli}/commands/session.js +0 -0
  707. /package/dist/{cli → src/cli}/commands/settings.js +0 -0
  708. /package/dist/{cli → src/cli}/commands/setup.js +0 -0
  709. /package/dist/{cli → src/cli}/commands/shell.js +0 -0
  710. /package/dist/{cli → src/cli}/commands/signup.js +0 -0
  711. /package/dist/{cli → src/cli}/commands/skills.js +0 -0
  712. /package/dist/{cli → src/cli}/commands/sms-notify.js +0 -0
  713. /package/dist/{cli → src/cli}/commands/storage-tier.js +0 -0
  714. /package/dist/{cli → src/cli}/commands/sweep.js +0 -0
  715. /package/dist/{cli → src/cli}/commands/tasks.js +0 -0
  716. /package/dist/{cli → src/cli}/commands/worktree.js +0 -0
  717. /package/dist/{cli → src/cli}/opencode-sm.js +0 -0
  718. /package/dist/{cli → src/cli}/utils/viewer.js +0 -0
  719. /package/dist/{core → src/core}/config/config-manager.js +0 -0
  720. /package/dist/{core → src/core}/config/feature-flags.js +0 -0
  721. /package/dist/{core → src/core}/config/storage-config.js +0 -0
  722. /package/dist/{core → src/core}/config/types.js +0 -0
  723. /package/dist/{core → src/core}/context/auto-context.js +0 -0
  724. /package/dist/{core → src/core}/context/dual-stack-manager.js +0 -0
  725. /package/dist/{core → src/core}/context/enhanced-rehydration.js +0 -0
  726. /package/dist/{core → src/core}/context/frame-database.js +0 -0
  727. /package/dist/{core → src/core}/context/frame-digest.js +0 -0
  728. /package/dist/{core → src/core}/context/frame-handoff-manager.js +0 -0
  729. /package/dist/{core → src/core}/context/frame-lifecycle-hooks.js +0 -0
  730. /package/dist/{core → src/core}/context/frame-recovery.js +0 -0
  731. /package/dist/{core → src/core}/context/frame-stack.js +0 -0
  732. /package/dist/{core → src/core}/context/frame-types.js +0 -0
  733. /package/dist/{core → src/core}/context/frame-types.js.map +0 -0
  734. /package/dist/{core → src/core}/context/index.js +0 -0
  735. /package/dist/{core → src/core}/context/permission-manager.js +0 -0
  736. /package/dist/{core → src/core}/context/recursive-context-manager.js +0 -0
  737. /package/dist/{core → src/core}/context/refactored-frame-manager.js +0 -0
  738. /package/dist/{core → src/core}/context/shared-context-layer.js +0 -0
  739. /package/dist/{core → src/core}/context/stack-merge-resolver.js +0 -0
  740. /package/dist/{core → src/core}/context/validation.js +0 -0
  741. /package/dist/{core → src/core}/database/batch-operations.js +0 -0
  742. /package/dist/{core → src/core}/database/connection-pool.js +0 -0
  743. /package/dist/{core → src/core}/database/database-adapter.js +0 -0
  744. /package/dist/{core → src/core}/database/migration-manager.js +0 -0
  745. /package/dist/{core → src/core}/database/query-cache.js +0 -0
  746. /package/dist/{core → src/core}/database/query-router.js +0 -0
  747. /package/dist/{core → src/core}/digest/enhanced-hybrid-digest.js +0 -0
  748. /package/dist/{core → src/core}/digest/frame-digest-integration.js +0 -0
  749. /package/dist/{core → src/core}/digest/hybrid-digest-generator.js +0 -0
  750. /package/dist/{core → src/core}/digest/index.js +0 -0
  751. /package/dist/{core → src/core}/digest/types.js +0 -0
  752. /package/dist/{core → src/core}/errors/recovery.js +0 -0
  753. /package/dist/{core → src/core}/execution/parallel-executor.js +0 -0
  754. /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
  755. /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
  756. /package/dist/{core → src/core}/frame/workflow-templates.js +0 -0
  757. /package/dist/{core → src/core}/merge/conflict-detector.js +0 -0
  758. /package/dist/{core → src/core}/merge/index.js +0 -0
  759. /package/dist/{core → src/core}/merge/resolution-engine.js +0 -0
  760. /package/dist/{core → src/core}/merge/stack-diff.js +0 -0
  761. /package/dist/{core → src/core/merge}/types.js +0 -0
  762. /package/dist/{core → src/core/merge}/types.js.map +0 -0
  763. /package/dist/{core → src/core}/models/fallback-monitor.js +0 -0
  764. /package/dist/{core → src/core}/models/model-router.js +0 -0
  765. /package/dist/{core → src/core}/monitoring/error-handler.js +0 -0
  766. /package/dist/{core → src/core}/monitoring/metrics.js +0 -0
  767. /package/dist/{core → src/core}/monitoring/progress-tracker.js +0 -0
  768. /package/dist/{core → src/core}/monitoring/session-monitor.js +0 -0
  769. /package/dist/{core → src/core}/performance/context-cache.js +0 -0
  770. /package/dist/{core → src/core}/performance/index.js +0 -0
  771. /package/dist/{core → src/core}/performance/lazy-context-loader.js +0 -0
  772. /package/dist/{core → src/core}/performance/monitor.js +0 -0
  773. /package/dist/{core → src/core}/performance/optimized-frame-context.js +0 -0
  774. /package/dist/{core → src/core}/performance/performance-benchmark.js +0 -0
  775. /package/dist/{core → src/core}/performance/performance-profiler.js +0 -0
  776. /package/dist/{core → src/core}/performance/streaming-jsonl-parser.js +0 -0
  777. /package/dist/{core → src/core}/persistence/postgres-adapter.js +0 -0
  778. /package/dist/{core → src/core}/projects/project-isolation.js +0 -0
  779. /package/dist/{core → src/core}/projects/project-manager.js +0 -0
  780. /package/dist/{core → src/core}/query/query-parser.js +0 -0
  781. /package/dist/{core → src/core}/query/query-templates.js +0 -0
  782. /package/dist/{core → src/core}/retrieval/context-retriever.js +0 -0
  783. /package/dist/{core → src/core}/retrieval/index.js +0 -0
  784. /package/dist/{core → src/core}/retrieval/llm-context-retrieval.js +0 -0
  785. /package/dist/{core → src/core}/retrieval/llm-provider.js +0 -0
  786. /package/dist/{core → src/core}/retrieval/retrieval-audit.js +0 -0
  787. /package/dist/{core → src/core}/retrieval/summary-generator.js +0 -0
  788. /package/dist/{core → src/core}/retrieval/types.js +0 -0
  789. /package/dist/{core → src/core}/session/clear-survival.js +0 -0
  790. /package/dist/{core → src/core}/session/enhanced-handoff.js +0 -0
  791. /package/dist/{core → src/core}/session/handoff-generator.js +0 -0
  792. /package/dist/{core → src/core}/session/index.js +0 -0
  793. /package/dist/{core → src/core}/session/session-manager.js +0 -0
  794. /package/dist/{core → src/core}/skills/index.js +0 -0
  795. /package/dist/{core → src/core}/skills/skill-storage.js +0 -0
  796. /package/dist/{core → src/core}/skills/types.js +0 -0
  797. /package/dist/{core → src/core}/storage/infinite-storage.js +0 -0
  798. /package/dist/{core → src/core}/storage/remote-storage.js +0 -0
  799. /package/dist/{core → src/core}/storage/two-tier-storage.js +0 -0
  800. /package/dist/{core → src/core}/trace/cli-trace-wrapper.js +0 -0
  801. /package/dist/{core → src/core}/trace/db-trace-wrapper.js +0 -0
  802. /package/dist/{core → src/core}/trace/debug-trace.js +0 -0
  803. /package/dist/{core → src/core}/trace/index.js +0 -0
  804. /package/dist/{core → src/core}/trace/linear-api-wrapper.js +0 -0
  805. /package/dist/{core → src/core}/trace/trace-detector.js +0 -0
  806. /package/dist/{core → src/core}/trace/trace-store.js +0 -0
  807. /package/dist/{core → src/core}/trace/types.js +0 -0
  808. /package/dist/{integrations/linear → src/core}/types.js +0 -0
  809. /package/dist/{integrations/linear → src/core}/types.js.map +0 -0
  810. /package/dist/{core → src/core}/utils/async-mutex.js +0 -0
  811. /package/dist/{core → src/core}/utils/compression.js +0 -0
  812. /package/dist/{core → src/core}/utils/update-checker.js +0 -0
  813. /package/dist/{core → src/core}/worktree/worktree-manager.js +0 -0
  814. /package/dist/{daemon → src/daemon}/daemon-config.js +0 -0
  815. /package/dist/{daemon → src/daemon}/services/context-service.js +0 -0
  816. /package/dist/{daemon → src/daemon}/services/linear-service.js +0 -0
  817. /package/dist/{daemon → src/daemon}/session-daemon.js +0 -0
  818. /package/dist/{daemon → src/daemon}/unified-daemon.js +0 -0
  819. /package/dist/{features → src/features}/analytics/api/analytics-api.js +0 -0
  820. /package/dist/{features → src/features}/analytics/core/analytics-service.js +0 -0
  821. /package/dist/{features → src/features}/analytics/index.js +0 -0
  822. /package/dist/{features → src/features}/analytics/queries/metrics-queries.js +0 -0
  823. /package/dist/{features → src/features}/analytics/types/metrics.js +0 -0
  824. /package/dist/{features → src/features}/analytics/types/metrics.js.map +0 -0
  825. /package/dist/{features → src/features}/browser/browser-mcp.js +0 -0
  826. /package/dist/{features → src/features}/sweep/index.js +0 -0
  827. /package/dist/{features → src/features}/sweep/prediction-client.js +0 -0
  828. /package/dist/{features → src/features}/sweep/prompt-builder.js +0 -0
  829. /package/dist/{features → src/features}/sweep/pty-wrapper.js +0 -0
  830. /package/dist/{features → src/features}/sweep/state-watcher.js +0 -0
  831. /package/dist/{features → src/features}/sweep/status-bar.js +0 -0
  832. /package/dist/{features → src/features}/sweep/sweep-server-manager.js +0 -0
  833. /package/dist/{features → src/features}/sweep/tab-interceptor.js +0 -0
  834. /package/dist/{features → src/features}/sweep/types.js +0 -0
  835. /package/dist/{features → src/features}/tasks/linear-task-manager.js +0 -0
  836. /package/dist/{features → src/features}/tasks/task-aware-context.js +0 -0
  837. /package/dist/{features → src/features}/tui/simple-monitor.js +0 -0
  838. /package/dist/{features → src/features}/tui/swarm-monitor.js +0 -0
  839. /package/dist/{features → src/features}/web/client/stores/task-store.js +0 -0
  840. /package/dist/{features → src/features}/web/server/index.js +0 -0
  841. /package/dist/{hooks → src/hooks}/auto-background.js +0 -0
  842. /package/dist/{hooks → src/hooks}/claude-code-whatsapp-hook.js +0 -0
  843. /package/dist/{hooks → src/hooks}/config.js +0 -0
  844. /package/dist/{hooks → src/hooks}/daemon.js +0 -0
  845. /package/dist/{hooks → src/hooks}/events.js +0 -0
  846. /package/dist/{hooks → src/hooks}/index.js +0 -0
  847. /package/dist/{hooks → src/hooks}/linear-task-picker.js +0 -0
  848. /package/dist/{hooks → src/hooks}/schemas.js +0 -0
  849. /package/dist/{hooks → src/hooks}/secure-fs.js +0 -0
  850. /package/dist/{hooks → src/hooks}/security-logger.js +0 -0
  851. /package/dist/{hooks → src/hooks}/session-summary.js +0 -0
  852. /package/dist/{hooks → src/hooks}/sms-action-runner.js +0 -0
  853. /package/dist/{hooks → src/hooks}/sms-notify.js +0 -0
  854. /package/dist/{hooks → src/hooks}/sms-watcher.js +0 -0
  855. /package/dist/{hooks → src/hooks}/sms-webhook.js +0 -0
  856. /package/dist/{hooks → src/hooks}/whatsapp-commands.js +0 -0
  857. /package/dist/{hooks → src/hooks}/whatsapp-scheduler.js +0 -0
  858. /package/dist/{hooks → src/hooks}/whatsapp-sync.js +0 -0
  859. /package/dist/{index.js → src/index.js} +0 -0
  860. /package/dist/{integrations → src/integrations}/anthropic/client.js +0 -0
  861. /package/dist/{integrations → src/integrations}/claude-code/agent-bridge.js +0 -0
  862. /package/dist/{integrations → src/integrations}/claude-code/enhanced-pre-clear-hooks.js +0 -0
  863. /package/dist/{integrations → src/integrations}/claude-code/lifecycle-hooks.js +0 -0
  864. /package/dist/{integrations → src/integrations}/claude-code/post-task-hooks.js +0 -0
  865. /package/dist/{integrations → src/integrations}/claude-code/subagent-client-stub.js +0 -0
  866. /package/dist/{integrations → src/integrations}/claude-code/subagent-client.js +0 -0
  867. /package/dist/{integrations → src/integrations}/claude-code/task-coordinator.js +0 -0
  868. /package/dist/{integrations → src/integrations}/linear/auth.js +0 -0
  869. /package/dist/{integrations → src/integrations}/linear/auto-sync.js +0 -0
  870. /package/dist/{integrations → src/integrations}/linear/config.js +0 -0
  871. /package/dist/{integrations → src/integrations}/linear/migration.js +0 -0
  872. /package/dist/{integrations → src/integrations}/linear/oauth-server.js +0 -0
  873. /package/dist/{integrations → src/integrations}/linear/rest-client.js +0 -0
  874. /package/dist/{integrations → src/integrations}/linear/sync-manager.js +0 -0
  875. /package/dist/{integrations → src/integrations}/linear/sync-service.js +0 -0
  876. /package/dist/{integrations → src/integrations}/linear/sync.js +0 -0
  877. /package/dist/{integrations/ralph → src/integrations/linear}/types.js +0 -0
  878. /package/dist/{integrations/ralph → src/integrations/linear}/types.js.map +0 -0
  879. /package/dist/{integrations → src/integrations}/linear/unified-sync.js +0 -0
  880. /package/dist/{integrations → src/integrations}/linear/webhook-handler.js +0 -0
  881. /package/dist/{integrations → src/integrations}/linear/webhook-server.js +0 -0
  882. /package/dist/{integrations → src/integrations}/linear/webhook.js +0 -0
  883. /package/dist/{integrations → src/integrations}/mcp/handlers/code-execution-handlers.js +0 -0
  884. /package/dist/{integrations → src/integrations}/mcp/handlers/context-handlers.js +0 -0
  885. /package/dist/{integrations → src/integrations}/mcp/handlers/discovery-handlers.js +0 -0
  886. /package/dist/{integrations → src/integrations}/mcp/handlers/index.js +0 -0
  887. /package/dist/{integrations → src/integrations}/mcp/handlers/linear-handlers.js +0 -0
  888. /package/dist/{integrations → src/integrations}/mcp/handlers/skill-handlers.js +0 -0
  889. /package/dist/{integrations → src/integrations}/mcp/handlers/task-handlers.js +0 -0
  890. /package/dist/{integrations → src/integrations}/mcp/handlers/trace-handlers.js +0 -0
  891. /package/dist/{integrations → src/integrations}/mcp/index.js +0 -0
  892. /package/dist/{integrations → src/integrations}/mcp/middleware/tool-scoring.js +0 -0
  893. /package/dist/{integrations → src/integrations}/mcp/refactored-server.js +0 -0
  894. /package/dist/{integrations → src/integrations}/mcp/schemas.js +0 -0
  895. /package/dist/{integrations → src/integrations}/mcp/tool-definitions-code.js +0 -0
  896. /package/dist/{integrations → src/integrations}/mcp/tool-definitions.js +0 -0
  897. /package/dist/{integrations → src/integrations}/ralph/bridge/ralph-stackmemory-bridge.js +0 -0
  898. /package/dist/{integrations → src/integrations}/ralph/context/context-budget-manager.js +0 -0
  899. /package/dist/{integrations → src/integrations}/ralph/context/stackmemory-context-loader.js +0 -0
  900. /package/dist/{integrations → src/integrations}/ralph/coordination/enhanced-coordination.js +0 -0
  901. /package/dist/{integrations → src/integrations}/ralph/index.js +0 -0
  902. /package/dist/{integrations → src/integrations}/ralph/learning/pattern-learner.js +0 -0
  903. /package/dist/{integrations → src/integrations}/ralph/lifecycle/iteration-lifecycle.js +0 -0
  904. /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-dashboard.js +0 -0
  905. /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-registry.js +0 -0
  906. /package/dist/{integrations → src/integrations}/ralph/orchestration/multi-loop-orchestrator.js +0 -0
  907. /package/dist/{integrations → src/integrations}/ralph/patterns/compounding-engineering-pattern.js +0 -0
  908. /package/dist/{integrations → src/integrations}/ralph/patterns/extended-coherence-sessions.js +0 -0
  909. /package/dist/{integrations → src/integrations}/ralph/patterns/oracle-worker-pattern.js +0 -0
  910. /package/dist/{integrations → src/integrations}/ralph/performance/performance-optimizer.js +0 -0
  911. /package/dist/{integrations → src/integrations}/ralph/recovery/crash-recovery.js +0 -0
  912. /package/dist/{integrations → src/integrations}/ralph/state/state-reconciler.js +0 -0
  913. /package/dist/{integrations → src/integrations}/ralph/swarm/git-workflow-manager.js +0 -0
  914. /package/dist/{integrations → src/integrations}/ralph/swarm/swarm-coordinator.js +0 -0
  915. /package/dist/{types/task.js.map → src/integrations/ralph/types.js.map} +0 -0
  916. /package/dist/{integrations → src/integrations}/ralph/visualization/ralph-debugger.js +0 -0
  917. /package/dist/{mcp → src/mcp}/stackmemory-mcp-server.js +0 -0
  918. /package/dist/{middleware → src/middleware}/exponential-rate-limiter.js +0 -0
  919. /package/dist/{models → src/models}/user.model.js +0 -0
  920. /package/dist/{servers → src/servers}/production/auth-middleware.js +0 -0
  921. /package/dist/{services → src/services}/config-service.js +0 -0
  922. /package/dist/{services → src/services}/context-service.js +0 -0
  923. /package/dist/{skills → src/skills}/api-discovery.js +0 -0
  924. /package/dist/{skills → src/skills}/api-skill.js +0 -0
  925. /package/dist/{skills → src/skills}/claude-skills.js +0 -0
  926. /package/dist/{skills → src/skills}/dashboard-launcher.js +0 -0
  927. /package/dist/{skills → src/skills}/recursive-agent-orchestrator.js +0 -0
  928. /package/dist/{skills → src/skills}/unified-rlm-orchestrator.js +0 -0
  929. /package/dist/{types → src/types}/task.js +0 -0
  930. /package/dist/{utils → src/utils}/env.js +0 -0
  931. /package/dist/{utils → src/utils}/formatting.js +0 -0
  932. /package/dist/{utils → src/utils}/process-cleanup.js +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/analytics/team-analytics.ts"],
4
- "sourcesContent": ["/**\n * Team Analytics - Phase 3 Collaboration Insights\n * Provides analytics and insights for team collaboration patterns\n */\n\nimport type {\n StackContext,\n HandoffRequest,\n} from '../context/dual-stack-manager.js';\nimport type {\n HandoffProgress,\n HandoffMetadata,\n} from '../context/frame-handoff-manager.js';\nimport type { MergeSession } from '../context/stack-merge-resolver.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface TeamMember {\n userId: string;\n name: string;\n role: 'developer' | 'lead' | 'architect' | 'qa' | 'designer';\n joinedAt: Date;\n lastActive: Date;\n skills: string[];\n permissions: {\n canCreateStacks: boolean;\n canApproveHandoffs: boolean;\n canMergeConflicts: boolean;\n };\n}\n\nexport interface CollaborationMetrics {\n timeRange: { start: Date; end: Date };\n teamMetrics: {\n totalMembers: number;\n activeMembers: number;\n newMembers: number;\n retentionRate: number;\n };\n handoffMetrics: {\n totalHandoffs: number;\n successfulHandoffs: number;\n averageApprovalTime: number;\n rejectionRate: number;\n mostActiveHandoffPairs: Array<{\n source: string;\n target: string;\n count: number;\n successRate: number;\n }>;\n };\n conflictMetrics: {\n totalConflicts: number;\n autoResolvedConflicts: number;\n manualResolvedConflicts: number;\n averageResolutionTime: number;\n conflictHotspots: Array<{\n frameType: string;\n conflictType: string;\n frequency: number;\n }>;\n };\n productivityMetrics: {\n frameCreationRate: number;\n frameCompletionRate: number;\n averageFrameLifecycle: number;\n collaborativeFramePercentage: number;\n };\n}\n\nexport interface TeamInsight {\n id: string;\n type: 'opportunity' | 'risk' | 'success' | 'recommendation';\n severity: 'low' | 'medium' | 'high';\n title: string;\n description: string;\n actionItems: string[];\n affectedUsers: string[];\n metrics: Record<string, number>;\n generatedAt: Date;\n}\n\nexport interface WorkflowPattern {\n id: string;\n name: string;\n description: string;\n frequency: number;\n participants: string[];\n steps: Array<{\n action: string;\n averageTime: number;\n successRate: number;\n }>;\n efficiency: number; // 0-1 score\n recommendations: string[];\n}\n\nexport class TeamAnalytics {\n private teamMembers: Map<string, TeamMember> = new Map();\n private handoffHistory: HandoffProgress[] = [];\n private mergeHistory: MergeSession[] = [];\n private analyticsCache: Map<string, any> = new Map();\n\n /**\n * Add or update team member\n */\n addTeamMember(member: TeamMember): void {\n this.teamMembers.set(member.userId, member);\n logger.info(`Team member added: ${member.userId}`, {\n role: member.role,\n skills: member.skills,\n });\n }\n\n /**\n * Record handoff activity\n */\n recordHandoffActivity(\n progress: HandoffProgress,\n metadata?: HandoffMetadata\n ): void {\n this.handoffHistory.push(progress);\n this.invalidateCache('handoff');\n\n logger.debug(`Handoff activity recorded: ${progress.requestId}`, {\n status: progress.status,\n transferredFrames: progress.transferredFrames,\n });\n }\n\n /**\n * Record merge activity\n */\n recordMergeActivity(session: MergeSession): void {\n this.mergeHistory.push(session);\n this.invalidateCache('merge');\n\n logger.debug(`Merge activity recorded: ${session.sessionId}`, {\n conflicts: session.conflicts.length,\n resolutions: session.resolutions.length,\n });\n }\n\n /**\n * Generate comprehensive collaboration metrics\n */\n async generateCollaborationMetrics(timeRange: {\n start: Date;\n end: Date;\n }): Promise<CollaborationMetrics> {\n const cacheKey = `metrics-${timeRange.start.toISOString()}-${timeRange.end.toISOString()}`;\n\n if (this.analyticsCache.has(cacheKey)) {\n return this.analyticsCache.get(cacheKey);\n }\n\n const metrics: CollaborationMetrics = {\n timeRange,\n teamMetrics: await this.calculateTeamMetrics(timeRange),\n handoffMetrics: await this.calculateHandoffMetrics(timeRange),\n conflictMetrics: await this.calculateConflictMetrics(timeRange),\n productivityMetrics: await this.calculateProductivityMetrics(timeRange),\n };\n\n this.analyticsCache.set(cacheKey, metrics);\n return metrics;\n }\n\n /**\n * Calculate team-level metrics\n */\n private async calculateTeamMetrics(timeRange: { start: Date; end: Date }) {\n const allMembers = Array.from(this.teamMembers.values());\n const activeMembers = allMembers.filter(\n (m) => m.lastActive >= timeRange.start && m.lastActive <= timeRange.end\n );\n const newMembers = allMembers.filter(\n (m) => m.joinedAt >= timeRange.start && m.joinedAt <= timeRange.end\n );\n\n // Calculate retention rate (simplified)\n const previousPeriodStart = new Date(\n timeRange.start.getTime() -\n (timeRange.end.getTime() - timeRange.start.getTime())\n );\n const previousActiveMembers = allMembers.filter(\n (m) =>\n m.lastActive >= previousPeriodStart && m.lastActive < timeRange.start\n );\n const retainedMembers = activeMembers.filter((m) =>\n previousActiveMembers.find((pm) => pm.userId === m.userId)\n );\n const retentionRate =\n previousActiveMembers.length > 0\n ? retainedMembers.length / previousActiveMembers.length\n : 1;\n\n return {\n totalMembers: allMembers.length,\n activeMembers: activeMembers.length,\n newMembers: newMembers.length,\n retentionRate,\n };\n }\n\n /**\n * Calculate handoff-specific metrics\n */\n private async calculateHandoffMetrics(timeRange: { start: Date; end: Date }) {\n const relevantHandoffs = this.handoffHistory.filter((h) => {\n // Filter by time range - would need timestamps in actual implementation\n return true; // Placeholder\n });\n\n const successfulHandoffs = relevantHandoffs.filter(\n (h) => h.status === 'completed'\n );\n const rejectedHandoffs = relevantHandoffs.filter(\n (h) => h.status === 'failed'\n );\n\n // Calculate approval time (simplified - would need proper timestamps)\n const averageApprovalTime = this.calculateAverageTime(\n successfulHandoffs,\n 'approval'\n );\n\n // Find most active handoff pairs\n const handoffPairs = this.analyzeHandoffPairs(relevantHandoffs);\n\n return {\n totalHandoffs: relevantHandoffs.length,\n successfulHandoffs: successfulHandoffs.length,\n averageApprovalTime,\n rejectionRate:\n relevantHandoffs.length > 0\n ? rejectedHandoffs.length / relevantHandoffs.length\n : 0,\n mostActiveHandoffPairs: handoffPairs,\n };\n }\n\n /**\n * Calculate conflict resolution metrics\n */\n private async calculateConflictMetrics(timeRange: {\n start: Date;\n end: Date;\n }) {\n const relevantMerges = this.mergeHistory.filter((m) => {\n return m.startedAt >= timeRange.start && m.startedAt <= timeRange.end;\n });\n\n const totalConflicts = relevantMerges.reduce(\n (sum, m) => sum + m.conflicts.length,\n 0\n );\n const autoResolved = relevantMerges.reduce(\n (sum, m) => sum + m.metadata.autoResolvedConflicts,\n 0\n );\n const manualResolved = relevantMerges.reduce(\n (sum, m) => sum + m.metadata.manualResolvedConflicts,\n 0\n );\n\n const averageResolutionTime =\n this.calculateAverageResolutionTime(relevantMerges);\n const conflictHotspots = this.analyzeConflictHotspots(relevantMerges);\n\n return {\n totalConflicts,\n autoResolvedConflicts: autoResolved,\n manualResolvedConflicts: manualResolved,\n averageResolutionTime,\n conflictHotspots,\n };\n }\n\n /**\n * Calculate productivity metrics\n */\n private async calculateProductivityMetrics(timeRange: {\n start: Date;\n end: Date;\n }) {\n // These would be calculated from frame creation/completion data\n // Placeholder implementation\n return {\n frameCreationRate: 15.5, // frames per day\n frameCompletionRate: 12.3, // frames per day\n averageFrameLifecycle: 2.5, // days\n collaborativeFramePercentage: 0.65, // 65% of frames involve collaboration\n };\n }\n\n /**\n * Generate actionable insights from metrics\n */\n async generateInsights(\n metrics: CollaborationMetrics\n ): Promise<TeamInsight[]> {\n const insights: TeamInsight[] = [];\n\n // High rejection rate insight\n if (metrics.handoffMetrics.rejectionRate > 0.3) {\n insights.push({\n id: `high-rejection-${Date.now()}`,\n type: 'risk',\n severity: 'high',\n title: 'High Handoff Rejection Rate',\n description: `${Math.round(metrics.handoffMetrics.rejectionRate * 100)}% of handoffs are being rejected`,\n actionItems: [\n 'Review handoff quality guidelines',\n 'Implement pre-handoff checklists',\n 'Provide additional training on code review standards',\n ],\n affectedUsers: [], // Would identify specific users\n metrics: { rejectionRate: metrics.handoffMetrics.rejectionRate },\n generatedAt: new Date(),\n });\n }\n\n // Slow approval times\n if (metrics.handoffMetrics.averageApprovalTime > 24 * 60 * 60 * 1000) {\n // > 24 hours\n insights.push({\n id: `slow-approval-${Date.now()}`,\n type: 'opportunity',\n severity: 'medium',\n title: 'Slow Handoff Approval Times',\n description: 'Average approval time exceeds 24 hours',\n actionItems: [\n 'Set up approval time SLAs',\n 'Implement automated reminders',\n 'Add more reviewers to distribute load',\n ],\n affectedUsers: [],\n metrics: {\n averageApprovalTime: metrics.handoffMetrics.averageApprovalTime,\n },\n generatedAt: new Date(),\n });\n }\n\n // High conflict rate\n if (\n metrics.conflictMetrics.manualResolvedConflicts >\n metrics.conflictMetrics.autoResolvedConflicts\n ) {\n insights.push({\n id: `high-conflicts-${Date.now()}`,\n type: 'risk',\n severity: 'medium',\n title: 'High Manual Conflict Resolution',\n description: 'Most conflicts require manual resolution',\n actionItems: [\n 'Review merge policies to increase auto-resolution',\n 'Improve frame naming and organization conventions',\n 'Implement conflict prevention guidelines',\n ],\n affectedUsers: [],\n metrics: {\n manualConflicts: metrics.conflictMetrics.manualResolvedConflicts,\n autoConflicts: metrics.conflictMetrics.autoResolvedConflicts,\n },\n generatedAt: new Date(),\n });\n }\n\n // High productivity teams\n if (metrics.productivityMetrics.collaborativeFramePercentage > 0.8) {\n insights.push({\n id: `high-collaboration-${Date.now()}`,\n type: 'success',\n severity: 'low',\n title: 'Excellent Collaboration Rate',\n description: `${Math.round(metrics.productivityMetrics.collaborativeFramePercentage * 100)}% of frames involve collaboration`,\n actionItems: [\n 'Document successful collaboration patterns',\n 'Share best practices with other teams',\n 'Consider mentoring programs',\n ],\n affectedUsers: [],\n metrics: {\n collaborationRate:\n metrics.productivityMetrics.collaborativeFramePercentage,\n },\n generatedAt: new Date(),\n });\n }\n\n return insights;\n }\n\n /**\n * Identify workflow patterns from team activity\n */\n async identifyWorkflowPatterns(): Promise<WorkflowPattern[]> {\n const patterns: WorkflowPattern[] = [];\n\n // Pattern 1: Standard Feature Development\n patterns.push({\n id: 'feature-development',\n name: 'Feature Development Workflow',\n description: 'Individual development \u2192 Review \u2192 Merge to shared stack',\n frequency: this.calculatePatternFrequency('feature-development'),\n participants: this.getPatternParticipants('feature-development'),\n steps: [\n {\n action: 'Create individual frames',\n averageTime: 4 * 60 * 60 * 1000,\n successRate: 0.95,\n },\n {\n action: 'Request handoff',\n averageTime: 5 * 60 * 1000,\n successRate: 0.9,\n },\n {\n action: 'Review and approve',\n averageTime: 2 * 60 * 60 * 1000,\n successRate: 0.85,\n },\n {\n action: 'Merge to shared stack',\n averageTime: 10 * 60 * 1000,\n successRate: 0.95,\n },\n ],\n efficiency: 0.85,\n recommendations: [\n 'Standardize review criteria to reduce rejection rate',\n 'Implement automated checks before handoff request',\n ],\n });\n\n // Pattern 2: Pair Programming\n patterns.push({\n id: 'pair-programming',\n name: 'Pair Programming Workflow',\n description: 'Direct collaboration in shared stack',\n frequency: this.calculatePatternFrequency('pair-programming'),\n participants: this.getPatternParticipants('pair-programming'),\n steps: [\n {\n action: 'Create shared stack',\n averageTime: 2 * 60 * 1000,\n successRate: 0.99,\n },\n {\n action: 'Collaborative development',\n averageTime: 6 * 60 * 60 * 1000,\n successRate: 0.9,\n },\n {\n action: 'Resolve conflicts in real-time',\n averageTime: 15 * 60 * 1000,\n successRate: 0.95,\n },\n ],\n efficiency: 0.92,\n recommendations: [\n 'Excellent pattern - consider promoting for complex features',\n 'Document best practices for real-time collaboration',\n ],\n });\n\n return patterns;\n }\n\n /**\n * Get team performance dashboard data\n */\n async getDashboardData(timeRange: { start: Date; end: Date }): Promise<{\n metrics: CollaborationMetrics;\n insights: TeamInsight[];\n patterns: WorkflowPattern[];\n topCollaborators: Array<{\n userId: string;\n handoffsInitiated: number;\n handoffsApproved: number;\n conflictsResolved: number;\n collaborationScore: number;\n }>;\n }> {\n const metrics = await this.generateCollaborationMetrics(timeRange);\n const insights = await this.generateInsights(metrics);\n const patterns = await this.identifyWorkflowPatterns();\n const topCollaborators = this.calculateTopCollaborators(timeRange);\n\n return {\n metrics,\n insights,\n patterns,\n topCollaborators,\n };\n }\n\n // Helper methods\n private invalidateCache(type: string): void {\n const keysToRemove = Array.from(this.analyticsCache.keys()).filter((key) =>\n key.includes(type)\n );\n keysToRemove.forEach((key) => this.analyticsCache.delete(key));\n }\n\n private calculateAverageTime(items: any[], type: string): number {\n // Simplified calculation - would use real timestamps\n return 2 * 60 * 60 * 1000; // 2 hours default\n }\n\n private analyzeHandoffPairs(handoffs: HandoffProgress[]): Array<{\n source: string;\n target: string;\n count: number;\n successRate: number;\n }> {\n // Implementation would analyze actual handoff data\n return [\n { source: 'alice', target: 'bob', count: 15, successRate: 0.87 },\n { source: 'bob', target: 'charlie', count: 12, successRate: 0.92 },\n ];\n }\n\n private calculateAverageResolutionTime(merges: MergeSession[]): number {\n const completedMerges = merges.filter((m) => m.completedAt && m.startedAt);\n if (completedMerges.length === 0) return 0;\n\n const totalTime = completedMerges.reduce(\n (sum, m) => sum + (m.completedAt!.getTime() - m.startedAt.getTime()),\n 0\n );\n\n return totalTime / completedMerges.length;\n }\n\n private analyzeConflictHotspots(merges: MergeSession[]): Array<{\n frameType: string;\n conflictType: string;\n frequency: number;\n }> {\n // Implementation would analyze actual conflict data\n return [\n { frameType: 'implementation', conflictType: 'content', frequency: 25 },\n { frameType: 'task', conflictType: 'metadata', frequency: 15 },\n { frameType: 'test', conflictType: 'sequence', frequency: 10 },\n ];\n }\n\n private calculatePatternFrequency(patternId: string): number {\n // Implementation would calculate from actual data\n return Math.random() * 50; // Placeholder\n }\n\n private getPatternParticipants(patternId: string): string[] {\n // Implementation would identify actual participants\n return Array.from(this.teamMembers.keys()).slice(0, 3);\n }\n\n private calculateTopCollaborators(timeRange: {\n start: Date;\n end: Date;\n }): Array<{\n userId: string;\n handoffsInitiated: number;\n handoffsApproved: number;\n conflictsResolved: number;\n collaborationScore: number;\n }> {\n // Implementation would calculate from actual data\n return Array.from(this.teamMembers.entries())\n .map(([userId, member]) => ({\n userId,\n handoffsInitiated: Math.floor(Math.random() * 20),\n handoffsApproved: Math.floor(Math.random() * 15),\n conflictsResolved: Math.floor(Math.random() * 10),\n collaborationScore: Math.random(),\n }))\n .sort((a, b) => b.collaborationScore - a.collaborationScore);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/config/config-manager.ts"],
4
- "sourcesContent": ["/**\n * Configuration Manager for StackMemory\n * Handles loading, validation, and management of configuration\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport {\n StackMemoryConfig,\n ProfileConfig,\n DEFAULT_CONFIG,\n PRESET_PROFILES,\n ScoringWeights,\n} from './types.js';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n suggestions: string[];\n}\n\nexport class ConfigManager {\n private static instance: ConfigManager | null = null;\n private config: StackMemoryConfig;\n private configPath: string;\n private fileWatcher?: fs.FSWatcher;\n private onChangeCallbacks: Array<(config: StackMemoryConfig) => void> = [];\n\n constructor(configPath?: string) {\n this.configPath =\n configPath || path.join(process.cwd(), '.stackmemory', 'config.yaml');\n this.config = this.loadConfig();\n }\n\n /**\n * Get singleton instance of ConfigManager\n */\n public static getInstance(configPath?: string): ConfigManager {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager(configPath);\n }\n return ConfigManager.instance;\n }\n\n /**\n * Load configuration from file or use defaults\n */\n private loadConfig(): StackMemoryConfig {\n try {\n if (fs.existsSync(this.configPath)) {\n const content = fs.readFileSync(this.configPath, 'utf-8');\n const loaded = yaml.load(content) as Partial<StackMemoryConfig>;\n return this.mergeWithDefaults(loaded);\n }\n } catch (error: unknown) {\n console.warn(`Failed to load config from ${this.configPath}:`, error);\n }\n // Deep clone to prevent mutation of DEFAULT_CONFIG\n return this.mergeWithDefaults({});\n }\n\n /**\n * Merge loaded config with defaults\n */\n private mergeWithDefaults(\n loaded: Partial<StackMemoryConfig>\n ): StackMemoryConfig {\n const config: StackMemoryConfig = {\n version: loaded.version || DEFAULT_CONFIG.version,\n profile: loaded.profile,\n scoring: {\n weights: {\n ...DEFAULT_CONFIG.scoring.weights,\n ...loaded.scoring?.weights,\n },\n tool_scores: {\n ...DEFAULT_CONFIG.scoring.tool_scores,\n ...loaded.scoring?.tool_scores,\n },\n },\n retention: {\n local: {\n ...DEFAULT_CONFIG.retention.local,\n ...loaded.retention?.local,\n },\n remote: {\n ...DEFAULT_CONFIG.retention.remote,\n ...loaded.retention?.remote,\n },\n generational_gc: {\n ...DEFAULT_CONFIG.retention.generational_gc,\n ...loaded.retention?.generational_gc,\n },\n },\n performance: { ...DEFAULT_CONFIG.performance, ...loaded.performance },\n profiles: { ...PRESET_PROFILES, ...loaded.profiles },\n };\n\n // Apply active profile if specified\n if (config.profile && config.profiles?.[config.profile]) {\n this.applyProfile(config, config.profiles[config.profile]);\n }\n\n return config;\n }\n\n /**\n * Apply a profile to the configuration\n */\n private applyProfile(\n config: StackMemoryConfig,\n profile: ProfileConfig\n ): void {\n if (profile.scoring) {\n if (profile.scoring.weights) {\n config.scoring.weights = {\n ...config.scoring.weights,\n ...profile.scoring.weights,\n };\n }\n if (profile.scoring.tool_scores) {\n config.scoring.tool_scores = {\n ...config.scoring.tool_scores,\n ...profile.scoring.tool_scores,\n };\n }\n }\n\n if (profile.retention) {\n if (profile.retention.local) {\n config.retention.local = {\n ...config.retention.local,\n ...profile.retention.local,\n };\n }\n if (profile.retention.remote) {\n config.retention.remote = {\n ...config.retention.remote,\n ...profile.retention.remote,\n };\n }\n if (profile.retention.generational_gc) {\n config.retention.generational_gc = {\n ...config.retention.generational_gc,\n ...profile.retention.generational_gc,\n };\n }\n }\n\n if (profile.performance) {\n config.performance = { ...config.performance, ...profile.performance };\n }\n }\n\n /**\n * Validate configuration\n */\n validate(): ValidationResult {\n const result: ValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n suggestions: [],\n };\n\n // Validate weights sum to 1.0\n const weights = this.config.scoring.weights;\n const weightSum =\n weights.base + weights.impact + weights.persistence + weights.reference;\n if (Math.abs(weightSum - 1.0) > 0.001) {\n result.errors.push(\n `Weights must sum to 1.0 (current: ${weightSum.toFixed(3)})`\n );\n result.valid = false;\n }\n\n // Validate weight ranges\n Object.entries(weights).forEach(([key, value]) => {\n if (value < 0 || value > 1) {\n result.errors.push(\n `Weight ${key} must be between 0 and 1 (current: ${value})`\n );\n result.valid = false;\n }\n });\n\n // Validate tool scores\n Object.entries(this.config.scoring.tool_scores).forEach(([tool, score]) => {\n if (score !== undefined && (score < 0 || score > 1)) {\n result.errors.push(\n `Tool score for ${tool} must be between 0 and 1 (current: ${score})`\n );\n result.valid = false;\n }\n });\n\n // Validate retention periods are ordered\n const youngMs = this.parseDuration(this.config.retention.local.young);\n const matureMs = this.parseDuration(this.config.retention.local.mature);\n const oldMs = this.parseDuration(this.config.retention.local.old);\n\n if (youngMs >= matureMs) {\n result.errors.push(\n 'Young retention period must be less than mature period'\n );\n result.valid = false;\n }\n if (matureMs >= oldMs) {\n result.errors.push(\n 'Mature retention period must be less than old period'\n );\n result.valid = false;\n }\n\n // Validate max size\n const maxSize = this.parseSize(this.config.retention.local.max_size);\n const availableSpace = this.getAvailableDiskSpace();\n if (availableSpace > 0 && maxSize > availableSpace) {\n result.warnings.push(\n `max_size (${this.config.retention.local.max_size}) exceeds available disk space`\n );\n }\n\n // Performance warnings\n if (this.config.performance.retrieval_timeout_ms < 100) {\n result.warnings.push(\n 'retrieval_timeout_ms < 100ms may be too aggressive'\n );\n }\n\n if (this.config.performance.max_stack_depth > 10000) {\n result.warnings.push('max_stack_depth > 10000 may impact performance');\n }\n\n // Suggestions\n if (!this.config.profile) {\n result.suggestions.push('Consider using a profile for your use case');\n }\n\n if (\n this.config?.scoring?.tool_scores?.search &&\n this.config.scoring.tool_scores.search < 0.5\n ) {\n result.suggestions.push(\n 'Search tool score seems low - consider increasing for better discovery'\n );\n }\n\n return result;\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)([hdwm])$/);\n if (!match) return 0;\n\n const value = parseInt(match[1]);\n const unit = match[2];\n\n const multipliers: Record<string, number> = {\n h: 3600000, // hours\n d: 86400000, // days\n w: 604800000, // weeks\n m: 2592000000, // months (30 days)\n };\n\n return value * (multipliers[unit] || 0);\n }\n\n /**\n * Parse size string to bytes\n */\n private parseSize(size: string): number {\n const match = size.match(/^(\\d+(?:\\.\\d+)?)([KMGT]B)?$/i);\n if (!match) return 0;\n\n const value = parseFloat(match[1]);\n const unit = match[2]?.toUpperCase() || 'B';\n\n const multipliers: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n };\n\n return value * (multipliers[unit] || 1);\n }\n\n /**\n * Get available disk space (simplified)\n */\n private getAvailableDiskSpace(): number {\n // This would need platform-specific implementation\n // For now, return 0 to skip validation\n return 0;\n }\n\n /**\n * Save configuration to file\n */\n save(): void {\n const dir = path.dirname(this.configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const content = yaml.dump(this.config, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n });\n\n fs.writeFileSync(this.configPath, content, 'utf-8');\n }\n\n /**\n * Get current configuration\n */\n getConfig(): StackMemoryConfig {\n return { ...this.config };\n }\n\n /**\n * Get a specific configuration value by path\n * Example: config.get('project.id') returns config.project.id\n */\n get(path: string): any {\n const keys = path.split('.');\n let value: any = this.config;\n \n for (const key of keys) {\n if (value && typeof value === 'object' && key in value) {\n value = value[key];\n } else {\n return undefined;\n }\n }\n \n return value;\n }\n\n /**\n * Set active profile\n */\n setProfile(profileName: string): boolean {\n const allProfiles = { ...PRESET_PROFILES, ...this.config.profiles };\n if (!allProfiles[profileName]) {\n return false;\n }\n\n // Apply the profile to current config\n this.config.profile = profileName;\n this.applyProfile(this.config, allProfiles[profileName]);\n this.notifyChange();\n return true;\n }\n\n /**\n * Update weights\n */\n updateWeights(weights: Partial<ScoringWeights>): void {\n this.config.scoring.weights = {\n ...this.config.scoring.weights,\n ...weights,\n };\n this.notifyChange();\n }\n\n /**\n * Update tool scores\n */\n updateToolScores(scores: Record<string, number>): void {\n this.config.scoring.tool_scores = {\n ...this.config.scoring.tool_scores,\n ...scores,\n };\n this.notifyChange();\n }\n\n /**\n * Enable hot reload\n */\n enableHotReload(): void {\n if (this.fileWatcher) return;\n\n if (fs.existsSync(this.configPath)) {\n this.fileWatcher = fs.watch(this.configPath, (eventType) => {\n if (eventType === 'change') {\n const newConfig = this.loadConfig();\n const validation = this.validate();\n\n if (validation.valid) {\n this.config = newConfig;\n this.notifyChange();\n console.log('Configuration reloaded');\n } else {\n console.error(\n 'Invalid configuration, keeping previous:',\n validation.errors\n );\n }\n }\n });\n }\n }\n\n /**\n * Disable hot reload\n */\n disableHotReload(): void {\n if (this.fileWatcher) {\n this.fileWatcher.close();\n this.fileWatcher = undefined;\n }\n }\n\n /**\n * Register change callback\n */\n onChange(callback: (config: StackMemoryConfig) => void): void {\n this.onChangeCallbacks.push(callback);\n }\n\n /**\n * Notify all change callbacks\n */\n private notifyChange(): void {\n const config = this.getConfig();\n this.onChangeCallbacks.forEach((cb) => cb(config));\n }\n\n /**\n * Calculate importance score for a tool\n */\n calculateScore(\n tool: string,\n additionalFactors?: {\n filesAffected?: number;\n isPermanent?: boolean;\n referenceCount?: number;\n }\n ): number {\n const baseScore = this.config.scoring.tool_scores[tool] || 0.5;\n const weights = this.config.scoring.weights;\n\n let score = baseScore * weights.base;\n\n if (additionalFactors) {\n // Impact multiplier (files affected)\n if (additionalFactors.filesAffected !== undefined) {\n const impactMultiplier = Math.min(\n additionalFactors.filesAffected / 10,\n 1\n );\n score += impactMultiplier * weights.impact;\n }\n\n // Persistence bonus\n if (additionalFactors.isPermanent) {\n score += 0.2 * weights.persistence;\n }\n\n // Reference count\n if (additionalFactors.referenceCount !== undefined) {\n const refMultiplier = Math.min(\n additionalFactors.referenceCount / 100,\n 1\n );\n score += refMultiplier * weights.reference;\n }\n }\n\n return Math.min(Math.max(score, 0), 1); // Clamp to [0, 1]\n }\n\n /**\n * Get available profiles\n */\n getProfiles(): Record<string, ProfileConfig> {\n return { ...PRESET_PROFILES, ...this.config.profiles };\n }\n}\n"],
5
- "mappings": ";;;;AAKA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,UAAU;AACtB;AAAA,EAGE;AAAA,EACA;AAAA,OAEK;AASA,MAAM,cAAc;AAAA,EACzB,OAAe,WAAiC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAgE,CAAC;AAAA,EAEzE,YAAY,YAAqB;AAC/B,SAAK,aACH,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,gBAAgB,aAAa;AACtE,SAAK,SAAS,KAAK,WAAW;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,YAAY,YAAoC;AAC5D,QAAI,CAAC,cAAc,UAAU;AAC3B,oBAAc,WAAW,IAAI,cAAc,UAAU;AAAA,IACvD;AACA,WAAO,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAgC;AACtC,QAAI;AACF,UAAI,GAAG,WAAW,KAAK,UAAU,GAAG;AAClC,cAAM,UAAU,GAAG,aAAa,KAAK,YAAY,OAAO;AACxD,cAAM,SAAS,KAAK,KAAK,OAAO;AAChC,eAAO,KAAK,kBAAkB,MAAM;AAAA,MACtC;AAAA,IACF,SAAS,OAAgB;AACvB,cAAQ,KAAK,8BAA8B,KAAK,UAAU,KAAK,KAAK;AAAA,IACtE;AAEA,WAAO,KAAK,kBAAkB,CAAC,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBACN,QACmB;AACnB,UAAM,SAA4B;AAAA,MAChC,SAAS,OAAO,WAAW,eAAe;AAAA,MAC1C,SAAS,OAAO;AAAA,MAChB,SAAS;AAAA,QACP,SAAS;AAAA,UACP,GAAG,eAAe,QAAQ;AAAA,UAC1B,GAAG,OAAO,SAAS;AAAA,QACrB;AAAA,QACA,aAAa;AAAA,UACX,GAAG,eAAe,QAAQ;AAAA,UAC1B,GAAG,OAAO,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,UACL,GAAG,eAAe,UAAU;AAAA,UAC5B,GAAG,OAAO,WAAW;AAAA,QACvB;AAAA,QACA,QAAQ;AAAA,UACN,GAAG,eAAe,UAAU;AAAA,UAC5B,GAAG,OAAO,WAAW;AAAA,QACvB;AAAA,QACA,iBAAiB;AAAA,UACf,GAAG,eAAe,UAAU;AAAA,UAC5B,GAAG,OAAO,WAAW;AAAA,QACvB;AAAA,MACF;AAAA,MACA,aAAa,EAAE,GAAG,eAAe,aAAa,GAAG,OAAO,YAAY;AAAA,MACpE,UAAU,EAAE,GAAG,iBAAiB,GAAG,OAAO,SAAS;AAAA,IACrD;AAGA,QAAI,OAAO,WAAW,OAAO,WAAW,OAAO,OAAO,GAAG;AACvD,WAAK,aAAa,QAAQ,OAAO,SAAS,OAAO,OAAO,CAAC;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aACN,QACA,SACM;AACN,QAAI,QAAQ,SAAS;AACnB,UAAI,QAAQ,QAAQ,SAAS;AAC3B,eAAO,QAAQ,UAAU;AAAA,UACvB,GAAG,OAAO,QAAQ;AAAA,UAClB,GAAG,QAAQ,QAAQ;AAAA,QACrB;AAAA,MACF;AACA,UAAI,QAAQ,QAAQ,aAAa;AAC/B,eAAO,QAAQ,cAAc;AAAA,UAC3B,GAAG,OAAO,QAAQ;AAAA,UAClB,GAAG,QAAQ,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW;AACrB,UAAI,QAAQ,UAAU,OAAO;AAC3B,eAAO,UAAU,QAAQ;AAAA,UACvB,GAAG,OAAO,UAAU;AAAA,UACpB,GAAG,QAAQ,UAAU;AAAA,QACvB;AAAA,MACF;AACA,UAAI,QAAQ,UAAU,QAAQ;AAC5B,eAAO,UAAU,SAAS;AAAA,UACxB,GAAG,OAAO,UAAU;AAAA,UACpB,GAAG,QAAQ,UAAU;AAAA,QACvB;AAAA,MACF;AACA,UAAI,QAAQ,UAAU,iBAAiB;AACrC,eAAO,UAAU,kBAAkB;AAAA,UACjC,GAAG,OAAO,UAAU;AAAA,UACpB,GAAG,QAAQ,UAAU;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa;AACvB,aAAO,cAAc,EAAE,GAAG,OAAO,aAAa,GAAG,QAAQ,YAAY;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAA6B;AAC3B,UAAM,SAA2B;AAAA,MAC/B,OAAO;AAAA,MACP,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,aAAa,CAAC;AAAA,IAChB;AAGA,UAAM,UAAU,KAAK,OAAO,QAAQ;AACpC,UAAM,YACJ,QAAQ,OAAO,QAAQ,SAAS,QAAQ,cAAc,QAAQ;AAChE,QAAI,KAAK,IAAI,YAAY,CAAG,IAAI,MAAO;AACrC,aAAO,OAAO;AAAA,QACZ,qCAAqC,UAAU,QAAQ,CAAC,CAAC;AAAA,MAC3D;AACA,aAAO,QAAQ;AAAA,IACjB;AAGA,WAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,UAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,eAAO,OAAO;AAAA,UACZ,UAAU,GAAG,sCAAsC,KAAK;AAAA,QAC1D;AACA,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAGD,WAAO,QAAQ,KAAK,OAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AACzE,UAAI,UAAU,WAAc,QAAQ,KAAK,QAAQ,IAAI;AACnD,eAAO,OAAO;AAAA,UACZ,kBAAkB,IAAI,sCAAsC,KAAK;AAAA,QACnE;AACA,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAGD,UAAM,UAAU,KAAK,cAAc,KAAK,OAAO,UAAU,MAAM,KAAK;AACpE,UAAM,WAAW,KAAK,cAAc,KAAK,OAAO,UAAU,MAAM,MAAM;AACtE,UAAM,QAAQ,KAAK,cAAc,KAAK,OAAO,UAAU,MAAM,GAAG;AAEhE,QAAI,WAAW,UAAU;AACvB,aAAO,OAAO;AAAA,QACZ;AAAA,MACF;AACA,aAAO,QAAQ;AAAA,IACjB;AACA,QAAI,YAAY,OAAO;AACrB,aAAO,OAAO;AAAA,QACZ;AAAA,MACF;AACA,aAAO,QAAQ;AAAA,IACjB;AAGA,UAAM,UAAU,KAAK,UAAU,KAAK,OAAO,UAAU,MAAM,QAAQ;AACnE,UAAM,iBAAiB,KAAK,sBAAsB;AAClD,QAAI,iBAAiB,KAAK,UAAU,gBAAgB;AAClD,aAAO,SAAS;AAAA,QACd,aAAa,KAAK,OAAO,UAAU,MAAM,QAAQ;AAAA,MACnD;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,YAAY,uBAAuB,KAAK;AACtD,aAAO,SAAS;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,YAAY,kBAAkB,KAAO;AACnD,aAAO,SAAS,KAAK,gDAAgD;AAAA,IACvE;AAGA,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,aAAO,YAAY,KAAK,4CAA4C;AAAA,IACtE;AAEA,QACE,KAAK,QAAQ,SAAS,aAAa,UACnC,KAAK,OAAO,QAAQ,YAAY,SAAS,KACzC;AACA,aAAO,YAAY;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,UAA0B;AAC9C,UAAM,QAAQ,SAAS,MAAM,iBAAiB;AAC9C,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,QAAQ,SAAS,MAAM,CAAC,CAAC;AAC/B,UAAM,OAAO,MAAM,CAAC;AAEpB,UAAM,cAAsC;AAAA,MAC1C,GAAG;AAAA;AAAA,MACH,GAAG;AAAA;AAAA,MACH,GAAG;AAAA;AAAA,MACH,GAAG;AAAA;AAAA,IACL;AAEA,WAAO,SAAS,YAAY,IAAI,KAAK;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAsB;AACtC,UAAM,QAAQ,KAAK,MAAM,8BAA8B;AACvD,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,QAAQ,WAAW,MAAM,CAAC,CAAC;AACjC,UAAM,OAAO,MAAM,CAAC,GAAG,YAAY,KAAK;AAExC,UAAM,cAAsC;AAAA,MAC1C,GAAG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI,OAAO;AAAA,MACX,IAAI,OAAO,OAAO;AAAA,MAClB,IAAI,OAAO,OAAO,OAAO;AAAA,IAC3B;AAEA,WAAO,SAAS,YAAY,IAAI,KAAK;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAgC;AAGtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,UAAM,MAAM,KAAK,QAAQ,KAAK,UAAU;AACxC,QAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACvB,SAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC;AAEA,UAAM,UAAU,KAAK,KAAK,KAAK,QAAQ;AAAA,MACrC,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAED,OAAG,cAAc,KAAK,YAAY,SAAS,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,YAA+B;AAC7B,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAIA,OAAmB;AACrB,UAAM,OAAOA,MAAK,MAAM,GAAG;AAC3B,QAAI,QAAa,KAAK;AAEtB,eAAW,OAAO,MAAM;AACtB,UAAI,SAAS,OAAO,UAAU,YAAY,OAAO,OAAO;AACtD,gBAAQ,MAAM,GAAG;AAAA,MACnB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,aAA8B;AACvC,UAAM,cAAc,EAAE,GAAG,iBAAiB,GAAG,KAAK,OAAO,SAAS;AAClE,QAAI,CAAC,YAAY,WAAW,GAAG;AAC7B,aAAO;AAAA,IACT;AAGA,SAAK,OAAO,UAAU;AACtB,SAAK,aAAa,KAAK,QAAQ,YAAY,WAAW,CAAC;AACvD,SAAK,aAAa;AAClB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAwC;AACpD,SAAK,OAAO,QAAQ,UAAU;AAAA,MAC5B,GAAG,KAAK,OAAO,QAAQ;AAAA,MACvB,GAAG;AAAA,IACL;AACA,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAsC;AACrD,SAAK,OAAO,QAAQ,cAAc;AAAA,MAChC,GAAG,KAAK,OAAO,QAAQ;AAAA,MACvB,GAAG;AAAA,IACL;AACA,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAwB;AACtB,QAAI,KAAK,YAAa;AAEtB,QAAI,GAAG,WAAW,KAAK,UAAU,GAAG;AAClC,WAAK,cAAc,GAAG,MAAM,KAAK,YAAY,CAAC,cAAc;AAC1D,YAAI,cAAc,UAAU;AAC1B,gBAAM,YAAY,KAAK,WAAW;AAClC,gBAAM,aAAa,KAAK,SAAS;AAEjC,cAAI,WAAW,OAAO;AACpB,iBAAK,SAAS;AACd,iBAAK,aAAa;AAClB,oBAAQ,IAAI,wBAAwB;AAAA,UACtC,OAAO;AACL,oBAAQ;AAAA,cACN;AAAA,cACA,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAyB;AACvB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAM;AACvB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAqD;AAC5D,SAAK,kBAAkB,KAAK,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAC3B,UAAM,SAAS,KAAK,UAAU;AAC9B,SAAK,kBAAkB,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,MACA,mBAKQ;AACR,UAAM,YAAY,KAAK,OAAO,QAAQ,YAAY,IAAI,KAAK;AAC3D,UAAM,UAAU,KAAK,OAAO,QAAQ;AAEpC,QAAI,QAAQ,YAAY,QAAQ;AAEhC,QAAI,mBAAmB;AAErB,UAAI,kBAAkB,kBAAkB,QAAW;AACjD,cAAM,mBAAmB,KAAK;AAAA,UAC5B,kBAAkB,gBAAgB;AAAA,UAClC;AAAA,QACF;AACA,iBAAS,mBAAmB,QAAQ;AAAA,MACtC;AAGA,UAAI,kBAAkB,aAAa;AACjC,iBAAS,MAAM,QAAQ;AAAA,MACzB;AAGA,UAAI,kBAAkB,mBAAmB,QAAW;AAClD,cAAM,gBAAgB,KAAK;AAAA,UACzB,kBAAkB,iBAAiB;AAAA,UACnC;AAAA,QACF;AACA,iBAAS,gBAAgB,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAA6C;AAC3C,WAAO,EAAE,GAAG,iBAAiB,GAAG,KAAK,OAAO,SAAS;AAAA,EACvD;AACF;",
6
- "names": ["path"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/config/feature-flags.ts"],
4
- "sourcesContent": ["/**\n * Feature Flags Configuration\n * Controls which external integrations are enabled\n *\n * Set STACKMEMORY_LOCAL=true to run without any external services\n */\n\nexport interface FeatureFlags {\n // Core features (always available)\n core: true;\n\n // External integrations (can be disabled)\n linear: boolean;\n whatsapp: boolean;\n chromadb: boolean;\n aiSummaries: boolean;\n skills: boolean;\n ralph: boolean;\n greptile: boolean;\n}\n\n/**\n * Check if running in local-only mode\n * When true, all external service integrations are disabled\n */\nexport function isLocalOnly(): boolean {\n return (\n process.env['STACKMEMORY_LOCAL'] === 'true' ||\n process.env['STACKMEMORY_LOCAL'] === '1' ||\n process.env['LOCAL_ONLY'] === 'true'\n );\n}\n\n/**\n * Check if a specific feature is enabled\n */\nexport function isFeatureEnabled(feature: keyof FeatureFlags): boolean {\n if (feature === 'core') return true;\n\n // In local-only mode, external integrations are disabled\n if (isLocalOnly()) return false;\n\n // Check feature-specific env vars\n switch (feature) {\n case 'linear':\n return (\n process.env['STACKMEMORY_LINEAR'] !== 'false' &&\n (!!process.env['LINEAR_API_KEY'] || !!process.env['LINEAR_OAUTH_TOKEN'])\n );\n case 'whatsapp':\n return (\n process.env['STACKMEMORY_WHATSAPP'] !== 'false' &&\n !!process.env['TWILIO_ACCOUNT_SID']\n );\n case 'chromadb':\n return process.env['STACKMEMORY_CHROMADB'] === 'true';\n case 'aiSummaries':\n return (\n process.env['STACKMEMORY_AI'] !== 'false' &&\n (!!process.env['ANTHROPIC_API_KEY'] || !!process.env['OPENAI_API_KEY'])\n );\n case 'skills':\n // Skills enabled explicitly or when AI summaries available\n return (\n process.env['STACKMEMORY_SKILLS'] === 'true' ||\n process.env['STACKMEMORY_SKILLS'] === '1'\n );\n case 'ralph':\n // Ralph enabled by default in development (unless explicitly disabled)\n // For npm package users, must be explicitly enabled\n return process.env['STACKMEMORY_RALPH'] !== 'false';\n case 'greptile':\n // Greptile enabled when API key is available\n return (\n process.env['STACKMEMORY_GREPTILE'] !== 'false' &&\n !!process.env['GREPTILE_API_KEY']\n );\n default:\n return false;\n }\n}\n\n/**\n * Get all feature flags\n */\nexport function getFeatureFlags(): FeatureFlags {\n return {\n core: true,\n linear: isFeatureEnabled('linear'),\n whatsapp: isFeatureEnabled('whatsapp'),\n chromadb: isFeatureEnabled('chromadb'),\n aiSummaries: isFeatureEnabled('aiSummaries'),\n skills: isFeatureEnabled('skills'),\n ralph: isFeatureEnabled('ralph'),\n greptile: isFeatureEnabled('greptile'),\n };\n}\n\n/**\n * Log feature flags status (for debugging)\n */\nexport function logFeatureStatus(): void {\n const flags = getFeatureFlags();\n const local = isLocalOnly();\n\n console.log(\n `StackMemory Mode: ${local ? 'LOCAL (no external services)' : 'FULL'}`\n );\n if (!local) {\n console.log(\n ` Linear: ${flags.linear ? 'enabled' : 'disabled (no API key)'}`\n );\n console.log(\n ` WhatsApp: ${flags.whatsapp ? 'enabled' : 'disabled (no Twilio)'}`\n );\n console.log(` ChromaDB: ${flags.chromadb ? 'enabled' : 'disabled'}`);\n console.log(\n ` AI Summaries: ${flags.aiSummaries ? 'enabled' : 'disabled (no API key)'}`\n );\n console.log(\n ` Skills: ${flags.skills ? 'enabled' : 'disabled (set STACKMEMORY_SKILLS=true)'}`\n );\n console.log(\n ` Ralph: ${flags.ralph ? 'enabled' : 'disabled (set STACKMEMORY_RALPH=true)'}`\n );\n console.log(\n ` Greptile: ${flags.greptile ? 'enabled' : 'disabled (no GREPTILE_API_KEY)'}`\n );\n }\n}\n"],
5
- "mappings": ";;;;AAyBO,SAAS,cAAuB;AACrC,SACE,QAAQ,IAAI,mBAAmB,MAAM,UACrC,QAAQ,IAAI,mBAAmB,MAAM,OACrC,QAAQ,IAAI,YAAY,MAAM;AAElC;AAKO,SAAS,iBAAiB,SAAsC;AACrE,MAAI,YAAY,OAAQ,QAAO;AAG/B,MAAI,YAAY,EAAG,QAAO;AAG1B,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aACE,QAAQ,IAAI,oBAAoB,MAAM,YACrC,CAAC,CAAC,QAAQ,IAAI,gBAAgB,KAAK,CAAC,CAAC,QAAQ,IAAI,oBAAoB;AAAA,IAE1E,KAAK;AACH,aACE,QAAQ,IAAI,sBAAsB,MAAM,WACxC,CAAC,CAAC,QAAQ,IAAI,oBAAoB;AAAA,IAEtC,KAAK;AACH,aAAO,QAAQ,IAAI,sBAAsB,MAAM;AAAA,IACjD,KAAK;AACH,aACE,QAAQ,IAAI,gBAAgB,MAAM,YACjC,CAAC,CAAC,QAAQ,IAAI,mBAAmB,KAAK,CAAC,CAAC,QAAQ,IAAI,gBAAgB;AAAA,IAEzE,KAAK;AAEH,aACE,QAAQ,IAAI,oBAAoB,MAAM,UACtC,QAAQ,IAAI,oBAAoB,MAAM;AAAA,IAE1C,KAAK;AAGH,aAAO,QAAQ,IAAI,mBAAmB,MAAM;AAAA,IAC9C,KAAK;AAEH,aACE,QAAQ,IAAI,sBAAsB,MAAM,WACxC,CAAC,CAAC,QAAQ,IAAI,kBAAkB;AAAA,IAEpC;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,kBAAgC;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,iBAAiB,QAAQ;AAAA,IACjC,UAAU,iBAAiB,UAAU;AAAA,IACrC,UAAU,iBAAiB,UAAU;AAAA,IACrC,aAAa,iBAAiB,aAAa;AAAA,IAC3C,QAAQ,iBAAiB,QAAQ;AAAA,IACjC,OAAO,iBAAiB,OAAO;AAAA,IAC/B,UAAU,iBAAiB,UAAU;AAAA,EACvC;AACF;AAKO,SAAS,mBAAyB;AACvC,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,QAAQ,YAAY;AAE1B,UAAQ;AAAA,IACN,qBAAqB,QAAQ,iCAAiC,MAAM;AAAA,EACtE;AACA,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN,aAAa,MAAM,SAAS,YAAY,uBAAuB;AAAA,IACjE;AACA,YAAQ;AAAA,MACN,eAAe,MAAM,WAAW,YAAY,sBAAsB;AAAA,IACpE;AACA,YAAQ,IAAI,eAAe,MAAM,WAAW,YAAY,UAAU,EAAE;AACpE,YAAQ;AAAA,MACN,mBAAmB,MAAM,cAAc,YAAY,uBAAuB;AAAA,IAC5E;AACA,YAAQ;AAAA,MACN,aAAa,MAAM,SAAS,YAAY,wCAAwC;AAAA,IAClF;AACA,YAAQ;AAAA,MACN,YAAY,MAAM,QAAQ,YAAY,uCAAuC;AAAA,IAC/E;AACA,YAAQ;AAAA,MACN,eAAe,MAAM,WAAW,YAAY,gCAAgC;AAAA,IAC9E;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/config/storage-config.ts"],
4
- "sourcesContent": ["/**\n * Storage Configuration for StackMemory\n * Handles storage mode detection and ChromaDB configuration\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport type StorageMode = 'sqlite' | 'hybrid';\n\nexport interface ChromaDBConfig {\n enabled: boolean;\n apiKey?: string;\n apiUrl?: string;\n tenant?: string;\n database?: string;\n}\n\nexport interface StorageConfig {\n mode: StorageMode;\n chromadb: ChromaDBConfig;\n}\n\nconst DEFAULT_STORAGE_CONFIG: StorageConfig = {\n mode: 'sqlite',\n chromadb: {\n enabled: false,\n },\n};\n\nconst STACKMEMORY_DIR = join(homedir(), '.stackmemory');\nconst CONFIG_FILE = join(STACKMEMORY_DIR, 'storage-config.json');\n\n/**\n * Load storage configuration from disk\n */\nexport function loadStorageConfig(): StorageConfig {\n try {\n if (existsSync(CONFIG_FILE)) {\n const content = readFileSync(CONFIG_FILE, 'utf-8');\n const config = JSON.parse(content) as Partial<StorageConfig>;\n return {\n mode: config.mode || DEFAULT_STORAGE_CONFIG.mode,\n chromadb: {\n ...DEFAULT_STORAGE_CONFIG.chromadb,\n ...config.chromadb,\n },\n };\n }\n } catch (error) {\n console.warn('Failed to load storage config, using defaults:', error);\n }\n return DEFAULT_STORAGE_CONFIG;\n}\n\n/**\n * Save storage configuration to disk\n */\nexport function saveStorageConfig(config: StorageConfig): void {\n try {\n if (!existsSync(STACKMEMORY_DIR)) {\n mkdirSync(STACKMEMORY_DIR, { recursive: true });\n }\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');\n } catch (error) {\n console.error('Failed to save storage config:', error);\n throw error;\n }\n}\n\n/**\n * Check if ChromaDB is enabled and properly configured\n */\nexport function isChromaDBEnabled(): boolean {\n const config = loadStorageConfig();\n\n if (!config.chromadb.enabled) {\n return false;\n }\n\n // ChromaDB requires an API key to be configured\n const apiKey = config.chromadb.apiKey || process.env['CHROMADB_API_KEY'];\n if (!apiKey) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Get the current storage mode\n * Returns 'sqlite' for local-only storage\n * Returns 'hybrid' when ChromaDB is enabled (SQLite + ChromaDB)\n */\nexport function getStorageMode(): StorageMode {\n const config = loadStorageConfig();\n\n // Verify ChromaDB is actually usable before returning hybrid\n if (config.mode === 'hybrid' && !isChromaDBEnabled()) {\n return 'sqlite';\n }\n\n return config.mode;\n}\n\n/**\n * Get ChromaDB configuration (for use when initializing ChromaDB adapter)\n */\nexport function getChromaDBConfig(): ChromaDBConfig | null {\n if (!isChromaDBEnabled()) {\n return null;\n }\n\n const config = loadStorageConfig();\n const apiKey = config.chromadb.apiKey || process.env['CHROMADB_API_KEY'];\n const apiUrl =\n config.chromadb.apiUrl ||\n process.env['CHROMADB_API_URL'] ||\n 'https://api.trychroma.com';\n\n return {\n enabled: true,\n apiKey,\n apiUrl,\n tenant:\n config.chromadb.tenant ||\n process.env['CHROMADB_TENANT'] ||\n 'default_tenant',\n database:\n config.chromadb.database ||\n process.env['CHROMADB_DATABASE'] ||\n 'default_database',\n };\n}\n\n/**\n * Enable ChromaDB with the given configuration\n */\nexport function enableChromaDB(chromaConfig: {\n apiKey: string;\n apiUrl?: string;\n tenant?: string;\n database?: string;\n}): void {\n const config = loadStorageConfig();\n config.mode = 'hybrid';\n config.chromadb = {\n enabled: true,\n apiKey: chromaConfig.apiKey,\n apiUrl: chromaConfig.apiUrl || 'https://api.trychroma.com',\n tenant: chromaConfig.tenant || 'default_tenant',\n database: chromaConfig.database || 'default_database',\n };\n saveStorageConfig(config);\n}\n\n/**\n * Disable ChromaDB and use SQLite-only mode\n */\nexport function disableChromaDB(): void {\n const config = loadStorageConfig();\n config.mode = 'sqlite';\n config.chromadb = {\n enabled: false,\n };\n saveStorageConfig(config);\n}\n\n/**\n * Get a human-readable description of the current storage mode\n */\nexport function getStorageModeDescription(): string {\n const mode = getStorageMode();\n if (mode === 'hybrid') {\n return 'Hybrid (SQLite + ChromaDB for semantic search and cloud backup)';\n }\n return 'SQLite (local storage only, fast, no external dependencies)';\n}\n"],
5
- "mappings": ";;;;AAKA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AAiBxB,MAAM,yBAAwC;AAAA,EAC5C,MAAM;AAAA,EACN,UAAU;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAEA,MAAM,kBAAkB,KAAK,QAAQ,GAAG,cAAc;AACtD,MAAM,cAAc,KAAK,iBAAiB,qBAAqB;AAKxD,SAAS,oBAAmC;AACjD,MAAI;AACF,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,UAAU,aAAa,aAAa,OAAO;AACjD,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,aAAO;AAAA,QACL,MAAM,OAAO,QAAQ,uBAAuB;AAAA,QAC5C,UAAU;AAAA,UACR,GAAG,uBAAuB;AAAA,UAC1B,GAAG,OAAO;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,KAAK,kDAAkD,KAAK;AAAA,EACtE;AACA,SAAO;AACT;AAKO,SAAS,kBAAkB,QAA6B;AAC7D,MAAI;AACF,QAAI,CAAC,WAAW,eAAe,GAAG;AAChC,gBAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAAA,IAChD;AACA,kBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,EACrE,SAAS,OAAO;AACd,YAAQ,MAAM,kCAAkC,KAAK;AACrD,UAAM;AAAA,EACR;AACF;AAKO,SAAS,oBAA6B;AAC3C,QAAM,SAAS,kBAAkB;AAEjC,MAAI,CAAC,OAAO,SAAS,SAAS;AAC5B,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,OAAO,SAAS,UAAU,QAAQ,IAAI,kBAAkB;AACvE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAOO,SAAS,iBAA8B;AAC5C,QAAM,SAAS,kBAAkB;AAGjC,MAAI,OAAO,SAAS,YAAY,CAAC,kBAAkB,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,SAAO,OAAO;AAChB;AAKO,SAAS,oBAA2C;AACzD,MAAI,CAAC,kBAAkB,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,kBAAkB;AACjC,QAAM,SAAS,OAAO,SAAS,UAAU,QAAQ,IAAI,kBAAkB;AACvE,QAAM,SACJ,OAAO,SAAS,UAChB,QAAQ,IAAI,kBAAkB,KAC9B;AAEF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,QACE,OAAO,SAAS,UAChB,QAAQ,IAAI,iBAAiB,KAC7B;AAAA,IACF,UACE,OAAO,SAAS,YAChB,QAAQ,IAAI,mBAAmB,KAC/B;AAAA,EACJ;AACF;AAKO,SAAS,eAAe,cAKtB;AACP,QAAM,SAAS,kBAAkB;AACjC,SAAO,OAAO;AACd,SAAO,WAAW;AAAA,IAChB,SAAS;AAAA,IACT,QAAQ,aAAa;AAAA,IACrB,QAAQ,aAAa,UAAU;AAAA,IAC/B,QAAQ,aAAa,UAAU;AAAA,IAC/B,UAAU,aAAa,YAAY;AAAA,EACrC;AACA,oBAAkB,MAAM;AAC1B;AAKO,SAAS,kBAAwB;AACtC,QAAM,SAAS,kBAAkB;AACjC,SAAO,OAAO;AACd,SAAO,WAAW;AAAA,IAChB,SAAS;AAAA,EACX;AACA,oBAAkB,MAAM;AAC1B;AAKO,SAAS,4BAAoC;AAClD,QAAM,OAAO,eAAe;AAC5B,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/config/types.ts"],
4
- "sourcesContent": ["/**\n * Configuration types for StackMemory\n */\n\nexport interface ScoringWeights {\n base: number;\n impact: number;\n persistence: number;\n reference: number;\n}\n\nexport interface ToolScores {\n search?: number;\n grep?: number;\n edit?: number;\n write?: number;\n read?: number;\n bash?: number;\n test?: number;\n task_creation?: number;\n decision_recording?: number;\n context_retrieval?: number;\n [key: string]: number | undefined; // Allow custom tools\n}\n\nexport interface RetentionConfig {\n local: {\n young: string; // e.g., \"1d\"\n mature: string; // e.g., \"7d\"\n old: string; // e.g., \"30d\"\n max_size: string; // e.g., \"2GB\"\n };\n remote: {\n enabled: boolean;\n endpoint?: string;\n retention: string; // e.g., \"infinite\"\n };\n generational_gc: {\n young_strategy: 'keep_all' | 'digest_only' | 'anchors_only';\n mature_strategy: 'keep_all' | 'digest_only' | 'anchors_only';\n old_strategy: 'keep_all' | 'digest_only' | 'anchors_only';\n };\n}\n\nexport interface PerformanceConfig {\n max_stack_depth: number;\n max_frame_events: number;\n retrieval_timeout_ms: number;\n batch_upload_size: number;\n}\n\nexport interface ProfileConfig {\n name: string;\n description?: string;\n scoring?: Partial<{\n weights: Partial<ScoringWeights>;\n tool_scores: Partial<ToolScores>;\n }>;\n retention?: Partial<RetentionConfig>;\n performance?: Partial<PerformanceConfig>;\n}\n\nexport interface StackMemoryConfig {\n version: string;\n profile?: string; // Active profile name\n scoring: {\n weights: ScoringWeights;\n tool_scores: ToolScores;\n };\n retention: RetentionConfig;\n performance: PerformanceConfig;\n profiles?: Record<string, ProfileConfig>;\n}\n\nexport const DEFAULT_WEIGHTS: ScoringWeights = {\n base: 0.4,\n impact: 0.3,\n persistence: 0.2,\n reference: 0.1,\n};\n\nexport const DEFAULT_TOOL_SCORES: ToolScores = {\n search: 0.95,\n task_creation: 0.9,\n decision_recording: 0.9,\n context_retrieval: 0.85,\n write: 0.75,\n edit: 0.5,\n test: 0.45,\n bash: 0.4,\n read: 0.25,\n grep: 0.15,\n};\n\nexport const PRESET_PROFILES: Record<string, ProfileConfig> = {\n default: {\n name: 'default',\n description: 'Balanced configuration for general use',\n scoring: {\n weights: DEFAULT_WEIGHTS,\n tool_scores: DEFAULT_TOOL_SCORES,\n },\n },\n 'security-focused': {\n name: 'security-focused',\n description: 'Prioritizes security decisions and audit trails',\n scoring: {\n weights: {\n base: 0.2,\n impact: 0.5,\n persistence: 0.2,\n reference: 0.1,\n },\n tool_scores: {\n decision_recording: 0.95,\n bash: 0.8, // Security-critical commands\n test: 0.7, // Security tests important\n },\n },\n retention: {\n local: {\n young: '7d',\n mature: '30d',\n old: '90d', // Keep security decisions longer\n max_size: '100MB',\n },\n },\n },\n 'exploration-heavy': {\n name: 'exploration-heavy',\n description: 'Optimized for codebase exploration and learning',\n scoring: {\n weights: {\n base: 0.3,\n impact: 0.1,\n persistence: 0.1,\n reference: 0.5, // Discovery paths matter most\n },\n tool_scores: {\n search: 0.99,\n grep: 0.3, // Grep more valuable during exploration\n read: 0.4,\n },\n },\n performance: {\n retrieval_timeout_ms: 1000, // Allow deeper searches\n },\n },\n 'production-system': {\n name: 'production-system',\n description: 'For production environments with stability focus',\n scoring: {\n weights: {\n base: 0.2,\n impact: 0.4,\n persistence: 0.3, // Permanent changes critical\n reference: 0.1,\n },\n tool_scores: {\n write: 0.9, // File changes very important\n edit: 0.85,\n test: 0.8, // Testing critical\n bash: 0.7, // Deploy commands\n },\n },\n },\n};\n\nexport const DEFAULT_CONFIG: StackMemoryConfig = {\n version: '1.0',\n scoring: {\n weights: DEFAULT_WEIGHTS,\n tool_scores: DEFAULT_TOOL_SCORES,\n },\n retention: {\n local: {\n young: '1d',\n mature: '7d',\n old: '30d',\n max_size: '2GB',\n },\n remote: {\n enabled: true,\n endpoint: 'api.stackmemory.io',\n retention: 'infinite',\n },\n generational_gc: {\n young_strategy: 'keep_all',\n mature_strategy: 'digest_only',\n old_strategy: 'anchors_only',\n },\n },\n performance: {\n max_stack_depth: 10000,\n max_frame_events: 5000,\n retrieval_timeout_ms: 500,\n batch_upload_size: 100,\n },\n profiles: PRESET_PROFILES,\n};\n"],
5
- "mappings": ";;;;AA0EO,MAAM,kBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AACb;AAEO,MAAM,sBAAkC;AAAA,EAC7C,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,MAAM,kBAAiD;AAAA,EAC5D,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,MACA,aAAa;AAAA,QACX,oBAAoB;AAAA,QACpB,MAAM;AAAA;AAAA,QACN,MAAM;AAAA;AAAA,MACR;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,KAAK;AAAA;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,WAAW;AAAA;AAAA,MACb;AAAA,MACA,aAAa;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX,sBAAsB;AAAA;AAAA,IACxB;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,aAAa;AAAA;AAAA,QACb,WAAW;AAAA,MACb;AAAA,MACA,aAAa;AAAA,QACX,OAAO;AAAA;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA;AAAA,QACN,MAAM;AAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,iBAAoC;AAAA,EAC/C,SAAS;AAAA,EACT,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,EACrB;AAAA,EACA,UAAU;AACZ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/context/auto-context.ts"],
4
- "sourcesContent": ["/**\n * Auto-context management\n * Automatically creates and manages context frames\n */\n\nimport { FrameManager } from './index.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport class AutoContext {\n private frameManager: FrameManager;\n\n constructor(frameManager: FrameManager) {\n this.frameManager = frameManager;\n }\n\n /**\n * Initialize a session context\n */\n initializeSession(command?: string): void {\n try {\n // Create a root session frame\n const sessionFrame = this.frameManager.createFrame({\n type: 'task',\n name: 'Session',\n inputs: {\n command,\n timestamp: new Date().toISOString(),\n cwd: process.cwd(),\n },\n });\n\n logger.info('Session context initialized', {\n frameId: sessionFrame,\n depth: this.frameManager.getStackDepth(),\n });\n } catch (error: unknown) {\n logger.error('Failed to initialize session context', error as Error);\n }\n }\n\n /**\n * Create a command context\n */\n createCommandContext(command: string, args?: any): string | null {\n try {\n const frameId = this.frameManager.createFrame({\n type: 'tool_scope',\n name: command,\n inputs: args,\n });\n\n logger.info('Command context created', {\n frameId,\n command,\n depth: this.frameManager.getStackDepth(),\n });\n\n return frameId;\n } catch (error: unknown) {\n logger.error('Failed to create command context', error as Error);\n return null;\n }\n }\n\n /**\n * Auto-save important context\n */\n autoSaveContext(data: any, importance: number = 5): void {\n try {\n const currentFrame = this.frameManager.getCurrentFrameId();\n if (currentFrame) {\n this.frameManager.addEvent(\n 'observation',\n {\n type: 'context_save',\n data,\n importance,\n timestamp: new Date().toISOString(),\n },\n currentFrame\n );\n }\n } catch (error: unknown) {\n logger.error('Failed to auto-save context', error as Error);\n }\n }\n}\n"],
5
- "mappings": ";;;;AAMA,SAAS,cAAc;AAEhB,MAAM,YAAY;AAAA,EACf;AAAA,EAER,YAAY,cAA4B;AACtC,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAwB;AACxC,QAAI;AAEF,YAAM,eAAe,KAAK,aAAa,YAAY;AAAA,QACjD,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,KAAK,QAAQ,IAAI;AAAA,QACnB;AAAA,MACF,CAAC;AAED,aAAO,KAAK,+BAA+B;AAAA,QACzC,SAAS;AAAA,QACT,OAAO,KAAK,aAAa,cAAc;AAAA,MACzC,CAAC;AAAA,IACH,SAAS,OAAgB;AACvB,aAAO,MAAM,wCAAwC,KAAc;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,SAAiB,MAA2B;AAC/D,QAAI;AACF,YAAM,UAAU,KAAK,aAAa,YAAY;AAAA,QAC5C,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAED,aAAO,KAAK,2BAA2B;AAAA,QACrC;AAAA,QACA;AAAA,QACA,OAAO,KAAK,aAAa,cAAc;AAAA,MACzC,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,aAAO,MAAM,oCAAoC,KAAc;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAW,aAAqB,GAAS;AACvD,QAAI;AACF,YAAM,eAAe,KAAK,aAAa,kBAAkB;AACzD,UAAI,cAAc;AAChB,aAAK,aAAa;AAAA,UAChB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,MAAM,+BAA+B,KAAc;AAAA,IAC5D;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/context/dual-stack-manager.ts"],
4
- "sourcesContent": ["/**\n * Dual Stack Manager - STA-99\n * Manages both individual and shared team stacks for collaboration\n */\n\nimport type { Frame, Event, Anchor } from './frame-types.js';\nimport { FrameManager } from './index.js';\nimport type { DatabaseAdapter } from '../database/database-adapter.js';\nimport { SQLiteAdapter } from '../database/sqlite-adapter.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, DatabaseError, ErrorCode } from '../errors/index.js';\nimport {\n validateInput,\n CreateSharedStackSchema,\n SwitchStackSchema,\n type CreateSharedStackInput,\n type SwitchStackInput,\n} from './validation.js';\nimport { PermissionManager } from './permission-manager.js';\n\nexport interface StackContext {\n stackId: string;\n type: 'individual' | 'shared';\n projectId: string;\n ownerId?: string; // For individual stacks\n teamId?: string; // For shared stacks\n permissions: StackPermissions;\n metadata: Record<string, any>;\n createdAt: Date;\n lastActive: Date;\n}\n\nexport interface StackPermissions {\n canRead: boolean;\n canWrite: boolean;\n canHandoff: boolean;\n canMerge: boolean;\n canAdminister: boolean;\n}\n\nexport interface HandoffRequest {\n requestId: string;\n sourceStackId: string;\n targetStackId: string;\n frameIds: string[];\n requesterId: string;\n targetUserId?: string;\n message?: string;\n status: 'pending' | 'accepted' | 'rejected' | 'expired';\n createdAt: Date;\n expiresAt: Date;\n}\n\nexport interface StackSyncResult {\n success: boolean;\n conflictFrames: string[];\n mergedFrames: string[];\n errors: Array<{\n frameId: string;\n error: string;\n resolution?: 'skipped' | 'merged' | 'manual';\n }>;\n}\n\nexport class DualStackManager {\n private adapter: DatabaseAdapter;\n private individualStack: FrameManager;\n private sharedStacks: Map<string, FrameManager> = new Map();\n private activeContext: StackContext;\n private handoffRequests: Map<string, HandoffRequest> = new Map();\n private permissionManager: PermissionManager;\n\n constructor(\n adapter: DatabaseAdapter,\n projectId: string,\n userId: string,\n defaultTeamId?: string\n ) {\n this.adapter = adapter;\n this.permissionManager = new PermissionManager();\n\n // Initialize individual stack\n // Extract raw database for FrameManager which expects SQLite directly\n const rawDb =\n adapter instanceof SQLiteAdapter ? adapter.getRawDatabase() : null;\n if (!rawDb) {\n throw new DatabaseError(\n 'DualStackManager requires SQLiteAdapter with connected database',\n ErrorCode.DB_CONNECTION_FAILED,\n { adapter: adapter.constructor.name }\n );\n }\n\n this.individualStack = new FrameManager(rawDb, projectId, userId);\n\n // Set default active context to individual stack\n this.activeContext = {\n stackId: `individual-${userId}`,\n type: 'individual',\n projectId,\n ownerId: userId,\n permissions: this.getDefaultIndividualPermissions(),\n metadata: {},\n createdAt: new Date(),\n lastActive: new Date(),\n };\n\n // Set up initial permissions for the user's individual stack\n this.permissionManager.setStackPermissions(\n userId,\n `individual-${userId}`,\n this.getDefaultIndividualPermissions()\n );\n\n this.initializeSchema();\n }\n\n private async initializeSchema(): Promise<void> {\n try {\n // Create stack_contexts table\n await this.adapter.beginTransaction();\n\n const createStackContextsTable = `\n CREATE TABLE IF NOT EXISTS stack_contexts (\n stack_id TEXT PRIMARY KEY,\n type TEXT NOT NULL CHECK (type IN ('individual', 'shared')),\n project_id TEXT NOT NULL,\n owner_id TEXT,\n team_id TEXT,\n permissions TEXT NOT NULL,\n metadata TEXT DEFAULT '{}',\n created_at INTEGER NOT NULL,\n last_active INTEGER NOT NULL,\n CONSTRAINT valid_ownership CHECK (\n (type = 'individual' AND owner_id IS NOT NULL AND team_id IS NULL) OR\n (type = 'shared' AND team_id IS NOT NULL)\n )\n )\n `;\n\n const createHandoffRequestsTable = `\n CREATE TABLE IF NOT EXISTS handoff_requests (\n request_id TEXT PRIMARY KEY,\n source_stack_id TEXT NOT NULL,\n target_stack_id TEXT NOT NULL,\n frame_ids TEXT NOT NULL,\n requester_id TEXT NOT NULL,\n target_user_id TEXT,\n message TEXT,\n status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'rejected', 'expired')),\n created_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n FOREIGN KEY (source_stack_id) REFERENCES stack_contexts(stack_id),\n FOREIGN KEY (target_stack_id) REFERENCES stack_contexts(stack_id)\n )\n `;\n\n const createStackSyncLogTable = `\n CREATE TABLE IF NOT EXISTS stack_sync_log (\n sync_id TEXT PRIMARY KEY,\n source_stack_id TEXT NOT NULL,\n target_stack_id TEXT NOT NULL,\n operation TEXT NOT NULL CHECK (operation IN ('handoff', 'merge', 'sync')),\n frame_count INTEGER NOT NULL,\n conflicts TEXT DEFAULT '[]',\n resolution TEXT,\n timestamp INTEGER NOT NULL,\n FOREIGN KEY (source_stack_id) REFERENCES stack_contexts(stack_id),\n FOREIGN KEY (target_stack_id) REFERENCES stack_contexts(stack_id)\n )\n `;\n\n // Execute schema creation using raw SQL\n if (this.adapter.isConnected()) {\n // Note: This is a temporary workaround - proper schema creation would use adapter methods\n (await (this.adapter as any).execute?.(createStackContextsTable)) ||\n this.executeSchemaQuery(createStackContextsTable);\n (await (this.adapter as any).execute?.(createHandoffRequestsTable)) ||\n this.executeSchemaQuery(createHandoffRequestsTable);\n (await (this.adapter as any).execute?.(createStackSyncLogTable)) ||\n this.executeSchemaQuery(createStackSyncLogTable);\n }\n\n await this.adapter.commitTransaction();\n\n logger.info('Dual stack schema initialized successfully');\n } catch (error: unknown) {\n await this.adapter.rollbackTransaction();\n logger.error('Failed to initialize dual stack schema', error);\n throw new DatabaseError(\n 'Schema initialization failed',\n ErrorCode.DB_SCHEMA_ERROR,\n { adapter: this.adapter.constructor.name },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async executeSchemaQuery(sql: string): Promise<void> {\n // Fallback for adapters that don't have execute method\n logger.debug(\n 'Using fallback schema creation - implement execute method in adapter'\n );\n\n // Execute using raw SQLite database\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n try {\n rawDb.exec(sql);\n logger.debug('Executed schema query successfully');\n } catch (error: unknown) {\n logger.error('Failed to execute schema query', { sql, error });\n throw error;\n }\n } else {\n throw new DatabaseError(\n 'Cannot execute schema query: raw database not available',\n ErrorCode.DB_CONNECTION_FAILED,\n { operation: 'executeSchemaQuery' }\n );\n }\n }\n\n private getDefaultIndividualPermissions(): StackPermissions {\n return {\n canRead: true,\n canWrite: true,\n canHandoff: true,\n canMerge: true,\n canAdminister: true,\n };\n }\n\n private getSharedStackPermissions(\n role: 'member' | 'lead' | 'admin'\n ): StackPermissions {\n const basePermissions = {\n canRead: true,\n canWrite: true,\n canHandoff: true,\n canMerge: false,\n canAdminister: false,\n };\n\n switch (role) {\n case 'lead':\n return { ...basePermissions, canMerge: true };\n case 'admin':\n return { ...basePermissions, canMerge: true, canAdminister: true };\n default:\n return basePermissions;\n }\n }\n\n /**\n * Switch between individual and shared stacks\n */\n async switchToStack(stackId: string): Promise<void> {\n // Validate input\n const input = validateInput(SwitchStackSchema, { stackId });\n\n try {\n if (input.stackId.startsWith('individual-')) {\n this.activeContext = {\n ...this.activeContext,\n stackId: input.stackId,\n type: 'individual',\n };\n return;\n }\n\n // Load shared stack context\n const stackContext = await this.loadStackContext(input.stackId);\n if (!stackContext) {\n throw new ValidationError(\n `Stack context not found: ${input.stackId}`,\n ErrorCode.STACK_CONTEXT_NOT_FOUND\n );\n }\n\n // Check permission to access the stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n this.activeContext.ownerId || 'unknown',\n 'read',\n 'stack',\n input.stackId,\n stackContext\n )\n );\n\n this.activeContext = stackContext;\n\n // Initialize shared stack manager if not already loaded\n if (!this.sharedStacks.has(input.stackId)) {\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n throw new DatabaseError(\n 'Failed to get raw database for shared stack',\n ErrorCode.DB_CONNECTION_FAILED,\n { stackId: input.stackId, operation: 'switchToStack' }\n );\n }\n\n const sharedStack = new FrameManager(\n rawDb,\n stackContext.projectId,\n input.stackId\n );\n this.sharedStacks.set(input.stackId, sharedStack);\n }\n\n // Update last active timestamp\n await this.updateStackActivity(input.stackId);\n\n logger.info(`Switched to stack: ${input.stackId}`, {\n type: stackContext.type,\n });\n } catch (error: unknown) {\n throw new ValidationError(\n `Failed to switch to stack: ${input.stackId}`,\n ErrorCode.OPERATION_FAILED,\n { stackId: input.stackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get the current active stack manager\n */\n getActiveStack(): FrameManager {\n if (this.activeContext.type === 'individual') {\n return this.individualStack;\n }\n\n const sharedStack = this.sharedStacks.get(this.activeContext.stackId);\n if (!sharedStack) {\n throw new DatabaseError(\n `Active shared stack not initialized: ${this.activeContext.stackId}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n return sharedStack;\n }\n\n /**\n * Create a new shared stack for team collaboration\n */\n async createSharedStack(\n teamId: string,\n name: string,\n ownerId: string,\n permissions?: StackPermissions\n ): Promise<string> {\n // Validate input parameters\n const input = validateInput(CreateSharedStackSchema, {\n teamId,\n name,\n ownerId,\n permissions,\n });\n\n // Check permission to create shared stacks\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n input.ownerId,\n 'administer',\n 'stack',\n `shared-${input.teamId}`,\n this.activeContext\n )\n );\n\n const stackId = `shared-${input.teamId}-${Date.now()}`;\n\n const stackContext: StackContext = {\n stackId,\n type: 'shared',\n projectId: this.activeContext.projectId,\n teamId: input.teamId,\n permissions: input.permissions || this.getSharedStackPermissions('admin'),\n metadata: { name: input.name, ownerId: input.ownerId },\n createdAt: new Date(),\n lastActive: new Date(),\n };\n\n try {\n await this.saveStackContext(stackContext);\n\n // Initialize the shared stack manager\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n throw new DatabaseError(\n 'Failed to get raw database for new shared stack',\n ErrorCode.DB_CONNECTION_FAILED,\n { teamId, operation: 'createSharedStack' }\n );\n }\n\n const sharedStack = new FrameManager(\n rawDb,\n stackContext.projectId,\n stackId\n );\n this.sharedStacks.set(stackId, sharedStack);\n\n // Set up permissions for the owner and team\n const stackPermissions = stackContext.permissions;\n this.permissionManager.setStackPermissions(\n input.ownerId,\n stackId,\n stackPermissions\n );\n\n logger.info(`Created shared stack: ${stackId}`, { teamId, name });\n return stackId;\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to create shared stack`,\n ErrorCode.OPERATION_FAILED,\n { teamId, name },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Initiate handoff of frames between stacks\n */\n async initiateHandoff(\n targetStackId: string,\n frameIds: string[],\n targetUserId?: string,\n message?: string\n ): Promise<string> {\n // Check permission to perform handoff from current stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n this.activeContext.ownerId || 'unknown',\n 'handoff',\n 'stack',\n this.activeContext.stackId,\n this.activeContext\n )\n );\n\n const requestId = `handoff-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const request: HandoffRequest = {\n requestId,\n sourceStackId: this.activeContext.stackId,\n targetStackId,\n frameIds,\n requesterId: this.activeContext.ownerId!,\n targetUserId,\n message,\n status: 'pending',\n createdAt: new Date(),\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours\n };\n\n try {\n await this.saveHandoffRequest(request);\n this.handoffRequests.set(requestId, request);\n\n logger.info(`Initiated handoff request: ${requestId}`, {\n sourceStack: this.activeContext.stackId,\n targetStack: targetStackId,\n frameCount: frameIds.length,\n });\n\n return requestId;\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to initiate handoff`,\n ErrorCode.OPERATION_FAILED,\n { targetStackId, frameIds },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Accept a handoff request and move frames\n */\n async acceptHandoff(requestId: string): Promise<StackSyncResult> {\n logger.debug('acceptHandoff called', { requestId });\n const request = await this.loadHandoffRequest(requestId);\n logger.debug('loadHandoffRequest returned', {\n requestId,\n found: !!request,\n });\n if (!request) {\n logger.error('Handoff request not found', {\n requestId,\n availableRequests: Array.from(this.handoffRequests.keys()),\n });\n throw new DatabaseError(\n `Handoff request not found: ${requestId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n if (request.status !== 'pending') {\n throw new DatabaseError(\n `Handoff request is not pending: ${request.status}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n if (request.expiresAt < new Date()) {\n throw new DatabaseError(\n `Handoff request has expired`,\n ErrorCode.OPERATION_EXPIRED\n );\n }\n\n try {\n // Perform the handoff operation\n logger.debug('Starting moveFramesBetweenStacks', { requestId });\n const syncResult = await this.moveFramesBetweenStacks(\n request.sourceStackId,\n request.targetStackId,\n request.frameIds\n );\n logger.debug('moveFramesBetweenStacks completed', {\n requestId,\n success: syncResult.success,\n });\n\n // Update request status\n logger.debug('Updating request status', { requestId });\n request.status = 'accepted';\n logger.debug('Calling saveHandoffRequest', { requestId });\n await this.saveHandoffRequest(request);\n logger.debug('saveHandoffRequest completed', { requestId });\n\n logger.info(`Accepted handoff request: ${requestId}`, {\n frameCount: request.frameIds.length,\n conflicts: syncResult.conflictFrames.length,\n });\n\n return syncResult;\n } catch (error: unknown) {\n logger.error('acceptHandoff caught error', {\n error: error instanceof Error ? error.message : error,\n });\n // Update request status to rejected on failure\n request.status = 'rejected';\n await this.saveHandoffRequest(request);\n\n throw new DatabaseError(\n `Failed to accept handoff`,\n ErrorCode.OPERATION_FAILED,\n { requestId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Sync frames between individual and shared stacks\n */\n async syncStacks(\n sourceStackId: string,\n targetStackId: string,\n options: {\n frameIds?: string[];\n conflictResolution: 'skip' | 'merge' | 'overwrite';\n dryRun?: boolean;\n }\n ): Promise<StackSyncResult> {\n try {\n const sourceStack = this.getStackManager(sourceStackId);\n const targetStack = this.getStackManager(targetStackId);\n\n // Get frames to sync\n const framesToSync =\n options.frameIds ||\n (await sourceStack.getActiveFrames()).map((f) => f.frame_id);\n\n const result: StackSyncResult = {\n success: true,\n conflictFrames: [],\n mergedFrames: [],\n errors: [],\n };\n\n for (const frameId of framesToSync) {\n try {\n const sourceFrame = await sourceStack.getFrame(frameId);\n if (!sourceFrame) {\n result.errors.push({\n frameId,\n error: 'Source frame not found',\n resolution: 'skipped',\n });\n continue;\n }\n\n const existingFrame = await targetStack.getFrame(frameId);\n\n if (existingFrame) {\n // Handle conflict\n switch (options.conflictResolution) {\n case 'skip':\n result.conflictFrames.push(frameId);\n result.errors.push({\n frameId,\n error: 'Frame already exists',\n resolution: 'skipped',\n });\n continue;\n\n case 'merge':\n if (!options.dryRun) {\n await this.mergeFrames(\n existingFrame,\n sourceFrame,\n targetStack\n );\n }\n result.mergedFrames.push(frameId);\n break;\n\n case 'overwrite':\n if (!options.dryRun) {\n await targetStack.deleteFrame(frameId);\n await this.copyFrame(sourceFrame, targetStack);\n }\n result.mergedFrames.push(frameId);\n break;\n }\n } else {\n // Copy frame to target\n if (!options.dryRun) {\n await this.copyFrame(sourceFrame, targetStack);\n }\n result.mergedFrames.push(frameId);\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(`Stack sync completed`, {\n source: sourceStackId,\n target: targetStackId,\n merged: 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 `Stack sync failed`,\n ErrorCode.OPERATION_FAILED,\n { sourceStackId, targetStackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n getStackManager(stackId: string): FrameManager {\n logger.debug('getStackManager called', {\n stackId,\n availableStacks: Array.from(this.sharedStacks.keys()),\n });\n\n if (stackId.startsWith('individual-')) {\n logger.debug('Returning individual stack', { stackId });\n return this.individualStack;\n }\n\n const sharedStack = this.sharedStacks.get(stackId);\n if (!sharedStack) {\n logger.error('Stack manager not found', {\n stackId,\n availableSharedStacks: Array.from(this.sharedStacks.keys()),\n message: 'getStackManager could not find shared stack',\n });\n throw new DatabaseError(\n `Stack manager not found: ${stackId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n logger.debug('Returning shared stack', { stackId });\n return sharedStack;\n }\n\n private async moveFramesBetweenStacks(\n sourceStackId: string,\n targetStackId: string,\n frameIds: string[]\n ): Promise<StackSyncResult> {\n const syncResult = await this.syncStacks(sourceStackId, targetStackId, {\n frameIds,\n conflictResolution: 'merge',\n });\n\n // Remove frames from source stack after successful sync\n if (syncResult.success && syncResult.errors.length === 0) {\n const sourceStack = this.getStackManager(sourceStackId);\n for (const frameId of frameIds) {\n try {\n sourceStack.deleteFrame(frameId);\n logger.debug('Deleted frame from source stack', {\n frameId,\n sourceStackId,\n });\n } catch (error: unknown) {\n logger.warn('Failed to delete frame from source stack', {\n frameId,\n error,\n });\n }\n }\n logger.debug('Completed frame cleanup from source stack', {\n frameIds: frameIds.length,\n });\n }\n\n return syncResult;\n }\n\n private async copyFrame(\n frame: Frame,\n targetStack: FrameManager\n ): Promise<void> {\n // Create frame in target stack\n await targetStack.createFrame({\n type: frame.type as any,\n name: frame.name,\n inputs: frame.inputs,\n });\n\n // Copy events\n const events = await this.individualStack.getFrameEvents(frame.frame_id);\n for (const event of events) {\n await targetStack.addEvent(frame.frame_id, {\n type: event.type as any,\n text: event.text,\n metadata: event.metadata,\n });\n }\n\n // Copy anchors\n const anchors = await this.individualStack.getFrameAnchors(frame.frame_id);\n for (const anchor of anchors) {\n await targetStack.addAnchor(frame.frame_id, {\n type: anchor.type as any,\n text: anchor.text,\n priority: anchor.priority,\n metadata: anchor.metadata,\n });\n }\n }\n\n private async mergeFrames(\n existingFrame: Frame,\n sourceFrame: Frame,\n targetStack: FrameManager\n ): Promise<void> {\n // Simple merge strategy - append events and anchors\n const sourceEvents = await this.individualStack.getFrameEvents(\n sourceFrame.frame_id\n );\n for (const event of sourceEvents) {\n await targetStack.addEvent(existingFrame.frame_id, {\n type: event.type as any,\n text: event.text,\n metadata: { ...event.metadata, merged: true },\n });\n }\n\n const sourceAnchors = await this.individualStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n for (const anchor of sourceAnchors) {\n await targetStack.addAnchor(existingFrame.frame_id, {\n type: anchor.type as any,\n text: anchor.text,\n priority: anchor.priority,\n metadata: { ...anchor.metadata, merged: true },\n });\n }\n }\n\n private async loadStackContext(\n stackId: string\n ): Promise<StackContext | null> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n return null;\n }\n\n const query = rawDb.prepare(`\n SELECT stack_id, type, project_id, owner_id, team_id, permissions, metadata, created_at, last_active\n FROM stack_contexts \n WHERE stack_id = ?\n `);\n\n const row = query.get(stackId) as any;\n if (!row) {\n return null;\n }\n\n return {\n stackId: row.stack_id,\n type: row.type,\n projectId: row.project_id,\n ownerId: row.owner_id,\n teamId: row.team_id,\n permissions: JSON.parse(row.permissions),\n metadata: JSON.parse(row.metadata || '{}'),\n createdAt: new Date(row.created_at),\n lastActive: new Date(row.last_active),\n };\n } catch (error: unknown) {\n logger.error('Failed to load stack context', { stackId, error });\n return null;\n }\n }\n\n private async saveStackContext(context: StackContext): Promise<void> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n throw new DatabaseError(\n 'SQLite database not available for stack context save',\n ErrorCode.DB_CONNECTION_FAILED,\n { stackId: context.stackId, operation: 'saveStackContext' }\n );\n }\n\n const query = rawDb.prepare(`\n INSERT OR REPLACE INTO stack_contexts \n (stack_id, type, project_id, owner_id, team_id, permissions, metadata, created_at, last_active)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n query.run(\n context.stackId,\n context.type,\n context.projectId,\n context.ownerId || null,\n context.teamId || null,\n JSON.stringify(context.permissions),\n JSON.stringify(context.metadata || {}),\n context.createdAt.getTime(),\n context.lastActive.getTime()\n );\n\n logger.debug('Saved stack context', { stackId: context.stackId });\n } catch (error: unknown) {\n logger.error('Failed to save stack context', {\n stackId: context.stackId,\n error,\n });\n throw error;\n }\n }\n\n private async updateStackActivity(stackId: string): Promise<void> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n logger.warn('SQLite database not available for activity update');\n return;\n }\n\n const query = rawDb.prepare(`\n UPDATE stack_contexts \n SET last_active = ?\n WHERE stack_id = ?\n `);\n\n query.run(Date.now(), stackId);\n logger.debug('Updated stack activity', { stackId });\n } catch (error: unknown) {\n logger.error('Failed to update stack activity', { stackId, error });\n // Don't throw - activity updates are not critical\n }\n }\n\n private async loadHandoffRequest(\n requestId: string\n ): Promise<HandoffRequest | null> {\n // Try in-memory first for fast access\n const memoryRequest = this.handoffRequests.get(requestId);\n if (memoryRequest) {\n return memoryRequest;\n }\n\n // Try loading from database\n try {\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n const query = rawDb.prepare(`\n SELECT * FROM handoff_requests WHERE request_id = ?\n `);\n\n const row = query.get(requestId) as any;\n if (row) {\n const request: HandoffRequest = {\n requestId: row.request_id,\n sourceStackId: row.source_stack_id,\n targetStackId: row.target_stack_id,\n frameIds: JSON.parse(row.frame_ids),\n status: row.status,\n createdAt: new Date(row.created_at),\n expiresAt: new Date(row.expires_at),\n targetUserId: row.target_user_id,\n message: row.message,\n };\n\n // Cache in memory for future access\n this.handoffRequests.set(requestId, request);\n return request;\n }\n }\n } catch (error: unknown) {\n logger.error('Failed to load handoff request from database', {\n requestId,\n error,\n });\n }\n\n return null;\n }\n\n private async saveHandoffRequest(request: HandoffRequest): Promise<void> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n const query = rawDb.prepare(`\n INSERT OR REPLACE INTO handoff_requests \n (request_id, source_stack_id, target_stack_id, frame_ids, status, created_at, expires_at, target_user_id, message)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n query.run(\n request.requestId,\n request.sourceStackId,\n request.targetStackId,\n JSON.stringify(request.frameIds),\n request.status,\n request.createdAt.getTime(),\n request.expiresAt.getTime(),\n request.targetUserId || null,\n request.message || null\n );\n\n logger.debug('Saved handoff request to database', {\n requestId: request.requestId,\n });\n }\n\n // Also keep in-memory for fast access\n this.handoffRequests.set(request.requestId, request);\n } catch (error: unknown) {\n logger.error('Failed to save handoff request', {\n requestId: request.requestId,\n error,\n });\n // Fallback to in-memory only\n this.handoffRequests.set(request.requestId, request);\n }\n }\n\n /**\n * Get list of available stacks for the current user\n */\n async getAvailableStacks(): Promise<StackContext[]> {\n try {\n const stacks: StackContext[] = [];\n\n // Always include current individual stack context\n stacks.push(this.activeContext);\n\n // Query database for all shared stacks the user has access to\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n const query = rawDb.prepare(`\n SELECT stack_id, type, project_id, owner_id, team_id, permissions, metadata, created_at, last_active\n FROM stack_contexts \n WHERE type = 'shared' AND project_id = ?\n `);\n\n const rows = query.all(this.activeContext.projectId) as any[];\n\n for (const row of rows) {\n const context: StackContext = {\n stackId: row.stack_id,\n type: row.type,\n projectId: row.project_id,\n ownerId: row.owner_id,\n teamId: row.team_id,\n permissions: JSON.parse(row.permissions),\n metadata: JSON.parse(row.metadata || '{}'),\n createdAt: new Date(row.created_at),\n lastActive: new Date(row.last_active),\n };\n\n // Check if user has permission to access this stack\n try {\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n this.activeContext.ownerId || 'unknown',\n 'read',\n 'stack',\n context.stackId,\n context\n )\n );\n stacks.push(context);\n } catch (permissionError: unknown) {\n // Skip stacks user doesn't have access to\n logger.debug('User lacks access to stack', {\n stackId: context.stackId,\n userId: this.activeContext.ownerId,\n });\n }\n }\n }\n\n return stacks;\n } catch (error: unknown) {\n logger.error('Failed to get available stacks', error);\n // Return at least the current individual stack\n return [this.activeContext];\n }\n }\n\n /**\n * Get pending handoff requests for the current user\n */\n async getPendingHandoffRequests(): Promise<HandoffRequest[]> {\n return Array.from(this.handoffRequests.values()).filter(\n (request) =>\n request.status === 'pending' && request.expiresAt > new Date()\n );\n }\n\n /**\n * Get current stack context\n */\n getCurrentContext(): StackContext {\n return { ...this.activeContext };\n }\n\n /**\n * Get permission manager for external access\n */\n getPermissionManager(): PermissionManager {\n return this.permissionManager;\n }\n\n /**\n * Add user to shared stack with specific permissions\n */\n async addUserToSharedStack(\n stackId: string,\n userId: string,\n permissions: StackPermissions,\n requesterId: string\n ): Promise<void> {\n // Check if requester has admin permissions on the stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n requesterId,\n 'administer',\n 'stack',\n stackId\n )\n );\n\n // Grant permissions to the new user\n this.permissionManager.setStackPermissions(userId, stackId, permissions);\n\n logger.info(`Added user to shared stack`, {\n stackId,\n userId,\n permissions,\n requesterId,\n });\n }\n\n /**\n * Remove user from shared stack\n */\n async removeUserFromSharedStack(\n stackId: string,\n userId: string,\n requesterId: string\n ): Promise<void> {\n // Check if requester has admin permissions on the stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n requesterId,\n 'administer',\n 'stack',\n stackId\n )\n );\n\n // Remove user's permissions\n const userPermissions = this.permissionManager.getUserPermissions(userId);\n userPermissions.delete(stackId);\n\n logger.info(`Removed user from shared stack`, {\n stackId,\n userId,\n requesterId,\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/enhanced-rehydration.ts"],
4
- "sourcesContent": ["/**\n * Enhanced Context Rehydration System\n * Addresses compact summary limitations with rich context recovery\n *\n * Includes CompactionHandler for Claude Code Autocompaction\n * Preserves critical context across token limit boundaries\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../monitoring/logger.js';\nimport { FrameManager } from './index.js';\nimport type { Anchor, Event } from './index.js';\n\n// ============================================================================\n// Compaction Handler Types\n// ============================================================================\n\nexport interface CompactionMetrics {\n estimatedTokens: number;\n warningThreshold: number;\n criticalThreshold: number;\n lastCompactionAt?: number;\n anchorsPreserved: number;\n}\n\nexport interface ToolCallSummary {\n tool: string;\n timestamp: number;\n key_inputs: Record<string, any>;\n key_outputs: Record<string, any>;\n files_affected: string[];\n success: boolean;\n error?: string;\n}\n\nexport interface CriticalContextAnchor {\n anchor_id: string;\n type: 'COMPACTION_PRESERVE';\n priority: 10; // Highest priority\n content: {\n tool_calls: ToolCallSummary[];\n decisions: string[];\n file_operations: FileOperation[];\n error_resolutions: ErrorPattern[];\n };\n created_at: number;\n token_estimate: number;\n}\n\nexport interface FileOperation {\n type: 'read' | 'write' | 'edit' | 'delete' | 'create';\n path: string;\n timestamp: number;\n success: boolean;\n error?: string;\n}\n\nexport interface ErrorPattern {\n error: string;\n resolution: string;\n tool_sequence: string[];\n timestamp: number;\n}\n\n// ============================================================================\n// Compaction Handler Class\n// ============================================================================\n\nexport class CompactionHandler {\n private frameManager: FrameManager;\n private metrics: CompactionMetrics;\n private tokenAccumulator: number = 0;\n private preservedAnchors: Map<string, CriticalContextAnchor> = new Map();\n\n constructor(frameManager: FrameManager) {\n this.frameManager = frameManager;\n this.metrics = {\n estimatedTokens: 0,\n warningThreshold: 150000, // 150K tokens\n criticalThreshold: 170000, // 170K tokens\n anchorsPreserved: 0,\n };\n }\n\n /**\n * Track token usage from a message\n */\n trackTokens(content: string): void {\n // Rough estimation: 1 token \u2248 4 characters\n const estimatedTokens = Math.ceil(content.length / 4);\n this.tokenAccumulator += estimatedTokens;\n this.metrics.estimatedTokens += estimatedTokens;\n\n // Check thresholds\n if (this.isApproachingCompaction()) {\n this.preserveCriticalContext();\n }\n }\n\n /**\n * Check if approaching compaction threshold\n */\n isApproachingCompaction(): boolean {\n return this.metrics.estimatedTokens >= this.metrics.warningThreshold;\n }\n\n /**\n * Check if past critical threshold\n */\n isPastCriticalThreshold(): boolean {\n return this.metrics.estimatedTokens >= this.metrics.criticalThreshold;\n }\n\n /**\n * Detect if compaction likely occurred\n */\n detectCompactionEvent(content: string): boolean {\n const compactionIndicators = [\n 'earlier in this conversation',\n 'previously discussed',\n 'as mentioned before',\n 'summarized for brevity',\n '[conversation compressed]',\n '[context truncated]',\n ];\n\n const lowerContent = content.toLowerCase();\n return compactionIndicators.some((indicator) =>\n lowerContent.includes(indicator)\n );\n }\n\n /**\n * Preserve critical context before compaction\n */\n async preserveCriticalContext(): Promise<void> {\n try {\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (!currentFrameId) {\n logger.warn('No active frame to preserve context from');\n return;\n }\n\n // Get events from current frame\n const events = this.frameManager.getFrameEvents(currentFrameId);\n\n // Extract critical information\n const toolCalls = this.extractToolCalls(events);\n const fileOps = this.extractFileOperations(events);\n const decisions = this.extractDecisions(events);\n const errorPatterns = this.extractErrorPatterns(events);\n\n // Create preservation anchor\n const anchor: CriticalContextAnchor = {\n anchor_id: `compact_${Date.now()}`,\n type: 'COMPACTION_PRESERVE',\n priority: 10,\n content: {\n tool_calls: toolCalls,\n file_operations: fileOps,\n decisions: decisions,\n error_resolutions: errorPatterns,\n },\n created_at: Date.now(),\n token_estimate: this.metrics.estimatedTokens,\n };\n\n // Store in frame manager as high-priority anchor\n this.frameManager.addAnchor(\n 'CONSTRAINT' as any, // Using CONSTRAINT type for now\n JSON.stringify(anchor),\n 10,\n {\n compaction_preserve: true,\n token_count: this.metrics.estimatedTokens,\n },\n currentFrameId\n );\n\n // Store locally for quick access\n this.preservedAnchors.set(anchor.anchor_id, anchor);\n this.metrics.anchorsPreserved++;\n\n logger.info(\n `Preserved critical context at ${this.metrics.estimatedTokens} tokens`\n );\n } catch (error: unknown) {\n logger.error(\n 'Failed to preserve critical context:',\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Extract tool calls from events\n */\n private extractToolCalls(events: Event[]): ToolCallSummary[] {\n const toolCalls: ToolCallSummary[] = [];\n const toolEvents = events.filter((e) => e.event_type === 'tool_call');\n\n for (const event of toolEvents) {\n const resultEvent = events.find(\n (e) =>\n e.event_type === 'tool_result' &&\n e.seq > event.seq &&\n e.payload.tool_name === event.payload.tool_name\n );\n\n toolCalls.push({\n tool: event.payload.tool_name || 'unknown',\n timestamp: event.ts,\n key_inputs: this.extractKeyInputs(event.payload),\n key_outputs: resultEvent\n ? this.extractKeyOutputs(resultEvent.payload)\n : {},\n files_affected: this.extractAffectedFiles(\n event.payload,\n resultEvent?.payload\n ),\n success: resultEvent ? !resultEvent.payload.error : false,\n error: resultEvent?.payload.error,\n });\n }\n\n return toolCalls;\n }\n\n /**\n * Extract key inputs from tool call\n */\n private extractKeyInputs(payload: any): Record<string, any> {\n const keys = [\n 'file_path',\n 'command',\n 'query',\n 'path',\n 'pattern',\n 'content',\n ];\n const result: Record<string, any> = {};\n\n for (const key of keys) {\n if (payload.arguments?.[key]) {\n result[key] = payload.arguments[key];\n }\n }\n\n return result;\n }\n\n /**\n * Extract key outputs from tool result\n */\n private extractKeyOutputs(payload: any): Record<string, any> {\n return {\n success: !payload.error,\n error: payload.error,\n result_type: payload.result_type,\n files_created: payload.files_created,\n files_modified: payload.files_modified,\n };\n }\n\n /**\n * Extract affected files from tool events\n */\n private extractAffectedFiles(callPayload: any, resultPayload: any): string[] {\n const files = new Set<string>();\n\n // From tool call\n if (callPayload?.arguments?.file_path) {\n files.add(callPayload.arguments.file_path);\n }\n if (callPayload?.arguments?.path) {\n files.add(callPayload.arguments.path);\n }\n\n // From tool result\n if (resultPayload?.files_created) {\n resultPayload.files_created.forEach((f: string) => files.add(f));\n }\n if (resultPayload?.files_modified) {\n resultPayload.files_modified.forEach((f: string) => files.add(f));\n }\n\n return Array.from(files);\n }\n\n /**\n * Extract file operations from events\n */\n private extractFileOperations(events: Event[]): FileOperation[] {\n const fileOps: FileOperation[] = [];\n const fileTools = ['Read', 'Write', 'Edit', 'MultiEdit', 'Delete'];\n\n const toolEvents = events.filter(\n (e) =>\n e.event_type === 'tool_call' && fileTools.includes(e.payload.tool_name)\n );\n\n for (const event of toolEvents) {\n const operation = this.mapToolToOperation(event.payload.tool_name);\n const path =\n event.payload.arguments?.file_path ||\n event.payload.arguments?.path ||\n 'unknown';\n\n fileOps.push({\n type: operation,\n path: path,\n timestamp: event.ts,\n success: true, // Will be updated from result\n error: undefined,\n });\n }\n\n return fileOps;\n }\n\n /**\n * Map tool name to file operation type\n */\n private mapToolToOperation(toolName: string): FileOperation['type'] {\n const mapping: Record<string, FileOperation['type']> = {\n Read: 'read',\n Write: 'write',\n Edit: 'edit',\n MultiEdit: 'edit',\n Delete: 'delete',\n };\n\n return mapping[toolName] || 'read';\n }\n\n /**\n * Extract decisions from events\n */\n private extractDecisions(events: Event[]): string[] {\n const decisions: string[] = [];\n\n const decisionEvents = events.filter((e) => e.event_type === 'decision');\n for (const event of decisionEvents) {\n if (event.payload.text) {\n decisions.push(event.payload.text);\n }\n }\n\n return decisions;\n }\n\n /**\n * Extract error patterns and resolutions\n */\n private extractErrorPatterns(events: Event[]): ErrorPattern[] {\n const patterns: ErrorPattern[] = [];\n\n // Find tool results with errors\n const errorEvents = events.filter(\n (e) => e.event_type === 'tool_result' && e.payload.error\n );\n\n for (const errorEvent of errorEvents) {\n // Look for subsequent successful tool calls that might be resolutions\n const subsequentTools = events\n .filter((e) => e.event_type === 'tool_call' && e.seq > errorEvent.seq)\n .slice(0, 3); // Next 3 tools might be resolution attempts\n\n if (subsequentTools.length > 0) {\n patterns.push({\n error: errorEvent.payload.error,\n resolution: `Attempted resolution with ${subsequentTools.map((t) => t.payload.tool_name).join(', ')}`,\n tool_sequence: subsequentTools.map((t) => t.payload.tool_name),\n timestamp: errorEvent.ts,\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Restore context after compaction detected\n */\n async restoreContext(): Promise<void> {\n if (this.preservedAnchors.size === 0) {\n logger.warn('No preserved anchors to restore from');\n return;\n }\n\n // Get the most recent anchor\n const anchors = Array.from(this.preservedAnchors.values());\n anchors.sort((a, b) => b.created_at - a.created_at);\n const latestAnchor = anchors[0];\n\n // Create restoration frame\n const restorationFrame = this.frameManager.createFrame({\n type: 'review',\n name: 'Context Restoration After Compaction',\n inputs: { reason: 'autocompaction_detected' },\n });\n\n // Add restoration anchor\n this.frameManager.addAnchor(\n 'FACT',\n `Context restored from token position ${latestAnchor.token_estimate}`,\n 10,\n { restoration: true },\n restorationFrame\n );\n\n // Add tool sequence summary\n const toolSequence = latestAnchor.content.tool_calls\n .map((t) => t.tool)\n .join(' \u2192 ');\n this.frameManager.addAnchor(\n 'FACT',\n `Tool sequence: ${toolSequence}`,\n 9,\n {},\n restorationFrame\n );\n\n // Add file operations summary\n const files = new Set<string>();\n latestAnchor.content.file_operations.forEach((op) => files.add(op.path));\n if (files.size > 0) {\n this.frameManager.addAnchor(\n 'FACT',\n `Files touched: ${Array.from(files).join(', ')}`,\n 8,\n {},\n restorationFrame\n );\n }\n\n // Add decisions\n for (const decision of latestAnchor.content.decisions) {\n this.frameManager.addAnchor(\n 'DECISION',\n decision,\n 7,\n {},\n restorationFrame\n );\n }\n\n logger.info('Context restored after compaction detection');\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): CompactionMetrics {\n return { ...this.metrics };\n }\n\n /**\n * Reset token counter (e.g., at session start)\n */\n resetTokenCount(): void {\n this.metrics.estimatedTokens = 0;\n this.tokenAccumulator = 0;\n this.metrics.lastCompactionAt = undefined;\n }\n}\n\n// ============================================================================\n// Enhanced Rehydration Types\n// ============================================================================\n\nexport interface FileSnapshot {\n path: string;\n content: string;\n size: number;\n lastModified: number;\n hash: string; // Quick change detection\n contextTags: string[]; // e.g., ['migration', 'pipedream', 'hubspot']\n}\n\nexport interface StackTrace {\n error_message: string;\n stack_frames: string[];\n file_path?: string;\n line_number?: number;\n function_name?: string;\n timestamp: number;\n context: string; // What was being done when error occurred\n resolution_attempted?: string[];\n resolution_status: 'pending' | 'resolved' | 'workaround' | 'blocked';\n}\n\nexport interface ConversationContext {\n timestamp: number;\n reasoning: string[];\n decisions_made: string[];\n next_steps: string[];\n user_preferences: Record<string, any>;\n pain_points: string[];\n stack_traces: StackTrace[];\n error_patterns: string[]; // Recurring error types\n}\n\nexport interface ProjectMapping {\n file_relationships: Record<string, string[]>; // file -> related files\n workflow_sequences: string[][]; // sequences of files in workflows\n key_directories: string[];\n entry_points: string[];\n configuration_files: string[];\n}\n\nexport interface RehydrationContext {\n session_id: string;\n compact_detected_at: number;\n pre_compact_state: {\n file_snapshots: FileSnapshot[];\n conversation_context: ConversationContext;\n project_mapping: ProjectMapping;\n active_workflows: string[];\n current_focus: string;\n };\n recovery_anchors: string[];\n}\n\nexport class EnhancedRehydrationManager {\n private frameManager: FrameManager;\n private compactionHandler: CompactionHandler;\n private snapshotThreshold = 10; // Take snapshot every N significant events\n private eventCount = 0;\n private rehydrationStorage = new Map<string, RehydrationContext>();\n\n constructor(\n frameManager: FrameManager,\n compactionHandler: CompactionHandler\n ) {\n this.frameManager = frameManager;\n this.compactionHandler = compactionHandler;\n this.setupCompactDetection();\n this.initializeStackTraceStorage();\n }\n\n /**\n * Initialize dedicated stack trace storage in database\n */\n private initializeStackTraceStorage(): void {\n try {\n const db = (this.frameManager as any).db; // Access the underlying database\n\n // Create stack_traces table for persistent storage\n db.exec(`\n CREATE TABLE IF NOT EXISTS stack_traces (\n trace_id TEXT PRIMARY KEY,\n frame_id TEXT,\n project_id TEXT NOT NULL,\n error_message TEXT NOT NULL,\n stack_frames TEXT NOT NULL,\n file_path TEXT,\n line_number INTEGER,\n function_name TEXT,\n context TEXT,\n resolution_attempted TEXT,\n resolution_status TEXT NOT NULL DEFAULT 'pending',\n error_type TEXT,\n error_severity TEXT DEFAULT 'medium',\n created_at INTEGER DEFAULT (unixepoch()),\n updated_at INTEGER DEFAULT (unixepoch()),\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_stack_traces_frame ON stack_traces(frame_id);\n CREATE INDEX IF NOT EXISTS idx_stack_traces_status ON stack_traces(resolution_status);\n CREATE INDEX IF NOT EXISTS idx_stack_traces_type ON stack_traces(error_type);\n CREATE INDEX IF NOT EXISTS idx_stack_traces_severity ON stack_traces(error_severity);\n CREATE INDEX IF NOT EXISTS idx_stack_traces_created ON stack_traces(created_at);\n `);\n\n logger.info('Stack trace storage initialized');\n } catch (error) {\n logger.error('Failed to initialize stack trace storage:', error);\n }\n }\n\n /**\n * Set up automatic compact detection and recovery\n */\n private setupCompactDetection(): void {\n // Monitor for compact indicators in new frames\n setInterval(() => this.checkForCompactionEvent(), 30000); // Check every 30s\n }\n\n /**\n * Enhanced file content snapshot with context\n */\n async captureFileSnapshot(\n filePath: string,\n contextTags: string[] = []\n ): Promise<FileSnapshot | null> {\n try {\n const stats = await fs.stat(filePath);\n const content = await fs.readFile(filePath, 'utf8');\n\n // Simple hash for change detection\n const hash = this.simpleHash(content);\n\n return {\n path: filePath,\n content: content,\n size: stats.size,\n lastModified: stats.mtimeMs,\n hash: hash,\n contextTags: contextTags,\n };\n } catch (error) {\n logger.warn(`Failed to capture snapshot for ${filePath}:`, error);\n return null;\n }\n }\n\n /**\n * Capture conversation reasoning and decisions including stack traces\n */\n captureConversationContext(\n reasoning: string[],\n decisions: string[],\n nextSteps: string[] = [],\n userPrefs: Record<string, any> = {},\n painPoints: string[] = [],\n stackTraces: StackTrace[] = [],\n errorPatterns: string[] = []\n ): ConversationContext {\n return {\n timestamp: Date.now(),\n reasoning: reasoning,\n decisions_made: decisions,\n next_steps: nextSteps,\n user_preferences: userPrefs,\n pain_points: painPoints,\n stack_traces: stackTraces,\n error_patterns: errorPatterns,\n };\n }\n\n /**\n * Capture stack trace from error with context and store in database\n */\n captureStackTrace(\n error: Error | string,\n context: string,\n filePath?: string,\n resolutionAttempts: string[] = [],\n frameId?: string\n ): StackTrace {\n const errorMessage = typeof error === 'string' ? error : error.message;\n const stackFrames =\n typeof error === 'string' ? [] : error.stack?.split('\\n') || [];\n\n // Extract file path and line number from stack if not provided\n let extractedFilePath = filePath;\n let lineNumber: number | undefined;\n let functionName: string | undefined;\n\n if (stackFrames.length > 0) {\n const firstFrame = stackFrames.find((frame) => frame.includes('at '));\n if (firstFrame) {\n const match = firstFrame.match(/at (.+?) \\((.+):(\\d+):(\\d+)\\)/);\n if (match) {\n functionName = match[1];\n extractedFilePath = extractedFilePath || match[2];\n lineNumber = parseInt(match[3]);\n }\n }\n }\n\n const stackTrace: StackTrace = {\n error_message: errorMessage,\n stack_frames: stackFrames,\n file_path: extractedFilePath,\n line_number: lineNumber,\n function_name: functionName,\n timestamp: Date.now(),\n context: context,\n resolution_attempted: resolutionAttempts,\n resolution_status: 'pending',\n };\n\n // Store in database\n this.storeStackTrace(stackTrace, frameId);\n\n return stackTrace;\n }\n\n /**\n * Store stack trace in database\n */\n private storeStackTrace(stackTrace: StackTrace, frameId?: string): string {\n try {\n const db = (this.frameManager as any).db;\n const traceId = this.generateTraceId();\n const currentFrameId = frameId || this.frameManager.getCurrentFrameId();\n\n // Determine error type and severity\n const errorType = this.extractErrorType(stackTrace.error_message);\n const severity = this.determineErrorSeverity(stackTrace);\n\n const stmt = db.prepare(`\n INSERT INTO stack_traces (\n trace_id, frame_id, project_id, error_message, stack_frames,\n file_path, line_number, function_name, context, resolution_attempted,\n resolution_status, error_type, error_severity\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n traceId,\n currentFrameId,\n (this.frameManager as any).projectId,\n stackTrace.error_message,\n JSON.stringify(stackTrace.stack_frames),\n stackTrace.file_path,\n stackTrace.line_number,\n stackTrace.function_name,\n stackTrace.context,\n JSON.stringify(stackTrace.resolution_attempted),\n stackTrace.resolution_status,\n errorType,\n severity\n );\n\n logger.info(`Stored stack trace ${traceId} for frame ${currentFrameId}`);\n return traceId;\n } catch (error) {\n logger.error('Failed to store stack trace:', error);\n return '';\n }\n }\n\n /**\n * Retrieve stack traces from database\n */\n public getStackTraces(frameId?: string, limit: number = 50): StackTrace[] {\n try {\n const db = (this.frameManager as any).db;\n const traces: StackTrace[] = [];\n\n let query: string;\n let params: any[];\n\n if (frameId) {\n query = `\n SELECT * FROM stack_traces \n WHERE frame_id = ? \n ORDER BY created_at DESC \n LIMIT ?\n `;\n params = [frameId, limit];\n } else {\n query = `\n SELECT * FROM stack_traces \n WHERE project_id = ? \n ORDER BY created_at DESC \n LIMIT ?\n `;\n params = [(this.frameManager as any).projectId, limit];\n }\n\n const rows = db.prepare(query).all(...params);\n\n for (const row of rows) {\n traces.push({\n error_message: row.error_message,\n stack_frames: JSON.parse(row.stack_frames || '[]'),\n file_path: row.file_path,\n line_number: row.line_number,\n function_name: row.function_name,\n timestamp: row.created_at * 1000, // Convert from unix to JS timestamp\n context: row.context,\n resolution_attempted: JSON.parse(row.resolution_attempted || '[]'),\n resolution_status: row.resolution_status,\n });\n }\n\n return traces;\n } catch (error) {\n logger.error('Failed to retrieve stack traces:', error);\n return [];\n }\n }\n\n /**\n * Update stack trace resolution status\n */\n public updateStackTraceStatus(\n traceId: string,\n status: StackTrace['resolution_status'],\n resolutionAttempts?: string[]\n ): boolean {\n try {\n const db = (this.frameManager as any).db;\n\n const stmt = db.prepare(`\n UPDATE stack_traces \n SET resolution_status = ?, resolution_attempted = ?, updated_at = unixepoch()\n WHERE trace_id = ?\n `);\n\n const result = stmt.run(\n status,\n resolutionAttempts ? JSON.stringify(resolutionAttempts) : undefined,\n traceId\n );\n\n return result.changes > 0;\n } catch (error) {\n logger.error('Failed to update stack trace status:', error);\n return false;\n }\n }\n\n /**\n * Helper methods for stack trace processing\n */\n private generateTraceId(): string {\n return `trace_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private extractErrorType(errorMessage: string): string {\n const typeMatch = errorMessage.match(/^(\\w+Error?):/);\n return typeMatch ? typeMatch[1] : 'Unknown';\n }\n\n private determineErrorSeverity(stackTrace: StackTrace): string {\n const message = stackTrace.error_message.toLowerCase();\n\n if (\n message.includes('critical') ||\n message.includes('fatal') ||\n message.includes('cannot read properties')\n ) {\n return 'high';\n } else if (message.includes('warning') || message.includes('deprecated')) {\n return 'low';\n } else {\n return 'medium';\n }\n }\n\n /**\n * Auto-detect project structure and relationships\n */\n async analyzeProjectMapping(workingDir: string): Promise<ProjectMapping> {\n const mapping: ProjectMapping = {\n file_relationships: {},\n workflow_sequences: [],\n key_directories: [],\n entry_points: [],\n configuration_files: [],\n };\n\n try {\n // Find configuration files\n const configPatterns = [\n 'package.json',\n 'tsconfig.json',\n '.env',\n 'docker-compose.yml',\n '*.config.js',\n '*.config.ts',\n 'Dockerfile',\n 'README.md',\n ];\n\n // Analyze directory structure\n const files = await this.getDirectoryFiles(workingDir);\n\n for (const file of files) {\n const ext = path.extname(file);\n const basename = path.basename(file);\n\n // Identify configuration files\n if (\n configPatterns.some((pattern) =>\n pattern.includes('*')\n ? basename.includes(pattern.replace('*', ''))\n : basename === pattern\n )\n ) {\n mapping.configuration_files.push(file);\n }\n\n // Identify entry points\n if (\n basename === 'index.js' ||\n basename === 'index.ts' ||\n basename === 'main.js'\n ) {\n mapping.entry_points.push(file);\n }\n\n // Find related files based on naming patterns\n const filePrefix = basename.split('.')[0];\n const relatedFiles = files.filter(\n (f) => f !== file && path.basename(f).startsWith(filePrefix)\n );\n if (relatedFiles.length > 0) {\n mapping.file_relationships[file] = relatedFiles;\n }\n }\n\n // Identify key directories\n const dirs = files\n .map((f) => path.dirname(f))\n .filter((v, i, a) => a.indexOf(v) === i);\n mapping.key_directories = dirs.filter((dir) =>\n ['src', 'lib', 'components', 'pages', 'api', 'utils', 'types'].some(\n (key) => dir.includes(key)\n )\n );\n } catch (error) {\n logger.warn('Failed to analyze project mapping:', error);\n }\n\n return mapping;\n }\n\n /**\n * Create comprehensive rehydration context before compaction\n */\n async createRehydrationCheckpoint(): Promise<string> {\n const sessionId = this.frameManager.getSessionId() || 'unknown';\n const checkpointId = `${sessionId}_${Date.now()}`;\n\n try {\n // Get current working directory\n const workingDir = process.cwd();\n\n // Capture file snapshots for recently modified files\n const fileSnapshots: FileSnapshot[] = [];\n const recentFiles = await this.getRecentlyModifiedFiles(workingDir);\n\n for (const file of recentFiles.slice(0, 20)) {\n // Limit to 20 most recent\n const snapshot = await this.captureFileSnapshot(\n file,\n this.inferContextTags(file)\n );\n if (snapshot) {\n fileSnapshots.push(snapshot);\n }\n }\n\n // Capture project mapping\n const projectMapping = await this.analyzeProjectMapping(workingDir);\n\n // Extract conversation context from recent events\n const conversationContext = this.extractConversationContext();\n\n // Create rehydration context\n const rehydrationContext: RehydrationContext = {\n session_id: sessionId,\n compact_detected_at: Date.now(),\n pre_compact_state: {\n file_snapshots: fileSnapshots,\n conversation_context: conversationContext,\n project_mapping: projectMapping,\n active_workflows: this.detectActiveWorkflows(fileSnapshots),\n current_focus: this.inferCurrentFocus(\n fileSnapshots,\n conversationContext\n ),\n },\n recovery_anchors: this.createRecoveryAnchors(\n fileSnapshots,\n conversationContext\n ),\n };\n\n // Store for later retrieval\n this.rehydrationStorage.set(checkpointId, rehydrationContext);\n\n // Also persist to file system for cross-session recovery\n await this.persistRehydrationContext(checkpointId, rehydrationContext);\n\n logger.info(\n `Created rehydration checkpoint ${checkpointId} with ${fileSnapshots.length} file snapshots`\n );\n\n return checkpointId;\n } catch (error) {\n logger.error('Failed to create rehydration checkpoint:', error);\n throw error;\n }\n }\n\n /**\n * Inject rich context after compaction detection\n */\n async rehydrateContext(checkpointId?: string): Promise<boolean> {\n try {\n let context: RehydrationContext | undefined;\n\n if (checkpointId) {\n context = this.rehydrationStorage.get(checkpointId);\n if (!context) {\n context = await this.loadPersistedContext(checkpointId);\n }\n } else {\n // Find most recent context\n context = await this.findMostRecentContext();\n }\n\n if (!context) {\n logger.warn('No rehydration context available');\n return false;\n }\n\n await this.injectRichContext(context);\n return true;\n } catch (error) {\n logger.error('Failed to rehydrate context:', error);\n return false;\n }\n }\n\n /**\n * Inject rich context into current session\n */\n private async injectRichContext(context: RehydrationContext): Promise<void> {\n const frameId = this.frameManager.getCurrentFrameId();\n if (!frameId) {\n logger.warn('No active frame for context injection');\n return;\n }\n\n // Inject file context\n for (const snapshot of context.pre_compact_state.file_snapshots.slice(\n 0,\n 5\n )) {\n // Top 5 files\n this.frameManager.addAnchor(\n 'FACT',\n `File: ${snapshot.path} (${snapshot.contextTags.join(', ')})\\n` +\n `Last modified: ${new Date(snapshot.lastModified).toISOString()}\\n` +\n `Size: ${snapshot.size} bytes\\n` +\n `Content preview: ${this.getContentPreview(snapshot.content)}`,\n 9,\n {\n rehydration: true,\n file_path: snapshot.path,\n context_tags: snapshot.contextTags,\n },\n frameId\n );\n }\n\n // Inject conversation context\n const conv = context.pre_compact_state.conversation_context;\n if (conv.decisions_made.length > 0) {\n this.frameManager.addAnchor(\n 'DECISION',\n `Previous decisions: ${conv.decisions_made.join('; ')}`,\n 8,\n { rehydration: true },\n frameId\n );\n }\n\n if (conv.next_steps.length > 0) {\n this.frameManager.addAnchor(\n 'FACT',\n `Next steps identified: ${conv.next_steps.join('; ')}`,\n 7,\n { rehydration: true },\n frameId\n );\n }\n\n // Inject stack trace context\n if (conv.stack_traces.length > 0) {\n for (const trace of conv.stack_traces.slice(0, 3)) {\n // Top 3 most recent errors\n this.frameManager.addAnchor(\n 'ERROR',\n `Error context: ${trace.error_message}\\n` +\n `Context: ${trace.context}\\n` +\n `File: ${trace.file_path || 'unknown'}${trace.line_number ? `:${trace.line_number}` : ''}\\n` +\n `Function: ${trace.function_name || 'unknown'}\\n` +\n `Status: ${trace.resolution_status}\\n` +\n `Stack preview: ${trace.stack_frames.slice(0, 3).join('\\n')}`,\n 9,\n {\n rehydration: true,\n error_type: trace.error_message.split(':')[0],\n resolution_status: trace.resolution_status,\n file_path: trace.file_path,\n },\n frameId\n );\n }\n }\n\n // Inject error patterns\n if (conv.error_patterns.length > 0) {\n this.frameManager.addAnchor(\n 'PATTERN',\n `Recurring error patterns detected: ${conv.error_patterns.join(', ')}`,\n 7,\n { rehydration: true },\n frameId\n );\n }\n\n // Inject project mapping\n const mapping = context.pre_compact_state.project_mapping;\n if (mapping.entry_points.length > 0) {\n this.frameManager.addAnchor(\n 'FACT',\n `Project entry points: ${mapping.entry_points.join(', ')}`,\n 6,\n { rehydration: true },\n frameId\n );\n }\n\n // Inject current focus\n if (context.pre_compact_state.current_focus) {\n this.frameManager.addAnchor(\n 'CONSTRAINT',\n `Previous focus: ${context.pre_compact_state.current_focus}`,\n 8,\n { rehydration: true },\n frameId\n );\n }\n\n logger.info('Rich context injected successfully');\n }\n\n // Helper methods\n private async getDirectoryFiles(dir: string): Promise<string[]> {\n // Implementation to recursively get files\n return []; // Simplified for now\n }\n\n private async getRecentlyModifiedFiles(dir: string): Promise<string[]> {\n // Implementation to get recently modified files\n return []; // Simplified for now\n }\n\n private inferContextTags(filePath: string): string[] {\n const tags: string[] = [];\n const content = filePath.toLowerCase();\n\n if (content.includes('pipeline') || content.includes('migrate'))\n tags.push('migration');\n if (content.includes('hubspot')) tags.push('hubspot');\n if (content.includes('pipedream')) tags.push('pipedream');\n if (content.includes('test')) tags.push('test');\n if (content.includes('config')) tags.push('configuration');\n\n return tags;\n }\n\n private extractConversationContext(): ConversationContext {\n // Extract from recent frame events\n const recentErrors = this.extractRecentStackTraces();\n const errorPatterns = this.detectErrorPatterns(recentErrors);\n\n return {\n timestamp: Date.now(),\n reasoning: [],\n decisions_made: [],\n next_steps: [],\n user_preferences: {},\n pain_points: [],\n stack_traces: recentErrors,\n error_patterns: errorPatterns,\n };\n }\n\n /**\n * Extract recent stack traces from database and frame events\n */\n private extractRecentStackTraces(): StackTrace[] {\n try {\n // Get recent stack traces from database (most reliable source)\n const dbTraces = this.getStackTraces(undefined, 10);\n\n // Also check frame events for additional traces\n const eventTraces = this.extractStackTracesFromFrameEvents();\n\n // Combine and deduplicate\n const allTraces = [...dbTraces, ...eventTraces];\n\n // Remove duplicates based on error message and file path\n const uniqueTraces = allTraces.filter(\n (trace, index, array) =>\n array.findIndex(\n (t) =>\n t.error_message === trace.error_message &&\n t.file_path === trace.file_path\n ) === index\n );\n\n // Sort by timestamp (newest first) and return top 5\n return uniqueTraces.sort((a, b) => b.timestamp - a.timestamp).slice(0, 5);\n } catch (error) {\n logger.warn('Failed to extract stack traces:', error);\n return [];\n }\n }\n\n /**\n * Extract stack traces from frame events (fallback method)\n */\n private extractStackTracesFromFrameEvents(): StackTrace[] {\n const traces: StackTrace[] = [];\n\n try {\n // Get recent frames and look for error events\n const frames = this.frameManager.getActiveFramePath();\n\n for (const frame of frames.slice(-3)) {\n // Check last 3 frames\n const frameData = this.frameManager.getFrame(frame.frame_id);\n if (frameData?.events) {\n for (const event of frameData.events) {\n if (event.type === 'error' || event.type === 'exception') {\n const trace = this.parseStackTraceFromEvent(event);\n if (trace) {\n traces.push(trace);\n }\n }\n }\n }\n }\n } catch (error) {\n logger.warn('Failed to extract frame event traces:', error);\n }\n\n return traces;\n }\n\n /**\n * Parse stack trace from frame event\n */\n private parseStackTraceFromEvent(event: any): StackTrace | null {\n try {\n const data =\n typeof event.data === 'string' ? JSON.parse(event.data) : event.data;\n\n return {\n error_message: data.error || data.message || 'Unknown error',\n stack_frames: data.stack ? data.stack.split('\\n') : [],\n file_path: data.file || data.fileName,\n line_number: data.line || data.lineNumber,\n function_name: data.function || data.functionName,\n timestamp: event.timestamp || Date.now(),\n context: data.context || 'Error occurred during frame processing',\n resolution_attempted: data.resolutionAttempts || [],\n resolution_status: data.resolved ? 'resolved' : 'pending',\n };\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Detect recurring error patterns\n */\n private detectErrorPatterns(traces: StackTrace[]): string[] {\n const patterns = new Map<string, number>();\n\n for (const trace of traces) {\n // Extract error type from message\n const errorType = trace.error_message.split(':')[0].trim();\n patterns.set(errorType, (patterns.get(errorType) || 0) + 1);\n }\n\n // Return patterns that occur more than once\n return Array.from(patterns.entries())\n .filter(([, count]) => count > 1)\n .map(([pattern]) => pattern);\n }\n\n private detectActiveWorkflows(snapshots: FileSnapshot[]): string[] {\n const workflows: string[] = [];\n\n for (const snapshot of snapshots) {\n if (snapshot.contextTags.includes('migration')) {\n workflows.push('data_migration');\n }\n if (snapshot.path.includes('test')) {\n workflows.push('testing');\n }\n }\n\n return [...new Set(workflows)];\n }\n\n private inferCurrentFocus(\n snapshots: FileSnapshot[],\n context: ConversationContext\n ): string {\n // Analyze recent file activity and conversation to infer focus\n if (snapshots.some((s) => s.contextTags.includes('migration'))) {\n return 'Data migration and transformation';\n }\n if (snapshots.some((s) => s.path.includes('test'))) {\n return 'Testing and validation';\n }\n return 'Development';\n }\n\n private createRecoveryAnchors(\n snapshots: FileSnapshot[],\n context: ConversationContext\n ): string[] {\n const anchors: string[] = [];\n\n // Create anchor points for each significant file\n for (const snapshot of snapshots.slice(0, 3)) {\n anchors.push(\n `File context: ${snapshot.path} with ${snapshot.contextTags.join(', ')}`\n );\n }\n\n return anchors;\n }\n\n private async persistRehydrationContext(\n id: string,\n context: RehydrationContext\n ): Promise<void> {\n // Implementation to persist context to filesystem\n const contextDir = path.join(process.cwd(), '.stackmemory', 'rehydration');\n await fs.mkdir(contextDir, { recursive: true });\n await fs.writeFile(\n path.join(contextDir, `${id}.json`),\n JSON.stringify(context, null, 2)\n );\n }\n\n private async loadPersistedContext(\n id: string\n ): Promise<RehydrationContext | undefined> {\n try {\n const contextPath = path.join(\n process.cwd(),\n '.stackmemory',\n 'rehydration',\n `${id}.json`\n );\n const content = await fs.readFile(contextPath, 'utf8');\n return JSON.parse(content);\n } catch {\n return undefined;\n }\n }\n\n private async findMostRecentContext(): Promise<\n RehydrationContext | undefined\n > {\n // Find most recent persisted context\n return undefined; // Simplified for now\n }\n\n private checkForCompactionEvent(): void {\n // Check if compaction occurred and trigger rehydration\n if (this.compactionHandler.detectCompactionEvent('')) {\n this.rehydrateContext();\n }\n }\n\n private simpleHash(content: string): string {\n let hash = 0;\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash.toString(16);\n }\n\n private getContentPreview(content: string, maxLength = 200): string {\n return content.length > maxLength\n ? content.substring(0, maxLength) + '...'\n : content;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["path"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/context/frame-database.ts"],
4
- "sourcesContent": ["/**\n * Frame Database Operations\n * Handles all database interactions for frames, events, and anchors\n */\n\nimport Database from 'better-sqlite3';\nimport { Frame, Event, Anchor } from './frame-types.js';\nimport { logger } from '../monitoring/logger.js';\nimport { DatabaseError, ErrorCode } from '../errors/index.js';\n\n// Database row types for type-safe queries\ninterface FrameRow {\n frame_id: string;\n run_id: string;\n project_id: string;\n parent_frame_id: string | null;\n depth: number;\n type: string;\n name: string;\n state: string;\n inputs: string;\n outputs: string;\n digest_text: string | null;\n digest_json: string;\n created_at: number;\n closed_at: number | null;\n}\n\ninterface EventRow {\n event_id: string;\n frame_id: string;\n run_id: string;\n seq: number;\n event_type: string;\n payload: string;\n ts: number;\n}\n\ninterface AnchorRow {\n anchor_id: string;\n frame_id: string;\n type: string;\n text: string;\n priority: number;\n metadata: string;\n created_at: number;\n}\n\ninterface CountRow {\n count: number;\n}\n\ninterface MaxSeqRow {\n max_seq: number | null;\n}\n\n// Default limits to prevent unbounded queries\nexport const DEFAULT_FRAME_LIMIT = 1000;\nexport const DEFAULT_EVENT_LIMIT = 500;\nexport const DEFAULT_ANCHOR_LIMIT = 200;\n\n// Safe JSON parse with fallback\nfunction safeJsonParse<T>(json: string | null | undefined, fallback: T): T {\n if (!json) return fallback;\n try {\n return JSON.parse(json) as T;\n } catch {\n logger.warn('Failed to parse JSON, using fallback', {\n json: json.substring(0, 100),\n });\n return fallback;\n }\n}\n\nexport class FrameDatabase {\n constructor(private db: Database.Database) {}\n\n /**\n * Initialize database schema\n */\n initSchema(): void {\n try {\n // Enable WAL mode for better concurrency\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('synchronous = NORMAL');\n // Enforce referential integrity\n this.db.pragma('foreign_keys = ON');\n\n // Create frames table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS frames (\n frame_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n parent_frame_id TEXT,\n depth INTEGER NOT NULL DEFAULT 0,\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n state TEXT NOT NULL DEFAULT 'active',\n inputs TEXT DEFAULT '{}',\n outputs TEXT DEFAULT '{}',\n digest_text TEXT,\n digest_json TEXT DEFAULT '{}',\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n closed_at INTEGER,\n FOREIGN KEY (parent_frame_id) REFERENCES frames(frame_id)\n );\n `);\n\n // Create events table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n event_type TEXT NOT NULL,\n payload TEXT NOT NULL DEFAULT '{}',\n ts INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n FOREIGN KEY (frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE\n );\n `);\n\n // Create anchors table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS anchors (\n anchor_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n priority INTEGER NOT NULL DEFAULT 5,\n metadata TEXT DEFAULT '{}',\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n FOREIGN KEY (frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE\n );\n `);\n\n // Create indexes for performance\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_frames_project_state ON frames(project_id, state);\n CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);\n CREATE INDEX IF NOT EXISTS idx_events_frame_seq ON events(frame_id, seq);\n CREATE INDEX IF NOT EXISTS idx_anchors_frame_priority ON anchors(frame_id, priority DESC);\n `);\n\n logger.info('Frame database schema initialized');\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to initialize frame database schema',\n ErrorCode.DB_SCHEMA_ERROR,\n { operation: 'initSchema' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Insert new frame\n */\n insertFrame(frame: Omit<Frame, 'created_at' | 'closed_at'>): Frame {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO frames (frame_id, run_id, project_id, parent_frame_id, depth, type, name, state, inputs, outputs, digest_json)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const result = stmt.run(\n frame.frame_id,\n frame.run_id,\n frame.project_id,\n frame.parent_frame_id || null,\n frame.depth,\n frame.type,\n frame.name,\n frame.state,\n JSON.stringify(frame.inputs),\n JSON.stringify(frame.outputs),\n JSON.stringify(frame.digest_json)\n );\n\n if (result.changes === 0) {\n throw new DatabaseError(\n 'Frame insertion failed - no rows affected',\n ErrorCode.DB_INSERT_FAILED,\n { frameId: frame.frame_id, operation: 'insertFrame' }\n );\n }\n\n // Return the created frame with timestamp\n const createdFrame = this.getFrame(frame.frame_id);\n if (!createdFrame) {\n throw new DatabaseError(\n 'Failed to retrieve created frame',\n ErrorCode.DB_QUERY_FAILED,\n { frameId: frame.frame_id, operation: 'insertFrame' }\n );\n }\n\n return createdFrame;\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to insert frame: ${frame.frame_id}`,\n ErrorCode.DB_INSERT_FAILED,\n {\n frameId: frame.frame_id,\n frameName: frame.name,\n operation: 'insertFrame',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get frame by ID\n */\n getFrame(frameId: string): Frame | undefined {\n try {\n const row = this.db\n .prepare('SELECT * FROM frames WHERE frame_id = ?')\n .get(frameId) as FrameRow | undefined;\n\n if (!row) return undefined;\n\n return {\n ...row,\n parent_frame_id: row.parent_frame_id ?? undefined,\n inputs: safeJsonParse<Record<string, unknown>>(row.inputs, {}),\n outputs: safeJsonParse<Record<string, unknown>>(row.outputs, {}),\n digest_json: safeJsonParse<Record<string, unknown>>(\n row.digest_json,\n {}\n ),\n } as Frame;\n } catch (error: unknown) {\n logger.warn(`Failed to get frame: ${frameId}`, { error });\n return undefined;\n }\n }\n\n /**\n * Update frame state and outputs\n */\n updateFrame(frameId: string, updates: Partial<Frame>): void {\n try {\n const setClauses: string[] = [];\n const values: (string | number | null)[] = [];\n\n if (updates.state !== undefined) {\n setClauses.push('state = ?');\n values.push(updates.state);\n }\n\n if (updates.outputs !== undefined) {\n setClauses.push('outputs = ?');\n values.push(JSON.stringify(updates.outputs));\n }\n\n if (updates.digest_text !== undefined) {\n setClauses.push('digest_text = ?');\n values.push(updates.digest_text);\n }\n\n if (updates.digest_json !== undefined) {\n setClauses.push('digest_json = ?');\n values.push(JSON.stringify(updates.digest_json));\n }\n\n if (updates.closed_at !== undefined) {\n setClauses.push('closed_at = ?');\n values.push(updates.closed_at);\n }\n\n if (updates.parent_frame_id !== undefined) {\n setClauses.push('parent_frame_id = ?');\n values.push(updates.parent_frame_id);\n }\n\n if (updates.depth !== undefined) {\n setClauses.push('depth = ?');\n values.push(updates.depth);\n }\n\n if (setClauses.length === 0) {\n return; // No updates to apply\n }\n\n values.push(frameId);\n\n const stmt = this.db.prepare(`\n UPDATE frames SET ${setClauses.join(', ')} WHERE frame_id = ?\n `);\n\n const result = stmt.run(...values);\n\n if (result.changes === 0) {\n throw new DatabaseError(\n `Frame not found: ${frameId}`,\n ErrorCode.DB_UPDATE_FAILED,\n { frameId, operation: 'updateFrame' }\n );\n }\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to update frame: ${frameId}`,\n ErrorCode.DB_UPDATE_FAILED,\n { frameId, updates, operation: 'updateFrame' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get frames by project and state\n */\n getFramesByProject(\n projectId: string,\n state?: 'active' | 'closed',\n limit: number = DEFAULT_FRAME_LIMIT\n ): Frame[] {\n try {\n const query = state\n ? 'SELECT * FROM frames WHERE project_id = ? AND state = ? ORDER BY created_at LIMIT ?'\n : 'SELECT * FROM frames WHERE project_id = ? ORDER BY created_at LIMIT ?';\n\n const params = state ? [projectId, state, limit] : [projectId, limit];\n const rows = this.db.prepare(query).all(...params) as FrameRow[];\n\n return rows.map((row) => ({\n ...row,\n parent_frame_id: row.parent_frame_id ?? undefined,\n inputs: safeJsonParse<Record<string, unknown>>(row.inputs, {}),\n outputs: safeJsonParse<Record<string, unknown>>(row.outputs, {}),\n digest_json: safeJsonParse<Record<string, unknown>>(\n row.digest_json,\n {}\n ),\n })) as Frame[];\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to get frames for project: ${projectId}`,\n ErrorCode.DB_QUERY_FAILED,\n { projectId, state, operation: 'getFramesByProject' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Insert event\n */\n insertEvent(event: Omit<Event, 'ts'>): Event {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO events (event_id, frame_id, run_id, seq, event_type, payload)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const result = stmt.run(\n event.event_id,\n event.frame_id,\n event.run_id,\n event.seq,\n event.event_type,\n JSON.stringify(event.payload)\n );\n\n if (result.changes === 0) {\n throw new DatabaseError(\n 'Event insertion failed - no rows affected',\n ErrorCode.DB_INSERT_FAILED,\n {\n eventId: event.event_id,\n frameId: event.frame_id,\n operation: 'insertEvent',\n }\n );\n }\n\n // Return the created event with timestamp\n const createdEvent = this.db\n .prepare('SELECT * FROM events WHERE event_id = ?')\n .get(event.event_id) as EventRow;\n\n return {\n ...createdEvent,\n payload: safeJsonParse<Record<string, unknown>>(\n createdEvent.payload,\n {}\n ),\n } as Event;\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to insert event: ${event.event_id}`,\n ErrorCode.DB_INSERT_FAILED,\n {\n eventId: event.event_id,\n frameId: event.frame_id,\n operation: 'insertEvent',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get events for a frame\n */\n getFrameEvents(\n frameId: string,\n limit: number = DEFAULT_EVENT_LIMIT\n ): Event[] {\n try {\n const query =\n 'SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?';\n const params = [frameId, limit];\n const rows = this.db.prepare(query).all(...params) as EventRow[];\n\n return rows.map((row) => ({\n ...row,\n payload: safeJsonParse<Record<string, unknown>>(row.payload, {}),\n })) as Event[];\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to get events for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n { frameId, limit, operation: 'getFrameEvents' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get next event sequence number\n */\n getNextEventSequence(frameId: string): number {\n try {\n const result = this.db\n .prepare('SELECT MAX(seq) as max_seq FROM events WHERE frame_id = ?')\n .get(frameId) as MaxSeqRow;\n\n return (result.max_seq || 0) + 1;\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to get next event sequence for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n { frameId, operation: 'getNextEventSequence' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Insert anchor\n */\n insertAnchor(anchor: Omit<Anchor, 'created_at'>): Anchor {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO anchors (anchor_id, frame_id, type, text, priority, metadata)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const result = stmt.run(\n anchor.anchor_id,\n anchor.frame_id,\n anchor.type,\n anchor.text,\n anchor.priority,\n JSON.stringify(anchor.metadata)\n );\n\n if (result.changes === 0) {\n throw new DatabaseError(\n 'Anchor insertion failed - no rows affected',\n ErrorCode.DB_INSERT_FAILED,\n {\n anchorId: anchor.anchor_id,\n frameId: anchor.frame_id,\n operation: 'insertAnchor',\n }\n );\n }\n\n // Return the created anchor with timestamp\n const createdAnchor = this.db\n .prepare('SELECT * FROM anchors WHERE anchor_id = ?')\n .get(anchor.anchor_id) as AnchorRow;\n\n return {\n ...createdAnchor,\n metadata: safeJsonParse<Record<string, unknown>>(\n createdAnchor.metadata,\n {}\n ),\n } as Anchor;\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to insert anchor: ${anchor.anchor_id}`,\n ErrorCode.DB_INSERT_FAILED,\n {\n anchorId: anchor.anchor_id,\n frameId: anchor.frame_id,\n operation: 'insertAnchor',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get anchors for a frame\n */\n getFrameAnchors(\n frameId: string,\n limit: number = DEFAULT_ANCHOR_LIMIT\n ): Anchor[] {\n try {\n const rows = this.db\n .prepare(\n 'SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC LIMIT ?'\n )\n .all(frameId, limit) as AnchorRow[];\n\n return rows.map((row) => ({\n ...row,\n metadata: safeJsonParse<Record<string, unknown>>(row.metadata, {}),\n })) as Anchor[];\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to get anchors for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n { frameId, operation: 'getFrameAnchors' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Delete frame and all related data\n */\n deleteFrame(frameId: string): void {\n try {\n // Delete in order due to foreign keys\n this.db.prepare('DELETE FROM anchors WHERE frame_id = ?').run(frameId);\n this.db.prepare('DELETE FROM events WHERE frame_id = ?').run(frameId);\n this.db.prepare('DELETE FROM frames WHERE frame_id = ?').run(frameId);\n\n logger.info('Frame deleted', { frameId });\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to delete frame: ${frameId}`,\n ErrorCode.DB_DELETE_FAILED,\n { frameId, operation: 'deleteFrame' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Count frames by project and state (without loading all data)\n */\n countFrames(projectId?: string, state?: 'active' | 'closed'): number {\n try {\n let query = 'SELECT COUNT(*) as count FROM frames';\n const params: (string | undefined)[] = [];\n\n if (projectId) {\n query += ' WHERE project_id = ?';\n params.push(projectId);\n if (state) {\n query += ' AND state = ?';\n params.push(state);\n }\n } else if (state) {\n query += ' WHERE state = ?';\n params.push(state);\n }\n\n const result = this.db.prepare(query).get(...params) as CountRow;\n return result.count;\n } catch (error: unknown) {\n logger.warn('Failed to count frames', { error, projectId, state });\n return 0;\n }\n }\n\n /**\n * Get database statistics\n */\n getStatistics(): Record<string, number> {\n try {\n const frameCount = this.db\n .prepare('SELECT COUNT(*) as count FROM frames')\n .get() as CountRow;\n const eventCount = this.db\n .prepare('SELECT COUNT(*) as count FROM events')\n .get() as CountRow;\n const anchorCount = this.db\n .prepare('SELECT COUNT(*) as count FROM anchors')\n .get() as CountRow;\n const activeFrames = this.db\n .prepare(\"SELECT COUNT(*) as count FROM frames WHERE state = 'active'\")\n .get() as CountRow;\n\n return {\n totalFrames: frameCount.count,\n totalEvents: eventCount.count,\n totalAnchors: anchorCount.count,\n activeFrames: activeFrames.count,\n };\n } catch (error: unknown) {\n logger.warn('Failed to get database statistics', {\n error: error instanceof Error ? error.message : String(error),\n });\n return {};\n }\n }\n}\n"],
5
- "mappings": ";;;;AAOA,SAAS,cAAc;AACvB,SAAS,eAAe,iBAAiB;AAiDlC,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAGpC,SAAS,cAAiB,MAAiC,UAAgB;AACzE,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO,KAAK,wCAAwC;AAAA,MAClD,MAAM,KAAK,UAAU,GAAG,GAAG;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAEO,MAAM,cAAc;AAAA,EACzB,YAAoB,IAAuB;AAAvB;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA,EAK5C,aAAmB;AACjB,QAAI;AAEF,WAAK,GAAG,OAAO,oBAAoB;AACnC,WAAK,GAAG,OAAO,sBAAsB;AAErC,WAAK,GAAG,OAAO,mBAAmB;AAGlC,WAAK,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAkBZ;AAGD,WAAK,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWZ;AAGD,WAAK,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWZ;AAGD,WAAK,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,OAKZ;AAED,aAAO,KAAK,mCAAmC;AAAA,IACjD,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV,EAAE,WAAW,aAAa;AAAA,QAC1B,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAuD;AACjE,QAAI;AACF,YAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,OAG5B;AAED,YAAM,SAAS,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM,mBAAmB;AAAA,QACzB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK,UAAU,MAAM,MAAM;AAAA,QAC3B,KAAK,UAAU,MAAM,OAAO;AAAA,QAC5B,KAAK,UAAU,MAAM,WAAW;AAAA,MAClC;AAEA,UAAI,OAAO,YAAY,GAAG;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV,EAAE,SAAS,MAAM,UAAU,WAAW,cAAc;AAAA,QACtD;AAAA,MACF;AAGA,YAAM,eAAe,KAAK,SAAS,MAAM,QAAQ;AACjD,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV,EAAE,SAAS,MAAM,UAAU,WAAW,cAAc;AAAA,QACtD;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,2BAA2B,MAAM,QAAQ;AAAA,QACzC,UAAU;AAAA,QACV;AAAA,UACE,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,WAAW;AAAA,QACb;AAAA,QACA,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAoC;AAC3C,QAAI;AACF,YAAM,MAAM,KAAK,GACd,QAAQ,yCAAyC,EACjD,IAAI,OAAO;AAEd,UAAI,CAAC,IAAK,QAAO;AAEjB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,IAAI,mBAAmB;AAAA,QACxC,QAAQ,cAAuC,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC7D,SAAS,cAAuC,IAAI,SAAS,CAAC,CAAC;AAAA,QAC/D,aAAa;AAAA,UACX,IAAI;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,KAAK,wBAAwB,OAAO,IAAI,EAAE,MAAM,CAAC;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAiB,SAA+B;AAC1D,QAAI;AACF,YAAM,aAAuB,CAAC;AAC9B,YAAM,SAAqC,CAAC;AAE5C,UAAI,QAAQ,UAAU,QAAW;AAC/B,mBAAW,KAAK,WAAW;AAC3B,eAAO,KAAK,QAAQ,KAAK;AAAA,MAC3B;AAEA,UAAI,QAAQ,YAAY,QAAW;AACjC,mBAAW,KAAK,aAAa;AAC7B,eAAO,KAAK,KAAK,UAAU,QAAQ,OAAO,CAAC;AAAA,MAC7C;AAEA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,mBAAW,KAAK,iBAAiB;AACjC,eAAO,KAAK,QAAQ,WAAW;AAAA,MACjC;AAEA,UAAI,QAAQ,gBAAgB,QAAW;AACrC,mBAAW,KAAK,iBAAiB;AACjC,eAAO,KAAK,KAAK,UAAU,QAAQ,WAAW,CAAC;AAAA,MACjD;AAEA,UAAI,QAAQ,cAAc,QAAW;AACnC,mBAAW,KAAK,eAAe;AAC/B,eAAO,KAAK,QAAQ,SAAS;AAAA,MAC/B;AAEA,UAAI,QAAQ,oBAAoB,QAAW;AACzC,mBAAW,KAAK,qBAAqB;AACrC,eAAO,KAAK,QAAQ,eAAe;AAAA,MACrC;AAEA,UAAI,QAAQ,UAAU,QAAW;AAC/B,mBAAW,KAAK,WAAW;AAC3B,eAAO,KAAK,QAAQ,KAAK;AAAA,MAC3B;AAEA,UAAI,WAAW,WAAW,GAAG;AAC3B;AAAA,MACF;AAEA,aAAO,KAAK,OAAO;AAEnB,YAAM,OAAO,KAAK,GAAG,QAAQ;AAAA,4BACP,WAAW,KAAK,IAAI,CAAC;AAAA,OAC1C;AAED,YAAM,SAAS,KAAK,IAAI,GAAG,MAAM;AAEjC,UAAI,OAAO,YAAY,GAAG;AACxB,cAAM,IAAI;AAAA,UACR,oBAAoB,OAAO;AAAA,UAC3B,UAAU;AAAA,UACV,EAAE,SAAS,WAAW,cAAc;AAAA,QACtC;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,2BAA2B,OAAO;AAAA,QAClC,UAAU;AAAA,QACV,EAAE,SAAS,SAAS,WAAW,cAAc;AAAA,QAC7C,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,WACA,OACA,QAAgB,qBACP;AACT,QAAI;AACF,YAAM,QAAQ,QACV,wFACA;AAEJ,YAAM,SAAS,QAAQ,CAAC,WAAW,OAAO,KAAK,IAAI,CAAC,WAAW,KAAK;AACpE,YAAM,OAAO,KAAK,GAAG,QAAQ,KAAK,EAAE,IAAI,GAAG,MAAM;AAEjD,aAAO,KAAK,IAAI,CAAC,SAAS;AAAA,QACxB,GAAG;AAAA,QACH,iBAAiB,IAAI,mBAAmB;AAAA,QACxC,QAAQ,cAAuC,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC7D,SAAS,cAAuC,IAAI,SAAS,CAAC,CAAC;AAAA,QAC/D,aAAa;AAAA,UACX,IAAI;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF,EAAE;AAAA,IACJ,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,qCAAqC,SAAS;AAAA,QAC9C,UAAU;AAAA,QACV,EAAE,WAAW,OAAO,WAAW,qBAAqB;AAAA,QACpD,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAiC;AAC3C,QAAI;AACF,YAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,OAG5B;AAED,YAAM,SAAS,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK,UAAU,MAAM,OAAO;AAAA,MAC9B;AAEA,UAAI,OAAO,YAAY,GAAG;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,YACE,SAAS,MAAM;AAAA,YACf,SAAS,MAAM;AAAA,YACf,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAGA,YAAM,eAAe,KAAK,GACvB,QAAQ,yCAAyC,EACjD,IAAI,MAAM,QAAQ;AAErB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,UACP,aAAa;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,2BAA2B,MAAM,QAAQ;AAAA,QACzC,UAAU;AAAA,QACV;AAAA,UACE,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf,WAAW;AAAA,QACb;AAAA,QACA,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,SACA,QAAgB,qBACP;AACT,QAAI;AACF,YAAM,QACJ;AACF,YAAM,SAAS,CAAC,SAAS,KAAK;AAC9B,YAAM,OAAO,KAAK,GAAG,QAAQ,KAAK,EAAE,IAAI,GAAG,MAAM;AAEjD,aAAO,KAAK,IAAI,CAAC,SAAS;AAAA,QACxB,GAAG;AAAA,QACH,SAAS,cAAuC,IAAI,SAAS,CAAC,CAAC;AAAA,MACjE,EAAE;AAAA,IACJ,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,mCAAmC,OAAO;AAAA,QAC1C,UAAU;AAAA,QACV,EAAE,SAAS,OAAO,WAAW,iBAAiB;AAAA,QAC9C,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,SAAyB;AAC5C,QAAI;AACF,YAAM,SAAS,KAAK,GACjB,QAAQ,2DAA2D,EACnE,IAAI,OAAO;AAEd,cAAQ,OAAO,WAAW,KAAK;AAAA,IACjC,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,gDAAgD,OAAO;AAAA,QACvD,UAAU;AAAA,QACV,EAAE,SAAS,WAAW,uBAAuB;AAAA,QAC7C,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAA4C;AACvD,QAAI;AACF,YAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,OAG5B;AAED,YAAM,SAAS,KAAK;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,KAAK,UAAU,OAAO,QAAQ;AAAA,MAChC;AAEA,UAAI,OAAO,YAAY,GAAG;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,YACE,UAAU,OAAO;AAAA,YACjB,SAAS,OAAO;AAAA,YAChB,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAGA,YAAM,gBAAgB,KAAK,GACxB,QAAQ,2CAA2C,EACnD,IAAI,OAAO,SAAS;AAEvB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,UACR,cAAc;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,4BAA4B,OAAO,SAAS;AAAA,QAC5C,UAAU;AAAA,QACV;AAAA,UACE,UAAU,OAAO;AAAA,UACjB,SAAS,OAAO;AAAA,UAChB,WAAW;AAAA,QACb;AAAA,QACA,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBACE,SACA,QAAgB,sBACN;AACV,QAAI;AACF,YAAM,OAAO,KAAK,GACf;AAAA,QACC;AAAA,MACF,EACC,IAAI,SAAS,KAAK;AAErB,aAAO,KAAK,IAAI,CAAC,SAAS;AAAA,QACxB,GAAG;AAAA,QACH,UAAU,cAAuC,IAAI,UAAU,CAAC,CAAC;AAAA,MACnE,EAAE;AAAA,IACJ,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,oCAAoC,OAAO;AAAA,QAC3C,UAAU;AAAA,QACV,EAAE,SAAS,WAAW,kBAAkB;AAAA,QACxC,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAuB;AACjC,QAAI;AAEF,WAAK,GAAG,QAAQ,wCAAwC,EAAE,IAAI,OAAO;AACrE,WAAK,GAAG,QAAQ,uCAAuC,EAAE,IAAI,OAAO;AACpE,WAAK,GAAG,QAAQ,uCAAuC,EAAE,IAAI,OAAO;AAEpE,aAAO,KAAK,iBAAiB,EAAE,QAAQ,CAAC;AAAA,IAC1C,SAAS,OAAgB;AACvB,YAAM,IAAI;AAAA,QACR,2BAA2B,OAAO;AAAA,QAClC,UAAU;AAAA,QACV,EAAE,SAAS,WAAW,cAAc;AAAA,QACpC,iBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAAoB,OAAqC;AACnE,QAAI;AACF,UAAI,QAAQ;AACZ,YAAM,SAAiC,CAAC;AAExC,UAAI,WAAW;AACb,iBAAS;AACT,eAAO,KAAK,SAAS;AACrB,YAAI,OAAO;AACT,mBAAS;AACT,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF,WAAW,OAAO;AAChB,iBAAS;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAEA,YAAM,SAAS,KAAK,GAAG,QAAQ,KAAK,EAAE,IAAI,GAAG,MAAM;AACnD,aAAO,OAAO;AAAA,IAChB,SAAS,OAAgB;AACvB,aAAO,KAAK,0BAA0B,EAAE,OAAO,WAAW,MAAM,CAAC;AACjE,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwC;AACtC,QAAI;AACF,YAAM,aAAa,KAAK,GACrB,QAAQ,sCAAsC,EAC9C,IAAI;AACP,YAAM,aAAa,KAAK,GACrB,QAAQ,sCAAsC,EAC9C,IAAI;AACP,YAAM,cAAc,KAAK,GACtB,QAAQ,uCAAuC,EAC/C,IAAI;AACP,YAAM,eAAe,KAAK,GACvB,QAAQ,6DAA6D,EACrE,IAAI;AAEP,aAAO;AAAA,QACL,aAAa,WAAW;AAAA,QACxB,aAAa,WAAW;AAAA,QACxB,cAAc,YAAY;AAAA,QAC1B,cAAc,aAAa;AAAA,MAC7B;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,KAAK,qCAAqC;AAAA,QAC/C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;",
6
- "names": []
7
- }