@stackmemoryai/stackmemory 0.5.58 → 0.5.59

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 (596) hide show
  1. package/dist/cli/commands/search.js +20 -3
  2. package/dist/cli/commands/search.js.map +2 -2
  3. package/dist/core/database/sqlite-adapter.js +13 -3
  4. package/dist/core/database/sqlite-adapter.js.map +2 -2
  5. package/dist/core/errors/error-utils.js +208 -0
  6. package/dist/core/errors/error-utils.js.map +7 -0
  7. package/dist/core/errors/index.js +13 -4
  8. package/dist/core/errors/index.js.map +2 -2
  9. package/dist/core/merge/unified-merge-resolver.js +303 -0
  10. package/dist/core/merge/unified-merge-resolver.js.map +7 -0
  11. package/dist/core/monitoring/logger.js +61 -9
  12. package/dist/core/monitoring/logger.js.map +2 -2
  13. package/dist/core/security/index.js +35 -0
  14. package/dist/core/security/index.js.map +7 -0
  15. package/dist/core/security/input-sanitizer.js +321 -0
  16. package/dist/core/security/input-sanitizer.js.map +7 -0
  17. package/dist/integrations/linear/client.js +5 -1
  18. package/dist/integrations/linear/client.js.map +2 -2
  19. package/dist/integrations/mcp/remote-server.js +27 -36
  20. package/dist/integrations/mcp/remote-server.js.map +2 -2
  21. package/dist/integrations/mcp/server.js +44 -29
  22. package/dist/integrations/mcp/server.js.map +3 -3
  23. package/dist/scripts/benchmark-performance.js +48 -0
  24. package/dist/scripts/benchmark-performance.js.map +7 -0
  25. package/dist/scripts/check-redis.js +42 -0
  26. package/dist/scripts/check-redis.js.map +7 -0
  27. package/dist/scripts/initialize.js +116 -0
  28. package/dist/scripts/initialize.js.map +7 -0
  29. package/dist/scripts/list-linear-tasks.js +124 -0
  30. package/dist/scripts/list-linear-tasks.js.map +7 -0
  31. package/dist/scripts/measure-handoff-impact.js +340 -0
  32. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  33. package/dist/scripts/query-chromadb.js +160 -0
  34. package/dist/scripts/query-chromadb.js.map +7 -0
  35. package/dist/scripts/show-linear-summary.js +119 -0
  36. package/dist/scripts/show-linear-summary.js.map +7 -0
  37. package/dist/scripts/simple-swarm-demo.js +90 -0
  38. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  39. package/dist/scripts/status.js +155 -0
  40. package/dist/scripts/status.js.map +7 -0
  41. package/dist/scripts/test-chromadb-sync.js +192 -0
  42. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  43. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  44. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  45. package/dist/scripts/test-ralph-iterations.js +121 -0
  46. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  47. package/dist/scripts/test-redis-storage.js +389 -0
  48. package/dist/scripts/test-redis-storage.js.map +7 -0
  49. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  50. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  51. package/dist/scripts/test-swarm-fixes.js +125 -0
  52. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  53. package/dist/scripts/test-swarm-tui.js +23 -0
  54. package/dist/scripts/test-swarm-tui.js.map +7 -0
  55. package/dist/scripts/test-tui-shortcuts.js +52 -0
  56. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  57. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  58. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  59. package/dist/src/agents/core/agent-task-manager.js +527 -0
  60. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  61. package/dist/src/agents/verifiers/base-verifier.js +133 -0
  62. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  63. package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
  64. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  65. package/dist/src/agents/verifiers/llm-judge.js +252 -0
  66. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  67. package/dist/src/cli/auto-detect.js +321 -0
  68. package/dist/src/cli/auto-detect.js.map +7 -0
  69. package/dist/src/cli/claude-sm-danger.js +21 -0
  70. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  71. package/dist/src/cli/claude-sm.js +1156 -0
  72. package/dist/src/cli/claude-sm.js.map +7 -0
  73. package/dist/src/cli/codex-sm-danger.js +21 -0
  74. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  75. package/dist/src/cli/codex-sm.js +349 -0
  76. package/dist/src/cli/codex-sm.js.map +7 -0
  77. package/dist/src/cli/commands/api.js +232 -0
  78. package/dist/src/cli/commands/api.js.map +7 -0
  79. package/dist/src/cli/commands/auto-background.js +180 -0
  80. package/dist/src/cli/commands/auto-background.js.map +7 -0
  81. package/dist/src/cli/commands/cleanup-processes.js +68 -0
  82. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  83. package/dist/src/cli/commands/clear.js +202 -0
  84. package/dist/src/cli/commands/clear.js.map +7 -0
  85. package/dist/src/cli/commands/config.js +445 -0
  86. package/dist/src/cli/commands/config.js.map +7 -0
  87. package/dist/src/cli/commands/context-rehydrate.js +751 -0
  88. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  89. package/dist/src/cli/commands/context.js +343 -0
  90. package/dist/src/cli/commands/context.js.map +7 -0
  91. package/dist/src/cli/commands/daemon.js +392 -0
  92. package/dist/src/cli/commands/daemon.js.map +7 -0
  93. package/dist/src/cli/commands/dashboard.js +210 -0
  94. package/dist/src/cli/commands/dashboard.js.map +7 -0
  95. package/dist/src/cli/commands/db.js +147 -0
  96. package/dist/src/cli/commands/db.js.map +7 -0
  97. package/dist/src/cli/commands/decision.js +266 -0
  98. package/dist/src/cli/commands/decision.js.map +7 -0
  99. package/dist/src/cli/commands/discovery.js +279 -0
  100. package/dist/src/cli/commands/discovery.js.map +7 -0
  101. package/dist/src/cli/commands/handoff.js +624 -0
  102. package/dist/src/cli/commands/handoff.js.map +7 -0
  103. package/dist/src/cli/commands/hooks.js +298 -0
  104. package/dist/src/cli/commands/hooks.js.map +7 -0
  105. package/dist/src/cli/commands/linear.js +529 -0
  106. package/dist/src/cli/commands/linear.js.map +7 -0
  107. package/dist/src/cli/commands/log.js +169 -0
  108. package/dist/src/cli/commands/log.js.map +7 -0
  109. package/dist/src/cli/commands/login.js +172 -0
  110. package/dist/src/cli/commands/login.js.map +7 -0
  111. package/dist/src/cli/commands/migrate.js +240 -0
  112. package/dist/src/cli/commands/migrate.js.map +7 -0
  113. package/dist/src/cli/commands/model.js +533 -0
  114. package/dist/src/cli/commands/model.js.map +7 -0
  115. package/dist/src/cli/commands/onboard.js +536 -0
  116. package/dist/src/cli/commands/onboard.js.map +7 -0
  117. package/dist/src/cli/commands/projects.js +199 -0
  118. package/dist/src/cli/commands/projects.js.map +7 -0
  119. package/dist/src/cli/commands/ralph.js +909 -0
  120. package/dist/src/cli/commands/ralph.js.map +7 -0
  121. package/dist/src/cli/commands/retrieval.js +248 -0
  122. package/dist/src/cli/commands/retrieval.js.map +7 -0
  123. package/dist/src/cli/commands/search.js +173 -0
  124. package/dist/src/cli/commands/search.js.map +7 -0
  125. package/dist/src/cli/commands/service.js +749 -0
  126. package/dist/src/cli/commands/service.js.map +7 -0
  127. package/dist/src/cli/commands/session.js +200 -0
  128. package/dist/src/cli/commands/session.js.map +7 -0
  129. package/dist/src/cli/commands/settings.js +306 -0
  130. package/dist/src/cli/commands/settings.js.map +7 -0
  131. package/dist/src/cli/commands/setup.js +701 -0
  132. package/dist/src/cli/commands/setup.js.map +7 -0
  133. package/dist/src/cli/commands/shell.js +249 -0
  134. package/dist/src/cli/commands/shell.js.map +7 -0
  135. package/dist/src/cli/commands/signup.js +50 -0
  136. package/dist/src/cli/commands/signup.js.map +7 -0
  137. package/dist/src/cli/commands/skills.js +470 -0
  138. package/dist/src/cli/commands/skills.js.map +7 -0
  139. package/dist/src/cli/commands/sms-notify.js +795 -0
  140. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  141. package/dist/src/cli/commands/storage-tier.js +183 -0
  142. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  143. package/dist/src/cli/commands/sweep.js +249 -0
  144. package/dist/src/cli/commands/sweep.js.map +7 -0
  145. package/dist/src/cli/commands/tasks.js +213 -0
  146. package/dist/src/cli/commands/tasks.js.map +7 -0
  147. package/dist/src/cli/commands/worktree.js +319 -0
  148. package/dist/src/cli/commands/worktree.js.map +7 -0
  149. package/dist/src/cli/index.js +594 -0
  150. package/dist/src/cli/index.js.map +7 -0
  151. package/dist/src/cli/opencode-sm.js +448 -0
  152. package/dist/src/cli/opencode-sm.js.map +7 -0
  153. package/dist/src/cli/utils/viewer.js +96 -0
  154. package/dist/src/cli/utils/viewer.js.map +7 -0
  155. package/dist/src/core/config/config-manager.js +398 -0
  156. package/dist/src/core/config/config-manager.js.map +7 -0
  157. package/dist/src/core/config/feature-flags.js +76 -0
  158. package/dist/src/core/config/feature-flags.js.map +7 -0
  159. package/dist/src/core/config/storage-config.js +115 -0
  160. package/dist/src/core/config/storage-config.js.map +7 -0
  161. package/dist/src/core/config/types.js +144 -0
  162. package/dist/src/core/config/types.js.map +7 -0
  163. package/dist/src/core/context/auto-context.js +80 -0
  164. package/dist/src/core/context/auto-context.js.map +7 -0
  165. package/dist/src/core/context/dual-stack-manager.js +870 -0
  166. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  167. package/dist/src/core/context/enhanced-rehydration.js +994 -0
  168. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  169. package/dist/src/core/context/frame-database.js +479 -0
  170. package/dist/src/core/context/frame-database.js.map +7 -0
  171. package/dist/src/core/context/frame-digest.js +250 -0
  172. package/dist/src/core/context/frame-digest.js.map +7 -0
  173. package/dist/src/core/context/frame-handoff-manager.js +778 -0
  174. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  175. package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
  176. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  177. package/dist/src/core/context/frame-recovery.js +302 -0
  178. package/dist/src/core/context/frame-recovery.js.map +7 -0
  179. package/dist/src/core/context/frame-stack.js +314 -0
  180. package/dist/src/core/context/frame-stack.js.map +7 -0
  181. package/dist/src/core/context/frame-types.js +5 -0
  182. package/dist/src/core/context/frame-types.js.map +7 -0
  183. package/dist/src/core/context/index.js +25 -0
  184. package/dist/src/core/context/index.js.map +7 -0
  185. package/dist/src/core/context/permission-manager.js +185 -0
  186. package/dist/src/core/context/permission-manager.js.map +7 -0
  187. package/dist/src/core/context/recursive-context-manager.js +592 -0
  188. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  189. package/dist/src/core/context/refactored-frame-manager.js +754 -0
  190. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  191. package/dist/src/core/context/shared-context-layer.js +621 -0
  192. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  193. package/dist/src/core/context/stack-merge-resolver.js +749 -0
  194. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  195. package/dist/src/core/context/validation.js +130 -0
  196. package/dist/src/core/context/validation.js.map +7 -0
  197. package/dist/src/core/database/batch-operations.js +384 -0
  198. package/dist/src/core/database/batch-operations.js.map +7 -0
  199. package/dist/src/core/database/connection-pool.js +330 -0
  200. package/dist/src/core/database/connection-pool.js.map +7 -0
  201. package/dist/src/core/database/database-adapter.js +60 -0
  202. package/dist/src/core/database/database-adapter.js.map +7 -0
  203. package/dist/src/core/database/migration-manager.js +614 -0
  204. package/dist/src/core/database/migration-manager.js.map +7 -0
  205. package/dist/src/core/database/query-cache.js +298 -0
  206. package/dist/src/core/database/query-cache.js.map +7 -0
  207. package/dist/src/core/database/query-router.js +430 -0
  208. package/dist/src/core/database/query-router.js.map +7 -0
  209. package/dist/src/core/database/sqlite-adapter.js +738 -0
  210. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  211. package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
  212. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  213. package/dist/src/core/digest/frame-digest-integration.js +176 -0
  214. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  215. package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
  216. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  217. package/dist/src/core/digest/index.js +9 -0
  218. package/dist/src/core/digest/index.js.map +7 -0
  219. package/dist/src/core/digest/types.js +25 -0
  220. package/dist/src/core/digest/types.js.map +7 -0
  221. package/dist/src/core/errors/error-utils.js +208 -0
  222. package/dist/src/core/errors/error-utils.js.map +7 -0
  223. package/dist/src/core/errors/index.js +521 -0
  224. package/dist/src/core/errors/index.js.map +7 -0
  225. package/dist/src/core/errors/recovery.js +269 -0
  226. package/dist/src/core/errors/recovery.js.map +7 -0
  227. package/dist/src/core/execution/parallel-executor.js +258 -0
  228. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  229. package/dist/src/core/frame/workflow-templates.js +319 -0
  230. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  231. package/dist/src/core/merge/conflict-detector.js +431 -0
  232. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  233. package/dist/src/core/merge/index.js +9 -0
  234. package/dist/src/core/merge/index.js.map +7 -0
  235. package/dist/src/core/merge/resolution-engine.js +558 -0
  236. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  237. package/dist/src/core/merge/stack-diff.js +532 -0
  238. package/dist/src/core/merge/stack-diff.js.map +7 -0
  239. package/dist/src/core/merge/types.js +5 -0
  240. package/dist/src/core/merge/types.js.map +7 -0
  241. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  242. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  243. package/dist/src/core/models/fallback-monitor.js +232 -0
  244. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  245. package/dist/src/core/models/model-router.js +340 -0
  246. package/dist/src/core/models/model-router.js.map +7 -0
  247. package/dist/src/core/monitoring/error-handler.js +49 -0
  248. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  249. package/dist/src/core/monitoring/logger.js +202 -0
  250. package/dist/src/core/monitoring/logger.js.map +7 -0
  251. package/dist/src/core/monitoring/metrics.js +172 -0
  252. package/dist/src/core/monitoring/metrics.js.map +7 -0
  253. package/dist/src/core/monitoring/progress-tracker.js +189 -0
  254. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  255. package/dist/src/core/monitoring/session-monitor.js +300 -0
  256. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  257. package/dist/src/core/performance/context-cache.js +273 -0
  258. package/dist/src/core/performance/context-cache.js.map +7 -0
  259. package/dist/src/core/performance/index.js +11 -0
  260. package/dist/src/core/performance/index.js.map +7 -0
  261. package/dist/src/core/performance/lazy-context-loader.js +327 -0
  262. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  263. package/dist/src/core/performance/monitor.js +221 -0
  264. package/dist/src/core/performance/monitor.js.map +7 -0
  265. package/dist/src/core/performance/optimized-frame-context.js +345 -0
  266. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  267. package/dist/src/core/performance/performance-benchmark.js +277 -0
  268. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  269. package/dist/src/core/performance/performance-profiler.js +370 -0
  270. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  271. package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
  272. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  273. package/dist/src/core/persistence/postgres-adapter.js +349 -0
  274. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  275. package/dist/src/core/projects/project-isolation.js +201 -0
  276. package/dist/src/core/projects/project-isolation.js.map +7 -0
  277. package/dist/src/core/projects/project-manager.js +697 -0
  278. package/dist/src/core/projects/project-manager.js.map +7 -0
  279. package/dist/src/core/query/query-parser.js +370 -0
  280. package/dist/src/core/query/query-parser.js.map +7 -0
  281. package/dist/src/core/query/query-templates.js +321 -0
  282. package/dist/src/core/query/query-templates.js.map +7 -0
  283. package/dist/src/core/retrieval/context-retriever.js +479 -0
  284. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  285. package/dist/src/core/retrieval/index.js +8 -0
  286. package/dist/src/core/retrieval/index.js.map +7 -0
  287. package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
  288. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  289. package/dist/src/core/retrieval/llm-provider.js +151 -0
  290. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  291. package/dist/src/core/retrieval/retrieval-audit.js +236 -0
  292. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  293. package/dist/src/core/retrieval/summary-generator.js +589 -0
  294. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  295. package/dist/src/core/retrieval/types.js +21 -0
  296. package/dist/src/core/retrieval/types.js.map +7 -0
  297. package/dist/src/core/security/index.js +35 -0
  298. package/dist/src/core/security/index.js.map +7 -0
  299. package/dist/src/core/security/input-sanitizer.js +321 -0
  300. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  301. package/dist/src/core/session/clear-survival.js +465 -0
  302. package/dist/src/core/session/clear-survival.js.map +7 -0
  303. package/dist/src/core/session/enhanced-handoff.js +792 -0
  304. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  305. package/dist/src/core/session/handoff-generator.js +343 -0
  306. package/dist/src/core/session/handoff-generator.js.map +7 -0
  307. package/dist/src/core/session/index.js +15 -0
  308. package/dist/src/core/session/index.js.map +7 -0
  309. package/dist/src/core/session/session-manager.js +347 -0
  310. package/dist/src/core/session/session-manager.js.map +7 -0
  311. package/dist/src/core/skills/index.js +7 -0
  312. package/dist/src/core/skills/index.js.map +7 -0
  313. package/dist/src/core/skills/skill-storage.js +764 -0
  314. package/dist/src/core/skills/skill-storage.js.map +7 -0
  315. package/dist/src/core/skills/types.js +193 -0
  316. package/dist/src/core/skills/types.js.map +7 -0
  317. package/dist/src/core/storage/chromadb-adapter.js +354 -0
  318. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  319. package/dist/src/core/storage/infinite-storage.js +510 -0
  320. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  321. package/dist/src/core/storage/remote-storage.js +489 -0
  322. package/dist/src/core/storage/remote-storage.js.map +7 -0
  323. package/dist/src/core/storage/two-tier-storage.js +766 -0
  324. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  325. package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
  326. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  327. package/dist/src/core/trace/db-trace-wrapper.js +247 -0
  328. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  329. package/dist/src/core/trace/debug-trace.js +417 -0
  330. package/dist/src/core/trace/debug-trace.js.map +7 -0
  331. package/dist/src/core/trace/index.js +109 -0
  332. package/dist/src/core/trace/index.js.map +7 -0
  333. package/dist/src/core/trace/linear-api-wrapper.js +178 -0
  334. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  335. package/dist/src/core/trace/trace-detector.js +528 -0
  336. package/dist/src/core/trace/trace-detector.js.map +7 -0
  337. package/dist/src/core/trace/trace-store.js +345 -0
  338. package/dist/src/core/trace/trace-store.js.map +7 -0
  339. package/dist/src/core/trace/types.js +77 -0
  340. package/dist/src/core/trace/types.js.map +7 -0
  341. package/dist/src/core/types.js +5 -0
  342. package/dist/src/core/types.js.map +7 -0
  343. package/dist/src/core/utils/async-mutex.js +114 -0
  344. package/dist/src/core/utils/async-mutex.js.map +7 -0
  345. package/dist/src/core/utils/compression.js +83 -0
  346. package/dist/src/core/utils/compression.js.map +7 -0
  347. package/dist/src/core/utils/update-checker.js +218 -0
  348. package/dist/src/core/utils/update-checker.js.map +7 -0
  349. package/dist/src/core/worktree/worktree-manager.js +465 -0
  350. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  351. package/dist/src/daemon/daemon-config.js +149 -0
  352. package/dist/src/daemon/daemon-config.js.map +7 -0
  353. package/dist/src/daemon/services/context-service.js +122 -0
  354. package/dist/src/daemon/services/context-service.js.map +7 -0
  355. package/dist/src/daemon/services/linear-service.js +136 -0
  356. package/dist/src/daemon/services/linear-service.js.map +7 -0
  357. package/dist/src/daemon/session-daemon.js +312 -0
  358. package/dist/src/daemon/session-daemon.js.map +7 -0
  359. package/dist/src/daemon/unified-daemon.js +276 -0
  360. package/dist/src/daemon/unified-daemon.js.map +7 -0
  361. package/dist/src/features/analytics/api/analytics-api.js +287 -0
  362. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  363. package/dist/src/features/analytics/core/analytics-service.js +282 -0
  364. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  365. package/dist/src/features/analytics/index.js +18 -0
  366. package/dist/src/features/analytics/index.js.map +7 -0
  367. package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
  368. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  369. package/dist/src/features/analytics/types/metrics.js +5 -0
  370. package/dist/src/features/analytics/types/metrics.js.map +7 -0
  371. package/dist/src/features/browser/browser-mcp.js +492 -0
  372. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  373. package/dist/src/features/sweep/index.js +20 -0
  374. package/dist/src/features/sweep/index.js.map +7 -0
  375. package/dist/src/features/sweep/prediction-client.js +155 -0
  376. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  377. package/dist/src/features/sweep/prompt-builder.js +85 -0
  378. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  379. package/dist/src/features/sweep/pty-wrapper.js +171 -0
  380. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  381. package/dist/src/features/sweep/state-watcher.js +87 -0
  382. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  383. package/dist/src/features/sweep/status-bar.js +88 -0
  384. package/dist/src/features/sweep/status-bar.js.map +7 -0
  385. package/dist/src/features/sweep/sweep-server-manager.js +226 -0
  386. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  387. package/dist/src/features/sweep/tab-interceptor.js +38 -0
  388. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  389. package/dist/src/features/sweep/types.js +18 -0
  390. package/dist/src/features/sweep/types.js.map +7 -0
  391. package/dist/src/features/tasks/linear-task-manager.js +487 -0
  392. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  393. package/dist/src/features/tasks/task-aware-context.js +410 -0
  394. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  395. package/dist/src/features/tui/simple-monitor.js +116 -0
  396. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  397. package/dist/src/features/tui/swarm-monitor.js +648 -0
  398. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  399. package/dist/src/features/web/client/stores/task-store.js +26 -0
  400. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  401. package/dist/src/features/web/server/index.js +194 -0
  402. package/dist/src/features/web/server/index.js.map +7 -0
  403. package/dist/src/hooks/auto-background.js +151 -0
  404. package/dist/src/hooks/auto-background.js.map +7 -0
  405. package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
  406. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  407. package/dist/src/hooks/config.js +150 -0
  408. package/dist/src/hooks/config.js.map +7 -0
  409. package/dist/src/hooks/daemon.js +364 -0
  410. package/dist/src/hooks/daemon.js.map +7 -0
  411. package/dist/src/hooks/events.js +58 -0
  412. package/dist/src/hooks/events.js.map +7 -0
  413. package/dist/src/hooks/index.js +12 -0
  414. package/dist/src/hooks/index.js.map +7 -0
  415. package/dist/src/hooks/linear-task-picker.js +186 -0
  416. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  417. package/dist/src/hooks/schemas.js +197 -0
  418. package/dist/src/hooks/schemas.js.map +7 -0
  419. package/dist/src/hooks/secure-fs.js +49 -0
  420. package/dist/src/hooks/secure-fs.js.map +7 -0
  421. package/dist/src/hooks/security-logger.js +155 -0
  422. package/dist/src/hooks/security-logger.js.map +7 -0
  423. package/dist/src/hooks/session-summary.js +222 -0
  424. package/dist/src/hooks/session-summary.js.map +7 -0
  425. package/dist/src/hooks/sms-action-runner.js +371 -0
  426. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  427. package/dist/src/hooks/sms-notify.js +506 -0
  428. package/dist/src/hooks/sms-notify.js.map +7 -0
  429. package/dist/src/hooks/sms-watcher.js +93 -0
  430. package/dist/src/hooks/sms-watcher.js.map +7 -0
  431. package/dist/src/hooks/sms-webhook.js +555 -0
  432. package/dist/src/hooks/sms-webhook.js.map +7 -0
  433. package/dist/src/hooks/whatsapp-commands.js +479 -0
  434. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  435. package/dist/src/hooks/whatsapp-scheduler.js +317 -0
  436. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  437. package/dist/src/hooks/whatsapp-sync.js +409 -0
  438. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  439. package/dist/src/index.js +25 -0
  440. package/dist/src/index.js.map +7 -0
  441. package/dist/src/integrations/anthropic/client.js +263 -0
  442. package/dist/src/integrations/anthropic/client.js.map +7 -0
  443. package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
  444. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  445. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
  446. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  447. package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
  448. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  449. package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
  450. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  451. package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
  452. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  453. package/dist/src/integrations/claude-code/subagent-client.js +511 -0
  454. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  455. package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
  456. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  457. package/dist/src/integrations/linear/auth.js +337 -0
  458. package/dist/src/integrations/linear/auth.js.map +7 -0
  459. package/dist/src/integrations/linear/auto-sync.js +258 -0
  460. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  461. package/dist/src/integrations/linear/client.js +634 -0
  462. package/dist/src/integrations/linear/client.js.map +7 -0
  463. package/dist/src/integrations/linear/config.js +130 -0
  464. package/dist/src/integrations/linear/config.js.map +7 -0
  465. package/dist/src/integrations/linear/migration.js +361 -0
  466. package/dist/src/integrations/linear/migration.js.map +7 -0
  467. package/dist/src/integrations/linear/oauth-server.js +454 -0
  468. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  469. package/dist/src/integrations/linear/rest-client.js +213 -0
  470. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  471. package/dist/src/integrations/linear/sync-manager.js +236 -0
  472. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  473. package/dist/src/integrations/linear/sync-service.js +231 -0
  474. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  475. package/dist/src/integrations/linear/sync.js +782 -0
  476. package/dist/src/integrations/linear/sync.js.map +7 -0
  477. package/dist/src/integrations/linear/types.js +5 -0
  478. package/dist/src/integrations/linear/types.js.map +7 -0
  479. package/dist/src/integrations/linear/unified-sync.js +589 -0
  480. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  481. package/dist/src/integrations/linear/webhook-handler.js +219 -0
  482. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  483. package/dist/src/integrations/linear/webhook-server.js +218 -0
  484. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  485. package/dist/src/integrations/linear/webhook.js +291 -0
  486. package/dist/src/integrations/linear/webhook.js.map +7 -0
  487. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
  488. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  489. package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
  490. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  491. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
  492. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  493. package/dist/src/integrations/mcp/handlers/index.js +166 -0
  494. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  495. package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
  496. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  497. package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
  498. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  499. package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
  500. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  501. package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
  502. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  503. package/dist/src/integrations/mcp/index.js +23 -0
  504. package/dist/src/integrations/mcp/index.js.map +7 -0
  505. package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
  506. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  507. package/dist/src/integrations/mcp/refactored-server.js +374 -0
  508. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  509. package/dist/src/integrations/mcp/remote-server.js +682 -0
  510. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  511. package/dist/src/integrations/mcp/schemas.js +147 -0
  512. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  513. package/dist/src/integrations/mcp/server.js +1975 -0
  514. package/dist/src/integrations/mcp/server.js.map +7 -0
  515. package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
  516. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  517. package/dist/src/integrations/mcp/tool-definitions.js +702 -0
  518. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  519. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
  520. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  521. package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
  522. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  523. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
  524. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  525. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
  526. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  527. package/dist/src/integrations/ralph/index.js +18 -0
  528. package/dist/src/integrations/ralph/index.js.map +7 -0
  529. package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
  530. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  531. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
  532. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  533. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
  534. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  535. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
  536. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  537. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
  538. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  539. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
  540. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  541. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
  542. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  543. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
  544. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  545. package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
  546. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  547. package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
  548. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  549. package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
  550. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  551. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
  552. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  553. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
  554. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  555. package/dist/src/integrations/ralph/types.js +5 -0
  556. package/dist/src/integrations/ralph/types.js.map +7 -0
  557. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
  558. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  559. package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
  560. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  561. package/dist/src/middleware/exponential-rate-limiter.js +289 -0
  562. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  563. package/dist/src/models/user.model.js +358 -0
  564. package/dist/src/models/user.model.js.map +7 -0
  565. package/dist/src/servers/production/auth-middleware.js +528 -0
  566. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  567. package/dist/src/services/config-service.js +65 -0
  568. package/dist/src/services/config-service.js.map +7 -0
  569. package/dist/src/services/context-service.js +194 -0
  570. package/dist/src/services/context-service.js.map +7 -0
  571. package/dist/src/skills/api-discovery.js +354 -0
  572. package/dist/src/skills/api-discovery.js.map +7 -0
  573. package/dist/src/skills/api-skill.js +475 -0
  574. package/dist/src/skills/api-skill.js.map +7 -0
  575. package/dist/src/skills/claude-skills.js +1061 -0
  576. package/dist/src/skills/claude-skills.js.map +7 -0
  577. package/dist/src/skills/dashboard-launcher.js +216 -0
  578. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  579. package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
  580. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  581. package/dist/src/skills/repo-ingestion-skill.js +609 -0
  582. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  583. package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
  584. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  585. package/dist/src/types/task.js +5 -0
  586. package/dist/src/types/task.js.map +7 -0
  587. package/dist/src/utils/env.js +50 -0
  588. package/dist/src/utils/env.js.map +7 -0
  589. package/dist/src/utils/formatting.js +62 -0
  590. package/dist/src/utils/formatting.js.map +7 -0
  591. package/dist/src/utils/process-cleanup.js +136 -0
  592. package/dist/src/utils/process-cleanup.js.map +7 -0
  593. package/package.json +3 -3
  594. package/scripts/initialize.ts +16 -7
  595. package/scripts/install.sh +14 -62
  596. package/scripts/status.ts +111 -46
@@ -0,0 +1,778 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { logger } from "../monitoring/logger.js";
6
+ import { ValidationError, DatabaseError, ErrorCode } from "../errors/index.js";
7
+ import {
8
+ validateInput,
9
+ InitiateHandoffSchema,
10
+ HandoffApprovalSchema
11
+ } from "./validation.js";
12
+ class FrameHandoffManager {
13
+ dualStackManager;
14
+ activeHandoffs = /* @__PURE__ */ new Map();
15
+ pendingApprovals = /* @__PURE__ */ new Map();
16
+ notifications = /* @__PURE__ */ new Map();
17
+ constructor(dualStackManager) {
18
+ this.dualStackManager = dualStackManager;
19
+ }
20
+ /**
21
+ * Initiate a frame handoff with rich metadata and approval workflow
22
+ */
23
+ async initiateHandoff(targetStackId, frameIds, metadata, targetUserId, message) {
24
+ const input = validateInput(InitiateHandoffSchema, {
25
+ targetStackId,
26
+ frameIds,
27
+ handoffRequest: metadata,
28
+ reviewerId: targetUserId,
29
+ description: message
30
+ });
31
+ try {
32
+ await this.dualStackManager.getPermissionManager().enforcePermission(
33
+ this.dualStackManager.getPermissionManager().createContext(
34
+ input.handoffRequest.initiatorId,
35
+ "handoff",
36
+ "handoff",
37
+ input.targetStackId
38
+ )
39
+ );
40
+ await this.validateFramesForHandoff(input.frameIds);
41
+ const requestId = await this.dualStackManager.initiateHandoff(
42
+ input.targetStackId,
43
+ input.frameIds,
44
+ input.reviewerId,
45
+ input.description
46
+ );
47
+ const progress = {
48
+ requestId,
49
+ status: "pending_review",
50
+ transferredFrames: 0,
51
+ totalFrames: input.frameIds.length,
52
+ currentStep: "Awaiting approval",
53
+ errors: []
54
+ };
55
+ this.activeHandoffs.set(requestId, progress);
56
+ await this.createHandoffNotifications(requestId, metadata, targetUserId);
57
+ await this.scheduleHandoffReminders(requestId, metadata);
58
+ logger.info(`Initiated enhanced handoff: ${requestId}`, {
59
+ frameCount: frameIds.length,
60
+ priority: metadata.businessContext?.priority,
61
+ targetUser: targetUserId
62
+ });
63
+ return requestId;
64
+ } catch (error) {
65
+ throw new DatabaseError(
66
+ "Failed to initiate handoff",
67
+ ErrorCode.OPERATION_FAILED,
68
+ { targetStackId, frameIds },
69
+ error instanceof Error ? error : void 0
70
+ );
71
+ }
72
+ }
73
+ /**
74
+ * Submit approval/rejection for handoff request
75
+ */
76
+ async submitHandoffApproval(requestId, approval) {
77
+ const input = validateInput(HandoffApprovalSchema, {
78
+ ...approval,
79
+ reviewerId: approval.reviewerId
80
+ });
81
+ const progress = this.activeHandoffs.get(requestId);
82
+ if (!progress) {
83
+ throw new ValidationError(
84
+ `Handoff request not found: ${requestId}`,
85
+ ErrorCode.HANDOFF_REQUEST_EXPIRED
86
+ );
87
+ }
88
+ const fullApproval = {
89
+ ...input,
90
+ requestId,
91
+ reviewedAt: /* @__PURE__ */ new Date()
92
+ };
93
+ const existingApprovals = this.pendingApprovals.get(requestId) || [];
94
+ existingApprovals.push(fullApproval);
95
+ this.pendingApprovals.set(requestId, existingApprovals);
96
+ if (input.decision === "approved") {
97
+ progress.status = "approved";
98
+ progress.currentStep = "Ready for transfer";
99
+ await this.executeHandoffTransfer(requestId);
100
+ } else if (input.decision === "rejected") {
101
+ progress.status = "failed";
102
+ progress.currentStep = "Rejected by reviewer";
103
+ progress.errors.push({
104
+ step: "approval",
105
+ error: input.feedback || "Request rejected",
106
+ timestamp: /* @__PURE__ */ new Date()
107
+ });
108
+ } else if (input.decision === "needs_changes") {
109
+ progress.status = "pending_review";
110
+ progress.currentStep = "Changes requested";
111
+ await this.notifyChangesRequested(requestId, approval);
112
+ }
113
+ this.activeHandoffs.set(requestId, progress);
114
+ logger.info(`Handoff approval submitted: ${requestId}`, {
115
+ decision: approval.decision,
116
+ reviewer: approval.reviewerId
117
+ });
118
+ }
119
+ /**
120
+ * Execute the actual frame transfer after approval
121
+ */
122
+ async executeHandoffTransfer(requestId) {
123
+ logger.debug("executeHandoffTransfer called", {
124
+ requestId,
125
+ availableHandoffs: Array.from(this.activeHandoffs.keys())
126
+ });
127
+ const progress = this.activeHandoffs.get(requestId);
128
+ if (!progress) {
129
+ logger.error("Handoff progress not found", {
130
+ requestId,
131
+ availableHandoffs: Array.from(this.activeHandoffs.keys())
132
+ });
133
+ throw new DatabaseError(
134
+ `Handoff progress not found: ${requestId}`,
135
+ ErrorCode.INVALID_STATE
136
+ );
137
+ }
138
+ try {
139
+ logger.debug("Setting progress status to in_transfer", { requestId });
140
+ progress.status = "in_transfer";
141
+ progress.currentStep = "Transferring frames";
142
+ progress.estimatedCompletion = new Date(Date.now() + 5 * 60 * 1e3);
143
+ logger.debug("About to call acceptHandoff", { requestId });
144
+ const result = await this.dualStackManager.acceptHandoff(requestId);
145
+ logger.debug("acceptHandoff returned", {
146
+ requestId,
147
+ success: result.success
148
+ });
149
+ if (result.success) {
150
+ progress.status = "completed";
151
+ progress.currentStep = "Transfer completed";
152
+ progress.transferredFrames = result.mergedFrames.length;
153
+ await this.notifyHandoffCompletion(requestId, result);
154
+ logger.info(`Handoff transfer completed: ${requestId}`, {
155
+ transferredFrames: progress.transferredFrames,
156
+ conflicts: result.conflictFrames.length
157
+ });
158
+ } else {
159
+ progress.status = "failed";
160
+ progress.currentStep = "Transfer failed";
161
+ result.errors.forEach((error) => {
162
+ progress.errors.push({
163
+ step: "transfer",
164
+ error: `Frame ${error.frameId}: ${error.error}`,
165
+ timestamp: /* @__PURE__ */ new Date()
166
+ });
167
+ });
168
+ throw new DatabaseError(
169
+ "Handoff transfer failed",
170
+ ErrorCode.OPERATION_FAILED,
171
+ { errors: result.errors }
172
+ );
173
+ }
174
+ } catch (error) {
175
+ progress.status = "failed";
176
+ progress.currentStep = "Transfer error";
177
+ progress.errors.push({
178
+ step: "transfer",
179
+ error: error instanceof Error ? error.message : String(error),
180
+ timestamp: /* @__PURE__ */ new Date()
181
+ });
182
+ logger.error(`Handoff transfer failed: ${requestId}`, error);
183
+ throw error;
184
+ } finally {
185
+ this.activeHandoffs.set(requestId, progress);
186
+ }
187
+ }
188
+ /**
189
+ * Get handoff progress and status
190
+ */
191
+ async getHandoffProgress(requestId) {
192
+ return this.activeHandoffs.get(requestId) || null;
193
+ }
194
+ /**
195
+ * Cancel a pending handoff request
196
+ */
197
+ async cancelHandoff(requestId, reason) {
198
+ const progress = this.activeHandoffs.get(requestId);
199
+ if (!progress) {
200
+ throw new DatabaseError(
201
+ `Handoff request not found: ${requestId}`,
202
+ ErrorCode.RESOURCE_NOT_FOUND
203
+ );
204
+ }
205
+ if (progress.status === "in_transfer") {
206
+ throw new DatabaseError(
207
+ "Cannot cancel handoff that is currently transferring",
208
+ ErrorCode.INVALID_STATE
209
+ );
210
+ }
211
+ progress.status = "cancelled";
212
+ progress.currentStep = "Cancelled by user";
213
+ progress.errors.push({
214
+ step: "cancellation",
215
+ error: reason,
216
+ timestamp: /* @__PURE__ */ new Date()
217
+ });
218
+ this.activeHandoffs.set(requestId, progress);
219
+ await this.notifyHandoffCancellation(requestId, reason);
220
+ logger.info(`Handoff cancelled: ${requestId}`, { reason });
221
+ }
222
+ /**
223
+ * Get all active handoffs for a user or team
224
+ */
225
+ async getActiveHandoffs(userId, teamId) {
226
+ const handoffs = Array.from(this.activeHandoffs.values());
227
+ if (userId || teamId) {
228
+ return handoffs.filter(
229
+ (handoff) => handoff.status === "pending_review" || handoff.status === "approved" || handoff.status === "in_transfer"
230
+ );
231
+ }
232
+ return handoffs;
233
+ }
234
+ /**
235
+ * Get notifications for a user
236
+ */
237
+ async getUserNotifications(userId) {
238
+ return this.notifications.get(userId) || [];
239
+ }
240
+ /**
241
+ * Mark notification as read
242
+ */
243
+ async markNotificationRead(notificationId, userId) {
244
+ const userNotifications = this.notifications.get(userId) || [];
245
+ const updatedNotifications = userNotifications.filter(
246
+ (n) => n.id !== notificationId
247
+ );
248
+ this.notifications.set(userId, updatedNotifications);
249
+ }
250
+ /**
251
+ * Validate frames are suitable for handoff
252
+ */
253
+ async validateFramesForHandoff(frameIds) {
254
+ const activeStack = this.dualStackManager.getActiveStack();
255
+ for (const frameId of frameIds) {
256
+ const frame = await activeStack.getFrame(frameId);
257
+ if (!frame) {
258
+ throw new DatabaseError(
259
+ `Frame not found: ${frameId}`,
260
+ ErrorCode.RESOURCE_NOT_FOUND
261
+ );
262
+ }
263
+ if (frame.state === "active") {
264
+ logger.warn(`Transferring active frame: ${frameId}`, {
265
+ frameName: frame.name
266
+ });
267
+ }
268
+ }
269
+ }
270
+ /**
271
+ * Create notifications for handoff stakeholders
272
+ */
273
+ async createHandoffNotifications(requestId, metadata, targetUserId) {
274
+ const notifications = [];
275
+ if (targetUserId) {
276
+ notifications.push({
277
+ id: `${requestId}-target`,
278
+ type: "request",
279
+ requestId,
280
+ recipientId: targetUserId,
281
+ title: "Frame Handoff Request",
282
+ message: `${metadata.initiatorId} wants to transfer ${metadata.frameContext.totalFrames} frames to you`,
283
+ actionRequired: true,
284
+ expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1e3),
285
+ createdAt: /* @__PURE__ */ new Date()
286
+ });
287
+ }
288
+ if (metadata.businessContext?.stakeholders) {
289
+ for (const stakeholderId of metadata.businessContext.stakeholders) {
290
+ notifications.push({
291
+ id: `${requestId}-stakeholder-${stakeholderId}`,
292
+ type: "request",
293
+ requestId,
294
+ recipientId: stakeholderId,
295
+ title: "Frame Handoff Notification",
296
+ message: `Frame transfer initiated for ${metadata.businessContext?.milestone || "project milestone"}`,
297
+ actionRequired: false,
298
+ createdAt: /* @__PURE__ */ new Date()
299
+ });
300
+ }
301
+ }
302
+ for (const notification of notifications) {
303
+ const userNotifications = this.notifications.get(notification.recipientId) || [];
304
+ userNotifications.push(notification);
305
+ this.notifications.set(notification.recipientId, userNotifications);
306
+ }
307
+ }
308
+ /**
309
+ * Schedule reminder notifications
310
+ */
311
+ async scheduleHandoffReminders(requestId, metadata) {
312
+ if (metadata.businessContext?.priority === "high" || metadata.businessContext?.priority === "critical") {
313
+ setTimeout(
314
+ async () => {
315
+ const progress = this.activeHandoffs.get(requestId);
316
+ if (progress && progress.status === "pending_review") {
317
+ await this.sendHandoffReminder(requestId, metadata);
318
+ }
319
+ },
320
+ 4 * 60 * 60 * 1e3
321
+ );
322
+ }
323
+ }
324
+ /**
325
+ * Send handoff reminder
326
+ */
327
+ async sendHandoffReminder(requestId, metadata) {
328
+ const progress = this.activeHandoffs.get(requestId);
329
+ if (!progress || progress.status !== "pending_review") {
330
+ return;
331
+ }
332
+ const reminderNotification = {
333
+ id: `${requestId}-reminder-${Date.now()}`,
334
+ type: "reminder",
335
+ requestId,
336
+ recipientId: metadata.targetUserId || "unknown",
337
+ title: "\u23F0 Handoff Request Reminder",
338
+ message: `Reminder: ${metadata.initiatorId} is waiting for approval on ${metadata.frameContext.totalFrames} frames. Priority: ${metadata.businessContext?.priority || "medium"}`,
339
+ actionRequired: true,
340
+ expiresAt: new Date(Date.now() + 12 * 60 * 60 * 1e3),
341
+ // 12 hours
342
+ createdAt: /* @__PURE__ */ new Date()
343
+ };
344
+ if (metadata.targetUserId) {
345
+ const userNotifications = this.notifications.get(metadata.targetUserId) || [];
346
+ userNotifications.push(reminderNotification);
347
+ this.notifications.set(metadata.targetUserId, userNotifications);
348
+ logger.info(`Sent handoff reminder: ${requestId}`, {
349
+ priority: metadata.businessContext?.priority,
350
+ recipient: metadata.targetUserId
351
+ });
352
+ }
353
+ if (metadata.businessContext?.stakeholders) {
354
+ for (const stakeholderId of metadata.businessContext.stakeholders) {
355
+ const stakeholderNotification = {
356
+ ...reminderNotification,
357
+ id: `${requestId}-reminder-stakeholder-${stakeholderId}-${Date.now()}`,
358
+ recipientId: stakeholderId,
359
+ title: "\u{1F4CB} Handoff Status Update",
360
+ message: `Pending handoff approval: ${metadata.businessContext?.milestone || "development work"} requires attention`,
361
+ actionRequired: false
362
+ };
363
+ const stakeholderNotifications = this.notifications.get(stakeholderId) || [];
364
+ stakeholderNotifications.push(stakeholderNotification);
365
+ this.notifications.set(stakeholderId, stakeholderNotifications);
366
+ }
367
+ }
368
+ }
369
+ /**
370
+ * Notify when changes are requested
371
+ */
372
+ async notifyChangesRequested(requestId, approval) {
373
+ const progress = this.activeHandoffs.get(requestId);
374
+ if (!progress) return;
375
+ const changeRequestNotification = {
376
+ id: `${requestId}-changes-${Date.now()}`,
377
+ type: "request",
378
+ requestId,
379
+ recipientId: "requester",
380
+ // TODO: Get actual requester from handoff metadata
381
+ title: "Changes Requested for Handoff",
382
+ message: `${approval.reviewerId} has requested changes: ${approval.feedback || "See detailed suggestions"}`,
383
+ actionRequired: true,
384
+ expiresAt: new Date(Date.now() + 48 * 60 * 60 * 1e3),
385
+ // 48 hours
386
+ createdAt: /* @__PURE__ */ new Date()
387
+ };
388
+ const notifications = this.notifications.get("requester") || [];
389
+ notifications.push(changeRequestNotification);
390
+ this.notifications.set("requester", notifications);
391
+ logger.info(`Changes requested for handoff: ${requestId}`, {
392
+ reviewer: approval.reviewerId,
393
+ feedback: approval.feedback,
394
+ suggestedChangesCount: approval.suggestedChanges?.length || 0
395
+ });
396
+ if (approval.suggestedChanges && approval.suggestedChanges.length > 0) {
397
+ logger.info(`Detailed change suggestions:`, {
398
+ requestId,
399
+ suggestions: approval.suggestedChanges.map((change) => ({
400
+ frameId: change.frameId,
401
+ suggestion: change.suggestion,
402
+ reason: change.reason
403
+ }))
404
+ });
405
+ }
406
+ }
407
+ /**
408
+ * Notify handoff completion
409
+ */
410
+ async notifyHandoffCompletion(requestId, result) {
411
+ const progress = this.activeHandoffs.get(requestId);
412
+ if (!progress) return;
413
+ const completionNotification = {
414
+ id: `${requestId}-completion-${Date.now()}`,
415
+ type: "completion",
416
+ requestId,
417
+ recipientId: "all",
418
+ // Will be distributed to all stakeholders
419
+ title: "Handoff Completed Successfully",
420
+ message: `Frame transfer completed: ${result.mergedFrames.length} frames transferred${result.conflictFrames.length > 0 ? `, ${result.conflictFrames.length} conflicts resolved` : ""}`,
421
+ actionRequired: false,
422
+ createdAt: /* @__PURE__ */ new Date()
423
+ };
424
+ const allUsers = Array.from(this.notifications.keys());
425
+ for (const userId of allUsers) {
426
+ const userSpecificNotification = {
427
+ ...completionNotification,
428
+ id: `${requestId}-completion-${userId}-${Date.now()}`,
429
+ recipientId: userId
430
+ };
431
+ const userNotifications = this.notifications.get(userId) || [];
432
+ userNotifications.push(userSpecificNotification);
433
+ this.notifications.set(userId, userNotifications);
434
+ }
435
+ logger.info(`Handoff completed: ${requestId}`, {
436
+ mergedFrames: result.mergedFrames.length,
437
+ conflicts: result.conflictFrames.length,
438
+ notifiedUsers: allUsers.length
439
+ });
440
+ if (result.conflictFrames.length > 0) {
441
+ logger.info(`Handoff completion details:`, {
442
+ requestId,
443
+ transferredFrames: result.mergedFrames.map(
444
+ (f) => f.frameId || f.id
445
+ ),
446
+ conflictFrames: result.conflictFrames.map(
447
+ (f) => f.frameId || f.id
448
+ )
449
+ });
450
+ }
451
+ }
452
+ /**
453
+ * Notify handoff cancellation
454
+ */
455
+ async notifyHandoffCancellation(requestId, reason) {
456
+ const cancellationNotification = {
457
+ id: `${requestId}-cancellation-${Date.now()}`,
458
+ type: "request",
459
+ // Using 'request' type as it's informational
460
+ requestId,
461
+ recipientId: "all",
462
+ // Will be distributed to all stakeholders
463
+ title: "Handoff Cancelled",
464
+ message: `Handoff request has been cancelled. Reason: ${reason}`,
465
+ actionRequired: false,
466
+ createdAt: /* @__PURE__ */ new Date()
467
+ };
468
+ const allUsers = Array.from(this.notifications.keys());
469
+ for (const userId of allUsers) {
470
+ const userSpecificNotification = {
471
+ ...cancellationNotification,
472
+ id: `${requestId}-cancellation-${userId}-${Date.now()}`,
473
+ recipientId: userId
474
+ };
475
+ const userNotifications = this.notifications.get(userId) || [];
476
+ userNotifications.push(userSpecificNotification);
477
+ this.notifications.set(userId, userNotifications);
478
+ }
479
+ logger.info(`Handoff cancelled: ${requestId}`, {
480
+ reason,
481
+ notifiedUsers: allUsers.length
482
+ });
483
+ }
484
+ /**
485
+ * Get handoff analytics and metrics
486
+ */
487
+ async getHandoffMetrics(timeRange) {
488
+ const handoffs = Array.from(this.activeHandoffs.values());
489
+ const filteredHandoffs = timeRange ? handoffs.filter((h) => {
490
+ return true;
491
+ }) : handoffs;
492
+ const completedHandoffs = filteredHandoffs.filter(
493
+ (h) => h.status === "completed"
494
+ );
495
+ return {
496
+ totalHandoffs: filteredHandoffs.length,
497
+ completedHandoffs: completedHandoffs.length,
498
+ averageProcessingTime: this.calculateAverageProcessingTime(completedHandoffs),
499
+ topFrameTypes: this.analyzeFrameTypes(filteredHandoffs),
500
+ collaborationPatterns: this.analyzeCollaborationPatterns(filteredHandoffs)
501
+ };
502
+ }
503
+ calculateAverageProcessingTime(handoffs) {
504
+ if (handoffs.length === 0) return 0;
505
+ let totalProcessingTime = 0;
506
+ let validHandoffs = 0;
507
+ for (const handoff of handoffs) {
508
+ if (handoff.status === "completed" && handoff.estimatedCompletion) {
509
+ const frameComplexity = handoff.totalFrames * 0.5;
510
+ const errorPenalty = handoff.errors.length * 2;
511
+ const processingTime = Math.max(1, frameComplexity + errorPenalty);
512
+ totalProcessingTime += processingTime;
513
+ validHandoffs++;
514
+ }
515
+ }
516
+ return validHandoffs > 0 ? Math.round(totalProcessingTime / validHandoffs) : 0;
517
+ }
518
+ analyzeFrameTypes(handoffs) {
519
+ const frameTypeCount = /* @__PURE__ */ new Map();
520
+ for (const handoff of handoffs) {
521
+ const estimatedTypes = this.estimateFrameTypes(handoff);
522
+ for (const type of estimatedTypes) {
523
+ frameTypeCount.set(type, (frameTypeCount.get(type) || 0) + 1);
524
+ }
525
+ }
526
+ return Array.from(frameTypeCount.entries()).map(([type, count]) => ({ type, count })).sort((a, b) => b.count - a.count).slice(0, 10);
527
+ }
528
+ estimateFrameTypes(handoff) {
529
+ const types = [];
530
+ if (handoff.totalFrames > 10) {
531
+ types.push("bulk_transfer");
532
+ }
533
+ if (handoff.errors.length > 0) {
534
+ types.push("complex_handoff");
535
+ }
536
+ if (handoff.transferredFrames === handoff.totalFrames) {
537
+ types.push("complete_transfer");
538
+ } else {
539
+ types.push("partial_transfer");
540
+ }
541
+ types.push("development", "collaboration");
542
+ return types;
543
+ }
544
+ analyzeCollaborationPatterns(handoffs) {
545
+ const collaborationCount = /* @__PURE__ */ new Map();
546
+ for (const handoff of handoffs) {
547
+ const pattern = this.extractCollaborationPattern(handoff);
548
+ if (pattern) {
549
+ const key = `${pattern.sourceUser}->${pattern.targetUser}`;
550
+ collaborationCount.set(key, (collaborationCount.get(key) || 0) + 1);
551
+ }
552
+ }
553
+ return Array.from(collaborationCount.entries()).map(([pattern, count]) => {
554
+ const [sourceUser, targetUser] = pattern.split("->");
555
+ return { sourceUser, targetUser, count };
556
+ }).sort((a, b) => b.count - a.count).slice(0, 20);
557
+ }
558
+ extractCollaborationPattern(handoff) {
559
+ if (handoff.status === "completed") {
560
+ return {
561
+ sourceUser: "developer",
562
+ targetUser: "reviewer"
563
+ };
564
+ } else if (handoff.status === "failed") {
565
+ return {
566
+ sourceUser: "developer",
567
+ targetUser: "lead"
568
+ };
569
+ }
570
+ return null;
571
+ }
572
+ /**
573
+ * Real-time collaboration features
574
+ */
575
+ /**
576
+ * Get real-time handoff status updates
577
+ */
578
+ async getHandoffStatusStream(requestId) {
579
+ const progress = this.activeHandoffs.get(requestId);
580
+ if (!progress) {
581
+ throw new DatabaseError(
582
+ `Handoff request not found: ${requestId}`,
583
+ ErrorCode.RESOURCE_NOT_FOUND
584
+ );
585
+ }
586
+ const self = this;
587
+ return {
588
+ async *[Symbol.asyncIterator]() {
589
+ let lastStatus = progress.status;
590
+ while (lastStatus !== "completed" && lastStatus !== "failed" && lastStatus !== "cancelled") {
591
+ const currentProgress = self.activeHandoffs.get(requestId);
592
+ if (currentProgress && currentProgress.status !== lastStatus) {
593
+ lastStatus = currentProgress.status;
594
+ yield currentProgress;
595
+ }
596
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
597
+ }
598
+ }
599
+ };
600
+ }
601
+ /**
602
+ * Update handoff progress in real-time
603
+ */
604
+ async updateHandoffProgress(requestId, update) {
605
+ let progress = this.activeHandoffs.get(requestId);
606
+ if (!progress && update.requestId && update.status && update.totalFrames !== void 0) {
607
+ progress = {
608
+ requestId: update.requestId,
609
+ status: update.status,
610
+ transferredFrames: 0,
611
+ totalFrames: update.totalFrames,
612
+ currentStep: "Initialized",
613
+ errors: [],
614
+ ...update
615
+ };
616
+ } else if (!progress) {
617
+ throw new DatabaseError(
618
+ `Handoff request not found: ${requestId}`,
619
+ ErrorCode.RESOURCE_NOT_FOUND
620
+ );
621
+ } else {
622
+ progress = {
623
+ ...progress,
624
+ ...update
625
+ };
626
+ }
627
+ this.activeHandoffs.set(requestId, progress);
628
+ logger.info(`Handoff progress updated: ${requestId}`, {
629
+ status: progress.status,
630
+ currentStep: progress.currentStep,
631
+ transferredFrames: progress.transferredFrames
632
+ });
633
+ await this.notifyProgressUpdate(requestId, progress);
634
+ }
635
+ /**
636
+ * Notify stakeholders of progress updates
637
+ */
638
+ async notifyProgressUpdate(requestId, progress) {
639
+ const updateNotification = {
640
+ id: `${requestId}-progress-${Date.now()}`,
641
+ type: "request",
642
+ requestId,
643
+ recipientId: "all",
644
+ title: "Handoff Progress Update",
645
+ message: `Status: ${progress.status} | Step: ${progress.currentStep} | Progress: ${progress.transferredFrames}/${progress.totalFrames} frames`,
646
+ actionRequired: false,
647
+ createdAt: /* @__PURE__ */ new Date()
648
+ };
649
+ const allUsers = Array.from(this.notifications.keys());
650
+ for (const userId of allUsers) {
651
+ const userNotifications = this.notifications.get(userId) || [];
652
+ userNotifications.push({
653
+ ...updateNotification,
654
+ id: `${requestId}-progress-${userId}-${Date.now()}`,
655
+ recipientId: userId
656
+ });
657
+ this.notifications.set(userId, userNotifications);
658
+ }
659
+ }
660
+ /**
661
+ * Get active handoffs with real-time filtering
662
+ */
663
+ async getActiveHandoffsRealTime(filters) {
664
+ let handoffs = Array.from(this.activeHandoffs.values());
665
+ if (filters?.status) {
666
+ handoffs = handoffs.filter((h) => h.status === filters.status);
667
+ }
668
+ if (filters?.userId) {
669
+ handoffs = handoffs.filter(
670
+ (h) => h.requestId.includes(filters.userId || "")
671
+ );
672
+ }
673
+ if (filters?.priority) {
674
+ handoffs = handoffs.filter((h) => {
675
+ const estimatedPriority = this.estimateHandoffPriority(h);
676
+ return estimatedPriority === filters.priority;
677
+ });
678
+ }
679
+ return handoffs.sort((a, b) => {
680
+ const statusPriority = {
681
+ in_transfer: 4,
682
+ approved: 3,
683
+ pending_review: 2,
684
+ completed: 1,
685
+ failed: 1,
686
+ cancelled: 0
687
+ };
688
+ return (statusPriority[b.status] || 0) - (statusPriority[a.status] || 0);
689
+ });
690
+ }
691
+ estimateHandoffPriority(handoff) {
692
+ if (handoff.errors.length > 2 || handoff.totalFrames > 50)
693
+ return "critical";
694
+ if (handoff.errors.length > 0 || handoff.totalFrames > 20) return "high";
695
+ if (handoff.totalFrames > 5) return "medium";
696
+ return "low";
697
+ }
698
+ /**
699
+ * Bulk handoff operations for team collaboration
700
+ */
701
+ async bulkHandoffOperation(operation) {
702
+ const results = {
703
+ successful: [],
704
+ failed: []
705
+ };
706
+ for (const requestId of operation.requestIds) {
707
+ try {
708
+ switch (operation.action) {
709
+ case "approve":
710
+ await this.submitHandoffApproval(requestId, {
711
+ reviewerId: operation.reviewerId,
712
+ decision: "approved",
713
+ feedback: operation.feedback
714
+ });
715
+ results.successful.push(requestId);
716
+ break;
717
+ case "reject":
718
+ await this.submitHandoffApproval(requestId, {
719
+ reviewerId: operation.reviewerId,
720
+ decision: "rejected",
721
+ feedback: operation.feedback || "Bulk rejection"
722
+ });
723
+ results.successful.push(requestId);
724
+ break;
725
+ case "cancel":
726
+ await this.cancelHandoff(
727
+ requestId,
728
+ operation.feedback || "Bulk cancellation"
729
+ );
730
+ results.successful.push(requestId);
731
+ break;
732
+ }
733
+ } catch (error) {
734
+ results.failed.push({
735
+ requestId,
736
+ error: error instanceof Error ? error.message : String(error)
737
+ });
738
+ }
739
+ }
740
+ logger.info(`Bulk handoff operation completed`, {
741
+ action: operation.action,
742
+ successful: results.successful.length,
743
+ failed: results.failed.length,
744
+ reviewerId: operation.reviewerId
745
+ });
746
+ return results;
747
+ }
748
+ /**
749
+ * Enhanced notification management with cleanup
750
+ */
751
+ async cleanupExpiredNotifications(userId) {
752
+ let cleanedCount = 0;
753
+ const now = /* @__PURE__ */ new Date();
754
+ const userIds = userId ? [userId] : Array.from(this.notifications.keys());
755
+ for (const uid of userIds) {
756
+ const userNotifications = this.notifications.get(uid) || [];
757
+ const activeNotifications = userNotifications.filter((notification) => {
758
+ if (notification.expiresAt && notification.expiresAt < now) {
759
+ cleanedCount++;
760
+ return false;
761
+ }
762
+ return true;
763
+ });
764
+ this.notifications.set(uid, activeNotifications);
765
+ }
766
+ if (cleanedCount > 0) {
767
+ logger.info(`Cleaned up expired notifications`, {
768
+ count: cleanedCount,
769
+ userId: userId || "all"
770
+ });
771
+ }
772
+ return cleanedCount;
773
+ }
774
+ }
775
+ export {
776
+ FrameHandoffManager
777
+ };
778
+ //# sourceMappingURL=frame-handoff-manager.js.map