@stackmemoryai/stackmemory 0.3.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (736) hide show
  1. package/README.md +52 -272
  2. package/dist/cli/codex-sm.js +48 -19
  3. package/dist/cli/codex-sm.js.map +2 -2
  4. package/dist/cli/commands/clear.js +191 -0
  5. package/dist/cli/commands/clear.js.map +7 -0
  6. package/dist/cli/commands/config.js +152 -1
  7. package/dist/cli/commands/config.js.map +2 -2
  8. package/dist/cli/commands/dashboard.js +178 -0
  9. package/dist/cli/commands/dashboard.js.map +7 -0
  10. package/dist/cli/commands/handoff.js +125 -8
  11. package/dist/cli/commands/handoff.js.map +2 -2
  12. package/dist/cli/commands/linear-create.js +132 -0
  13. package/dist/cli/commands/linear-create.js.map +7 -0
  14. package/dist/cli/commands/linear-list.js +69 -0
  15. package/dist/cli/commands/linear-list.js.map +7 -0
  16. package/dist/cli/commands/linear-migrate.js +40 -0
  17. package/dist/cli/commands/linear-migrate.js.map +7 -0
  18. package/dist/cli/commands/linear.js +185 -36
  19. package/dist/cli/commands/linear.js.map +2 -2
  20. package/dist/cli/commands/monitor.js +309 -0
  21. package/dist/cli/commands/monitor.js.map +7 -0
  22. package/dist/cli/commands/quality.js +414 -0
  23. package/dist/cli/commands/quality.js.map +7 -0
  24. package/dist/cli/commands/storage.js +275 -0
  25. package/dist/cli/commands/storage.js.map +7 -0
  26. package/dist/cli/commands/tui.js +66 -0
  27. package/dist/cli/commands/tui.js.map +7 -0
  28. package/dist/cli/commands/workflow.js +134 -0
  29. package/dist/cli/commands/workflow.js.map +7 -0
  30. package/dist/cli/index.js +105 -9
  31. package/dist/cli/index.js.map +3 -3
  32. package/dist/core/analytics/team-analytics.js +374 -0
  33. package/dist/core/analytics/team-analytics.js.map +7 -0
  34. package/dist/core/context/context-bridge.js +234 -0
  35. package/dist/core/context/context-bridge.js.map +7 -0
  36. package/dist/core/context/dual-stack-manager.js +850 -0
  37. package/dist/core/context/dual-stack-manager.js.map +7 -0
  38. package/dist/core/context/frame-handoff-manager.js +384 -0
  39. package/dist/core/context/frame-handoff-manager.js.map +7 -0
  40. package/dist/core/context/frame-manager.js +132 -12
  41. package/dist/core/context/frame-manager.js.map +2 -2
  42. package/dist/core/context/permission-manager.js +181 -0
  43. package/dist/core/context/permission-manager.js.map +7 -0
  44. package/dist/core/context/shared-context-layer.js +386 -0
  45. package/dist/core/context/shared-context-layer.js.map +7 -0
  46. package/dist/core/context/stack-merge-resolver.js +600 -0
  47. package/dist/core/context/stack-merge-resolver.js.map +7 -0
  48. package/dist/core/context/validation.js +121 -0
  49. package/dist/core/context/validation.js.map +7 -0
  50. package/dist/core/database/connection-pool.js +266 -175
  51. package/dist/core/database/connection-pool.js.map +2 -2
  52. package/dist/core/database/database-adapter.js +51 -0
  53. package/dist/core/database/database-adapter.js.map +7 -0
  54. package/dist/core/database/migration-manager.js +514 -0
  55. package/dist/core/database/migration-manager.js.map +7 -0
  56. package/dist/core/database/paradedb-adapter.js +970 -0
  57. package/dist/core/database/paradedb-adapter.js.map +7 -0
  58. package/dist/core/database/query-router.js +421 -0
  59. package/dist/core/database/query-router.js.map +7 -0
  60. package/dist/core/database/sqlite-adapter.js +547 -0
  61. package/dist/core/database/sqlite-adapter.js.map +7 -0
  62. package/dist/core/errors/index.js +21 -1
  63. package/dist/core/errors/index.js.map +2 -2
  64. package/dist/core/frame/workflow-templates-stub.js +42 -0
  65. package/dist/core/frame/workflow-templates-stub.js.map +7 -0
  66. package/dist/core/frame/workflow-templates.js +276 -0
  67. package/dist/core/frame/workflow-templates.js.map +7 -0
  68. package/dist/core/merge/conflict-detector.js +5 -2
  69. package/dist/core/merge/conflict-detector.js.map +2 -2
  70. package/dist/core/merge/resolution-engine.js +3 -14
  71. package/dist/core/merge/resolution-engine.js.map +2 -2
  72. package/dist/core/merge/stack-diff.js.map +2 -2
  73. package/dist/core/monitoring/logger.js +18 -3
  74. package/dist/core/monitoring/logger.js.map +2 -2
  75. package/dist/core/monitoring/session-monitor.js +296 -0
  76. package/dist/core/monitoring/session-monitor.js.map +7 -0
  77. package/dist/core/retrieval/context-retriever.js +475 -0
  78. package/dist/core/retrieval/context-retriever.js.map +7 -0
  79. package/dist/core/retrieval/graph-retrieval.js +658 -0
  80. package/dist/core/retrieval/graph-retrieval.js.map +7 -0
  81. package/dist/core/retrieval/hierarchical-retrieval.js +652 -0
  82. package/dist/core/retrieval/hierarchical-retrieval.js.map +7 -0
  83. package/dist/core/retrieval/retrieval-benchmarks.js +517 -0
  84. package/dist/core/retrieval/retrieval-benchmarks.js.map +7 -0
  85. package/dist/core/session/clear-survival-stub.js +49 -0
  86. package/dist/core/session/clear-survival-stub.js.map +7 -0
  87. package/dist/core/session/clear-survival.js +426 -0
  88. package/dist/core/session/clear-survival.js.map +7 -0
  89. package/dist/core/session/handoff-generator.js +339 -0
  90. package/dist/core/session/handoff-generator.js.map +7 -0
  91. package/dist/core/session/session-manager.js +61 -26
  92. package/dist/core/session/session-manager.js.map +3 -3
  93. package/dist/core/skills/index.js +3 -0
  94. package/dist/core/skills/index.js.map +7 -0
  95. package/dist/core/skills/skill-storage.js +749 -0
  96. package/dist/core/skills/skill-storage.js.map +7 -0
  97. package/dist/core/skills/types.js +189 -0
  98. package/dist/core/skills/types.js.map +7 -0
  99. package/dist/core/storage/railway-optimized-storage.js +550 -0
  100. package/dist/core/storage/railway-optimized-storage.js.map +7 -0
  101. package/dist/core/storage/remote-storage.js +456 -0
  102. package/dist/core/storage/remote-storage.js.map +7 -0
  103. package/dist/core/trace/trace-detector.js +136 -5
  104. package/dist/core/trace/trace-detector.js.map +2 -2
  105. package/dist/core/trace/trace-store.js.map +2 -2
  106. package/dist/features/tui/components/analytics-panel.js +136 -0
  107. package/dist/features/tui/components/analytics-panel.js.map +7 -0
  108. package/dist/features/tui/components/frame-visualizer.js +377 -0
  109. package/dist/features/tui/components/frame-visualizer.js.map +7 -0
  110. package/dist/features/tui/components/pr-tracker.js +123 -0
  111. package/dist/features/tui/components/pr-tracker.js.map +7 -0
  112. package/dist/features/tui/components/session-monitor.js +286 -0
  113. package/dist/features/tui/components/session-monitor.js.map +7 -0
  114. package/dist/features/tui/components/subagent-fleet.js +388 -0
  115. package/dist/features/tui/components/subagent-fleet.js.map +7 -0
  116. package/dist/features/tui/components/task-board.js +475 -0
  117. package/dist/features/tui/components/task-board.js.map +7 -0
  118. package/dist/features/tui/index.js +397 -0
  119. package/dist/features/tui/index.js.map +7 -0
  120. package/dist/features/tui/services/data-service.js +654 -0
  121. package/dist/features/tui/services/data-service.js.map +7 -0
  122. package/dist/features/tui/services/websocket-client.js +149 -0
  123. package/dist/features/tui/services/websocket-client.js.map +7 -0
  124. package/dist/features/tui/terminal-compat.js +205 -0
  125. package/dist/features/tui/terminal-compat.js.map +7 -0
  126. package/dist/features/tui/types.js +1 -0
  127. package/dist/features/tui/types.js.map +7 -0
  128. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +455 -0
  129. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  130. package/dist/integrations/claude-code/lifecycle-hooks.js +250 -0
  131. package/dist/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  132. package/dist/integrations/claude-code/post-task-hooks.js +541 -0
  133. package/dist/integrations/claude-code/post-task-hooks.js.map +7 -0
  134. package/dist/integrations/linear/client.js +22 -4
  135. package/dist/integrations/linear/client.js.map +2 -2
  136. package/dist/integrations/linear/migration.js +299 -0
  137. package/dist/integrations/linear/migration.js.map +7 -0
  138. package/dist/integrations/linear/oauth-server.js +396 -0
  139. package/dist/integrations/linear/oauth-server.js.map +7 -0
  140. package/dist/integrations/linear/rest-client.js +199 -0
  141. package/dist/integrations/linear/rest-client.js.map +7 -0
  142. package/dist/integrations/linear/sync.js +14 -2
  143. package/dist/integrations/linear/sync.js.map +2 -2
  144. package/dist/integrations/linear/webhook-handler.js +200 -0
  145. package/dist/integrations/linear/webhook-handler.js.map +7 -0
  146. package/dist/integrations/mcp/handlers/skill-handlers.js +514 -0
  147. package/dist/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  148. package/dist/integrations/mcp/middleware/tool-scoring.js +352 -0
  149. package/dist/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  150. package/dist/integrations/mcp/refactored-server.js +31 -3
  151. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  152. package/dist/integrations/mcp/server.js +25 -7
  153. package/dist/integrations/mcp/server.js.map +2 -2
  154. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  155. package/dist/models/user.model.js +3 -0
  156. package/dist/models/user.model.js.map +2 -2
  157. package/dist/services/context-service.js.map +2 -2
  158. package/dist/utils/formatting.js +58 -0
  159. package/dist/utils/formatting.js.map +7 -0
  160. package/package.json +24 -5
  161. package/dist/cli/__tests__/index.test.js +0 -290
  162. package/dist/cli/__tests__/index.test.js.map +0 -7
  163. package/dist/core/config/__tests__/config-manager.test.js +0 -248
  164. package/dist/core/config/__tests__/config-manager.test.js.map +0 -7
  165. package/dist/core/context/__tests__/frame-manager.test.js +0 -879
  166. package/dist/core/context/__tests__/frame-manager.test.js.map +0 -7
  167. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +0 -379
  168. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +0 -7
  169. package/dist/core/digest/__tests__/frame-digest-integration.test.js +0 -230
  170. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +0 -7
  171. package/dist/core/errors/__tests__/error-handling.test.js +0 -270
  172. package/dist/core/errors/__tests__/error-handling.test.js.map +0 -7
  173. package/dist/core/merge/__tests__/conflict-scenarios.test.js +0 -414
  174. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +0 -7
  175. package/dist/core/query/__tests__/query-parser.test.js +0 -301
  176. package/dist/core/query/__tests__/query-parser.test.js.map +0 -7
  177. package/dist/core/query/__tests__/query-templates.test.js +0 -210
  178. package/dist/core/query/__tests__/query-templates.test.js.map +0 -7
  179. package/dist/core/trace/trace-detector.test.js +0 -401
  180. package/dist/core/trace/trace-detector.test.js.map +0 -7
  181. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +0 -747
  182. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +0 -7
  183. package/dist/integrations/linear/__tests__/auth.test.js +0 -558
  184. package/dist/integrations/linear/__tests__/auth.test.js.map +0 -7
  185. package/dist/integrations/linear/__tests__/sync-service.test.js +0 -760
  186. package/dist/integrations/linear/__tests__/sync-service.test.js.map +0 -7
  187. package/dist/integrations/mcp/__tests__/server.test.js +0 -798
  188. package/dist/integrations/mcp/__tests__/server.test.js.map +0 -7
  189. package/dist/scripts/benchmark-performance.d.ts +0 -7
  190. package/dist/scripts/benchmark-performance.d.ts.map +0 -1
  191. package/dist/scripts/benchmark-performance.js +0 -44
  192. package/dist/scripts/benchmark-performance.js.map +0 -1
  193. package/dist/scripts/cancel-duplicate-tasks.d.ts +0 -7
  194. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +0 -1
  195. package/dist/scripts/cancel-duplicate-tasks.js +0 -172
  196. package/dist/scripts/cancel-duplicate-tasks.js.map +0 -1
  197. package/dist/scripts/cleanup-duplicate-tasks.d.ts +0 -12
  198. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +0 -1
  199. package/dist/scripts/cleanup-duplicate-tasks.js +0 -215
  200. package/dist/scripts/cleanup-duplicate-tasks.js.map +0 -1
  201. package/dist/scripts/initialize.d.ts +0 -6
  202. package/dist/scripts/initialize.d.ts.map +0 -1
  203. package/dist/scripts/initialize.js +0 -93
  204. package/dist/scripts/initialize.js.map +0 -1
  205. package/dist/scripts/list-linear-tasks.d.ts +0 -6
  206. package/dist/scripts/list-linear-tasks.d.ts.map +0 -1
  207. package/dist/scripts/list-linear-tasks.js +0 -121
  208. package/dist/scripts/list-linear-tasks.js.map +0 -1
  209. package/dist/scripts/merge-linear-duplicates-safe.d.ts +0 -7
  210. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +0 -1
  211. package/dist/scripts/merge-linear-duplicates-safe.js +0 -267
  212. package/dist/scripts/merge-linear-duplicates-safe.js.map +0 -1
  213. package/dist/scripts/show-linear-summary.d.ts +0 -6
  214. package/dist/scripts/show-linear-summary.d.ts.map +0 -1
  215. package/dist/scripts/show-linear-summary.js +0 -120
  216. package/dist/scripts/show-linear-summary.js.map +0 -1
  217. package/dist/scripts/status.d.ts +0 -6
  218. package/dist/scripts/status.d.ts.map +0 -1
  219. package/dist/scripts/status.js +0 -101
  220. package/dist/scripts/status.js.map +0 -1
  221. package/dist/src/agents/core/agent-task-manager.d.ts +0 -154
  222. package/dist/src/agents/core/agent-task-manager.d.ts.map +0 -1
  223. package/dist/src/agents/core/agent-task-manager.js +0 -504
  224. package/dist/src/agents/core/agent-task-manager.js.map +0 -1
  225. package/dist/src/agents/verifiers/base-verifier.d.ts +0 -112
  226. package/dist/src/agents/verifiers/base-verifier.d.ts.map +0 -1
  227. package/dist/src/agents/verifiers/base-verifier.js +0 -130
  228. package/dist/src/agents/verifiers/base-verifier.js.map +0 -1
  229. package/dist/src/agents/verifiers/formatter-verifier.d.ts +0 -14
  230. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +0 -1
  231. package/dist/src/agents/verifiers/formatter-verifier.js +0 -107
  232. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -1
  233. package/dist/src/agents/verifiers/llm-judge.d.ts +0 -46
  234. package/dist/src/agents/verifiers/llm-judge.d.ts.map +0 -1
  235. package/dist/src/agents/verifiers/llm-judge.js +0 -248
  236. package/dist/src/agents/verifiers/llm-judge.js.map +0 -1
  237. package/dist/src/cli/auto-detect.d.ts +0 -61
  238. package/dist/src/cli/auto-detect.d.ts.map +0 -1
  239. package/dist/src/cli/auto-detect.js +0 -350
  240. package/dist/src/cli/auto-detect.js.map +0 -1
  241. package/dist/src/cli/browser-test.d.ts +0 -6
  242. package/dist/src/cli/browser-test.d.ts.map +0 -1
  243. package/dist/src/cli/browser-test.js +0 -32
  244. package/dist/src/cli/browser-test.js.map +0 -1
  245. package/dist/src/cli/claude-sm.d.ts +0 -7
  246. package/dist/src/cli/claude-sm.d.ts.map +0 -1
  247. package/dist/src/cli/claude-sm.js +0 -412
  248. package/dist/src/cli/claude-sm.js.map +0 -1
  249. package/dist/src/cli/commands/agent.d.ts +0 -9
  250. package/dist/src/cli/commands/agent.d.ts.map +0 -1
  251. package/dist/src/cli/commands/agent.js +0 -303
  252. package/dist/src/cli/commands/agent.js.map +0 -1
  253. package/dist/src/cli/commands/config.d.ts +0 -6
  254. package/dist/src/cli/commands/config.d.ts.map +0 -1
  255. package/dist/src/cli/commands/config.js +0 -224
  256. package/dist/src/cli/commands/config.js.map +0 -1
  257. package/dist/src/cli/commands/context.d.ts +0 -7
  258. package/dist/src/cli/commands/context.d.ts.map +0 -1
  259. package/dist/src/cli/commands/context.js +0 -365
  260. package/dist/src/cli/commands/context.js.map +0 -1
  261. package/dist/src/cli/commands/handoff.d.ts +0 -6
  262. package/dist/src/cli/commands/handoff.d.ts.map +0 -1
  263. package/dist/src/cli/commands/handoff.js +0 -212
  264. package/dist/src/cli/commands/handoff.js.map +0 -1
  265. package/dist/src/cli/commands/linear-test.d.ts +0 -6
  266. package/dist/src/cli/commands/linear-test.d.ts.map +0 -1
  267. package/dist/src/cli/commands/linear-test.js +0 -123
  268. package/dist/src/cli/commands/linear-test.js.map +0 -1
  269. package/dist/src/cli/commands/linear.d.ts +0 -6
  270. package/dist/src/cli/commands/linear.d.ts.map +0 -1
  271. package/dist/src/cli/commands/linear.js +0 -393
  272. package/dist/src/cli/commands/linear.js.map +0 -1
  273. package/dist/src/cli/commands/log.d.ts +0 -7
  274. package/dist/src/cli/commands/log.d.ts.map +0 -1
  275. package/dist/src/cli/commands/log.js +0 -168
  276. package/dist/src/cli/commands/log.js.map +0 -1
  277. package/dist/src/cli/commands/onboard.d.ts +0 -8
  278. package/dist/src/cli/commands/onboard.d.ts.map +0 -1
  279. package/dist/src/cli/commands/onboard.js +0 -363
  280. package/dist/src/cli/commands/onboard.js.map +0 -1
  281. package/dist/src/cli/commands/projects.d.ts +0 -8
  282. package/dist/src/cli/commands/projects.d.ts.map +0 -1
  283. package/dist/src/cli/commands/projects.js +0 -220
  284. package/dist/src/cli/commands/projects.js.map +0 -1
  285. package/dist/src/cli/commands/search.d.ts +0 -7
  286. package/dist/src/cli/commands/search.d.ts.map +0 -1
  287. package/dist/src/cli/commands/search.js +0 -162
  288. package/dist/src/cli/commands/search.js.map +0 -1
  289. package/dist/src/cli/commands/session.d.ts +0 -7
  290. package/dist/src/cli/commands/session.d.ts.map +0 -1
  291. package/dist/src/cli/commands/session.js +0 -222
  292. package/dist/src/cli/commands/session.js.map +0 -1
  293. package/dist/src/cli/commands/tasks.d.ts +0 -7
  294. package/dist/src/cli/commands/tasks.d.ts.map +0 -1
  295. package/dist/src/cli/commands/tasks.js +0 -229
  296. package/dist/src/cli/commands/tasks.js.map +0 -1
  297. package/dist/src/cli/commands/webhook.d.ts +0 -3
  298. package/dist/src/cli/commands/webhook.d.ts.map +0 -1
  299. package/dist/src/cli/commands/webhook.js +0 -157
  300. package/dist/src/cli/commands/webhook.js.map +0 -1
  301. package/dist/src/cli/commands/worktree.d.ts +0 -8
  302. package/dist/src/cli/commands/worktree.d.ts.map +0 -1
  303. package/dist/src/cli/commands/worktree.js +0 -339
  304. package/dist/src/cli/commands/worktree.js.map +0 -1
  305. package/dist/src/cli/index.d.ts +0 -8
  306. package/dist/src/cli/index.d.ts.map +0 -1
  307. package/dist/src/cli/index.js +0 -995
  308. package/dist/src/cli/index.js.map +0 -1
  309. package/dist/src/cli/utils/viewer.d.ts +0 -3
  310. package/dist/src/cli/utils/viewer.d.ts.map +0 -1
  311. package/dist/src/cli/utils/viewer.js +0 -91
  312. package/dist/src/cli/utils/viewer.js.map +0 -1
  313. package/dist/src/core/config/config-manager.d.ts +0 -95
  314. package/dist/src/core/config/config-manager.d.ts.map +0 -1
  315. package/dist/src/core/config/config-manager.js +0 -359
  316. package/dist/src/core/config/config-manager.js.map +0 -1
  317. package/dist/src/core/config/types.d.ts +0 -72
  318. package/dist/src/core/config/types.d.ts.map +0 -1
  319. package/dist/src/core/config/types.js +0 -127
  320. package/dist/src/core/config/types.js.map +0 -1
  321. package/dist/src/core/context/auto-context.d.ts +0 -22
  322. package/dist/src/core/context/auto-context.d.ts.map +0 -1
  323. package/dist/src/core/context/auto-context.js +0 -77
  324. package/dist/src/core/context/auto-context.js.map +0 -1
  325. package/dist/src/core/context/compaction-handler.d.ts +0 -119
  326. package/dist/src/core/context/compaction-handler.d.ts.map +0 -1
  327. package/dist/src/core/context/compaction-handler.js +0 -306
  328. package/dist/src/core/context/compaction-handler.js.map +0 -1
  329. package/dist/src/core/context/frame-database.d.ts +0 -59
  330. package/dist/src/core/context/frame-database.d.ts.map +0 -1
  331. package/dist/src/core/context/frame-database.js +0 -333
  332. package/dist/src/core/context/frame-database.js.map +0 -1
  333. package/dist/src/core/context/frame-digest.d.ts +0 -59
  334. package/dist/src/core/context/frame-digest.d.ts.map +0 -1
  335. package/dist/src/core/context/frame-digest.js +0 -264
  336. package/dist/src/core/context/frame-digest.js.map +0 -1
  337. package/dist/src/core/context/frame-manager.d.ts +0 -112
  338. package/dist/src/core/context/frame-manager.d.ts.map +0 -1
  339. package/dist/src/core/context/frame-manager.js +0 -600
  340. package/dist/src/core/context/frame-manager.js.map +0 -1
  341. package/dist/src/core/context/frame-stack.d.ts +0 -85
  342. package/dist/src/core/context/frame-stack.d.ts.map +0 -1
  343. package/dist/src/core/context/frame-stack.js +0 -287
  344. package/dist/src/core/context/frame-stack.js.map +0 -1
  345. package/dist/src/core/context/frame-types.d.ts +0 -67
  346. package/dist/src/core/context/frame-types.d.ts.map +0 -1
  347. package/dist/src/core/context/frame-types.js +0 -6
  348. package/dist/src/core/context/frame-types.js.map +0 -1
  349. package/dist/src/core/context/index.d.ts +0 -11
  350. package/dist/src/core/context/index.d.ts.map +0 -1
  351. package/dist/src/core/context/index.js +0 -14
  352. package/dist/src/core/context/index.js.map +0 -1
  353. package/dist/src/core/context/model-aware-compaction.d.ts +0 -101
  354. package/dist/src/core/context/model-aware-compaction.d.ts.map +0 -1
  355. package/dist/src/core/context/model-aware-compaction.js +0 -616
  356. package/dist/src/core/context/model-aware-compaction.js.map +0 -1
  357. package/dist/src/core/context/refactored-frame-manager.d.ts +0 -99
  358. package/dist/src/core/context/refactored-frame-manager.d.ts.map +0 -1
  359. package/dist/src/core/context/refactored-frame-manager.js +0 -340
  360. package/dist/src/core/context/refactored-frame-manager.js.map +0 -1
  361. package/dist/src/core/database/batch-operations.d.ts +0 -118
  362. package/dist/src/core/database/batch-operations.d.ts.map +0 -1
  363. package/dist/src/core/database/batch-operations.js +0 -339
  364. package/dist/src/core/database/batch-operations.js.map +0 -1
  365. package/dist/src/core/database/connection-pool.d.ts +0 -79
  366. package/dist/src/core/database/connection-pool.d.ts.map +0 -1
  367. package/dist/src/core/database/connection-pool.js +0 -236
  368. package/dist/src/core/database/connection-pool.js.map +0 -1
  369. package/dist/src/core/database/query-cache.d.ts +0 -135
  370. package/dist/src/core/database/query-cache.d.ts.map +0 -1
  371. package/dist/src/core/database/query-cache.js +0 -294
  372. package/dist/src/core/database/query-cache.js.map +0 -1
  373. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +0 -125
  374. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +0 -1
  375. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -282
  376. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -1
  377. package/dist/src/core/digest/frame-digest-integration.d.ts +0 -67
  378. package/dist/src/core/digest/frame-digest-integration.d.ts.map +0 -1
  379. package/dist/src/core/digest/frame-digest-integration.js +0 -198
  380. package/dist/src/core/digest/frame-digest-integration.js.map +0 -1
  381. package/dist/src/core/digest/hybrid-digest-generator.d.ts +0 -76
  382. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +0 -1
  383. package/dist/src/core/digest/hybrid-digest-generator.js +0 -629
  384. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -1
  385. package/dist/src/core/digest/index.d.ts +0 -9
  386. package/dist/src/core/digest/index.d.ts.map +0 -1
  387. package/dist/src/core/digest/index.js +0 -9
  388. package/dist/src/core/digest/index.js.map +0 -1
  389. package/dist/src/core/digest/types.d.ts +0 -154
  390. package/dist/src/core/digest/types.d.ts.map +0 -1
  391. package/dist/src/core/digest/types.js +0 -18
  392. package/dist/src/core/digest/types.js.map +0 -1
  393. package/dist/src/core/errors/index.d.ts +0 -143
  394. package/dist/src/core/errors/index.d.ts.map +0 -1
  395. package/dist/src/core/errors/index.js +0 -282
  396. package/dist/src/core/errors/index.js.map +0 -1
  397. package/dist/src/core/errors/recovery.d.ts +0 -86
  398. package/dist/src/core/errors/recovery.d.ts.map +0 -1
  399. package/dist/src/core/errors/recovery.js +0 -274
  400. package/dist/src/core/errors/recovery.js.map +0 -1
  401. package/dist/src/core/merge/conflict-detector.d.ts +0 -122
  402. package/dist/src/core/merge/conflict-detector.d.ts.map +0 -1
  403. package/dist/src/core/merge/conflict-detector.js +0 -468
  404. package/dist/src/core/merge/conflict-detector.js.map +0 -1
  405. package/dist/src/core/merge/index.d.ts +0 -9
  406. package/dist/src/core/merge/index.d.ts.map +0 -1
  407. package/dist/src/core/merge/index.js +0 -9
  408. package/dist/src/core/merge/index.js.map +0 -1
  409. package/dist/src/core/merge/resolution-engine.d.ts +0 -120
  410. package/dist/src/core/merge/resolution-engine.d.ts.map +0 -1
  411. package/dist/src/core/merge/resolution-engine.js +0 -573
  412. package/dist/src/core/merge/resolution-engine.js.map +0 -1
  413. package/dist/src/core/merge/stack-diff.d.ts +0 -97
  414. package/dist/src/core/merge/stack-diff.d.ts.map +0 -1
  415. package/dist/src/core/merge/stack-diff.js +0 -516
  416. package/dist/src/core/merge/stack-diff.js.map +0 -1
  417. package/dist/src/core/merge/types.d.ts +0 -110
  418. package/dist/src/core/merge/types.d.ts.map +0 -1
  419. package/dist/src/core/merge/types.js +0 -6
  420. package/dist/src/core/merge/types.js.map +0 -1
  421. package/dist/src/core/monitoring/error-handler.d.ts +0 -46
  422. package/dist/src/core/monitoring/error-handler.d.ts.map +0 -1
  423. package/dist/src/core/monitoring/error-handler.js +0 -212
  424. package/dist/src/core/monitoring/error-handler.js.map +0 -1
  425. package/dist/src/core/monitoring/logger.d.ts +0 -24
  426. package/dist/src/core/monitoring/logger.d.ts.map +0 -1
  427. package/dist/src/core/monitoring/logger.js +0 -126
  428. package/dist/src/core/monitoring/logger.js.map +0 -1
  429. package/dist/src/core/monitoring/metrics.d.ts +0 -10
  430. package/dist/src/core/monitoring/metrics.d.ts.map +0 -1
  431. package/dist/src/core/monitoring/metrics.js +0 -152
  432. package/dist/src/core/monitoring/metrics.js.map +0 -1
  433. package/dist/src/core/monitoring/progress-tracker.d.ts +0 -95
  434. package/dist/src/core/monitoring/progress-tracker.d.ts.map +0 -1
  435. package/dist/src/core/monitoring/progress-tracker.js +0 -178
  436. package/dist/src/core/monitoring/progress-tracker.js.map +0 -1
  437. package/dist/src/core/performance/context-cache.d.ts +0 -109
  438. package/dist/src/core/performance/context-cache.d.ts.map +0 -1
  439. package/dist/src/core/performance/context-cache.js +0 -280
  440. package/dist/src/core/performance/context-cache.js.map +0 -1
  441. package/dist/src/core/performance/index.d.ts +0 -3
  442. package/dist/src/core/performance/index.d.ts.map +0 -1
  443. package/dist/src/core/performance/index.js +0 -3
  444. package/dist/src/core/performance/index.js.map +0 -1
  445. package/dist/src/core/performance/lazy-context-loader.d.ts +0 -93
  446. package/dist/src/core/performance/lazy-context-loader.d.ts.map +0 -1
  447. package/dist/src/core/performance/lazy-context-loader.js +0 -332
  448. package/dist/src/core/performance/lazy-context-loader.js.map +0 -1
  449. package/dist/src/core/performance/monitor.d.ts +0 -48
  450. package/dist/src/core/performance/monitor.d.ts.map +0 -1
  451. package/dist/src/core/performance/monitor.js +0 -226
  452. package/dist/src/core/performance/monitor.js.map +0 -1
  453. package/dist/src/core/performance/optimized-frame-context.d.ts +0 -74
  454. package/dist/src/core/performance/optimized-frame-context.d.ts.map +0 -1
  455. package/dist/src/core/performance/optimized-frame-context.js +0 -330
  456. package/dist/src/core/performance/optimized-frame-context.js.map +0 -1
  457. package/dist/src/core/performance/performance-benchmark.d.ts +0 -50
  458. package/dist/src/core/performance/performance-benchmark.d.ts.map +0 -1
  459. package/dist/src/core/performance/performance-benchmark.js +0 -290
  460. package/dist/src/core/performance/performance-benchmark.js.map +0 -1
  461. package/dist/src/core/performance/performance-profiler.d.ts +0 -151
  462. package/dist/src/core/performance/performance-profiler.d.ts.map +0 -1
  463. package/dist/src/core/performance/performance-profiler.js +0 -346
  464. package/dist/src/core/performance/performance-profiler.js.map +0 -1
  465. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +0 -41
  466. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +0 -1
  467. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -193
  468. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -1
  469. package/dist/src/core/persistence/postgres-adapter.d.ts +0 -31
  470. package/dist/src/core/persistence/postgres-adapter.d.ts.map +0 -1
  471. package/dist/src/core/persistence/postgres-adapter.js +0 -330
  472. package/dist/src/core/persistence/postgres-adapter.js.map +0 -1
  473. package/dist/src/core/projects/project-manager.d.ts +0 -130
  474. package/dist/src/core/projects/project-manager.d.ts.map +0 -1
  475. package/dist/src/core/projects/project-manager.js +0 -709
  476. package/dist/src/core/projects/project-manager.js.map +0 -1
  477. package/dist/src/core/query/query-parser.d.ts +0 -109
  478. package/dist/src/core/query/query-parser.d.ts.map +0 -1
  479. package/dist/src/core/query/query-parser.js +0 -415
  480. package/dist/src/core/query/query-parser.js.map +0 -1
  481. package/dist/src/core/query/query-templates.d.ts +0 -44
  482. package/dist/src/core/query/query-templates.d.ts.map +0 -1
  483. package/dist/src/core/query/query-templates.js +0 -326
  484. package/dist/src/core/query/query-templates.js.map +0 -1
  485. package/dist/src/core/retrieval/index.d.ts +0 -8
  486. package/dist/src/core/retrieval/index.d.ts.map +0 -1
  487. package/dist/src/core/retrieval/index.js +0 -8
  488. package/dist/src/core/retrieval/index.js.map +0 -1
  489. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +0 -73
  490. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +0 -1
  491. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -597
  492. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -1
  493. package/dist/src/core/retrieval/summary-generator.d.ts +0 -63
  494. package/dist/src/core/retrieval/summary-generator.d.ts.map +0 -1
  495. package/dist/src/core/retrieval/summary-generator.js +0 -622
  496. package/dist/src/core/retrieval/summary-generator.js.map +0 -1
  497. package/dist/src/core/retrieval/types.d.ts +0 -257
  498. package/dist/src/core/retrieval/types.d.ts.map +0 -1
  499. package/dist/src/core/retrieval/types.js +0 -18
  500. package/dist/src/core/retrieval/types.js.map +0 -1
  501. package/dist/src/core/session/index.d.ts +0 -2
  502. package/dist/src/core/session/index.d.ts.map +0 -1
  503. package/dist/src/core/session/index.js +0 -2
  504. package/dist/src/core/session/index.js.map +0 -1
  505. package/dist/src/core/session/session-manager.d.ts +0 -69
  506. package/dist/src/core/session/session-manager.d.ts.map +0 -1
  507. package/dist/src/core/session/session-manager.js +0 -311
  508. package/dist/src/core/session/session-manager.js.map +0 -1
  509. package/dist/src/core/trace/cli-trace-wrapper.d.ts +0 -23
  510. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +0 -1
  511. package/dist/src/core/trace/cli-trace-wrapper.js +0 -141
  512. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -1
  513. package/dist/src/core/trace/db-trace-wrapper.d.ts +0 -36
  514. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +0 -1
  515. package/dist/src/core/trace/db-trace-wrapper.js +0 -252
  516. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -1
  517. package/dist/src/core/trace/debug-trace.d.ts +0 -84
  518. package/dist/src/core/trace/debug-trace.d.ts.map +0 -1
  519. package/dist/src/core/trace/debug-trace.js +0 -402
  520. package/dist/src/core/trace/debug-trace.js.map +0 -1
  521. package/dist/src/core/trace/error-test.d.ts +0 -6
  522. package/dist/src/core/trace/error-test.d.ts.map +0 -1
  523. package/dist/src/core/trace/error-test.js +0 -128
  524. package/dist/src/core/trace/error-test.js.map +0 -1
  525. package/dist/src/core/trace/index.d.ts +0 -25
  526. package/dist/src/core/trace/index.d.ts.map +0 -1
  527. package/dist/src/core/trace/index.js +0 -121
  528. package/dist/src/core/trace/index.js.map +0 -1
  529. package/dist/src/core/trace/linear-api-wrapper.d.ts +0 -17
  530. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +0 -1
  531. package/dist/src/core/trace/linear-api-wrapper.js +0 -205
  532. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -1
  533. package/dist/src/core/trace/performance-test.d.ts +0 -6
  534. package/dist/src/core/trace/performance-test.d.ts.map +0 -1
  535. package/dist/src/core/trace/performance-test.js +0 -111
  536. package/dist/src/core/trace/performance-test.js.map +0 -1
  537. package/dist/src/core/trace/trace-demo.d.ts +0 -8
  538. package/dist/src/core/trace/trace-demo.d.ts.map +0 -1
  539. package/dist/src/core/trace/trace-demo.js +0 -154
  540. package/dist/src/core/trace/trace-demo.js.map +0 -1
  541. package/dist/src/core/trace/trace-detector.d.ts +0 -108
  542. package/dist/src/core/trace/trace-detector.d.ts.map +0 -1
  543. package/dist/src/core/trace/trace-detector.demo.d.ts +0 -5
  544. package/dist/src/core/trace/trace-detector.demo.d.ts.map +0 -1
  545. package/dist/src/core/trace/trace-detector.demo.js +0 -145
  546. package/dist/src/core/trace/trace-detector.demo.js.map +0 -1
  547. package/dist/src/core/trace/trace-detector.js +0 -425
  548. package/dist/src/core/trace/trace-detector.js.map +0 -1
  549. package/dist/src/core/trace/trace-store.d.ts +0 -60
  550. package/dist/src/core/trace/trace-store.d.ts.map +0 -1
  551. package/dist/src/core/trace/trace-store.js +0 -323
  552. package/dist/src/core/trace/trace-store.js.map +0 -1
  553. package/dist/src/core/trace/types.d.ts +0 -81
  554. package/dist/src/core/trace/types.d.ts.map +0 -1
  555. package/dist/src/core/trace/types.js +0 -70
  556. package/dist/src/core/trace/types.js.map +0 -1
  557. package/dist/src/core/types.d.ts +0 -35
  558. package/dist/src/core/types.d.ts.map +0 -1
  559. package/dist/src/core/types.js +0 -2
  560. package/dist/src/core/types.js.map +0 -1
  561. package/dist/src/core/utils/update-checker.d.ts +0 -38
  562. package/dist/src/core/utils/update-checker.d.ts.map +0 -1
  563. package/dist/src/core/utils/update-checker.js +0 -213
  564. package/dist/src/core/utils/update-checker.js.map +0 -1
  565. package/dist/src/core/worktree/worktree-manager.d.ts +0 -110
  566. package/dist/src/core/worktree/worktree-manager.d.ts.map +0 -1
  567. package/dist/src/core/worktree/worktree-manager.js +0 -456
  568. package/dist/src/core/worktree/worktree-manager.js.map +0 -1
  569. package/dist/src/features/analytics/api/analytics-api.d.ts +0 -24
  570. package/dist/src/features/analytics/api/analytics-api.d.ts.map +0 -1
  571. package/dist/src/features/analytics/api/analytics-api.js +0 -289
  572. package/dist/src/features/analytics/api/analytics-api.js.map +0 -1
  573. package/dist/src/features/analytics/core/analytics-service.d.ts +0 -29
  574. package/dist/src/features/analytics/core/analytics-service.d.ts.map +0 -1
  575. package/dist/src/features/analytics/core/analytics-service.js +0 -275
  576. package/dist/src/features/analytics/core/analytics-service.js.map +0 -1
  577. package/dist/src/features/analytics/index.d.ts +0 -12
  578. package/dist/src/features/analytics/index.d.ts.map +0 -1
  579. package/dist/src/features/analytics/index.js +0 -11
  580. package/dist/src/features/analytics/index.js.map +0 -1
  581. package/dist/src/features/analytics/queries/metrics-queries.d.ts +0 -11
  582. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +0 -1
  583. package/dist/src/features/analytics/queries/metrics-queries.js +0 -240
  584. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -1
  585. package/dist/src/features/analytics/types/metrics.d.ts +0 -60
  586. package/dist/src/features/analytics/types/metrics.d.ts.map +0 -1
  587. package/dist/src/features/analytics/types/metrics.js +0 -2
  588. package/dist/src/features/analytics/types/metrics.js.map +0 -1
  589. package/dist/src/features/browser/browser-mcp.d.ts +0 -94
  590. package/dist/src/features/browser/browser-mcp.d.ts.map +0 -1
  591. package/dist/src/features/browser/browser-mcp.js +0 -459
  592. package/dist/src/features/browser/browser-mcp.js.map +0 -1
  593. package/dist/src/features/tasks/pebbles-task-store.d.ts +0 -128
  594. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +0 -1
  595. package/dist/src/features/tasks/pebbles-task-store.js +0 -572
  596. package/dist/src/features/tasks/pebbles-task-store.js.map +0 -1
  597. package/dist/src/features/tasks/task-aware-context.d.ts +0 -103
  598. package/dist/src/features/tasks/task-aware-context.d.ts.map +0 -1
  599. package/dist/src/features/tasks/task-aware-context.js +0 -412
  600. package/dist/src/features/tasks/task-aware-context.js.map +0 -1
  601. package/dist/src/index.d.ts +0 -21
  602. package/dist/src/index.d.ts.map +0 -1
  603. package/dist/src/index.js +0 -9
  604. package/dist/src/index.js.map +0 -1
  605. package/dist/src/integrations/linear/auth.d.ts +0 -99
  606. package/dist/src/integrations/linear/auth.d.ts.map +0 -1
  607. package/dist/src/integrations/linear/auth.js +0 -319
  608. package/dist/src/integrations/linear/auth.js.map +0 -1
  609. package/dist/src/integrations/linear/auto-sync.d.ts +0 -77
  610. package/dist/src/integrations/linear/auto-sync.d.ts.map +0 -1
  611. package/dist/src/integrations/linear/auto-sync.js +0 -268
  612. package/dist/src/integrations/linear/auto-sync.js.map +0 -1
  613. package/dist/src/integrations/linear/client.d.ts +0 -127
  614. package/dist/src/integrations/linear/client.d.ts.map +0 -1
  615. package/dist/src/integrations/linear/client.js +0 -446
  616. package/dist/src/integrations/linear/client.js.map +0 -1
  617. package/dist/src/integrations/linear/config.d.ts +0 -51
  618. package/dist/src/integrations/linear/config.d.ts.map +0 -1
  619. package/dist/src/integrations/linear/config.js +0 -103
  620. package/dist/src/integrations/linear/config.js.map +0 -1
  621. package/dist/src/integrations/linear/sync-manager.d.ts +0 -78
  622. package/dist/src/integrations/linear/sync-manager.d.ts.map +0 -1
  623. package/dist/src/integrations/linear/sync-manager.js +0 -235
  624. package/dist/src/integrations/linear/sync-manager.js.map +0 -1
  625. package/dist/src/integrations/linear/sync-service.d.ts +0 -46
  626. package/dist/src/integrations/linear/sync-service.d.ts.map +0 -1
  627. package/dist/src/integrations/linear/sync-service.js +0 -217
  628. package/dist/src/integrations/linear/sync-service.js.map +0 -1
  629. package/dist/src/integrations/linear/sync.d.ts +0 -125
  630. package/dist/src/integrations/linear/sync.d.ts.map +0 -1
  631. package/dist/src/integrations/linear/sync.js +0 -563
  632. package/dist/src/integrations/linear/sync.js.map +0 -1
  633. package/dist/src/integrations/linear/types.d.ts +0 -90
  634. package/dist/src/integrations/linear/types.d.ts.map +0 -1
  635. package/dist/src/integrations/linear/types.js +0 -2
  636. package/dist/src/integrations/linear/types.js.map +0 -1
  637. package/dist/src/integrations/linear/webhook-server.d.ts +0 -32
  638. package/dist/src/integrations/linear/webhook-server.d.ts.map +0 -1
  639. package/dist/src/integrations/linear/webhook-server.js +0 -190
  640. package/dist/src/integrations/linear/webhook-server.js.map +0 -1
  641. package/dist/src/integrations/linear/webhook.d.ts +0 -108
  642. package/dist/src/integrations/linear/webhook.d.ts.map +0 -1
  643. package/dist/src/integrations/linear/webhook.js +0 -291
  644. package/dist/src/integrations/linear/webhook.js.map +0 -1
  645. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +0 -39
  646. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +0 -1
  647. package/dist/src/integrations/mcp/handlers/context-handlers.js +0 -266
  648. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -1
  649. package/dist/src/integrations/mcp/handlers/index.d.ts +0 -37
  650. package/dist/src/integrations/mcp/handlers/index.d.ts.map +0 -1
  651. package/dist/src/integrations/mcp/handlers/index.js +0 -134
  652. package/dist/src/integrations/mcp/handlers/index.js.map +0 -1
  653. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +0 -33
  654. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +0 -1
  655. package/dist/src/integrations/mcp/handlers/linear-handlers.js +0 -251
  656. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -1
  657. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +0 -42
  658. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +0 -1
  659. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -238
  660. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -1
  661. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +0 -41
  662. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +0 -1
  663. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -298
  664. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -1
  665. package/dist/src/integrations/mcp/index.d.ts +0 -13
  666. package/dist/src/integrations/mcp/index.d.ts.map +0 -1
  667. package/dist/src/integrations/mcp/index.js +0 -17
  668. package/dist/src/integrations/mcp/index.js.map +0 -1
  669. package/dist/src/integrations/mcp/refactored-server.d.ts +0 -76
  670. package/dist/src/integrations/mcp/refactored-server.d.ts.map +0 -1
  671. package/dist/src/integrations/mcp/refactored-server.js +0 -351
  672. package/dist/src/integrations/mcp/refactored-server.js.map +0 -1
  673. package/dist/src/integrations/mcp/server.d.ts +0 -54
  674. package/dist/src/integrations/mcp/server.d.ts.map +0 -1
  675. package/dist/src/integrations/mcp/server.js +0 -1616
  676. package/dist/src/integrations/mcp/server.js.map +0 -1
  677. package/dist/src/integrations/mcp/tool-definitions.d.ts +0 -44
  678. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +0 -1
  679. package/dist/src/integrations/mcp/tool-definitions.js +0 -563
  680. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -1
  681. package/dist/src/integrations/mcp/trace-test.d.ts +0 -5
  682. package/dist/src/integrations/mcp/trace-test.d.ts.map +0 -1
  683. package/dist/src/integrations/mcp/trace-test.js +0 -54
  684. package/dist/src/integrations/mcp/trace-test.js.map +0 -1
  685. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +0 -48
  686. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +0 -1
  687. package/dist/src/integrations/pg-aiguide/embedding-provider.js +0 -190
  688. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +0 -1
  689. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +0 -34
  690. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +0 -1
  691. package/dist/src/integrations/pg-aiguide/semantic-search.js +0 -176
  692. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +0 -1
  693. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +0 -44
  694. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +0 -1
  695. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +0 -215
  696. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +0 -1
  697. package/dist/src/mcp/stackmemory-mcp-server.d.ts +0 -9
  698. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +0 -1
  699. package/dist/src/mcp/stackmemory-mcp-server.js +0 -519
  700. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -1
  701. package/dist/src/middleware/exponential-rate-limiter.d.ts +0 -78
  702. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +0 -1
  703. package/dist/src/middleware/exponential-rate-limiter.js +0 -293
  704. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -1
  705. package/dist/src/models/user.model.d.ts +0 -62
  706. package/dist/src/models/user.model.d.ts.map +0 -1
  707. package/dist/src/models/user.model.js +0 -311
  708. package/dist/src/models/user.model.js.map +0 -1
  709. package/dist/src/servers/production/auth-middleware.d.ts +0 -76
  710. package/dist/src/servers/production/auth-middleware.d.ts.map +0 -1
  711. package/dist/src/servers/production/auth-middleware.js +0 -558
  712. package/dist/src/servers/production/auth-middleware.js.map +0 -1
  713. package/dist/src/servers/railway/index.d.ts +0 -7
  714. package/dist/src/servers/railway/index.d.ts.map +0 -1
  715. package/dist/src/servers/railway/index.js +0 -401
  716. package/dist/src/servers/railway/index.js.map +0 -1
  717. package/dist/src/services/config-service.d.ts +0 -44
  718. package/dist/src/services/config-service.d.ts.map +0 -1
  719. package/dist/src/services/config-service.js +0 -61
  720. package/dist/src/services/config-service.js.map +0 -1
  721. package/dist/src/services/context-service.d.ts +0 -17
  722. package/dist/src/services/context-service.d.ts.map +0 -1
  723. package/dist/src/services/context-service.js +0 -173
  724. package/dist/src/services/context-service.js.map +0 -1
  725. package/dist/src/types/task.d.ts +0 -27
  726. package/dist/src/types/task.d.ts.map +0 -1
  727. package/dist/src/types/task.js +0 -2
  728. package/dist/src/types/task.js.map +0 -1
  729. package/dist/src/utils/logger.d.ts +0 -13
  730. package/dist/src/utils/logger.d.ts.map +0 -1
  731. package/dist/src/utils/logger.js +0 -52
  732. package/dist/src/utils/logger.js.map +0 -1
  733. package/dist/src/validation/schemas.d.ts +0 -633
  734. package/dist/src/validation/schemas.d.ts.map +0 -1
  735. package/dist/src/validation/schemas.js +0 -347
  736. package/dist/src/validation/schemas.js.map +0 -1
@@ -1,558 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- import { LinearAuthManager, LinearOAuthSetup } from "../auth.js";
3
- import { join } from "path";
4
- import {
5
- mkdtempSync,
6
- rmSync,
7
- writeFileSync,
8
- existsSync,
9
- mkdirSync
10
- } from "fs";
11
- import { tmpdir } from "os";
12
- global.fetch = vi.fn();
13
- vi.mock("child_process", () => ({
14
- exec: vi.fn()
15
- }));
16
- function writeTokensToFile(tempDir, tokens) {
17
- const stackmemoryDir = join(tempDir, ".stackmemory");
18
- if (!existsSync(stackmemoryDir)) {
19
- mkdirSync(stackmemoryDir, { recursive: true });
20
- }
21
- writeFileSync(
22
- join(stackmemoryDir, "linear-tokens.json"),
23
- JSON.stringify(tokens, null, 2)
24
- );
25
- }
26
- function writeConfigToFile(tempDir, config) {
27
- const stackmemoryDir = join(tempDir, ".stackmemory");
28
- if (!existsSync(stackmemoryDir)) {
29
- mkdirSync(stackmemoryDir, { recursive: true });
30
- }
31
- writeFileSync(
32
- join(stackmemoryDir, "linear-config.json"),
33
- JSON.stringify(config, null, 2)
34
- );
35
- }
36
- describe("LinearAuthManager", () => {
37
- let authManager;
38
- let tempDir;
39
- beforeEach(() => {
40
- tempDir = mkdtempSync(join(tmpdir(), "stackmemory-auth-test-"));
41
- mkdirSync(join(tempDir, ".stackmemory"), { recursive: true });
42
- authManager = new LinearAuthManager(tempDir);
43
- vi.clearAllMocks();
44
- });
45
- afterEach(() => {
46
- if (tempDir) {
47
- rmSync(tempDir, { recursive: true, force: true });
48
- }
49
- vi.clearAllMocks();
50
- });
51
- describe("Configuration Management", () => {
52
- it("should save and load configuration correctly", () => {
53
- const config = {
54
- clientId: "test-client-id",
55
- clientSecret: "test-client-secret",
56
- redirectUri: "http://localhost:3000/callback",
57
- scopes: ["read", "write"]
58
- };
59
- authManager.saveConfig(config);
60
- const loadedConfig = authManager.loadConfig();
61
- expect(loadedConfig).toEqual(config);
62
- });
63
- it("should return null when no configuration exists", () => {
64
- const config = authManager.loadConfig();
65
- expect(config).toBeNull();
66
- });
67
- it("should detect if configured correctly", () => {
68
- expect(authManager.isConfigured()).toBe(false);
69
- authManager.saveConfig({
70
- clientId: "test-id",
71
- clientSecret: "test-secret",
72
- redirectUri: "http://localhost:3000/callback",
73
- scopes: ["read", "write"]
74
- });
75
- expect(authManager.isConfigured()).toBe(false);
76
- writeTokensToFile(tempDir, {
77
- accessToken: "test-token",
78
- expiresAt: Date.now() + 36e5,
79
- scope: ["read", "write"]
80
- });
81
- expect(authManager.isConfigured()).toBe(true);
82
- });
83
- it("should handle corrupted configuration gracefully", () => {
84
- const configPath = join(tempDir, ".stackmemory", "linear-config.json");
85
- writeFileSync(configPath, "invalid json");
86
- expect(authManager.loadConfig()).toBeNull();
87
- });
88
- });
89
- describe("Token Management", () => {
90
- beforeEach(() => {
91
- authManager.saveConfig({
92
- clientId: "test-client-id",
93
- clientSecret: "test-client-secret",
94
- redirectUri: "http://localhost:3000/callback",
95
- scopes: ["read", "write"]
96
- });
97
- });
98
- it("should load tokens correctly", () => {
99
- const tokens = {
100
- accessToken: "access-token",
101
- refreshToken: "refresh-token",
102
- expiresAt: Date.now() + 36e5,
103
- scope: ["read", "write"]
104
- };
105
- writeTokensToFile(tempDir, tokens);
106
- const loadedTokens = authManager.loadTokens();
107
- expect(loadedTokens).toEqual(tokens);
108
- });
109
- it("should return null when no tokens exist", () => {
110
- const tokens = authManager.loadTokens();
111
- expect(tokens).toBeNull();
112
- });
113
- it("should handle corrupted tokens gracefully", () => {
114
- const tokensPath = join(tempDir, ".stackmemory", "linear-tokens.json");
115
- writeFileSync(tokensPath, "invalid json");
116
- expect(authManager.loadTokens()).toBeNull();
117
- });
118
- it("should refresh access token", async () => {
119
- const expiredTokens = {
120
- accessToken: "old-access-token",
121
- refreshToken: "refresh-token",
122
- expiresAt: Date.now() - 1e3,
123
- scope: ["read", "write"]
124
- };
125
- writeTokensToFile(tempDir, expiredTokens);
126
- const refreshResponse = {
127
- accessToken: "new-access-token",
128
- refreshToken: "new-refresh-token",
129
- expiresIn: 3600,
130
- tokenType: "Bearer",
131
- scope: "read write"
132
- };
133
- global.fetch.mockResolvedValueOnce({
134
- ok: true,
135
- json: vi.fn().mockResolvedValue(refreshResponse)
136
- });
137
- const newTokens = await authManager.refreshAccessToken();
138
- expect(newTokens.accessToken).toBe("new-access-token");
139
- expect(newTokens.refreshToken).toBe("new-refresh-token");
140
- expect(newTokens.expiresAt).toBeGreaterThan(Date.now());
141
- expect(global.fetch).toHaveBeenCalledWith(
142
- "https://api.linear.app/oauth/token",
143
- {
144
- method: "POST",
145
- headers: {
146
- "Content-Type": "application/x-www-form-urlencoded",
147
- Accept: "application/json"
148
- },
149
- body: expect.stringContaining("grant_type=refresh_token")
150
- }
151
- );
152
- });
153
- it("should handle refresh token errors", async () => {
154
- const expiredTokens = {
155
- accessToken: "old-access-token",
156
- refreshToken: "invalid-refresh-token",
157
- expiresAt: Date.now() - 1e3,
158
- scope: ["read", "write"]
159
- };
160
- writeTokensToFile(tempDir, expiredTokens);
161
- global.fetch.mockResolvedValueOnce({
162
- ok: false,
163
- status: 400,
164
- statusText: "Bad Request",
165
- text: vi.fn().mockResolvedValue('{"error": "invalid_grant"}')
166
- });
167
- await expect(authManager.refreshAccessToken()).rejects.toThrow(
168
- "Token refresh failed"
169
- );
170
- });
171
- it("should throw error when refreshing without refresh token", async () => {
172
- const tokensWithoutRefresh = {
173
- accessToken: "access-token",
174
- expiresAt: Date.now() - 1e3,
175
- scope: ["read", "write"]
176
- };
177
- writeTokensToFile(tempDir, tokensWithoutRefresh);
178
- await expect(authManager.refreshAccessToken()).rejects.toThrow(
179
- "No refresh token available"
180
- );
181
- });
182
- });
183
- describe("Token Auto-refresh (getValidToken)", () => {
184
- beforeEach(() => {
185
- authManager.saveConfig({
186
- clientId: "test-client-id",
187
- clientSecret: "test-client-secret",
188
- redirectUri: "http://localhost:3000/callback",
189
- scopes: ["read", "write"]
190
- });
191
- });
192
- it("should return valid token string without refresh", async () => {
193
- const validTokens = {
194
- accessToken: "valid-access-token",
195
- refreshToken: "refresh-token",
196
- expiresAt: Date.now() + 36e5,
197
- // 1 hour from now
198
- scope: ["read", "write"]
199
- };
200
- writeTokensToFile(tempDir, validTokens);
201
- const token = await authManager.getValidToken();
202
- expect(token).toBe("valid-access-token");
203
- expect(global.fetch).not.toHaveBeenCalled();
204
- });
205
- it("should automatically refresh expiring tokens", async () => {
206
- const expiringTokens = {
207
- accessToken: "expiring-access-token",
208
- refreshToken: "refresh-token",
209
- expiresAt: Date.now() + 4 * 60 * 1e3,
210
- // 4 minutes from now
211
- scope: ["read", "write"]
212
- };
213
- writeTokensToFile(tempDir, expiringTokens);
214
- const refreshResponse = {
215
- accessToken: "new-access-token",
216
- refreshToken: "new-refresh-token",
217
- expiresIn: 3600,
218
- tokenType: "Bearer",
219
- scope: "read write"
220
- };
221
- global.fetch.mockResolvedValueOnce({
222
- ok: true,
223
- json: vi.fn().mockResolvedValue(refreshResponse)
224
- });
225
- const token = await authManager.getValidToken();
226
- expect(token).toBe("new-access-token");
227
- expect(global.fetch).toHaveBeenCalled();
228
- });
229
- it("should throw error when tokens are not available", async () => {
230
- await expect(authManager.getValidToken()).rejects.toThrow(
231
- "No Linear tokens found"
232
- );
233
- });
234
- it("should throw error when refresh fails", async () => {
235
- const expiringTokens = {
236
- accessToken: "expiring-access-token",
237
- refreshToken: "invalid-refresh-token",
238
- expiresAt: Date.now() + 1e3,
239
- // Almost expired
240
- scope: ["read", "write"]
241
- };
242
- writeTokensToFile(tempDir, expiringTokens);
243
- global.fetch.mockResolvedValueOnce({
244
- ok: false,
245
- status: 401,
246
- statusText: "Unauthorized",
247
- text: vi.fn().mockResolvedValue("Unauthorized")
248
- });
249
- await expect(authManager.getValidToken()).rejects.toThrow(
250
- "Token refresh failed"
251
- );
252
- });
253
- });
254
- describe("Cleanup Operations", () => {
255
- beforeEach(() => {
256
- authManager.saveConfig({
257
- clientId: "test-client-id",
258
- clientSecret: "test-client-secret",
259
- redirectUri: "http://localhost:3000/callback",
260
- scopes: ["read", "write"]
261
- });
262
- writeTokensToFile(tempDir, {
263
- accessToken: "access-token",
264
- refreshToken: "refresh-token",
265
- expiresAt: Date.now() + 36e5,
266
- scope: ["read", "write"]
267
- });
268
- });
269
- it("should clear all authentication data", () => {
270
- expect(authManager.isConfigured()).toBe(true);
271
- expect(authManager.loadTokens()).not.toBeNull();
272
- authManager.clearAuth();
273
- expect(authManager.loadTokens()).toBeNull();
274
- expect(authManager.loadConfig()).toBeNull();
275
- });
276
- it("should handle clearing when files do not exist", () => {
277
- authManager.clearAuth();
278
- expect(() => authManager.clearAuth()).not.toThrow();
279
- });
280
- });
281
- describe("OAuth URL Generation", () => {
282
- beforeEach(() => {
283
- authManager.saveConfig({
284
- clientId: "test-client-id",
285
- clientSecret: "test-client-secret",
286
- redirectUri: "http://localhost:3000/callback",
287
- scopes: ["read", "write"]
288
- });
289
- });
290
- it("should generate authorization URL with PKCE", () => {
291
- const { url, codeVerifier } = authManager.generateAuthUrl("test-state");
292
- expect(url).toContain("https://linear.app/oauth/authorize");
293
- expect(url).toContain("client_id=test-client-id");
294
- expect(url).toContain("redirect_uri=");
295
- expect(url).toContain("response_type=code");
296
- expect(url).toContain("code_challenge=");
297
- expect(url).toContain("code_challenge_method=S256");
298
- expect(url).toContain("state=test-state");
299
- expect(codeVerifier).toBeDefined();
300
- expect(codeVerifier.length).toBeGreaterThan(10);
301
- });
302
- it("should throw error when config not loaded", () => {
303
- const newManager = new LinearAuthManager(tempDir);
304
- expect(() => newManager.generateAuthUrl()).toThrow(
305
- "configuration not loaded"
306
- );
307
- });
308
- });
309
- });
310
- describe("LinearOAuthSetup", () => {
311
- let oauthSetup;
312
- let tempDir;
313
- beforeEach(() => {
314
- tempDir = mkdtempSync(join(tmpdir(), "stackmemory-oauth-test-"));
315
- mkdirSync(join(tempDir, ".stackmemory"), { recursive: true });
316
- oauthSetup = new LinearOAuthSetup(tempDir);
317
- vi.clearAllMocks();
318
- delete process.env.LINEAR_CLIENT_ID;
319
- delete process.env.LINEAR_CLIENT_SECRET;
320
- delete process.env._LINEAR_CODE_VERIFIER;
321
- });
322
- afterEach(() => {
323
- if (tempDir) {
324
- rmSync(tempDir, { recursive: true, force: true });
325
- }
326
- vi.clearAllMocks();
327
- delete process.env.LINEAR_CLIENT_ID;
328
- delete process.env.LINEAR_CLIENT_SECRET;
329
- delete process.env._LINEAR_CODE_VERIFIER;
330
- });
331
- describe("Interactive Setup", () => {
332
- it("should return setup instructions when env vars not set", async () => {
333
- const result = await oauthSetup.setupInteractive();
334
- expect(result.instructions).toBeDefined();
335
- expect(Array.isArray(result.instructions)).toBe(true);
336
- expect(result.instructions.length).toBeGreaterThan(0);
337
- expect(result.authUrl).toBe("");
338
- });
339
- it("should provide authorization URL when env vars are set", async () => {
340
- process.env.LINEAR_CLIENT_ID = "test-client-id";
341
- process.env.LINEAR_CLIENT_SECRET = "test-client-secret";
342
- const result = await oauthSetup.setupInteractive();
343
- expect(result.authUrl).toContain("https://linear.app/oauth/authorize");
344
- expect(result.authUrl).toContain("client_id=test-client-id");
345
- expect(result.authUrl).toContain("redirect_uri=");
346
- expect(result.authUrl).toContain("response_type=code");
347
- });
348
- it("should save configuration during setup", async () => {
349
- process.env.LINEAR_CLIENT_ID = "test-client-id";
350
- process.env.LINEAR_CLIENT_SECRET = "test-client-secret";
351
- await oauthSetup.setupInteractive();
352
- const authManager = new LinearAuthManager(tempDir);
353
- const config = authManager.loadConfig();
354
- expect(config).toBeDefined();
355
- expect(config.clientId).toBe("test-client-id");
356
- expect(config.clientSecret).toBe("test-client-secret");
357
- });
358
- it("should include code_challenge for PKCE", async () => {
359
- process.env.LINEAR_CLIENT_ID = "test-client-id";
360
- process.env.LINEAR_CLIENT_SECRET = "test-client-secret";
361
- const result = await oauthSetup.setupInteractive();
362
- expect(result.authUrl).toContain("code_challenge=");
363
- expect(result.authUrl).toContain("code_challenge_method=S256");
364
- });
365
- });
366
- describe("Authorization Code Exchange", () => {
367
- beforeEach(async () => {
368
- process.env.LINEAR_CLIENT_ID = "test-client-id";
369
- process.env.LINEAR_CLIENT_SECRET = "test-client-secret";
370
- await oauthSetup.setupInteractive();
371
- });
372
- it("should complete authorization successfully", async () => {
373
- const tokenResponse = {
374
- accessToken: "access-token",
375
- refreshToken: "refresh-token",
376
- expiresIn: 3600,
377
- tokenType: "Bearer",
378
- scope: "read write"
379
- };
380
- global.fetch.mockResolvedValueOnce({
381
- ok: true,
382
- json: vi.fn().mockResolvedValue(tokenResponse)
383
- });
384
- const success = await oauthSetup.completeAuth("auth-code-123");
385
- expect(success).toBe(true);
386
- expect(global.fetch).toHaveBeenCalledWith(
387
- "https://api.linear.app/oauth/token",
388
- {
389
- method: "POST",
390
- headers: {
391
- "Content-Type": "application/x-www-form-urlencoded",
392
- Accept: "application/json"
393
- },
394
- body: expect.stringContaining("grant_type=authorization_code")
395
- }
396
- );
397
- const authManager = new LinearAuthManager(tempDir);
398
- const tokens = authManager.loadTokens();
399
- expect(tokens).toBeDefined();
400
- expect(tokens.accessToken).toBe("access-token");
401
- });
402
- it("should handle authorization errors", async () => {
403
- global.fetch.mockResolvedValueOnce({
404
- ok: false,
405
- status: 400,
406
- statusText: "Bad Request",
407
- text: vi.fn().mockResolvedValue('{"error": "invalid_grant"}')
408
- });
409
- const success = await oauthSetup.completeAuth("invalid-auth-code");
410
- expect(success).toBe(false);
411
- });
412
- it("should handle network errors during token exchange", async () => {
413
- global.fetch.mockRejectedValueOnce(new Error("Network error"));
414
- const success = await oauthSetup.completeAuth("auth-code-123");
415
- expect(success).toBe(false);
416
- });
417
- it("should fail when code verifier not found", async () => {
418
- delete process.env._LINEAR_CODE_VERIFIER;
419
- const success = await oauthSetup.completeAuth("auth-code-123");
420
- expect(success).toBe(false);
421
- });
422
- });
423
- describe("Connection Testing", () => {
424
- beforeEach(async () => {
425
- process.env.LINEAR_CLIENT_ID = "test-client-id";
426
- process.env.LINEAR_CLIENT_SECRET = "test-client-secret";
427
- await oauthSetup.setupInteractive();
428
- writeTokensToFile(tempDir, {
429
- accessToken: "valid-access-token",
430
- refreshToken: "refresh-token",
431
- expiresAt: Date.now() + 36e5,
432
- scope: ["read", "write"]
433
- });
434
- });
435
- it("should test connection successfully with valid tokens", async () => {
436
- const userResponse = {
437
- data: {
438
- viewer: {
439
- id: "user-1",
440
- name: "Test User",
441
- email: "test@example.com"
442
- }
443
- }
444
- };
445
- global.fetch.mockResolvedValueOnce({
446
- ok: true,
447
- json: vi.fn().mockResolvedValue(userResponse)
448
- });
449
- const connectionOk = await oauthSetup.testConnection();
450
- expect(connectionOk).toBe(true);
451
- expect(global.fetch).toHaveBeenCalledWith(
452
- "https://api.linear.app/graphql",
453
- {
454
- method: "POST",
455
- headers: {
456
- Authorization: "Bearer valid-access-token",
457
- "Content-Type": "application/json"
458
- },
459
- body: expect.stringContaining("viewer")
460
- }
461
- );
462
- });
463
- it("should fail connection test with invalid tokens", async () => {
464
- global.fetch.mockResolvedValueOnce({
465
- ok: false,
466
- status: 401,
467
- statusText: "Unauthorized"
468
- });
469
- const connectionOk = await oauthSetup.testConnection();
470
- expect(connectionOk).toBe(false);
471
- });
472
- it("should fail connection test when not configured", async () => {
473
- const newTempDir = mkdtempSync(
474
- join(tmpdir(), "stackmemory-oauth-unconfigured-")
475
- );
476
- mkdirSync(join(newTempDir, ".stackmemory"), { recursive: true });
477
- const unconfiguredSetup = new LinearOAuthSetup(newTempDir);
478
- const connectionOk = await unconfiguredSetup.testConnection();
479
- expect(connectionOk).toBe(false);
480
- rmSync(newTempDir, { recursive: true, force: true });
481
- });
482
- it("should handle GraphQL errors in connection test", async () => {
483
- const errorResponse = {
484
- errors: [{ message: "Authentication required" }]
485
- };
486
- global.fetch.mockResolvedValueOnce({
487
- ok: true,
488
- json: vi.fn().mockResolvedValue(errorResponse)
489
- });
490
- const connectionOk = await oauthSetup.testConnection();
491
- expect(connectionOk).toBe(false);
492
- });
493
- it("should handle network errors in connection test", async () => {
494
- global.fetch.mockRejectedValueOnce(
495
- new Error("Network timeout")
496
- );
497
- const connectionOk = await oauthSetup.testConnection();
498
- expect(connectionOk).toBe(false);
499
- });
500
- it("should automatically refresh expiring tokens during connection test", async () => {
501
- writeTokensToFile(tempDir, {
502
- accessToken: "expiring-access-token",
503
- refreshToken: "refresh-token",
504
- expiresAt: Date.now() + 6e4,
505
- // 1 minute from now (within 5 min threshold)
506
- scope: ["read", "write"]
507
- });
508
- const refreshResponse = {
509
- accessToken: "new-access-token",
510
- refreshToken: "new-refresh-token",
511
- expiresIn: 3600,
512
- tokenType: "Bearer",
513
- scope: "read write"
514
- };
515
- const userResponse = {
516
- data: {
517
- viewer: {
518
- id: "user-1",
519
- name: "Test User",
520
- email: "test@example.com"
521
- }
522
- }
523
- };
524
- global.fetch.mockResolvedValueOnce({
525
- ok: true,
526
- json: vi.fn().mockResolvedValue(refreshResponse)
527
- }).mockResolvedValueOnce({
528
- ok: true,
529
- json: vi.fn().mockResolvedValue(userResponse)
530
- });
531
- const connectionOk = await oauthSetup.testConnection();
532
- expect(connectionOk).toBe(true);
533
- expect(global.fetch).toHaveBeenCalledTimes(2);
534
- });
535
- });
536
- describe("Error Handling and Edge Cases", () => {
537
- it("should handle missing Linear environment variables gracefully", async () => {
538
- delete process.env.LINEAR_CLIENT_ID;
539
- delete process.env.LINEAR_CLIENT_SECRET;
540
- const result = await oauthSetup.setupInteractive();
541
- expect(result.instructions.length).toBeGreaterThan(0);
542
- });
543
- it("should validate authorization URL format when configured", async () => {
544
- process.env.LINEAR_CLIENT_ID = "test-client-id";
545
- process.env.LINEAR_CLIENT_SECRET = "test-client-secret";
546
- const result = await oauthSetup.setupInteractive();
547
- expect(result.authUrl).toMatch(
548
- /^https:\/\/linear\.app\/oauth\/authorize\?/
549
- );
550
- const url = new URL(result.authUrl);
551
- expect(url.searchParams.get("client_id")).toBe("test-client-id");
552
- expect(url.searchParams.get("redirect_uri")).toBeDefined();
553
- expect(url.searchParams.get("response_type")).toBe("code");
554
- expect(url.searchParams.get("scope")).toBeDefined();
555
- });
556
- });
557
- });
558
- //# sourceMappingURL=auth.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/integrations/linear/__tests__/auth.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for LinearAuthManager and LinearOAuthSetup\n */\n\nimport { describe, it, expect, beforeEach, afterEach, vi, Mock } from 'vitest';\nimport { LinearAuthManager, LinearOAuthSetup, LinearTokens } from '../auth.js';\nimport { join } from 'path';\nimport {\n mkdtempSync,\n rmSync,\n writeFileSync,\n readFileSync,\n existsSync,\n mkdirSync,\n} from 'fs';\nimport { tmpdir } from 'os';\n\n// Mock fetch for HTTP requests\nglobal.fetch = vi.fn();\n\n// Mock child_process\nvi.mock('child_process', () => ({\n exec: vi.fn(),\n}));\n\n// Helper to write tokens directly to file\nfunction writeTokensToFile(tempDir: string, tokens: LinearTokens) {\n const stackmemoryDir = join(tempDir, '.stackmemory');\n if (!existsSync(stackmemoryDir)) {\n mkdirSync(stackmemoryDir, { recursive: true });\n }\n writeFileSync(\n join(stackmemoryDir, 'linear-tokens.json'),\n JSON.stringify(tokens, null, 2)\n );\n}\n\n// Helper to write config directly to file\nfunction writeConfigToFile(tempDir: string, config: any) {\n const stackmemoryDir = join(tempDir, '.stackmemory');\n if (!existsSync(stackmemoryDir)) {\n mkdirSync(stackmemoryDir, { recursive: true });\n }\n writeFileSync(\n join(stackmemoryDir, 'linear-config.json'),\n JSON.stringify(config, null, 2)\n );\n}\n\ndescribe('LinearAuthManager', () => {\n let authManager: LinearAuthManager;\n let tempDir: string;\n\n beforeEach(() => {\n tempDir = mkdtempSync(join(tmpdir(), 'stackmemory-auth-test-'));\n // Create .stackmemory directory\n mkdirSync(join(tempDir, '.stackmemory'), { recursive: true });\n authManager = new LinearAuthManager(tempDir);\n vi.clearAllMocks();\n });\n\n afterEach(() => {\n if (tempDir) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n vi.clearAllMocks();\n });\n\n describe('Configuration Management', () => {\n it('should save and load configuration correctly', () => {\n const config = {\n clientId: 'test-client-id',\n clientSecret: 'test-client-secret',\n redirectUri: 'http://localhost:3000/callback',\n scopes: ['read', 'write'],\n };\n\n authManager.saveConfig(config);\n\n const loadedConfig = authManager.loadConfig();\n expect(loadedConfig).toEqual(config);\n });\n\n it('should return null when no configuration exists', () => {\n const config = authManager.loadConfig();\n expect(config).toBeNull();\n });\n\n it('should detect if configured correctly', () => {\n // isConfigured checks for BOTH config AND tokens files\n expect(authManager.isConfigured()).toBe(false);\n\n // Save config\n authManager.saveConfig({\n clientId: 'test-id',\n clientSecret: 'test-secret',\n redirectUri: 'http://localhost:3000/callback',\n scopes: ['read', 'write'],\n });\n\n // Still not configured without tokens\n expect(authManager.isConfigured()).toBe(false);\n\n // Write tokens file\n writeTokensToFile(tempDir, {\n accessToken: 'test-token',\n expiresAt: Date.now() + 3600000,\n scope: ['read', 'write'],\n });\n\n expect(authManager.isConfigured()).toBe(true);\n });\n\n it('should handle corrupted configuration gracefully', () => {\n const configPath = join(tempDir, '.stackmemory', 'linear-config.json');\n writeFileSync(configPath, 'invalid json');\n\n expect(authManager.loadConfig()).toBeNull();\n });\n });\n\n describe('Token Management', () => {\n beforeEach(() => {\n // Setup configuration first\n authManager.saveConfig({\n clientId: 'test-client-id',\n clientSecret: 'test-client-secret',\n redirectUri: 'http://localhost:3000/callback',\n scopes: ['read', 'write'],\n });\n });\n\n it('should load tokens correctly', () => {\n const tokens: LinearTokens = {\n accessToken: 'access-token',\n refreshToken: 'refresh-token',\n expiresAt: Date.now() + 3600000,\n scope: ['read', 'write'],\n };\n\n writeTokensToFile(tempDir, tokens);\n\n const loadedTokens = authManager.loadTokens();\n expect(loadedTokens).toEqual(tokens);\n });\n\n it('should return null when no tokens exist', () => {\n const tokens = authManager.loadTokens();\n expect(tokens).toBeNull();\n });\n\n it('should handle corrupted tokens gracefully', () => {\n const tokensPath = join(tempDir, '.stackmemory', 'linear-tokens.json');\n writeFileSync(tokensPath, 'invalid json');\n\n expect(authManager.loadTokens()).toBeNull();\n });\n\n it('should refresh access token', async () => {\n const expiredTokens: LinearTokens = {\n accessToken: 'old-access-token',\n refreshToken: 'refresh-token',\n expiresAt: Date.now() - 1000,\n scope: ['read', 'write'],\n };\n\n writeTokensToFile(tempDir, expiredTokens);\n\n const refreshResponse = {\n accessToken: 'new-access-token',\n refreshToken: 'new-refresh-token',\n expiresIn: 3600,\n tokenType: 'Bearer',\n scope: 'read write',\n };\n\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: true,\n json: vi.fn().mockResolvedValue(refreshResponse),\n });\n\n const newTokens = await authManager.refreshAccessToken();\n\n expect(newTokens.accessToken).toBe('new-access-token');\n expect(newTokens.refreshToken).toBe('new-refresh-token');\n expect(newTokens.expiresAt).toBeGreaterThan(Date.now());\n\n expect(global.fetch).toHaveBeenCalledWith(\n 'https://api.linear.app/oauth/token',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body: expect.stringContaining('grant_type=refresh_token'),\n }\n );\n });\n\n it('should handle refresh token errors', async () => {\n const expiredTokens: LinearTokens = {\n accessToken: 'old-access-token',\n refreshToken: 'invalid-refresh-token',\n expiresAt: Date.now() - 1000,\n scope: ['read', 'write'],\n };\n\n writeTokensToFile(tempDir, expiredTokens);\n\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: false,\n status: 400,\n statusText: 'Bad Request',\n text: vi.fn().mockResolvedValue('{\"error\": \"invalid_grant\"}'),\n });\n\n await expect(authManager.refreshAccessToken()).rejects.toThrow(\n 'Token refresh failed'\n );\n });\n\n it('should throw error when refreshing without refresh token', async () => {\n const tokensWithoutRefresh: LinearTokens = {\n accessToken: 'access-token',\n expiresAt: Date.now() - 1000,\n scope: ['read', 'write'],\n };\n\n writeTokensToFile(tempDir, tokensWithoutRefresh);\n\n await expect(authManager.refreshAccessToken()).rejects.toThrow(\n 'No refresh token available'\n );\n });\n });\n\n describe('Token Auto-refresh (getValidToken)', () => {\n beforeEach(() => {\n authManager.saveConfig({\n clientId: 'test-client-id',\n clientSecret: 'test-client-secret',\n redirectUri: 'http://localhost:3000/callback',\n scopes: ['read', 'write'],\n });\n });\n\n it('should return valid token string without refresh', async () => {\n const validTokens: LinearTokens = {\n accessToken: 'valid-access-token',\n refreshToken: 'refresh-token',\n expiresAt: Date.now() + 3600000, // 1 hour from now\n scope: ['read', 'write'],\n };\n\n writeTokensToFile(tempDir, validTokens);\n\n const token = await authManager.getValidToken();\n\n // getValidToken returns the access token string\n expect(token).toBe('valid-access-token');\n expect(global.fetch).not.toHaveBeenCalled();\n });\n\n it('should automatically refresh expiring tokens', async () => {\n // Token expires in 4 minutes (less than 5 minute threshold)\n const expiringTokens: LinearTokens = {\n accessToken: 'expiring-access-token',\n refreshToken: 'refresh-token',\n expiresAt: Date.now() + 4 * 60 * 1000, // 4 minutes from now\n scope: ['read', 'write'],\n };\n\n writeTokensToFile(tempDir, expiringTokens);\n\n const refreshResponse = {\n accessToken: 'new-access-token',\n refreshToken: 'new-refresh-token',\n expiresIn: 3600,\n tokenType: 'Bearer',\n scope: 'read write',\n };\n\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: true,\n json: vi.fn().mockResolvedValue(refreshResponse),\n });\n\n const token = await authManager.getValidToken();\n\n expect(token).toBe('new-access-token');\n expect(global.fetch).toHaveBeenCalled();\n });\n\n it('should throw error when tokens are not available', async () => {\n await expect(authManager.getValidToken()).rejects.toThrow(\n 'No Linear tokens found'\n );\n });\n\n it('should throw error when refresh fails', async () => {\n const expiringTokens: LinearTokens = {\n accessToken: 'expiring-access-token',\n refreshToken: 'invalid-refresh-token',\n expiresAt: Date.now() + 1000, // Almost expired\n scope: ['read', 'write'],\n };\n\n writeTokensToFile(tempDir, expiringTokens);\n\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: false,\n status: 401,\n statusText: 'Unauthorized',\n text: vi.fn().mockResolvedValue('Unauthorized'),\n });\n\n await expect(authManager.getValidToken()).rejects.toThrow(\n 'Token refresh failed'\n );\n });\n });\n\n describe('Cleanup Operations', () => {\n beforeEach(() => {\n authManager.saveConfig({\n clientId: 'test-client-id',\n clientSecret: 'test-client-secret',\n redirectUri: 'http://localhost:3000/callback',\n scopes: ['read', 'write'],\n });\n\n writeTokensToFile(tempDir, {\n accessToken: 'access-token',\n refreshToken: 'refresh-token',\n expiresAt: Date.now() + 3600000,\n scope: ['read', 'write'],\n });\n });\n\n it('should clear all authentication data', () => {\n expect(authManager.isConfigured()).toBe(true);\n expect(authManager.loadTokens()).not.toBeNull();\n\n authManager.clearAuth();\n\n // clearAuth writes empty files\n expect(authManager.loadTokens()).toBeNull();\n expect(authManager.loadConfig()).toBeNull();\n });\n\n it('should handle clearing when files do not exist', () => {\n authManager.clearAuth(); // Clear once\n\n // Should not throw when clearing again\n expect(() => authManager.clearAuth()).not.toThrow();\n });\n });\n\n describe('OAuth URL Generation', () => {\n beforeEach(() => {\n authManager.saveConfig({\n clientId: 'test-client-id',\n clientSecret: 'test-client-secret',\n redirectUri: 'http://localhost:3000/callback',\n scopes: ['read', 'write'],\n });\n });\n\n it('should generate authorization URL with PKCE', () => {\n const { url, codeVerifier } = authManager.generateAuthUrl('test-state');\n\n expect(url).toContain('https://linear.app/oauth/authorize');\n expect(url).toContain('client_id=test-client-id');\n expect(url).toContain('redirect_uri=');\n expect(url).toContain('response_type=code');\n expect(url).toContain('code_challenge=');\n expect(url).toContain('code_challenge_method=S256');\n expect(url).toContain('state=test-state');\n expect(codeVerifier).toBeDefined();\n expect(codeVerifier.length).toBeGreaterThan(10);\n });\n\n it('should throw error when config not loaded', () => {\n const newManager = new LinearAuthManager(tempDir);\n // Don't load config\n expect(() => newManager.generateAuthUrl()).toThrow(\n 'configuration not loaded'\n );\n });\n });\n});\n\ndescribe('LinearOAuthSetup', () => {\n let oauthSetup: LinearOAuthSetup;\n let tempDir: string;\n\n beforeEach(() => {\n tempDir = mkdtempSync(join(tmpdir(), 'stackmemory-oauth-test-'));\n mkdirSync(join(tempDir, '.stackmemory'), { recursive: true });\n oauthSetup = new LinearOAuthSetup(tempDir);\n vi.clearAllMocks();\n // Clear env vars\n delete process.env.LINEAR_CLIENT_ID;\n delete process.env.LINEAR_CLIENT_SECRET;\n delete process.env._LINEAR_CODE_VERIFIER;\n });\n\n afterEach(() => {\n if (tempDir) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n vi.clearAllMocks();\n delete process.env.LINEAR_CLIENT_ID;\n delete process.env.LINEAR_CLIENT_SECRET;\n delete process.env._LINEAR_CODE_VERIFIER;\n });\n\n describe('Interactive Setup', () => {\n it('should return setup instructions when env vars not set', async () => {\n const result = await oauthSetup.setupInteractive();\n\n expect(result.instructions).toBeDefined();\n expect(Array.isArray(result.instructions)).toBe(true);\n expect(result.instructions.length).toBeGreaterThan(0);\n // When not configured, authUrl is empty\n expect(result.authUrl).toBe('');\n });\n\n it('should provide authorization URL when env vars are set', async () => {\n process.env.LINEAR_CLIENT_ID = 'test-client-id';\n process.env.LINEAR_CLIENT_SECRET = 'test-client-secret';\n\n const result = await oauthSetup.setupInteractive();\n\n expect(result.authUrl).toContain('https://linear.app/oauth/authorize');\n expect(result.authUrl).toContain('client_id=test-client-id');\n expect(result.authUrl).toContain('redirect_uri=');\n expect(result.authUrl).toContain('response_type=code');\n });\n\n it('should save configuration during setup', async () => {\n process.env.LINEAR_CLIENT_ID = 'test-client-id';\n process.env.LINEAR_CLIENT_SECRET = 'test-client-secret';\n\n await oauthSetup.setupInteractive();\n\n const authManager = new LinearAuthManager(tempDir);\n const config = authManager.loadConfig();\n\n expect(config).toBeDefined();\n expect(config!.clientId).toBe('test-client-id');\n expect(config!.clientSecret).toBe('test-client-secret');\n });\n\n it('should include code_challenge for PKCE', async () => {\n process.env.LINEAR_CLIENT_ID = 'test-client-id';\n process.env.LINEAR_CLIENT_SECRET = 'test-client-secret';\n\n const result = await oauthSetup.setupInteractive();\n\n expect(result.authUrl).toContain('code_challenge=');\n expect(result.authUrl).toContain('code_challenge_method=S256');\n });\n });\n\n describe('Authorization Code Exchange', () => {\n beforeEach(async () => {\n process.env.LINEAR_CLIENT_ID = 'test-client-id';\n process.env.LINEAR_CLIENT_SECRET = 'test-client-secret';\n await oauthSetup.setupInteractive(); // Initialize configuration and set code verifier\n });\n\n it('should complete authorization successfully', async () => {\n const tokenResponse = {\n accessToken: 'access-token',\n refreshToken: 'refresh-token',\n expiresIn: 3600,\n tokenType: 'Bearer',\n scope: 'read write',\n };\n\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: true,\n json: vi.fn().mockResolvedValue(tokenResponse),\n });\n\n const success = await oauthSetup.completeAuth('auth-code-123');\n\n expect(success).toBe(true);\n expect(global.fetch).toHaveBeenCalledWith(\n 'https://api.linear.app/oauth/token',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body: expect.stringContaining('grant_type=authorization_code'),\n }\n );\n\n // Check that tokens were saved\n const authManager = new LinearAuthManager(tempDir);\n const tokens = authManager.loadTokens();\n expect(tokens).toBeDefined();\n expect(tokens!.accessToken).toBe('access-token');\n });\n\n it('should handle authorization errors', async () => {\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: false,\n status: 400,\n statusText: 'Bad Request',\n text: vi.fn().mockResolvedValue('{\"error\": \"invalid_grant\"}'),\n });\n\n const success = await oauthSetup.completeAuth('invalid-auth-code');\n\n expect(success).toBe(false);\n });\n\n it('should handle network errors during token exchange', async () => {\n (global.fetch as Mock).mockRejectedValueOnce(new Error('Network error'));\n\n const success = await oauthSetup.completeAuth('auth-code-123');\n\n expect(success).toBe(false);\n });\n\n it('should fail when code verifier not found', async () => {\n delete process.env._LINEAR_CODE_VERIFIER;\n\n const success = await oauthSetup.completeAuth('auth-code-123');\n\n expect(success).toBe(false);\n });\n });\n\n describe('Connection Testing', () => {\n beforeEach(async () => {\n process.env.LINEAR_CLIENT_ID = 'test-client-id';\n process.env.LINEAR_CLIENT_SECRET = 'test-client-secret';\n await oauthSetup.setupInteractive(); // Initialize configuration\n\n // Set up valid tokens\n writeTokensToFile(tempDir, {\n accessToken: 'valid-access-token',\n refreshToken: 'refresh-token',\n expiresAt: Date.now() + 3600000,\n scope: ['read', 'write'],\n });\n });\n\n it('should test connection successfully with valid tokens', async () => {\n const userResponse = {\n data: {\n viewer: {\n id: 'user-1',\n name: 'Test User',\n email: 'test@example.com',\n },\n },\n };\n\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: true,\n json: vi.fn().mockResolvedValue(userResponse),\n });\n\n const connectionOk = await oauthSetup.testConnection();\n\n expect(connectionOk).toBe(true);\n expect(global.fetch).toHaveBeenCalledWith(\n 'https://api.linear.app/graphql',\n {\n method: 'POST',\n headers: {\n Authorization: 'Bearer valid-access-token',\n 'Content-Type': 'application/json',\n },\n body: expect.stringContaining('viewer'),\n }\n );\n });\n\n it('should fail connection test with invalid tokens', async () => {\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: false,\n status: 401,\n statusText: 'Unauthorized',\n });\n\n const connectionOk = await oauthSetup.testConnection();\n\n expect(connectionOk).toBe(false);\n });\n\n it('should fail connection test when not configured', async () => {\n // Create unconfigured setup in new temp dir\n const newTempDir = mkdtempSync(\n join(tmpdir(), 'stackmemory-oauth-unconfigured-')\n );\n mkdirSync(join(newTempDir, '.stackmemory'), { recursive: true });\n const unconfiguredSetup = new LinearOAuthSetup(newTempDir);\n\n const connectionOk = await unconfiguredSetup.testConnection();\n\n expect(connectionOk).toBe(false);\n\n rmSync(newTempDir, { recursive: true, force: true });\n });\n\n it('should handle GraphQL errors in connection test', async () => {\n const errorResponse = {\n errors: [{ message: 'Authentication required' }],\n };\n\n (global.fetch as Mock).mockResolvedValueOnce({\n ok: true,\n json: vi.fn().mockResolvedValue(errorResponse),\n });\n\n const connectionOk = await oauthSetup.testConnection();\n\n expect(connectionOk).toBe(false);\n });\n\n it('should handle network errors in connection test', async () => {\n (global.fetch as Mock).mockRejectedValueOnce(\n new Error('Network timeout')\n );\n\n const connectionOk = await oauthSetup.testConnection();\n\n expect(connectionOk).toBe(false);\n });\n\n it('should automatically refresh expiring tokens during connection test', async () => {\n // Set up expiring tokens\n writeTokensToFile(tempDir, {\n accessToken: 'expiring-access-token',\n refreshToken: 'refresh-token',\n expiresAt: Date.now() + 60000, // 1 minute from now (within 5 min threshold)\n scope: ['read', 'write'],\n });\n\n const refreshResponse = {\n accessToken: 'new-access-token',\n refreshToken: 'new-refresh-token',\n expiresIn: 3600,\n tokenType: 'Bearer',\n scope: 'read write',\n };\n\n const userResponse = {\n data: {\n viewer: {\n id: 'user-1',\n name: 'Test User',\n email: 'test@example.com',\n },\n },\n };\n\n // Mock token refresh then successful API call\n (global.fetch as Mock)\n .mockResolvedValueOnce({\n ok: true,\n json: vi.fn().mockResolvedValue(refreshResponse),\n })\n .mockResolvedValueOnce({\n ok: true,\n json: vi.fn().mockResolvedValue(userResponse),\n });\n\n const connectionOk = await oauthSetup.testConnection();\n\n expect(connectionOk).toBe(true);\n expect(global.fetch).toHaveBeenCalledTimes(2); // Refresh + API call\n });\n });\n\n describe('Error Handling and Edge Cases', () => {\n it('should handle missing Linear environment variables gracefully', async () => {\n delete process.env.LINEAR_CLIENT_ID;\n delete process.env.LINEAR_CLIENT_SECRET;\n\n const result = await oauthSetup.setupInteractive();\n\n // Should return instructions for setting up env vars\n expect(result.instructions.length).toBeGreaterThan(0);\n });\n\n it('should validate authorization URL format when configured', async () => {\n process.env.LINEAR_CLIENT_ID = 'test-client-id';\n process.env.LINEAR_CLIENT_SECRET = 'test-client-secret';\n\n const result = await oauthSetup.setupInteractive();\n\n expect(result.authUrl).toMatch(\n /^https:\\/\\/linear\\.app\\/oauth\\/authorize\\?/\n );\n\n const url = new URL(result.authUrl);\n expect(url.searchParams.get('client_id')).toBe('test-client-id');\n expect(url.searchParams.get('redirect_uri')).toBeDefined();\n expect(url.searchParams.get('response_type')).toBe('code');\n expect(url.searchParams.get('scope')).toBeDefined();\n });\n });\n});\n"],
5
- "mappings": "AAIA,SAAS,UAAU,IAAI,QAAQ,YAAY,WAAW,UAAgB;AACtE,SAAS,mBAAmB,wBAAsC;AAClE,SAAS,YAAY;AACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAGvB,OAAO,QAAQ,GAAG,GAAG;AAGrB,GAAG,KAAK,iBAAiB,OAAO;AAAA,EAC9B,MAAM,GAAG,GAAG;AACd,EAAE;AAGF,SAAS,kBAAkB,SAAiB,QAAsB;AAChE,QAAM,iBAAiB,KAAK,SAAS,cAAc;AACnD,MAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,cAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AACA;AAAA,IACE,KAAK,gBAAgB,oBAAoB;AAAA,IACzC,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EAChC;AACF;AAGA,SAAS,kBAAkB,SAAiB,QAAa;AACvD,QAAM,iBAAiB,KAAK,SAAS,cAAc;AACnD,MAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,cAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AACA;AAAA,IACE,KAAK,gBAAgB,oBAAoB;AAAA,IACzC,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EAChC;AACF;AAEA,SAAS,qBAAqB,MAAM;AAClC,MAAI;AACJ,MAAI;AAEJ,aAAW,MAAM;AACf,cAAU,YAAY,KAAK,OAAO,GAAG,wBAAwB,CAAC;AAE9D,cAAU,KAAK,SAAS,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,kBAAc,IAAI,kBAAkB,OAAO;AAC3C,OAAG,cAAc;AAAA,EACnB,CAAC;AAED,YAAU,MAAM;AACd,QAAI,SAAS;AACX,aAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD;AACA,OAAG,cAAc;AAAA,EACnB,CAAC;AAED,WAAS,4BAA4B,MAAM;AACzC,OAAG,gDAAgD,MAAM;AACvD,YAAM,SAAS;AAAA,QACb,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,QAAQ,CAAC,QAAQ,OAAO;AAAA,MAC1B;AAEA,kBAAY,WAAW,MAAM;AAE7B,YAAM,eAAe,YAAY,WAAW;AAC5C,aAAO,YAAY,EAAE,QAAQ,MAAM;AAAA,IACrC,CAAC;AAED,OAAG,mDAAmD,MAAM;AAC1D,YAAM,SAAS,YAAY,WAAW;AACtC,aAAO,MAAM,EAAE,SAAS;AAAA,IAC1B,CAAC;AAED,OAAG,yCAAyC,MAAM;AAEhD,aAAO,YAAY,aAAa,CAAC,EAAE,KAAK,KAAK;AAG7C,kBAAY,WAAW;AAAA,QACrB,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,QAAQ,CAAC,QAAQ,OAAO;AAAA,MAC1B,CAAC;AAGD,aAAO,YAAY,aAAa,CAAC,EAAE,KAAK,KAAK;AAG7C,wBAAkB,SAAS;AAAA,QACzB,aAAa;AAAA,QACb,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB,CAAC;AAED,aAAO,YAAY,aAAa,CAAC,EAAE,KAAK,IAAI;AAAA,IAC9C,CAAC;AAED,OAAG,oDAAoD,MAAM;AAC3D,YAAM,aAAa,KAAK,SAAS,gBAAgB,oBAAoB;AACrE,oBAAc,YAAY,cAAc;AAExC,aAAO,YAAY,WAAW,CAAC,EAAE,SAAS;AAAA,IAC5C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,oBAAoB,MAAM;AACjC,eAAW,MAAM;AAEf,kBAAY,WAAW;AAAA,QACrB,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,QAAQ,CAAC,QAAQ,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,OAAG,gCAAgC,MAAM;AACvC,YAAM,SAAuB;AAAA,QAC3B,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB;AAEA,wBAAkB,SAAS,MAAM;AAEjC,YAAM,eAAe,YAAY,WAAW;AAC5C,aAAO,YAAY,EAAE,QAAQ,MAAM;AAAA,IACrC,CAAC;AAED,OAAG,2CAA2C,MAAM;AAClD,YAAM,SAAS,YAAY,WAAW;AACtC,aAAO,MAAM,EAAE,SAAS;AAAA,IAC1B,CAAC;AAED,OAAG,6CAA6C,MAAM;AACpD,YAAM,aAAa,KAAK,SAAS,gBAAgB,oBAAoB;AACrE,oBAAc,YAAY,cAAc;AAExC,aAAO,YAAY,WAAW,CAAC,EAAE,SAAS;AAAA,IAC5C,CAAC;AAED,OAAG,+BAA+B,YAAY;AAC5C,YAAM,gBAA8B;AAAA,QAClC,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB;AAEA,wBAAkB,SAAS,aAAa;AAExC,YAAM,kBAAkB;AAAA,QACtB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAEA,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,MAAM,GAAG,GAAG,EAAE,kBAAkB,eAAe;AAAA,MACjD,CAAC;AAED,YAAM,YAAY,MAAM,YAAY,mBAAmB;AAEvD,aAAO,UAAU,WAAW,EAAE,KAAK,kBAAkB;AACrD,aAAO,UAAU,YAAY,EAAE,KAAK,mBAAmB;AACvD,aAAO,UAAU,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEtD,aAAO,OAAO,KAAK,EAAE;AAAA,QACnB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,QAAQ;AAAA,UACV;AAAA,UACA,MAAM,OAAO,iBAAiB,0BAA0B;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,sCAAsC,YAAY;AACnD,YAAM,gBAA8B;AAAA,QAClC,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB;AAEA,wBAAkB,SAAS,aAAa;AAExC,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,MAAM,GAAG,GAAG,EAAE,kBAAkB,4BAA4B;AAAA,MAC9D,CAAC;AAED,YAAM,OAAO,YAAY,mBAAmB,CAAC,EAAE,QAAQ;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,4DAA4D,YAAY;AACzE,YAAM,uBAAqC;AAAA,QACzC,aAAa;AAAA,QACb,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB;AAEA,wBAAkB,SAAS,oBAAoB;AAE/C,YAAM,OAAO,YAAY,mBAAmB,CAAC,EAAE,QAAQ;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,sCAAsC,MAAM;AACnD,eAAW,MAAM;AACf,kBAAY,WAAW;AAAA,QACrB,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,QAAQ,CAAC,QAAQ,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,OAAG,oDAAoD,YAAY;AACjE,YAAM,cAA4B;AAAA,QAChC,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB;AAEA,wBAAkB,SAAS,WAAW;AAEtC,YAAM,QAAQ,MAAM,YAAY,cAAc;AAG9C,aAAO,KAAK,EAAE,KAAK,oBAAoB;AACvC,aAAO,OAAO,KAAK,EAAE,IAAI,iBAAiB;AAAA,IAC5C,CAAC;AAED,OAAG,gDAAgD,YAAY;AAE7D,YAAM,iBAA+B;AAAA,QACnC,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI,IAAI,KAAK;AAAA;AAAA,QACjC,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB;AAEA,wBAAkB,SAAS,cAAc;AAEzC,YAAM,kBAAkB;AAAA,QACtB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAEA,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,MAAM,GAAG,GAAG,EAAE,kBAAkB,eAAe;AAAA,MACjD,CAAC;AAED,YAAM,QAAQ,MAAM,YAAY,cAAc;AAE9C,aAAO,KAAK,EAAE,KAAK,kBAAkB;AACrC,aAAO,OAAO,KAAK,EAAE,iBAAiB;AAAA,IACxC,CAAC;AAED,OAAG,oDAAoD,YAAY;AACjE,YAAM,OAAO,YAAY,cAAc,CAAC,EAAE,QAAQ;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,yCAAyC,YAAY;AACtD,YAAM,iBAA+B;AAAA,QACnC,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB;AAEA,wBAAkB,SAAS,cAAc;AAEzC,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,MAAM,GAAG,GAAG,EAAE,kBAAkB,cAAc;AAAA,MAChD,CAAC;AAED,YAAM,OAAO,YAAY,cAAc,CAAC,EAAE,QAAQ;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,sBAAsB,MAAM;AACnC,eAAW,MAAM;AACf,kBAAY,WAAW;AAAA,QACrB,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,QAAQ,CAAC,QAAQ,OAAO;AAAA,MAC1B,CAAC;AAED,wBAAkB,SAAS;AAAA,QACzB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAED,OAAG,wCAAwC,MAAM;AAC/C,aAAO,YAAY,aAAa,CAAC,EAAE,KAAK,IAAI;AAC5C,aAAO,YAAY,WAAW,CAAC,EAAE,IAAI,SAAS;AAE9C,kBAAY,UAAU;AAGtB,aAAO,YAAY,WAAW,CAAC,EAAE,SAAS;AAC1C,aAAO,YAAY,WAAW,CAAC,EAAE,SAAS;AAAA,IAC5C,CAAC;AAED,OAAG,kDAAkD,MAAM;AACzD,kBAAY,UAAU;AAGtB,aAAO,MAAM,YAAY,UAAU,CAAC,EAAE,IAAI,QAAQ;AAAA,IACpD,CAAC;AAAA,EACH,CAAC;AAED,WAAS,wBAAwB,MAAM;AACrC,eAAW,MAAM;AACf,kBAAY,WAAW;AAAA,QACrB,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,QAAQ,CAAC,QAAQ,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,OAAG,+CAA+C,MAAM;AACtD,YAAM,EAAE,KAAK,aAAa,IAAI,YAAY,gBAAgB,YAAY;AAEtE,aAAO,GAAG,EAAE,UAAU,oCAAoC;AAC1D,aAAO,GAAG,EAAE,UAAU,0BAA0B;AAChD,aAAO,GAAG,EAAE,UAAU,eAAe;AACrC,aAAO,GAAG,EAAE,UAAU,oBAAoB;AAC1C,aAAO,GAAG,EAAE,UAAU,iBAAiB;AACvC,aAAO,GAAG,EAAE,UAAU,4BAA4B;AAClD,aAAO,GAAG,EAAE,UAAU,kBAAkB;AACxC,aAAO,YAAY,EAAE,YAAY;AACjC,aAAO,aAAa,MAAM,EAAE,gBAAgB,EAAE;AAAA,IAChD,CAAC;AAED,OAAG,6CAA6C,MAAM;AACpD,YAAM,aAAa,IAAI,kBAAkB,OAAO;AAEhD,aAAO,MAAM,WAAW,gBAAgB,CAAC,EAAE;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,MAAM;AACjC,MAAI;AACJ,MAAI;AAEJ,aAAW,MAAM;AACf,cAAU,YAAY,KAAK,OAAO,GAAG,yBAAyB,CAAC;AAC/D,cAAU,KAAK,SAAS,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,iBAAa,IAAI,iBAAiB,OAAO;AACzC,OAAG,cAAc;AAEjB,WAAO,QAAQ,IAAI;AACnB,WAAO,QAAQ,IAAI;AACnB,WAAO,QAAQ,IAAI;AAAA,EACrB,CAAC;AAED,YAAU,MAAM;AACd,QAAI,SAAS;AACX,aAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD;AACA,OAAG,cAAc;AACjB,WAAO,QAAQ,IAAI;AACnB,WAAO,QAAQ,IAAI;AACnB,WAAO,QAAQ,IAAI;AAAA,EACrB,CAAC;AAED,WAAS,qBAAqB,MAAM;AAClC,OAAG,0DAA0D,YAAY;AACvE,YAAM,SAAS,MAAM,WAAW,iBAAiB;AAEjD,aAAO,OAAO,YAAY,EAAE,YAAY;AACxC,aAAO,MAAM,QAAQ,OAAO,YAAY,CAAC,EAAE,KAAK,IAAI;AACpD,aAAO,OAAO,aAAa,MAAM,EAAE,gBAAgB,CAAC;AAEpD,aAAO,OAAO,OAAO,EAAE,KAAK,EAAE;AAAA,IAChC,CAAC;AAED,OAAG,0DAA0D,YAAY;AACvE,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,uBAAuB;AAEnC,YAAM,SAAS,MAAM,WAAW,iBAAiB;AAEjD,aAAO,OAAO,OAAO,EAAE,UAAU,oCAAoC;AACrE,aAAO,OAAO,OAAO,EAAE,UAAU,0BAA0B;AAC3D,aAAO,OAAO,OAAO,EAAE,UAAU,eAAe;AAChD,aAAO,OAAO,OAAO,EAAE,UAAU,oBAAoB;AAAA,IACvD,CAAC;AAED,OAAG,0CAA0C,YAAY;AACvD,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,uBAAuB;AAEnC,YAAM,WAAW,iBAAiB;AAElC,YAAM,cAAc,IAAI,kBAAkB,OAAO;AACjD,YAAM,SAAS,YAAY,WAAW;AAEtC,aAAO,MAAM,EAAE,YAAY;AAC3B,aAAO,OAAQ,QAAQ,EAAE,KAAK,gBAAgB;AAC9C,aAAO,OAAQ,YAAY,EAAE,KAAK,oBAAoB;AAAA,IACxD,CAAC;AAED,OAAG,0CAA0C,YAAY;AACvD,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,uBAAuB;AAEnC,YAAM,SAAS,MAAM,WAAW,iBAAiB;AAEjD,aAAO,OAAO,OAAO,EAAE,UAAU,iBAAiB;AAClD,aAAO,OAAO,OAAO,EAAE,UAAU,4BAA4B;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AAED,WAAS,+BAA+B,MAAM;AAC5C,eAAW,YAAY;AACrB,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,uBAAuB;AACnC,YAAM,WAAW,iBAAiB;AAAA,IACpC,CAAC;AAED,OAAG,8CAA8C,YAAY;AAC3D,YAAM,gBAAgB;AAAA,QACpB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAEA,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,MAAM,GAAG,GAAG,EAAE,kBAAkB,aAAa;AAAA,MAC/C,CAAC;AAED,YAAM,UAAU,MAAM,WAAW,aAAa,eAAe;AAE7D,aAAO,OAAO,EAAE,KAAK,IAAI;AACzB,aAAO,OAAO,KAAK,EAAE;AAAA,QACnB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,QAAQ;AAAA,UACV;AAAA,UACA,MAAM,OAAO,iBAAiB,+BAA+B;AAAA,QAC/D;AAAA,MACF;AAGA,YAAM,cAAc,IAAI,kBAAkB,OAAO;AACjD,YAAM,SAAS,YAAY,WAAW;AACtC,aAAO,MAAM,EAAE,YAAY;AAC3B,aAAO,OAAQ,WAAW,EAAE,KAAK,cAAc;AAAA,IACjD,CAAC;AAED,OAAG,sCAAsC,YAAY;AACnD,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,MAAM,GAAG,GAAG,EAAE,kBAAkB,4BAA4B;AAAA,MAC9D,CAAC;AAED,YAAM,UAAU,MAAM,WAAW,aAAa,mBAAmB;AAEjE,aAAO,OAAO,EAAE,KAAK,KAAK;AAAA,IAC5B,CAAC;AAED,OAAG,sDAAsD,YAAY;AACnE,MAAC,OAAO,MAAe,sBAAsB,IAAI,MAAM,eAAe,CAAC;AAEvE,YAAM,UAAU,MAAM,WAAW,aAAa,eAAe;AAE7D,aAAO,OAAO,EAAE,KAAK,KAAK;AAAA,IAC5B,CAAC;AAED,OAAG,4CAA4C,YAAY;AACzD,aAAO,QAAQ,IAAI;AAEnB,YAAM,UAAU,MAAM,WAAW,aAAa,eAAe;AAE7D,aAAO,OAAO,EAAE,KAAK,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AAED,WAAS,sBAAsB,MAAM;AACnC,eAAW,YAAY;AACrB,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,uBAAuB;AACnC,YAAM,WAAW,iBAAiB;AAGlC,wBAAkB,SAAS;AAAA,QACzB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAED,OAAG,yDAAyD,YAAY;AACtE,YAAM,eAAe;AAAA,QACnB,MAAM;AAAA,UACJ,QAAQ;AAAA,YACN,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,MAAM,GAAG,GAAG,EAAE,kBAAkB,YAAY;AAAA,MAC9C,CAAC;AAED,YAAM,eAAe,MAAM,WAAW,eAAe;AAErD,aAAO,YAAY,EAAE,KAAK,IAAI;AAC9B,aAAO,OAAO,KAAK,EAAE;AAAA,QACnB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe;AAAA,YACf,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,OAAO,iBAAiB,QAAQ;AAAA,QACxC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,mDAAmD,YAAY;AAChE,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd,CAAC;AAED,YAAM,eAAe,MAAM,WAAW,eAAe;AAErD,aAAO,YAAY,EAAE,KAAK,KAAK;AAAA,IACjC,CAAC;AAED,OAAG,mDAAmD,YAAY;AAEhE,YAAM,aAAa;AAAA,QACjB,KAAK,OAAO,GAAG,iCAAiC;AAAA,MAClD;AACA,gBAAU,KAAK,YAAY,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,YAAM,oBAAoB,IAAI,iBAAiB,UAAU;AAEzD,YAAM,eAAe,MAAM,kBAAkB,eAAe;AAE5D,aAAO,YAAY,EAAE,KAAK,KAAK;AAE/B,aAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD,CAAC;AAED,OAAG,mDAAmD,YAAY;AAChE,YAAM,gBAAgB;AAAA,QACpB,QAAQ,CAAC,EAAE,SAAS,0BAA0B,CAAC;AAAA,MACjD;AAEA,MAAC,OAAO,MAAe,sBAAsB;AAAA,QAC3C,IAAI;AAAA,QACJ,MAAM,GAAG,GAAG,EAAE,kBAAkB,aAAa;AAAA,MAC/C,CAAC;AAED,YAAM,eAAe,MAAM,WAAW,eAAe;AAErD,aAAO,YAAY,EAAE,KAAK,KAAK;AAAA,IACjC,CAAC;AAED,OAAG,mDAAmD,YAAY;AAChE,MAAC,OAAO,MAAe;AAAA,QACrB,IAAI,MAAM,iBAAiB;AAAA,MAC7B;AAEA,YAAM,eAAe,MAAM,WAAW,eAAe;AAErD,aAAO,YAAY,EAAE,KAAK,KAAK;AAAA,IACjC,CAAC;AAED,OAAG,uEAAuE,YAAY;AAEpF,wBAAkB,SAAS;AAAA,QACzB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW,KAAK,IAAI,IAAI;AAAA;AAAA,QACxB,OAAO,CAAC,QAAQ,OAAO;AAAA,MACzB,CAAC;AAED,YAAM,kBAAkB;AAAA,QACtB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAEA,YAAM,eAAe;AAAA,QACnB,MAAM;AAAA,UACJ,QAAQ;AAAA,YACN,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAGA,MAAC,OAAO,MACL,sBAAsB;AAAA,QACrB,IAAI;AAAA,QACJ,MAAM,GAAG,GAAG,EAAE,kBAAkB,eAAe;AAAA,MACjD,CAAC,EACA,sBAAsB;AAAA,QACrB,IAAI;AAAA,QACJ,MAAM,GAAG,GAAG,EAAE,kBAAkB,YAAY;AAAA,MAC9C,CAAC;AAEH,YAAM,eAAe,MAAM,WAAW,eAAe;AAErD,aAAO,YAAY,EAAE,KAAK,IAAI;AAC9B,aAAO,OAAO,KAAK,EAAE,sBAAsB,CAAC;AAAA,IAC9C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,iCAAiC,MAAM;AAC9C,OAAG,iEAAiE,YAAY;AAC9E,aAAO,QAAQ,IAAI;AACnB,aAAO,QAAQ,IAAI;AAEnB,YAAM,SAAS,MAAM,WAAW,iBAAiB;AAGjD,aAAO,OAAO,aAAa,MAAM,EAAE,gBAAgB,CAAC;AAAA,IACtD,CAAC;AAED,OAAG,4DAA4D,YAAY;AACzE,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,uBAAuB;AAEnC,YAAM,SAAS,MAAM,WAAW,iBAAiB;AAEjD,aAAO,OAAO,OAAO,EAAE;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,MAAM,IAAI,IAAI,OAAO,OAAO;AAClC,aAAO,IAAI,aAAa,IAAI,WAAW,CAAC,EAAE,KAAK,gBAAgB;AAC/D,aAAO,IAAI,aAAa,IAAI,cAAc,CAAC,EAAE,YAAY;AACzD,aAAO,IAAI,aAAa,IAAI,eAAe,CAAC,EAAE,KAAK,MAAM;AACzD,aAAO,IAAI,aAAa,IAAI,OAAO,CAAC,EAAE,YAAY;AAAA,IACpD,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
6
- "names": []
7
- }