@stackmemoryai/stackmemory 0.3.0 → 0.3.3

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 (736) hide show
  1. package/README.md +52 -272
  2. package/dist/cli/codex-sm.js +48 -19
  3. package/dist/cli/codex-sm.js.map +2 -2
  4. package/dist/cli/commands/clear.js +191 -0
  5. package/dist/cli/commands/clear.js.map +7 -0
  6. package/dist/cli/commands/config.js +152 -1
  7. package/dist/cli/commands/config.js.map +2 -2
  8. package/dist/cli/commands/dashboard.js +178 -0
  9. package/dist/cli/commands/dashboard.js.map +7 -0
  10. package/dist/cli/commands/handoff.js +125 -8
  11. package/dist/cli/commands/handoff.js.map +2 -2
  12. package/dist/cli/commands/linear-create.js +132 -0
  13. package/dist/cli/commands/linear-create.js.map +7 -0
  14. package/dist/cli/commands/linear-list.js +69 -0
  15. package/dist/cli/commands/linear-list.js.map +7 -0
  16. package/dist/cli/commands/linear-migrate.js +40 -0
  17. package/dist/cli/commands/linear-migrate.js.map +7 -0
  18. package/dist/cli/commands/linear.js +185 -36
  19. package/dist/cli/commands/linear.js.map +2 -2
  20. package/dist/cli/commands/monitor.js +309 -0
  21. package/dist/cli/commands/monitor.js.map +7 -0
  22. package/dist/cli/commands/quality.js +414 -0
  23. package/dist/cli/commands/quality.js.map +7 -0
  24. package/dist/cli/commands/storage.js +275 -0
  25. package/dist/cli/commands/storage.js.map +7 -0
  26. package/dist/cli/commands/tui.js +66 -0
  27. package/dist/cli/commands/tui.js.map +7 -0
  28. package/dist/cli/commands/workflow.js +134 -0
  29. package/dist/cli/commands/workflow.js.map +7 -0
  30. package/dist/cli/index.js +105 -9
  31. package/dist/cli/index.js.map +3 -3
  32. package/dist/core/analytics/team-analytics.js +374 -0
  33. package/dist/core/analytics/team-analytics.js.map +7 -0
  34. package/dist/core/context/context-bridge.js +234 -0
  35. package/dist/core/context/context-bridge.js.map +7 -0
  36. package/dist/core/context/dual-stack-manager.js +850 -0
  37. package/dist/core/context/dual-stack-manager.js.map +7 -0
  38. package/dist/core/context/frame-handoff-manager.js +384 -0
  39. package/dist/core/context/frame-handoff-manager.js.map +7 -0
  40. package/dist/core/context/frame-manager.js +132 -12
  41. package/dist/core/context/frame-manager.js.map +2 -2
  42. package/dist/core/context/permission-manager.js +181 -0
  43. package/dist/core/context/permission-manager.js.map +7 -0
  44. package/dist/core/context/shared-context-layer.js +386 -0
  45. package/dist/core/context/shared-context-layer.js.map +7 -0
  46. package/dist/core/context/stack-merge-resolver.js +600 -0
  47. package/dist/core/context/stack-merge-resolver.js.map +7 -0
  48. package/dist/core/context/validation.js +121 -0
  49. package/dist/core/context/validation.js.map +7 -0
  50. package/dist/core/database/connection-pool.js +266 -175
  51. package/dist/core/database/connection-pool.js.map +2 -2
  52. package/dist/core/database/database-adapter.js +51 -0
  53. package/dist/core/database/database-adapter.js.map +7 -0
  54. package/dist/core/database/migration-manager.js +514 -0
  55. package/dist/core/database/migration-manager.js.map +7 -0
  56. package/dist/core/database/paradedb-adapter.js +970 -0
  57. package/dist/core/database/paradedb-adapter.js.map +7 -0
  58. package/dist/core/database/query-router.js +421 -0
  59. package/dist/core/database/query-router.js.map +7 -0
  60. package/dist/core/database/sqlite-adapter.js +547 -0
  61. package/dist/core/database/sqlite-adapter.js.map +7 -0
  62. package/dist/core/errors/index.js +21 -1
  63. package/dist/core/errors/index.js.map +2 -2
  64. package/dist/core/frame/workflow-templates-stub.js +42 -0
  65. package/dist/core/frame/workflow-templates-stub.js.map +7 -0
  66. package/dist/core/frame/workflow-templates.js +276 -0
  67. package/dist/core/frame/workflow-templates.js.map +7 -0
  68. package/dist/core/merge/conflict-detector.js +5 -2
  69. package/dist/core/merge/conflict-detector.js.map +2 -2
  70. package/dist/core/merge/resolution-engine.js +3 -14
  71. package/dist/core/merge/resolution-engine.js.map +2 -2
  72. package/dist/core/merge/stack-diff.js.map +2 -2
  73. package/dist/core/monitoring/logger.js +18 -3
  74. package/dist/core/monitoring/logger.js.map +2 -2
  75. package/dist/core/monitoring/session-monitor.js +296 -0
  76. package/dist/core/monitoring/session-monitor.js.map +7 -0
  77. package/dist/core/retrieval/context-retriever.js +475 -0
  78. package/dist/core/retrieval/context-retriever.js.map +7 -0
  79. package/dist/core/retrieval/graph-retrieval.js +658 -0
  80. package/dist/core/retrieval/graph-retrieval.js.map +7 -0
  81. package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
  82. package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
  83. package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
  84. package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
  85. package/dist/core/session/clear-survival-stub.js +49 -0
  86. package/dist/core/session/clear-survival-stub.js.map +7 -0
  87. package/dist/core/session/clear-survival.js +426 -0
  88. package/dist/core/session/clear-survival.js.map +7 -0
  89. package/dist/core/session/handoff-generator.js +339 -0
  90. package/dist/core/session/handoff-generator.js.map +7 -0
  91. package/dist/core/session/session-manager.js +61 -26
  92. package/dist/core/session/session-manager.js.map +3 -3
  93. package/dist/core/skills/index.js +3 -0
  94. package/dist/core/skills/index.js.map +7 -0
  95. package/dist/core/skills/skill-storage.js +749 -0
  96. package/dist/core/skills/skill-storage.js.map +7 -0
  97. package/dist/core/skills/types.js +189 -0
  98. package/dist/core/skills/types.js.map +7 -0
  99. package/dist/core/storage/railway-optimized-storage.js +550 -0
  100. package/dist/core/storage/railway-optimized-storage.js.map +7 -0
  101. package/dist/core/storage/remote-storage.js +456 -0
  102. package/dist/core/storage/remote-storage.js.map +7 -0
  103. package/dist/core/trace/trace-detector.js +136 -5
  104. package/dist/core/trace/trace-detector.js.map +2 -2
  105. package/dist/core/trace/trace-store.js.map +2 -2
  106. package/dist/features/tui/components/analytics-panel.js +136 -0
  107. package/dist/features/tui/components/analytics-panel.js.map +7 -0
  108. package/dist/features/tui/components/frame-visualizer.js +377 -0
  109. package/dist/features/tui/components/frame-visualizer.js.map +7 -0
  110. package/dist/features/tui/components/pr-tracker.js +123 -0
  111. package/dist/features/tui/components/pr-tracker.js.map +7 -0
  112. package/dist/features/tui/components/session-monitor.js +286 -0
  113. package/dist/features/tui/components/session-monitor.js.map +7 -0
  114. package/dist/features/tui/components/subagent-fleet.js +388 -0
  115. package/dist/features/tui/components/subagent-fleet.js.map +7 -0
  116. package/dist/features/tui/components/task-board.js +475 -0
  117. package/dist/features/tui/components/task-board.js.map +7 -0
  118. package/dist/features/tui/index.js +397 -0
  119. package/dist/features/tui/index.js.map +7 -0
  120. package/dist/features/tui/services/data-service.js +654 -0
  121. package/dist/features/tui/services/data-service.js.map +7 -0
  122. package/dist/features/tui/services/websocket-client.js +149 -0
  123. package/dist/features/tui/services/websocket-client.js.map +7 -0
  124. package/dist/features/tui/terminal-compat.js +205 -0
  125. package/dist/features/tui/terminal-compat.js.map +7 -0
  126. package/dist/features/tui/types.js +1 -0
  127. package/dist/features/tui/types.js.map +7 -0
  128. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
  129. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  130. package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
  131. package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  132. package/dist/integrations/claude-code/post-task-hooks.js +541 -0
  133. package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
  134. package/dist/integrations/linear/client.js +22 -4
  135. package/dist/integrations/linear/client.js.map +2 -2
  136. package/dist/integrations/linear/migration.js +299 -0
  137. package/dist/integrations/linear/migration.js.map +7 -0
  138. package/dist/integrations/linear/oauth-server.js +396 -0
  139. package/dist/integrations/linear/oauth-server.js.map +7 -0
  140. package/dist/integrations/linear/rest-client.js +199 -0
  141. package/dist/integrations/linear/rest-client.js.map +7 -0
  142. package/dist/integrations/linear/sync.js +14 -2
  143. package/dist/integrations/linear/sync.js.map +2 -2
  144. package/dist/integrations/linear/webhook-handler.js +200 -0
  145. package/dist/integrations/linear/webhook-handler.js.map +7 -0
  146. package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
  147. package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  148. package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
  149. package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  150. package/dist/integrations/mcp/refactored-server.js +31 -3
  151. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  152. package/dist/integrations/mcp/server.js +25 -7
  153. package/dist/integrations/mcp/server.js.map +2 -2
  154. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  155. package/dist/models/user.model.js +3 -0
  156. package/dist/models/user.model.js.map +2 -2
  157. package/dist/services/context-service.js.map +2 -2
  158. package/dist/utils/formatting.js +58 -0
  159. package/dist/utils/formatting.js.map +7 -0
  160. package/package.json +24 -5
  161. package/dist/cli/__tests__/index.test.js +0 -290
  162. package/dist/cli/__tests__/index.test.js.map +0 -7
  163. package/dist/core/config/__tests__/config-manager.test.js +0 -248
  164. package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
  165. package/dist/core/context/__tests__/frame-manager.test.js +0 -879
  166. package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
  167. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
  168. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
  169. package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
  170. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
  171. package/dist/core/errors/__tests__/error-handling.test.js +0 -270
  172. package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
  173. package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
  174. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
  175. package/dist/core/query/__tests__/query-parser.test.js +0 -301
  176. package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
  177. package/dist/core/query/__tests__/query-templates.test.js +0 -210
  178. package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
  179. package/dist/core/trace/trace-detector.test.js +0 -401
  180. package/dist/core/trace/trace-detector.test.js.map +0 -7
  181. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
  182. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
  183. package/dist/integrations/linear/__tests__/auth.test.js +0 -558
  184. package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
  185. package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
  186. package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
  187. package/dist/integrations/mcp/__tests__/server.test.js +0 -798
  188. package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
  189. package/dist/scripts/benchmark-performance.d.ts +0 -7
  190. package/dist/scripts/benchmark-performance.d.ts.map +0 -1
  191. package/dist/scripts/benchmark-performance.js +0 -44
  192. package/dist/scripts/benchmark-performance.js.map +0 -1
  193. package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
  194. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
  195. package/dist/scripts/cancel-duplicate-tasks.js +0 -172
  196. package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
  197. package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
  198. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
  199. package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
  200. package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
  201. package/dist/scripts/initialize.d.ts +0 -6
  202. package/dist/scripts/initialize.d.ts.map +0 -1
  203. package/dist/scripts/initialize.js +0 -93
  204. package/dist/scripts/initialize.js.map +0 -1
  205. package/dist/scripts/list-linear-tasks.d.ts +0 -6
  206. package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
  207. package/dist/scripts/list-linear-tasks.js +0 -121
  208. package/dist/scripts/list-linear-tasks.js.map +0 -1
  209. package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
  210. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
  211. package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
  212. package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
  213. package/dist/scripts/show-linear-summary.d.ts +0 -6
  214. package/dist/scripts/show-linear-summary.d.ts.map +0 -1
  215. package/dist/scripts/show-linear-summary.js +0 -120
  216. package/dist/scripts/show-linear-summary.js.map +0 -1
  217. package/dist/scripts/status.d.ts +0 -6
  218. package/dist/scripts/status.d.ts.map +0 -1
  219. package/dist/scripts/status.js +0 -101
  220. package/dist/scripts/status.js.map +0 -1
  221. package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
  222. package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
  223. package/dist/src/agents/core/agent-task-manager.js +0 -504
  224. package/dist/src/agents/core/agent-task-manager.js.map +0 -1
  225. package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
  226. package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
  227. package/dist/src/agents/verifiers/base-verifier.js +0 -130
  228. package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
  229. package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
  230. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
  231. package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
  232. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
  233. package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
  234. package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
  235. package/dist/src/agents/verifiers/llm-judge.js +0 -248
  236. package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
  237. package/dist/src/cli/auto-detect.d.ts +0 -61
  238. package/dist/src/cli/auto-detect.d.ts.map +0 -1
  239. package/dist/src/cli/auto-detect.js +0 -350
  240. package/dist/src/cli/auto-detect.js.map +0 -1
  241. package/dist/src/cli/browser-test.d.ts +0 -6
  242. package/dist/src/cli/browser-test.d.ts.map +0 -1
  243. package/dist/src/cli/browser-test.js +0 -32
  244. package/dist/src/cli/browser-test.js.map +0 -1
  245. package/dist/src/cli/claude-sm.d.ts +0 -7
  246. package/dist/src/cli/claude-sm.d.ts.map +0 -1
  247. package/dist/src/cli/claude-sm.js +0 -412
  248. package/dist/src/cli/claude-sm.js.map +0 -1
  249. package/dist/src/cli/commands/agent.d.ts +0 -9
  250. package/dist/src/cli/commands/agent.d.ts.map +0 -1
  251. package/dist/src/cli/commands/agent.js +0 -303
  252. package/dist/src/cli/commands/agent.js.map +0 -1
  253. package/dist/src/cli/commands/config.d.ts +0 -6
  254. package/dist/src/cli/commands/config.d.ts.map +0 -1
  255. package/dist/src/cli/commands/config.js +0 -224
  256. package/dist/src/cli/commands/config.js.map +0 -1
  257. package/dist/src/cli/commands/context.d.ts +0 -7
  258. package/dist/src/cli/commands/context.d.ts.map +0 -1
  259. package/dist/src/cli/commands/context.js +0 -365
  260. package/dist/src/cli/commands/context.js.map +0 -1
  261. package/dist/src/cli/commands/handoff.d.ts +0 -6
  262. package/dist/src/cli/commands/handoff.d.ts.map +0 -1
  263. package/dist/src/cli/commands/handoff.js +0 -212
  264. package/dist/src/cli/commands/handoff.js.map +0 -1
  265. package/dist/src/cli/commands/linear-test.d.ts +0 -6
  266. package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
  267. package/dist/src/cli/commands/linear-test.js +0 -123
  268. package/dist/src/cli/commands/linear-test.js.map +0 -1
  269. package/dist/src/cli/commands/linear.d.ts +0 -6
  270. package/dist/src/cli/commands/linear.d.ts.map +0 -1
  271. package/dist/src/cli/commands/linear.js +0 -393
  272. package/dist/src/cli/commands/linear.js.map +0 -1
  273. package/dist/src/cli/commands/log.d.ts +0 -7
  274. package/dist/src/cli/commands/log.d.ts.map +0 -1
  275. package/dist/src/cli/commands/log.js +0 -168
  276. package/dist/src/cli/commands/log.js.map +0 -1
  277. package/dist/src/cli/commands/onboard.d.ts +0 -8
  278. package/dist/src/cli/commands/onboard.d.ts.map +0 -1
  279. package/dist/src/cli/commands/onboard.js +0 -363
  280. package/dist/src/cli/commands/onboard.js.map +0 -1
  281. package/dist/src/cli/commands/projects.d.ts +0 -8
  282. package/dist/src/cli/commands/projects.d.ts.map +0 -1
  283. package/dist/src/cli/commands/projects.js +0 -220
  284. package/dist/src/cli/commands/projects.js.map +0 -1
  285. package/dist/src/cli/commands/search.d.ts +0 -7
  286. package/dist/src/cli/commands/search.d.ts.map +0 -1
  287. package/dist/src/cli/commands/search.js +0 -162
  288. package/dist/src/cli/commands/search.js.map +0 -1
  289. package/dist/src/cli/commands/session.d.ts +0 -7
  290. package/dist/src/cli/commands/session.d.ts.map +0 -1
  291. package/dist/src/cli/commands/session.js +0 -222
  292. package/dist/src/cli/commands/session.js.map +0 -1
  293. package/dist/src/cli/commands/tasks.d.ts +0 -7
  294. package/dist/src/cli/commands/tasks.d.ts.map +0 -1
  295. package/dist/src/cli/commands/tasks.js +0 -229
  296. package/dist/src/cli/commands/tasks.js.map +0 -1
  297. package/dist/src/cli/commands/webhook.d.ts +0 -3
  298. package/dist/src/cli/commands/webhook.d.ts.map +0 -1
  299. package/dist/src/cli/commands/webhook.js +0 -157
  300. package/dist/src/cli/commands/webhook.js.map +0 -1
  301. package/dist/src/cli/commands/worktree.d.ts +0 -8
  302. package/dist/src/cli/commands/worktree.d.ts.map +0 -1
  303. package/dist/src/cli/commands/worktree.js +0 -339
  304. package/dist/src/cli/commands/worktree.js.map +0 -1
  305. package/dist/src/cli/index.d.ts +0 -8
  306. package/dist/src/cli/index.d.ts.map +0 -1
  307. package/dist/src/cli/index.js +0 -995
  308. package/dist/src/cli/index.js.map +0 -1
  309. package/dist/src/cli/utils/viewer.d.ts +0 -3
  310. package/dist/src/cli/utils/viewer.d.ts.map +0 -1
  311. package/dist/src/cli/utils/viewer.js +0 -91
  312. package/dist/src/cli/utils/viewer.js.map +0 -1
  313. package/dist/src/core/config/config-manager.d.ts +0 -95
  314. package/dist/src/core/config/config-manager.d.ts.map +0 -1
  315. package/dist/src/core/config/config-manager.js +0 -359
  316. package/dist/src/core/config/config-manager.js.map +0 -1
  317. package/dist/src/core/config/types.d.ts +0 -72
  318. package/dist/src/core/config/types.d.ts.map +0 -1
  319. package/dist/src/core/config/types.js +0 -127
  320. package/dist/src/core/config/types.js.map +0 -1
  321. package/dist/src/core/context/auto-context.d.ts +0 -22
  322. package/dist/src/core/context/auto-context.d.ts.map +0 -1
  323. package/dist/src/core/context/auto-context.js +0 -77
  324. package/dist/src/core/context/auto-context.js.map +0 -1
  325. package/dist/src/core/context/compaction-handler.d.ts +0 -119
  326. package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
  327. package/dist/src/core/context/compaction-handler.js +0 -306
  328. package/dist/src/core/context/compaction-handler.js.map +0 -1
  329. package/dist/src/core/context/frame-database.d.ts +0 -59
  330. package/dist/src/core/context/frame-database.d.ts.map +0 -1
  331. package/dist/src/core/context/frame-database.js +0 -333
  332. package/dist/src/core/context/frame-database.js.map +0 -1
  333. package/dist/src/core/context/frame-digest.d.ts +0 -59
  334. package/dist/src/core/context/frame-digest.d.ts.map +0 -1
  335. package/dist/src/core/context/frame-digest.js +0 -264
  336. package/dist/src/core/context/frame-digest.js.map +0 -1
  337. package/dist/src/core/context/frame-manager.d.ts +0 -112
  338. package/dist/src/core/context/frame-manager.d.ts.map +0 -1
  339. package/dist/src/core/context/frame-manager.js +0 -600
  340. package/dist/src/core/context/frame-manager.js.map +0 -1
  341. package/dist/src/core/context/frame-stack.d.ts +0 -85
  342. package/dist/src/core/context/frame-stack.d.ts.map +0 -1
  343. package/dist/src/core/context/frame-stack.js +0 -287
  344. package/dist/src/core/context/frame-stack.js.map +0 -1
  345. package/dist/src/core/context/frame-types.d.ts +0 -67
  346. package/dist/src/core/context/frame-types.d.ts.map +0 -1
  347. package/dist/src/core/context/frame-types.js +0 -6
  348. package/dist/src/core/context/frame-types.js.map +0 -1
  349. package/dist/src/core/context/index.d.ts +0 -11
  350. package/dist/src/core/context/index.d.ts.map +0 -1
  351. package/dist/src/core/context/index.js +0 -14
  352. package/dist/src/core/context/index.js.map +0 -1
  353. package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
  354. package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
  355. package/dist/src/core/context/model-aware-compaction.js +0 -616
  356. package/dist/src/core/context/model-aware-compaction.js.map +0 -1
  357. package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
  358. package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
  359. package/dist/src/core/context/refactored-frame-manager.js +0 -340
  360. package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
  361. package/dist/src/core/database/batch-operations.d.ts +0 -118
  362. package/dist/src/core/database/batch-operations.d.ts.map +0 -1
  363. package/dist/src/core/database/batch-operations.js +0 -339
  364. package/dist/src/core/database/batch-operations.js.map +0 -1
  365. package/dist/src/core/database/connection-pool.d.ts +0 -79
  366. package/dist/src/core/database/connection-pool.d.ts.map +0 -1
  367. package/dist/src/core/database/connection-pool.js +0 -236
  368. package/dist/src/core/database/connection-pool.js.map +0 -1
  369. package/dist/src/core/database/query-cache.d.ts +0 -135
  370. package/dist/src/core/database/query-cache.d.ts.map +0 -1
  371. package/dist/src/core/database/query-cache.js +0 -294
  372. package/dist/src/core/database/query-cache.js.map +0 -1
  373. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
  374. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
  375. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
  376. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
  377. package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
  378. package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
  379. package/dist/src/core/digest/frame-digest-integration.js +0 -198
  380. package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
  381. package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
  382. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
  383. package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
  384. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
  385. package/dist/src/core/digest/index.d.ts +0 -9
  386. package/dist/src/core/digest/index.d.ts.map +0 -1
  387. package/dist/src/core/digest/index.js +0 -9
  388. package/dist/src/core/digest/index.js.map +0 -1
  389. package/dist/src/core/digest/types.d.ts +0 -154
  390. package/dist/src/core/digest/types.d.ts.map +0 -1
  391. package/dist/src/core/digest/types.js +0 -18
  392. package/dist/src/core/digest/types.js.map +0 -1
  393. package/dist/src/core/errors/index.d.ts +0 -143
  394. package/dist/src/core/errors/index.d.ts.map +0 -1
  395. package/dist/src/core/errors/index.js +0 -282
  396. package/dist/src/core/errors/index.js.map +0 -1
  397. package/dist/src/core/errors/recovery.d.ts +0 -86
  398. package/dist/src/core/errors/recovery.d.ts.map +0 -1
  399. package/dist/src/core/errors/recovery.js +0 -274
  400. package/dist/src/core/errors/recovery.js.map +0 -1
  401. package/dist/src/core/merge/conflict-detector.d.ts +0 -122
  402. package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
  403. package/dist/src/core/merge/conflict-detector.js +0 -468
  404. package/dist/src/core/merge/conflict-detector.js.map +0 -1
  405. package/dist/src/core/merge/index.d.ts +0 -9
  406. package/dist/src/core/merge/index.d.ts.map +0 -1
  407. package/dist/src/core/merge/index.js +0 -9
  408. package/dist/src/core/merge/index.js.map +0 -1
  409. package/dist/src/core/merge/resolution-engine.d.ts +0 -120
  410. package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
  411. package/dist/src/core/merge/resolution-engine.js +0 -573
  412. package/dist/src/core/merge/resolution-engine.js.map +0 -1
  413. package/dist/src/core/merge/stack-diff.d.ts +0 -97
  414. package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
  415. package/dist/src/core/merge/stack-diff.js +0 -516
  416. package/dist/src/core/merge/stack-diff.js.map +0 -1
  417. package/dist/src/core/merge/types.d.ts +0 -110
  418. package/dist/src/core/merge/types.d.ts.map +0 -1
  419. package/dist/src/core/merge/types.js +0 -6
  420. package/dist/src/core/merge/types.js.map +0 -1
  421. package/dist/src/core/monitoring/error-handler.d.ts +0 -46
  422. package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
  423. package/dist/src/core/monitoring/error-handler.js +0 -212
  424. package/dist/src/core/monitoring/error-handler.js.map +0 -1
  425. package/dist/src/core/monitoring/logger.d.ts +0 -24
  426. package/dist/src/core/monitoring/logger.d.ts.map +0 -1
  427. package/dist/src/core/monitoring/logger.js +0 -126
  428. package/dist/src/core/monitoring/logger.js.map +0 -1
  429. package/dist/src/core/monitoring/metrics.d.ts +0 -10
  430. package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
  431. package/dist/src/core/monitoring/metrics.js +0 -152
  432. package/dist/src/core/monitoring/metrics.js.map +0 -1
  433. package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
  434. package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
  435. package/dist/src/core/monitoring/progress-tracker.js +0 -178
  436. package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
  437. package/dist/src/core/performance/context-cache.d.ts +0 -109
  438. package/dist/src/core/performance/context-cache.d.ts.map +0 -1
  439. package/dist/src/core/performance/context-cache.js +0 -280
  440. package/dist/src/core/performance/context-cache.js.map +0 -1
  441. package/dist/src/core/performance/index.d.ts +0 -3
  442. package/dist/src/core/performance/index.d.ts.map +0 -1
  443. package/dist/src/core/performance/index.js +0 -3
  444. package/dist/src/core/performance/index.js.map +0 -1
  445. package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
  446. package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
  447. package/dist/src/core/performance/lazy-context-loader.js +0 -332
  448. package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
  449. package/dist/src/core/performance/monitor.d.ts +0 -48
  450. package/dist/src/core/performance/monitor.d.ts.map +0 -1
  451. package/dist/src/core/performance/monitor.js +0 -226
  452. package/dist/src/core/performance/monitor.js.map +0 -1
  453. package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
  454. package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
  455. package/dist/src/core/performance/optimized-frame-context.js +0 -330
  456. package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
  457. package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
  458. package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
  459. package/dist/src/core/performance/performance-benchmark.js +0 -290
  460. package/dist/src/core/performance/performance-benchmark.js.map +0 -1
  461. package/dist/src/core/performance/performance-profiler.d.ts +0 -151
  462. package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
  463. package/dist/src/core/performance/performance-profiler.js +0 -346
  464. package/dist/src/core/performance/performance-profiler.js.map +0 -1
  465. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
  466. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
  467. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
  468. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
  469. package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
  470. package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
  471. package/dist/src/core/persistence/postgres-adapter.js +0 -330
  472. package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
  473. package/dist/src/core/projects/project-manager.d.ts +0 -130
  474. package/dist/src/core/projects/project-manager.d.ts.map +0 -1
  475. package/dist/src/core/projects/project-manager.js +0 -709
  476. package/dist/src/core/projects/project-manager.js.map +0 -1
  477. package/dist/src/core/query/query-parser.d.ts +0 -109
  478. package/dist/src/core/query/query-parser.d.ts.map +0 -1
  479. package/dist/src/core/query/query-parser.js +0 -415
  480. package/dist/src/core/query/query-parser.js.map +0 -1
  481. package/dist/src/core/query/query-templates.d.ts +0 -44
  482. package/dist/src/core/query/query-templates.d.ts.map +0 -1
  483. package/dist/src/core/query/query-templates.js +0 -326
  484. package/dist/src/core/query/query-templates.js.map +0 -1
  485. package/dist/src/core/retrieval/index.d.ts +0 -8
  486. package/dist/src/core/retrieval/index.d.ts.map +0 -1
  487. package/dist/src/core/retrieval/index.js +0 -8
  488. package/dist/src/core/retrieval/index.js.map +0 -1
  489. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
  490. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
  491. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
  492. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
  493. package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
  494. package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
  495. package/dist/src/core/retrieval/summary-generator.js +0 -622
  496. package/dist/src/core/retrieval/summary-generator.js.map +0 -1
  497. package/dist/src/core/retrieval/types.d.ts +0 -257
  498. package/dist/src/core/retrieval/types.d.ts.map +0 -1
  499. package/dist/src/core/retrieval/types.js +0 -18
  500. package/dist/src/core/retrieval/types.js.map +0 -1
  501. package/dist/src/core/session/index.d.ts +0 -2
  502. package/dist/src/core/session/index.d.ts.map +0 -1
  503. package/dist/src/core/session/index.js +0 -2
  504. package/dist/src/core/session/index.js.map +0 -1
  505. package/dist/src/core/session/session-manager.d.ts +0 -69
  506. package/dist/src/core/session/session-manager.d.ts.map +0 -1
  507. package/dist/src/core/session/session-manager.js +0 -311
  508. package/dist/src/core/session/session-manager.js.map +0 -1
  509. package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
  510. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
  511. package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
  512. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
  513. package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
  514. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
  515. package/dist/src/core/trace/db-trace-wrapper.js +0 -252
  516. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
  517. package/dist/src/core/trace/debug-trace.d.ts +0 -84
  518. package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
  519. package/dist/src/core/trace/debug-trace.js +0 -402
  520. package/dist/src/core/trace/debug-trace.js.map +0 -1
  521. package/dist/src/core/trace/error-test.d.ts +0 -6
  522. package/dist/src/core/trace/error-test.d.ts.map +0 -1
  523. package/dist/src/core/trace/error-test.js +0 -128
  524. package/dist/src/core/trace/error-test.js.map +0 -1
  525. package/dist/src/core/trace/index.d.ts +0 -25
  526. package/dist/src/core/trace/index.d.ts.map +0 -1
  527. package/dist/src/core/trace/index.js +0 -121
  528. package/dist/src/core/trace/index.js.map +0 -1
  529. package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
  530. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
  531. package/dist/src/core/trace/linear-api-wrapper.js +0 -205
  532. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
  533. package/dist/src/core/trace/performance-test.d.ts +0 -6
  534. package/dist/src/core/trace/performance-test.d.ts.map +0 -1
  535. package/dist/src/core/trace/performance-test.js +0 -111
  536. package/dist/src/core/trace/performance-test.js.map +0 -1
  537. package/dist/src/core/trace/trace-demo.d.ts +0 -8
  538. package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
  539. package/dist/src/core/trace/trace-demo.js +0 -154
  540. package/dist/src/core/trace/trace-demo.js.map +0 -1
  541. package/dist/src/core/trace/trace-detector.d.ts +0 -108
  542. package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
  543. package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
  544. package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
  545. package/dist/src/core/trace/trace-detector.demo.js +0 -145
  546. package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
  547. package/dist/src/core/trace/trace-detector.js +0 -425
  548. package/dist/src/core/trace/trace-detector.js.map +0 -1
  549. package/dist/src/core/trace/trace-store.d.ts +0 -60
  550. package/dist/src/core/trace/trace-store.d.ts.map +0 -1
  551. package/dist/src/core/trace/trace-store.js +0 -323
  552. package/dist/src/core/trace/trace-store.js.map +0 -1
  553. package/dist/src/core/trace/types.d.ts +0 -81
  554. package/dist/src/core/trace/types.d.ts.map +0 -1
  555. package/dist/src/core/trace/types.js +0 -70
  556. package/dist/src/core/trace/types.js.map +0 -1
  557. package/dist/src/core/types.d.ts +0 -35
  558. package/dist/src/core/types.d.ts.map +0 -1
  559. package/dist/src/core/types.js +0 -2
  560. package/dist/src/core/types.js.map +0 -1
  561. package/dist/src/core/utils/update-checker.d.ts +0 -38
  562. package/dist/src/core/utils/update-checker.d.ts.map +0 -1
  563. package/dist/src/core/utils/update-checker.js +0 -213
  564. package/dist/src/core/utils/update-checker.js.map +0 -1
  565. package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
  566. package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
  567. package/dist/src/core/worktree/worktree-manager.js +0 -456
  568. package/dist/src/core/worktree/worktree-manager.js.map +0 -1
  569. package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
  570. package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
  571. package/dist/src/features/analytics/api/analytics-api.js +0 -289
  572. package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
  573. package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
  574. package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
  575. package/dist/src/features/analytics/core/analytics-service.js +0 -275
  576. package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
  577. package/dist/src/features/analytics/index.d.ts +0 -12
  578. package/dist/src/features/analytics/index.d.ts.map +0 -1
  579. package/dist/src/features/analytics/index.js +0 -11
  580. package/dist/src/features/analytics/index.js.map +0 -1
  581. package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
  582. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
  583. package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
  584. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
  585. package/dist/src/features/analytics/types/metrics.d.ts +0 -60
  586. package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
  587. package/dist/src/features/analytics/types/metrics.js +0 -2
  588. package/dist/src/features/analytics/types/metrics.js.map +0 -1
  589. package/dist/src/features/browser/browser-mcp.d.ts +0 -94
  590. package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
  591. package/dist/src/features/browser/browser-mcp.js +0 -459
  592. package/dist/src/features/browser/browser-mcp.js.map +0 -1
  593. package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
  594. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
  595. package/dist/src/features/tasks/pebbles-task-store.js +0 -572
  596. package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
  597. package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
  598. package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
  599. package/dist/src/features/tasks/task-aware-context.js +0 -412
  600. package/dist/src/features/tasks/task-aware-context.js.map +0 -1
  601. package/dist/src/index.d.ts +0 -21
  602. package/dist/src/index.d.ts.map +0 -1
  603. package/dist/src/index.js +0 -9
  604. package/dist/src/index.js.map +0 -1
  605. package/dist/src/integrations/linear/auth.d.ts +0 -99
  606. package/dist/src/integrations/linear/auth.d.ts.map +0 -1
  607. package/dist/src/integrations/linear/auth.js +0 -319
  608. package/dist/src/integrations/linear/auth.js.map +0 -1
  609. package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
  610. package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
  611. package/dist/src/integrations/linear/auto-sync.js +0 -268
  612. package/dist/src/integrations/linear/auto-sync.js.map +0 -1
  613. package/dist/src/integrations/linear/client.d.ts +0 -127
  614. package/dist/src/integrations/linear/client.d.ts.map +0 -1
  615. package/dist/src/integrations/linear/client.js +0 -446
  616. package/dist/src/integrations/linear/client.js.map +0 -1
  617. package/dist/src/integrations/linear/config.d.ts +0 -51
  618. package/dist/src/integrations/linear/config.d.ts.map +0 -1
  619. package/dist/src/integrations/linear/config.js +0 -103
  620. package/dist/src/integrations/linear/config.js.map +0 -1
  621. package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
  622. package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
  623. package/dist/src/integrations/linear/sync-manager.js +0 -235
  624. package/dist/src/integrations/linear/sync-manager.js.map +0 -1
  625. package/dist/src/integrations/linear/sync-service.d.ts +0 -46
  626. package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
  627. package/dist/src/integrations/linear/sync-service.js +0 -217
  628. package/dist/src/integrations/linear/sync-service.js.map +0 -1
  629. package/dist/src/integrations/linear/sync.d.ts +0 -125
  630. package/dist/src/integrations/linear/sync.d.ts.map +0 -1
  631. package/dist/src/integrations/linear/sync.js +0 -563
  632. package/dist/src/integrations/linear/sync.js.map +0 -1
  633. package/dist/src/integrations/linear/types.d.ts +0 -90
  634. package/dist/src/integrations/linear/types.d.ts.map +0 -1
  635. package/dist/src/integrations/linear/types.js +0 -2
  636. package/dist/src/integrations/linear/types.js.map +0 -1
  637. package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
  638. package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
  639. package/dist/src/integrations/linear/webhook-server.js +0 -190
  640. package/dist/src/integrations/linear/webhook-server.js.map +0 -1
  641. package/dist/src/integrations/linear/webhook.d.ts +0 -108
  642. package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
  643. package/dist/src/integrations/linear/webhook.js +0 -291
  644. package/dist/src/integrations/linear/webhook.js.map +0 -1
  645. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
  646. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
  647. package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
  648. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
  649. package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
  650. package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
  651. package/dist/src/integrations/mcp/handlers/index.js +0 -134
  652. package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
  653. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
  654. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
  655. package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
  656. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
  657. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
  658. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
  659. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
  660. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
  661. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
  662. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
  663. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
  664. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
  665. package/dist/src/integrations/mcp/index.d.ts +0 -13
  666. package/dist/src/integrations/mcp/index.d.ts.map +0 -1
  667. package/dist/src/integrations/mcp/index.js +0 -17
  668. package/dist/src/integrations/mcp/index.js.map +0 -1
  669. package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
  670. package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
  671. package/dist/src/integrations/mcp/refactored-server.js +0 -351
  672. package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
  673. package/dist/src/integrations/mcp/server.d.ts +0 -54
  674. package/dist/src/integrations/mcp/server.d.ts.map +0 -1
  675. package/dist/src/integrations/mcp/server.js +0 -1616
  676. package/dist/src/integrations/mcp/server.js.map +0 -1
  677. package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
  678. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
  679. package/dist/src/integrations/mcp/tool-definitions.js +0 -563
  680. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
  681. package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
  682. package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
  683. package/dist/src/integrations/mcp/trace-test.js +0 -54
  684. package/dist/src/integrations/mcp/trace-test.js.map +0 -1
  685. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
  686. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
  687. package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
  688. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
  689. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
  690. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
  691. package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
  692. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
  693. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
  694. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
  695. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
  696. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
  697. package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
  698. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
  699. package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
  700. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
  701. package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
  702. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
  703. package/dist/src/middleware/exponential-rate-limiter.js +0 -293
  704. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
  705. package/dist/src/models/user.model.d.ts +0 -62
  706. package/dist/src/models/user.model.d.ts.map +0 -1
  707. package/dist/src/models/user.model.js +0 -311
  708. package/dist/src/models/user.model.js.map +0 -1
  709. package/dist/src/servers/production/auth-middleware.d.ts +0 -76
  710. package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
  711. package/dist/src/servers/production/auth-middleware.js +0 -558
  712. package/dist/src/servers/production/auth-middleware.js.map +0 -1
  713. package/dist/src/servers/railway/index.d.ts +0 -7
  714. package/dist/src/servers/railway/index.d.ts.map +0 -1
  715. package/dist/src/servers/railway/index.js +0 -401
  716. package/dist/src/servers/railway/index.js.map +0 -1
  717. package/dist/src/services/config-service.d.ts +0 -44
  718. package/dist/src/services/config-service.d.ts.map +0 -1
  719. package/dist/src/services/config-service.js +0 -61
  720. package/dist/src/services/config-service.js.map +0 -1
  721. package/dist/src/services/context-service.d.ts +0 -17
  722. package/dist/src/services/context-service.d.ts.map +0 -1
  723. package/dist/src/services/context-service.js +0 -173
  724. package/dist/src/services/context-service.js.map +0 -1
  725. package/dist/src/types/task.d.ts +0 -27
  726. package/dist/src/types/task.d.ts.map +0 -1
  727. package/dist/src/types/task.js +0 -2
  728. package/dist/src/types/task.js.map +0 -1
  729. package/dist/src/utils/logger.d.ts +0 -13
  730. package/dist/src/utils/logger.d.ts.map +0 -1
  731. package/dist/src/utils/logger.js +0 -52
  732. package/dist/src/utils/logger.js.map +0 -1
  733. package/dist/src/validation/schemas.d.ts +0 -633
  734. package/dist/src/validation/schemas.d.ts.map +0 -1
  735. package/dist/src/validation/schemas.js +0 -347
  736. package/dist/src/validation/schemas.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/merge/resolution-engine.ts"],
4
- "sourcesContent": ["/**\n * Resolution Engine\n * Implements multiple strategies for resolving merge conflicts\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n MergeConflict,\n ConflictResolution,\n ResolutionStrategy,\n TeamVote,\n FrameStack,\n MergeResult,\n NotificationResult,\n} from './types.js';\nimport { Frame } from '../context/frame-manager.js';\nimport { ConflictDetector } from './conflict-detector.js';\nimport { StackDiffVisualizer } from './stack-diff.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface ResolutionContext {\n userId: string;\n userRole: 'junior' | 'mid' | 'senior' | 'lead';\n teamVotes?: TeamVote[];\n aiConfidence?: number;\n timeConstraint?: number; // milliseconds\n}\n\nexport class ResolutionEngine {\n private conflictDetector: ConflictDetector;\n private diffVisualizer: StackDiffVisualizer;\n private resolutionHistory: Map<string, ConflictResolution> = new Map();\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n this.diffVisualizer = new StackDiffVisualizer();\n }\n\n /**\n * Resolve conflicts using the specified strategy\n */\n async resolveConflicts(\n stack1: FrameStack,\n stack2: FrameStack,\n strategy: ResolutionStrategy['type'],\n context: ResolutionContext\n ): Promise<MergeResult> {\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n logger.info(\n `Resolving ${conflicts.length} conflicts using ${strategy} strategy`,\n {\n userId: context.userId,\n userRole: context.userRole,\n }\n );\n\n let resolution: ConflictResolution;\n\n switch (strategy) {\n case 'keep_both':\n resolution = await this.keepBothStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'team_vote':\n resolution = await this.teamVoteStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'senior_override':\n resolution = await this.seniorOverrideStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'ai_suggest':\n resolution = await this.aiSuggestStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'hybrid':\n resolution = await this.hybridStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n default:\n throw new Error(`Unknown resolution strategy: ${strategy}`);\n }\n\n // Execute the merge based on resolution\n const mergeResult = await this.executeMerge(\n stack1,\n stack2,\n conflicts,\n resolution\n );\n\n // Store resolution in history\n this.storeResolution(mergeResult.mergedFrameId || '', resolution);\n\n return mergeResult;\n }\n\n /**\n * Strategy: Keep Both Solutions\n * Creates a merged frame that includes both approaches\n */\n private async keepBothStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying keep_both strategy');\n\n const strategy: ResolutionStrategy = {\n type: 'keep_both',\n confidence: 0.8,\n reasoning:\n 'Preserving both solutions to maintain all work and allow future evaluation',\n };\n\n // Mark all conflicts as resolved by keeping both\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: 'Both solutions preserved in merged frame',\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Kept all ${stack1.frames.length + stack2.frames.length} frames from both stacks`,\n };\n }\n\n /**\n * Strategy: Team Vote\n * Uses democratic voting to choose between options\n */\n private async teamVoteStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying team_vote strategy');\n\n if (!context.teamVotes || context.teamVotes.length === 0) {\n throw new Error('Team vote strategy requires votes from team members');\n }\n\n // Count votes for each conflict\n const voteResults = this.countVotes(context.teamVotes);\n\n const strategy: ResolutionStrategy = {\n type: 'team_vote',\n confidence: this.calculateVoteConfidence(voteResults),\n reasoning: `Team consensus from ${context.teamVotes.length} votes`,\n votes: context.teamVotes,\n };\n\n // Apply vote results to conflicts\n for (const conflict of conflicts) {\n const winner = this.determineVoteWinner(conflict, voteResults);\n conflict.resolution = {\n strategy,\n resolvedBy: 'team_consensus',\n resolvedAt: Date.now(),\n notes: `Resolved by ${voteResults.consensus}% consensus`,\n };\n }\n\n return {\n strategy,\n resolvedBy: 'team_consensus',\n resolvedAt: Date.now(),\n notes: `Democratic resolution with ${voteResults.consensus}% agreement`,\n };\n }\n\n /**\n * Strategy: Senior Override\n * Senior developer's choice takes precedence\n */\n private async seniorOverrideStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying senior_override strategy');\n\n if (context.userRole !== 'senior' && context.userRole !== 'lead') {\n throw new Error('Senior override requires senior or lead role');\n }\n\n // Assume stack1 is the senior's preferred choice\n const preferredStack = this.determinePreferredStack(\n stack1,\n stack2,\n context\n );\n\n const strategy: ResolutionStrategy = {\n type: 'senior_override',\n confidence: 0.95,\n reasoning: `Senior developer (${context.userId}) selected based on experience and architectural knowledge`,\n };\n\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Overridden by ${context.userRole} authority`,\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Senior override applied to all ${conflicts.length} conflicts`,\n };\n }\n\n /**\n * Strategy: AI Suggest\n * Uses AI analysis to recommend best resolution\n */\n private async aiSuggestStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying ai_suggest strategy');\n\n // Analyze frames for quality and effectiveness\n const analysis = await this.analyzeFrameQuality(stack1, stack2);\n\n const strategy: ResolutionStrategy = {\n type: 'ai_suggest',\n confidence: context.aiConfidence || 0.85,\n reasoning: this.generateAIReasoning(analysis),\n };\n\n // Apply AI recommendations to each conflict\n for (const conflict of conflicts) {\n const recommendation = this.getAIRecommendation(conflict, analysis);\n conflict.resolution = {\n strategy,\n resolvedBy: 'ai_system',\n resolvedAt: Date.now(),\n notes: recommendation,\n };\n }\n\n return {\n strategy,\n resolvedBy: 'ai_system',\n resolvedAt: Date.now(),\n notes: `AI analysis with ${strategy.confidence * 100}% confidence`,\n };\n }\n\n /**\n * Strategy: Hybrid\n * Combines multiple strategies based on conflict type\n */\n private async hybridStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying hybrid strategy');\n\n const strategy: ResolutionStrategy = {\n type: 'hybrid',\n confidence: 0.9,\n reasoning: 'Using optimal strategy for each conflict type',\n };\n\n // Apply different strategies based on conflict type\n for (const conflict of conflicts) {\n let subStrategy: ResolutionStrategy['type'];\n\n switch (conflict.type) {\n case 'parallel_solution':\n // Keep both for parallel solutions\n subStrategy = 'keep_both';\n break;\n\n case 'conflicting_decision':\n // Use AI for decision conflicts\n subStrategy = 'ai_suggest';\n break;\n\n case 'structural_divergence':\n // Use senior override for structural issues\n subStrategy =\n context.userRole === 'senior' || context.userRole === 'lead'\n ? 'senior_override'\n : 'team_vote';\n break;\n\n default:\n subStrategy = 'ai_suggest';\n }\n\n conflict.resolution = {\n strategy: {\n ...strategy,\n reasoning: `${subStrategy} for ${conflict.type}`,\n },\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Hybrid resolution using ${subStrategy}`,\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Hybrid strategy optimized for each conflict type`,\n };\n }\n\n /**\n * Execute the merge based on resolution\n */\n private async executeMerge(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Promise<MergeResult> {\n const mergedFrameId = uuidv4();\n const rollbackPoint = this.createRollbackPoint(stack1, stack2);\n const notifications: NotificationResult[] = [];\n\n try {\n // Create merged frame stack\n const mergedFrames = this.mergeFrames(\n stack1,\n stack2,\n conflicts,\n resolution\n );\n\n // Validate merge integrity\n const isValid = this.validateMerge(mergedFrames, conflicts);\n\n if (!isValid) {\n throw new Error('Merge validation failed');\n }\n\n // Send notifications\n const notifyResults = await this.sendNotifications(conflicts, resolution);\n notifications.push(...notifyResults);\n\n logger.info('Merge executed successfully', {\n mergedFrameId,\n frameCount: mergedFrames.length,\n strategy: resolution.strategy.type,\n });\n\n return {\n success: true,\n mergedFrameId,\n conflicts,\n resolution,\n rollbackPoint,\n notifications,\n };\n } catch (error) {\n logger.error('Merge execution failed', error as Error);\n\n return {\n success: false,\n conflicts,\n resolution,\n rollbackPoint,\n notifications,\n };\n }\n }\n\n /**\n * Count votes from team members\n */\n private countVotes(votes: TeamVote[]): any {\n const counts = {\n frame1: 0,\n frame2: 0,\n both: 0,\n neither: 0,\n total: votes.length,\n consensus: 0,\n };\n\n for (const vote of votes) {\n counts[vote.choice]++;\n }\n\n // Calculate consensus percentage\n const maxVotes = Math.max(\n counts.frame1,\n counts.frame2,\n counts.both,\n counts.neither\n );\n counts.consensus = Math.round((maxVotes / counts.total) * 100);\n\n return counts;\n }\n\n /**\n * Calculate confidence based on vote distribution\n */\n private calculateVoteConfidence(voteResults: any): number {\n // High confidence if strong consensus\n if (voteResults.consensus >= 80) return 0.95;\n if (voteResults.consensus >= 60) return 0.75;\n if (voteResults.consensus >= 40) return 0.5;\n return 0.3;\n }\n\n /**\n * Determine winner from vote results\n */\n private determineVoteWinner(\n conflict: MergeConflict,\n voteResults: any\n ): string {\n if (voteResults.frame1 > voteResults.frame2) return conflict.frameId1;\n if (voteResults.frame2 > voteResults.frame1) return conflict.frameId2;\n if (voteResults.both > voteResults.neither) return 'both';\n return 'neither';\n }\n\n /**\n * Determine preferred stack for senior override\n */\n private determinePreferredStack(\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): FrameStack {\n // Check if senior owns one of the stacks\n if (stack1.owner === context.userId) return stack1;\n if (stack2.owner === context.userId) return stack2;\n\n // Otherwise, prefer more recent/complete stack\n if (stack1.lastModified > stack2.lastModified) return stack1;\n if (\n stack2.frames.filter((f) => f.state === 'closed').length >\n stack1.frames.filter((f) => f.state === 'closed').length\n ) {\n return stack2;\n }\n\n return stack1;\n }\n\n /**\n * Analyze frame quality for AI suggestions\n */\n private async analyzeFrameQuality(\n stack1: FrameStack,\n stack2: FrameStack\n ): Promise<any> {\n const analysis = {\n stack1: {\n completeness: this.calculateCompleteness(stack1),\n efficiency: this.calculateEfficiency(stack1),\n quality: this.calculateQuality(stack1),\n },\n stack2: {\n completeness: this.calculateCompleteness(stack2),\n efficiency: this.calculateEfficiency(stack2),\n quality: this.calculateQuality(stack2),\n },\n };\n\n return analysis;\n }\n\n /**\n * Calculate stack completeness\n */\n private calculateCompleteness(stack: FrameStack): number {\n const closedFrames = stack.frames.filter(\n (f) => f.state === 'closed'\n ).length;\n return closedFrames / stack.frames.length;\n }\n\n /**\n * Calculate stack efficiency\n */\n private calculateEfficiency(stack: FrameStack): number {\n let totalDuration = 0;\n let completedFrames = 0;\n\n for (const frame of stack.frames) {\n if (frame.closed_at && frame.created_at) {\n totalDuration += frame.closed_at - frame.created_at;\n completedFrames++;\n }\n }\n\n if (completedFrames === 0) return 0;\n\n const avgDuration = totalDuration / completedFrames;\n // Normalize: 5 minutes = 1.0, longer = lower score\n return Math.max(0, Math.min(1, 300000 / avgDuration));\n }\n\n /**\n * Calculate stack quality\n */\n private calculateQuality(stack: FrameStack): number {\n let qualityScore = 0;\n\n for (const frame of stack.frames) {\n if (frame.outputs && Object.keys(frame.outputs).length > 0)\n qualityScore += 0.3;\n if (frame.digest_text) qualityScore += 0.3;\n if (frame.state === 'closed') qualityScore += 0.4;\n }\n\n return Math.min(1, qualityScore / stack.frames.length);\n }\n\n /**\n * Generate AI reasoning for resolution\n */\n private generateAIReasoning(analysis: any): string {\n const stack1Score =\n analysis.stack1.completeness * 0.3 +\n analysis.stack1.efficiency * 0.3 +\n analysis.stack1.quality * 0.4;\n\n const stack2Score =\n analysis.stack2.completeness * 0.3 +\n analysis.stack2.efficiency * 0.3 +\n analysis.stack2.quality * 0.4;\n\n if (stack1Score > stack2Score) {\n return `Stack 1 shows higher overall quality (${(stack1Score * 100).toFixed(1)}% vs ${(stack2Score * 100).toFixed(1)}%)`;\n } else {\n return `Stack 2 shows higher overall quality (${(stack2Score * 100).toFixed(1)}% vs ${(stack1Score * 100).toFixed(1)}%)`;\n }\n }\n\n /**\n * Get AI recommendation for specific conflict\n */\n private getAIRecommendation(conflict: MergeConflict, analysis: any): string {\n switch (conflict.type) {\n case 'parallel_solution':\n return 'Recommend keeping both solutions for A/B testing';\n\n case 'conflicting_decision':\n return 'Recommend the decision with higher quality score';\n\n case 'structural_divergence':\n return 'Recommend restructuring to accommodate both approaches';\n\n default:\n return 'Recommend manual review for this conflict';\n }\n }\n\n /**\n * Create rollback point before merge\n */\n private createRollbackPoint(stack1: FrameStack, stack2: FrameStack): string {\n const rollbackId = uuidv4();\n\n // Store current state for rollback\n const rollbackData = {\n id: rollbackId,\n timestamp: Date.now(),\n stack1: JSON.parse(JSON.stringify(stack1)),\n stack2: JSON.parse(JSON.stringify(stack2)),\n };\n\n // In real implementation, persist this to database\n logger.info('Created rollback point', { rollbackId });\n\n return rollbackId;\n }\n\n /**\n * Merge frames based on resolution\n */\n private mergeFrames(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Frame[] {\n const mergedFrames: Frame[] = [];\n const processedIds = new Set<string>();\n\n // Process based on resolution strategy\n switch (resolution.strategy.type) {\n case 'keep_both':\n // Add all frames from both stacks\n mergedFrames.push(...stack1.frames, ...stack2.frames);\n break;\n\n case 'team_vote':\n case 'senior_override':\n case 'ai_suggest':\n // Add frames based on resolution decisions\n for (const frame of stack1.frames) {\n const conflict = conflicts.find((c) => c.frameId1 === frame.frame_id);\n if (!conflict || conflict.resolution?.strategy.type === 'keep_both') {\n mergedFrames.push(frame);\n processedIds.add(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (!processedIds.has(frame.frame_id)) {\n const conflict = conflicts.find(\n (c) => c.frameId2 === frame.frame_id\n );\n if (\n !conflict ||\n conflict.resolution?.strategy.type === 'keep_both'\n ) {\n mergedFrames.push(frame);\n }\n }\n }\n break;\n\n case 'hybrid':\n // Complex merging based on conflict types\n this.hybridMerge(stack1, stack2, conflicts, mergedFrames);\n break;\n }\n\n return mergedFrames;\n }\n\n /**\n * Hybrid merge implementation\n */\n private hybridMerge(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n mergedFrames: Frame[]\n ): void {\n const conflictMap = new Map<string, MergeConflict>();\n\n for (const conflict of conflicts) {\n conflictMap.set(conflict.frameId1, conflict);\n conflictMap.set(conflict.frameId2, conflict);\n }\n\n // Process each frame based on its conflict type\n for (const frame of [...stack1.frames, ...stack2.frames]) {\n const conflict = conflictMap.get(frame.frame_id);\n\n if (!conflict) {\n // No conflict, add frame\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n }\n } else if (conflict.type === 'parallel_solution') {\n // Keep both for parallel solutions\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n }\n }\n // Other conflict types handled by resolution\n }\n }\n\n /**\n * Validate merge integrity\n */\n private validateMerge(\n mergedFrames: Frame[],\n conflicts: MergeConflict[]\n ): boolean {\n // Check for duplicate frame IDs\n const ids = new Set<string>();\n for (const frame of mergedFrames) {\n if (ids.has(frame.frame_id)) {\n logger.error('Duplicate frame ID in merge', {\n frameId: frame.frame_id,\n });\n return false;\n }\n ids.add(frame.frame_id);\n }\n\n // Check parent-child relationships\n for (const frame of mergedFrames) {\n if (frame.parent_frame_id) {\n const parent = mergedFrames.find(\n (f) => f.frame_id === frame.parent_frame_id\n );\n if (!parent) {\n logger.warn('Orphaned frame in merge', { frameId: frame.frame_id });\n }\n }\n }\n\n // Check all conflicts have resolutions\n for (const conflict of conflicts) {\n if (!conflict.resolution) {\n logger.error('Unresolved conflict in merge', {\n conflictId: conflict.id,\n });\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Send notifications about merge\n */\n private async sendNotifications(\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Promise<NotificationResult[]> {\n const notifications: NotificationResult[] = [];\n\n // In real implementation, send actual notifications\n // For now, simulate notification sending\n const notification: NotificationResult = {\n userId: resolution.resolvedBy || 'team',\n type: 'in-app',\n sent: true,\n timestamp: Date.now(),\n };\n\n notifications.push(notification);\n\n logger.info('Notifications sent', { count: notifications.length });\n\n return notifications;\n }\n\n /**\n * Store resolution in history\n */\n private storeResolution(\n mergeId: string,\n resolution: ConflictResolution\n ): void {\n this.resolutionHistory.set(mergeId, resolution);\n\n // In real implementation, persist to database\n logger.info('Resolution stored in history', {\n mergeId,\n strategy: resolution.strategy.type,\n });\n }\n\n /**\n * Get resolution history for analysis\n */\n getResolutionHistory(): Map<string, ConflictResolution> {\n return this.resolutionHistory;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Resolution Engine\n * Implements multiple strategies for resolving merge conflicts\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n MergeConflict,\n ConflictResolution,\n ResolutionStrategy,\n TeamVote,\n FrameStack,\n MergeResult,\n NotificationResult,\n} from './types.js';\nimport { Frame } from '../context/frame-manager.js';\nimport { ConflictDetector } from './conflict-detector.js';\nimport { StackDiffVisualizer } from './stack-diff.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface ResolutionContext {\n userId: string;\n userRole: 'junior' | 'mid' | 'senior' | 'lead';\n teamVotes?: TeamVote[];\n aiConfidence?: number;\n timeConstraint?: number; // milliseconds\n}\n\nexport class ResolutionEngine {\n private conflictDetector: ConflictDetector;\n private diffVisualizer: StackDiffVisualizer;\n private resolutionHistory: Map<string, ConflictResolution> = new Map();\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n this.diffVisualizer = new StackDiffVisualizer();\n }\n\n /**\n * Resolve conflicts using the specified strategy\n */\n async resolveConflicts(\n stack1: FrameStack,\n stack2: FrameStack,\n strategy: ResolutionStrategy['type'],\n context: ResolutionContext\n ): Promise<MergeResult> {\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n logger.info(\n `Resolving ${conflicts.length} conflicts using ${strategy} strategy`,\n {\n userId: context.userId,\n userRole: context.userRole,\n }\n );\n\n let resolution: ConflictResolution;\n\n switch (strategy) {\n case 'keep_both':\n resolution = await this.keepBothStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'team_vote':\n resolution = await this.teamVoteStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'senior_override':\n resolution = await this.seniorOverrideStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'ai_suggest':\n resolution = await this.aiSuggestStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n case 'hybrid':\n resolution = await this.hybridStrategy(\n conflicts,\n stack1,\n stack2,\n context\n );\n break;\n\n default:\n throw new Error(`Unknown resolution strategy: ${strategy}`);\n }\n\n // Execute the merge based on resolution\n const mergeResult = await this.executeMerge(\n stack1,\n stack2,\n conflicts,\n resolution\n );\n\n // Store resolution in history\n this.storeResolution(mergeResult.mergedFrameId || '', resolution);\n\n return mergeResult;\n }\n\n /**\n * Strategy: Keep Both Solutions\n * Creates a merged frame that includes both approaches\n */\n private async keepBothStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying keep_both strategy');\n\n const strategy: ResolutionStrategy = {\n type: 'keep_both',\n confidence: 0.8,\n reasoning:\n 'Preserving both solutions to maintain all work and allow future evaluation',\n };\n\n // Mark all conflicts as resolved by keeping both\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: 'Both solutions preserved in merged frame',\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Kept all ${stack1.frames.length + stack2.frames.length} frames from both stacks`,\n };\n }\n\n /**\n * Strategy: Team Vote\n * Uses democratic voting to choose between options\n */\n private async teamVoteStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying team_vote strategy');\n\n if (!context.teamVotes || context.teamVotes.length === 0) {\n throw new Error('Team vote strategy requires votes from team members');\n }\n\n // Count votes for each conflict\n const voteResults = this.countVotes(context.teamVotes);\n\n const strategy: ResolutionStrategy = {\n type: 'team_vote',\n confidence: this.calculateVoteConfidence(voteResults),\n reasoning: `Team consensus from ${context.teamVotes.length} votes`,\n votes: context.teamVotes,\n };\n\n // Apply vote results to conflicts\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: 'team_consensus',\n resolvedAt: Date.now(),\n notes: `Resolved by ${voteResults.consensus}% consensus`,\n };\n }\n\n return {\n strategy,\n resolvedBy: 'team_consensus',\n resolvedAt: Date.now(),\n notes: `Democratic resolution with ${voteResults.consensus}% agreement`,\n };\n }\n\n /**\n * Strategy: Senior Override\n * Senior developer's choice takes precedence\n */\n private async seniorOverrideStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying senior_override strategy');\n\n if (context.userRole !== 'senior' && context.userRole !== 'lead') {\n throw new Error('Senior override requires senior or lead role');\n }\n\n // Assume stack1 is the senior's preferred choice\n this.determinePreferredStack(stack1, stack2, context);\n\n const strategy: ResolutionStrategy = {\n type: 'senior_override',\n confidence: 0.95,\n reasoning: `Senior developer (${context.userId}) selected based on experience and architectural knowledge`,\n };\n\n for (const conflict of conflicts) {\n conflict.resolution = {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Overridden by ${context.userRole} authority`,\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Senior override applied to all ${conflicts.length} conflicts`,\n };\n }\n\n /**\n * Strategy: AI Suggest\n * Uses AI analysis to recommend best resolution\n */\n private async aiSuggestStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying ai_suggest strategy');\n\n // Analyze frames for quality and effectiveness\n const analysis = await this.analyzeFrameQuality(stack1, stack2);\n\n const strategy: ResolutionStrategy = {\n type: 'ai_suggest',\n confidence: context.aiConfidence || 0.85,\n reasoning: this.generateAIReasoning(analysis),\n };\n\n // Apply AI recommendations to each conflict\n for (const conflict of conflicts) {\n const recommendation = this.getAIRecommendation(conflict, analysis);\n conflict.resolution = {\n strategy,\n resolvedBy: 'ai_system',\n resolvedAt: Date.now(),\n notes: recommendation,\n };\n }\n\n return {\n strategy,\n resolvedBy: 'ai_system',\n resolvedAt: Date.now(),\n notes: `AI analysis with ${strategy.confidence * 100}% confidence`,\n };\n }\n\n /**\n * Strategy: Hybrid\n * Combines multiple strategies based on conflict type\n */\n private async hybridStrategy(\n conflicts: MergeConflict[],\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): Promise<ConflictResolution> {\n logger.info('Applying hybrid strategy');\n\n const strategy: ResolutionStrategy = {\n type: 'hybrid',\n confidence: 0.9,\n reasoning: 'Using optimal strategy for each conflict type',\n };\n\n // Apply different strategies based on conflict type\n for (const conflict of conflicts) {\n let subStrategy: ResolutionStrategy['type'];\n\n switch (conflict.type) {\n case 'parallel_solution':\n // Keep both for parallel solutions\n subStrategy = 'keep_both';\n break;\n\n case 'conflicting_decision':\n // Use AI for decision conflicts\n subStrategy = 'ai_suggest';\n break;\n\n case 'structural_divergence':\n // Use senior override for structural issues\n subStrategy =\n context.userRole === 'senior' || context.userRole === 'lead'\n ? 'senior_override'\n : 'team_vote';\n break;\n\n default:\n subStrategy = 'ai_suggest';\n }\n\n conflict.resolution = {\n strategy: {\n ...strategy,\n reasoning: `${subStrategy} for ${conflict.type}`,\n },\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Hybrid resolution using ${subStrategy}`,\n };\n }\n\n return {\n strategy,\n resolvedBy: context.userId,\n resolvedAt: Date.now(),\n notes: `Hybrid strategy optimized for each conflict type`,\n };\n }\n\n /**\n * Execute the merge based on resolution\n */\n private async executeMerge(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Promise<MergeResult> {\n const mergedFrameId = uuidv4();\n const rollbackPoint = this.createRollbackPoint(stack1, stack2);\n const notifications: NotificationResult[] = [];\n\n try {\n // Create merged frame stack\n const mergedFrames = this.mergeFrames(\n stack1,\n stack2,\n conflicts,\n resolution\n );\n\n // Validate merge integrity\n const isValid = this.validateMerge(mergedFrames, conflicts);\n\n if (!isValid) {\n throw new Error('Merge validation failed');\n }\n\n // Send notifications\n const notifyResults = await this.sendNotifications(conflicts, resolution);\n notifications.push(...notifyResults);\n\n logger.info('Merge executed successfully', {\n mergedFrameId,\n frameCount: mergedFrames.length,\n strategy: resolution.strategy.type,\n });\n\n return {\n success: true,\n mergedFrameId,\n conflicts,\n resolution,\n rollbackPoint,\n notifications,\n };\n } catch (error) {\n logger.error('Merge execution failed', error as Error);\n\n return {\n success: false,\n conflicts,\n resolution,\n rollbackPoint,\n notifications,\n };\n }\n }\n\n /**\n * Count votes from team members\n */\n private countVotes(votes: TeamVote[]): {\n frame1: number;\n frame2: number;\n both: number;\n neither: number;\n total: number;\n consensus: number;\n } {\n const counts = {\n frame1: 0,\n frame2: 0,\n both: 0,\n neither: 0,\n total: votes.length,\n consensus: 0,\n };\n\n for (const vote of votes) {\n counts[vote.choice]++;\n }\n\n // Calculate consensus percentage\n const maxVotes = Math.max(\n counts.frame1,\n counts.frame2,\n counts.both,\n counts.neither\n );\n counts.consensus = Math.round((maxVotes / counts.total) * 100);\n\n return counts;\n }\n\n /**\n * Calculate confidence based on vote distribution\n */\n private calculateVoteConfidence(voteResults: { consensus: number }): number {\n // High confidence if strong consensus\n if (voteResults.consensus >= 80) return 0.95;\n if (voteResults.consensus >= 60) return 0.75;\n if (voteResults.consensus >= 40) return 0.5;\n return 0.3;\n }\n\n /**\n * Determine winner from vote results\n */\n private determineVoteWinner(\n conflict: MergeConflict,\n voteResults: {\n frame1: number;\n frame2: number;\n both: number;\n neither: number;\n }\n ): string {\n if (voteResults.frame1 > voteResults.frame2) return conflict.frameId1;\n if (voteResults.frame2 > voteResults.frame1) return conflict.frameId2;\n if (voteResults.both > voteResults.neither) return 'both';\n return 'neither';\n }\n\n /**\n * Determine preferred stack for senior override\n */\n private determinePreferredStack(\n stack1: FrameStack,\n stack2: FrameStack,\n context: ResolutionContext\n ): FrameStack {\n // Check if senior owns one of the stacks\n if (stack1.owner === context.userId) return stack1;\n if (stack2.owner === context.userId) return stack2;\n\n // Otherwise, prefer more recent/complete stack\n if (stack1.lastModified > stack2.lastModified) return stack1;\n if (\n stack2.frames.filter((f) => f.state === 'closed').length >\n stack1.frames.filter((f) => f.state === 'closed').length\n ) {\n return stack2;\n }\n\n return stack1;\n }\n\n /**\n * Analyze frame quality for AI suggestions\n */\n private async analyzeFrameQuality(\n stack1: FrameStack,\n stack2: FrameStack\n ): Promise<{\n stack1: { completeness: number; efficiency: number; quality: number };\n stack2: { completeness: number; efficiency: number; quality: number };\n }> {\n const analysis = {\n stack1: {\n completeness: this.calculateCompleteness(stack1),\n efficiency: this.calculateEfficiency(stack1),\n quality: this.calculateQuality(stack1),\n },\n stack2: {\n completeness: this.calculateCompleteness(stack2),\n efficiency: this.calculateEfficiency(stack2),\n quality: this.calculateQuality(stack2),\n },\n };\n\n return analysis;\n }\n\n /**\n * Calculate stack completeness\n */\n private calculateCompleteness(stack: FrameStack): number {\n const closedFrames = stack.frames.filter(\n (f) => f.state === 'closed'\n ).length;\n return closedFrames / stack.frames.length;\n }\n\n /**\n * Calculate stack efficiency\n */\n private calculateEfficiency(stack: FrameStack): number {\n let totalDuration = 0;\n let completedFrames = 0;\n\n for (const frame of stack.frames) {\n if (frame.closed_at && frame.created_at) {\n totalDuration += frame.closed_at - frame.created_at;\n completedFrames++;\n }\n }\n\n if (completedFrames === 0) return 0;\n\n const avgDuration = totalDuration / completedFrames;\n // Normalize: 5 minutes = 1.0, longer = lower score\n return Math.max(0, Math.min(1, 300000 / avgDuration));\n }\n\n /**\n * Calculate stack quality\n */\n private calculateQuality(stack: FrameStack): number {\n let qualityScore = 0;\n\n for (const frame of stack.frames) {\n if (frame.outputs && Object.keys(frame.outputs).length > 0)\n qualityScore += 0.3;\n if (frame.digest_text) qualityScore += 0.3;\n if (frame.state === 'closed') qualityScore += 0.4;\n }\n\n return Math.min(1, qualityScore / stack.frames.length);\n }\n\n /**\n * Generate AI reasoning for resolution\n */\n private generateAIReasoning(analysis: {\n stack1: { completeness: number; efficiency: number; quality: number };\n stack2: { completeness: number; efficiency: number; quality: number };\n }): string {\n const stack1Score =\n analysis.stack1.completeness * 0.3 +\n analysis.stack1.efficiency * 0.3 +\n analysis.stack1.quality * 0.4;\n\n const stack2Score =\n analysis.stack2.completeness * 0.3 +\n analysis.stack2.efficiency * 0.3 +\n analysis.stack2.quality * 0.4;\n\n if (stack1Score > stack2Score) {\n return `Stack 1 shows higher overall quality (${(stack1Score * 100).toFixed(1)}% vs ${(stack2Score * 100).toFixed(1)}%)`;\n } else {\n return `Stack 2 shows higher overall quality (${(stack2Score * 100).toFixed(1)}% vs ${(stack1Score * 100).toFixed(1)}%)`;\n }\n }\n\n /**\n * Get AI recommendation for specific conflict\n */\n private getAIRecommendation(conflict: MergeConflict): string {\n switch (conflict.type) {\n case 'parallel_solution':\n return 'Recommend keeping both solutions for A/B testing';\n\n case 'conflicting_decision':\n return 'Recommend the decision with higher quality score';\n\n case 'structural_divergence':\n return 'Recommend restructuring to accommodate both approaches';\n\n default:\n return 'Recommend manual review for this conflict';\n }\n }\n\n /**\n * Create rollback point before merge\n */\n private createRollbackPoint(\n _stack1: FrameStack,\n _stack2: FrameStack\n ): string {\n const rollbackId = uuidv4();\n\n // Store current state for rollback (would persist in real implementation)\n\n // In real implementation, persist this to database\n logger.info('Created rollback point', { rollbackId });\n\n return rollbackId;\n }\n\n /**\n * Merge frames based on resolution\n */\n private mergeFrames(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Frame[] {\n const mergedFrames: Frame[] = [];\n const processedIds = new Set<string>();\n\n // Process based on resolution strategy\n switch (resolution.strategy.type) {\n case 'keep_both':\n // Add all frames from both stacks\n mergedFrames.push(...stack1.frames, ...stack2.frames);\n break;\n\n case 'team_vote':\n case 'senior_override':\n case 'ai_suggest':\n // Add frames based on resolution decisions\n for (const frame of stack1.frames) {\n const conflict = conflicts.find((c) => c.frameId1 === frame.frame_id);\n if (!conflict || conflict.resolution?.strategy.type === 'keep_both') {\n mergedFrames.push(frame);\n processedIds.add(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (!processedIds.has(frame.frame_id)) {\n const conflict = conflicts.find(\n (c) => c.frameId2 === frame.frame_id\n );\n if (\n !conflict ||\n conflict.resolution?.strategy.type === 'keep_both'\n ) {\n mergedFrames.push(frame);\n }\n }\n }\n break;\n\n case 'hybrid':\n // Complex merging based on conflict types\n this.hybridMerge(stack1, stack2, conflicts, mergedFrames);\n break;\n }\n\n return mergedFrames;\n }\n\n /**\n * Hybrid merge implementation\n */\n private hybridMerge(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n mergedFrames: Frame[]\n ): void {\n const conflictMap = new Map<string, MergeConflict>();\n\n for (const conflict of conflicts) {\n conflictMap.set(conflict.frameId1, conflict);\n conflictMap.set(conflict.frameId2, conflict);\n }\n\n // Process each frame based on its conflict type\n for (const frame of [...stack1.frames, ...stack2.frames]) {\n const conflict = conflictMap.get(frame.frame_id);\n\n if (!conflict) {\n // No conflict, add frame\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n }\n } else if (conflict.type === 'parallel_solution') {\n // Keep both for parallel solutions\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n }\n }\n // Other conflict types handled by resolution\n }\n }\n\n /**\n * Validate merge integrity\n */\n private validateMerge(\n mergedFrames: Frame[],\n conflicts: MergeConflict[]\n ): boolean {\n // Check for duplicate frame IDs\n const ids = new Set<string>();\n for (const frame of mergedFrames) {\n if (ids.has(frame.frame_id)) {\n logger.error('Duplicate frame ID in merge', {\n frameId: frame.frame_id,\n });\n return false;\n }\n ids.add(frame.frame_id);\n }\n\n // Check parent-child relationships\n for (const frame of mergedFrames) {\n if (frame.parent_frame_id) {\n const parent = mergedFrames.find(\n (f) => f.frame_id === frame.parent_frame_id\n );\n if (!parent) {\n logger.warn('Orphaned frame in merge', { frameId: frame.frame_id });\n }\n }\n }\n\n // Check all conflicts have resolutions\n for (const conflict of conflicts) {\n if (!conflict.resolution) {\n logger.error('Unresolved conflict in merge', {\n conflictId: conflict.id,\n });\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Send notifications about merge\n */\n private async sendNotifications(\n conflicts: MergeConflict[],\n resolution: ConflictResolution\n ): Promise<NotificationResult[]> {\n const notifications: NotificationResult[] = [];\n\n // In real implementation, send actual notifications\n // For now, simulate notification sending\n const notification: NotificationResult = {\n userId: resolution.resolvedBy || 'team',\n type: 'in-app',\n sent: true,\n timestamp: Date.now(),\n };\n\n notifications.push(notification);\n\n logger.info('Notifications sent', { count: notifications.length });\n\n return notifications;\n }\n\n /**\n * Store resolution in history\n */\n private storeResolution(\n mergeId: string,\n resolution: ConflictResolution\n ): void {\n this.resolutionHistory.set(mergeId, resolution);\n\n // In real implementation, persist to database\n logger.info('Resolution stored in history', {\n mergeId,\n strategy: resolution.strategy.type,\n });\n }\n\n /**\n * Get resolution history for analysis\n */\n getResolutionHistory(): Map<string, ConflictResolution> {\n return this.resolutionHistory;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/merge/stack-diff.ts"],
4
- "sourcesContent": ["/**\n * Stack Diff Visualizer\n * Creates visual representations of frame stack divergence\n */\n\nimport {\n StackDiff,\n FrameStack,\n DiffTree,\n DiffNode,\n DiffEdge,\n MergeConflict,\n} from './types.js';\nimport { Frame } from '../context/frame-manager.js';\nimport { ConflictDetector } from './conflict-detector.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface VisualMarker {\n frameId: string;\n type: 'added' | 'removed' | 'modified' | 'conflict';\n color: string;\n symbol: string;\n description: string;\n}\n\nexport interface PreviewResult {\n mergedFrames: Frame[];\n keptFromStack1: string[];\n keptFromStack2: string[];\n conflicts: MergeConflict[];\n estimatedSuccess: number;\n}\n\nexport class StackDiffVisualizer {\n private conflictDetector: ConflictDetector;\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n }\n\n /**\n * Visualize divergence between two frame stacks\n */\n visualizeDivergence(\n baseFrame: Frame,\n branch1: FrameStack,\n branch2: FrameStack\n ): DiffTree {\n const nodes: DiffNode[] = [];\n const edges: DiffEdge[] = [];\n\n // Add base node\n nodes.push({\n id: baseFrame.frame_id,\n type: 'common',\n frame: baseFrame,\n position: { x: 0, y: 0 },\n metadata: { label: 'Common Ancestor' },\n });\n\n // Process branch 1\n const branch1Nodes = this.processBranch(\n branch1,\n baseFrame.frame_id,\n -100, // Left side\n 100\n );\n nodes.push(...branch1Nodes.nodes);\n edges.push(...branch1Nodes.edges);\n\n // Process branch 2\n const branch2Nodes = this.processBranch(\n branch2,\n baseFrame.frame_id,\n 100, // Right side\n 100\n );\n nodes.push(...branch2Nodes.nodes);\n edges.push(...branch2Nodes.edges);\n\n // Detect and mark conflicts\n const conflicts = this.conflictDetector.detectConflicts(branch1, branch2);\n this.markConflicts(nodes, edges, conflicts);\n\n return {\n nodes,\n edges,\n layout: 'tree',\n };\n }\n\n /**\n * Render conflict markers for visualization\n */\n renderConflictMarkers(conflicts: MergeConflict[]): VisualMarker[] {\n const markers: VisualMarker[] = [];\n\n for (const conflict of conflicts) {\n markers.push({\n frameId: conflict.frameId1,\n type: 'conflict',\n color: this.getSeverityColor(conflict.severity),\n symbol: this.getConflictSymbol(conflict.type),\n description: conflict.description,\n });\n\n markers.push({\n frameId: conflict.frameId2,\n type: 'conflict',\n color: this.getSeverityColor(conflict.severity),\n symbol: this.getConflictSymbol(conflict.type),\n description: conflict.description,\n });\n }\n\n return markers;\n }\n\n /**\n * Generate a merge preview based on resolution strategy\n */\n generateMergePreview(\n stack1: FrameStack,\n stack2: FrameStack,\n strategy:\n | 'keep_both'\n | 'team_vote'\n | 'senior_override'\n | 'ai_suggest'\n | 'hybrid'\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n switch (strategy) {\n case 'keep_both':\n return this.previewKeepBoth(stack1, stack2, conflicts);\n\n case 'team_vote':\n return this.previewTeamVote(stack1, stack2, conflicts);\n\n case 'senior_override':\n return this.previewSeniorOverride(stack1, stack2, conflicts);\n\n case 'ai_suggest':\n return this.previewAISuggest(stack1, stack2, conflicts);\n\n case 'hybrid':\n return this.previewHybrid(stack1, stack2, conflicts);\n\n default:\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0,\n };\n }\n }\n\n /**\n * Create a stack diff comparison\n */\n createStackDiff(\n baseFrameId: string,\n stack1: FrameStack,\n stack2: FrameStack\n ): StackDiff {\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n const divergencePoint = this.findDivergencePoint(stack1, stack2);\n const commonAncestor = this.findCommonAncestor(stack1, stack2);\n\n // Find base frame\n const baseFrame =\n stack1.frames.find((f) => f.frame_id === baseFrameId) ||\n stack2.frames.find((f) => f.frame_id === baseFrameId);\n\n const visualRepresentation = baseFrame\n ? this.visualizeDivergence(baseFrame, stack1, stack2)\n : undefined;\n\n return {\n baseFrame: baseFrameId,\n branch1: stack1,\n branch2: stack2,\n divergencePoint,\n conflicts,\n commonAncestor,\n visualRepresentation,\n };\n }\n\n /**\n * Process a branch for visualization\n */\n private processBranch(\n stack: FrameStack,\n parentId: string,\n xOffset: number,\n yStart: number\n ): { nodes: DiffNode[]; edges: DiffEdge[] } {\n const nodes: DiffNode[] = [];\n const edges: DiffEdge[] = [];\n let yPos = yStart;\n\n // Find frames that are children of parent\n const children = stack.frames.filter((f) => f.parent_frame_id === parentId);\n\n for (const frame of children) {\n // Add node\n nodes.push({\n id: frame.frame_id,\n type: xOffset < 0 ? 'branch1' : 'branch2',\n frame,\n position: { x: xOffset, y: yPos },\n metadata: {\n branch: xOffset < 0 ? 'left' : 'right',\n depth: frame.depth,\n },\n });\n\n // Add edge from parent\n edges.push({\n source: parentId,\n target: frame.frame_id,\n type: 'parent',\n weight: 1,\n });\n\n // Process children recursively\n const childResults = this.processBranch(\n stack,\n frame.frame_id,\n xOffset + (xOffset < 0 ? -50 : 50),\n yPos + 100\n );\n\n nodes.push(...childResults.nodes);\n edges.push(...childResults.edges);\n\n yPos += 150;\n }\n\n return { nodes, edges };\n }\n\n /**\n * Mark conflicts in the visualization\n */\n private markConflicts(\n nodes: DiffNode[],\n edges: DiffEdge[],\n conflicts: MergeConflict[]\n ): void {\n for (const conflict of conflicts) {\n // Mark conflicting nodes\n const node1 = nodes.find((n) => n.id === conflict.frameId1);\n const node2 = nodes.find((n) => n.id === conflict.frameId2);\n\n if (node1) {\n node1.type = 'conflict';\n node1.metadata = {\n ...node1.metadata,\n conflictType: conflict.type,\n severity: conflict.severity,\n };\n }\n\n if (node2) {\n node2.type = 'conflict';\n node2.metadata = {\n ...node2.metadata,\n conflictType: conflict.type,\n severity: conflict.severity,\n };\n }\n\n // Add conflict edge\n if (node1 && node2) {\n edges.push({\n source: conflict.frameId1,\n target: conflict.frameId2,\n type: 'conflict',\n weight: this.getSeverityWeight(conflict.severity),\n });\n }\n }\n }\n\n /**\n * Get color for severity level\n */\n private getSeverityColor(severity: string): string {\n switch (severity) {\n case 'critical':\n return '#ff0000';\n case 'high':\n return '#ff6600';\n case 'medium':\n return '#ffaa00';\n case 'low':\n return '#ffdd00';\n default:\n return '#888888';\n }\n }\n\n /**\n * Get symbol for conflict type\n */\n private getConflictSymbol(type: string): string {\n switch (type) {\n case 'parallel_solution':\n return '\u26A1';\n case 'conflicting_decision':\n return '\u26A0\uFE0F';\n case 'structural_divergence':\n return '\uD83D\uDD00';\n default:\n return '\u2753';\n }\n }\n\n /**\n * Get weight for severity level\n */\n private getSeverityWeight(severity: string): number {\n switch (severity) {\n case 'critical':\n return 4;\n case 'high':\n return 3;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 0;\n }\n }\n\n /**\n * Preview keep both strategy\n */\n private previewKeepBoth(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Keep all frames from both stacks\n for (const frame of stack1.frames) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n\n for (const frame of stack2.frames) {\n // Only add if not already present\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n // Success depends on conflict severity\n const criticalConflicts = conflicts.filter(\n (c) => c.severity === 'critical'\n ).length;\n const estimatedSuccess = Math.max(0, 1 - criticalConflicts * 0.2);\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess,\n };\n }\n\n /**\n * Preview team vote strategy\n */\n private previewTeamVote(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n // Simulate team voting - for preview, assume 50/50 split\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Add non-conflicting frames from both\n const conflictingFrameIds = new Set<string>();\n for (const conflict of conflicts) {\n conflictingFrameIds.add(conflict.frameId1);\n conflictingFrameIds.add(conflict.frameId2);\n }\n\n for (const frame of stack1.frames) {\n if (!conflictingFrameIds.has(frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (\n !conflictingFrameIds.has(frame.frame_id) &&\n !mergedFrames.find((f) => f.frame_id === frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n // For conflicts, alternate between stacks (simulating vote)\n let useStack1 = true;\n for (const conflict of conflicts) {\n if (useStack1) {\n const frame = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n if (frame) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n } else {\n const frame = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n if (frame) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n useStack1 = !useStack1;\n }\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.75, // Team consensus usually works well\n };\n }\n\n /**\n * Preview senior override strategy\n */\n private previewSeniorOverride(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n // Assume stack1 is senior developer's work\n const mergedFrames = [...stack1.frames];\n const keptFromStack1 = stack1.frames.map((f) => f.frame_id);\n const keptFromStack2: string[] = [];\n\n // Add non-conflicting frames from stack2\n const stack1Ids = new Set(keptFromStack1);\n for (const frame of stack2.frames) {\n const hasConflict = conflicts.some((c) => c.frameId2 === frame.frame_id);\n\n if (!hasConflict && !stack1Ids.has(frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.85, // Senior override is usually reliable\n };\n }\n\n /**\n * Preview AI suggest strategy\n */\n private previewAISuggest(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // AI would analyze effectiveness - simulate with heuristics\n for (const conflict of conflicts) {\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1 && frame2) {\n // Choose based on completion and output quality\n const score1 = this.scoreFrame(frame1);\n const score2 = this.scoreFrame(frame2);\n\n if (score1 >= score2) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n } else {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n }\n }\n\n // Add non-conflicting frames\n this.addNonConflictingFrames(\n stack1,\n stack2,\n conflicts,\n mergedFrames,\n keptFromStack1,\n keptFromStack2\n );\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.9, // AI suggestions are usually optimal\n };\n }\n\n /**\n * Preview hybrid strategy\n */\n private previewHybrid(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Hybrid: Use different strategies based on conflict type\n for (const conflict of conflicts) {\n if (conflict.type === 'parallel_solution') {\n // Keep both for parallel solutions\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n }\n if (frame2) {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n } else if (conflict.type === 'conflicting_decision') {\n // Use AI for decisions\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1 && frame2) {\n const score1 = this.scoreFrame(frame1);\n const score2 = this.scoreFrame(frame2);\n\n if (score1 >= score2) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n } else {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n }\n } else {\n // Use senior override for structural divergence\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n if (frame1) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n }\n }\n }\n\n // Add non-conflicting frames\n this.addNonConflictingFrames(\n stack1,\n stack2,\n conflicts,\n mergedFrames,\n keptFromStack1,\n keptFromStack2\n );\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.88, // Hybrid is very effective\n };\n }\n\n /**\n * Score a frame for quality\n */\n private scoreFrame(frame: Frame): number {\n let score = 0;\n\n if (frame.state === 'closed') score += 0.3;\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.2;\n if (frame.digest_text) score += 0.2;\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration < 600000) score += 0.3; // Less than 10 minutes\n }\n\n return score;\n }\n\n /**\n * Add non-conflicting frames to merge\n */\n private addNonConflictingFrames(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n mergedFrames: Frame[],\n keptFromStack1: string[],\n keptFromStack2: string[]\n ): void {\n const conflictingIds = new Set<string>();\n const mergedIds = new Set<string>(mergedFrames.map((f) => f.frame_id));\n\n for (const conflict of conflicts) {\n conflictingIds.add(conflict.frameId1);\n conflictingIds.add(conflict.frameId2);\n }\n\n for (const frame of stack1.frames) {\n if (\n !conflictingIds.has(frame.frame_id) &&\n !mergedIds.has(frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n mergedIds.add(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (\n !conflictingIds.has(frame.frame_id) &&\n !mergedIds.has(frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n mergedIds.add(frame.frame_id);\n }\n }\n }\n\n /**\n * Find divergence point between stacks\n */\n private findDivergencePoint(stack1: FrameStack, stack2: FrameStack): number {\n const events1 = stack1.events.sort((a, b) => a.ts - b.ts);\n const events2 = stack2.events.sort((a, b) => a.ts - b.ts);\n\n for (let i = 0; i < Math.min(events1.length, events2.length); i++) {\n if (events1[i].event_id !== events2[i].event_id) {\n return events1[i].ts;\n }\n }\n\n return Math.min(\n events1[events1.length - 1]?.ts || 0,\n events2[events2.length - 1]?.ts || 0\n );\n }\n\n /**\n * Find common ancestor frame\n */\n private findCommonAncestor(\n stack1: FrameStack,\n stack2: FrameStack\n ): string | undefined {\n const frames1 = new Set(stack1.frames.map((f) => f.frame_id));\n\n // Find the deepest common frame\n let deepestCommon: Frame | undefined;\n let maxDepth = -1;\n\n for (const frame of stack2.frames) {\n if (frames1.has(frame.frame_id) && frame.depth > maxDepth) {\n deepestCommon = frame;\n maxDepth = frame.depth;\n }\n }\n\n return deepestCommon?.frame_id;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Stack Diff Visualizer\n * Creates visual representations of frame stack divergence\n */\n\nimport {\n StackDiff,\n FrameStack,\n DiffTree,\n DiffNode,\n DiffEdge,\n MergeConflict,\n} from './types.js';\nimport { Frame } from '../context/frame-manager.js';\nimport { ConflictDetector } from './conflict-detector.js';\n\nexport interface VisualMarker {\n frameId: string;\n type: 'added' | 'removed' | 'modified' | 'conflict';\n color: string;\n symbol: string;\n description: string;\n}\n\nexport interface PreviewResult {\n mergedFrames: Frame[];\n keptFromStack1: string[];\n keptFromStack2: string[];\n conflicts: MergeConflict[];\n estimatedSuccess: number;\n}\n\nexport class StackDiffVisualizer {\n private conflictDetector: ConflictDetector;\n\n constructor() {\n this.conflictDetector = new ConflictDetector();\n }\n\n /**\n * Visualize divergence between two frame stacks\n */\n visualizeDivergence(\n baseFrame: Frame,\n branch1: FrameStack,\n branch2: FrameStack\n ): DiffTree {\n const nodes: DiffNode[] = [];\n const edges: DiffEdge[] = [];\n\n // Add base node\n nodes.push({\n id: baseFrame.frame_id,\n type: 'common',\n frame: baseFrame,\n position: { x: 0, y: 0 },\n metadata: { label: 'Common Ancestor' },\n });\n\n // Process branch 1\n const branch1Nodes = this.processBranch(\n branch1,\n baseFrame.frame_id,\n -100, // Left side\n 100\n );\n nodes.push(...branch1Nodes.nodes);\n edges.push(...branch1Nodes.edges);\n\n // Process branch 2\n const branch2Nodes = this.processBranch(\n branch2,\n baseFrame.frame_id,\n 100, // Right side\n 100\n );\n nodes.push(...branch2Nodes.nodes);\n edges.push(...branch2Nodes.edges);\n\n // Detect and mark conflicts\n const conflicts = this.conflictDetector.detectConflicts(branch1, branch2);\n this.markConflicts(nodes, edges, conflicts);\n\n return {\n nodes,\n edges,\n layout: 'tree',\n };\n }\n\n /**\n * Render conflict markers for visualization\n */\n renderConflictMarkers(conflicts: MergeConflict[]): VisualMarker[] {\n const markers: VisualMarker[] = [];\n\n for (const conflict of conflicts) {\n markers.push({\n frameId: conflict.frameId1,\n type: 'conflict',\n color: this.getSeverityColor(conflict.severity),\n symbol: this.getConflictSymbol(conflict.type),\n description: conflict.description,\n });\n\n markers.push({\n frameId: conflict.frameId2,\n type: 'conflict',\n color: this.getSeverityColor(conflict.severity),\n symbol: this.getConflictSymbol(conflict.type),\n description: conflict.description,\n });\n }\n\n return markers;\n }\n\n /**\n * Generate a merge preview based on resolution strategy\n */\n generateMergePreview(\n stack1: FrameStack,\n stack2: FrameStack,\n strategy:\n | 'keep_both'\n | 'team_vote'\n | 'senior_override'\n | 'ai_suggest'\n | 'hybrid'\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n\n switch (strategy) {\n case 'keep_both':\n return this.previewKeepBoth(stack1, stack2, conflicts);\n\n case 'team_vote':\n return this.previewTeamVote(stack1, stack2, conflicts);\n\n case 'senior_override':\n return this.previewSeniorOverride(stack1, stack2, conflicts);\n\n case 'ai_suggest':\n return this.previewAISuggest(stack1, stack2, conflicts);\n\n case 'hybrid':\n return this.previewHybrid(stack1, stack2, conflicts);\n\n default:\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0,\n };\n }\n }\n\n /**\n * Create a stack diff comparison\n */\n createStackDiff(\n baseFrameId: string,\n stack1: FrameStack,\n stack2: FrameStack\n ): StackDiff {\n const conflicts = this.conflictDetector.detectConflicts(stack1, stack2);\n const divergencePoint = this.findDivergencePoint(stack1, stack2);\n const commonAncestor = this.findCommonAncestor(stack1, stack2);\n\n // Find base frame\n const baseFrame =\n stack1.frames.find((f) => f.frame_id === baseFrameId) ||\n stack2.frames.find((f) => f.frame_id === baseFrameId);\n\n const visualRepresentation = baseFrame\n ? this.visualizeDivergence(baseFrame, stack1, stack2)\n : undefined;\n\n return {\n baseFrame: baseFrameId,\n branch1: stack1,\n branch2: stack2,\n divergencePoint,\n conflicts,\n commonAncestor,\n visualRepresentation,\n };\n }\n\n /**\n * Process a branch for visualization\n */\n private processBranch(\n stack: FrameStack,\n parentId: string,\n xOffset: number,\n yStart: number\n ): { nodes: DiffNode[]; edges: DiffEdge[] } {\n const nodes: DiffNode[] = [];\n const edges: DiffEdge[] = [];\n let yPos = yStart;\n\n // Find frames that are children of parent\n const children = stack.frames.filter((f) => f.parent_frame_id === parentId);\n\n for (const frame of children) {\n // Add node\n nodes.push({\n id: frame.frame_id,\n type: xOffset < 0 ? 'branch1' : 'branch2',\n frame,\n position: { x: xOffset, y: yPos },\n metadata: {\n branch: xOffset < 0 ? 'left' : 'right',\n depth: frame.depth,\n },\n });\n\n // Add edge from parent\n edges.push({\n source: parentId,\n target: frame.frame_id,\n type: 'parent',\n weight: 1,\n });\n\n // Process children recursively\n const childResults = this.processBranch(\n stack,\n frame.frame_id,\n xOffset + (xOffset < 0 ? -50 : 50),\n yPos + 100\n );\n\n nodes.push(...childResults.nodes);\n edges.push(...childResults.edges);\n\n yPos += 150;\n }\n\n return { nodes, edges };\n }\n\n /**\n * Mark conflicts in the visualization\n */\n private markConflicts(\n nodes: DiffNode[],\n edges: DiffEdge[],\n conflicts: MergeConflict[]\n ): void {\n for (const conflict of conflicts) {\n // Mark conflicting nodes\n const node1 = nodes.find((n) => n.id === conflict.frameId1);\n const node2 = nodes.find((n) => n.id === conflict.frameId2);\n\n if (node1) {\n node1.type = 'conflict';\n node1.metadata = {\n ...node1.metadata,\n conflictType: conflict.type,\n severity: conflict.severity,\n };\n }\n\n if (node2) {\n node2.type = 'conflict';\n node2.metadata = {\n ...node2.metadata,\n conflictType: conflict.type,\n severity: conflict.severity,\n };\n }\n\n // Add conflict edge\n if (node1 && node2) {\n edges.push({\n source: conflict.frameId1,\n target: conflict.frameId2,\n type: 'conflict',\n weight: this.getSeverityWeight(conflict.severity),\n });\n }\n }\n }\n\n /**\n * Get color for severity level\n */\n private getSeverityColor(severity: string): string {\n switch (severity) {\n case 'critical':\n return '#ff0000';\n case 'high':\n return '#ff6600';\n case 'medium':\n return '#ffaa00';\n case 'low':\n return '#ffdd00';\n default:\n return '#888888';\n }\n }\n\n /**\n * Get symbol for conflict type\n */\n private getConflictSymbol(type: string): string {\n switch (type) {\n case 'parallel_solution':\n return '\u26A1';\n case 'conflicting_decision':\n return '\u26A0\uFE0F';\n case 'structural_divergence':\n return '\uD83D\uDD00';\n default:\n return '\u2753';\n }\n }\n\n /**\n * Get weight for severity level\n */\n private getSeverityWeight(severity: string): number {\n switch (severity) {\n case 'critical':\n return 4;\n case 'high':\n return 3;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 0;\n }\n }\n\n /**\n * Preview keep both strategy\n */\n private previewKeepBoth(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Keep all frames from both stacks\n for (const frame of stack1.frames) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n\n for (const frame of stack2.frames) {\n // Only add if not already present\n if (!mergedFrames.find((f) => f.frame_id === frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n // Success depends on conflict severity\n const criticalConflicts = conflicts.filter(\n (c) => c.severity === 'critical'\n ).length;\n const estimatedSuccess = Math.max(0, 1 - criticalConflicts * 0.2);\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess,\n };\n }\n\n /**\n * Preview team vote strategy\n */\n private previewTeamVote(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n // Simulate team voting - for preview, assume 50/50 split\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Add non-conflicting frames from both\n const conflictingFrameIds = new Set<string>();\n for (const conflict of conflicts) {\n conflictingFrameIds.add(conflict.frameId1);\n conflictingFrameIds.add(conflict.frameId2);\n }\n\n for (const frame of stack1.frames) {\n if (!conflictingFrameIds.has(frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (\n !conflictingFrameIds.has(frame.frame_id) &&\n !mergedFrames.find((f) => f.frame_id === frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n // For conflicts, alternate between stacks (simulating vote)\n let useStack1 = true;\n for (const conflict of conflicts) {\n if (useStack1) {\n const frame = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n if (frame) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n }\n } else {\n const frame = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n if (frame) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n useStack1 = !useStack1;\n }\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.75, // Team consensus usually works well\n };\n }\n\n /**\n * Preview senior override strategy\n */\n private previewSeniorOverride(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n // Assume stack1 is senior developer's work\n const mergedFrames = [...stack1.frames];\n const keptFromStack1 = stack1.frames.map((f) => f.frame_id);\n const keptFromStack2: string[] = [];\n\n // Add non-conflicting frames from stack2\n const stack1Ids = new Set(keptFromStack1);\n for (const frame of stack2.frames) {\n const hasConflict = conflicts.some((c) => c.frameId2 === frame.frame_id);\n\n if (!hasConflict && !stack1Ids.has(frame.frame_id)) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n }\n }\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.85, // Senior override is usually reliable\n };\n }\n\n /**\n * Preview AI suggest strategy\n */\n private previewAISuggest(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // AI would analyze effectiveness - simulate with heuristics\n for (const conflict of conflicts) {\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1 && frame2) {\n // Choose based on completion and output quality\n const score1 = this.scoreFrame(frame1);\n const score2 = this.scoreFrame(frame2);\n\n if (score1 >= score2) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n } else {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n }\n }\n\n // Add non-conflicting frames\n this.addNonConflictingFrames(\n stack1,\n stack2,\n conflicts,\n mergedFrames,\n keptFromStack1,\n keptFromStack2\n );\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.9, // AI suggestions are usually optimal\n };\n }\n\n /**\n * Preview hybrid strategy\n */\n private previewHybrid(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[]\n ): PreviewResult {\n const mergedFrames: Frame[] = [];\n const keptFromStack1: string[] = [];\n const keptFromStack2: string[] = [];\n\n // Hybrid: Use different strategies based on conflict type\n for (const conflict of conflicts) {\n if (conflict.type === 'parallel_solution') {\n // Keep both for parallel solutions\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n }\n if (frame2) {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n } else if (conflict.type === 'conflicting_decision') {\n // Use AI for decisions\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n const frame2 = stack2.frames.find(\n (f) => f.frame_id === conflict.frameId2\n );\n\n if (frame1 && frame2) {\n const score1 = this.scoreFrame(frame1);\n const score2 = this.scoreFrame(frame2);\n\n if (score1 >= score2) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n } else {\n mergedFrames.push(frame2);\n keptFromStack2.push(frame2.frame_id);\n }\n }\n } else {\n // Use senior override for structural divergence\n const frame1 = stack1.frames.find(\n (f) => f.frame_id === conflict.frameId1\n );\n if (frame1) {\n mergedFrames.push(frame1);\n keptFromStack1.push(frame1.frame_id);\n }\n }\n }\n\n // Add non-conflicting frames\n this.addNonConflictingFrames(\n stack1,\n stack2,\n conflicts,\n mergedFrames,\n keptFromStack1,\n keptFromStack2\n );\n\n return {\n mergedFrames,\n keptFromStack1,\n keptFromStack2,\n conflicts,\n estimatedSuccess: 0.88, // Hybrid is very effective\n };\n }\n\n /**\n * Score a frame for quality\n */\n private scoreFrame(frame: Frame): number {\n let score = 0;\n\n if (frame.state === 'closed') score += 0.3;\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.2;\n if (frame.digest_text) score += 0.2;\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration < 600000) score += 0.3; // Less than 10 minutes\n }\n\n return score;\n }\n\n /**\n * Add non-conflicting frames to merge\n */\n private addNonConflictingFrames(\n stack1: FrameStack,\n stack2: FrameStack,\n conflicts: MergeConflict[],\n mergedFrames: Frame[],\n keptFromStack1: string[],\n keptFromStack2: string[]\n ): void {\n const conflictingIds = new Set<string>();\n const mergedIds = new Set<string>(mergedFrames.map((f) => f.frame_id));\n\n for (const conflict of conflicts) {\n conflictingIds.add(conflict.frameId1);\n conflictingIds.add(conflict.frameId2);\n }\n\n for (const frame of stack1.frames) {\n if (\n !conflictingIds.has(frame.frame_id) &&\n !mergedIds.has(frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack1.push(frame.frame_id);\n mergedIds.add(frame.frame_id);\n }\n }\n\n for (const frame of stack2.frames) {\n if (\n !conflictingIds.has(frame.frame_id) &&\n !mergedIds.has(frame.frame_id)\n ) {\n mergedFrames.push(frame);\n keptFromStack2.push(frame.frame_id);\n mergedIds.add(frame.frame_id);\n }\n }\n }\n\n /**\n * Find divergence point between stacks\n */\n private findDivergencePoint(stack1: FrameStack, stack2: FrameStack): number {\n const events1 = stack1.events.sort((a, b) => a.ts - b.ts);\n const events2 = stack2.events.sort((a, b) => a.ts - b.ts);\n\n for (let i = 0; i < Math.min(events1.length, events2.length); i++) {\n if (events1[i].event_id !== events2[i].event_id) {\n return events1[i].ts;\n }\n }\n\n return Math.min(\n events1[events1.length - 1]?.ts || 0,\n events2[events2.length - 1]?.ts || 0\n );\n }\n\n /**\n * Find common ancestor frame\n */\n private findCommonAncestor(\n stack1: FrameStack,\n stack2: FrameStack\n ): string | undefined {\n const frames1 = new Set(stack1.frames.map((f) => f.frame_id));\n\n // Find the deepest common frame\n let deepestCommon: Frame | undefined;\n let maxDepth = -1;\n\n for (const frame of stack2.frames) {\n if (frames1.has(frame.frame_id) && frame.depth > maxDepth) {\n deepestCommon = frame;\n maxDepth = frame.depth;\n }\n }\n\n return deepestCommon?.frame_id;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -11,6 +11,7 @@ class Logger {
11
11
  static instance;
12
12
  logLevel = 2 /* INFO */;
13
13
  logFile;
14
+ fileLoggingDisabledNotified = false;
14
15
  constructor() {
15
16
  const envLevel = process.env.STACKMEMORY_LOG_LEVEL?.toUpperCase();
16
17
  switch (envLevel) {
@@ -38,11 +39,19 @@ class Logger {
38
39
  return Logger.instance;
39
40
  }
40
41
  ensureLogDirectory() {
41
- if (this.logFile) {
42
- const logDir = path.dirname(this.logFile);
42
+ if (!this.logFile) return;
43
+ const logDir = path.dirname(this.logFile);
44
+ try {
43
45
  if (!fs.existsSync(logDir)) {
44
46
  fs.mkdirSync(logDir, { recursive: true });
45
47
  }
48
+ } catch (err) {
49
+ this.logFile = void 0;
50
+ if (!this.fileLoggingDisabledNotified) {
51
+ this.fileLoggingDisabledNotified = true;
52
+ const msg = "[Logger] File logging disabled (failed to create log directory). Falling back to console only.";
53
+ console.warn(msg);
54
+ }
46
55
  }
47
56
  }
48
57
  writeLog(entry) {
@@ -50,7 +59,13 @@ class Logger {
50
59
  if (this.logFile) {
51
60
  try {
52
61
  fs.appendFileSync(this.logFile, logLine);
53
- } catch {
62
+ } catch (err) {
63
+ this.logFile = void 0;
64
+ if (!this.fileLoggingDisabledNotified) {
65
+ this.fileLoggingDisabledNotified = true;
66
+ const msg = "[Logger] File logging disabled (write failed). Falling back to console only.";
67
+ console.warn(msg);
68
+ }
54
69
  }
55
70
  }
56
71
  if (entry.level <= this.logLevel) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/monitoring/logger.ts"],
4
- "sourcesContent": ["/**\n * Structured logging utility for StackMemory CLI\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: Error;\n}\n\nexport class Logger {\n private static instance: Logger;\n private logLevel: LogLevel = LogLevel.INFO;\n private logFile?: string;\n\n private constructor() {\n // Set log level from environment\n const envLevel = process.env.STACKMEMORY_LOG_LEVEL?.toUpperCase();\n switch (envLevel) {\n case 'ERROR':\n this.logLevel = LogLevel.ERROR;\n break;\n case 'WARN':\n this.logLevel = LogLevel.WARN;\n break;\n case 'DEBUG':\n this.logLevel = LogLevel.DEBUG;\n break;\n default:\n this.logLevel = LogLevel.INFO;\n }\n\n // Set up log file if in debug mode or if specified\n if (this.logLevel === LogLevel.DEBUG || process.env.STACKMEMORY_LOG_FILE) {\n this.logFile =\n process.env.STACKMEMORY_LOG_FILE ||\n path.join(process.env.HOME || '.', '.stackmemory', 'logs', 'cli.log');\n this.ensureLogDirectory();\n }\n }\n\n static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n private ensureLogDirectory(): void {\n if (this.logFile) {\n const logDir = path.dirname(this.logFile);\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n }\n\n private writeLog(entry: LogEntry): void {\n const logLine = JSON.stringify(entry) + '\\n';\n\n // Always write to file if configured\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, logLine);\n } catch {\n // Silent failure to prevent recursive logging\n }\n }\n\n // Console output based on level\n if (entry.level <= this.logLevel) {\n const levelNames = ['ERROR', 'WARN', 'INFO', 'DEBUG'];\n const levelName = levelNames[entry.level] || 'UNKNOWN';\n\n const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;\n\n if (entry.level === LogLevel.ERROR) {\n console.error(consoleMessage);\n if (entry.error) {\n console.error(entry.error.stack);\n }\n } else if (entry.level === LogLevel.WARN) {\n console.warn(consoleMessage);\n } else {\n console.log(consoleMessage);\n }\n }\n }\n\n error(\n message: string,\n errorOrContext?: Error | Record<string, unknown>,\n context?: Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.ERROR,\n message,\n context: isError ? context : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n warn(\n message: string,\n errorOrContext?: Error | Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.WARN,\n message,\n context: isError\n ? undefined\n : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.INFO,\n message,\n context,\n });\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.DEBUG,\n message,\n context,\n });\n }\n}\n\n// Export singleton instance\nexport const logger = Logger.getInstance();\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Structured logging utility for StackMemory CLI\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: Error;\n}\n\nexport class Logger {\n private static instance: Logger;\n private logLevel: LogLevel = LogLevel.INFO;\n private logFile?: string;\n private fileLoggingDisabledNotified = false;\n\n private constructor() {\n // Set log level from environment\n const envLevel = process.env.STACKMEMORY_LOG_LEVEL?.toUpperCase();\n switch (envLevel) {\n case 'ERROR':\n this.logLevel = LogLevel.ERROR;\n break;\n case 'WARN':\n this.logLevel = LogLevel.WARN;\n break;\n case 'DEBUG':\n this.logLevel = LogLevel.DEBUG;\n break;\n default:\n this.logLevel = LogLevel.INFO;\n }\n\n // Set up log file if in debug mode or if specified\n if (this.logLevel === LogLevel.DEBUG || process.env.STACKMEMORY_LOG_FILE) {\n this.logFile =\n process.env.STACKMEMORY_LOG_FILE ||\n path.join(process.env.HOME || '.', '.stackmemory', 'logs', 'cli.log');\n this.ensureLogDirectory();\n }\n }\n\n static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n private ensureLogDirectory(): void {\n if (!this.logFile) return;\n const logDir = path.dirname(this.logFile);\n try {\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n } catch (err) {\n // Disable file logging if we cannot create the directory (e.g., ENOSPC)\n this.logFile = undefined;\n if (!this.fileLoggingDisabledNotified) {\n this.fileLoggingDisabledNotified = true;\n // Emit a single warning to console so we don't spam output\n const msg =\n '[Logger] File logging disabled (failed to create log directory). Falling back to console only.';\n // Use console directly to avoid recursion\n // eslint-disable-next-line no-console\n console.warn(msg);\n }\n }\n }\n\n private writeLog(entry: LogEntry): void {\n const logLine = JSON.stringify(entry) + '\\n';\n\n // Always write to file if configured\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, logLine);\n } catch (err) {\n // Disable file logging on error (e.g., ENOSPC) to avoid repeated failures\n this.logFile = undefined;\n if (!this.fileLoggingDisabledNotified) {\n this.fileLoggingDisabledNotified = true;\n const msg =\n '[Logger] File logging disabled (write failed). Falling back to console only.';\n // eslint-disable-next-line no-console\n console.warn(msg);\n }\n }\n }\n\n // Console output based on level\n if (entry.level <= this.logLevel) {\n const levelNames = ['ERROR', 'WARN', 'INFO', 'DEBUG'];\n const levelName = levelNames[entry.level] || 'UNKNOWN';\n\n const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;\n\n if (entry.level === LogLevel.ERROR) {\n console.error(consoleMessage);\n if (entry.error) {\n console.error(entry.error.stack);\n }\n } else if (entry.level === LogLevel.WARN) {\n console.warn(consoleMessage);\n } else {\n console.log(consoleMessage);\n }\n }\n }\n\n error(\n message: string,\n errorOrContext?: Error | Record<string, unknown>,\n context?: Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.ERROR,\n message,\n context: isError ? context : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n warn(\n message: string,\n errorOrContext?: Error | Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.WARN,\n message,\n context: isError\n ? undefined\n : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.INFO,\n message,\n context,\n });\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.DEBUG,\n message,\n context,\n });\n }\n}\n\n// Export singleton instance\nexport const logger = Logger.getInstance();\n"],
5
+ "mappings": "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",
6
6
  "names": ["LogLevel"]
7
7
  }