@stackmemoryai/stackmemory 0.3.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (736) hide show
  1. package/README.md +52 -272
  2. package/dist/cli/codex-sm.js +48 -19
  3. package/dist/cli/codex-sm.js.map +2 -2
  4. package/dist/cli/commands/clear.js +191 -0
  5. package/dist/cli/commands/clear.js.map +7 -0
  6. package/dist/cli/commands/config.js +152 -1
  7. package/dist/cli/commands/config.js.map +2 -2
  8. package/dist/cli/commands/dashboard.js +178 -0
  9. package/dist/cli/commands/dashboard.js.map +7 -0
  10. package/dist/cli/commands/handoff.js +125 -8
  11. package/dist/cli/commands/handoff.js.map +2 -2
  12. package/dist/cli/commands/linear-create.js +132 -0
  13. package/dist/cli/commands/linear-create.js.map +7 -0
  14. package/dist/cli/commands/linear-list.js +69 -0
  15. package/dist/cli/commands/linear-list.js.map +7 -0
  16. package/dist/cli/commands/linear-migrate.js +40 -0
  17. package/dist/cli/commands/linear-migrate.js.map +7 -0
  18. package/dist/cli/commands/linear.js +185 -36
  19. package/dist/cli/commands/linear.js.map +2 -2
  20. package/dist/cli/commands/monitor.js +309 -0
  21. package/dist/cli/commands/monitor.js.map +7 -0
  22. package/dist/cli/commands/quality.js +414 -0
  23. package/dist/cli/commands/quality.js.map +7 -0
  24. package/dist/cli/commands/storage.js +275 -0
  25. package/dist/cli/commands/storage.js.map +7 -0
  26. package/dist/cli/commands/tui.js +66 -0
  27. package/dist/cli/commands/tui.js.map +7 -0
  28. package/dist/cli/commands/workflow.js +134 -0
  29. package/dist/cli/commands/workflow.js.map +7 -0
  30. package/dist/cli/index.js +105 -9
  31. package/dist/cli/index.js.map +3 -3
  32. package/dist/core/analytics/team-analytics.js +374 -0
  33. package/dist/core/analytics/team-analytics.js.map +7 -0
  34. package/dist/core/context/context-bridge.js +234 -0
  35. package/dist/core/context/context-bridge.js.map +7 -0
  36. package/dist/core/context/dual-stack-manager.js +850 -0
  37. package/dist/core/context/dual-stack-manager.js.map +7 -0
  38. package/dist/core/context/frame-handoff-manager.js +384 -0
  39. package/dist/core/context/frame-handoff-manager.js.map +7 -0
  40. package/dist/core/context/frame-manager.js +132 -12
  41. package/dist/core/context/frame-manager.js.map +2 -2
  42. package/dist/core/context/permission-manager.js +181 -0
  43. package/dist/core/context/permission-manager.js.map +7 -0
  44. package/dist/core/context/shared-context-layer.js +386 -0
  45. package/dist/core/context/shared-context-layer.js.map +7 -0
  46. package/dist/core/context/stack-merge-resolver.js +600 -0
  47. package/dist/core/context/stack-merge-resolver.js.map +7 -0
  48. package/dist/core/context/validation.js +121 -0
  49. package/dist/core/context/validation.js.map +7 -0
  50. package/dist/core/database/connection-pool.js +266 -175
  51. package/dist/core/database/connection-pool.js.map +2 -2
  52. package/dist/core/database/database-adapter.js +51 -0
  53. package/dist/core/database/database-adapter.js.map +7 -0
  54. package/dist/core/database/migration-manager.js +514 -0
  55. package/dist/core/database/migration-manager.js.map +7 -0
  56. package/dist/core/database/paradedb-adapter.js +970 -0
  57. package/dist/core/database/paradedb-adapter.js.map +7 -0
  58. package/dist/core/database/query-router.js +421 -0
  59. package/dist/core/database/query-router.js.map +7 -0
  60. package/dist/core/database/sqlite-adapter.js +547 -0
  61. package/dist/core/database/sqlite-adapter.js.map +7 -0
  62. package/dist/core/errors/index.js +21 -1
  63. package/dist/core/errors/index.js.map +2 -2
  64. package/dist/core/frame/workflow-templates-stub.js +42 -0
  65. package/dist/core/frame/workflow-templates-stub.js.map +7 -0
  66. package/dist/core/frame/workflow-templates.js +276 -0
  67. package/dist/core/frame/workflow-templates.js.map +7 -0
  68. package/dist/core/merge/conflict-detector.js +5 -2
  69. package/dist/core/merge/conflict-detector.js.map +2 -2
  70. package/dist/core/merge/resolution-engine.js +3 -14
  71. package/dist/core/merge/resolution-engine.js.map +2 -2
  72. package/dist/core/merge/stack-diff.js.map +2 -2
  73. package/dist/core/monitoring/logger.js +18 -3
  74. package/dist/core/monitoring/logger.js.map +2 -2
  75. package/dist/core/monitoring/session-monitor.js +296 -0
  76. package/dist/core/monitoring/session-monitor.js.map +7 -0
  77. package/dist/core/retrieval/context-retriever.js +475 -0
  78. package/dist/core/retrieval/context-retriever.js.map +7 -0
  79. package/dist/core/retrieval/graph-retrieval.js +658 -0
  80. package/dist/core/retrieval/graph-retrieval.js.map +7 -0
  81. package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
  82. package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
  83. package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
  84. package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
  85. package/dist/core/session/clear-survival-stub.js +49 -0
  86. package/dist/core/session/clear-survival-stub.js.map +7 -0
  87. package/dist/core/session/clear-survival.js +426 -0
  88. package/dist/core/session/clear-survival.js.map +7 -0
  89. package/dist/core/session/handoff-generator.js +339 -0
  90. package/dist/core/session/handoff-generator.js.map +7 -0
  91. package/dist/core/session/session-manager.js +61 -26
  92. package/dist/core/session/session-manager.js.map +3 -3
  93. package/dist/core/skills/index.js +3 -0
  94. package/dist/core/skills/index.js.map +7 -0
  95. package/dist/core/skills/skill-storage.js +749 -0
  96. package/dist/core/skills/skill-storage.js.map +7 -0
  97. package/dist/core/skills/types.js +189 -0
  98. package/dist/core/skills/types.js.map +7 -0
  99. package/dist/core/storage/railway-optimized-storage.js +550 -0
  100. package/dist/core/storage/railway-optimized-storage.js.map +7 -0
  101. package/dist/core/storage/remote-storage.js +456 -0
  102. package/dist/core/storage/remote-storage.js.map +7 -0
  103. package/dist/core/trace/trace-detector.js +136 -5
  104. package/dist/core/trace/trace-detector.js.map +2 -2
  105. package/dist/core/trace/trace-store.js.map +2 -2
  106. package/dist/features/tui/components/analytics-panel.js +136 -0
  107. package/dist/features/tui/components/analytics-panel.js.map +7 -0
  108. package/dist/features/tui/components/frame-visualizer.js +377 -0
  109. package/dist/features/tui/components/frame-visualizer.js.map +7 -0
  110. package/dist/features/tui/components/pr-tracker.js +123 -0
  111. package/dist/features/tui/components/pr-tracker.js.map +7 -0
  112. package/dist/features/tui/components/session-monitor.js +286 -0
  113. package/dist/features/tui/components/session-monitor.js.map +7 -0
  114. package/dist/features/tui/components/subagent-fleet.js +388 -0
  115. package/dist/features/tui/components/subagent-fleet.js.map +7 -0
  116. package/dist/features/tui/components/task-board.js +475 -0
  117. package/dist/features/tui/components/task-board.js.map +7 -0
  118. package/dist/features/tui/index.js +397 -0
  119. package/dist/features/tui/index.js.map +7 -0
  120. package/dist/features/tui/services/data-service.js +654 -0
  121. package/dist/features/tui/services/data-service.js.map +7 -0
  122. package/dist/features/tui/services/websocket-client.js +149 -0
  123. package/dist/features/tui/services/websocket-client.js.map +7 -0
  124. package/dist/features/tui/terminal-compat.js +205 -0
  125. package/dist/features/tui/terminal-compat.js.map +7 -0
  126. package/dist/features/tui/types.js +1 -0
  127. package/dist/features/tui/types.js.map +7 -0
  128. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
  129. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  130. package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
  131. package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  132. package/dist/integrations/claude-code/post-task-hooks.js +541 -0
  133. package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
  134. package/dist/integrations/linear/client.js +22 -4
  135. package/dist/integrations/linear/client.js.map +2 -2
  136. package/dist/integrations/linear/migration.js +299 -0
  137. package/dist/integrations/linear/migration.js.map +7 -0
  138. package/dist/integrations/linear/oauth-server.js +396 -0
  139. package/dist/integrations/linear/oauth-server.js.map +7 -0
  140. package/dist/integrations/linear/rest-client.js +199 -0
  141. package/dist/integrations/linear/rest-client.js.map +7 -0
  142. package/dist/integrations/linear/sync.js +14 -2
  143. package/dist/integrations/linear/sync.js.map +2 -2
  144. package/dist/integrations/linear/webhook-handler.js +200 -0
  145. package/dist/integrations/linear/webhook-handler.js.map +7 -0
  146. package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
  147. package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  148. package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
  149. package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  150. package/dist/integrations/mcp/refactored-server.js +31 -3
  151. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  152. package/dist/integrations/mcp/server.js +25 -7
  153. package/dist/integrations/mcp/server.js.map +2 -2
  154. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  155. package/dist/models/user.model.js +3 -0
  156. package/dist/models/user.model.js.map +2 -2
  157. package/dist/services/context-service.js.map +2 -2
  158. package/dist/utils/formatting.js +58 -0
  159. package/dist/utils/formatting.js.map +7 -0
  160. package/package.json +24 -5
  161. package/dist/cli/__tests__/index.test.js +0 -290
  162. package/dist/cli/__tests__/index.test.js.map +0 -7
  163. package/dist/core/config/__tests__/config-manager.test.js +0 -248
  164. package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
  165. package/dist/core/context/__tests__/frame-manager.test.js +0 -879
  166. package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
  167. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
  168. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
  169. package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
  170. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
  171. package/dist/core/errors/__tests__/error-handling.test.js +0 -270
  172. package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
  173. package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
  174. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
  175. package/dist/core/query/__tests__/query-parser.test.js +0 -301
  176. package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
  177. package/dist/core/query/__tests__/query-templates.test.js +0 -210
  178. package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
  179. package/dist/core/trace/trace-detector.test.js +0 -401
  180. package/dist/core/trace/trace-detector.test.js.map +0 -7
  181. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
  182. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
  183. package/dist/integrations/linear/__tests__/auth.test.js +0 -558
  184. package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
  185. package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
  186. package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
  187. package/dist/integrations/mcp/__tests__/server.test.js +0 -798
  188. package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
  189. package/dist/scripts/benchmark-performance.d.ts +0 -7
  190. package/dist/scripts/benchmark-performance.d.ts.map +0 -1
  191. package/dist/scripts/benchmark-performance.js +0 -44
  192. package/dist/scripts/benchmark-performance.js.map +0 -1
  193. package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
  194. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
  195. package/dist/scripts/cancel-duplicate-tasks.js +0 -172
  196. package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
  197. package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
  198. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
  199. package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
  200. package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
  201. package/dist/scripts/initialize.d.ts +0 -6
  202. package/dist/scripts/initialize.d.ts.map +0 -1
  203. package/dist/scripts/initialize.js +0 -93
  204. package/dist/scripts/initialize.js.map +0 -1
  205. package/dist/scripts/list-linear-tasks.d.ts +0 -6
  206. package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
  207. package/dist/scripts/list-linear-tasks.js +0 -121
  208. package/dist/scripts/list-linear-tasks.js.map +0 -1
  209. package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
  210. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
  211. package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
  212. package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
  213. package/dist/scripts/show-linear-summary.d.ts +0 -6
  214. package/dist/scripts/show-linear-summary.d.ts.map +0 -1
  215. package/dist/scripts/show-linear-summary.js +0 -120
  216. package/dist/scripts/show-linear-summary.js.map +0 -1
  217. package/dist/scripts/status.d.ts +0 -6
  218. package/dist/scripts/status.d.ts.map +0 -1
  219. package/dist/scripts/status.js +0 -101
  220. package/dist/scripts/status.js.map +0 -1
  221. package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
  222. package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
  223. package/dist/src/agents/core/agent-task-manager.js +0 -504
  224. package/dist/src/agents/core/agent-task-manager.js.map +0 -1
  225. package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
  226. package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
  227. package/dist/src/agents/verifiers/base-verifier.js +0 -130
  228. package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
  229. package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
  230. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
  231. package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
  232. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
  233. package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
  234. package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
  235. package/dist/src/agents/verifiers/llm-judge.js +0 -248
  236. package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
  237. package/dist/src/cli/auto-detect.d.ts +0 -61
  238. package/dist/src/cli/auto-detect.d.ts.map +0 -1
  239. package/dist/src/cli/auto-detect.js +0 -350
  240. package/dist/src/cli/auto-detect.js.map +0 -1
  241. package/dist/src/cli/browser-test.d.ts +0 -6
  242. package/dist/src/cli/browser-test.d.ts.map +0 -1
  243. package/dist/src/cli/browser-test.js +0 -32
  244. package/dist/src/cli/browser-test.js.map +0 -1
  245. package/dist/src/cli/claude-sm.d.ts +0 -7
  246. package/dist/src/cli/claude-sm.d.ts.map +0 -1
  247. package/dist/src/cli/claude-sm.js +0 -412
  248. package/dist/src/cli/claude-sm.js.map +0 -1
  249. package/dist/src/cli/commands/agent.d.ts +0 -9
  250. package/dist/src/cli/commands/agent.d.ts.map +0 -1
  251. package/dist/src/cli/commands/agent.js +0 -303
  252. package/dist/src/cli/commands/agent.js.map +0 -1
  253. package/dist/src/cli/commands/config.d.ts +0 -6
  254. package/dist/src/cli/commands/config.d.ts.map +0 -1
  255. package/dist/src/cli/commands/config.js +0 -224
  256. package/dist/src/cli/commands/config.js.map +0 -1
  257. package/dist/src/cli/commands/context.d.ts +0 -7
  258. package/dist/src/cli/commands/context.d.ts.map +0 -1
  259. package/dist/src/cli/commands/context.js +0 -365
  260. package/dist/src/cli/commands/context.js.map +0 -1
  261. package/dist/src/cli/commands/handoff.d.ts +0 -6
  262. package/dist/src/cli/commands/handoff.d.ts.map +0 -1
  263. package/dist/src/cli/commands/handoff.js +0 -212
  264. package/dist/src/cli/commands/handoff.js.map +0 -1
  265. package/dist/src/cli/commands/linear-test.d.ts +0 -6
  266. package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
  267. package/dist/src/cli/commands/linear-test.js +0 -123
  268. package/dist/src/cli/commands/linear-test.js.map +0 -1
  269. package/dist/src/cli/commands/linear.d.ts +0 -6
  270. package/dist/src/cli/commands/linear.d.ts.map +0 -1
  271. package/dist/src/cli/commands/linear.js +0 -393
  272. package/dist/src/cli/commands/linear.js.map +0 -1
  273. package/dist/src/cli/commands/log.d.ts +0 -7
  274. package/dist/src/cli/commands/log.d.ts.map +0 -1
  275. package/dist/src/cli/commands/log.js +0 -168
  276. package/dist/src/cli/commands/log.js.map +0 -1
  277. package/dist/src/cli/commands/onboard.d.ts +0 -8
  278. package/dist/src/cli/commands/onboard.d.ts.map +0 -1
  279. package/dist/src/cli/commands/onboard.js +0 -363
  280. package/dist/src/cli/commands/onboard.js.map +0 -1
  281. package/dist/src/cli/commands/projects.d.ts +0 -8
  282. package/dist/src/cli/commands/projects.d.ts.map +0 -1
  283. package/dist/src/cli/commands/projects.js +0 -220
  284. package/dist/src/cli/commands/projects.js.map +0 -1
  285. package/dist/src/cli/commands/search.d.ts +0 -7
  286. package/dist/src/cli/commands/search.d.ts.map +0 -1
  287. package/dist/src/cli/commands/search.js +0 -162
  288. package/dist/src/cli/commands/search.js.map +0 -1
  289. package/dist/src/cli/commands/session.d.ts +0 -7
  290. package/dist/src/cli/commands/session.d.ts.map +0 -1
  291. package/dist/src/cli/commands/session.js +0 -222
  292. package/dist/src/cli/commands/session.js.map +0 -1
  293. package/dist/src/cli/commands/tasks.d.ts +0 -7
  294. package/dist/src/cli/commands/tasks.d.ts.map +0 -1
  295. package/dist/src/cli/commands/tasks.js +0 -229
  296. package/dist/src/cli/commands/tasks.js.map +0 -1
  297. package/dist/src/cli/commands/webhook.d.ts +0 -3
  298. package/dist/src/cli/commands/webhook.d.ts.map +0 -1
  299. package/dist/src/cli/commands/webhook.js +0 -157
  300. package/dist/src/cli/commands/webhook.js.map +0 -1
  301. package/dist/src/cli/commands/worktree.d.ts +0 -8
  302. package/dist/src/cli/commands/worktree.d.ts.map +0 -1
  303. package/dist/src/cli/commands/worktree.js +0 -339
  304. package/dist/src/cli/commands/worktree.js.map +0 -1
  305. package/dist/src/cli/index.d.ts +0 -8
  306. package/dist/src/cli/index.d.ts.map +0 -1
  307. package/dist/src/cli/index.js +0 -995
  308. package/dist/src/cli/index.js.map +0 -1
  309. package/dist/src/cli/utils/viewer.d.ts +0 -3
  310. package/dist/src/cli/utils/viewer.d.ts.map +0 -1
  311. package/dist/src/cli/utils/viewer.js +0 -91
  312. package/dist/src/cli/utils/viewer.js.map +0 -1
  313. package/dist/src/core/config/config-manager.d.ts +0 -95
  314. package/dist/src/core/config/config-manager.d.ts.map +0 -1
  315. package/dist/src/core/config/config-manager.js +0 -359
  316. package/dist/src/core/config/config-manager.js.map +0 -1
  317. package/dist/src/core/config/types.d.ts +0 -72
  318. package/dist/src/core/config/types.d.ts.map +0 -1
  319. package/dist/src/core/config/types.js +0 -127
  320. package/dist/src/core/config/types.js.map +0 -1
  321. package/dist/src/core/context/auto-context.d.ts +0 -22
  322. package/dist/src/core/context/auto-context.d.ts.map +0 -1
  323. package/dist/src/core/context/auto-context.js +0 -77
  324. package/dist/src/core/context/auto-context.js.map +0 -1
  325. package/dist/src/core/context/compaction-handler.d.ts +0 -119
  326. package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
  327. package/dist/src/core/context/compaction-handler.js +0 -306
  328. package/dist/src/core/context/compaction-handler.js.map +0 -1
  329. package/dist/src/core/context/frame-database.d.ts +0 -59
  330. package/dist/src/core/context/frame-database.d.ts.map +0 -1
  331. package/dist/src/core/context/frame-database.js +0 -333
  332. package/dist/src/core/context/frame-database.js.map +0 -1
  333. package/dist/src/core/context/frame-digest.d.ts +0 -59
  334. package/dist/src/core/context/frame-digest.d.ts.map +0 -1
  335. package/dist/src/core/context/frame-digest.js +0 -264
  336. package/dist/src/core/context/frame-digest.js.map +0 -1
  337. package/dist/src/core/context/frame-manager.d.ts +0 -112
  338. package/dist/src/core/context/frame-manager.d.ts.map +0 -1
  339. package/dist/src/core/context/frame-manager.js +0 -600
  340. package/dist/src/core/context/frame-manager.js.map +0 -1
  341. package/dist/src/core/context/frame-stack.d.ts +0 -85
  342. package/dist/src/core/context/frame-stack.d.ts.map +0 -1
  343. package/dist/src/core/context/frame-stack.js +0 -287
  344. package/dist/src/core/context/frame-stack.js.map +0 -1
  345. package/dist/src/core/context/frame-types.d.ts +0 -67
  346. package/dist/src/core/context/frame-types.d.ts.map +0 -1
  347. package/dist/src/core/context/frame-types.js +0 -6
  348. package/dist/src/core/context/frame-types.js.map +0 -1
  349. package/dist/src/core/context/index.d.ts +0 -11
  350. package/dist/src/core/context/index.d.ts.map +0 -1
  351. package/dist/src/core/context/index.js +0 -14
  352. package/dist/src/core/context/index.js.map +0 -1
  353. package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
  354. package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
  355. package/dist/src/core/context/model-aware-compaction.js +0 -616
  356. package/dist/src/core/context/model-aware-compaction.js.map +0 -1
  357. package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
  358. package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
  359. package/dist/src/core/context/refactored-frame-manager.js +0 -340
  360. package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
  361. package/dist/src/core/database/batch-operations.d.ts +0 -118
  362. package/dist/src/core/database/batch-operations.d.ts.map +0 -1
  363. package/dist/src/core/database/batch-operations.js +0 -339
  364. package/dist/src/core/database/batch-operations.js.map +0 -1
  365. package/dist/src/core/database/connection-pool.d.ts +0 -79
  366. package/dist/src/core/database/connection-pool.d.ts.map +0 -1
  367. package/dist/src/core/database/connection-pool.js +0 -236
  368. package/dist/src/core/database/connection-pool.js.map +0 -1
  369. package/dist/src/core/database/query-cache.d.ts +0 -135
  370. package/dist/src/core/database/query-cache.d.ts.map +0 -1
  371. package/dist/src/core/database/query-cache.js +0 -294
  372. package/dist/src/core/database/query-cache.js.map +0 -1
  373. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
  374. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
  375. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
  376. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
  377. package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
  378. package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
  379. package/dist/src/core/digest/frame-digest-integration.js +0 -198
  380. package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
  381. package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
  382. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
  383. package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
  384. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
  385. package/dist/src/core/digest/index.d.ts +0 -9
  386. package/dist/src/core/digest/index.d.ts.map +0 -1
  387. package/dist/src/core/digest/index.js +0 -9
  388. package/dist/src/core/digest/index.js.map +0 -1
  389. package/dist/src/core/digest/types.d.ts +0 -154
  390. package/dist/src/core/digest/types.d.ts.map +0 -1
  391. package/dist/src/core/digest/types.js +0 -18
  392. package/dist/src/core/digest/types.js.map +0 -1
  393. package/dist/src/core/errors/index.d.ts +0 -143
  394. package/dist/src/core/errors/index.d.ts.map +0 -1
  395. package/dist/src/core/errors/index.js +0 -282
  396. package/dist/src/core/errors/index.js.map +0 -1
  397. package/dist/src/core/errors/recovery.d.ts +0 -86
  398. package/dist/src/core/errors/recovery.d.ts.map +0 -1
  399. package/dist/src/core/errors/recovery.js +0 -274
  400. package/dist/src/core/errors/recovery.js.map +0 -1
  401. package/dist/src/core/merge/conflict-detector.d.ts +0 -122
  402. package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
  403. package/dist/src/core/merge/conflict-detector.js +0 -468
  404. package/dist/src/core/merge/conflict-detector.js.map +0 -1
  405. package/dist/src/core/merge/index.d.ts +0 -9
  406. package/dist/src/core/merge/index.d.ts.map +0 -1
  407. package/dist/src/core/merge/index.js +0 -9
  408. package/dist/src/core/merge/index.js.map +0 -1
  409. package/dist/src/core/merge/resolution-engine.d.ts +0 -120
  410. package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
  411. package/dist/src/core/merge/resolution-engine.js +0 -573
  412. package/dist/src/core/merge/resolution-engine.js.map +0 -1
  413. package/dist/src/core/merge/stack-diff.d.ts +0 -97
  414. package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
  415. package/dist/src/core/merge/stack-diff.js +0 -516
  416. package/dist/src/core/merge/stack-diff.js.map +0 -1
  417. package/dist/src/core/merge/types.d.ts +0 -110
  418. package/dist/src/core/merge/types.d.ts.map +0 -1
  419. package/dist/src/core/merge/types.js +0 -6
  420. package/dist/src/core/merge/types.js.map +0 -1
  421. package/dist/src/core/monitoring/error-handler.d.ts +0 -46
  422. package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
  423. package/dist/src/core/monitoring/error-handler.js +0 -212
  424. package/dist/src/core/monitoring/error-handler.js.map +0 -1
  425. package/dist/src/core/monitoring/logger.d.ts +0 -24
  426. package/dist/src/core/monitoring/logger.d.ts.map +0 -1
  427. package/dist/src/core/monitoring/logger.js +0 -126
  428. package/dist/src/core/monitoring/logger.js.map +0 -1
  429. package/dist/src/core/monitoring/metrics.d.ts +0 -10
  430. package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
  431. package/dist/src/core/monitoring/metrics.js +0 -152
  432. package/dist/src/core/monitoring/metrics.js.map +0 -1
  433. package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
  434. package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
  435. package/dist/src/core/monitoring/progress-tracker.js +0 -178
  436. package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
  437. package/dist/src/core/performance/context-cache.d.ts +0 -109
  438. package/dist/src/core/performance/context-cache.d.ts.map +0 -1
  439. package/dist/src/core/performance/context-cache.js +0 -280
  440. package/dist/src/core/performance/context-cache.js.map +0 -1
  441. package/dist/src/core/performance/index.d.ts +0 -3
  442. package/dist/src/core/performance/index.d.ts.map +0 -1
  443. package/dist/src/core/performance/index.js +0 -3
  444. package/dist/src/core/performance/index.js.map +0 -1
  445. package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
  446. package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
  447. package/dist/src/core/performance/lazy-context-loader.js +0 -332
  448. package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
  449. package/dist/src/core/performance/monitor.d.ts +0 -48
  450. package/dist/src/core/performance/monitor.d.ts.map +0 -1
  451. package/dist/src/core/performance/monitor.js +0 -226
  452. package/dist/src/core/performance/monitor.js.map +0 -1
  453. package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
  454. package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
  455. package/dist/src/core/performance/optimized-frame-context.js +0 -330
  456. package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
  457. package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
  458. package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
  459. package/dist/src/core/performance/performance-benchmark.js +0 -290
  460. package/dist/src/core/performance/performance-benchmark.js.map +0 -1
  461. package/dist/src/core/performance/performance-profiler.d.ts +0 -151
  462. package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
  463. package/dist/src/core/performance/performance-profiler.js +0 -346
  464. package/dist/src/core/performance/performance-profiler.js.map +0 -1
  465. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
  466. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
  467. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
  468. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
  469. package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
  470. package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
  471. package/dist/src/core/persistence/postgres-adapter.js +0 -330
  472. package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
  473. package/dist/src/core/projects/project-manager.d.ts +0 -130
  474. package/dist/src/core/projects/project-manager.d.ts.map +0 -1
  475. package/dist/src/core/projects/project-manager.js +0 -709
  476. package/dist/src/core/projects/project-manager.js.map +0 -1
  477. package/dist/src/core/query/query-parser.d.ts +0 -109
  478. package/dist/src/core/query/query-parser.d.ts.map +0 -1
  479. package/dist/src/core/query/query-parser.js +0 -415
  480. package/dist/src/core/query/query-parser.js.map +0 -1
  481. package/dist/src/core/query/query-templates.d.ts +0 -44
  482. package/dist/src/core/query/query-templates.d.ts.map +0 -1
  483. package/dist/src/core/query/query-templates.js +0 -326
  484. package/dist/src/core/query/query-templates.js.map +0 -1
  485. package/dist/src/core/retrieval/index.d.ts +0 -8
  486. package/dist/src/core/retrieval/index.d.ts.map +0 -1
  487. package/dist/src/core/retrieval/index.js +0 -8
  488. package/dist/src/core/retrieval/index.js.map +0 -1
  489. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
  490. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
  491. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
  492. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
  493. package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
  494. package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
  495. package/dist/src/core/retrieval/summary-generator.js +0 -622
  496. package/dist/src/core/retrieval/summary-generator.js.map +0 -1
  497. package/dist/src/core/retrieval/types.d.ts +0 -257
  498. package/dist/src/core/retrieval/types.d.ts.map +0 -1
  499. package/dist/src/core/retrieval/types.js +0 -18
  500. package/dist/src/core/retrieval/types.js.map +0 -1
  501. package/dist/src/core/session/index.d.ts +0 -2
  502. package/dist/src/core/session/index.d.ts.map +0 -1
  503. package/dist/src/core/session/index.js +0 -2
  504. package/dist/src/core/session/index.js.map +0 -1
  505. package/dist/src/core/session/session-manager.d.ts +0 -69
  506. package/dist/src/core/session/session-manager.d.ts.map +0 -1
  507. package/dist/src/core/session/session-manager.js +0 -311
  508. package/dist/src/core/session/session-manager.js.map +0 -1
  509. package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
  510. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
  511. package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
  512. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
  513. package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
  514. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
  515. package/dist/src/core/trace/db-trace-wrapper.js +0 -252
  516. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
  517. package/dist/src/core/trace/debug-trace.d.ts +0 -84
  518. package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
  519. package/dist/src/core/trace/debug-trace.js +0 -402
  520. package/dist/src/core/trace/debug-trace.js.map +0 -1
  521. package/dist/src/core/trace/error-test.d.ts +0 -6
  522. package/dist/src/core/trace/error-test.d.ts.map +0 -1
  523. package/dist/src/core/trace/error-test.js +0 -128
  524. package/dist/src/core/trace/error-test.js.map +0 -1
  525. package/dist/src/core/trace/index.d.ts +0 -25
  526. package/dist/src/core/trace/index.d.ts.map +0 -1
  527. package/dist/src/core/trace/index.js +0 -121
  528. package/dist/src/core/trace/index.js.map +0 -1
  529. package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
  530. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
  531. package/dist/src/core/trace/linear-api-wrapper.js +0 -205
  532. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
  533. package/dist/src/core/trace/performance-test.d.ts +0 -6
  534. package/dist/src/core/trace/performance-test.d.ts.map +0 -1
  535. package/dist/src/core/trace/performance-test.js +0 -111
  536. package/dist/src/core/trace/performance-test.js.map +0 -1
  537. package/dist/src/core/trace/trace-demo.d.ts +0 -8
  538. package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
  539. package/dist/src/core/trace/trace-demo.js +0 -154
  540. package/dist/src/core/trace/trace-demo.js.map +0 -1
  541. package/dist/src/core/trace/trace-detector.d.ts +0 -108
  542. package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
  543. package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
  544. package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
  545. package/dist/src/core/trace/trace-detector.demo.js +0 -145
  546. package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
  547. package/dist/src/core/trace/trace-detector.js +0 -425
  548. package/dist/src/core/trace/trace-detector.js.map +0 -1
  549. package/dist/src/core/trace/trace-store.d.ts +0 -60
  550. package/dist/src/core/trace/trace-store.d.ts.map +0 -1
  551. package/dist/src/core/trace/trace-store.js +0 -323
  552. package/dist/src/core/trace/trace-store.js.map +0 -1
  553. package/dist/src/core/trace/types.d.ts +0 -81
  554. package/dist/src/core/trace/types.d.ts.map +0 -1
  555. package/dist/src/core/trace/types.js +0 -70
  556. package/dist/src/core/trace/types.js.map +0 -1
  557. package/dist/src/core/types.d.ts +0 -35
  558. package/dist/src/core/types.d.ts.map +0 -1
  559. package/dist/src/core/types.js +0 -2
  560. package/dist/src/core/types.js.map +0 -1
  561. package/dist/src/core/utils/update-checker.d.ts +0 -38
  562. package/dist/src/core/utils/update-checker.d.ts.map +0 -1
  563. package/dist/src/core/utils/update-checker.js +0 -213
  564. package/dist/src/core/utils/update-checker.js.map +0 -1
  565. package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
  566. package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
  567. package/dist/src/core/worktree/worktree-manager.js +0 -456
  568. package/dist/src/core/worktree/worktree-manager.js.map +0 -1
  569. package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
  570. package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
  571. package/dist/src/features/analytics/api/analytics-api.js +0 -289
  572. package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
  573. package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
  574. package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
  575. package/dist/src/features/analytics/core/analytics-service.js +0 -275
  576. package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
  577. package/dist/src/features/analytics/index.d.ts +0 -12
  578. package/dist/src/features/analytics/index.d.ts.map +0 -1
  579. package/dist/src/features/analytics/index.js +0 -11
  580. package/dist/src/features/analytics/index.js.map +0 -1
  581. package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
  582. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
  583. package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
  584. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
  585. package/dist/src/features/analytics/types/metrics.d.ts +0 -60
  586. package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
  587. package/dist/src/features/analytics/types/metrics.js +0 -2
  588. package/dist/src/features/analytics/types/metrics.js.map +0 -1
  589. package/dist/src/features/browser/browser-mcp.d.ts +0 -94
  590. package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
  591. package/dist/src/features/browser/browser-mcp.js +0 -459
  592. package/dist/src/features/browser/browser-mcp.js.map +0 -1
  593. package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
  594. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
  595. package/dist/src/features/tasks/pebbles-task-store.js +0 -572
  596. package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
  597. package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
  598. package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
  599. package/dist/src/features/tasks/task-aware-context.js +0 -412
  600. package/dist/src/features/tasks/task-aware-context.js.map +0 -1
  601. package/dist/src/index.d.ts +0 -21
  602. package/dist/src/index.d.ts.map +0 -1
  603. package/dist/src/index.js +0 -9
  604. package/dist/src/index.js.map +0 -1
  605. package/dist/src/integrations/linear/auth.d.ts +0 -99
  606. package/dist/src/integrations/linear/auth.d.ts.map +0 -1
  607. package/dist/src/integrations/linear/auth.js +0 -319
  608. package/dist/src/integrations/linear/auth.js.map +0 -1
  609. package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
  610. package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
  611. package/dist/src/integrations/linear/auto-sync.js +0 -268
  612. package/dist/src/integrations/linear/auto-sync.js.map +0 -1
  613. package/dist/src/integrations/linear/client.d.ts +0 -127
  614. package/dist/src/integrations/linear/client.d.ts.map +0 -1
  615. package/dist/src/integrations/linear/client.js +0 -446
  616. package/dist/src/integrations/linear/client.js.map +0 -1
  617. package/dist/src/integrations/linear/config.d.ts +0 -51
  618. package/dist/src/integrations/linear/config.d.ts.map +0 -1
  619. package/dist/src/integrations/linear/config.js +0 -103
  620. package/dist/src/integrations/linear/config.js.map +0 -1
  621. package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
  622. package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
  623. package/dist/src/integrations/linear/sync-manager.js +0 -235
  624. package/dist/src/integrations/linear/sync-manager.js.map +0 -1
  625. package/dist/src/integrations/linear/sync-service.d.ts +0 -46
  626. package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
  627. package/dist/src/integrations/linear/sync-service.js +0 -217
  628. package/dist/src/integrations/linear/sync-service.js.map +0 -1
  629. package/dist/src/integrations/linear/sync.d.ts +0 -125
  630. package/dist/src/integrations/linear/sync.d.ts.map +0 -1
  631. package/dist/src/integrations/linear/sync.js +0 -563
  632. package/dist/src/integrations/linear/sync.js.map +0 -1
  633. package/dist/src/integrations/linear/types.d.ts +0 -90
  634. package/dist/src/integrations/linear/types.d.ts.map +0 -1
  635. package/dist/src/integrations/linear/types.js +0 -2
  636. package/dist/src/integrations/linear/types.js.map +0 -1
  637. package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
  638. package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
  639. package/dist/src/integrations/linear/webhook-server.js +0 -190
  640. package/dist/src/integrations/linear/webhook-server.js.map +0 -1
  641. package/dist/src/integrations/linear/webhook.d.ts +0 -108
  642. package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
  643. package/dist/src/integrations/linear/webhook.js +0 -291
  644. package/dist/src/integrations/linear/webhook.js.map +0 -1
  645. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
  646. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
  647. package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
  648. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
  649. package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
  650. package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
  651. package/dist/src/integrations/mcp/handlers/index.js +0 -134
  652. package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
  653. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
  654. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
  655. package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
  656. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
  657. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
  658. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
  659. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
  660. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
  661. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
  662. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
  663. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
  664. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
  665. package/dist/src/integrations/mcp/index.d.ts +0 -13
  666. package/dist/src/integrations/mcp/index.d.ts.map +0 -1
  667. package/dist/src/integrations/mcp/index.js +0 -17
  668. package/dist/src/integrations/mcp/index.js.map +0 -1
  669. package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
  670. package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
  671. package/dist/src/integrations/mcp/refactored-server.js +0 -351
  672. package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
  673. package/dist/src/integrations/mcp/server.d.ts +0 -54
  674. package/dist/src/integrations/mcp/server.d.ts.map +0 -1
  675. package/dist/src/integrations/mcp/server.js +0 -1616
  676. package/dist/src/integrations/mcp/server.js.map +0 -1
  677. package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
  678. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
  679. package/dist/src/integrations/mcp/tool-definitions.js +0 -563
  680. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
  681. package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
  682. package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
  683. package/dist/src/integrations/mcp/trace-test.js +0 -54
  684. package/dist/src/integrations/mcp/trace-test.js.map +0 -1
  685. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
  686. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
  687. package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
  688. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
  689. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
  690. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
  691. package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
  692. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
  693. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
  694. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
  695. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
  696. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
  697. package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
  698. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
  699. package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
  700. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
  701. package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
  702. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
  703. package/dist/src/middleware/exponential-rate-limiter.js +0 -293
  704. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
  705. package/dist/src/models/user.model.d.ts +0 -62
  706. package/dist/src/models/user.model.d.ts.map +0 -1
  707. package/dist/src/models/user.model.js +0 -311
  708. package/dist/src/models/user.model.js.map +0 -1
  709. package/dist/src/servers/production/auth-middleware.d.ts +0 -76
  710. package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
  711. package/dist/src/servers/production/auth-middleware.js +0 -558
  712. package/dist/src/servers/production/auth-middleware.js.map +0 -1
  713. package/dist/src/servers/railway/index.d.ts +0 -7
  714. package/dist/src/servers/railway/index.d.ts.map +0 -1
  715. package/dist/src/servers/railway/index.js +0 -401
  716. package/dist/src/servers/railway/index.js.map +0 -1
  717. package/dist/src/services/config-service.d.ts +0 -44
  718. package/dist/src/services/config-service.d.ts.map +0 -1
  719. package/dist/src/services/config-service.js +0 -61
  720. package/dist/src/services/config-service.js.map +0 -1
  721. package/dist/src/services/context-service.d.ts +0 -17
  722. package/dist/src/services/context-service.d.ts.map +0 -1
  723. package/dist/src/services/context-service.js +0 -173
  724. package/dist/src/services/context-service.js.map +0 -1
  725. package/dist/src/types/task.d.ts +0 -27
  726. package/dist/src/types/task.d.ts.map +0 -1
  727. package/dist/src/types/task.js +0 -2
  728. package/dist/src/types/task.js.map +0 -1
  729. package/dist/src/utils/logger.d.ts +0 -13
  730. package/dist/src/utils/logger.d.ts.map +0 -1
  731. package/dist/src/utils/logger.js +0 -52
  732. package/dist/src/utils/logger.js.map +0 -1
  733. package/dist/src/validation/schemas.d.ts +0 -633
  734. package/dist/src/validation/schemas.d.ts.map +0 -1
  735. package/dist/src/validation/schemas.js +0 -347
  736. package/dist/src/validation/schemas.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/context/dual-stack-manager.ts"],
