@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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/digest/types.ts"],
4
+ "sourcesContent": ["/**\n * Types for Hybrid Digest Generation System\n * 80% deterministic extraction, 20% AI-generated review/insights\n */\n\nimport { Frame, Anchor, Event } from '../context/frame-manager.js';\n\n/**\n * Deterministic fields extracted directly from frame data (60%)\n */\nexport interface DeterministicDigest {\n /** Files that were modified during this frame */\n filesModified: FileModification[];\n /** Tests that were run */\n testsRun: TestResult[];\n /** Errors encountered */\n errorsEncountered: ErrorInfo[];\n /** Number of tool calls made */\n toolCallCount: number;\n /** Tool calls by type */\n toolCallsByType: Record<string, number>;\n /** Frame duration in seconds */\n durationSeconds: number;\n /** Exit status */\n exitStatus: 'success' | 'failure' | 'partial' | 'cancelled';\n /** Anchors by type */\n anchorCounts: Record<string, number>;\n /** Key decisions made (extracted from DECISION anchors) */\n decisions: string[];\n /** Constraints established (extracted from CONSTRAINT anchors) */\n constraints: string[];\n /** Risks identified (extracted from RISK anchors) */\n risks: string[];\n}\n\nexport interface FileModification {\n path: string;\n operation: 'create' | 'modify' | 'delete' | 'read';\n linesChanged?: number;\n}\n\nexport interface TestResult {\n name: string;\n status: 'passed' | 'failed' | 'skipped';\n duration?: number;\n}\n\nexport interface ErrorInfo {\n type: string;\n message: string;\n resolved: boolean;\n count: number;\n}\n\n/**\n * AI-generated review fields (20%)\n * Focused on high-value insights only\n */\nexport interface AIGeneratedDigest {\n /** One-line summary of what was accomplished */\n summary: string;\n /** Key insight or learning (if any) */\n insight?: string;\n /** Potential issue or risk spotted */\n flaggedIssue?: string;\n /** Generated at timestamp */\n generatedAt: number;\n /** Model used for generation */\n modelUsed?: string;\n /** Tokens used */\n tokensUsed?: number;\n}\n\n/**\n * Complete hybrid digest combining both approaches\n */\nexport interface HybridDigest {\n /** Frame identifier */\n frameId: string;\n /** Frame name/goal */\n frameName: string;\n /** Frame type */\n frameType: string;\n /** Deterministic fields (always available) */\n deterministic: DeterministicDigest;\n /** AI-generated fields (may be pending) */\n aiGenerated?: AIGeneratedDigest;\n /** Processing status */\n status: DigestStatus;\n /** Human-readable text representation */\n text: string;\n /** Version for schema evolution */\n version: number;\n /** Created timestamp */\n createdAt: number;\n /** Last updated timestamp */\n updatedAt: number;\n}\n\nexport type DigestStatus =\n | 'deterministic_only' // Only deterministic fields populated\n | 'ai_pending' // Queued for AI generation\n | 'ai_processing' // Currently being processed by AI\n | 'complete' // Both deterministic and AI fields populated\n | 'ai_failed'; // AI generation failed, falling back to deterministic\n\n/**\n * Digest generation request for the queue\n */\nexport interface DigestGenerationRequest {\n frameId: string;\n frameName: string;\n frameType: string;\n priority: 'low' | 'normal' | 'high';\n createdAt: number;\n retryCount: number;\n maxRetries: number;\n}\n\n/**\n * Configuration for the digest generator\n */\nexport interface DigestConfig {\n /** Enable AI generation (can be disabled for deterministic-only mode) */\n enableAIGeneration: boolean;\n /** Maximum tokens for AI summary */\n maxTokens: number;\n /** Batch size for idle processing */\n batchSize: number;\n /** Idle threshold in ms before processing queue */\n idleThresholdMs: number;\n /** Maximum retries for failed AI generation */\n maxRetries: number;\n /** Retry delay in ms */\n retryDelayMs: number;\n /** LLM provider configuration */\n llmConfig: {\n provider: 'anthropic' | 'openai' | 'local' | 'none';\n model: string;\n temperature: number;\n };\n}\n\nexport const DEFAULT_DIGEST_CONFIG: DigestConfig = {\n enableAIGeneration: true,\n maxTokens: 100, // Reduced for 20% AI contribution\n batchSize: 10, // Process more at once since smaller\n idleThresholdMs: 3000, // 3 seconds of idle time\n maxRetries: 2,\n retryDelayMs: 1000,\n llmConfig: {\n provider: 'anthropic',\n model: 'claude-3-haiku-20240307',\n temperature: 0.2, // Lower for more consistent output\n },\n};\n\n/**\n * Input for digest generation\n */\nexport interface DigestInput {\n frame: Frame;\n anchors: Anchor[];\n events: Event[];\n parentDigest?: HybridDigest;\n}\n\n/**\n * LLM provider interface for AI digest generation\n */\nexport interface DigestLLMProvider {\n generateSummary(\n input: DigestInput,\n deterministic: DeterministicDigest,\n maxTokens: number\n ): Promise<AIGeneratedDigest>;\n}\n\n/**\n * Digest queue statistics\n */\nexport interface DigestQueueStats {\n pending: number;\n processing: number;\n completed: number;\n failed: number;\n avgProcessingTimeMs: number;\n}\n"],
5
+ "mappings": "AA+IO,MAAM,wBAAsC;AAAA,EACjD,oBAAoB;AAAA,EACpB,WAAW;AAAA;AAAA,EACX,WAAW;AAAA;AAAA,EACX,iBAAiB;AAAA;AAAA,EACjB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa;AAAA;AAAA,EACf;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,270 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import {
3
+ StackMemoryError,
4
+ DatabaseError,
5
+ FrameError,
6
+ ValidationError,
7
+ ErrorCode,
8
+ isRetryableError,
9
+ getErrorMessage,
10
+ wrapError
11
+ } from "../index.js";
12
+ import {
13
+ retry,
14
+ CircuitBreaker,
15
+ withFallback,
16
+ calculateBackoff,
17
+ CircuitState,
18
+ withTimeout,
19
+ gracefulDegrade
20
+ } from "../recovery.js";
21
+ describe("Error Classes", () => {
22
+ describe("StackMemoryError", () => {
23
+ it("should create error with all properties", () => {
24
+ const error = new StackMemoryError({
25
+ code: ErrorCode.INTERNAL_ERROR,
26
+ message: "Test error",
27
+ context: { key: "value" },
28
+ isRetryable: true,
29
+ httpStatus: 500
30
+ });
31
+ expect(error.code).toBe(ErrorCode.INTERNAL_ERROR);
32
+ expect(error.message).toBe("Test error");
33
+ expect(error.context).toEqual({ key: "value" });
34
+ expect(error.isRetryable).toBe(true);
35
+ expect(error.httpStatus).toBe(500);
36
+ expect(error.timestamp).toBeInstanceOf(Date);
37
+ });
38
+ it("should serialize to JSON correctly", () => {
39
+ const error = new StackMemoryError({
40
+ code: ErrorCode.DB_CONNECTION_FAILED,
41
+ message: "Connection failed"
42
+ });
43
+ const json = error.toJSON();
44
+ expect(json.code).toBe(ErrorCode.DB_CONNECTION_FAILED);
45
+ expect(json.message).toBe("Connection failed");
46
+ expect(json.timestamp).toBeDefined();
47
+ });
48
+ });
49
+ describe("DatabaseError", () => {
50
+ it("should be retryable for connection failures", () => {
51
+ const error = new DatabaseError(
52
+ "Connection lost",
53
+ ErrorCode.DB_CONNECTION_FAILED
54
+ );
55
+ expect(error.isRetryable).toBe(true);
56
+ });
57
+ it("should not be retryable for query failures", () => {
58
+ const error = new DatabaseError(
59
+ "Invalid SQL",
60
+ ErrorCode.DB_QUERY_FAILED
61
+ );
62
+ expect(error.isRetryable).toBe(false);
63
+ });
64
+ });
65
+ describe("Error Helpers", () => {
66
+ it("should identify retryable errors", () => {
67
+ const retryable = new DatabaseError(
68
+ "Connection lost",
69
+ ErrorCode.DB_CONNECTION_FAILED
70
+ );
71
+ const nonRetryable = new ValidationError("Invalid input");
72
+ expect(isRetryableError(retryable)).toBe(true);
73
+ expect(isRetryableError(nonRetryable)).toBe(false);
74
+ });
75
+ it("should identify retryable network errors", () => {
76
+ const networkError = new Error("ECONNREFUSED");
77
+ const timeoutError = new Error("Request timeout");
78
+ expect(isRetryableError(networkError)).toBe(true);
79
+ expect(isRetryableError(timeoutError)).toBe(true);
80
+ });
81
+ it("should extract error messages safely", () => {
82
+ expect(getErrorMessage(new Error("Test"))).toBe("Test");
83
+ expect(getErrorMessage("String error")).toBe("String error");
84
+ expect(getErrorMessage({ message: "Object error" })).toBe("Object error");
85
+ expect(getErrorMessage(null)).toBe("An unknown error occurred");
86
+ expect(getErrorMessage(void 0)).toBe("An unknown error occurred");
87
+ });
88
+ it("should wrap errors correctly", () => {
89
+ const originalError = new Error("Original");
90
+ const wrapped = wrapError(
91
+ originalError,
92
+ "Wrapped message",
93
+ ErrorCode.INTERNAL_ERROR,
94
+ { extra: "context" }
95
+ );
96
+ expect(wrapped).toBeInstanceOf(StackMemoryError);
97
+ expect(wrapped.cause).toBe(originalError);
98
+ expect(wrapped.context).toEqual({ extra: "context" });
99
+ });
100
+ it("should not double-wrap StackMemoryErrors", () => {
101
+ const stackError = new FrameError("Frame error");
102
+ const wrapped = wrapError(stackError, "Default");
103
+ expect(wrapped).toBe(stackError);
104
+ });
105
+ });
106
+ });
107
+ describe("Recovery Utilities", () => {
108
+ beforeEach(() => {
109
+ vi.clearAllMocks();
110
+ });
111
+ describe("Retry Logic", () => {
112
+ it("should retry on failure", async () => {
113
+ let attempts = 0;
114
+ const fn = vi.fn(async () => {
115
+ attempts++;
116
+ if (attempts < 3) {
117
+ throw new DatabaseError("Connection lost", ErrorCode.DB_CONNECTION_FAILED);
118
+ }
119
+ return "success";
120
+ });
121
+ const result = await retry(fn, {
122
+ maxAttempts: 3,
123
+ initialDelay: 10
124
+ });
125
+ expect(result).toBe("success");
126
+ expect(fn).toHaveBeenCalledTimes(3);
127
+ });
128
+ it("should not retry non-retryable errors", async () => {
129
+ const fn = vi.fn(async () => {
130
+ throw new ValidationError("Invalid data");
131
+ });
132
+ await expect(
133
+ retry(fn, { maxAttempts: 3 })
134
+ ).rejects.toThrow("Invalid data");
135
+ expect(fn).toHaveBeenCalledTimes(1);
136
+ });
137
+ it("should respect timeout", async () => {
138
+ const fn = vi.fn(async () => {
139
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
140
+ return "slow";
141
+ });
142
+ await expect(
143
+ retry(fn, { timeout: 50 })
144
+ ).rejects.toThrow("Operation timed out");
145
+ });
146
+ it("should calculate backoff correctly", () => {
147
+ const delay1 = calculateBackoff(1, 100, 1e4, 2);
148
+ const delay2 = calculateBackoff(2, 100, 1e4, 2);
149
+ const delay3 = calculateBackoff(3, 100, 1e4, 2);
150
+ expect(delay1).toBeGreaterThanOrEqual(100);
151
+ expect(delay1).toBeLessThanOrEqual(125);
152
+ expect(delay2).toBeGreaterThanOrEqual(200);
153
+ expect(delay2).toBeLessThanOrEqual(250);
154
+ expect(delay3).toBeGreaterThanOrEqual(400);
155
+ expect(delay3).toBeLessThanOrEqual(500);
156
+ });
157
+ });
158
+ describe("Circuit Breaker", () => {
159
+ it("should open after threshold failures", async () => {
160
+ const breaker = new CircuitBreaker("test", {
161
+ failureThreshold: 2,
162
+ resetTimeout: 100
163
+ });
164
+ const failingFn = vi.fn(async () => {
165
+ throw new Error("Failed");
166
+ });
167
+ await expect(breaker.execute(failingFn)).rejects.toThrow("Failed");
168
+ await expect(breaker.execute(failingFn)).rejects.toThrow("Failed");
169
+ expect(breaker.getState()).toBe(CircuitState.OPEN);
170
+ await expect(breaker.execute(failingFn)).rejects.toThrow(
171
+ "Circuit breaker test is OPEN"
172
+ );
173
+ expect(failingFn).toHaveBeenCalledTimes(2);
174
+ });
175
+ it("should transition to half-open after timeout", async () => {
176
+ const breaker = new CircuitBreaker("test", {
177
+ failureThreshold: 1,
178
+ resetTimeout: 50,
179
+ halfOpenRequests: 1
180
+ });
181
+ const fn = vi.fn(async () => {
182
+ throw new Error("Failed");
183
+ });
184
+ await expect(breaker.execute(fn)).rejects.toThrow();
185
+ expect(breaker.getState()).toBe(CircuitState.OPEN);
186
+ await new Promise((resolve) => setTimeout(resolve, 60));
187
+ const successFn = vi.fn(async () => "success");
188
+ const result = await breaker.execute(successFn);
189
+ expect(result).toBe("success");
190
+ expect(breaker.getState()).toBe(CircuitState.CLOSED);
191
+ });
192
+ it("should reset manually", () => {
193
+ const breaker = new CircuitBreaker("test", {
194
+ failureThreshold: 1
195
+ });
196
+ breaker.reset();
197
+ expect(breaker.getState()).toBe(CircuitState.CLOSED);
198
+ });
199
+ });
200
+ describe("Fallback Mechanism", () => {
201
+ it("should use fallback on primary failure", async () => {
202
+ const primary = vi.fn(async () => {
203
+ throw new Error("Primary failed");
204
+ });
205
+ const fallback1 = vi.fn(async () => "fallback result");
206
+ const result = await withFallback(primary, [fallback1]);
207
+ expect(result).toBe("fallback result");
208
+ expect(primary).toHaveBeenCalledTimes(1);
209
+ expect(fallback1).toHaveBeenCalledTimes(1);
210
+ });
211
+ it("should try multiple fallbacks", async () => {
212
+ const primary = vi.fn(async () => {
213
+ throw new Error("Primary failed");
214
+ });
215
+ const fallback1 = vi.fn(async () => {
216
+ throw new Error("Fallback1 failed");
217
+ });
218
+ const fallback2 = vi.fn(async () => "fallback2 result");
219
+ const result = await withFallback(primary, [fallback1, fallback2]);
220
+ expect(result).toBe("fallback2 result");
221
+ expect(fallback1).toHaveBeenCalledTimes(1);
222
+ expect(fallback2).toHaveBeenCalledTimes(1);
223
+ });
224
+ it("should throw if all attempts fail", async () => {
225
+ const primary = vi.fn(async () => {
226
+ throw new Error("Primary");
227
+ });
228
+ const fallback = vi.fn(async () => {
229
+ throw new Error("Fallback");
230
+ });
231
+ await expect(
232
+ withFallback(primary, [fallback])
233
+ ).rejects.toThrow("All attempts failed");
234
+ });
235
+ });
236
+ describe("Timeout Wrapper", () => {
237
+ it("should timeout long operations", async () => {
238
+ const slowFn = async () => {
239
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
240
+ return "slow";
241
+ };
242
+ await expect(
243
+ withTimeout(slowFn, 50, "Custom timeout")
244
+ ).rejects.toThrow("Custom timeout");
245
+ });
246
+ it("should complete fast operations", async () => {
247
+ const fastFn = async () => {
248
+ await new Promise((resolve) => setTimeout(resolve, 10));
249
+ return "fast";
250
+ };
251
+ const result = await withTimeout(fastFn, 100);
252
+ expect(result).toBe("fast");
253
+ });
254
+ });
255
+ describe("Graceful Degradation", () => {
256
+ it("should return default on failure", async () => {
257
+ const failingFn = vi.fn(async () => {
258
+ throw new Error("Failed");
259
+ });
260
+ const result = await gracefulDegrade(failingFn, "default");
261
+ expect(result).toBe("default");
262
+ });
263
+ it("should return result on success", async () => {
264
+ const successFn = vi.fn(async () => "success");
265
+ const result = await gracefulDegrade(successFn, "default");
266
+ expect(result).toBe("success");
267
+ });
268
+ });
269
+ });
270
+ //# sourceMappingURL=error-handling.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/errors/__tests__/error-handling.test.ts"],
4
+ "sourcesContent": ["/**\n * Tests for error handling system\n */\n\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\nimport {\n StackMemoryError,\n DatabaseError,\n FrameError,\n TaskError,\n ValidationError,\n ErrorCode,\n isRetryableError,\n getErrorMessage,\n wrapError,\n isStackMemoryError,\n} from '../index.js';\nimport {\n retry,\n CircuitBreaker,\n withFallback,\n calculateBackoff,\n CircuitState,\n withTimeout,\n gracefulDegrade,\n} from '../recovery.js';\n\ndescribe('Error Classes', () => {\n describe('StackMemoryError', () => {\n it('should create error with all properties', () => {\n const error = new StackMemoryError({\n code: ErrorCode.INTERNAL_ERROR,\n message: 'Test error',\n context: { key: 'value' },\n isRetryable: true,\n httpStatus: 500,\n });\n\n expect(error.code).toBe(ErrorCode.INTERNAL_ERROR);\n expect(error.message).toBe('Test error');\n expect(error.context).toEqual({ key: 'value' });\n expect(error.isRetryable).toBe(true);\n expect(error.httpStatus).toBe(500);\n expect(error.timestamp).toBeInstanceOf(Date);\n });\n\n it('should serialize to JSON correctly', () => {\n const error = new StackMemoryError({\n code: ErrorCode.DB_CONNECTION_FAILED,\n message: 'Connection failed',\n });\n\n const json = error.toJSON();\n expect(json.code).toBe(ErrorCode.DB_CONNECTION_FAILED);\n expect(json.message).toBe('Connection failed');\n expect(json.timestamp).toBeDefined();\n });\n });\n\n describe('DatabaseError', () => {\n it('should be retryable for connection failures', () => {\n const error = new DatabaseError(\n 'Connection lost',\n ErrorCode.DB_CONNECTION_FAILED\n );\n expect(error.isRetryable).toBe(true);\n });\n\n it('should not be retryable for query failures', () => {\n const error = new DatabaseError(\n 'Invalid SQL',\n ErrorCode.DB_QUERY_FAILED\n );\n expect(error.isRetryable).toBe(false);\n });\n });\n\n describe('Error Helpers', () => {\n it('should identify retryable errors', () => {\n const retryable = new DatabaseError(\n 'Connection lost',\n ErrorCode.DB_CONNECTION_FAILED\n );\n const nonRetryable = new ValidationError('Invalid input');\n\n expect(isRetryableError(retryable)).toBe(true);\n expect(isRetryableError(nonRetryable)).toBe(false);\n });\n\n it('should identify retryable network errors', () => {\n const networkError = new Error('ECONNREFUSED');\n const timeoutError = new Error('Request timeout');\n \n expect(isRetryableError(networkError)).toBe(true);\n expect(isRetryableError(timeoutError)).toBe(true);\n });\n\n it('should extract error messages safely', () => {\n expect(getErrorMessage(new Error('Test'))).toBe('Test');\n expect(getErrorMessage('String error')).toBe('String error');\n expect(getErrorMessage({ message: 'Object error' })).toBe('Object error');\n expect(getErrorMessage(null)).toBe('An unknown error occurred');\n expect(getErrorMessage(undefined)).toBe('An unknown error occurred');\n });\n\n it('should wrap errors correctly', () => {\n const originalError = new Error('Original');\n const wrapped = wrapError(\n originalError,\n 'Wrapped message',\n ErrorCode.INTERNAL_ERROR,\n { extra: 'context' }\n );\n\n expect(wrapped).toBeInstanceOf(StackMemoryError);\n expect(wrapped.cause).toBe(originalError);\n expect(wrapped.context).toEqual({ extra: 'context' });\n });\n\n it('should not double-wrap StackMemoryErrors', () => {\n const stackError = new FrameError('Frame error');\n const wrapped = wrapError(stackError, 'Default');\n \n expect(wrapped).toBe(stackError);\n });\n });\n});\n\ndescribe('Recovery Utilities', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe('Retry Logic', () => {\n it('should retry on failure', async () => {\n let attempts = 0;\n const fn = vi.fn(async () => {\n attempts++;\n if (attempts < 3) {\n throw new DatabaseError('Connection lost', ErrorCode.DB_CONNECTION_FAILED);\n }\n return 'success';\n });\n\n const result = await retry(fn, {\n maxAttempts: 3,\n initialDelay: 10,\n });\n\n expect(result).toBe('success');\n expect(fn).toHaveBeenCalledTimes(3);\n });\n\n it('should not retry non-retryable errors', async () => {\n const fn = vi.fn(async () => {\n throw new ValidationError('Invalid data');\n });\n\n await expect(\n retry(fn, { maxAttempts: 3 })\n ).rejects.toThrow('Invalid data');\n \n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it('should respect timeout', async () => {\n const fn = vi.fn(async () => {\n await new Promise(resolve => setTimeout(resolve, 1000));\n return 'slow';\n });\n\n await expect(\n retry(fn, { timeout: 50 })\n ).rejects.toThrow('Operation timed out');\n });\n\n it('should calculate backoff correctly', () => {\n const delay1 = calculateBackoff(1, 100, 10000, 2);\n const delay2 = calculateBackoff(2, 100, 10000, 2);\n const delay3 = calculateBackoff(3, 100, 10000, 2);\n\n // Base delays without jitter\n expect(delay1).toBeGreaterThanOrEqual(100);\n expect(delay1).toBeLessThanOrEqual(125); // With max 25% jitter\n\n expect(delay2).toBeGreaterThanOrEqual(200);\n expect(delay2).toBeLessThanOrEqual(250);\n\n expect(delay3).toBeGreaterThanOrEqual(400);\n expect(delay3).toBeLessThanOrEqual(500);\n });\n });\n\n describe('Circuit Breaker', () => {\n it('should open after threshold failures', async () => {\n const breaker = new CircuitBreaker('test', {\n failureThreshold: 2,\n resetTimeout: 100,\n });\n\n const failingFn = vi.fn(async () => {\n throw new Error('Failed');\n });\n\n // First two failures\n await expect(breaker.execute(failingFn)).rejects.toThrow('Failed');\n await expect(breaker.execute(failingFn)).rejects.toThrow('Failed');\n\n // Circuit should be open\n expect(breaker.getState()).toBe(CircuitState.OPEN);\n\n // Next call should fail immediately\n await expect(breaker.execute(failingFn)).rejects.toThrow(\n 'Circuit breaker test is OPEN'\n );\n expect(failingFn).toHaveBeenCalledTimes(2); // Not called on open circuit\n });\n\n it('should transition to half-open after timeout', async () => {\n const breaker = new CircuitBreaker('test', {\n failureThreshold: 1,\n resetTimeout: 50,\n halfOpenRequests: 1,\n });\n\n const fn = vi.fn(async () => {\n throw new Error('Failed');\n });\n\n // Open the circuit\n await expect(breaker.execute(fn)).rejects.toThrow();\n expect(breaker.getState()).toBe(CircuitState.OPEN);\n\n // Wait for reset timeout\n await new Promise(resolve => setTimeout(resolve, 60));\n\n // Should allow one request in half-open\n const successFn = vi.fn(async () => 'success');\n const result = await breaker.execute(successFn);\n \n expect(result).toBe('success');\n expect(breaker.getState()).toBe(CircuitState.CLOSED);\n });\n\n it('should reset manually', () => {\n const breaker = new CircuitBreaker('test', {\n failureThreshold: 1,\n });\n\n breaker.reset();\n expect(breaker.getState()).toBe(CircuitState.CLOSED);\n });\n });\n\n describe('Fallback Mechanism', () => {\n it('should use fallback on primary failure', async () => {\n const primary = vi.fn(async () => {\n throw new Error('Primary failed');\n });\n const fallback1 = vi.fn(async () => 'fallback result');\n\n const result = await withFallback(primary, [fallback1]);\n\n expect(result).toBe('fallback result');\n expect(primary).toHaveBeenCalledTimes(1);\n expect(fallback1).toHaveBeenCalledTimes(1);\n });\n\n it('should try multiple fallbacks', async () => {\n const primary = vi.fn(async () => {\n throw new Error('Primary failed');\n });\n const fallback1 = vi.fn(async () => {\n throw new Error('Fallback1 failed');\n });\n const fallback2 = vi.fn(async () => 'fallback2 result');\n\n const result = await withFallback(primary, [fallback1, fallback2]);\n\n expect(result).toBe('fallback2 result');\n expect(fallback1).toHaveBeenCalledTimes(1);\n expect(fallback2).toHaveBeenCalledTimes(1);\n });\n\n it('should throw if all attempts fail', async () => {\n const primary = vi.fn(async () => {\n throw new Error('Primary');\n });\n const fallback = vi.fn(async () => {\n throw new Error('Fallback');\n });\n\n await expect(\n withFallback(primary, [fallback])\n ).rejects.toThrow('All attempts failed');\n });\n });\n\n describe('Timeout Wrapper', () => {\n it('should timeout long operations', async () => {\n const slowFn = async () => {\n await new Promise(resolve => setTimeout(resolve, 1000));\n return 'slow';\n };\n\n await expect(\n withTimeout(slowFn, 50, 'Custom timeout')\n ).rejects.toThrow('Custom timeout');\n });\n\n it('should complete fast operations', async () => {\n const fastFn = async () => {\n await new Promise(resolve => setTimeout(resolve, 10));\n return 'fast';\n };\n\n const result = await withTimeout(fastFn, 100);\n expect(result).toBe('fast');\n });\n });\n\n describe('Graceful Degradation', () => {\n it('should return default on failure', async () => {\n const failingFn = vi.fn(async () => {\n throw new Error('Failed');\n });\n\n const result = await gracefulDegrade(failingFn, 'default');\n expect(result).toBe('default');\n });\n\n it('should return result on success', async () => {\n const successFn = vi.fn(async () => 'success');\n \n const result = await gracefulDegrade(successFn, 'default');\n expect(result).toBe('success');\n });\n });\n});"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,239 @@
1
+ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
2
+ ErrorCode2["DB_CONNECTION_FAILED"] = "DB_001";
3
+ ErrorCode2["DB_QUERY_FAILED"] = "DB_002";
4
+ ErrorCode2["DB_TRANSACTION_FAILED"] = "DB_003";
5
+ ErrorCode2["DB_MIGRATION_FAILED"] = "DB_004";
6
+ ErrorCode2["DB_CONSTRAINT_VIOLATION"] = "DB_005";
7
+ ErrorCode2["DB_SCHEMA_ERROR"] = "DB_006";
8
+ ErrorCode2["DB_INSERT_FAILED"] = "DB_007";
9
+ ErrorCode2["DB_UPDATE_FAILED"] = "DB_008";
10
+ ErrorCode2["DB_DELETE_FAILED"] = "DB_009";
11
+ ErrorCode2["FRAME_NOT_FOUND"] = "FRAME_001";
12
+ ErrorCode2["FRAME_INVALID_STATE"] = "FRAME_002";
13
+ ErrorCode2["FRAME_PARENT_NOT_FOUND"] = "FRAME_003";
14
+ ErrorCode2["FRAME_CYCLE_DETECTED"] = "FRAME_004";
15
+ ErrorCode2["FRAME_ALREADY_CLOSED"] = "FRAME_005";
16
+ ErrorCode2["FRAME_INIT_FAILED"] = "FRAME_006";
17
+ ErrorCode2["FRAME_INVALID_INPUT"] = "FRAME_007";
18
+ ErrorCode2["FRAME_STACK_OVERFLOW"] = "FRAME_008";
19
+ ErrorCode2["TASK_NOT_FOUND"] = "TASK_001";
20
+ ErrorCode2["TASK_INVALID_STATE"] = "TASK_002";
21
+ ErrorCode2["TASK_DEPENDENCY_CONFLICT"] = "TASK_003";
22
+ ErrorCode2["TASK_CIRCULAR_DEPENDENCY"] = "TASK_004";
23
+ ErrorCode2["LINEAR_AUTH_FAILED"] = "LINEAR_001";
24
+ ErrorCode2["LINEAR_API_ERROR"] = "LINEAR_002";
25
+ ErrorCode2["LINEAR_SYNC_FAILED"] = "LINEAR_003";
26
+ ErrorCode2["LINEAR_WEBHOOK_FAILED"] = "LINEAR_004";
27
+ ErrorCode2["MCP_TOOL_NOT_FOUND"] = "MCP_001";
28
+ ErrorCode2["MCP_INVALID_PARAMS"] = "MCP_002";
29
+ ErrorCode2["MCP_EXECUTION_FAILED"] = "MCP_003";
30
+ ErrorCode2["MCP_RATE_LIMITED"] = "MCP_004";
31
+ ErrorCode2["PROJECT_NOT_FOUND"] = "PROJECT_001";
32
+ ErrorCode2["PROJECT_INVALID_PATH"] = "PROJECT_002";
33
+ ErrorCode2["PROJECT_GIT_ERROR"] = "PROJECT_003";
34
+ ErrorCode2["VALIDATION_FAILED"] = "VAL_001";
35
+ ErrorCode2["INVALID_INPUT"] = "VAL_002";
36
+ ErrorCode2["MISSING_REQUIRED_FIELD"] = "VAL_003";
37
+ ErrorCode2["TYPE_MISMATCH"] = "VAL_004";
38
+ ErrorCode2["INITIALIZATION_ERROR"] = "SYS_001";
39
+ ErrorCode2["NOT_FOUND"] = "SYS_002";
40
+ ErrorCode2["INTERNAL_ERROR"] = "SYS_003";
41
+ ErrorCode2["CONFIGURATION_ERROR"] = "SYS_004";
42
+ ErrorCode2["PERMISSION_DENIED"] = "SYS_005";
43
+ ErrorCode2["RESOURCE_EXHAUSTED"] = "SYS_006";
44
+ ErrorCode2["SERVICE_UNAVAILABLE"] = "SYS_007";
45
+ ErrorCode2["SYSTEM_INIT_FAILED"] = "SYS_008";
46
+ return ErrorCode2;
47
+ })(ErrorCode || {});
48
+ class StackMemoryError extends Error {
49
+ code;
50
+ context;
51
+ cause;
52
+ isRetryable;
53
+ httpStatus;
54
+ timestamp;
55
+ constructor(options) {
56
+ super(options.message);
57
+ this.name = this.constructor.name;
58
+ this.code = options.code;
59
+ this.context = options.context;
60
+ this.cause = options.cause;
61
+ this.isRetryable = options.isRetryable ?? false;
62
+ this.httpStatus = options.httpStatus ?? 500;
63
+ this.timestamp = /* @__PURE__ */ new Date();
64
+ if (Error.captureStackTrace) {
65
+ Error.captureStackTrace(this, this.constructor);
66
+ }
67
+ }
68
+ toJSON() {
69
+ return {
70
+ name: this.name,
71
+ code: this.code,
72
+ message: this.message,
73
+ context: this.context,
74
+ isRetryable: this.isRetryable,
75
+ httpStatus: this.httpStatus,
76
+ timestamp: this.timestamp.toISOString(),
77
+ stack: this.stack,
78
+ cause: this.cause?.message
79
+ };
80
+ }
81
+ }
82
+ class DatabaseError extends StackMemoryError {
83
+ constructor(message, code = "DB_002" /* DB_QUERY_FAILED */, context, cause) {
84
+ super({
85
+ code,
86
+ message,
87
+ context,
88
+ cause,
89
+ isRetryable: code === "DB_001" /* DB_CONNECTION_FAILED */,
90
+ httpStatus: 503
91
+ });
92
+ }
93
+ }
94
+ class FrameError extends StackMemoryError {
95
+ constructor(message, code = "FRAME_002" /* FRAME_INVALID_STATE */, context) {
96
+ super({
97
+ code,
98
+ message,
99
+ context,
100
+ isRetryable: false,
101
+ httpStatus: 400
102
+ });
103
+ }
104
+ }
105
+ class TaskError extends StackMemoryError {
106
+ constructor(message, code = "TASK_002" /* TASK_INVALID_STATE */, context) {
107
+ super({
108
+ code,
109
+ message,
110
+ context,
111
+ isRetryable: false,
112
+ httpStatus: 400
113
+ });
114
+ }
115
+ }
116
+ class IntegrationError extends StackMemoryError {
117
+ constructor(message, code = "LINEAR_002" /* LINEAR_API_ERROR */, context, cause) {
118
+ super({
119
+ code,
120
+ message,
121
+ context,
122
+ cause,
123
+ isRetryable: true,
124
+ httpStatus: 502
125
+ });
126
+ }
127
+ }
128
+ class MCPError extends StackMemoryError {
129
+ constructor(message, code = "MCP_003" /* MCP_EXECUTION_FAILED */, context) {
130
+ super({
131
+ code,
132
+ message,
133
+ context,
134
+ isRetryable: code === "MCP_004" /* MCP_RATE_LIMITED */,
135
+ httpStatus: code === "MCP_004" /* MCP_RATE_LIMITED */ ? 429 : 400
136
+ });
137
+ }
138
+ }
139
+ class ValidationError extends StackMemoryError {
140
+ constructor(message, code = "VAL_001" /* VALIDATION_FAILED */, context) {
141
+ super({
142
+ code,
143
+ message,
144
+ context,
145
+ isRetryable: false,
146
+ httpStatus: 400
147
+ });
148
+ }
149
+ }
150
+ class ProjectError extends StackMemoryError {
151
+ constructor(message, code = "PROJECT_001" /* PROJECT_NOT_FOUND */, context) {
152
+ super({
153
+ code,
154
+ message,
155
+ context,
156
+ isRetryable: false,
157
+ httpStatus: 404
158
+ });
159
+ }
160
+ }
161
+ class SystemError extends StackMemoryError {
162
+ constructor(message, code = "SYS_003" /* INTERNAL_ERROR */, context, cause) {
163
+ super({
164
+ code,
165
+ message,
166
+ context,
167
+ cause,
168
+ isRetryable: code === "SYS_007" /* SERVICE_UNAVAILABLE */,
169
+ httpStatus: 500
170
+ });
171
+ }
172
+ }
173
+ function isRetryableError(error) {
174
+ if (error instanceof StackMemoryError) {
175
+ return error.isRetryable;
176
+ }
177
+ if (error instanceof Error) {
178
+ const message = error.message.toLowerCase();
179
+ return message.includes("econnrefused") || message.includes("timeout") || message.includes("enotfound") || message.includes("socket hang up");
180
+ }
181
+ return false;
182
+ }
183
+ function getErrorMessage(error) {
184
+ if (error instanceof Error) {
185
+ return error.message;
186
+ }
187
+ if (typeof error === "string") {
188
+ return error;
189
+ }
190
+ if (error && typeof error === "object" && "message" in error) {
191
+ return String(error.message);
192
+ }
193
+ return "An unknown error occurred";
194
+ }
195
+ function wrapError(error, defaultMessage, code = "SYS_003" /* INTERNAL_ERROR */, context) {
196
+ if (error instanceof StackMemoryError) {
197
+ return error;
198
+ }
199
+ const cause = error instanceof Error ? error : void 0;
200
+ const message = error instanceof Error ? error.message : defaultMessage;
201
+ return new SystemError(message, code, context, cause);
202
+ }
203
+ function isStackMemoryError(error) {
204
+ return error instanceof StackMemoryError;
205
+ }
206
+ function createErrorHandler(defaultContext) {
207
+ return (error, additionalContext) => {
208
+ const context = { ...defaultContext, ...additionalContext };
209
+ if (error instanceof StackMemoryError) {
210
+ return new StackMemoryError({
211
+ code: error.code,
212
+ message: error.message,
213
+ context: { ...error.context, ...context },
214
+ cause: error.cause,
215
+ isRetryable: error.isRetryable,
216
+ httpStatus: error.httpStatus
217
+ });
218
+ }
219
+ return wrapError(error, getErrorMessage(error), "SYS_003" /* INTERNAL_ERROR */, context);
220
+ };
221
+ }
222
+ export {
223
+ DatabaseError,
224
+ ErrorCode,
225
+ FrameError,
226
+ IntegrationError,
227
+ MCPError,
228
+ ProjectError,
229
+ StackMemoryError,
230
+ SystemError,
231
+ TaskError,
232
+ ValidationError,
233
+ createErrorHandler,
234
+ getErrorMessage,
235
+ isRetryableError,
236
+ isStackMemoryError,
237
+ wrapError
238
+ };
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/errors/index.ts"],
4
+ "sourcesContent": ["/**\n * Custom error classes for StackMemory\n * Provides a hierarchy of error types for better error handling and debugging\n */\n\nexport enum ErrorCode {\n // Database errors (1000-1999)\n DB_CONNECTION_FAILED = 'DB_001',\n DB_QUERY_FAILED = 'DB_002',\n DB_TRANSACTION_FAILED = 'DB_003',\n DB_MIGRATION_FAILED = 'DB_004',\n DB_CONSTRAINT_VIOLATION = 'DB_005',\n DB_SCHEMA_ERROR = 'DB_006',\n DB_INSERT_FAILED = 'DB_007',\n DB_UPDATE_FAILED = 'DB_008',\n DB_DELETE_FAILED = 'DB_009',\n\n // Frame errors (2000-2999)\n FRAME_NOT_FOUND = 'FRAME_001',\n FRAME_INVALID_STATE = 'FRAME_002',\n FRAME_PARENT_NOT_FOUND = 'FRAME_003',\n FRAME_CYCLE_DETECTED = 'FRAME_004',\n FRAME_ALREADY_CLOSED = 'FRAME_005',\n FRAME_INIT_FAILED = 'FRAME_006',\n FRAME_INVALID_INPUT = 'FRAME_007',\n FRAME_STACK_OVERFLOW = 'FRAME_008',\n\n // Task errors (3000-3999)\n TASK_NOT_FOUND = 'TASK_001',\n TASK_INVALID_STATE = 'TASK_002',\n TASK_DEPENDENCY_CONFLICT = 'TASK_003',\n TASK_CIRCULAR_DEPENDENCY = 'TASK_004',\n\n // Integration errors (4000-4999)\n LINEAR_AUTH_FAILED = 'LINEAR_001',\n LINEAR_API_ERROR = 'LINEAR_002',\n LINEAR_SYNC_FAILED = 'LINEAR_003',\n LINEAR_WEBHOOK_FAILED = 'LINEAR_004',\n\n // MCP errors (5000-5999)\n MCP_TOOL_NOT_FOUND = 'MCP_001',\n MCP_INVALID_PARAMS = 'MCP_002',\n MCP_EXECUTION_FAILED = 'MCP_003',\n MCP_RATE_LIMITED = 'MCP_004',\n\n // Project errors (6000-6999)\n PROJECT_NOT_FOUND = 'PROJECT_001',\n PROJECT_INVALID_PATH = 'PROJECT_002',\n PROJECT_GIT_ERROR = 'PROJECT_003',\n\n // Validation errors (7000-7999)\n VALIDATION_FAILED = 'VAL_001',\n INVALID_INPUT = 'VAL_002',\n MISSING_REQUIRED_FIELD = 'VAL_003',\n TYPE_MISMATCH = 'VAL_004',\n\n // System errors (8000-8999)\n INITIALIZATION_ERROR = 'SYS_001',\n NOT_FOUND = 'SYS_002',\n INTERNAL_ERROR = 'SYS_003',\n CONFIGURATION_ERROR = 'SYS_004',\n PERMISSION_DENIED = 'SYS_005',\n RESOURCE_EXHAUSTED = 'SYS_006',\n SERVICE_UNAVAILABLE = 'SYS_007',\n SYSTEM_INIT_FAILED = 'SYS_008',\n}\n\nexport interface ErrorContext {\n [key: string]: unknown;\n}\n\nexport interface StackMemoryErrorOptions {\n code: ErrorCode;\n message: string;\n context?: ErrorContext;\n cause?: Error;\n isRetryable?: boolean;\n httpStatus?: number;\n}\n\n/**\n * Base error class for all StackMemory errors\n */\nexport class StackMemoryError extends Error {\n public readonly code: ErrorCode;\n public readonly context?: ErrorContext;\n public readonly cause?: Error;\n public readonly isRetryable: boolean;\n public readonly httpStatus: number;\n public readonly timestamp: Date;\n\n constructor(options: StackMemoryErrorOptions) {\n super(options.message);\n this.name = this.constructor.name;\n this.code = options.code;\n this.context = options.context;\n this.cause = options.cause;\n this.isRetryable = options.isRetryable ?? false;\n this.httpStatus = options.httpStatus ?? 500;\n this.timestamp = new Date();\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n context: this.context,\n isRetryable: this.isRetryable,\n httpStatus: this.httpStatus,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Database-related errors\n */\nexport class DatabaseError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.DB_QUERY_FAILED,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.DB_CONNECTION_FAILED,\n httpStatus: 503,\n });\n }\n}\n\n/**\n * Frame-related errors\n */\nexport class FrameError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.FRAME_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Task-related errors\n */\nexport class TaskError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.TASK_INVALID_STATE,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Integration errors (Linear, etc.)\n */\nexport class IntegrationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.LINEAR_API_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: true,\n httpStatus: 502,\n });\n }\n}\n\n/**\n * MCP-related errors\n */\nexport class MCPError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.MCP_EXECUTION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: code === ErrorCode.MCP_RATE_LIMITED,\n httpStatus: code === ErrorCode.MCP_RATE_LIMITED ? 429 : 400,\n });\n }\n}\n\n/**\n * Validation errors\n */\nexport class ValidationError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.VALIDATION_FAILED,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 400,\n });\n }\n}\n\n/**\n * Project-related errors\n */\nexport class ProjectError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.PROJECT_NOT_FOUND,\n context?: ErrorContext\n ) {\n super({\n code,\n message,\n context,\n isRetryable: false,\n httpStatus: 404,\n });\n }\n}\n\n/**\n * System/Internal errors\n */\nexport class SystemError extends StackMemoryError {\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext,\n cause?: Error\n ) {\n super({\n code,\n message,\n context,\n cause,\n isRetryable: code === ErrorCode.SERVICE_UNAVAILABLE,\n httpStatus: 500,\n });\n }\n}\n\n/**\n * Helper function to determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (error instanceof StackMemoryError) {\n return error.isRetryable;\n }\n // Check for common retryable error patterns\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('econnrefused') ||\n message.includes('timeout') ||\n message.includes('enotfound') ||\n message.includes('socket hang up')\n );\n }\n return false;\n}\n\n/**\n * Helper function to safely extract error message\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'An unknown error occurred';\n}\n\n/**\n * Helper function to wrap unknown errors in StackMemoryError\n */\nexport function wrapError(\n error: unknown,\n defaultMessage: string,\n code: ErrorCode = ErrorCode.INTERNAL_ERROR,\n context?: ErrorContext\n): StackMemoryError {\n if (error instanceof StackMemoryError) {\n return error;\n }\n\n const cause = error instanceof Error ? error : undefined;\n const message = error instanceof Error ? error.message : defaultMessage;\n\n return new SystemError(message, code, context, cause);\n}\n\n/**\n * Type guard to check if error is a StackMemoryError\n */\nexport function isStackMemoryError(error: unknown): error is StackMemoryError {\n return error instanceof StackMemoryError;\n}\n\n/**\n * Create context-aware error handler\n */\nexport function createErrorHandler(defaultContext: ErrorContext) {\n return (error: unknown, additionalContext?: ErrorContext) => {\n const context = { ...defaultContext, ...additionalContext };\n \n if (error instanceof StackMemoryError) {\n // Create a new error with merged context since context is readonly\n return new StackMemoryError({\n code: error.code,\n message: error.message,\n context: { ...error.context, ...context },\n cause: error.cause,\n isRetryable: error.isRetryable,\n httpStatus: error.httpStatus,\n });\n }\n\n return wrapError(error, getErrorMessage(error), ErrorCode.INTERNAL_ERROR, context);\n };\n}"],
5
+ "mappings": "AAKO,IAAK,YAAL,kBAAKA,eAAL;AAEL,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,2BAAwB;AACxB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,sBAAmB;AAGnB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,4BAAyB;AACzB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,uBAAoB;AACpB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,0BAAuB;AAGvB,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,8BAA2B;AAG3B,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,2BAAwB;AAGxB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,sBAAmB;AAGnB,EAAAA,WAAA,uBAAoB;AACpB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,uBAAoB;AAGpB,EAAAA,WAAA,uBAAoB;AACpB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,4BAAyB;AACzB,EAAAA,WAAA,mBAAgB;AAGhB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,uBAAoB;AACpB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,wBAAqB;AA3DX,SAAAA;AAAA,GAAA;AA8EL,MAAM,yBAAyB,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,SAAkC;AAC5C,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ,QAAQ;AACrB,SAAK,cAAc,QAAQ,eAAe;AAC1C,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,YAAY,oBAAI,KAAK;AAG1B,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,SAAkC;AAChC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK,UAAU,YAAY;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAKO,MAAM,sBAAsB,iBAAiB;AAAA,EAClD,YACE,SACA,OAAkB,gCAClB,SACA,OACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAKO,MAAM,mBAAmB,iBAAiB;AAAA,EAC/C,YACE,SACA,OAAkB,uCAClB,SACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAKO,MAAM,kBAAkB,iBAAiB;AAAA,EAC9C,YACE,SACA,OAAkB,qCAClB,SACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAKO,MAAM,yBAAyB,iBAAiB;AAAA,EACrD,YACE,SACA,OAAkB,qCAClB,SACA,OACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAKO,MAAM,iBAAiB,iBAAiB;AAAA,EAC7C,YACE,SACA,OAAkB,sCAClB,SACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,YAAY,SAAS,mCAA6B,MAAM;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;AAKO,MAAM,wBAAwB,iBAAiB;AAAA,EACpD,YACE,SACA,OAAkB,mCAClB,SACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAKO,MAAM,qBAAqB,iBAAiB;AAAA,EACjD,YACE,SACA,OAAkB,uCAClB,SACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAKO,MAAM,oBAAoB,iBAAiB;AAAA,EAChD,YACE,SACA,OAAkB,gCAClB,SACA,OACA;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAKO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,iBAAiB,kBAAkB;AACrC,WAAO,MAAM;AAAA,EACf;AAEA,MAAI,iBAAiB,OAAO;AAC1B,UAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,WACE,QAAQ,SAAS,cAAc,KAC/B,QAAQ,SAAS,SAAS,KAC1B,QAAQ,SAAS,WAAW,KAC5B,QAAQ,SAAS,gBAAgB;AAAA,EAErC;AACA,SAAO;AACT;AAKO,SAAS,gBAAgB,OAAwB;AACtD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,OAAO;AAC5D,WAAO,OAAO,MAAM,OAAO;AAAA,EAC7B;AACA,SAAO;AACT;AAKO,SAAS,UACd,OACA,gBACA,OAAkB,gCAClB,SACkB;AAClB,MAAI,iBAAiB,kBAAkB;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,iBAAiB,QAAQ,QAAQ;AAC/C,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AAEzD,SAAO,IAAI,YAAY,SAAS,MAAM,SAAS,KAAK;AACtD;AAKO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,iBAAiB;AAC1B;AAKO,SAAS,mBAAmB,gBAA8B;AAC/D,SAAO,CAAC,OAAgB,sBAAqC;AAC3D,UAAM,UAAU,EAAE,GAAG,gBAAgB,GAAG,kBAAkB;AAE1D,QAAI,iBAAiB,kBAAkB;AAErC,aAAO,IAAI,iBAAiB;AAAA,QAC1B,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,QAAQ;AAAA,QACxC,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AAEA,WAAO,UAAU,OAAO,gBAAgB,KAAK,GAAG,gCAA0B,OAAO;AAAA,EACnF;AACF;",
6
+ "names": ["ErrorCode"]
7
+ }