@stackmemoryai/stackmemory 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. package/dist/agents/core/agent-task-manager.js +512 -0
  2. package/dist/agents/core/agent-task-manager.js.map +7 -0
  3. package/dist/agents/verifiers/base-verifier.js +129 -0
  4. package/dist/agents/verifiers/base-verifier.js.map +7 -0
  5. package/dist/agents/verifiers/formatter-verifier.js +126 -0
  6. package/dist/agents/verifiers/formatter-verifier.js.map +7 -0
  7. package/dist/agents/verifiers/llm-judge.js +248 -0
  8. package/dist/agents/verifiers/llm-judge.js.map +7 -0
  9. package/dist/cli/__tests__/index.test.js +290 -0
  10. package/dist/cli/__tests__/index.test.js.map +7 -0
  11. package/dist/cli/auto-detect.js +317 -0
  12. package/dist/cli/auto-detect.js.map +7 -0
  13. package/dist/cli/browser-test.js +29 -0
  14. package/dist/cli/browser-test.js.map +7 -0
  15. package/dist/cli/claude-sm.js +369 -0
  16. package/dist/cli/claude-sm.js.map +7 -0
  17. package/dist/cli/codex-sm.js +283 -0
  18. package/dist/cli/codex-sm.js.map +7 -0
  19. package/dist/cli/commands/agent.js +286 -0
  20. package/dist/cli/commands/agent.js.map +7 -0
  21. package/dist/cli/commands/config.js +199 -0
  22. package/dist/cli/commands/config.js.map +7 -0
  23. package/dist/cli/commands/context.js +327 -0
  24. package/dist/cli/commands/context.js.map +7 -0
  25. package/dist/cli/commands/handoff.js +191 -0
  26. package/dist/cli/commands/handoff.js.map +7 -0
  27. package/dist/cli/commands/linear-test.js +115 -0
  28. package/dist/cli/commands/linear-test.js.map +7 -0
  29. package/dist/cli/commands/linear.js +378 -0
  30. package/dist/cli/commands/linear.js.map +7 -0
  31. package/dist/cli/commands/log.js +165 -0
  32. package/dist/cli/commands/log.js.map +7 -0
  33. package/dist/cli/commands/onboard.js +349 -0
  34. package/dist/cli/commands/onboard.js.map +7 -0
  35. package/dist/cli/commands/projects.js +195 -0
  36. package/dist/cli/commands/projects.js.map +7 -0
  37. package/dist/cli/commands/search.js +152 -0
  38. package/dist/cli/commands/search.js.map +7 -0
  39. package/dist/cli/commands/session.js +179 -0
  40. package/dist/cli/commands/session.js.map +7 -0
  41. package/dist/cli/commands/tasks.js +205 -0
  42. package/dist/cli/commands/tasks.js.map +7 -0
  43. package/dist/cli/commands/webhook.js +131 -0
  44. package/dist/cli/commands/webhook.js.map +7 -0
  45. package/dist/cli/commands/worktree.js +276 -0
  46. package/dist/cli/commands/worktree.js.map +7 -0
  47. package/dist/cli/index.js +953 -0
  48. package/dist/cli/index.js.map +7 -0
  49. package/dist/cli/utils/viewer.js +92 -0
  50. package/dist/cli/utils/viewer.js.map +7 -0
  51. package/dist/core/config/__tests__/config-manager.test.js +248 -0
  52. package/dist/core/config/__tests__/config-manager.test.js.map +7 -0
  53. package/dist/core/config/config-manager.js +368 -0
  54. package/dist/core/config/config-manager.js.map +7 -0
  55. package/dist/core/config/types.js +140 -0
  56. package/dist/core/config/types.js.map +7 -0
  57. package/dist/core/context/__tests__/frame-manager.test.js +879 -0
  58. package/dist/core/context/__tests__/frame-manager.test.js.map +7 -0
  59. package/dist/core/context/auto-context.js +72 -0
  60. package/dist/core/context/auto-context.js.map +7 -0
  61. package/dist/core/context/compaction-handler.js +326 -0
  62. package/dist/core/context/compaction-handler.js.map +7 -0
  63. package/dist/core/context/frame-database.js +376 -0
  64. package/dist/core/context/frame-database.js.map +7 -0
  65. package/dist/core/context/frame-digest.js +239 -0
  66. package/dist/core/context/frame-digest.js.map +7 -0
  67. package/dist/core/context/frame-manager.js +682 -0
  68. package/dist/core/context/frame-manager.js.map +7 -0
  69. package/dist/core/context/frame-stack.js +270 -0
  70. package/dist/core/context/frame-stack.js.map +7 -0
  71. package/dist/core/context/frame-types.js +1 -0
  72. package/dist/core/context/frame-types.js.map +7 -0
  73. package/dist/core/context/index.js +33 -0
  74. package/dist/core/context/index.js.map +7 -0
  75. package/dist/core/context/model-aware-compaction.js +619 -0
  76. package/dist/core/context/model-aware-compaction.js.map +7 -0
  77. package/dist/core/context/refactored-frame-manager.js +393 -0
  78. package/dist/core/context/refactored-frame-manager.js.map +7 -0
  79. package/dist/core/database/batch-operations.js +329 -0
  80. package/dist/core/database/batch-operations.js.map +7 -0
  81. package/dist/core/database/connection-pool.js +224 -0
  82. package/dist/core/database/connection-pool.js.map +7 -0
  83. package/dist/core/database/query-cache.js +284 -0
  84. package/dist/core/database/query-cache.js.map +7 -0
  85. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +379 -0
  86. package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +7 -0
  87. package/dist/core/digest/__tests__/frame-digest-integration.test.js +230 -0
  88. package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +7 -0
  89. package/dist/core/digest/enhanced-hybrid-digest.js +267 -0
  90. package/dist/core/digest/enhanced-hybrid-digest.js.map +7 -0
  91. package/dist/core/digest/frame-digest-integration.js +172 -0
  92. package/dist/core/digest/frame-digest-integration.js.map +7 -0
  93. package/dist/core/digest/hybrid-digest-generator.js +549 -0
  94. package/dist/core/digest/hybrid-digest-generator.js.map +7 -0
  95. package/dist/core/digest/index.js +5 -0
  96. package/dist/core/digest/index.js.map +7 -0
  97. package/dist/core/digest/types.js +21 -0
  98. package/dist/core/digest/types.js.map +7 -0
  99. package/dist/core/errors/__tests__/error-handling.test.js +270 -0
  100. package/dist/core/errors/__tests__/error-handling.test.js.map +7 -0
  101. package/dist/core/errors/index.js +239 -0
  102. package/dist/core/errors/index.js.map +7 -0
  103. package/dist/core/errors/recovery.js +258 -0
  104. package/dist/core/errors/recovery.js.map +7 -0
  105. package/dist/core/merge/__tests__/conflict-scenarios.test.js +414 -0
  106. package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +7 -0
  107. package/dist/core/merge/conflict-detector.js +424 -0
  108. package/dist/core/merge/conflict-detector.js.map +7 -0
  109. package/dist/core/merge/index.js +5 -0
  110. package/dist/core/merge/index.js.map +7 -0
  111. package/dist/core/merge/resolution-engine.js +565 -0
  112. package/dist/core/merge/resolution-engine.js.map +7 -0
  113. package/dist/core/merge/stack-diff.js +528 -0
  114. package/dist/core/merge/stack-diff.js.map +7 -0
  115. package/dist/core/merge/types.js +1 -0
  116. package/dist/core/merge/types.js.map +7 -0
  117. package/dist/core/monitoring/error-handler.js +278 -0
  118. package/dist/core/monitoring/error-handler.js.map +7 -0
  119. package/dist/core/monitoring/logger.js +115 -0
  120. package/dist/core/monitoring/logger.js.map +7 -0
  121. package/dist/core/monitoring/metrics.js +157 -0
  122. package/dist/core/monitoring/metrics.js.map +7 -0
  123. package/dist/core/monitoring/progress-tracker.js +174 -0
  124. package/dist/core/monitoring/progress-tracker.js.map +7 -0
  125. package/dist/core/performance/context-cache.js +269 -0
  126. package/dist/core/performance/context-cache.js.map +7 -0
  127. package/dist/core/performance/index.js +7 -0
  128. package/dist/core/performance/index.js.map +7 -0
  129. package/dist/core/performance/lazy-context-loader.js +319 -0
  130. package/dist/core/performance/lazy-context-loader.js.map +7 -0
  131. package/dist/core/performance/monitor.js +217 -0
  132. package/dist/core/performance/monitor.js.map +7 -0
  133. package/dist/core/performance/optimized-frame-context.js +326 -0
  134. package/dist/core/performance/optimized-frame-context.js.map +7 -0
  135. package/dist/core/performance/performance-benchmark.js +269 -0
  136. package/dist/core/performance/performance-benchmark.js.map +7 -0
  137. package/dist/core/performance/performance-profiler.js +318 -0
  138. package/dist/core/performance/performance-profiler.js.map +7 -0
  139. package/dist/core/performance/streaming-jsonl-parser.js +187 -0
  140. package/dist/core/performance/streaming-jsonl-parser.js.map +7 -0
  141. package/dist/core/persistence/postgres-adapter.js +345 -0
  142. package/dist/core/persistence/postgres-adapter.js.map +7 -0
  143. package/dist/core/projects/project-manager.js +699 -0
  144. package/dist/core/projects/project-manager.js.map +7 -0
  145. package/dist/core/query/__tests__/query-parser.test.js +301 -0
  146. package/dist/core/query/__tests__/query-parser.test.js.map +7 -0
  147. package/dist/core/query/__tests__/query-templates.test.js +210 -0
  148. package/dist/core/query/__tests__/query-templates.test.js.map +7 -0
  149. package/dist/core/query/query-parser.js +366 -0
  150. package/dist/core/query/query-parser.js.map +7 -0
  151. package/dist/core/query/query-templates.js +317 -0
  152. package/dist/core/query/query-templates.js.map +7 -0
  153. package/dist/core/retrieval/index.js +4 -0
  154. package/dist/core/retrieval/index.js.map +7 -0
  155. package/dist/core/retrieval/llm-context-retrieval.js +577 -0
  156. package/dist/core/retrieval/llm-context-retrieval.js.map +7 -0
  157. package/dist/core/retrieval/summary-generator.js +585 -0
  158. package/dist/core/retrieval/summary-generator.js.map +7 -0
  159. package/dist/core/retrieval/types.js +17 -0
  160. package/dist/core/retrieval/types.js.map +7 -0
  161. package/dist/core/session/index.js +11 -0
  162. package/dist/core/session/index.js.map +7 -0
  163. package/dist/core/session/session-manager.js +297 -0
  164. package/dist/core/session/session-manager.js.map +7 -0
  165. package/dist/core/trace/cli-trace-wrapper.js +110 -0
  166. package/dist/core/trace/cli-trace-wrapper.js.map +7 -0
  167. package/dist/core/trace/db-trace-wrapper.js +215 -0
  168. package/dist/core/trace/db-trace-wrapper.js.map +7 -0
  169. package/dist/core/trace/debug-trace.js +385 -0
  170. package/dist/core/trace/debug-trace.js.map +7 -0
  171. package/dist/core/trace/index.js +158 -0
  172. package/dist/core/trace/index.js.map +7 -0
  173. package/dist/core/trace/linear-api-wrapper.js +169 -0
  174. package/dist/core/trace/linear-api-wrapper.js.map +7 -0
  175. package/dist/core/trace/trace-demo.js +135 -0
  176. package/dist/core/trace/trace-demo.js.map +7 -0
  177. package/dist/core/trace/trace-detector.demo.js +138 -0
  178. package/dist/core/trace/trace-detector.demo.js.map +7 -0
  179. package/dist/core/trace/trace-detector.js +386 -0
  180. package/dist/core/trace/trace-detector.js.map +7 -0
  181. package/dist/core/trace/trace-detector.test.js +401 -0
  182. package/dist/core/trace/trace-detector.test.js.map +7 -0
  183. package/dist/core/trace/trace-store.js +341 -0
  184. package/dist/core/trace/trace-store.js.map +7 -0
  185. package/dist/core/trace/types.js +73 -0
  186. package/dist/core/trace/types.js.map +7 -0
  187. package/dist/core/types.js +1 -0
  188. package/dist/core/types.js.map +7 -0
  189. package/dist/core/utils/update-checker.js +214 -0
  190. package/dist/core/utils/update-checker.js.map +7 -0
  191. package/dist/core/worktree/worktree-manager.js +450 -0
  192. package/dist/core/worktree/worktree-manager.js.map +7 -0
  193. package/dist/features/analytics/api/analytics-api.js +283 -0
  194. package/dist/features/analytics/api/analytics-api.js.map +7 -0
  195. package/dist/features/analytics/core/analytics-service.js +267 -0
  196. package/dist/features/analytics/core/analytics-service.js.map +7 -0
  197. package/dist/features/analytics/index.js +14 -0
  198. package/dist/features/analytics/index.js.map +7 -0
  199. package/dist/features/analytics/queries/metrics-queries.js +273 -0
  200. package/dist/features/analytics/queries/metrics-queries.js.map +7 -0
  201. package/dist/features/analytics/types/metrics.js +1 -0
  202. package/dist/features/analytics/types/metrics.js.map +7 -0
  203. package/dist/features/browser/browser-mcp.js +488 -0
  204. package/dist/features/browser/browser-mcp.js.map +7 -0
  205. package/dist/features/tasks/__tests__/pebbles-task-store.test.js +747 -0
  206. package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +7 -0
  207. package/dist/features/tasks/pebbles-task-store.js +647 -0
  208. package/dist/features/tasks/pebbles-task-store.js.map +7 -0
  209. package/dist/features/tasks/task-aware-context.js +406 -0
  210. package/dist/features/tasks/task-aware-context.js.map +7 -0
  211. package/dist/index.js +21 -0
  212. package/dist/index.js.map +7 -0
  213. package/dist/integrations/linear/__tests__/auth.test.js +558 -0
  214. package/dist/integrations/linear/__tests__/auth.test.js.map +7 -0
  215. package/dist/integrations/linear/__tests__/sync-service.test.js +760 -0
  216. package/dist/integrations/linear/__tests__/sync-service.test.js.map +7 -0
  217. package/dist/integrations/linear/auth.js +308 -0
  218. package/dist/integrations/linear/auth.js.map +7 -0
  219. package/dist/integrations/linear/auto-sync.js +244 -0
  220. package/dist/integrations/linear/auto-sync.js.map +7 -0
  221. package/dist/integrations/linear/client.js +448 -0
  222. package/dist/integrations/linear/client.js.map +7 -0
  223. package/dist/integrations/linear/config.js +115 -0
  224. package/dist/integrations/linear/config.js.map +7 -0
  225. package/dist/integrations/linear/sync-manager.js +233 -0
  226. package/dist/integrations/linear/sync-manager.js.map +7 -0
  227. package/dist/integrations/linear/sync-service.js +214 -0
  228. package/dist/integrations/linear/sync-service.js.map +7 -0
  229. package/dist/integrations/linear/sync.js +565 -0
  230. package/dist/integrations/linear/sync.js.map +7 -0
  231. package/dist/integrations/linear/types.js +1 -0
  232. package/dist/integrations/linear/types.js.map +7 -0
  233. package/dist/integrations/linear/webhook-server.js +204 -0
  234. package/dist/integrations/linear/webhook-server.js.map +7 -0
  235. package/dist/integrations/linear/webhook.js +269 -0
  236. package/dist/integrations/linear/webhook.js.map +7 -0
  237. package/dist/integrations/mcp/__tests__/server.test.js +798 -0
  238. package/dist/integrations/mcp/__tests__/server.test.js.map +7 -0
  239. package/dist/integrations/mcp/handlers/context-handlers.js +253 -0
  240. package/dist/integrations/mcp/handlers/context-handlers.js.map +7 -0
  241. package/dist/integrations/mcp/handlers/index.js +134 -0
  242. package/dist/integrations/mcp/handlers/index.js.map +7 -0
  243. package/dist/integrations/mcp/handlers/linear-handlers.js +243 -0
  244. package/dist/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  245. package/dist/integrations/mcp/handlers/task-handlers.js +235 -0
  246. package/dist/integrations/mcp/handlers/task-handlers.js.map +7 -0
  247. package/dist/integrations/mcp/handlers/trace-handlers.js +304 -0
  248. package/dist/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  249. package/dist/integrations/mcp/index.js +19 -0
  250. package/dist/integrations/mcp/index.js.map +7 -0
  251. package/dist/integrations/mcp/refactored-server.js +331 -0
  252. package/dist/integrations/mcp/refactored-server.js.map +7 -0
  253. package/dist/integrations/mcp/server.js +1621 -0
  254. package/dist/integrations/mcp/server.js.map +7 -0
  255. package/dist/integrations/mcp/tool-definitions.js +562 -0
  256. package/dist/integrations/mcp/tool-definitions.js.map +7 -0
  257. package/dist/integrations/mcp/trace-test.js +44 -0
  258. package/dist/integrations/mcp/trace-test.js.map +7 -0
  259. package/dist/integrations/pg-aiguide/embedding-provider.js +174 -0
  260. package/dist/integrations/pg-aiguide/embedding-provider.js.map +7 -0
  261. package/dist/integrations/pg-aiguide/semantic-search.js +183 -0
  262. package/dist/integrations/pg-aiguide/semantic-search.js.map +7 -0
  263. package/dist/integrations/pg-aiguide/timescale-analytics.js +220 -0
  264. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +7 -0
  265. package/dist/mcp/stackmemory-mcp-server.js +550 -0
  266. package/dist/mcp/stackmemory-mcp-server.js.map +7 -0
  267. package/dist/middleware/exponential-rate-limiter.js +285 -0
  268. package/dist/middleware/exponential-rate-limiter.js.map +7 -0
  269. package/dist/models/user.model.js +351 -0
  270. package/dist/models/user.model.js.map +7 -0
  271. package/dist/scripts/benchmark-performance.d.ts +7 -0
  272. package/dist/scripts/benchmark-performance.d.ts.map +1 -0
  273. package/dist/scripts/benchmark-performance.js +44 -0
  274. package/dist/scripts/benchmark-performance.js.map +1 -0
  275. package/dist/scripts/cleanup-duplicate-tasks.d.ts +12 -0
  276. package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +1 -0
  277. package/dist/scripts/cleanup-duplicate-tasks.js +215 -0
  278. package/dist/scripts/cleanup-duplicate-tasks.js.map +1 -0
  279. package/dist/servers/production/auth-middleware.js +513 -0
  280. package/dist/servers/production/auth-middleware.js.map +7 -0
  281. package/dist/servers/railway/index.js +390 -0
  282. package/dist/servers/railway/index.js.map +7 -0
  283. package/dist/services/config-service.js +62 -0
  284. package/dist/services/config-service.js.map +7 -0
  285. package/dist/services/context-service.js +191 -0
  286. package/dist/services/context-service.js.map +7 -0
  287. package/dist/src/agents/core/agent-task-manager.d.ts +154 -0
  288. package/dist/src/agents/core/agent-task-manager.d.ts.map +1 -0
  289. package/dist/src/agents/core/agent-task-manager.js +504 -0
  290. package/dist/src/agents/core/agent-task-manager.js.map +1 -0
  291. package/dist/src/agents/verifiers/base-verifier.d.ts +112 -0
  292. package/dist/src/agents/verifiers/base-verifier.d.ts.map +1 -0
  293. package/dist/src/agents/verifiers/base-verifier.js +130 -0
  294. package/dist/src/agents/verifiers/base-verifier.js.map +1 -0
  295. package/dist/src/agents/verifiers/formatter-verifier.d.ts +14 -0
  296. package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +1 -0
  297. package/dist/src/agents/verifiers/formatter-verifier.js +107 -0
  298. package/dist/src/agents/verifiers/formatter-verifier.js.map +1 -0
  299. package/dist/src/agents/verifiers/llm-judge.d.ts +46 -0
  300. package/dist/src/agents/verifiers/llm-judge.d.ts.map +1 -0
  301. package/dist/src/agents/verifiers/llm-judge.js +248 -0
  302. package/dist/src/agents/verifiers/llm-judge.js.map +1 -0
  303. package/dist/src/cli/claude-sm.js +55 -0
  304. package/dist/src/cli/claude-sm.js.map +1 -1
  305. package/dist/src/cli/commands/agent.d.ts +9 -0
  306. package/dist/src/cli/commands/agent.d.ts.map +1 -0
  307. package/dist/src/cli/commands/agent.js +303 -0
  308. package/dist/src/cli/commands/agent.js.map +1 -0
  309. package/dist/src/cli/commands/handoff.d.ts +6 -0
  310. package/dist/src/cli/commands/handoff.d.ts.map +1 -0
  311. package/dist/src/cli/commands/handoff.js +212 -0
  312. package/dist/src/cli/commands/handoff.js.map +1 -0
  313. package/dist/src/cli/index.d.ts.map +1 -1
  314. package/dist/src/cli/index.js +4 -0
  315. package/dist/src/cli/index.js.map +1 -1
  316. package/dist/src/core/context/frame-database.d.ts +59 -0
  317. package/dist/src/core/context/frame-database.d.ts.map +1 -0
  318. package/dist/src/core/context/frame-database.js +333 -0
  319. package/dist/src/core/context/frame-database.js.map +1 -0
  320. package/dist/src/core/context/frame-digest.d.ts +59 -0
  321. package/dist/src/core/context/frame-digest.d.ts.map +1 -0
  322. package/dist/src/core/context/frame-digest.js +264 -0
  323. package/dist/src/core/context/frame-digest.js.map +1 -0
  324. package/dist/src/core/context/frame-manager.d.ts +2 -0
  325. package/dist/src/core/context/frame-manager.d.ts.map +1 -1
  326. package/dist/src/core/context/frame-manager.js +7 -0
  327. package/dist/src/core/context/frame-manager.js.map +1 -1
  328. package/dist/src/core/context/frame-stack.d.ts +85 -0
  329. package/dist/src/core/context/frame-stack.d.ts.map +1 -0
  330. package/dist/src/core/context/frame-stack.js +287 -0
  331. package/dist/src/core/context/frame-stack.js.map +1 -0
  332. package/dist/src/core/context/frame-types.d.ts +67 -0
  333. package/dist/src/core/context/frame-types.d.ts.map +1 -0
  334. package/dist/src/core/context/frame-types.js +6 -0
  335. package/dist/src/core/context/frame-types.js.map +1 -0
  336. package/dist/src/core/context/index.d.ts +11 -0
  337. package/dist/src/core/context/index.d.ts.map +1 -0
  338. package/dist/src/core/context/index.js +14 -0
  339. package/dist/src/core/context/index.js.map +1 -0
  340. package/dist/src/core/context/refactored-frame-manager.d.ts +99 -0
  341. package/dist/src/core/context/refactored-frame-manager.d.ts.map +1 -0
  342. package/dist/src/core/context/refactored-frame-manager.js +340 -0
  343. package/dist/src/core/context/refactored-frame-manager.js.map +1 -0
  344. package/dist/src/core/database/batch-operations.d.ts +118 -0
  345. package/dist/src/core/database/batch-operations.d.ts.map +1 -0
  346. package/dist/src/core/database/batch-operations.js +339 -0
  347. package/dist/src/core/database/batch-operations.js.map +1 -0
  348. package/dist/src/core/database/connection-pool.d.ts +79 -0
  349. package/dist/src/core/database/connection-pool.d.ts.map +1 -0
  350. package/dist/src/core/database/connection-pool.js +236 -0
  351. package/dist/src/core/database/connection-pool.js.map +1 -0
  352. package/dist/src/core/database/query-cache.d.ts +135 -0
  353. package/dist/src/core/database/query-cache.d.ts.map +1 -0
  354. package/dist/src/core/database/query-cache.js +294 -0
  355. package/dist/src/core/database/query-cache.js.map +1 -0
  356. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +125 -0
  357. package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +1 -0
  358. package/dist/src/core/digest/enhanced-hybrid-digest.js +282 -0
  359. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +1 -0
  360. package/dist/src/core/digest/frame-digest-integration.d.ts +67 -0
  361. package/dist/src/core/digest/frame-digest-integration.d.ts.map +1 -0
  362. package/dist/src/core/digest/frame-digest-integration.js +198 -0
  363. package/dist/src/core/digest/frame-digest-integration.js.map +1 -0
  364. package/dist/src/core/digest/hybrid-digest-generator.d.ts +3 -3
  365. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -1
  366. package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -1
  367. package/dist/src/core/digest/index.d.ts +3 -1
  368. package/dist/src/core/digest/index.d.ts.map +1 -1
  369. package/dist/src/core/digest/index.js +3 -1
  370. package/dist/src/core/digest/index.js.map +1 -1
  371. package/dist/src/core/errors/index.d.ts +13 -5
  372. package/dist/src/core/errors/index.d.ts.map +1 -1
  373. package/dist/src/core/errors/index.js +13 -5
  374. package/dist/src/core/errors/index.js.map +1 -1
  375. package/dist/src/core/merge/conflict-detector.d.ts +122 -0
  376. package/dist/src/core/merge/conflict-detector.d.ts.map +1 -0
  377. package/dist/src/core/merge/conflict-detector.js +468 -0
  378. package/dist/src/core/merge/conflict-detector.js.map +1 -0
  379. package/dist/src/core/merge/index.d.ts +9 -0
  380. package/dist/src/core/merge/index.d.ts.map +1 -0
  381. package/dist/src/core/merge/index.js +9 -0
  382. package/dist/src/core/merge/index.js.map +1 -0
  383. package/dist/src/core/merge/resolution-engine.d.ts +120 -0
  384. package/dist/src/core/merge/resolution-engine.d.ts.map +1 -0
  385. package/dist/src/core/merge/resolution-engine.js +573 -0
  386. package/dist/src/core/merge/resolution-engine.js.map +1 -0
  387. package/dist/src/core/merge/stack-diff.d.ts +97 -0
  388. package/dist/src/core/merge/stack-diff.d.ts.map +1 -0
  389. package/dist/src/core/merge/stack-diff.js +516 -0
  390. package/dist/src/core/merge/stack-diff.js.map +1 -0
  391. package/dist/src/core/merge/types.d.ts +110 -0
  392. package/dist/src/core/merge/types.d.ts.map +1 -0
  393. package/dist/src/core/merge/types.js +6 -0
  394. package/dist/src/core/merge/types.js.map +1 -0
  395. package/dist/src/core/performance/context-cache.d.ts +109 -0
  396. package/dist/src/core/performance/context-cache.d.ts.map +1 -0
  397. package/dist/src/core/performance/context-cache.js +280 -0
  398. package/dist/src/core/performance/context-cache.js.map +1 -0
  399. package/dist/src/core/performance/index.d.ts +3 -0
  400. package/dist/src/core/performance/index.d.ts.map +1 -0
  401. package/dist/src/core/performance/index.js +3 -0
  402. package/dist/src/core/performance/index.js.map +1 -0
  403. package/dist/src/core/performance/lazy-context-loader.d.ts +93 -0
  404. package/dist/src/core/performance/lazy-context-loader.d.ts.map +1 -0
  405. package/dist/src/core/performance/lazy-context-loader.js +332 -0
  406. package/dist/src/core/performance/lazy-context-loader.js.map +1 -0
  407. package/dist/src/core/performance/monitor.d.ts +48 -0
  408. package/dist/src/core/performance/monitor.d.ts.map +1 -0
  409. package/dist/src/core/performance/monitor.js +226 -0
  410. package/dist/src/core/performance/monitor.js.map +1 -0
  411. package/dist/src/core/performance/optimized-frame-context.d.ts +74 -0
  412. package/dist/src/core/performance/optimized-frame-context.d.ts.map +1 -0
  413. package/dist/src/core/performance/optimized-frame-context.js +330 -0
  414. package/dist/src/core/performance/optimized-frame-context.js.map +1 -0
  415. package/dist/src/core/performance/performance-benchmark.d.ts +50 -0
  416. package/dist/src/core/performance/performance-benchmark.d.ts.map +1 -0
  417. package/dist/src/core/performance/performance-benchmark.js +290 -0
  418. package/dist/src/core/performance/performance-benchmark.js.map +1 -0
  419. package/dist/src/core/performance/performance-profiler.d.ts +151 -0
  420. package/dist/src/core/performance/performance-profiler.d.ts.map +1 -0
  421. package/dist/src/core/performance/performance-profiler.js +346 -0
  422. package/dist/src/core/performance/performance-profiler.js.map +1 -0
  423. package/dist/src/core/performance/streaming-jsonl-parser.d.ts +41 -0
  424. package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +1 -0
  425. package/dist/src/core/performance/streaming-jsonl-parser.js +193 -0
  426. package/dist/src/core/performance/streaming-jsonl-parser.js.map +1 -0
  427. package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -1
  428. package/dist/src/core/persistence/postgres-adapter.js +18 -4
  429. package/dist/src/core/persistence/postgres-adapter.js.map +1 -1
  430. package/dist/src/core/query/query-parser.d.ts +5 -0
  431. package/dist/src/core/query/query-parser.d.ts.map +1 -1
  432. package/dist/src/core/query/query-parser.js +86 -18
  433. package/dist/src/core/query/query-parser.js.map +1 -1
  434. package/dist/src/core/query/query-templates.d.ts +44 -0
  435. package/dist/src/core/query/query-templates.d.ts.map +1 -0
  436. package/dist/src/core/query/query-templates.js +326 -0
  437. package/dist/src/core/query/query-templates.js.map +1 -0
  438. package/dist/src/core/retrieval/llm-context-retrieval.d.ts +5 -3
  439. package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -1
  440. package/dist/src/core/retrieval/llm-context-retrieval.js +73 -21
  441. package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -1
  442. package/dist/src/core/trace/cli-trace-wrapper.d.ts +23 -0
  443. package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +1 -0
  444. package/dist/src/core/trace/cli-trace-wrapper.js +141 -0
  445. package/dist/src/core/trace/cli-trace-wrapper.js.map +1 -0
  446. package/dist/src/core/trace/db-trace-wrapper.d.ts +36 -0
  447. package/dist/src/core/trace/db-trace-wrapper.d.ts.map +1 -0
  448. package/dist/src/core/trace/db-trace-wrapper.js +252 -0
  449. package/dist/src/core/trace/db-trace-wrapper.js.map +1 -0
  450. package/dist/src/core/trace/debug-trace.d.ts +84 -0
  451. package/dist/src/core/trace/debug-trace.d.ts.map +1 -0
  452. package/dist/src/core/trace/debug-trace.js +402 -0
  453. package/dist/src/core/trace/debug-trace.js.map +1 -0
  454. package/dist/src/core/trace/error-test.d.ts +6 -0
  455. package/dist/src/core/trace/error-test.d.ts.map +1 -0
  456. package/dist/src/core/trace/error-test.js +128 -0
  457. package/dist/src/core/trace/error-test.js.map +1 -0
  458. package/dist/src/core/trace/index.d.ts +25 -0
  459. package/dist/src/core/trace/index.d.ts.map +1 -0
  460. package/dist/src/core/trace/index.js +121 -0
  461. package/dist/src/core/trace/index.js.map +1 -0
  462. package/dist/src/core/trace/linear-api-wrapper.d.ts +17 -0
  463. package/dist/src/core/trace/linear-api-wrapper.d.ts.map +1 -0
  464. package/dist/src/core/trace/linear-api-wrapper.js +205 -0
  465. package/dist/src/core/trace/linear-api-wrapper.js.map +1 -0
  466. package/dist/src/core/trace/performance-test.d.ts +6 -0
  467. package/dist/src/core/trace/performance-test.d.ts.map +1 -0
  468. package/dist/src/core/trace/performance-test.js +111 -0
  469. package/dist/src/core/trace/performance-test.js.map +1 -0
  470. package/dist/src/core/trace/trace-demo.d.ts +8 -0
  471. package/dist/src/core/trace/trace-demo.d.ts.map +1 -0
  472. package/dist/src/core/trace/trace-demo.js +154 -0
  473. package/dist/src/core/trace/trace-demo.js.map +1 -0
  474. package/dist/src/core/trace/trace-detector.d.ts +2 -2
  475. package/dist/src/core/trace/trace-detector.d.ts.map +1 -1
  476. package/dist/src/core/trace/trace-detector.demo.js +1 -1
  477. package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
  478. package/dist/src/core/trace/trace-detector.js +3 -3
  479. package/dist/src/core/trace/trace-detector.js.map +1 -1
  480. package/dist/src/features/tasks/pebbles-task-store.d.ts +9 -2
  481. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
  482. package/dist/src/features/tasks/pebbles-task-store.js +97 -18
  483. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
  484. package/dist/src/integrations/linear/auth.d.ts.map +1 -1
  485. package/dist/src/integrations/linear/auth.js.map +1 -1
  486. package/dist/src/integrations/linear/client.d.ts +15 -1
  487. package/dist/src/integrations/linear/client.d.ts.map +1 -1
  488. package/dist/src/integrations/linear/client.js +85 -3
  489. package/dist/src/integrations/linear/client.js.map +1 -1
  490. package/dist/src/integrations/linear/sync-manager.d.ts +2 -0
  491. package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -1
  492. package/dist/src/integrations/linear/sync-manager.js +16 -4
  493. package/dist/src/integrations/linear/sync-manager.js.map +1 -1
  494. package/dist/src/integrations/linear/sync-service.d.ts +23 -2
  495. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -1
  496. package/dist/src/integrations/linear/sync-service.js +44 -25
  497. package/dist/src/integrations/linear/sync-service.js.map +1 -1
  498. package/dist/src/integrations/linear/sync.d.ts +6 -0
  499. package/dist/src/integrations/linear/sync.d.ts.map +1 -1
  500. package/dist/src/integrations/linear/sync.js +27 -2
  501. package/dist/src/integrations/linear/sync.js.map +1 -1
  502. package/dist/src/integrations/linear/types.d.ts +16 -1
  503. package/dist/src/integrations/linear/types.d.ts.map +1 -1
  504. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -1
  505. package/dist/src/integrations/linear/webhook-server.js +10 -8
  506. package/dist/src/integrations/linear/webhook-server.js.map +1 -1
  507. package/dist/src/integrations/linear/webhook.d.ts +13 -0
  508. package/dist/src/integrations/linear/webhook.d.ts.map +1 -1
  509. package/dist/src/integrations/linear/webhook.js +101 -14
  510. package/dist/src/integrations/linear/webhook.js.map +1 -1
  511. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +39 -0
  512. package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +1 -0
  513. package/dist/src/integrations/mcp/handlers/context-handlers.js +266 -0
  514. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +1 -0
  515. package/dist/src/integrations/mcp/handlers/index.d.ts +37 -0
  516. package/dist/src/integrations/mcp/handlers/index.d.ts.map +1 -0
  517. package/dist/src/integrations/mcp/handlers/index.js +134 -0
  518. package/dist/src/integrations/mcp/handlers/index.js.map +1 -0
  519. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +33 -0
  520. package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +1 -0
  521. package/dist/src/integrations/mcp/handlers/linear-handlers.js +251 -0
  522. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +1 -0
  523. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +42 -0
  524. package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +1 -0
  525. package/dist/src/integrations/mcp/handlers/task-handlers.js +238 -0
  526. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +1 -0
  527. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +41 -0
  528. package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +1 -0
  529. package/dist/src/integrations/mcp/handlers/trace-handlers.js +298 -0
  530. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +1 -0
  531. package/dist/src/integrations/mcp/index.d.ts +13 -0
  532. package/dist/src/integrations/mcp/index.d.ts.map +1 -0
  533. package/dist/src/integrations/mcp/index.js +17 -0
  534. package/dist/src/integrations/mcp/index.js.map +1 -0
  535. package/dist/src/integrations/mcp/refactored-server.d.ts +76 -0
  536. package/dist/src/integrations/mcp/refactored-server.d.ts.map +1 -0
  537. package/dist/src/integrations/mcp/refactored-server.js +351 -0
  538. package/dist/src/integrations/mcp/refactored-server.js.map +1 -0
  539. package/dist/src/integrations/mcp/tool-definitions.d.ts +44 -0
  540. package/dist/src/integrations/mcp/tool-definitions.d.ts.map +1 -0
  541. package/dist/src/integrations/mcp/tool-definitions.js +563 -0
  542. package/dist/src/integrations/mcp/tool-definitions.js.map +1 -0
  543. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -1
  544. package/dist/src/integrations/pg-aiguide/semantic-search.js +43 -21
  545. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -1
  546. package/dist/src/mcp/stackmemory-mcp-server.d.ts +9 -0
  547. package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +1 -0
  548. package/dist/src/mcp/stackmemory-mcp-server.js +519 -0
  549. package/dist/src/mcp/stackmemory-mcp-server.js.map +1 -0
  550. package/dist/src/middleware/exponential-rate-limiter.d.ts +78 -0
  551. package/dist/src/middleware/exponential-rate-limiter.d.ts.map +1 -0
  552. package/dist/src/middleware/exponential-rate-limiter.js +293 -0
  553. package/dist/src/middleware/exponential-rate-limiter.js.map +1 -0
  554. package/dist/src/models/user.model.d.ts +8 -1
  555. package/dist/src/models/user.model.d.ts.map +1 -1
  556. package/dist/src/models/user.model.js +62 -14
  557. package/dist/src/models/user.model.js.map +1 -1
  558. package/dist/src/servers/production/auth-middleware.d.ts +5 -2
  559. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  560. package/dist/src/servers/production/auth-middleware.js +71 -34
  561. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  562. package/dist/src/services/context-service.d.ts.map +1 -1
  563. package/dist/src/services/context-service.js +86 -1
  564. package/dist/src/services/context-service.js.map +1 -1
  565. package/dist/src/validation/schemas.d.ts +633 -0
  566. package/dist/src/validation/schemas.d.ts.map +1 -0
  567. package/dist/src/validation/schemas.js +347 -0
  568. package/dist/src/validation/schemas.js.map +1 -0
  569. package/dist/types/task.js +1 -0
  570. package/dist/types/task.js.map +7 -0
  571. package/dist/utils/logger.js +52 -0
  572. package/dist/utils/logger.js.map +7 -0
  573. package/dist/validation/schemas.js +218 -0
  574. package/dist/validation/schemas.js.map +7 -0
  575. package/package.json +7 -3
