@stackmemoryai/stackmemory 0.8.1 → 1.0.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 (788) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +15 -3
  3. package/dist/src/agents/core/agent-task-manager.js +0 -1
  4. package/dist/src/agents/verifiers/base-verifier.js +0 -1
  5. package/dist/src/agents/verifiers/formatter-verifier.js +0 -1
  6. package/dist/src/agents/verifiers/llm-judge.js +0 -1
  7. package/dist/src/cli/auto-detect.js +0 -1
  8. package/dist/src/cli/claude-sm-danger.js +0 -1
  9. package/dist/src/cli/claude-sm.js +0 -1
  10. package/dist/src/cli/codex-sm-danger.js +0 -1
  11. package/dist/src/cli/codex-sm.js +0 -1
  12. package/dist/src/cli/commands/api.js +0 -1
  13. package/dist/src/cli/commands/auto-background.js +0 -1
  14. package/dist/src/cli/commands/cleanup-processes.js +0 -1
  15. package/dist/src/cli/commands/clear.js +0 -1
  16. package/dist/src/cli/commands/config.js +0 -1
  17. package/dist/src/cli/commands/context-rehydrate.js +0 -1
  18. package/dist/src/cli/commands/context.js +0 -1
  19. package/dist/src/cli/commands/daemon.js +0 -1
  20. package/dist/src/cli/commands/dashboard.js +4 -5
  21. package/dist/src/cli/commands/db.js +0 -1
  22. package/dist/src/cli/commands/decision.js +0 -1
  23. package/dist/src/cli/commands/discovery.js +0 -1
  24. package/dist/src/cli/commands/handoff.js +0 -1
  25. package/dist/src/cli/commands/hooks.js +0 -1
  26. package/dist/src/cli/commands/linear.js +0 -1
  27. package/dist/src/cli/commands/log.js +0 -1
  28. package/dist/src/cli/commands/login.js +0 -1
  29. package/dist/src/cli/commands/migrate.js +0 -1
  30. package/dist/src/cli/commands/model.js +0 -1
  31. package/dist/src/cli/commands/onboard.js +0 -1
  32. package/dist/src/cli/commands/ping.js +0 -1
  33. package/dist/src/cli/commands/projects.js +0 -1
  34. package/dist/src/cli/commands/ralph.js +0 -1
  35. package/dist/src/cli/commands/retrieval.js +0 -1
  36. package/dist/src/cli/commands/search.js +0 -1
  37. package/dist/src/cli/commands/service.js +0 -1
  38. package/dist/src/cli/commands/session.js +0 -1
  39. package/dist/src/cli/commands/setup.js +0 -4
  40. package/dist/src/cli/commands/shell.js +0 -1
  41. package/dist/src/cli/commands/signup.js +0 -1
  42. package/dist/src/cli/commands/skills.js +4 -3
  43. package/dist/src/cli/commands/storage-tier.js +0 -1
  44. package/dist/src/cli/commands/sweep.js +0 -1
  45. package/dist/src/cli/commands/tasks.js +0 -1
  46. package/dist/src/cli/commands/worktree.js +10 -5
  47. package/dist/src/cli/index.js +8 -5
  48. package/dist/src/cli/opencode-sm.js +0 -1
  49. package/dist/src/cli/utils/viewer.js +0 -1
  50. package/dist/src/core/config/config-manager.js +0 -1
  51. package/dist/src/core/config/feature-flags.js +0 -1
  52. package/dist/src/core/config/storage-config.js +0 -1
  53. package/dist/src/core/config/types.js +0 -1
  54. package/dist/src/core/context/auto-context.js +0 -1
  55. package/dist/src/core/context/dual-stack-manager.js +0 -1
  56. package/dist/src/core/context/enhanced-rehydration.js +0 -2
  57. package/dist/src/core/context/frame-database.js +60 -6
  58. package/dist/src/core/context/frame-digest.js +0 -1
  59. package/dist/src/core/context/frame-handoff-manager.js +0 -1
  60. package/dist/src/core/context/frame-lifecycle-hooks.js +0 -1
  61. package/dist/src/core/context/frame-recovery.js +0 -1
  62. package/dist/src/core/context/frame-stack.js +0 -1
  63. package/dist/src/core/context/frame-types.js +0 -1
  64. package/dist/src/core/context/index.js +0 -1
  65. package/dist/src/core/context/permission-manager.js +0 -1
  66. package/dist/src/core/context/recursive-context-manager.js +3 -2
  67. package/dist/src/core/context/refactored-frame-manager.js +0 -1
  68. package/dist/src/core/context/shared-context-layer.js +0 -1
  69. package/dist/src/core/context/stack-merge-resolver.js +0 -1
  70. package/dist/src/core/context/validation.js +0 -1
  71. package/dist/src/core/database/batch-operations.js +0 -1
  72. package/dist/src/core/database/connection-pool.js +0 -1
  73. package/dist/src/core/database/database-adapter.js +0 -1
  74. package/dist/src/core/database/embedding-provider-factory.js +0 -1
  75. package/dist/src/core/database/embedding-provider.js +0 -1
  76. package/dist/src/core/database/migration-manager.js +0 -1
  77. package/dist/src/core/database/ollama-embedding-provider.js +0 -1
  78. package/dist/src/core/database/openai-embedding-provider.js +0 -1
  79. package/dist/src/core/database/query-cache.js +0 -1
  80. package/dist/src/core/database/query-router.js +0 -1
  81. package/dist/src/core/database/sqlite-adapter.js +18 -108
  82. package/dist/src/core/database/transformers-embedding-provider.js +0 -1
  83. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -1
  84. package/dist/src/core/digest/frame-digest-integration.js +0 -1
  85. package/dist/src/core/digest/hybrid-digest-generator.js +0 -1
  86. package/dist/src/core/digest/index.js +0 -1
  87. package/dist/src/core/digest/types.js +0 -1
  88. package/dist/src/core/errors/error-utils.js +0 -1
  89. package/dist/src/core/errors/index.js +0 -1
  90. package/dist/src/core/errors/recovery.js +0 -1
  91. package/dist/src/core/execution/parallel-executor.js +0 -1
  92. package/dist/src/core/extensions/custom-tools.js +0 -1
  93. package/dist/src/core/extensions/index.js +0 -1
  94. package/dist/src/core/extensions/loader.js +0 -1
  95. package/dist/src/core/extensions/plugin-system.js +0 -1
  96. package/dist/src/core/extensions/provider-adapter.js +0 -1
  97. package/dist/src/core/extensions/sandbox-runtime.js +0 -1
  98. package/dist/src/core/extensions/types.js +0 -1
  99. package/dist/src/core/frame/workflow-templates.js +0 -1
  100. package/dist/src/core/merge/conflict-detector.js +0 -1
  101. package/dist/src/core/merge/index.js +0 -1
  102. package/dist/src/core/merge/resolution-engine.js +0 -1
  103. package/dist/src/core/merge/stack-diff.js +0 -1
  104. package/dist/src/core/merge/types.js +0 -1
  105. package/dist/src/core/merge/unified-merge-resolver.js +0 -1
  106. package/dist/src/core/models/fallback-monitor.js +0 -1
  107. package/dist/src/core/models/model-router.js +0 -1
  108. package/dist/src/core/monitoring/error-handler.js +0 -1
  109. package/dist/src/core/monitoring/logger.js +0 -1
  110. package/dist/src/core/monitoring/metrics.js +0 -1
  111. package/dist/src/core/monitoring/progress-tracker.js +0 -1
  112. package/dist/src/core/monitoring/session-monitor.js +0 -1
  113. package/dist/src/core/performance/context-cache.js +0 -1
  114. package/dist/src/core/performance/index.js +0 -1
  115. package/dist/src/core/performance/lazy-context-loader.js +3 -8
  116. package/dist/src/core/performance/monitor.js +0 -1
  117. package/dist/src/core/performance/optimized-frame-context.js +0 -1
  118. package/dist/src/core/performance/performance-benchmark.js +0 -1
  119. package/dist/src/core/performance/performance-profiler.js +0 -1
  120. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -1
  121. package/dist/src/core/persistence/postgres-adapter.js +0 -1
  122. package/dist/src/core/projects/project-isolation.js +0 -1
  123. package/dist/src/core/projects/project-manager.js +0 -1
  124. package/dist/src/core/query/query-parser.js +0 -1
  125. package/dist/src/core/query/query-templates.js +0 -1
  126. package/dist/src/core/retrieval/context-retriever.js +0 -1
  127. package/dist/src/core/retrieval/index.js +0 -1
  128. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -1
  129. package/dist/src/core/retrieval/llm-provider.js +0 -1
  130. package/dist/src/core/retrieval/privacy-filter.js +0 -1
  131. package/dist/src/core/retrieval/retrieval-audit.js +0 -1
  132. package/dist/src/core/retrieval/summary-generator.js +15 -6
  133. package/dist/src/core/retrieval/types.js +0 -1
  134. package/dist/src/core/retrieval/unified-context-assembler.js +0 -1
  135. package/dist/src/core/security/index.js +0 -1
  136. package/dist/src/core/security/input-sanitizer.js +0 -1
  137. package/dist/src/core/session/clear-survival.js +0 -1
  138. package/dist/src/core/session/enhanced-handoff.js +0 -1
  139. package/dist/src/core/session/handoff-generator.js +0 -1
  140. package/dist/src/core/session/index.js +0 -1
  141. package/dist/src/core/session/session-manager.js +0 -1
  142. package/dist/src/core/skills/index.js +0 -1
  143. package/dist/src/core/skills/skill-storage.js +0 -1
  144. package/dist/src/core/skills/types.js +0 -1
  145. package/dist/src/core/storage/chromadb-adapter.js +0 -1
  146. package/dist/src/core/storage/infinite-storage.js +0 -1
  147. package/dist/src/core/storage/project-registry.js +0 -1
  148. package/dist/src/core/storage/remote-storage.js +4 -2
  149. package/dist/src/core/storage/storage-tier-manager.js +0 -1
  150. package/dist/src/core/storage/two-tier-storage.js +0 -1
  151. package/dist/src/core/trace/cli-trace-wrapper.js +0 -1
  152. package/dist/src/core/trace/db-trace-wrapper.js +0 -1
  153. package/dist/src/core/trace/debug-trace.js +0 -1
  154. package/dist/src/core/trace/index.js +0 -1
  155. package/dist/src/core/trace/linear-api-wrapper.js +0 -1
  156. package/dist/src/core/trace/trace-detector.js +0 -1
  157. package/dist/src/core/trace/trace-store.js +4 -5
  158. package/dist/src/core/trace/types.js +0 -1
  159. package/dist/src/core/types.js +0 -1
  160. package/dist/src/core/utils/async-mutex.js +0 -1
  161. package/dist/src/core/utils/compression.js +0 -1
  162. package/dist/src/core/utils/update-checker.js +0 -1
  163. package/dist/src/core/worktree/worktree-manager.js +0 -1
  164. package/dist/src/daemon/daemon-config.js +0 -1
  165. package/dist/src/daemon/services/context-service.js +0 -1
  166. package/dist/src/daemon/services/linear-service.js +0 -1
  167. package/dist/src/daemon/services/maintenance-service.js +0 -1
  168. package/dist/src/daemon/services/memory-service.js +0 -1
  169. package/dist/src/daemon/session-daemon.js +0 -1
  170. package/dist/src/daemon/unified-daemon.js +0 -1
  171. package/dist/src/features/analytics/api/analytics-api.js +0 -1
  172. package/dist/src/features/analytics/core/analytics-service.js +1 -2
  173. package/dist/src/features/analytics/index.js +0 -1
  174. package/dist/src/features/analytics/queries/metrics-queries.js +8 -9
  175. package/dist/src/features/analytics/types/metrics.js +0 -1
  176. package/dist/src/features/browser/browser-mcp.js +0 -1
  177. package/dist/src/features/sweep/index.js +0 -1
  178. package/dist/src/features/sweep/prediction-client.js +0 -1
  179. package/dist/src/features/sweep/prompt-builder.js +0 -1
  180. package/dist/src/features/sweep/pty-wrapper.js +0 -1
  181. package/dist/src/features/sweep/state-watcher.js +0 -1
  182. package/dist/src/features/sweep/status-bar.js +0 -1
  183. package/dist/src/features/sweep/sweep-server-manager.js +0 -1
  184. package/dist/src/features/sweep/tab-interceptor.js +0 -1
  185. package/dist/src/features/sweep/types.js +0 -1
  186. package/dist/src/features/tasks/linear-task-manager.js +0 -1
  187. package/dist/src/features/tasks/task-aware-context.js +0 -1
  188. package/dist/src/features/tui/simple-monitor.js +0 -1
  189. package/dist/src/features/tui/swarm-monitor.js +0 -1
  190. package/dist/src/features/web/client/stores/task-store.js +0 -1
  191. package/dist/src/features/web/server/index.js +0 -1
  192. package/dist/src/features/workers/tmux-manager.js +0 -1
  193. package/dist/src/features/workers/worker-registry.js +0 -1
  194. package/dist/src/hooks/auto-background.js +0 -1
  195. package/dist/src/hooks/config.js +0 -1
  196. package/dist/src/hooks/daemon.js +0 -1
  197. package/dist/src/hooks/diffmem-hooks.js +0 -1
  198. package/dist/src/hooks/events.js +0 -1
  199. package/dist/src/hooks/index.js +0 -1
  200. package/dist/src/hooks/linear-task-picker.js +0 -1
  201. package/dist/src/hooks/schemas.js +0 -1
  202. package/dist/src/hooks/secure-fs.js +0 -1
  203. package/dist/src/hooks/security-logger.js +0 -1
  204. package/dist/src/hooks/session-summary.js +0 -1
  205. package/dist/src/index.js +0 -1
  206. package/dist/src/integrations/anthropic/client.js +0 -1
  207. package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
  208. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
  209. package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
  210. package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
  211. package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
  212. package/dist/src/integrations/claude-code/subagent-client.js +0 -1
  213. package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
  214. package/dist/src/integrations/diffmem/client.js +0 -1
  215. package/dist/src/integrations/diffmem/config.js +0 -1
  216. package/dist/src/integrations/diffmem/index.js +0 -1
  217. package/dist/src/integrations/diffmem/types.js +0 -1
  218. package/dist/src/integrations/linear/auth.js +0 -1
  219. package/dist/src/integrations/linear/auto-sync.js +0 -1
  220. package/dist/src/integrations/linear/client.js +0 -1
  221. package/dist/src/integrations/linear/config.js +0 -1
  222. package/dist/src/integrations/linear/migration.js +0 -1
  223. package/dist/src/integrations/linear/oauth-server.js +0 -1
  224. package/dist/src/integrations/linear/rest-client.js +0 -1
  225. package/dist/src/integrations/linear/sync-manager.js +0 -1
  226. package/dist/src/integrations/linear/sync-service.js +0 -1
  227. package/dist/src/integrations/linear/sync.js +0 -1
  228. package/dist/src/integrations/linear/types.js +0 -1
  229. package/dist/src/integrations/linear/unified-sync.js +0 -1
  230. package/dist/src/integrations/linear/webhook-handler.js +0 -1
  231. package/dist/src/integrations/linear/webhook-server.js +0 -1
  232. package/dist/src/integrations/linear/webhook.js +0 -1
  233. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
  234. package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
  235. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
  236. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
  237. package/dist/src/integrations/mcp/handlers/index.js +1 -3
  238. package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
  239. package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
  240. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
  241. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
  242. package/dist/src/integrations/mcp/index.js +0 -1
  243. package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
  244. package/dist/src/integrations/mcp/pending-utils.js +0 -1
  245. package/dist/src/integrations/mcp/refactored-server.js +0 -1
  246. package/dist/src/integrations/mcp/remote-server.js +0 -1
  247. package/dist/src/integrations/mcp/schemas.js +0 -1
  248. package/dist/src/integrations/mcp/server.js +20 -24
  249. package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
  250. package/dist/src/integrations/mcp/tool-definitions.js +0 -1
  251. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
  252. package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
  253. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
  254. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
  255. package/dist/src/integrations/ralph/index.js +0 -1
  256. package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
  257. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
  258. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
  259. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
  260. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
  261. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
  262. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
  263. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
  264. package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
  265. package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
  266. package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
  267. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
  268. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
  269. package/dist/src/integrations/ralph/types.js +0 -1
  270. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
  271. package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
  272. package/dist/src/middleware/exponential-rate-limiter.js +0 -1
  273. package/dist/src/models/user.model.js +0 -1
  274. package/dist/src/orchestrators/multimodal/constants.js +0 -1
  275. package/dist/src/orchestrators/multimodal/harness.js +0 -1
  276. package/dist/src/orchestrators/multimodal/providers.js +0 -1
  277. package/dist/src/orchestrators/multimodal/types.js +0 -1
  278. package/dist/src/orchestrators/multimodal/utils.js +0 -1
  279. package/dist/src/servers/production/auth-middleware.js +0 -1
  280. package/dist/src/services/config-service.js +0 -1
  281. package/dist/src/services/context-service.js +0 -1
  282. package/dist/src/skills/api-discovery.js +0 -1
  283. package/dist/src/skills/api-skill.js +0 -1
  284. package/dist/src/skills/claude-skills.js +0 -1
  285. package/dist/src/skills/dashboard-launcher.js +0 -1
  286. package/dist/src/skills/linear-task-runner.js +0 -1
  287. package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
  288. package/dist/src/skills/repo-ingestion-skill.js +0 -1
  289. package/dist/src/skills/spec-generator-skill.js +0 -1
  290. package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
  291. package/dist/src/types/task.js +0 -1
  292. package/dist/src/utils/env.js +0 -1
  293. package/dist/src/utils/formatting.js +0 -1
  294. package/dist/src/utils/process-cleanup.js +0 -1
  295. package/package.json +32 -7
  296. package/dist/scripts/benchmark-performance.js +0 -48
  297. package/dist/scripts/benchmark-performance.js.map +0 -7
  298. package/dist/scripts/check-redis.js +0 -42
  299. package/dist/scripts/check-redis.js.map +0 -7
  300. package/dist/scripts/initialize.js +0 -183
  301. package/dist/scripts/initialize.js.map +0 -7
  302. package/dist/scripts/list-linear-tasks.js +0 -124
  303. package/dist/scripts/list-linear-tasks.js.map +0 -7
  304. package/dist/scripts/measure-handoff-impact.js +0 -340
  305. package/dist/scripts/measure-handoff-impact.js.map +0 -7
  306. package/dist/scripts/query-chromadb.js +0 -160
  307. package/dist/scripts/query-chromadb.js.map +0 -7
  308. package/dist/scripts/show-linear-summary.js +0 -119
  309. package/dist/scripts/show-linear-summary.js.map +0 -7
  310. package/dist/scripts/simple-swarm-demo.js +0 -90
  311. package/dist/scripts/simple-swarm-demo.js.map +0 -7
  312. package/dist/scripts/status.js +0 -155
  313. package/dist/scripts/status.js.map +0 -7
  314. package/dist/scripts/test-chromadb-sync.js +0 -192
  315. package/dist/scripts/test-chromadb-sync.js.map +0 -7
  316. package/dist/scripts/test-ralph-iteration-fix.js +0 -86
  317. package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
  318. package/dist/scripts/test-ralph-iterations.js +0 -121
  319. package/dist/scripts/test-ralph-iterations.js.map +0 -7
  320. package/dist/scripts/test-redis-storage.js +0 -389
  321. package/dist/scripts/test-redis-storage.js.map +0 -7
  322. package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
  323. package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
  324. package/dist/scripts/test-swarm-fixes.js +0 -125
  325. package/dist/scripts/test-swarm-fixes.js.map +0 -7
  326. package/dist/scripts/test-swarm-tui.js +0 -23
  327. package/dist/scripts/test-swarm-tui.js.map +0 -7
  328. package/dist/scripts/test-tui-shortcuts.js +0 -52
  329. package/dist/scripts/test-tui-shortcuts.js.map +0 -7
  330. package/dist/scripts/validate-tui-shortcuts.js +0 -60
  331. package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
  332. package/dist/src/agents/core/agent-task-manager.js.map +0 -7
  333. package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
  334. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
  335. package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
  336. package/dist/src/cli/auto-detect.js.map +0 -7
  337. package/dist/src/cli/claude-sm-danger.js.map +0 -7
  338. package/dist/src/cli/claude-sm.js.map +0 -7
  339. package/dist/src/cli/codex-sm-danger.js.map +0 -7
  340. package/dist/src/cli/codex-sm.js.map +0 -7
  341. package/dist/src/cli/commands/api.js.map +0 -7
  342. package/dist/src/cli/commands/auto-background.js.map +0 -7
  343. package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
  344. package/dist/src/cli/commands/clear.js.map +0 -7
  345. package/dist/src/cli/commands/config.js.map +0 -7
  346. package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
  347. package/dist/src/cli/commands/context.js.map +0 -7
  348. package/dist/src/cli/commands/daemon.js.map +0 -7
  349. package/dist/src/cli/commands/dashboard.js.map +0 -7
  350. package/dist/src/cli/commands/db.js.map +0 -7
  351. package/dist/src/cli/commands/decision.js.map +0 -7
  352. package/dist/src/cli/commands/discovery.js.map +0 -7
  353. package/dist/src/cli/commands/handoff.js.map +0 -7
  354. package/dist/src/cli/commands/hooks.js.map +0 -7
  355. package/dist/src/cli/commands/linear.js.map +0 -7
  356. package/dist/src/cli/commands/log.js.map +0 -7
  357. package/dist/src/cli/commands/login.js.map +0 -7
  358. package/dist/src/cli/commands/migrate.js.map +0 -7
  359. package/dist/src/cli/commands/model.js.map +0 -7
  360. package/dist/src/cli/commands/onboard.js.map +0 -7
  361. package/dist/src/cli/commands/ping.js.map +0 -7
  362. package/dist/src/cli/commands/projects.js.map +0 -7
  363. package/dist/src/cli/commands/ralph.js.map +0 -7
  364. package/dist/src/cli/commands/retrieval.js.map +0 -7
  365. package/dist/src/cli/commands/search.js.map +0 -7
  366. package/dist/src/cli/commands/service.js.map +0 -7
  367. package/dist/src/cli/commands/session.js.map +0 -7
  368. package/dist/src/cli/commands/settings.js +0 -306
  369. package/dist/src/cli/commands/settings.js.map +0 -7
  370. package/dist/src/cli/commands/setup.js.map +0 -7
  371. package/dist/src/cli/commands/shell.js.map +0 -7
  372. package/dist/src/cli/commands/signup.js.map +0 -7
  373. package/dist/src/cli/commands/skills.js.map +0 -7
  374. package/dist/src/cli/commands/sms-notify.js +0 -795
  375. package/dist/src/cli/commands/sms-notify.js.map +0 -7
  376. package/dist/src/cli/commands/storage-tier.js.map +0 -7
  377. package/dist/src/cli/commands/sweep.js.map +0 -7
  378. package/dist/src/cli/commands/tasks.js.map +0 -7
  379. package/dist/src/cli/commands/worktree.js.map +0 -7
  380. package/dist/src/cli/index.js.map +0 -7
  381. package/dist/src/cli/opencode-sm.js.map +0 -7
  382. package/dist/src/cli/utils/viewer.js.map +0 -7
  383. package/dist/src/core/config/config-manager.js.map +0 -7
  384. package/dist/src/core/config/feature-flags.js.map +0 -7
  385. package/dist/src/core/config/storage-config.js.map +0 -7
  386. package/dist/src/core/config/types.js.map +0 -7
  387. package/dist/src/core/context/auto-context.js.map +0 -7
  388. package/dist/src/core/context/dual-stack-manager.js.map +0 -7
  389. package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
  390. package/dist/src/core/context/frame-database.js.map +0 -7
  391. package/dist/src/core/context/frame-digest.js.map +0 -7
  392. package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
  393. package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
  394. package/dist/src/core/context/frame-recovery.js.map +0 -7
  395. package/dist/src/core/context/frame-stack.js.map +0 -7
  396. package/dist/src/core/context/frame-types.js.map +0 -7
  397. package/dist/src/core/context/index.js.map +0 -7
  398. package/dist/src/core/context/permission-manager.js.map +0 -7
  399. package/dist/src/core/context/recursive-context-manager.js.map +0 -7
  400. package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
  401. package/dist/src/core/context/shared-context-layer.js.map +0 -7
  402. package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
  403. package/dist/src/core/context/validation.js.map +0 -7
  404. package/dist/src/core/database/batch-operations.js.map +0 -7
  405. package/dist/src/core/database/connection-pool.js.map +0 -7
  406. package/dist/src/core/database/database-adapter.js.map +0 -7
  407. package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
  408. package/dist/src/core/database/embedding-provider.js.map +0 -7
  409. package/dist/src/core/database/migration-manager.js.map +0 -7
  410. package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
  411. package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
  412. package/dist/src/core/database/query-cache.js.map +0 -7
  413. package/dist/src/core/database/query-router.js.map +0 -7
  414. package/dist/src/core/database/sqlite-adapter.js.map +0 -7
  415. package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
  416. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
  417. package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
  418. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
  419. package/dist/src/core/digest/index.js.map +0 -7
  420. package/dist/src/core/digest/types.js.map +0 -7
  421. package/dist/src/core/errors/error-utils.js.map +0 -7
  422. package/dist/src/core/errors/index.js.map +0 -7
  423. package/dist/src/core/errors/recovery.js.map +0 -7
  424. package/dist/src/core/execution/parallel-executor.js.map +0 -7
  425. package/dist/src/core/extensions/custom-tools.js.map +0 -7
  426. package/dist/src/core/extensions/index.js.map +0 -7
  427. package/dist/src/core/extensions/loader.js.map +0 -7
  428. package/dist/src/core/extensions/plugin-system.js.map +0 -7
  429. package/dist/src/core/extensions/provider-adapter.js.map +0 -7
  430. package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
  431. package/dist/src/core/extensions/types.js.map +0 -7
  432. package/dist/src/core/frame/workflow-templates.js.map +0 -7
  433. package/dist/src/core/merge/conflict-detector.js.map +0 -7
  434. package/dist/src/core/merge/index.js.map +0 -7
  435. package/dist/src/core/merge/resolution-engine.js.map +0 -7
  436. package/dist/src/core/merge/stack-diff.js.map +0 -7
  437. package/dist/src/core/merge/types.js.map +0 -7
  438. package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
  439. package/dist/src/core/models/fallback-monitor.js.map +0 -7
  440. package/dist/src/core/models/model-router.js.map +0 -7
  441. package/dist/src/core/monitoring/error-handler.js.map +0 -7
  442. package/dist/src/core/monitoring/logger.js.map +0 -7
  443. package/dist/src/core/monitoring/metrics.js.map +0 -7
  444. package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
  445. package/dist/src/core/monitoring/session-monitor.js.map +0 -7
  446. package/dist/src/core/performance/context-cache.js.map +0 -7
  447. package/dist/src/core/performance/index.js.map +0 -7
  448. package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
  449. package/dist/src/core/performance/monitor.js.map +0 -7
  450. package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
  451. package/dist/src/core/performance/performance-benchmark.js.map +0 -7
  452. package/dist/src/core/performance/performance-profiler.js.map +0 -7
  453. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
  454. package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
  455. package/dist/src/core/projects/project-isolation.js.map +0 -7
  456. package/dist/src/core/projects/project-manager.js.map +0 -7
  457. package/dist/src/core/query/query-parser.js.map +0 -7
  458. package/dist/src/core/query/query-templates.js.map +0 -7
  459. package/dist/src/core/retrieval/context-retriever.js.map +0 -7
  460. package/dist/src/core/retrieval/index.js.map +0 -7
  461. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
  462. package/dist/src/core/retrieval/llm-provider.js.map +0 -7
  463. package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
  464. package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
  465. package/dist/src/core/retrieval/summary-generator.js.map +0 -7
  466. package/dist/src/core/retrieval/types.js.map +0 -7
  467. package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
  468. package/dist/src/core/security/index.js.map +0 -7
  469. package/dist/src/core/security/input-sanitizer.js.map +0 -7
  470. package/dist/src/core/session/clear-survival.js.map +0 -7
  471. package/dist/src/core/session/enhanced-handoff.js.map +0 -7
  472. package/dist/src/core/session/handoff-generator.js.map +0 -7
  473. package/dist/src/core/session/index.js.map +0 -7
  474. package/dist/src/core/session/session-manager.js.map +0 -7
  475. package/dist/src/core/skills/index.js.map +0 -7
  476. package/dist/src/core/skills/skill-storage.js.map +0 -7
  477. package/dist/src/core/skills/types.js.map +0 -7
  478. package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
  479. package/dist/src/core/storage/infinite-storage.js.map +0 -7
  480. package/dist/src/core/storage/project-registry.js.map +0 -7
  481. package/dist/src/core/storage/remote-storage.js.map +0 -7
  482. package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
  483. package/dist/src/core/storage/two-tier-storage.js.map +0 -7
  484. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
  485. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
  486. package/dist/src/core/trace/debug-trace.js.map +0 -7
  487. package/dist/src/core/trace/index.js.map +0 -7
  488. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
  489. package/dist/src/core/trace/trace-detector.js.map +0 -7
  490. package/dist/src/core/trace/trace-store.js.map +0 -7
  491. package/dist/src/core/trace/types.js.map +0 -7
  492. package/dist/src/core/types.js.map +0 -7
  493. package/dist/src/core/utils/async-mutex.js.map +0 -7
  494. package/dist/src/core/utils/compression.js.map +0 -7
  495. package/dist/src/core/utils/update-checker.js.map +0 -7
  496. package/dist/src/core/worktree/worktree-manager.js.map +0 -7
  497. package/dist/src/daemon/daemon-config.js.map +0 -7
  498. package/dist/src/daemon/services/context-service.js.map +0 -7
  499. package/dist/src/daemon/services/linear-service.js.map +0 -7
  500. package/dist/src/daemon/services/maintenance-service.js.map +0 -7
  501. package/dist/src/daemon/services/memory-service.js.map +0 -7
  502. package/dist/src/daemon/session-daemon.js.map +0 -7
  503. package/dist/src/daemon/unified-daemon.js.map +0 -7
  504. package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
  505. package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
  506. package/dist/src/features/analytics/index.js.map +0 -7
  507. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
  508. package/dist/src/features/analytics/types/metrics.js.map +0 -7
  509. package/dist/src/features/browser/browser-mcp.js.map +0 -7
  510. package/dist/src/features/sweep/index.js.map +0 -7
  511. package/dist/src/features/sweep/prediction-client.js.map +0 -7
  512. package/dist/src/features/sweep/prompt-builder.js.map +0 -7
  513. package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
  514. package/dist/src/features/sweep/state-watcher.js.map +0 -7
  515. package/dist/src/features/sweep/status-bar.js.map +0 -7
  516. package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
  517. package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
  518. package/dist/src/features/sweep/types.js.map +0 -7
  519. package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
  520. package/dist/src/features/tasks/task-aware-context.js.map +0 -7
  521. package/dist/src/features/tui/simple-monitor.js.map +0 -7
  522. package/dist/src/features/tui/swarm-monitor.js.map +0 -7
  523. package/dist/src/features/web/client/stores/task-store.js.map +0 -7
  524. package/dist/src/features/web/server/index.js.map +0 -7
  525. package/dist/src/features/workers/tmux-manager.js.map +0 -7
  526. package/dist/src/features/workers/worker-registry.js.map +0 -7
  527. package/dist/src/hooks/auto-background.js.map +0 -7
  528. package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
  529. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
  530. package/dist/src/hooks/config.js.map +0 -7
  531. package/dist/src/hooks/daemon.js.map +0 -7
  532. package/dist/src/hooks/diffmem-hooks.js.map +0 -7
  533. package/dist/src/hooks/events.js.map +0 -7
  534. package/dist/src/hooks/index.js.map +0 -7
  535. package/dist/src/hooks/linear-task-picker.js.map +0 -7
  536. package/dist/src/hooks/schemas.js.map +0 -7
  537. package/dist/src/hooks/secure-fs.js.map +0 -7
  538. package/dist/src/hooks/security-logger.js.map +0 -7
  539. package/dist/src/hooks/session-summary.js.map +0 -7
  540. package/dist/src/hooks/sms-action-runner.js +0 -371
  541. package/dist/src/hooks/sms-action-runner.js.map +0 -7
  542. package/dist/src/hooks/sms-notify.js +0 -506
  543. package/dist/src/hooks/sms-notify.js.map +0 -7
  544. package/dist/src/hooks/sms-watcher.js +0 -93
  545. package/dist/src/hooks/sms-watcher.js.map +0 -7
  546. package/dist/src/hooks/sms-webhook.js +0 -555
  547. package/dist/src/hooks/sms-webhook.js.map +0 -7
  548. package/dist/src/hooks/whatsapp-commands.js +0 -479
  549. package/dist/src/hooks/whatsapp-commands.js.map +0 -7
  550. package/dist/src/hooks/whatsapp-scheduler.js +0 -317
  551. package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
  552. package/dist/src/hooks/whatsapp-sync.js +0 -409
  553. package/dist/src/hooks/whatsapp-sync.js.map +0 -7
  554. package/dist/src/index.js.map +0 -7
  555. package/dist/src/integrations/anthropic/client.js.map +0 -7
  556. package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
  557. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  558. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  559. package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
  560. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
  561. package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
  562. package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
  563. package/dist/src/integrations/diffmem/client.js.map +0 -7
  564. package/dist/src/integrations/diffmem/config.js.map +0 -7
  565. package/dist/src/integrations/diffmem/index.js.map +0 -7
  566. package/dist/src/integrations/diffmem/types.js.map +0 -7
  567. package/dist/src/integrations/linear/auth.js.map +0 -7
  568. package/dist/src/integrations/linear/auto-sync.js.map +0 -7
  569. package/dist/src/integrations/linear/client.js.map +0 -7
  570. package/dist/src/integrations/linear/config.js.map +0 -7
  571. package/dist/src/integrations/linear/migration.js.map +0 -7
  572. package/dist/src/integrations/linear/oauth-server.js.map +0 -7
  573. package/dist/src/integrations/linear/rest-client.js.map +0 -7
  574. package/dist/src/integrations/linear/sync-manager.js.map +0 -7
  575. package/dist/src/integrations/linear/sync-service.js.map +0 -7
  576. package/dist/src/integrations/linear/sync.js.map +0 -7
  577. package/dist/src/integrations/linear/types.js.map +0 -7
  578. package/dist/src/integrations/linear/unified-sync.js.map +0 -7
  579. package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
  580. package/dist/src/integrations/linear/webhook-server.js.map +0 -7
  581. package/dist/src/integrations/linear/webhook.js.map +0 -7
  582. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  583. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
  584. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
  585. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  586. package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
  587. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  588. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  589. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
  590. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  591. package/dist/src/integrations/mcp/index.js.map +0 -7
  592. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  593. package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
  594. package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
  595. package/dist/src/integrations/mcp/remote-server.js.map +0 -7
  596. package/dist/src/integrations/mcp/schemas.js.map +0 -7
  597. package/dist/src/integrations/mcp/server.js.map +0 -7
  598. package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
  599. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
  600. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  601. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
  602. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  603. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  604. package/dist/src/integrations/ralph/index.js.map +0 -7
  605. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
  606. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  607. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  608. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  609. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  610. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  611. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  612. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  613. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  614. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  615. package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
  616. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  617. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  618. package/dist/src/integrations/ralph/types.js.map +0 -7
  619. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  620. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
  621. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
  622. package/dist/src/models/user.model.js.map +0 -7
  623. package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
  624. package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
  625. package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
  626. package/dist/src/orchestrators/multimodal/types.js.map +0 -7
  627. package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
  628. package/dist/src/servers/production/auth-middleware.js.map +0 -7
  629. package/dist/src/services/config-service.js.map +0 -7
  630. package/dist/src/services/context-service.js.map +0 -7
  631. package/dist/src/skills/api-discovery.js.map +0 -7
  632. package/dist/src/skills/api-skill.js.map +0 -7
  633. package/dist/src/skills/claude-skills.js.map +0 -7
  634. package/dist/src/skills/dashboard-launcher.js.map +0 -7
  635. package/dist/src/skills/linear-task-runner.js.map +0 -7
  636. package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
  637. package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
  638. package/dist/src/skills/spec-generator-skill.js.map +0 -7
  639. package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
  640. package/dist/src/types/task.js.map +0 -7
  641. package/dist/src/utils/env.js.map +0 -7
  642. package/dist/src/utils/formatting.js.map +0 -7
  643. package/dist/src/utils/process-cleanup.js.map +0 -7
  644. package/scripts/README-TESTING.md +0 -186
  645. package/scripts/analyze-cli-security.js +0 -288
  646. package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
  647. package/scripts/archive/analyze-linear-duplicates.js +0 -214
  648. package/scripts/archive/analyze-remaining-duplicates.js +0 -230
  649. package/scripts/archive/analyze-sta-duplicates.js +0 -292
  650. package/scripts/archive/analyze-sta-graphql.js +0 -399
  651. package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
  652. package/scripts/archive/check-all-duplicates.ts +0 -419
  653. package/scripts/archive/clean-duplicate-tasks.js +0 -114
  654. package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
  655. package/scripts/archive/create-phase-tasks.js +0 -387
  656. package/scripts/archive/delete-linear-duplicates.js +0 -182
  657. package/scripts/archive/delete-remaining-duplicates.js +0 -158
  658. package/scripts/archive/delete-sta-duplicates.js +0 -201
  659. package/scripts/archive/delete-sta-oauth.js +0 -201
  660. package/scripts/archive/export-sta-tasks.js +0 -62
  661. package/scripts/archive/install-auto-sync.js +0 -266
  662. package/scripts/archive/install-chromadb-hooks.sh +0 -133
  663. package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
  664. package/scripts/archive/install-post-task-hooks.sh +0 -289
  665. package/scripts/archive/install-stackmemory-hooks.sh +0 -420
  666. package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
  667. package/scripts/archive/merge-linear-duplicates.ts +0 -182
  668. package/scripts/archive/remove-sta-tasks.js +0 -70
  669. package/scripts/archive/setup-background-sync.sh +0 -168
  670. package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
  671. package/scripts/archive/setup-claude-autostart.sh +0 -305
  672. package/scripts/archive/setup-git-hooks.sh +0 -25
  673. package/scripts/archive/setup-linear-oauth.sh +0 -46
  674. package/scripts/archive/setup-mcp.sh +0 -113
  675. package/scripts/archive/setup-railway-deployment.sh +0 -81
  676. package/scripts/auto-handoff.sh +0 -262
  677. package/scripts/background-sync-manager.js +0 -478
  678. package/scripts/benchmark-performance.ts +0 -57
  679. package/scripts/check-redis.ts +0 -48
  680. package/scripts/chromadb-auto-loader.sh +0 -128
  681. package/scripts/chromadb-context-loader.js +0 -479
  682. package/scripts/claude-chromadb-hook.js +0 -460
  683. package/scripts/claude-linear-skill.js +0 -455
  684. package/scripts/claude-pre-commit.sh +0 -302
  685. package/scripts/claude-sm-autostart.js +0 -579
  686. package/scripts/claude-with-chromadb.sh +0 -69
  687. package/scripts/clean-linear-backlog.js +0 -273
  688. package/scripts/cleanup-old-sessions.sh +0 -57
  689. package/scripts/create-cleanup-issues.js +0 -302
  690. package/scripts/create-sandbox.sh +0 -269
  691. package/scripts/debug-linear-update.js +0 -174
  692. package/scripts/delete-linear-tasks.js +0 -167
  693. package/scripts/demos/browser-test.ts +0 -39
  694. package/scripts/demos/ralph-integration-demo.ts +0 -245
  695. package/scripts/demos/trace-demo.ts +0 -200
  696. package/scripts/demos/trace-detector.demo.ts +0 -171
  697. package/scripts/demos/trace-test.ts +0 -79
  698. package/scripts/deploy-ralph-swarm.sh +0 -365
  699. package/scripts/deploy.sh +0 -89
  700. package/scripts/deployment/test-deployment.js +0 -194
  701. package/scripts/detect-and-rehydrate.js +0 -162
  702. package/scripts/detect-and-rehydrate.mjs +0 -165
  703. package/scripts/development/create-demo-tasks.js +0 -143
  704. package/scripts/development/debug-frame-test.js +0 -16
  705. package/scripts/development/demo-auto-sync.js +0 -128
  706. package/scripts/development/fix-all-imports.js +0 -213
  707. package/scripts/development/fix-imports.js +0 -229
  708. package/scripts/development/fix-lint-loop.cjs +0 -103
  709. package/scripts/development/fix-project-id.ts +0 -161
  710. package/scripts/development/fix-strict-mode-issues.ts +0 -291
  711. package/scripts/development/reorganize-structure.sh +0 -228
  712. package/scripts/development/test-persistence-direct.js +0 -148
  713. package/scripts/development/test-persistence.js +0 -114
  714. package/scripts/development/test-tasks.js +0 -93
  715. package/scripts/development/update-imports.js +0 -212
  716. package/scripts/fetch-linear-status.js +0 -125
  717. package/scripts/initialize.ts +0 -220
  718. package/scripts/linear-auto-sync.js +0 -262
  719. package/scripts/linear-auto-sync.sh +0 -161
  720. package/scripts/linear-sync-daemon.js +0 -150
  721. package/scripts/linear-task-review.js +0 -237
  722. package/scripts/list-linear-tasks.ts +0 -178
  723. package/scripts/mcp-proxy.js +0 -66
  724. package/scripts/measure-handoff-impact.mjs +0 -395
  725. package/scripts/measure-handoff-impact.ts +0 -450
  726. package/scripts/publish-local.js +0 -74
  727. package/scripts/query-chromadb.ts +0 -201
  728. package/scripts/ralph-integration-test.js +0 -274
  729. package/scripts/reconcile-local-tasks.js +0 -170
  730. package/scripts/recreate-frames-db.js +0 -89
  731. package/scripts/show-linear-summary.ts +0 -172
  732. package/scripts/simple-swarm-demo.ts +0 -114
  733. package/scripts/stackmemory-auto-handoff.sh +0 -231
  734. package/scripts/start-linear-sync-daemon.sh +0 -141
  735. package/scripts/start-temporal-paradox.sh +0 -214
  736. package/scripts/status.ts +0 -224
  737. package/scripts/stop-notify-webhook.sh +0 -19
  738. package/scripts/swarm-monitor.js +0 -509
  739. package/scripts/sync-and-clean-tasks.js +0 -258
  740. package/scripts/sync-linear-graphql.js +0 -303
  741. package/scripts/sync-linear-tasks.js +0 -186
  742. package/scripts/test-auto-triggers.sh +0 -57
  743. package/scripts/test-browser-mcp.js +0 -74
  744. package/scripts/test-chromadb-full.js +0 -115
  745. package/scripts/test-chromadb-hooks.sh +0 -28
  746. package/scripts/test-chromadb-sync.ts +0 -245
  747. package/scripts/test-claude-config.sh +0 -123
  748. package/scripts/test-cli-security.js +0 -293
  749. package/scripts/test-code-execution.js +0 -143
  750. package/scripts/test-hooks-persistence.sh +0 -220
  751. package/scripts/test-installation-scenarios.sh +0 -359
  752. package/scripts/test-installation.sh +0 -224
  753. package/scripts/test-mcp.js +0 -163
  754. package/scripts/test-parallel-swarms.js +0 -443
  755. package/scripts/test-pre-publish-quick.sh +0 -69
  756. package/scripts/test-quality-gates.sh +0 -263
  757. package/scripts/test-ralph-iteration-fix.ts +0 -118
  758. package/scripts/test-ralph-iterations.ts +0 -164
  759. package/scripts/test-redis-storage.ts +0 -490
  760. package/scripts/test-rlm-basic.sh +0 -122
  761. package/scripts/test-rlm-comprehensive.sh +0 -260
  762. package/scripts/test-rlm-e2e.sh +0 -268
  763. package/scripts/test-rlm-simple.js +0 -90
  764. package/scripts/test-rlm.js +0 -110
  765. package/scripts/test-session-handoff.sh +0 -165
  766. package/scripts/test-setup-e2e.sh +0 -154
  767. package/scripts/test-shell-integration.sh +0 -275
  768. package/scripts/test-simple-ralph-state-sync.ts +0 -178
  769. package/scripts/test-swarm-fixes.ts +0 -161
  770. package/scripts/test-swarm-git-workflow.js +0 -338
  771. package/scripts/test-swarm-tui.ts +0 -34
  772. package/scripts/test-tui-shortcuts.ts +0 -66
  773. package/scripts/testing/ab-test-runner.ts +0 -510
  774. package/scripts/testing/collect-metrics.ts +0 -457
  775. package/scripts/testing/quick-effectiveness-demo.js +0 -187
  776. package/scripts/testing/ralph-cli-test.js +0 -88
  777. package/scripts/testing/ralph-integration-validation.js +0 -727
  778. package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
  779. package/scripts/testing/real-performance-test.js +0 -422
  780. package/scripts/testing/results/real-performance-results.json +0 -90
  781. package/scripts/testing/run-effectiveness-tests.sh +0 -176
  782. package/scripts/testing/simple-effectiveness-test.js +0 -310
  783. package/scripts/testing/test-tier-migration.js +0 -100
  784. package/scripts/update-linear-status.js +0 -268
  785. package/scripts/update-linear-tasks-fixed.js +0 -284
  786. package/scripts/validate-claude-config.sh +0 -155
  787. package/scripts/validate-swarm-implementation.js +0 -467
  788. package/scripts/validate-tui-shortcuts.ts +0 -83
@@ -1,7 +0,0 @@
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 (DB_*)\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 DB_CORRUPTION = 'DB_010',\n\n // Frame errors (FRAME_*)\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 (TASK_*)\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 (LINEAR_*)\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 (MCP_*)\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 (PROJECT_*)\n PROJECT_NOT_FOUND = 'PROJECT_001',\n PROJECT_INVALID_PATH = 'PROJECT_002',\n PROJECT_GIT_ERROR = 'PROJECT_003',\n\n // Validation errors (VAL_*)\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 (SYS_*)\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 UNKNOWN_ERROR = 'SYS_009',\n OPERATION_TIMEOUT = 'SYS_010',\n\n // Authentication errors (AUTH_*)\n AUTH_FAILED = 'AUTH_001',\n TOKEN_EXPIRED = 'AUTH_002',\n INVALID_CREDENTIALS = 'AUTH_003',\n\n // File system errors (FS_*)\n FILE_NOT_FOUND = 'FS_001',\n DISK_FULL = 'FS_002',\n\n // Git errors (GIT_*)\n NOT_GIT_REPO = 'GIT_001',\n GIT_COMMAND_FAILED = 'GIT_002',\n INVALID_BRANCH = 'GIT_003',\n\n // Network errors (NET_*)\n NETWORK_ERROR = 'NET_001',\n API_ERROR = 'NET_002',\n\n // Collaboration errors (COLLAB_*)\n STACK_CONTEXT_NOT_FOUND = 'COLLAB_001',\n HANDOFF_REQUEST_EXPIRED = 'COLLAB_002',\n MERGE_CONFLICT_UNRESOLVABLE = 'COLLAB_003',\n PERMISSION_VIOLATION = 'COLLAB_004',\n OPERATION_FAILED = 'COLLAB_005',\n OPERATION_EXPIRED = 'COLLAB_006',\n INVALID_STATE = 'COLLAB_007',\n RESOURCE_NOT_FOUND = 'COLLAB_008',\n HANDOFF_ALREADY_EXISTS = 'COLLAB_009',\n MERGE_SESSION_INVALID = 'COLLAB_010',\n STACK_SWITCH_FAILED = 'COLLAB_011',\n APPROVAL_TIMEOUT = 'COLLAB_012',\n CONFLICT_RESOLUTION_FAILED = 'COLLAB_013',\n TEAM_ACCESS_DENIED = 'COLLAB_014',\n STACK_LIMIT_EXCEEDED = 'COLLAB_015',\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(\n error,\n getErrorMessage(error),\n ErrorCode.INTERNAL_ERROR,\n context\n );\n };\n}\n\n/**\n * User-friendly error messages for each error code\n */\nexport function getUserFriendlyMessage(code: ErrorCode): string {\n switch (code) {\n // Auth errors\n case ErrorCode.AUTH_FAILED:\n return 'Authentication failed. Please check your credentials and try again.';\n case ErrorCode.TOKEN_EXPIRED:\n return 'Your session has expired. Please log in again.';\n case ErrorCode.INVALID_CREDENTIALS:\n return 'Invalid credentials provided. Please check and try again.';\n\n // File system errors\n case ErrorCode.FILE_NOT_FOUND:\n return 'The requested file or directory was not found.';\n case ErrorCode.PERMISSION_DENIED:\n return 'Permission denied. Please check file permissions or run with appropriate privileges.';\n case ErrorCode.DISK_FULL:\n return 'Insufficient disk space. Please free up space and try again.';\n\n // Git errors\n case ErrorCode.NOT_GIT_REPO:\n return 'This command requires a git repository. Please run it from within a git repository.';\n case ErrorCode.GIT_COMMAND_FAILED:\n return 'Git operation failed. Please ensure your repository is in a valid state.';\n case ErrorCode.INVALID_BRANCH:\n return 'Invalid branch specified. Please check the branch name and try again.';\n\n // Database errors\n case ErrorCode.DB_CONNECTION_FAILED:\n return 'Database connection failed. Please try again or contact support if the issue persists.';\n case ErrorCode.DB_QUERY_FAILED:\n return 'Database query failed. Please try again.';\n case ErrorCode.DB_CORRUPTION:\n return 'Database appears to be corrupted. Please contact support.';\n\n // Network errors\n case ErrorCode.NETWORK_ERROR:\n return 'Network error. Please check your internet connection and try again.';\n case ErrorCode.API_ERROR:\n return 'API request failed. Please try again later.';\n case ErrorCode.OPERATION_TIMEOUT:\n return 'The operation timed out. Please try again.';\n\n // Validation errors\n case ErrorCode.INVALID_INPUT:\n return 'Invalid input provided. Please check your command and try again.';\n case ErrorCode.VALIDATION_FAILED:\n return 'Validation failed. Please check your input and try again.';\n case ErrorCode.MISSING_REQUIRED_FIELD:\n return 'A required field is missing. Please provide all required information.';\n\n // System errors\n case ErrorCode.CONFIGURATION_ERROR:\n return 'Configuration error. Please check your settings.';\n case ErrorCode.SERVICE_UNAVAILABLE:\n return 'Service is temporarily unavailable. Please try again later.';\n\n // Default\n default:\n return 'An unexpected error occurred. Please try again or contact support.';\n }\n}\n\n/**\n * ErrorHandler provides utilities for handling errors in CLI context\n */\nexport class ErrorHandler {\n private static retryMap = new Map<string, number>();\n private static readonly MAX_RETRIES = 3;\n\n /**\n * Handle an error and exit the process\n */\n static handle(error: unknown, operation: string): never {\n if (error instanceof StackMemoryError) {\n const userMessage = getUserFriendlyMessage(error.code);\n console.error(`\u274C ${userMessage}`);\n\n if (error.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n if (error instanceof Error) {\n let stackMemoryError: StackMemoryError;\n\n if ('code' in error && typeof error.code === 'string') {\n stackMemoryError = ErrorHandler.fromNodeError(\n error as NodeJS.ErrnoException,\n { operation }\n );\n } else {\n stackMemoryError = wrapError(\n error,\n error.message,\n ErrorCode.OPERATION_FAILED,\n {\n operation,\n }\n );\n }\n\n const userMessage = getUserFriendlyMessage(stackMemoryError.code);\n console.error(`\u274C ${userMessage}`);\n\n if (stackMemoryError.isRetryable) {\n console.error('\uD83D\uDCA1 This error may be recoverable. Please try again.');\n }\n\n process.exit(1);\n }\n\n // Unknown error type\n console.error('\u274C An unexpected error occurred.');\n process.exit(1);\n }\n\n /**\n * Convert Node.js error to StackMemoryError\n */\n static fromNodeError(\n nodeError: NodeJS.ErrnoException,\n context: ErrorContext = {}\n ): StackMemoryError {\n const code = nodeError.code;\n\n switch (code) {\n case 'ENOENT':\n return new SystemError(\n `File or directory not found: ${nodeError.path}`,\n ErrorCode.FILE_NOT_FOUND,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'EACCES':\n case 'EPERM':\n return new SystemError(\n `Permission denied: ${nodeError.path}`,\n ErrorCode.PERMISSION_DENIED,\n { ...context, path: nodeError.path },\n nodeError\n );\n\n case 'ENOSPC':\n return new SystemError(\n 'No space left on device',\n ErrorCode.DISK_FULL,\n context,\n nodeError\n );\n\n case 'ETIMEDOUT':\n return new SystemError(\n 'Operation timed out',\n ErrorCode.OPERATION_TIMEOUT,\n context,\n nodeError\n );\n\n default:\n return new SystemError(\n nodeError.message,\n ErrorCode.UNKNOWN_ERROR,\n { ...context, nodeErrorCode: code },\n nodeError\n );\n }\n }\n\n /**\n * Safely execute an operation with optional fallback\n */\n static async safeExecute<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n fallback?: T\n ): Promise<T | undefined> {\n try {\n return await operation();\n } catch (error: unknown) {\n if (fallback !== undefined) {\n return fallback;\n }\n ErrorHandler.handle(error, operationName);\n }\n }\n\n /**\n * Execute with automatic retry and exponential backoff\n */\n static async withRetry<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n maxRetries: number = ErrorHandler.MAX_RETRIES\n ): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const result = await operation();\n ErrorHandler.retryMap.delete(operationName);\n return result;\n } catch (error: unknown) {\n lastError = error;\n\n if (error instanceof StackMemoryError && !error.isRetryable) {\n ErrorHandler.handle(error, operationName);\n }\n\n if (attempt === maxRetries) {\n break;\n }\n\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n ErrorHandler.handle(\n lastError,\n `${operationName} (after ${maxRetries} attempts)`\n );\n }\n\n /**\n * Create a circuit breaker for an operation\n */\n static createCircuitBreaker<T>(\n operation: () => Promise<T> | T,\n operationName: string,\n threshold: number = 5\n ) {\n let failures = 0;\n let lastFailure = 0;\n const resetTimeout = 30000;\n\n return async (): Promise<T> => {\n const now = Date.now();\n\n if (now - lastFailure > resetTimeout) {\n failures = 0;\n }\n\n if (failures >= threshold) {\n throw new SystemError(\n `Circuit breaker open for '${operationName}'`,\n ErrorCode.SERVICE_UNAVAILABLE,\n { operationName, failures, threshold }\n );\n }\n\n try {\n const result = await operation();\n failures = 0;\n return result;\n } catch (error: unknown) {\n failures++;\n lastFailure = now;\n throw error;\n }\n };\n }\n}\n\n/**\n * Validation utilities\n */\nexport const validateInput = (\n value: unknown,\n name: string,\n validator: (val: unknown) => boolean\n): asserts value is NonNullable<unknown> => {\n if (!validator(value)) {\n throw new ValidationError(\n `Invalid ${name}: ${String(value)}`,\n ErrorCode.INVALID_INPUT,\n { name, value }\n );\n }\n};\n\nexport const validateEmail = (email: string): asserts email is string => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email) || email.length > 254) {\n throw new ValidationError(\n `Invalid email format: ${email}`,\n ErrorCode.INVALID_INPUT,\n { email }\n );\n }\n};\n\nexport const validatePath = (filePath: string): asserts filePath is string => {\n if (!filePath || filePath.includes('..') || filePath.includes('\\0')) {\n throw new ValidationError(\n `Invalid path: ${filePath}`,\n ErrorCode.INVALID_INPUT,\n { path: filePath }\n );\n }\n};\n\n// Re-export error utilities\nexport * from './error-utils.js';\n"],
5
- "mappings": "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",
6
- "names": ["ErrorCode"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/errors/recovery.ts"],
4
- "sourcesContent": ["/**\n * Error recovery utilities for StackMemory\n * Provides retry logic, circuit breakers, and fallback mechanisms\n */\n\nimport { logger } from '../monitoring/logger.js';\nimport {\n StackMemoryError,\n isRetryableError,\n getErrorMessage,\n ErrorContext,\n} from './index.js';\n\nexport interface RetryOptions {\n maxAttempts?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffFactor?: number;\n timeout?: number;\n onRetry?: (attempt: number, error: unknown) => void;\n}\n\nexport interface CircuitBreakerOptions {\n failureThreshold?: number;\n resetTimeout?: number;\n halfOpenRequests?: number;\n}\n\nexport enum CircuitState {\n CLOSED = 'closed',\n OPEN = 'open',\n HALF_OPEN = 'half_open',\n}\n\n/**\n * Exponential backoff with jitter\n */\nexport function calculateBackoff(\n attempt: number,\n initialDelay: number,\n maxDelay: number,\n factor: number\n): number {\n const exponentialDelay = Math.min(\n initialDelay * Math.pow(factor, attempt - 1),\n maxDelay\n );\n // Add jitter (0-25% of delay)\n const jitter = exponentialDelay * Math.random() * 0.25;\n return Math.floor(exponentialDelay + jitter);\n}\n\n/**\n * Retry with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const {\n maxAttempts = 3,\n initialDelay = 1000,\n maxDelay = 30000,\n backoffFactor = 2,\n timeout,\n onRetry,\n } = options;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n // Add timeout if specified\n if (timeout) {\n return await Promise.race([\n fn(),\n new Promise<T>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Operation timed out after ${timeout}ms`)),\n timeout\n )\n ),\n ]);\n }\n return await fn();\n } catch (error: unknown) {\n lastError = error;\n\n // Don't retry if not retryable or last attempt\n if (!isRetryableError(error) || attempt === maxAttempts) {\n throw error;\n }\n\n const delay = calculateBackoff(\n attempt,\n initialDelay,\n maxDelay,\n backoffFactor\n );\n\n logger.warn(`Retry attempt ${attempt}/${maxAttempts} after ${delay}ms`, {\n error: getErrorMessage(error),\n attempt,\n delay,\n });\n\n if (onRetry) {\n onRetry(attempt, error);\n }\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n\n/**\n * Circuit breaker implementation\n */\nexport class CircuitBreaker<T> {\n private state: CircuitState = CircuitState.CLOSED;\n private failures = 0;\n private successCount = 0;\n private lastFailTime?: Date;\n private readonly options: Required<CircuitBreakerOptions>;\n\n constructor(\n private readonly name: string,\n options: CircuitBreakerOptions = {}\n ) {\n this.options = {\n failureThreshold: options.failureThreshold ?? 5,\n resetTimeout: options.resetTimeout ?? 60000,\n halfOpenRequests: options.halfOpenRequests ?? 3,\n };\n }\n\n async execute<R = T>(fn: () => Promise<R>): Promise<R> {\n // Check if circuit should transition from OPEN to HALF_OPEN\n if (this.state === CircuitState.OPEN) {\n const timeSinceLastFailure = this.lastFailTime\n ? Date.now() - this.lastFailTime.getTime()\n : 0;\n\n if (timeSinceLastFailure >= this.options.resetTimeout) {\n this.state = CircuitState.HALF_OPEN;\n this.successCount = 0;\n logger.info(`Circuit breaker ${this.name} entering half-open state`);\n } else {\n throw new Error(\n `Circuit breaker ${this.name} is OPEN. Retry after ${\n this.options.resetTimeout - timeSinceLastFailure\n }ms`\n );\n }\n }\n\n try {\n const result = await fn();\n\n // Handle success\n if (this.state === CircuitState.HALF_OPEN) {\n this.successCount++;\n if (this.successCount >= this.options.halfOpenRequests) {\n this.state = CircuitState.CLOSED;\n this.failures = 0;\n logger.info(`Circuit breaker ${this.name} is now CLOSED`);\n }\n } else {\n this.failures = 0;\n }\n\n return result;\n } catch (error: unknown) {\n this.handleFailure(error);\n throw error;\n }\n }\n\n private handleFailure(error: unknown): void {\n this.failures++;\n this.lastFailTime = new Date();\n\n if (this.state === CircuitState.HALF_OPEN) {\n this.state = CircuitState.OPEN;\n logger.error(\n `Circuit breaker ${this.name} reopened due to failure in half-open state`\n );\n } else if (\n this.state === CircuitState.CLOSED &&\n this.failures >= this.options.failureThreshold\n ) {\n this.state = CircuitState.OPEN;\n logger.error(\n `Circuit breaker ${this.name} opened after ${this.failures} failures`\n );\n }\n }\n\n getState(): CircuitState {\n return this.state;\n }\n\n reset(): void {\n this.state = CircuitState.CLOSED;\n this.failures = 0;\n this.successCount = 0;\n this.lastFailTime = undefined;\n logger.info(`Circuit breaker ${this.name} manually reset`);\n }\n}\n\n/**\n * Fallback with multiple strategies\n */\nexport async function withFallback<T>(\n primary: () => Promise<T>,\n fallbacks: Array<() => Promise<T>>,\n context?: ErrorContext\n): Promise<T> {\n const errors: unknown[] = [];\n\n // Try primary\n try {\n return await primary();\n } catch (error: unknown) {\n errors.push(error);\n logger.warn('Primary operation failed, trying fallbacks', {\n error: getErrorMessage(error),\n context,\n });\n }\n\n // Try fallbacks in order\n for (let i = 0; i < fallbacks.length; i++) {\n try {\n const result = await fallbacks[i]();\n logger.info(`Fallback ${i + 1} succeeded`, { context });\n return result;\n } catch (error: unknown) {\n errors.push(error);\n if (i < fallbacks.length - 1) {\n logger.warn(`Fallback ${i + 1} failed, trying next`, {\n error: getErrorMessage(error),\n context,\n });\n }\n }\n }\n\n // All attempts failed\n throw new Error(\n `All attempts failed. Errors: ${errors.map(getErrorMessage).join(', ')}`\n );\n}\n\n/**\n * Bulkhead pattern - limit concurrent operations\n */\nexport class Bulkhead {\n private running = 0;\n private queue: Array<() => void> = [];\n\n constructor(\n private readonly name: string,\n private readonly maxConcurrent: number\n ) {}\n\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n if (this.running >= this.maxConcurrent) {\n await new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n this.running++;\n\n try {\n return await fn();\n } finally {\n this.running--;\n const next = this.queue.shift();\n if (next) {\n next();\n }\n }\n }\n\n getStats() {\n return {\n running: this.running,\n queued: this.queue.length,\n maxConcurrent: this.maxConcurrent,\n };\n }\n}\n\n/**\n * Timeout wrapper with proper cleanup\n */\nexport async function withTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n timeoutMessage?: string\n): Promise<T> {\n return Promise.race([\n fn(),\n new Promise<T>((_, reject) =>\n setTimeout(\n () =>\n reject(\n new Error(\n timeoutMessage ?? `Operation timed out after ${timeoutMs}ms`\n )\n ),\n timeoutMs\n )\n ),\n ]);\n}\n\n/**\n * Graceful degradation helper\n */\nexport async function gracefulDegrade<T, F>(\n fn: () => Promise<T>,\n defaultValue: F,\n logContext?: ErrorContext\n): Promise<T | F> {\n try {\n return await fn();\n } catch (error: unknown) {\n logger.warn('Operation failed, using default value', {\n error: getErrorMessage(error),\n ...logContext,\n });\n return defaultValue;\n }\n}\n\n/**\n * Create a resilient operation with multiple recovery strategies\n */\nexport function createResilientOperation<T>(\n name: string,\n options: {\n retry?: RetryOptions;\n circuitBreaker?: CircuitBreakerOptions;\n bulkhead?: number;\n timeout?: number;\n fallback?: () => Promise<T>;\n } = {}\n) {\n const circuitBreaker = options.circuitBreaker\n ? new CircuitBreaker<T>(name, options.circuitBreaker)\n : null;\n const bulkhead = options.bulkhead\n ? new Bulkhead(name, options.bulkhead)\n : null;\n\n return async (fn: () => Promise<T>): Promise<T> => {\n let currentFn = fn;\n\n // Wrap with bulkhead if configured\n if (bulkhead) {\n const wrapped = currentFn;\n currentFn = () => bulkhead.execute(wrapped);\n }\n\n // Wrap with timeout if configured\n if (options.timeout) {\n const wrapped = currentFn;\n currentFn = () => withTimeout(wrapped, options.timeout!);\n }\n\n // Wrap with retry if configured\n if (options.retry) {\n const wrapped = currentFn;\n currentFn = () => retry(wrapped, options.retry!);\n }\n\n // Wrap with circuit breaker if configured\n if (circuitBreaker) {\n const wrapped = currentFn;\n currentFn = () => circuitBreaker.execute(wrapped);\n }\n\n // Execute with fallback if configured\n if (options.fallback) {\n return withFallback(currentFn, [options.fallback]);\n }\n\n return currentFn();\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["CircuitState"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/execution/parallel-executor.ts"],
4
- "sourcesContent": ["/**\n * Parallel Execution Engine for RLM\n * \n * Manages concurrent execution of multiple Claude API calls\n * with rate limiting, resource pooling, and failure recovery\n */\n\nimport { EventEmitter } from 'events';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface ExecutionTask<T> {\n id: string;\n execute: () => Promise<T>;\n priority?: number;\n timeout?: number;\n retries?: number;\n}\n\nexport interface ExecutionResult<T> {\n taskId: string;\n success: boolean;\n result?: T;\n error?: Error;\n duration: number;\n attempts: number;\n}\n\nexport interface ParallelExecutorOptions {\n maxConcurrency?: number;\n queueSize?: number;\n defaultTimeout?: number;\n defaultRetries?: number;\n rateLimitPerMinute?: number;\n}\n\n/**\n * Parallel Executor for managing concurrent operations\n */\nexport class ParallelExecutor extends EventEmitter {\n private maxConcurrency: number;\n private queueSize: number;\n private defaultTimeout: number;\n private defaultRetries: number;\n private rateLimitPerMinute: number;\n \n private activeCount: number = 0;\n private queue: ExecutionTask<any>[] = [];\n private rateLimitTokens: number;\n private lastRateLimitReset: number;\n \n // Metrics\n private totalExecuted: number = 0;\n private totalSucceeded: number = 0;\n private totalFailed: number = 0;\n private totalDuration: number = 0;\n\n constructor(maxConcurrency: number = 5, options: ParallelExecutorOptions = {}) {\n super();\n \n this.maxConcurrency = maxConcurrency;\n this.queueSize = options.queueSize || 100;\n this.defaultTimeout = options.defaultTimeout || 300000; // 5 minutes\n this.defaultRetries = options.defaultRetries || 3;\n this.rateLimitPerMinute = options.rateLimitPerMinute || 60;\n \n this.rateLimitTokens = this.rateLimitPerMinute;\n this.lastRateLimitReset = Date.now();\n \n logger.info('Parallel Executor initialized', {\n maxConcurrency,\n queueSize: this.queueSize,\n rateLimitPerMinute: this.rateLimitPerMinute,\n });\n }\n \n /**\n * Execute multiple tasks in parallel\n */\n async executeParallel<T>(\n items: T[],\n executor: (item: T, index: number) => Promise<void>,\n options?: {\n batchSize?: number;\n delayBetweenBatches?: number;\n }\n ): Promise<ExecutionResult<void>[]> {\n const results: ExecutionResult<void>[] = [];\n const batchSize = options?.batchSize || this.maxConcurrency;\n const delayBetweenBatches = options?.delayBetweenBatches || 0;\n \n // Process items in batches\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize);\n const batchPromises = batch.map((item, index) => \n this.executeWithTracking(\n `parallel-${i + index}`,\n () => executor(item, i + index)\n )\n );\n \n const batchResults = await Promise.allSettled(batchPromises);\n \n // Convert to ExecutionResult format\n batchResults.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n results.push(result.value);\n } else {\n results.push({\n taskId: `parallel-${i + index}`,\n success: false,\n error: result.reason,\n duration: 0,\n attempts: 1,\n });\n }\n });\n \n // Delay between batches if specified\n if (delayBetweenBatches > 0 && i + batchSize < items.length) {\n await this.delay(delayBetweenBatches);\n }\n \n // Log batch progress\n logger.debug('Batch completed', {\n batchNumber: Math.floor(i / batchSize) + 1,\n totalBatches: Math.ceil(items.length / batchSize),\n successRate: results.filter(r => r.success).length / results.length,\n });\n }\n \n return results;\n }\n \n /**\n * Execute a single task with tracking and retries\n */\n async executeWithTracking<T>(\n taskId: string,\n executor: () => Promise<T>,\n options?: {\n timeout?: number;\n retries?: number;\n }\n ): Promise<ExecutionResult<T>> {\n const timeout = options?.timeout || this.defaultTimeout;\n const maxRetries = options?.retries || this.defaultRetries;\n \n let attempts = 0;\n let lastError: Error | undefined;\n const startTime = Date.now();\n \n while (attempts < maxRetries) {\n attempts++;\n \n try {\n // Check rate limit\n await this.checkRateLimit();\n \n // Wait for available slot\n await this.waitForSlot();\n \n this.activeCount++;\n this.emit('task-start', { taskId, attempt: attempts });\n \n // Execute with timeout\n const result = await this.executeWithTimeout(executor, timeout);\n \n // Success\n this.totalSucceeded++;\n this.emit('task-success', { taskId, attempts });\n \n return {\n taskId,\n success: true,\n result,\n duration: Date.now() - startTime,\n attempts,\n };\n \n } catch (error) {\n lastError = error as Error;\n \n logger.warn(`Task failed (attempt ${attempts}/${maxRetries})`, {\n taskId,\n error: lastError.message,\n });\n \n this.emit('task-retry', { taskId, attempt: attempts, error: lastError });\n \n // Exponential backoff for retries\n if (attempts < maxRetries) {\n await this.delay(Math.pow(2, attempts) * 1000);\n }\n \n } finally {\n this.activeCount--;\n this.totalExecuted++;\n this.totalDuration += Date.now() - startTime;\n }\n }\n \n // All retries exhausted\n this.totalFailed++;\n this.emit('task-failed', { taskId, attempts, error: lastError });\n \n return {\n taskId,\n success: false,\n error: lastError,\n duration: Date.now() - startTime,\n attempts,\n };\n }\n \n /**\n * Execute task with timeout\n */\n private async executeWithTimeout<T>(\n executor: () => Promise<T>,\n timeout: number\n ): Promise<T> {\n return Promise.race([\n executor(),\n new Promise<T>((_, reject) => \n setTimeout(() => reject(new Error('Task timeout')), timeout)\n ),\n ]);\n }\n \n /**\n * Check and enforce rate limiting\n */\n private async checkRateLimit(): Promise<void> {\n const now = Date.now();\n const timeSinceReset = now - this.lastRateLimitReset;\n \n // Reset tokens if a minute has passed\n if (timeSinceReset >= 60000) {\n this.rateLimitTokens = this.rateLimitPerMinute;\n this.lastRateLimitReset = now;\n }\n \n // Wait if no tokens available\n if (this.rateLimitTokens <= 0) {\n const waitTime = 60000 - timeSinceReset;\n logger.debug(`Rate limit reached, waiting ${waitTime}ms`);\n await this.delay(waitTime);\n \n // Reset after waiting\n this.rateLimitTokens = this.rateLimitPerMinute;\n this.lastRateLimitReset = Date.now();\n }\n \n this.rateLimitTokens--;\n }\n \n /**\n * Wait for an available execution slot\n */\n private async waitForSlot(): Promise<void> {\n while (this.activeCount >= this.maxConcurrency) {\n await this.delay(100); // Check every 100ms\n }\n }\n \n /**\n * Queue a task for execution\n */\n async queueTask<T>(task: ExecutionTask<T>): Promise<ExecutionResult<T>> {\n if (this.queue.length >= this.queueSize) {\n throw new Error('Execution queue is full');\n }\n \n return new Promise((resolve) => {\n this.queue.push({\n ...task,\n execute: async () => {\n const result = await task.execute();\n resolve({\n taskId: task.id,\n success: true,\n result,\n duration: 0,\n attempts: 1,\n });\n return result;\n },\n });\n \n this.processQueue();\n });\n }\n \n /**\n * Process queued tasks\n */\n private async processQueue(): Promise<void> {\n if (this.activeCount >= this.maxConcurrency || this.queue.length === 0) {\n return;\n }\n \n // Sort by priority (higher first)\n this.queue.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n \n const task = this.queue.shift();\n if (task) {\n this.executeWithTracking(task.id, task.execute, {\n timeout: task.timeout,\n retries: task.retries,\n }).then(() => {\n this.processQueue(); // Process next task\n });\n }\n }\n \n /**\n * Utility delay function\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n \n /**\n * Get execution metrics\n */\n getMetrics() {\n return {\n activeCount: this.activeCount,\n queueLength: this.queue.length,\n totalExecuted: this.totalExecuted,\n totalSucceeded: this.totalSucceeded,\n totalFailed: this.totalFailed,\n successRate: this.totalExecuted > 0 ? this.totalSucceeded / this.totalExecuted : 0,\n averageDuration: this.totalExecuted > 0 ? this.totalDuration / this.totalExecuted : 0,\n rateLimitTokens: this.rateLimitTokens,\n };\n }\n \n /**\n * Reset all metrics\n */\n resetMetrics(): void {\n this.totalExecuted = 0;\n this.totalSucceeded = 0;\n this.totalFailed = 0;\n this.totalDuration = 0;\n }\n \n /**\n * Gracefully shutdown executor\n */\n async shutdown(): Promise<void> {\n logger.info('Shutting down Parallel Executor', {\n activeCount: this.activeCount,\n queueLength: this.queue.length,\n });\n \n // Clear queue\n this.queue = [];\n \n // Wait for active tasks to complete\n while (this.activeCount > 0) {\n await this.delay(100);\n }\n \n logger.info('Parallel Executor shutdown complete');\n }\n}"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/extensions/custom-tools.ts"],
4
- "sourcesContent": ["/**\n * Custom Tools Framework for StackMemory\n * Provides a registry for user-defined tools that extend agent capabilities\n *\n * Based on the architecture defined in docs/architecture.md:\n * - Extensions run in a sandboxed environment for security\n * - Tools are registered with JSONSchema parameter validation\n * - ExtensionContext provides access to core StackMemory APIs\n *\n * This module extends the base extension types from types.ts with\n * additional runtime functionality for tool registration and execution.\n */\n\nimport { z } from 'zod';\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../monitoring/logger.js';\nimport {\n ValidationError,\n ErrorCode,\n StackMemoryError,\n SystemError,\n} from '../errors/index.js';\nimport type {\n ToolDefinition as BaseToolDefinition,\n ToolResult as BaseToolResult,\n JSONSchema as BaseJSONSchema,\n ExtensionContext as BaseExtensionContext,\n} from './types.js';\n\n// ============================================\n// Extended Types (building on types.ts)\n// ============================================\n\n/**\n * Extended JSON Schema with additional validation properties\n * Extends the base JSONSchema from types.ts\n */\nexport interface JSONSchema extends BaseJSONSchema {\n properties?: Record<string, JSONSchemaProperty>;\n additionalProperties?: boolean;\n}\n\nexport interface JSONSchemaProperty {\n type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'null';\n description?: string;\n enum?: (string | number | boolean)[];\n default?: unknown;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n items?: JSONSchemaProperty;\n properties?: Record<string, JSONSchemaProperty>;\n required?: string[];\n format?: string;\n}\n\n/**\n * Extended tool result with metadata\n */\nexport interface ToolResult extends BaseToolResult {\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Extended extension context for tool execution\n * Adds additional sandbox APIs beyond the base context\n */\nexport interface ExtensionContext {\n // Core access (read-only views)\n readonly projectId: string;\n readonly sessionId: string;\n readonly runId: string;\n\n // Sandbox APIs\n fetch: typeof fetch;\n storage: ExtensionStorage;\n\n // Communication\n emit(event: string, data: unknown): void;\n on(event: string, handler: (data: unknown) => void): () => void;\n\n // Logging (sandboxed)\n log: {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n };\n}\n\n/**\n * Simple key-value storage for extensions\n */\nexport interface ExtensionStorage {\n get(key: string): Promise<unknown>;\n set(key: string, value: unknown): Promise<void>;\n delete(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\n/**\n * Extended tool definition with metadata\n * Builds on the base ToolDefinition from types.ts\n */\nexport interface ToolDefinition {\n /** Unique tool name (alphanumeric with underscores, 3-64 chars) */\n name: string;\n\n /** Human-readable description for the tool */\n description: string;\n\n /** JSON Schema defining the tool's parameters */\n parameters: JSONSchema;\n\n /** Tool execution function */\n execute(\n params: unknown,\n context: ExtensionContext\n ): Promise<ToolResult> | ToolResult;\n\n /** Optional tool metadata */\n metadata?: {\n version?: string;\n author?: string;\n category?: string;\n tags?: string[];\n timeout?: number;\n permissions?: string[];\n };\n}\n\n/**\n * Registered tool with additional metadata\n */\ninterface RegisteredTool extends ToolDefinition {\n id: string;\n registeredAt: Date;\n lastUsedAt?: Date;\n usageCount: number;\n enabled: boolean;\n}\n\n/**\n * Tool execution options\n */\nexport interface ToolExecutionOptions {\n timeout?: number;\n sandboxed?: boolean;\n context?: Partial<ExtensionContext>;\n}\n\n// ============================================\n// Validation Schemas\n// ============================================\n\nconst ToolNameSchema = z\n .string()\n .min(3, 'Tool name must be at least 3 characters')\n .max(64, 'Tool name must be at most 64 characters')\n .regex(\n /^[a-z][a-z0-9_]*$/,\n 'Tool name must start with lowercase letter and contain only lowercase letters, numbers, and underscores'\n );\n\nconst JSONSchemaPropertySchema: z.ZodType<JSONSchemaProperty> = z.lazy(() =>\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'array', 'object', 'null']),\n description: z.string().optional(),\n enum: z.array(z.union([z.string(), z.number(), z.boolean()])).optional(),\n default: z.unknown().optional(),\n minimum: z.number().optional(),\n maximum: z.number().optional(),\n minLength: z.number().optional(),\n maxLength: z.number().optional(),\n pattern: z.string().optional(),\n items: JSONSchemaPropertySchema.optional(),\n properties: z.record(JSONSchemaPropertySchema).optional(),\n required: z.array(z.string()).optional(),\n format: z.string().optional(),\n })\n);\n\nconst JSONSchemaSchema = z.object({\n type: z.literal('object'),\n properties: z.record(JSONSchemaPropertySchema).optional(),\n required: z.array(z.string()).optional(),\n additionalProperties: z.boolean().optional(),\n description: z.string().optional(),\n default: z.unknown().optional(),\n});\n\nconst ToolMetadataSchema = z\n .object({\n version: z.string().optional(),\n author: z.string().optional(),\n category: z.string().optional(),\n tags: z.array(z.string()).optional(),\n timeout: z.number().min(100).max(300000).optional(),\n permissions: z.array(z.string()).optional(),\n })\n .optional();\n\n// ============================================\n// Tool Registry Implementation\n// ============================================\n\n/**\n * ToolRegistry manages registration, discovery, and execution of custom tools\n */\nexport class ToolRegistry {\n private tools: Map<string, RegisteredTool> = new Map();\n private eventListeners: Map<string, Set<(data: unknown) => void>> = new Map();\n private extensionStorage: Map<string, Map<string, unknown>> = new Map();\n private defaultTimeout: number = 30000; // 30 seconds\n\n constructor(options?: { defaultTimeout?: number }) {\n if (options?.defaultTimeout) {\n this.defaultTimeout = options.defaultTimeout;\n }\n logger.info('ToolRegistry initialized');\n }\n\n // ============================================\n // Registration\n // ============================================\n\n /**\n * Register a new custom tool\n * @throws ValidationError if tool definition is invalid\n * @throws StackMemoryError if tool with same name already exists\n */\n register(definition: ToolDefinition): string {\n // Validate tool definition\n this.validateToolDefinition(definition);\n\n // Check for duplicate\n if (this.tools.has(definition.name)) {\n throw new StackMemoryError({\n code: ErrorCode.VALIDATION_FAILED,\n message: `Tool '${definition.name}' is already registered`,\n context: { toolName: definition.name },\n });\n }\n\n const toolId = uuidv4();\n const registeredTool: RegisteredTool = {\n ...definition,\n id: toolId,\n registeredAt: new Date(),\n usageCount: 0,\n enabled: true,\n };\n\n this.tools.set(definition.name, registeredTool);\n\n logger.info('Tool registered', {\n toolId,\n name: definition.name,\n category: definition.metadata?.category,\n });\n\n return toolId;\n }\n\n /**\n * Unregister a tool by name\n */\n unregister(name: string): boolean {\n const tool = this.tools.get(name);\n if (!tool) {\n return false;\n }\n\n this.tools.delete(name);\n this.extensionStorage.delete(name);\n\n logger.info('Tool unregistered', { name, toolId: tool.id });\n return true;\n }\n\n /**\n * Update an existing tool definition\n */\n update(name: string, updates: Partial<ToolDefinition>): boolean {\n const tool = this.tools.get(name);\n if (!tool) {\n return false;\n }\n\n // Validate updates if parameters are being changed\n if (updates.parameters) {\n const result = JSONSchemaSchema.safeParse(updates.parameters);\n if (!result.success) {\n throw new ValidationError(\n `Invalid parameters schema: ${result.error.message}`,\n ErrorCode.VALIDATION_FAILED,\n { errors: result.error.errors }\n );\n }\n }\n\n // Apply updates\n Object.assign(tool, updates);\n\n logger.info('Tool updated', { name, toolId: tool.id });\n return true;\n }\n\n // ============================================\n // Discovery\n // ============================================\n\n /**\n * Get a tool by name\n */\n get(name: string): RegisteredTool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * List all registered tools\n */\n list(filter?: {\n category?: string;\n tags?: string[];\n enabled?: boolean;\n }): RegisteredTool[] {\n let tools = Array.from(this.tools.values());\n\n if (filter?.category) {\n tools = tools.filter((t) => t.metadata?.category === filter.category);\n }\n\n if (filter?.tags && filter.tags.length > 0) {\n tools = tools.filter((t) =>\n filter.tags!.some((tag) => t.metadata?.tags?.includes(tag))\n );\n }\n\n if (filter?.enabled !== undefined) {\n tools = tools.filter((t) => t.enabled === filter.enabled);\n }\n\n return tools;\n }\n\n /**\n * Get tool definitions in MCP format\n */\n getMCPToolDefinitions(): Array<{\n name: string;\n description: string;\n inputSchema: JSONSchema;\n }> {\n return Array.from(this.tools.values())\n .filter((t) => t.enabled)\n .map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.parameters,\n }));\n }\n\n /**\n * Check if a tool exists\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * Get tool count\n */\n get size(): number {\n return this.tools.size;\n }\n\n // ============================================\n // Execution\n // ============================================\n\n /**\n * Execute a tool with sandboxed context\n */\n async execute(\n name: string,\n params: unknown,\n options?: ToolExecutionOptions\n ): Promise<ToolResult> {\n const tool = this.tools.get(name);\n if (!tool) {\n return {\n success: false,\n error: `Tool '${name}' not found`,\n };\n }\n\n if (!tool.enabled) {\n return {\n success: false,\n error: `Tool '${name}' is disabled`,\n };\n }\n\n // Validate parameters against schema\n const validationResult = this.validateParams(params, tool.parameters);\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Invalid parameters: ${validationResult.errors.join(', ')}`,\n };\n }\n\n // Create sandboxed context\n const context = this.createSandboxedContext(name, options?.context);\n\n // Execute with timeout\n const timeout =\n options?.timeout ?? tool.metadata?.timeout ?? this.defaultTimeout;\n\n try {\n const result = await this.executeWithSandbox(\n () => tool.execute(params, context),\n timeout,\n options?.sandboxed ?? true\n );\n\n // Update usage stats\n tool.lastUsedAt = new Date();\n tool.usageCount++;\n\n logger.info('Tool executed successfully', {\n name,\n toolId: tool.id,\n duration: Date.now() - tool.lastUsedAt.getTime(),\n });\n\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Tool execution failed', {\n name,\n toolId: tool.id,\n error: message,\n });\n\n return {\n success: false,\n error: message,\n metadata: { toolId: tool.id },\n };\n }\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n /**\n * Validate a tool definition before registration\n */\n private validateToolDefinition(definition: ToolDefinition): void {\n // Validate name\n const nameResult = ToolNameSchema.safeParse(definition.name);\n if (!nameResult.success) {\n throw new ValidationError(\n `Invalid tool name: ${nameResult.error.message}`,\n ErrorCode.VALIDATION_FAILED,\n { name: definition.name, errors: nameResult.error.errors }\n );\n }\n\n // Validate description\n if (!definition.description || definition.description.length < 10) {\n throw new ValidationError(\n 'Tool description must be at least 10 characters',\n ErrorCode.VALIDATION_FAILED,\n { description: definition.description }\n );\n }\n\n if (definition.description.length > 500) {\n throw new ValidationError(\n 'Tool description must be at most 500 characters',\n ErrorCode.VALIDATION_FAILED,\n { descriptionLength: definition.description.length }\n );\n }\n\n // Validate parameters schema\n const schemaResult = JSONSchemaSchema.safeParse(definition.parameters);\n if (!schemaResult.success) {\n throw new ValidationError(\n `Invalid parameters schema: ${schemaResult.error.message}`,\n ErrorCode.VALIDATION_FAILED,\n { errors: schemaResult.error.errors }\n );\n }\n\n // Validate execute function\n if (typeof definition.execute !== 'function') {\n throw new ValidationError(\n 'Tool execute must be a function',\n ErrorCode.VALIDATION_FAILED\n );\n }\n\n // Validate metadata if present\n if (definition.metadata) {\n const metaResult = ToolMetadataSchema.safeParse(definition.metadata);\n if (!metaResult.success) {\n throw new ValidationError(\n `Invalid tool metadata: ${metaResult.error.message}`,\n ErrorCode.VALIDATION_FAILED,\n { errors: metaResult.error.errors }\n );\n }\n }\n }\n\n /**\n * Validate parameters against JSON Schema\n */\n private validateParams(\n params: unknown,\n schema: JSONSchema\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (schema.type !== 'object') {\n errors.push('Parameters schema must have type \"object\"');\n return { valid: false, errors };\n }\n\n if (params === null || params === undefined) {\n if (schema.required && schema.required.length > 0) {\n errors.push(\n `Missing required parameters: ${schema.required.join(', ')}`\n );\n }\n return { valid: errors.length === 0, errors };\n }\n\n if (typeof params !== 'object' || Array.isArray(params)) {\n errors.push('Parameters must be an object');\n return { valid: false, errors };\n }\n\n const paramObj = params as Record<string, unknown>;\n\n // Check required fields\n if (schema.required) {\n for (const field of schema.required) {\n if (!(field in paramObj)) {\n errors.push(`Missing required parameter: ${field}`);\n }\n }\n }\n\n // Validate each property\n if (schema.properties) {\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n if (key in paramObj) {\n const propErrors = this.validateProperty(\n paramObj[key],\n propSchema,\n key\n );\n errors.push(...propErrors);\n }\n }\n\n // Check for extra properties if not allowed\n if (schema.additionalProperties === false) {\n for (const key of Object.keys(paramObj)) {\n if (!(key in schema.properties)) {\n errors.push(`Unknown parameter: ${key}`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n /**\n * Validate a single property value\n */\n private validateProperty(\n value: unknown,\n schema: JSONSchemaProperty,\n path: string\n ): string[] {\n const errors: string[] = [];\n\n // Check type\n const actualType = this.getJSONType(value);\n if (actualType !== schema.type && value !== undefined && value !== null) {\n // Allow null if type is 'null'\n if (!(schema.type === 'null' && value === null)) {\n errors.push(\n `Parameter '${path}' must be of type ${schema.type}, got ${actualType}`\n );\n }\n }\n\n // Type-specific validations\n if (schema.type === 'string' && typeof value === 'string') {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n errors.push(\n `Parameter '${path}' must be at least ${schema.minLength} characters`\n );\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n errors.push(\n `Parameter '${path}' must be at most ${schema.maxLength} characters`\n );\n }\n if (schema.pattern && !new RegExp(schema.pattern).test(value)) {\n errors.push(\n `Parameter '${path}' does not match pattern ${schema.pattern}`\n );\n }\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(\n `Parameter '${path}' must be one of: ${schema.enum.join(', ')}`\n );\n }\n }\n\n if (schema.type === 'number' && typeof value === 'number') {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push(`Parameter '${path}' must be at least ${schema.minimum}`);\n }\n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push(`Parameter '${path}' must be at most ${schema.maximum}`);\n }\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(\n `Parameter '${path}' must be one of: ${schema.enum.join(', ')}`\n );\n }\n }\n\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n value.forEach((item, index) => {\n const itemErrors = this.validateProperty(\n item,\n schema.items!,\n `${path}[${index}]`\n );\n errors.push(...itemErrors);\n });\n }\n\n return errors;\n }\n\n /**\n * Get JSON type of a value\n */\n private getJSONType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n }\n\n /**\n * Create a sandboxed extension context\n */\n private createSandboxedContext(\n toolName: string,\n overrides?: Partial<ExtensionContext>\n ): ExtensionContext {\n // Get or create storage for this tool\n if (!this.extensionStorage.has(toolName)) {\n this.extensionStorage.set(toolName, new Map());\n }\n const storage = this.extensionStorage.get(toolName)!;\n\n const context: ExtensionContext = {\n projectId: overrides?.projectId ?? 'sandbox',\n sessionId: overrides?.sessionId ?? uuidv4(),\n runId: overrides?.runId ?? uuidv4(),\n\n // Sandboxed fetch (could add URL allowlist here)\n fetch: globalThis.fetch,\n\n // Extension storage\n storage: {\n async get(key: string): Promise<unknown> {\n return storage.get(key);\n },\n async set(key: string, value: unknown): Promise<void> {\n storage.set(key, value);\n },\n async delete(key: string): Promise<void> {\n storage.delete(key);\n },\n async clear(): Promise<void> {\n storage.clear();\n },\n },\n\n // Event communication\n emit: (event: string, data: unknown) => {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n logger.error('Event handler error', {\n event,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n }\n },\n\n on: (event: string, handler: (data: unknown) => void) => {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.eventListeners.get(event)?.delete(handler);\n };\n },\n\n // Sandboxed logging\n log: {\n info: (message: string, meta?: Record<string, unknown>) => {\n logger.info(`[Tool:${toolName}] ${message}`, meta);\n },\n warn: (message: string, meta?: Record<string, unknown>) => {\n logger.warn(`[Tool:${toolName}] ${message}`, meta);\n },\n error: (message: string, meta?: Record<string, unknown>) => {\n logger.error(`[Tool:${toolName}] ${message}`, meta);\n },\n },\n };\n\n return context;\n }\n\n /**\n * Execute tool with sandbox wrapper and timeout\n */\n private async executeWithSandbox(\n executor: () => Promise<ToolResult> | ToolResult,\n timeout: number,\n sandboxed: boolean\n ): Promise<ToolResult> {\n const timeoutPromise = new Promise<ToolResult>((_, reject) => {\n setTimeout(() => {\n reject(\n new SystemError(\n `Tool execution timed out after ${timeout}ms`,\n ErrorCode.OPERATION_TIMEOUT\n )\n );\n }, timeout);\n });\n\n const executionPromise = (async () => {\n try {\n if (sandboxed) {\n // In a real implementation, this could use a Worker or VM\n // For now, we execute directly with try/catch protection\n return await Promise.resolve(executor());\n } else {\n return await Promise.resolve(executor());\n }\n } catch (error) {\n if (error instanceof StackMemoryError) {\n throw error;\n }\n throw new SystemError(\n `Tool execution error: ${error instanceof Error ? error.message : String(error)}`,\n ErrorCode.MCP_EXECUTION_FAILED,\n { error: String(error) }\n );\n }\n })();\n\n return Promise.race([executionPromise, timeoutPromise]);\n }\n\n /**\n * Clear all event listeners\n */\n clearEventListeners(): void {\n this.eventListeners.clear();\n }\n\n /**\n * Get statistics about registered tools\n */\n getStats(): {\n totalTools: number;\n enabledTools: number;\n totalExecutions: number;\n byCategory: Record<string, number>;\n } {\n const tools = Array.from(this.tools.values());\n const byCategory: Record<string, number> = {};\n\n for (const tool of tools) {\n const category = tool.metadata?.category ?? 'uncategorized';\n byCategory[category] = (byCategory[category] ?? 0) + 1;\n }\n\n return {\n totalTools: tools.length,\n enabledTools: tools.filter((t) => t.enabled).length,\n totalExecutions: tools.reduce((sum, t) => sum + t.usageCount, 0),\n byCategory,\n };\n }\n\n /**\n * Enable or disable a tool\n */\n setEnabled(name: string, enabled: boolean): boolean {\n const tool = this.tools.get(name);\n if (!tool) {\n return false;\n }\n tool.enabled = enabled;\n logger.info(`Tool ${enabled ? 'enabled' : 'disabled'}`, { name });\n return true;\n }\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/**\n * Create a new ToolRegistry instance\n */\nexport function createToolRegistry(options?: {\n defaultTimeout?: number;\n}): ToolRegistry {\n return new ToolRegistry(options);\n}\n\n/**\n * Create a simple tool definition\n * Helper for common tool patterns\n */\nexport function defineTool(\n name: string,\n description: string,\n parameters: JSONSchema,\n execute: ToolDefinition['execute'],\n metadata?: ToolDefinition['metadata']\n): ToolDefinition {\n return {\n name,\n description,\n parameters,\n execute,\n metadata,\n };\n}\n\n// ============================================\n// Default Export\n// ============================================\n\nexport default ToolRegistry;\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/extensions/index.ts"],
4
- "sourcesContent": ["/**\n * Extension System Module Exports\n * Provides extension loading, management, and type definitions\n */\n\n// Core loader\nexport {\n ExtensionLoader,\n getExtensionLoader,\n loadExtension,\n unloadExtension,\n} from './loader.js';\n\n// Sandbox runtime (browser isolation)\nexport {\n SandboxRuntime,\n createSandboxRuntime,\n createManifest,\n} from './sandbox-runtime.js';\n\n// Custom Tools Framework\nexport {\n ToolRegistry,\n createToolRegistry,\n defineTool,\n type ToolExecutionOptions,\n type ExtensionStorage,\n type JSONSchemaProperty,\n} from './custom-tools.js';\n\n// Sandbox types\nexport type {\n // Permission system\n Permission,\n PermissionType,\n NetworkPermission,\n StoragePermission,\n FramePermission,\n EventPermission,\n DomPermission,\n PermissionManifest,\n // Sandbox configuration\n SandboxConfig,\n SandboxMode,\n ExtensionSource,\n // Sandbox APIs\n FrameManagerAPI,\n FrameData,\n FrameFilter,\n FrameCreateOptions,\n StateSerializerAPI,\n StorageAPI,\n} from './sandbox-runtime.js';\n\n// Types\nexport type {\n Extension,\n ExtensionContext,\n ExtensionLoadOptions,\n ExtensionLoadResult,\n ExtensionManifest,\n ExtensionPermission,\n ExtensionSourceType,\n ExtensionState,\n ExtensionValidationResult,\n EventHandler,\n ToolDefinition,\n ToolResult,\n JSONSchema,\n HookDefinition,\n ProviderAdapter,\n Message,\n StreamOptions,\n StreamEvent,\n IntegrationPlugin as BaseIntegrationPlugin,\n ActionHandler as BaseActionHandler,\n} from './types.js';\n\n// Integration Plugin System\nexport {\n // Core types\n type ContextFrame,\n type ActionHandler,\n type PluginState,\n type PluginPermission,\n type IntegrationPlugin,\n type PluginContext,\n type PluginFrameAccess,\n type PluginStorage,\n type PluginLogger,\n type PluginEvents,\n type EventBus,\n type PluginRegistration,\n\n // Implementations\n SimpleEventBus,\n PluginRegistry,\n InMemoryPluginStorage,\n\n // Linear-specific types\n type LinearPluginConfig,\n type LinearContextFrame,\n type LinearPluginActions,\n\n // Factory functions\n createPluginRegistry,\n createLinearPluginConfig,\n createLinearPlugin,\n createMockFrameAccess,\n\n // Aliases for convenience\n Plugin,\n Registry,\n EventBusImpl,\n} from './plugin-system.js';\n"],
5
- "mappings": ";;;;AAMA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAmDP;AAAA,EAgBE;AAAA,EACA;AAAA,EACA;AAAA,EAQA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/extensions/loader.ts"],
4
- "sourcesContent": ["/**\n * Extension Loader\n * Supports loading extensions from multiple sources: URL, file, and NPM\n */\n\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { pathToFileURL } from 'url';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, ErrorCode } from '../errors/index.js';\nimport type {\n Extension,\n ExtensionContext,\n ExtensionLoadOptions,\n ExtensionLoadResult,\n ExtensionManifest,\n ExtensionPermission,\n ExtensionSourceType,\n ExtensionState,\n ExtensionValidationResult,\n EventHandler,\n} from './types.js';\n\n/**\n * Default load timeout in milliseconds\n */\nconst DEFAULT_LOAD_TIMEOUT = 30000;\n\n/**\n * Maximum allowed permissions for security\n */\nconst ALLOWED_PERMISSION_PATTERNS: RegExp[] = [\n /^network:[a-z0-9.-]+$/,\n /^storage:(local|session)$/,\n /^frames:(read|write)$/,\n /^events:(emit|listen)$/,\n];\n\n/**\n * Blocked network domains for security\n */\nconst BLOCKED_DOMAINS = [\n 'localhost',\n '127.0.0.1',\n '0.0.0.0',\n '*.local',\n 'internal.*',\n];\n\n/**\n * Extension Loader class\n * Handles loading, validation, and lifecycle management of extensions\n */\nexport class ExtensionLoader {\n private loadedExtensions = new Map<string, ExtensionState>();\n private extensionInstances = new Map<string, Extension>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private grantedPermissions = new Map<string, Set<ExtensionPermission>>();\n\n /**\n * Load an extension from various sources\n */\n async loadExtension(\n options: ExtensionLoadOptions\n ): Promise<ExtensionLoadResult> {\n const { source, timeout = DEFAULT_LOAD_TIMEOUT } = options;\n\n try {\n // Parse source type\n const { type, uri } = this.parseSource(source);\n\n logger.info('Loading extension', { source, type });\n\n // Load with timeout\n const loadPromise = this.loadFromSource(type, uri, options);\n const result = await this.withTimeout(loadPromise, timeout);\n\n if (!result.success || !result.extension) {\n return result;\n }\n\n // Validate extension\n const validation = this.validateExtension(result.extension);\n if (!validation.valid) {\n return {\n success: false,\n error: `Extension validation failed: ${validation.errors.join(', ')}`,\n warnings: validation.warnings,\n };\n }\n\n // Verify permissions\n if (!options.skipPermissionCheck) {\n const permissionCheck = await this.verifyPermissions(\n result.extension,\n options.permissions\n );\n if (!permissionCheck.success) {\n return permissionCheck;\n }\n }\n\n // Initialize extension\n const initResult = await this.initializeExtension(\n result.extension,\n options\n );\n if (!initResult.success) {\n return initResult;\n }\n\n // Register extension\n const extensionId = this.generateExtensionId(result.extension);\n this.registerExtension(\n extensionId,\n result.extension,\n source,\n type,\n options\n );\n\n logger.info('Extension loaded successfully', {\n extensionId,\n name: result.extension.name,\n version: result.extension.version,\n });\n\n return {\n success: true,\n extension: result.extension,\n extensionId,\n warnings: validation.warnings,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Failed to load extension', { source, error: message });\n return {\n success: false,\n error: `Failed to load extension: ${message}`,\n };\n }\n }\n\n /**\n * Unload an extension\n */\n async unloadExtension(extensionId: string): Promise<boolean> {\n const extension = this.extensionInstances.get(extensionId);\n const state = this.loadedExtensions.get(extensionId);\n\n if (!extension || !state) {\n logger.warn('Extension not found for unload', { extensionId });\n return false;\n }\n\n try {\n // Call destroy lifecycle method\n await extension.destroy();\n\n // Clean up\n this.extensionInstances.delete(extensionId);\n this.loadedExtensions.delete(extensionId);\n this.grantedPermissions.delete(extensionId);\n\n logger.info('Extension unloaded', { extensionId });\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Failed to unload extension', {\n extensionId,\n error: message,\n });\n return false;\n }\n }\n\n /**\n * Get all loaded extensions\n */\n getLoadedExtensions(): ExtensionState[] {\n return Array.from(this.loadedExtensions.values());\n }\n\n /**\n * Get extension by ID\n */\n getExtension(extensionId: string): Extension | undefined {\n return this.extensionInstances.get(extensionId);\n }\n\n /**\n * Get extension state by ID\n */\n getExtensionState(extensionId: string): ExtensionState | undefined {\n return this.loadedExtensions.get(extensionId);\n }\n\n /**\n * Parse source string to determine type and URI\n */\n private parseSource(source: string): {\n type: ExtensionSourceType;\n uri: string;\n } {\n if (source.startsWith('https://') || source.startsWith('http://')) {\n return { type: 'url', uri: source };\n }\n\n if (source.startsWith('file://')) {\n return { type: 'file', uri: source.slice(7) };\n }\n\n if (source.startsWith('npm:')) {\n return { type: 'npm', uri: source.slice(4) };\n }\n\n // Default: treat as file path if it looks like a path\n if (\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../')\n ) {\n return { type: 'file', uri: source };\n }\n\n // Otherwise assume npm package\n return { type: 'npm', uri: source };\n }\n\n /**\n * Load extension from source based on type\n */\n private async loadFromSource(\n type: ExtensionSourceType,\n uri: string,\n options: ExtensionLoadOptions\n ): Promise<ExtensionLoadResult> {\n switch (type) {\n case 'url':\n return this.loadFromUrl(uri);\n case 'file':\n return this.loadFromFile(uri);\n case 'npm':\n return this.loadFromNpm(uri);\n default:\n return {\n success: false,\n error: `Unknown source type: ${type}`,\n };\n }\n }\n\n /**\n * Load extension from URL\n */\n private async loadFromUrl(url: string): Promise<ExtensionLoadResult> {\n try {\n // Validate URL\n const parsedUrl = new URL(url);\n\n // Security check: block internal URLs\n if (this.isBlockedDomain(parsedUrl.hostname)) {\n return {\n success: false,\n error: `Blocked domain: ${parsedUrl.hostname}`,\n };\n }\n\n // Only allow HTTPS in production\n if (\n parsedUrl.protocol !== 'https:' &&\n process.env['NODE_ENV'] === 'production'\n ) {\n return {\n success: false,\n error: 'Only HTTPS URLs are allowed in production',\n };\n }\n\n // Fetch extension code\n const response = await fetch(url);\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const code = await response.text();\n\n // Try to load manifest from adjacent file\n const manifestUrl = url.replace(/\\.js$/, '.manifest.json');\n let manifest: ExtensionManifest | undefined;\n\n try {\n const manifestResponse = await fetch(manifestUrl);\n if (manifestResponse.ok) {\n manifest = await manifestResponse.json();\n }\n } catch {\n // Manifest is optional for URL sources\n }\n\n // Dynamic import via data URL\n const extension = await this.evaluateExtensionCode(code, url);\n if (manifest) {\n extension.manifest = manifest;\n }\n\n return { success: true, extension };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Failed to load from URL: ${message}`,\n };\n }\n }\n\n /**\n * Load extension from local file\n */\n private async loadFromFile(filePath: string): Promise<ExtensionLoadResult> {\n try {\n // Resolve to absolute path\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(process.cwd(), filePath);\n\n // Check file exists\n try {\n await fs.access(absolutePath);\n } catch {\n return {\n success: false,\n error: `File not found: ${absolutePath}`,\n };\n }\n\n // Load manifest if present\n const manifestPath = absolutePath.replace(/\\.js$/, '.manifest.json');\n let manifest: ExtensionManifest | undefined;\n\n try {\n const manifestContent = await fs.readFile(manifestPath, 'utf-8');\n manifest = JSON.parse(manifestContent);\n } catch {\n // Try package.json in same directory\n try {\n const packagePath = path.join(\n path.dirname(absolutePath),\n 'package.json'\n );\n const packageContent = await fs.readFile(packagePath, 'utf-8');\n const pkg = JSON.parse(packageContent);\n if (pkg.stackmemory) {\n manifest = pkg.stackmemory;\n }\n } catch {\n // No manifest found\n }\n }\n\n // Dynamic import\n const fileUrl = pathToFileURL(absolutePath).href;\n const module = await import(fileUrl);\n const extension = module.default || module;\n\n if (!this.isExtensionLike(extension)) {\n return {\n success: false,\n error: 'Module does not export a valid extension',\n };\n }\n\n if (manifest) {\n extension.manifest = manifest;\n }\n\n return { success: true, extension };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Failed to load from file: ${message}`,\n };\n }\n }\n\n /**\n * Load extension from NPM package\n */\n private async loadFromNpm(packageName: string): Promise<ExtensionLoadResult> {\n try {\n // Parse package name and version\n const { name, version } = this.parseNpmPackage(packageName);\n\n // Try to import the package\n // In a real implementation, this would use a package manager or CDN\n let module: Record<string, unknown>;\n\n try {\n // Try direct import (for installed packages)\n module = await import(name);\n } catch {\n // Try node_modules path\n try {\n const nodeModulesPath = path.join(\n process.cwd(),\n 'node_modules',\n name\n );\n const packageJsonPath = path.join(nodeModulesPath, 'package.json');\n const packageJson = JSON.parse(\n await fs.readFile(packageJsonPath, 'utf-8')\n );\n const entryPoint = packageJson.main || 'index.js';\n const entryPath = path.join(nodeModulesPath, entryPoint);\n module = await import(pathToFileURL(entryPath).href);\n } catch (innerError) {\n return {\n success: false,\n error: `Package not found: ${name}. Try running: npm install ${name}`,\n };\n }\n }\n\n const extension = module.default || module;\n\n if (!this.isExtensionLike(extension)) {\n return {\n success: false,\n error: 'Package does not export a valid extension',\n };\n }\n\n return { success: true, extension: extension as Extension };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Failed to load from NPM: ${message}`,\n };\n }\n }\n\n /**\n * Evaluate extension code (for URL sources)\n */\n private async evaluateExtensionCode(\n code: string,\n sourceUrl: string\n ): Promise<Extension> {\n // Create a data URL for dynamic import\n const dataUrl = `data:text/javascript;base64,${Buffer.from(code).toString('base64')}`;\n\n try {\n const module = await import(dataUrl);\n const extension = module.default || module;\n\n if (!this.isExtensionLike(extension)) {\n throw new Error('Code does not export a valid extension');\n }\n\n return extension as Extension;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to evaluate extension code: ${message}`);\n }\n }\n\n /**\n * Check if object looks like an extension\n */\n private isExtensionLike(obj: unknown): obj is Extension {\n if (!obj || typeof obj !== 'object') return false;\n\n const ext = obj as Record<string, unknown>;\n return (\n typeof ext['name'] === 'string' &&\n typeof ext['version'] === 'string' &&\n typeof ext['init'] === 'function' &&\n typeof ext['destroy'] === 'function'\n );\n }\n\n /**\n * Validate extension structure and metadata\n */\n private validateExtension(extension: Extension): ExtensionValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Required fields\n if (!extension.name || typeof extension.name !== 'string') {\n errors.push('Extension must have a valid name');\n }\n\n if (!extension.version || typeof extension.version !== 'string') {\n errors.push('Extension must have a valid version');\n }\n\n // Validate version format (semver-like)\n if (extension.version && !/^\\d+\\.\\d+\\.\\d+/.test(extension.version)) {\n warnings.push('Version should follow semver format (x.y.z)');\n }\n\n // Validate lifecycle methods\n if (typeof extension.init !== 'function') {\n errors.push('Extension must have an init method');\n }\n\n if (typeof extension.destroy !== 'function') {\n errors.push('Extension must have a destroy method');\n }\n\n // Validate tools if present\n if (extension.tools) {\n if (!Array.isArray(extension.tools)) {\n errors.push('Extension tools must be an array');\n } else {\n extension.tools.forEach((tool, index) => {\n if (!tool.name) {\n errors.push(`Tool at index ${index} must have a name`);\n }\n if (!tool.execute || typeof tool.execute !== 'function') {\n errors.push(\n `Tool \"${tool.name || index}\" must have an execute function`\n );\n }\n });\n }\n }\n\n // Validate manifest if present\n if (extension.manifest) {\n const manifestValidation = this.validateManifest(extension.manifest);\n errors.push(...manifestValidation.errors);\n warnings.push(...manifestValidation.warnings);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Validate extension manifest\n */\n private validateManifest(\n manifest: ExtensionManifest\n ): ExtensionValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!manifest.name) {\n errors.push('Manifest must have a name');\n }\n\n if (!manifest.version) {\n errors.push('Manifest must have a version');\n }\n\n if (!manifest.permissions || !Array.isArray(manifest.permissions)) {\n errors.push('Manifest must have a permissions array');\n } else {\n // Validate each permission\n manifest.permissions.forEach((perm) => {\n if (!this.isValidPermission(perm)) {\n errors.push(`Invalid permission: ${perm}`);\n }\n });\n }\n\n return { valid: errors.length === 0, errors, warnings };\n }\n\n /**\n * Check if permission string is valid\n */\n private isValidPermission(permission: string): boolean {\n return ALLOWED_PERMISSION_PATTERNS.some((pattern) =>\n pattern.test(permission)\n );\n }\n\n /**\n * Verify extension permissions\n */\n private async verifyPermissions(\n extension: Extension,\n overridePermissions?: ExtensionPermission[]\n ): Promise<ExtensionLoadResult> {\n const requestedPermissions =\n overridePermissions || extension.manifest?.permissions || [];\n\n // Check for blocked network domains in permissions\n for (const perm of requestedPermissions) {\n if (perm.startsWith('network:')) {\n const domain = perm.slice(8);\n if (this.isBlockedDomain(domain)) {\n return {\n success: false,\n error: `Permission denied: network access to ${domain} is blocked`,\n };\n }\n }\n }\n\n // In a full implementation, this would prompt the user for approval\n // or check against a configured allowlist\n logger.debug('Permission verification passed', {\n extension: extension.name,\n permissions: requestedPermissions,\n });\n\n return { success: true, extension };\n }\n\n /**\n * Initialize extension with context\n */\n private async initializeExtension(\n extension: Extension,\n options: ExtensionLoadOptions\n ): Promise<ExtensionLoadResult> {\n try {\n const extensionId = this.generateExtensionId(extension);\n const permissions =\n options.permissions || extension.manifest?.permissions || [];\n\n // Create extension context\n const context = this.createExtensionContext(extensionId, permissions);\n\n // Store granted permissions\n this.grantedPermissions.set(extensionId, new Set(permissions));\n\n // Call init\n await extension.init(context);\n\n return { success: true, extension };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: `Extension initialization failed: ${message}`,\n };\n }\n }\n\n /**\n * Create extension context with permission-gated access\n */\n private createExtensionContext(\n extensionId: string,\n permissions: ExtensionPermission[]\n ): ExtensionContext {\n const permSet = new Set(permissions);\n\n const context: ExtensionContext = {\n extensionId,\n permissions,\n\n // State management (always available, scoped to extension)\n state: {\n get: async <T>(key: string): Promise<T | undefined> => {\n // In a full implementation, this would use persistent storage\n return undefined;\n },\n set: async <T>(key: string, value: T): Promise<void> => {\n // In a full implementation, this would use persistent storage\n },\n delete: async (key: string): Promise<void> => {\n // In a full implementation, this would use persistent storage\n },\n },\n\n // Sandboxed fetch (always available)\n fetch: this.createSandboxedFetch(extensionId, permSet),\n\n // Event system\n emit: (event: string, data: unknown): void => {\n if (!permSet.has('events:emit')) {\n logger.warn('Extension lacks events:emit permission', {\n extensionId,\n event,\n });\n return;\n }\n this.emitEvent(event, data);\n },\n\n on: (event: string, handler: EventHandler): (() => void) => {\n if (!permSet.has('events:listen')) {\n logger.warn('Extension lacks events:listen permission', {\n extensionId,\n event,\n });\n return () => {};\n }\n return this.addEventListener(event, handler);\n },\n\n off: (event: string, handler: EventHandler): void => {\n this.removeEventListener(event, handler);\n },\n };\n\n // Add frames access if permitted\n if (permSet.has('frames:read') || permSet.has('frames:write')) {\n context.frames = {\n get: async (frameId: string) => {\n // In a full implementation, this would access the frame manager\n return undefined;\n },\n list: async () => {\n return [];\n },\n };\n\n if (permSet.has('frames:write')) {\n context.frames.create = async (options) => {\n // In a full implementation, this would create a frame\n throw new Error('Frame creation not implemented');\n };\n context.frames.update = async (frameId, data) => {\n // In a full implementation, this would update a frame\n throw new Error('Frame update not implemented');\n };\n }\n }\n\n return context;\n }\n\n /**\n * Create sandboxed fetch that respects network permissions\n */\n private createSandboxedFetch(\n extensionId: string,\n permissions: Set<ExtensionPermission>\n ): typeof fetch {\n return async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.href\n : input.url;\n const parsedUrl = new URL(url);\n const domain = parsedUrl.hostname;\n\n // Check if extension has permission for this domain\n const hasPermission = Array.from(permissions).some((perm) => {\n if (!perm.startsWith('network:')) return false;\n const allowedDomain = perm.slice(8);\n\n // Support wildcard patterns\n if (allowedDomain.startsWith('*.')) {\n const baseDomain = allowedDomain.slice(2);\n return domain.endsWith(baseDomain);\n }\n\n return domain === allowedDomain;\n });\n\n if (!hasPermission) {\n throw new Error(`Network access denied for domain: ${domain}`);\n }\n\n // Check blocked domains\n if (this.isBlockedDomain(domain)) {\n throw new Error(`Network access blocked for domain: ${domain}`);\n }\n\n return fetch(input, init);\n };\n }\n\n /**\n * Check if domain is blocked\n */\n private isBlockedDomain(domain: string): boolean {\n return BLOCKED_DOMAINS.some((blocked) => {\n if (blocked.startsWith('*.')) {\n return domain.endsWith(blocked.slice(1));\n }\n if (blocked.endsWith('.*')) {\n return domain.startsWith(blocked.slice(0, -1));\n }\n return domain === blocked;\n });\n }\n\n /**\n * Register loaded extension\n */\n private registerExtension(\n extensionId: string,\n extension: Extension,\n source: string,\n sourceType: ExtensionSourceType,\n options: ExtensionLoadOptions\n ): void {\n const state: ExtensionState = {\n id: extensionId,\n name: extension.name,\n version: extension.version,\n source,\n sourceType,\n permissions: options.permissions || extension.manifest?.permissions || [],\n loadedAt: Date.now(),\n status: 'active',\n };\n\n this.loadedExtensions.set(extensionId, state);\n this.extensionInstances.set(extensionId, extension);\n }\n\n /**\n * Generate unique extension ID\n */\n private generateExtensionId(extension: Extension): string {\n return `${extension.name}@${extension.version}`;\n }\n\n /**\n * Parse NPM package string\n */\n private parseNpmPackage(packageName: string): {\n name: string;\n version?: string;\n } {\n const atIndex = packageName.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: packageName.slice(0, atIndex),\n version: packageName.slice(atIndex + 1),\n };\n }\n return { name: packageName };\n }\n\n /**\n * Wrap promise with timeout\n */\n private async withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number\n ): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Operation timed out after ${timeoutMs}ms`)),\n timeoutMs\n )\n ),\n ]);\n }\n\n /**\n * Emit event to all listeners\n */\n private emitEvent(event: string, data: unknown): void {\n const handlers = this.eventHandlers.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n const result = handler(data);\n if (result instanceof Promise) {\n result.catch((error) => {\n logger.error('Event handler error', { event, error });\n });\n }\n } catch (error) {\n logger.error('Event handler error', { event, error });\n }\n });\n }\n\n /**\n * Add event listener\n */\n private addEventListener(event: string, handler: EventHandler): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler);\n\n return () => this.removeEventListener(event, handler);\n }\n\n /**\n * Remove event listener\n */\n private removeEventListener(event: string, handler: EventHandler): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler);\n }\n }\n\n /**\n * Disable an extension without unloading\n */\n async disableExtension(extensionId: string): Promise<boolean> {\n const state = this.loadedExtensions.get(extensionId);\n if (!state) return false;\n\n state.status = 'disabled';\n return true;\n }\n\n /**\n * Enable a disabled extension\n */\n async enableExtension(extensionId: string): Promise<boolean> {\n const state = this.loadedExtensions.get(extensionId);\n if (!state || state.status !== 'disabled') return false;\n\n state.status = 'active';\n return true;\n }\n\n /**\n * Unload all extensions\n */\n async unloadAll(): Promise<void> {\n const extensionIds = Array.from(this.loadedExtensions.keys());\n\n for (const extensionId of extensionIds) {\n await this.unloadExtension(extensionId);\n }\n }\n}\n\n/**\n * Singleton instance for convenience\n */\nlet loaderInstance: ExtensionLoader | undefined;\n\n/**\n * Get the extension loader instance\n */\nexport function getExtensionLoader(): ExtensionLoader {\n if (!loaderInstance) {\n loaderInstance = new ExtensionLoader();\n }\n return loaderInstance;\n}\n\n/**\n * Load an extension (convenience function)\n */\nexport async function loadExtension(\n source: string,\n options?: Partial<ExtensionLoadOptions>\n): Promise<ExtensionLoadResult> {\n const loader = getExtensionLoader();\n return loader.loadExtension({ source, ...options });\n}\n\n/**\n * Unload an extension (convenience function)\n */\nexport async function unloadExtension(extensionId: string): Promise<boolean> {\n const loader = getExtensionLoader();\n return loader.unloadExtension(extensionId);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/extensions/plugin-system.ts"],
4
- "sourcesContent": ["/**\n * Integration Plugin System\n * Provides a unified interface for external service integrations\n *\n * Design: Based on architecture.md - standardize the intersection, expose the union\n */\n\nimport { logger } from '../monitoring/logger.js';\nimport {\n IntegrationError,\n ErrorCode,\n StackMemoryError,\n} from '../errors/index.js';\nimport { Frame, FrameContext } from '../context/frame-types.js';\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\n/**\n * Context frame produced by sync operations\n * Maps external data to StackMemory's frame structure\n */\nexport interface ContextFrame {\n id: string;\n source: string;\n type: 'task' | 'document' | 'thread' | 'event' | 'custom';\n title: string;\n content: string;\n metadata: Record<string, unknown>;\n externalId?: string;\n externalUrl?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/**\n * Action handler function type\n */\nexport type ActionHandler<TParams = unknown, TResult = unknown> = (\n params: TParams,\n context: PluginContext\n) => Promise<TResult>;\n\n/**\n * Plugin lifecycle states\n */\nexport type PluginState =\n | 'unloaded'\n | 'loading'\n | 'active'\n | 'error'\n | 'unloading';\n\n/**\n * Plugin permission scopes\n */\nexport type PluginPermission =\n | 'frames:read'\n | 'frames:write'\n | 'storage:local'\n | 'storage:remote'\n | 'network:*'\n | `network:${string}`;\n\n// ============================================================================\n// Plugin Interfaces\n// ============================================================================\n\n/**\n * Integration Plugin Interface\n * Connects external services to StackMemory context\n */\nexport interface IntegrationPlugin {\n /** Unique plugin identifier */\n id: string;\n\n /** Human-readable name */\n name: string;\n\n /** Plugin version */\n version: string;\n\n /** Service this plugin integrates with */\n service: 'linear' | 'github' | 'slack' | 'jira' | 'notion' | string;\n\n /** Required permissions */\n permissions: PluginPermission[];\n\n /**\n * Initialize the plugin\n * Called when plugin is loaded\n */\n init(context: PluginContext): Promise<void>;\n\n /**\n * Cleanup and shutdown\n * Called when plugin is unloaded\n */\n destroy(): Promise<void>;\n\n /**\n * Sync data from external service\n * Returns context frames to be stored\n */\n sync(): Promise<ContextFrame[]>;\n\n /**\n * Watch for real-time updates (optional)\n * Callback is invoked when external data changes\n */\n watch?(callback: (frame: ContextFrame) => void): () => void;\n\n /**\n * Available actions this plugin provides\n */\n actions?: Record<string, ActionHandler>;\n\n /**\n * Plugin-specific configuration schema (JSON Schema)\n */\n configSchema?: Record<string, unknown>;\n}\n\n/**\n * Context provided to plugins during initialization and action execution\n */\nexport interface PluginContext {\n /** Project root directory */\n projectRoot: string;\n\n /** Access to frame management */\n frames: PluginFrameAccess;\n\n /** Persistent storage for plugin state */\n storage: PluginStorage;\n\n /** Event bus for inter-plugin communication */\n events: EventBus;\n\n /** Logger scoped to this plugin */\n logger: PluginLogger;\n\n /** Plugin configuration */\n config: Record<string, unknown>;\n}\n\n/**\n * Frame access interface for plugins\n */\nexport interface PluginFrameAccess {\n /** Get current active frame */\n getActive(): Promise<Frame | undefined>;\n\n /** Get frame by ID */\n get(frameId: string): Promise<Frame | undefined>;\n\n /** Get frame context */\n getContext(frameId: string): Promise<FrameContext | undefined>;\n\n /** Create a new frame */\n create(options: {\n type: Frame['type'];\n name: string;\n inputs?: Record<string, unknown>;\n parentFrameId?: string;\n }): Promise<Frame>;\n\n /** Close a frame */\n close(frameId: string, outputs?: Record<string, unknown>): Promise<void>;\n}\n\n/**\n * Persistent storage for plugins\n */\nexport interface PluginStorage {\n /** Get a value by key */\n get<T = unknown>(key: string): Promise<T | undefined>;\n\n /** Set a value */\n set<T = unknown>(key: string, value: T): Promise<void>;\n\n /** Delete a value */\n delete(key: string): Promise<void>;\n\n /** List all keys with optional prefix filter */\n keys(prefix?: string): Promise<string[]>;\n}\n\n/**\n * Plugin-scoped logger\n */\nexport interface PluginLogger {\n debug(message: string, context?: Record<string, unknown>): void;\n info(message: string, context?: Record<string, unknown>): void;\n warn(message: string, context?: Record<string, unknown>): void;\n error(message: string, error?: Error | Record<string, unknown>): void;\n}\n\n// ============================================================================\n// Event Bus\n// ============================================================================\n\n/**\n * Standard event types\n */\nexport interface PluginEvents {\n 'plugin:loaded': { pluginId: string };\n 'plugin:unloaded': { pluginId: string };\n 'plugin:error': { pluginId: string; error: Error };\n 'context:synced': { pluginId: string; frames: ContextFrame[] };\n 'context:updated': { pluginId: string; frame: ContextFrame };\n 'frame:created': { frameId: string; type: string };\n 'frame:closed': { frameId: string };\n [key: string]: unknown;\n}\n\nexport type EventHandler<T = unknown> = (data: T) => void | Promise<void>;\n\n/**\n * Event bus for inter-plugin communication\n */\nexport interface EventBus {\n /** Emit an event */\n emit<K extends keyof PluginEvents>(event: K, data: PluginEvents[K]): void;\n\n /** Subscribe to an event */\n on<K extends keyof PluginEvents>(\n event: K,\n handler: EventHandler<PluginEvents[K]>\n ): () => void;\n\n /** Subscribe to an event once */\n once<K extends keyof PluginEvents>(\n event: K,\n handler: EventHandler<PluginEvents[K]>\n ): () => void;\n\n /** Remove all handlers for an event */\n off<K extends keyof PluginEvents>(event: K): void;\n}\n\n// ============================================================================\n// Event Bus Implementation\n// ============================================================================\n\n/**\n * Simple in-memory event bus implementation\n */\nexport class SimpleEventBus implements EventBus {\n private handlers = new Map<string, Set<EventHandler>>();\n\n emit<K extends keyof PluginEvents>(event: K, data: PluginEvents[K]): void {\n const eventHandlers = this.handlers.get(event as string);\n if (!eventHandlers) return;\n\n for (const handler of eventHandlers) {\n try {\n const result = handler(data);\n if (result instanceof Promise) {\n result.catch((err) => {\n logger.error(`Event handler error for ${String(event)}:`, err);\n });\n }\n } catch (err) {\n logger.error(`Event handler error for ${String(event)}:`, err as Error);\n }\n }\n }\n\n on<K extends keyof PluginEvents>(\n event: K,\n handler: EventHandler<PluginEvents[K]>\n ): () => void {\n const key = event as string;\n if (!this.handlers.has(key)) {\n this.handlers.set(key, new Set());\n }\n this.handlers.get(key)!.add(handler as EventHandler);\n\n return () => {\n this.handlers.get(key)?.delete(handler as EventHandler);\n };\n }\n\n once<K extends keyof PluginEvents>(\n event: K,\n handler: EventHandler<PluginEvents[K]>\n ): () => void {\n const wrappedHandler: EventHandler<PluginEvents[K]> = (data) => {\n unsubscribe();\n return handler(data);\n };\n const unsubscribe = this.on(event, wrappedHandler);\n return unsubscribe;\n }\n\n off<K extends keyof PluginEvents>(event: K): void {\n this.handlers.delete(event as string);\n }\n\n /** Clear all event handlers */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n// ============================================================================\n// Plugin Registry\n// ============================================================================\n\n/**\n * Plugin metadata stored in registry\n */\nexport interface PluginRegistration {\n plugin: IntegrationPlugin;\n state: PluginState;\n context: PluginContext;\n watchUnsubscribe?: () => void;\n error?: Error;\n loadedAt?: Date;\n}\n\n/**\n * Plugin Registry - manages plugin lifecycle\n */\nexport class PluginRegistry {\n private plugins = new Map<string, PluginRegistration>();\n private eventBus: SimpleEventBus;\n private projectRoot: string;\n private frameAccess: PluginFrameAccess;\n private storageProvider: (pluginId: string) => PluginStorage;\n\n constructor(options: {\n projectRoot: string;\n frameAccess: PluginFrameAccess;\n storageProvider: (pluginId: string) => PluginStorage;\n eventBus?: SimpleEventBus;\n }) {\n this.projectRoot = options.projectRoot;\n this.frameAccess = options.frameAccess;\n this.storageProvider = options.storageProvider;\n this.eventBus = options.eventBus || new SimpleEventBus();\n }\n\n /**\n * Get the event bus\n */\n getEventBus(): EventBus {\n return this.eventBus;\n }\n\n /**\n * Register and load a plugin\n */\n async load(\n plugin: IntegrationPlugin,\n config?: Record<string, unknown>\n ): Promise<void> {\n if (this.plugins.has(plugin.id)) {\n throw new IntegrationError(\n `Plugin ${plugin.id} is already loaded`,\n ErrorCode.MCP_EXECUTION_FAILED,\n { pluginId: plugin.id }\n );\n }\n\n // Create plugin context\n const context = this.createPluginContext(plugin.id, config || {});\n\n // Create registration\n const registration: PluginRegistration = {\n plugin,\n state: 'loading',\n context,\n };\n\n this.plugins.set(plugin.id, registration);\n\n try {\n // Initialize plugin\n await plugin.init(context);\n\n registration.state = 'active';\n registration.loadedAt = new Date();\n\n // Start watching if available\n if (plugin.watch) {\n registration.watchUnsubscribe = plugin.watch((frame) => {\n this.eventBus.emit('context:updated', {\n pluginId: plugin.id,\n frame,\n });\n });\n }\n\n this.eventBus.emit('plugin:loaded', { pluginId: plugin.id });\n logger.info(`Plugin loaded: ${plugin.id} v${plugin.version}`);\n } catch (error) {\n registration.state = 'error';\n registration.error =\n error instanceof Error ? error : new Error(String(error));\n\n this.eventBus.emit('plugin:error', {\n pluginId: plugin.id,\n error: registration.error,\n });\n\n throw new IntegrationError(\n `Failed to load plugin ${plugin.id}: ${registration.error.message}`,\n ErrorCode.MCP_EXECUTION_FAILED,\n { pluginId: plugin.id },\n registration.error\n );\n }\n }\n\n /**\n * Unload a plugin\n */\n async unload(pluginId: string): Promise<void> {\n const registration = this.plugins.get(pluginId);\n if (!registration) {\n throw new IntegrationError(\n `Plugin ${pluginId} is not loaded`,\n ErrorCode.MCP_TOOL_NOT_FOUND,\n { pluginId }\n );\n }\n\n registration.state = 'unloading';\n\n try {\n // Stop watching\n if (registration.watchUnsubscribe) {\n registration.watchUnsubscribe();\n }\n\n // Destroy plugin\n await registration.plugin.destroy();\n\n this.plugins.delete(pluginId);\n this.eventBus.emit('plugin:unloaded', { pluginId });\n logger.info(`Plugin unloaded: ${pluginId}`);\n } catch (error) {\n registration.state = 'error';\n registration.error =\n error instanceof Error ? error : new Error(String(error));\n throw error;\n }\n }\n\n /**\n * Get a loaded plugin\n */\n get(pluginId: string): IntegrationPlugin | undefined {\n return this.plugins.get(pluginId)?.plugin;\n }\n\n /**\n * Get plugin registration\n */\n getRegistration(pluginId: string): PluginRegistration | undefined {\n return this.plugins.get(pluginId);\n }\n\n /**\n * Get all loaded plugins\n */\n getAll(): IntegrationPlugin[] {\n return Array.from(this.plugins.values())\n .filter((r) => r.state === 'active')\n .map((r) => r.plugin);\n }\n\n /**\n * Get plugins by service type\n */\n getByService(service: string): IntegrationPlugin[] {\n return this.getAll().filter((p) => p.service === service);\n }\n\n /**\n * Sync all active plugins\n */\n async syncAll(): Promise<Map<string, ContextFrame[]>> {\n const results = new Map<string, ContextFrame[]>();\n\n for (const [pluginId, registration] of this.plugins) {\n if (registration.state !== 'active') continue;\n\n try {\n const frames = await registration.plugin.sync();\n results.set(pluginId, frames);\n\n this.eventBus.emit('context:synced', { pluginId, frames });\n } catch (error) {\n logger.error(`Sync failed for plugin ${pluginId}:`, error as Error);\n registration.error =\n error instanceof Error ? error : new Error(String(error));\n }\n }\n\n return results;\n }\n\n /**\n * Execute a plugin action\n */\n async executeAction<TParams = unknown, TResult = unknown>(\n pluginId: string,\n action: string,\n params: TParams\n ): Promise<TResult> {\n const registration = this.plugins.get(pluginId);\n if (!registration) {\n throw new IntegrationError(\n `Plugin ${pluginId} is not loaded`,\n ErrorCode.MCP_TOOL_NOT_FOUND,\n { pluginId }\n );\n }\n\n if (registration.state !== 'active') {\n throw new IntegrationError(\n `Plugin ${pluginId} is not active (state: ${registration.state})`,\n ErrorCode.MCP_EXECUTION_FAILED,\n { pluginId, state: registration.state }\n );\n }\n\n const handler = registration.plugin.actions?.[action];\n if (!handler) {\n throw new IntegrationError(\n `Action ${action} not found in plugin ${pluginId}`,\n ErrorCode.MCP_TOOL_NOT_FOUND,\n { pluginId, action }\n );\n }\n\n return handler(params, registration.context) as Promise<TResult>;\n }\n\n /**\n * List all available actions across plugins\n */\n listActions(): Array<{\n pluginId: string;\n action: string;\n service: string;\n }> {\n const actions: Array<{\n pluginId: string;\n action: string;\n service: string;\n }> = [];\n\n for (const [pluginId, registration] of this.plugins) {\n if (registration.state !== 'active') continue;\n\n const plugin = registration.plugin;\n if (plugin.actions) {\n for (const action of Object.keys(plugin.actions)) {\n actions.push({\n pluginId,\n action,\n service: plugin.service,\n });\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Unload all plugins\n */\n async unloadAll(): Promise<void> {\n const pluginIds = Array.from(this.plugins.keys());\n\n for (const pluginId of pluginIds) {\n try {\n await this.unload(pluginId);\n } catch (error) {\n logger.error(`Failed to unload plugin ${pluginId}:`, error as Error);\n }\n }\n\n this.eventBus.clear();\n }\n\n /**\n * Create plugin context\n */\n private createPluginContext(\n pluginId: string,\n config: Record<string, unknown>\n ): PluginContext {\n return {\n projectRoot: this.projectRoot,\n frames: this.frameAccess,\n storage: this.storageProvider(pluginId),\n events: this.eventBus,\n logger: this.createPluginLogger(pluginId),\n config,\n };\n }\n\n /**\n * Create scoped logger for plugin\n */\n private createPluginLogger(pluginId: string): PluginLogger {\n const prefix = `[plugin:${pluginId}]`;\n return {\n debug: (message, context) =>\n logger.debug(`${prefix} ${message}`, context),\n info: (message, context) => logger.info(`${prefix} ${message}`, context),\n warn: (message, context) => logger.warn(`${prefix} ${message}`, context),\n error: (message, errorOrContext) =>\n logger.error(`${prefix} ${message}`, errorOrContext),\n };\n }\n}\n\n// ============================================================================\n// Linear Plugin Interface\n// ============================================================================\n\n/**\n * Linear-specific configuration\n */\nexport interface LinearPluginConfig {\n /** Linear team ID to sync */\n teamId?: string;\n\n /** Sync direction */\n direction: 'bidirectional' | 'to_linear' | 'from_linear';\n\n /** Conflict resolution strategy */\n conflictResolution:\n | 'linear_wins'\n | 'stackmemory_wins'\n | 'newest_wins'\n | 'manual';\n\n /** Auto-sync interval in minutes (0 to disable) */\n syncInterval: number;\n\n /** Enable webhook listener */\n webhookEnabled: boolean;\n\n /** Webhook secret for signature verification */\n webhookSecret?: string;\n}\n\n/**\n * Linear issue mapped to context frame\n */\nexport interface LinearContextFrame extends ContextFrame {\n source: 'linear';\n type: 'task';\n metadata: {\n linearId: string;\n identifier: string;\n state: string;\n stateType: string;\n priority: number;\n assignee?: string;\n labels: string[];\n estimate?: number;\n };\n}\n\n/**\n * Linear plugin actions\n */\nexport interface LinearPluginActions {\n /** Create a new issue in Linear */\n createIssue: ActionHandler<\n { title: string; description?: string; priority?: number },\n LinearContextFrame\n >;\n\n /** Update an existing issue */\n updateIssue: ActionHandler<\n { issueId: string; title?: string; description?: string; stateId?: string },\n LinearContextFrame\n >;\n\n /** Transition issue state */\n transitionIssue: ActionHandler<\n { issueId: string; state: string },\n LinearContextFrame\n >;\n\n /** Add comment to issue */\n addComment: ActionHandler<\n { issueId: string; body: string },\n { id: string; body: string }\n >;\n\n /** Get issue details */\n getIssue: ActionHandler<{ issueId: string }, LinearContextFrame | undefined>;\n\n /** Import issues from Linear */\n importIssues: ActionHandler<\n { teamId?: string; limit?: number },\n { imported: number; skipped: number }\n >;\n}\n\n/**\n * Factory function to create Linear plugin instance\n * Uses existing Linear integration components\n */\nexport function createLinearPluginConfig(): LinearPluginConfig {\n return {\n direction: 'bidirectional',\n conflictResolution: 'newest_wins',\n syncInterval: 15,\n webhookEnabled: false,\n };\n}\n\n/**\n * Example Linear plugin implementation skeleton\n * Full implementation would integrate with existing src/integrations/linear/*\n */\nexport function createLinearPlugin(): IntegrationPlugin {\n let context: PluginContext | undefined;\n let syncIntervalId: NodeJS.Timeout | undefined;\n\n return {\n id: 'linear',\n name: 'Linear Integration',\n version: '1.0.0',\n service: 'linear',\n permissions: [\n 'frames:read',\n 'frames:write',\n 'network:api.linear.app',\n 'storage:local',\n ],\n\n configSchema: {\n type: 'object',\n properties: {\n teamId: { type: 'string', description: 'Linear team ID' },\n direction: {\n type: 'string',\n enum: ['bidirectional', 'to_linear', 'from_linear'],\n default: 'bidirectional',\n },\n conflictResolution: {\n type: 'string',\n enum: ['linear_wins', 'stackmemory_wins', 'newest_wins', 'manual'],\n default: 'newest_wins',\n },\n syncInterval: {\n type: 'number',\n description: 'Sync interval in minutes (0 to disable)',\n default: 15,\n },\n webhookEnabled: { type: 'boolean', default: false },\n webhookSecret: { type: 'string' },\n },\n },\n\n async init(ctx: PluginContext): Promise<void> {\n context = ctx;\n\n // Validate API key\n const apiKey = process.env['LINEAR_API_KEY'];\n if (!apiKey) {\n throw new IntegrationError(\n 'LINEAR_API_KEY environment variable not set',\n ErrorCode.LINEAR_AUTH_FAILED\n );\n }\n\n ctx.logger.info('Linear plugin initialized');\n\n // Start auto-sync if configured\n const interval = (ctx.config['syncInterval'] as number) || 0;\n if (interval > 0) {\n syncIntervalId = setInterval(\n () => {\n this.sync().catch((err) => {\n ctx.logger.error('Auto-sync failed', err);\n });\n },\n interval * 60 * 1000\n );\n ctx.logger.info(`Auto-sync enabled: every ${interval} minutes`);\n }\n },\n\n async destroy(): Promise<void> {\n if (syncIntervalId) {\n clearInterval(syncIntervalId);\n syncIntervalId = undefined;\n }\n context?.logger.info('Linear plugin destroyed');\n context = undefined;\n },\n\n async sync(): Promise<ContextFrame[]> {\n if (!context) {\n throw new IntegrationError(\n 'Plugin not initialized',\n ErrorCode.LINEAR_SYNC_FAILED\n );\n }\n\n context.logger.info('Starting Linear sync');\n\n // This would integrate with LinearSyncService\n // For now, return empty array as placeholder\n const frames: LinearContextFrame[] = [];\n\n context.logger.info(`Sync complete: ${frames.length} frames`);\n return frames;\n },\n\n watch(callback: (frame: ContextFrame) => void): () => void {\n // Would integrate with LinearWebhookHandler\n context?.logger.info('Watch mode enabled');\n\n return () => {\n context?.logger.info('Watch mode disabled');\n };\n },\n\n actions: {\n createIssue: async (params, ctx) => {\n ctx.logger.info('Creating Linear issue', { title: params.title });\n // Would integrate with LinearClient.createIssue\n throw new IntegrationError(\n 'Not implemented - integrate with LinearClient',\n ErrorCode.LINEAR_API_ERROR\n );\n },\n\n updateIssue: async (params, ctx) => {\n ctx.logger.info('Updating Linear issue', { issueId: params.issueId });\n throw new IntegrationError(\n 'Not implemented - integrate with LinearClient',\n ErrorCode.LINEAR_API_ERROR\n );\n },\n\n transitionIssue: async (params, ctx) => {\n ctx.logger.info('Transitioning Linear issue', params);\n throw new IntegrationError(\n 'Not implemented - integrate with LinearClient',\n ErrorCode.LINEAR_API_ERROR\n );\n },\n\n addComment: async (params, ctx) => {\n ctx.logger.info('Adding comment to Linear issue', {\n issueId: params.issueId,\n });\n throw new IntegrationError(\n 'Not implemented - integrate with LinearClient',\n ErrorCode.LINEAR_API_ERROR\n );\n },\n\n getIssue: async (params, ctx) => {\n ctx.logger.info('Getting Linear issue', { issueId: params.issueId });\n throw new IntegrationError(\n 'Not implemented - integrate with LinearClient',\n ErrorCode.LINEAR_API_ERROR\n );\n },\n\n importIssues: async (params, ctx) => {\n ctx.logger.info('Importing issues from Linear', params);\n throw new IntegrationError(\n 'Not implemented - integrate with LinearSyncEngine',\n ErrorCode.LINEAR_API_ERROR\n );\n },\n },\n };\n}\n\n// ============================================================================\n// In-Memory Storage Implementation\n// ============================================================================\n\n/**\n * Simple in-memory storage for plugins\n * Production would use SQLite or filesystem\n */\nexport class InMemoryPluginStorage implements PluginStorage {\n private data = new Map<string, unknown>();\n private prefix: string;\n\n constructor(pluginId: string) {\n this.prefix = `plugin:${pluginId}:`;\n }\n\n async get<T = unknown>(key: string): Promise<T | undefined> {\n return this.data.get(this.prefix + key) as T | undefined;\n }\n\n async set<T = unknown>(key: string, value: T): Promise<void> {\n this.data.set(this.prefix + key, value);\n }\n\n async delete(key: string): Promise<void> {\n this.data.delete(this.prefix + key);\n }\n\n async keys(prefix?: string): Promise<string[]> {\n const fullPrefix = this.prefix + (prefix || '');\n const keys: string[] = [];\n\n for (const key of this.data.keys()) {\n if (key.startsWith(fullPrefix)) {\n keys.push(key.slice(this.prefix.length));\n }\n }\n\n return keys;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a plugin registry with default configuration\n */\nexport function createPluginRegistry(options: {\n projectRoot: string;\n frameAccess: PluginFrameAccess;\n storageProvider?: (pluginId: string) => PluginStorage;\n}): PluginRegistry {\n return new PluginRegistry({\n projectRoot: options.projectRoot,\n frameAccess: options.frameAccess,\n storageProvider:\n options.storageProvider ||\n ((pluginId) => new InMemoryPluginStorage(pluginId)),\n });\n}\n\n/**\n * Create a mock frame access for testing\n */\nexport function createMockFrameAccess(): PluginFrameAccess {\n const frames = new Map<string, Frame>();\n\n return {\n async getActive(): Promise<Frame | undefined> {\n for (const frame of frames.values()) {\n if (frame.state === 'active') return frame;\n }\n return undefined;\n },\n\n async get(frameId: string): Promise<Frame | undefined> {\n return frames.get(frameId);\n },\n\n async getContext(_frameId: string): Promise<FrameContext | undefined> {\n return undefined;\n },\n\n async create(options): Promise<Frame> {\n const frame: Frame = {\n frame_id: `frame-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n run_id: 'mock-run',\n project_id: 'mock-project',\n parent_frame_id: options.parentFrameId,\n depth: options.parentFrameId ? 1 : 0,\n type: options.type,\n name: options.name,\n state: 'active',\n inputs: options.inputs || {},\n outputs: {},\n digest_json: {},\n created_at: Date.now(),\n };\n frames.set(frame.frame_id, frame);\n return frame;\n },\n\n async close(\n frameId: string,\n outputs?: Record<string, unknown>\n ): Promise<void> {\n const frame = frames.get(frameId);\n if (frame) {\n frame.state = 'closed';\n frame.outputs = outputs || {};\n frame.closed_at = Date.now();\n }\n },\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n IntegrationPlugin as Plugin,\n PluginRegistry as Registry,\n SimpleEventBus as EventBusImpl,\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/core/extensions/provider-adapter.ts"],
4
- "sourcesContent": ["/**\n * Provider Adapter Interface for StackMemory\n *\n * Philosophy: \"Standardize the intersection; expose the union\"\n * - Portable core stream API with shared semantics across all providers\n * - Provider-specific extensions available through explicit opt-in capabilities\n */\n\n// =============================================================================\n// Core Types - Portable across all providers\n// =============================================================================\n\n/**\n * Message role - intersection of all providers\n */\nexport type MessageRole = 'user' | 'assistant' | 'system';\n\n/**\n * Content block types - intersection of all providers\n */\nexport type ContentBlockType = 'text' | 'image' | 'tool_use' | 'tool_result';\n\n/**\n * Base content block\n */\nexport interface ContentBlock {\n type: ContentBlockType;\n}\n\nexport interface TextBlock extends ContentBlock {\n type: 'text';\n text: string;\n}\n\nexport interface ImageBlock extends ContentBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n mediaType: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n data: string;\n };\n}\n\nexport interface ToolUseBlock extends ContentBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock extends ContentBlock {\n type: 'tool_result';\n toolUseId: string;\n content: string | ContentBlock[];\n isError?: boolean;\n}\n\nexport type AnyContentBlock =\n | TextBlock\n | ImageBlock\n | ToolUseBlock\n | ToolResultBlock;\n\n/**\n * Message - portable message format\n */\nexport interface Message {\n role: MessageRole;\n content: string | AnyContentBlock[];\n}\n\n/**\n * Tool definition - portable tool schema\n */\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Stream options - core options for all providers\n */\nexport interface StreamOptions {\n model: string;\n maxTokens: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n system?: string;\n tools?: ToolDefinition[];\n}\n\n// =============================================================================\n// Stream Events - Portable event types\n// =============================================================================\n\nexport type StreamEventType =\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'error';\n\nexport interface StreamEventBase {\n type: StreamEventType;\n}\n\nexport interface MessageStartEvent extends StreamEventBase {\n type: 'message_start';\n message: {\n id: string;\n model: string;\n role: 'assistant';\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n };\n}\n\nexport interface ContentBlockStartEvent extends StreamEventBase {\n type: 'content_block_start';\n index: number;\n contentBlock: AnyContentBlock;\n}\n\nexport interface ContentBlockDeltaEvent extends StreamEventBase {\n type: 'content_block_delta';\n index: number;\n delta: {\n type: 'text_delta' | 'input_json_delta';\n text?: string;\n partialJson?: string;\n };\n}\n\nexport interface ContentBlockStopEvent extends StreamEventBase {\n type: 'content_block_stop';\n index: number;\n}\n\nexport interface MessageDeltaEvent extends StreamEventBase {\n type: 'message_delta';\n delta: {\n stopReason?: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use';\n };\n usage?: {\n outputTokens: number;\n };\n}\n\nexport interface MessageStopEvent extends StreamEventBase {\n type: 'message_stop';\n}\n\nexport interface ErrorEvent extends StreamEventBase {\n type: 'error';\n error: {\n type: string;\n message: string;\n };\n}\n\nexport type StreamEvent =\n | MessageStartEvent\n | ContentBlockStartEvent\n | ContentBlockDeltaEvent\n | ContentBlockStopEvent\n | MessageDeltaEvent\n | MessageStopEvent\n | ErrorEvent;\n\n// =============================================================================\n// Provider Capabilities - Union of provider-specific features\n// =============================================================================\n\n/**\n * Claude-specific extensions\n */\nexport interface ClaudeExtensions {\n /**\n * Extended thinking - deep reasoning capability\n */\n extendedThinking?: {\n enabled: boolean;\n budgetTokens?: number;\n };\n\n /**\n * XML-structured output preference\n */\n xmlOutput?: {\n enabled: boolean;\n rootElement?: string;\n };\n\n /**\n * Computer use - desktop automation\n */\n computerUse?: {\n enabled: boolean;\n displaySize?: { width: number; height: number };\n };\n\n /**\n * PDF/document support\n */\n documentSupport?: {\n enabled: boolean;\n maxPages?: number;\n };\n}\n\n/**\n * OpenAI GPT-specific extensions\n */\nexport interface GPTExtensions {\n /**\n * Code interpreter - execute Python code\n */\n codeInterpreter?: {\n enabled: boolean;\n fileIds?: string[];\n };\n\n /**\n * Web browsing capability\n */\n browsing?: {\n enabled: boolean;\n };\n\n /**\n * DALL-E image generation\n */\n imageGeneration?: {\n enabled: boolean;\n size?: '256x256' | '512x512' | '1024x1024' | '1792x1024' | '1024x1792';\n quality?: 'standard' | 'hd';\n };\n\n /**\n * Function calling mode\n */\n functionCalling?: {\n mode: 'auto' | 'none' | 'required';\n };\n\n /**\n * JSON mode output\n */\n jsonMode?: {\n enabled: boolean;\n schema?: Record<string, unknown>;\n };\n}\n\n/**\n * Google Gemini-specific extensions\n */\nexport interface GeminiExtensions {\n /**\n * Grounding with Google Search\n */\n grounding?: {\n enabled: boolean;\n dynamicThreshold?: number;\n };\n\n /**\n * Native multimodal - video/audio support\n */\n multimodal?: {\n videoEnabled: boolean;\n audioEnabled: boolean;\n maxVideoDurationSec?: number;\n };\n\n /**\n * Code execution\n */\n codeExecution?: {\n enabled: boolean;\n };\n\n /**\n * Safety settings\n */\n safetySettings?: Array<{\n category: string;\n threshold: 'BLOCK_NONE' | 'BLOCK_LOW' | 'BLOCK_MEDIUM' | 'BLOCK_HIGH';\n }>;\n}\n\n/**\n * All provider extensions - union type\n */\nexport interface ProviderExtensions {\n claude?: ClaudeExtensions;\n gpt?: GPTExtensions;\n gemini?: GeminiExtensions;\n}\n\n// =============================================================================\n// Provider Adapter Interface\n// =============================================================================\n\n/**\n * Provider adapter interface - core contract for all providers\n */\nexport interface ProviderAdapter {\n /**\n * Unique provider identifier\n */\n readonly id: string;\n\n /**\n * Human-readable provider name\n */\n readonly name: string;\n\n /**\n * Provider version\n */\n readonly version: string;\n\n /**\n * Available extensions for this provider\n */\n readonly extensions: Partial<ProviderExtensions>;\n\n /**\n * Check if provider supports a specific extension\n */\n supportsExtension(extension: keyof ProviderExtensions): boolean;\n\n /**\n * Core streaming API - portable across all providers\n */\n stream(\n messages: Message[],\n options: StreamOptions\n ): AsyncIterable<StreamEvent>;\n\n /**\n * Non-streaming completion\n */\n complete(\n messages: Message[],\n options: StreamOptions\n ): Promise<{\n content: AnyContentBlock[];\n usage: { inputTokens: number; outputTokens: number };\n stopReason: string;\n }>;\n\n /**\n * Validate API key / connection\n */\n validateConnection(): Promise<boolean>;\n\n /**\n * Get available models for this provider\n */\n listModels(): Promise<string[]>;\n}\n\n// =============================================================================\n// Claude Adapter Implementation\n// =============================================================================\n\n/**\n * Extended stream options for Claude\n */\nexport interface ClaudeStreamOptions extends StreamOptions {\n extensions?: ClaudeExtensions;\n}\n\n/**\n * Claude-specific stream events\n */\nexport interface ThinkingBlockStartEvent extends StreamEventBase {\n type: 'content_block_start';\n index: number;\n contentBlock: {\n type: 'thinking';\n thinking: string;\n };\n}\n\nexport interface ThinkingBlockDeltaEvent extends StreamEventBase {\n type: 'content_block_delta';\n index: number;\n delta: {\n type: 'thinking_delta';\n thinking: string;\n };\n}\n\n/**\n * Claude adapter - full implementation with extensions\n */\nexport class ClaudeAdapter implements ProviderAdapter {\n readonly id = 'claude';\n readonly name = 'Anthropic Claude';\n readonly version = '1.0.0';\n\n readonly extensions: ProviderExtensions = {\n claude: {\n extendedThinking: { enabled: true, budgetTokens: 10000 },\n xmlOutput: { enabled: true },\n computerUse: { enabled: true },\n documentSupport: { enabled: true, maxPages: 100 },\n },\n };\n\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: { apiKey: string; baseUrl?: string }) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || 'https://api.anthropic.com';\n }\n\n supportsExtension(extension: keyof ProviderExtensions): boolean {\n return extension === 'claude';\n }\n\n async *stream(\n messages: Message[],\n options: ClaudeStreamOptions\n ): AsyncIterable<StreamEvent> {\n const body = this.buildRequestBody(messages, options);\n\n const response = await fetch(`${this.baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-beta': this.getBetaFlags(options.extensions),\n },\n body: JSON.stringify({ ...body, stream: true }),\n });\n\n if (!response.ok) {\n yield {\n type: 'error',\n error: {\n type: 'api_error',\n message: `Claude API error: ${response.status} ${response.statusText}`,\n },\n };\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n yield {\n type: 'error',\n error: { type: 'stream_error', message: 'No response body' },\n };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const event = JSON.parse(data) as StreamEvent;\n yield this.normalizeEvent(event);\n } catch {\n // Skip malformed events\n }\n }\n }\n }\n }\n\n async complete(\n messages: Message[],\n options: ClaudeStreamOptions\n ): Promise<{\n content: AnyContentBlock[];\n usage: { inputTokens: number; outputTokens: number };\n stopReason: string;\n }> {\n const body = this.buildRequestBody(messages, options);\n\n const response = await fetch(`${this.baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-beta': this.getBetaFlags(options.extensions),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(\n `Claude API error: ${response.status} ${response.statusText}`\n );\n }\n\n const data = await response.json();\n\n return {\n content: data.content as AnyContentBlock[],\n usage: {\n inputTokens: data.usage?.input_tokens ?? 0,\n outputTokens: data.usage?.output_tokens ?? 0,\n },\n stopReason: data.stop_reason ?? 'end_turn',\n };\n }\n\n async validateConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: 'claude-3-5-haiku-20241022',\n max_tokens: 1,\n messages: [{ role: 'user', content: 'hi' }],\n }),\n });\n return response.ok || response.status === 400;\n } catch {\n return false;\n }\n }\n\n async listModels(): Promise<string[]> {\n return [\n 'claude-opus-4-20250514',\n 'claude-sonnet-4-20250514',\n 'claude-3-5-haiku-20241022',\n 'claude-3-opus-20240229',\n ];\n }\n\n private buildRequestBody(\n messages: Message[],\n options: ClaudeStreamOptions\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: options.model,\n max_tokens: options.maxTokens,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n };\n\n if (options.temperature !== undefined) {\n body.temperature = options.temperature;\n }\n if (options.topP !== undefined) {\n body.top_p = options.topP;\n }\n if (options.stopSequences?.length) {\n body.stop_sequences = options.stopSequences;\n }\n if (options.system) {\n body.system = options.system;\n }\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }));\n }\n\n // Claude extensions\n if (options.extensions?.extendedThinking?.enabled) {\n body.thinking = {\n type: 'enabled',\n budget_tokens:\n options.extensions.extendedThinking.budgetTokens || 10000,\n };\n // Extended thinking requires temperature = 1\n body.temperature = 1;\n }\n\n return body;\n }\n\n private getBetaFlags(extensions?: ClaudeExtensions): string {\n const flags: string[] = [];\n\n if (extensions?.extendedThinking?.enabled) {\n flags.push('interleaved-thinking-2025-05-14');\n }\n if (extensions?.computerUse?.enabled) {\n flags.push('computer-use-2024-10-22');\n }\n if (extensions?.documentSupport?.enabled) {\n flags.push('pdfs-2024-09-25');\n }\n\n return flags.join(',');\n }\n\n private normalizeEvent(event: StreamEvent): StreamEvent {\n // Normalize Claude-specific events to portable format\n return event;\n }\n}\n\n// =============================================================================\n// GPT Adapter Stub\n// =============================================================================\n\n/**\n * Extended stream options for GPT\n */\nexport interface GPTStreamOptions extends StreamOptions {\n extensions?: GPTExtensions;\n}\n\n/**\n * GPT adapter - stub implementation\n */\nexport class GPTAdapter implements ProviderAdapter {\n readonly id = 'gpt';\n readonly name = 'OpenAI GPT';\n readonly version = '1.0.0';\n\n readonly extensions: ProviderExtensions = {\n gpt: {\n codeInterpreter: { enabled: true },\n browsing: { enabled: true },\n imageGeneration: {\n enabled: true,\n size: '1024x1024',\n quality: 'standard',\n },\n functionCalling: { mode: 'auto' },\n jsonMode: { enabled: true },\n },\n };\n\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: { apiKey: string; baseUrl?: string }) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || 'https://api.openai.com';\n }\n\n supportsExtension(extension: keyof ProviderExtensions): boolean {\n return extension === 'gpt';\n }\n\n async *stream(\n messages: Message[],\n options: GPTStreamOptions\n ): AsyncIterable<StreamEvent> {\n // Convert messages to OpenAI format\n const openaiMessages = messages.map((m) => ({\n role: m.role,\n content:\n typeof m.content === 'string'\n ? m.content\n : m.content\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join(''),\n }));\n\n const body: Record<string, unknown> = {\n model: options.model,\n max_tokens: options.maxTokens,\n messages: openaiMessages,\n stream: true,\n };\n\n if (options.temperature !== undefined) {\n body.temperature = options.temperature;\n }\n if (options.topP !== undefined) {\n body.top_p = options.topP;\n }\n\n // GPT extensions\n if (options.extensions?.jsonMode?.enabled) {\n body.response_format = { type: 'json_object' };\n }\n\n if (options.tools?.length) {\n body.tools = options.tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n\n if (options.extensions?.functionCalling?.mode) {\n body.tool_choice = options.extensions.functionCalling.mode;\n }\n }\n\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n yield {\n type: 'error',\n error: {\n type: 'api_error',\n message: `GPT API error: ${response.status} ${response.statusText}`,\n },\n };\n return;\n }\n\n // Yield message start\n yield {\n type: 'message_start',\n message: {\n id: `msg_${Date.now()}`,\n model: options.model,\n role: 'assistant',\n },\n };\n\n const reader = response.body?.getReader();\n if (!reader) return;\n\n const decoder = new TextDecoder();\n let buffer = '';\n const blockIndex = 0;\n let blockStarted = false;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n if (blockStarted) {\n yield { type: 'content_block_stop', index: blockIndex };\n }\n yield { type: 'message_stop' };\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content && !blockStarted) {\n blockStarted = true;\n yield {\n type: 'content_block_start',\n index: blockIndex,\n contentBlock: { type: 'text', text: '' },\n };\n }\n\n if (delta?.content) {\n yield {\n type: 'content_block_delta',\n index: blockIndex,\n delta: { type: 'text_delta', text: delta.content },\n };\n }\n } catch {\n // Skip malformed events\n }\n }\n }\n }\n }\n\n async complete(\n messages: Message[],\n options: GPTStreamOptions\n ): Promise<{\n content: AnyContentBlock[];\n usage: { inputTokens: number; outputTokens: number };\n stopReason: string;\n }> {\n const openaiMessages = messages.map((m) => ({\n role: m.role,\n content:\n typeof m.content === 'string'\n ? m.content\n : m.content\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join(''),\n }));\n\n const body: Record<string, unknown> = {\n model: options.model,\n max_tokens: options.maxTokens,\n messages: openaiMessages,\n };\n\n if (options.temperature !== undefined) {\n body.temperature = options.temperature;\n }\n\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(\n `GPT API error: ${response.status} ${response.statusText}`\n );\n }\n\n const data = await response.json();\n const choice = data.choices?.[0];\n\n return {\n content: [{ type: 'text', text: choice?.message?.content ?? '' }],\n usage: {\n inputTokens: data.usage?.prompt_tokens ?? 0,\n outputTokens: data.usage?.completion_tokens ?? 0,\n },\n stopReason: choice?.finish_reason ?? 'stop',\n };\n }\n\n async validateConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async listModels(): Promise<string[]> {\n return [\n 'gpt-4o',\n 'gpt-4o-mini',\n 'gpt-4-turbo',\n 'gpt-4',\n 'gpt-3.5-turbo',\n 'o1',\n 'o1-mini',\n 'o1-preview',\n ];\n }\n}\n\n// =============================================================================\n// Gemini Adapter Stub\n// =============================================================================\n\n/**\n * Extended stream options for Gemini\n */\nexport interface GeminiStreamOptions extends StreamOptions {\n extensions?: GeminiExtensions;\n}\n\n/**\n * Gemini adapter - stub implementation\n */\nexport class GeminiAdapter implements ProviderAdapter {\n readonly id = 'gemini';\n readonly name = 'Google Gemini';\n readonly version = '1.0.0';\n\n readonly extensions: ProviderExtensions = {\n gemini: {\n grounding: { enabled: true, dynamicThreshold: 0.3 },\n multimodal: {\n videoEnabled: true,\n audioEnabled: true,\n maxVideoDurationSec: 60,\n },\n codeExecution: { enabled: true },\n },\n };\n\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: { apiKey: string; baseUrl?: string }) {\n this.apiKey = config.apiKey;\n this.baseUrl =\n config.baseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n }\n\n supportsExtension(extension: keyof ProviderExtensions): boolean {\n return extension === 'gemini';\n }\n\n async *stream(\n messages: Message[],\n options: GeminiStreamOptions\n ): AsyncIterable<StreamEvent> {\n // Convert messages to Gemini format\n const contents = messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [\n {\n text:\n typeof m.content === 'string'\n ? m.content\n : m.content\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join(''),\n },\n ],\n }));\n\n const body: Record<string, unknown> = {\n contents,\n generationConfig: {\n maxOutputTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n },\n };\n\n // System instruction\n const systemMsg = messages.find((m) => m.role === 'system');\n if (systemMsg || options.system) {\n body.systemInstruction = {\n parts: [\n {\n text:\n options.system ||\n (typeof systemMsg?.content === 'string' ? systemMsg.content : ''),\n },\n ],\n };\n }\n\n // Gemini extensions\n if (options.extensions?.grounding?.enabled) {\n body.tools = [\n {\n googleSearchRetrieval: {\n dynamicRetrievalConfig: {\n mode: 'MODE_DYNAMIC',\n dynamicThreshold: options.extensions.grounding.dynamicThreshold,\n },\n },\n },\n ];\n }\n\n if (options.extensions?.codeExecution?.enabled) {\n body.tools = [\n ...((body.tools as unknown[]) || []),\n { codeExecution: {} },\n ];\n }\n\n if (options.extensions?.safetySettings) {\n body.safetySettings = options.extensions.safetySettings;\n }\n\n const url = `${this.baseUrl}/models/${options.model}:streamGenerateContent?key=${this.apiKey}&alt=sse`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n yield {\n type: 'error',\n error: {\n type: 'api_error',\n message: `Gemini API error: ${response.status} ${response.statusText}`,\n },\n };\n return;\n }\n\n yield {\n type: 'message_start',\n message: {\n id: `msg_${Date.now()}`,\n model: options.model,\n role: 'assistant',\n },\n };\n\n const reader = response.body?.getReader();\n if (!reader) return;\n\n const decoder = new TextDecoder();\n let buffer = '';\n const blockIndex = 0;\n let blockStarted = false;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n try {\n const parsed = JSON.parse(line.slice(6));\n const text = parsed.candidates?.[0]?.content?.parts?.[0]?.text;\n\n if (text && !blockStarted) {\n blockStarted = true;\n yield {\n type: 'content_block_start',\n index: blockIndex,\n contentBlock: { type: 'text', text: '' },\n };\n }\n\n if (text) {\n yield {\n type: 'content_block_delta',\n index: blockIndex,\n delta: { type: 'text_delta', text },\n };\n }\n } catch {\n // Skip malformed events\n }\n }\n }\n }\n\n if (blockStarted) {\n yield { type: 'content_block_stop', index: blockIndex };\n }\n yield { type: 'message_stop' };\n }\n\n async complete(\n messages: Message[],\n options: GeminiStreamOptions\n ): Promise<{\n content: AnyContentBlock[];\n usage: { inputTokens: number; outputTokens: number };\n stopReason: string;\n }> {\n const contents = messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [\n {\n text:\n typeof m.content === 'string'\n ? m.content\n : m.content\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join(''),\n },\n ],\n }));\n\n const body: Record<string, unknown> = {\n contents,\n generationConfig: {\n maxOutputTokens: options.maxTokens,\n temperature: options.temperature,\n },\n };\n\n const url = `${this.baseUrl}/models/${options.model}:generateContent?key=${this.apiKey}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(\n `Gemini API error: ${response.status} ${response.statusText}`\n );\n }\n\n const data = await response.json();\n const candidate = data.candidates?.[0];\n const text = candidate?.content?.parts?.[0]?.text ?? '';\n\n return {\n content: [{ type: 'text', text }],\n usage: {\n inputTokens: data.usageMetadata?.promptTokenCount ?? 0,\n outputTokens: data.usageMetadata?.candidatesTokenCount ?? 0,\n },\n stopReason: candidate?.finishReason ?? 'STOP',\n };\n }\n\n async validateConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/models?key=${this.apiKey}`);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async listModels(): Promise<string[]> {\n return [\n 'gemini-2.0-flash-exp',\n 'gemini-1.5-pro',\n 'gemini-1.5-flash',\n 'gemini-1.5-flash-8b',\n 'gemini-1.0-pro',\n ];\n }\n}\n\n// =============================================================================\n// Provider Registry\n// =============================================================================\n\nexport type ProviderId = 'claude' | 'gpt' | 'gemini';\n\n/**\n * Provider configuration\n */\nexport interface ProviderConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\n/**\n * Create a provider adapter\n */\nexport function createProvider(\n id: ProviderId,\n config: ProviderConfig\n): ProviderAdapter {\n switch (id) {\n case 'claude':\n return new ClaudeAdapter(config);\n case 'gpt':\n return new GPTAdapter(config);\n case 'gemini':\n return new GeminiAdapter(config);\n default:\n throw new Error(`Unknown provider: ${id}`);\n }\n}\n\n/**\n * Provider registry for managing multiple providers\n */\nexport class ProviderRegistry {\n private providers = new Map<string, ProviderAdapter>();\n\n register(adapter: ProviderAdapter): void {\n this.providers.set(adapter.id, adapter);\n }\n\n get(id: string): ProviderAdapter | undefined {\n return this.providers.get(id);\n }\n\n list(): ProviderAdapter[] {\n return Array.from(this.providers.values());\n }\n\n has(id: string): boolean {\n return this.providers.has(id);\n }\n\n /**\n * Find providers that support a specific extension\n */\n findByExtension(extension: keyof ProviderExtensions): ProviderAdapter[] {\n return this.list().filter((p) => p.supportsExtension(extension));\n }\n}\n\n/**\n * Global provider registry\n */\nexport const providerRegistry = new ProviderRegistry();\n"],
5
- "mappings": "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",
6
- "names": []
7
- }