@stackmemoryai/stackmemory 0.3.1 → 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 (734) hide show
  1. package/README.md +52 -272
  2. package/dist/cli/commands/clear.js +191 -0
  3. package/dist/cli/commands/clear.js.map +7 -0
  4. package/dist/cli/commands/config.js +152 -1
  5. package/dist/cli/commands/config.js.map +2 -2
  6. package/dist/cli/commands/dashboard.js +178 -0
  7. package/dist/cli/commands/dashboard.js.map +7 -0
  8. package/dist/cli/commands/handoff.js +125 -8
  9. package/dist/cli/commands/handoff.js.map +2 -2
  10. package/dist/cli/commands/linear-create.js +132 -0
  11. package/dist/cli/commands/linear-create.js.map +7 -0
  12. package/dist/cli/commands/linear-list.js +69 -0
  13. package/dist/cli/commands/linear-list.js.map +7 -0
  14. package/dist/cli/commands/linear-migrate.js +40 -0
  15. package/dist/cli/commands/linear-migrate.js.map +7 -0
  16. package/dist/cli/commands/linear.js +185 -36
  17. package/dist/cli/commands/linear.js.map +2 -2
  18. package/dist/cli/commands/monitor.js +309 -0
  19. package/dist/cli/commands/monitor.js.map +7 -0
  20. package/dist/cli/commands/quality.js +414 -0
  21. package/dist/cli/commands/quality.js.map +7 -0
  22. package/dist/cli/commands/storage.js +275 -0
  23. package/dist/cli/commands/storage.js.map +7 -0
  24. package/dist/cli/commands/tui.js +66 -0
  25. package/dist/cli/commands/tui.js.map +7 -0
  26. package/dist/cli/commands/workflow.js +134 -0
  27. package/dist/cli/commands/workflow.js.map +7 -0
  28. package/dist/cli/index.js +104 -8
  29. package/dist/cli/index.js.map +3 -3
  30. package/dist/core/analytics/team-analytics.js +374 -0
  31. package/dist/core/analytics/team-analytics.js.map +7 -0
  32. package/dist/core/context/context-bridge.js +234 -0
  33. package/dist/core/context/context-bridge.js.map +7 -0
  34. package/dist/core/context/dual-stack-manager.js +850 -0
  35. package/dist/core/context/dual-stack-manager.js.map +7 -0
  36. package/dist/core/context/frame-handoff-manager.js +384 -0
  37. package/dist/core/context/frame-handoff-manager.js.map +7 -0
  38. package/dist/core/context/frame-manager.js +132 -12
  39. package/dist/core/context/frame-manager.js.map +2 -2
  40. package/dist/core/context/permission-manager.js +181 -0
  41. package/dist/core/context/permission-manager.js.map +7 -0
  42. package/dist/core/context/shared-context-layer.js +386 -0
  43. package/dist/core/context/shared-context-layer.js.map +7 -0
  44. package/dist/core/context/stack-merge-resolver.js +600 -0
  45. package/dist/core/context/stack-merge-resolver.js.map +7 -0
  46. package/dist/core/context/validation.js +121 -0
  47. package/dist/core/context/validation.js.map +7 -0
  48. package/dist/core/database/connection-pool.js +266 -175
  49. package/dist/core/database/connection-pool.js.map +2 -2
  50. package/dist/core/database/database-adapter.js +51 -0
  51. package/dist/core/database/database-adapter.js.map +7 -0
  52. package/dist/core/database/migration-manager.js +514 -0
  53. package/dist/core/database/migration-manager.js.map +7 -0
  54. package/dist/core/database/paradedb-adapter.js +970 -0
  55. package/dist/core/database/paradedb-adapter.js.map +7 -0
  56. package/dist/core/database/query-router.js +421 -0
  57. package/dist/core/database/query-router.js.map +7 -0
  58. package/dist/core/database/sqlite-adapter.js +547 -0
  59. package/dist/core/database/sqlite-adapter.js.map +7 -0
  60. package/dist/core/errors/index.js +21 -1
  61. package/dist/core/errors/index.js.map +2 -2
  62. package/dist/core/frame/workflow-templates-stub.js +42 -0
  63. package/dist/core/frame/workflow-templates-stub.js.map +7 -0
  64. package/dist/core/frame/workflow-templates.js +276 -0
  65. package/dist/core/frame/workflow-templates.js.map +7 -0
  66. package/dist/core/merge/conflict-detector.js +5 -2
  67. package/dist/core/merge/conflict-detector.js.map +2 -2
  68. package/dist/core/merge/resolution-engine.js +3 -14
  69. package/dist/core/merge/resolution-engine.js.map +2 -2
  70. package/dist/core/merge/stack-diff.js.map +2 -2
  71. package/dist/core/monitoring/logger.js +18 -3
  72. package/dist/core/monitoring/logger.js.map +2 -2
  73. package/dist/core/monitoring/session-monitor.js +296 -0
  74. package/dist/core/monitoring/session-monitor.js.map +7 -0
  75. package/dist/core/retrieval/context-retriever.js +475 -0
  76. package/dist/core/retrieval/context-retriever.js.map +7 -0
  77. package/dist/core/retrieval/graph-retrieval.js +658 -0
  78. package/dist/core/retrieval/graph-retrieval.js.map +7 -0
  79. package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
  80. package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
  81. package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
  82. package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
  83. package/dist/core/session/clear-survival-stub.js +49 -0
  84. package/dist/core/session/clear-survival-stub.js.map +7 -0
  85. package/dist/core/session/clear-survival.js +426 -0
  86. package/dist/core/session/clear-survival.js.map +7 -0
  87. package/dist/core/session/handoff-generator.js +339 -0
  88. package/dist/core/session/handoff-generator.js.map +7 -0
  89. package/dist/core/session/session-manager.js +61 -26
  90. package/dist/core/session/session-manager.js.map +3 -3
  91. package/dist/core/skills/index.js +3 -0
  92. package/dist/core/skills/index.js.map +7 -0
  93. package/dist/core/skills/skill-storage.js +749 -0
  94. package/dist/core/skills/skill-storage.js.map +7 -0
  95. package/dist/core/skills/types.js +189 -0
  96. package/dist/core/skills/types.js.map +7 -0
  97. package/dist/core/storage/railway-optimized-storage.js +550 -0
  98. package/dist/core/storage/railway-optimized-storage.js.map +7 -0
  99. package/dist/core/storage/remote-storage.js +456 -0
  100. package/dist/core/storage/remote-storage.js.map +7 -0
  101. package/dist/core/trace/trace-detector.js +136 -5
  102. package/dist/core/trace/trace-detector.js.map +2 -2
  103. package/dist/core/trace/trace-store.js.map +2 -2
  104. package/dist/features/tui/components/analytics-panel.js +136 -0
  105. package/dist/features/tui/components/analytics-panel.js.map +7 -0
  106. package/dist/features/tui/components/frame-visualizer.js +377 -0
  107. package/dist/features/tui/components/frame-visualizer.js.map +7 -0
  108. package/dist/features/tui/components/pr-tracker.js +123 -0
  109. package/dist/features/tui/components/pr-tracker.js.map +7 -0
  110. package/dist/features/tui/components/session-monitor.js +286 -0
  111. package/dist/features/tui/components/session-monitor.js.map +7 -0
  112. package/dist/features/tui/components/subagent-fleet.js +388 -0
  113. package/dist/features/tui/components/subagent-fleet.js.map +7 -0
  114. package/dist/features/tui/components/task-board.js +475 -0
  115. package/dist/features/tui/components/task-board.js.map +7 -0
  116. package/dist/features/tui/index.js +397 -0
  117. package/dist/features/tui/index.js.map +7 -0
  118. package/dist/features/tui/services/data-service.js +654 -0
  119. package/dist/features/tui/services/data-service.js.map +7 -0
  120. package/dist/features/tui/services/websocket-client.js +149 -0
  121. package/dist/features/tui/services/websocket-client.js.map +7 -0
  122. package/dist/features/tui/terminal-compat.js +205 -0
  123. package/dist/features/tui/terminal-compat.js.map +7 -0
  124. package/dist/features/tui/types.js +1 -0
  125. package/dist/features/tui/types.js.map +7 -0
  126. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
  127. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  128. package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
  129. package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  130. package/dist/integrations/claude-code/post-task-hooks.js +541 -0
  131. package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
  132. package/dist/integrations/linear/client.js +22 -4
  133. package/dist/integrations/linear/client.js.map +2 -2
  134. package/dist/integrations/linear/migration.js +299 -0
  135. package/dist/integrations/linear/migration.js.map +7 -0
  136. package/dist/integrations/linear/oauth-server.js +396 -0
  137. package/dist/integrations/linear/oauth-server.js.map +7 -0
  138. package/dist/integrations/linear/rest-client.js +199 -0
  139. package/dist/integrations/linear/rest-client.js.map +7 -0
  140. package/dist/integrations/linear/sync.js +14 -2
  141. package/dist/integrations/linear/sync.js.map +2 -2
  142. package/dist/integrations/linear/webhook-handler.js +200 -0
  143. package/dist/integrations/linear/webhook-handler.js.map +7 -0
  144. package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
  145. package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  146. package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
  147. package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  148. package/dist/integrations/mcp/refactored-server.js +31 -3
  149. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  150. package/dist/integrations/mcp/server.js +25 -7
  151. package/dist/integrations/mcp/server.js.map +2 -2
  152. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  153. package/dist/models/user.model.js +3 -0
  154. package/dist/models/user.model.js.map +2 -2
  155. package/dist/services/context-service.js.map +2 -2
  156. package/dist/utils/formatting.js +58 -0
  157. package/dist/utils/formatting.js.map +7 -0
  158. package/package.json +21 -5
  159. package/dist/cli/__tests__/index.test.js +0 -290
  160. package/dist/cli/__tests__/index.test.js.map +0 -7
  161. package/dist/core/config/__tests__/config-manager.test.js +0 -248
  162. package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
  163. package/dist/core/context/__tests__/frame-manager.test.js +0 -879
  164. package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
  165. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
  166. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
  167. package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
  168. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
  169. package/dist/core/errors/__tests__/error-handling.test.js +0 -270
  170. package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
  171. package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
  172. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
  173. package/dist/core/query/__tests__/query-parser.test.js +0 -301
  174. package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
  175. package/dist/core/query/__tests__/query-templates.test.js +0 -210
  176. package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
  177. package/dist/core/trace/trace-detector.test.js +0 -401
  178. package/dist/core/trace/trace-detector.test.js.map +0 -7
  179. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
  180. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
  181. package/dist/integrations/linear/__tests__/auth.test.js +0 -558
  182. package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
  183. package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
  184. package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
  185. package/dist/integrations/mcp/__tests__/server.test.js +0 -798
  186. package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
  187. package/dist/scripts/benchmark-performance.d.ts +0 -7
  188. package/dist/scripts/benchmark-performance.d.ts.map +0 -1
  189. package/dist/scripts/benchmark-performance.js +0 -44
  190. package/dist/scripts/benchmark-performance.js.map +0 -1
  191. package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
  192. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
  193. package/dist/scripts/cancel-duplicate-tasks.js +0 -172
  194. package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
  195. package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
  196. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
  197. package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
  198. package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
  199. package/dist/scripts/initialize.d.ts +0 -6
  200. package/dist/scripts/initialize.d.ts.map +0 -1
  201. package/dist/scripts/initialize.js +0 -93
  202. package/dist/scripts/initialize.js.map +0 -1
  203. package/dist/scripts/list-linear-tasks.d.ts +0 -6
  204. package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
  205. package/dist/scripts/list-linear-tasks.js +0 -121
  206. package/dist/scripts/list-linear-tasks.js.map +0 -1
  207. package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
  208. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
  209. package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
  210. package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
  211. package/dist/scripts/show-linear-summary.d.ts +0 -6
  212. package/dist/scripts/show-linear-summary.d.ts.map +0 -1
  213. package/dist/scripts/show-linear-summary.js +0 -120
  214. package/dist/scripts/show-linear-summary.js.map +0 -1
  215. package/dist/scripts/status.d.ts +0 -6
  216. package/dist/scripts/status.d.ts.map +0 -1
  217. package/dist/scripts/status.js +0 -101
  218. package/dist/scripts/status.js.map +0 -1
  219. package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
  220. package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
  221. package/dist/src/agents/core/agent-task-manager.js +0 -504
  222. package/dist/src/agents/core/agent-task-manager.js.map +0 -1
  223. package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
  224. package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
  225. package/dist/src/agents/verifiers/base-verifier.js +0 -130
  226. package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
  227. package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
  228. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
  229. package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
  230. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
  231. package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
  232. package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
  233. package/dist/src/agents/verifiers/llm-judge.js +0 -248
  234. package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
  235. package/dist/src/cli/auto-detect.d.ts +0 -61
  236. package/dist/src/cli/auto-detect.d.ts.map +0 -1
  237. package/dist/src/cli/auto-detect.js +0 -350
  238. package/dist/src/cli/auto-detect.js.map +0 -1
  239. package/dist/src/cli/browser-test.d.ts +0 -6
  240. package/dist/src/cli/browser-test.d.ts.map +0 -1
  241. package/dist/src/cli/browser-test.js +0 -32
  242. package/dist/src/cli/browser-test.js.map +0 -1
  243. package/dist/src/cli/claude-sm.d.ts +0 -7
  244. package/dist/src/cli/claude-sm.d.ts.map +0 -1
  245. package/dist/src/cli/claude-sm.js +0 -412
  246. package/dist/src/cli/claude-sm.js.map +0 -1
  247. package/dist/src/cli/commands/agent.d.ts +0 -9
  248. package/dist/src/cli/commands/agent.d.ts.map +0 -1
  249. package/dist/src/cli/commands/agent.js +0 -303
  250. package/dist/src/cli/commands/agent.js.map +0 -1
  251. package/dist/src/cli/commands/config.d.ts +0 -6
  252. package/dist/src/cli/commands/config.d.ts.map +0 -1
  253. package/dist/src/cli/commands/config.js +0 -224
  254. package/dist/src/cli/commands/config.js.map +0 -1
  255. package/dist/src/cli/commands/context.d.ts +0 -7
  256. package/dist/src/cli/commands/context.d.ts.map +0 -1
  257. package/dist/src/cli/commands/context.js +0 -365
  258. package/dist/src/cli/commands/context.js.map +0 -1
  259. package/dist/src/cli/commands/handoff.d.ts +0 -6
  260. package/dist/src/cli/commands/handoff.d.ts.map +0 -1
  261. package/dist/src/cli/commands/handoff.js +0 -212
  262. package/dist/src/cli/commands/handoff.js.map +0 -1
  263. package/dist/src/cli/commands/linear-test.d.ts +0 -6
  264. package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
  265. package/dist/src/cli/commands/linear-test.js +0 -123
  266. package/dist/src/cli/commands/linear-test.js.map +0 -1
  267. package/dist/src/cli/commands/linear.d.ts +0 -6
  268. package/dist/src/cli/commands/linear.d.ts.map +0 -1
  269. package/dist/src/cli/commands/linear.js +0 -393
  270. package/dist/src/cli/commands/linear.js.map +0 -1
  271. package/dist/src/cli/commands/log.d.ts +0 -7
  272. package/dist/src/cli/commands/log.d.ts.map +0 -1
  273. package/dist/src/cli/commands/log.js +0 -168
  274. package/dist/src/cli/commands/log.js.map +0 -1
  275. package/dist/src/cli/commands/onboard.d.ts +0 -8
  276. package/dist/src/cli/commands/onboard.d.ts.map +0 -1
  277. package/dist/src/cli/commands/onboard.js +0 -363
  278. package/dist/src/cli/commands/onboard.js.map +0 -1
  279. package/dist/src/cli/commands/projects.d.ts +0 -8
  280. package/dist/src/cli/commands/projects.d.ts.map +0 -1
  281. package/dist/src/cli/commands/projects.js +0 -220
  282. package/dist/src/cli/commands/projects.js.map +0 -1
  283. package/dist/src/cli/commands/search.d.ts +0 -7
  284. package/dist/src/cli/commands/search.d.ts.map +0 -1
  285. package/dist/src/cli/commands/search.js +0 -162
  286. package/dist/src/cli/commands/search.js.map +0 -1
  287. package/dist/src/cli/commands/session.d.ts +0 -7
  288. package/dist/src/cli/commands/session.d.ts.map +0 -1
  289. package/dist/src/cli/commands/session.js +0 -222
  290. package/dist/src/cli/commands/session.js.map +0 -1
  291. package/dist/src/cli/commands/tasks.d.ts +0 -7
  292. package/dist/src/cli/commands/tasks.d.ts.map +0 -1
  293. package/dist/src/cli/commands/tasks.js +0 -229
  294. package/dist/src/cli/commands/tasks.js.map +0 -1
  295. package/dist/src/cli/commands/webhook.d.ts +0 -3
  296. package/dist/src/cli/commands/webhook.d.ts.map +0 -1
  297. package/dist/src/cli/commands/webhook.js +0 -157
  298. package/dist/src/cli/commands/webhook.js.map +0 -1
  299. package/dist/src/cli/commands/worktree.d.ts +0 -8
  300. package/dist/src/cli/commands/worktree.d.ts.map +0 -1
  301. package/dist/src/cli/commands/worktree.js +0 -339
  302. package/dist/src/cli/commands/worktree.js.map +0 -1
  303. package/dist/src/cli/index.d.ts +0 -8
  304. package/dist/src/cli/index.d.ts.map +0 -1
  305. package/dist/src/cli/index.js +0 -995
  306. package/dist/src/cli/index.js.map +0 -1
  307. package/dist/src/cli/utils/viewer.d.ts +0 -3
  308. package/dist/src/cli/utils/viewer.d.ts.map +0 -1
  309. package/dist/src/cli/utils/viewer.js +0 -91
  310. package/dist/src/cli/utils/viewer.js.map +0 -1
  311. package/dist/src/core/config/config-manager.d.ts +0 -95
  312. package/dist/src/core/config/config-manager.d.ts.map +0 -1
  313. package/dist/src/core/config/config-manager.js +0 -359
  314. package/dist/src/core/config/config-manager.js.map +0 -1
  315. package/dist/src/core/config/types.d.ts +0 -72
  316. package/dist/src/core/config/types.d.ts.map +0 -1
  317. package/dist/src/core/config/types.js +0 -127
  318. package/dist/src/core/config/types.js.map +0 -1
  319. package/dist/src/core/context/auto-context.d.ts +0 -22
  320. package/dist/src/core/context/auto-context.d.ts.map +0 -1
  321. package/dist/src/core/context/auto-context.js +0 -77
  322. package/dist/src/core/context/auto-context.js.map +0 -1
  323. package/dist/src/core/context/compaction-handler.d.ts +0 -119
  324. package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
  325. package/dist/src/core/context/compaction-handler.js +0 -306
  326. package/dist/src/core/context/compaction-handler.js.map +0 -1
  327. package/dist/src/core/context/frame-database.d.ts +0 -59
  328. package/dist/src/core/context/frame-database.d.ts.map +0 -1
  329. package/dist/src/core/context/frame-database.js +0 -333
  330. package/dist/src/core/context/frame-database.js.map +0 -1
  331. package/dist/src/core/context/frame-digest.d.ts +0 -59
  332. package/dist/src/core/context/frame-digest.d.ts.map +0 -1
  333. package/dist/src/core/context/frame-digest.js +0 -264
  334. package/dist/src/core/context/frame-digest.js.map +0 -1
  335. package/dist/src/core/context/frame-manager.d.ts +0 -112
  336. package/dist/src/core/context/frame-manager.d.ts.map +0 -1
  337. package/dist/src/core/context/frame-manager.js +0 -600
  338. package/dist/src/core/context/frame-manager.js.map +0 -1
  339. package/dist/src/core/context/frame-stack.d.ts +0 -85
  340. package/dist/src/core/context/frame-stack.d.ts.map +0 -1
  341. package/dist/src/core/context/frame-stack.js +0 -287
  342. package/dist/src/core/context/frame-stack.js.map +0 -1
  343. package/dist/src/core/context/frame-types.d.ts +0 -67
  344. package/dist/src/core/context/frame-types.d.ts.map +0 -1
  345. package/dist/src/core/context/frame-types.js +0 -6
  346. package/dist/src/core/context/frame-types.js.map +0 -1
  347. package/dist/src/core/context/index.d.ts +0 -11
  348. package/dist/src/core/context/index.d.ts.map +0 -1
  349. package/dist/src/core/context/index.js +0 -14
  350. package/dist/src/core/context/index.js.map +0 -1
  351. package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
  352. package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
  353. package/dist/src/core/context/model-aware-compaction.js +0 -616
  354. package/dist/src/core/context/model-aware-compaction.js.map +0 -1
  355. package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
  356. package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
  357. package/dist/src/core/context/refactored-frame-manager.js +0 -340
  358. package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
  359. package/dist/src/core/database/batch-operations.d.ts +0 -118
  360. package/dist/src/core/database/batch-operations.d.ts.map +0 -1
  361. package/dist/src/core/database/batch-operations.js +0 -339
  362. package/dist/src/core/database/batch-operations.js.map +0 -1
  363. package/dist/src/core/database/connection-pool.d.ts +0 -79
  364. package/dist/src/core/database/connection-pool.d.ts.map +0 -1
  365. package/dist/src/core/database/connection-pool.js +0 -236
  366. package/dist/src/core/database/connection-pool.js.map +0 -1
  367. package/dist/src/core/database/query-cache.d.ts +0 -135
  368. package/dist/src/core/database/query-cache.d.ts.map +0 -1
  369. package/dist/src/core/database/query-cache.js +0 -294
  370. package/dist/src/core/database/query-cache.js.map +0 -1
  371. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
  372. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
  373. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
  374. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
  375. package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
  376. package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
  377. package/dist/src/core/digest/frame-digest-integration.js +0 -198
  378. package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
  379. package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
  380. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
  381. package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
  382. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
  383. package/dist/src/core/digest/index.d.ts +0 -9
  384. package/dist/src/core/digest/index.d.ts.map +0 -1
  385. package/dist/src/core/digest/index.js +0 -9
  386. package/dist/src/core/digest/index.js.map +0 -1
  387. package/dist/src/core/digest/types.d.ts +0 -154
  388. package/dist/src/core/digest/types.d.ts.map +0 -1
  389. package/dist/src/core/digest/types.js +0 -18
  390. package/dist/src/core/digest/types.js.map +0 -1
  391. package/dist/src/core/errors/index.d.ts +0 -143
  392. package/dist/src/core/errors/index.d.ts.map +0 -1
  393. package/dist/src/core/errors/index.js +0 -282
  394. package/dist/src/core/errors/index.js.map +0 -1
  395. package/dist/src/core/errors/recovery.d.ts +0 -86
  396. package/dist/src/core/errors/recovery.d.ts.map +0 -1
  397. package/dist/src/core/errors/recovery.js +0 -274
  398. package/dist/src/core/errors/recovery.js.map +0 -1
  399. package/dist/src/core/merge/conflict-detector.d.ts +0 -122
  400. package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
  401. package/dist/src/core/merge/conflict-detector.js +0 -468
  402. package/dist/src/core/merge/conflict-detector.js.map +0 -1
  403. package/dist/src/core/merge/index.d.ts +0 -9
  404. package/dist/src/core/merge/index.d.ts.map +0 -1
  405. package/dist/src/core/merge/index.js +0 -9
  406. package/dist/src/core/merge/index.js.map +0 -1
  407. package/dist/src/core/merge/resolution-engine.d.ts +0 -120
  408. package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
  409. package/dist/src/core/merge/resolution-engine.js +0 -573
  410. package/dist/src/core/merge/resolution-engine.js.map +0 -1
  411. package/dist/src/core/merge/stack-diff.d.ts +0 -97
  412. package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
  413. package/dist/src/core/merge/stack-diff.js +0 -516
  414. package/dist/src/core/merge/stack-diff.js.map +0 -1
  415. package/dist/src/core/merge/types.d.ts +0 -110
  416. package/dist/src/core/merge/types.d.ts.map +0 -1
  417. package/dist/src/core/merge/types.js +0 -6
  418. package/dist/src/core/merge/types.js.map +0 -1
  419. package/dist/src/core/monitoring/error-handler.d.ts +0 -46
  420. package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
  421. package/dist/src/core/monitoring/error-handler.js +0 -212
  422. package/dist/src/core/monitoring/error-handler.js.map +0 -1
  423. package/dist/src/core/monitoring/logger.d.ts +0 -24
  424. package/dist/src/core/monitoring/logger.d.ts.map +0 -1
  425. package/dist/src/core/monitoring/logger.js +0 -126
  426. package/dist/src/core/monitoring/logger.js.map +0 -1
  427. package/dist/src/core/monitoring/metrics.d.ts +0 -10
  428. package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
  429. package/dist/src/core/monitoring/metrics.js +0 -152
  430. package/dist/src/core/monitoring/metrics.js.map +0 -1
  431. package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
  432. package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
  433. package/dist/src/core/monitoring/progress-tracker.js +0 -178
  434. package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
  435. package/dist/src/core/performance/context-cache.d.ts +0 -109
  436. package/dist/src/core/performance/context-cache.d.ts.map +0 -1
  437. package/dist/src/core/performance/context-cache.js +0 -280
  438. package/dist/src/core/performance/context-cache.js.map +0 -1
  439. package/dist/src/core/performance/index.d.ts +0 -3
  440. package/dist/src/core/performance/index.d.ts.map +0 -1
  441. package/dist/src/core/performance/index.js +0 -3
  442. package/dist/src/core/performance/index.js.map +0 -1
  443. package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
  444. package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
  445. package/dist/src/core/performance/lazy-context-loader.js +0 -332
  446. package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
  447. package/dist/src/core/performance/monitor.d.ts +0 -48
  448. package/dist/src/core/performance/monitor.d.ts.map +0 -1
  449. package/dist/src/core/performance/monitor.js +0 -226
  450. package/dist/src/core/performance/monitor.js.map +0 -1
  451. package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
  452. package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
  453. package/dist/src/core/performance/optimized-frame-context.js +0 -330
  454. package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
  455. package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
  456. package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
  457. package/dist/src/core/performance/performance-benchmark.js +0 -290
  458. package/dist/src/core/performance/performance-benchmark.js.map +0 -1
  459. package/dist/src/core/performance/performance-profiler.d.ts +0 -151
  460. package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
  461. package/dist/src/core/performance/performance-profiler.js +0 -346
  462. package/dist/src/core/performance/performance-profiler.js.map +0 -1
  463. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
  464. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
  465. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
  466. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
  467. package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
  468. package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
  469. package/dist/src/core/persistence/postgres-adapter.js +0 -330
  470. package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
  471. package/dist/src/core/projects/project-manager.d.ts +0 -130
  472. package/dist/src/core/projects/project-manager.d.ts.map +0 -1
  473. package/dist/src/core/projects/project-manager.js +0 -709
  474. package/dist/src/core/projects/project-manager.js.map +0 -1
  475. package/dist/src/core/query/query-parser.d.ts +0 -109
  476. package/dist/src/core/query/query-parser.d.ts.map +0 -1
  477. package/dist/src/core/query/query-parser.js +0 -415
  478. package/dist/src/core/query/query-parser.js.map +0 -1
  479. package/dist/src/core/query/query-templates.d.ts +0 -44
  480. package/dist/src/core/query/query-templates.d.ts.map +0 -1
  481. package/dist/src/core/query/query-templates.js +0 -326
  482. package/dist/src/core/query/query-templates.js.map +0 -1
  483. package/dist/src/core/retrieval/index.d.ts +0 -8
  484. package/dist/src/core/retrieval/index.d.ts.map +0 -1
  485. package/dist/src/core/retrieval/index.js +0 -8
  486. package/dist/src/core/retrieval/index.js.map +0 -1
  487. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
  488. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
  489. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
  490. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
  491. package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
  492. package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
  493. package/dist/src/core/retrieval/summary-generator.js +0 -622
  494. package/dist/src/core/retrieval/summary-generator.js.map +0 -1
  495. package/dist/src/core/retrieval/types.d.ts +0 -257
  496. package/dist/src/core/retrieval/types.d.ts.map +0 -1
  497. package/dist/src/core/retrieval/types.js +0 -18
  498. package/dist/src/core/retrieval/types.js.map +0 -1
  499. package/dist/src/core/session/index.d.ts +0 -2
  500. package/dist/src/core/session/index.d.ts.map +0 -1
  501. package/dist/src/core/session/index.js +0 -2
  502. package/dist/src/core/session/index.js.map +0 -1
  503. package/dist/src/core/session/session-manager.d.ts +0 -69
  504. package/dist/src/core/session/session-manager.d.ts.map +0 -1
  505. package/dist/src/core/session/session-manager.js +0 -311
  506. package/dist/src/core/session/session-manager.js.map +0 -1
  507. package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
  508. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
  509. package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
  510. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
  511. package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
  512. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
  513. package/dist/src/core/trace/db-trace-wrapper.js +0 -252
  514. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
  515. package/dist/src/core/trace/debug-trace.d.ts +0 -84
  516. package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
  517. package/dist/src/core/trace/debug-trace.js +0 -402
  518. package/dist/src/core/trace/debug-trace.js.map +0 -1
  519. package/dist/src/core/trace/error-test.d.ts +0 -6
  520. package/dist/src/core/trace/error-test.d.ts.map +0 -1
  521. package/dist/src/core/trace/error-test.js +0 -128
  522. package/dist/src/core/trace/error-test.js.map +0 -1
  523. package/dist/src/core/trace/index.d.ts +0 -25
  524. package/dist/src/core/trace/index.d.ts.map +0 -1
  525. package/dist/src/core/trace/index.js +0 -121
  526. package/dist/src/core/trace/index.js.map +0 -1
  527. package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
  528. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
  529. package/dist/src/core/trace/linear-api-wrapper.js +0 -205
  530. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
  531. package/dist/src/core/trace/performance-test.d.ts +0 -6
  532. package/dist/src/core/trace/performance-test.d.ts.map +0 -1
  533. package/dist/src/core/trace/performance-test.js +0 -111
  534. package/dist/src/core/trace/performance-test.js.map +0 -1
  535. package/dist/src/core/trace/trace-demo.d.ts +0 -8
  536. package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
  537. package/dist/src/core/trace/trace-demo.js +0 -154
  538. package/dist/src/core/trace/trace-demo.js.map +0 -1
  539. package/dist/src/core/trace/trace-detector.d.ts +0 -108
  540. package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
  541. package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
  542. package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
  543. package/dist/src/core/trace/trace-detector.demo.js +0 -145
  544. package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
  545. package/dist/src/core/trace/trace-detector.js +0 -425
  546. package/dist/src/core/trace/trace-detector.js.map +0 -1
  547. package/dist/src/core/trace/trace-store.d.ts +0 -60
  548. package/dist/src/core/trace/trace-store.d.ts.map +0 -1
  549. package/dist/src/core/trace/trace-store.js +0 -323
  550. package/dist/src/core/trace/trace-store.js.map +0 -1
  551. package/dist/src/core/trace/types.d.ts +0 -81
  552. package/dist/src/core/trace/types.d.ts.map +0 -1
  553. package/dist/src/core/trace/types.js +0 -70
  554. package/dist/src/core/trace/types.js.map +0 -1
  555. package/dist/src/core/types.d.ts +0 -35
  556. package/dist/src/core/types.d.ts.map +0 -1
  557. package/dist/src/core/types.js +0 -2
  558. package/dist/src/core/types.js.map +0 -1
  559. package/dist/src/core/utils/update-checker.d.ts +0 -38
  560. package/dist/src/core/utils/update-checker.d.ts.map +0 -1
  561. package/dist/src/core/utils/update-checker.js +0 -213
  562. package/dist/src/core/utils/update-checker.js.map +0 -1
  563. package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
  564. package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
  565. package/dist/src/core/worktree/worktree-manager.js +0 -456
  566. package/dist/src/core/worktree/worktree-manager.js.map +0 -1
  567. package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
  568. package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
  569. package/dist/src/features/analytics/api/analytics-api.js +0 -289
  570. package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
  571. package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
  572. package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
  573. package/dist/src/features/analytics/core/analytics-service.js +0 -275
  574. package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
  575. package/dist/src/features/analytics/index.d.ts +0 -12
  576. package/dist/src/features/analytics/index.d.ts.map +0 -1
  577. package/dist/src/features/analytics/index.js +0 -11
  578. package/dist/src/features/analytics/index.js.map +0 -1
  579. package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
  580. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
  581. package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
  582. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
  583. package/dist/src/features/analytics/types/metrics.d.ts +0 -60
  584. package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
  585. package/dist/src/features/analytics/types/metrics.js +0 -2
  586. package/dist/src/features/analytics/types/metrics.js.map +0 -1
  587. package/dist/src/features/browser/browser-mcp.d.ts +0 -94
  588. package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
  589. package/dist/src/features/browser/browser-mcp.js +0 -459
  590. package/dist/src/features/browser/browser-mcp.js.map +0 -1
  591. package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
  592. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
  593. package/dist/src/features/tasks/pebbles-task-store.js +0 -572
  594. package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
  595. package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
  596. package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
  597. package/dist/src/features/tasks/task-aware-context.js +0 -412
  598. package/dist/src/features/tasks/task-aware-context.js.map +0 -1
  599. package/dist/src/index.d.ts +0 -21
  600. package/dist/src/index.d.ts.map +0 -1
  601. package/dist/src/index.js +0 -9
  602. package/dist/src/index.js.map +0 -1
  603. package/dist/src/integrations/linear/auth.d.ts +0 -99
  604. package/dist/src/integrations/linear/auth.d.ts.map +0 -1
  605. package/dist/src/integrations/linear/auth.js +0 -319
  606. package/dist/src/integrations/linear/auth.js.map +0 -1
  607. package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
  608. package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
  609. package/dist/src/integrations/linear/auto-sync.js +0 -268
  610. package/dist/src/integrations/linear/auto-sync.js.map +0 -1
  611. package/dist/src/integrations/linear/client.d.ts +0 -127
  612. package/dist/src/integrations/linear/client.d.ts.map +0 -1
  613. package/dist/src/integrations/linear/client.js +0 -446
  614. package/dist/src/integrations/linear/client.js.map +0 -1
  615. package/dist/src/integrations/linear/config.d.ts +0 -51
  616. package/dist/src/integrations/linear/config.d.ts.map +0 -1
  617. package/dist/src/integrations/linear/config.js +0 -103
  618. package/dist/src/integrations/linear/config.js.map +0 -1
  619. package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
  620. package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
  621. package/dist/src/integrations/linear/sync-manager.js +0 -235
  622. package/dist/src/integrations/linear/sync-manager.js.map +0 -1
  623. package/dist/src/integrations/linear/sync-service.d.ts +0 -46
  624. package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
  625. package/dist/src/integrations/linear/sync-service.js +0 -217
  626. package/dist/src/integrations/linear/sync-service.js.map +0 -1
  627. package/dist/src/integrations/linear/sync.d.ts +0 -125
  628. package/dist/src/integrations/linear/sync.d.ts.map +0 -1
  629. package/dist/src/integrations/linear/sync.js +0 -563
  630. package/dist/src/integrations/linear/sync.js.map +0 -1
  631. package/dist/src/integrations/linear/types.d.ts +0 -90
  632. package/dist/src/integrations/linear/types.d.ts.map +0 -1
  633. package/dist/src/integrations/linear/types.js +0 -2
  634. package/dist/src/integrations/linear/types.js.map +0 -1
  635. package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
  636. package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
  637. package/dist/src/integrations/linear/webhook-server.js +0 -190
  638. package/dist/src/integrations/linear/webhook-server.js.map +0 -1
  639. package/dist/src/integrations/linear/webhook.d.ts +0 -108
  640. package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
  641. package/dist/src/integrations/linear/webhook.js +0 -291
  642. package/dist/src/integrations/linear/webhook.js.map +0 -1
  643. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
  644. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
  645. package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
  646. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
  647. package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
  648. package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
  649. package/dist/src/integrations/mcp/handlers/index.js +0 -134
  650. package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
  651. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
  652. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
  653. package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
  654. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
  655. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
  656. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
  657. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
  658. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
  659. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
  660. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
  661. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
  662. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
  663. package/dist/src/integrations/mcp/index.d.ts +0 -13
  664. package/dist/src/integrations/mcp/index.d.ts.map +0 -1
  665. package/dist/src/integrations/mcp/index.js +0 -17
  666. package/dist/src/integrations/mcp/index.js.map +0 -1
  667. package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
  668. package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
  669. package/dist/src/integrations/mcp/refactored-server.js +0 -351
  670. package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
  671. package/dist/src/integrations/mcp/server.d.ts +0 -54
  672. package/dist/src/integrations/mcp/server.d.ts.map +0 -1
  673. package/dist/src/integrations/mcp/server.js +0 -1616
  674. package/dist/src/integrations/mcp/server.js.map +0 -1
  675. package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
  676. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
  677. package/dist/src/integrations/mcp/tool-definitions.js +0 -563
  678. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
  679. package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
  680. package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
  681. package/dist/src/integrations/mcp/trace-test.js +0 -54
  682. package/dist/src/integrations/mcp/trace-test.js.map +0 -1
  683. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
  684. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
  685. package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
  686. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
  687. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
  688. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
  689. package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
  690. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
  691. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
  692. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
  693. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
  694. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
  695. package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
  696. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
  697. package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
  698. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
  699. package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
  700. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
  701. package/dist/src/middleware/exponential-rate-limiter.js +0 -293
  702. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
  703. package/dist/src/models/user.model.d.ts +0 -62
  704. package/dist/src/models/user.model.d.ts.map +0 -1
  705. package/dist/src/models/user.model.js +0 -311
  706. package/dist/src/models/user.model.js.map +0 -1
  707. package/dist/src/servers/production/auth-middleware.d.ts +0 -76
  708. package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
  709. package/dist/src/servers/production/auth-middleware.js +0 -558
  710. package/dist/src/servers/production/auth-middleware.js.map +0 -1
  711. package/dist/src/servers/railway/index.d.ts +0 -7
  712. package/dist/src/servers/railway/index.d.ts.map +0 -1
  713. package/dist/src/servers/railway/index.js +0 -401
  714. package/dist/src/servers/railway/index.js.map +0 -1
  715. package/dist/src/services/config-service.d.ts +0 -44
  716. package/dist/src/services/config-service.d.ts.map +0 -1
  717. package/dist/src/services/config-service.js +0 -61
  718. package/dist/src/services/config-service.js.map +0 -1
  719. package/dist/src/services/context-service.d.ts +0 -17
  720. package/dist/src/services/context-service.d.ts.map +0 -1
  721. package/dist/src/services/context-service.js +0 -173
  722. package/dist/src/services/context-service.js.map +0 -1
  723. package/dist/src/types/task.d.ts +0 -27
  724. package/dist/src/types/task.d.ts.map +0 -1
  725. package/dist/src/types/task.js +0 -2
  726. package/dist/src/types/task.js.map +0 -1
  727. package/dist/src/utils/logger.d.ts +0 -13
  728. package/dist/src/utils/logger.d.ts.map +0 -1
  729. package/dist/src/utils/logger.js +0 -52
  730. package/dist/src/utils/logger.js.map +0 -1
  731. package/dist/src/validation/schemas.d.ts +0 -633
  732. package/dist/src/validation/schemas.d.ts.map +0 -1
  733. package/dist/src/validation/schemas.js +0 -347
  734. 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": "AAIA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEf,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AAJU,SAAAA;AAAA,GAAA;AAeL,MAAM,OAAO;AAAA,EAClB,OAAe;AAAA,EACP,WAAqB;AAAA,EACrB;AAAA,EAEA,cAAc;AAEpB,UAAM,WAAW,QAAQ,IAAI,uBAAuB,YAAY;AAChE,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AACH,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AACH,aAAK,WAAW;AAChB;AAAA,MACF;AACE,aAAK,WAAW;AAAA,IACpB;AAGA,QAAI,KAAK,aAAa,iBAAkB,QAAQ,IAAI,sBAAsB;AACxE,WAAK,UACH,QAAQ,IAAI,wBACZ,KAAK,KAAK,QAAQ,IAAI,QAAQ,KAAK,gBAAgB,QAAQ,SAAS;AACtE,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,cAAsB;AAC3B,QAAI,CAAC,OAAO,UAAU;AACpB,aAAO,WAAW,IAAI,OAAO;AAAA,IAC/B;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEQ,qBAA2B;AACjC,QAAI,KAAK,SAAS;AAChB,YAAM,SAAS,KAAK,QAAQ,KAAK,OAAO;AACxC,UAAI,CAAC,GAAG,WAAW,MAAM,GAAG;AAC1B,WAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAS,OAAuB;AACtC,UAAM,UAAU,KAAK,UAAU,KAAK,IAAI;AAGxC,QAAI,KAAK,SAAS;AAChB,UAAI;AACF,WAAG,eAAe,KAAK,SAAS,OAAO;AAAA,MACzC,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,MAAM,SAAS,KAAK,UAAU;AAChC,YAAM,aAAa,CAAC,SAAS,QAAQ,QAAQ,OAAO;AACpD,YAAM,YAAY,WAAW,MAAM,KAAK,KAAK;AAE7C,YAAM,iBAAiB,IAAI,MAAM,SAAS,KAAK,SAAS,KAAK,MAAM,OAAO;AAE1E,UAAI,MAAM,UAAU,eAAgB;AAClC,gBAAQ,MAAM,cAAc;AAC5B,YAAI,MAAM,OAAO;AACf,kBAAQ,MAAM,MAAM,MAAM,KAAK;AAAA,QACjC;AAAA,MACF,WAAW,MAAM,UAAU,cAAe;AACxC,gBAAQ,KAAK,cAAc;AAAA,MAC7B,OAAO;AACL,gBAAQ,IAAI,cAAc;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MACE,SACA,gBACA,SACM;AACN,UAAM,UAAU,0BAA0B;AAC1C,SAAK,SAAS;AAAA,MACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO;AAAA,MACP;AAAA,MACA,SAAS,UAAU,UAAW;AAAA,MAC9B,OAAO,UAAU,iBAAiB;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,KACE,SACA,gBACM;AACN,UAAM,UAAU,0BAA0B;AAC1C,SAAK,SAAS;AAAA,MACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO;AAAA,MACP;AAAA,MACA,SAAS,UACL,SACC;AAAA,MACL,OAAO,UAAU,iBAAiB;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,SAAiB,SAAyC;AAC7D,SAAK,SAAS;AAAA,MACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAiB,SAAyC;AAC9D,SAAK,SAAS;AAAA,MACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAGO,MAAM,SAAS,OAAO,YAAY;",
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
  }