@stackmemoryai/stackmemory 0.3.1 → 0.3.5

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 (744) hide show
  1. package/README.md +69 -288
  2. package/dist/cli/commands/chromadb.js +267 -0
  3. package/dist/cli/commands/chromadb.js.map +7 -0
  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/context.js +15 -5
  9. package/dist/cli/commands/context.js.map +2 -2
  10. package/dist/cli/commands/dashboard.js +178 -0
  11. package/dist/cli/commands/dashboard.js.map +7 -0
  12. package/dist/cli/commands/handoff.js +125 -8
  13. package/dist/cli/commands/handoff.js.map +2 -2
  14. package/dist/cli/commands/linear-create.js +132 -0
  15. package/dist/cli/commands/linear-create.js.map +7 -0
  16. package/dist/cli/commands/linear-list.js +69 -0
  17. package/dist/cli/commands/linear-list.js.map +7 -0
  18. package/dist/cli/commands/linear-migrate.js +40 -0
  19. package/dist/cli/commands/linear-migrate.js.map +7 -0
  20. package/dist/cli/commands/linear.js +185 -36
  21. package/dist/cli/commands/linear.js.map +2 -2
  22. package/dist/cli/commands/monitor.js +309 -0
  23. package/dist/cli/commands/monitor.js.map +7 -0
  24. package/dist/cli/commands/quality.js +414 -0
  25. package/dist/cli/commands/quality.js.map +7 -0
  26. package/dist/cli/commands/skills.js +262 -0
  27. package/dist/cli/commands/skills.js.map +7 -0
  28. package/dist/cli/commands/storage.js +275 -0
  29. package/dist/cli/commands/storage.js.map +7 -0
  30. package/dist/cli/commands/tui.js +66 -0
  31. package/dist/cli/commands/tui.js.map +7 -0
  32. package/dist/cli/commands/workflow.js +134 -0
  33. package/dist/cli/commands/workflow.js.map +7 -0
  34. package/dist/cli/index.js +109 -8
  35. package/dist/cli/index.js.map +3 -3
  36. package/dist/core/analytics/team-analytics.js +374 -0
  37. package/dist/core/analytics/team-analytics.js.map +7 -0
  38. package/dist/core/context/context-bridge.js +234 -0
  39. package/dist/core/context/context-bridge.js.map +7 -0
  40. package/dist/core/context/dual-stack-manager.js +850 -0
  41. package/dist/core/context/dual-stack-manager.js.map +7 -0
  42. package/dist/core/context/frame-handoff-manager.js +774 -0
  43. package/dist/core/context/frame-handoff-manager.js.map +7 -0
  44. package/dist/core/context/frame-manager.js +142 -13
  45. package/dist/core/context/frame-manager.js.map +2 -2
  46. package/dist/core/context/permission-manager.js +181 -0
  47. package/dist/core/context/permission-manager.js.map +7 -0
  48. package/dist/core/context/shared-context-layer.js +386 -0
  49. package/dist/core/context/shared-context-layer.js.map +7 -0
  50. package/dist/core/context/stack-merge-resolver.js +600 -0
  51. package/dist/core/context/stack-merge-resolver.js.map +7 -0
  52. package/dist/core/context/validation.js +121 -0
  53. package/dist/core/context/validation.js.map +7 -0
  54. package/dist/core/database/connection-pool.js +266 -175
  55. package/dist/core/database/connection-pool.js.map +2 -2
  56. package/dist/core/database/database-adapter.js +51 -0
  57. package/dist/core/database/database-adapter.js.map +7 -0
  58. package/dist/core/database/migration-manager.js +514 -0
  59. package/dist/core/database/migration-manager.js.map +7 -0
  60. package/dist/core/database/paradedb-adapter.js +970 -0
  61. package/dist/core/database/paradedb-adapter.js.map +7 -0
  62. package/dist/core/database/query-router.js +421 -0
  63. package/dist/core/database/query-router.js.map +7 -0
  64. package/dist/core/database/sqlite-adapter.js +547 -0
  65. package/dist/core/database/sqlite-adapter.js.map +7 -0
  66. package/dist/core/errors/index.js +21 -1
  67. package/dist/core/errors/index.js.map +2 -2
  68. package/dist/core/frame/workflow-templates-stub.js +42 -0
  69. package/dist/core/frame/workflow-templates-stub.js.map +7 -0
  70. package/dist/core/frame/workflow-templates.js +276 -0
  71. package/dist/core/frame/workflow-templates.js.map +7 -0
  72. package/dist/core/merge/conflict-detector.js +5 -2
  73. package/dist/core/merge/conflict-detector.js.map +2 -2
  74. package/dist/core/merge/resolution-engine.js +3 -14
  75. package/dist/core/merge/resolution-engine.js.map +2 -2
  76. package/dist/core/merge/stack-diff.js.map +2 -2
  77. package/dist/core/monitoring/logger.js +18 -3
  78. package/dist/core/monitoring/logger.js.map +2 -2
  79. package/dist/core/monitoring/session-monitor.js +296 -0
  80. package/dist/core/monitoring/session-monitor.js.map +7 -0
  81. package/dist/core/retrieval/context-retriever.js +475 -0
  82. package/dist/core/retrieval/context-retriever.js.map +7 -0
  83. package/dist/core/retrieval/graph-retrieval.js +658 -0
  84. package/dist/core/retrieval/graph-retrieval.js.map +7 -0
  85. package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
  86. package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
  87. package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
  88. package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
  89. package/dist/core/session/clear-survival-stub.js +49 -0
  90. package/dist/core/session/clear-survival-stub.js.map +7 -0
  91. package/dist/core/session/clear-survival.js +426 -0
  92. package/dist/core/session/clear-survival.js.map +7 -0
  93. package/dist/core/session/handoff-generator.js +339 -0
  94. package/dist/core/session/handoff-generator.js.map +7 -0
  95. package/dist/core/session/session-manager.js +61 -26
  96. package/dist/core/session/session-manager.js.map +3 -3
  97. package/dist/core/skills/index.js +3 -0
  98. package/dist/core/skills/index.js.map +7 -0
  99. package/dist/core/skills/skill-storage.js +749 -0
  100. package/dist/core/skills/skill-storage.js.map +7 -0
  101. package/dist/core/skills/types.js +189 -0
  102. package/dist/core/skills/types.js.map +7 -0
  103. package/dist/core/storage/chromadb-adapter.js +346 -0
  104. package/dist/core/storage/chromadb-adapter.js.map +7 -0
  105. package/dist/core/storage/railway-optimized-storage.js +550 -0
  106. package/dist/core/storage/railway-optimized-storage.js.map +7 -0
  107. package/dist/core/storage/remote-storage.js +456 -0
  108. package/dist/core/storage/remote-storage.js.map +7 -0
  109. package/dist/core/trace/trace-detector.js +136 -5
  110. package/dist/core/trace/trace-detector.js.map +2 -2
  111. package/dist/core/trace/trace-store.js.map +2 -2
  112. package/dist/features/tui/components/analytics-panel.js +136 -0
  113. package/dist/features/tui/components/analytics-panel.js.map +7 -0
  114. package/dist/features/tui/components/frame-visualizer.js +377 -0
  115. package/dist/features/tui/components/frame-visualizer.js.map +7 -0
  116. package/dist/features/tui/components/pr-tracker.js +123 -0
  117. package/dist/features/tui/components/pr-tracker.js.map +7 -0
  118. package/dist/features/tui/components/session-monitor.js +286 -0
  119. package/dist/features/tui/components/session-monitor.js.map +7 -0
  120. package/dist/features/tui/components/subagent-fleet.js +388 -0
  121. package/dist/features/tui/components/subagent-fleet.js.map +7 -0
  122. package/dist/features/tui/components/task-board.js +475 -0
  123. package/dist/features/tui/components/task-board.js.map +7 -0
  124. package/dist/features/tui/index.js +397 -0
  125. package/dist/features/tui/index.js.map +7 -0
  126. package/dist/features/tui/services/data-service.js +654 -0
  127. package/dist/features/tui/services/data-service.js.map +7 -0
  128. package/dist/features/tui/services/websocket-client.js +149 -0
  129. package/dist/features/tui/services/websocket-client.js.map +7 -0
  130. package/dist/features/tui/terminal-compat.js +205 -0
  131. package/dist/features/tui/terminal-compat.js.map +7 -0
  132. package/dist/features/tui/types.js +1 -0
  133. package/dist/features/tui/types.js.map +7 -0
  134. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
  135. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  136. package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
  137. package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  138. package/dist/integrations/claude-code/post-task-hooks.js +541 -0
  139. package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
  140. package/dist/integrations/linear/client.js +22 -4
  141. package/dist/integrations/linear/client.js.map +2 -2
  142. package/dist/integrations/linear/migration.js +299 -0
  143. package/dist/integrations/linear/migration.js.map +7 -0
  144. package/dist/integrations/linear/oauth-server.js +396 -0
  145. package/dist/integrations/linear/oauth-server.js.map +7 -0
  146. package/dist/integrations/linear/rest-client.js +199 -0
  147. package/dist/integrations/linear/rest-client.js.map +7 -0
  148. package/dist/integrations/linear/sync.js +14 -2
  149. package/dist/integrations/linear/sync.js.map +2 -2
  150. package/dist/integrations/linear/webhook-handler.js +200 -0
  151. package/dist/integrations/linear/webhook-handler.js.map +7 -0
  152. package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
  153. package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  154. package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
  155. package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  156. package/dist/integrations/mcp/refactored-server.js +31 -3
  157. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  158. package/dist/integrations/mcp/server.js +25 -7
  159. package/dist/integrations/mcp/server.js.map +2 -2
  160. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  161. package/dist/models/user.model.js +3 -0
  162. package/dist/models/user.model.js.map +2 -2
  163. package/dist/services/context-service.js.map +2 -2
  164. package/dist/skills/claude-skills.js +666 -0
  165. package/dist/skills/claude-skills.js.map +7 -0
  166. package/dist/utils/formatting.js +58 -0
  167. package/dist/utils/formatting.js.map +7 -0
  168. package/package.json +30 -24
  169. package/dist/cli/__tests__/index.test.js +0 -290
  170. package/dist/cli/__tests__/index.test.js.map +0 -7
  171. package/dist/core/config/__tests__/config-manager.test.js +0 -248
  172. package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
  173. package/dist/core/context/__tests__/frame-manager.test.js +0 -879
  174. package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
  175. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
  176. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
  177. package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
  178. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
  179. package/dist/core/errors/__tests__/error-handling.test.js +0 -270
  180. package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
  181. package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
  182. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
  183. package/dist/core/query/__tests__/query-parser.test.js +0 -301
  184. package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
  185. package/dist/core/query/__tests__/query-templates.test.js +0 -210
  186. package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
  187. package/dist/core/trace/trace-detector.test.js +0 -401
  188. package/dist/core/trace/trace-detector.test.js.map +0 -7
  189. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
  190. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
  191. package/dist/integrations/linear/__tests__/auth.test.js +0 -558
  192. package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
  193. package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
  194. package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
  195. package/dist/integrations/mcp/__tests__/server.test.js +0 -798
  196. package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
  197. package/dist/scripts/benchmark-performance.d.ts +0 -7
  198. package/dist/scripts/benchmark-performance.d.ts.map +0 -1
  199. package/dist/scripts/benchmark-performance.js +0 -44
  200. package/dist/scripts/benchmark-performance.js.map +0 -1
  201. package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
  202. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
  203. package/dist/scripts/cancel-duplicate-tasks.js +0 -172
  204. package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
  205. package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
  206. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
  207. package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
  208. package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
  209. package/dist/scripts/initialize.d.ts +0 -6
  210. package/dist/scripts/initialize.d.ts.map +0 -1
  211. package/dist/scripts/initialize.js +0 -93
  212. package/dist/scripts/initialize.js.map +0 -1
  213. package/dist/scripts/list-linear-tasks.d.ts +0 -6
  214. package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
  215. package/dist/scripts/list-linear-tasks.js +0 -121
  216. package/dist/scripts/list-linear-tasks.js.map +0 -1
  217. package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
  218. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
  219. package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
  220. package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
  221. package/dist/scripts/show-linear-summary.d.ts +0 -6
  222. package/dist/scripts/show-linear-summary.d.ts.map +0 -1
  223. package/dist/scripts/show-linear-summary.js +0 -120
  224. package/dist/scripts/show-linear-summary.js.map +0 -1
  225. package/dist/scripts/status.d.ts +0 -6
  226. package/dist/scripts/status.d.ts.map +0 -1
  227. package/dist/scripts/status.js +0 -101
  228. package/dist/scripts/status.js.map +0 -1
  229. package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
  230. package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
  231. package/dist/src/agents/core/agent-task-manager.js +0 -504
  232. package/dist/src/agents/core/agent-task-manager.js.map +0 -1
  233. package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
  234. package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
  235. package/dist/src/agents/verifiers/base-verifier.js +0 -130
  236. package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
  237. package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
  238. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
  239. package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
  240. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
  241. package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
  242. package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
  243. package/dist/src/agents/verifiers/llm-judge.js +0 -248
  244. package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
  245. package/dist/src/cli/auto-detect.d.ts +0 -61
  246. package/dist/src/cli/auto-detect.d.ts.map +0 -1
  247. package/dist/src/cli/auto-detect.js +0 -350
  248. package/dist/src/cli/auto-detect.js.map +0 -1
  249. package/dist/src/cli/browser-test.d.ts +0 -6
  250. package/dist/src/cli/browser-test.d.ts.map +0 -1
  251. package/dist/src/cli/browser-test.js +0 -32
  252. package/dist/src/cli/browser-test.js.map +0 -1
  253. package/dist/src/cli/claude-sm.d.ts +0 -7
  254. package/dist/src/cli/claude-sm.d.ts.map +0 -1
  255. package/dist/src/cli/claude-sm.js +0 -412
  256. package/dist/src/cli/claude-sm.js.map +0 -1
  257. package/dist/src/cli/commands/agent.d.ts +0 -9
  258. package/dist/src/cli/commands/agent.d.ts.map +0 -1
  259. package/dist/src/cli/commands/agent.js +0 -303
  260. package/dist/src/cli/commands/agent.js.map +0 -1
  261. package/dist/src/cli/commands/config.d.ts +0 -6
  262. package/dist/src/cli/commands/config.d.ts.map +0 -1
  263. package/dist/src/cli/commands/config.js +0 -224
  264. package/dist/src/cli/commands/config.js.map +0 -1
  265. package/dist/src/cli/commands/context.d.ts +0 -7
  266. package/dist/src/cli/commands/context.d.ts.map +0 -1
  267. package/dist/src/cli/commands/context.js +0 -365
  268. package/dist/src/cli/commands/context.js.map +0 -1
  269. package/dist/src/cli/commands/handoff.d.ts +0 -6
  270. package/dist/src/cli/commands/handoff.d.ts.map +0 -1
  271. package/dist/src/cli/commands/handoff.js +0 -212
  272. package/dist/src/cli/commands/handoff.js.map +0 -1
  273. package/dist/src/cli/commands/linear-test.d.ts +0 -6
  274. package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
  275. package/dist/src/cli/commands/linear-test.js +0 -123
  276. package/dist/src/cli/commands/linear-test.js.map +0 -1
  277. package/dist/src/cli/commands/linear.d.ts +0 -6
  278. package/dist/src/cli/commands/linear.d.ts.map +0 -1
  279. package/dist/src/cli/commands/linear.js +0 -393
  280. package/dist/src/cli/commands/linear.js.map +0 -1
  281. package/dist/src/cli/commands/log.d.ts +0 -7
  282. package/dist/src/cli/commands/log.d.ts.map +0 -1
  283. package/dist/src/cli/commands/log.js +0 -168
  284. package/dist/src/cli/commands/log.js.map +0 -1
  285. package/dist/src/cli/commands/onboard.d.ts +0 -8
  286. package/dist/src/cli/commands/onboard.d.ts.map +0 -1
  287. package/dist/src/cli/commands/onboard.js +0 -363
  288. package/dist/src/cli/commands/onboard.js.map +0 -1
  289. package/dist/src/cli/commands/projects.d.ts +0 -8
  290. package/dist/src/cli/commands/projects.d.ts.map +0 -1
  291. package/dist/src/cli/commands/projects.js +0 -220
  292. package/dist/src/cli/commands/projects.js.map +0 -1
  293. package/dist/src/cli/commands/search.d.ts +0 -7
  294. package/dist/src/cli/commands/search.d.ts.map +0 -1
  295. package/dist/src/cli/commands/search.js +0 -162
  296. package/dist/src/cli/commands/search.js.map +0 -1
  297. package/dist/src/cli/commands/session.d.ts +0 -7
  298. package/dist/src/cli/commands/session.d.ts.map +0 -1
  299. package/dist/src/cli/commands/session.js +0 -222
  300. package/dist/src/cli/commands/session.js.map +0 -1
  301. package/dist/src/cli/commands/tasks.d.ts +0 -7
  302. package/dist/src/cli/commands/tasks.d.ts.map +0 -1
  303. package/dist/src/cli/commands/tasks.js +0 -229
  304. package/dist/src/cli/commands/tasks.js.map +0 -1
  305. package/dist/src/cli/commands/webhook.d.ts +0 -3
  306. package/dist/src/cli/commands/webhook.d.ts.map +0 -1
  307. package/dist/src/cli/commands/webhook.js +0 -157
  308. package/dist/src/cli/commands/webhook.js.map +0 -1
  309. package/dist/src/cli/commands/worktree.d.ts +0 -8
  310. package/dist/src/cli/commands/worktree.d.ts.map +0 -1
  311. package/dist/src/cli/commands/worktree.js +0 -339
  312. package/dist/src/cli/commands/worktree.js.map +0 -1
  313. package/dist/src/cli/index.d.ts +0 -8
  314. package/dist/src/cli/index.d.ts.map +0 -1
  315. package/dist/src/cli/index.js +0 -995
  316. package/dist/src/cli/index.js.map +0 -1
  317. package/dist/src/cli/utils/viewer.d.ts +0 -3
  318. package/dist/src/cli/utils/viewer.d.ts.map +0 -1
  319. package/dist/src/cli/utils/viewer.js +0 -91
  320. package/dist/src/cli/utils/viewer.js.map +0 -1
  321. package/dist/src/core/config/config-manager.d.ts +0 -95
  322. package/dist/src/core/config/config-manager.d.ts.map +0 -1
  323. package/dist/src/core/config/config-manager.js +0 -359
  324. package/dist/src/core/config/config-manager.js.map +0 -1
  325. package/dist/src/core/config/types.d.ts +0 -72
  326. package/dist/src/core/config/types.d.ts.map +0 -1
  327. package/dist/src/core/config/types.js +0 -127
  328. package/dist/src/core/config/types.js.map +0 -1
  329. package/dist/src/core/context/auto-context.d.ts +0 -22
  330. package/dist/src/core/context/auto-context.d.ts.map +0 -1
  331. package/dist/src/core/context/auto-context.js +0 -77
  332. package/dist/src/core/context/auto-context.js.map +0 -1
  333. package/dist/src/core/context/compaction-handler.d.ts +0 -119
  334. package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
  335. package/dist/src/core/context/compaction-handler.js +0 -306
  336. package/dist/src/core/context/compaction-handler.js.map +0 -1
  337. package/dist/src/core/context/frame-database.d.ts +0 -59
  338. package/dist/src/core/context/frame-database.d.ts.map +0 -1
  339. package/dist/src/core/context/frame-database.js +0 -333
  340. package/dist/src/core/context/frame-database.js.map +0 -1
  341. package/dist/src/core/context/frame-digest.d.ts +0 -59
  342. package/dist/src/core/context/frame-digest.d.ts.map +0 -1
  343. package/dist/src/core/context/frame-digest.js +0 -264
  344. package/dist/src/core/context/frame-digest.js.map +0 -1
  345. package/dist/src/core/context/frame-manager.d.ts +0 -112
  346. package/dist/src/core/context/frame-manager.d.ts.map +0 -1
  347. package/dist/src/core/context/frame-manager.js +0 -600
  348. package/dist/src/core/context/frame-manager.js.map +0 -1
  349. package/dist/src/core/context/frame-stack.d.ts +0 -85
  350. package/dist/src/core/context/frame-stack.d.ts.map +0 -1
  351. package/dist/src/core/context/frame-stack.js +0 -287
  352. package/dist/src/core/context/frame-stack.js.map +0 -1
  353. package/dist/src/core/context/frame-types.d.ts +0 -67
  354. package/dist/src/core/context/frame-types.d.ts.map +0 -1
  355. package/dist/src/core/context/frame-types.js +0 -6
  356. package/dist/src/core/context/frame-types.js.map +0 -1
  357. package/dist/src/core/context/index.d.ts +0 -11
  358. package/dist/src/core/context/index.d.ts.map +0 -1
  359. package/dist/src/core/context/index.js +0 -14
  360. package/dist/src/core/context/index.js.map +0 -1
  361. package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
  362. package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
  363. package/dist/src/core/context/model-aware-compaction.js +0 -616
  364. package/dist/src/core/context/model-aware-compaction.js.map +0 -1
  365. package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
  366. package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
  367. package/dist/src/core/context/refactored-frame-manager.js +0 -340
  368. package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
  369. package/dist/src/core/database/batch-operations.d.ts +0 -118
  370. package/dist/src/core/database/batch-operations.d.ts.map +0 -1
  371. package/dist/src/core/database/batch-operations.js +0 -339
  372. package/dist/src/core/database/batch-operations.js.map +0 -1
  373. package/dist/src/core/database/connection-pool.d.ts +0 -79
  374. package/dist/src/core/database/connection-pool.d.ts.map +0 -1
  375. package/dist/src/core/database/connection-pool.js +0 -236
  376. package/dist/src/core/database/connection-pool.js.map +0 -1
  377. package/dist/src/core/database/query-cache.d.ts +0 -135
  378. package/dist/src/core/database/query-cache.d.ts.map +0 -1
  379. package/dist/src/core/database/query-cache.js +0 -294
  380. package/dist/src/core/database/query-cache.js.map +0 -1
  381. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
  382. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
  383. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
  384. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
  385. package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
  386. package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
  387. package/dist/src/core/digest/frame-digest-integration.js +0 -198
  388. package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
  389. package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
  390. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
  391. package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
  392. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
  393. package/dist/src/core/digest/index.d.ts +0 -9
  394. package/dist/src/core/digest/index.d.ts.map +0 -1
  395. package/dist/src/core/digest/index.js +0 -9
  396. package/dist/src/core/digest/index.js.map +0 -1
  397. package/dist/src/core/digest/types.d.ts +0 -154
  398. package/dist/src/core/digest/types.d.ts.map +0 -1
  399. package/dist/src/core/digest/types.js +0 -18
  400. package/dist/src/core/digest/types.js.map +0 -1
  401. package/dist/src/core/errors/index.d.ts +0 -143
  402. package/dist/src/core/errors/index.d.ts.map +0 -1
  403. package/dist/src/core/errors/index.js +0 -282
  404. package/dist/src/core/errors/index.js.map +0 -1
  405. package/dist/src/core/errors/recovery.d.ts +0 -86
  406. package/dist/src/core/errors/recovery.d.ts.map +0 -1
  407. package/dist/src/core/errors/recovery.js +0 -274
  408. package/dist/src/core/errors/recovery.js.map +0 -1
  409. package/dist/src/core/merge/conflict-detector.d.ts +0 -122
  410. package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
  411. package/dist/src/core/merge/conflict-detector.js +0 -468
  412. package/dist/src/core/merge/conflict-detector.js.map +0 -1
  413. package/dist/src/core/merge/index.d.ts +0 -9
  414. package/dist/src/core/merge/index.d.ts.map +0 -1
  415. package/dist/src/core/merge/index.js +0 -9
  416. package/dist/src/core/merge/index.js.map +0 -1
  417. package/dist/src/core/merge/resolution-engine.d.ts +0 -120
  418. package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
  419. package/dist/src/core/merge/resolution-engine.js +0 -573
  420. package/dist/src/core/merge/resolution-engine.js.map +0 -1
  421. package/dist/src/core/merge/stack-diff.d.ts +0 -97
  422. package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
  423. package/dist/src/core/merge/stack-diff.js +0 -516
  424. package/dist/src/core/merge/stack-diff.js.map +0 -1
  425. package/dist/src/core/merge/types.d.ts +0 -110
  426. package/dist/src/core/merge/types.d.ts.map +0 -1
  427. package/dist/src/core/merge/types.js +0 -6
  428. package/dist/src/core/merge/types.js.map +0 -1
  429. package/dist/src/core/monitoring/error-handler.d.ts +0 -46
  430. package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
  431. package/dist/src/core/monitoring/error-handler.js +0 -212
  432. package/dist/src/core/monitoring/error-handler.js.map +0 -1
  433. package/dist/src/core/monitoring/logger.d.ts +0 -24
  434. package/dist/src/core/monitoring/logger.d.ts.map +0 -1
  435. package/dist/src/core/monitoring/logger.js +0 -126
  436. package/dist/src/core/monitoring/logger.js.map +0 -1
  437. package/dist/src/core/monitoring/metrics.d.ts +0 -10
  438. package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
  439. package/dist/src/core/monitoring/metrics.js +0 -152
  440. package/dist/src/core/monitoring/metrics.js.map +0 -1
  441. package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
  442. package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
  443. package/dist/src/core/monitoring/progress-tracker.js +0 -178
  444. package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
  445. package/dist/src/core/performance/context-cache.d.ts +0 -109
  446. package/dist/src/core/performance/context-cache.d.ts.map +0 -1
  447. package/dist/src/core/performance/context-cache.js +0 -280
  448. package/dist/src/core/performance/context-cache.js.map +0 -1
  449. package/dist/src/core/performance/index.d.ts +0 -3
  450. package/dist/src/core/performance/index.d.ts.map +0 -1
  451. package/dist/src/core/performance/index.js +0 -3
  452. package/dist/src/core/performance/index.js.map +0 -1
  453. package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
  454. package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
  455. package/dist/src/core/performance/lazy-context-loader.js +0 -332
  456. package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
  457. package/dist/src/core/performance/monitor.d.ts +0 -48
  458. package/dist/src/core/performance/monitor.d.ts.map +0 -1
  459. package/dist/src/core/performance/monitor.js +0 -226
  460. package/dist/src/core/performance/monitor.js.map +0 -1
  461. package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
  462. package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
  463. package/dist/src/core/performance/optimized-frame-context.js +0 -330
  464. package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
  465. package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
  466. package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
  467. package/dist/src/core/performance/performance-benchmark.js +0 -290
  468. package/dist/src/core/performance/performance-benchmark.js.map +0 -1
  469. package/dist/src/core/performance/performance-profiler.d.ts +0 -151
  470. package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
  471. package/dist/src/core/performance/performance-profiler.js +0 -346
  472. package/dist/src/core/performance/performance-profiler.js.map +0 -1
  473. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
  474. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
  475. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
  476. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
  477. package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
  478. package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
  479. package/dist/src/core/persistence/postgres-adapter.js +0 -330
  480. package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
  481. package/dist/src/core/projects/project-manager.d.ts +0 -130
  482. package/dist/src/core/projects/project-manager.d.ts.map +0 -1
  483. package/dist/src/core/projects/project-manager.js +0 -709
  484. package/dist/src/core/projects/project-manager.js.map +0 -1
  485. package/dist/src/core/query/query-parser.d.ts +0 -109
  486. package/dist/src/core/query/query-parser.d.ts.map +0 -1
  487. package/dist/src/core/query/query-parser.js +0 -415
  488. package/dist/src/core/query/query-parser.js.map +0 -1
  489. package/dist/src/core/query/query-templates.d.ts +0 -44
  490. package/dist/src/core/query/query-templates.d.ts.map +0 -1
  491. package/dist/src/core/query/query-templates.js +0 -326
  492. package/dist/src/core/query/query-templates.js.map +0 -1
  493. package/dist/src/core/retrieval/index.d.ts +0 -8
  494. package/dist/src/core/retrieval/index.d.ts.map +0 -1
  495. package/dist/src/core/retrieval/index.js +0 -8
  496. package/dist/src/core/retrieval/index.js.map +0 -1
  497. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
  498. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
  499. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
  500. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
  501. package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
  502. package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
  503. package/dist/src/core/retrieval/summary-generator.js +0 -622
  504. package/dist/src/core/retrieval/summary-generator.js.map +0 -1
  505. package/dist/src/core/retrieval/types.d.ts +0 -257
  506. package/dist/src/core/retrieval/types.d.ts.map +0 -1
  507. package/dist/src/core/retrieval/types.js +0 -18
  508. package/dist/src/core/retrieval/types.js.map +0 -1
  509. package/dist/src/core/session/index.d.ts +0 -2
  510. package/dist/src/core/session/index.d.ts.map +0 -1
  511. package/dist/src/core/session/index.js +0 -2
  512. package/dist/src/core/session/index.js.map +0 -1
  513. package/dist/src/core/session/session-manager.d.ts +0 -69
  514. package/dist/src/core/session/session-manager.d.ts.map +0 -1
  515. package/dist/src/core/session/session-manager.js +0 -311
  516. package/dist/src/core/session/session-manager.js.map +0 -1
  517. package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
  518. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
  519. package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
  520. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
  521. package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
  522. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
  523. package/dist/src/core/trace/db-trace-wrapper.js +0 -252
  524. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
  525. package/dist/src/core/trace/debug-trace.d.ts +0 -84
  526. package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
  527. package/dist/src/core/trace/debug-trace.js +0 -402
  528. package/dist/src/core/trace/debug-trace.js.map +0 -1
  529. package/dist/src/core/trace/error-test.d.ts +0 -6
  530. package/dist/src/core/trace/error-test.d.ts.map +0 -1
  531. package/dist/src/core/trace/error-test.js +0 -128
  532. package/dist/src/core/trace/error-test.js.map +0 -1
  533. package/dist/src/core/trace/index.d.ts +0 -25
  534. package/dist/src/core/trace/index.d.ts.map +0 -1
  535. package/dist/src/core/trace/index.js +0 -121
  536. package/dist/src/core/trace/index.js.map +0 -1
  537. package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
  538. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
  539. package/dist/src/core/trace/linear-api-wrapper.js +0 -205
  540. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
  541. package/dist/src/core/trace/performance-test.d.ts +0 -6
  542. package/dist/src/core/trace/performance-test.d.ts.map +0 -1
  543. package/dist/src/core/trace/performance-test.js +0 -111
  544. package/dist/src/core/trace/performance-test.js.map +0 -1
  545. package/dist/src/core/trace/trace-demo.d.ts +0 -8
  546. package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
  547. package/dist/src/core/trace/trace-demo.js +0 -154
  548. package/dist/src/core/trace/trace-demo.js.map +0 -1
  549. package/dist/src/core/trace/trace-detector.d.ts +0 -108
  550. package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
  551. package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
  552. package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
  553. package/dist/src/core/trace/trace-detector.demo.js +0 -145
  554. package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
  555. package/dist/src/core/trace/trace-detector.js +0 -425
  556. package/dist/src/core/trace/trace-detector.js.map +0 -1
  557. package/dist/src/core/trace/trace-store.d.ts +0 -60
  558. package/dist/src/core/trace/trace-store.d.ts.map +0 -1
  559. package/dist/src/core/trace/trace-store.js +0 -323
  560. package/dist/src/core/trace/trace-store.js.map +0 -1
  561. package/dist/src/core/trace/types.d.ts +0 -81
  562. package/dist/src/core/trace/types.d.ts.map +0 -1
  563. package/dist/src/core/trace/types.js +0 -70
  564. package/dist/src/core/trace/types.js.map +0 -1
  565. package/dist/src/core/types.d.ts +0 -35
  566. package/dist/src/core/types.d.ts.map +0 -1
  567. package/dist/src/core/types.js +0 -2
  568. package/dist/src/core/types.js.map +0 -1
  569. package/dist/src/core/utils/update-checker.d.ts +0 -38
  570. package/dist/src/core/utils/update-checker.d.ts.map +0 -1
  571. package/dist/src/core/utils/update-checker.js +0 -213
  572. package/dist/src/core/utils/update-checker.js.map +0 -1
  573. package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
  574. package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
  575. package/dist/src/core/worktree/worktree-manager.js +0 -456
  576. package/dist/src/core/worktree/worktree-manager.js.map +0 -1
  577. package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
  578. package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
  579. package/dist/src/features/analytics/api/analytics-api.js +0 -289
  580. package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
  581. package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
  582. package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
  583. package/dist/src/features/analytics/core/analytics-service.js +0 -275
  584. package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
  585. package/dist/src/features/analytics/index.d.ts +0 -12
  586. package/dist/src/features/analytics/index.d.ts.map +0 -1
  587. package/dist/src/features/analytics/index.js +0 -11
  588. package/dist/src/features/analytics/index.js.map +0 -1
  589. package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
  590. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
  591. package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
  592. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
  593. package/dist/src/features/analytics/types/metrics.d.ts +0 -60
  594. package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
  595. package/dist/src/features/analytics/types/metrics.js +0 -2
  596. package/dist/src/features/analytics/types/metrics.js.map +0 -1
  597. package/dist/src/features/browser/browser-mcp.d.ts +0 -94
  598. package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
  599. package/dist/src/features/browser/browser-mcp.js +0 -459
  600. package/dist/src/features/browser/browser-mcp.js.map +0 -1
  601. package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
  602. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
  603. package/dist/src/features/tasks/pebbles-task-store.js +0 -572
  604. package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
  605. package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
  606. package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
  607. package/dist/src/features/tasks/task-aware-context.js +0 -412
  608. package/dist/src/features/tasks/task-aware-context.js.map +0 -1
  609. package/dist/src/index.d.ts +0 -21
  610. package/dist/src/index.d.ts.map +0 -1
  611. package/dist/src/index.js +0 -9
  612. package/dist/src/index.js.map +0 -1
  613. package/dist/src/integrations/linear/auth.d.ts +0 -99
  614. package/dist/src/integrations/linear/auth.d.ts.map +0 -1
  615. package/dist/src/integrations/linear/auth.js +0 -319
  616. package/dist/src/integrations/linear/auth.js.map +0 -1
  617. package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
  618. package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
  619. package/dist/src/integrations/linear/auto-sync.js +0 -268
  620. package/dist/src/integrations/linear/auto-sync.js.map +0 -1
  621. package/dist/src/integrations/linear/client.d.ts +0 -127
  622. package/dist/src/integrations/linear/client.d.ts.map +0 -1
  623. package/dist/src/integrations/linear/client.js +0 -446
  624. package/dist/src/integrations/linear/client.js.map +0 -1
  625. package/dist/src/integrations/linear/config.d.ts +0 -51
  626. package/dist/src/integrations/linear/config.d.ts.map +0 -1
  627. package/dist/src/integrations/linear/config.js +0 -103
  628. package/dist/src/integrations/linear/config.js.map +0 -1
  629. package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
  630. package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
  631. package/dist/src/integrations/linear/sync-manager.js +0 -235
  632. package/dist/src/integrations/linear/sync-manager.js.map +0 -1
  633. package/dist/src/integrations/linear/sync-service.d.ts +0 -46
  634. package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
  635. package/dist/src/integrations/linear/sync-service.js +0 -217
  636. package/dist/src/integrations/linear/sync-service.js.map +0 -1
  637. package/dist/src/integrations/linear/sync.d.ts +0 -125
  638. package/dist/src/integrations/linear/sync.d.ts.map +0 -1
  639. package/dist/src/integrations/linear/sync.js +0 -563
  640. package/dist/src/integrations/linear/sync.js.map +0 -1
  641. package/dist/src/integrations/linear/types.d.ts +0 -90
  642. package/dist/src/integrations/linear/types.d.ts.map +0 -1
  643. package/dist/src/integrations/linear/types.js +0 -2
  644. package/dist/src/integrations/linear/types.js.map +0 -1
  645. package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
  646. package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
  647. package/dist/src/integrations/linear/webhook-server.js +0 -190
  648. package/dist/src/integrations/linear/webhook-server.js.map +0 -1
  649. package/dist/src/integrations/linear/webhook.d.ts +0 -108
  650. package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
  651. package/dist/src/integrations/linear/webhook.js +0 -291
  652. package/dist/src/integrations/linear/webhook.js.map +0 -1
  653. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
  654. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
  655. package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
  656. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
  657. package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
  658. package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
  659. package/dist/src/integrations/mcp/handlers/index.js +0 -134
  660. package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
  661. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
  662. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
  663. package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
  664. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
  665. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
  666. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
  667. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
  668. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
  669. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
  670. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
  671. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
  672. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
  673. package/dist/src/integrations/mcp/index.d.ts +0 -13
  674. package/dist/src/integrations/mcp/index.d.ts.map +0 -1
  675. package/dist/src/integrations/mcp/index.js +0 -17
  676. package/dist/src/integrations/mcp/index.js.map +0 -1
  677. package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
  678. package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
  679. package/dist/src/integrations/mcp/refactored-server.js +0 -351
  680. package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
  681. package/dist/src/integrations/mcp/server.d.ts +0 -54
  682. package/dist/src/integrations/mcp/server.d.ts.map +0 -1
  683. package/dist/src/integrations/mcp/server.js +0 -1616
  684. package/dist/src/integrations/mcp/server.js.map +0 -1
  685. package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
  686. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
  687. package/dist/src/integrations/mcp/tool-definitions.js +0 -563
  688. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
  689. package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
  690. package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
  691. package/dist/src/integrations/mcp/trace-test.js +0 -54
  692. package/dist/src/integrations/mcp/trace-test.js.map +0 -1
  693. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
  694. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
  695. package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
  696. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
  697. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
  698. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
  699. package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
  700. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
  701. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
  702. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
  703. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
  704. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
  705. package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
  706. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
  707. package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
  708. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
  709. package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
  710. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
  711. package/dist/src/middleware/exponential-rate-limiter.js +0 -293
  712. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
  713. package/dist/src/models/user.model.d.ts +0 -62
  714. package/dist/src/models/user.model.d.ts.map +0 -1
  715. package/dist/src/models/user.model.js +0 -311
  716. package/dist/src/models/user.model.js.map +0 -1
  717. package/dist/src/servers/production/auth-middleware.d.ts +0 -76
  718. package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
  719. package/dist/src/servers/production/auth-middleware.js +0 -558
  720. package/dist/src/servers/production/auth-middleware.js.map +0 -1
  721. package/dist/src/servers/railway/index.d.ts +0 -7
  722. package/dist/src/servers/railway/index.d.ts.map +0 -1
  723. package/dist/src/servers/railway/index.js +0 -401
  724. package/dist/src/servers/railway/index.js.map +0 -1
  725. package/dist/src/services/config-service.d.ts +0 -44
  726. package/dist/src/services/config-service.d.ts.map +0 -1
  727. package/dist/src/services/config-service.js +0 -61
  728. package/dist/src/services/config-service.js.map +0 -1
  729. package/dist/src/services/context-service.d.ts +0 -17
  730. package/dist/src/services/context-service.d.ts.map +0 -1
  731. package/dist/src/services/context-service.js +0 -173
  732. package/dist/src/services/context-service.js.map +0 -1
  733. package/dist/src/types/task.d.ts +0 -27
  734. package/dist/src/types/task.d.ts.map +0 -1
  735. package/dist/src/types/task.js +0 -2
  736. package/dist/src/types/task.js.map +0 -1
  737. package/dist/src/utils/logger.d.ts +0 -13
  738. package/dist/src/utils/logger.d.ts.map +0 -1
  739. package/dist/src/utils/logger.js +0 -52
  740. package/dist/src/utils/logger.js.map +0 -1
  741. package/dist/src/validation/schemas.d.ts +0 -633
  742. package/dist/src/validation/schemas.d.ts.map +0 -1
  743. package/dist/src/validation/schemas.js +0 -347
  744. package/dist/src/validation/schemas.js.map +0 -1
@@ -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 const progress = this.activeHandoffs.get(requestId);\n if (!progress || progress.status !== 'pending_review') {\n return;\n }\n\n const reminderNotification: HandoffNotification = {\n id: `${requestId}-reminder-${Date.now()}`,\n type: 'reminder',\n requestId,\n recipientId: metadata.targetUserId || 'unknown',\n title: '\u23F0 Handoff Request Reminder',\n message: `Reminder: ${metadata.initiatorId} is waiting for approval on ${metadata.frameContext.totalFrames} frames. Priority: ${metadata.businessContext?.priority || 'medium'}`,\n actionRequired: true,\n expiresAt: new Date(Date.now() + 12 * 60 * 60 * 1000), // 12 hours\n createdAt: new Date(),\n };\n\n // Store the notification\n if (metadata.targetUserId) {\n const userNotifications =\n this.notifications.get(metadata.targetUserId) || [];\n userNotifications.push(reminderNotification);\n this.notifications.set(metadata.targetUserId, userNotifications);\n\n logger.info(`Sent handoff reminder: ${requestId}`, {\n priority: metadata.businessContext?.priority,\n recipient: metadata.targetUserId,\n });\n }\n\n // Also notify stakeholders\n if (metadata.businessContext?.stakeholders) {\n for (const stakeholderId of metadata.businessContext.stakeholders) {\n const stakeholderNotification: HandoffNotification = {\n ...reminderNotification,\n id: `${requestId}-reminder-stakeholder-${stakeholderId}-${Date.now()}`,\n recipientId: stakeholderId,\n title: '\uD83D\uDCCB Handoff Status Update',\n message: `Pending handoff approval: ${metadata.businessContext?.milestone || 'development work'} requires attention`,\n actionRequired: false,\n };\n\n const stakeholderNotifications =\n this.notifications.get(stakeholderId) || [];\n stakeholderNotifications.push(stakeholderNotification);\n this.notifications.set(stakeholderId, stakeholderNotifications);\n }\n }\n }\n\n /**\n * Notify when changes are requested\n */\n private async notifyChangesRequested(\n requestId: string,\n approval: Omit<HandoffApproval, 'requestId' | 'reviewedAt'>\n ): Promise<void> {\n const progress = this.activeHandoffs.get(requestId);\n if (!progress) return;\n\n // Find the original requester (we'll need to enhance this with better metadata tracking)\n const changeRequestNotification: HandoffNotification = {\n id: `${requestId}-changes-${Date.now()}`,\n type: 'request',\n requestId,\n recipientId: 'requester', // TODO: Get actual requester from handoff metadata\n title: '\uD83D\uDD04 Changes Requested for Handoff',\n message: `${approval.reviewerId} has requested changes: ${approval.feedback || 'See detailed suggestions'}`,\n actionRequired: true,\n expiresAt: new Date(Date.now() + 48 * 60 * 60 * 1000), // 48 hours\n createdAt: new Date(),\n };\n\n // Store notification (for now using a placeholder recipient)\n const notifications = this.notifications.get('requester') || [];\n notifications.push(changeRequestNotification);\n this.notifications.set('requester', notifications);\n\n // Log detailed feedback and suggestions\n logger.info(`Changes requested for handoff: ${requestId}`, {\n reviewer: approval.reviewerId,\n feedback: approval.feedback,\n suggestedChangesCount: approval.suggestedChanges?.length || 0,\n });\n\n if (approval.suggestedChanges && approval.suggestedChanges.length > 0) {\n logger.info(`Detailed change suggestions:`, {\n requestId,\n suggestions: approval.suggestedChanges.map((change) => ({\n frameId: change.frameId,\n suggestion: change.suggestion,\n reason: change.reason,\n })),\n });\n }\n }\n\n /**\n * Notify handoff completion\n */\n private async notifyHandoffCompletion(\n requestId: string,\n result: any\n ): Promise<void> {\n const progress = this.activeHandoffs.get(requestId);\n if (!progress) return;\n\n // Create completion notification\n const completionNotification: HandoffNotification = {\n id: `${requestId}-completion-${Date.now()}`,\n type: 'completion',\n requestId,\n recipientId: 'all', // Will be distributed to all stakeholders\n title: '\u2705 Handoff Completed Successfully',\n message: `Frame transfer completed: ${result.mergedFrames.length} frames transferred${result.conflictFrames.length > 0 ? `, ${result.conflictFrames.length} conflicts resolved` : ''}`,\n actionRequired: false,\n createdAt: new Date(),\n };\n\n // Notify all stakeholders from the notifications map\n const allUsers = Array.from(this.notifications.keys());\n for (const userId of allUsers) {\n const userSpecificNotification: HandoffNotification = {\n ...completionNotification,\n id: `${requestId}-completion-${userId}-${Date.now()}`,\n recipientId: userId,\n };\n\n const userNotifications = this.notifications.get(userId) || [];\n userNotifications.push(userSpecificNotification);\n this.notifications.set(userId, userNotifications);\n }\n\n logger.info(`Handoff completed: ${requestId}`, {\n mergedFrames: result.mergedFrames.length,\n conflicts: result.conflictFrames.length,\n notifiedUsers: allUsers.length,\n });\n\n // Log detailed completion statistics\n if (result.conflictFrames.length > 0) {\n logger.info(`Handoff completion details:`, {\n requestId,\n transferredFrames: result.mergedFrames.map(\n (f: any) => f.frameId || f.id\n ),\n conflictFrames: result.conflictFrames.map(\n (f: any) => f.frameId || f.id\n ),\n });\n }\n }\n\n /**\n * Notify handoff cancellation\n */\n private async notifyHandoffCancellation(\n requestId: string,\n reason: string\n ): Promise<void> {\n // Create cancellation notification\n const cancellationNotification: HandoffNotification = {\n id: `${requestId}-cancellation-${Date.now()}`,\n type: 'request', // Using 'request' type as it's informational\n requestId,\n recipientId: 'all', // Will be distributed to all stakeholders\n title: '\u274C Handoff Cancelled',\n message: `Handoff request has been cancelled. Reason: ${reason}`,\n actionRequired: false,\n createdAt: new Date(),\n };\n\n // Notify all users who have been involved in this handoff\n const allUsers = Array.from(this.notifications.keys());\n for (const userId of allUsers) {\n const userSpecificNotification: HandoffNotification = {\n ...cancellationNotification,\n id: `${requestId}-cancellation-${userId}-${Date.now()}`,\n recipientId: userId,\n };\n\n const userNotifications = this.notifications.get(userId) || [];\n userNotifications.push(userSpecificNotification);\n this.notifications.set(userId, userNotifications);\n }\n\n logger.info(`Handoff cancelled: ${requestId}`, {\n reason,\n notifiedUsers: allUsers.length,\n });\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 if (handoffs.length === 0) return 0;\n\n let totalProcessingTime = 0;\n let validHandoffs = 0;\n\n for (const handoff of handoffs) {\n // Only calculate for completed handoffs that have timing data\n if (handoff.status === 'completed' && handoff.estimatedCompletion) {\n // Estimate processing time based on frame count and complexity\n // This is a simplified calculation - in practice you'd track actual timestamps\n const frameComplexity = handoff.totalFrames * 0.5; // Base time per frame\n const errorPenalty = handoff.errors.length * 2; // Extra time for errors\n const processingTime = Math.max(1, frameComplexity + errorPenalty);\n\n totalProcessingTime += processingTime;\n validHandoffs++;\n }\n }\n\n return validHandoffs > 0\n ? Math.round(totalProcessingTime / validHandoffs)\n : 0;\n }\n\n private analyzeFrameTypes(\n handoffs: HandoffProgress[]\n ): Array<{ type: string; count: number }> {\n const frameTypeCount = new Map<string, number>();\n\n for (const handoff of handoffs) {\n // Extract frame type information from handoff metadata\n // This would need to be enhanced with actual frame type tracking\n const estimatedTypes = this.estimateFrameTypes(handoff);\n\n for (const type of estimatedTypes) {\n frameTypeCount.set(type, (frameTypeCount.get(type) || 0) + 1);\n }\n }\n\n return Array.from(frameTypeCount.entries())\n .map(([type, count]) => ({ type, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10); // Top 10 frame types\n }\n\n private estimateFrameTypes(handoff: HandoffProgress): string[] {\n // Simplified frame type estimation based on handoff characteristics\n const types: string[] = [];\n\n if (handoff.totalFrames > 10) {\n types.push('bulk_transfer');\n }\n if (handoff.errors.length > 0) {\n types.push('complex_handoff');\n }\n if (handoff.transferredFrames === handoff.totalFrames) {\n types.push('complete_transfer');\n } else {\n types.push('partial_transfer');\n }\n\n // Add some common frame types based on patterns\n types.push('development', 'collaboration');\n\n return types;\n }\n\n private analyzeCollaborationPatterns(\n handoffs: HandoffProgress[]\n ): Array<{ sourceUser: string; targetUser: string; count: number }> {\n const collaborationCount = new Map<string, number>();\n\n for (const handoff of handoffs) {\n // Extract collaboration pattern from handoff data\n // Note: This is simplified - we'd need to track actual source/target users\n const pattern = this.extractCollaborationPattern(handoff);\n if (pattern) {\n const key = `${pattern.sourceUser}->${pattern.targetUser}`;\n collaborationCount.set(key, (collaborationCount.get(key) || 0) + 1);\n }\n }\n\n return Array.from(collaborationCount.entries())\n .map(([pattern, count]) => {\n const [sourceUser, targetUser] = pattern.split('->');\n return { sourceUser, targetUser, count };\n })\n .sort((a, b) => b.count - a.count)\n .slice(0, 20); // Top 20 collaboration patterns\n }\n\n private extractCollaborationPattern(\n handoff: HandoffProgress\n ): { sourceUser: string; targetUser: string } | null {\n // Simplified pattern extraction - in practice this would come from handoff metadata\n // For now, we'll create sample patterns based on handoff characteristics\n\n if (handoff.status === 'completed') {\n return {\n sourceUser: 'developer',\n targetUser: 'reviewer',\n };\n } else if (handoff.status === 'failed') {\n return {\n sourceUser: 'developer',\n targetUser: 'lead',\n };\n }\n\n return null;\n }\n\n /**\n * Real-time collaboration features\n */\n\n /**\n * Get real-time handoff status updates\n */\n async getHandoffStatusStream(\n requestId: string\n ): Promise<AsyncIterableIterator<HandoffProgress>> {\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 // Simple implementation - in a real system this would use WebSockets or Server-Sent Events\n const self = this;\n return {\n async *[Symbol.asyncIterator]() {\n let lastStatus = progress.status;\n while (\n lastStatus !== 'completed' &&\n lastStatus !== 'failed' &&\n lastStatus !== 'cancelled'\n ) {\n const currentProgress = self.activeHandoffs.get(requestId);\n if (currentProgress && currentProgress.status !== lastStatus) {\n lastStatus = currentProgress.status;\n yield currentProgress;\n }\n // Simulate real-time polling\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n },\n };\n }\n\n /**\n * Update handoff progress in real-time\n */\n async updateHandoffProgress(\n requestId: string,\n update: Partial<HandoffProgress>\n ): Promise<void> {\n let progress = this.activeHandoffs.get(requestId);\n\n // If progress doesn't exist and update includes required fields, create it\n if (\n !progress &&\n update.requestId &&\n update.status &&\n update.totalFrames !== undefined\n ) {\n progress = {\n requestId: update.requestId,\n status: update.status,\n transferredFrames: 0,\n totalFrames: update.totalFrames,\n currentStep: 'Initialized',\n errors: [],\n ...update,\n };\n } else if (!progress) {\n throw new DatabaseError(\n `Handoff request not found: ${requestId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n } else {\n // Update existing progress with provided fields\n progress = {\n ...progress,\n ...update,\n };\n }\n\n this.activeHandoffs.set(requestId, progress);\n\n logger.info(`Handoff progress updated: ${requestId}`, {\n status: progress.status,\n currentStep: progress.currentStep,\n transferredFrames: progress.transferredFrames,\n });\n\n // Notify stakeholders of progress update\n await this.notifyProgressUpdate(requestId, progress);\n }\n\n /**\n * Notify stakeholders of progress updates\n */\n private async notifyProgressUpdate(\n requestId: string,\n progress: HandoffProgress\n ): Promise<void> {\n const updateNotification: HandoffNotification = {\n id: `${requestId}-progress-${Date.now()}`,\n type: 'request',\n requestId,\n recipientId: 'all',\n title: '\uD83D\uDCCA Handoff Progress Update',\n message: `Status: ${progress.status} | Step: ${progress.currentStep} | Progress: ${progress.transferredFrames}/${progress.totalFrames} frames`,\n actionRequired: false,\n createdAt: new Date(),\n };\n\n // Distribute to all stakeholders\n const allUsers = Array.from(this.notifications.keys());\n for (const userId of allUsers) {\n const userNotifications = this.notifications.get(userId) || [];\n userNotifications.push({\n ...updateNotification,\n id: `${requestId}-progress-${userId}-${Date.now()}`,\n recipientId: userId,\n });\n this.notifications.set(userId, userNotifications);\n }\n }\n\n /**\n * Get active handoffs with real-time filtering\n */\n async getActiveHandoffsRealTime(filters?: {\n status?: HandoffProgress['status'];\n userId?: string;\n priority?: 'low' | 'medium' | 'high' | 'critical';\n }): Promise<HandoffProgress[]> {\n let handoffs = Array.from(this.activeHandoffs.values());\n\n if (filters?.status) {\n handoffs = handoffs.filter((h) => h.status === filters.status);\n }\n\n if (filters?.userId) {\n // In a real implementation, we'd have proper user tracking in handoff metadata\n // For now, filter based on requestId pattern or other heuristics\n handoffs = handoffs.filter((h) =>\n h.requestId.includes(filters.userId || '')\n );\n }\n\n if (filters?.priority) {\n // Filter by priority (this would need priority tracking in HandoffProgress)\n // For now, estimate priority based on frame count and errors\n handoffs = handoffs.filter((h) => {\n const estimatedPriority = this.estimateHandoffPriority(h);\n return estimatedPriority === filters.priority;\n });\n }\n\n return handoffs.sort((a, b) => {\n // Sort by status priority, then by creation time\n const statusPriority = {\n in_transfer: 4,\n approved: 3,\n pending_review: 2,\n completed: 1,\n failed: 1,\n cancelled: 0,\n };\n return (statusPriority[b.status] || 0) - (statusPriority[a.status] || 0);\n });\n }\n\n private estimateHandoffPriority(\n handoff: HandoffProgress\n ): 'low' | 'medium' | 'high' | 'critical' {\n if (handoff.errors.length > 2 || handoff.totalFrames > 50)\n return 'critical';\n if (handoff.errors.length > 0 || handoff.totalFrames > 20) return 'high';\n if (handoff.totalFrames > 5) return 'medium';\n return 'low';\n }\n\n /**\n * Bulk handoff operations for team collaboration\n */\n async bulkHandoffOperation(operation: {\n action: 'approve' | 'reject' | 'cancel';\n requestIds: string[];\n reviewerId: string;\n feedback?: string;\n }): Promise<{\n successful: string[];\n failed: Array<{ requestId: string; error: string }>;\n }> {\n const results = {\n successful: [],\n failed: [] as Array<{ requestId: string; error: string }>,\n };\n\n for (const requestId of operation.requestIds) {\n try {\n switch (operation.action) {\n case 'approve':\n await this.submitHandoffApproval(requestId, {\n reviewerId: operation.reviewerId,\n decision: 'approved',\n feedback: operation.feedback,\n });\n results.successful.push(requestId);\n break;\n\n case 'reject':\n await this.submitHandoffApproval(requestId, {\n reviewerId: operation.reviewerId,\n decision: 'rejected',\n feedback: operation.feedback || 'Bulk rejection',\n });\n results.successful.push(requestId);\n break;\n\n case 'cancel':\n await this.cancelHandoff(\n requestId,\n operation.feedback || 'Bulk cancellation'\n );\n results.successful.push(requestId);\n break;\n }\n } catch (error) {\n results.failed.push({\n requestId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n logger.info(`Bulk handoff operation completed`, {\n action: operation.action,\n successful: results.successful.length,\n failed: results.failed.length,\n reviewerId: operation.reviewerId,\n });\n\n return results;\n }\n\n /**\n * Enhanced notification management with cleanup\n */\n async cleanupExpiredNotifications(userId?: string): Promise<number> {\n let cleanedCount = 0;\n const now = new Date();\n\n const userIds = userId ? [userId] : Array.from(this.notifications.keys());\n\n for (const uid of userIds) {\n const userNotifications = this.notifications.get(uid) || [];\n const activeNotifications = userNotifications.filter((notification) => {\n if (notification.expiresAt && notification.expiresAt < now) {\n cleanedCount++;\n return false;\n }\n return true;\n });\n\n this.notifications.set(uid, activeNotifications);\n }\n\n if (cleanedCount > 0) {\n logger.info(`Cleaned up expired notifications`, {\n count: cleanedCount,\n userId: userId || 'all',\n });\n }\n\n return cleanedCount;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,5 @@
1
1
  import { v4 as uuidv4 } from "uuid";
2
2
  import { logger } from "../monitoring/logger.js";
3
- import { trace } from "../trace/index.js";
4
3
  import {
5
4
  DatabaseError,
6
5
  FrameError,
@@ -8,6 +7,7 @@ import {
8
7
  createErrorHandler
9
8
  } from "../errors/index.js";
10
9
  import { sessionManager, FrameQueryMode } from "../session/index.js";
10
+ import { contextBridge } from "./context-bridge.js";
11
11
  class FrameManager {
12
12
  db;
13
13
  currentRunId;
@@ -16,9 +16,17 @@ class FrameManager {
16
16
  activeStack = [];
17
17
  // Stack of active frame IDs
18
18
  queryMode = FrameQueryMode.PROJECT_ACTIVE;
19
- constructor(db, projectId, runId) {
19
+ constructor(db, projectId, runIdOrOptions) {
20
20
  this.db = db;
21
21
  this.projectId = projectId;
22
+ let runId;
23
+ let skipContextBridge = false;
24
+ if (typeof runIdOrOptions === "string") {
25
+ runId = runIdOrOptions;
26
+ } else if (runIdOrOptions) {
27
+ runId = runIdOrOptions.runId;
28
+ skipContextBridge = runIdOrOptions.skipContextBridge || false;
29
+ }
22
30
  const session = sessionManager.getCurrentSession();
23
31
  if (session) {
24
32
  this.currentRunId = session.runId;
@@ -29,6 +37,19 @@ class FrameManager {
29
37
  }
30
38
  this.initializeSchema();
31
39
  this.loadActiveStack();
40
+ const shouldInitializeBridge = !skipContextBridge && process.env.NODE_ENV !== "test" && !process.env.VITEST && !process.env.STACKMEMORY_CLI;
41
+ if (shouldInitializeBridge) {
42
+ contextBridge.initialize(this, {
43
+ autoSync: true,
44
+ syncInterval: 6e4,
45
+ // 1 minute
46
+ minFrameScore: 0.5,
47
+ // Sync frames above 0.5 score
48
+ importantTags: ["decision", "error", "milestone", "learning"]
49
+ }).catch((error) => {
50
+ logger.warn("Failed to initialize context bridge", { error });
51
+ });
52
+ }
32
53
  }
33
54
  setQueryMode(mode) {
34
55
  this.queryMode = mode;
@@ -82,12 +103,26 @@ class FrameManager {
82
103
  FOREIGN KEY(frame_id) REFERENCES frames(frame_id)
83
104
  );
84
105
 
106
+ CREATE TABLE IF NOT EXISTS handoff_requests (
107
+ request_id TEXT PRIMARY KEY,
108
+ source_stack_id TEXT NOT NULL,
109
+ target_stack_id TEXT NOT NULL,
110
+ frame_ids TEXT NOT NULL,
111
+ status TEXT NOT NULL DEFAULT 'pending',
112
+ created_at INTEGER DEFAULT (unixepoch()),
113
+ expires_at INTEGER,
114
+ target_user_id TEXT,
115
+ message TEXT
116
+ );
117
+
85
118
  CREATE INDEX IF NOT EXISTS idx_frames_run ON frames(run_id);
86
119
  CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);
87
120
  CREATE INDEX IF NOT EXISTS idx_frames_state ON frames(state);
88
121
  CREATE INDEX IF NOT EXISTS idx_events_frame ON events(frame_id);
89
122
  CREATE INDEX IF NOT EXISTS idx_events_seq ON events(frame_id, seq);
90
123
  CREATE INDEX IF NOT EXISTS idx_anchors_frame ON anchors(frame_id);
124
+ CREATE INDEX IF NOT EXISTS idx_handoff_requests_status ON handoff_requests(status);
125
+ CREATE INDEX IF NOT EXISTS idx_handoff_requests_target ON handoff_requests(target_stack_id);
91
126
  `);
92
127
  } catch (error) {
93
128
  const dbError = errorHandler(error, {
@@ -206,7 +241,7 @@ class FrameManager {
206
241
  * Create a new frame and push to stack
207
242
  */
208
243
  createFrame(options) {
209
- return trace.traceSync("function", "FrameManager.createFrame", options, () => this._createFrame(options));
244
+ return this._createFrame(options);
210
245
  }
211
246
  _createFrame(options) {
212
247
  const frameId = uuidv4();
@@ -273,7 +308,7 @@ class FrameManager {
273
308
  * Close the current frame and generate digest
274
309
  */
275
310
  closeFrame(frameId, outputs) {
276
- trace.traceSync("function", "FrameManager.closeFrame", { frameId, outputs }, () => this._closeFrame(frameId, outputs));
311
+ this._closeFrame(frameId, outputs);
277
312
  }
278
313
  _closeFrame(frameId, outputs) {
279
314
  const targetFrameId = frameId || this.getCurrentFrameId();
@@ -347,6 +382,21 @@ class FrameManager {
347
382
  stackDepth: this.activeStack.length
348
383
  });
349
384
  }
385
+ /**
386
+ * Delete a frame completely from the database (used in handoffs)
387
+ */
388
+ deleteFrame(frameId) {
389
+ try {
390
+ this.db.prepare("DELETE FROM events WHERE frame_id = ?").run(frameId);
391
+ this.db.prepare("DELETE FROM anchors WHERE frame_id = ?").run(frameId);
392
+ this.activeStack = this.activeStack.filter((id) => id !== frameId);
393
+ this.db.prepare("DELETE FROM frames WHERE frame_id = ?").run(frameId);
394
+ logger.debug("Deleted frame completely", { frameId });
395
+ } catch (error) {
396
+ logger.error("Failed to delete frame", { frameId, error });
397
+ throw error;
398
+ }
399
+ }
350
400
  closeChildFrames(parentFrameId) {
351
401
  try {
352
402
  const children = this.db.prepare(
@@ -573,6 +623,88 @@ Activity: ${eventCount} events, ${structured.tool_calls_count} tool calls`;
573
623
  getStackDepth() {
574
624
  return this.activeStack.length;
575
625
  }
626
+ /**
627
+ * Get recent frames for context sharing
628
+ */
629
+ async getRecentFrames(limit = 100) {
630
+ try {
631
+ const rows = this.db.prepare(
632
+ `
633
+ SELECT * FROM frames
634
+ WHERE project_id = ?
635
+ ORDER BY created_at DESC
636
+ LIMIT ?
637
+ `
638
+ ).all(this.projectId, limit);
639
+ return rows.map((row) => ({
640
+ ...row,
641
+ frameId: row.frame_id,
642
+ runId: row.run_id,
643
+ projectId: row.project_id,
644
+ parentFrameId: row.parent_frame_id,
645
+ title: row.name,
646
+ timestamp: row.created_at,
647
+ metadata: {
648
+ tags: this.extractTagsFromFrame(row),
649
+ importance: this.calculateFrameImportance(row)
650
+ },
651
+ data: {
652
+ inputs: JSON.parse(row.inputs || "{}"),
653
+ outputs: JSON.parse(row.outputs || "{}"),
654
+ digest: JSON.parse(row.digest_json || "{}")
655
+ },
656
+ inputs: JSON.parse(row.inputs || "{}"),
657
+ outputs: JSON.parse(row.outputs || "{}"),
658
+ digest_json: JSON.parse(row.digest_json || "{}")
659
+ }));
660
+ } catch (error) {
661
+ logger.error("Failed to get recent frames", error);
662
+ return [];
663
+ }
664
+ }
665
+ /**
666
+ * Add context metadata to the current frame
667
+ */
668
+ async addContext(key, value) {
669
+ const currentFrameId = this.getCurrentFrameId();
670
+ if (!currentFrameId) return;
671
+ try {
672
+ const frame = this.getFrame(currentFrameId);
673
+ if (!frame) return;
674
+ const metadata = frame.outputs || {};
675
+ metadata[key] = value;
676
+ this.db.prepare(`UPDATE frames SET outputs = ? WHERE frame_id = ?`).run(JSON.stringify(metadata), currentFrameId);
677
+ } catch (error) {
678
+ logger.warn("Failed to add context to frame", { error, key });
679
+ }
680
+ }
681
+ extractTagsFromFrame(frame) {
682
+ const tags = [];
683
+ if (frame.type) tags.push(frame.type);
684
+ if (frame.name) {
685
+ if (frame.name.toLowerCase().includes("error")) tags.push("error");
686
+ if (frame.name.toLowerCase().includes("fix")) tags.push("resolution");
687
+ if (frame.name.toLowerCase().includes("decision")) tags.push("decision");
688
+ if (frame.name.toLowerCase().includes("milestone"))
689
+ tags.push("milestone");
690
+ }
691
+ try {
692
+ const digest = JSON.parse(frame.digest_json || "{}");
693
+ if (digest.tags) tags.push(...digest.tags);
694
+ } catch {
695
+ }
696
+ return [...new Set(tags)];
697
+ }
698
+ calculateFrameImportance(frame) {
699
+ if (frame.type === "milestone" || frame.name?.includes("decision"))
700
+ return "high";
701
+ if (frame.type === "error" || frame.type === "resolution") return "medium";
702
+ if (frame.closed_at && frame.created_at) {
703
+ const duration = frame.closed_at - frame.created_at;
704
+ if (duration > 300) return "medium";
705
+ }
706
+ return "low";
707
+ }
576
708
  getFrameDepth(frameId) {
577
709
  const frame = this.getFrame(frameId);
578
710
  return frame?.depth || 0;
@@ -592,15 +724,12 @@ Activity: ${eventCount} events, ${structured.tool_calls_count} tool calls`;
592
724
  digest_json: JSON.parse(row.digest_json || "{}")
593
725
  };
594
726
  } catch (error) {
595
- throw new DatabaseError(
596
- `Failed to get frame: ${frameId}`,
597
- ErrorCode.DB_QUERY_FAILED,
598
- {
599
- frameId,
600
- operation: "getFrame"
601
- },
602
- error instanceof Error ? error : void 0
603
- );
727
+ logger.warn(`Failed to get frame: ${frameId}`, {
728
+ error: error instanceof Error ? error.message : String(error),
729
+ frameId,
730
+ operation: "getFrame"
731
+ });
732
+ return void 0;
604
733
  }
605
734
  }
606
735
  getFrameEvents(frameId, limit) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/context/frame-manager.ts"],
4
- "sourcesContent": ["/**\n * StackMemory Frame Manager - Call Stack Implementation\n * Manages nested frames representing the call stack of work\n */\n\nimport Database from 'better-sqlite3';\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../monitoring/logger.js';\nimport { trace } from '../trace/index.js';\nimport {\n DatabaseError,\n FrameError,\n SystemError,\n ErrorCode,\n wrapError,\n createErrorHandler,\n} from '../errors/index.js';\nimport { retry, withTimeout } from '../errors/recovery.js';\nimport { sessionManager, FrameQueryMode } from '../session/index.js';\n\n// Frame types based on architecture\nexport type FrameType =\n | 'task'\n | 'subtask'\n | 'tool_scope'\n | 'review'\n | 'write'\n | 'debug';\nexport type FrameState = 'active' | 'closed';\n\nexport interface Frame {\n frame_id: string;\n run_id: string;\n project_id: string;\n parent_frame_id?: string;\n depth: number;\n type: FrameType;\n name: string;\n state: FrameState;\n inputs: Record<string, any>;\n outputs: Record<string, any>;\n digest_text?: string;\n digest_json: Record<string, any>;\n created_at: number;\n closed_at?: number;\n}\n\nexport interface FrameContext {\n frameId: string;\n header: {\n goal: string;\n constraints?: string[];\n definitions?: Record<string, string>;\n };\n anchors: Anchor[];\n recentEvents: Event[];\n activeArtifacts: string[];\n}\n\nexport interface Anchor {\n anchor_id: string;\n frame_id: string;\n type:\n | 'FACT'\n | 'DECISION'\n | 'CONSTRAINT'\n | 'INTERFACE_CONTRACT'\n | 'TODO'\n | 'RISK';\n text: string;\n priority: number;\n metadata: Record<string, any>;\n}\n\nexport interface Event {\n event_id: string;\n frame_id: string;\n run_id: string;\n seq: number;\n event_type:\n | 'user_message'\n | 'assistant_message'\n | 'tool_call'\n | 'tool_result'\n | 'decision'\n | 'constraint'\n | 'artifact'\n | 'observation';\n payload: Record<string, any>;\n ts: number;\n}\n\nexport class FrameManager {\n private db: Database.Database;\n private currentRunId: string;\n private sessionId: string;\n private projectId: string;\n private activeStack: string[] = []; // Stack of active frame IDs\n private queryMode: FrameQueryMode = FrameQueryMode.PROJECT_ACTIVE;\n\n constructor(db: Database.Database, projectId: string, runId?: string) {\n this.db = db;\n this.projectId = projectId;\n \n // Use session manager for run ID if available\n const session = sessionManager.getCurrentSession();\n if (session) {\n this.currentRunId = session.runId;\n this.sessionId = session.sessionId;\n } else {\n this.currentRunId = runId || uuidv4();\n this.sessionId = this.currentRunId; // Fallback for legacy behavior\n }\n \n this.initializeSchema();\n this.loadActiveStack();\n }\n\n setQueryMode(mode: FrameQueryMode): void {\n this.queryMode = mode;\n this.loadActiveStack(); // Reload with new mode\n }\n\n private initializeSchema() {\n const errorHandler = createErrorHandler({\n operation: 'initializeSchema',\n projectId: this.projectId,\n runId: this.currentRunId,\n });\n\n try {\n // Enhanced frames table matching architecture\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS frames (\n frame_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n parent_frame_id TEXT REFERENCES frames(frame_id),\n depth INTEGER NOT NULL DEFAULT 0,\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n state TEXT DEFAULT 'active',\n inputs TEXT DEFAULT '{}',\n outputs TEXT DEFAULT '{}',\n digest_text TEXT,\n digest_json TEXT DEFAULT '{}',\n created_at INTEGER DEFAULT (unixepoch()),\n closed_at INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n frame_id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n event_type TEXT NOT NULL,\n payload TEXT NOT NULL,\n ts INTEGER DEFAULT (unixepoch()),\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id)\n );\n\n CREATE TABLE IF NOT EXISTS anchors (\n anchor_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n priority INTEGER DEFAULT 0,\n created_at INTEGER DEFAULT (unixepoch()),\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_frames_run ON frames(run_id);\n CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);\n CREATE INDEX IF NOT EXISTS idx_frames_state ON frames(state);\n CREATE INDEX IF NOT EXISTS idx_events_frame ON events(frame_id);\n CREATE INDEX IF NOT EXISTS idx_events_seq ON events(frame_id, seq);\n CREATE INDEX IF NOT EXISTS idx_anchors_frame ON anchors(frame_id);\n `);\n } catch (error) {\n const dbError = errorHandler(error, {\n operation: 'initializeSchema',\n schema: 'frames',\n });\n \n if (dbError instanceof DatabaseError) {\n throw new DatabaseError(\n 'Failed to initialize frame database schema',\n ErrorCode.DB_MIGRATION_FAILED,\n {\n projectId: this.projectId,\n operation: 'initializeSchema',\n originalError: error,\n },\n error instanceof Error ? error : undefined\n );\n }\n throw dbError;\n }\n }\n\n private loadActiveStack() {\n const errorHandler = createErrorHandler({\n operation: 'loadActiveStack',\n runId: this.currentRunId,\n projectId: this.projectId,\n });\n\n try {\n let query: string;\n let params: any[];\n\n // Build query based on query mode\n switch (this.queryMode) {\n case FrameQueryMode.ALL_ACTIVE:\n query = `\n SELECT frame_id, parent_frame_id, depth\n FROM frames\n WHERE state = 'active'\n ORDER BY created_at DESC, depth ASC\n `;\n params = [];\n break;\n \n case FrameQueryMode.PROJECT_ACTIVE:\n query = `\n SELECT frame_id, parent_frame_id, depth, run_id\n FROM frames\n WHERE state = 'active' AND project_id = ?\n ORDER BY created_at DESC, depth ASC\n `;\n params = [this.projectId];\n break;\n \n case FrameQueryMode.HISTORICAL:\n query = `\n SELECT frame_id, parent_frame_id, depth\n FROM frames\n WHERE project_id = ?\n ORDER BY created_at DESC, depth ASC\n `;\n params = [this.projectId];\n break;\n \n case FrameQueryMode.CURRENT_SESSION:\n default:\n query = `\n SELECT frame_id, parent_frame_id, depth\n FROM frames\n WHERE run_id = ? AND state = 'active'\n ORDER BY depth ASC\n `;\n params = [this.currentRunId];\n break;\n }\n\n const activeFrames = this.db.prepare(query).all(...params) as Frame[];\n\n // Rebuild stack order\n this.activeStack = this.buildStackOrder(activeFrames);\n\n logger.info('Loaded active stack', {\n runId: this.currentRunId,\n stackDepth: this.activeStack.length,\n activeFrames: this.activeStack,\n queryMode: this.queryMode,\n });\n } catch (error) {\n const dbError = errorHandler(error, {\n query: 'Frame loading query',\n runId: this.currentRunId,\n queryMode: this.queryMode,\n });\n \n if (dbError instanceof DatabaseError) {\n throw new DatabaseError(\n 'Failed to load active frame stack',\n ErrorCode.DB_QUERY_FAILED,\n {\n runId: this.currentRunId,\n projectId: this.projectId,\n operation: 'loadActiveStack',\n },\n error instanceof Error ? error : undefined\n );\n }\n throw dbError;\n }\n }\n\n private buildStackOrder(\n frames: Pick<Frame, 'frame_id' | 'parent_frame_id' | 'depth'>[]\n ): string[] {\n const stack: string[] = [];\n\n // Find root frame (no parent)\n const rootFrame = frames.find((f) => !f.parent_frame_id);\n if (!rootFrame) return [];\n\n // Build stack by following parent-child relationships\n let currentFrame = rootFrame;\n stack.push(currentFrame.frame_id);\n\n while (currentFrame) {\n const childFrame = frames.find(\n (f) => f.parent_frame_id === currentFrame.frame_id\n );\n if (!childFrame) break;\n stack.push(childFrame.frame_id);\n currentFrame = childFrame;\n }\n\n return stack;\n }\n\n /**\n * Create a new frame and push to stack\n */\n public createFrame(options: {\n type: FrameType;\n name: string;\n inputs?: Record<string, any>;\n parentFrameId?: string;\n }): string {\n return trace.traceSync('function', 'FrameManager.createFrame', options, () => this._createFrame(options));\n }\n\n private _createFrame(options: {\n type: FrameType;\n name: string;\n inputs?: Record<string, any>;\n parentFrameId?: string;\n }): string {\n const frameId = uuidv4();\n const parentFrameId = options.parentFrameId || this.getCurrentFrameId();\n const depth = parentFrameId ? this.getFrameDepth(parentFrameId) + 1 : 0;\n\n const frame: Omit<\n Frame,\n 'outputs' | 'digest_text' | 'digest_json' | 'closed_at'\n > = {\n frame_id: frameId,\n run_id: this.currentRunId,\n project_id: this.projectId,\n parent_frame_id: parentFrameId,\n depth,\n type: options.type,\n name: options.name,\n state: 'active',\n inputs: options.inputs || {},\n created_at: Math.floor(Date.now() / 1000),\n };\n\n try {\n this.db\n .prepare(\n `\n INSERT INTO frames (\n frame_id, run_id, project_id, parent_frame_id, depth, type, name, state, inputs, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n frame.frame_id,\n frame.run_id,\n frame.project_id,\n frame.parent_frame_id,\n frame.depth,\n frame.type,\n frame.name,\n frame.state,\n JSON.stringify(frame.inputs),\n frame.created_at\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to create frame: ${options.name}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n frameType: options.type,\n frameName: options.name,\n parentFrameId,\n depth,\n operation: 'createFrame',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n // Push to active stack\n this.activeStack.push(frameId);\n\n logger.info('Created frame', {\n frameId,\n type: options.type,\n name: options.name,\n depth,\n parentFrameId,\n stackDepth: this.activeStack.length,\n });\n\n return frameId;\n }\n\n /**\n * Close the current frame and generate digest\n */\n public closeFrame(frameId?: string, outputs?: Record<string, any>): void {\n trace.traceSync('function', 'FrameManager.closeFrame', { frameId, outputs }, () => this._closeFrame(frameId, outputs));\n }\n\n private _closeFrame(frameId?: string, outputs?: Record<string, any>): void {\n const targetFrameId = frameId || this.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame to close',\n ErrorCode.FRAME_INVALID_STATE,\n {\n operation: 'closeFrame',\n activeStack: this.activeStack,\n stackDepth: this.activeStack.length,\n }\n );\n }\n\n // Get frame details\n const frame = this.getFrame(targetFrameId);\n if (!frame) {\n throw new FrameError(\n `Frame not found: ${targetFrameId}`,\n ErrorCode.FRAME_NOT_FOUND,\n {\n frameId: targetFrameId,\n operation: 'closeFrame',\n runId: this.currentRunId,\n }\n );\n }\n\n if (frame.state === 'closed') {\n logger.warn('Attempted to close already closed frame', {\n frameId: targetFrameId,\n });\n return;\n }\n\n // Generate digest before closing\n const digest = this.generateDigest(targetFrameId);\n const finalOutputs = { ...outputs, ...digest.structured };\n\n try {\n // Update frame to closed state\n this.db\n .prepare(\n `\n UPDATE frames\n SET state = 'closed',\n outputs = ?,\n digest_text = ?,\n digest_json = ?,\n closed_at = unixepoch()\n WHERE frame_id = ?\n `\n )\n .run(\n JSON.stringify(finalOutputs),\n digest.text,\n JSON.stringify(digest.structured),\n targetFrameId\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to close frame: ${targetFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId: targetFrameId,\n frameName: frame.name,\n operation: 'closeFrame',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n // Remove from active stack\n this.activeStack = this.activeStack.filter((id) => id !== targetFrameId);\n\n // Close all child frames recursively\n this.closeChildFrames(targetFrameId);\n\n logger.info('Closed frame', {\n frameId: targetFrameId,\n name: frame.name,\n duration: Math.floor(Date.now() / 1000) - frame.created_at,\n digestLength: digest.text.length,\n stackDepth: this.activeStack.length,\n });\n }\n\n private closeChildFrames(parentFrameId: string) {\n try {\n const children = this.db\n .prepare(\n `\n SELECT frame_id FROM frames\n WHERE parent_frame_id = ? AND state = 'active'\n `\n )\n .all(parentFrameId) as { frame_id: string }[];\n\n children.forEach((child) => {\n try {\n this.closeFrame(child.frame_id);\n } catch (error) {\n logger.error(\n 'Failed to close child frame',\n error instanceof Error ? error : new Error(String(error)),\n {\n parentFrameId,\n childFrameId: child.frame_id,\n }\n );\n }\n });\n } catch (error) {\n throw new DatabaseError(\n `Failed to close child frames for parent: ${parentFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n parentFrameId,\n operation: 'closeChildFrames',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Generate digest for a frame\n */\n private generateDigest(frameId: string): {\n text: string;\n structured: Record<string, any>;\n } {\n const frame = this.getFrame(frameId);\n const events = this.getFrameEvents(frameId);\n const anchors = this.getFrameAnchors(frameId);\n\n if (!frame) {\n throw new FrameError(\n `Cannot generate digest: frame not found ${frameId}`,\n ErrorCode.FRAME_NOT_FOUND,\n {\n frameId,\n operation: 'generateDigest',\n runId: this.currentRunId,\n }\n );\n }\n\n // Extract key information\n const decisions = anchors.filter((a) => a.type === 'DECISION');\n const constraints = anchors.filter((a) => a.type === 'CONSTRAINT');\n const risks = anchors.filter((a) => a.type === 'RISK');\n\n const toolCalls = events.filter((e) => e.event_type === 'tool_call');\n const artifacts = events.filter((e) => e.event_type === 'artifact');\n\n // Generate structured digest\n const structured = {\n result: frame.name,\n decisions: decisions.map((d) => ({ id: d.anchor_id, text: d.text })),\n constraints: constraints.map((c) => ({ id: c.anchor_id, text: c.text })),\n risks: risks.map((r) => ({ id: r.anchor_id, text: r.text })),\n artifacts: artifacts.map((a) => ({\n kind: a.payload.kind || 'unknown',\n ref: a.payload.ref,\n })),\n tool_calls_count: toolCalls.length,\n duration_seconds: frame.closed_at\n ? frame.closed_at - frame.created_at\n : 0,\n };\n\n // Generate text summary\n const text = this.generateDigestText(frame, structured, events.length);\n\n return { text, structured };\n }\n\n private generateDigestText(\n frame: Frame,\n structured: any,\n eventCount: number\n ): string {\n let summary = `Completed: ${frame.name}\\n`;\n\n if (structured.decisions.length > 0) {\n summary += `\\nDecisions made:\\n${structured.decisions.map((d: any) => `- ${d.text}`).join('\\n')}`;\n }\n\n if (structured.constraints.length > 0) {\n summary += `\\nConstraints established:\\n${structured.constraints.map((c: any) => `- ${c.text}`).join('\\n')}`;\n }\n\n if (structured.risks.length > 0) {\n summary += `\\nRisks identified:\\n${structured.risks.map((r: any) => `- ${r.text}`).join('\\n')}`;\n }\n\n summary += `\\nActivity: ${eventCount} events, ${structured.tool_calls_count} tool calls`;\n\n if (structured.duration_seconds > 0) {\n summary += `, ${Math.floor(structured.duration_seconds / 60)}m ${structured.duration_seconds % 60}s duration`;\n }\n\n return summary;\n }\n\n /**\n * Add event to current frame\n */\n public addEvent(\n eventType: Event['event_type'],\n payload: Record<string, any>,\n frameId?: string\n ): string {\n const targetFrameId = frameId || this.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame for event',\n ErrorCode.FRAME_INVALID_STATE,\n {\n operation: 'addEvent',\n eventType,\n activeStack: this.activeStack,\n }\n );\n }\n\n const eventId = uuidv4();\n const seq = this.getNextEventSequence(targetFrameId);\n\n try {\n this.db\n .prepare(\n `\n INSERT INTO events (event_id, run_id, frame_id, seq, event_type, payload)\n VALUES (?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n eventId,\n this.currentRunId,\n targetFrameId,\n seq,\n eventType,\n JSON.stringify(payload)\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to add event to frame: ${targetFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n eventId,\n frameId: targetFrameId,\n eventType,\n seq,\n operation: 'addEvent',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n return eventId;\n }\n\n /**\n * Add anchor to frame\n */\n public addAnchor(\n type: Anchor['type'],\n text: string,\n priority: number = 0,\n metadata: Record<string, any> = {},\n frameId?: string\n ): string {\n const targetFrameId = frameId || this.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame for anchor',\n ErrorCode.FRAME_INVALID_STATE,\n {\n operation: 'addAnchor',\n anchorType: type,\n text: text.substring(0, 100),\n activeStack: this.activeStack,\n }\n );\n }\n\n const anchorId = uuidv4();\n\n try {\n this.db\n .prepare(\n `\n INSERT INTO anchors (anchor_id, frame_id, project_id, type, text, priority, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n anchorId,\n targetFrameId,\n this.projectId,\n type,\n text,\n priority,\n JSON.stringify(metadata)\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to add anchor to frame: ${targetFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n anchorId,\n frameId: targetFrameId,\n anchorType: type,\n operation: 'addAnchor',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n return anchorId;\n }\n\n /**\n * Get hot stack context for current active frames\n */\n public getHotStackContext(maxEvents: number = 20): FrameContext[] {\n return this.activeStack\n .map((frameId) => {\n const frame = this.getFrame(frameId);\n if (!frame) return null;\n\n return {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors: this.getFrameAnchors(frameId),\n recentEvents: this.getFrameEvents(frameId, maxEvents),\n activeArtifacts: this.getActiveArtifacts(frameId),\n };\n })\n .filter(Boolean) as FrameContext[];\n }\n\n /**\n * Get active frame path (root to current)\n */\n public getActiveFramePath(): Frame[] {\n return this.activeStack\n .map((frameId) => this.getFrame(frameId))\n .filter(Boolean) as Frame[];\n }\n\n // Utility methods\n public getCurrentFrameId(): string | undefined {\n return this.activeStack[this.activeStack.length - 1];\n }\n\n public getStackDepth(): number {\n return this.activeStack.length;\n }\n\n private getFrameDepth(frameId: string): number {\n const frame = this.getFrame(frameId);\n return frame?.depth || 0;\n }\n\n public getFrame(frameId: string): Frame | undefined {\n try {\n const row = this.db\n .prepare(\n `\n SELECT * FROM frames WHERE frame_id = ?\n `\n )\n .get(frameId) as any;\n\n if (!row) return undefined;\n\n return {\n ...row,\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n };\n } catch (error) {\n throw new DatabaseError(\n `Failed to get frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n operation: 'getFrame',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n public getFrameEvents(frameId: string, limit?: number): Event[] {\n try {\n const query = limit\n ? `SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?`\n : `SELECT * FROM events WHERE frame_id = ? ORDER BY seq ASC`;\n\n const params = limit ? [frameId, limit] : [frameId];\n const rows = this.db.prepare(query).all(...params) as any[];\n\n return rows.map((row) => ({\n ...row,\n payload: JSON.parse(row.payload),\n }));\n } catch (error) {\n throw new DatabaseError(\n `Failed to get frame events: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n limit,\n operation: 'getFrameEvents',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private getFrameAnchors(frameId: string): Anchor[] {\n try {\n const rows = this.db\n .prepare(\n `\n SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC\n `\n )\n .all(frameId) as any[];\n\n return rows.map((row) => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n } catch (error) {\n throw new DatabaseError(\n `Failed to get frame anchors: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n operation: 'getFrameAnchors',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private getNextEventSequence(frameId: string): number {\n try {\n const result = this.db\n .prepare(\n `\n SELECT MAX(seq) as max_seq FROM events WHERE frame_id = ?\n `\n )\n .get(frameId) as { max_seq: number | null };\n\n return (result.max_seq || 0) + 1;\n } catch (error) {\n throw new DatabaseError(\n `Failed to get next event sequence for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n operation: 'getNextEventSequence',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private extractConstraints(\n inputs: Record<string, any>\n ): string[] | undefined {\n return inputs.constraints;\n }\n\n private getActiveArtifacts(frameId: string): string[] {\n const artifacts = this.getFrameEvents(frameId)\n .filter((e) => e.event_type === 'artifact')\n .map((e) => e.payload.ref)\n .filter(Boolean);\n\n return artifacts;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * StackMemory Frame Manager - Call Stack Implementation\n * Manages nested frames representing the call stack of work\n */\n\nimport Database from 'better-sqlite3';\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../monitoring/logger.js';\nimport { trace } from '../trace/index.js';\nimport {\n DatabaseError,\n FrameError,\n SystemError,\n ErrorCode,\n wrapError,\n createErrorHandler,\n} from '../errors/index.js';\nimport { retry, withTimeout } from '../errors/recovery.js';\nimport { sessionManager, FrameQueryMode } from '../session/index.js';\nimport { contextBridge } from './context-bridge.js';\n\n// Frame types based on architecture\nexport type FrameType =\n | 'task'\n | 'subtask'\n | 'tool_scope'\n | 'review'\n | 'write'\n | 'debug';\nexport type FrameState = 'active' | 'closed';\n\nexport interface Frame {\n frame_id: string;\n run_id: string;\n project_id: string;\n parent_frame_id?: string;\n depth: number;\n type: FrameType;\n name: string;\n state: FrameState;\n inputs: Record<string, any>;\n outputs: Record<string, any>;\n digest_text?: string;\n digest_json: Record<string, any>;\n created_at: number;\n closed_at?: number;\n}\n\nexport interface FrameContext {\n frameId: string;\n header: {\n goal: string;\n constraints?: string[];\n definitions?: Record<string, string>;\n };\n anchors: Anchor[];\n recentEvents: Event[];\n activeArtifacts: string[];\n}\n\nexport interface Anchor {\n anchor_id: string;\n frame_id: string;\n type:\n | 'FACT'\n | 'DECISION'\n | 'CONSTRAINT'\n | 'INTERFACE_CONTRACT'\n | 'TODO'\n | 'RISK';\n text: string;\n priority: number;\n metadata: Record<string, any>;\n}\n\nexport interface Event {\n event_id: string;\n frame_id: string;\n run_id: string;\n seq: number;\n event_type:\n | 'user_message'\n | 'assistant_message'\n | 'tool_call'\n | 'tool_result'\n | 'decision'\n | 'constraint'\n | 'artifact'\n | 'observation';\n payload: Record<string, any>;\n ts: number;\n}\n\nexport interface FrameManagerOptions {\n skipContextBridge?: boolean;\n runId?: string;\n}\n\nexport class FrameManager {\n private db: Database.Database;\n private currentRunId: string;\n private sessionId: string;\n private projectId: string;\n private activeStack: string[] = []; // Stack of active frame IDs\n private queryMode: FrameQueryMode = FrameQueryMode.PROJECT_ACTIVE;\n\n constructor(\n db: Database.Database, \n projectId: string, \n runIdOrOptions?: string | FrameManagerOptions\n ) {\n this.db = db;\n this.projectId = projectId;\n\n // Handle both legacy string runId and new options object\n let runId: string | undefined;\n let skipContextBridge = false;\n \n if (typeof runIdOrOptions === 'string') {\n runId = runIdOrOptions;\n } else if (runIdOrOptions) {\n runId = runIdOrOptions.runId;\n skipContextBridge = runIdOrOptions.skipContextBridge || false;\n }\n\n // Use session manager for run ID if available\n const session = sessionManager.getCurrentSession();\n if (session) {\n this.currentRunId = session.runId;\n this.sessionId = session.sessionId;\n } else {\n this.currentRunId = runId || uuidv4();\n this.sessionId = this.currentRunId; // Fallback for legacy behavior\n }\n\n this.initializeSchema();\n this.loadActiveStack();\n\n // Initialize context bridge for automatic shared context\n // Skip in test environment, when explicitly requested, or for CLI usage\n const shouldInitializeBridge = \n !skipContextBridge && \n process.env.NODE_ENV !== 'test' && \n !process.env.VITEST &&\n !process.env.STACKMEMORY_CLI;\n \n if (shouldInitializeBridge) {\n contextBridge\n .initialize(this, {\n autoSync: true,\n syncInterval: 60000, // 1 minute\n minFrameScore: 0.5, // Sync frames above 0.5 score\n importantTags: ['decision', 'error', 'milestone', 'learning'],\n })\n .catch((error) => {\n logger.warn('Failed to initialize context bridge', { error });\n });\n }\n }\n\n setQueryMode(mode: FrameQueryMode): void {\n this.queryMode = mode;\n this.loadActiveStack(); // Reload with new mode\n }\n\n private initializeSchema() {\n const errorHandler = createErrorHandler({\n operation: 'initializeSchema',\n projectId: this.projectId,\n runId: this.currentRunId,\n });\n\n try {\n // Enhanced frames table matching architecture\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS frames (\n frame_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n parent_frame_id TEXT REFERENCES frames(frame_id),\n depth INTEGER NOT NULL DEFAULT 0,\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n state TEXT DEFAULT 'active',\n inputs TEXT DEFAULT '{}',\n outputs TEXT DEFAULT '{}',\n digest_text TEXT,\n digest_json TEXT DEFAULT '{}',\n created_at INTEGER DEFAULT (unixepoch()),\n closed_at INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n frame_id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n event_type TEXT NOT NULL,\n payload TEXT NOT NULL,\n ts INTEGER DEFAULT (unixepoch()),\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id)\n );\n\n CREATE TABLE IF NOT EXISTS anchors (\n anchor_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n priority INTEGER DEFAULT 0,\n created_at INTEGER DEFAULT (unixepoch()),\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id)\n );\n\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 status TEXT NOT NULL DEFAULT 'pending',\n created_at INTEGER DEFAULT (unixepoch()),\n expires_at INTEGER,\n target_user_id TEXT,\n message TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_frames_run ON frames(run_id);\n CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);\n CREATE INDEX IF NOT EXISTS idx_frames_state ON frames(state);\n CREATE INDEX IF NOT EXISTS idx_events_frame ON events(frame_id);\n CREATE INDEX IF NOT EXISTS idx_events_seq ON events(frame_id, seq);\n CREATE INDEX IF NOT EXISTS idx_anchors_frame ON anchors(frame_id);\n CREATE INDEX IF NOT EXISTS idx_handoff_requests_status ON handoff_requests(status);\n CREATE INDEX IF NOT EXISTS idx_handoff_requests_target ON handoff_requests(target_stack_id);\n `);\n } catch (error) {\n const dbError = errorHandler(error, {\n operation: 'initializeSchema',\n schema: 'frames',\n });\n\n if (dbError instanceof DatabaseError) {\n throw new DatabaseError(\n 'Failed to initialize frame database schema',\n ErrorCode.DB_MIGRATION_FAILED,\n {\n projectId: this.projectId,\n operation: 'initializeSchema',\n originalError: error,\n },\n error instanceof Error ? error : undefined\n );\n }\n throw dbError;\n }\n }\n\n private loadActiveStack() {\n const errorHandler = createErrorHandler({\n operation: 'loadActiveStack',\n runId: this.currentRunId,\n projectId: this.projectId,\n });\n\n try {\n let query: string;\n let params: any[];\n\n // Build query based on query mode\n switch (this.queryMode) {\n case FrameQueryMode.ALL_ACTIVE:\n query = `\n SELECT frame_id, parent_frame_id, depth\n FROM frames\n WHERE state = 'active'\n ORDER BY created_at DESC, depth ASC\n `;\n params = [];\n break;\n\n case FrameQueryMode.PROJECT_ACTIVE:\n query = `\n SELECT frame_id, parent_frame_id, depth, run_id\n FROM frames\n WHERE state = 'active' AND project_id = ?\n ORDER BY created_at DESC, depth ASC\n `;\n params = [this.projectId];\n break;\n\n case FrameQueryMode.HISTORICAL:\n query = `\n SELECT frame_id, parent_frame_id, depth\n FROM frames\n WHERE project_id = ?\n ORDER BY created_at DESC, depth ASC\n `;\n params = [this.projectId];\n break;\n\n case FrameQueryMode.CURRENT_SESSION:\n default:\n query = `\n SELECT frame_id, parent_frame_id, depth\n FROM frames\n WHERE run_id = ? AND state = 'active'\n ORDER BY depth ASC\n `;\n params = [this.currentRunId];\n break;\n }\n\n const activeFrames = this.db.prepare(query).all(...params) as Frame[];\n\n // Rebuild stack order\n this.activeStack = this.buildStackOrder(activeFrames);\n\n logger.info('Loaded active stack', {\n runId: this.currentRunId,\n stackDepth: this.activeStack.length,\n activeFrames: this.activeStack,\n queryMode: this.queryMode,\n });\n } catch (error) {\n const dbError = errorHandler(error, {\n query: 'Frame loading query',\n runId: this.currentRunId,\n queryMode: this.queryMode,\n });\n\n if (dbError instanceof DatabaseError) {\n throw new DatabaseError(\n 'Failed to load active frame stack',\n ErrorCode.DB_QUERY_FAILED,\n {\n runId: this.currentRunId,\n projectId: this.projectId,\n operation: 'loadActiveStack',\n },\n error instanceof Error ? error : undefined\n );\n }\n throw dbError;\n }\n }\n\n private buildStackOrder(\n frames: Pick<Frame, 'frame_id' | 'parent_frame_id' | 'depth'>[]\n ): string[] {\n const stack: string[] = [];\n\n // Find root frame (no parent)\n const rootFrame = frames.find((f) => !f.parent_frame_id);\n if (!rootFrame) return [];\n\n // Build stack by following parent-child relationships\n let currentFrame = rootFrame;\n stack.push(currentFrame.frame_id);\n\n while (currentFrame) {\n const childFrame = frames.find(\n (f) => f.parent_frame_id === currentFrame.frame_id\n );\n if (!childFrame) break;\n stack.push(childFrame.frame_id);\n currentFrame = childFrame;\n }\n\n return stack;\n }\n\n /**\n * Create a new frame and push to stack\n */\n public createFrame(options: {\n type: FrameType;\n name: string;\n inputs?: Record<string, any>;\n parentFrameId?: string;\n }): string {\n return this._createFrame(options);\n }\n\n private _createFrame(options: {\n type: FrameType;\n name: string;\n inputs?: Record<string, any>;\n parentFrameId?: string;\n }): string {\n const frameId = uuidv4();\n const parentFrameId = options.parentFrameId || this.getCurrentFrameId();\n const depth = parentFrameId ? this.getFrameDepth(parentFrameId) + 1 : 0;\n\n const frame: Omit<\n Frame,\n 'outputs' | 'digest_text' | 'digest_json' | 'closed_at'\n > = {\n frame_id: frameId,\n run_id: this.currentRunId,\n project_id: this.projectId,\n parent_frame_id: parentFrameId,\n depth,\n type: options.type,\n name: options.name,\n state: 'active',\n inputs: options.inputs || {},\n created_at: Math.floor(Date.now() / 1000),\n };\n\n try {\n this.db\n .prepare(\n `\n INSERT INTO frames (\n frame_id, run_id, project_id, parent_frame_id, depth, type, name, state, inputs, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n frame.frame_id,\n frame.run_id,\n frame.project_id,\n frame.parent_frame_id,\n frame.depth,\n frame.type,\n frame.name,\n frame.state,\n JSON.stringify(frame.inputs),\n frame.created_at\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to create frame: ${options.name}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n frameType: options.type,\n frameName: options.name,\n parentFrameId,\n depth,\n operation: 'createFrame',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n // Push to active stack\n this.activeStack.push(frameId);\n\n logger.info('Created frame', {\n frameId,\n type: options.type,\n name: options.name,\n depth,\n parentFrameId,\n stackDepth: this.activeStack.length,\n });\n\n return frameId;\n }\n\n /**\n * Close the current frame and generate digest\n */\n public closeFrame(frameId?: string, outputs?: Record<string, any>): void {\n this._closeFrame(frameId, outputs);\n }\n\n private _closeFrame(frameId?: string, outputs?: Record<string, any>): void {\n const targetFrameId = frameId || this.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame to close',\n ErrorCode.FRAME_INVALID_STATE,\n {\n operation: 'closeFrame',\n activeStack: this.activeStack,\n stackDepth: this.activeStack.length,\n }\n );\n }\n\n // Get frame details\n const frame = this.getFrame(targetFrameId);\n if (!frame) {\n throw new FrameError(\n `Frame not found: ${targetFrameId}`,\n ErrorCode.FRAME_NOT_FOUND,\n {\n frameId: targetFrameId,\n operation: 'closeFrame',\n runId: this.currentRunId,\n }\n );\n }\n\n if (frame.state === 'closed') {\n logger.warn('Attempted to close already closed frame', {\n frameId: targetFrameId,\n });\n return;\n }\n\n // Generate digest before closing\n const digest = this.generateDigest(targetFrameId);\n const finalOutputs = { ...outputs, ...digest.structured };\n\n try {\n // Update frame to closed state\n this.db\n .prepare(\n `\n UPDATE frames\n SET state = 'closed',\n outputs = ?,\n digest_text = ?,\n digest_json = ?,\n closed_at = unixepoch()\n WHERE frame_id = ?\n `\n )\n .run(\n JSON.stringify(finalOutputs),\n digest.text,\n JSON.stringify(digest.structured),\n targetFrameId\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to close frame: ${targetFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId: targetFrameId,\n frameName: frame.name,\n operation: 'closeFrame',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n // Remove from active stack\n this.activeStack = this.activeStack.filter((id) => id !== targetFrameId);\n\n // Close all child frames recursively\n this.closeChildFrames(targetFrameId);\n\n logger.info('Closed frame', {\n frameId: targetFrameId,\n name: frame.name,\n duration: Math.floor(Date.now() / 1000) - frame.created_at,\n digestLength: digest.text.length,\n stackDepth: this.activeStack.length,\n });\n }\n\n /**\n * Delete a frame completely from the database (used in handoffs)\n */\n deleteFrame(frameId: string): void {\n try {\n // First delete related data\n this.db.prepare('DELETE FROM events WHERE frame_id = ?').run(frameId);\n this.db.prepare('DELETE FROM anchors WHERE frame_id = ?').run(frameId);\n\n // Remove from active stack if present\n this.activeStack = this.activeStack.filter((id) => id !== frameId);\n\n // Delete the frame itself\n this.db.prepare('DELETE FROM frames WHERE frame_id = ?').run(frameId);\n\n logger.debug('Deleted frame completely', { frameId });\n } catch (error) {\n logger.error('Failed to delete frame', { frameId, error });\n throw error;\n }\n }\n\n private closeChildFrames(parentFrameId: string) {\n try {\n const children = this.db\n .prepare(\n `\n SELECT frame_id FROM frames\n WHERE parent_frame_id = ? AND state = 'active'\n `\n )\n .all(parentFrameId) as { frame_id: string }[];\n\n children.forEach((child) => {\n try {\n this.closeFrame(child.frame_id);\n } catch (error) {\n logger.error(\n 'Failed to close child frame',\n error instanceof Error ? error : new Error(String(error)),\n {\n parentFrameId,\n childFrameId: child.frame_id,\n }\n );\n }\n });\n } catch (error) {\n throw new DatabaseError(\n `Failed to close child frames for parent: ${parentFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n parentFrameId,\n operation: 'closeChildFrames',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Generate digest for a frame\n */\n private generateDigest(frameId: string): {\n text: string;\n structured: Record<string, any>;\n } {\n const frame = this.getFrame(frameId);\n const events = this.getFrameEvents(frameId);\n const anchors = this.getFrameAnchors(frameId);\n\n if (!frame) {\n throw new FrameError(\n `Cannot generate digest: frame not found ${frameId}`,\n ErrorCode.FRAME_NOT_FOUND,\n {\n frameId,\n operation: 'generateDigest',\n runId: this.currentRunId,\n }\n );\n }\n\n // Extract key information\n const decisions = anchors.filter((a) => a.type === 'DECISION');\n const constraints = anchors.filter((a) => a.type === 'CONSTRAINT');\n const risks = anchors.filter((a) => a.type === 'RISK');\n\n const toolCalls = events.filter((e) => e.event_type === 'tool_call');\n const artifacts = events.filter((e) => e.event_type === 'artifact');\n\n // Generate structured digest\n const structured = {\n result: frame.name,\n decisions: decisions.map((d) => ({ id: d.anchor_id, text: d.text })),\n constraints: constraints.map((c) => ({ id: c.anchor_id, text: c.text })),\n risks: risks.map((r) => ({ id: r.anchor_id, text: r.text })),\n artifacts: artifacts.map((a) => ({\n kind: a.payload.kind || 'unknown',\n ref: a.payload.ref,\n })),\n tool_calls_count: toolCalls.length,\n duration_seconds: frame.closed_at\n ? frame.closed_at - frame.created_at\n : 0,\n };\n\n // Generate text summary\n const text = this.generateDigestText(frame, structured, events.length);\n\n return { text, structured };\n }\n\n private generateDigestText(\n frame: Frame,\n structured: any,\n eventCount: number\n ): string {\n let summary = `Completed: ${frame.name}\\n`;\n\n if (structured.decisions.length > 0) {\n summary += `\\nDecisions made:\\n${structured.decisions.map((d: any) => `- ${d.text}`).join('\\n')}`;\n }\n\n if (structured.constraints.length > 0) {\n summary += `\\nConstraints established:\\n${structured.constraints.map((c: any) => `- ${c.text}`).join('\\n')}`;\n }\n\n if (structured.risks.length > 0) {\n summary += `\\nRisks identified:\\n${structured.risks.map((r: any) => `- ${r.text}`).join('\\n')}`;\n }\n\n summary += `\\nActivity: ${eventCount} events, ${structured.tool_calls_count} tool calls`;\n\n if (structured.duration_seconds > 0) {\n summary += `, ${Math.floor(structured.duration_seconds / 60)}m ${structured.duration_seconds % 60}s duration`;\n }\n\n return summary;\n }\n\n /**\n * Add event to current frame\n */\n public addEvent(\n eventType: Event['event_type'],\n payload: Record<string, any>,\n frameId?: string\n ): string {\n const targetFrameId = frameId || this.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame for event',\n ErrorCode.FRAME_INVALID_STATE,\n {\n operation: 'addEvent',\n eventType,\n activeStack: this.activeStack,\n }\n );\n }\n\n const eventId = uuidv4();\n const seq = this.getNextEventSequence(targetFrameId);\n\n try {\n this.db\n .prepare(\n `\n INSERT INTO events (event_id, run_id, frame_id, seq, event_type, payload)\n VALUES (?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n eventId,\n this.currentRunId,\n targetFrameId,\n seq,\n eventType,\n JSON.stringify(payload)\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to add event to frame: ${targetFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n eventId,\n frameId: targetFrameId,\n eventType,\n seq,\n operation: 'addEvent',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n return eventId;\n }\n\n /**\n * Add anchor to frame\n */\n public addAnchor(\n type: Anchor['type'],\n text: string,\n priority: number = 0,\n metadata: Record<string, any> = {},\n frameId?: string\n ): string {\n const targetFrameId = frameId || this.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame for anchor',\n ErrorCode.FRAME_INVALID_STATE,\n {\n operation: 'addAnchor',\n anchorType: type,\n text: text.substring(0, 100),\n activeStack: this.activeStack,\n }\n );\n }\n\n const anchorId = uuidv4();\n\n try {\n this.db\n .prepare(\n `\n INSERT INTO anchors (anchor_id, frame_id, project_id, type, text, priority, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n anchorId,\n targetFrameId,\n this.projectId,\n type,\n text,\n priority,\n JSON.stringify(metadata)\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to add anchor to frame: ${targetFrameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n anchorId,\n frameId: targetFrameId,\n anchorType: type,\n operation: 'addAnchor',\n },\n error instanceof Error ? error : undefined\n );\n }\n\n return anchorId;\n }\n\n /**\n * Get hot stack context for current active frames\n */\n public getHotStackContext(maxEvents: number = 20): FrameContext[] {\n return this.activeStack\n .map((frameId) => {\n const frame = this.getFrame(frameId);\n if (!frame) return null;\n\n return {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors: this.getFrameAnchors(frameId),\n recentEvents: this.getFrameEvents(frameId, maxEvents),\n activeArtifacts: this.getActiveArtifacts(frameId),\n };\n })\n .filter(Boolean) as FrameContext[];\n }\n\n /**\n * Get active frame path (root to current)\n */\n public getActiveFramePath(): Frame[] {\n return this.activeStack\n .map((frameId) => this.getFrame(frameId))\n .filter(Boolean) as Frame[];\n }\n\n // Utility methods\n public getCurrentFrameId(): string | undefined {\n return this.activeStack[this.activeStack.length - 1];\n }\n\n public getStackDepth(): number {\n return this.activeStack.length;\n }\n\n /**\n * Get recent frames for context sharing\n */\n public async getRecentFrames(limit: number = 100): Promise<Frame[]> {\n try {\n const rows = this.db\n .prepare(\n `\n SELECT * FROM frames \n WHERE project_id = ?\n ORDER BY created_at DESC\n LIMIT ?\n `\n )\n .all(this.projectId, limit) as any[];\n\n return rows.map((row) => ({\n ...row,\n frameId: row.frame_id,\n runId: row.run_id,\n projectId: row.project_id,\n parentFrameId: row.parent_frame_id,\n title: row.name,\n timestamp: row.created_at,\n metadata: {\n tags: this.extractTagsFromFrame(row),\n importance: this.calculateFrameImportance(row),\n },\n data: {\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest: JSON.parse(row.digest_json || '{}'),\n },\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n }));\n } catch (error) {\n logger.error('Failed to get recent frames', error as Error);\n return [];\n }\n }\n\n /**\n * Add context metadata to the current frame\n */\n public async addContext(key: string, value: any): Promise<void> {\n const currentFrameId = this.getCurrentFrameId();\n if (!currentFrameId) return;\n\n try {\n const frame = this.getFrame(currentFrameId);\n if (!frame) return;\n\n const metadata = frame.outputs || {};\n metadata[key] = value;\n\n this.db\n .prepare(`UPDATE frames SET outputs = ? WHERE frame_id = ?`)\n .run(JSON.stringify(metadata), currentFrameId);\n } catch (error) {\n logger.warn('Failed to add context to frame', { error, key });\n }\n }\n\n private extractTagsFromFrame(frame: any): string[] {\n const tags: string[] = [];\n\n // Add type as tag\n if (frame.type) tags.push(frame.type);\n\n // Extract tags from name\n if (frame.name) {\n if (frame.name.toLowerCase().includes('error')) tags.push('error');\n if (frame.name.toLowerCase().includes('fix')) tags.push('resolution');\n if (frame.name.toLowerCase().includes('decision')) tags.push('decision');\n if (frame.name.toLowerCase().includes('milestone'))\n tags.push('milestone');\n }\n\n // Extract from digest\n try {\n const digest = JSON.parse(frame.digest_json || '{}');\n if (digest.tags) tags.push(...digest.tags);\n } catch {}\n\n return [...new Set(tags)];\n }\n\n private calculateFrameImportance(frame: any): 'high' | 'medium' | 'low' {\n // Milestones and decisions are high importance\n if (frame.type === 'milestone' || frame.name?.includes('decision'))\n return 'high';\n\n // Errors and resolutions are medium importance\n if (frame.type === 'error' || frame.type === 'resolution') return 'medium';\n\n // Long-running frames are potentially important\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration > 300) return 'medium'; // More than 5 minutes\n }\n\n return 'low';\n }\n\n private getFrameDepth(frameId: string): number {\n const frame = this.getFrame(frameId);\n return frame?.depth || 0;\n }\n\n public getFrame(frameId: string): Frame | undefined {\n try {\n const row = this.db\n .prepare(\n `\n SELECT * FROM frames WHERE frame_id = ?\n `\n )\n .get(frameId) as any;\n\n if (!row) return undefined;\n\n return {\n ...row,\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n };\n } catch (error) {\n // Log the error but return undefined instead of throwing\n logger.warn(`Failed to get frame: ${frameId}`, {\n error: error instanceof Error ? error.message : String(error),\n frameId,\n operation: 'getFrame',\n });\n return undefined;\n }\n }\n\n public getFrameEvents(frameId: string, limit?: number): Event[] {\n try {\n const query = limit\n ? `SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?`\n : `SELECT * FROM events WHERE frame_id = ? ORDER BY seq ASC`;\n\n const params = limit ? [frameId, limit] : [frameId];\n const rows = this.db.prepare(query).all(...params) as any[];\n\n return rows.map((row) => ({\n ...row,\n payload: JSON.parse(row.payload),\n }));\n } catch (error) {\n throw new DatabaseError(\n `Failed to get frame events: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n limit,\n operation: 'getFrameEvents',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private getFrameAnchors(frameId: string): Anchor[] {\n try {\n const rows = this.db\n .prepare(\n `\n SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC\n `\n )\n .all(frameId) as any[];\n\n return rows.map((row) => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n } catch (error) {\n throw new DatabaseError(\n `Failed to get frame anchors: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n operation: 'getFrameAnchors',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private getNextEventSequence(frameId: string): number {\n try {\n const result = this.db\n .prepare(\n `\n SELECT MAX(seq) as max_seq FROM events WHERE frame_id = ?\n `\n )\n .get(frameId) as { max_seq: number | null };\n\n return (result.max_seq || 0) + 1;\n } catch (error) {\n throw new DatabaseError(\n `Failed to get next event sequence for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n operation: 'getNextEventSequence',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private extractConstraints(\n inputs: Record<string, any>\n ): string[] | undefined {\n return inputs.constraints;\n }\n\n private getActiveArtifacts(frameId: string): string[] {\n const artifacts = this.getFrameEvents(frameId)\n .filter((e) => e.event_type === 'artifact')\n .map((e) => e.payload.ref)\n .filter(Boolean);\n\n return artifacts;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }