@stackmemoryai/stackmemory 0.2.4 → 0.2.7

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 (331) hide show
  1. package/README.md +353 -83
  2. package/dist/index.js +382 -0
  3. package/dist/scripts/cancel-duplicate-tasks.d.ts +7 -0
  4. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +1 -0
  5. package/dist/scripts/cancel-duplicate-tasks.js +171 -0
  6. package/dist/scripts/cancel-duplicate-tasks.js.map +1 -0
  7. package/dist/scripts/list-linear-tasks.d.ts +6 -0
  8. package/dist/scripts/list-linear-tasks.d.ts.map +1 -0
  9. package/dist/scripts/list-linear-tasks.js +122 -0
  10. package/dist/scripts/list-linear-tasks.js.map +1 -0
  11. package/dist/scripts/merge-linear-duplicates-safe.d.ts +7 -0
  12. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +1 -0
  13. package/dist/scripts/merge-linear-duplicates-safe.js +265 -0
  14. package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -0
  15. package/dist/scripts/merge-linear-duplicates.d.ts +7 -0
  16. package/dist/scripts/merge-linear-duplicates.d.ts.map +1 -0
  17. package/dist/scripts/merge-linear-duplicates.js +126 -0
  18. package/dist/scripts/merge-linear-duplicates.js.map +1 -0
  19. package/dist/scripts/show-linear-summary.d.ts +6 -0
  20. package/dist/scripts/show-linear-summary.d.ts.map +1 -0
  21. package/dist/scripts/show-linear-summary.js +117 -0
  22. package/dist/scripts/show-linear-summary.js.map +1 -0
  23. package/dist/src/analytics/api/analytics-api.d.ts +24 -0
  24. package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
  25. package/dist/src/analytics/api/analytics-api.js +279 -0
  26. package/dist/src/analytics/api/analytics-api.js.map +1 -0
  27. package/dist/src/analytics/core/analytics-service.d.ts +23 -0
  28. package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
  29. package/dist/src/analytics/core/analytics-service.js +160 -0
  30. package/dist/src/analytics/core/analytics-service.js.map +1 -0
  31. package/dist/src/analytics/index.d.ts +12 -0
  32. package/dist/src/analytics/index.d.ts.map +1 -0
  33. package/dist/src/analytics/index.js +11 -0
  34. package/dist/src/analytics/index.js.map +1 -0
  35. package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
  36. package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
  37. package/dist/src/analytics/queries/metrics-queries.js +179 -0
  38. package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
  39. package/dist/src/analytics/types/metrics.d.ts +60 -0
  40. package/dist/src/analytics/types/metrics.d.ts.map +1 -0
  41. package/dist/src/analytics/types/metrics.js +2 -0
  42. package/dist/src/analytics/types/metrics.js.map +1 -0
  43. package/dist/src/cli/__tests__/index.test.d.ts +5 -0
  44. package/dist/src/cli/__tests__/index.test.d.ts.map +1 -0
  45. package/dist/src/cli/__tests__/index.test.js +726 -0
  46. package/dist/src/cli/__tests__/index.test.js.map +1 -0
  47. package/dist/src/cli/analytics-viewer.d.ts +3 -0
  48. package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
  49. package/dist/src/cli/analytics-viewer.js +89 -0
  50. package/dist/src/cli/analytics-viewer.js.map +1 -0
  51. package/dist/src/cli/auto-detect.d.ts +61 -0
  52. package/dist/src/cli/auto-detect.d.ts.map +1 -0
  53. package/dist/src/cli/auto-detect.js +350 -0
  54. package/dist/src/cli/auto-detect.js.map +1 -0
  55. package/dist/src/cli/browser-test.d.ts +6 -0
  56. package/dist/src/cli/browser-test.d.ts.map +1 -0
  57. package/dist/src/cli/browser-test.js +32 -0
  58. package/dist/src/cli/browser-test.js.map +1 -0
  59. package/dist/src/cli/claude-sm.d.ts +7 -0
  60. package/dist/src/cli/claude-sm.d.ts.map +1 -0
  61. package/dist/src/cli/claude-sm.js +357 -0
  62. package/dist/src/cli/claude-sm.js.map +1 -0
  63. package/dist/src/cli/cli.js +157 -0
  64. package/dist/src/cli/cli.js.map +1 -1
  65. package/dist/src/cli/commands/context.d.ts +7 -0
  66. package/dist/src/cli/commands/context.d.ts.map +1 -0
  67. package/dist/src/cli/commands/context.js +365 -0
  68. package/dist/src/cli/commands/context.js.map +1 -0
  69. package/dist/src/cli/commands/linear-test.d.ts +6 -0
  70. package/dist/src/cli/commands/linear-test.d.ts.map +1 -0
  71. package/dist/src/cli/commands/linear-test.js +123 -0
  72. package/dist/src/cli/commands/linear-test.js.map +1 -0
  73. package/dist/src/cli/commands/linear.d.ts +6 -0
  74. package/dist/src/cli/commands/linear.d.ts.map +1 -0
  75. package/dist/src/cli/commands/linear.js +317 -0
  76. package/dist/src/cli/commands/linear.js.map +1 -0
  77. package/dist/src/cli/commands/log.d.ts +7 -0
  78. package/dist/src/cli/commands/log.d.ts.map +1 -0
  79. package/dist/src/cli/commands/log.js +168 -0
  80. package/dist/src/cli/commands/log.js.map +1 -0
  81. package/dist/src/cli/commands/onboard.d.ts +8 -0
  82. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  83. package/dist/src/cli/commands/onboard.js +363 -0
  84. package/dist/src/cli/commands/onboard.js.map +1 -0
  85. package/dist/src/cli/commands/projects.d.ts +8 -0
  86. package/dist/src/cli/commands/projects.d.ts.map +1 -0
  87. package/dist/src/cli/commands/projects.js +220 -0
  88. package/dist/src/cli/commands/projects.js.map +1 -0
  89. package/dist/src/cli/commands/search.d.ts +7 -0
  90. package/dist/src/cli/commands/search.d.ts.map +1 -0
  91. package/dist/src/cli/commands/search.js +162 -0
  92. package/dist/src/cli/commands/search.js.map +1 -0
  93. package/dist/src/cli/commands/session.d.ts +7 -0
  94. package/dist/src/cli/commands/session.d.ts.map +1 -0
  95. package/dist/src/cli/commands/session.js +222 -0
  96. package/dist/src/cli/commands/session.js.map +1 -0
  97. package/dist/src/cli/commands/tasks.d.ts +7 -0
  98. package/dist/src/cli/commands/tasks.d.ts.map +1 -0
  99. package/dist/src/cli/commands/tasks.js +229 -0
  100. package/dist/src/cli/commands/tasks.js.map +1 -0
  101. package/dist/src/cli/commands/webhook.d.ts +3 -0
  102. package/dist/src/cli/commands/webhook.d.ts.map +1 -0
  103. package/dist/src/cli/commands/webhook.js +157 -0
  104. package/dist/src/cli/commands/webhook.js.map +1 -0
  105. package/dist/src/cli/commands/worktree.d.ts +8 -0
  106. package/dist/src/cli/commands/worktree.d.ts.map +1 -0
  107. package/dist/src/cli/commands/worktree.js +339 -0
  108. package/dist/src/cli/commands/worktree.js.map +1 -0
  109. package/dist/src/cli/index.d.ts +8 -0
  110. package/dist/src/cli/index.d.ts.map +1 -0
  111. package/dist/src/cli/index.js +944 -0
  112. package/dist/src/cli/index.js.map +1 -0
  113. package/dist/src/cli/project-commands.d.ts +8 -0
  114. package/dist/src/cli/project-commands.d.ts.map +1 -0
  115. package/dist/src/cli/project-commands.js +212 -0
  116. package/dist/src/cli/project-commands.js.map +1 -0
  117. package/dist/src/cli/utils/viewer.d.ts +3 -0
  118. package/dist/src/cli/utils/viewer.d.ts.map +1 -0
  119. package/dist/src/cli/utils/viewer.js +91 -0
  120. package/dist/src/cli/utils/viewer.js.map +1 -0
  121. package/dist/src/core/context/__tests__/frame-manager.test.d.ts +5 -0
  122. package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +1 -0
  123. package/dist/src/core/context/__tests__/frame-manager.test.js +892 -0
  124. package/dist/src/core/context/__tests__/frame-manager.test.js.map +1 -0
  125. package/dist/src/core/context/auto-context.d.ts +22 -0
  126. package/dist/src/core/context/auto-context.d.ts.map +1 -0
  127. package/dist/src/core/context/auto-context.js +77 -0
  128. package/dist/src/core/context/auto-context.js.map +1 -0
  129. package/dist/src/core/context/frame-manager.d.ts +110 -0
  130. package/dist/src/core/context/frame-manager.d.ts.map +1 -0
  131. package/dist/src/core/context/frame-manager.js +593 -0
  132. package/dist/src/core/context/frame-manager.js.map +1 -0
  133. package/dist/src/core/errors/__tests__/error-handling.test.d.ts +5 -0
  134. package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +1 -0
  135. package/dist/src/core/errors/__tests__/error-handling.test.js +239 -0
  136. package/dist/src/core/errors/__tests__/error-handling.test.js.map +1 -0
  137. package/dist/src/core/errors/index.d.ts +135 -0
  138. package/dist/src/core/errors/index.d.ts.map +1 -0
  139. package/dist/src/core/errors/index.js +274 -0
  140. package/dist/src/core/errors/index.js.map +1 -0
  141. package/dist/src/core/errors/recovery.d.ts +86 -0
  142. package/dist/src/core/errors/recovery.d.ts.map +1 -0
  143. package/dist/src/core/errors/recovery.js +274 -0
  144. package/dist/src/core/errors/recovery.js.map +1 -0
  145. package/dist/src/core/logger.test.js +1 -1
  146. package/dist/src/core/logger.test.js.map +1 -1
  147. package/dist/src/core/monitoring/error-handler.d.ts +46 -0
  148. package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
  149. package/dist/src/core/monitoring/error-handler.js +212 -0
  150. package/dist/src/core/monitoring/error-handler.js.map +1 -0
  151. package/dist/src/core/monitoring/logger.d.ts +24 -0
  152. package/dist/src/core/monitoring/logger.d.ts.map +1 -0
  153. package/dist/src/core/monitoring/logger.js +121 -0
  154. package/dist/src/core/monitoring/logger.js.map +1 -0
  155. package/dist/src/core/monitoring/metrics.d.ts +7 -0
  156. package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
  157. package/dist/src/core/monitoring/metrics.js +13 -0
  158. package/dist/src/core/monitoring/metrics.js.map +1 -0
  159. package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
  160. package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
  161. package/dist/src/core/monitoring/progress-tracker.js +178 -0
  162. package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
  163. package/dist/src/core/project-manager.d.ts +130 -0
  164. package/dist/src/core/project-manager.d.ts.map +1 -0
  165. package/dist/src/core/project-manager.js +582 -0
  166. package/dist/src/core/project-manager.js.map +1 -0
  167. package/dist/src/core/projects/project-manager.d.ts +130 -0
  168. package/dist/src/core/projects/project-manager.d.ts.map +1 -0
  169. package/dist/src/core/projects/project-manager.js +709 -0
  170. package/dist/src/core/projects/project-manager.js.map +1 -0
  171. package/dist/src/core/session/index.d.ts +2 -0
  172. package/dist/src/core/session/index.d.ts.map +1 -0
  173. package/dist/src/core/session/index.js +2 -0
  174. package/dist/src/core/session/index.js.map +1 -0
  175. package/dist/src/core/session/session-manager.d.ts +69 -0
  176. package/dist/src/core/session/session-manager.d.ts.map +1 -0
  177. package/dist/src/core/session/session-manager.js +311 -0
  178. package/dist/src/core/session/session-manager.js.map +1 -0
  179. package/dist/src/core/utils/update-checker.d.ts +38 -0
  180. package/dist/src/core/utils/update-checker.d.ts.map +1 -0
  181. package/dist/src/core/utils/update-checker.js +213 -0
  182. package/dist/src/core/utils/update-checker.js.map +1 -0
  183. package/dist/src/core/worktree/worktree-manager.d.ts +110 -0
  184. package/dist/src/core/worktree/worktree-manager.d.ts.map +1 -0
  185. package/dist/src/core/worktree/worktree-manager.js +456 -0
  186. package/dist/src/core/worktree/worktree-manager.js.map +1 -0
  187. package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
  188. package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
  189. package/dist/src/features/analytics/api/analytics-api.js +289 -0
  190. package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
  191. package/dist/src/features/analytics/core/analytics-service.d.ts +29 -0
  192. package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
  193. package/dist/src/features/analytics/core/analytics-service.js +275 -0
  194. package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
  195. package/dist/src/features/analytics/index.d.ts +12 -0
  196. package/dist/src/features/analytics/index.d.ts.map +1 -0
  197. package/dist/src/features/analytics/index.js +11 -0
  198. package/dist/src/features/analytics/index.js.map +1 -0
  199. package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
  200. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
  201. package/dist/src/features/analytics/queries/metrics-queries.js +240 -0
  202. package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
  203. package/dist/src/features/analytics/types/metrics.d.ts +60 -0
  204. package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
  205. package/dist/src/features/analytics/types/metrics.js +2 -0
  206. package/dist/src/features/analytics/types/metrics.js.map +1 -0
  207. package/dist/src/features/browser/browser-mcp.d.ts +94 -0
  208. package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
  209. package/dist/src/features/browser/browser-mcp.js +459 -0
  210. package/dist/src/features/browser/browser-mcp.js.map +1 -0
  211. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +5 -0
  212. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +1 -0
  213. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +712 -0
  214. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +1 -0
  215. package/dist/src/features/tasks/pebbles-task-store.d.ts +121 -0
  216. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
  217. package/dist/src/features/tasks/pebbles-task-store.js +493 -0
  218. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
  219. package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
  220. package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
  221. package/dist/src/features/tasks/task-aware-context.js +412 -0
  222. package/dist/src/features/tasks/task-aware-context.js.map +1 -0
  223. package/dist/src/index.d.ts +4 -4
  224. package/dist/src/index.d.ts.map +1 -1
  225. package/dist/src/index.js +4 -4
  226. package/dist/src/index.js.map +1 -1
  227. package/dist/src/integrations/browser-mcp.d.ts +94 -0
  228. package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
  229. package/dist/src/integrations/browser-mcp.js +431 -0
  230. package/dist/src/integrations/browser-mcp.js.map +1 -0
  231. package/dist/src/integrations/linear/__tests__/auth.test.d.ts +5 -0
  232. package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +1 -0
  233. package/dist/src/integrations/linear/__tests__/auth.test.js +517 -0
  234. package/dist/src/integrations/linear/__tests__/auth.test.js.map +1 -0
  235. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +5 -0
  236. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +1 -0
  237. package/dist/src/integrations/linear/__tests__/sync-service.test.js +700 -0
  238. package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +1 -0
  239. package/dist/src/integrations/linear/auth.d.ts +99 -0
  240. package/dist/src/integrations/linear/auth.d.ts.map +1 -0
  241. package/dist/src/integrations/linear/auth.js +319 -0
  242. package/dist/src/integrations/linear/auth.js.map +1 -0
  243. package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
  244. package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
  245. package/dist/src/integrations/linear/auto-sync.js +268 -0
  246. package/dist/src/integrations/linear/auto-sync.js.map +1 -0
  247. package/dist/src/integrations/linear/client.d.ts +113 -0
  248. package/dist/src/integrations/linear/client.d.ts.map +1 -0
  249. package/dist/src/integrations/linear/client.js +364 -0
  250. package/dist/src/integrations/linear/client.js.map +1 -0
  251. package/dist/src/integrations/linear/config.d.ts +51 -0
  252. package/dist/src/integrations/linear/config.d.ts.map +1 -0
  253. package/dist/src/integrations/linear/config.js +103 -0
  254. package/dist/src/integrations/linear/config.js.map +1 -0
  255. package/dist/src/integrations/linear/sync-service.d.ts +25 -0
  256. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -0
  257. package/dist/src/integrations/linear/sync-service.js +198 -0
  258. package/dist/src/integrations/linear/sync-service.js.map +1 -0
  259. package/dist/src/integrations/linear/sync.d.ts +119 -0
  260. package/dist/src/integrations/linear/sync.d.ts.map +1 -0
  261. package/dist/src/integrations/linear/sync.js +538 -0
  262. package/dist/src/integrations/linear/sync.js.map +1 -0
  263. package/dist/src/integrations/linear/types.d.ts +75 -0
  264. package/dist/src/integrations/linear/types.d.ts.map +1 -0
  265. package/dist/src/integrations/linear/types.js +2 -0
  266. package/dist/src/integrations/linear/types.js.map +1 -0
  267. package/dist/src/integrations/linear/webhook-server.d.ts +32 -0
  268. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -0
  269. package/dist/src/integrations/linear/webhook-server.js +188 -0
  270. package/dist/src/integrations/linear/webhook-server.js.map +1 -0
  271. package/dist/src/integrations/linear/webhook.d.ts +95 -0
  272. package/dist/src/integrations/linear/webhook.d.ts.map +1 -0
  273. package/dist/src/integrations/linear/webhook.js +204 -0
  274. package/dist/src/integrations/linear/webhook.js.map +1 -0
  275. package/dist/src/integrations/mcp/__tests__/server.test.d.ts +5 -0
  276. package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +1 -0
  277. package/dist/src/integrations/mcp/__tests__/server.test.js +790 -0
  278. package/dist/src/integrations/mcp/__tests__/server.test.js.map +1 -0
  279. package/dist/src/integrations/mcp/server.d.ts +46 -0
  280. package/dist/src/integrations/mcp/server.d.ts.map +1 -0
  281. package/dist/src/integrations/mcp/server.js +1264 -0
  282. package/dist/src/integrations/mcp/server.js.map +1 -0
  283. package/dist/src/mcp/mcp-server.d.ts +1 -0
  284. package/dist/src/mcp/mcp-server.d.ts.map +1 -1
  285. package/dist/src/mcp/mcp-server.js +11 -0
  286. package/dist/src/mcp/mcp-server.js.map +1 -1
  287. package/dist/src/railway/index.d.ts +7 -0
  288. package/dist/src/railway/index.d.ts.map +1 -0
  289. package/dist/src/railway/index.js +401 -0
  290. package/dist/src/railway/index.js.map +1 -0
  291. package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
  292. package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
  293. package/dist/src/runway/auth/auth-middleware.js +337 -0
  294. package/dist/src/runway/auth/auth-middleware.js.map +1 -0
  295. package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
  296. package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
  297. package/dist/src/runway/server/runway-mcp-server.js +601 -0
  298. package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
  299. package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
  300. package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
  301. package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
  302. package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
  303. package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
  304. package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
  305. package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
  306. package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
  307. package/dist/src/servers/production/auth-middleware.d.ts +66 -0
  308. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
  309. package/dist/src/servers/production/auth-middleware.js +346 -0
  310. package/dist/src/servers/production/auth-middleware.js.map +1 -0
  311. package/dist/src/servers/railway/index.d.ts +7 -0
  312. package/dist/src/servers/railway/index.d.ts.map +1 -0
  313. package/dist/src/servers/railway/index.js +401 -0
  314. package/dist/src/servers/railway/index.js.map +1 -0
  315. package/dist/src/services/config-service.d.ts +44 -0
  316. package/dist/src/services/config-service.d.ts.map +1 -0
  317. package/dist/src/services/config-service.js +61 -0
  318. package/dist/src/services/config-service.js.map +1 -0
  319. package/dist/src/services/context-service.d.ts +17 -0
  320. package/dist/src/services/context-service.d.ts.map +1 -0
  321. package/dist/src/services/context-service.js +88 -0
  322. package/dist/src/services/context-service.js.map +1 -0
  323. package/dist/src/types/task.d.ts +17 -0
  324. package/dist/src/types/task.d.ts.map +1 -0
  325. package/dist/src/types/task.js +2 -0
  326. package/dist/src/types/task.js.map +1 -0
  327. package/dist/src/utils/logger.d.ts +13 -0
  328. package/dist/src/utils/logger.d.ts.map +1 -0
  329. package/dist/src/utils/logger.js +52 -0
  330. package/dist/src/utils/logger.js.map +1 -0
  331. package/package.json +40 -5
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Tests for error handling system
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { StackMemoryError, DatabaseError, FrameError, ValidationError, ErrorCode, isRetryableError, getErrorMessage, wrapError, } from '../index.js';
6
+ import { retry, CircuitBreaker, withFallback, calculateBackoff, CircuitState, withTimeout, gracefulDegrade, } from '../recovery.js';
7
+ describe('Error Classes', () => {
8
+ describe('StackMemoryError', () => {
9
+ it('should create error with all properties', () => {
10
+ const error = new StackMemoryError({
11
+ code: ErrorCode.INTERNAL_ERROR,
12
+ message: 'Test error',
13
+ context: { key: 'value' },
14
+ isRetryable: true,
15
+ httpStatus: 500,
16
+ });
17
+ expect(error.code).toBe(ErrorCode.INTERNAL_ERROR);
18
+ expect(error.message).toBe('Test error');
19
+ expect(error.context).toEqual({ key: 'value' });
20
+ expect(error.isRetryable).toBe(true);
21
+ expect(error.httpStatus).toBe(500);
22
+ expect(error.timestamp).toBeInstanceOf(Date);
23
+ });
24
+ it('should serialize to JSON correctly', () => {
25
+ const error = new StackMemoryError({
26
+ code: ErrorCode.DB_CONNECTION_FAILED,
27
+ message: 'Connection failed',
28
+ });
29
+ const json = error.toJSON();
30
+ expect(json.code).toBe(ErrorCode.DB_CONNECTION_FAILED);
31
+ expect(json.message).toBe('Connection failed');
32
+ expect(json.timestamp).toBeDefined();
33
+ });
34
+ });
35
+ describe('DatabaseError', () => {
36
+ it('should be retryable for connection failures', () => {
37
+ const error = new DatabaseError('Connection lost', ErrorCode.DB_CONNECTION_FAILED);
38
+ expect(error.isRetryable).toBe(true);
39
+ });
40
+ it('should not be retryable for query failures', () => {
41
+ const error = new DatabaseError('Invalid SQL', ErrorCode.DB_QUERY_FAILED);
42
+ expect(error.isRetryable).toBe(false);
43
+ });
44
+ });
45
+ describe('Error Helpers', () => {
46
+ it('should identify retryable errors', () => {
47
+ const retryable = new DatabaseError('Connection lost', ErrorCode.DB_CONNECTION_FAILED);
48
+ const nonRetryable = new ValidationError('Invalid input');
49
+ expect(isRetryableError(retryable)).toBe(true);
50
+ expect(isRetryableError(nonRetryable)).toBe(false);
51
+ });
52
+ it('should identify retryable network errors', () => {
53
+ const networkError = new Error('ECONNREFUSED');
54
+ const timeoutError = new Error('Request timeout');
55
+ expect(isRetryableError(networkError)).toBe(true);
56
+ expect(isRetryableError(timeoutError)).toBe(true);
57
+ });
58
+ it('should extract error messages safely', () => {
59
+ expect(getErrorMessage(new Error('Test'))).toBe('Test');
60
+ expect(getErrorMessage('String error')).toBe('String error');
61
+ expect(getErrorMessage({ message: 'Object error' })).toBe('Object error');
62
+ expect(getErrorMessage(null)).toBe('An unknown error occurred');
63
+ expect(getErrorMessage(undefined)).toBe('An unknown error occurred');
64
+ });
65
+ it('should wrap errors correctly', () => {
66
+ const originalError = new Error('Original');
67
+ const wrapped = wrapError(originalError, 'Wrapped message', ErrorCode.INTERNAL_ERROR, { extra: 'context' });
68
+ expect(wrapped).toBeInstanceOf(StackMemoryError);
69
+ expect(wrapped.cause).toBe(originalError);
70
+ expect(wrapped.context).toEqual({ extra: 'context' });
71
+ });
72
+ it('should not double-wrap StackMemoryErrors', () => {
73
+ const stackError = new FrameError('Frame error');
74
+ const wrapped = wrapError(stackError, 'Default');
75
+ expect(wrapped).toBe(stackError);
76
+ });
77
+ });
78
+ });
79
+ describe('Recovery Utilities', () => {
80
+ beforeEach(() => {
81
+ vi.clearAllMocks();
82
+ });
83
+ describe('Retry Logic', () => {
84
+ it('should retry on failure', async () => {
85
+ let attempts = 0;
86
+ const fn = vi.fn(async () => {
87
+ attempts++;
88
+ if (attempts < 3) {
89
+ throw new DatabaseError('Connection lost', ErrorCode.DB_CONNECTION_FAILED);
90
+ }
91
+ return 'success';
92
+ });
93
+ const result = await retry(fn, {
94
+ maxAttempts: 3,
95
+ initialDelay: 10,
96
+ });
97
+ expect(result).toBe('success');
98
+ expect(fn).toHaveBeenCalledTimes(3);
99
+ });
100
+ it('should not retry non-retryable errors', async () => {
101
+ const fn = vi.fn(async () => {
102
+ throw new ValidationError('Invalid data');
103
+ });
104
+ await expect(retry(fn, { maxAttempts: 3 })).rejects.toThrow('Invalid data');
105
+ expect(fn).toHaveBeenCalledTimes(1);
106
+ });
107
+ it('should respect timeout', async () => {
108
+ const fn = vi.fn(async () => {
109
+ await new Promise(resolve => setTimeout(resolve, 1000));
110
+ return 'slow';
111
+ });
112
+ await expect(retry(fn, { timeout: 50 })).rejects.toThrow('Operation timed out');
113
+ });
114
+ it('should calculate backoff correctly', () => {
115
+ const delay1 = calculateBackoff(1, 100, 10000, 2);
116
+ const delay2 = calculateBackoff(2, 100, 10000, 2);
117
+ const delay3 = calculateBackoff(3, 100, 10000, 2);
118
+ // Base delays without jitter
119
+ expect(delay1).toBeGreaterThanOrEqual(100);
120
+ expect(delay1).toBeLessThanOrEqual(125); // With max 25% jitter
121
+ expect(delay2).toBeGreaterThanOrEqual(200);
122
+ expect(delay2).toBeLessThanOrEqual(250);
123
+ expect(delay3).toBeGreaterThanOrEqual(400);
124
+ expect(delay3).toBeLessThanOrEqual(500);
125
+ });
126
+ });
127
+ describe('Circuit Breaker', () => {
128
+ it('should open after threshold failures', async () => {
129
+ const breaker = new CircuitBreaker('test', {
130
+ failureThreshold: 2,
131
+ resetTimeout: 100,
132
+ });
133
+ const failingFn = vi.fn(async () => {
134
+ throw new Error('Failed');
135
+ });
136
+ // First two failures
137
+ await expect(breaker.execute(failingFn)).rejects.toThrow('Failed');
138
+ await expect(breaker.execute(failingFn)).rejects.toThrow('Failed');
139
+ // Circuit should be open
140
+ expect(breaker.getState()).toBe(CircuitState.OPEN);
141
+ // Next call should fail immediately
142
+ await expect(breaker.execute(failingFn)).rejects.toThrow('Circuit breaker test is OPEN');
143
+ expect(failingFn).toHaveBeenCalledTimes(2); // Not called on open circuit
144
+ });
145
+ it('should transition to half-open after timeout', async () => {
146
+ const breaker = new CircuitBreaker('test', {
147
+ failureThreshold: 1,
148
+ resetTimeout: 50,
149
+ halfOpenRequests: 1,
150
+ });
151
+ const fn = vi.fn(async () => {
152
+ throw new Error('Failed');
153
+ });
154
+ // Open the circuit
155
+ await expect(breaker.execute(fn)).rejects.toThrow();
156
+ expect(breaker.getState()).toBe(CircuitState.OPEN);
157
+ // Wait for reset timeout
158
+ await new Promise(resolve => setTimeout(resolve, 60));
159
+ // Should allow one request in half-open
160
+ const successFn = vi.fn(async () => 'success');
161
+ const result = await breaker.execute(successFn);
162
+ expect(result).toBe('success');
163
+ expect(breaker.getState()).toBe(CircuitState.CLOSED);
164
+ });
165
+ it('should reset manually', () => {
166
+ const breaker = new CircuitBreaker('test', {
167
+ failureThreshold: 1,
168
+ });
169
+ breaker.reset();
170
+ expect(breaker.getState()).toBe(CircuitState.CLOSED);
171
+ });
172
+ });
173
+ describe('Fallback Mechanism', () => {
174
+ it('should use fallback on primary failure', async () => {
175
+ const primary = vi.fn(async () => {
176
+ throw new Error('Primary failed');
177
+ });
178
+ const fallback1 = vi.fn(async () => 'fallback result');
179
+ const result = await withFallback(primary, [fallback1]);
180
+ expect(result).toBe('fallback result');
181
+ expect(primary).toHaveBeenCalledTimes(1);
182
+ expect(fallback1).toHaveBeenCalledTimes(1);
183
+ });
184
+ it('should try multiple fallbacks', async () => {
185
+ const primary = vi.fn(async () => {
186
+ throw new Error('Primary failed');
187
+ });
188
+ const fallback1 = vi.fn(async () => {
189
+ throw new Error('Fallback1 failed');
190
+ });
191
+ const fallback2 = vi.fn(async () => 'fallback2 result');
192
+ const result = await withFallback(primary, [fallback1, fallback2]);
193
+ expect(result).toBe('fallback2 result');
194
+ expect(fallback1).toHaveBeenCalledTimes(1);
195
+ expect(fallback2).toHaveBeenCalledTimes(1);
196
+ });
197
+ it('should throw if all attempts fail', async () => {
198
+ const primary = vi.fn(async () => {
199
+ throw new Error('Primary');
200
+ });
201
+ const fallback = vi.fn(async () => {
202
+ throw new Error('Fallback');
203
+ });
204
+ await expect(withFallback(primary, [fallback])).rejects.toThrow('All attempts failed');
205
+ });
206
+ });
207
+ describe('Timeout Wrapper', () => {
208
+ it('should timeout long operations', async () => {
209
+ const slowFn = async () => {
210
+ await new Promise(resolve => setTimeout(resolve, 1000));
211
+ return 'slow';
212
+ };
213
+ await expect(withTimeout(slowFn, 50, 'Custom timeout')).rejects.toThrow('Custom timeout');
214
+ });
215
+ it('should complete fast operations', async () => {
216
+ const fastFn = async () => {
217
+ await new Promise(resolve => setTimeout(resolve, 10));
218
+ return 'fast';
219
+ };
220
+ const result = await withTimeout(fastFn, 100);
221
+ expect(result).toBe('fast');
222
+ });
223
+ });
224
+ describe('Graceful Degradation', () => {
225
+ it('should return default on failure', async () => {
226
+ const failingFn = vi.fn(async () => {
227
+ throw new Error('Failed');
228
+ });
229
+ const result = await gracefulDegrade(failingFn, 'default');
230
+ expect(result).toBe('default');
231
+ });
232
+ it('should return result on success', async () => {
233
+ const successFn = vi.fn(async () => 'success');
234
+ const result = await gracefulDegrade(successFn, 'default');
235
+ expect(result).toBe('success');
236
+ });
237
+ });
238
+ });
239
+ //# sourceMappingURL=error-handling.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handling.test.js","sourceRoot":"","sources":["../../../../../src/core/errors/__tests__/error-handling.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Custom error classes for StackMemory
3
+ * Provides a hierarchy of error types for better error handling and debugging
4
+ */
5
+ export declare enum ErrorCode {
6
+ DB_CONNECTION_FAILED = "DB_001",
7
+ DB_QUERY_FAILED = "DB_002",
8
+ DB_TRANSACTION_FAILED = "DB_003",
9
+ DB_MIGRATION_FAILED = "DB_004",
10
+ DB_CONSTRAINT_VIOLATION = "DB_005",
11
+ FRAME_NOT_FOUND = "FRAME_001",
12
+ FRAME_INVALID_STATE = "FRAME_002",
13
+ FRAME_PARENT_NOT_FOUND = "FRAME_003",
14
+ FRAME_CYCLE_DETECTED = "FRAME_004",
15
+ FRAME_ALREADY_CLOSED = "FRAME_005",
16
+ TASK_NOT_FOUND = "TASK_001",
17
+ TASK_INVALID_STATE = "TASK_002",
18
+ TASK_DEPENDENCY_CONFLICT = "TASK_003",
19
+ TASK_CIRCULAR_DEPENDENCY = "TASK_004",
20
+ LINEAR_AUTH_FAILED = "LINEAR_001",
21
+ LINEAR_API_ERROR = "LINEAR_002",
22
+ LINEAR_SYNC_FAILED = "LINEAR_003",
23
+ LINEAR_WEBHOOK_FAILED = "LINEAR_004",
24
+ MCP_TOOL_NOT_FOUND = "MCP_001",
25
+ MCP_INVALID_PARAMS = "MCP_002",
26
+ MCP_EXECUTION_FAILED = "MCP_003",
27
+ MCP_RATE_LIMITED = "MCP_004",
28
+ PROJECT_NOT_FOUND = "PROJECT_001",
29
+ PROJECT_INVALID_PATH = "PROJECT_002",
30
+ PROJECT_GIT_ERROR = "PROJECT_003",
31
+ VALIDATION_FAILED = "VAL_001",
32
+ INVALID_INPUT = "VAL_002",
33
+ MISSING_REQUIRED_FIELD = "VAL_003",
34
+ TYPE_MISMATCH = "VAL_004",
35
+ INITIALIZATION_ERROR = "SYS_001",
36
+ NOT_FOUND = "SYS_002",
37
+ INTERNAL_ERROR = "SYS_001",
38
+ CONFIGURATION_ERROR = "SYS_002",
39
+ PERMISSION_DENIED = "SYS_003",
40
+ RESOURCE_EXHAUSTED = "SYS_004",
41
+ SERVICE_UNAVAILABLE = "SYS_005"
42
+ }
43
+ export interface ErrorContext {
44
+ [key: string]: unknown;
45
+ }
46
+ export interface StackMemoryErrorOptions {
47
+ code: ErrorCode;
48
+ message: string;
49
+ context?: ErrorContext;
50
+ cause?: Error;
51
+ isRetryable?: boolean;
52
+ httpStatus?: number;
53
+ }
54
+ /**
55
+ * Base error class for all StackMemory errors
56
+ */
57
+ export declare class StackMemoryError extends Error {
58
+ readonly code: ErrorCode;
59
+ readonly context?: ErrorContext;
60
+ readonly cause?: Error;
61
+ readonly isRetryable: boolean;
62
+ readonly httpStatus: number;
63
+ readonly timestamp: Date;
64
+ constructor(options: StackMemoryErrorOptions);
65
+ toJSON(): Record<string, unknown>;
66
+ }
67
+ /**
68
+ * Database-related errors
69
+ */
70
+ export declare class DatabaseError extends StackMemoryError {
71
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext, cause?: Error);
72
+ }
73
+ /**
74
+ * Frame-related errors
75
+ */
76
+ export declare class FrameError extends StackMemoryError {
77
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext);
78
+ }
79
+ /**
80
+ * Task-related errors
81
+ */
82
+ export declare class TaskError extends StackMemoryError {
83
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext);
84
+ }
85
+ /**
86
+ * Integration errors (Linear, etc.)
87
+ */
88
+ export declare class IntegrationError extends StackMemoryError {
89
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext, cause?: Error);
90
+ }
91
+ /**
92
+ * MCP-related errors
93
+ */
94
+ export declare class MCPError extends StackMemoryError {
95
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext);
96
+ }
97
+ /**
98
+ * Validation errors
99
+ */
100
+ export declare class ValidationError extends StackMemoryError {
101
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext);
102
+ }
103
+ /**
104
+ * Project-related errors
105
+ */
106
+ export declare class ProjectError extends StackMemoryError {
107
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext);
108
+ }
109
+ /**
110
+ * System/Internal errors
111
+ */
112
+ export declare class SystemError extends StackMemoryError {
113
+ constructor(message: string, code?: ErrorCode, context?: ErrorContext, cause?: Error);
114
+ }
115
+ /**
116
+ * Helper function to determine if an error is retryable
117
+ */
118
+ export declare function isRetryableError(error: unknown): boolean;
119
+ /**
120
+ * Helper function to safely extract error message
121
+ */
122
+ export declare function getErrorMessage(error: unknown): string;
123
+ /**
124
+ * Helper function to wrap unknown errors in StackMemoryError
125
+ */
126
+ export declare function wrapError(error: unknown, defaultMessage: string, code?: ErrorCode, context?: ErrorContext): StackMemoryError;
127
+ /**
128
+ * Type guard to check if error is a StackMemoryError
129
+ */
130
+ export declare function isStackMemoryError(error: unknown): error is StackMemoryError;
131
+ /**
132
+ * Create context-aware error handler
133
+ */
134
+ export declare function createErrorHandler(defaultContext: ErrorContext): (error: unknown, additionalContext?: ErrorContext) => StackMemoryError;
135
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/errors/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Custom error classes for StackMemory
3
+ * Provides a hierarchy of error types for better error handling and debugging
4
+ */
5
+ export var ErrorCode;
6
+ (function (ErrorCode) {
7
+ // Database errors (1000-1999)
8
+ ErrorCode["DB_CONNECTION_FAILED"] = "DB_001";
9
+ ErrorCode["DB_QUERY_FAILED"] = "DB_002";
10
+ ErrorCode["DB_TRANSACTION_FAILED"] = "DB_003";
11
+ ErrorCode["DB_MIGRATION_FAILED"] = "DB_004";
12
+ ErrorCode["DB_CONSTRAINT_VIOLATION"] = "DB_005";
13
+ // Frame errors (2000-2999)
14
+ ErrorCode["FRAME_NOT_FOUND"] = "FRAME_001";
15
+ ErrorCode["FRAME_INVALID_STATE"] = "FRAME_002";
16
+ ErrorCode["FRAME_PARENT_NOT_FOUND"] = "FRAME_003";
17
+ ErrorCode["FRAME_CYCLE_DETECTED"] = "FRAME_004";
18
+ ErrorCode["FRAME_ALREADY_CLOSED"] = "FRAME_005";
19
+ // Task errors (3000-3999)
20
+ ErrorCode["TASK_NOT_FOUND"] = "TASK_001";
21
+ ErrorCode["TASK_INVALID_STATE"] = "TASK_002";
22
+ ErrorCode["TASK_DEPENDENCY_CONFLICT"] = "TASK_003";
23
+ ErrorCode["TASK_CIRCULAR_DEPENDENCY"] = "TASK_004";
24
+ // Integration errors (4000-4999)
25
+ ErrorCode["LINEAR_AUTH_FAILED"] = "LINEAR_001";
26
+ ErrorCode["LINEAR_API_ERROR"] = "LINEAR_002";
27
+ ErrorCode["LINEAR_SYNC_FAILED"] = "LINEAR_003";
28
+ ErrorCode["LINEAR_WEBHOOK_FAILED"] = "LINEAR_004";
29
+ // MCP errors (5000-5999)
30
+ ErrorCode["MCP_TOOL_NOT_FOUND"] = "MCP_001";
31
+ ErrorCode["MCP_INVALID_PARAMS"] = "MCP_002";
32
+ ErrorCode["MCP_EXECUTION_FAILED"] = "MCP_003";
33
+ ErrorCode["MCP_RATE_LIMITED"] = "MCP_004";
34
+ // Project errors (6000-6999)
35
+ ErrorCode["PROJECT_NOT_FOUND"] = "PROJECT_001";
36
+ ErrorCode["PROJECT_INVALID_PATH"] = "PROJECT_002";
37
+ ErrorCode["PROJECT_GIT_ERROR"] = "PROJECT_003";
38
+ // Validation errors (7000-7999)
39
+ ErrorCode["VALIDATION_FAILED"] = "VAL_001";
40
+ ErrorCode["INVALID_INPUT"] = "VAL_002";
41
+ ErrorCode["MISSING_REQUIRED_FIELD"] = "VAL_003";
42
+ ErrorCode["TYPE_MISMATCH"] = "VAL_004";
43
+ // System errors (8000-8999)
44
+ ErrorCode["INITIALIZATION_ERROR"] = "SYS_001";
45
+ ErrorCode["NOT_FOUND"] = "SYS_002";
46
+ ErrorCode["INTERNAL_ERROR"] = "SYS_001";
47
+ ErrorCode["CONFIGURATION_ERROR"] = "SYS_002";
48
+ ErrorCode["PERMISSION_DENIED"] = "SYS_003";
49
+ ErrorCode["RESOURCE_EXHAUSTED"] = "SYS_004";
50
+ ErrorCode["SERVICE_UNAVAILABLE"] = "SYS_005";
51
+ })(ErrorCode || (ErrorCode = {}));
52
+ /**
53
+ * Base error class for all StackMemory errors
54
+ */
55
+ export class StackMemoryError extends Error {
56
+ code;
57
+ context;
58
+ cause;
59
+ isRetryable;
60
+ httpStatus;
61
+ timestamp;
62
+ constructor(options) {
63
+ super(options.message);
64
+ this.name = this.constructor.name;
65
+ this.code = options.code;
66
+ this.context = options.context;
67
+ this.cause = options.cause;
68
+ this.isRetryable = options.isRetryable ?? false;
69
+ this.httpStatus = options.httpStatus ?? 500;
70
+ this.timestamp = new Date();
71
+ // Maintains proper stack trace for where our error was thrown
72
+ if (Error.captureStackTrace) {
73
+ Error.captureStackTrace(this, this.constructor);
74
+ }
75
+ }
76
+ toJSON() {
77
+ return {
78
+ name: this.name,
79
+ code: this.code,
80
+ message: this.message,
81
+ context: this.context,
82
+ isRetryable: this.isRetryable,
83
+ httpStatus: this.httpStatus,
84
+ timestamp: this.timestamp.toISOString(),
85
+ stack: this.stack,
86
+ cause: this.cause?.message,
87
+ };
88
+ }
89
+ }
90
+ /**
91
+ * Database-related errors
92
+ */
93
+ export class DatabaseError extends StackMemoryError {
94
+ constructor(message, code = ErrorCode.DB_QUERY_FAILED, context, cause) {
95
+ super({
96
+ code,
97
+ message,
98
+ context,
99
+ cause,
100
+ isRetryable: code === ErrorCode.DB_CONNECTION_FAILED,
101
+ httpStatus: 503,
102
+ });
103
+ }
104
+ }
105
+ /**
106
+ * Frame-related errors
107
+ */
108
+ export class FrameError extends StackMemoryError {
109
+ constructor(message, code = ErrorCode.FRAME_INVALID_STATE, context) {
110
+ super({
111
+ code,
112
+ message,
113
+ context,
114
+ isRetryable: false,
115
+ httpStatus: 400,
116
+ });
117
+ }
118
+ }
119
+ /**
120
+ * Task-related errors
121
+ */
122
+ export class TaskError extends StackMemoryError {
123
+ constructor(message, code = ErrorCode.TASK_INVALID_STATE, context) {
124
+ super({
125
+ code,
126
+ message,
127
+ context,
128
+ isRetryable: false,
129
+ httpStatus: 400,
130
+ });
131
+ }
132
+ }
133
+ /**
134
+ * Integration errors (Linear, etc.)
135
+ */
136
+ export class IntegrationError extends StackMemoryError {
137
+ constructor(message, code = ErrorCode.LINEAR_API_ERROR, context, cause) {
138
+ super({
139
+ code,
140
+ message,
141
+ context,
142
+ cause,
143
+ isRetryable: true,
144
+ httpStatus: 502,
145
+ });
146
+ }
147
+ }
148
+ /**
149
+ * MCP-related errors
150
+ */
151
+ export class MCPError extends StackMemoryError {
152
+ constructor(message, code = ErrorCode.MCP_EXECUTION_FAILED, context) {
153
+ super({
154
+ code,
155
+ message,
156
+ context,
157
+ isRetryable: code === ErrorCode.MCP_RATE_LIMITED,
158
+ httpStatus: code === ErrorCode.MCP_RATE_LIMITED ? 429 : 400,
159
+ });
160
+ }
161
+ }
162
+ /**
163
+ * Validation errors
164
+ */
165
+ export class ValidationError extends StackMemoryError {
166
+ constructor(message, code = ErrorCode.VALIDATION_FAILED, context) {
167
+ super({
168
+ code,
169
+ message,
170
+ context,
171
+ isRetryable: false,
172
+ httpStatus: 400,
173
+ });
174
+ }
175
+ }
176
+ /**
177
+ * Project-related errors
178
+ */
179
+ export class ProjectError extends StackMemoryError {
180
+ constructor(message, code = ErrorCode.PROJECT_NOT_FOUND, context) {
181
+ super({
182
+ code,
183
+ message,
184
+ context,
185
+ isRetryable: false,
186
+ httpStatus: 404,
187
+ });
188
+ }
189
+ }
190
+ /**
191
+ * System/Internal errors
192
+ */
193
+ export class SystemError extends StackMemoryError {
194
+ constructor(message, code = ErrorCode.INTERNAL_ERROR, context, cause) {
195
+ super({
196
+ code,
197
+ message,
198
+ context,
199
+ cause,
200
+ isRetryable: code === ErrorCode.SERVICE_UNAVAILABLE,
201
+ httpStatus: 500,
202
+ });
203
+ }
204
+ }
205
+ /**
206
+ * Helper function to determine if an error is retryable
207
+ */
208
+ export function isRetryableError(error) {
209
+ if (error instanceof StackMemoryError) {
210
+ return error.isRetryable;
211
+ }
212
+ // Check for common retryable error patterns
213
+ if (error instanceof Error) {
214
+ const message = error.message.toLowerCase();
215
+ return (message.includes('econnrefused') ||
216
+ message.includes('timeout') ||
217
+ message.includes('enotfound') ||
218
+ message.includes('socket hang up'));
219
+ }
220
+ return false;
221
+ }
222
+ /**
223
+ * Helper function to safely extract error message
224
+ */
225
+ export function getErrorMessage(error) {
226
+ if (error instanceof Error) {
227
+ return error.message;
228
+ }
229
+ if (typeof error === 'string') {
230
+ return error;
231
+ }
232
+ if (error && typeof error === 'object' && 'message' in error) {
233
+ return String(error.message);
234
+ }
235
+ return 'An unknown error occurred';
236
+ }
237
+ /**
238
+ * Helper function to wrap unknown errors in StackMemoryError
239
+ */
240
+ export function wrapError(error, defaultMessage, code = ErrorCode.INTERNAL_ERROR, context) {
241
+ if (error instanceof StackMemoryError) {
242
+ return error;
243
+ }
244
+ const cause = error instanceof Error ? error : undefined;
245
+ const message = error instanceof Error ? error.message : defaultMessage;
246
+ return new SystemError(message, code, context, cause);
247
+ }
248
+ /**
249
+ * Type guard to check if error is a StackMemoryError
250
+ */
251
+ export function isStackMemoryError(error) {
252
+ return error instanceof StackMemoryError;
253
+ }
254
+ /**
255
+ * Create context-aware error handler
256
+ */
257
+ export function createErrorHandler(defaultContext) {
258
+ return (error, additionalContext) => {
259
+ const context = { ...defaultContext, ...additionalContext };
260
+ if (error instanceof StackMemoryError) {
261
+ // Create a new error with merged context since context is readonly
262
+ return new StackMemoryError({
263
+ code: error.code,
264
+ message: error.message,
265
+ context: { ...error.context, ...context },
266
+ cause: error.cause,
267
+ isRetryable: error.isRetryable,
268
+ httpStatus: error.httpStatus,
269
+ });
270
+ }
271
+ return wrapError(error, getErrorMessage(error), ErrorCode.INTERNAL_ERROR, context);
272
+ };
273
+ }
274
+ //# sourceMappingURL=index.js.map