@@ -0,0 +1,278 @@
1
+ import { logger } from "./logger.js";
2
+ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
3
+ ErrorCode2["AUTH_FAILED"] = "AUTH_FAILED";
4
+ ErrorCode2["TOKEN_EXPIRED"] = "TOKEN_EXPIRED";
5
+ ErrorCode2["INVALID_CREDENTIALS"] = "INVALID_CREDENTIALS";
6
+ ErrorCode2["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
7
+ ErrorCode2["PERMISSION_DENIED"] = "PERMISSION_DENIED";
8
+ ErrorCode2["DISK_FULL"] = "DISK_FULL";
9
+ ErrorCode2["NOT_GIT_REPO"] = "NOT_GIT_REPO";
10
+ ErrorCode2["GIT_COMMAND_FAILED"] = "GIT_COMMAND_FAILED";
11
+ ErrorCode2["INVALID_BRANCH"] = "INVALID_BRANCH";
12
+ ErrorCode2["DB_CONNECTION_FAILED"] = "DB_CONNECTION_FAILED";
13
+ ErrorCode2["DB_QUERY_FAILED"] = "DB_QUERY_FAILED";
14
+ ErrorCode2["DB_CORRUPTION"] = "DB_CORRUPTION";
15
+ ErrorCode2["NETWORK_ERROR"] = "NETWORK_ERROR";
16
+ ErrorCode2["API_ERROR"] = "API_ERROR";
17
+ ErrorCode2["TIMEOUT"] = "TIMEOUT";
18
+ ErrorCode2["INVALID_INPUT"] = "INVALID_INPUT";
19
+ ErrorCode2["VALIDATION_FAILED"] = "VALIDATION_FAILED";
20
+ ErrorCode2["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
21
+ ErrorCode2["OPERATION_FAILED"] = "OPERATION_FAILED";
22
+ ErrorCode2["CONFIGURATION_ERROR"] = "CONFIGURATION_ERROR";
23
+ return ErrorCode2;
24
+ })(ErrorCode || {});
25
+ class StackMemoryError extends Error {
26
+ code;
27
+ context;
28
+ userMessage;
29
+ recoverable;
30
+ constructor(code, message, userMessage, context = {}, recoverable = false, cause) {
31
+ super(message);
32
+ this.name = "StackMemoryError";
33
+ this.code = code;
34
+ this.context = context;
35
+ this.userMessage = userMessage || this.getDefaultUserMessage(code);
36
+ this.recoverable = recoverable;
37
+ if (cause && Error.captureStackTrace) {
38
+ Error.captureStackTrace(this, StackMemoryError);
39
+ }
40
+ logger.error(message, cause, {
41
+ code,
42
+ context,
43
+ recoverable,
44
+ userMessage: this.userMessage
45
+ });
46
+ }
47
+ getDefaultUserMessage(code) {
48
+ switch (code) {
49
+ case "AUTH_FAILED" /* AUTH_FAILED */:
50
+ return "Authentication failed. Please check your credentials and try again.";
51
+ case "NOT_GIT_REPO" /* NOT_GIT_REPO */:
52
+ return "This command requires a git repository. Please run it from within a git repository.";
53
+ case "PERMISSION_DENIED" /* PERMISSION_DENIED */:
54
+ return "Permission denied. Please check file permissions or run with appropriate privileges.";
55
+ case "NETWORK_ERROR" /* NETWORK_ERROR */:
56
+ return "Network error. Please check your internet connection and try again.";
57
+ case "INVALID_INPUT" /* INVALID_INPUT */:
58
+ return "Invalid input provided. Please check your command and try again.";
59
+ case "DB_CONNECTION_FAILED" /* DB_CONNECTION_FAILED */:
60
+ return "Database connection failed. Please try again or contact support if the issue persists.";
61
+ case "GIT_COMMAND_FAILED" /* GIT_COMMAND_FAILED */:
62
+ return "Git operation failed. Please ensure your repository is in a valid state.";
63
+ default:
64
+ return "An unexpected error occurred. Please try again or contact support.";
65
+ }
66
+ }
67
+ static fromNodeError(nodeError, context = {}) {
68
+ const code = nodeError.code;
69
+ switch (code) {
70
+ case "ENOENT":
71
+ return new StackMemoryError(
72
+ "FILE_NOT_FOUND" /* FILE_NOT_FOUND */,
73
+ `File or directory not found: ${nodeError.path}`,
74
+ "The requested file or directory was not found.",
75
+ { ...context, path: nodeError.path },
76
+ false,
77
+ nodeError
78
+ );
79
+ case "EACCES":
80
+ case "EPERM":
81
+ return new StackMemoryError(
82
+ "PERMISSION_DENIED" /* PERMISSION_DENIED */,
83
+ `Permission denied: ${nodeError.path}`,
84
+ "Permission denied. Please check file permissions.",
85
+ { ...context, path: nodeError.path },
86
+ true,
87
+ nodeError
88
+ );
89
+ case "ENOSPC":
90
+ return new StackMemoryError(
91
+ "DISK_FULL" /* DISK_FULL */,
92
+ "No space left on device",
93
+ "Insufficient disk space. Please free up space and try again.",
94
+ context,
95
+ true,
96
+ nodeError
97
+ );
98
+ case "ETIMEDOUT":
99
+ return new StackMemoryError(
100
+ "TIMEOUT" /* TIMEOUT */,
101
+ "Operation timed out",
102
+ "The operation timed out. Please try again.",
103
+ context,
104
+ true,
105
+ nodeError
106
+ );
107
+ default:
108
+ return new StackMemoryError(
109
+ "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
110
+ nodeError.message,
111
+ "An unexpected system error occurred.",
112
+ { ...context, nodeErrorCode: code },
113
+ false,
114
+ nodeError
115
+ );
116
+ }
117
+ }
118
+ }
119
+ class ErrorHandler {
120
+ static retryMap = /* @__PURE__ */ new Map();
121
+ static MAX_RETRIES = 3;
122
+ static handle(error, operation) {
123
+ if (error instanceof StackMemoryError) {
124
+ console.error(`\u274C ${error.userMessage}`);
125
+ if (error.recoverable) {
126
+ console.error("\u{1F4A1} This error may be recoverable. Please try again.");
127
+ }
128
+ process.exit(1);
129
+ }
130
+ if (error instanceof Error) {
131
+ let stackMemoryError;
132
+ if ("code" in error && typeof error.code === "string") {
133
+ stackMemoryError = StackMemoryError.fromNodeError(
134
+ error,
135
+ { operation }
136
+ );
137
+ } else {
138
+ stackMemoryError = new StackMemoryError(
139
+ "OPERATION_FAILED" /* OPERATION_FAILED */,
140
+ `Operation '${operation}' failed: ${error.message}`,
141
+ `Operation failed: ${error.message}`,
142
+ { operation },
143
+ false,
144
+ error
145
+ );
146
+ }
147
+ console.error(`\u274C ${stackMemoryError.userMessage}`);
148
+ if (stackMemoryError.recoverable) {
149
+ console.error("\u{1F4A1} This error may be recoverable. Please try again.");
150
+ }
151
+ process.exit(1);
152
+ }
153
+ const unknownError = new StackMemoryError(
154
+ "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
155
+ `Unknown error in operation '${operation}': ${String(error)}`,
156
+ "An unexpected error occurred.",
157
+ { operation, errorType: typeof error },
158
+ false
159
+ );
160
+ console.error(`\u274C ${unknownError.userMessage}`);
161
+ process.exit(1);
162
+ }
163
+ static async safeExecute(operation, operationName, fallback) {
164
+ try {
165
+ return await operation();
166
+ } catch (error) {
167
+ if (fallback !== void 0) {
168
+ logger.warn(`Operation '${operationName}' failed, using fallback`, {
169
+ error: String(error)
170
+ });
171
+ return fallback;
172
+ }
173
+ ErrorHandler.handle(error, operationName);
174
+ }
175
+ }
176
+ static async withRetry(operation, operationName, maxRetries = ErrorHandler.MAX_RETRIES) {
177
+ let lastError;
178
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
179
+ try {
180
+ const result = await operation();
181
+ ErrorHandler.retryMap.delete(operationName);
182
+ return result;
183
+ } catch (error) {
184
+ lastError = error;
185
+ if (error instanceof StackMemoryError && !error.recoverable) {
186
+ ErrorHandler.handle(error, operationName);
187
+ }
188
+ if (attempt === maxRetries) {
189
+ break;
190
+ }
191
+ const delay = Math.min(1e3 * Math.pow(2, attempt - 1), 5e3);
192
+ logger.warn(
193
+ `Attempt ${attempt}/${maxRetries} failed for '${operationName}', retrying in ${delay}ms`,
194
+ {
195
+ error: String(error)
196
+ }
197
+ );
198
+ await new Promise((resolve) => setTimeout(resolve, delay));
199
+ }
200
+ }
201
+ ErrorHandler.handle(
202
+ lastError,
203
+ `${operationName} (after ${maxRetries} attempts)`
204
+ );
205
+ }
206
+ static createCircuitBreaker(operation, operationName, threshold = 5) {
207
+ let failures = 0;
208
+ let lastFailure = 0;
209
+ const resetTimeout = 3e4;
210
+ return async () => {
211
+ const now = Date.now();
212
+ if (now - lastFailure > resetTimeout) {
213
+ failures = 0;
214
+ }
215
+ if (failures >= threshold) {
216
+ throw new StackMemoryError(
217
+ "OPERATION_FAILED" /* OPERATION_FAILED */,
218
+ `Circuit breaker open for '${operationName}'`,
219
+ `Operation temporarily unavailable. Please try again later.`,
220
+ { operationName, failures, threshold },
221
+ true
222
+ );
223
+ }
224
+ try {
225
+ const result = await operation();
226
+ failures = 0;
227
+ return result;
228
+ } catch (error) {
229
+ failures++;
230
+ lastFailure = now;
231
+ throw error;
232
+ }
233
+ };
234
+ }
235
+ }
236
+ const validateInput = (value, name, validator) => {
237
+ if (!validator(value)) {
238
+ throw new StackMemoryError(
239
+ "INVALID_INPUT" /* INVALID_INPUT */,
240
+ `Invalid ${name}: ${String(value)}`,
241
+ `Please provide a valid ${name}.`,
242
+ { name, value },
243
+ true
244
+ );
245
+ }
246
+ };
247
+ const validateEmail = (email) => {
248
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
249
+ if (!emailRegex.test(email) || email.length > 254) {
250
+ throw new StackMemoryError(
251
+ "INVALID_INPUT" /* INVALID_INPUT */,
252
+ `Invalid email format: ${email}`,
253
+ "Please provide a valid email address.",
254
+ { email },
255
+ true
256
+ );
257
+ }
258
+ };
259
+ const validatePath = (filePath) => {
260
+ if (!filePath || filePath.includes("..") || filePath.includes("\0")) {
261
+ throw new StackMemoryError(
262
+ "INVALID_INPUT" /* INVALID_INPUT */,
263
+ `Invalid path: ${filePath}`,
264
+ "Invalid file path provided.",
265
+ { path: filePath },
266
+ true
267
+ );
268
+ }
269
+ };
270
+ export {
271
+ ErrorCode,
272
+ ErrorHandler,
273
+ StackMemoryError,
274
+ validateEmail,
275
+ validateInput,
276
+ validatePath
277
+ };
278
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/monitoring/error-handler.ts"],
4
+ "sourcesContent": ["/**\n * Comprehensive error handling for StackMemory CLI\n */\n\nimport { logger } from './logger.js';\n\nexport enum ErrorCode {\n // Authentication errors\n AUTH_FAILED = 'AUTH_FAILED',\n TOKEN_EXPIRED = 'TOKEN_EXPIRED',\n INVALID_CREDENTIALS = 'INVALID_CREDENTIALS',\n\n // File system errors\n FILE_NOT_FOUND = 'FILE_NOT_FOUND',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n DISK_FULL = 'DISK_FULL',\n\n // Git operation errors\n NOT_GIT_REPO = 'NOT_GIT_REPO',\n GIT_COMMAND_FAILED = 'GIT_COMMAND_FAILED',\n INVALID_BRANCH = 'INVALID_BRANCH',\n\n // Database errors\n DB_CONNECTION_FAILED = 'DB_CONNECTION_FAILED',\n DB_QUERY_FAILED = 'DB_QUERY_FAILED',\n DB_CORRUPTION = 'DB_CORRUPTION',\n\n // Network errors\n NETWORK_ERROR = 'NETWORK_ERROR',\n API_ERROR = 'API_ERROR',\n TIMEOUT = 'TIMEOUT',\n\n // Validation errors\n INVALID_INPUT = 'INVALID_INPUT',\n VALIDATION_FAILED = 'VALIDATION_FAILED',\n\n // General errors\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n OPERATION_FAILED = 'OPERATION_FAILED',\n CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\n}\n\nexport class StackMemoryError extends Error {\n public readonly code: ErrorCode;\n public readonly context: Record<string, unknown>;\n public readonly userMessage: string;\n public readonly recoverable: boolean;\n\n constructor(\n code: ErrorCode,\n message: string,\n userMessage?: string,\n context: Record<string, unknown> = {},\n recoverable: boolean = false,\n cause?: Error\n ) {\n super(message);\n this.name = 'StackMemoryError';\n this.code = code;\n this.context = context;\n this.userMessage = userMessage || this.getDefaultUserMessage(code);\n this.recoverable = recoverable;\n\n if (cause && Error.captureStackTrace) {\n Error.captureStackTrace(this, StackMemoryError);\n }\n\n // Log the error\n logger.error(message, cause, {\n code,\n context,\n recoverable,\n userMessage: this.userMessage,\n });\n }\n\n private getDefaultUserMessage(code: ErrorCode): string {\n switch (code) {\n case ErrorCode.AUTH_FAILED:\n return 'Authentication failed. Please check your credentials and try again.';\n case ErrorCode.NOT_GIT_REPO:\n return 'This command requires a git repository. Please run it from within a git repository.';\n case ErrorCode.PERMISSION_DENIED:\n return 'Permission denied. Please check file permissions or run with appropriate privileges.';\n case ErrorCode.NETWORK_ERROR:\n return 'Network error. Please check your internet connection and try again.';\n case ErrorCode.INVALID_INPUT:\n return 'Invalid input provided. Please check your command and try again.';\n case ErrorCode.DB_CONNECTION_FAILED:\n return 'Database connection failed. Please try again or contact support if the issue persists.';\n case ErrorCode.GIT_COMMAND_FAILED:\n return 'Git operation failed. Please ensure your repository is in a valid state.';\n default:\n return 'An unexpected error occurred. Please try again or contact support.';\n }\n }\n\n static fromNodeError(\n nodeError: NodeJS.ErrnoException,\n context: Record<string, unknown> = {}\n ): StackMemoryError {\n const code = nodeError.code;\n\n switch (code) {\n case 'ENOENT':\n return new StackMemoryError(\n ErrorCode.FILE_NOT_FOUND,\n `File or directory not found: ${nodeError.path}`,\n 'The requested file or directory was not found.',\n { ...context, path: nodeError.path },\n false,\n nodeError\n );\n\n case 'EACCES':\n case 'EPERM':\n return new StackMemoryError(\n ErrorCode.PERMISSION_DENIED,\n `Permission denied: ${nodeError.path}`,\n 'Permission denied. Please check file permissions.',\n { ...context, path: nodeError.path },\n true,\n nodeError\n );\n\n case 'ENOSPC':\n return new StackMemoryError(\n ErrorCode.DISK_FULL,\n 'No space left on device',\n 'Insufficient disk space. Please free up space and try again.',\n context,\n true,\n nodeError\n );\n\n case 'ETIMEDOUT':\n return new StackMemoryError(\n ErrorCode.TIMEOUT,\n 'Operation timed out',\n 'The operation timed out. Please try again.',\n context,\n true,\n nodeError\n );\n\n default:\n return new StackMemoryError(\n ErrorCode.UNKNOWN_ERROR,\n nodeError.message,\n 'An unexpected system error occurred.',\n { ...context, nodeErrorCode: code },\n false,\n nodeError\n );\n }\n }\n}\n\nexport class ErrorHandler {\n private static retryMap = new Map<string, number>();\n private static readonly MAX_RETRIES = 3;\n\n static handle(error: unknown, operation: string): never {\n if (error instanceof StackMemoryError) {\n // Already a well-formed StackMemory error\n console.error(`\u274C ${error.userMessage}`);\n\n if (error.recoverable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n if (error instanceof Error) {\n // Convert Node.js error to StackMemoryError\n let stackMemoryError: StackMemoryError;\n\n if ('code' in error && typeof error.code === 'string') {\n stackMemoryError = StackMemoryError.fromNodeError(\n error as NodeJS.ErrnoException,\n { operation }\n );\n } else {\n stackMemoryError = new StackMemoryError(\n ErrorCode.OPERATION_FAILED,\n `Operation '${operation}' failed: ${error.message}`,\n `Operation failed: ${error.message}`,\n { operation },\n false,\n error\n );\n }\n\n console.error(`\u274C ${stackMemoryError.userMessage}`);\n if (stackMemoryError.recoverable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n // Unknown error type\n const unknownError = new StackMemoryError(\n ErrorCode.UNKNOWN_ERROR,\n `Unknown error in operation '${operation}': ${String(error)}`,\n 'An unexpected error occurred.',\n { operation, errorType: typeof error },\n false\n );\n\n console.error(`\u274C ${unknownError.userMessage}`);\n process.exit(1);\n }\n\n static async safeExecute<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n fallback?: T\n ): Promise<T | undefined> {\n try {\n return await operation();\n } catch (error) {\n if (fallback !== undefined) {\n logger.warn(`Operation '${operationName}' failed, using fallback`, {\n error: String(error),\n });\n return fallback;\n }\n\n ErrorHandler.handle(error, operationName);\n }\n }\n\n static async withRetry<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n maxRetries: number = ErrorHandler.MAX_RETRIES\n ): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const result = await operation();\n // Clear retry count on success\n ErrorHandler.retryMap.delete(operationName);\n return result;\n } catch (error) {\n lastError = error;\n\n if (error instanceof StackMemoryError && !error.recoverable) {\n // Don't retry non-recoverable errors\n ErrorHandler.handle(error, operationName);\n }\n\n if (attempt === maxRetries) {\n break;\n }\n\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000); // Exponential backoff\n logger.warn(\n `Attempt ${attempt}/${maxRetries} failed for '${operationName}', retrying in ${delay}ms`,\n {\n error: String(error),\n }\n );\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n ErrorHandler.handle(\n lastError,\n `${operationName} (after ${maxRetries} attempts)`\n );\n }\n\n static createCircuitBreaker<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n threshold: number = 5\n ) {\n let failures = 0;\n let lastFailure = 0;\n const resetTimeout = 30000; // 30 seconds\n\n return async (): Promise<T> => {\n const now = Date.now();\n\n // Reset circuit breaker after timeout\n if (now - lastFailure > resetTimeout) {\n failures = 0;\n }\n\n // Circuit is open (too many failures)\n if (failures >= threshold) {\n throw new StackMemoryError(\n ErrorCode.OPERATION_FAILED,\n `Circuit breaker open for '${operationName}'`,\n `Operation temporarily unavailable. Please try again later.`,\n { operationName, failures, threshold },\n true\n );\n }\n\n try {\n const result = await operation();\n failures = 0; // Reset on success\n return result;\n } catch (error) {\n failures++;\n lastFailure = now;\n throw error;\n }\n };\n }\n}\n\n// Utility functions for common error scenarios\nexport const validateInput = (\n value: unknown,\n name: string,\n validator: (val: unknown) => boolean\n): asserts value is NonNullable<unknown> => {\n if (!validator(value)) {\n throw new StackMemoryError(\n ErrorCode.INVALID_INPUT,\n `Invalid ${name}: ${String(value)}`,\n `Please provide a valid ${name}.`,\n { name, value },\n true\n );\n }\n};\n\nexport const validateEmail = (email: string): asserts email is string => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email) || email.length > 254) {\n throw new StackMemoryError(\n ErrorCode.INVALID_INPUT,\n `Invalid email format: ${email}`,\n 'Please provide a valid email address.',\n { email },\n true\n );\n }\n};\n\nexport const validatePath = (filePath: string): asserts filePath is string => {\n if (!filePath || filePath.includes('..') || filePath.includes('\\0')) {\n throw new StackMemoryError(\n ErrorCode.INVALID_INPUT,\n `Invalid path: ${filePath}`,\n 'Invalid file path provided.',\n { path: filePath },\n true\n );\n }\n};\n"],
5
+ "mappings": "AAIA,SAAS,cAAc;AAEhB,IAAK,YAAL,kBAAKA,eAAL;AAEL,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,yBAAsB;AAGtB,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,uBAAoB;AACpB,EAAAA,WAAA,eAAY;AAGZ,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,oBAAiB;AAGjB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,mBAAgB;AAGhB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,aAAU;AAGV,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,uBAAoB;AAGpB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,yBAAsB;AAjCZ,SAAAA;AAAA,GAAA;AAoCL,MAAM,yBAAyB,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YACE,MACA,SACA,aACA,UAAmC,CAAC,GACpC,cAAuB,OACvB,OACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,cAAc,eAAe,KAAK,sBAAsB,IAAI;AACjE,SAAK,cAAc;AAEnB,QAAI,SAAS,MAAM,mBAAmB;AACpC,YAAM,kBAAkB,MAAM,gBAAgB;AAAA,IAChD;AAGA,WAAO,MAAM,SAAS,OAAO;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,sBAAsB,MAAyB;AACrD,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,cACL,WACA,UAAmC,CAAC,GAClB;AAClB,UAAM,OAAO,UAAU;AAEvB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,IAAI;AAAA,UACT;AAAA,UACA,gCAAgC,UAAU,IAAI;AAAA,UAC9C;AAAA,UACA,EAAE,GAAG,SAAS,MAAM,UAAU,KAAK;AAAA,UACnC;AAAA,UACA;AAAA,QACF;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,eAAO,IAAI;AAAA,UACT;AAAA,UACA,sBAAsB,UAAU,IAAI;AAAA,UACpC;AAAA,UACA,EAAE,GAAG,SAAS,MAAM,UAAU,KAAK;AAAA,UACnC;AAAA,UACA;AAAA,QACF;AAAA,MAEF,KAAK;AACH,eAAO,IAAI;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAEF,KAAK;AACH,eAAO,IAAI;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MAEF;AACE,eAAO,IAAI;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,EAAE,GAAG,SAAS,eAAe,KAAK;AAAA,UAClC;AAAA,UACA;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AACF;AAEO,MAAM,aAAa;AAAA,EACxB,OAAe,WAAW,oBAAI,IAAoB;AAAA,EAClD,OAAwB,cAAc;AAAA,EAEtC,OAAO,OAAO,OAAgB,WAA0B;AACtD,QAAI,iBAAiB,kBAAkB;AAErC,cAAQ,MAAM,UAAK,MAAM,WAAW,EAAE;AAEtC,UAAI,MAAM,aAAa;AACrB,gBAAQ,MAAM,4DAAqD;AAAA,MACrE;AAEA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,iBAAiB,OAAO;AAE1B,UAAI;AAEJ,UAAI,UAAU,SAAS,OAAO,MAAM,SAAS,UAAU;AACrD,2BAAmB,iBAAiB;AAAA,UAClC;AAAA,UACA,EAAE,UAAU;AAAA,QACd;AAAA,MACF,OAAO;AACL,2BAAmB,IAAI;AAAA,UACrB;AAAA,UACA,cAAc,SAAS,aAAa,MAAM,OAAO;AAAA,UACjD,qBAAqB,MAAM,OAAO;AAAA,UAClC,EAAE,UAAU;AAAA,UACZ;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,MAAM,UAAK,iBAAiB,WAAW,EAAE;AACjD,UAAI,iBAAiB,aAAa;AAChC,gBAAQ,MAAM,4DAAqD;AAAA,MACrE;AAEA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,eAAe,IAAI;AAAA,MACvB;AAAA,MACA,+BAA+B,SAAS,MAAM,OAAO,KAAK,CAAC;AAAA,MAC3D;AAAA,MACA,EAAE,WAAW,WAAW,OAAO,MAAM;AAAA,MACrC;AAAA,IACF;AAEA,YAAQ,MAAM,UAAK,aAAa,WAAW,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,aAAa,YACX,WACA,eACA,UACwB;AACxB,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,aAAa,QAAW;AAC1B,eAAO,KAAK,cAAc,aAAa,4BAA4B;AAAA,UACjE,OAAO,OAAO,KAAK;AAAA,QACrB,CAAC;AACD,eAAO;AAAA,MACT;AAEA,mBAAa,OAAO,OAAO,aAAa;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,aAAa,UACX,WACA,eACA,aAAqB,aAAa,aACtB;AACZ,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,UAAI;AACF,cAAM,SAAS,MAAM,UAAU;AAE/B,qBAAa,SAAS,OAAO,aAAa;AAC1C,eAAO;AAAA,MACT,SAAS,OAAO;AACd,oBAAY;AAEZ,YAAI,iBAAiB,oBAAoB,CAAC,MAAM,aAAa;AAE3D,uBAAa,OAAO,OAAO,aAAa;AAAA,QAC1C;AAEA,YAAI,YAAY,YAAY;AAC1B;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK,IAAI,MAAO,KAAK,IAAI,GAAG,UAAU,CAAC,GAAG,GAAI;AAC5D,eAAO;AAAA,UACL,WAAW,OAAO,IAAI,UAAU,gBAAgB,aAAa,kBAAkB,KAAK;AAAA,UACpF;AAAA,YACE,OAAO,OAAO,KAAK;AAAA,UACrB;AAAA,QACF;AAEA,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AAAA,MAC3D;AAAA,IACF;AAEA,iBAAa;AAAA,MACX;AAAA,MACA,GAAG,aAAa,WAAW,UAAU;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,OAAO,qBACL,WACA,eACA,YAAoB,GACpB;AACA,QAAI,WAAW;AACf,QAAI,cAAc;AAClB,UAAM,eAAe;AAErB,WAAO,YAAwB;AAC7B,YAAM,MAAM,KAAK,IAAI;AAGrB,UAAI,MAAM,cAAc,cAAc;AACpC,mBAAW;AAAA,MACb;AAGA,UAAI,YAAY,WAAW;AACzB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,6BAA6B,aAAa;AAAA,UAC1C;AAAA,UACA,EAAE,eAAe,UAAU,UAAU;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,UAAU;AAC/B,mBAAW;AACX,eAAO;AAAA,MACT,SAAS,OAAO;AACd;AACA,sBAAc;AACd,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAGO,MAAM,gBAAgB,CAC3B,OACA,MACA,cAC0C;AAC1C,MAAI,CAAC,UAAU,KAAK,GAAG;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,WAAW,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,MACjC,0BAA0B,IAAI;AAAA,MAC9B,EAAE,MAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,gBAAgB,CAAC,UAA2C;AACvE,QAAM,aAAa;AACnB,MAAI,CAAC,WAAW,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,MACA,yBAAyB,KAAK;AAAA,MAC9B;AAAA,MACA,EAAE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,eAAe,CAAC,aAAiD;AAC5E,MAAI,CAAC,YAAY,SAAS,SAAS,IAAI,KAAK,SAAS,SAAS,IAAI,GAAG;AACnE,UAAM,IAAI;AAAA,MACR;AAAA,MACA,iBAAiB,QAAQ;AAAA,MACzB;AAAA,MACA,EAAE,MAAM,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": ["ErrorCode"]
7
+ }
@@ -0,0 +1,115 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
4
+ LogLevel2[LogLevel2["ERROR"] = 0] = "ERROR";
5
+ LogLevel2[LogLevel2["WARN"] = 1] = "WARN";
6
+ LogLevel2[LogLevel2["INFO"] = 2] = "INFO";
7
+ LogLevel2[LogLevel2["DEBUG"] = 3] = "DEBUG";
8
+ return LogLevel2;
9
+ })(LogLevel || {});
10
+ class Logger {
11
+ static instance;
12
+ logLevel = 2 /* INFO */;
13
+ logFile;
14
+ constructor() {
15
+ const envLevel = process.env.STACKMEMORY_LOG_LEVEL?.toUpperCase();
16
+ switch (envLevel) {
17
+ case "ERROR":
18
+ this.logLevel = 0 /* ERROR */;
19
+ break;
20
+ case "WARN":
21
+ this.logLevel = 1 /* WARN */;
22
+ break;
23
+ case "DEBUG":
24
+ this.logLevel = 3 /* DEBUG */;
25
+ break;
26
+ default:
27
+ this.logLevel = 2 /* INFO */;
28
+ }
29
+ if (this.logLevel === 3 /* DEBUG */ || process.env.STACKMEMORY_LOG_FILE) {
30
+ this.logFile = process.env.STACKMEMORY_LOG_FILE || path.join(process.env.HOME || ".", ".stackmemory", "logs", "cli.log");
31
+ this.ensureLogDirectory();
32
+ }
33
+ }
34
+ static getInstance() {
35
+ if (!Logger.instance) {
36
+ Logger.instance = new Logger();
37
+ }
38
+ return Logger.instance;
39
+ }
40
+ ensureLogDirectory() {
41
+ if (this.logFile) {
42
+ const logDir = path.dirname(this.logFile);
43
+ if (!fs.existsSync(logDir)) {
44
+ fs.mkdirSync(logDir, { recursive: true });
45
+ }
46
+ }
47
+ }
48
+ writeLog(entry) {
49
+ const logLine = JSON.stringify(entry) + "\n";
50
+ if (this.logFile) {
51
+ try {
52
+ fs.appendFileSync(this.logFile, logLine);
53
+ } catch {
54
+ }
55
+ }
56
+ if (entry.level <= this.logLevel) {
57
+ const levelNames = ["ERROR", "WARN", "INFO", "DEBUG"];
58
+ const levelName = levelNames[entry.level] || "UNKNOWN";
59
+ const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;
60
+ if (entry.level === 0 /* ERROR */) {
61
+ console.error(consoleMessage);
62
+ if (entry.error) {
63
+ console.error(entry.error.stack);
64
+ }
65
+ } else if (entry.level === 1 /* WARN */) {
66
+ console.warn(consoleMessage);
67
+ } else {
68
+ console.log(consoleMessage);
69
+ }
70
+ }
71
+ }
72
+ error(message, errorOrContext, context) {
73
+ const isError = errorOrContext instanceof Error;
74
+ this.writeLog({
75
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
76
+ level: 0 /* ERROR */,
77
+ message,
78
+ context: isError ? context : errorOrContext,
79
+ error: isError ? errorOrContext : void 0
80
+ });
81
+ }
82
+ warn(message, errorOrContext) {
83
+ const isError = errorOrContext instanceof Error;
84
+ this.writeLog({
85
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
86
+ level: 1 /* WARN */,
87
+ message,
88
+ context: isError ? void 0 : errorOrContext,
89
+ error: isError ? errorOrContext : void 0
90
+ });
91
+ }
92
+ info(message, context) {
93
+ this.writeLog({
94
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
95
+ level: 2 /* INFO */,
96
+ message,
97
+ context
98
+ });
99
+ }
100
+ debug(message, context) {
101
+ this.writeLog({
102
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
103
+ level: 3 /* DEBUG */,
104
+ message,
105
+ context
106
+ });
107
+ }
108
+ }
109
+ const logger = Logger.getInstance();
110
+ export {
111
+ LogLevel,
112
+ Logger,
113
+ logger
114
+ };
115
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/monitoring/logger.ts"],
4
+ "sourcesContent": ["/**\n * Structured logging utility for StackMemory CLI\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\n\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: Error;\n}\n\nexport class Logger {\n private static instance: Logger;\n private logLevel: LogLevel = LogLevel.INFO;\n private logFile?: string;\n\n private constructor() {\n // Set log level from environment\n const envLevel = process.env.STACKMEMORY_LOG_LEVEL?.toUpperCase();\n switch (envLevel) {\n case 'ERROR':\n this.logLevel = LogLevel.ERROR;\n break;\n case 'WARN':\n this.logLevel = LogLevel.WARN;\n break;\n case 'DEBUG':\n this.logLevel = LogLevel.DEBUG;\n break;\n default:\n this.logLevel = LogLevel.INFO;\n }\n\n // Set up log file if in debug mode or if specified\n if (this.logLevel === LogLevel.DEBUG || process.env.STACKMEMORY_LOG_FILE) {\n this.logFile =\n process.env.STACKMEMORY_LOG_FILE ||\n path.join(process.env.HOME || '.', '.stackmemory', 'logs', 'cli.log');\n this.ensureLogDirectory();\n }\n }\n\n static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n private ensureLogDirectory(): void {\n if (this.logFile) {\n const logDir = path.dirname(this.logFile);\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n }\n\n private writeLog(entry: LogEntry): void {\n const logLine = JSON.stringify(entry) + '\\n';\n\n // Always write to file if configured\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, logLine);\n } catch {\n // Silent failure to prevent recursive logging\n }\n }\n\n // Console output based on level\n if (entry.level <= this.logLevel) {\n const levelNames = ['ERROR', 'WARN', 'INFO', 'DEBUG'];\n const levelName = levelNames[entry.level] || 'UNKNOWN';\n\n const consoleMessage = `[${entry.timestamp}] ${levelName}: ${entry.message}`;\n\n if (entry.level === LogLevel.ERROR) {\n console.error(consoleMessage);\n if (entry.error) {\n console.error(entry.error.stack);\n }\n } else if (entry.level === LogLevel.WARN) {\n console.warn(consoleMessage);\n } else {\n console.log(consoleMessage);\n }\n }\n }\n\n error(\n message: string,\n errorOrContext?: Error | Record<string, unknown>,\n context?: Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.ERROR,\n message,\n context: isError ? context : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n warn(\n message: string,\n errorOrContext?: Error | Record<string, unknown>\n ): void {\n const isError = errorOrContext instanceof Error;\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.WARN,\n message,\n context: isError\n ? undefined\n : (errorOrContext as Record<string, unknown>),\n error: isError ? errorOrContext : undefined,\n });\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.INFO,\n message,\n context,\n });\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.writeLog({\n timestamp: new Date().toISOString(),\n level: LogLevel.DEBUG,\n message,\n context,\n });\n }\n}\n\n// Export singleton instance\nexport const logger = Logger.getInstance();\n"],
5
+ "mappings": "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",
6
+ "names": ["LogLevel"]
7
+ }
@@ -0,0 +1,157 @@
1
+ import { EventEmitter } from "events";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import { logger } from "./logger.js";
5
+ class MetricsCollector extends EventEmitter {
6
+ metrics = [];
7
+ metricsFile;
8
+ flushInterval = null;
9
+ aggregates = /* @__PURE__ */ new Map();
10
+ constructor() {
11
+ super();
12
+ if (process.env.STACKMEMORY_METRICS_ENABLED === "true") {
13
+ const metricsDir = path.join(
14
+ process.env.HOME || ".",
15
+ ".stackmemory",
16
+ "metrics"
17
+ );
18
+ if (!fs.existsSync(metricsDir)) {
19
+ fs.mkdirSync(metricsDir, { recursive: true });
20
+ }
21
+ this.metricsFile = path.join(
22
+ metricsDir,
23
+ `metrics-${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}.jsonl`
24
+ );
25
+ this.flushInterval = setInterval(() => this.flush(), 3e4);
26
+ }
27
+ }
28
+ async record(metric, value, tags) {
29
+ const entry = {
30
+ timestamp: /* @__PURE__ */ new Date(),
31
+ metric,
32
+ value,
33
+ type: "gauge",
34
+ tags
35
+ };
36
+ this.metrics.push(entry);
37
+ this.updateAggregates(metric, value);
38
+ this.emit("metric", entry);
39
+ if (this.metrics.length > 1e3) {
40
+ await this.flush();
41
+ }
42
+ }
43
+ async increment(metric, tags, value = 1) {
44
+ const entry = {
45
+ timestamp: /* @__PURE__ */ new Date(),
46
+ metric,
47
+ value,
48
+ type: "counter",
49
+ tags
50
+ };
51
+ this.metrics.push(entry);
52
+ this.updateAggregates(metric, value);
53
+ this.emit("metric", entry);
54
+ }
55
+ async timing(metric, duration, tags) {
56
+ const entry = {
57
+ timestamp: /* @__PURE__ */ new Date(),
58
+ metric,
59
+ value: duration,
60
+ type: "timing",
61
+ tags
62
+ };
63
+ this.metrics.push(entry);
64
+ this.updateAggregates(metric, duration);
65
+ this.emit("metric", entry);
66
+ }
67
+ updateAggregates(metric, value) {
68
+ const existing = this.aggregates.get(metric) || {
69
+ sum: 0,
70
+ count: 0,
71
+ min: Infinity,
72
+ max: -Infinity
73
+ };
74
+ this.aggregates.set(metric, {
75
+ sum: existing.sum + value,
76
+ count: existing.count + 1,
77
+ min: Math.min(existing.min, value),
78
+ max: Math.max(existing.max, value)
79
+ });
80
+ }
81
+ async flush() {
82
+ if (this.metrics.length === 0) return;
83
+ const toFlush = [...this.metrics];
84
+ this.metrics = [];
85
+ if (this.metricsFile) {
86
+ try {
87
+ const lines = toFlush.map((m) => JSON.stringify(m)).join("\n") + "\n";
88
+ await fs.promises.appendFile(this.metricsFile, lines);
89
+ } catch (error) {
90
+ logger.error(
91
+ "Failed to write metrics",
92
+ error instanceof Error ? error : new Error(String(error))
93
+ );
94
+ }
95
+ }
96
+ this.emit("flush", toFlush);
97
+ }
98
+ getStats(metric) {
99
+ if (metric) {
100
+ const stats = this.aggregates.get(metric);
101
+ if (!stats) return {};
102
+ return {
103
+ [metric]: {
104
+ ...stats,
105
+ avg: stats.count > 0 ? stats.sum / stats.count : 0
106
+ }
107
+ };
108
+ }
109
+ const result = {};
110
+ for (const [key, stats] of this.aggregates.entries()) {
111
+ result[key] = {
112
+ ...stats,
113
+ avg: stats.count > 0 ? stats.sum / stats.count : 0
114
+ };
115
+ }
116
+ return result;
117
+ }
118
+ reset() {
119
+ this.metrics = [];
120
+ this.aggregates.clear();
121
+ }
122
+ destroy() {
123
+ if (this.flushInterval) {
124
+ clearInterval(this.flushInterval);
125
+ this.flushInterval = null;
126
+ }
127
+ this.flush();
128
+ }
129
+ }
130
+ const collector = new MetricsCollector();
131
+ process.on("beforeExit", () => collector.destroy());
132
+ class Metrics {
133
+ static async record(metric, value, tags) {
134
+ await collector.record(metric, value, tags);
135
+ }
136
+ static async increment(metric, tags) {
137
+ await collector.increment(metric, tags);
138
+ }
139
+ static async timing(metric, duration, tags) {
140
+ await collector.timing(metric, duration, tags);
141
+ }
142
+ static getStats(metric) {
143
+ return collector.getStats(metric);
144
+ }
145
+ static reset() {
146
+ collector.reset();
147
+ }
148
+ static on(event, listener) {
149
+ collector.on(event, listener);
150
+ }
151
+ }
152
+ const metrics = Metrics;
153
+ export {
154
+ Metrics,
155
+ metrics
156
+ };
157
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/monitoring/metrics.ts"],
4
+ "sourcesContent": ["import { EventEmitter } from 'events';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { logger } from './logger.js';\n\ninterface MetricEntry {\n timestamp: Date;\n metric: string;\n value: number;\n type: 'counter' | 'gauge' | 'timing';\n tags?: Record<string, string>;\n}\n\nclass MetricsCollector extends EventEmitter {\n private metrics: MetricEntry[] = [];\n private metricsFile?: string;\n private flushInterval: NodeJS.Timeout | null = null;\n private aggregates: Map<\n string,\n { sum: number; count: number; min: number; max: number }\n > = new Map();\n\n constructor() {\n super();\n\n // Set up metrics file if enabled\n if (process.env.STACKMEMORY_METRICS_ENABLED === 'true') {\n const metricsDir = path.join(\n process.env.HOME || '.',\n '.stackmemory',\n 'metrics'\n );\n if (!fs.existsSync(metricsDir)) {\n fs.mkdirSync(metricsDir, { recursive: true });\n }\n this.metricsFile = path.join(\n metricsDir,\n `metrics-${new Date().toISOString().split('T')[0]}.jsonl`\n );\n\n // Flush metrics every 30 seconds\n this.flushInterval = setInterval(() => this.flush(), 30000);\n }\n }\n\n async record(\n metric: string,\n value: number,\n tags?: Record<string, string>\n ): Promise<void> {\n const entry: MetricEntry = {\n timestamp: new Date(),\n metric,\n value,\n type: 'gauge',\n tags,\n };\n\n this.metrics.push(entry);\n this.updateAggregates(metric, value);\n this.emit('metric', entry);\n\n // Auto-flush if buffer is large\n if (this.metrics.length > 1000) {\n await this.flush();\n }\n }\n\n async increment(\n metric: string,\n tags?: Record<string, string>,\n value = 1\n ): Promise<void> {\n const entry: MetricEntry = {\n timestamp: new Date(),\n metric,\n value,\n type: 'counter',\n tags,\n };\n\n this.metrics.push(entry);\n this.updateAggregates(metric, value);\n this.emit('metric', entry);\n }\n\n async timing(\n metric: string,\n duration: number,\n tags?: Record<string, string>\n ): Promise<void> {\n const entry: MetricEntry = {\n timestamp: new Date(),\n metric,\n value: duration,\n type: 'timing',\n tags,\n };\n\n this.metrics.push(entry);\n this.updateAggregates(metric, duration);\n this.emit('metric', entry);\n }\n\n private updateAggregates(metric: string, value: number): void {\n const existing = this.aggregates.get(metric) || {\n sum: 0,\n count: 0,\n min: Infinity,\n max: -Infinity,\n };\n\n this.aggregates.set(metric, {\n sum: existing.sum + value,\n count: existing.count + 1,\n min: Math.min(existing.min, value),\n max: Math.max(existing.max, value),\n });\n }\n\n async flush(): Promise<void> {\n if (this.metrics.length === 0) return;\n\n const toFlush = [...this.metrics];\n this.metrics = [];\n\n if (this.metricsFile) {\n try {\n const lines = toFlush.map((m) => JSON.stringify(m)).join('\\n') + '\\n';\n await fs.promises.appendFile(this.metricsFile, lines);\n } catch (error) {\n logger.error(\n 'Failed to write metrics',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n // Emit batch event for external processors\n this.emit('flush', toFlush);\n }\n\n getStats(metric?: string): Record<string, any> {\n if (metric) {\n const stats = this.aggregates.get(metric);\n if (!stats) return {};\n\n return {\n [metric]: {\n ...stats,\n avg: stats.count > 0 ? stats.sum / stats.count : 0,\n },\n };\n }\n\n const result: Record<string, any> = {};\n for (const [key, stats] of this.aggregates.entries()) {\n result[key] = {\n ...stats,\n avg: stats.count > 0 ? stats.sum / stats.count : 0,\n };\n }\n return result;\n }\n\n reset(): void {\n this.metrics = [];\n this.aggregates.clear();\n }\n\n destroy(): void {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n this.flushInterval = null;\n }\n this.flush();\n }\n}\n\n// Singleton instance\nconst collector = new MetricsCollector();\n\n// Cleanup on exit\nprocess.on('beforeExit', () => collector.destroy());\n\nexport class Metrics {\n static async record(\n metric: string,\n value: number,\n tags?: Record<string, string>\n ): Promise<void> {\n await collector.record(metric, value, tags);\n }\n\n static async increment(\n metric: string,\n tags?: Record<string, string>\n ): Promise<void> {\n await collector.increment(metric, tags);\n }\n\n static async timing(\n metric: string,\n duration: number,\n tags?: Record<string, string>\n ): Promise<void> {\n await collector.timing(metric, duration, tags);\n }\n\n static getStats(metric?: string): Record<string, any> {\n return collector.getStats(metric);\n }\n\n static reset(): void {\n collector.reset();\n }\n\n static on(event: string, listener: (...args: any[]) => void): void {\n collector.on(event, listener);\n }\n}\n\nexport const metrics = Metrics;\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,cAAc;AAUvB,MAAM,yBAAyB,aAAa;AAAA,EAClC,UAAyB,CAAC;AAAA,EAC1B;AAAA,EACA,gBAAuC;AAAA,EACvC,aAGJ,oBAAI,IAAI;AAAA,EAEZ,cAAc;AACZ,UAAM;AAGN,QAAI,QAAQ,IAAI,gCAAgC,QAAQ;AACtD,YAAM,aAAa,KAAK;AAAA,QACtB,QAAQ,IAAI,QAAQ;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC9B,WAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9C;AACA,WAAK,cAAc,KAAK;AAAA,QACtB;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MACnD;AAGA,WAAK,gBAAgB,YAAY,MAAM,KAAK,MAAM,GAAG,GAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,QACA,OACA,MACe;AACf,UAAM,QAAqB;AAAA,MACzB,WAAW,oBAAI,KAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAEA,SAAK,QAAQ,KAAK,KAAK;AACvB,SAAK,iBAAiB,QAAQ,KAAK;AACnC,SAAK,KAAK,UAAU,KAAK;AAGzB,QAAI,KAAK,QAAQ,SAAS,KAAM;AAC9B,YAAM,KAAK,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,UACJ,QACA,MACA,QAAQ,GACO;AACf,UAAM,QAAqB;AAAA,MACzB,WAAW,oBAAI,KAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAEA,SAAK,QAAQ,KAAK,KAAK;AACvB,SAAK,iBAAiB,QAAQ,KAAK;AACnC,SAAK,KAAK,UAAU,KAAK;AAAA,EAC3B;AAAA,EAEA,MAAM,OACJ,QACA,UACA,MACe;AACf,UAAM,QAAqB;AAAA,MACzB,WAAW,oBAAI,KAAK;AAAA,MACpB;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA,MACN;AAAA,IACF;AAEA,SAAK,QAAQ,KAAK,KAAK;AACvB,SAAK,iBAAiB,QAAQ,QAAQ;AACtC,SAAK,KAAK,UAAU,KAAK;AAAA,EAC3B;AAAA,EAEQ,iBAAiB,QAAgB,OAAqB;AAC5D,UAAM,WAAW,KAAK,WAAW,IAAI,MAAM,KAAK;AAAA,MAC9C,KAAK;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,SAAK,WAAW,IAAI,QAAQ;AAAA,MAC1B,KAAK,SAAS,MAAM;AAAA,MACpB,OAAO,SAAS,QAAQ;AAAA,MACxB,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK;AAAA,MACjC,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAQ,WAAW,EAAG;AAE/B,UAAM,UAAU,CAAC,GAAG,KAAK,OAAO;AAChC,SAAK,UAAU,CAAC;AAEhB,QAAI,KAAK,aAAa;AACpB,UAAI;AACF,cAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AACjE,cAAM,GAAG,SAAS,WAAW,KAAK,aAAa,KAAK;AAAA,MACtD,SAAS,OAAO;AACd,eAAO;AAAA,UACL;AAAA,UACA,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAGA,SAAK,KAAK,SAAS,OAAO;AAAA,EAC5B;AAAA,EAEA,SAAS,QAAsC;AAC7C,QAAI,QAAQ;AACV,YAAM,QAAQ,KAAK,WAAW,IAAI,MAAM;AACxC,UAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,aAAO;AAAA,QACL,CAAC,MAAM,GAAG;AAAA,UACR,GAAG;AAAA,UACH,KAAK,MAAM,QAAQ,IAAI,MAAM,MAAM,MAAM,QAAQ;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAA8B,CAAC;AACrC,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,WAAW,QAAQ,GAAG;AACpD,aAAO,GAAG,IAAI;AAAA,QACZ,GAAG;AAAA,QACH,KAAK,MAAM,QAAQ,IAAI,MAAM,MAAM,MAAM,QAAQ;AAAA,MACnD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,CAAC;AAChB,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,eAAe;AACtB,oBAAc,KAAK,aAAa;AAChC,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,MAAM;AAAA,EACb;AACF;AAGA,MAAM,YAAY,IAAI,iBAAiB;AAGvC,QAAQ,GAAG,cAAc,MAAM,UAAU,QAAQ,CAAC;AAE3C,MAAM,QAAQ;AAAA,EACnB,aAAa,OACX,QACA,OACA,MACe;AACf,UAAM,UAAU,OAAO,QAAQ,OAAO,IAAI;AAAA,EAC5C;AAAA,EAEA,aAAa,UACX,QACA,MACe;AACf,UAAM,UAAU,UAAU,QAAQ,IAAI;AAAA,EACxC;AAAA,EAEA,aAAa,OACX,QACA,UACA,MACe;AACf,UAAM,UAAU,OAAO,QAAQ,UAAU,IAAI;AAAA,EAC/C;AAAA,EAEA,OAAO,SAAS,QAAsC;AACpD,WAAO,UAAU,SAAS,MAAM;AAAA,EAClC;AAAA,EAEA,OAAO,QAAc;AACnB,cAAU,MAAM;AAAA,EAClB;AAAA,EAEA,OAAO,GAAG,OAAe,UAA0C;AACjE,cAAU,GAAG,OAAO,QAAQ;AAAA,EAC9B;AACF;AAEO,MAAM,UAAU;",
6
+ "names": []
7
+ }