@stackmemoryai/stackmemory 0.5.57 → 0.5.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/bin/codex-smd +6 -0
  2. package/dist/cli/codex-sm-danger.js +21 -0
  3. package/dist/cli/codex-sm-danger.js.map +7 -0
  4. package/dist/cli/commands/handoff.js +33 -3
  5. package/dist/cli/commands/handoff.js.map +2 -2
  6. package/dist/cli/commands/search.js +20 -3
  7. package/dist/cli/commands/search.js.map +2 -2
  8. package/dist/core/database/sqlite-adapter.js +13 -3
  9. package/dist/core/database/sqlite-adapter.js.map +2 -2
  10. package/dist/core/errors/error-utils.js +208 -0
  11. package/dist/core/errors/error-utils.js.map +7 -0
  12. package/dist/core/errors/index.js +13 -4
  13. package/dist/core/errors/index.js.map +2 -2
  14. package/dist/core/merge/unified-merge-resolver.js +303 -0
  15. package/dist/core/merge/unified-merge-resolver.js.map +7 -0
  16. package/dist/core/monitoring/logger.js +61 -9
  17. package/dist/core/monitoring/logger.js.map +2 -2
  18. package/dist/core/security/index.js +35 -0
  19. package/dist/core/security/index.js.map +7 -0
  20. package/dist/core/security/input-sanitizer.js +321 -0
  21. package/dist/core/security/input-sanitizer.js.map +7 -0
  22. package/dist/core/session/enhanced-handoff.js +136 -2
  23. package/dist/core/session/enhanced-handoff.js.map +3 -3
  24. package/dist/integrations/linear/client.js +5 -1
  25. package/dist/integrations/linear/client.js.map +2 -2
  26. package/dist/integrations/mcp/remote-server.js +27 -36
  27. package/dist/integrations/mcp/remote-server.js.map +2 -2
  28. package/dist/integrations/mcp/server.js +44 -29
  29. package/dist/integrations/mcp/server.js.map +3 -3
  30. package/dist/scripts/benchmark-performance.js +48 -0
  31. package/dist/scripts/benchmark-performance.js.map +7 -0
  32. package/dist/scripts/check-redis.js +42 -0
  33. package/dist/scripts/check-redis.js.map +7 -0
  34. package/dist/scripts/initialize.js +116 -0
  35. package/dist/scripts/initialize.js.map +7 -0
  36. package/dist/scripts/list-linear-tasks.js +124 -0
  37. package/dist/scripts/list-linear-tasks.js.map +7 -0
  38. package/dist/scripts/measure-handoff-impact.js +340 -0
  39. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  40. package/dist/scripts/query-chromadb.js +160 -0
  41. package/dist/scripts/query-chromadb.js.map +7 -0
  42. package/dist/scripts/show-linear-summary.js +119 -0
  43. package/dist/scripts/show-linear-summary.js.map +7 -0
  44. package/dist/scripts/simple-swarm-demo.js +90 -0
  45. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  46. package/dist/scripts/status.js +155 -0
  47. package/dist/scripts/status.js.map +7 -0
  48. package/dist/scripts/test-chromadb-sync.js +192 -0
  49. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  50. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  51. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  52. package/dist/scripts/test-ralph-iterations.js +121 -0
  53. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  54. package/dist/scripts/test-redis-storage.js +389 -0
  55. package/dist/scripts/test-redis-storage.js.map +7 -0
  56. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  57. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  58. package/dist/scripts/test-swarm-fixes.js +125 -0
  59. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  60. package/dist/scripts/test-swarm-tui.js +23 -0
  61. package/dist/scripts/test-swarm-tui.js.map +7 -0
  62. package/dist/scripts/test-tui-shortcuts.js +52 -0
  63. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  64. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  65. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  66. package/dist/src/agents/core/agent-task-manager.js +527 -0
  67. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  68. package/dist/src/agents/verifiers/base-verifier.js +133 -0
  69. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  70. package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
  71. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  72. package/dist/src/agents/verifiers/llm-judge.js +252 -0
  73. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  74. package/dist/src/cli/auto-detect.js +321 -0
  75. package/dist/src/cli/auto-detect.js.map +7 -0
  76. package/dist/src/cli/claude-sm-danger.js +21 -0
  77. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  78. package/dist/src/cli/claude-sm.js +1156 -0
  79. package/dist/src/cli/claude-sm.js.map +7 -0
  80. package/dist/src/cli/codex-sm-danger.js +21 -0
  81. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  82. package/dist/src/cli/codex-sm.js +349 -0
  83. package/dist/src/cli/codex-sm.js.map +7 -0
  84. package/dist/src/cli/commands/api.js +232 -0
  85. package/dist/src/cli/commands/api.js.map +7 -0
  86. package/dist/src/cli/commands/auto-background.js +180 -0
  87. package/dist/src/cli/commands/auto-background.js.map +7 -0
  88. package/dist/src/cli/commands/cleanup-processes.js +68 -0
  89. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  90. package/dist/src/cli/commands/clear.js +202 -0
  91. package/dist/src/cli/commands/clear.js.map +7 -0
  92. package/dist/src/cli/commands/config.js +445 -0
  93. package/dist/src/cli/commands/config.js.map +7 -0
  94. package/dist/src/cli/commands/context-rehydrate.js +751 -0
  95. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  96. package/dist/src/cli/commands/context.js +343 -0
  97. package/dist/src/cli/commands/context.js.map +7 -0
  98. package/dist/src/cli/commands/daemon.js +392 -0
  99. package/dist/src/cli/commands/daemon.js.map +7 -0
  100. package/dist/src/cli/commands/dashboard.js +210 -0
  101. package/dist/src/cli/commands/dashboard.js.map +7 -0
  102. package/dist/src/cli/commands/db.js +147 -0
  103. package/dist/src/cli/commands/db.js.map +7 -0
  104. package/dist/src/cli/commands/decision.js +266 -0
  105. package/dist/src/cli/commands/decision.js.map +7 -0
  106. package/dist/src/cli/commands/discovery.js +279 -0
  107. package/dist/src/cli/commands/discovery.js.map +7 -0
  108. package/dist/src/cli/commands/handoff.js +624 -0
  109. package/dist/src/cli/commands/handoff.js.map +7 -0
  110. package/dist/src/cli/commands/hooks.js +298 -0
  111. package/dist/src/cli/commands/hooks.js.map +7 -0
  112. package/dist/src/cli/commands/linear.js +529 -0
  113. package/dist/src/cli/commands/linear.js.map +7 -0
  114. package/dist/src/cli/commands/log.js +169 -0
  115. package/dist/src/cli/commands/log.js.map +7 -0
  116. package/dist/src/cli/commands/login.js +172 -0
  117. package/dist/src/cli/commands/login.js.map +7 -0
  118. package/dist/src/cli/commands/migrate.js +240 -0
  119. package/dist/src/cli/commands/migrate.js.map +7 -0
  120. package/dist/src/cli/commands/model.js +533 -0
  121. package/dist/src/cli/commands/model.js.map +7 -0
  122. package/dist/src/cli/commands/onboard.js +536 -0
  123. package/dist/src/cli/commands/onboard.js.map +7 -0
  124. package/dist/src/cli/commands/projects.js +199 -0
  125. package/dist/src/cli/commands/projects.js.map +7 -0
  126. package/dist/src/cli/commands/ralph.js +909 -0
  127. package/dist/src/cli/commands/ralph.js.map +7 -0
  128. package/dist/src/cli/commands/retrieval.js +248 -0
  129. package/dist/src/cli/commands/retrieval.js.map +7 -0
  130. package/dist/src/cli/commands/search.js +173 -0
  131. package/dist/src/cli/commands/search.js.map +7 -0
  132. package/dist/src/cli/commands/service.js +749 -0
  133. package/dist/src/cli/commands/service.js.map +7 -0
  134. package/dist/src/cli/commands/session.js +200 -0
  135. package/dist/src/cli/commands/session.js.map +7 -0
  136. package/dist/src/cli/commands/settings.js +306 -0
  137. package/dist/src/cli/commands/settings.js.map +7 -0
  138. package/dist/src/cli/commands/setup.js +701 -0
  139. package/dist/src/cli/commands/setup.js.map +7 -0
  140. package/dist/src/cli/commands/shell.js +249 -0
  141. package/dist/src/cli/commands/shell.js.map +7 -0
  142. package/dist/src/cli/commands/signup.js +50 -0
  143. package/dist/src/cli/commands/signup.js.map +7 -0
  144. package/dist/src/cli/commands/skills.js +470 -0
  145. package/dist/src/cli/commands/skills.js.map +7 -0
  146. package/dist/src/cli/commands/sms-notify.js +795 -0
  147. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  148. package/dist/src/cli/commands/storage-tier.js +183 -0
  149. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  150. package/dist/src/cli/commands/sweep.js +249 -0
  151. package/dist/src/cli/commands/sweep.js.map +7 -0
  152. package/dist/src/cli/commands/tasks.js +213 -0
  153. package/dist/src/cli/commands/tasks.js.map +7 -0
  154. package/dist/src/cli/commands/worktree.js +319 -0
  155. package/dist/src/cli/commands/worktree.js.map +7 -0
  156. package/dist/src/cli/index.js +594 -0
  157. package/dist/src/cli/index.js.map +7 -0
  158. package/dist/src/cli/opencode-sm.js +448 -0
  159. package/dist/src/cli/opencode-sm.js.map +7 -0
  160. package/dist/src/cli/utils/viewer.js +96 -0
  161. package/dist/src/cli/utils/viewer.js.map +7 -0
  162. package/dist/src/core/config/config-manager.js +398 -0
  163. package/dist/src/core/config/config-manager.js.map +7 -0
  164. package/dist/src/core/config/feature-flags.js +76 -0
  165. package/dist/src/core/config/feature-flags.js.map +7 -0
  166. package/dist/src/core/config/storage-config.js +115 -0
  167. package/dist/src/core/config/storage-config.js.map +7 -0
  168. package/dist/src/core/config/types.js +144 -0
  169. package/dist/src/core/config/types.js.map +7 -0
  170. package/dist/src/core/context/auto-context.js +80 -0
  171. package/dist/src/core/context/auto-context.js.map +7 -0
  172. package/dist/src/core/context/dual-stack-manager.js +870 -0
  173. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  174. package/dist/src/core/context/enhanced-rehydration.js +994 -0
  175. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  176. package/dist/src/core/context/frame-database.js +479 -0
  177. package/dist/src/core/context/frame-database.js.map +7 -0
  178. package/dist/src/core/context/frame-digest.js +250 -0
  179. package/dist/src/core/context/frame-digest.js.map +7 -0
  180. package/dist/src/core/context/frame-handoff-manager.js +778 -0
  181. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  182. package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
  183. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  184. package/dist/src/core/context/frame-recovery.js +302 -0
  185. package/dist/src/core/context/frame-recovery.js.map +7 -0
  186. package/dist/src/core/context/frame-stack.js +314 -0
  187. package/dist/src/core/context/frame-stack.js.map +7 -0
  188. package/dist/src/core/context/frame-types.js +5 -0
  189. package/dist/src/core/context/frame-types.js.map +7 -0
  190. package/dist/src/core/context/index.js +25 -0
  191. package/dist/src/core/context/index.js.map +7 -0
  192. package/dist/src/core/context/permission-manager.js +185 -0
  193. package/dist/src/core/context/permission-manager.js.map +7 -0
  194. package/dist/src/core/context/recursive-context-manager.js +592 -0
  195. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  196. package/dist/src/core/context/refactored-frame-manager.js +754 -0
  197. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  198. package/dist/src/core/context/shared-context-layer.js +621 -0
  199. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  200. package/dist/src/core/context/stack-merge-resolver.js +749 -0
  201. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  202. package/dist/src/core/context/validation.js +130 -0
  203. package/dist/src/core/context/validation.js.map +7 -0
  204. package/dist/src/core/database/batch-operations.js +384 -0
  205. package/dist/src/core/database/batch-operations.js.map +7 -0
  206. package/dist/src/core/database/connection-pool.js +330 -0
  207. package/dist/src/core/database/connection-pool.js.map +7 -0
  208. package/dist/src/core/database/database-adapter.js +60 -0
  209. package/dist/src/core/database/database-adapter.js.map +7 -0
  210. package/dist/src/core/database/migration-manager.js +614 -0
  211. package/dist/src/core/database/migration-manager.js.map +7 -0
  212. package/dist/src/core/database/query-cache.js +298 -0
  213. package/dist/src/core/database/query-cache.js.map +7 -0
  214. package/dist/src/core/database/query-router.js +430 -0
  215. package/dist/src/core/database/query-router.js.map +7 -0
  216. package/dist/src/core/database/sqlite-adapter.js +738 -0
  217. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  218. package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
  219. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  220. package/dist/src/core/digest/frame-digest-integration.js +176 -0
  221. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  222. package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
  223. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  224. package/dist/src/core/digest/index.js +9 -0
  225. package/dist/src/core/digest/index.js.map +7 -0
  226. package/dist/src/core/digest/types.js +25 -0
  227. package/dist/src/core/digest/types.js.map +7 -0
  228. package/dist/src/core/errors/error-utils.js +208 -0
  229. package/dist/src/core/errors/error-utils.js.map +7 -0
  230. package/dist/src/core/errors/index.js +521 -0
  231. package/dist/src/core/errors/index.js.map +7 -0
  232. package/dist/src/core/errors/recovery.js +269 -0
  233. package/dist/src/core/errors/recovery.js.map +7 -0
  234. package/dist/src/core/execution/parallel-executor.js +258 -0
  235. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  236. package/dist/src/core/frame/workflow-templates.js +319 -0
  237. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  238. package/dist/src/core/merge/conflict-detector.js +431 -0
  239. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  240. package/dist/src/core/merge/index.js +9 -0
  241. package/dist/src/core/merge/index.js.map +7 -0
  242. package/dist/src/core/merge/resolution-engine.js +558 -0
  243. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  244. package/dist/src/core/merge/stack-diff.js +532 -0
  245. package/dist/src/core/merge/stack-diff.js.map +7 -0
  246. package/dist/src/core/merge/types.js +5 -0
  247. package/dist/src/core/merge/types.js.map +7 -0
  248. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  249. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  250. package/dist/src/core/models/fallback-monitor.js +232 -0
  251. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  252. package/dist/src/core/models/model-router.js +340 -0
  253. package/dist/src/core/models/model-router.js.map +7 -0
  254. package/dist/src/core/monitoring/error-handler.js +49 -0
  255. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  256. package/dist/src/core/monitoring/logger.js +202 -0
  257. package/dist/src/core/monitoring/logger.js.map +7 -0
  258. package/dist/src/core/monitoring/metrics.js +172 -0
  259. package/dist/src/core/monitoring/metrics.js.map +7 -0
  260. package/dist/src/core/monitoring/progress-tracker.js +189 -0
  261. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  262. package/dist/src/core/monitoring/session-monitor.js +300 -0
  263. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  264. package/dist/src/core/performance/context-cache.js +273 -0
  265. package/dist/src/core/performance/context-cache.js.map +7 -0
  266. package/dist/src/core/performance/index.js +11 -0
  267. package/dist/src/core/performance/index.js.map +7 -0
  268. package/dist/src/core/performance/lazy-context-loader.js +327 -0
  269. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  270. package/dist/src/core/performance/monitor.js +221 -0
  271. package/dist/src/core/performance/monitor.js.map +7 -0
  272. package/dist/src/core/performance/optimized-frame-context.js +345 -0
  273. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  274. package/dist/src/core/performance/performance-benchmark.js +277 -0
  275. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  276. package/dist/src/core/performance/performance-profiler.js +370 -0
  277. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  278. package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
  279. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  280. package/dist/src/core/persistence/postgres-adapter.js +349 -0
  281. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  282. package/dist/src/core/projects/project-isolation.js +201 -0
  283. package/dist/src/core/projects/project-isolation.js.map +7 -0
  284. package/dist/src/core/projects/project-manager.js +697 -0
  285. package/dist/src/core/projects/project-manager.js.map +7 -0
  286. package/dist/src/core/query/query-parser.js +370 -0
  287. package/dist/src/core/query/query-parser.js.map +7 -0
  288. package/dist/src/core/query/query-templates.js +321 -0
  289. package/dist/src/core/query/query-templates.js.map +7 -0
  290. package/dist/src/core/retrieval/context-retriever.js +479 -0
  291. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  292. package/dist/src/core/retrieval/index.js +8 -0
  293. package/dist/src/core/retrieval/index.js.map +7 -0
  294. package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
  295. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  296. package/dist/src/core/retrieval/llm-provider.js +151 -0
  297. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  298. package/dist/src/core/retrieval/retrieval-audit.js +236 -0
  299. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  300. package/dist/src/core/retrieval/summary-generator.js +589 -0
  301. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  302. package/dist/src/core/retrieval/types.js +21 -0
  303. package/dist/src/core/retrieval/types.js.map +7 -0
  304. package/dist/src/core/security/index.js +35 -0
  305. package/dist/src/core/security/index.js.map +7 -0
  306. package/dist/src/core/security/input-sanitizer.js +321 -0
  307. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  308. package/dist/src/core/session/clear-survival.js +465 -0
  309. package/dist/src/core/session/clear-survival.js.map +7 -0
  310. package/dist/src/core/session/enhanced-handoff.js +792 -0
  311. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  312. package/dist/src/core/session/handoff-generator.js +343 -0
  313. package/dist/src/core/session/handoff-generator.js.map +7 -0
  314. package/dist/src/core/session/index.js +15 -0
  315. package/dist/src/core/session/index.js.map +7 -0
  316. package/dist/src/core/session/session-manager.js +347 -0
  317. package/dist/src/core/session/session-manager.js.map +7 -0
  318. package/dist/src/core/skills/index.js +7 -0
  319. package/dist/src/core/skills/index.js.map +7 -0
  320. package/dist/src/core/skills/skill-storage.js +764 -0
  321. package/dist/src/core/skills/skill-storage.js.map +7 -0
  322. package/dist/src/core/skills/types.js +193 -0
  323. package/dist/src/core/skills/types.js.map +7 -0
  324. package/dist/src/core/storage/chromadb-adapter.js +354 -0
  325. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  326. package/dist/src/core/storage/infinite-storage.js +510 -0
  327. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  328. package/dist/src/core/storage/remote-storage.js +489 -0
  329. package/dist/src/core/storage/remote-storage.js.map +7 -0
  330. package/dist/src/core/storage/two-tier-storage.js +766 -0
  331. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  332. package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
  333. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  334. package/dist/src/core/trace/db-trace-wrapper.js +247 -0
  335. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  336. package/dist/src/core/trace/debug-trace.js +417 -0
  337. package/dist/src/core/trace/debug-trace.js.map +7 -0
  338. package/dist/src/core/trace/index.js +109 -0
  339. package/dist/src/core/trace/index.js.map +7 -0
  340. package/dist/src/core/trace/linear-api-wrapper.js +178 -0
  341. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  342. package/dist/src/core/trace/trace-detector.js +528 -0
  343. package/dist/src/core/trace/trace-detector.js.map +7 -0
  344. package/dist/src/core/trace/trace-store.js +345 -0
  345. package/dist/src/core/trace/trace-store.js.map +7 -0
  346. package/dist/src/core/trace/types.js +77 -0
  347. package/dist/src/core/trace/types.js.map +7 -0
  348. package/dist/src/core/types.js +5 -0
  349. package/dist/src/core/types.js.map +7 -0
  350. package/dist/src/core/utils/async-mutex.js +114 -0
  351. package/dist/src/core/utils/async-mutex.js.map +7 -0
  352. package/dist/src/core/utils/compression.js +83 -0
  353. package/dist/src/core/utils/compression.js.map +7 -0
  354. package/dist/src/core/utils/update-checker.js +218 -0
  355. package/dist/src/core/utils/update-checker.js.map +7 -0
  356. package/dist/src/core/worktree/worktree-manager.js +465 -0
  357. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  358. package/dist/src/daemon/daemon-config.js +149 -0
  359. package/dist/src/daemon/daemon-config.js.map +7 -0
  360. package/dist/src/daemon/services/context-service.js +122 -0
  361. package/dist/src/daemon/services/context-service.js.map +7 -0
  362. package/dist/src/daemon/services/linear-service.js +136 -0
  363. package/dist/src/daemon/services/linear-service.js.map +7 -0
  364. package/dist/src/daemon/session-daemon.js +312 -0
  365. package/dist/src/daemon/session-daemon.js.map +7 -0
  366. package/dist/src/daemon/unified-daemon.js +276 -0
  367. package/dist/src/daemon/unified-daemon.js.map +7 -0
  368. package/dist/src/features/analytics/api/analytics-api.js +287 -0
  369. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  370. package/dist/src/features/analytics/core/analytics-service.js +282 -0
  371. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  372. package/dist/src/features/analytics/index.js +18 -0
  373. package/dist/src/features/analytics/index.js.map +7 -0
  374. package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
  375. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  376. package/dist/src/features/analytics/types/metrics.js +5 -0
  377. package/dist/src/features/analytics/types/metrics.js.map +7 -0
  378. package/dist/src/features/browser/browser-mcp.js +492 -0
  379. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  380. package/dist/src/features/sweep/index.js +20 -0
  381. package/dist/src/features/sweep/index.js.map +7 -0
  382. package/dist/src/features/sweep/prediction-client.js +155 -0
  383. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  384. package/dist/src/features/sweep/prompt-builder.js +85 -0
  385. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  386. package/dist/src/features/sweep/pty-wrapper.js +171 -0
  387. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  388. package/dist/src/features/sweep/state-watcher.js +87 -0
  389. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  390. package/dist/src/features/sweep/status-bar.js +88 -0
  391. package/dist/src/features/sweep/status-bar.js.map +7 -0
  392. package/dist/src/features/sweep/sweep-server-manager.js +226 -0
  393. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  394. package/dist/src/features/sweep/tab-interceptor.js +38 -0
  395. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  396. package/dist/src/features/sweep/types.js +18 -0
  397. package/dist/src/features/sweep/types.js.map +7 -0
  398. package/dist/src/features/tasks/linear-task-manager.js +487 -0
  399. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  400. package/dist/src/features/tasks/task-aware-context.js +410 -0
  401. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  402. package/dist/src/features/tui/simple-monitor.js +116 -0
  403. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  404. package/dist/src/features/tui/swarm-monitor.js +648 -0
  405. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  406. package/dist/src/features/web/client/stores/task-store.js +26 -0
  407. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  408. package/dist/src/features/web/server/index.js +194 -0
  409. package/dist/src/features/web/server/index.js.map +7 -0
  410. package/dist/src/hooks/auto-background.js +151 -0
  411. package/dist/src/hooks/auto-background.js.map +7 -0
  412. package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
  413. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  414. package/dist/src/hooks/config.js +150 -0
  415. package/dist/src/hooks/config.js.map +7 -0
  416. package/dist/src/hooks/daemon.js +364 -0
  417. package/dist/src/hooks/daemon.js.map +7 -0
  418. package/dist/src/hooks/events.js +58 -0
  419. package/dist/src/hooks/events.js.map +7 -0
  420. package/dist/src/hooks/index.js +12 -0
  421. package/dist/src/hooks/index.js.map +7 -0
  422. package/dist/src/hooks/linear-task-picker.js +186 -0
  423. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  424. package/dist/src/hooks/schemas.js +197 -0
  425. package/dist/src/hooks/schemas.js.map +7 -0
  426. package/dist/src/hooks/secure-fs.js +49 -0
  427. package/dist/src/hooks/secure-fs.js.map +7 -0
  428. package/dist/src/hooks/security-logger.js +155 -0
  429. package/dist/src/hooks/security-logger.js.map +7 -0
  430. package/dist/src/hooks/session-summary.js +222 -0
  431. package/dist/src/hooks/session-summary.js.map +7 -0
  432. package/dist/src/hooks/sms-action-runner.js +371 -0
  433. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  434. package/dist/src/hooks/sms-notify.js +506 -0
  435. package/dist/src/hooks/sms-notify.js.map +7 -0
  436. package/dist/src/hooks/sms-watcher.js +93 -0
  437. package/dist/src/hooks/sms-watcher.js.map +7 -0
  438. package/dist/src/hooks/sms-webhook.js +555 -0
  439. package/dist/src/hooks/sms-webhook.js.map +7 -0
  440. package/dist/src/hooks/whatsapp-commands.js +479 -0
  441. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  442. package/dist/src/hooks/whatsapp-scheduler.js +317 -0
  443. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  444. package/dist/src/hooks/whatsapp-sync.js +409 -0
  445. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  446. package/dist/src/index.js +25 -0
  447. package/dist/src/index.js.map +7 -0
  448. package/dist/src/integrations/anthropic/client.js +263 -0
  449. package/dist/src/integrations/anthropic/client.js.map +7 -0
  450. package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
  451. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  452. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
  453. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  454. package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
  455. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  456. package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
  457. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  458. package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
  459. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  460. package/dist/src/integrations/claude-code/subagent-client.js +511 -0
  461. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  462. package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
  463. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  464. package/dist/src/integrations/linear/auth.js +337 -0
  465. package/dist/src/integrations/linear/auth.js.map +7 -0
  466. package/dist/src/integrations/linear/auto-sync.js +258 -0
  467. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  468. package/dist/src/integrations/linear/client.js +634 -0
  469. package/dist/src/integrations/linear/client.js.map +7 -0
  470. package/dist/src/integrations/linear/config.js +130 -0
  471. package/dist/src/integrations/linear/config.js.map +7 -0
  472. package/dist/src/integrations/linear/migration.js +361 -0
  473. package/dist/src/integrations/linear/migration.js.map +7 -0
  474. package/dist/src/integrations/linear/oauth-server.js +454 -0
  475. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  476. package/dist/src/integrations/linear/rest-client.js +213 -0
  477. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  478. package/dist/src/integrations/linear/sync-manager.js +236 -0
  479. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  480. package/dist/src/integrations/linear/sync-service.js +231 -0
  481. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  482. package/dist/src/integrations/linear/sync.js +782 -0
  483. package/dist/src/integrations/linear/sync.js.map +7 -0
  484. package/dist/src/integrations/linear/types.js +5 -0
  485. package/dist/src/integrations/linear/types.js.map +7 -0
  486. package/dist/src/integrations/linear/unified-sync.js +589 -0
  487. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  488. package/dist/src/integrations/linear/webhook-handler.js +219 -0
  489. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  490. package/dist/src/integrations/linear/webhook-server.js +218 -0
  491. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  492. package/dist/src/integrations/linear/webhook.js +291 -0
  493. package/dist/src/integrations/linear/webhook.js.map +7 -0
  494. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
  495. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  496. package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
  497. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  498. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
  499. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  500. package/dist/src/integrations/mcp/handlers/index.js +166 -0
  501. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  502. package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
  503. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  504. package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
  505. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  506. package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
  507. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  508. package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
  509. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  510. package/dist/src/integrations/mcp/index.js +23 -0
  511. package/dist/src/integrations/mcp/index.js.map +7 -0
  512. package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
  513. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  514. package/dist/src/integrations/mcp/refactored-server.js +374 -0
  515. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  516. package/dist/src/integrations/mcp/remote-server.js +682 -0
  517. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  518. package/dist/src/integrations/mcp/schemas.js +147 -0
  519. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  520. package/dist/src/integrations/mcp/server.js +1975 -0
  521. package/dist/src/integrations/mcp/server.js.map +7 -0
  522. package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
  523. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  524. package/dist/src/integrations/mcp/tool-definitions.js +702 -0
  525. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  526. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
  527. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  528. package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
  529. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  530. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
  531. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  532. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
  533. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  534. package/dist/src/integrations/ralph/index.js +18 -0
  535. package/dist/src/integrations/ralph/index.js.map +7 -0
  536. package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
  537. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  538. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
  539. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  540. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
  541. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  542. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
  543. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  544. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
  545. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  546. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
  547. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  548. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
  549. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  550. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
  551. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  552. package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
  553. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  554. package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
  555. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  556. package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
  557. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  558. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
  559. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  560. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
  561. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  562. package/dist/src/integrations/ralph/types.js +5 -0
  563. package/dist/src/integrations/ralph/types.js.map +7 -0
  564. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
  565. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  566. package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
  567. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  568. package/dist/src/middleware/exponential-rate-limiter.js +289 -0
  569. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  570. package/dist/src/models/user.model.js +358 -0
  571. package/dist/src/models/user.model.js.map +7 -0
  572. package/dist/src/servers/production/auth-middleware.js +528 -0
  573. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  574. package/dist/src/services/config-service.js +65 -0
  575. package/dist/src/services/config-service.js.map +7 -0
  576. package/dist/src/services/context-service.js +194 -0
  577. package/dist/src/services/context-service.js.map +7 -0
  578. package/dist/src/skills/api-discovery.js +354 -0
  579. package/dist/src/skills/api-discovery.js.map +7 -0
  580. package/dist/src/skills/api-skill.js +475 -0
  581. package/dist/src/skills/api-skill.js.map +7 -0
  582. package/dist/src/skills/claude-skills.js +1061 -0
  583. package/dist/src/skills/claude-skills.js.map +7 -0
  584. package/dist/src/skills/dashboard-launcher.js +216 -0
  585. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  586. package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
  587. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  588. package/dist/src/skills/repo-ingestion-skill.js +609 -0
  589. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  590. package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
  591. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  592. package/dist/src/types/task.js +5 -0
  593. package/dist/src/types/task.js.map +7 -0
  594. package/dist/src/utils/env.js +50 -0
  595. package/dist/src/utils/env.js.map +7 -0
  596. package/dist/src/utils/formatting.js +62 -0
  597. package/dist/src/utils/formatting.js.map +7 -0
  598. package/dist/src/utils/process-cleanup.js +136 -0
  599. package/dist/src/utils/process-cleanup.js.map +7 -0
  600. package/package.json +4 -3
  601. package/scripts/create-cleanup-issues.js +302 -0
  602. package/scripts/demos/browser-test.ts +39 -0
  603. package/scripts/demos/ralph-integration-demo.ts +244 -0
  604. package/scripts/demos/trace-demo.ts +214 -0
  605. package/scripts/demos/trace-detector.demo.ts +171 -0
  606. package/scripts/demos/trace-test.ts +67 -0
  607. package/scripts/initialize.ts +16 -7
  608. package/scripts/install.sh +14 -62
  609. package/scripts/status.ts +111 -46
  610. package/scripts/test-claude-config.sh +123 -0
  611. package/scripts/validate-claude-config.sh +155 -0
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const __filename = __fileURLToPath(import.meta.url);
5
+ const __dirname = __pathDirname(__filename);
6
+ import { readFileSync } from "fs";
7
+ import { join } from "path";
8
+ async function showLinearSummary() {
9
+ const tokensPath = join(process.cwd(), ".stackmemory", "linear-tokens.json");
10
+ let accessToken;
11
+ try {
12
+ const tokensData = readFileSync(tokensPath, "utf8");
13
+ const tokens = JSON.parse(tokensData);
14
+ accessToken = tokens.accessToken;
15
+ } catch {
16
+ console.error(
17
+ "\u274C Failed to load Linear tokens. Please run: stackmemory linear setup"
18
+ );
19
+ process.exit(1);
20
+ }
21
+ const linearApiUrl = "https://api.linear.app/graphql";
22
+ async function graphqlRequest(query, variables = {}) {
23
+ const response = await fetch(linearApiUrl, {
24
+ method: "POST",
25
+ headers: {
26
+ Authorization: `Bearer ${accessToken}`,
27
+ "Content-Type": "application/json"
28
+ },
29
+ body: JSON.stringify({ query, variables })
30
+ });
31
+ if (!response.ok) {
32
+ throw new Error(
33
+ `Linear API error: ${response.status} ${response.statusText}`
34
+ );
35
+ }
36
+ const result = await response.json();
37
+ if (result.errors) {
38
+ throw new Error(`GraphQL errors: ${JSON.stringify(result.errors)}`);
39
+ }
40
+ return result.data;
41
+ }
42
+ const issuesQuery = `
43
+ query {
44
+ issues(first: 250) {
45
+ nodes {
46
+ identifier
47
+ title
48
+ state {
49
+ name
50
+ type
51
+ }
52
+ createdAt
53
+ updatedAt
54
+ }
55
+ }
56
+ }
57
+ `;
58
+ const data = await graphqlRequest(issuesQuery);
59
+ const issues = data.issues.nodes;
60
+ const grouped = /* @__PURE__ */ new Map();
61
+ for (const issue of issues) {
62
+ const stateType = issue.state.type;
63
+ if (!grouped.has(stateType)) {
64
+ grouped.set(stateType, []);
65
+ }
66
+ const stateIssues = grouped.get(stateType);
67
+ if (stateIssues) {
68
+ stateIssues.push(issue);
69
+ }
70
+ }
71
+ console.log("\n\u{1F4CA} Linear Task Summary\n");
72
+ console.log("=".repeat(60));
73
+ const stateOrder = [
74
+ "backlog",
75
+ "unstarted",
76
+ "started",
77
+ "completed",
78
+ "canceled"
79
+ ];
80
+ for (const state of stateOrder) {
81
+ const stateIssues = grouped.get(state) || [];
82
+ if (stateIssues.length === 0) continue;
83
+ const emoji = {
84
+ backlog: "\u{1F4CB}",
85
+ unstarted: "\u23F3",
86
+ started: "\u{1F504}",
87
+ completed: "\u2705",
88
+ canceled: "\u274C"
89
+ }[state] || "\u26AA";
90
+ console.log(
91
+ `
92
+ ${emoji} ${state.toUpperCase()} (${stateIssues.length} tasks)`
93
+ );
94
+ console.log("-".repeat(40));
95
+ const recent = stateIssues.sort(
96
+ (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()
97
+ ).slice(0, state === "canceled" ? 20 : 5);
98
+ for (const issue of recent) {
99
+ const updatedDate = new Date(issue.updatedAt).toLocaleDateString();
100
+ console.log(
101
+ ` ${issue.identifier.padEnd(10)} ${issue.title.slice(0, 50).padEnd(50)} ${updatedDate}`
102
+ );
103
+ }
104
+ if (stateIssues.length > recent.length) {
105
+ console.log(` ... and ${stateIssues.length - recent.length} more`);
106
+ }
107
+ }
108
+ console.log("\n" + "=".repeat(60));
109
+ console.log("\n\u{1F4C8} Total Issues: " + issues.length);
110
+ const activeCount = (grouped.get("started")?.length ?? 0) + (grouped.get("unstarted")?.length ?? 0) + (grouped.get("backlog")?.length ?? 0);
111
+ console.log(" Active: " + activeCount);
112
+ console.log(" Completed: " + (grouped.get("completed")?.length ?? 0));
113
+ console.log(" Canceled: " + (grouped.get("canceled")?.length ?? 0));
114
+ }
115
+ showLinearSummary().catch((error) => {
116
+ console.error("\u274C Error:", error);
117
+ process.exit(1);
118
+ });
119
+ //# sourceMappingURL=show-linear-summary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../scripts/show-linear-summary.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n\n/**\n * Show Linear task summary with all statuses\n */\n\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\ninterface LinearIssue {\n identifier: string;\n title: string;\n state: {\n name: string;\n type: string;\n };\n createdAt: string;\n updatedAt: string;\n}\n\nasync function showLinearSummary() {\n // Load Linear tokens\n const tokensPath = join(process.cwd(), '.stackmemory', 'linear-tokens.json');\n let accessToken: string;\n\n try {\n const tokensData = readFileSync(tokensPath, 'utf8');\n const tokens = JSON.parse(tokensData);\n accessToken = tokens.accessToken;\n } catch {\n console.error(\n '\u274C Failed to load Linear tokens. Please run: stackmemory linear setup'\n );\n process.exit(1);\n }\n\n // GraphQL helper\n const linearApiUrl = 'https://api.linear.app/graphql';\n\n async function graphqlRequest(\n query: string,\n variables: Record<string, unknown> = {}\n ) {\n const response = await fetch(linearApiUrl, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Linear API error: ${response.status} ${response.statusText}`\n );\n }\n\n const result = (await response.json()) as {\n errors?: unknown[];\n data: unknown;\n };\n if (result.errors) {\n throw new Error(`GraphQL errors: ${JSON.stringify(result.errors)}`);\n }\n\n return result.data;\n }\n\n // Get issues grouped by state\n const issuesQuery = `\n query {\n issues(first: 250) {\n nodes {\n identifier\n title\n state {\n name\n type\n }\n createdAt\n updatedAt\n }\n }\n }\n `;\n\n const data = (await graphqlRequest(issuesQuery)) as {\n issues: { nodes: LinearIssue[] };\n };\n const issues = data.issues.nodes;\n\n // Group by state type\n const grouped = new Map<string, LinearIssue[]>();\n\n for (const issue of issues) {\n const stateType = issue.state.type;\n if (!grouped.has(stateType)) {\n grouped.set(stateType, []);\n }\n const stateIssues = grouped.get(stateType);\n if (stateIssues) {\n stateIssues.push(issue);\n }\n }\n\n // Display summary\n console.log('\\n\uD83D\uDCCA Linear Task Summary\\n');\n console.log('='.repeat(60));\n\n const stateOrder = [\n 'backlog',\n 'unstarted',\n 'started',\n 'completed',\n 'canceled',\n ];\n\n for (const state of stateOrder) {\n const stateIssues = grouped.get(state) || [];\n if (stateIssues.length === 0) continue;\n\n const emoji =\n {\n backlog: '\uD83D\uDCCB',\n unstarted: '\u23F3',\n started: '\uD83D\uDD04',\n completed: '\u2705',\n canceled: '\u274C',\n }[state] || '\u26AA';\n\n console.log(\n `\\n${emoji} ${state.toUpperCase()} (${stateIssues.length} tasks)`\n );\n console.log('-'.repeat(40));\n\n // Show recent items (last 5)\n const recent = stateIssues\n .sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()\n )\n .slice(0, state === 'canceled' ? 20 : 5);\n\n for (const issue of recent) {\n const updatedDate = new Date(issue.updatedAt).toLocaleDateString();\n console.log(\n ` ${issue.identifier.padEnd(10)} ${issue.title.slice(0, 50).padEnd(50)} ${updatedDate}`\n );\n }\n\n if (stateIssues.length > recent.length) {\n console.log(` ... and ${stateIssues.length - recent.length} more`);\n }\n }\n\n console.log('\\n' + '='.repeat(60));\n console.log('\\n\uD83D\uDCC8 Total Issues: ' + issues.length);\n const activeCount =\n (grouped.get('started')?.length ?? 0) +\n (grouped.get('unstarted')?.length ?? 0) +\n (grouped.get('backlog')?.length ?? 0);\n console.log(' Active: ' + activeCount);\n console.log(' Completed: ' + (grouped.get('completed')?.length ?? 0));\n console.log(' Canceled: ' + (grouped.get('canceled')?.length ?? 0));\n}\n\n// Run\nshowLinearSummary().catch((error) => {\n console.error('\u274C Error:', error);\n process.exit(1);\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env npx tsx
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const __filename = __fileURLToPath(import.meta.url);
5
+ const __dirname = __pathDirname(__filename);
6
+ import "dotenv/config";
7
+ import { SwarmCoordinator } from "../src/integrations/ralph/swarm/swarm-coordinator.js";
8
+ import { SwarmRegistry } from "../src/integrations/ralph/monitoring/swarm-registry.js";
9
+ import { logger } from "../src/core/monitoring/logger.js";
10
+ async function runSimpleSwarm() {
11
+ try {
12
+ console.log("\u{1F9BE} Starting Simple Ralph Swarm Demo...");
13
+ const registry = SwarmRegistry.getInstance();
14
+ const coordinator = new SwarmCoordinator({
15
+ maxAgents: 2,
16
+ timeout: 3e4,
17
+ enableGitWorkflow: false,
18
+ // Disable git workflow to avoid branch conflicts
19
+ enableStackMemoryBridge: false
20
+ // Disable StackMemory integration temporarily
21
+ });
22
+ await coordinator.initialize();
23
+ console.log("\u2705 Swarm coordinator initialized");
24
+ const task = {
25
+ id: "simple-demo-task",
26
+ description: "Demonstrate basic swarm functionality without database dependencies",
27
+ type: "demonstration",
28
+ priority: "medium",
29
+ estimatedDuration: 3e4,
30
+ requirements: [
31
+ "Show swarm initialization",
32
+ "Demonstrate agent coordination",
33
+ "Validate basic functionality"
34
+ ]
35
+ };
36
+ console.log("\u{1F4CB} Task defined:", task.description);
37
+ const swarmId = registry.registerSwarm(
38
+ coordinator,
39
+ "Simple Demo Swarm - No Database Dependencies"
40
+ );
41
+ console.log("\u{1F194} Swarm registered:", swarmId);
42
+ const result = await coordinator.launchSwarm(
43
+ task.description,
44
+ [
45
+ {
46
+ role: "developer",
47
+ specialization: "basic-functionality"
48
+ }
49
+ ],
50
+ {
51
+ enableRalphBridge: false,
52
+ // Disable Ralph bridge to avoid database issues
53
+ enableGitWorkflow: false
54
+ // Already disabled in coordinator init
55
+ }
56
+ );
57
+ console.log("\u{1F680} Swarm launched successfully!");
58
+ console.log("\u{1F4CA} Result:", {
59
+ swarmId: result.swarmId,
60
+ agentCount: result.agents?.length || 0,
61
+ status: result.status
62
+ });
63
+ const activeSwarms = registry.listActiveSwarms();
64
+ console.log("\u{1F4C8} Active swarms:", activeSwarms.length);
65
+ console.log("\u23F3 Simulating swarm work for 5 seconds...");
66
+ await new Promise((resolve) => setTimeout(resolve, 5e3));
67
+ console.log("\u{1F6D1} Stopping swarm...");
68
+ await coordinator.stopSwarm();
69
+ console.log("");
70
+ console.log("\u{1F389} Simple swarm demo completed successfully!");
71
+ console.log("");
72
+ console.log("\u2705 Demonstrated:");
73
+ console.log(" - Basic swarm coordinator initialization");
74
+ console.log(" - Swarm registry management");
75
+ console.log(" - Agent configuration without database dependencies");
76
+ console.log(" - Simple task execution workflow");
77
+ console.log("");
78
+ console.log("\u{1F527} This approach bypasses:");
79
+ console.log(" - Complex SessionManager database setup");
80
+ console.log(" - StackMemory FrameManager initialization");
81
+ console.log(" - Git workflow branch conflicts");
82
+ console.log(" - Ralph-StackMemory bridge complications");
83
+ } catch (error) {
84
+ console.error("\u274C Simple swarm demo failed:", error.message);
85
+ logger.error("Simple swarm demo error", error);
86
+ process.exit(1);
87
+ }
88
+ }
89
+ runSimpleSwarm();
90
+ //# sourceMappingURL=simple-swarm-demo.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../scripts/simple-swarm-demo.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env npx tsx\n\n/**\n * Simple Ralph Swarm Demo - Minimal database dependencies\n * Demonstrates basic swarm coordination without complex SessionManager setup\n */\n\nimport 'dotenv/config';\nimport { SwarmCoordinator } from '../src/integrations/ralph/swarm/swarm-coordinator.js';\nimport { SwarmRegistry } from '../src/integrations/ralph/monitoring/swarm-registry.js';\nimport { logger } from '../src/core/monitoring/logger.js';\n\nasync function runSimpleSwarm() {\n try {\n console.log('\uD83E\uDDBE Starting Simple Ralph Swarm Demo...');\n\n // Initialize registry\n const registry = SwarmRegistry.getInstance();\n\n // Create a basic swarm coordinator without complex dependencies\n const coordinator = new SwarmCoordinator({\n maxAgents: 2,\n timeout: 30000,\n enableGitWorkflow: false, // Disable git workflow to avoid branch conflicts\n enableStackMemoryBridge: false, // Disable StackMemory integration temporarily\n });\n\n // Initialize coordinator\n await coordinator.initialize();\n\n console.log('\u2705 Swarm coordinator initialized');\n\n // Define a simple task\n const task = {\n id: 'simple-demo-task',\n description:\n 'Demonstrate basic swarm functionality without database dependencies',\n type: 'demonstration' as const,\n priority: 'medium' as const,\n estimatedDuration: 30000,\n requirements: [\n 'Show swarm initialization',\n 'Demonstrate agent coordination',\n 'Validate basic functionality',\n ],\n };\n\n console.log('\uD83D\uDCCB Task defined:', task.description);\n\n // Register the swarm\n const swarmId = registry.registerSwarm(\n coordinator,\n 'Simple Demo Swarm - No Database Dependencies'\n );\n\n console.log('\uD83C\uDD94 Swarm registered:', swarmId);\n\n // Launch with minimal configuration\n const result = await coordinator.launchSwarm(\n task.description,\n [\n {\n role: 'developer',\n specialization: 'basic-functionality',\n },\n ],\n {\n enableRalphBridge: false, // Disable Ralph bridge to avoid database issues\n enableGitWorkflow: false, // Already disabled in coordinator init\n }\n );\n\n console.log('\uD83D\uDE80 Swarm launched successfully!');\n console.log('\uD83D\uDCCA Result:', {\n swarmId: result.swarmId,\n agentCount: result.agents?.length || 0,\n status: result.status,\n });\n\n // Show registry status\n const activeSwarms = registry.listActiveSwarms();\n console.log('\uD83D\uDCC8 Active swarms:', activeSwarms.length);\n\n // Simulate some work\n console.log('\u23F3 Simulating swarm work for 5 seconds...');\n await new Promise((resolve) => setTimeout(resolve, 5000));\n\n // Stop the swarm\n console.log('\uD83D\uDED1 Stopping swarm...');\n await coordinator.stopSwarm();\n\n console.log('');\n console.log('\uD83C\uDF89 Simple swarm demo completed successfully!');\n console.log('');\n console.log('\u2705 Demonstrated:');\n console.log(' - Basic swarm coordinator initialization');\n console.log(' - Swarm registry management');\n console.log(' - Agent configuration without database dependencies');\n console.log(' - Simple task execution workflow');\n console.log('');\n console.log('\uD83D\uDD27 This approach bypasses:');\n console.log(' - Complex SessionManager database setup');\n console.log(' - StackMemory FrameManager initialization');\n console.log(' - Git workflow branch conflicts');\n console.log(' - Ralph-StackMemory bridge complications');\n } catch (error: unknown) {\n console.error('\u274C Simple swarm demo failed:', (error as Error).message);\n logger.error('Simple swarm demo error', error as Error);\n process.exit(1);\n }\n}\n\n// Run the demo\nrunSimpleSwarm();\n"],
5
+ "mappings": ";;;;;AAOA,OAAO;AACP,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AAEvB,eAAe,iBAAiB;AAC9B,MAAI;AACF,YAAQ,IAAI,+CAAwC;AAGpD,UAAM,WAAW,cAAc,YAAY;AAG3C,UAAM,cAAc,IAAI,iBAAiB;AAAA,MACvC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,mBAAmB;AAAA;AAAA,MACnB,yBAAyB;AAAA;AAAA,IAC3B,CAAC;AAGD,UAAM,YAAY,WAAW;AAE7B,YAAQ,IAAI,sCAAiC;AAG7C,UAAM,OAAO;AAAA,MACX,IAAI;AAAA,MACJ,aACE;AAAA,MACF,MAAM;AAAA,MACN,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,2BAAoB,KAAK,WAAW;AAGhD,UAAM,UAAU,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAEA,YAAQ,IAAI,+BAAwB,OAAO;AAG3C,UAAM,SAAS,MAAM,YAAY;AAAA,MAC/B,KAAK;AAAA,MACL;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA;AAAA,QACE,mBAAmB;AAAA;AAAA,QACnB,mBAAmB;AAAA;AAAA,MACrB;AAAA,IACF;AAEA,YAAQ,IAAI,wCAAiC;AAC7C,YAAQ,IAAI,qBAAc;AAAA,MACxB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO,QAAQ,UAAU;AAAA,MACrC,QAAQ,OAAO;AAAA,IACjB,CAAC;AAGD,UAAM,eAAe,SAAS,iBAAiB;AAC/C,YAAQ,IAAI,4BAAqB,aAAa,MAAM;AAGpD,YAAQ,IAAI,+CAA0C;AACtD,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAGxD,YAAQ,IAAI,6BAAsB;AAClC,UAAM,YAAY,UAAU;AAE5B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,qDAA8C;AAC1D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,sBAAiB;AAC7B,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,gCAAgC;AAC5C,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,qCAAqC;AACjD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,mCAA4B;AACxC,YAAQ,IAAI,4CAA4C;AACxD,YAAQ,IAAI,8CAA8C;AAC1D,YAAQ,IAAI,oCAAoC;AAChD,YAAQ,IAAI,6CAA6C;AAAA,EAC3D,SAAS,OAAgB;AACvB,YAAQ,MAAM,oCAAgC,MAAgB,OAAO;AACrE,WAAO,MAAM,2BAA2B,KAAc;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,eAAe;",
6
+ "names": []
7
+ }
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const __filename = __fileURLToPath(import.meta.url);
5
+ const __dirname = __pathDirname(__filename);
6
+ import Database from "better-sqlite3";
7
+ import { existsSync, readFileSync } from "fs";
8
+ import { join } from "path";
9
+ import chalk from "chalk";
10
+ const projectRoot = process.cwd();
11
+ const stackDir = join(projectRoot, ".stackmemory");
12
+ const dbPath = join(stackDir, "context.db");
13
+ const configPath = join(stackDir, "config.json");
14
+ console.log(chalk.blue.bold("\n[StackMemory Status]\n"));
15
+ if (!existsSync(stackDir)) {
16
+ console.log(chalk.red("[X] .stackmemory directory not found"));
17
+ console.log(chalk.gray(" Run: stackmemory init"));
18
+ process.exit(1);
19
+ }
20
+ console.log(chalk.green("[OK] .stackmemory directory exists"));
21
+ if (existsSync(configPath)) {
22
+ try {
23
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
24
+ console.log(chalk.green("[OK] config.json found"));
25
+ console.log(chalk.gray(` version: ${config.version || "unknown"}`));
26
+ console.log(chalk.gray(` project: ${config.project || "unknown"}`));
27
+ console.log(
28
+ chalk.gray(` initialized: ${config.initialized || "unknown"}`)
29
+ );
30
+ } catch {
31
+ console.log(chalk.yellow("[!] config.json exists but failed to parse"));
32
+ }
33
+ } else {
34
+ console.log(chalk.yellow("[!] config.json not found"));
35
+ }
36
+ if (!existsSync(dbPath)) {
37
+ console.log(chalk.red("[X] context.db not found"));
38
+ process.exit(1);
39
+ }
40
+ console.log(chalk.green("[OK] context.db exists"));
41
+ const db = new Database(dbPath, { readonly: true });
42
+ const stats = {
43
+ contexts: db.prepare("SELECT COUNT(*) as count FROM contexts").get(),
44
+ frames: db.prepare("SELECT COUNT(*) as count FROM frames").get(),
45
+ attention: db.prepare("SELECT COUNT(*) as count FROM attention_log").get()
46
+ };
47
+ console.log(chalk.cyan("\n[Database Stats]"));
48
+ console.log(` Contexts: ${stats.contexts.count}`);
49
+ console.log(` Frames: ${stats.frames.count}`);
50
+ console.log(` Attention logs: ${stats.attention.count}`);
51
+ if (stats.contexts.count > 0) {
52
+ console.log(chalk.cyan("\n[Top Contexts by Importance]"));
53
+ const topContexts = db.prepare(
54
+ `
55
+ SELECT type, substr(content, 1, 60) as preview, importance, access_count
56
+ FROM contexts
57
+ ORDER BY importance DESC, access_count DESC
58
+ LIMIT 5
59
+ `
60
+ ).all();
61
+ topContexts.forEach((ctx, i) => {
62
+ const importance = "*".repeat(Math.round(ctx.importance * 5));
63
+ console.log(
64
+ chalk.white(` ${i + 1}.`) + ` [${ctx.type}] ` + chalk.gray(`(${ctx.access_count} uses)`) + ` ${importance}`
65
+ );
66
+ console.log(chalk.gray(` ${ctx.preview}...`));
67
+ });
68
+ }
69
+ const activeFrames = db.prepare(
70
+ `
71
+ SELECT name, type, datetime(created_at, 'unixepoch') as started
72
+ FROM frames
73
+ WHERE state = 'active'
74
+ ORDER BY created_at DESC
75
+ LIMIT 3
76
+ `
77
+ ).all();
78
+ if (activeFrames.length > 0) {
79
+ console.log(chalk.cyan("\n[Active Frames]"));
80
+ activeFrames.forEach((frame) => {
81
+ console.log(chalk.green(" *") + ` ${frame.name} (${frame.type})`);
82
+ console.log(chalk.gray(` Started: ${frame.started}`));
83
+ });
84
+ }
85
+ const recentAttention = db.prepare(
86
+ `
87
+ SELECT
88
+ substr(query, 1, 50) as query_preview,
89
+ COUNT(*) as count
90
+ FROM attention_log
91
+ WHERE timestamp > unixepoch() - 86400
92
+ GROUP BY query_preview
93
+ ORDER BY count DESC
94
+ LIMIT 3
95
+ `
96
+ ).all();
97
+ if (recentAttention.length > 0) {
98
+ console.log(chalk.cyan("\n[Recent Query Patterns]"));
99
+ recentAttention.forEach((pattern) => {
100
+ console.log(
101
+ chalk.yellow(" ?") + ` "${pattern.query_preview}..." (${pattern.count}x)`
102
+ );
103
+ });
104
+ }
105
+ const oldContexts = db.prepare(
106
+ `
107
+ SELECT COUNT(*) as count
108
+ FROM contexts
109
+ WHERE last_accessed < unixepoch() - 86400 * 7
110
+ `
111
+ ).get();
112
+ if (oldContexts.count > 0) {
113
+ console.log(
114
+ chalk.yellow(
115
+ `
116
+ [!] ${oldContexts.count} contexts haven't been accessed in 7+ days`
117
+ )
118
+ );
119
+ }
120
+ console.log(chalk.cyan("\n[MCP Configuration]"));
121
+ const mcpConfigPaths = [
122
+ join(
123
+ process.env.HOME || "",
124
+ "Library/Application Support/Claude/claude_desktop_config.json"
125
+ ),
126
+ join(process.env.HOME || "", ".config/claude/claude_desktop_config.json")
127
+ ];
128
+ let mcpFound = false;
129
+ for (const mcpPath of mcpConfigPaths) {
130
+ if (existsSync(mcpPath)) {
131
+ try {
132
+ const mcpConfig = JSON.parse(readFileSync(mcpPath, "utf-8"));
133
+ const hasStackMemory = mcpConfig.mcpServers?.stackmemory || mcpConfig.mcpServers?.["stackmemory-mcp"];
134
+ if (hasStackMemory) {
135
+ console.log(chalk.green(" [OK] MCP server configured"));
136
+ mcpFound = true;
137
+ } else {
138
+ console.log(
139
+ chalk.yellow(" [!] MCP config exists but stackmemory not configured")
140
+ );
141
+ }
142
+ } catch {
143
+ console.log(chalk.yellow(` [!] Failed to parse ${mcpPath}`));
144
+ }
145
+ break;
146
+ }
147
+ }
148
+ if (!mcpFound) {
149
+ console.log(chalk.gray(" [--] No MCP configuration found"));
150
+ }
151
+ console.log(
152
+ chalk.gray('\nTip: Run "npm run analyze" for detailed attention analysis\n')
153
+ );
154
+ db.close();
155
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../scripts/status.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env tsx\n/**\n * Check StackMemory status and statistics\n */\n\nimport Database from 'better-sqlite3';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\n\ninterface CountResult {\n count: number;\n}\n\ninterface ContextRow {\n type: string;\n preview: string;\n importance: number;\n access_count: number;\n}\n\ninterface FrameRow {\n name: string;\n type: string;\n started: string;\n}\n\ninterface AttentionRow {\n query_preview: string;\n count: number;\n}\n\nconst projectRoot = process.cwd();\nconst stackDir = join(projectRoot, '.stackmemory');\nconst dbPath = join(stackDir, 'context.db');\nconst configPath = join(stackDir, 'config.json');\n\n// Check if .stackmemory directory exists\nconsole.log(chalk.blue.bold('\\n[StackMemory Status]\\n'));\n\nif (!existsSync(stackDir)) {\n console.log(chalk.red('[X] .stackmemory directory not found'));\n console.log(chalk.gray(' Run: stackmemory init'));\n process.exit(1);\n}\nconsole.log(chalk.green('[OK] .stackmemory directory exists'));\n\n// Show config.json contents\nif (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n console.log(chalk.green('[OK] config.json found'));\n console.log(chalk.gray(` version: ${config.version || 'unknown'}`));\n console.log(chalk.gray(` project: ${config.project || 'unknown'}`));\n console.log(\n chalk.gray(` initialized: ${config.initialized || 'unknown'}`)\n );\n } catch {\n console.log(chalk.yellow('[!] config.json exists but failed to parse'));\n }\n} else {\n console.log(chalk.yellow('[!] config.json not found'));\n}\n\n// Check database\nif (!existsSync(dbPath)) {\n console.log(chalk.red('[X] context.db not found'));\n process.exit(1);\n}\nconsole.log(chalk.green('[OK] context.db exists'));\n\nconst db = new Database(dbPath, { readonly: true });\n\n// Get statistics\nconst stats = {\n contexts: db\n .prepare('SELECT COUNT(*) as count FROM contexts')\n .get() as CountResult,\n frames: db\n .prepare('SELECT COUNT(*) as count FROM frames')\n .get() as CountResult,\n attention: db\n .prepare('SELECT COUNT(*) as count FROM attention_log')\n .get() as CountResult,\n};\n\nconsole.log(chalk.cyan('\\n[Database Stats]'));\nconsole.log(` Contexts: ${stats.contexts.count}`);\nconsole.log(` Frames: ${stats.frames.count}`);\nconsole.log(` Attention logs: ${stats.attention.count}`);\n\n// Get top contexts by importance\nif (stats.contexts.count > 0) {\n console.log(chalk.cyan('\\n[Top Contexts by Importance]'));\n\n const topContexts = db\n .prepare(\n `\n SELECT type, substr(content, 1, 60) as preview, importance, access_count\n FROM contexts\n ORDER BY importance DESC, access_count DESC\n LIMIT 5\n `\n )\n .all() as ContextRow[];\n\n topContexts.forEach((ctx, i) => {\n const importance = '*'.repeat(Math.round(ctx.importance * 5));\n console.log(\n chalk.white(` ${i + 1}.`) +\n ` [${ctx.type}] ` +\n chalk.gray(`(${ctx.access_count} uses)`) +\n ` ${importance}`\n );\n console.log(chalk.gray(` ${ctx.preview}...`));\n });\n}\n\n// Get active frames (using correct schema: name, type, state)\nconst activeFrames = db\n .prepare(\n `\n SELECT name, type, datetime(created_at, 'unixepoch') as started\n FROM frames\n WHERE state = 'active'\n ORDER BY created_at DESC\n LIMIT 3\n`\n )\n .all() as FrameRow[];\n\nif (activeFrames.length > 0) {\n console.log(chalk.cyan('\\n[Active Frames]'));\n activeFrames.forEach((frame) => {\n console.log(chalk.green(' *') + ` ${frame.name} (${frame.type})`);\n console.log(chalk.gray(` Started: ${frame.started}`));\n });\n}\n\n// Get recent attention patterns\nconst recentAttention = db\n .prepare(\n `\n SELECT\n substr(query, 1, 50) as query_preview,\n COUNT(*) as count\n FROM attention_log\n WHERE timestamp > unixepoch() - 86400\n GROUP BY query_preview\n ORDER BY count DESC\n LIMIT 3\n`\n )\n .all() as AttentionRow[];\n\nif (recentAttention.length > 0) {\n console.log(chalk.cyan('\\n[Recent Query Patterns]'));\n recentAttention.forEach((pattern) => {\n console.log(\n chalk.yellow(' ?') + ` \"${pattern.query_preview}...\" (${pattern.count}x)`\n );\n });\n}\n\n// Show context decay\nconst oldContexts = db\n .prepare(\n `\n SELECT COUNT(*) as count\n FROM contexts\n WHERE last_accessed < unixepoch() - 86400 * 7\n`\n )\n .get() as CountResult;\n\nif (oldContexts.count > 0) {\n console.log(\n chalk.yellow(\n `\\n[!] ${oldContexts.count} contexts haven't been accessed in 7+ days`\n )\n );\n}\n\n// Check MCP configuration\nconsole.log(chalk.cyan('\\n[MCP Configuration]'));\nconst mcpConfigPaths = [\n join(\n process.env.HOME || '',\n 'Library/Application Support/Claude/claude_desktop_config.json'\n ),\n join(process.env.HOME || '', '.config/claude/claude_desktop_config.json'),\n];\n\nlet mcpFound = false;\nfor (const mcpPath of mcpConfigPaths) {\n if (existsSync(mcpPath)) {\n try {\n const mcpConfig = JSON.parse(readFileSync(mcpPath, 'utf-8'));\n const hasStackMemory =\n mcpConfig.mcpServers?.stackmemory ||\n mcpConfig.mcpServers?.['stackmemory-mcp'];\n if (hasStackMemory) {\n console.log(chalk.green(' [OK] MCP server configured'));\n mcpFound = true;\n } else {\n console.log(\n chalk.yellow(' [!] MCP config exists but stackmemory not configured')\n );\n }\n } catch {\n console.log(chalk.yellow(` [!] Failed to parse ${mcpPath}`));\n }\n break;\n }\n}\nif (!mcpFound) {\n console.log(chalk.gray(' [--] No MCP configuration found'));\n}\n\nconsole.log(\n chalk.gray('\\nTip: Run \"npm run analyze\" for detailed attention analysis\\n')\n);\n\ndb.close();\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const __filename = __fileURLToPath(import.meta.url);
5
+ const __dirname = __pathDirname(__filename);
6
+ import { ChromaClient } from "chromadb";
7
+ import * as fs from "fs";
8
+ import * as path from "path";
9
+ import * as os from "os";
10
+ import * as readline from "readline";
11
+ import dotenv from "dotenv";
12
+ dotenv.config();
13
+ async function testChromaDBConnection() {
14
+ const apiKey = process.env.CHROMADB_API_KEY;
15
+ const tenant = process.env.CHROMADB_TENANT;
16
+ const database = process.env.CHROMADB_DATABASE || "stackmemory";
17
+ if (!apiKey || !tenant) {
18
+ console.error("\u274C Missing ChromaDB credentials in .env");
19
+ console.log(" CHROMADB_API_KEY:", apiKey ? "\u2713 Set" : "\u2717 Missing");
20
+ console.log(" CHROMADB_TENANT:", tenant ? "\u2713 Set" : "\u2717 Missing");
21
+ console.log(" CHROMADB_DATABASE:", database);
22
+ return null;
23
+ }
24
+ console.log("\u{1F504} Connecting to ChromaDB Cloud...");
25
+ console.log(" Tenant:", tenant);
26
+ console.log(" Database:", database);
27
+ try {
28
+ const client = new ChromaClient({
29
+ ssl: true,
30
+ host: "api.trychroma.com",
31
+ port: 443,
32
+ headers: {
33
+ "X-Chroma-Token": apiKey
34
+ },
35
+ tenant,
36
+ database
37
+ });
38
+ const heartbeat = await client.heartbeat();
39
+ console.log("\u2705 ChromaDB connection successful:", heartbeat);
40
+ return client;
41
+ } catch (error) {
42
+ console.error("\u274C Failed to connect to ChromaDB:", error.message);
43
+ return null;
44
+ }
45
+ }
46
+ async function getOrCreateCollection(client) {
47
+ const collectionName = "stackmemory_contexts";
48
+ try {
49
+ const collections = await client.listCollections();
50
+ console.log("\u{1F4DA} Existing collections:", collections.map((c) => c.name).join(", ") || "none");
51
+ const collection = await client.getOrCreateCollection({
52
+ name: collectionName,
53
+ metadata: {
54
+ description: "StackMemory context storage",
55
+ created_by: "test-chromadb-sync",
56
+ version: "2.0.0"
57
+ }
58
+ });
59
+ console.log(`\u2705 Collection '${collectionName}' ready`);
60
+ const count = await collection.count();
61
+ console.log(` Current entries: ${count}`);
62
+ return collection;
63
+ } catch (error) {
64
+ console.error("\u274C Failed to create/get collection:", error.message);
65
+ return null;
66
+ }
67
+ }
68
+ async function loadLocalContexts() {
69
+ const storageFile = path.join(os.homedir(), ".stackmemory", "context-storage", "contexts.jsonl");
70
+ if (!fs.existsSync(storageFile)) {
71
+ console.log("\u26A0\uFE0F No local contexts found");
72
+ return [];
73
+ }
74
+ const contexts = [];
75
+ const fileStream = fs.createReadStream(storageFile);
76
+ const rl = readline.createInterface({
77
+ input: fileStream,
78
+ crlfDelay: Infinity
79
+ });
80
+ for await (const line of rl) {
81
+ if (line.trim()) {
82
+ try {
83
+ contexts.push(JSON.parse(line));
84
+ } catch (error) {
85
+ console.warn("Failed to parse line:", line.substring(0, 50));
86
+ }
87
+ }
88
+ }
89
+ console.log(`\u{1F4C1} Loaded ${contexts.length} local contexts`);
90
+ return contexts;
91
+ }
92
+ async function syncContextsToChromaDB(collection, contexts) {
93
+ console.log(`
94
+ \u{1F504} Syncing ${contexts.length} contexts to ChromaDB...`);
95
+ let synced = 0;
96
+ let failed = 0;
97
+ const batchSize = 10;
98
+ for (let i = 0; i < contexts.length; i += batchSize) {
99
+ const batch = contexts.slice(i, Math.min(i + batchSize, contexts.length));
100
+ const ids = [];
101
+ const documents = [];
102
+ const metadatas = [];
103
+ for (const ctx of batch) {
104
+ ids.push(ctx.id || `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`);
105
+ documents.push(ctx.content || JSON.stringify(ctx));
106
+ const metadata = {
107
+ timestamp: ctx.timestamp || ctx.stored_at || (/* @__PURE__ */ new Date()).toISOString(),
108
+ type: ctx.type || "context",
109
+ user_id: ctx.user_id || process.env.USER || "default",
110
+ project: ctx.project || "stackmemory"
111
+ };
112
+ if (ctx.session_id) metadata.session_id = ctx.session_id;
113
+ if (ctx.metadata) {
114
+ Object.entries(ctx.metadata).forEach(([key, value]) => {
115
+ if (value !== void 0 && value !== null) {
116
+ metadata[key] = String(value);
117
+ }
118
+ });
119
+ }
120
+ metadatas.push(metadata);
121
+ }
122
+ try {
123
+ await collection.upsert({
124
+ ids,
125
+ documents,
126
+ metadatas
127
+ });
128
+ synced += batch.length;
129
+ console.log(` \u2713 Batch ${Math.floor(i / batchSize) + 1}: ${batch.length} contexts synced`);
130
+ } catch (error) {
131
+ failed += batch.length;
132
+ console.error(` \u2717 Batch ${Math.floor(i / batchSize) + 1} failed:`, error.message);
133
+ }
134
+ }
135
+ console.log(`
136
+ \u{1F4CA} Sync complete:`);
137
+ console.log(` \u2705 Synced: ${synced}`);
138
+ console.log(` \u274C Failed: ${failed}`);
139
+ return { synced, failed };
140
+ }
141
+ async function queryRecentContexts(collection) {
142
+ console.log("\n\u{1F50D} Querying recent contexts...");
143
+ try {
144
+ const results = await collection.query({
145
+ queryTexts: ["task complete code change"],
146
+ nResults: 5
147
+ });
148
+ if (results.ids && results.ids[0].length > 0) {
149
+ console.log(`Found ${results.ids[0].length} relevant contexts:`);
150
+ for (let i = 0; i < results.ids[0].length; i++) {
151
+ const metadata = results.metadatas[0][i];
152
+ const document = results.documents[0][i];
153
+ console.log(`
154
+ \u{1F4C4} Context ${i + 1}:`);
155
+ console.log(` ID: ${results.ids[0][i]}`);
156
+ console.log(` Type: ${metadata.type}`);
157
+ console.log(` Timestamp: ${metadata.timestamp}`);
158
+ console.log(` Content: ${document.substring(0, 100)}...`);
159
+ }
160
+ } else {
161
+ console.log("No contexts found");
162
+ }
163
+ } catch (error) {
164
+ console.error("Failed to query contexts:", error.message);
165
+ }
166
+ }
167
+ async function main() {
168
+ console.log("\u{1F680} ChromaDB Sync Test\n");
169
+ const client = await testChromaDBConnection();
170
+ if (!client) {
171
+ console.error("\n\u274C Cannot proceed without ChromaDB connection");
172
+ console.log("\n\u{1F4DD} To fix:");
173
+ console.log("1. Ensure you have a ChromaDB Cloud account");
174
+ console.log("2. Add credentials to .env:");
175
+ console.log(" CHROMADB_API_KEY=your-api-key");
176
+ console.log(" CHROMADB_TENANT=your-tenant-id");
177
+ console.log(" CHROMADB_DATABASE=stackmemory");
178
+ process.exit(1);
179
+ }
180
+ const collection = await getOrCreateCollection(client);
181
+ if (!collection) {
182
+ process.exit(1);
183
+ }
184
+ const contexts = await loadLocalContexts();
185
+ if (contexts.length > 0) {
186
+ await syncContextsToChromaDB(collection, contexts);
187
+ }
188
+ await queryRecentContexts(collection);
189
+ console.log("\n\u2705 Test complete!");
190
+ }
191
+ main().catch(console.error);
192
+ //# sourceMappingURL=test-chromadb-sync.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../scripts/test-chromadb-sync.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env tsx\n\n/**\n * Test ChromaDB synchronization and upload local contexts\n */\n\nimport { ChromaClient } from 'chromadb';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as readline from 'readline';\nimport dotenv from 'dotenv';\n\n// Load environment variables\ndotenv.config();\n\nasync function testChromaDBConnection() {\n const apiKey = process.env.CHROMADB_API_KEY;\n const tenant = process.env.CHROMADB_TENANT;\n const database = process.env.CHROMADB_DATABASE || 'stackmemory';\n \n if (!apiKey || !tenant) {\n console.error('\u274C Missing ChromaDB credentials in .env');\n console.log(' CHROMADB_API_KEY:', apiKey ? '\u2713 Set' : '\u2717 Missing');\n console.log(' CHROMADB_TENANT:', tenant ? '\u2713 Set' : '\u2717 Missing');\n console.log(' CHROMADB_DATABASE:', database);\n return null;\n }\n\n console.log('\uD83D\uDD04 Connecting to ChromaDB Cloud...');\n console.log(' Tenant:', tenant);\n console.log(' Database:', database);\n \n try {\n // Create ChromaDB client for cloud using new API\n const client = new ChromaClient({\n ssl: true,\n host: 'api.trychroma.com',\n port: 443,\n headers: {\n 'X-Chroma-Token': apiKey\n },\n tenant: tenant,\n database: database\n });\n\n // Test connection\n const heartbeat = await client.heartbeat();\n console.log('\u2705 ChromaDB connection successful:', heartbeat);\n \n return client;\n } catch (error: unknown) {\n console.error('\u274C Failed to connect to ChromaDB:', (error as Error).message);\n return null;\n }\n}\n\nasync function getOrCreateCollection(client: ChromaClient) {\n const collectionName = 'stackmemory_contexts';\n \n try {\n // Try to get existing collection\n const collections = await client.listCollections();\n console.log('\uD83D\uDCDA Existing collections:', collections.map((c: any) => c.name).join(', ') || 'none');\n \n // Get or create the collection\n const collection = await client.getOrCreateCollection({\n name: collectionName,\n metadata: {\n description: 'StackMemory context storage',\n created_by: 'test-chromadb-sync',\n version: '2.0.0'\n }\n });\n \n console.log(`\u2705 Collection '${collectionName}' ready`);\n \n // Get collection count\n const count = await collection.count();\n console.log(` Current entries: ${count}`);\n \n return collection;\n } catch (error: unknown) {\n console.error('\u274C Failed to create/get collection:', (error as Error).message);\n return null;\n }\n}\n\nasync function loadLocalContexts() {\n const storageFile = path.join(os.homedir(), '.stackmemory', 'context-storage', 'contexts.jsonl');\n \n if (!fs.existsSync(storageFile)) {\n console.log('\u26A0\uFE0F No local contexts found');\n return [];\n }\n \n const contexts: any[] = [];\n const fileStream = fs.createReadStream(storageFile);\n const rl = readline.createInterface({\n input: fileStream,\n crlfDelay: Infinity\n });\n\n for await (const line of rl) {\n if (line.trim()) {\n try {\n contexts.push(JSON.parse(line));\n } catch (error) {\n console.warn('Failed to parse line:', line.substring(0, 50));\n }\n }\n }\n \n console.log(`\uD83D\uDCC1 Loaded ${contexts.length} local contexts`);\n return contexts;\n}\n\nasync function syncContextsToChromaDB(collection: any, contexts: any[]) {\n console.log(`\\n\uD83D\uDD04 Syncing ${contexts.length} contexts to ChromaDB...`);\n \n let synced = 0;\n let failed = 0;\n \n // Batch upload for efficiency\n const batchSize = 10;\n for (let i = 0; i < contexts.length; i += batchSize) {\n const batch = contexts.slice(i, Math.min(i + batchSize, contexts.length));\n \n const ids: string[] = [];\n const documents: string[] = [];\n const metadatas: any[] = [];\n \n for (const ctx of batch) {\n ids.push(ctx.id || `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`);\n documents.push(ctx.content || JSON.stringify(ctx));\n \n // Prepare metadata\n const metadata: any = {\n timestamp: ctx.timestamp || ctx.stored_at || new Date().toISOString(),\n type: ctx.type || 'context',\n user_id: ctx.user_id || process.env.USER || 'default',\n project: ctx.project || 'stackmemory'\n };\n \n // Add additional metadata if present\n if (ctx.session_id) metadata.session_id = ctx.session_id;\n if (ctx.metadata) {\n Object.entries(ctx.metadata).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n metadata[key] = String(value);\n }\n });\n }\n \n metadatas.push(metadata);\n }\n \n try {\n await collection.upsert({\n ids,\n documents,\n metadatas\n });\n synced += batch.length;\n console.log(` \u2713 Batch ${Math.floor(i / batchSize) + 1}: ${batch.length} contexts synced`);\n } catch (error: unknown) {\n failed += batch.length;\n console.error(` \u2717 Batch ${Math.floor(i / batchSize) + 1} failed:`, (error as Error).message);\n }\n }\n \n console.log(`\\n\uD83D\uDCCA Sync complete:`);\n console.log(` \u2705 Synced: ${synced}`);\n console.log(` \u274C Failed: ${failed}`);\n \n return { synced, failed };\n}\n\nasync function queryRecentContexts(collection: any) {\n console.log('\\n\uD83D\uDD0D Querying recent contexts...');\n \n try {\n // Query for recent contexts\n const results = await collection.query({\n queryTexts: ['task complete code change'],\n nResults: 5\n });\n \n if (results.ids && results.ids[0].length > 0) {\n console.log(`Found ${results.ids[0].length} relevant contexts:`);\n \n for (let i = 0; i < results.ids[0].length; i++) {\n const metadata = results.metadatas[0][i];\n const document = results.documents[0][i];\n console.log(`\\n\uD83D\uDCC4 Context ${i + 1}:`);\n console.log(` ID: ${results.ids[0][i]}`);\n console.log(` Type: ${metadata.type}`);\n console.log(` Timestamp: ${metadata.timestamp}`);\n console.log(` Content: ${document.substring(0, 100)}...`);\n }\n } else {\n console.log('No contexts found');\n }\n } catch (error: unknown) {\n console.error('Failed to query contexts:', (error as Error).message);\n }\n}\n\nasync function main() {\n console.log('\uD83D\uDE80 ChromaDB Sync Test\\n');\n \n // Connect to ChromaDB\n const client = await testChromaDBConnection();\n if (!client) {\n console.error('\\n\u274C Cannot proceed without ChromaDB connection');\n console.log('\\n\uD83D\uDCDD To fix:');\n console.log('1. Ensure you have a ChromaDB Cloud account');\n console.log('2. Add credentials to .env:');\n console.log(' CHROMADB_API_KEY=your-api-key');\n console.log(' CHROMADB_TENANT=your-tenant-id');\n console.log(' CHROMADB_DATABASE=stackmemory');\n process.exit(1);\n }\n \n // Get or create collection\n const collection = await getOrCreateCollection(client);\n if (!collection) {\n process.exit(1);\n }\n \n // Load local contexts\n const contexts = await loadLocalContexts();\n \n if (contexts.length > 0) {\n // Sync to ChromaDB\n await syncContextsToChromaDB(collection, contexts);\n }\n \n // Query recent contexts\n await queryRecentContexts(collection);\n \n console.log('\\n\u2705 Test complete!');\n}\n\nmain().catch(console.error);"],
5
+ "mappings": ";;;;;AAMA,SAAS,oBAAoB;AAC7B,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,YAAY,cAAc;AAC1B,OAAO,YAAY;AAGnB,OAAO,OAAO;AAEd,eAAe,yBAAyB;AACtC,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,WAAW,QAAQ,IAAI,qBAAqB;AAElD,MAAI,CAAC,UAAU,CAAC,QAAQ;AACtB,YAAQ,MAAM,6CAAwC;AACtD,YAAQ,IAAI,wBAAwB,SAAS,eAAU,gBAAW;AAClE,YAAQ,IAAI,uBAAuB,SAAS,eAAU,gBAAW;AACjE,YAAQ,IAAI,yBAAyB,QAAQ;AAC7C,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,2CAAoC;AAChD,UAAQ,IAAI,cAAc,MAAM;AAChC,UAAQ,IAAI,gBAAgB,QAAQ;AAEpC,MAAI;AAEF,UAAM,SAAS,IAAI,aAAa;AAAA,MAC9B,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,QACP,kBAAkB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,YAAY,MAAM,OAAO,UAAU;AACzC,YAAQ,IAAI,0CAAqC,SAAS;AAE1D,WAAO;AAAA,EACT,SAAS,OAAgB;AACvB,YAAQ,MAAM,yCAAqC,MAAgB,OAAO;AAC1E,WAAO;AAAA,EACT;AACF;AAEA,eAAe,sBAAsB,QAAsB;AACzD,QAAM,iBAAiB;AAEvB,MAAI;AAEF,UAAM,cAAc,MAAM,OAAO,gBAAgB;AACjD,YAAQ,IAAI,mCAA4B,YAAY,IAAI,CAAC,MAAW,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,MAAM;AAGhG,UAAM,aAAa,MAAM,OAAO,sBAAsB;AAAA,MACpD,MAAM;AAAA,MACN,UAAU;AAAA,QACR,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAED,YAAQ,IAAI,sBAAiB,cAAc,SAAS;AAGpD,UAAM,QAAQ,MAAM,WAAW,MAAM;AACrC,YAAQ,IAAI,uBAAuB,KAAK,EAAE;AAE1C,WAAO;AAAA,EACT,SAAS,OAAgB;AACvB,YAAQ,MAAM,2CAAuC,MAAgB,OAAO;AAC5E,WAAO;AAAA,EACT;AACF;AAEA,eAAe,oBAAoB;AACjC,QAAM,cAAc,KAAK,KAAK,GAAG,QAAQ,GAAG,gBAAgB,mBAAmB,gBAAgB;AAE/F,MAAI,CAAC,GAAG,WAAW,WAAW,GAAG;AAC/B,YAAQ,IAAI,uCAA6B;AACzC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAkB,CAAC;AACzB,QAAM,aAAa,GAAG,iBAAiB,WAAW;AAClD,QAAM,KAAK,SAAS,gBAAgB;AAAA,IAClC,OAAO;AAAA,IACP,WAAW;AAAA,EACb,CAAC;AAED,mBAAiB,QAAQ,IAAI;AAC3B,QAAI,KAAK,KAAK,GAAG;AACf,UAAI;AACF,iBAAS,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,MAChC,SAAS,OAAO;AACd,gBAAQ,KAAK,yBAAyB,KAAK,UAAU,GAAG,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,oBAAa,SAAS,MAAM,iBAAiB;AACzD,SAAO;AACT;AAEA,eAAe,uBAAuB,YAAiB,UAAiB;AACtE,UAAQ,IAAI;AAAA,oBAAgB,SAAS,MAAM,0BAA0B;AAErE,MAAI,SAAS;AACb,MAAI,SAAS;AAGb,QAAM,YAAY;AAClB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,WAAW;AACnD,UAAM,QAAQ,SAAS,MAAM,GAAG,KAAK,IAAI,IAAI,WAAW,SAAS,MAAM,CAAC;AAExE,UAAM,MAAgB,CAAC;AACvB,UAAM,YAAsB,CAAC;AAC7B,UAAM,YAAmB,CAAC;AAE1B,eAAW,OAAO,OAAO;AACvB,UAAI,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE;AACjF,gBAAU,KAAK,IAAI,WAAW,KAAK,UAAU,GAAG,CAAC;AAGjD,YAAM,WAAgB;AAAA,QACpB,WAAW,IAAI,aAAa,IAAI,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpE,MAAM,IAAI,QAAQ;AAAA,QAClB,SAAS,IAAI,WAAW,QAAQ,IAAI,QAAQ;AAAA,QAC5C,SAAS,IAAI,WAAW;AAAA,MAC1B;AAGA,UAAI,IAAI,WAAY,UAAS,aAAa,IAAI;AAC9C,UAAI,IAAI,UAAU;AAChB,eAAO,QAAQ,IAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,cAAI,UAAU,UAAa,UAAU,MAAM;AACzC,qBAAS,GAAG,IAAI,OAAO,KAAK;AAAA,UAC9B;AAAA,QACF,CAAC;AAAA,MACH;AAEA,gBAAU,KAAK,QAAQ;AAAA,IACzB;AAEA,QAAI;AACF,YAAM,WAAW,OAAO;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,gBAAU,MAAM;AAChB,cAAQ,IAAI,mBAAc,KAAK,MAAM,IAAI,SAAS,IAAI,CAAC,KAAK,MAAM,MAAM,kBAAkB;AAAA,IAC5F,SAAS,OAAgB;AACvB,gBAAU,MAAM;AAChB,cAAQ,MAAM,mBAAc,KAAK,MAAM,IAAI,SAAS,IAAI,CAAC,YAAa,MAAgB,OAAO;AAAA,IAC/F;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,yBAAqB;AACjC,UAAQ,IAAI,qBAAgB,MAAM,EAAE;AACpC,UAAQ,IAAI,qBAAgB,MAAM,EAAE;AAEpC,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAEA,eAAe,oBAAoB,YAAiB;AAClD,UAAQ,IAAI,yCAAkC;AAE9C,MAAI;AAEF,UAAM,UAAU,MAAM,WAAW,MAAM;AAAA,MACrC,YAAY,CAAC,2BAA2B;AAAA,MACxC,UAAU;AAAA,IACZ,CAAC;AAED,QAAI,QAAQ,OAAO,QAAQ,IAAI,CAAC,EAAE,SAAS,GAAG;AAC5C,cAAQ,IAAI,SAAS,QAAQ,IAAI,CAAC,EAAE,MAAM,qBAAqB;AAE/D,eAAS,IAAI,GAAG,IAAI,QAAQ,IAAI,CAAC,EAAE,QAAQ,KAAK;AAC9C,cAAM,WAAW,QAAQ,UAAU,CAAC,EAAE,CAAC;AACvC,cAAM,WAAW,QAAQ,UAAU,CAAC,EAAE,CAAC;AACvC,gBAAQ,IAAI;AAAA,oBAAgB,IAAI,CAAC,GAAG;AACpC,gBAAQ,IAAI,UAAU,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE;AACzC,gBAAQ,IAAI,YAAY,SAAS,IAAI,EAAE;AACvC,gBAAQ,IAAI,iBAAiB,SAAS,SAAS,EAAE;AACjD,gBAAQ,IAAI,eAAe,SAAS,UAAU,GAAG,GAAG,CAAC,KAAK;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,mBAAmB;AAAA,IACjC;AAAA,EACF,SAAS,OAAgB;AACvB,YAAQ,MAAM,6BAA8B,MAAgB,OAAO;AAAA,EACrE;AACF;AAEA,eAAe,OAAO;AACpB,UAAQ,IAAI,gCAAyB;AAGrC,QAAM,SAAS,MAAM,uBAAuB;AAC5C,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,qDAAgD;AAC9D,YAAQ,IAAI,qBAAc;AAC1B,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,6BAA6B;AACzC,YAAQ,IAAI,kCAAkC;AAC9C,YAAQ,IAAI,mCAAmC;AAC/C,YAAQ,IAAI,kCAAkC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,aAAa,MAAM,sBAAsB,MAAM;AACrD,MAAI,CAAC,YAAY;AACf,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,WAAW,MAAM,kBAAkB;AAEzC,MAAI,SAAS,SAAS,GAAG;AAEvB,UAAM,uBAAuB,YAAY,QAAQ;AAAA,EACnD;AAGA,QAAM,oBAAoB,UAAU;AAEpC,UAAQ,IAAI,yBAAoB;AAClC;AAEA,KAAK,EAAE,MAAM,QAAQ,KAAK;",
6
+ "names": []
7
+ }