4
+ "sourcesContent": ["/**\n * Dual Stack Manager - STA-99\n * Manages both individual and shared team stacks for collaboration\n */\n\nimport type { Frame, Event, Anchor } from './frame-manager.js';\nimport { FrameManager } from './frame-manager.js';\nimport type { DatabaseAdapter } from '../database/database-adapter.js';\nimport { SQLiteAdapter } from '../database/sqlite-adapter.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, DatabaseError, ErrorCode } from '../errors/index.js';\nimport {\n validateInput,\n CreateSharedStackSchema,\n SwitchStackSchema,\n type CreateSharedStackInput,\n type SwitchStackInput,\n} from './validation.js';\nimport { PermissionManager } from './permission-manager.js';\n\nexport interface StackContext {\n stackId: string;\n type: 'individual' | 'shared';\n projectId: string;\n ownerId?: string; // For individual stacks\n teamId?: string; // For shared stacks\n permissions: StackPermissions;\n metadata: Record<string, any>;\n createdAt: Date;\n lastActive: Date;\n}\n\nexport interface StackPermissions {\n canRead: boolean;\n canWrite: boolean;\n canHandoff: boolean;\n canMerge: boolean;\n canAdminister: boolean;\n}\n\nexport interface HandoffRequest {\n requestId: string;\n sourceStackId: string;\n targetStackId: string;\n frameIds: string[];\n requesterId: string;\n targetUserId?: string;\n message?: string;\n status: 'pending' | 'accepted' | 'rejected' | 'expired';\n createdAt: Date;\n expiresAt: Date;\n}\n\nexport interface StackSyncResult {\n success: boolean;\n conflictFrames: string[];\n mergedFrames: string[];\n errors: Array<{\n frameId: string;\n error: string;\n resolution?: 'skipped' | 'merged' | 'manual';\n }>;\n}\n\nexport class DualStackManager {\n private adapter: DatabaseAdapter;\n private individualStack: FrameManager;\n private sharedStacks: Map<string, FrameManager> = new Map();\n private activeContext: StackContext;\n private handoffRequests: Map<string, HandoffRequest> = new Map();\n private permissionManager: PermissionManager;\n\n constructor(\n adapter: DatabaseAdapter,\n projectId: string,\n userId: string,\n defaultTeamId?: string\n ) {\n this.adapter = adapter;\n this.permissionManager = new PermissionManager();\n\n // Initialize individual stack\n // Extract raw database for FrameManager which expects SQLite directly\n const rawDb =\n adapter instanceof SQLiteAdapter ? adapter.getRawDatabase() : null;\n if (!rawDb) {\n throw new Error(\n 'DualStackManager requires SQLiteAdapter with connected database'\n );\n }\n\n this.individualStack = new FrameManager(rawDb, projectId, userId);\n\n // Set default active context to individual stack\n this.activeContext = {\n stackId: `individual-${userId}`,\n type: 'individual',\n projectId,\n ownerId: userId,\n permissions: this.getDefaultIndividualPermissions(),\n metadata: {},\n createdAt: new Date(),\n lastActive: new Date(),\n };\n\n // Set up initial permissions for the user's individual stack\n this.permissionManager.setStackPermissions(\n userId,\n `individual-${userId}`,\n this.getDefaultIndividualPermissions()\n );\n\n this.initializeSchema();\n }\n\n private async initializeSchema(): Promise<void> {\n try {\n // Create stack_contexts table\n await this.adapter.beginTransaction();\n\n const createStackContextsTable = `\n CREATE TABLE IF NOT EXISTS stack_contexts (\n stack_id TEXT PRIMARY KEY,\n type TEXT NOT NULL CHECK (type IN ('individual', 'shared')),\n project_id TEXT NOT NULL,\n owner_id TEXT,\n team_id TEXT,\n permissions TEXT NOT NULL,\n metadata TEXT DEFAULT '{}',\n created_at INTEGER NOT NULL,\n last_active INTEGER NOT NULL,\n CONSTRAINT valid_ownership CHECK (\n (type = 'individual' AND owner_id IS NOT NULL AND team_id IS NULL) OR\n (type = 'shared' AND team_id IS NOT NULL)\n )\n )\n `;\n\n const createHandoffRequestsTable = `\n CREATE TABLE IF NOT EXISTS handoff_requests (\n request_id TEXT PRIMARY KEY,\n source_stack_id TEXT NOT NULL,\n target_stack_id TEXT NOT NULL,\n frame_ids TEXT NOT NULL,\n requester_id TEXT NOT NULL,\n target_user_id TEXT,\n message TEXT,\n status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'rejected', 'expired')),\n created_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n FOREIGN KEY (source_stack_id) REFERENCES stack_contexts(stack_id),\n FOREIGN KEY (target_stack_id) REFERENCES stack_contexts(stack_id)\n )\n `;\n\n const createStackSyncLogTable = `\n CREATE TABLE IF NOT EXISTS stack_sync_log (\n sync_id TEXT PRIMARY KEY,\n source_stack_id TEXT NOT NULL,\n target_stack_id TEXT NOT NULL,\n operation TEXT NOT NULL CHECK (operation IN ('handoff', 'merge', 'sync')),\n frame_count INTEGER NOT NULL,\n conflicts TEXT DEFAULT '[]',\n resolution TEXT,\n timestamp INTEGER NOT NULL,\n FOREIGN KEY (source_stack_id) REFERENCES stack_contexts(stack_id),\n FOREIGN KEY (target_stack_id) REFERENCES stack_contexts(stack_id)\n )\n `;\n\n // Execute schema creation using raw SQL\n if (this.adapter.isConnected()) {\n // Note: This is a temporary workaround - proper schema creation would use adapter methods\n (await (this.adapter as any).execute?.(createStackContextsTable)) ||\n this.executeSchemaQuery(createStackContextsTable);\n (await (this.adapter as any).execute?.(createHandoffRequestsTable)) ||\n this.executeSchemaQuery(createHandoffRequestsTable);\n (await (this.adapter as any).execute?.(createStackSyncLogTable)) ||\n this.executeSchemaQuery(createStackSyncLogTable);\n }\n\n await this.adapter.commitTransaction();\n\n logger.info('Dual stack schema initialized successfully');\n } catch (error) {\n await this.adapter.rollbackTransaction();\n logger.error('Failed to initialize dual stack schema', error);\n throw new DatabaseError(\n 'Schema initialization failed',\n ErrorCode.DB_SCHEMA_ERROR,\n { adapter: this.adapter.constructor.name },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async executeSchemaQuery(sql: string): Promise<void> {\n // Fallback for adapters that don't have execute method\n logger.warn(\n 'Using fallback schema creation - implement execute method in adapter'\n );\n\n // Execute using raw SQLite database\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n try {\n rawDb.exec(sql);\n logger.debug('Executed schema query successfully');\n } catch (error) {\n logger.error('Failed to execute schema query', { sql, error });\n throw error;\n }\n } else {\n throw new Error(\n 'Cannot execute schema query: raw database not available'\n );\n }\n }\n\n private getDefaultIndividualPermissions(): StackPermissions {\n return {\n canRead: true,\n canWrite: true,\n canHandoff: true,\n canMerge: true,\n canAdminister: true,\n };\n }\n\n private getSharedStackPermissions(\n role: 'member' | 'lead' | 'admin'\n ): StackPermissions {\n const basePermissions = {\n canRead: true,\n canWrite: true,\n canHandoff: true,\n canMerge: false,\n canAdminister: false,\n };\n\n switch (role) {\n case 'lead':\n return { ...basePermissions, canMerge: true };\n case 'admin':\n return { ...basePermissions, canMerge: true, canAdminister: true };\n default:\n return basePermissions;\n }\n }\n\n /**\n * Switch between individual and shared stacks\n */\n async switchToStack(stackId: string): Promise<void> {\n // Validate input\n const input = validateInput(SwitchStackSchema, { stackId });\n\n try {\n if (input.stackId.startsWith('individual-')) {\n this.activeContext = {\n ...this.activeContext,\n stackId: input.stackId,\n type: 'individual',\n };\n return;\n }\n\n // Load shared stack context\n const stackContext = await this.loadStackContext(input.stackId);\n if (!stackContext) {\n throw new ValidationError(\n `Stack context not found: ${input.stackId}`,\n ErrorCode.STACK_CONTEXT_NOT_FOUND\n );\n }\n\n // Check permission to access the stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n this.activeContext.ownerId || 'unknown',\n 'read',\n 'stack',\n input.stackId,\n stackContext\n )\n );\n\n this.activeContext = stackContext;\n\n // Initialize shared stack manager if not already loaded\n if (!this.sharedStacks.has(input.stackId)) {\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n throw new Error('Failed to get raw database for shared stack');\n }\n\n const sharedStack = new FrameManager(\n rawDb,\n stackContext.projectId,\n input.stackId\n );\n this.sharedStacks.set(input.stackId, sharedStack);\n }\n\n // Update last active timestamp\n await this.updateStackActivity(input.stackId);\n\n logger.info(`Switched to stack: ${input.stackId}`, {\n type: stackContext.type,\n });\n } catch (error) {\n throw new ValidationError(\n `Failed to switch to stack: ${input.stackId}`,\n ErrorCode.OPERATION_FAILED,\n { stackId: input.stackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get the current active stack manager\n */\n getActiveStack(): FrameManager {\n if (this.activeContext.type === 'individual') {\n return this.individualStack;\n }\n\n const sharedStack = this.sharedStacks.get(this.activeContext.stackId);\n if (!sharedStack) {\n throw new DatabaseError(\n `Active shared stack not initialized: ${this.activeContext.stackId}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n return sharedStack;\n }\n\n /**\n * Create a new shared stack for team collaboration\n */\n async createSharedStack(\n teamId: string,\n name: string,\n ownerId: string,\n permissions?: StackPermissions\n ): Promise<string> {\n // Validate input parameters\n const input = validateInput(CreateSharedStackSchema, {\n teamId,\n name,\n ownerId,\n permissions,\n });\n\n // Check permission to create shared stacks\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n input.ownerId,\n 'administer',\n 'stack',\n `shared-${input.teamId}`,\n this.activeContext\n )\n );\n\n const stackId = `shared-${input.teamId}-${Date.now()}`;\n\n const stackContext: StackContext = {\n stackId,\n type: 'shared',\n projectId: this.activeContext.projectId,\n teamId: input.teamId,\n permissions: input.permissions || this.getSharedStackPermissions('admin'),\n metadata: { name: input.name, ownerId: input.ownerId },\n createdAt: new Date(),\n lastActive: new Date(),\n };\n\n try {\n await this.saveStackContext(stackContext);\n\n // Initialize the shared stack manager\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n throw new Error('Failed to get raw database for new shared stack');\n }\n\n const sharedStack = new FrameManager(\n rawDb,\n stackContext.projectId,\n stackId\n );\n this.sharedStacks.set(stackId, sharedStack);\n\n // Set up permissions for the owner and team\n const stackPermissions = stackContext.permissions;\n this.permissionManager.setStackPermissions(\n input.ownerId,\n stackId,\n stackPermissions\n );\n\n logger.info(`Created shared stack: ${stackId}`, { teamId, name });\n return stackId;\n } catch (error) {\n throw new DatabaseError(\n `Failed to create shared stack`,\n ErrorCode.OPERATION_FAILED,\n { teamId, name },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Initiate handoff of frames between stacks\n */\n async initiateHandoff(\n targetStackId: string,\n frameIds: string[],\n targetUserId?: string,\n message?: string\n ): Promise<string> {\n // Check permission to perform handoff from current stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n this.activeContext.ownerId || 'unknown',\n 'handoff',\n 'stack',\n this.activeContext.stackId,\n this.activeContext\n )\n );\n\n const requestId = `handoff-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const request: HandoffRequest = {\n requestId,\n sourceStackId: this.activeContext.stackId,\n targetStackId,\n frameIds,\n requesterId: this.activeContext.ownerId!,\n targetUserId,\n message,\n status: 'pending',\n createdAt: new Date(),\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours\n };\n\n try {\n await this.saveHandoffRequest(request);\n this.handoffRequests.set(requestId, request);\n\n logger.info(`Initiated handoff request: ${requestId}`, {\n sourceStack: this.activeContext.stackId,\n targetStack: targetStackId,\n frameCount: frameIds.length,\n });\n\n return requestId;\n } catch (error) {\n throw new DatabaseError(\n `Failed to initiate handoff`,\n ErrorCode.OPERATION_FAILED,\n { targetStackId, frameIds },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Accept a handoff request and move frames\n */\n async acceptHandoff(requestId: string): Promise<StackSyncResult> {\n logger.debug('acceptHandoff called', { requestId });\n const request = await this.loadHandoffRequest(requestId);\n logger.debug('loadHandoffRequest returned', {\n requestId,\n found: !!request,\n });\n if (!request) {\n logger.error('Handoff request not found', {\n requestId,\n availableRequests: Array.from(this.handoffRequests.keys()),\n });\n throw new DatabaseError(\n `Handoff request not found: ${requestId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n if (request.status !== 'pending') {\n throw new DatabaseError(\n `Handoff request is not pending: ${request.status}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n if (request.expiresAt < new Date()) {\n throw new DatabaseError(\n `Handoff request has expired`,\n ErrorCode.OPERATION_EXPIRED\n );\n }\n\n try {\n // Perform the handoff operation\n logger.debug('Starting moveFramesBetweenStacks', { requestId });\n const syncResult = await this.moveFramesBetweenStacks(\n request.sourceStackId,\n request.targetStackId,\n request.frameIds\n );\n logger.debug('moveFramesBetweenStacks completed', {\n requestId,\n success: syncResult.success,\n });\n\n // Update request status\n logger.debug('Updating request status', { requestId });\n request.status = 'accepted';\n logger.debug('Calling saveHandoffRequest', { requestId });\n await this.saveHandoffRequest(request);\n logger.debug('saveHandoffRequest completed', { requestId });\n\n logger.info(`Accepted handoff request: ${requestId}`, {\n frameCount: request.frameIds.length,\n conflicts: syncResult.conflictFrames.length,\n });\n\n return syncResult;\n } catch (error) {\n logger.error('acceptHandoff caught error', {\n error: error instanceof Error ? error.message : error,\n });\n // Update request status to rejected on failure\n request.status = 'rejected';\n await this.saveHandoffRequest(request);\n\n throw new DatabaseError(\n `Failed to accept handoff`,\n ErrorCode.OPERATION_FAILED,\n { requestId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Sync frames between individual and shared stacks\n */\n async syncStacks(\n sourceStackId: string,\n targetStackId: string,\n options: {\n frameIds?: string[];\n conflictResolution: 'skip' | 'merge' | 'overwrite';\n dryRun?: boolean;\n }\n ): Promise<StackSyncResult> {\n try {\n const sourceStack = this.getStackManager(sourceStackId);\n const targetStack = this.getStackManager(targetStackId);\n\n // Get frames to sync\n const framesToSync =\n options.frameIds ||\n (await sourceStack.getActiveFrames()).map((f) => f.frame_id);\n\n const result: StackSyncResult = {\n success: true,\n conflictFrames: [],\n mergedFrames: [],\n errors: [],\n };\n\n for (const frameId of framesToSync) {\n try {\n const sourceFrame = await sourceStack.getFrame(frameId);\n if (!sourceFrame) {\n result.errors.push({\n frameId,\n error: 'Source frame not found',\n resolution: 'skipped',\n });\n continue;\n }\n\n const existingFrame = await targetStack.getFrame(frameId);\n\n if (existingFrame) {\n // Handle conflict\n switch (options.conflictResolution) {\n case 'skip':\n result.conflictFrames.push(frameId);\n result.errors.push({\n frameId,\n error: 'Frame already exists',\n resolution: 'skipped',\n });\n continue;\n\n case 'merge':\n if (!options.dryRun) {\n await this.mergeFrames(\n existingFrame,\n sourceFrame,\n targetStack\n );\n }\n result.mergedFrames.push(frameId);\n break;\n\n case 'overwrite':\n if (!options.dryRun) {\n await targetStack.deleteFrame(frameId);\n await this.copyFrame(sourceFrame, targetStack);\n }\n result.mergedFrames.push(frameId);\n break;\n }\n } else {\n // Copy frame to target\n if (!options.dryRun) {\n await this.copyFrame(sourceFrame, targetStack);\n }\n result.mergedFrames.push(frameId);\n }\n } catch (error) {\n result.errors.push({\n frameId,\n error: error instanceof Error ? error.message : String(error),\n resolution: 'skipped',\n });\n result.success = false;\n }\n }\n\n logger.info(`Stack sync completed`, {\n source: sourceStackId,\n target: targetStackId,\n merged: result.mergedFrames.length,\n conflicts: result.conflictFrames.length,\n errors: result.errors.length,\n });\n\n return result;\n } catch (error) {\n throw new DatabaseError(\n `Stack sync failed`,\n ErrorCode.OPERATION_FAILED,\n { sourceStackId, targetStackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n getStackManager(stackId: string): FrameManager {\n logger.debug('getStackManager called', {\n stackId,\n availableStacks: Array.from(this.sharedStacks.keys()),\n });\n\n if (stackId.startsWith('individual-')) {\n logger.debug('Returning individual stack', { stackId });\n return this.individualStack;\n }\n\n const sharedStack = this.sharedStacks.get(stackId);\n if (!sharedStack) {\n logger.error('Stack manager not found', {\n stackId,\n availableSharedStacks: Array.from(this.sharedStacks.keys()),\n message: 'getStackManager could not find shared stack',\n });\n throw new DatabaseError(\n `Stack manager not found: ${stackId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n logger.debug('Returning shared stack', { stackId });\n return sharedStack;\n }\n\n private async moveFramesBetweenStacks(\n sourceStackId: string,\n targetStackId: string,\n frameIds: string[]\n ): Promise<StackSyncResult> {\n const syncResult = await this.syncStacks(sourceStackId, targetStackId, {\n frameIds,\n conflictResolution: 'merge',\n });\n\n // Remove frames from source stack after successful sync\n if (syncResult.success && syncResult.errors.length === 0) {\n const sourceStack = this.getStackManager(sourceStackId);\n for (const frameId of frameIds) {\n try {\n sourceStack.deleteFrame(frameId);\n logger.debug('Deleted frame from source stack', {\n frameId,\n sourceStackId,\n });\n } catch (error) {\n logger.warn('Failed to delete frame from source stack', {\n frameId,\n error,\n });\n }\n }\n logger.debug('Completed frame cleanup from source stack', {\n frameIds: frameIds.length,\n });\n }\n\n return syncResult;\n }\n\n private async copyFrame(\n frame: Frame,\n targetStack: FrameManager\n ): Promise<void> {\n // Create frame in target stack\n await targetStack.createFrame({\n type: frame.type as any,\n name: frame.name,\n inputs: frame.inputs,\n });\n\n // Copy events\n const events = await this.individualStack.getFrameEvents(frame.frame_id);\n for (const event of events) {\n await targetStack.addEvent(frame.frame_id, {\n type: event.type as any,\n text: event.text,\n metadata: event.metadata,\n });\n }\n\n // Copy anchors\n const anchors = await this.individualStack.getFrameAnchors(frame.frame_id);\n for (const anchor of anchors) {\n await targetStack.addAnchor(frame.frame_id, {\n type: anchor.type as any,\n text: anchor.text,\n priority: anchor.priority,\n metadata: anchor.metadata,\n });\n }\n }\n\n private async mergeFrames(\n existingFrame: Frame,\n sourceFrame: Frame,\n targetStack: FrameManager\n ): Promise<void> {\n // Simple merge strategy - append events and anchors\n const sourceEvents = await this.individualStack.getFrameEvents(\n sourceFrame.frame_id\n );\n for (const event of sourceEvents) {\n await targetStack.addEvent(existingFrame.frame_id, {\n type: event.type as any,\n text: event.text,\n metadata: { ...event.metadata, merged: true },\n });\n }\n\n const sourceAnchors = await this.individualStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n for (const anchor of sourceAnchors) {\n await targetStack.addAnchor(existingFrame.frame_id, {\n type: anchor.type as any,\n text: anchor.text,\n priority: anchor.priority,\n metadata: { ...anchor.metadata, merged: true },\n });\n }\n }\n\n private async loadStackContext(\n stackId: string\n ): Promise<StackContext | null> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n return null;\n }\n\n const query = rawDb.prepare(`\n SELECT stack_id, type, project_id, owner_id, team_id, permissions, metadata, created_at, last_active\n FROM stack_contexts \n WHERE stack_id = ?\n `);\n\n const row = query.get(stackId) as any;\n if (!row) {\n return null;\n }\n\n return {\n stackId: row.stack_id,\n type: row.type,\n projectId: row.project_id,\n ownerId: row.owner_id,\n teamId: row.team_id,\n permissions: JSON.parse(row.permissions),\n metadata: JSON.parse(row.metadata || '{}'),\n createdAt: new Date(row.created_at),\n lastActive: new Date(row.last_active),\n };\n } catch (error) {\n logger.error('Failed to load stack context', { stackId, error });\n return null;\n }\n }\n\n private async saveStackContext(context: StackContext): Promise<void> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n throw new Error('SQLite database not available for stack context save');\n }\n\n const query = rawDb.prepare(`\n INSERT OR REPLACE INTO stack_contexts \n (stack_id, type, project_id, owner_id, team_id, permissions, metadata, created_at, last_active)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n query.run(\n context.stackId,\n context.type,\n context.projectId,\n context.ownerId || null,\n context.teamId || null,\n JSON.stringify(context.permissions),\n JSON.stringify(context.metadata || {}),\n context.createdAt.getTime(),\n context.lastActive.getTime()\n );\n\n logger.debug('Saved stack context', { stackId: context.stackId });\n } catch (error) {\n logger.error('Failed to save stack context', {\n stackId: context.stackId,\n error,\n });\n throw error;\n }\n }\n\n private async updateStackActivity(stackId: string): Promise<void> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (!rawDb) {\n logger.warn('SQLite database not available for activity update');\n return;\n }\n\n const query = rawDb.prepare(`\n UPDATE stack_contexts \n SET last_active = ?\n WHERE stack_id = ?\n `);\n\n query.run(Date.now(), stackId);\n logger.debug('Updated stack activity', { stackId });\n } catch (error) {\n logger.error('Failed to update stack activity', { stackId, error });\n // Don't throw - activity updates are not critical\n }\n }\n\n private async loadHandoffRequest(\n requestId: string\n ): Promise<HandoffRequest | null> {\n // Try in-memory first for fast access\n const memoryRequest = this.handoffRequests.get(requestId);\n if (memoryRequest) {\n return memoryRequest;\n }\n\n // Try loading from database\n try {\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n const query = rawDb.prepare(`\n SELECT * FROM handoff_requests WHERE request_id = ?\n `);\n\n const row = query.get(requestId) as any;\n if (row) {\n const request: HandoffRequest = {\n requestId: row.request_id,\n sourceStackId: row.source_stack_id,\n targetStackId: row.target_stack_id,\n frameIds: JSON.parse(row.frame_ids),\n status: row.status,\n createdAt: new Date(row.created_at),\n expiresAt: new Date(row.expires_at),\n targetUserId: row.target_user_id,\n message: row.message,\n };\n\n // Cache in memory for future access\n this.handoffRequests.set(requestId, request);\n return request;\n }\n }\n } catch (error) {\n logger.error('Failed to load handoff request from database', {\n requestId,\n error,\n });\n }\n\n return null;\n }\n\n private async saveHandoffRequest(request: HandoffRequest): Promise<void> {\n try {\n // Use raw database for direct query\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n const query = rawDb.prepare(`\n INSERT OR REPLACE INTO handoff_requests \n (request_id, source_stack_id, target_stack_id, frame_ids, status, created_at, expires_at, target_user_id, message)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n query.run(\n request.requestId,\n request.sourceStackId,\n request.targetStackId,\n JSON.stringify(request.frameIds),\n request.status,\n request.createdAt.getTime(),\n request.expiresAt.getTime(),\n request.targetUserId || null,\n request.message || null\n );\n\n logger.debug('Saved handoff request to database', {\n requestId: request.requestId,\n });\n }\n\n // Also keep in-memory for fast access\n this.handoffRequests.set(request.requestId, request);\n } catch (error) {\n logger.error('Failed to save handoff request', {\n requestId: request.requestId,\n error,\n });\n // Fallback to in-memory only\n this.handoffRequests.set(request.requestId, request);\n }\n }\n\n /**\n * Get list of available stacks for the current user\n */\n async getAvailableStacks(): Promise<StackContext[]> {\n try {\n const stacks: StackContext[] = [];\n\n // Always include current individual stack context\n stacks.push(this.activeContext);\n\n // Query database for all shared stacks the user has access to\n const rawDb =\n this.adapter instanceof SQLiteAdapter\n ? this.adapter.getRawDatabase()\n : null;\n if (rawDb) {\n const query = rawDb.prepare(`\n SELECT stack_id, type, project_id, owner_id, team_id, permissions, metadata, created_at, last_active\n FROM stack_contexts \n WHERE type = 'shared' AND project_id = ?\n `);\n\n const rows = query.all(this.activeContext.projectId) as any[];\n\n for (const row of rows) {\n const context: StackContext = {\n stackId: row.stack_id,\n type: row.type,\n projectId: row.project_id,\n ownerId: row.owner_id,\n teamId: row.team_id,\n permissions: JSON.parse(row.permissions),\n metadata: JSON.parse(row.metadata || '{}'),\n createdAt: new Date(row.created_at),\n lastActive: new Date(row.last_active),\n };\n\n // Check if user has permission to access this stack\n try {\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n this.activeContext.ownerId || 'unknown',\n 'read',\n 'stack',\n context.stackId,\n context\n )\n );\n stacks.push(context);\n } catch (permissionError) {\n // Skip stacks user doesn't have access to\n logger.debug('User lacks access to stack', {\n stackId: context.stackId,\n userId: this.activeContext.ownerId,\n });\n }\n }\n }\n\n return stacks;\n } catch (error) {\n logger.error('Failed to get available stacks', error);\n // Return at least the current individual stack\n return [this.activeContext];\n }\n }\n\n /**\n * Get pending handoff requests for the current user\n */\n async getPendingHandoffRequests(): Promise<HandoffRequest[]> {\n return Array.from(this.handoffRequests.values()).filter(\n (request) =>\n request.status === 'pending' && request.expiresAt > new Date()\n );\n }\n\n /**\n * Get current stack context\n */\n getCurrentContext(): StackContext {\n return { ...this.activeContext };\n }\n\n /**\n * Get permission manager for external access\n */\n getPermissionManager(): PermissionManager {\n return this.permissionManager;\n }\n\n /**\n * Add user to shared stack with specific permissions\n */\n async addUserToSharedStack(\n stackId: string,\n userId: string,\n permissions: StackPermissions,\n requesterId: string\n ): Promise<void> {\n // Check if requester has admin permissions on the stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n requesterId,\n 'administer',\n 'stack',\n stackId\n )\n );\n\n // Grant permissions to the new user\n this.permissionManager.setStackPermissions(userId, stackId, permissions);\n\n logger.info(`Added user to shared stack`, {\n stackId,\n userId,\n permissions,\n requesterId,\n });\n }\n\n /**\n * Remove user from shared stack\n */\n async removeUserFromSharedStack(\n stackId: string,\n userId: string,\n requesterId: string\n ): Promise<void> {\n // Check if requester has admin permissions on the stack\n await this.permissionManager.enforcePermission(\n this.permissionManager.createContext(\n requesterId,\n 'administer',\n 'stack',\n stackId\n )\n );\n\n // Remove user's permissions\n const userPermissions = this.permissionManager.getUserPermissions(userId);\n userPermissions.delete(stackId);\n\n logger.info(`Removed user from shared stack`, {\n stackId,\n userId,\n requesterId,\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,384 @@
1
+ import { logger } from "../monitoring/logger.js";
2
+ import { ValidationError, DatabaseError, ErrorCode } from "../errors/index.js";
3
+ import {
4
+ validateInput,
5
+ InitiateHandoffSchema,
6
+ HandoffApprovalSchema
7
+ } from "./validation.js";
8
+ class FrameHandoffManager {
9
+ dualStackManager;
10
+ activeHandoffs = /* @__PURE__ */ new Map();
11
+ pendingApprovals = /* @__PURE__ */ new Map();
12
+ notifications = /* @__PURE__ */ new Map();
13
+ constructor(dualStackManager) {
14
+ this.dualStackManager = dualStackManager;
15
+ }
16
+ /**
17
+ * Initiate a frame handoff with rich metadata and approval workflow
18
+ */
19
+ async initiateHandoff(targetStackId, frameIds, metadata, targetUserId, message) {
20
+ const input = validateInput(InitiateHandoffSchema, {
21
+ targetStackId,
22
+ frameIds,
23
+ handoffRequest: metadata,
24
+ reviewerId: targetUserId,
25
+ description: message
26
+ });
27
+ try {
28
+ await this.dualStackManager.getPermissionManager().enforcePermission(
29
+ this.dualStackManager.getPermissionManager().createContext(
30
+ input.handoffRequest.initiatorId,
31
+ "handoff",
32
+ "handoff",
33
+ input.targetStackId
34
+ )
35
+ );
36
+ await this.validateFramesForHandoff(input.frameIds);
37
+ const requestId = await this.dualStackManager.initiateHandoff(
38
+ input.targetStackId,
39
+ input.frameIds,
40
+ input.reviewerId,
41
+ input.description
42
+ );
43
+ const progress = {
44
+ requestId,
45
+ status: "pending_review",
46
+ transferredFrames: 0,
47
+ totalFrames: input.frameIds.length,
48
+ currentStep: "Awaiting approval",
49
+ errors: []
50
+ };
51
+ this.activeHandoffs.set(requestId, progress);
52
+ await this.createHandoffNotifications(requestId, metadata, targetUserId);
53
+ await this.scheduleHandoffReminders(requestId, metadata);
54
+ logger.info(`Initiated enhanced handoff: ${requestId}`, {
55
+ frameCount: frameIds.length,
56
+ priority: metadata.businessContext?.priority,
57
+ targetUser: targetUserId
58
+ });
59
+ return requestId;
60
+ } catch (error) {
61
+ throw new DatabaseError(
62
+ "Failed to initiate handoff",
63
+ ErrorCode.OPERATION_FAILED,
64
+ { targetStackId, frameIds },
65
+ error instanceof Error ? error : void 0
66
+ );
67
+ }
68
+ }
69
+ /**
70
+ * Submit approval/rejection for handoff request
71
+ */
72
+ async submitHandoffApproval(requestId, approval) {
73
+ const input = validateInput(HandoffApprovalSchema, {
74
+ ...approval,
75
+ reviewerId: approval.reviewerId
76
+ });
77
+ const progress = this.activeHandoffs.get(requestId);
78
+ if (!progress) {
79
+ throw new ValidationError(
80
+ `Handoff request not found: ${requestId}`,
81
+ ErrorCode.HANDOFF_REQUEST_EXPIRED
82
+ );
83
+ }
84
+ const fullApproval = {
85
+ ...input,
86
+ requestId,
87
+ reviewedAt: /* @__PURE__ */ new Date()
88
+ };
89
+ const existingApprovals = this.pendingApprovals.get(requestId) || [];
90
+ existingApprovals.push(fullApproval);
91
+ this.pendingApprovals.set(requestId, existingApprovals);
92
+ if (input.decision === "approved") {
93
+ progress.status = "approved";
94
+ progress.currentStep = "Ready for transfer";
95
+ await this.executeHandoffTransfer(requestId);
96
+ } else if (input.decision === "rejected") {
97
+ progress.status = "failed";
98
+ progress.currentStep = "Rejected by reviewer";
99
+ progress.errors.push({
100
+ step: "approval",
101
+ error: input.feedback || "Request rejected",
102
+ timestamp: /* @__PURE__ */ new Date()
103
+ });
104
+ } else if (input.decision === "needs_changes") {
105
+ progress.status = "pending_review";
106
+ progress.currentStep = "Changes requested";
107
+ await this.notifyChangesRequested(requestId, approval);
108
+ }
109
+ this.activeHandoffs.set(requestId, progress);
110
+ logger.info(`Handoff approval submitted: ${requestId}`, {
111
+ decision: approval.decision,
112
+ reviewer: approval.reviewerId
113
+ });
114
+ }
115
+ /**
116
+ * Execute the actual frame transfer after approval
117
+ */
118
+ async executeHandoffTransfer(requestId) {
119
+ logger.debug("executeHandoffTransfer called", {
120
+ requestId,
121
+ availableHandoffs: Array.from(this.activeHandoffs.keys())
122
+ });
123
+ const progress = this.activeHandoffs.get(requestId);
124
+ if (!progress) {
125
+ logger.error("Handoff progress not found", {
126
+ requestId,
127
+ availableHandoffs: Array.from(this.activeHandoffs.keys())
128
+ });
129
+ throw new DatabaseError(
130
+ `Handoff progress not found: ${requestId}`,
131
+ ErrorCode.INVALID_STATE
132
+ );
133
+ }
134
+ try {
135
+ logger.debug("Setting progress status to in_transfer", { requestId });
136
+ progress.status = "in_transfer";
137
+ progress.currentStep = "Transferring frames";
138
+ progress.estimatedCompletion = new Date(Date.now() + 5 * 60 * 1e3);
139
+ logger.debug("About to call acceptHandoff", { requestId });
140
+ const result = await this.dualStackManager.acceptHandoff(requestId);
141
+ logger.debug("acceptHandoff returned", {
142
+ requestId,
143
+ success: result.success
144
+ });
145
+ if (result.success) {
146
+ progress.status = "completed";
147
+ progress.currentStep = "Transfer completed";
148
+ progress.transferredFrames = result.mergedFrames.length;
149
+ await this.notifyHandoffCompletion(requestId, result);
150
+ logger.info(`Handoff transfer completed: ${requestId}`, {
151
+ transferredFrames: progress.transferredFrames,
152
+ conflicts: result.conflictFrames.length
153
+ });
154
+ } else {
155
+ progress.status = "failed";
156
+ progress.currentStep = "Transfer failed";
157
+ result.errors.forEach((error) => {
158
+ progress.errors.push({
159
+ step: "transfer",
160
+ error: `Frame ${error.frameId}: ${error.error}`,
161
+ timestamp: /* @__PURE__ */ new Date()
162
+ });
163
+ });
164
+ throw new DatabaseError(
165
+ "Handoff transfer failed",
166
+ ErrorCode.OPERATION_FAILED,
167
+ { errors: result.errors }
168
+ );
169
+ }
170
+ } catch (error) {
171
+ progress.status = "failed";
172
+ progress.currentStep = "Transfer error";
173
+ progress.errors.push({
174
+ step: "transfer",
175
+ error: error instanceof Error ? error.message : String(error),
176
+ timestamp: /* @__PURE__ */ new Date()
177
+ });
178
+ logger.error(`Handoff transfer failed: ${requestId}`, error);
179
+ throw error;
180
+ } finally {
181
+ this.activeHandoffs.set(requestId, progress);
182
+ }
183
+ }
184
+ /**
185
+ * Get handoff progress and status
186
+ */
187
+ async getHandoffProgress(requestId) {
188
+ return this.activeHandoffs.get(requestId) || null;
189
+ }
190
+ /**
191
+ * Cancel a pending handoff request
192
+ */
193
+ async cancelHandoff(requestId, reason) {
194
+ const progress = this.activeHandoffs.get(requestId);
195
+ if (!progress) {
196
+ throw new DatabaseError(
197
+ `Handoff request not found: ${requestId}`,
198
+ ErrorCode.RESOURCE_NOT_FOUND
199
+ );
200
+ }
201
+ if (progress.status === "in_transfer") {
202
+ throw new DatabaseError(
203
+ "Cannot cancel handoff that is currently transferring",
204
+ ErrorCode.INVALID_STATE
205
+ );
206
+ }
207
+ progress.status = "cancelled";
208
+ progress.currentStep = "Cancelled by user";
209
+ progress.errors.push({
210
+ step: "cancellation",
211
+ error: reason,
212
+ timestamp: /* @__PURE__ */ new Date()
213
+ });
214
+ this.activeHandoffs.set(requestId, progress);
215
+ await this.notifyHandoffCancellation(requestId, reason);
216
+ logger.info(`Handoff cancelled: ${requestId}`, { reason });
217
+ }
218
+ /**
219
+ * Get all active handoffs for a user or team
220
+ */
221
+ async getActiveHandoffs(userId, teamId) {
222
+ const handoffs = Array.from(this.activeHandoffs.values());
223
+ if (userId || teamId) {
224
+ return handoffs.filter(
225
+ (handoff) => handoff.status === "pending_review" || handoff.status === "approved" || handoff.status === "in_transfer"
226
+ );
227
+ }
228
+ return handoffs;
229
+ }
230
+ /**
231
+ * Get notifications for a user
232
+ */
233
+ async getUserNotifications(userId) {
234
+ return this.notifications.get(userId) || [];
235
+ }
236
+ /**
237
+ * Mark notification as read
238
+ */
239
+ async markNotificationRead(notificationId, userId) {
240
+ const userNotifications = this.notifications.get(userId) || [];
241
+ const updatedNotifications = userNotifications.filter(
242
+ (n) => n.id !== notificationId
243
+ );
244
+ this.notifications.set(userId, updatedNotifications);
245
+ }
246
+ /**
247
+ * Validate frames are suitable for handoff
248
+ */
249
+ async validateFramesForHandoff(frameIds) {
250
+ const activeStack = this.dualStackManager.getActiveStack();
251
+ for (const frameId of frameIds) {
252
+ const frame = await activeStack.getFrame(frameId);
253
+ if (!frame) {
254
+ throw new DatabaseError(
255
+ `Frame not found: ${frameId}`,
256
+ ErrorCode.RESOURCE_NOT_FOUND
257
+ );
258
+ }
259
+ if (frame.state === "active") {
260
+ logger.warn(`Transferring active frame: ${frameId}`, {
261
+ frameName: frame.name
262
+ });
263
+ }
264
+ }
265
+ }
266
+ /**
267
+ * Create notifications for handoff stakeholders
268
+ */
269
+ async createHandoffNotifications(requestId, metadata, targetUserId) {
270
+ const notifications = [];
271
+ if (targetUserId) {
272
+ notifications.push({
273
+ id: `${requestId}-target`,
274
+ type: "request",
275
+ requestId,
276
+ recipientId: targetUserId,
277
+ title: "Frame Handoff Request",
278
+ message: `${metadata.initiatorId} wants to transfer ${metadata.frameContext.totalFrames} frames to you`,
279
+ actionRequired: true,
280
+ expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1e3),
281
+ createdAt: /* @__PURE__ */ new Date()
282
+ });
283
+ }
284
+ if (metadata.businessContext?.stakeholders) {
285
+ for (const stakeholderId of metadata.businessContext.stakeholders) {
286
+ notifications.push({
287
+ id: `${requestId}-stakeholder-${stakeholderId}`,
288
+ type: "request",
289
+ requestId,
290
+ recipientId: stakeholderId,
291
+ title: "Frame Handoff Notification",
292
+ message: `Frame transfer initiated for ${metadata.businessContext?.milestone || "project milestone"}`,
293
+ actionRequired: false,
294
+ createdAt: /* @__PURE__ */ new Date()
295
+ });
296
+ }
297
+ }
298
+ for (const notification of notifications) {
299
+ const userNotifications = this.notifications.get(notification.recipientId) || [];
300
+ userNotifications.push(notification);
301
+ this.notifications.set(notification.recipientId, userNotifications);
302
+ }
303
+ }
304
+ /**
305
+ * Schedule reminder notifications
306
+ */
307
+ async scheduleHandoffReminders(requestId, metadata) {
308
+ if (metadata.businessContext?.priority === "high" || metadata.businessContext?.priority === "critical") {
309
+ setTimeout(
310
+ async () => {
311
+ const progress = this.activeHandoffs.get(requestId);
312
+ if (progress && progress.status === "pending_review") {
313
+ await this.sendHandoffReminder(requestId, metadata);
314
+ }
315
+ },
316
+ 4 * 60 * 60 * 1e3
317
+ );
318
+ }
319
+ }
320
+ /**
321
+ * Send handoff reminder
322
+ */
323
+ async sendHandoffReminder(requestId, metadata) {
324
+ logger.info(`Sending handoff reminder: ${requestId}`, {
325
+ priority: metadata.businessContext?.priority
326
+ });
327
+ }
328
+ /**
329
+ * Notify when changes are requested
330
+ */
331
+ async notifyChangesRequested(requestId, approval) {
332
+ logger.info(`Changes requested for handoff: ${requestId}`, {
333
+ reviewer: approval.reviewerId,
334
+ feedback: approval.feedback
335
+ });
336
+ }
337
+ /**
338
+ * Notify handoff completion
339
+ */
340
+ async notifyHandoffCompletion(requestId, result) {
341
+ logger.info(`Handoff completed: ${requestId}`, {
342
+ mergedFrames: result.mergedFrames.length,
343
+ conflicts: result.conflictFrames.length
344
+ });
345
+ }
346
+ /**
347
+ * Notify handoff cancellation
348
+ */
349
+ async notifyHandoffCancellation(requestId, reason) {
350
+ logger.info(`Handoff cancelled: ${requestId}`, { reason });
351
+ }
352
+ /**
353
+ * Get handoff analytics and metrics
354
+ */
355
+ async getHandoffMetrics(timeRange) {
356
+ const handoffs = Array.from(this.activeHandoffs.values());
357
+ const filteredHandoffs = timeRange ? handoffs.filter((h) => {
358
+ return true;
359
+ }) : handoffs;
360
+ const completedHandoffs = filteredHandoffs.filter(
361
+ (h) => h.status === "completed"
362
+ );
363
+ return {
364
+ totalHandoffs: filteredHandoffs.length,
365
+ completedHandoffs: completedHandoffs.length,
366
+ averageProcessingTime: this.calculateAverageProcessingTime(completedHandoffs),
367
+ topFrameTypes: this.analyzeFrameTypes(filteredHandoffs),
368
+ collaborationPatterns: this.analyzeCollaborationPatterns(filteredHandoffs)
369
+ };
370
+ }
371
+ calculateAverageProcessingTime(handoffs) {
372
+ return 0;
373
+ }
374
+ analyzeFrameTypes(handoffs) {
375
+ return [];
376
+ }
377
+ analyzeCollaborationPatterns(handoffs) {
378
+ return [];
379
+ }
380
+ }
381
+ export {
382
+ FrameHandoffManager
383
+ };
384
+ //# sourceMappingURL=frame-handoff-manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/context/frame-handoff-manager.ts"],
4
+ "sourcesContent": ["/**\n * Frame Handoff Manager - STA-100\n * Handles frame transfers between individual and team stacks with approval workflows\n */\n\nimport type { Frame, Event, Anchor } from './frame-manager.js';\nimport {\n DualStackManager,\n type StackContext,\n type HandoffRequest,\n} from './dual-stack-manager.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, DatabaseError, ErrorCode } from '../errors/index.js';\nimport {\n validateInput,\n InitiateHandoffSchema,\n HandoffApprovalSchema,\n type InitiateHandoffInput,\n type HandoffApprovalInput,\n} from './validation.js';\n\nexport interface HandoffMetadata {\n initiatedAt: Date;\n initiatorId: string;\n targetUserId?: string;\n targetTeamId?: string;\n frameContext: {\n totalFrames: number;\n frameTypes: string[];\n estimatedSize: number;\n dependencies: string[];\n };\n businessContext?: {\n milestone?: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n deadline?: Date;\n stakeholders: string[];\n };\n}\n\nexport interface HandoffApproval {\n requestId: string;\n reviewerId: string;\n decision: 'approved' | 'rejected' | 'needs_changes';\n feedback?: string;\n suggestedChanges?: Array<{\n frameId: string;\n suggestion: string;\n reason: string;\n }>;\n reviewedAt: Date;\n}\n\nexport interface HandoffNotification {\n id: string;\n type: 'request' | 'approval' | 'rejection' | 'completion' | 'reminder';\n requestId: string;\n recipientId: string;\n title: string;\n message: string;\n actionRequired: boolean;\n expiresAt?: Date;\n createdAt: Date;\n}\n\nexport interface HandoffProgress {\n requestId: string;\n status:\n | 'pending_review'\n | 'approved'\n | 'in_transfer'\n | 'completed'\n | 'failed'\n | 'cancelled';\n transferredFrames: number;\n totalFrames: number;\n currentStep: string;\n estimatedCompletion?: Date;\n errors: Array<{\n step: string;\n error: string;\n timestamp: Date;\n }>;\n}\n\nexport class FrameHandoffManager {\n private dualStackManager: DualStackManager;\n private activeHandoffs: Map<string, HandoffProgress> = new Map();\n private pendingApprovals: Map<string, HandoffApproval[]> = new Map();\n private notifications: Map<string, HandoffNotification[]> = new Map();\n\n constructor(dualStackManager: DualStackManager) {\n this.dualStackManager = dualStackManager;\n }\n\n /**\n * Initiate a frame handoff with rich metadata and approval workflow\n */\n async initiateHandoff(\n targetStackId: string,\n frameIds: string[],\n metadata: HandoffMetadata,\n targetUserId?: string,\n message?: string\n ): Promise<string> {\n // Validate input parameters\n const input = validateInput(InitiateHandoffSchema, {\n targetStackId,\n frameIds,\n handoffRequest: metadata,\n reviewerId: targetUserId,\n description: message,\n });\n\n try {\n // Check handoff permissions\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(\n input.handoffRequest.initiatorId,\n 'handoff',\n 'handoff',\n input.targetStackId\n )\n );\n\n // Validate frames exist and are transferable\n await this.validateFramesForHandoff(input.frameIds);\n\n // Create enhanced handoff request\n const requestId = await this.dualStackManager.initiateHandoff(\n input.targetStackId,\n input.frameIds,\n input.reviewerId,\n input.description\n );\n\n // Initialize handoff progress tracking\n const progress: HandoffProgress = {\n requestId,\n status: 'pending_review',\n transferredFrames: 0,\n totalFrames: input.frameIds.length,\n currentStep: 'Awaiting approval',\n errors: [],\n };\n\n this.activeHandoffs.set(requestId, progress);\n\n // Create notifications for relevant stakeholders\n await this.createHandoffNotifications(requestId, metadata, targetUserId);\n\n // Set up automatic reminders\n await this.scheduleHandoffReminders(requestId, metadata);\n\n logger.info(`Initiated enhanced handoff: ${requestId}`, {\n frameCount: frameIds.length,\n priority: metadata.businessContext?.priority,\n targetUser: targetUserId,\n });\n\n return requestId;\n } catch (error) {\n throw new DatabaseError(\n 'Failed to initiate handoff',\n ErrorCode.OPERATION_FAILED,\n { targetStackId, frameIds },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Submit approval/rejection for handoff request\n */\n async submitHandoffApproval(\n requestId: string,\n approval: Omit<HandoffApproval, 'requestId' | 'reviewedAt'>\n ): Promise<void> {\n // Validate input parameters\n const input = validateInput(HandoffApprovalSchema, {\n ...approval,\n reviewerId: approval.reviewerId,\n });\n const progress = this.activeHandoffs.get(requestId);\n if (!progress) {\n throw new ValidationError(\n `Handoff request not found: ${requestId}`,\n ErrorCode.HANDOFF_REQUEST_EXPIRED\n );\n }\n\n const fullApproval: HandoffApproval = {\n ...input,\n requestId,\n reviewedAt: new Date(),\n };\n\n // Store approval\n const existingApprovals = this.pendingApprovals.get(requestId) || [];\n existingApprovals.push(fullApproval);\n this.pendingApprovals.set(requestId, existingApprovals);\n\n // Update progress based on decision\n if (input.decision === 'approved') {\n progress.status = 'approved';\n progress.currentStep = 'Ready for transfer';\n\n // Automatically start transfer if approved\n await this.executeHandoffTransfer(requestId);\n } else if (input.decision === 'rejected') {\n progress.status = 'failed';\n progress.currentStep = 'Rejected by reviewer';\n progress.errors.push({\n step: 'approval',\n error: input.feedback || 'Request rejected',\n timestamp: new Date(),\n });\n } else if (input.decision === 'needs_changes') {\n progress.status = 'pending_review';\n progress.currentStep = 'Changes requested';\n\n // Notify requester of needed changes\n await this.notifyChangesRequested(requestId, approval);\n }\n\n this.activeHandoffs.set(requestId, progress);\n\n logger.info(`Handoff approval submitted: ${requestId}`, {\n decision: approval.decision,\n reviewer: approval.reviewerId,\n });\n }\n\n /**\n * Execute the actual frame transfer after approval\n */\n private async executeHandoffTransfer(requestId: string): Promise<void> {\n logger.debug('executeHandoffTransfer called', {\n requestId,\n availableHandoffs: Array.from(this.activeHandoffs.keys()),\n });\n const progress = this.activeHandoffs.get(requestId);\n if (!progress) {\n logger.error('Handoff progress not found', {\n requestId,\n availableHandoffs: Array.from(this.activeHandoffs.keys()),\n });\n throw new DatabaseError(\n `Handoff progress not found: ${requestId}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n try {\n logger.debug('Setting progress status to in_transfer', { requestId });\n progress.status = 'in_transfer';\n progress.currentStep = 'Transferring frames';\n progress.estimatedCompletion = new Date(Date.now() + 5 * 60 * 1000); // 5 minutes\n\n // Execute the handoff through DualStackManager\n logger.debug('About to call acceptHandoff', { requestId });\n const result = await this.dualStackManager.acceptHandoff(requestId);\n logger.debug('acceptHandoff returned', {\n requestId,\n success: result.success,\n });\n\n if (result.success) {\n progress.status = 'completed';\n progress.currentStep = 'Transfer completed';\n progress.transferredFrames = result.mergedFrames.length;\n\n // Create completion notifications\n await this.notifyHandoffCompletion(requestId, result);\n\n logger.info(`Handoff transfer completed: ${requestId}`, {\n transferredFrames: progress.transferredFrames,\n conflicts: result.conflictFrames.length,\n });\n } else {\n progress.status = 'failed';\n progress.currentStep = 'Transfer failed';\n\n // Log errors\n result.errors.forEach((error) => {\n progress.errors.push({\n step: 'transfer',\n error: `Frame ${error.frameId}: ${error.error}`,\n timestamp: new Date(),\n });\n });\n\n throw new DatabaseError(\n 'Handoff transfer failed',\n ErrorCode.OPERATION_FAILED,\n { errors: result.errors }\n );\n }\n } catch (error) {\n progress.status = 'failed';\n progress.currentStep = 'Transfer error';\n progress.errors.push({\n step: 'transfer',\n error: error instanceof Error ? error.message : String(error),\n timestamp: new Date(),\n });\n\n logger.error(`Handoff transfer failed: ${requestId}`, error);\n throw error;\n } finally {\n this.activeHandoffs.set(requestId, progress);\n }\n }\n\n /**\n * Get handoff progress and status\n */\n async getHandoffProgress(requestId: string): Promise<HandoffProgress | null> {\n return this.activeHandoffs.get(requestId) || null;\n }\n\n /**\n * Cancel a pending handoff request\n */\n async cancelHandoff(requestId: string, reason: string): Promise<void> {\n const progress = this.activeHandoffs.get(requestId);\n if (!progress) {\n throw new DatabaseError(\n `Handoff request not found: ${requestId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n if (progress.status === 'in_transfer') {\n throw new DatabaseError(\n 'Cannot cancel handoff that is currently transferring',\n ErrorCode.INVALID_STATE\n );\n }\n\n progress.status = 'cancelled';\n progress.currentStep = 'Cancelled by user';\n progress.errors.push({\n step: 'cancellation',\n error: reason,\n timestamp: new Date(),\n });\n\n this.activeHandoffs.set(requestId, progress);\n\n // Notify relevant parties\n await this.notifyHandoffCancellation(requestId, reason);\n\n logger.info(`Handoff cancelled: ${requestId}`, { reason });\n }\n\n /**\n * Get all active handoffs for a user or team\n */\n async getActiveHandoffs(\n userId?: string,\n teamId?: string\n ): Promise<HandoffProgress[]> {\n const handoffs = Array.from(this.activeHandoffs.values());\n\n // Filter by user/team if specified\n if (userId || teamId) {\n // Would need to cross-reference with handoff metadata\n return handoffs.filter(\n (handoff) =>\n handoff.status === 'pending_review' ||\n handoff.status === 'approved' ||\n handoff.status === 'in_transfer'\n );\n }\n\n return handoffs;\n }\n\n /**\n * Get notifications for a user\n */\n async getUserNotifications(userId: string): Promise<HandoffNotification[]> {\n return this.notifications.get(userId) || [];\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationRead(\n notificationId: string,\n userId: string\n ): Promise<void> {\n const userNotifications = this.notifications.get(userId) || [];\n const updatedNotifications = userNotifications.filter(\n (n) => n.id !== notificationId\n );\n this.notifications.set(userId, updatedNotifications);\n }\n\n /**\n * Validate frames are suitable for handoff\n */\n private async validateFramesForHandoff(frameIds: string[]): Promise<void> {\n const activeStack = this.dualStackManager.getActiveStack();\n\n for (const frameId of frameIds) {\n const frame = await activeStack.getFrame(frameId);\n if (!frame) {\n throw new DatabaseError(\n `Frame not found: ${frameId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n // Check if frame is in a transferable state\n if (frame.state === 'active') {\n logger.warn(`Transferring active frame: ${frameId}`, {\n frameName: frame.name,\n });\n }\n }\n }\n\n /**\n * Create notifications for handoff stakeholders\n */\n private async createHandoffNotifications(\n requestId: string,\n metadata: HandoffMetadata,\n targetUserId?: string\n ): Promise<void> {\n const notifications: HandoffNotification[] = [];\n\n // Notify target user\n if (targetUserId) {\n notifications.push({\n id: `${requestId}-target`,\n type: 'request',\n requestId,\n recipientId: targetUserId,\n title: 'Frame Handoff Request',\n message: `${metadata.initiatorId} wants to transfer ${metadata.frameContext.totalFrames} frames to you`,\n actionRequired: true,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),\n createdAt: new Date(),\n });\n }\n\n // Notify stakeholders\n if (metadata.businessContext?.stakeholders) {\n for (const stakeholderId of metadata.businessContext.stakeholders) {\n notifications.push({\n id: `${requestId}-stakeholder-${stakeholderId}`,\n type: 'request',\n requestId,\n recipientId: stakeholderId,\n title: 'Frame Handoff Notification',\n message: `Frame transfer initiated for ${metadata.businessContext?.milestone || 'project milestone'}`,\n actionRequired: false,\n createdAt: new Date(),\n });\n }\n }\n\n // Store notifications\n for (const notification of notifications) {\n const userNotifications =\n this.notifications.get(notification.recipientId) || [];\n userNotifications.push(notification);\n this.notifications.set(notification.recipientId, userNotifications);\n }\n }\n\n /**\n * Schedule reminder notifications\n */\n private async scheduleHandoffReminders(\n requestId: string,\n metadata: HandoffMetadata\n ): Promise<void> {\n // Schedule reminder in 4 hours if high priority\n if (\n metadata.businessContext?.priority === 'high' ||\n metadata.businessContext?.priority === 'critical'\n ) {\n setTimeout(\n async () => {\n const progress = this.activeHandoffs.get(requestId);\n if (progress && progress.status === 'pending_review') {\n await this.sendHandoffReminder(requestId, metadata);\n }\n },\n 4 * 60 * 60 * 1000\n ); // 4 hours\n }\n }\n\n /**\n * Send handoff reminder\n */\n private async sendHandoffReminder(\n requestId: string,\n metadata: HandoffMetadata\n ): Promise<void> {\n // Implementation would send actual notifications\n logger.info(`Sending handoff reminder: ${requestId}`, {\n priority: metadata.businessContext?.priority,\n });\n }\n\n /**\n * Notify when changes are requested\n */\n private async notifyChangesRequested(\n requestId: string,\n approval: HandoffApproval\n ): Promise<void> {\n // Implementation would notify the requester\n logger.info(`Changes requested for handoff: ${requestId}`, {\n reviewer: approval.reviewerId,\n feedback: approval.feedback,\n });\n }\n\n /**\n * Notify handoff completion\n */\n private async notifyHandoffCompletion(\n requestId: string,\n result: any\n ): Promise<void> {\n // Implementation would notify all stakeholders\n logger.info(`Handoff completed: ${requestId}`, {\n mergedFrames: result.mergedFrames.length,\n conflicts: result.conflictFrames.length,\n });\n }\n\n /**\n * Notify handoff cancellation\n */\n private async notifyHandoffCancellation(\n requestId: string,\n reason: string\n ): Promise<void> {\n // Implementation would notify stakeholders\n logger.info(`Handoff cancelled: ${requestId}`, { reason });\n }\n\n /**\n * Get handoff analytics and metrics\n */\n async getHandoffMetrics(timeRange?: { start: Date; end: Date }): Promise<{\n totalHandoffs: number;\n completedHandoffs: number;\n averageProcessingTime: number;\n topFrameTypes: Array<{ type: string; count: number }>;\n collaborationPatterns: Array<{\n sourceUser: string;\n targetUser: string;\n count: number;\n }>;\n }> {\n const handoffs = Array.from(this.activeHandoffs.values());\n\n // Filter by time range if specified\n const filteredHandoffs = timeRange\n ? handoffs.filter((h) => {\n // Would need to add timestamps to track creation time\n return true; // Placeholder\n })\n : handoffs;\n\n const completedHandoffs = filteredHandoffs.filter(\n (h) => h.status === 'completed'\n );\n\n return {\n totalHandoffs: filteredHandoffs.length,\n completedHandoffs: completedHandoffs.length,\n averageProcessingTime:\n this.calculateAverageProcessingTime(completedHandoffs),\n topFrameTypes: this.analyzeFrameTypes(filteredHandoffs),\n collaborationPatterns:\n this.analyzeCollaborationPatterns(filteredHandoffs),\n };\n }\n\n private calculateAverageProcessingTime(handoffs: HandoffProgress[]): number {\n // Implementation would calculate actual processing times\n return 0; // Placeholder\n }\n\n private analyzeFrameTypes(\n handoffs: HandoffProgress[]\n ): Array<{ type: string; count: number }> {\n // Implementation would analyze frame types from handoffs\n return []; // Placeholder\n }\n\n private analyzeCollaborationPatterns(\n handoffs: HandoffProgress[]\n ): Array<{ sourceUser: string; targetUser: string; count: number }> {\n // Implementation would analyze collaboration patterns\n return []; // Placeholder\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }