@stackmemoryai/stackmemory 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (734) hide show
  1. package/README.md +52 -272
  2. package/dist/cli/commands/clear.js +191 -0
  3. package/dist/cli/commands/clear.js.map +7 -0
  4. package/dist/cli/commands/config.js +152 -1
  5. package/dist/cli/commands/config.js.map +2 -2
  6. package/dist/cli/commands/dashboard.js +178 -0
  7. package/dist/cli/commands/dashboard.js.map +7 -0
  8. package/dist/cli/commands/handoff.js +125 -8
  9. package/dist/cli/commands/handoff.js.map +2 -2
  10. package/dist/cli/commands/linear-create.js +132 -0
  11. package/dist/cli/commands/linear-create.js.map +7 -0
  12. package/dist/cli/commands/linear-list.js +69 -0
  13. package/dist/cli/commands/linear-list.js.map +7 -0
  14. package/dist/cli/commands/linear-migrate.js +40 -0
  15. package/dist/cli/commands/linear-migrate.js.map +7 -0
  16. package/dist/cli/commands/linear.js +185 -36
  17. package/dist/cli/commands/linear.js.map +2 -2
  18. package/dist/cli/commands/monitor.js +309 -0
  19. package/dist/cli/commands/monitor.js.map +7 -0
  20. package/dist/cli/commands/quality.js +414 -0
  21. package/dist/cli/commands/quality.js.map +7 -0
  22. package/dist/cli/commands/storage.js +275 -0
  23. package/dist/cli/commands/storage.js.map +7 -0
  24. package/dist/cli/commands/tui.js +66 -0
  25. package/dist/cli/commands/tui.js.map +7 -0
  26. package/dist/cli/commands/workflow.js +134 -0
  27. package/dist/cli/commands/workflow.js.map +7 -0
  28. package/dist/cli/index.js +104 -8
  29. package/dist/cli/index.js.map +3 -3
  30. package/dist/core/analytics/team-analytics.js +374 -0
  31. package/dist/core/analytics/team-analytics.js.map +7 -0
  32. package/dist/core/context/context-bridge.js +234 -0
  33. package/dist/core/context/context-bridge.js.map +7 -0
  34. package/dist/core/context/dual-stack-manager.js +850 -0
  35. package/dist/core/context/dual-stack-manager.js.map +7 -0
  36. package/dist/core/context/frame-handoff-manager.js +384 -0
  37. package/dist/core/context/frame-handoff-manager.js.map +7 -0
  38. package/dist/core/context/frame-manager.js +132 -12
  39. package/dist/core/context/frame-manager.js.map +2 -2
  40. package/dist/core/context/permission-manager.js +181 -0
  41. package/dist/core/context/permission-manager.js.map +7 -0
  42. package/dist/core/context/shared-context-layer.js +386 -0
  43. package/dist/core/context/shared-context-layer.js.map +7 -0
  44. package/dist/core/context/stack-merge-resolver.js +600 -0
  45. package/dist/core/context/stack-merge-resolver.js.map +7 -0
  46. package/dist/core/context/validation.js +121 -0
  47. package/dist/core/context/validation.js.map +7 -0
  48. package/dist/core/database/connection-pool.js +266 -175
  49. package/dist/core/database/connection-pool.js.map +2 -2
  50. package/dist/core/database/database-adapter.js +51 -0
  51. package/dist/core/database/database-adapter.js.map +7 -0
  52. package/dist/core/database/migration-manager.js +514 -0
  53. package/dist/core/database/migration-manager.js.map +7 -0
  54. package/dist/core/database/paradedb-adapter.js +970 -0
  55. package/dist/core/database/paradedb-adapter.js.map +7 -0
  56. package/dist/core/database/query-router.js +421 -0
  57. package/dist/core/database/query-router.js.map +7 -0
  58. package/dist/core/database/sqlite-adapter.js +547 -0
  59. package/dist/core/database/sqlite-adapter.js.map +7 -0
  60. package/dist/core/errors/index.js +21 -1
  61. package/dist/core/errors/index.js.map +2 -2
  62. package/dist/core/frame/workflow-templates-stub.js +42 -0
  63. package/dist/core/frame/workflow-templates-stub.js.map +7 -0
  64. package/dist/core/frame/workflow-templates.js +276 -0
  65. package/dist/core/frame/workflow-templates.js.map +7 -0
  66. package/dist/core/merge/conflict-detector.js +5 -2
  67. package/dist/core/merge/conflict-detector.js.map +2 -2
  68. package/dist/core/merge/resolution-engine.js +3 -14
  69. package/dist/core/merge/resolution-engine.js.map +2 -2
  70. package/dist/core/merge/stack-diff.js.map +2 -2
  71. package/dist/core/monitoring/logger.js +18 -3
  72. package/dist/core/monitoring/logger.js.map +2 -2
  73. package/dist/core/monitoring/session-monitor.js +296 -0
  74. package/dist/core/monitoring/session-monitor.js.map +7 -0
  75. package/dist/core/retrieval/context-retriever.js +475 -0
  76. package/dist/core/retrieval/context-retriever.js.map +7 -0
  77. package/dist/core/retrieval/graph-retrieval.js +658 -0
  78. package/dist/core/retrieval/graph-retrieval.js.map +7 -0
  79. package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
  80. package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
  81. package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
  82. package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
  83. package/dist/core/session/clear-survival-stub.js +49 -0
  84. package/dist/core/session/clear-survival-stub.js.map +7 -0
  85. package/dist/core/session/clear-survival.js +426 -0
  86. package/dist/core/session/clear-survival.js.map +7 -0
  87. package/dist/core/session/handoff-generator.js +339 -0
  88. package/dist/core/session/handoff-generator.js.map +7 -0
  89. package/dist/core/session/session-manager.js +61 -26
  90. package/dist/core/session/session-manager.js.map +3 -3
  91. package/dist/core/skills/index.js +3 -0
  92. package/dist/core/skills/index.js.map +7 -0
  93. package/dist/core/skills/skill-storage.js +749 -0
  94. package/dist/core/skills/skill-storage.js.map +7 -0
  95. package/dist/core/skills/types.js +189 -0
  96. package/dist/core/skills/types.js.map +7 -0
  97. package/dist/core/storage/railway-optimized-storage.js +550 -0
  98. package/dist/core/storage/railway-optimized-storage.js.map +7 -0
  99. package/dist/core/storage/remote-storage.js +456 -0
  100. package/dist/core/storage/remote-storage.js.map +7 -0
  101. package/dist/core/trace/trace-detector.js +136 -5
  102. package/dist/core/trace/trace-detector.js.map +2 -2
  103. package/dist/core/trace/trace-store.js.map +2 -2
  104. package/dist/features/tui/components/analytics-panel.js +136 -0
  105. package/dist/features/tui/components/analytics-panel.js.map +7 -0
  106. package/dist/features/tui/components/frame-visualizer.js +377 -0
  107. package/dist/features/tui/components/frame-visualizer.js.map +7 -0
  108. package/dist/features/tui/components/pr-tracker.js +123 -0
  109. package/dist/features/tui/components/pr-tracker.js.map +7 -0
  110. package/dist/features/tui/components/session-monitor.js +286 -0
  111. package/dist/features/tui/components/session-monitor.js.map +7 -0
  112. package/dist/features/tui/components/subagent-fleet.js +388 -0
  113. package/dist/features/tui/components/subagent-fleet.js.map +7 -0
  114. package/dist/features/tui/components/task-board.js +475 -0
  115. package/dist/features/tui/components/task-board.js.map +7 -0
  116. package/dist/features/tui/index.js +397 -0
  117. package/dist/features/tui/index.js.map +7 -0
  118. package/dist/features/tui/services/data-service.js +654 -0
  119. package/dist/features/tui/services/data-service.js.map +7 -0
  120. package/dist/features/tui/services/websocket-client.js +149 -0
  121. package/dist/features/tui/services/websocket-client.js.map +7 -0
  122. package/dist/features/tui/terminal-compat.js +205 -0
  123. package/dist/features/tui/terminal-compat.js.map +7 -0
  124. package/dist/features/tui/types.js +1 -0
  125. package/dist/features/tui/types.js.map +7 -0
  126. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
  127. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  128. package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
  129. package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  130. package/dist/integrations/claude-code/post-task-hooks.js +541 -0
  131. package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
  132. package/dist/integrations/linear/client.js +22 -4
  133. package/dist/integrations/linear/client.js.map +2 -2
  134. package/dist/integrations/linear/migration.js +299 -0
  135. package/dist/integrations/linear/migration.js.map +7 -0
  136. package/dist/integrations/linear/oauth-server.js +396 -0
  137. package/dist/integrations/linear/oauth-server.js.map +7 -0
  138. package/dist/integrations/linear/rest-client.js +199 -0
  139. package/dist/integrations/linear/rest-client.js.map +7 -0
  140. package/dist/integrations/linear/sync.js +14 -2
  141. package/dist/integrations/linear/sync.js.map +2 -2
  142. package/dist/integrations/linear/webhook-handler.js +200 -0
  143. package/dist/integrations/linear/webhook-handler.js.map +7 -0
  144. package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
  145. package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  146. package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
  147. package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  148. package/dist/integrations/mcp/refactored-server.js +31 -3
  149. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  150. package/dist/integrations/mcp/server.js +25 -7
  151. package/dist/integrations/mcp/server.js.map +2 -2
  152. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  153. package/dist/models/user.model.js +3 -0
  154. package/dist/models/user.model.js.map +2 -2
  155. package/dist/services/context-service.js.map +2 -2
  156. package/dist/utils/formatting.js +58 -0
  157. package/dist/utils/formatting.js.map +7 -0
  158. package/package.json +21 -5
  159. package/dist/cli/__tests__/index.test.js +0 -290
  160. package/dist/cli/__tests__/index.test.js.map +0 -7
  161. package/dist/core/config/__tests__/config-manager.test.js +0 -248
  162. package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
  163. package/dist/core/context/__tests__/frame-manager.test.js +0 -879
  164. package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
  165. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
  166. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
  167. package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
  168. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
  169. package/dist/core/errors/__tests__/error-handling.test.js +0 -270
  170. package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
  171. package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
  172. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
  173. package/dist/core/query/__tests__/query-parser.test.js +0 -301
  174. package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
  175. package/dist/core/query/__tests__/query-templates.test.js +0 -210
  176. package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
  177. package/dist/core/trace/trace-detector.test.js +0 -401
  178. package/dist/core/trace/trace-detector.test.js.map +0 -7
  179. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
  180. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
  181. package/dist/integrations/linear/__tests__/auth.test.js +0 -558
  182. package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
  183. package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
  184. package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
  185. package/dist/integrations/mcp/__tests__/server.test.js +0 -798
  186. package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
  187. package/dist/scripts/benchmark-performance.d.ts +0 -7
  188. package/dist/scripts/benchmark-performance.d.ts.map +0 -1
  189. package/dist/scripts/benchmark-performance.js +0 -44
  190. package/dist/scripts/benchmark-performance.js.map +0 -1
  191. package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
  192. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
  193. package/dist/scripts/cancel-duplicate-tasks.js +0 -172
  194. package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
  195. package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
  196. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
  197. package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
  198. package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
  199. package/dist/scripts/initialize.d.ts +0 -6
  200. package/dist/scripts/initialize.d.ts.map +0 -1
  201. package/dist/scripts/initialize.js +0 -93
  202. package/dist/scripts/initialize.js.map +0 -1
  203. package/dist/scripts/list-linear-tasks.d.ts +0 -6
  204. package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
  205. package/dist/scripts/list-linear-tasks.js +0 -121
  206. package/dist/scripts/list-linear-tasks.js.map +0 -1
  207. package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
  208. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
  209. package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
  210. package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
  211. package/dist/scripts/show-linear-summary.d.ts +0 -6
  212. package/dist/scripts/show-linear-summary.d.ts.map +0 -1
  213. package/dist/scripts/show-linear-summary.js +0 -120
  214. package/dist/scripts/show-linear-summary.js.map +0 -1
  215. package/dist/scripts/status.d.ts +0 -6
  216. package/dist/scripts/status.d.ts.map +0 -1
  217. package/dist/scripts/status.js +0 -101
  218. package/dist/scripts/status.js.map +0 -1
  219. package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
  220. package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
  221. package/dist/src/agents/core/agent-task-manager.js +0 -504
  222. package/dist/src/agents/core/agent-task-manager.js.map +0 -1
  223. package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
  224. package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
  225. package/dist/src/agents/verifiers/base-verifier.js +0 -130
  226. package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
  227. package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
  228. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
  229. package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
  230. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
  231. package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
  232. package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
  233. package/dist/src/agents/verifiers/llm-judge.js +0 -248
  234. package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
  235. package/dist/src/cli/auto-detect.d.ts +0 -61
  236. package/dist/src/cli/auto-detect.d.ts.map +0 -1
  237. package/dist/src/cli/auto-detect.js +0 -350
  238. package/dist/src/cli/auto-detect.js.map +0 -1
  239. package/dist/src/cli/browser-test.d.ts +0 -6
  240. package/dist/src/cli/browser-test.d.ts.map +0 -1
  241. package/dist/src/cli/browser-test.js +0 -32
  242. package/dist/src/cli/browser-test.js.map +0 -1
  243. package/dist/src/cli/claude-sm.d.ts +0 -7
  244. package/dist/src/cli/claude-sm.d.ts.map +0 -1
  245. package/dist/src/cli/claude-sm.js +0 -412
  246. package/dist/src/cli/claude-sm.js.map +0 -1
  247. package/dist/src/cli/commands/agent.d.ts +0 -9
  248. package/dist/src/cli/commands/agent.d.ts.map +0 -1
  249. package/dist/src/cli/commands/agent.js +0 -303
  250. package/dist/src/cli/commands/agent.js.map +0 -1
  251. package/dist/src/cli/commands/config.d.ts +0 -6
  252. package/dist/src/cli/commands/config.d.ts.map +0 -1
  253. package/dist/src/cli/commands/config.js +0 -224
  254. package/dist/src/cli/commands/config.js.map +0 -1
  255. package/dist/src/cli/commands/context.d.ts +0 -7
  256. package/dist/src/cli/commands/context.d.ts.map +0 -1
  257. package/dist/src/cli/commands/context.js +0 -365
  258. package/dist/src/cli/commands/context.js.map +0 -1
  259. package/dist/src/cli/commands/handoff.d.ts +0 -6
  260. package/dist/src/cli/commands/handoff.d.ts.map +0 -1
  261. package/dist/src/cli/commands/handoff.js +0 -212
  262. package/dist/src/cli/commands/handoff.js.map +0 -1
  263. package/dist/src/cli/commands/linear-test.d.ts +0 -6
  264. package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
  265. package/dist/src/cli/commands/linear-test.js +0 -123
  266. package/dist/src/cli/commands/linear-test.js.map +0 -1
  267. package/dist/src/cli/commands/linear.d.ts +0 -6
  268. package/dist/src/cli/commands/linear.d.ts.map +0 -1
  269. package/dist/src/cli/commands/linear.js +0 -393
  270. package/dist/src/cli/commands/linear.js.map +0 -1
  271. package/dist/src/cli/commands/log.d.ts +0 -7
  272. package/dist/src/cli/commands/log.d.ts.map +0 -1
  273. package/dist/src/cli/commands/log.js +0 -168
  274. package/dist/src/cli/commands/log.js.map +0 -1
  275. package/dist/src/cli/commands/onboard.d.ts +0 -8
  276. package/dist/src/cli/commands/onboard.d.ts.map +0 -1
  277. package/dist/src/cli/commands/onboard.js +0 -363
  278. package/dist/src/cli/commands/onboard.js.map +0 -1
  279. package/dist/src/cli/commands/projects.d.ts +0 -8
  280. package/dist/src/cli/commands/projects.d.ts.map +0 -1
  281. package/dist/src/cli/commands/projects.js +0 -220
  282. package/dist/src/cli/commands/projects.js.map +0 -1
  283. package/dist/src/cli/commands/search.d.ts +0 -7
  284. package/dist/src/cli/commands/search.d.ts.map +0 -1
  285. package/dist/src/cli/commands/search.js +0 -162
  286. package/dist/src/cli/commands/search.js.map +0 -1
  287. package/dist/src/cli/commands/session.d.ts +0 -7
  288. package/dist/src/cli/commands/session.d.ts.map +0 -1
  289. package/dist/src/cli/commands/session.js +0 -222
  290. package/dist/src/cli/commands/session.js.map +0 -1
  291. package/dist/src/cli/commands/tasks.d.ts +0 -7
  292. package/dist/src/cli/commands/tasks.d.ts.map +0 -1
  293. package/dist/src/cli/commands/tasks.js +0 -229
  294. package/dist/src/cli/commands/tasks.js.map +0 -1
  295. package/dist/src/cli/commands/webhook.d.ts +0 -3
  296. package/dist/src/cli/commands/webhook.d.ts.map +0 -1
  297. package/dist/src/cli/commands/webhook.js +0 -157
  298. package/dist/src/cli/commands/webhook.js.map +0 -1
  299. package/dist/src/cli/commands/worktree.d.ts +0 -8
  300. package/dist/src/cli/commands/worktree.d.ts.map +0 -1
  301. package/dist/src/cli/commands/worktree.js +0 -339
  302. package/dist/src/cli/commands/worktree.js.map +0 -1
  303. package/dist/src/cli/index.d.ts +0 -8
  304. package/dist/src/cli/index.d.ts.map +0 -1
  305. package/dist/src/cli/index.js +0 -995
  306. package/dist/src/cli/index.js.map +0 -1
  307. package/dist/src/cli/utils/viewer.d.ts +0 -3
  308. package/dist/src/cli/utils/viewer.d.ts.map +0 -1
  309. package/dist/src/cli/utils/viewer.js +0 -91
  310. package/dist/src/cli/utils/viewer.js.map +0 -1
  311. package/dist/src/core/config/config-manager.d.ts +0 -95
  312. package/dist/src/core/config/config-manager.d.ts.map +0 -1
  313. package/dist/src/core/config/config-manager.js +0 -359
  314. package/dist/src/core/config/config-manager.js.map +0 -1
  315. package/dist/src/core/config/types.d.ts +0 -72
  316. package/dist/src/core/config/types.d.ts.map +0 -1
  317. package/dist/src/core/config/types.js +0 -127
  318. package/dist/src/core/config/types.js.map +0 -1
  319. package/dist/src/core/context/auto-context.d.ts +0 -22
  320. package/dist/src/core/context/auto-context.d.ts.map +0 -1
  321. package/dist/src/core/context/auto-context.js +0 -77
  322. package/dist/src/core/context/auto-context.js.map +0 -1
  323. package/dist/src/core/context/compaction-handler.d.ts +0 -119
  324. package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
  325. package/dist/src/core/context/compaction-handler.js +0 -306
  326. package/dist/src/core/context/compaction-handler.js.map +0 -1
  327. package/dist/src/core/context/frame-database.d.ts +0 -59
  328. package/dist/src/core/context/frame-database.d.ts.map +0 -1
  329. package/dist/src/core/context/frame-database.js +0 -333
  330. package/dist/src/core/context/frame-database.js.map +0 -1
  331. package/dist/src/core/context/frame-digest.d.ts +0 -59
  332. package/dist/src/core/context/frame-digest.d.ts.map +0 -1
  333. package/dist/src/core/context/frame-digest.js +0 -264
  334. package/dist/src/core/context/frame-digest.js.map +0 -1
  335. package/dist/src/core/context/frame-manager.d.ts +0 -112
  336. package/dist/src/core/context/frame-manager.d.ts.map +0 -1
  337. package/dist/src/core/context/frame-manager.js +0 -600
  338. package/dist/src/core/context/frame-manager.js.map +0 -1
  339. package/dist/src/core/context/frame-stack.d.ts +0 -85
  340. package/dist/src/core/context/frame-stack.d.ts.map +0 -1
  341. package/dist/src/core/context/frame-stack.js +0 -287
  342. package/dist/src/core/context/frame-stack.js.map +0 -1
  343. package/dist/src/core/context/frame-types.d.ts +0 -67
  344. package/dist/src/core/context/frame-types.d.ts.map +0 -1
  345. package/dist/src/core/context/frame-types.js +0 -6
  346. package/dist/src/core/context/frame-types.js.map +0 -1
  347. package/dist/src/core/context/index.d.ts +0 -11
  348. package/dist/src/core/context/index.d.ts.map +0 -1
  349. package/dist/src/core/context/index.js +0 -14
  350. package/dist/src/core/context/index.js.map +0 -1
  351. package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
  352. package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
  353. package/dist/src/core/context/model-aware-compaction.js +0 -616
  354. package/dist/src/core/context/model-aware-compaction.js.map +0 -1
  355. package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
  356. package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
  357. package/dist/src/core/context/refactored-frame-manager.js +0 -340
  358. package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
  359. package/dist/src/core/database/batch-operations.d.ts +0 -118
  360. package/dist/src/core/database/batch-operations.d.ts.map +0 -1
  361. package/dist/src/core/database/batch-operations.js +0 -339
  362. package/dist/src/core/database/batch-operations.js.map +0 -1
  363. package/dist/src/core/database/connection-pool.d.ts +0 -79
  364. package/dist/src/core/database/connection-pool.d.ts.map +0 -1
  365. package/dist/src/core/database/connection-pool.js +0 -236
  366. package/dist/src/core/database/connection-pool.js.map +0 -1
  367. package/dist/src/core/database/query-cache.d.ts +0 -135
  368. package/dist/src/core/database/query-cache.d.ts.map +0 -1
  369. package/dist/src/core/database/query-cache.js +0 -294
  370. package/dist/src/core/database/query-cache.js.map +0 -1
  371. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
  372. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
  373. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
  374. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
  375. package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
  376. package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
  377. package/dist/src/core/digest/frame-digest-integration.js +0 -198
  378. package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
  379. package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
  380. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
  381. package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
  382. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
  383. package/dist/src/core/digest/index.d.ts +0 -9
  384. package/dist/src/core/digest/index.d.ts.map +0 -1
  385. package/dist/src/core/digest/index.js +0 -9
  386. package/dist/src/core/digest/index.js.map +0 -1
  387. package/dist/src/core/digest/types.d.ts +0 -154
  388. package/dist/src/core/digest/types.d.ts.map +0 -1
  389. package/dist/src/core/digest/types.js +0 -18
  390. package/dist/src/core/digest/types.js.map +0 -1
  391. package/dist/src/core/errors/index.d.ts +0 -143
  392. package/dist/src/core/errors/index.d.ts.map +0 -1
  393. package/dist/src/core/errors/index.js +0 -282
  394. package/dist/src/core/errors/index.js.map +0 -1
  395. package/dist/src/core/errors/recovery.d.ts +0 -86
  396. package/dist/src/core/errors/recovery.d.ts.map +0 -1
  397. package/dist/src/core/errors/recovery.js +0 -274
  398. package/dist/src/core/errors/recovery.js.map +0 -1
  399. package/dist/src/core/merge/conflict-detector.d.ts +0 -122
  400. package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
  401. package/dist/src/core/merge/conflict-detector.js +0 -468
  402. package/dist/src/core/merge/conflict-detector.js.map +0 -1
  403. package/dist/src/core/merge/index.d.ts +0 -9
  404. package/dist/src/core/merge/index.d.ts.map +0 -1
  405. package/dist/src/core/merge/index.js +0 -9
  406. package/dist/src/core/merge/index.js.map +0 -1
  407. package/dist/src/core/merge/resolution-engine.d.ts +0 -120
  408. package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
  409. package/dist/src/core/merge/resolution-engine.js +0 -573
  410. package/dist/src/core/merge/resolution-engine.js.map +0 -1
  411. package/dist/src/core/merge/stack-diff.d.ts +0 -97
  412. package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
  413. package/dist/src/core/merge/stack-diff.js +0 -516
  414. package/dist/src/core/merge/stack-diff.js.map +0 -1
  415. package/dist/src/core/merge/types.d.ts +0 -110
  416. package/dist/src/core/merge/types.d.ts.map +0 -1
  417. package/dist/src/core/merge/types.js +0 -6
  418. package/dist/src/core/merge/types.js.map +0 -1
  419. package/dist/src/core/monitoring/error-handler.d.ts +0 -46
  420. package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
  421. package/dist/src/core/monitoring/error-handler.js +0 -212
  422. package/dist/src/core/monitoring/error-handler.js.map +0 -1
  423. package/dist/src/core/monitoring/logger.d.ts +0 -24
  424. package/dist/src/core/monitoring/logger.d.ts.map +0 -1
  425. package/dist/src/core/monitoring/logger.js +0 -126
  426. package/dist/src/core/monitoring/logger.js.map +0 -1
  427. package/dist/src/core/monitoring/metrics.d.ts +0 -10
  428. package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
  429. package/dist/src/core/monitoring/metrics.js +0 -152
  430. package/dist/src/core/monitoring/metrics.js.map +0 -1
  431. package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
  432. package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
  433. package/dist/src/core/monitoring/progress-tracker.js +0 -178
  434. package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
  435. package/dist/src/core/performance/context-cache.d.ts +0 -109
  436. package/dist/src/core/performance/context-cache.d.ts.map +0 -1
  437. package/dist/src/core/performance/context-cache.js +0 -280
  438. package/dist/src/core/performance/context-cache.js.map +0 -1
  439. package/dist/src/core/performance/index.d.ts +0 -3
  440. package/dist/src/core/performance/index.d.ts.map +0 -1
  441. package/dist/src/core/performance/index.js +0 -3
  442. package/dist/src/core/performance/index.js.map +0 -1
  443. package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
  444. package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
  445. package/dist/src/core/performance/lazy-context-loader.js +0 -332
  446. package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
  447. package/dist/src/core/performance/monitor.d.ts +0 -48
  448. package/dist/src/core/performance/monitor.d.ts.map +0 -1
  449. package/dist/src/core/performance/monitor.js +0 -226
  450. package/dist/src/core/performance/monitor.js.map +0 -1
  451. package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
  452. package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
  453. package/dist/src/core/performance/optimized-frame-context.js +0 -330
  454. package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
  455. package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
  456. package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
  457. package/dist/src/core/performance/performance-benchmark.js +0 -290
  458. package/dist/src/core/performance/performance-benchmark.js.map +0 -1
  459. package/dist/src/core/performance/performance-profiler.d.ts +0 -151
  460. package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
  461. package/dist/src/core/performance/performance-profiler.js +0 -346
  462. package/dist/src/core/performance/performance-profiler.js.map +0 -1
  463. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
  464. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
  465. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
  466. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
  467. package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
  468. package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
  469. package/dist/src/core/persistence/postgres-adapter.js +0 -330
  470. package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
  471. package/dist/src/core/projects/project-manager.d.ts +0 -130
  472. package/dist/src/core/projects/project-manager.d.ts.map +0 -1
  473. package/dist/src/core/projects/project-manager.js +0 -709
  474. package/dist/src/core/projects/project-manager.js.map +0 -1
  475. package/dist/src/core/query/query-parser.d.ts +0 -109
  476. package/dist/src/core/query/query-parser.d.ts.map +0 -1
  477. package/dist/src/core/query/query-parser.js +0 -415
  478. package/dist/src/core/query/query-parser.js.map +0 -1
  479. package/dist/src/core/query/query-templates.d.ts +0 -44
  480. package/dist/src/core/query/query-templates.d.ts.map +0 -1
  481. package/dist/src/core/query/query-templates.js +0 -326
  482. package/dist/src/core/query/query-templates.js.map +0 -1
  483. package/dist/src/core/retrieval/index.d.ts +0 -8
  484. package/dist/src/core/retrieval/index.d.ts.map +0 -1
  485. package/dist/src/core/retrieval/index.js +0 -8
  486. package/dist/src/core/retrieval/index.js.map +0 -1
  487. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
  488. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
  489. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
  490. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
  491. package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
  492. package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
  493. package/dist/src/core/retrieval/summary-generator.js +0 -622
  494. package/dist/src/core/retrieval/summary-generator.js.map +0 -1
  495. package/dist/src/core/retrieval/types.d.ts +0 -257
  496. package/dist/src/core/retrieval/types.d.ts.map +0 -1
  497. package/dist/src/core/retrieval/types.js +0 -18
  498. package/dist/src/core/retrieval/types.js.map +0 -1
  499. package/dist/src/core/session/index.d.ts +0 -2
  500. package/dist/src/core/session/index.d.ts.map +0 -1
  501. package/dist/src/core/session/index.js +0 -2
  502. package/dist/src/core/session/index.js.map +0 -1
  503. package/dist/src/core/session/session-manager.d.ts +0 -69
  504. package/dist/src/core/session/session-manager.d.ts.map +0 -1
  505. package/dist/src/core/session/session-manager.js +0 -311
  506. package/dist/src/core/session/session-manager.js.map +0 -1
  507. package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
  508. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
  509. package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
  510. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
  511. package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
  512. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
  513. package/dist/src/core/trace/db-trace-wrapper.js +0 -252
  514. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
  515. package/dist/src/core/trace/debug-trace.d.ts +0 -84
  516. package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
  517. package/dist/src/core/trace/debug-trace.js +0 -402
  518. package/dist/src/core/trace/debug-trace.js.map +0 -1
  519. package/dist/src/core/trace/error-test.d.ts +0 -6
  520. package/dist/src/core/trace/error-test.d.ts.map +0 -1
  521. package/dist/src/core/trace/error-test.js +0 -128
  522. package/dist/src/core/trace/error-test.js.map +0 -1
  523. package/dist/src/core/trace/index.d.ts +0 -25
  524. package/dist/src/core/trace/index.d.ts.map +0 -1
  525. package/dist/src/core/trace/index.js +0 -121
  526. package/dist/src/core/trace/index.js.map +0 -1
  527. package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
  528. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
  529. package/dist/src/core/trace/linear-api-wrapper.js +0 -205
  530. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
  531. package/dist/src/core/trace/performance-test.d.ts +0 -6
  532. package/dist/src/core/trace/performance-test.d.ts.map +0 -1
  533. package/dist/src/core/trace/performance-test.js +0 -111
  534. package/dist/src/core/trace/performance-test.js.map +0 -1
  535. package/dist/src/core/trace/trace-demo.d.ts +0 -8
  536. package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
  537. package/dist/src/core/trace/trace-demo.js +0 -154
  538. package/dist/src/core/trace/trace-demo.js.map +0 -1
  539. package/dist/src/core/trace/trace-detector.d.ts +0 -108
  540. package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
  541. package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
  542. package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
  543. package/dist/src/core/trace/trace-detector.demo.js +0 -145
  544. package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
  545. package/dist/src/core/trace/trace-detector.js +0 -425
  546. package/dist/src/core/trace/trace-detector.js.map +0 -1
  547. package/dist/src/core/trace/trace-store.d.ts +0 -60
  548. package/dist/src/core/trace/trace-store.d.ts.map +0 -1
  549. package/dist/src/core/trace/trace-store.js +0 -323
  550. package/dist/src/core/trace/trace-store.js.map +0 -1
  551. package/dist/src/core/trace/types.d.ts +0 -81
  552. package/dist/src/core/trace/types.d.ts.map +0 -1
  553. package/dist/src/core/trace/types.js +0 -70
  554. package/dist/src/core/trace/types.js.map +0 -1
  555. package/dist/src/core/types.d.ts +0 -35
  556. package/dist/src/core/types.d.ts.map +0 -1
  557. package/dist/src/core/types.js +0 -2
  558. package/dist/src/core/types.js.map +0 -1
  559. package/dist/src/core/utils/update-checker.d.ts +0 -38
  560. package/dist/src/core/utils/update-checker.d.ts.map +0 -1
  561. package/dist/src/core/utils/update-checker.js +0 -213
  562. package/dist/src/core/utils/update-checker.js.map +0 -1
  563. package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
  564. package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
  565. package/dist/src/core/worktree/worktree-manager.js +0 -456
  566. package/dist/src/core/worktree/worktree-manager.js.map +0 -1
  567. package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
  568. package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
  569. package/dist/src/features/analytics/api/analytics-api.js +0 -289
  570. package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
  571. package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
  572. package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
  573. package/dist/src/features/analytics/core/analytics-service.js +0 -275
  574. package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
  575. package/dist/src/features/analytics/index.d.ts +0 -12
  576. package/dist/src/features/analytics/index.d.ts.map +0 -1
  577. package/dist/src/features/analytics/index.js +0 -11
  578. package/dist/src/features/analytics/index.js.map +0 -1
  579. package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
  580. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
  581. package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
  582. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
  583. package/dist/src/features/analytics/types/metrics.d.ts +0 -60
  584. package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
  585. package/dist/src/features/analytics/types/metrics.js +0 -2
  586. package/dist/src/features/analytics/types/metrics.js.map +0 -1
  587. package/dist/src/features/browser/browser-mcp.d.ts +0 -94
  588. package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
  589. package/dist/src/features/browser/browser-mcp.js +0 -459
  590. package/dist/src/features/browser/browser-mcp.js.map +0 -1
  591. package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
  592. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
  593. package/dist/src/features/tasks/pebbles-task-store.js +0 -572
  594. package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
  595. package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
  596. package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
  597. package/dist/src/features/tasks/task-aware-context.js +0 -412
  598. package/dist/src/features/tasks/task-aware-context.js.map +0 -1
  599. package/dist/src/index.d.ts +0 -21
  600. package/dist/src/index.d.ts.map +0 -1
  601. package/dist/src/index.js +0 -9
  602. package/dist/src/index.js.map +0 -1
  603. package/dist/src/integrations/linear/auth.d.ts +0 -99
  604. package/dist/src/integrations/linear/auth.d.ts.map +0 -1
  605. package/dist/src/integrations/linear/auth.js +0 -319
  606. package/dist/src/integrations/linear/auth.js.map +0 -1
  607. package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
  608. package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
  609. package/dist/src/integrations/linear/auto-sync.js +0 -268
  610. package/dist/src/integrations/linear/auto-sync.js.map +0 -1
  611. package/dist/src/integrations/linear/client.d.ts +0 -127
  612. package/dist/src/integrations/linear/client.d.ts.map +0 -1
  613. package/dist/src/integrations/linear/client.js +0 -446
  614. package/dist/src/integrations/linear/client.js.map +0 -1
  615. package/dist/src/integrations/linear/config.d.ts +0 -51
  616. package/dist/src/integrations/linear/config.d.ts.map +0 -1
  617. package/dist/src/integrations/linear/config.js +0 -103
  618. package/dist/src/integrations/linear/config.js.map +0 -1
  619. package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
  620. package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
  621. package/dist/src/integrations/linear/sync-manager.js +0 -235
  622. package/dist/src/integrations/linear/sync-manager.js.map +0 -1
  623. package/dist/src/integrations/linear/sync-service.d.ts +0 -46
  624. package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
  625. package/dist/src/integrations/linear/sync-service.js +0 -217
  626. package/dist/src/integrations/linear/sync-service.js.map +0 -1
  627. package/dist/src/integrations/linear/sync.d.ts +0 -125
  628. package/dist/src/integrations/linear/sync.d.ts.map +0 -1
  629. package/dist/src/integrations/linear/sync.js +0 -563
  630. package/dist/src/integrations/linear/sync.js.map +0 -1
  631. package/dist/src/integrations/linear/types.d.ts +0 -90
  632. package/dist/src/integrations/linear/types.d.ts.map +0 -1
  633. package/dist/src/integrations/linear/types.js +0 -2
  634. package/dist/src/integrations/linear/types.js.map +0 -1
  635. package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
  636. package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
  637. package/dist/src/integrations/linear/webhook-server.js +0 -190
  638. package/dist/src/integrations/linear/webhook-server.js.map +0 -1
  639. package/dist/src/integrations/linear/webhook.d.ts +0 -108
  640. package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
  641. package/dist/src/integrations/linear/webhook.js +0 -291
  642. package/dist/src/integrations/linear/webhook.js.map +0 -1
  643. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
  644. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
  645. package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
  646. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
  647. package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
  648. package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
  649. package/dist/src/integrations/mcp/handlers/index.js +0 -134
  650. package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
  651. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
  652. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
  653. package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
  654. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
  655. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
  656. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
  657. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
  658. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
  659. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
  660. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
  661. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
  662. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
  663. package/dist/src/integrations/mcp/index.d.ts +0 -13
  664. package/dist/src/integrations/mcp/index.d.ts.map +0 -1
  665. package/dist/src/integrations/mcp/index.js +0 -17
  666. package/dist/src/integrations/mcp/index.js.map +0 -1
  667. package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
  668. package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
  669. package/dist/src/integrations/mcp/refactored-server.js +0 -351
  670. package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
  671. package/dist/src/integrations/mcp/server.d.ts +0 -54
  672. package/dist/src/integrations/mcp/server.d.ts.map +0 -1
  673. package/dist/src/integrations/mcp/server.js +0 -1616
  674. package/dist/src/integrations/mcp/server.js.map +0 -1
  675. package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
  676. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
  677. package/dist/src/integrations/mcp/tool-definitions.js +0 -563
  678. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
  679. package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
  680. package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
  681. package/dist/src/integrations/mcp/trace-test.js +0 -54
  682. package/dist/src/integrations/mcp/trace-test.js.map +0 -1
  683. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
  684. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
  685. package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
  686. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
  687. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
  688. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
  689. package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
  690. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
  691. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
  692. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
  693. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
  694. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
  695. package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
  696. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
  697. package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
  698. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
  699. package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
  700. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
  701. package/dist/src/middleware/exponential-rate-limiter.js +0 -293
  702. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
  703. package/dist/src/models/user.model.d.ts +0 -62
  704. package/dist/src/models/user.model.d.ts.map +0 -1
  705. package/dist/src/models/user.model.js +0 -311
  706. package/dist/src/models/user.model.js.map +0 -1
  707. package/dist/src/servers/production/auth-middleware.d.ts +0 -76
  708. package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
  709. package/dist/src/servers/production/auth-middleware.js +0 -558
  710. package/dist/src/servers/production/auth-middleware.js.map +0 -1
  711. package/dist/src/servers/railway/index.d.ts +0 -7
  712. package/dist/src/servers/railway/index.d.ts.map +0 -1
  713. package/dist/src/servers/railway/index.js +0 -401
  714. package/dist/src/servers/railway/index.js.map +0 -1
  715. package/dist/src/services/config-service.d.ts +0 -44
  716. package/dist/src/services/config-service.d.ts.map +0 -1
  717. package/dist/src/services/config-service.js +0 -61
  718. package/dist/src/services/config-service.js.map +0 -1
  719. package/dist/src/services/context-service.d.ts +0 -17
  720. package/dist/src/services/context-service.d.ts.map +0 -1
  721. package/dist/src/services/context-service.js +0 -173
  722. package/dist/src/services/context-service.js.map +0 -1
  723. package/dist/src/types/task.d.ts +0 -27
  724. package/dist/src/types/task.d.ts.map +0 -1
  725. package/dist/src/types/task.js +0 -2
  726. package/dist/src/types/task.js.map +0 -1
  727. package/dist/src/utils/logger.d.ts +0 -13
  728. package/dist/src/utils/logger.d.ts.map +0 -1
  729. package/dist/src/utils/logger.js +0 -52
  730. package/dist/src/utils/logger.js.map +0 -1
  731. package/dist/src/validation/schemas.d.ts +0 -633
  732. package/dist/src/validation/schemas.d.ts.map +0 -1
  733. package/dist/src/validation/schemas.js +0 -347
  734. package/dist/src/validation/schemas.js.map +0 -1
@@ -1,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;
@@ -29,6 +29,18 @@ class FrameManager {
29
29
  }
30
30
  this.initializeSchema();
31
31
  this.loadActiveStack();
32
+ if (process.env.NODE_ENV !== "test" && !process.env.VITEST) {
33
+ contextBridge.initialize(this, {
34
+ autoSync: true,
35
+ syncInterval: 6e4,
36
+ // 1 minute
37
+ minFrameScore: 0.5,
38
+ // Sync frames above 0.5 score
39
+ importantTags: ["decision", "error", "milestone", "learning"]
40
+ }).catch((error) => {
41
+ logger.warn("Failed to initialize context bridge", { error });
42
+ });
43
+ }
32
44
  }
33
45
  setQueryMode(mode) {
34
46
  this.queryMode = mode;
@@ -82,12 +94,26 @@ class FrameManager {
82
94
  FOREIGN KEY(frame_id) REFERENCES frames(frame_id)
83
95
  );
84
96
 
97
+ CREATE TABLE IF NOT EXISTS handoff_requests (
98
+ request_id TEXT PRIMARY KEY,
99
+ source_stack_id TEXT NOT NULL,
100
+ target_stack_id TEXT NOT NULL,
101
+ frame_ids TEXT NOT NULL,
102
+ status TEXT NOT NULL DEFAULT 'pending',
103
+ created_at INTEGER DEFAULT (unixepoch()),
104
+ expires_at INTEGER,
105
+ target_user_id TEXT,
106
+ message TEXT
107
+ );
108
+
85
109
  CREATE INDEX IF NOT EXISTS idx_frames_run ON frames(run_id);
86
110
  CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);
87
111
  CREATE INDEX IF NOT EXISTS idx_frames_state ON frames(state);
88
112
  CREATE INDEX IF NOT EXISTS idx_events_frame ON events(frame_id);
89
113
  CREATE INDEX IF NOT EXISTS idx_events_seq ON events(frame_id, seq);
90
114
  CREATE INDEX IF NOT EXISTS idx_anchors_frame ON anchors(frame_id);
115
+ CREATE INDEX IF NOT EXISTS idx_handoff_requests_status ON handoff_requests(status);
116
+ CREATE INDEX IF NOT EXISTS idx_handoff_requests_target ON handoff_requests(target_stack_id);
91
117
  `);
92
118
  } catch (error) {
93
119
  const dbError = errorHandler(error, {
@@ -206,7 +232,7 @@ class FrameManager {
206
232
  * Create a new frame and push to stack
207
233
  */
208
234
  createFrame(options) {
209
- return trace.traceSync("function", "FrameManager.createFrame", options, () => this._createFrame(options));
235
+ return this._createFrame(options);
210
236
  }
211
237
  _createFrame(options) {
212
238
  const frameId = uuidv4();
@@ -273,7 +299,7 @@ class FrameManager {
273
299
  * Close the current frame and generate digest
274
300
  */
275
301
  closeFrame(frameId, outputs) {
276
- trace.traceSync("function", "FrameManager.closeFrame", { frameId, outputs }, () => this._closeFrame(frameId, outputs));
302
+ this._closeFrame(frameId, outputs);
277
303
  }
278
304
  _closeFrame(frameId, outputs) {
279
305
  const targetFrameId = frameId || this.getCurrentFrameId();
@@ -347,6 +373,21 @@ class FrameManager {
347
373
  stackDepth: this.activeStack.length
348
374
  });
349
375
  }
376
+ /**
377
+ * Delete a frame completely from the database (used in handoffs)
378
+ */
379
+ deleteFrame(frameId) {
380
+ try {
381
+ this.db.prepare("DELETE FROM events WHERE frame_id = ?").run(frameId);
382
+ this.db.prepare("DELETE FROM anchors WHERE frame_id = ?").run(frameId);
383
+ this.activeStack = this.activeStack.filter((id) => id !== frameId);
384
+ this.db.prepare("DELETE FROM frames WHERE frame_id = ?").run(frameId);
385
+ logger.debug("Deleted frame completely", { frameId });
386
+ } catch (error) {
387
+ logger.error("Failed to delete frame", { frameId, error });
388
+ throw error;
389
+ }
390
+ }
350
391
  closeChildFrames(parentFrameId) {
351
392
  try {
352
393
  const children = this.db.prepare(
@@ -573,6 +614,88 @@ Activity: ${eventCount} events, ${structured.tool_calls_count} tool calls`;
573
614
  getStackDepth() {
574
615
  return this.activeStack.length;
575
616
  }
617
+ /**
618
+ * Get recent frames for context sharing
619
+ */
620
+ async getRecentFrames(limit = 100) {
621
+ try {
622
+ const rows = this.db.prepare(
623
+ `
624
+ SELECT * FROM frames
625
+ WHERE project_id = ?
626
+ ORDER BY created_at DESC
627
+ LIMIT ?
628
+ `
629
+ ).all(this.projectId, limit);
630
+ return rows.map((row) => ({
631
+ ...row,
632
+ frameId: row.frame_id,
633
+ runId: row.run_id,
634
+ projectId: row.project_id,
635
+ parentFrameId: row.parent_frame_id,
636
+ title: row.name,
637
+ timestamp: row.created_at,
638
+ metadata: {
639
+ tags: this.extractTagsFromFrame(row),
640
+ importance: this.calculateFrameImportance(row)
641
+ },
642
+ data: {
643
+ inputs: JSON.parse(row.inputs || "{}"),
644
+ outputs: JSON.parse(row.outputs || "{}"),
645
+ digest: JSON.parse(row.digest_json || "{}")
646
+ },
647
+ inputs: JSON.parse(row.inputs || "{}"),
648
+ outputs: JSON.parse(row.outputs || "{}"),
649
+ digest_json: JSON.parse(row.digest_json || "{}")
650
+ }));
651
+ } catch (error) {
652
+ logger.error("Failed to get recent frames", error);
653
+ return [];
654
+ }
655
+ }
656
+ /**
657
+ * Add context metadata to the current frame
658
+ */
659
+ async addContext(key, value) {
660
+ const currentFrameId = this.getCurrentFrameId();
661
+ if (!currentFrameId) return;
662
+ try {
663
+ const frame = this.getFrame(currentFrameId);
664
+ if (!frame) return;
665
+ const metadata = frame.outputs || {};
666
+ metadata[key] = value;
667
+ this.db.prepare(`UPDATE frames SET outputs = ? WHERE frame_id = ?`).run(JSON.stringify(metadata), currentFrameId);
668
+ } catch (error) {
669
+ logger.warn("Failed to add context to frame", { error, key });
670
+ }
671
+ }
672
+ extractTagsFromFrame(frame) {
673
+ const tags = [];
674
+ if (frame.type) tags.push(frame.type);
675
+ if (frame.name) {
676
+ if (frame.name.toLowerCase().includes("error")) tags.push("error");
677
+ if (frame.name.toLowerCase().includes("fix")) tags.push("resolution");
678
+ if (frame.name.toLowerCase().includes("decision")) tags.push("decision");
679
+ if (frame.name.toLowerCase().includes("milestone"))
680
+ tags.push("milestone");
681
+ }
682
+ try {
683
+ const digest = JSON.parse(frame.digest_json || "{}");
684
+ if (digest.tags) tags.push(...digest.tags);
685
+ } catch {
686
+ }
687
+ return [...new Set(tags)];
688
+ }
689
+ calculateFrameImportance(frame) {
690
+ if (frame.type === "milestone" || frame.name?.includes("decision"))
691
+ return "high";
692
+ if (frame.type === "error" || frame.type === "resolution") return "medium";
693
+ if (frame.closed_at && frame.created_at) {
694
+ const duration = frame.closed_at - frame.created_at;
695
+ if (duration > 300) return "medium";
696
+ }
697
+ return "low";
698
+ }
576
699
  getFrameDepth(frameId) {
577
700
  const frame = this.getFrame(frameId);
578
701
  return frame?.depth || 0;
@@ -592,15 +715,12 @@ Activity: ${eventCount} events, ${structured.tool_calls_count} tool calls`;
592
715
  digest_json: JSON.parse(row.digest_json || "{}")
593
716
  };
594
717
  } 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
- );
718
+ logger.warn(`Failed to get frame: ${frameId}`, {
719
+ error: error instanceof Error ? error.message : String(error),
720
+ frameId,
721
+ operation: "getFrame"
722
+ });
723
+ return void 0;
604
724
  }
605
725
  }
606
726
  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 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 // Initialize context bridge for automatic shared context\n // Skip in test environment to avoid async method wrapping\n if (process.env.NODE_ENV !== 'test' && !process.env.VITEST) {\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
  }
@@ -0,0 +1,181 @@
1
+ import { ValidationError, ErrorCode } from "../errors/index.js";
2
+ import { logger } from "../monitoring/logger.js";
3
+ class PermissionManager {
4
+ userPermissions = /* @__PURE__ */ new Map();
5
+ adminUsers = /* @__PURE__ */ new Set();
6
+ constructor() {
7
+ this.initializeDefaultPermissions();
8
+ }
9
+ /**
10
+ * Check if user has permission for specific operation
11
+ */
12
+ async checkPermission(context) {
13
+ try {
14
+ if (this.adminUsers.has(context.userId)) {
15
+ return true;
16
+ }
17
+ const stackPermissions = this.getStackPermissions(
18
+ context.userId,
19
+ context.stackContext?.stackId || context.resourceId
20
+ );
21
+ if (!stackPermissions) {
22
+ logger.warn("No permissions found for user", {
23
+ userId: context.userId,
24
+ stackId: context.stackContext?.stackId,
25
+ operation: context.operation
26
+ });
27
+ return false;
28
+ }
29
+ switch (context.operation) {
30
+ case "read":
31
+ return stackPermissions.canRead;
32
+ case "write":
33
+ return stackPermissions.canWrite;
34
+ case "handoff":
35
+ return stackPermissions.canHandoff;
36
+ case "merge":
37
+ return stackPermissions.canMerge;
38
+ case "administer":
39
+ return stackPermissions.canAdminister;
40
+ default:
41
+ logger.error("Unknown operation type", {
42
+ operation: context.operation
43
+ });
44
+ return false;
45
+ }
46
+ } catch (error) {
47
+ logger.error("Permission check failed", error);
48
+ return false;
49
+ }
50
+ }
51
+ /**
52
+ * Enforce permission check - throws if access denied
53
+ */
54
+ async enforcePermission(context) {
55
+ const hasPermission = await this.checkPermission(context);
56
+ if (!hasPermission) {
57
+ throw new ValidationError(
58
+ `Access denied: User ${context.userId} lacks ${context.operation} permission for ${context.resourceType} ${context.resourceId}`,
59
+ ErrorCode.PERMISSION_VIOLATION,
60
+ {
61
+ userId: context.userId,
62
+ operation: context.operation,
63
+ resourceType: context.resourceType,
64
+ resourceId: context.resourceId
65
+ }
66
+ );
67
+ }
68
+ logger.debug("Permission granted", {
69
+ userId: context.userId,
70
+ operation: context.operation,
71
+ resourceType: context.resourceType,
72
+ resourceId: context.resourceId
73
+ });
74
+ }
75
+ /**
76
+ * Set permissions for user on specific stack
77
+ */
78
+ setStackPermissions(userId, stackId, permissions) {
79
+ if (!this.userPermissions.has(userId)) {
80
+ this.userPermissions.set(userId, /* @__PURE__ */ new Map());
81
+ }
82
+ this.userPermissions.get(userId).set(stackId, permissions);
83
+ logger.info("Updated stack permissions", {
84
+ userId,
85
+ stackId,
86
+ permissions
87
+ });
88
+ }
89
+ /**
90
+ * Get permissions for user on specific stack
91
+ */
92
+ getStackPermissions(userId, stackId) {
93
+ const userPerms = this.userPermissions.get(userId);
94
+ if (!userPerms) return null;
95
+ return userPerms.get(stackId) || null;
96
+ }
97
+ /**
98
+ * Grant admin privileges to user
99
+ */
100
+ grantAdminAccess(userId) {
101
+ this.adminUsers.add(userId);
102
+ logger.info("Granted admin access", { userId });
103
+ }
104
+ /**
105
+ * Revoke admin privileges from user
106
+ */
107
+ revokeAdminAccess(userId) {
108
+ this.adminUsers.delete(userId);
109
+ logger.info("Revoked admin access", { userId });
110
+ }
111
+ /**
112
+ * Check if user is admin
113
+ */
114
+ isAdmin(userId) {
115
+ return this.adminUsers.has(userId);
116
+ }
117
+ /**
118
+ * Get all permissions for user
119
+ */
120
+ getUserPermissions(userId) {
121
+ return this.userPermissions.get(userId) || /* @__PURE__ */ new Map();
122
+ }
123
+ /**
124
+ * Remove all permissions for user
125
+ */
126
+ removeUserPermissions(userId) {
127
+ this.userPermissions.delete(userId);
128
+ this.adminUsers.delete(userId);
129
+ logger.info("Removed all permissions for user", { userId });
130
+ }
131
+ /**
132
+ * Initialize default permissions
133
+ */
134
+ initializeDefaultPermissions() {
135
+ const defaultAdmin = process.env.STACKMEMORY_DEFAULT_ADMIN;
136
+ if (defaultAdmin) {
137
+ this.grantAdminAccess(defaultAdmin);
138
+ }
139
+ }
140
+ /**
141
+ * Create permission context helper
142
+ */
143
+ createContext(userId, operation, resourceType, resourceId, stackContext) {
144
+ return {
145
+ userId,
146
+ operation,
147
+ resourceType,
148
+ resourceId,
149
+ stackContext
150
+ };
151
+ }
152
+ /**
153
+ * Bulk permission update for multiple stacks
154
+ */
155
+ setBulkStackPermissions(userId, stackPermissions) {
156
+ if (!this.userPermissions.has(userId)) {
157
+ this.userPermissions.set(userId, /* @__PURE__ */ new Map());
158
+ }
159
+ const userPerms = this.userPermissions.get(userId);
160
+ Object.entries(stackPermissions).forEach(([stackId, permissions]) => {
161
+ userPerms.set(stackId, permissions);
162
+ });
163
+ logger.info("Updated bulk stack permissions", {
164
+ userId,
165
+ stackCount: Object.keys(stackPermissions).length
166
+ });
167
+ }
168
+ /**
169
+ * Get permission summary for debugging
170
+ */
171
+ getPermissionSummary(userId) {
172
+ return {
173
+ isAdmin: this.isAdmin(userId),
174
+ stackPermissions: Object.fromEntries(this.getUserPermissions(userId))
175
+ };
176
+ }
177
+ }
178
+ export {
179
+ PermissionManager
180
+ };
181
+ //# sourceMappingURL=permission-manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/context/permission-manager.ts"],
4
+ "sourcesContent": ["/**\n * Permission Management for Collaboration Layer\n */\n\nimport { ValidationError, ErrorCode } from '../errors/index.js';\nimport type { StackPermissions, StackContext } from './dual-stack-manager.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport type Operation = 'read' | 'write' | 'handoff' | 'merge' | 'administer';\n\nexport interface PermissionContext {\n userId: string;\n operation: Operation;\n resourceType: 'stack' | 'frame' | 'handoff' | 'merge';\n resourceId: string;\n stackContext?: StackContext;\n}\n\nexport class PermissionManager {\n private userPermissions = new Map<string, Map<string, StackPermissions>>();\n private adminUsers = new Set<string>();\n\n constructor() {\n this.initializeDefaultPermissions();\n }\n\n /**\n * Check if user has permission for specific operation\n */\n async checkPermission(context: PermissionContext): Promise<boolean> {\n try {\n // Super admin always has access\n if (this.adminUsers.has(context.userId)) {\n return true;\n }\n\n // Get stack permissions for user\n const stackPermissions = this.getStackPermissions(\n context.userId,\n context.stackContext?.stackId || context.resourceId\n );\n\n if (!stackPermissions) {\n logger.warn('No permissions found for user', {\n userId: context.userId,\n stackId: context.stackContext?.stackId,\n operation: context.operation,\n });\n return false;\n }\n\n // Check operation-specific permissions\n switch (context.operation) {\n case 'read':\n return stackPermissions.canRead;\n\n case 'write':\n return stackPermissions.canWrite;\n\n case 'handoff':\n return stackPermissions.canHandoff;\n\n case 'merge':\n return stackPermissions.canMerge;\n\n case 'administer':\n return stackPermissions.canAdminister;\n\n default:\n logger.error('Unknown operation type', {\n operation: context.operation,\n });\n return false;\n }\n } catch (error) {\n logger.error('Permission check failed', error);\n return false;\n }\n }\n\n /**\n * Enforce permission check - throws if access denied\n */\n async enforcePermission(context: PermissionContext): Promise<void> {\n const hasPermission = await this.checkPermission(context);\n\n if (!hasPermission) {\n throw new ValidationError(\n `Access denied: User ${context.userId} lacks ${context.operation} permission for ${context.resourceType} ${context.resourceId}`,\n ErrorCode.PERMISSION_VIOLATION,\n {\n userId: context.userId,\n operation: context.operation,\n resourceType: context.resourceType,\n resourceId: context.resourceId,\n }\n );\n }\n\n logger.debug('Permission granted', {\n userId: context.userId,\n operation: context.operation,\n resourceType: context.resourceType,\n resourceId: context.resourceId,\n });\n }\n\n /**\n * Set permissions for user on specific stack\n */\n setStackPermissions(\n userId: string,\n stackId: string,\n permissions: StackPermissions\n ): void {\n if (!this.userPermissions.has(userId)) {\n this.userPermissions.set(userId, new Map());\n }\n\n this.userPermissions.get(userId)!.set(stackId, permissions);\n\n logger.info('Updated stack permissions', {\n userId,\n stackId,\n permissions,\n });\n }\n\n /**\n * Get permissions for user on specific stack\n */\n getStackPermissions(\n userId: string,\n stackId: string\n ): StackPermissions | null {\n const userPerms = this.userPermissions.get(userId);\n if (!userPerms) return null;\n\n return userPerms.get(stackId) || null;\n }\n\n /**\n * Grant admin privileges to user\n */\n grantAdminAccess(userId: string): void {\n this.adminUsers.add(userId);\n logger.info('Granted admin access', { userId });\n }\n\n /**\n * Revoke admin privileges from user\n */\n revokeAdminAccess(userId: string): void {\n this.adminUsers.delete(userId);\n logger.info('Revoked admin access', { userId });\n }\n\n /**\n * Check if user is admin\n */\n isAdmin(userId: string): boolean {\n return this.adminUsers.has(userId);\n }\n\n /**\n * Get all permissions for user\n */\n getUserPermissions(userId: string): Map<string, StackPermissions> {\n return this.userPermissions.get(userId) || new Map();\n }\n\n /**\n * Remove all permissions for user\n */\n removeUserPermissions(userId: string): void {\n this.userPermissions.delete(userId);\n this.adminUsers.delete(userId);\n logger.info('Removed all permissions for user', { userId });\n }\n\n /**\n * Initialize default permissions\n */\n private initializeDefaultPermissions(): void {\n // Set up default admin user if needed\n const defaultAdmin = process.env.STACKMEMORY_DEFAULT_ADMIN;\n if (defaultAdmin) {\n this.grantAdminAccess(defaultAdmin);\n }\n }\n\n /**\n * Create permission context helper\n */\n createContext(\n userId: string,\n operation: Operation,\n resourceType: PermissionContext['resourceType'],\n resourceId: string,\n stackContext?: StackContext\n ): PermissionContext {\n return {\n userId,\n operation,\n resourceType,\n resourceId,\n stackContext,\n };\n }\n\n /**\n * Bulk permission update for multiple stacks\n */\n setBulkStackPermissions(\n userId: string,\n stackPermissions: Record<string, StackPermissions>\n ): void {\n if (!this.userPermissions.has(userId)) {\n this.userPermissions.set(userId, new Map());\n }\n\n const userPerms = this.userPermissions.get(userId)!;\n\n Object.entries(stackPermissions).forEach(([stackId, permissions]) => {\n userPerms.set(stackId, permissions);\n });\n\n logger.info('Updated bulk stack permissions', {\n userId,\n stackCount: Object.keys(stackPermissions).length,\n });\n }\n\n /**\n * Get permission summary for debugging\n */\n getPermissionSummary(userId: string): {\n isAdmin: boolean;\n stackPermissions: Record<string, StackPermissions>;\n } {\n return {\n isAdmin: this.isAdmin(userId),\n stackPermissions: Object.fromEntries(this.getUserPermissions(userId)),\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }