@stackmemoryai/stackmemory 0.2.8 → 0.3.0

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 (608) hide show
  1. package/dist/agents/core/agent-task-manager.js +512 -0
  2. package/dist/agents/core/agent-task-manager.js.map +7 -0
  3. package/dist/agents/verifiers/base-verifier.js +129 -0
  4. package/dist/agents/verifiers/base-verifier.js.map +7 -0
  5. package/dist/agents/verifiers/formatter-verifier.js +126 -0
  6. package/dist/agents/verifiers/formatter-verifier.js.map +7 -0
  7. package/dist/agents/verifiers/llm-judge.js +248 -0
  8. package/dist/agents/verifiers/llm-judge.js.map +7 -0
  9. package/dist/cli/__tests__/index.test.js +290 -0
  10. package/dist/cli/__tests__/index.test.js.map +7 -0
  11. package/dist/cli/auto-detect.js +317 -0
  12. package/dist/cli/auto-detect.js.map +7 -0
  13. package/dist/cli/browser-test.js +29 -0
  14. package/dist/cli/browser-test.js.map +7 -0
  15. package/dist/cli/claude-sm.js +369 -0
  16. package/dist/cli/claude-sm.js.map +7 -0
  17. package/dist/cli/codex-sm.js +283 -0
  18. package/dist/cli/codex-sm.js.map +7 -0
  19. package/dist/cli/commands/agent.js +286 -0
  20. package/dist/cli/commands/agent.js.map +7 -0
  21. package/dist/cli/commands/config.js +199 -0
  22. package/dist/cli/commands/config.js.map +7 -0
  23. package/dist/cli/commands/context.js +327 -0
  24. package/dist/cli/commands/context.js.map +7 -0
  25. package/dist/cli/commands/handoff.js +191 -0
  26. package/dist/cli/commands/handoff.js.map +7 -0
  27. package/dist/cli/commands/linear-test.js +115 -0
  28. package/dist/cli/commands/linear-test.js.map +7 -0
  29. package/dist/cli/commands/linear.js +378 -0
  30. package/dist/cli/commands/linear.js.map +7 -0
  31. package/dist/cli/commands/log.js +165 -0
  32. package/dist/cli/commands/log.js.map +7 -0
  33. package/dist/cli/commands/onboard.js +349 -0
  34. package/dist/cli/commands/onboard.js.map +7 -0
  35. package/dist/cli/commands/projects.js +195 -0
  36. package/dist/cli/commands/projects.js.map +7 -0
  37. package/dist/cli/commands/search.js +152 -0
  38. package/dist/cli/commands/search.js.map +7 -0
  39. package/dist/cli/commands/session.js +179 -0
  40. package/dist/cli/commands/session.js.map +7 -0
  41. package/dist/cli/commands/tasks.js +205 -0
  42. package/dist/cli/commands/tasks.js.map +7 -0
  43. package/dist/cli/commands/webhook.js +131 -0
  44. package/dist/cli/commands/webhook.js.map +7 -0
  45. package/dist/cli/commands/worktree.js +276 -0
  46. package/dist/cli/commands/worktree.js.map +7 -0
  47. package/dist/cli/index.js +953 -0
  48. package/dist/cli/index.js.map +7 -0
  49. package/dist/cli/utils/viewer.js +92 -0
  50. package/dist/cli/utils/viewer.js.map +7 -0
  51. package/dist/core/config/__tests__/config-manager.test.js +248 -0
  52. package/dist/core/config/__tests__/config-manager.test.js.map +7 -0
  53. package/dist/core/config/config-manager.js +368 -0
  54. package/dist/core/config/config-manager.js.map +7 -0
  55. package/dist/core/config/types.js +140 -0
  56. package/dist/core/config/types.js.map +7 -0
  57. package/dist/core/context/__tests__/frame-manager.test.js +879 -0
  58. package/dist/core/context/__tests__/frame-manager.test.js.map +7 -0
  59. package/dist/core/context/auto-context.js +72 -0
  60. package/dist/core/context/auto-context.js.map +7 -0
  61. package/dist/core/context/compaction-handler.js +326 -0
  62. package/dist/core/context/compaction-handler.js.map +7 -0
  63. package/dist/core/context/frame-database.js +376 -0
  64. package/dist/core/context/frame-database.js.map +7 -0
  65. package/dist/core/context/frame-digest.js +239 -0
  66. package/dist/core/context/frame-digest.js.map +7 -0
  67. package/dist/core/context/frame-manager.js +682 -0
  68. package/dist/core/context/frame-manager.js.map +7 -0
  69. package/dist/core/context/frame-stack.js +270 -0
  70. package/dist/core/context/frame-stack.js.map +7 -0
  71. package/dist/core/context/frame-types.js +1 -0
  72. package/dist/core/context/frame-types.js.map +7 -0
  73. package/dist/core/context/index.js +33 -0
  74. package/dist/core/context/index.js.map +7 -0
  75. package/dist/core/context/model-aware-compaction.js +619 -0
  76. package/dist/core/context/model-aware-compaction.js.map +7 -0
  77. package/dist/core/context/refactored-frame-manager.js +393 -0
  78. package/dist/core/context/refactored-frame-manager.js.map +7 -0
  79. package/dist/core/database/batch-operations.js +329 -0
  80. package/dist/core/database/batch-operations.js.map +7 -0
  81. package/dist/core/database/connection-pool.js +224 -0
  82. package/dist/core/database/connection-pool.js.map +7 -0
  83. package/dist/core/database/query-cache.js +284 -0
  84. package/dist/core/database/query-cache.js.map +7 -0
  85. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +379 -0
  86. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +7 -0
  87. package/dist/core/digest/__tests__/frame-digest-integration.test.js +230 -0
  88. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +7 -0
  89. package/dist/core/digest/enhanced-hybrid-digest.js +267 -0
  90. package/dist/core/digest/enhanced-hybrid-digest.js.map +7 -0
  91. package/dist/core/digest/frame-digest-integration.js +172 -0
  92. package/dist/core/digest/frame-digest-integration.js.map +7 -0
  93. package/dist/core/digest/hybrid-digest-generator.js +549 -0
  94. package/dist/core/digest/hybrid-digest-generator.js.map +7 -0
  95. package/dist/core/digest/index.js +5 -0
  96. package/dist/core/digest/index.js.map +7 -0
  97. package/dist/core/digest/types.js +21 -0
  98. package/dist/core/digest/types.js.map +7 -0
  99. package/dist/core/errors/__tests__/error-handling.test.js +270 -0
  100. package/dist/core/errors/__tests__/error-handling.test.js.map +7 -0
  101. package/dist/core/errors/index.js +239 -0
  102. package/dist/core/errors/index.js.map +7 -0
  103. package/dist/core/errors/recovery.js +258 -0
  104. package/dist/core/errors/recovery.js.map +7 -0
  105. package/dist/core/merge/__tests__/conflict-scenarios.test.js +414 -0
  106. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +7 -0
  107. package/dist/core/merge/conflict-detector.js +424 -0
  108. package/dist/core/merge/conflict-detector.js.map +7 -0
  109. package/dist/core/merge/index.js +5 -0
  110. package/dist/core/merge/index.js.map +7 -0
  111. package/dist/core/merge/resolution-engine.js +565 -0
  112. package/dist/core/merge/resolution-engine.js.map +7 -0
  113. package/dist/core/merge/stack-diff.js +528 -0
  114. package/dist/core/merge/stack-diff.js.map +7 -0
  115. package/dist/core/merge/types.js +1 -0
  116. package/dist/core/merge/types.js.map +7 -0
  117. package/dist/core/monitoring/error-handler.js +278 -0
  118. package/dist/core/monitoring/error-handler.js.map +7 -0
  119. package/dist/core/monitoring/logger.js +115 -0
  120. package/dist/core/monitoring/logger.js.map +7 -0
  121. package/dist/core/monitoring/metrics.js +157 -0
  122. package/dist/core/monitoring/metrics.js.map +7 -0
  123. package/dist/core/monitoring/progress-tracker.js +174 -0
  124. package/dist/core/monitoring/progress-tracker.js.map +7 -0
  125. package/dist/core/performance/context-cache.js +269 -0
  126. package/dist/core/performance/context-cache.js.map +7 -0
  127. package/dist/core/performance/index.js +7 -0
  128. package/dist/core/performance/index.js.map +7 -0
  129. package/dist/core/performance/lazy-context-loader.js +319 -0
  130. package/dist/core/performance/lazy-context-loader.js.map +7 -0
  131. package/dist/core/performance/monitor.js +217 -0
  132. package/dist/core/performance/monitor.js.map +7 -0
  133. package/dist/core/performance/optimized-frame-context.js +326 -0
  134. package/dist/core/performance/optimized-frame-context.js.map +7 -0
  135. package/dist/core/performance/performance-benchmark.js +269 -0
  136. package/dist/core/performance/performance-benchmark.js.map +7 -0
  137. package/dist/core/performance/performance-profiler.js +318 -0
  138. package/dist/core/performance/performance-profiler.js.map +7 -0
  139. package/dist/core/performance/streaming-jsonl-parser.js +187 -0
  140. package/dist/core/performance/streaming-jsonl-parser.js.map +7 -0
  141. package/dist/core/persistence/postgres-adapter.js +345 -0
  142. package/dist/core/persistence/postgres-adapter.js.map +7 -0
  143. package/dist/core/projects/project-manager.js +699 -0
  144. package/dist/core/projects/project-manager.js.map +7 -0
  145. package/dist/core/query/__tests__/query-parser.test.js +301 -0
  146. package/dist/core/query/__tests__/query-parser.test.js.map +7 -0
  147. package/dist/core/query/__tests__/query-templates.test.js +210 -0
  148. package/dist/core/query/__tests__/query-templates.test.js.map +7 -0
  149. package/dist/core/query/query-parser.js +366 -0
  150. package/dist/core/query/query-parser.js.map +7 -0
  151. package/dist/core/query/query-templates.js +317 -0
  152. package/dist/core/query/query-templates.js.map +7 -0
  153. package/dist/core/retrieval/index.js +4 -0
  154. package/dist/core/retrieval/index.js.map +7 -0
  155. package/dist/core/retrieval/llm-context-retrieval.js +577 -0
  156. package/dist/core/retrieval/llm-context-retrieval.js.map +7 -0
  157. package/dist/core/retrieval/summary-generator.js +585 -0
  158. package/dist/core/retrieval/summary-generator.js.map +7 -0
  159. package/dist/core/retrieval/types.js +17 -0
  160. package/dist/core/retrieval/types.js.map +7 -0
  161. package/dist/core/session/index.js +11 -0
  162. package/dist/core/session/index.js.map +7 -0
  163. package/dist/core/session/session-manager.js +297 -0
  164. package/dist/core/session/session-manager.js.map +7 -0
  165. package/dist/core/trace/cli-trace-wrapper.js +110 -0
  166. package/dist/core/trace/cli-trace-wrapper.js.map +7 -0
  167. package/dist/core/trace/db-trace-wrapper.js +215 -0
  168. package/dist/core/trace/db-trace-wrapper.js.map +7 -0
  169. package/dist/core/trace/debug-trace.js +385 -0
  170. package/dist/core/trace/debug-trace.js.map +7 -0
  171. package/dist/core/trace/index.js +158 -0
  172. package/dist/core/trace/index.js.map +7 -0
  173. package/dist/core/trace/linear-api-wrapper.js +169 -0
  174. package/dist/core/trace/linear-api-wrapper.js.map +7 -0
  175. package/dist/core/trace/trace-demo.js +135 -0
  176. package/dist/core/trace/trace-demo.js.map +7 -0
  177. package/dist/core/trace/trace-detector.demo.js +138 -0
  178. package/dist/core/trace/trace-detector.demo.js.map +7 -0
  179. package/dist/core/trace/trace-detector.js +386 -0
  180. package/dist/core/trace/trace-detector.js.map +7 -0
  181. package/dist/core/trace/trace-detector.test.js +401 -0
  182. package/dist/core/trace/trace-detector.test.js.map +7 -0
  183. package/dist/core/trace/trace-store.js +341 -0
  184. package/dist/core/trace/trace-store.js.map +7 -0
  185. package/dist/core/trace/types.js +73 -0
  186. package/dist/core/trace/types.js.map +7 -0
  187. package/dist/core/types.js +1 -0
  188. package/dist/core/types.js.map +7 -0
  189. package/dist/core/utils/update-checker.js +214 -0
  190. package/dist/core/utils/update-checker.js.map +7 -0
  191. package/dist/core/worktree/worktree-manager.js +450 -0
  192. package/dist/core/worktree/worktree-manager.js.map +7 -0
  193. package/dist/features/analytics/api/analytics-api.js +283 -0
  194. package/dist/features/analytics/api/analytics-api.js.map +7 -0
  195. package/dist/features/analytics/core/analytics-service.js +267 -0
  196. package/dist/features/analytics/core/analytics-service.js.map +7 -0
  197. package/dist/features/analytics/index.js +14 -0
  198. package/dist/features/analytics/index.js.map +7 -0
  199. package/dist/features/analytics/queries/metrics-queries.js +273 -0
  200. package/dist/features/analytics/queries/metrics-queries.js.map +7 -0
  201. package/dist/features/analytics/types/metrics.js +1 -0
  202. package/dist/features/analytics/types/metrics.js.map +7 -0
  203. package/dist/features/browser/browser-mcp.js +488 -0
  204. package/dist/features/browser/browser-mcp.js.map +7 -0
  205. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +747 -0
  206. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +7 -0
  207. package/dist/features/tasks/pebbles-task-store.js +647 -0
  208. package/dist/features/tasks/pebbles-task-store.js.map +7 -0
  209. package/dist/features/tasks/task-aware-context.js +406 -0
  210. package/dist/features/tasks/task-aware-context.js.map +7 -0
  211. package/dist/index.js +21 -0
  212. package/dist/index.js.map +7 -0
  213. package/dist/integrations/linear/__tests__/auth.test.js +558 -0
  214. package/dist/integrations/linear/__tests__/auth.test.js.map +7 -0
  215. package/dist/integrations/linear/__tests__/sync-service.test.js +760 -0
  216. package/dist/integrations/linear/__tests__/sync-service.test.js.map +7 -0
  217. package/dist/integrations/linear/auth.js +308 -0
  218. package/dist/integrations/linear/auth.js.map +7 -0
  219. package/dist/integrations/linear/auto-sync.js +244 -0
  220. package/dist/integrations/linear/auto-sync.js.map +7 -0
  221. package/dist/integrations/linear/client.js +448 -0
  222. package/dist/integrations/linear/client.js.map +7 -0
  223. package/dist/integrations/linear/config.js +115 -0
  224. package/dist/integrations/linear/config.js.map +7 -0
  225. package/dist/integrations/linear/sync-manager.js +233 -0
  226. package/dist/integrations/linear/sync-manager.js.map +7 -0
  227. package/dist/integrations/linear/sync-service.js +214 -0
  228. package/dist/integrations/linear/sync-service.js.map +7 -0
  229. package/dist/integrations/linear/sync.js +565 -0
  230. package/dist/integrations/linear/sync.js.map +7 -0
  231. package/dist/integrations/linear/types.js +1 -0
  232. package/dist/integrations/linear/types.js.map +7 -0
  233. package/dist/integrations/linear/webhook-server.js +204 -0
  234. package/dist/integrations/linear/webhook-server.js.map +7 -0
  235. package/dist/integrations/linear/webhook.js +269 -0
  236. package/dist/integrations/linear/webhook.js.map +7 -0
  237. package/dist/integrations/mcp/__tests__/server.test.js +798 -0
  238. package/dist/integrations/mcp/__tests__/server.test.js.map +7 -0
  239. package/dist/integrations/mcp/handlers/context-handlers.js +253 -0
  240. package/dist/integrations/mcp/handlers/context-handlers.js.map +7 -0
  241. package/dist/integrations/mcp/handlers/index.js +134 -0
  242. package/dist/integrations/mcp/handlers/index.js.map +7 -0
  243. package/dist/integrations/mcp/handlers/linear-handlers.js +243 -0
  244. package/dist/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  245. package/dist/integrations/mcp/handlers/task-handlers.js +235 -0
  246. package/dist/integrations/mcp/handlers/task-handlers.js.map +7 -0
  247. package/dist/integrations/mcp/handlers/trace-handlers.js +304 -0
  248. package/dist/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  249. package/dist/integrations/mcp/index.js +19 -0
  250. package/dist/integrations/mcp/index.js.map +7 -0
  251. package/dist/integrations/mcp/refactored-server.js +331 -0
  252. package/dist/integrations/mcp/refactored-server.js.map +7 -0
  253. package/dist/integrations/mcp/server.js +1621 -0
  254. package/dist/integrations/mcp/server.js.map +7 -0
  255. package/dist/integrations/mcp/tool-definitions.js +562 -0
  256. package/dist/integrations/mcp/tool-definitions.js.map +7 -0
  257. package/dist/integrations/mcp/trace-test.js +44 -0
  258. package/dist/integrations/mcp/trace-test.js.map +7 -0
  259. package/dist/integrations/pg-aiguide/embedding-provider.js +174 -0
  260. package/dist/integrations/pg-aiguide/embedding-provider.js.map +7 -0
  261. package/dist/integrations/pg-aiguide/semantic-search.js +183 -0
  262. package/dist/integrations/pg-aiguide/semantic-search.js.map +7 -0
  263. package/dist/integrations/pg-aiguide/timescale-analytics.js +220 -0
  264. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +7 -0
  265. package/dist/mcp/stackmemory-mcp-server.js +550 -0
  266. package/dist/mcp/stackmemory-mcp-server.js.map +7 -0
  267. package/dist/middleware/exponential-rate-limiter.js +285 -0
  268. package/dist/middleware/exponential-rate-limiter.js.map +7 -0
  269. package/dist/models/user.model.js +351 -0
  270. package/dist/models/user.model.js.map +7 -0
  271. package/dist/scripts/benchmark-performance.d.ts +7 -0
  272. package/dist/scripts/benchmark-performance.d.ts.map +1 -0
  273. package/dist/scripts/benchmark-performance.js +44 -0
  274. package/dist/scripts/benchmark-performance.js.map +1 -0
  275. package/dist/scripts/cleanup-duplicate-tasks.d.ts +12 -0
  276. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +1 -0
  277. package/dist/scripts/cleanup-duplicate-tasks.js +215 -0
  278. package/dist/scripts/cleanup-duplicate-tasks.js.map +1 -0
  279. package/dist/servers/production/auth-middleware.js +513 -0
  280. package/dist/servers/production/auth-middleware.js.map +7 -0
  281. package/dist/servers/railway/index.js +390 -0
  282. package/dist/servers/railway/index.js.map +7 -0
  283. package/dist/services/config-service.js +62 -0
  284. package/dist/services/config-service.js.map +7 -0
  285. package/dist/services/context-service.js +191 -0
  286. package/dist/services/context-service.js.map +7 -0
  287. package/dist/src/agents/core/agent-task-manager.d.ts +154 -0
  288. package/dist/src/agents/core/agent-task-manager.d.ts.map +1 -0
  289. package/dist/src/agents/core/agent-task-manager.js +504 -0
  290. package/dist/src/agents/core/agent-task-manager.js.map +1 -0
  291. package/dist/src/agents/verifiers/base-verifier.d.ts +112 -0
  292. package/dist/src/agents/verifiers/base-verifier.d.ts.map +1 -0
  293. package/dist/src/agents/verifiers/base-verifier.js +130 -0
  294. package/dist/src/agents/verifiers/base-verifier.js.map +1 -0
  295. package/dist/src/agents/verifiers/formatter-verifier.d.ts +14 -0
  296. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +1 -0
  297. package/dist/src/agents/verifiers/formatter-verifier.js +107 -0
  298. package/dist/src/agents/verifiers/formatter-verifier.js.map +1 -0
  299. package/dist/src/agents/verifiers/llm-judge.d.ts +46 -0
  300. package/dist/src/agents/verifiers/llm-judge.d.ts.map +1 -0
  301. package/dist/src/agents/verifiers/llm-judge.js +248 -0
  302. package/dist/src/agents/verifiers/llm-judge.js.map +1 -0
  303. package/dist/src/cli/claude-sm.js +55 -0
  304. package/dist/src/cli/claude-sm.js.map +1 -1
  305. package/dist/src/cli/commands/agent.d.ts +9 -0
  306. package/dist/src/cli/commands/agent.d.ts.map +1 -0
  307. package/dist/src/cli/commands/agent.js +303 -0
  308. package/dist/src/cli/commands/agent.js.map +1 -0
  309. package/dist/src/cli/commands/handoff.d.ts +6 -0
  310. package/dist/src/cli/commands/handoff.d.ts.map +1 -0
  311. package/dist/src/cli/commands/handoff.js +212 -0
  312. package/dist/src/cli/commands/handoff.js.map +1 -0
  313. package/dist/src/cli/index.d.ts.map +1 -1
  314. package/dist/src/cli/index.js +4 -0
  315. package/dist/src/cli/index.js.map +1 -1
  316. package/dist/src/core/context/compaction-handler.d.ts.map +1 -1
  317. package/dist/src/core/context/compaction-handler.js +1 -1
  318. package/dist/src/core/context/compaction-handler.js.map +1 -1
  319. package/dist/src/core/context/frame-database.d.ts +59 -0
  320. package/dist/src/core/context/frame-database.d.ts.map +1 -0
  321. package/dist/src/core/context/frame-database.js +333 -0
  322. package/dist/src/core/context/frame-database.js.map +1 -0
  323. package/dist/src/core/context/frame-digest.d.ts +59 -0
  324. package/dist/src/core/context/frame-digest.d.ts.map +1 -0
  325. package/dist/src/core/context/frame-digest.js +264 -0
  326. package/dist/src/core/context/frame-digest.js.map +1 -0
  327. package/dist/src/core/context/frame-manager.d.ts +2 -0
  328. package/dist/src/core/context/frame-manager.d.ts.map +1 -1
  329. package/dist/src/core/context/frame-manager.js +7 -0
  330. package/dist/src/core/context/frame-manager.js.map +1 -1
  331. package/dist/src/core/context/frame-stack.d.ts +85 -0
  332. package/dist/src/core/context/frame-stack.d.ts.map +1 -0
  333. package/dist/src/core/context/frame-stack.js +287 -0
  334. package/dist/src/core/context/frame-stack.js.map +1 -0
  335. package/dist/src/core/context/frame-types.d.ts +67 -0
  336. package/dist/src/core/context/frame-types.d.ts.map +1 -0
  337. package/dist/src/core/context/frame-types.js +6 -0
  338. package/dist/src/core/context/frame-types.js.map +1 -0
  339. package/dist/src/core/context/index.d.ts +11 -0
  340. package/dist/src/core/context/index.d.ts.map +1 -0
  341. package/dist/src/core/context/index.js +14 -0
  342. package/dist/src/core/context/index.js.map +1 -0
  343. package/dist/src/core/context/refactored-frame-manager.d.ts +99 -0
  344. package/dist/src/core/context/refactored-frame-manager.d.ts.map +1 -0
  345. package/dist/src/core/context/refactored-frame-manager.js +340 -0
  346. package/dist/src/core/context/refactored-frame-manager.js.map +1 -0
  347. package/dist/src/core/database/batch-operations.d.ts +118 -0
  348. package/dist/src/core/database/batch-operations.d.ts.map +1 -0
  349. package/dist/src/core/database/batch-operations.js +339 -0
  350. package/dist/src/core/database/batch-operations.js.map +1 -0
  351. package/dist/src/core/database/connection-pool.d.ts +79 -0
  352. package/dist/src/core/database/connection-pool.d.ts.map +1 -0
  353. package/dist/src/core/database/connection-pool.js +236 -0
  354. package/dist/src/core/database/connection-pool.js.map +1 -0
  355. package/dist/src/core/database/query-cache.d.ts +135 -0
  356. package/dist/src/core/database/query-cache.d.ts.map +1 -0
  357. package/dist/src/core/database/query-cache.js +294 -0
  358. package/dist/src/core/database/query-cache.js.map +1 -0
  359. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +125 -0
  360. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +1 -0
  361. package/dist/src/core/digest/enhanced-hybrid-digest.js +282 -0
  362. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +1 -0
  363. package/dist/src/core/digest/frame-digest-integration.d.ts +67 -0
  364. package/dist/src/core/digest/frame-digest-integration.d.ts.map +1 -0
  365. package/dist/src/core/digest/frame-digest-integration.js +198 -0
  366. package/dist/src/core/digest/frame-digest-integration.js.map +1 -0
  367. package/dist/src/core/digest/hybrid-digest-generator.d.ts +76 -0
  368. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -0
  369. package/dist/src/core/digest/hybrid-digest-generator.js +629 -0
  370. package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -0
  371. package/dist/src/core/digest/index.d.ts +9 -0
  372. package/dist/src/core/digest/index.d.ts.map +1 -0
  373. package/dist/src/core/digest/index.js +9 -0
  374. package/dist/src/core/digest/index.js.map +1 -0
  375. package/dist/src/core/digest/types.d.ts +154 -0
  376. package/dist/src/core/digest/types.d.ts.map +1 -0
  377. package/dist/src/core/digest/types.js +18 -0
  378. package/dist/src/core/digest/types.js.map +1 -0
  379. package/dist/src/core/errors/index.d.ts +13 -5
  380. package/dist/src/core/errors/index.d.ts.map +1 -1
  381. package/dist/src/core/errors/index.js +13 -5
  382. package/dist/src/core/errors/index.js.map +1 -1
  383. package/dist/src/core/merge/conflict-detector.d.ts +122 -0
  384. package/dist/src/core/merge/conflict-detector.d.ts.map +1 -0
  385. package/dist/src/core/merge/conflict-detector.js +468 -0
  386. package/dist/src/core/merge/conflict-detector.js.map +1 -0
  387. package/dist/src/core/merge/index.d.ts +9 -0
  388. package/dist/src/core/merge/index.d.ts.map +1 -0
  389. package/dist/src/core/merge/index.js +9 -0
  390. package/dist/src/core/merge/index.js.map +1 -0
  391. package/dist/src/core/merge/resolution-engine.d.ts +120 -0
  392. package/dist/src/core/merge/resolution-engine.d.ts.map +1 -0
  393. package/dist/src/core/merge/resolution-engine.js +573 -0
  394. package/dist/src/core/merge/resolution-engine.js.map +1 -0
  395. package/dist/src/core/merge/stack-diff.d.ts +97 -0
  396. package/dist/src/core/merge/stack-diff.d.ts.map +1 -0
  397. package/dist/src/core/merge/stack-diff.js +516 -0
  398. package/dist/src/core/merge/stack-diff.js.map +1 -0
  399. package/dist/src/core/merge/types.d.ts +110 -0
  400. package/dist/src/core/merge/types.d.ts.map +1 -0
  401. package/dist/src/core/merge/types.js +6 -0
  402. package/dist/src/core/merge/types.js.map +1 -0
  403. package/dist/src/core/monitoring/logger.d.ts +2 -2
  404. package/dist/src/core/monitoring/logger.d.ts.map +1 -1
  405. package/dist/src/core/monitoring/logger.js +10 -5
  406. package/dist/src/core/monitoring/logger.js.map +1 -1
  407. package/dist/src/core/monitoring/metrics.d.ts +3 -0
  408. package/dist/src/core/monitoring/metrics.d.ts.map +1 -1
  409. package/dist/src/core/monitoring/metrics.js +142 -3
  410. package/dist/src/core/monitoring/metrics.js.map +1 -1
  411. package/dist/src/core/performance/context-cache.d.ts +109 -0
  412. package/dist/src/core/performance/context-cache.d.ts.map +1 -0
  413. package/dist/src/core/performance/context-cache.js +280 -0
  414. package/dist/src/core/performance/context-cache.js.map +1 -0
  415. package/dist/src/core/performance/index.d.ts +3 -0
  416. package/dist/src/core/performance/index.d.ts.map +1 -0
  417. package/dist/src/core/performance/index.js +3 -0
  418. package/dist/src/core/performance/index.js.map +1 -0
  419. package/dist/src/core/performance/lazy-context-loader.d.ts +93 -0
  420. package/dist/src/core/performance/lazy-context-loader.d.ts.map +1 -0
  421. package/dist/src/core/performance/lazy-context-loader.js +332 -0
  422. package/dist/src/core/performance/lazy-context-loader.js.map +1 -0
  423. package/dist/src/core/performance/monitor.d.ts +48 -0
  424. package/dist/src/core/performance/monitor.d.ts.map +1 -0
  425. package/dist/src/core/performance/monitor.js +226 -0
  426. package/dist/src/core/performance/monitor.js.map +1 -0
  427. package/dist/src/core/performance/optimized-frame-context.d.ts +74 -0
  428. package/dist/src/core/performance/optimized-frame-context.d.ts.map +1 -0
  429. package/dist/src/core/performance/optimized-frame-context.js +330 -0
  430. package/dist/src/core/performance/optimized-frame-context.js.map +1 -0
  431. package/dist/src/core/performance/performance-benchmark.d.ts +50 -0
  432. package/dist/src/core/performance/performance-benchmark.d.ts.map +1 -0
  433. package/dist/src/core/performance/performance-benchmark.js +290 -0
  434. package/dist/src/core/performance/performance-benchmark.js.map +1 -0
  435. package/dist/src/core/performance/performance-profiler.d.ts +151 -0
  436. package/dist/src/core/performance/performance-profiler.d.ts.map +1 -0
  437. package/dist/src/core/performance/performance-profiler.js +346 -0
  438. package/dist/src/core/performance/performance-profiler.js.map +1 -0
  439. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +41 -0
  440. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +1 -0
  441. package/dist/src/core/performance/streaming-jsonl-parser.js +193 -0
  442. package/dist/src/core/performance/streaming-jsonl-parser.js.map +1 -0
  443. package/dist/src/core/persistence/postgres-adapter.d.ts +31 -0
  444. package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -0
  445. package/dist/src/core/persistence/postgres-adapter.js +330 -0
  446. package/dist/src/core/persistence/postgres-adapter.js.map +1 -0
  447. package/dist/src/core/query/query-parser.d.ts +5 -0
  448. package/dist/src/core/query/query-parser.d.ts.map +1 -1
  449. package/dist/src/core/query/query-parser.js +86 -18
  450. package/dist/src/core/query/query-parser.js.map +1 -1
  451. package/dist/src/core/query/query-templates.d.ts +44 -0
  452. package/dist/src/core/query/query-templates.d.ts.map +1 -0
  453. package/dist/src/core/query/query-templates.js +326 -0
  454. package/dist/src/core/query/query-templates.js.map +1 -0
  455. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +5 -3
  456. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -1
  457. package/dist/src/core/retrieval/llm-context-retrieval.js +73 -21
  458. package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -1
  459. package/dist/src/core/trace/cli-trace-wrapper.d.ts +23 -0
  460. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +1 -0
  461. package/dist/src/core/trace/cli-trace-wrapper.js +141 -0
  462. package/dist/src/core/trace/cli-trace-wrapper.js.map +1 -0
  463. package/dist/src/core/trace/db-trace-wrapper.d.ts +36 -0
  464. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +1 -0
  465. package/dist/src/core/trace/db-trace-wrapper.js +252 -0
  466. package/dist/src/core/trace/db-trace-wrapper.js.map +1 -0
  467. package/dist/src/core/trace/debug-trace.d.ts +84 -0
  468. package/dist/src/core/trace/debug-trace.d.ts.map +1 -0
  469. package/dist/src/core/trace/debug-trace.js +402 -0
  470. package/dist/src/core/trace/debug-trace.js.map +1 -0
  471. package/dist/src/core/trace/error-test.d.ts +6 -0
  472. package/dist/src/core/trace/error-test.d.ts.map +1 -0
  473. package/dist/src/core/trace/error-test.js +128 -0
  474. package/dist/src/core/trace/error-test.js.map +1 -0
  475. package/dist/src/core/trace/index.d.ts +25 -0
  476. package/dist/src/core/trace/index.d.ts.map +1 -0
  477. package/dist/src/core/trace/index.js +121 -0
  478. package/dist/src/core/trace/index.js.map +1 -0
  479. package/dist/src/core/trace/linear-api-wrapper.d.ts +17 -0
  480. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +1 -0
  481. package/dist/src/core/trace/linear-api-wrapper.js +205 -0
  482. package/dist/src/core/trace/linear-api-wrapper.js.map +1 -0
  483. package/dist/src/core/trace/performance-test.d.ts +6 -0
  484. package/dist/src/core/trace/performance-test.d.ts.map +1 -0
  485. package/dist/src/core/trace/performance-test.js +111 -0
  486. package/dist/src/core/trace/performance-test.js.map +1 -0
  487. package/dist/src/core/trace/trace-demo.d.ts +8 -0
  488. package/dist/src/core/trace/trace-demo.d.ts.map +1 -0
  489. package/dist/src/core/trace/trace-demo.js +154 -0
  490. package/dist/src/core/trace/trace-demo.js.map +1 -0
  491. package/dist/src/core/trace/trace-detector.d.ts +2 -2
  492. package/dist/src/core/trace/trace-detector.d.ts.map +1 -1
  493. package/dist/src/core/trace/trace-detector.demo.js +6 -6
  494. package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
  495. package/dist/src/core/trace/trace-detector.js +3 -3
  496. package/dist/src/core/trace/trace-detector.js.map +1 -1
  497. package/dist/src/core/types.d.ts +35 -0
  498. package/dist/src/core/types.d.ts.map +1 -0
  499. package/dist/src/core/types.js +2 -0
  500. package/dist/src/core/types.js.map +1 -0
  501. package/dist/src/features/tasks/pebbles-task-store.d.ts +9 -2
  502. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
  503. package/dist/src/features/tasks/pebbles-task-store.js +97 -18
  504. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
  505. package/dist/src/integrations/linear/auth.d.ts.map +1 -1
  506. package/dist/src/integrations/linear/auth.js.map +1 -1
  507. package/dist/src/integrations/linear/client.d.ts +15 -1
  508. package/dist/src/integrations/linear/client.d.ts.map +1 -1
  509. package/dist/src/integrations/linear/client.js +85 -3
  510. package/dist/src/integrations/linear/client.js.map +1 -1
  511. package/dist/src/integrations/linear/sync-manager.d.ts +2 -0
  512. package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -1
  513. package/dist/src/integrations/linear/sync-manager.js +16 -4
  514. package/dist/src/integrations/linear/sync-manager.js.map +1 -1
  515. package/dist/src/integrations/linear/sync-service.d.ts +23 -2
  516. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -1
  517. package/dist/src/integrations/linear/sync-service.js +44 -25
  518. package/dist/src/integrations/linear/sync-service.js.map +1 -1
  519. package/dist/src/integrations/linear/sync.d.ts +6 -0
  520. package/dist/src/integrations/linear/sync.d.ts.map +1 -1
  521. package/dist/src/integrations/linear/sync.js +27 -2
  522. package/dist/src/integrations/linear/sync.js.map +1 -1
  523. package/dist/src/integrations/linear/types.d.ts +16 -1
  524. package/dist/src/integrations/linear/types.d.ts.map +1 -1
  525. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -1
  526. package/dist/src/integrations/linear/webhook-server.js +10 -8
  527. package/dist/src/integrations/linear/webhook-server.js.map +1 -1
  528. package/dist/src/integrations/linear/webhook.d.ts +13 -0
  529. package/dist/src/integrations/linear/webhook.d.ts.map +1 -1
  530. package/dist/src/integrations/linear/webhook.js +101 -14
  531. package/dist/src/integrations/linear/webhook.js.map +1 -1
  532. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +39 -0
  533. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +1 -0
  534. package/dist/src/integrations/mcp/handlers/context-handlers.js +266 -0
  535. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +1 -0
  536. package/dist/src/integrations/mcp/handlers/index.d.ts +37 -0
  537. package/dist/src/integrations/mcp/handlers/index.d.ts.map +1 -0
  538. package/dist/src/integrations/mcp/handlers/index.js +134 -0
  539. package/dist/src/integrations/mcp/handlers/index.js.map +1 -0
  540. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +33 -0
  541. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +1 -0
  542. package/dist/src/integrations/mcp/handlers/linear-handlers.js +251 -0
  543. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +1 -0
  544. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +42 -0
  545. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +1 -0
  546. package/dist/src/integrations/mcp/handlers/task-handlers.js +238 -0
  547. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +1 -0
  548. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +41 -0
  549. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +1 -0
  550. package/dist/src/integrations/mcp/handlers/trace-handlers.js +298 -0
  551. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +1 -0
  552. package/dist/src/integrations/mcp/index.d.ts +13 -0
  553. package/dist/src/integrations/mcp/index.d.ts.map +1 -0
  554. package/dist/src/integrations/mcp/index.js +17 -0
  555. package/dist/src/integrations/mcp/index.js.map +1 -0
  556. package/dist/src/integrations/mcp/refactored-server.d.ts +76 -0
  557. package/dist/src/integrations/mcp/refactored-server.d.ts.map +1 -0
  558. package/dist/src/integrations/mcp/refactored-server.js +351 -0
  559. package/dist/src/integrations/mcp/refactored-server.js.map +1 -0
  560. package/dist/src/integrations/mcp/server.js +2 -2
  561. package/dist/src/integrations/mcp/server.js.map +1 -1
  562. package/dist/src/integrations/mcp/tool-definitions.d.ts +44 -0
  563. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +1 -0
  564. package/dist/src/integrations/mcp/tool-definitions.js +563 -0
  565. package/dist/src/integrations/mcp/tool-definitions.js.map +1 -0
  566. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +48 -0
  567. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +1 -0
  568. package/dist/src/integrations/pg-aiguide/embedding-provider.js +190 -0
  569. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +1 -0
  570. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +34 -0
  571. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -0
  572. package/dist/src/integrations/pg-aiguide/semantic-search.js +176 -0
  573. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -0
  574. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +44 -0
  575. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +1 -0
  576. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +215 -0
  577. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +1 -0
  578. package/dist/src/mcp/stackmemory-mcp-server.d.ts +9 -0
  579. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +1 -0
  580. package/dist/src/mcp/stackmemory-mcp-server.js +519 -0
  581. package/dist/src/mcp/stackmemory-mcp-server.js.map +1 -0
  582. package/dist/src/middleware/exponential-rate-limiter.d.ts +78 -0
  583. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +1 -0
  584. package/dist/src/middleware/exponential-rate-limiter.js +293 -0
  585. package/dist/src/middleware/exponential-rate-limiter.js.map +1 -0
  586. package/dist/src/models/user.model.d.ts +62 -0
  587. package/dist/src/models/user.model.d.ts.map +1 -0
  588. package/dist/src/models/user.model.js +311 -0
  589. package/dist/src/models/user.model.js.map +1 -0
  590. package/dist/src/servers/production/auth-middleware.d.ts +12 -2
  591. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  592. package/dist/src/servers/production/auth-middleware.js +240 -28
  593. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  594. package/dist/src/servers/railway/index.js.map +1 -1
  595. package/dist/src/services/context-service.d.ts.map +1 -1
  596. package/dist/src/services/context-service.js +86 -1
  597. package/dist/src/services/context-service.js.map +1 -1
  598. package/dist/src/validation/schemas.d.ts +633 -0
  599. package/dist/src/validation/schemas.d.ts.map +1 -0
  600. package/dist/src/validation/schemas.js +347 -0
  601. package/dist/src/validation/schemas.js.map +1 -0
  602. package/dist/types/task.js +1 -0
  603. package/dist/types/task.js.map +7 -0
  604. package/dist/utils/logger.js +52 -0
  605. package/dist/utils/logger.js.map +7 -0
  606. package/dist/validation/schemas.js +218 -0
  607. package/dist/validation/schemas.js.map +7 -0
  608. package/package.json +12 -3
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/context/__tests__/frame-manager.test.ts"],
4
+ "sourcesContent": ["/**\n * Tests for FrameManager - Call Stack Implementation\n */\n\nimport { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';\nimport Database from 'better-sqlite3';\nimport { FrameManager, FrameType, FrameState, Frame } from '../frame-manager';\nimport { DatabaseError, FrameError, ErrorCode } from '../../errors/index';\nimport { join } from 'path';\nimport { mkdtempSync, rmSync } from 'fs';\nimport { tmpdir } from 'os';\n\ndescribe('FrameManager', () => {\n let db: Database.Database;\n let frameManager: FrameManager;\n let tempDir: string;\n const projectId = 'test-project';\n\n beforeEach(() => {\n // Create a temporary directory for test database\n tempDir = mkdtempSync(join(tmpdir(), 'stackmemory-test-'));\n const dbPath = join(tempDir, 'test.db');\n \n // Initialize database\n db = new Database(dbPath);\n \n // Create frame manager\n frameManager = new FrameManager(db, projectId);\n });\n\n afterEach(() => {\n // Clean up\n if (db) {\n db.close();\n }\n if (tempDir) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n describe('Initialization', () => {\n it('should initialize database schema correctly', () => {\n // Check if tables exist\n const tables = db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' AND name IN ('frames', 'events', 'anchors')\n `).all();\n\n expect(tables).toHaveLength(3);\n expect(tables.map((t: { name: string }) => t.name)).toContain('frames');\n expect(tables.map((t: { name: string }) => t.name)).toContain('events');\n expect(tables.map((t: { name: string }) => t.name)).toContain('anchors');\n });\n\n it('should load empty active stack on initialization', () => {\n const stackDepth = frameManager.getStackDepth();\n expect(stackDepth).toBe(0);\n });\n });\n\n describe('Frame Creation', () => {\n it('should create a new frame successfully', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Test Task',\n inputs: { input: 'test' },\n });\n\n expect(frameId).toBeDefined();\n expect(typeof frameId).toBe('string');\n \n const frame = frameManager.getFrame(frameId);\n expect(frame).toBeDefined();\n expect(frame!.frame_id).toBe(frameId);\n expect(frame!.name).toBe('Test Task');\n expect(frame!.type).toBe('task');\n expect(frame!.state).toBe('active');\n expect(frame!.inputs).toEqual({ input: 'test' });\n expect(frame!.depth).toBe(0);\n });\n\n it('should create nested frames with correct depth', () => {\n const parentFrameId = frameManager.createFrame({\n type: 'task',\n name: 'Parent',\n });\n \n const childFrameId = frameManager.createFrame({\n type: 'subtask',\n name: 'Child',\n });\n\n const parentFrame = frameManager.getFrame(parentFrameId);\n const childFrame = frameManager.getFrame(childFrameId);\n \n expect(parentFrame!.depth).toBe(0);\n expect(childFrame!.depth).toBe(1);\n expect(childFrame!.parent_frame_id).toBe(parentFrameId);\n });\n\n it('should update active stack when creating frames', () => {\n const frame1Id = frameManager.createFrame({\n type: 'task',\n name: 'Frame 1',\n });\n \n const frame2Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Frame 2',\n });\n\n const stackDepth = frameManager.getStackDepth();\n expect(stackDepth).toBe(2);\n expect(frameManager.getCurrentFrameId()).toBe(frame2Id);\n });\n\n it('should handle frame creation errors', () => {\n // Close the database to simulate an error\n db.close();\n\n expect(() => {\n frameManager.createFrame({\n type: 'task',\n name: 'Error Frame',\n });\n }).toThrow(DatabaseError);\n });\n\n it('should handle different frame types', () => {\n const frameTypes: FrameType[] = ['task', 'subtask', 'tool_scope', 'review', 'write', 'debug'];\n \n frameTypes.forEach(type => {\n const frameId = frameManager.createFrame({\n type,\n name: `${type} frame`,\n });\n \n const frame = frameManager.getFrame(frameId);\n expect(frame!.type).toBe(type);\n });\n });\n\n it('should create frames with specific parent', () => {\n const rootFrameId = frameManager.createFrame({\n type: 'task',\n name: 'Root Frame',\n });\n \n const childFrameId = frameManager.createFrame({\n type: 'subtask',\n name: 'Child Frame',\n parentFrameId: rootFrameId,\n });\n \n const childFrame = frameManager.getFrame(childFrameId);\n expect(childFrame!.parent_frame_id).toBe(rootFrameId);\n expect(childFrame!.depth).toBe(1);\n });\n });\n\n describe('Frame Closing', () => {\n it('should close a frame successfully', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Test Frame',\n });\n \n frameManager.closeFrame(frameId, {\n result: 'completed',\n data: 'output'\n });\n\n const closedFrame = frameManager.getFrame(frameId);\n expect(closedFrame!.state).toBe('closed');\n expect(closedFrame!.outputs).toMatchObject({ data: 'output' });\n expect(closedFrame!.closed_at).toBeDefined();\n });\n\n it('should generate digest when closing frame', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Digest Test',\n });\n \n // Add some events\n frameManager.addEvent('user_message', {\n content: 'Test message'\n }, frameId);\n\n frameManager.closeFrame(frameId, {\n result: 'success'\n });\n\n const closedFrame = frameManager.getFrame(frameId);\n expect(closedFrame!.digest_text).toBeDefined();\n expect(closedFrame!.digest_json).toBeDefined();\n expect(closedFrame!.digest_text).toContain('Digest Test');\n });\n\n it('should remove from active stack when closing', () => {\n const frame1Id = frameManager.createFrame({\n type: 'task',\n name: 'Frame 1',\n });\n \n const frame2Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Frame 2',\n });\n\n frameManager.closeFrame(frame2Id);\n\n const stackDepth = frameManager.getStackDepth();\n expect(stackDepth).toBe(1);\n expect(frameManager.getCurrentFrameId()).toBe(frame1Id);\n });\n\n it('should close current frame when no frameId specified', () => {\n const frame1Id = frameManager.createFrame({\n type: 'task',\n name: 'Frame 1',\n });\n \n const frame2Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Frame 2',\n });\n\n expect(frameManager.getCurrentFrameId()).toBe(frame2Id);\n frameManager.closeFrame(); // Close current frame\n\n const closedFrame = frameManager.getFrame(frame2Id);\n expect(closedFrame!.state).toBe('closed');\n expect(frameManager.getCurrentFrameId()).toBe(frame1Id);\n });\n\n it('should throw error when closing non-existent frame', () => {\n expect(() => {\n frameManager.closeFrame('non-existent-id');\n }).toThrow(FrameError);\n });\n\n it('should warn when closing already closed frame', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Test',\n });\n \n frameManager.closeFrame(frameId);\n\n // Should not throw, but should warn\n expect(() => {\n frameManager.closeFrame(frameId);\n }).not.toThrow();\n });\n\n it('should close child frames recursively', () => {\n const rootId = frameManager.createFrame({\n type: 'task',\n name: 'Root',\n });\n \n const child1Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Child 1',\n });\n \n const child2Id = frameManager.createFrame({\n type: 'tool_scope',\n name: 'Child 2',\n });\n\n // Close the root frame\n frameManager.closeFrame(rootId);\n\n // All frames should be closed\n expect(frameManager.getFrame(rootId)!.state).toBe('closed');\n expect(frameManager.getFrame(child1Id)!.state).toBe('closed');\n expect(frameManager.getFrame(child2Id)!.state).toBe('closed');\n expect(frameManager.getStackDepth()).toBe(0);\n });\n\n it('should throw error when no active frame to close', () => {\n expect(() => {\n frameManager.closeFrame(); // No frames created\n }).toThrow(FrameError);\n });\n });\n\n describe('Event Management', () => {\n it('should add events to a frame', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Event Test',\n });\n \n const eventId = frameManager.addEvent(\n 'user_message',\n { content: 'Hello' },\n frameId\n );\n\n expect(eventId).toBeDefined();\n expect(typeof eventId).toBe('string');\n \n const events = frameManager.getFrameEvents(frameId);\n expect(events).toHaveLength(1);\n expect(events[0].event_id).toBe(eventId);\n expect(events[0].frame_id).toBe(frameId);\n expect(events[0].event_type).toBe('user_message');\n expect(events[0].payload).toEqual({ content: 'Hello' });\n });\n\n it('should add events to current frame when no frameId specified', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Current Frame Test',\n });\n \n const eventId = frameManager.addEvent('user_message', { content: 'Hello' });\n \n const events = frameManager.getFrameEvents(frameId);\n expect(events).toHaveLength(1);\n expect(events[0].event_id).toBe(eventId);\n });\n\n it('should retrieve frame events', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Event Retrieval',\n });\n \n frameManager.addEvent('user_message', { msg: '1' }, frameId);\n frameManager.addEvent('tool_call', { tool: 'test' }, frameId);\n frameManager.addEvent('tool_result', { result: 'ok' }, frameId);\n\n const events = frameManager.getFrameEvents(frameId);\n \n expect(events).toHaveLength(3);\n expect(events[0].event_type).toBe('user_message');\n expect(events[1].event_type).toBe('tool_call');\n expect(events[2].event_type).toBe('tool_result');\n });\n\n it('should maintain event sequence numbers', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Sequence Test',\n });\n \n frameManager.addEvent('user_message', { index: 1 }, frameId);\n frameManager.addEvent('user_message', { index: 2 }, frameId);\n frameManager.addEvent('user_message', { index: 3 }, frameId);\n\n const events = frameManager.getFrameEvents(frameId);\n \n expect(events[0].seq).toBe(1);\n expect(events[1].seq).toBe(2);\n expect(events[2].seq).toBe(3);\n });\n\n it('should limit frame events when requested', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Limit Test',\n });\n \n // Add many events\n for (let i = 0; i < 20; i++) {\n frameManager.addEvent('user_message', { index: i }, frameId);\n }\n \n const limitedEvents = frameManager.getFrameEvents(frameId, 5);\n expect(limitedEvents).toHaveLength(5);\n \n // Should get the last 5 events (most recent)\n expect(limitedEvents[0].payload.index).toBe(19);\n expect(limitedEvents[4].payload.index).toBe(15);\n });\n\n it('should throw error when adding event with no active frame', () => {\n expect(() => {\n frameManager.addEvent('user_message', { content: 'test' });\n }).toThrow(FrameError);\n });\n\n it('should handle different event types', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Event Types Test',\n });\n \n const eventTypes = [\n 'user_message',\n 'assistant_message',\n 'tool_call',\n 'tool_result',\n 'decision',\n 'constraint',\n 'artifact',\n 'observation'\n ] as const;\n \n eventTypes.forEach((type) => {\n frameManager.addEvent(type, { type }, frameId);\n });\n \n const events = frameManager.getFrameEvents(frameId);\n expect(events).toHaveLength(eventTypes.length);\n \n eventTypes.forEach((type, index) => {\n expect(events[index].event_type).toBe(type);\n });\n });\n });\n\n describe('Anchor Management', () => {\n it('should add anchors to a frame', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Anchor Test',\n });\n \n const anchorId = frameManager.addAnchor(\n 'FACT',\n 'Important fact',\n 9 // priority 0-10\n );\n\n expect(anchorId).toBeDefined();\n expect(typeof anchorId).toBe('string');\n });\n\n it('should add anchors to current frame when no frameId specified', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Current Frame Anchor Test',\n });\n \n const anchorId = frameManager.addAnchor('FACT', 'Important fact', 9);\n expect(anchorId).toBeDefined();\n });\n\n it('should handle different anchor types', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Anchor Types',\n });\n \n const anchorTypes = [\n 'FACT',\n 'DECISION',\n 'CONSTRAINT',\n 'INTERFACE_CONTRACT',\n 'TODO',\n 'RISK'\n ] as const;\n\n anchorTypes.forEach(type => {\n const anchorId = frameManager.addAnchor(\n type,\n `${type} content`,\n 5,\n { testMetadata: true },\n frameId\n );\n expect(anchorId).toBeDefined();\n });\n });\n\n it('should handle metadata in anchors', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Metadata Test',\n });\n \n const metadata = {\n source: 'test',\n confidence: 0.95,\n tags: ['important', 'decision']\n };\n \n const anchorId = frameManager.addAnchor(\n 'DECISION',\n 'Decision with metadata',\n 8,\n metadata,\n frameId\n );\n \n expect(anchorId).toBeDefined();\n });\n\n it('should use default priority when not specified', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Default Priority Test',\n });\n \n const anchorId = frameManager.addAnchor('TODO', 'Task without priority');\n expect(anchorId).toBeDefined();\n });\n\n it('should throw error when adding anchor with no active frame', () => {\n expect(() => {\n frameManager.addAnchor('FACT', 'No active frame');\n }).toThrow(FrameError);\n });\n });\n\n describe('Context Assembly', () => {\n it('should get hot stack context with active frames', () => {\n const frame1Id = frameManager.createFrame({\n type: 'task',\n name: 'Frame 1',\n });\n \n const frame2Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Frame 2',\n });\n \n const frame3Id = frameManager.createFrame({\n type: 'tool_scope',\n name: 'Frame 3',\n });\n\n const hotStack = frameManager.getHotStackContext(5);\n\n expect(hotStack).toHaveLength(3);\n expect(hotStack[0].frameId).toBe(frame1Id);\n expect(hotStack[1].frameId).toBe(frame2Id);\n expect(hotStack[2].frameId).toBe(frame3Id);\n });\n\n it('should assemble frame context correctly', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Context Test',\n inputs: {\n constraints: ['constraint1', 'constraint2'],\n definitions: { key: 'value' }\n }\n });\n\n // Add events and anchors\n frameManager.addEvent('user_message', {\n content: 'Test message'\n }, frameId);\n \n frameManager.addAnchor('FACT', 'Important fact', 9, {}, frameId);\n\n const hotStack = frameManager.getHotStackContext(10);\n const context = hotStack.find(ctx => ctx.frameId === frameId);\n\n expect(context).toBeDefined();\n expect(context!.frameId).toBe(frameId);\n expect(context!.header.goal).toBe('Context Test');\n expect(context!.header.constraints).toEqual(['constraint1', 'constraint2']);\n expect(context!.header.definitions).toEqual({ key: 'value' });\n expect(context!.anchors).toHaveLength(1);\n expect(context!.recentEvents).toHaveLength(1);\n });\n\n it('should limit events in context assembly', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Event Limit Test',\n });\n\n // Add many events\n for (let i = 0; i < 20; i++) {\n frameManager.addEvent('user_message', { index: i }, frameId);\n }\n\n const hotStack = frameManager.getHotStackContext(5);\n const context = hotStack.find(ctx => ctx.frameId === frameId);\n \n expect(context!.recentEvents).toHaveLength(5);\n });\n\n it('should return empty hot stack when no active frames', () => {\n const hotStack = frameManager.getHotStackContext();\n expect(hotStack).toHaveLength(0);\n });\n\n it('should get active frame path', () => {\n const frame1Id = frameManager.createFrame({\n type: 'task',\n name: 'Root Frame',\n });\n \n const frame2Id = frameManager.createFrame({\n type: 'subtask', \n name: 'Child Frame',\n });\n\n const activePath = frameManager.getActiveFramePath();\n \n expect(activePath).toHaveLength(2);\n expect(activePath[0].frame_id).toBe(frame1Id);\n expect(activePath[0].name).toBe('Root Frame');\n expect(activePath[1].frame_id).toBe(frame2Id);\n expect(activePath[1].name).toBe('Child Frame');\n });\n\n it('should extract active artifacts from events', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Artifact Test',\n });\n \n frameManager.addEvent('artifact', {\n ref: '/path/to/file1.ts',\n kind: 'file'\n }, frameId);\n \n frameManager.addEvent('artifact', {\n ref: '/path/to/file2.ts',\n kind: 'file'\n }, frameId);\n\n const hotStack = frameManager.getHotStackContext();\n const context = hotStack.find(ctx => ctx.frameId === frameId);\n \n expect(context!.activeArtifacts).toHaveLength(2);\n expect(context!.activeArtifacts).toContain('/path/to/file1.ts');\n expect(context!.activeArtifacts).toContain('/path/to/file2.ts');\n });\n });\n\n describe('Frame Retrieval', () => {\n it('should get frame by ID', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Get Test',\n });\n \n const retrieved = frameManager.getFrame(frameId);\n\n expect(retrieved).toBeDefined();\n expect(retrieved!.frame_id).toBe(frameId);\n expect(retrieved!.name).toBe('Get Test');\n });\n\n it('should return undefined for non-existent frame', () => {\n const frame = frameManager.getFrame('non-existent');\n expect(frame).toBeUndefined();\n });\n\n it('should get current frame ID (top of stack)', () => {\n const frame1Id = frameManager.createFrame({\n type: 'task',\n name: 'Frame 1',\n });\n \n const frame2Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Frame 2',\n });\n\n const currentFrameId = frameManager.getCurrentFrameId();\n \n expect(currentFrameId).toBe(frame2Id);\n });\n\n it('should return undefined when stack is empty', () => {\n const currentFrameId = frameManager.getCurrentFrameId();\n expect(currentFrameId).toBeUndefined();\n });\n\n it('should get stack depth', () => {\n expect(frameManager.getStackDepth()).toBe(0);\n \n frameManager.createFrame({\n type: 'task',\n name: 'Frame 1',\n });\n expect(frameManager.getStackDepth()).toBe(1);\n \n frameManager.createFrame({\n type: 'subtask',\n name: 'Frame 2',\n });\n expect(frameManager.getStackDepth()).toBe(2);\n });\n\n it('should handle frame with all properties', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Complete Test',\n inputs: {\n test: true,\n data: { nested: 'value' },\n list: [1, 2, 3]\n }\n });\n \n const frame = frameManager.getFrame(frameId);\n \n expect(frame!.frame_id).toBe(frameId);\n expect(frame!.run_id).toBeDefined();\n expect(frame!.project_id).toBe(projectId);\n expect(frame!.parent_frame_id).toBeNull();\n expect(frame!.depth).toBe(0);\n expect(frame!.type).toBe('task');\n expect(frame!.name).toBe('Complete Test');\n expect(frame!.state).toBe('active');\n expect(frame!.inputs).toEqual({\n test: true,\n data: { nested: 'value' },\n list: [1, 2, 3]\n });\n expect(frame!.outputs).toEqual({});\n expect(frame!.digest_json).toEqual({});\n expect(frame!.created_at).toBeDefined();\n expect(frame!.closed_at).toBeNull();\n });\n });\n\n describe('Digest Generation', () => {\n it('should generate meaningful digest', async () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Digest Frame',\n });\n\n // Add various events\n frameManager.addEvent('user_message', {\n content: 'What is the weather?'\n }, frameId);\n \n frameManager.addEvent('tool_call', {\n tool: 'weather_api',\n params: { location: 'NYC' }\n }, frameId);\n \n frameManager.addEvent('tool_result', {\n result: 'Sunny, 72\u00B0F'\n }, frameId);\n \n frameManager.addEvent('artifact', {\n kind: 'file',\n ref: '/path/to/weather.json'\n }, frameId);\n\n // Add anchors\n frameManager.addAnchor('FACT', 'Weather is sunny', 9, {}, frameId);\n frameManager.addAnchor('DECISION', 'No umbrella needed', 8, {}, frameId);\n frameManager.addAnchor('RISK', 'Rain possible later', 3, {}, frameId);\n\n // Add a delay to ensure duration > 0 (need at least 1000ms for 1 second difference)\n await new Promise(resolve => setTimeout(resolve, 1100));\n \n frameManager.closeFrame(frameId, {\n result: 'Weather information provided',\n data: 'temperature: 72\u00B0F'\n });\n\n const closedFrame = frameManager.getFrame(frameId);\n\n expect(closedFrame!.digest_text).toContain('Completed: Digest Frame');\n expect(closedFrame!.digest_text).toContain('Decisions made');\n expect(closedFrame!.digest_text).toContain('No umbrella needed');\n expect(closedFrame!.digest_text).toContain('Rain possible later');\n expect(closedFrame!.digest_text).toContain('4 events');\n expect(closedFrame!.digest_text).toContain('1 tool calls');\n \n const digest = closedFrame!.digest_json;\n expect(digest.result).toBe('Digest Frame');\n expect(digest.decisions).toHaveLength(1);\n expect(digest.decisions[0].text).toBe('No umbrella needed');\n expect(digest.risks).toHaveLength(1);\n expect(digest.risks[0].text).toBe('Rain possible later');\n expect(digest.artifacts).toHaveLength(1);\n expect(digest.artifacts[0].ref).toBe('/path/to/weather.json');\n expect(digest.tool_calls_count).toBe(1);\n expect(digest.duration_seconds).toBeGreaterThanOrEqual(0);\n });\n });\n\n describe('Error Handling', () => {\n it('should handle database errors gracefully', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Error Test',\n });\n \n // Close database to simulate error\n db.close();\n\n expect(() => {\n frameManager.addEvent('user_message', {}, frameId);\n }).toThrow(DatabaseError);\n });\n\n it('should validate frame types', () => {\n const validTypes: FrameType[] = [\n 'task',\n 'subtask',\n 'tool_scope',\n 'review',\n 'write',\n 'debug'\n ];\n\n validTypes.forEach(type => {\n const frameId = frameManager.createFrame({\n type,\n name: `${type} frame`,\n });\n \n const frame = frameManager.getFrame(frameId);\n expect(frame!.type).toBe(type);\n });\n });\n\n it('should handle concurrent frame operations', () => {\n const frameIds = [];\n \n // Create multiple frames quickly\n for (let i = 0; i < 10; i++) {\n frameIds.push(frameManager.createFrame({\n type: 'task',\n name: `Frame ${i}`,\n }));\n }\n\n expect(frameIds).toHaveLength(10);\n expect(frameManager.getStackDepth()).toBe(10);\n \n // Close them in reverse order (child to parent)\n for (let i = 9; i >= 0; i--) {\n frameManager.closeFrame(frameIds[i]);\n }\n\n expect(frameManager.getStackDepth()).toBe(0);\n });\n\n it('should handle database query errors gracefully', () => {\n // This tests the error handling in various methods\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Query Error Test',\n });\n \n db.close();\n \n expect(() => frameManager.getFrame(frameId)).toThrow(DatabaseError);\n expect(() => frameManager.getFrameEvents(frameId)).toThrow(DatabaseError);\n });\n\n it('should provide meaningful error messages', () => {\n try {\n frameManager.closeFrame('invalid-frame-id');\n expect.fail('Should have thrown an error');\n } catch (error) {\n expect(error).toBeInstanceOf(FrameError);\n expect((error as FrameError).message).toContain('Frame not found');\n expect((error as FrameError).code).toBe(ErrorCode.FRAME_NOT_FOUND);\n }\n });\n\n it('should include context in error metadata', () => {\n try {\n frameManager.addAnchor('FACT', 'Test fact');\n expect.fail('Should have thrown an error');\n } catch (error) {\n expect(error).toBeInstanceOf(FrameError);\n expect((error as FrameError).context).toMatchObject({\n operation: 'addAnchor',\n anchorType: 'FACT'\n });\n }\n });\n });\n\n describe('Complex Scenarios', () => {\n it('should handle deep nesting', () => {\n const frameIds = [];\n const maxDepth = 10;\n\n for (let i = 0; i < maxDepth; i++) {\n const frameId = frameManager.createFrame({\n type: i === 0 ? 'task' : 'subtask',\n name: `Level ${i}`,\n });\n frameIds.push(frameId);\n \n const frame = frameManager.getFrame(frameId);\n expect(frame!.depth).toBe(i);\n }\n\n expect(frameManager.getStackDepth()).toBe(maxDepth);\n\n // Close from deepest to root\n for (let i = maxDepth - 1; i >= 0; i--) {\n frameManager.closeFrame(frameIds[i]);\n }\n\n expect(frameManager.getStackDepth()).toBe(0);\n });\n\n it('should handle frame with many events and anchors', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Heavy Frame',\n });\n\n // Add 100 events\n for (let i = 0; i < 100; i++) {\n frameManager.addEvent('user_message', { index: i }, frameId);\n }\n\n // Add 50 anchors of different types\n const anchorTypes = ['FACT', 'DECISION', 'CONSTRAINT', 'TODO', 'RISK'] as const;\n for (let i = 0; i < 50; i++) {\n frameManager.addAnchor(\n anchorTypes[i % anchorTypes.length],\n `Content ${i}`,\n Math.floor(Math.random() * 10),\n { index: i },\n frameId\n );\n }\n\n const events = frameManager.getFrameEvents(frameId);\n expect(events).toHaveLength(100);\n\n // Close and check digest is generated correctly\n frameManager.closeFrame(frameId, {\n result: 'Heavy frame completed',\n processedEvents: 100,\n processedAnchors: 50\n });\n\n const closedFrame = frameManager.getFrame(frameId);\n expect(closedFrame!.digest_text).toBeDefined();\n expect(closedFrame!.digest_json).toBeDefined();\n expect(closedFrame!.digest_json.tool_calls_count).toBe(0); // No tool calls\n expect(closedFrame!.state).toBe('closed');\n });\n\n it('should handle frame inheritance with specific parent', () => {\n const rootId = frameManager.createFrame({\n type: 'task',\n name: 'Root Task',\n });\n \n const childId = frameManager.createFrame({\n type: 'subtask',\n name: 'Child Task',\n parentFrameId: rootId,\n });\n \n const grandchildId = frameManager.createFrame({\n type: 'tool_scope',\n name: 'Grandchild Task',\n parentFrameId: childId,\n });\n \n const rootFrame = frameManager.getFrame(rootId);\n const childFrame = frameManager.getFrame(childId);\n const grandchildFrame = frameManager.getFrame(grandchildId);\n \n expect(rootFrame!.depth).toBe(0);\n expect(childFrame!.depth).toBe(1);\n expect(grandchildFrame!.depth).toBe(2);\n \n expect(rootFrame!.parent_frame_id).toBeNull();\n expect(childFrame!.parent_frame_id).toBe(rootId);\n expect(grandchildFrame!.parent_frame_id).toBe(childId);\n });\n\n it('should handle session recovery with existing frames', () => {\n // Simulate existing frames in database\n const frame1Id = frameManager.createFrame({\n type: 'task',\n name: 'Existing Frame 1',\n });\n \n const frame2Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Existing Frame 2',\n });\n \n // Create new frame manager with same database and runId (simulating session recovery)\n const originalRunId = (frameManager as any).currentRunId;\n const newFrameManager = new FrameManager(db, projectId, originalRunId);\n \n // Should have restored the active stack\n expect(newFrameManager.getStackDepth()).toBe(2);\n expect(newFrameManager.getCurrentFrameId()).toBe(frame2Id);\n \n // Should be able to work with existing frames\n newFrameManager.addEvent('observation', { message: 'Session recovered' });\n newFrameManager.closeFrame();\n \n expect(newFrameManager.getStackDepth()).toBe(1);\n expect(newFrameManager.getCurrentFrameId()).toBe(frame1Id);\n });\n\n it('should handle mixed event and anchor operations', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Mixed Operations',\n });\n \n // Interleave events and anchors\n frameManager.addEvent('user_message', { msg: 'Start task' }, frameId);\n frameManager.addAnchor('FACT', 'Task started', 8, {}, frameId);\n \n frameManager.addEvent('tool_call', { tool: 'analyzer' }, frameId);\n frameManager.addAnchor('DECISION', 'Use analyzer tool', 9, {}, frameId);\n \n frameManager.addEvent('tool_result', { result: 'Analysis complete' }, frameId);\n frameManager.addAnchor('CONSTRAINT', 'Must validate results', 7, {}, frameId);\n \n frameManager.addEvent('assistant_message', { msg: 'Task complete' }, frameId);\n frameManager.addAnchor('TODO', 'Document findings', 5, {}, frameId);\n \n const events = frameManager.getFrameEvents(frameId);\n expect(events).toHaveLength(4);\n \n const hotStack = frameManager.getHotStackContext();\n const context = hotStack.find(ctx => ctx.frameId === frameId);\n expect(context!.anchors).toHaveLength(4);\n expect(context!.recentEvents).toHaveLength(4);\n \n // Events should be chronological, anchors should be by priority \n // Check that we have the right events (order may vary based on implementation)\n const eventMessages = context!.recentEvents.map(e => e.payload.msg).filter(Boolean);\n expect(eventMessages).toContain('Start task');\n expect(eventMessages).toContain('Task complete');\n });\n\n it('should handle closing frames out of order', () => {\n const rootId = frameManager.createFrame({\n type: 'task',\n name: 'Root',\n });\n \n const child1Id = frameManager.createFrame({\n type: 'subtask',\n name: 'Child 1',\n });\n \n const child2Id = frameManager.createFrame({\n type: 'tool_scope',\n name: 'Child 2',\n });\n \n expect(frameManager.getStackDepth()).toBe(3);\n \n // Close the middle frame\n frameManager.closeFrame(child1Id);\n \n // Child 2 should also be closed (child of child1)\n expect(frameManager.getFrame(child1Id)!.state).toBe('closed');\n expect(frameManager.getFrame(child2Id)!.state).toBe('closed');\n expect(frameManager.getStackDepth()).toBe(1);\n expect(frameManager.getCurrentFrameId()).toBe(rootId);\n });\n });\n\n describe('Database Schema and Persistence', () => {\n it('should initialize all required tables', () => {\n const tables = db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' AND name IN ('frames', 'events', 'anchors')\n `).all();\n\n expect(tables).toHaveLength(3);\n expect(tables.map((t: any) => t.name)).toContain('frames');\n expect(tables.map((t: any) => t.name)).toContain('events');\n expect(tables.map((t: any) => t.name)).toContain('anchors');\n });\n\n it('should create required indexes', () => {\n const indexes = db.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='index' AND name LIKE 'idx_%'\n `).all();\n\n const expectedIndexes = [\n 'idx_frames_run',\n 'idx_frames_parent', \n 'idx_frames_state',\n 'idx_events_frame',\n 'idx_events_seq',\n 'idx_anchors_frame'\n ];\n\n expectedIndexes.forEach(expectedIndex => {\n expect(indexes.some((idx: any) => idx.name === expectedIndex)).toBe(true);\n });\n });\n\n it('should handle JSON serialization correctly', () => {\n const complexInputs = {\n nested: { deep: { value: 'test' } },\n array: [1, 2, { key: 'value' }],\n boolean: true,\n number: 42.5,\n null: null\n };\n \n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'JSON Test',\n inputs: complexInputs,\n });\n \n const frame = frameManager.getFrame(frameId);\n expect(frame!.inputs).toEqual(complexInputs);\n });\n });\n});"],
5
+ "mappings": "AAIA,SAAS,UAAU,IAAI,QAAQ,YAAY,iBAAqB;AAChE,OAAO,cAAc;AACrB,SAAS,oBAAkD;AAC3D,SAAS,eAAe,YAAY,iBAAiB;AACrD,SAAS,YAAY;AACrB,SAAS,aAAa,cAAc;AACpC,SAAS,cAAc;AAEvB,SAAS,gBAAgB,MAAM;AAC7B,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,YAAY;AAElB,aAAW,MAAM;AAEf,cAAU,YAAY,KAAK,OAAO,GAAG,mBAAmB,CAAC;AACzD,UAAM,SAAS,KAAK,SAAS,SAAS;AAGtC,SAAK,IAAI,SAAS,MAAM;AAGxB,mBAAe,IAAI,aAAa,IAAI,SAAS;AAAA,EAC/C,CAAC;AAED,YAAU,MAAM;AAEd,QAAI,IAAI;AACN,SAAG,MAAM;AAAA,IACX;AACA,QAAI,SAAS;AACX,aAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD;AAAA,EACF,CAAC;AAED,WAAS,kBAAkB,MAAM;AAC/B,OAAG,+CAA+C,MAAM;AAEtD,YAAM,SAAS,GAAG,QAAQ;AAAA;AAAA;AAAA,OAGzB,EAAE,IAAI;AAEP,aAAO,MAAM,EAAE,aAAa,CAAC;AAC7B,aAAO,OAAO,IAAI,CAAC,MAAwB,EAAE,IAAI,CAAC,EAAE,UAAU,QAAQ;AACtE,aAAO,OAAO,IAAI,CAAC,MAAwB,EAAE,IAAI,CAAC,EAAE,UAAU,QAAQ;AACtE,aAAO,OAAO,IAAI,CAAC,MAAwB,EAAE,IAAI,CAAC,EAAE,UAAU,SAAS;AAAA,IACzE,CAAC;AAED,OAAG,oDAAoD,MAAM;AAC3D,YAAM,aAAa,aAAa,cAAc;AAC9C,aAAO,UAAU,EAAE,KAAK,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH,CAAC;AAED,WAAS,kBAAkB,MAAM;AAC/B,OAAG,0CAA0C,MAAM;AACjD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,EAAE,OAAO,OAAO;AAAA,MAC1B,CAAC;AAED,aAAO,OAAO,EAAE,YAAY;AAC5B,aAAO,OAAO,OAAO,EAAE,KAAK,QAAQ;AAEpC,YAAM,QAAQ,aAAa,SAAS,OAAO;AAC3C,aAAO,KAAK,EAAE,YAAY;AAC1B,aAAO,MAAO,QAAQ,EAAE,KAAK,OAAO;AACpC,aAAO,MAAO,IAAI,EAAE,KAAK,WAAW;AACpC,aAAO,MAAO,IAAI,EAAE,KAAK,MAAM;AAC/B,aAAO,MAAO,KAAK,EAAE,KAAK,QAAQ;AAClC,aAAO,MAAO,MAAM,EAAE,QAAQ,EAAE,OAAO,OAAO,CAAC;AAC/C,aAAO,MAAO,KAAK,EAAE,KAAK,CAAC;AAAA,IAC7B,CAAC;AAED,OAAG,kDAAkD,MAAM;AACzD,YAAM,gBAAgB,aAAa,YAAY;AAAA,QAC7C,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,eAAe,aAAa,YAAY;AAAA,QAC5C,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,cAAc,aAAa,SAAS,aAAa;AACvD,YAAM,aAAa,aAAa,SAAS,YAAY;AAErD,aAAO,YAAa,KAAK,EAAE,KAAK,CAAC;AACjC,aAAO,WAAY,KAAK,EAAE,KAAK,CAAC;AAChC,aAAO,WAAY,eAAe,EAAE,KAAK,aAAa;AAAA,IACxD,CAAC;AAED,OAAG,mDAAmD,MAAM;AAC1D,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,aAAa,aAAa,cAAc;AAC9C,aAAO,UAAU,EAAE,KAAK,CAAC;AACzB,aAAO,aAAa,kBAAkB,CAAC,EAAE,KAAK,QAAQ;AAAA,IACxD,CAAC;AAED,OAAG,uCAAuC,MAAM;AAE9C,SAAG,MAAM;AAET,aAAO,MAAM;AACX,qBAAa,YAAY;AAAA,UACvB,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AAAA,MACH,CAAC,EAAE,QAAQ,aAAa;AAAA,IAC1B,CAAC;AAED,OAAG,uCAAuC,MAAM;AAC9C,YAAM,aAA0B,CAAC,QAAQ,WAAW,cAAc,UAAU,SAAS,OAAO;AAE5F,iBAAW,QAAQ,UAAQ;AACzB,cAAM,UAAU,aAAa,YAAY;AAAA,UACvC;AAAA,UACA,MAAM,GAAG,IAAI;AAAA,QACf,CAAC;AAED,cAAM,QAAQ,aAAa,SAAS,OAAO;AAC3C,eAAO,MAAO,IAAI,EAAE,KAAK,IAAI;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAED,OAAG,6CAA6C,MAAM;AACpD,YAAM,cAAc,aAAa,YAAY;AAAA,QAC3C,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,eAAe,aAAa,YAAY;AAAA,QAC5C,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,aAAa,aAAa,SAAS,YAAY;AACrD,aAAO,WAAY,eAAe,EAAE,KAAK,WAAW;AACpD,aAAO,WAAY,KAAK,EAAE,KAAK,CAAC;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,iBAAiB,MAAM;AAC9B,OAAG,qCAAqC,MAAM;AAC5C,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,WAAW,SAAS;AAAA,QAC/B,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAED,YAAM,cAAc,aAAa,SAAS,OAAO;AACjD,aAAO,YAAa,KAAK,EAAE,KAAK,QAAQ;AACxC,aAAO,YAAa,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7D,aAAO,YAAa,SAAS,EAAE,YAAY;AAAA,IAC7C,CAAC;AAED,OAAG,6CAA6C,MAAM;AACpD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,gBAAgB;AAAA,QACpC,SAAS;AAAA,MACX,GAAG,OAAO;AAEV,mBAAa,WAAW,SAAS;AAAA,QAC/B,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,cAAc,aAAa,SAAS,OAAO;AACjD,aAAO,YAAa,WAAW,EAAE,YAAY;AAC7C,aAAO,YAAa,WAAW,EAAE,YAAY;AAC7C,aAAO,YAAa,WAAW,EAAE,UAAU,aAAa;AAAA,IAC1D,CAAC;AAED,OAAG,gDAAgD,MAAM;AACvD,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,WAAW,QAAQ;AAEhC,YAAM,aAAa,aAAa,cAAc;AAC9C,aAAO,UAAU,EAAE,KAAK,CAAC;AACzB,aAAO,aAAa,kBAAkB,CAAC,EAAE,KAAK,QAAQ;AAAA,IACxD,CAAC;AAED,OAAG,wDAAwD,MAAM;AAC/D,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,aAAO,aAAa,kBAAkB,CAAC,EAAE,KAAK,QAAQ;AACtD,mBAAa,WAAW;AAExB,YAAM,cAAc,aAAa,SAAS,QAAQ;AAClD,aAAO,YAAa,KAAK,EAAE,KAAK,QAAQ;AACxC,aAAO,aAAa,kBAAkB,CAAC,EAAE,KAAK,QAAQ;AAAA,IACxD,CAAC;AAED,OAAG,sDAAsD,MAAM;AAC7D,aAAO,MAAM;AACX,qBAAa,WAAW,iBAAiB;AAAA,MAC3C,CAAC,EAAE,QAAQ,UAAU;AAAA,IACvB,CAAC;AAED,OAAG,iDAAiD,MAAM;AACxD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,WAAW,OAAO;AAG/B,aAAO,MAAM;AACX,qBAAa,WAAW,OAAO;AAAA,MACjC,CAAC,EAAE,IAAI,QAAQ;AAAA,IACjB,CAAC;AAED,OAAG,yCAAyC,MAAM;AAChD,YAAM,SAAS,aAAa,YAAY;AAAA,QACtC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,WAAW,MAAM;AAG9B,aAAO,aAAa,SAAS,MAAM,EAAG,KAAK,EAAE,KAAK,QAAQ;AAC1D,aAAO,aAAa,SAAS,QAAQ,EAAG,KAAK,EAAE,KAAK,QAAQ;AAC5D,aAAO,aAAa,SAAS,QAAQ,EAAG,KAAK,EAAE,KAAK,QAAQ;AAC5D,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7C,CAAC;AAED,OAAG,oDAAoD,MAAM;AAC3D,aAAO,MAAM;AACX,qBAAa,WAAW;AAAA,MAC1B,CAAC,EAAE,QAAQ,UAAU;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AAED,WAAS,oBAAoB,MAAM;AACjC,OAAG,gCAAgC,MAAM;AACvC,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,UAAU,aAAa;AAAA,QAC3B;AAAA,QACA,EAAE,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAEA,aAAO,OAAO,EAAE,YAAY;AAC5B,aAAO,OAAO,OAAO,EAAE,KAAK,QAAQ;AAEpC,YAAM,SAAS,aAAa,eAAe,OAAO;AAClD,aAAO,MAAM,EAAE,aAAa,CAAC;AAC7B,aAAO,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO;AACvC,aAAO,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO;AACvC,aAAO,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,cAAc;AAChD,aAAO,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA,IACxD,CAAC;AAED,OAAG,gEAAgE,MAAM;AACvE,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,UAAU,aAAa,SAAS,gBAAgB,EAAE,SAAS,QAAQ,CAAC;AAE1E,YAAM,SAAS,aAAa,eAAe,OAAO;AAClD,aAAO,MAAM,EAAE,aAAa,CAAC;AAC7B,aAAO,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO;AAAA,IACzC,CAAC;AAED,OAAG,gCAAgC,MAAM;AACvC,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,SAAS,gBAAgB,EAAE,KAAK,IAAI,GAAG,OAAO;AAC3D,mBAAa,SAAS,aAAa,EAAE,MAAM,OAAO,GAAG,OAAO;AAC5D,mBAAa,SAAS,eAAe,EAAE,QAAQ,KAAK,GAAG,OAAO;AAE9D,YAAM,SAAS,aAAa,eAAe,OAAO;AAElD,aAAO,MAAM,EAAE,aAAa,CAAC;AAC7B,aAAO,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,cAAc;AAChD,aAAO,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,WAAW;AAC7C,aAAO,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,aAAa;AAAA,IACjD,CAAC;AAED,OAAG,0CAA0C,MAAM;AACjD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,SAAS,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO;AAC3D,mBAAa,SAAS,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO;AAC3D,mBAAa,SAAS,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO;AAE3D,YAAM,SAAS,aAAa,eAAe,OAAO;AAElD,aAAO,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC;AAC5B,aAAO,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC;AAC5B,aAAO,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC;AAAA,IAC9B,CAAC;AAED,OAAG,4CAA4C,MAAM;AACnD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,qBAAa,SAAS,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO;AAAA,MAC7D;AAEA,YAAM,gBAAgB,aAAa,eAAe,SAAS,CAAC;AAC5D,aAAO,aAAa,EAAE,aAAa,CAAC;AAGpC,aAAO,cAAc,CAAC,EAAE,QAAQ,KAAK,EAAE,KAAK,EAAE;AAC9C,aAAO,cAAc,CAAC,EAAE,QAAQ,KAAK,EAAE,KAAK,EAAE;AAAA,IAChD,CAAC;AAED,OAAG,6DAA6D,MAAM;AACpE,aAAO,MAAM;AACX,qBAAa,SAAS,gBAAgB,EAAE,SAAS,OAAO,CAAC;AAAA,MAC3D,CAAC,EAAE,QAAQ,UAAU;AAAA,IACvB,CAAC;AAED,OAAG,uCAAuC,MAAM;AAC9C,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,iBAAW,QAAQ,CAAC,SAAS;AAC3B,qBAAa,SAAS,MAAM,EAAE,KAAK,GAAG,OAAO;AAAA,MAC/C,CAAC;AAED,YAAM,SAAS,aAAa,eAAe,OAAO;AAClD,aAAO,MAAM,EAAE,aAAa,WAAW,MAAM;AAE7C,iBAAW,QAAQ,CAAC,MAAM,UAAU;AAClC,eAAO,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI;AAAA,MAC5C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,WAAS,qBAAqB,MAAM;AAClC,OAAG,iCAAiC,MAAM;AACxC,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MACF;AAEA,aAAO,QAAQ,EAAE,YAAY;AAC7B,aAAO,OAAO,QAAQ,EAAE,KAAK,QAAQ;AAAA,IACvC,CAAC;AAED,OAAG,iEAAiE,MAAM;AACxE,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,UAAU,QAAQ,kBAAkB,CAAC;AACnE,aAAO,QAAQ,EAAE,YAAY;AAAA,IAC/B,CAAC;AAED,OAAG,wCAAwC,MAAM;AAC/C,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,kBAAY,QAAQ,UAAQ;AAC1B,cAAM,WAAW,aAAa;AAAA,UAC5B;AAAA,UACA,GAAG,IAAI;AAAA,UACP;AAAA,UACA,EAAE,cAAc,KAAK;AAAA,UACrB;AAAA,QACF;AACA,eAAO,QAAQ,EAAE,YAAY;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAED,OAAG,qCAAqC,MAAM;AAC5C,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW;AAAA,QACf,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,MAAM,CAAC,aAAa,UAAU;AAAA,MAChC;AAEA,YAAM,WAAW,aAAa;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO,QAAQ,EAAE,YAAY;AAAA,IAC/B,CAAC;AAED,OAAG,kDAAkD,MAAM;AACzD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,UAAU,QAAQ,uBAAuB;AACvE,aAAO,QAAQ,EAAE,YAAY;AAAA,IAC/B,CAAC;AAED,OAAG,8DAA8D,MAAM;AACrE,aAAO,MAAM;AACX,qBAAa,UAAU,QAAQ,iBAAiB;AAAA,MAClD,CAAC,EAAE,QAAQ,UAAU;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AAED,WAAS,oBAAoB,MAAM;AACjC,OAAG,mDAAmD,MAAM;AAC1D,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,mBAAmB,CAAC;AAElD,aAAO,QAAQ,EAAE,aAAa,CAAC;AAC/B,aAAO,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,QAAQ;AACzC,aAAO,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,QAAQ;AACzC,aAAO,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,QAAQ;AAAA,IAC3C,CAAC;AAED,OAAG,2CAA2C,MAAM;AAClD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,aAAa,CAAC,eAAe,aAAa;AAAA,UAC1C,aAAa,EAAE,KAAK,QAAQ;AAAA,QAC9B;AAAA,MACF,CAAC;AAGD,mBAAa,SAAS,gBAAgB;AAAA,QACpC,SAAS;AAAA,MACX,GAAG,OAAO;AAEV,mBAAa,UAAU,QAAQ,kBAAkB,GAAG,CAAC,GAAG,OAAO;AAE/D,YAAM,WAAW,aAAa,mBAAmB,EAAE;AACnD,YAAM,UAAU,SAAS,KAAK,SAAO,IAAI,YAAY,OAAO;AAE5D,aAAO,OAAO,EAAE,YAAY;AAC5B,aAAO,QAAS,OAAO,EAAE,KAAK,OAAO;AACrC,aAAO,QAAS,OAAO,IAAI,EAAE,KAAK,cAAc;AAChD,aAAO,QAAS,OAAO,WAAW,EAAE,QAAQ,CAAC,eAAe,aAAa,CAAC;AAC1E,aAAO,QAAS,OAAO,WAAW,EAAE,QAAQ,EAAE,KAAK,QAAQ,CAAC;AAC5D,aAAO,QAAS,OAAO,EAAE,aAAa,CAAC;AACvC,aAAO,QAAS,YAAY,EAAE,aAAa,CAAC;AAAA,IAC9C,CAAC;AAED,OAAG,2CAA2C,MAAM;AAClD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,qBAAa,SAAS,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO;AAAA,MAC7D;AAEA,YAAM,WAAW,aAAa,mBAAmB,CAAC;AAClD,YAAM,UAAU,SAAS,KAAK,SAAO,IAAI,YAAY,OAAO;AAE5D,aAAO,QAAS,YAAY,EAAE,aAAa,CAAC;AAAA,IAC9C,CAAC;AAED,OAAG,uDAAuD,MAAM;AAC9D,YAAM,WAAW,aAAa,mBAAmB;AACjD,aAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,IACjC,CAAC;AAED,OAAG,gCAAgC,MAAM;AACvC,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,aAAa,aAAa,mBAAmB;AAEnD,aAAO,UAAU,EAAE,aAAa,CAAC;AACjC,aAAO,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,QAAQ;AAC5C,aAAO,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,YAAY;AAC5C,aAAO,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,QAAQ;AAC5C,aAAO,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,aAAa;AAAA,IAC/C,CAAC;AAED,OAAG,+CAA+C,MAAM;AACtD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,SAAS,YAAY;AAAA,QAChC,KAAK;AAAA,QACL,MAAM;AAAA,MACR,GAAG,OAAO;AAEV,mBAAa,SAAS,YAAY;AAAA,QAChC,KAAK;AAAA,QACL,MAAM;AAAA,MACR,GAAG,OAAO;AAEV,YAAM,WAAW,aAAa,mBAAmB;AACjD,YAAM,UAAU,SAAS,KAAK,SAAO,IAAI,YAAY,OAAO;AAE5D,aAAO,QAAS,eAAe,EAAE,aAAa,CAAC;AAC/C,aAAO,QAAS,eAAe,EAAE,UAAU,mBAAmB;AAC9D,aAAO,QAAS,eAAe,EAAE,UAAU,mBAAmB;AAAA,IAChE,CAAC;AAAA,EACH,CAAC;AAED,WAAS,mBAAmB,MAAM;AAChC,OAAG,0BAA0B,MAAM;AACjC,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,YAAY,aAAa,SAAS,OAAO;AAE/C,aAAO,SAAS,EAAE,YAAY;AAC9B,aAAO,UAAW,QAAQ,EAAE,KAAK,OAAO;AACxC,aAAO,UAAW,IAAI,EAAE,KAAK,UAAU;AAAA,IACzC,CAAC;AAED,OAAG,kDAAkD,MAAM;AACzD,YAAM,QAAQ,aAAa,SAAS,cAAc;AAClD,aAAO,KAAK,EAAE,cAAc;AAAA,IAC9B,CAAC;AAED,OAAG,8CAA8C,MAAM;AACrD,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,iBAAiB,aAAa,kBAAkB;AAEtD,aAAO,cAAc,EAAE,KAAK,QAAQ;AAAA,IACtC,CAAC;AAED,OAAG,+CAA+C,MAAM;AACtD,YAAM,iBAAiB,aAAa,kBAAkB;AACtD,aAAO,cAAc,EAAE,cAAc;AAAA,IACvC,CAAC;AAED,OAAG,0BAA0B,MAAM;AACjC,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAE3C,mBAAa,YAAY;AAAA,QACvB,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AACD,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAE3C,mBAAa,YAAY;AAAA,QACvB,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AACD,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7C,CAAC;AAED,OAAG,2CAA2C,MAAM;AAClD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,EAAE,QAAQ,QAAQ;AAAA,UACxB,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,QAChB;AAAA,MACF,CAAC;AAED,YAAM,QAAQ,aAAa,SAAS,OAAO;AAE3C,aAAO,MAAO,QAAQ,EAAE,KAAK,OAAO;AACpC,aAAO,MAAO,MAAM,EAAE,YAAY;AAClC,aAAO,MAAO,UAAU,EAAE,KAAK,SAAS;AACxC,aAAO,MAAO,eAAe,EAAE,SAAS;AACxC,aAAO,MAAO,KAAK,EAAE,KAAK,CAAC;AAC3B,aAAO,MAAO,IAAI,EAAE,KAAK,MAAM;AAC/B,aAAO,MAAO,IAAI,EAAE,KAAK,eAAe;AACxC,aAAO,MAAO,KAAK,EAAE,KAAK,QAAQ;AAClC,aAAO,MAAO,MAAM,EAAE,QAAQ;AAAA,QAC5B,MAAM;AAAA,QACN,MAAM,EAAE,QAAQ,QAAQ;AAAA,QACxB,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,MAChB,CAAC;AACD,aAAO,MAAO,OAAO,EAAE,QAAQ,CAAC,CAAC;AACjC,aAAO,MAAO,WAAW,EAAE,QAAQ,CAAC,CAAC;AACrC,aAAO,MAAO,UAAU,EAAE,YAAY;AACtC,aAAO,MAAO,SAAS,EAAE,SAAS;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,qBAAqB,MAAM;AAClC,OAAG,qCAAqC,YAAY;AAClD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,gBAAgB;AAAA,QACpC,SAAS;AAAA,MACX,GAAG,OAAO;AAEV,mBAAa,SAAS,aAAa;AAAA,QACjC,MAAM;AAAA,QACN,QAAQ,EAAE,UAAU,MAAM;AAAA,MAC5B,GAAG,OAAO;AAEV,mBAAa,SAAS,eAAe;AAAA,QACnC,QAAQ;AAAA,MACV,GAAG,OAAO;AAEV,mBAAa,SAAS,YAAY;AAAA,QAChC,MAAM;AAAA,QACN,KAAK;AAAA,MACP,GAAG,OAAO;AAGV,mBAAa,UAAU,QAAQ,oBAAoB,GAAG,CAAC,GAAG,OAAO;AACjE,mBAAa,UAAU,YAAY,sBAAsB,GAAG,CAAC,GAAG,OAAO;AACvE,mBAAa,UAAU,QAAQ,uBAAuB,GAAG,CAAC,GAAG,OAAO;AAGpE,YAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,IAAI,CAAC;AAEtD,mBAAa,WAAW,SAAS;AAAA,QAC/B,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAED,YAAM,cAAc,aAAa,SAAS,OAAO;AAEjD,aAAO,YAAa,WAAW,EAAE,UAAU,yBAAyB;AACpE,aAAO,YAAa,WAAW,EAAE,UAAU,gBAAgB;AAC3D,aAAO,YAAa,WAAW,EAAE,UAAU,oBAAoB;AAC/D,aAAO,YAAa,WAAW,EAAE,UAAU,qBAAqB;AAChE,aAAO,YAAa,WAAW,EAAE,UAAU,UAAU;AACrD,aAAO,YAAa,WAAW,EAAE,UAAU,cAAc;AAEzD,YAAM,SAAS,YAAa;AAC5B,aAAO,OAAO,MAAM,EAAE,KAAK,cAAc;AACzC,aAAO,OAAO,SAAS,EAAE,aAAa,CAAC;AACvC,aAAO,OAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,oBAAoB;AAC1D,aAAO,OAAO,KAAK,EAAE,aAAa,CAAC;AACnC,aAAO,OAAO,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,qBAAqB;AACvD,aAAO,OAAO,SAAS,EAAE,aAAa,CAAC;AACvC,aAAO,OAAO,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,uBAAuB;AAC5D,aAAO,OAAO,gBAAgB,EAAE,KAAK,CAAC;AACtC,aAAO,OAAO,gBAAgB,EAAE,uBAAuB,CAAC;AAAA,IAC1D,CAAC;AAAA,EACH,CAAC;AAED,WAAS,kBAAkB,MAAM;AAC/B,OAAG,4CAA4C,MAAM;AACnD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,SAAG,MAAM;AAET,aAAO,MAAM;AACX,qBAAa,SAAS,gBAAgB,CAAC,GAAG,OAAO;AAAA,MACnD,CAAC,EAAE,QAAQ,aAAa;AAAA,IAC1B,CAAC;AAED,OAAG,+BAA+B,MAAM;AACtC,YAAM,aAA0B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,iBAAW,QAAQ,UAAQ;AACzB,cAAM,UAAU,aAAa,YAAY;AAAA,UACvC;AAAA,UACA,MAAM,GAAG,IAAI;AAAA,QACf,CAAC;AAED,cAAM,QAAQ,aAAa,SAAS,OAAO;AAC3C,eAAO,MAAO,IAAI,EAAE,KAAK,IAAI;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAED,OAAG,6CAA6C,MAAM;AACpD,YAAM,WAAW,CAAC;AAGlB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,iBAAS,KAAK,aAAa,YAAY;AAAA,UACrC,MAAM;AAAA,UACN,MAAM,SAAS,CAAC;AAAA,QAClB,CAAC,CAAC;AAAA,MACJ;AAEA,aAAO,QAAQ,EAAE,aAAa,EAAE;AAChC,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,EAAE;AAG5C,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,qBAAa,WAAW,SAAS,CAAC,CAAC;AAAA,MACrC;AAEA,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7C,CAAC;AAED,OAAG,kDAAkD,MAAM;AAEzD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,SAAG,MAAM;AAET,aAAO,MAAM,aAAa,SAAS,OAAO,CAAC,EAAE,QAAQ,aAAa;AAClE,aAAO,MAAM,aAAa,eAAe,OAAO,CAAC,EAAE,QAAQ,aAAa;AAAA,IAC1E,CAAC;AAED,OAAG,4CAA4C,MAAM;AACnD,UAAI;AACF,qBAAa,WAAW,kBAAkB;AAC1C,eAAO,KAAK,6BAA6B;AAAA,MAC3C,SAAS,OAAO;AACd,eAAO,KAAK,EAAE,eAAe,UAAU;AACvC,eAAQ,MAAqB,OAAO,EAAE,UAAU,iBAAiB;AACjE,eAAQ,MAAqB,IAAI,EAAE,KAAK,UAAU,eAAe;AAAA,MACnE;AAAA,IACF,CAAC;AAED,OAAG,4CAA4C,MAAM;AACnD,UAAI;AACF,qBAAa,UAAU,QAAQ,WAAW;AAC1C,eAAO,KAAK,6BAA6B;AAAA,MAC3C,SAAS,OAAO;AACd,eAAO,KAAK,EAAE,eAAe,UAAU;AACvC,eAAQ,MAAqB,OAAO,EAAE,cAAc;AAAA,UAClD,WAAW;AAAA,UACX,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,qBAAqB,MAAM;AAClC,OAAG,8BAA8B,MAAM;AACrC,YAAM,WAAW,CAAC;AAClB,YAAM,WAAW;AAEjB,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,cAAM,UAAU,aAAa,YAAY;AAAA,UACvC,MAAM,MAAM,IAAI,SAAS;AAAA,UACzB,MAAM,SAAS,CAAC;AAAA,QAClB,CAAC;AACD,iBAAS,KAAK,OAAO;AAErB,cAAM,QAAQ,aAAa,SAAS,OAAO;AAC3C,eAAO,MAAO,KAAK,EAAE,KAAK,CAAC;AAAA,MAC7B;AAEA,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,QAAQ;AAGlD,eAAS,IAAI,WAAW,GAAG,KAAK,GAAG,KAAK;AACtC,qBAAa,WAAW,SAAS,CAAC,CAAC;AAAA,MACrC;AAEA,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7C,CAAC;AAED,OAAG,oDAAoD,MAAM;AAC3D,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,qBAAa,SAAS,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO;AAAA,MAC7D;AAGA,YAAM,cAAc,CAAC,QAAQ,YAAY,cAAc,QAAQ,MAAM;AACrE,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,qBAAa;AAAA,UACX,YAAY,IAAI,YAAY,MAAM;AAAA,UAClC,WAAW,CAAC;AAAA,UACZ,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE;AAAA,UAC7B,EAAE,OAAO,EAAE;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,eAAe,OAAO;AAClD,aAAO,MAAM,EAAE,aAAa,GAAG;AAG/B,mBAAa,WAAW,SAAS;AAAA,QAC/B,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,kBAAkB;AAAA,MACpB,CAAC;AAED,YAAM,cAAc,aAAa,SAAS,OAAO;AACjD,aAAO,YAAa,WAAW,EAAE,YAAY;AAC7C,aAAO,YAAa,WAAW,EAAE,YAAY;AAC7C,aAAO,YAAa,YAAY,gBAAgB,EAAE,KAAK,CAAC;AACxD,aAAO,YAAa,KAAK,EAAE,KAAK,QAAQ;AAAA,IAC1C,CAAC;AAED,OAAG,wDAAwD,MAAM;AAC/D,YAAM,SAAS,aAAa,YAAY;AAAA,QACtC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,eAAe,aAAa,YAAY;AAAA,QAC5C,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,YAAY,aAAa,SAAS,MAAM;AAC9C,YAAM,aAAa,aAAa,SAAS,OAAO;AAChD,YAAM,kBAAkB,aAAa,SAAS,YAAY;AAE1D,aAAO,UAAW,KAAK,EAAE,KAAK,CAAC;AAC/B,aAAO,WAAY,KAAK,EAAE,KAAK,CAAC;AAChC,aAAO,gBAAiB,KAAK,EAAE,KAAK,CAAC;AAErC,aAAO,UAAW,eAAe,EAAE,SAAS;AAC5C,aAAO,WAAY,eAAe,EAAE,KAAK,MAAM;AAC/C,aAAO,gBAAiB,eAAe,EAAE,KAAK,OAAO;AAAA,IACvD,CAAC;AAED,OAAG,uDAAuD,MAAM;AAE9D,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,YAAM,gBAAiB,aAAqB;AAC5C,YAAM,kBAAkB,IAAI,aAAa,IAAI,WAAW,aAAa;AAGrE,aAAO,gBAAgB,cAAc,CAAC,EAAE,KAAK,CAAC;AAC9C,aAAO,gBAAgB,kBAAkB,CAAC,EAAE,KAAK,QAAQ;AAGzD,sBAAgB,SAAS,eAAe,EAAE,SAAS,oBAAoB,CAAC;AACxE,sBAAgB,WAAW;AAE3B,aAAO,gBAAgB,cAAc,CAAC,EAAE,KAAK,CAAC;AAC9C,aAAO,gBAAgB,kBAAkB,CAAC,EAAE,KAAK,QAAQ;AAAA,IAC3D,CAAC;AAED,OAAG,mDAAmD,MAAM;AAC1D,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,gBAAgB,EAAE,KAAK,aAAa,GAAG,OAAO;AACpE,mBAAa,UAAU,QAAQ,gBAAgB,GAAG,CAAC,GAAG,OAAO;AAE7D,mBAAa,SAAS,aAAa,EAAE,MAAM,WAAW,GAAG,OAAO;AAChE,mBAAa,UAAU,YAAY,qBAAqB,GAAG,CAAC,GAAG,OAAO;AAEtE,mBAAa,SAAS,eAAe,EAAE,QAAQ,oBAAoB,GAAG,OAAO;AAC7E,mBAAa,UAAU,cAAc,yBAAyB,GAAG,CAAC,GAAG,OAAO;AAE5E,mBAAa,SAAS,qBAAqB,EAAE,KAAK,gBAAgB,GAAG,OAAO;AAC5E,mBAAa,UAAU,QAAQ,qBAAqB,GAAG,CAAC,GAAG,OAAO;AAElE,YAAM,SAAS,aAAa,eAAe,OAAO;AAClD,aAAO,MAAM,EAAE,aAAa,CAAC;AAE7B,YAAM,WAAW,aAAa,mBAAmB;AACjD,YAAM,UAAU,SAAS,KAAK,SAAO,IAAI,YAAY,OAAO;AAC5D,aAAO,QAAS,OAAO,EAAE,aAAa,CAAC;AACvC,aAAO,QAAS,YAAY,EAAE,aAAa,CAAC;AAI5C,YAAM,gBAAgB,QAAS,aAAa,IAAI,OAAK,EAAE,QAAQ,GAAG,EAAE,OAAO,OAAO;AAClF,aAAO,aAAa,EAAE,UAAU,YAAY;AAC5C,aAAO,aAAa,EAAE,UAAU,eAAe;AAAA,IACjD,CAAC;AAED,OAAG,6CAA6C,MAAM;AACpD,YAAM,SAAS,aAAa,YAAY;AAAA,QACtC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,aAAa,YAAY;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAG3C,mBAAa,WAAW,QAAQ;AAGhC,aAAO,aAAa,SAAS,QAAQ,EAAG,KAAK,EAAE,KAAK,QAAQ;AAC5D,aAAO,aAAa,SAAS,QAAQ,EAAG,KAAK,EAAE,KAAK,QAAQ;AAC5D,aAAO,aAAa,cAAc,CAAC,EAAE,KAAK,CAAC;AAC3C,aAAO,aAAa,kBAAkB,CAAC,EAAE,KAAK,MAAM;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;AAED,WAAS,mCAAmC,MAAM;AAChD,OAAG,yCAAyC,MAAM;AAChD,YAAM,SAAS,GAAG,QAAQ;AAAA;AAAA;AAAA,OAGzB,EAAE,IAAI;AAEP,aAAO,MAAM,EAAE,aAAa,CAAC;AAC7B,aAAO,OAAO,IAAI,CAAC,MAAW,EAAE,IAAI,CAAC,EAAE,UAAU,QAAQ;AACzD,aAAO,OAAO,IAAI,CAAC,MAAW,EAAE,IAAI,CAAC,EAAE,UAAU,QAAQ;AACzD,aAAO,OAAO,IAAI,CAAC,MAAW,EAAE,IAAI,CAAC,EAAE,UAAU,SAAS;AAAA,IAC5D,CAAC;AAED,OAAG,kCAAkC,MAAM;AACzC,YAAM,UAAU,GAAG,QAAQ;AAAA;AAAA;AAAA,OAG1B,EAAE,IAAI;AAEP,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,sBAAgB,QAAQ,mBAAiB;AACvC,eAAO,QAAQ,KAAK,CAAC,QAAa,IAAI,SAAS,aAAa,CAAC,EAAE,KAAK,IAAI;AAAA,MAC1E,CAAC;AAAA,IACH,CAAC;AAED,OAAG,8CAA8C,MAAM;AACrD,YAAM,gBAAgB;AAAA,QACpB,QAAQ,EAAE,MAAM,EAAE,OAAO,OAAO,EAAE;AAAA,QAClC,OAAO,CAAC,GAAG,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAEA,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,QAAQ,aAAa,SAAS,OAAO;AAC3C,aAAO,MAAO,MAAM,EAAE,QAAQ,aAAa;AAAA,IAC7C,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,72 @@
1
+ import { logger } from "../monitoring/logger.js";
2
+ class AutoContext {
3
+ frameManager;
4
+ constructor(frameManager) {
5
+ this.frameManager = frameManager;
6
+ }
7
+ /**
8
+ * Initialize a session context
9
+ */
10
+ initializeSession(command) {
11
+ try {
12
+ const sessionFrame = this.frameManager.createFrame({
13
+ type: "task",
14
+ name: "Session",
15
+ inputs: {
16
+ command,
17
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
18
+ cwd: process.cwd()
19
+ }
20
+ });
21
+ logger.info("Session context initialized", {
22
+ frameId: sessionFrame,
23
+ depth: this.frameManager.getStackDepth()
24
+ });
25
+ } catch (error) {
26
+ logger.error("Failed to initialize session context", error);
27
+ }
28
+ }
29
+ /**
30
+ * Create a command context
31
+ */
32
+ createCommandContext(command, args) {
33
+ try {
34
+ const frameId = this.frameManager.createFrame({
35
+ type: "tool_scope",
36
+ name: command,
37
+ inputs: args
38
+ });
39
+ logger.info("Command context created", {
40
+ frameId,
41
+ command,
42
+ depth: this.frameManager.getStackDepth()
43
+ });
44
+ return frameId;
45
+ } catch (error) {
46
+ logger.error("Failed to create command context", error);
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Auto-save important context
52
+ */
53
+ autoSaveContext(data, importance = 5) {
54
+ try {
55
+ const currentFrame = this.frameManager.getCurrentFrameId();
56
+ if (currentFrame) {
57
+ this.frameManager.addEvent("observation", {
58
+ type: "context_save",
59
+ data,
60
+ importance,
61
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
62
+ }, currentFrame);
63
+ }
64
+ } catch (error) {
65
+ logger.error("Failed to auto-save context", error);
66
+ }
67
+ }
68
+ }
69
+ export {
70
+ AutoContext
71
+ };
72
+ //# sourceMappingURL=auto-context.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/context/auto-context.ts"],
4
+ "sourcesContent": ["/**\n * Auto-context management\n * Automatically creates and manages context frames\n */\n\nimport { FrameManager } from './frame-manager.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport class AutoContext {\n private frameManager: FrameManager;\n \n constructor(frameManager: FrameManager) {\n this.frameManager = frameManager;\n }\n \n /**\n * Initialize a session context\n */\n initializeSession(command?: string): void {\n try {\n // Create a root session frame\n const sessionFrame = this.frameManager.createFrame({\n type: 'task',\n name: 'Session',\n inputs: {\n command,\n timestamp: new Date().toISOString(),\n cwd: process.cwd(),\n }\n });\n \n logger.info('Session context initialized', { \n frameId: sessionFrame,\n depth: this.frameManager.getStackDepth() \n });\n } catch (error) {\n logger.error('Failed to initialize session context', error as Error);\n }\n }\n \n /**\n * Create a command context\n */\n createCommandContext(command: string, args?: any): string | null {\n try {\n const frameId = this.frameManager.createFrame({\n type: 'tool_scope',\n name: command,\n inputs: args\n });\n \n logger.info('Command context created', { \n frameId,\n command,\n depth: this.frameManager.getStackDepth() \n });\n \n return frameId;\n } catch (error) {\n logger.error('Failed to create command context', error as Error);\n return null;\n }\n }\n \n /**\n * Auto-save important context\n */\n autoSaveContext(data: any, importance: number = 5): void {\n try {\n const currentFrame = this.frameManager.getCurrentFrameId();\n if (currentFrame) {\n this.frameManager.addEvent('observation', {\n type: 'context_save',\n data,\n importance,\n timestamp: new Date().toISOString()\n }, currentFrame);\n }\n } catch (error) {\n logger.error('Failed to auto-save context', error as Error);\n }\n }\n}"],
5
+ "mappings": "AAMA,SAAS,cAAc;AAEhB,MAAM,YAAY;AAAA,EACf;AAAA,EAER,YAAY,cAA4B;AACtC,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAwB;AACxC,QAAI;AAEF,YAAM,eAAe,KAAK,aAAa,YAAY;AAAA,QACjD,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,KAAK,QAAQ,IAAI;AAAA,QACnB;AAAA,MACF,CAAC;AAED,aAAO,KAAK,+BAA+B;AAAA,QACzC,SAAS;AAAA,QACT,OAAO,KAAK,aAAa,cAAc;AAAA,MACzC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO,MAAM,wCAAwC,KAAc;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,SAAiB,MAA2B;AAC/D,QAAI;AACF,YAAM,UAAU,KAAK,aAAa,YAAY;AAAA,QAC5C,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAED,aAAO,KAAK,2BAA2B;AAAA,QACrC;AAAA,QACA;AAAA,QACA,OAAO,KAAK,aAAa,cAAc;AAAA,MACzC,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,MAAM,oCAAoC,KAAc;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAW,aAAqB,GAAS;AACvD,QAAI;AACF,YAAM,eAAe,KAAK,aAAa,kBAAkB;AACzD,UAAI,cAAc;AAChB,aAAK,aAAa,SAAS,eAAe;AAAA,UACxC,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,GAAG,YAAY;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,+BAA+B,KAAc;AAAA,IAC5D;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,326 @@
1
+ import { logger } from "../monitoring/logger.js";
2
+ class CompactionHandler {
3
+ frameManager;
4
+ metrics;
5
+ tokenAccumulator = 0;
6
+ preservedAnchors = /* @__PURE__ */ new Map();
7
+ constructor(frameManager) {
8
+ this.frameManager = frameManager;
9
+ this.metrics = {
10
+ estimatedTokens: 0,
11
+ warningThreshold: 15e4,
12
+ // 150K tokens
13
+ criticalThreshold: 17e4,
14
+ // 170K tokens
15
+ anchorsPreserved: 0
16
+ };
17
+ }
18
+ /**
19
+ * Track token usage from a message
20
+ */
21
+ trackTokens(content) {
22
+ const estimatedTokens = Math.ceil(content.length / 4);
23
+ this.tokenAccumulator += estimatedTokens;
24
+ this.metrics.estimatedTokens += estimatedTokens;
25
+ if (this.isApproachingCompaction()) {
26
+ this.preserveCriticalContext();
27
+ }
28
+ }
29
+ /**
30
+ * Check if approaching compaction threshold
31
+ */
32
+ isApproachingCompaction() {
33
+ return this.metrics.estimatedTokens >= this.metrics.warningThreshold;
34
+ }
35
+ /**
36
+ * Check if past critical threshold
37
+ */
38
+ isPastCriticalThreshold() {
39
+ return this.metrics.estimatedTokens >= this.metrics.criticalThreshold;
40
+ }
41
+ /**
42
+ * Detect if compaction likely occurred
43
+ */
44
+ detectCompactionEvent(content) {
45
+ const compactionIndicators = [
46
+ "earlier in this conversation",
47
+ "previously discussed",
48
+ "as mentioned before",
49
+ "summarized for brevity",
50
+ "[conversation compressed]",
51
+ "[context truncated]"
52
+ ];
53
+ const lowerContent = content.toLowerCase();
54
+ return compactionIndicators.some(
55
+ (indicator) => lowerContent.includes(indicator)
56
+ );
57
+ }
58
+ /**
59
+ * Preserve critical context before compaction
60
+ */
61
+ async preserveCriticalContext() {
62
+ try {
63
+ const currentFrameId = this.frameManager.getCurrentFrameId();
64
+ if (!currentFrameId) {
65
+ logger.warn("No active frame to preserve context from");
66
+ return;
67
+ }
68
+ const events = this.frameManager.getFrameEvents(currentFrameId);
69
+ const toolCalls = this.extractToolCalls(events);
70
+ const fileOps = this.extractFileOperations(events);
71
+ const decisions = this.extractDecisions(events);
72
+ const errorPatterns = this.extractErrorPatterns(events);
73
+ const anchor = {
74
+ anchor_id: `compact_${Date.now()}`,
75
+ type: "COMPACTION_PRESERVE",
76
+ priority: 10,
77
+ content: {
78
+ tool_calls: toolCalls,
79
+ file_operations: fileOps,
80
+ decisions,
81
+ error_resolutions: errorPatterns
82
+ },
83
+ created_at: Date.now(),
84
+ token_estimate: this.metrics.estimatedTokens
85
+ };
86
+ this.frameManager.addAnchor(
87
+ "CONSTRAINT",
88
+ // Using CONSTRAINT type for now
89
+ JSON.stringify(anchor),
90
+ 10,
91
+ {
92
+ compaction_preserve: true,
93
+ token_count: this.metrics.estimatedTokens
94
+ },
95
+ currentFrameId
96
+ );
97
+ this.preservedAnchors.set(anchor.anchor_id, anchor);
98
+ this.metrics.anchorsPreserved++;
99
+ logger.info(
100
+ `Preserved critical context at ${this.metrics.estimatedTokens} tokens`
101
+ );
102
+ } catch (error) {
103
+ logger.error(
104
+ "Failed to preserve critical context:",
105
+ error instanceof Error ? error : void 0
106
+ );
107
+ }
108
+ }
109
+ /**
110
+ * Extract tool calls from events
111
+ */
112
+ extractToolCalls(events) {
113
+ const toolCalls = [];
114
+ const toolEvents = events.filter((e) => e.event_type === "tool_call");
115
+ for (const event of toolEvents) {
116
+ const resultEvent = events.find(
117
+ (e) => e.event_type === "tool_result" && e.seq > event.seq && e.payload.tool_name === event.payload.tool_name
118
+ );
119
+ toolCalls.push({
120
+ tool: event.payload.tool_name || "unknown",
121
+ timestamp: event.ts,
122
+ key_inputs: this.extractKeyInputs(event.payload),
123
+ key_outputs: resultEvent ? this.extractKeyOutputs(resultEvent.payload) : {},
124
+ files_affected: this.extractAffectedFiles(
125
+ event.payload,
126
+ resultEvent?.payload
127
+ ),
128
+ success: resultEvent ? !resultEvent.payload.error : false,
129
+ error: resultEvent?.payload.error
130
+ });
131
+ }
132
+ return toolCalls;
133
+ }
134
+ /**
135
+ * Extract key inputs from tool call
136
+ */
137
+ extractKeyInputs(payload) {
138
+ const keys = [
139
+ "file_path",
140
+ "command",
141
+ "query",
142
+ "path",
143
+ "pattern",
144
+ "content"
145
+ ];
146
+ const result = {};
147
+ for (const key of keys) {
148
+ if (payload.arguments?.[key]) {
149
+ result[key] = payload.arguments[key];
150
+ }
151
+ }
152
+ return result;
153
+ }
154
+ /**
155
+ * Extract key outputs from tool result
156
+ */
157
+ extractKeyOutputs(payload) {
158
+ return {
159
+ success: !payload.error,
160
+ error: payload.error,
161
+ result_type: payload.result_type,
162
+ files_created: payload.files_created,
163
+ files_modified: payload.files_modified
164
+ };
165
+ }
166
+ /**
167
+ * Extract affected files from tool events
168
+ */
169
+ extractAffectedFiles(callPayload, resultPayload) {
170
+ const files = /* @__PURE__ */ new Set();
171
+ if (callPayload?.arguments?.file_path) {
172
+ files.add(callPayload.arguments.file_path);
173
+ }
174
+ if (callPayload?.arguments?.path) {
175
+ files.add(callPayload.arguments.path);
176
+ }
177
+ if (resultPayload?.files_created) {
178
+ resultPayload.files_created.forEach((f) => files.add(f));
179
+ }
180
+ if (resultPayload?.files_modified) {
181
+ resultPayload.files_modified.forEach((f) => files.add(f));
182
+ }
183
+ return Array.from(files);
184
+ }
185
+ /**
186
+ * Extract file operations from events
187
+ */
188
+ extractFileOperations(events) {
189
+ const fileOps = [];
190
+ const fileTools = ["Read", "Write", "Edit", "MultiEdit", "Delete"];
191
+ const toolEvents = events.filter(
192
+ (e) => e.event_type === "tool_call" && fileTools.includes(e.payload.tool_name)
193
+ );
194
+ for (const event of toolEvents) {
195
+ const operation = this.mapToolToOperation(event.payload.tool_name);
196
+ const path = event.payload.arguments?.file_path || event.payload.arguments?.path || "unknown";
197
+ fileOps.push({
198
+ type: operation,
199
+ path,
200
+ timestamp: event.ts,
201
+ success: true,
202
+ // Will be updated from result
203
+ error: void 0
204
+ });
205
+ }
206
+ return fileOps;
207
+ }
208
+ /**
209
+ * Map tool name to file operation type
210
+ */
211
+ mapToolToOperation(toolName) {
212
+ const mapping = {
213
+ Read: "read",
214
+ Write: "write",
215
+ Edit: "edit",
216
+ MultiEdit: "edit",
217
+ Delete: "delete"
218
+ };
219
+ return mapping[toolName] || "read";
220
+ }
221
+ /**
222
+ * Extract decisions from events
223
+ */
224
+ extractDecisions(events) {
225
+ const decisions = [];
226
+ const decisionEvents = events.filter((e) => e.event_type === "decision");
227
+ for (const event of decisionEvents) {
228
+ if (event.payload.text) {
229
+ decisions.push(event.payload.text);
230
+ }
231
+ }
232
+ return decisions;
233
+ }
234
+ /**
235
+ * Extract error patterns and resolutions
236
+ */
237
+ extractErrorPatterns(events) {
238
+ const patterns = [];
239
+ const errorEvents = events.filter(
240
+ (e) => e.event_type === "tool_result" && e.payload.error
241
+ );
242
+ for (const errorEvent of errorEvents) {
243
+ const subsequentTools = events.filter((e) => e.event_type === "tool_call" && e.seq > errorEvent.seq).slice(0, 3);
244
+ if (subsequentTools.length > 0) {
245
+ patterns.push({
246
+ error: errorEvent.payload.error,
247
+ resolution: `Attempted resolution with ${subsequentTools.map((t) => t.payload.tool_name).join(", ")}`,
248
+ tool_sequence: subsequentTools.map((t) => t.payload.tool_name),
249
+ timestamp: errorEvent.ts
250
+ });
251
+ }
252
+ }
253
+ return patterns;
254
+ }
255
+ /**
256
+ * Restore context after compaction detected
257
+ */
258
+ async restoreContext() {
259
+ if (this.preservedAnchors.size === 0) {
260
+ logger.warn("No preserved anchors to restore from");
261
+ return;
262
+ }
263
+ const anchors = Array.from(this.preservedAnchors.values());
264
+ anchors.sort((a, b) => b.created_at - a.created_at);
265
+ const latestAnchor = anchors[0];
266
+ const restorationFrame = this.frameManager.createFrame({
267
+ type: "review",
268
+ name: "Context Restoration After Compaction",
269
+ inputs: { reason: "autocompaction_detected" }
270
+ });
271
+ this.frameManager.addAnchor(
272
+ "FACT",
273
+ `Context restored from token position ${latestAnchor.token_estimate}`,
274
+ 10,
275
+ { restoration: true },
276
+ restorationFrame
277
+ );
278
+ const toolSequence = latestAnchor.content.tool_calls.map((t) => t.tool).join(" \u2192 ");
279
+ this.frameManager.addAnchor(
280
+ "FACT",
281
+ `Tool sequence: ${toolSequence}`,
282
+ 9,
283
+ {},
284
+ restorationFrame
285
+ );
286
+ const files = /* @__PURE__ */ new Set();
287
+ latestAnchor.content.file_operations.forEach((op) => files.add(op.path));
288
+ if (files.size > 0) {
289
+ this.frameManager.addAnchor(
290
+ "FACT",
291
+ `Files touched: ${Array.from(files).join(", ")}`,
292
+ 8,
293
+ {},
294
+ restorationFrame
295
+ );
296
+ }
297
+ for (const decision of latestAnchor.content.decisions) {
298
+ this.frameManager.addAnchor(
299
+ "DECISION",
300
+ decision,
301
+ 7,
302
+ {},
303
+ restorationFrame
304
+ );
305
+ }
306
+ logger.info("Context restored after compaction detection");
307
+ }
308
+ /**
309
+ * Get current metrics
310
+ */
311
+ getMetrics() {
312
+ return { ...this.metrics };
313
+ }
314
+ /**
315
+ * Reset token counter (e.g., at session start)
316
+ */
317
+ resetTokenCount() {
318
+ this.metrics.estimatedTokens = 0;
319
+ this.tokenAccumulator = 0;
320
+ this.metrics.lastCompactionAt = void 0;
321
+ }
322
+ }
323
+ export {
324
+ CompactionHandler
325
+ };
326
+ //# sourceMappingURL=compaction-handler.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/context/compaction-handler.ts"],
4
+ "sourcesContent": ["/**\n * Compaction Handler for Claude Code Autocompaction\n * Preserves critical context across token limit boundaries\n */\n\nimport { FrameManager, Anchor, Event } from './frame-manager.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface CompactionMetrics {\n estimatedTokens: number;\n warningThreshold: number;\n criticalThreshold: number;\n lastCompactionAt?: number;\n anchorsPreserved: number;\n}\n\nexport interface ToolCallSummary {\n tool: string;\n timestamp: number;\n key_inputs: Record<string, any>;\n key_outputs: Record<string, any>;\n files_affected: string[];\n success: boolean;\n error?: string;\n}\n\nexport interface CriticalContextAnchor {\n anchor_id: string;\n type: 'COMPACTION_PRESERVE';\n priority: 10; // Highest priority\n content: {\n tool_calls: ToolCallSummary[];\n decisions: string[];\n file_operations: FileOperation[];\n error_resolutions: ErrorPattern[];\n };\n created_at: number;\n token_estimate: number;\n}\n\nexport interface FileOperation {\n type: 'read' | 'write' | 'edit' | 'delete' | 'create';\n path: string;\n timestamp: number;\n success: boolean;\n error?: string;\n}\n\nexport interface ErrorPattern {\n error: string;\n resolution: string;\n tool_sequence: string[];\n timestamp: number;\n}\n\nexport class CompactionHandler {\n private frameManager: FrameManager;\n private metrics: CompactionMetrics;\n private tokenAccumulator: number = 0;\n private preservedAnchors: Map<string, CriticalContextAnchor> = new Map();\n\n constructor(frameManager: FrameManager) {\n this.frameManager = frameManager;\n this.metrics = {\n estimatedTokens: 0,\n warningThreshold: 150000, // 150K tokens\n criticalThreshold: 170000, // 170K tokens\n anchorsPreserved: 0,\n };\n }\n\n /**\n * Track token usage from a message\n */\n trackTokens(content: string): void {\n // Rough estimation: 1 token \u2248 4 characters\n const estimatedTokens = Math.ceil(content.length / 4);\n this.tokenAccumulator += estimatedTokens;\n this.metrics.estimatedTokens += estimatedTokens;\n\n // Check thresholds\n if (this.isApproachingCompaction()) {\n this.preserveCriticalContext();\n }\n }\n\n /**\n * Check if approaching compaction threshold\n */\n isApproachingCompaction(): boolean {\n return this.metrics.estimatedTokens >= this.metrics.warningThreshold;\n }\n\n /**\n * Check if past critical threshold\n */\n isPastCriticalThreshold(): boolean {\n return this.metrics.estimatedTokens >= this.metrics.criticalThreshold;\n }\n\n /**\n * Detect if compaction likely occurred\n */\n detectCompactionEvent(content: string): boolean {\n const compactionIndicators = [\n 'earlier in this conversation',\n 'previously discussed',\n 'as mentioned before',\n 'summarized for brevity',\n '[conversation compressed]',\n '[context truncated]',\n ];\n\n const lowerContent = content.toLowerCase();\n return compactionIndicators.some((indicator) =>\n lowerContent.includes(indicator)\n );\n }\n\n /**\n * Preserve critical context before compaction\n */\n async preserveCriticalContext(): Promise<void> {\n try {\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (!currentFrameId) {\n logger.warn('No active frame to preserve context from');\n return;\n }\n\n // Get events from current frame\n const events = this.frameManager.getFrameEvents(currentFrameId);\n\n // Extract critical information\n const toolCalls = this.extractToolCalls(events);\n const fileOps = this.extractFileOperations(events);\n const decisions = this.extractDecisions(events);\n const errorPatterns = this.extractErrorPatterns(events);\n\n // Create preservation anchor\n const anchor: CriticalContextAnchor = {\n anchor_id: `compact_${Date.now()}`,\n type: 'COMPACTION_PRESERVE',\n priority: 10,\n content: {\n tool_calls: toolCalls,\n file_operations: fileOps,\n decisions: decisions,\n error_resolutions: errorPatterns,\n },\n created_at: Date.now(),\n token_estimate: this.metrics.estimatedTokens,\n };\n\n // Store in frame manager as high-priority anchor\n this.frameManager.addAnchor(\n 'CONSTRAINT' as any, // Using CONSTRAINT type for now\n JSON.stringify(anchor),\n 10,\n {\n compaction_preserve: true,\n token_count: this.metrics.estimatedTokens,\n },\n currentFrameId\n );\n\n // Store locally for quick access\n this.preservedAnchors.set(anchor.anchor_id, anchor);\n this.metrics.anchorsPreserved++;\n\n logger.info(\n `Preserved critical context at ${this.metrics.estimatedTokens} tokens`\n );\n } catch (error) {\n logger.error(\n 'Failed to preserve critical context:',\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Extract tool calls from events\n */\n private extractToolCalls(events: Event[]): ToolCallSummary[] {\n const toolCalls: ToolCallSummary[] = [];\n const toolEvents = events.filter((e) => e.event_type === 'tool_call');\n\n for (const event of toolEvents) {\n const resultEvent = events.find(\n (e) =>\n e.event_type === 'tool_result' &&\n e.seq > event.seq &&\n e.payload.tool_name === event.payload.tool_name\n );\n\n toolCalls.push({\n tool: event.payload.tool_name || 'unknown',\n timestamp: event.ts,\n key_inputs: this.extractKeyInputs(event.payload),\n key_outputs: resultEvent\n ? this.extractKeyOutputs(resultEvent.payload)\n : {},\n files_affected: this.extractAffectedFiles(\n event.payload,\n resultEvent?.payload\n ),\n success: resultEvent ? !resultEvent.payload.error : false,\n error: resultEvent?.payload.error,\n });\n }\n\n return toolCalls;\n }\n\n /**\n * Extract key inputs from tool call\n */\n private extractKeyInputs(payload: any): Record<string, any> {\n const keys = [\n 'file_path',\n 'command',\n 'query',\n 'path',\n 'pattern',\n 'content',\n ];\n const result: Record<string, any> = {};\n\n for (const key of keys) {\n if (payload.arguments?.[key]) {\n result[key] = payload.arguments[key];\n }\n }\n\n return result;\n }\n\n /**\n * Extract key outputs from tool result\n */\n private extractKeyOutputs(payload: any): Record<string, any> {\n return {\n success: !payload.error,\n error: payload.error,\n result_type: payload.result_type,\n files_created: payload.files_created,\n files_modified: payload.files_modified,\n };\n }\n\n /**\n * Extract affected files from tool events\n */\n private extractAffectedFiles(callPayload: any, resultPayload: any): string[] {\n const files = new Set<string>();\n\n // From tool call\n if (callPayload?.arguments?.file_path) {\n files.add(callPayload.arguments.file_path);\n }\n if (callPayload?.arguments?.path) {\n files.add(callPayload.arguments.path);\n }\n\n // From tool result\n if (resultPayload?.files_created) {\n resultPayload.files_created.forEach((f: string) => files.add(f));\n }\n if (resultPayload?.files_modified) {\n resultPayload.files_modified.forEach((f: string) => files.add(f));\n }\n\n return Array.from(files);\n }\n\n /**\n * Extract file operations from events\n */\n private extractFileOperations(events: Event[]): FileOperation[] {\n const fileOps: FileOperation[] = [];\n const fileTools = ['Read', 'Write', 'Edit', 'MultiEdit', 'Delete'];\n\n const toolEvents = events.filter(\n (e) =>\n e.event_type === 'tool_call' && fileTools.includes(e.payload.tool_name)\n );\n\n for (const event of toolEvents) {\n const operation = this.mapToolToOperation(event.payload.tool_name);\n const path =\n event.payload.arguments?.file_path ||\n event.payload.arguments?.path ||\n 'unknown';\n\n fileOps.push({\n type: operation,\n path: path,\n timestamp: event.ts,\n success: true, // Will be updated from result\n error: undefined,\n });\n }\n\n return fileOps;\n }\n\n /**\n * Map tool name to file operation type\n */\n private mapToolToOperation(toolName: string): FileOperation['type'] {\n const mapping: Record<string, FileOperation['type']> = {\n Read: 'read',\n Write: 'write',\n Edit: 'edit',\n MultiEdit: 'edit',\n Delete: 'delete',\n };\n\n return mapping[toolName] || 'read';\n }\n\n /**\n * Extract decisions from events\n */\n private extractDecisions(events: Event[]): string[] {\n const decisions: string[] = [];\n\n const decisionEvents = events.filter((e) => e.event_type === 'decision');\n for (const event of decisionEvents) {\n if (event.payload.text) {\n decisions.push(event.payload.text);\n }\n }\n\n return decisions;\n }\n\n /**\n * Extract error patterns and resolutions\n */\n private extractErrorPatterns(events: Event[]): ErrorPattern[] {\n const patterns: ErrorPattern[] = [];\n\n // Find tool results with errors\n const errorEvents = events.filter(\n (e) => e.event_type === 'tool_result' && e.payload.error\n );\n\n for (const errorEvent of errorEvents) {\n // Look for subsequent successful tool calls that might be resolutions\n const subsequentTools = events\n .filter((e) => e.event_type === 'tool_call' && e.seq > errorEvent.seq)\n .slice(0, 3); // Next 3 tools might be resolution attempts\n\n if (subsequentTools.length > 0) {\n patterns.push({\n error: errorEvent.payload.error,\n resolution: `Attempted resolution with ${subsequentTools.map((t) => t.payload.tool_name).join(', ')}`,\n tool_sequence: subsequentTools.map((t) => t.payload.tool_name),\n timestamp: errorEvent.ts,\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Restore context after compaction detected\n */\n async restoreContext(): Promise<void> {\n if (this.preservedAnchors.size === 0) {\n logger.warn('No preserved anchors to restore from');\n return;\n }\n\n // Get the most recent anchor\n const anchors = Array.from(this.preservedAnchors.values());\n anchors.sort((a, b) => b.created_at - a.created_at);\n const latestAnchor = anchors[0];\n\n // Create restoration frame\n const restorationFrame = this.frameManager.createFrame({\n type: 'review',\n name: 'Context Restoration After Compaction',\n inputs: { reason: 'autocompaction_detected' },\n });\n\n // Add restoration anchor\n this.frameManager.addAnchor(\n 'FACT',\n `Context restored from token position ${latestAnchor.token_estimate}`,\n 10,\n { restoration: true },\n restorationFrame\n );\n\n // Add tool sequence summary\n const toolSequence = latestAnchor.content.tool_calls\n .map((t) => t.tool)\n .join(' \u2192 ');\n this.frameManager.addAnchor(\n 'FACT',\n `Tool sequence: ${toolSequence}`,\n 9,\n {},\n restorationFrame\n );\n\n // Add file operations summary\n const files = new Set<string>();\n latestAnchor.content.file_operations.forEach((op) => files.add(op.path));\n if (files.size > 0) {\n this.frameManager.addAnchor(\n 'FACT',\n `Files touched: ${Array.from(files).join(', ')}`,\n 8,\n {},\n restorationFrame\n );\n }\n\n // Add decisions\n for (const decision of latestAnchor.content.decisions) {\n this.frameManager.addAnchor(\n 'DECISION',\n decision,\n 7,\n {},\n restorationFrame\n );\n }\n\n logger.info('Context restored after compaction detection');\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): CompactionMetrics {\n return { ...this.metrics };\n }\n\n /**\n * Reset token counter (e.g., at session start)\n */\n resetTokenCount(): void {\n this.metrics.estimatedTokens = 0;\n this.tokenAccumulator = 0;\n this.metrics.lastCompactionAt = undefined;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }