@stackmemoryai/stackmemory 0.5.58 → 0.5.61

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 (932) hide show
  1. package/README.md +105 -1
  2. package/dist/scripts/benchmark-performance.js +48 -0
  3. package/dist/scripts/benchmark-performance.js.map +7 -0
  4. package/dist/scripts/check-redis.js +42 -0
  5. package/dist/scripts/check-redis.js.map +7 -0
  6. package/dist/scripts/initialize.js +116 -0
  7. package/dist/scripts/initialize.js.map +7 -0
  8. package/dist/scripts/list-linear-tasks.js +124 -0
  9. package/dist/scripts/list-linear-tasks.js.map +7 -0
  10. package/dist/scripts/measure-handoff-impact.js +340 -0
  11. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  12. package/dist/scripts/query-chromadb.js +160 -0
  13. package/dist/scripts/query-chromadb.js.map +7 -0
  14. package/dist/scripts/show-linear-summary.js +119 -0
  15. package/dist/scripts/show-linear-summary.js.map +7 -0
  16. package/dist/scripts/simple-swarm-demo.js +90 -0
  17. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  18. package/dist/scripts/status.js +155 -0
  19. package/dist/scripts/status.js.map +7 -0
  20. package/dist/scripts/test-chromadb-sync.js +192 -0
  21. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  22. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  23. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  24. package/dist/scripts/test-ralph-iterations.js +121 -0
  25. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  26. package/dist/scripts/test-redis-storage.js +389 -0
  27. package/dist/scripts/test-redis-storage.js.map +7 -0
  28. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  29. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  30. package/dist/scripts/test-swarm-fixes.js +125 -0
  31. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  32. package/dist/scripts/test-swarm-tui.js +23 -0
  33. package/dist/scripts/test-swarm-tui.js.map +7 -0
  34. package/dist/scripts/test-tui-shortcuts.js +52 -0
  35. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  36. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  37. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  38. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  39. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  40. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  41. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  42. package/dist/src/cli/auto-detect.js.map +7 -0
  43. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  44. package/dist/src/cli/claude-sm.js +1236 -0
  45. package/dist/src/cli/claude-sm.js.map +7 -0
  46. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  47. package/dist/src/cli/codex-sm.js.map +7 -0
  48. package/dist/src/cli/commands/api.js.map +7 -0
  49. package/dist/src/cli/commands/auto-background.js.map +7 -0
  50. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  51. package/dist/src/cli/commands/clear.js.map +7 -0
  52. package/dist/src/cli/commands/config.js.map +7 -0
  53. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  54. package/dist/src/cli/commands/context.js.map +7 -0
  55. package/dist/src/cli/commands/daemon.js.map +7 -0
  56. package/dist/src/cli/commands/dashboard.js.map +7 -0
  57. package/dist/src/cli/commands/db.js.map +7 -0
  58. package/dist/src/cli/commands/decision.js.map +7 -0
  59. package/dist/src/cli/commands/discovery.js.map +7 -0
  60. package/dist/src/cli/commands/handoff.js.map +7 -0
  61. package/dist/src/cli/commands/hooks.js.map +7 -0
  62. package/dist/src/cli/commands/linear.js.map +7 -0
  63. package/dist/src/cli/commands/log.js.map +7 -0
  64. package/dist/src/cli/commands/login.js.map +7 -0
  65. package/dist/src/cli/commands/migrate.js.map +7 -0
  66. package/dist/src/cli/commands/model.js.map +7 -0
  67. package/dist/src/cli/commands/onboard.js.map +7 -0
  68. package/dist/src/cli/commands/projects.js.map +7 -0
  69. package/dist/src/cli/commands/ralph.js.map +7 -0
  70. package/dist/src/cli/commands/retrieval.js.map +7 -0
  71. package/dist/src/cli/commands/search.js +173 -0
  72. package/dist/src/cli/commands/search.js.map +7 -0
  73. package/dist/src/cli/commands/service.js.map +7 -0
  74. package/dist/src/cli/commands/session.js.map +7 -0
  75. package/dist/src/cli/commands/settings.js.map +7 -0
  76. package/dist/src/cli/commands/setup.js.map +7 -0
  77. package/dist/src/cli/commands/shell.js.map +7 -0
  78. package/dist/src/cli/commands/signup.js.map +7 -0
  79. package/dist/src/cli/commands/skills.js.map +7 -0
  80. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  81. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  82. package/dist/src/cli/commands/sweep.js.map +7 -0
  83. package/dist/src/cli/commands/tasks.js.map +7 -0
  84. package/dist/src/cli/commands/worktree.js.map +7 -0
  85. package/dist/src/cli/index.js +609 -0
  86. package/dist/src/cli/index.js.map +7 -0
  87. package/dist/src/cli/opencode-sm.js.map +7 -0
  88. package/dist/src/cli/utils/viewer.js.map +7 -0
  89. package/dist/src/core/config/config-manager.js.map +7 -0
  90. package/dist/src/core/config/feature-flags.js.map +7 -0
  91. package/dist/src/core/config/storage-config.js.map +7 -0
  92. package/dist/src/core/config/types.js.map +7 -0
  93. package/dist/src/core/context/auto-context.js.map +7 -0
  94. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  95. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  96. package/dist/src/core/context/frame-database.js.map +7 -0
  97. package/dist/src/core/context/frame-digest.js.map +7 -0
  98. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  99. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  100. package/dist/src/core/context/frame-recovery.js.map +7 -0
  101. package/dist/src/core/context/frame-stack.js.map +7 -0
  102. package/dist/src/core/context/index.js.map +7 -0
  103. package/dist/src/core/context/permission-manager.js.map +7 -0
  104. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  105. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  106. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  107. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  108. package/dist/src/core/context/validation.js.map +7 -0
  109. package/dist/src/core/database/batch-operations.js.map +7 -0
  110. package/dist/src/core/database/connection-pool.js.map +7 -0
  111. package/dist/src/core/database/database-adapter.js.map +7 -0
  112. package/dist/src/core/database/migration-manager.js.map +7 -0
  113. package/dist/src/core/database/query-cache.js.map +7 -0
  114. package/dist/src/core/database/query-router.js.map +7 -0
  115. package/dist/src/core/database/sqlite-adapter.js +738 -0
  116. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  117. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  118. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  119. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  120. package/dist/src/core/digest/index.js.map +7 -0
  121. package/dist/src/core/digest/types.js.map +7 -0
  122. package/dist/src/core/errors/error-utils.js +208 -0
  123. package/dist/src/core/errors/error-utils.js.map +7 -0
  124. package/dist/src/core/errors/index.js +521 -0
  125. package/dist/src/core/errors/index.js.map +7 -0
  126. package/dist/src/core/errors/recovery.js.map +7 -0
  127. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  128. package/dist/src/core/extensions/custom-tools.js +567 -0
  129. package/dist/src/core/extensions/custom-tools.js.map +7 -0
  130. package/dist/src/core/extensions/index.js +55 -0
  131. package/dist/src/core/extensions/index.js.map +7 -0
  132. package/dist/src/core/extensions/loader.js +709 -0
  133. package/dist/src/core/extensions/loader.js.map +7 -0
  134. package/dist/src/core/extensions/plugin-system.js +506 -0
  135. package/dist/src/core/extensions/plugin-system.js.map +7 -0
  136. package/dist/src/core/extensions/provider-adapter.js +617 -0
  137. package/dist/src/core/extensions/provider-adapter.js.map +7 -0
  138. package/dist/src/core/extensions/sandbox-runtime.js +664 -0
  139. package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
  140. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  141. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  142. package/dist/src/core/merge/index.js.map +7 -0
  143. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  144. package/dist/src/core/merge/stack-diff.js.map +7 -0
  145. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  146. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  147. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  148. package/dist/src/core/models/model-router.js.map +7 -0
  149. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  150. package/dist/src/core/monitoring/logger.js +202 -0
  151. package/dist/src/core/monitoring/logger.js.map +7 -0
  152. package/dist/src/core/monitoring/metrics.js.map +7 -0
  153. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  154. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  155. package/dist/src/core/performance/context-cache.js.map +7 -0
  156. package/dist/src/core/performance/index.js.map +7 -0
  157. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  158. package/dist/src/core/performance/monitor.js.map +7 -0
  159. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  160. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  161. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  162. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  163. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  164. package/dist/src/core/projects/project-isolation.js.map +7 -0
  165. package/dist/src/core/projects/project-manager.js.map +7 -0
  166. package/dist/src/core/query/query-parser.js.map +7 -0
  167. package/dist/src/core/query/query-templates.js.map +7 -0
  168. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  169. package/dist/src/core/retrieval/index.js.map +7 -0
  170. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  171. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  172. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  173. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  174. package/dist/src/core/retrieval/types.js.map +7 -0
  175. package/dist/src/core/security/index.js +35 -0
  176. package/dist/src/core/security/index.js.map +7 -0
  177. package/dist/src/core/security/input-sanitizer.js +321 -0
  178. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  179. package/dist/src/core/session/clear-survival.js.map +7 -0
  180. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  181. package/dist/src/core/session/handoff-generator.js.map +7 -0
  182. package/dist/src/core/session/index.js.map +7 -0
  183. package/dist/src/core/session/session-manager.js.map +7 -0
  184. package/dist/src/core/skills/index.js.map +7 -0
  185. package/dist/src/core/skills/skill-storage.js.map +7 -0
  186. package/dist/src/core/skills/types.js.map +7 -0
  187. package/dist/src/core/storage/chromadb-adapter.js +380 -0
  188. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  189. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  190. package/dist/src/core/storage/remote-storage.js.map +7 -0
  191. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  192. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  193. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  194. package/dist/src/core/trace/debug-trace.js.map +7 -0
  195. package/dist/src/core/trace/index.js.map +7 -0
  196. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  197. package/dist/src/core/trace/trace-detector.js.map +7 -0
  198. package/dist/src/core/trace/trace-store.js.map +7 -0
  199. package/dist/src/core/trace/types.js.map +7 -0
  200. package/dist/src/core/utils/async-mutex.js.map +7 -0
  201. package/dist/src/core/utils/compression.js.map +7 -0
  202. package/dist/src/core/utils/update-checker.js.map +7 -0
  203. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  204. package/dist/src/daemon/daemon-config.js.map +7 -0
  205. package/dist/src/daemon/services/context-service.js.map +7 -0
  206. package/dist/src/daemon/services/linear-service.js.map +7 -0
  207. package/dist/src/daemon/session-daemon.js.map +7 -0
  208. package/dist/src/daemon/unified-daemon.js.map +7 -0
  209. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  210. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  211. package/dist/src/features/analytics/index.js.map +7 -0
  212. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  213. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  214. package/dist/src/features/sweep/index.js.map +7 -0
  215. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  216. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  217. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  218. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  219. package/dist/src/features/sweep/status-bar.js.map +7 -0
  220. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  221. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  222. package/dist/src/features/sweep/types.js.map +7 -0
  223. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  224. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  225. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  226. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  227. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  228. package/dist/src/features/web/server/index.js.map +7 -0
  229. package/dist/src/hooks/auto-background.js.map +7 -0
  230. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  231. package/dist/src/hooks/config.js.map +7 -0
  232. package/dist/src/hooks/daemon.js.map +7 -0
  233. package/dist/src/hooks/events.js.map +7 -0
  234. package/dist/src/hooks/index.js.map +7 -0
  235. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  236. package/dist/src/hooks/schemas.js.map +7 -0
  237. package/dist/src/hooks/secure-fs.js.map +7 -0
  238. package/dist/src/hooks/security-logger.js.map +7 -0
  239. package/dist/src/hooks/session-summary.js.map +7 -0
  240. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  241. package/dist/src/hooks/sms-notify.js.map +7 -0
  242. package/dist/src/hooks/sms-watcher.js.map +7 -0
  243. package/dist/src/hooks/sms-webhook.js.map +7 -0
  244. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  245. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  246. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  247. package/dist/src/index.js.map +7 -0
  248. package/dist/src/integrations/anthropic/client.js.map +7 -0
  249. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  250. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  251. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  252. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  253. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  254. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  255. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  256. package/dist/src/integrations/linear/auth.js.map +7 -0
  257. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  258. package/dist/src/integrations/linear/client.js +634 -0
  259. package/dist/src/integrations/linear/client.js.map +7 -0
  260. package/dist/src/integrations/linear/config.js.map +7 -0
  261. package/dist/src/integrations/linear/migration.js.map +7 -0
  262. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  263. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  264. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  265. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  266. package/dist/src/integrations/linear/sync.js.map +7 -0
  267. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  268. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  269. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  270. package/dist/src/integrations/linear/webhook.js.map +7 -0
  271. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  272. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  273. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  274. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  275. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  276. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  277. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  278. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  279. package/dist/src/integrations/mcp/index.js.map +7 -0
  280. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  281. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  282. package/dist/src/integrations/mcp/remote-server.js +682 -0
  283. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  284. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  285. package/dist/src/integrations/mcp/server.js +1975 -0
  286. package/dist/src/integrations/mcp/server.js.map +7 -0
  287. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  288. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  289. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  290. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  291. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  292. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  293. package/dist/src/integrations/ralph/index.js.map +7 -0
  294. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  295. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  296. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  297. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  298. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  299. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  300. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  301. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  302. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  303. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  304. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  305. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  306. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  307. package/dist/src/integrations/ralph/types.js +5 -0
  308. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  309. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  310. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  311. package/dist/src/models/user.model.js.map +7 -0
  312. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  313. package/dist/src/services/config-service.js.map +7 -0
  314. package/dist/src/services/context-service.js.map +7 -0
  315. package/dist/src/skills/api-discovery.js.map +7 -0
  316. package/dist/src/skills/api-skill.js.map +7 -0
  317. package/dist/src/skills/claude-skills.js.map +7 -0
  318. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  319. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  320. package/dist/src/skills/repo-ingestion-skill.js +632 -0
  321. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  322. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  323. package/dist/src/types/task.js.map +7 -0
  324. package/dist/src/utils/env.js.map +7 -0
  325. package/dist/src/utils/formatting.js.map +7 -0
  326. package/dist/src/utils/process-cleanup.js.map +7 -0
  327. package/package.json +13 -9
  328. package/scripts/background-sync-manager.js +145 -83
  329. package/scripts/claude-sm-autostart.js +17 -12
  330. package/scripts/gepa/README.md +275 -0
  331. package/scripts/gepa/config.json +53 -0
  332. package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
  333. package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
  334. package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
  335. package/scripts/gepa/generations/gen-000/baseline.md +124 -0
  336. package/scripts/gepa/hooks/auto-optimize.js +494 -0
  337. package/scripts/gepa/hooks/eval-tracker.js +203 -0
  338. package/scripts/gepa/hooks/reflect.js +311 -0
  339. package/scripts/gepa/optimize.js +611 -0
  340. package/scripts/gepa/state.json +14 -0
  341. package/scripts/initialize.ts +16 -7
  342. package/scripts/install.sh +14 -62
  343. package/scripts/status.ts +111 -46
  344. package/scripts/test-pre-publish-quick.sh +1 -1
  345. package/dist/agents/core/agent-task-manager.js.map +0 -7
  346. package/dist/agents/testing-agent.js +0 -614
  347. package/dist/agents/testing-agent.js.map +0 -7
  348. package/dist/agents/verifiers/base-verifier.js.map +0 -7
  349. package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
  350. package/dist/agents/verifiers/llm-judge.js.map +0 -7
  351. package/dist/cli/auto-detect.js.map +0 -7
  352. package/dist/cli/browser-test.js +0 -33
  353. package/dist/cli/browser-test.js.map +0 -7
  354. package/dist/cli/claude-sm-danger.js.map +0 -7
  355. package/dist/cli/claude-sm.js +0 -1156
  356. package/dist/cli/claude-sm.js.map +0 -7
  357. package/dist/cli/codex-sm-danger.js.map +0 -7
  358. package/dist/cli/codex-sm.js.map +0 -7
  359. package/dist/cli/commands/api.js.map +0 -7
  360. package/dist/cli/commands/auto-background.js.map +0 -7
  361. package/dist/cli/commands/cleanup-processes.js.map +0 -7
  362. package/dist/cli/commands/clear.js.map +0 -7
  363. package/dist/cli/commands/config.js.map +0 -7
  364. package/dist/cli/commands/context-rehydrate.js.map +0 -7
  365. package/dist/cli/commands/context.js.map +0 -7
  366. package/dist/cli/commands/daemon.js.map +0 -7
  367. package/dist/cli/commands/dashboard.js.map +0 -7
  368. package/dist/cli/commands/db.js.map +0 -7
  369. package/dist/cli/commands/decision.js.map +0 -7
  370. package/dist/cli/commands/discovery.js.map +0 -7
  371. package/dist/cli/commands/handoff.js.map +0 -7
  372. package/dist/cli/commands/hooks.js.map +0 -7
  373. package/dist/cli/commands/linear-unified.js +0 -353
  374. package/dist/cli/commands/linear-unified.js.map +0 -7
  375. package/dist/cli/commands/linear.js.map +0 -7
  376. package/dist/cli/commands/log.js.map +0 -7
  377. package/dist/cli/commands/login.js.map +0 -7
  378. package/dist/cli/commands/migrate.js.map +0 -7
  379. package/dist/cli/commands/model.js.map +0 -7
  380. package/dist/cli/commands/monitor.js +0 -313
  381. package/dist/cli/commands/monitor.js.map +0 -7
  382. package/dist/cli/commands/onboard.js.map +0 -7
  383. package/dist/cli/commands/projects.js.map +0 -7
  384. package/dist/cli/commands/quality.js +0 -413
  385. package/dist/cli/commands/quality.js.map +0 -7
  386. package/dist/cli/commands/ralph.js.map +0 -7
  387. package/dist/cli/commands/retrieval.js.map +0 -7
  388. package/dist/cli/commands/search.js +0 -156
  389. package/dist/cli/commands/search.js.map +0 -7
  390. package/dist/cli/commands/service.js.map +0 -7
  391. package/dist/cli/commands/session.js.map +0 -7
  392. package/dist/cli/commands/settings.js.map +0 -7
  393. package/dist/cli/commands/setup.js.map +0 -7
  394. package/dist/cli/commands/shell.js.map +0 -7
  395. package/dist/cli/commands/signup.js.map +0 -7
  396. package/dist/cli/commands/skills.js.map +0 -7
  397. package/dist/cli/commands/sms-notify.js.map +0 -7
  398. package/dist/cli/commands/storage-tier.js.map +0 -7
  399. package/dist/cli/commands/storage.js +0 -360
  400. package/dist/cli/commands/storage.js.map +0 -7
  401. package/dist/cli/commands/sweep.js.map +0 -7
  402. package/dist/cli/commands/tasks.js.map +0 -7
  403. package/dist/cli/commands/test.js +0 -286
  404. package/dist/cli/commands/test.js.map +0 -7
  405. package/dist/cli/commands/workflow.js +0 -142
  406. package/dist/cli/commands/workflow.js.map +0 -7
  407. package/dist/cli/commands/worktree.js.map +0 -7
  408. package/dist/cli/index.js +0 -594
  409. package/dist/cli/index.js.map +0 -7
  410. package/dist/cli/opencode-sm.js.map +0 -7
  411. package/dist/cli/utils/viewer.js.map +0 -7
  412. package/dist/core/analytics/team-analytics.js +0 -378
  413. package/dist/core/analytics/team-analytics.js.map +0 -7
  414. package/dist/core/config/config-manager.js.map +0 -7
  415. package/dist/core/config/feature-flags.js.map +0 -7
  416. package/dist/core/config/storage-config.js.map +0 -7
  417. package/dist/core/config/types.js.map +0 -7
  418. package/dist/core/context/auto-context.js.map +0 -7
  419. package/dist/core/context/dual-stack-manager.js.map +0 -7
  420. package/dist/core/context/enhanced-rehydration.js.map +0 -7
  421. package/dist/core/context/frame-database.js.map +0 -7
  422. package/dist/core/context/frame-digest.js.map +0 -7
  423. package/dist/core/context/frame-handoff-manager.js.map +0 -7
  424. package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
  425. package/dist/core/context/frame-manager.js +0 -1069
  426. package/dist/core/context/frame-manager.js.map +0 -7
  427. package/dist/core/context/frame-recovery.js.map +0 -7
  428. package/dist/core/context/frame-stack.js.map +0 -7
  429. package/dist/core/context/incremental-gc.js +0 -290
  430. package/dist/core/context/incremental-gc.js.map +0 -7
  431. package/dist/core/context/index.js.map +0 -7
  432. package/dist/core/context/model-aware-compaction.js +0 -623
  433. package/dist/core/context/model-aware-compaction.js.map +0 -7
  434. package/dist/core/context/permission-manager.js.map +0 -7
  435. package/dist/core/context/recursive-context-manager.js.map +0 -7
  436. package/dist/core/context/refactored-frame-manager.js.map +0 -7
  437. package/dist/core/context/shared-context-layer.js.map +0 -7
  438. package/dist/core/context/stack-merge-resolver.js.map +0 -7
  439. package/dist/core/context/validation.js.map +0 -7
  440. package/dist/core/database/batch-operations.js.map +0 -7
  441. package/dist/core/database/connection-pool.js.map +0 -7
  442. package/dist/core/database/database-adapter.js.map +0 -7
  443. package/dist/core/database/migration-manager.js.map +0 -7
  444. package/dist/core/database/paradedb-adapter.js +0 -990
  445. package/dist/core/database/paradedb-adapter.js.map +0 -7
  446. package/dist/core/database/query-cache.js.map +0 -7
  447. package/dist/core/database/query-router.js.map +0 -7
  448. package/dist/core/database/sqlite-adapter.js +0 -728
  449. package/dist/core/database/sqlite-adapter.js.map +0 -7
  450. package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
  451. package/dist/core/digest/frame-digest-integration.js.map +0 -7
  452. package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
  453. package/dist/core/digest/index.js.map +0 -7
  454. package/dist/core/digest/types.js.map +0 -7
  455. package/dist/core/errors/index.js +0 -512
  456. package/dist/core/errors/index.js.map +0 -7
  457. package/dist/core/errors/recovery.js.map +0 -7
  458. package/dist/core/execution/parallel-executor.js.map +0 -7
  459. package/dist/core/frame/workflow-templates.js.map +0 -7
  460. package/dist/core/merge/conflict-detector.js.map +0 -7
  461. package/dist/core/merge/index.js.map +0 -7
  462. package/dist/core/merge/resolution-engine.js.map +0 -7
  463. package/dist/core/merge/stack-diff.js.map +0 -7
  464. package/dist/core/models/fallback-monitor.js.map +0 -7
  465. package/dist/core/models/model-router.js.map +0 -7
  466. package/dist/core/monitoring/error-handler.js.map +0 -7
  467. package/dist/core/monitoring/logger.js +0 -150
  468. package/dist/core/monitoring/logger.js.map +0 -7
  469. package/dist/core/monitoring/metrics.js.map +0 -7
  470. package/dist/core/monitoring/progress-tracker.js.map +0 -7
  471. package/dist/core/monitoring/session-monitor.js.map +0 -7
  472. package/dist/core/performance/context-cache.js.map +0 -7
  473. package/dist/core/performance/index.js.map +0 -7
  474. package/dist/core/performance/lazy-context-loader.js.map +0 -7
  475. package/dist/core/performance/monitor.js.map +0 -7
  476. package/dist/core/performance/optimized-frame-context.js.map +0 -7
  477. package/dist/core/performance/performance-benchmark.js.map +0 -7
  478. package/dist/core/performance/performance-profiler.js.map +0 -7
  479. package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
  480. package/dist/core/persistence/postgres-adapter.js.map +0 -7
  481. package/dist/core/projects/project-isolation.js.map +0 -7
  482. package/dist/core/projects/project-manager.js.map +0 -7
  483. package/dist/core/query/query-parser.js.map +0 -7
  484. package/dist/core/query/query-templates.js.map +0 -7
  485. package/dist/core/retrieval/context-retriever.js.map +0 -7
  486. package/dist/core/retrieval/graph-retrieval.js +0 -662
  487. package/dist/core/retrieval/graph-retrieval.js.map +0 -7
  488. package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
  489. package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
  490. package/dist/core/retrieval/index.js.map +0 -7
  491. package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
  492. package/dist/core/retrieval/llm-provider.js.map +0 -7
  493. package/dist/core/retrieval/retrieval-audit.js.map +0 -7
  494. package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
  495. package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
  496. package/dist/core/retrieval/summary-generator.js.map +0 -7
  497. package/dist/core/retrieval/types.js.map +0 -7
  498. package/dist/core/session/clear-survival.js.map +0 -7
  499. package/dist/core/session/enhanced-handoff.js.map +0 -7
  500. package/dist/core/session/handoff-generator.js.map +0 -7
  501. package/dist/core/session/index.js.map +0 -7
  502. package/dist/core/session/session-manager.js.map +0 -7
  503. package/dist/core/skills/index.js.map +0 -7
  504. package/dist/core/skills/skill-storage.js.map +0 -7
  505. package/dist/core/skills/types.js.map +0 -7
  506. package/dist/core/storage/chromadb-adapter.js +0 -354
  507. package/dist/core/storage/chromadb-adapter.js.map +0 -7
  508. package/dist/core/storage/infinite-storage.js.map +0 -7
  509. package/dist/core/storage/railway-optimized-storage.js +0 -591
  510. package/dist/core/storage/railway-optimized-storage.js.map +0 -7
  511. package/dist/core/storage/remote-storage.js.map +0 -7
  512. package/dist/core/storage/two-tier-storage.js.map +0 -7
  513. package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
  514. package/dist/core/trace/db-trace-wrapper.js.map +0 -7
  515. package/dist/core/trace/debug-trace.js.map +0 -7
  516. package/dist/core/trace/index.js.map +0 -7
  517. package/dist/core/trace/linear-api-wrapper.js.map +0 -7
  518. package/dist/core/trace/trace-demo.js +0 -154
  519. package/dist/core/trace/trace-demo.js.map +0 -7
  520. package/dist/core/trace/trace-detector.demo.js +0 -142
  521. package/dist/core/trace/trace-detector.demo.js.map +0 -7
  522. package/dist/core/trace/trace-detector.js.map +0 -7
  523. package/dist/core/trace/trace-store.js.map +0 -7
  524. package/dist/core/trace/types.js.map +0 -7
  525. package/dist/core/utils/async-mutex.js.map +0 -7
  526. package/dist/core/utils/compression.js.map +0 -7
  527. package/dist/core/utils/update-checker.js.map +0 -7
  528. package/dist/core/worktree/worktree-manager.js.map +0 -7
  529. package/dist/daemon/daemon-config.js.map +0 -7
  530. package/dist/daemon/services/context-service.js.map +0 -7
  531. package/dist/daemon/services/linear-service.js.map +0 -7
  532. package/dist/daemon/session-daemon.js.map +0 -7
  533. package/dist/daemon/unified-daemon.js.map +0 -7
  534. package/dist/features/analytics/api/analytics-api.js.map +0 -7
  535. package/dist/features/analytics/core/analytics-service.js.map +0 -7
  536. package/dist/features/analytics/index.js.map +0 -7
  537. package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
  538. package/dist/features/browser/browser-mcp.js.map +0 -7
  539. package/dist/features/sweep/index.js.map +0 -7
  540. package/dist/features/sweep/prediction-client.js.map +0 -7
  541. package/dist/features/sweep/prompt-builder.js.map +0 -7
  542. package/dist/features/sweep/pty-wrapper.js.map +0 -7
  543. package/dist/features/sweep/state-watcher.js.map +0 -7
  544. package/dist/features/sweep/status-bar.js.map +0 -7
  545. package/dist/features/sweep/sweep-server-manager.js.map +0 -7
  546. package/dist/features/sweep/tab-interceptor.js.map +0 -7
  547. package/dist/features/sweep/types.js.map +0 -7
  548. package/dist/features/tasks/linear-task-manager.js.map +0 -7
  549. package/dist/features/tasks/task-aware-context.js.map +0 -7
  550. package/dist/features/tui/simple-monitor.js.map +0 -7
  551. package/dist/features/tui/swarm-monitor.js.map +0 -7
  552. package/dist/features/web/client/stores/task-store.js.map +0 -7
  553. package/dist/features/web/server/index.js.map +0 -7
  554. package/dist/hooks/auto-background.js.map +0 -7
  555. package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
  556. package/dist/hooks/config.js.map +0 -7
  557. package/dist/hooks/daemon.js.map +0 -7
  558. package/dist/hooks/events.js.map +0 -7
  559. package/dist/hooks/index.js.map +0 -7
  560. package/dist/hooks/linear-task-picker.js.map +0 -7
  561. package/dist/hooks/schemas.js.map +0 -7
  562. package/dist/hooks/secure-fs.js.map +0 -7
  563. package/dist/hooks/security-logger.js.map +0 -7
  564. package/dist/hooks/session-summary.js.map +0 -7
  565. package/dist/hooks/sms-action-runner.js.map +0 -7
  566. package/dist/hooks/sms-notify.js.map +0 -7
  567. package/dist/hooks/sms-watcher.js.map +0 -7
  568. package/dist/hooks/sms-webhook.js.map +0 -7
  569. package/dist/hooks/whatsapp-commands.js.map +0 -7
  570. package/dist/hooks/whatsapp-scheduler.js.map +0 -7
  571. package/dist/hooks/whatsapp-sync.js.map +0 -7
  572. package/dist/index.js.map +0 -7
  573. package/dist/integrations/anthropic/client.js.map +0 -7
  574. package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
  575. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  576. package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  577. package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
  578. package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
  579. package/dist/integrations/claude-code/subagent-client.js.map +0 -7
  580. package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
  581. package/dist/integrations/linear/auth.js.map +0 -7
  582. package/dist/integrations/linear/auto-sync.js.map +0 -7
  583. package/dist/integrations/linear/client.js +0 -630
  584. package/dist/integrations/linear/client.js.map +0 -7
  585. package/dist/integrations/linear/config.js.map +0 -7
  586. package/dist/integrations/linear/migration.js.map +0 -7
  587. package/dist/integrations/linear/oauth-server.js.map +0 -7
  588. package/dist/integrations/linear/rest-client.js.map +0 -7
  589. package/dist/integrations/linear/sync-manager.js.map +0 -7
  590. package/dist/integrations/linear/sync-service.js.map +0 -7
  591. package/dist/integrations/linear/sync.js.map +0 -7
  592. package/dist/integrations/linear/unified-sync.js.map +0 -7
  593. package/dist/integrations/linear/webhook-handler.js.map +0 -7
  594. package/dist/integrations/linear/webhook-server.js.map +0 -7
  595. package/dist/integrations/linear/webhook.js.map +0 -7
  596. package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  597. package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
  598. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  599. package/dist/integrations/mcp/handlers/index.js.map +0 -7
  600. package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  601. package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  602. package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
  603. package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  604. package/dist/integrations/mcp/index.js.map +0 -7
  605. package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  606. package/dist/integrations/mcp/refactored-server.js.map +0 -7
  607. package/dist/integrations/mcp/remote-server.js +0 -691
  608. package/dist/integrations/mcp/remote-server.js.map +0 -7
  609. package/dist/integrations/mcp/schemas.js.map +0 -7
  610. package/dist/integrations/mcp/server.js +0 -1960
  611. package/dist/integrations/mcp/server.js.map +0 -7
  612. package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
  613. package/dist/integrations/mcp/tool-definitions.js.map +0 -7
  614. package/dist/integrations/mcp/trace-test.js +0 -48
  615. package/dist/integrations/mcp/trace-test.js.map +0 -7
  616. package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
  617. package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
  618. package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
  619. package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
  620. package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
  621. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
  622. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  623. package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
  624. package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  625. package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  626. package/dist/integrations/ralph/index.js.map +0 -7
  627. package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
  628. package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  629. package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  630. package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  631. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  632. package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  633. package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  634. package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  635. package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  636. package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
  637. package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
  638. package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  639. package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
  640. package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  641. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  642. package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  643. package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
  644. package/dist/middleware/exponential-rate-limiter.js.map +0 -7
  645. package/dist/models/user.model.js.map +0 -7
  646. package/dist/servers/production/auth-middleware.js.map +0 -7
  647. package/dist/servers/railway/config.js +0 -55
  648. package/dist/servers/railway/config.js.map +0 -7
  649. package/dist/servers/railway/index-enhanced.js +0 -160
  650. package/dist/servers/railway/index-enhanced.js.map +0 -7
  651. package/dist/servers/railway/index.js +0 -1349
  652. package/dist/servers/railway/index.js.map +0 -7
  653. package/dist/servers/railway/simple.js +0 -64
  654. package/dist/servers/railway/simple.js.map +0 -7
  655. package/dist/servers/railway/storage-test.js +0 -459
  656. package/dist/servers/railway/storage-test.js.map +0 -7
  657. package/dist/services/config-service.js.map +0 -7
  658. package/dist/services/context-service.js.map +0 -7
  659. package/dist/skills/api-discovery.js.map +0 -7
  660. package/dist/skills/api-skill.js.map +0 -7
  661. package/dist/skills/claude-skills.js.map +0 -7
  662. package/dist/skills/dashboard-launcher.js.map +0 -7
  663. package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
  664. package/dist/skills/repo-ingestion-skill.js +0 -609
  665. package/dist/skills/repo-ingestion-skill.js.map +0 -7
  666. package/dist/skills/security-secrets-scanner.js +0 -284
  667. package/dist/skills/security-secrets-scanner.js.map +0 -7
  668. package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
  669. package/dist/utils/env.js.map +0 -7
  670. package/dist/utils/formatting.js.map +0 -7
  671. package/dist/utils/process-cleanup.js.map +0 -7
  672. package/dist/validation/schemas.js +0 -222
  673. package/dist/validation/schemas.js.map +0 -7
  674. /package/dist/{agents → src/agents}/core/agent-task-manager.js +0 -0
  675. /package/dist/{agents → src/agents}/verifiers/base-verifier.js +0 -0
  676. /package/dist/{agents → src/agents}/verifiers/formatter-verifier.js +0 -0
  677. /package/dist/{agents → src/agents}/verifiers/llm-judge.js +0 -0
  678. /package/dist/{cli → src/cli}/auto-detect.js +0 -0
  679. /package/dist/{cli → src/cli}/claude-sm-danger.js +0 -0
  680. /package/dist/{cli → src/cli}/codex-sm-danger.js +0 -0
  681. /package/dist/{cli → src/cli}/codex-sm.js +0 -0
  682. /package/dist/{cli → src/cli}/commands/api.js +0 -0
  683. /package/dist/{cli → src/cli}/commands/auto-background.js +0 -0
  684. /package/dist/{cli → src/cli}/commands/cleanup-processes.js +0 -0
  685. /package/dist/{cli → src/cli}/commands/clear.js +0 -0
  686. /package/dist/{cli → src/cli}/commands/config.js +0 -0
  687. /package/dist/{cli → src/cli}/commands/context-rehydrate.js +0 -0
  688. /package/dist/{cli → src/cli}/commands/context.js +0 -0
  689. /package/dist/{cli → src/cli}/commands/daemon.js +0 -0
  690. /package/dist/{cli → src/cli}/commands/dashboard.js +0 -0
  691. /package/dist/{cli → src/cli}/commands/db.js +0 -0
  692. /package/dist/{cli → src/cli}/commands/decision.js +0 -0
  693. /package/dist/{cli → src/cli}/commands/discovery.js +0 -0
  694. /package/dist/{cli → src/cli}/commands/handoff.js +0 -0
  695. /package/dist/{cli → src/cli}/commands/hooks.js +0 -0
  696. /package/dist/{cli → src/cli}/commands/linear.js +0 -0
  697. /package/dist/{cli → src/cli}/commands/log.js +0 -0
  698. /package/dist/{cli → src/cli}/commands/login.js +0 -0
  699. /package/dist/{cli → src/cli}/commands/migrate.js +0 -0
  700. /package/dist/{cli → src/cli}/commands/model.js +0 -0
  701. /package/dist/{cli → src/cli}/commands/onboard.js +0 -0
  702. /package/dist/{cli → src/cli}/commands/projects.js +0 -0
  703. /package/dist/{cli → src/cli}/commands/ralph.js +0 -0
  704. /package/dist/{cli → src/cli}/commands/retrieval.js +0 -0
  705. /package/dist/{cli → src/cli}/commands/service.js +0 -0
  706. /package/dist/{cli → src/cli}/commands/session.js +0 -0
  707. /package/dist/{cli → src/cli}/commands/settings.js +0 -0
  708. /package/dist/{cli → src/cli}/commands/setup.js +0 -0
  709. /package/dist/{cli → src/cli}/commands/shell.js +0 -0
  710. /package/dist/{cli → src/cli}/commands/signup.js +0 -0
  711. /package/dist/{cli → src/cli}/commands/skills.js +0 -0
  712. /package/dist/{cli → src/cli}/commands/sms-notify.js +0 -0
  713. /package/dist/{cli → src/cli}/commands/storage-tier.js +0 -0
  714. /package/dist/{cli → src/cli}/commands/sweep.js +0 -0
  715. /package/dist/{cli → src/cli}/commands/tasks.js +0 -0
  716. /package/dist/{cli → src/cli}/commands/worktree.js +0 -0
  717. /package/dist/{cli → src/cli}/opencode-sm.js +0 -0
  718. /package/dist/{cli → src/cli}/utils/viewer.js +0 -0
  719. /package/dist/{core → src/core}/config/config-manager.js +0 -0
  720. /package/dist/{core → src/core}/config/feature-flags.js +0 -0
  721. /package/dist/{core → src/core}/config/storage-config.js +0 -0
  722. /package/dist/{core → src/core}/config/types.js +0 -0
  723. /package/dist/{core → src/core}/context/auto-context.js +0 -0
  724. /package/dist/{core → src/core}/context/dual-stack-manager.js +0 -0
  725. /package/dist/{core → src/core}/context/enhanced-rehydration.js +0 -0
  726. /package/dist/{core → src/core}/context/frame-database.js +0 -0
  727. /package/dist/{core → src/core}/context/frame-digest.js +0 -0
  728. /package/dist/{core → src/core}/context/frame-handoff-manager.js +0 -0
  729. /package/dist/{core → src/core}/context/frame-lifecycle-hooks.js +0 -0
  730. /package/dist/{core → src/core}/context/frame-recovery.js +0 -0
  731. /package/dist/{core → src/core}/context/frame-stack.js +0 -0
  732. /package/dist/{core → src/core}/context/frame-types.js +0 -0
  733. /package/dist/{core → src/core}/context/frame-types.js.map +0 -0
  734. /package/dist/{core → src/core}/context/index.js +0 -0
  735. /package/dist/{core → src/core}/context/permission-manager.js +0 -0
  736. /package/dist/{core → src/core}/context/recursive-context-manager.js +0 -0
  737. /package/dist/{core → src/core}/context/refactored-frame-manager.js +0 -0
  738. /package/dist/{core → src/core}/context/shared-context-layer.js +0 -0
  739. /package/dist/{core → src/core}/context/stack-merge-resolver.js +0 -0
  740. /package/dist/{core → src/core}/context/validation.js +0 -0
  741. /package/dist/{core → src/core}/database/batch-operations.js +0 -0
  742. /package/dist/{core → src/core}/database/connection-pool.js +0 -0
  743. /package/dist/{core → src/core}/database/database-adapter.js +0 -0
  744. /package/dist/{core → src/core}/database/migration-manager.js +0 -0
  745. /package/dist/{core → src/core}/database/query-cache.js +0 -0
  746. /package/dist/{core → src/core}/database/query-router.js +0 -0
  747. /package/dist/{core → src/core}/digest/enhanced-hybrid-digest.js +0 -0
  748. /package/dist/{core → src/core}/digest/frame-digest-integration.js +0 -0
  749. /package/dist/{core → src/core}/digest/hybrid-digest-generator.js +0 -0
  750. /package/dist/{core → src/core}/digest/index.js +0 -0
  751. /package/dist/{core → src/core}/digest/types.js +0 -0
  752. /package/dist/{core → src/core}/errors/recovery.js +0 -0
  753. /package/dist/{core → src/core}/execution/parallel-executor.js +0 -0
  754. /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
  755. /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
  756. /package/dist/{core → src/core}/frame/workflow-templates.js +0 -0
  757. /package/dist/{core → src/core}/merge/conflict-detector.js +0 -0
  758. /package/dist/{core → src/core}/merge/index.js +0 -0
  759. /package/dist/{core → src/core}/merge/resolution-engine.js +0 -0
  760. /package/dist/{core → src/core}/merge/stack-diff.js +0 -0
  761. /package/dist/{core → src/core/merge}/types.js +0 -0
  762. /package/dist/{core → src/core/merge}/types.js.map +0 -0
  763. /package/dist/{core → src/core}/models/fallback-monitor.js +0 -0
  764. /package/dist/{core → src/core}/models/model-router.js +0 -0
  765. /package/dist/{core → src/core}/monitoring/error-handler.js +0 -0
  766. /package/dist/{core → src/core}/monitoring/metrics.js +0 -0
  767. /package/dist/{core → src/core}/monitoring/progress-tracker.js +0 -0
  768. /package/dist/{core → src/core}/monitoring/session-monitor.js +0 -0
  769. /package/dist/{core → src/core}/performance/context-cache.js +0 -0
  770. /package/dist/{core → src/core}/performance/index.js +0 -0
  771. /package/dist/{core → src/core}/performance/lazy-context-loader.js +0 -0
  772. /package/dist/{core → src/core}/performance/monitor.js +0 -0
  773. /package/dist/{core → src/core}/performance/optimized-frame-context.js +0 -0
  774. /package/dist/{core → src/core}/performance/performance-benchmark.js +0 -0
  775. /package/dist/{core → src/core}/performance/performance-profiler.js +0 -0
  776. /package/dist/{core → src/core}/performance/streaming-jsonl-parser.js +0 -0
  777. /package/dist/{core → src/core}/persistence/postgres-adapter.js +0 -0
  778. /package/dist/{core → src/core}/projects/project-isolation.js +0 -0
  779. /package/dist/{core → src/core}/projects/project-manager.js +0 -0
  780. /package/dist/{core → src/core}/query/query-parser.js +0 -0
  781. /package/dist/{core → src/core}/query/query-templates.js +0 -0
  782. /package/dist/{core → src/core}/retrieval/context-retriever.js +0 -0
  783. /package/dist/{core → src/core}/retrieval/index.js +0 -0
  784. /package/dist/{core → src/core}/retrieval/llm-context-retrieval.js +0 -0
  785. /package/dist/{core → src/core}/retrieval/llm-provider.js +0 -0
  786. /package/dist/{core → src/core}/retrieval/retrieval-audit.js +0 -0
  787. /package/dist/{core → src/core}/retrieval/summary-generator.js +0 -0
  788. /package/dist/{core → src/core}/retrieval/types.js +0 -0
  789. /package/dist/{core → src/core}/session/clear-survival.js +0 -0
  790. /package/dist/{core → src/core}/session/enhanced-handoff.js +0 -0
  791. /package/dist/{core → src/core}/session/handoff-generator.js +0 -0
  792. /package/dist/{core → src/core}/session/index.js +0 -0
  793. /package/dist/{core → src/core}/session/session-manager.js +0 -0
  794. /package/dist/{core → src/core}/skills/index.js +0 -0
  795. /package/dist/{core → src/core}/skills/skill-storage.js +0 -0
  796. /package/dist/{core → src/core}/skills/types.js +0 -0
  797. /package/dist/{core → src/core}/storage/infinite-storage.js +0 -0
  798. /package/dist/{core → src/core}/storage/remote-storage.js +0 -0
  799. /package/dist/{core → src/core}/storage/two-tier-storage.js +0 -0
  800. /package/dist/{core → src/core}/trace/cli-trace-wrapper.js +0 -0
  801. /package/dist/{core → src/core}/trace/db-trace-wrapper.js +0 -0
  802. /package/dist/{core → src/core}/trace/debug-trace.js +0 -0
  803. /package/dist/{core → src/core}/trace/index.js +0 -0
  804. /package/dist/{core → src/core}/trace/linear-api-wrapper.js +0 -0
  805. /package/dist/{core → src/core}/trace/trace-detector.js +0 -0
  806. /package/dist/{core → src/core}/trace/trace-store.js +0 -0
  807. /package/dist/{core → src/core}/trace/types.js +0 -0
  808. /package/dist/{integrations/linear → src/core}/types.js +0 -0
  809. /package/dist/{integrations/linear → src/core}/types.js.map +0 -0
  810. /package/dist/{core → src/core}/utils/async-mutex.js +0 -0
  811. /package/dist/{core → src/core}/utils/compression.js +0 -0
  812. /package/dist/{core → src/core}/utils/update-checker.js +0 -0
  813. /package/dist/{core → src/core}/worktree/worktree-manager.js +0 -0
  814. /package/dist/{daemon → src/daemon}/daemon-config.js +0 -0
  815. /package/dist/{daemon → src/daemon}/services/context-service.js +0 -0
  816. /package/dist/{daemon → src/daemon}/services/linear-service.js +0 -0
  817. /package/dist/{daemon → src/daemon}/session-daemon.js +0 -0
  818. /package/dist/{daemon → src/daemon}/unified-daemon.js +0 -0
  819. /package/dist/{features → src/features}/analytics/api/analytics-api.js +0 -0
  820. /package/dist/{features → src/features}/analytics/core/analytics-service.js +0 -0
  821. /package/dist/{features → src/features}/analytics/index.js +0 -0
  822. /package/dist/{features → src/features}/analytics/queries/metrics-queries.js +0 -0
  823. /package/dist/{features → src/features}/analytics/types/metrics.js +0 -0
  824. /package/dist/{features → src/features}/analytics/types/metrics.js.map +0 -0
  825. /package/dist/{features → src/features}/browser/browser-mcp.js +0 -0
  826. /package/dist/{features → src/features}/sweep/index.js +0 -0
  827. /package/dist/{features → src/features}/sweep/prediction-client.js +0 -0
  828. /package/dist/{features → src/features}/sweep/prompt-builder.js +0 -0
  829. /package/dist/{features → src/features}/sweep/pty-wrapper.js +0 -0
  830. /package/dist/{features → src/features}/sweep/state-watcher.js +0 -0
  831. /package/dist/{features → src/features}/sweep/status-bar.js +0 -0
  832. /package/dist/{features → src/features}/sweep/sweep-server-manager.js +0 -0
  833. /package/dist/{features → src/features}/sweep/tab-interceptor.js +0 -0
  834. /package/dist/{features → src/features}/sweep/types.js +0 -0
  835. /package/dist/{features → src/features}/tasks/linear-task-manager.js +0 -0
  836. /package/dist/{features → src/features}/tasks/task-aware-context.js +0 -0
  837. /package/dist/{features → src/features}/tui/simple-monitor.js +0 -0
  838. /package/dist/{features → src/features}/tui/swarm-monitor.js +0 -0
  839. /package/dist/{features → src/features}/web/client/stores/task-store.js +0 -0
  840. /package/dist/{features → src/features}/web/server/index.js +0 -0
  841. /package/dist/{hooks → src/hooks}/auto-background.js +0 -0
  842. /package/dist/{hooks → src/hooks}/claude-code-whatsapp-hook.js +0 -0
  843. /package/dist/{hooks → src/hooks}/config.js +0 -0
  844. /package/dist/{hooks → src/hooks}/daemon.js +0 -0
  845. /package/dist/{hooks → src/hooks}/events.js +0 -0
  846. /package/dist/{hooks → src/hooks}/index.js +0 -0
  847. /package/dist/{hooks → src/hooks}/linear-task-picker.js +0 -0
  848. /package/dist/{hooks → src/hooks}/schemas.js +0 -0
  849. /package/dist/{hooks → src/hooks}/secure-fs.js +0 -0
  850. /package/dist/{hooks → src/hooks}/security-logger.js +0 -0
  851. /package/dist/{hooks → src/hooks}/session-summary.js +0 -0
  852. /package/dist/{hooks → src/hooks}/sms-action-runner.js +0 -0
  853. /package/dist/{hooks → src/hooks}/sms-notify.js +0 -0
  854. /package/dist/{hooks → src/hooks}/sms-watcher.js +0 -0
  855. /package/dist/{hooks → src/hooks}/sms-webhook.js +0 -0
  856. /package/dist/{hooks → src/hooks}/whatsapp-commands.js +0 -0
  857. /package/dist/{hooks → src/hooks}/whatsapp-scheduler.js +0 -0
  858. /package/dist/{hooks → src/hooks}/whatsapp-sync.js +0 -0
  859. /package/dist/{index.js → src/index.js} +0 -0
  860. /package/dist/{integrations → src/integrations}/anthropic/client.js +0 -0
  861. /package/dist/{integrations → src/integrations}/claude-code/agent-bridge.js +0 -0
  862. /package/dist/{integrations → src/integrations}/claude-code/enhanced-pre-clear-hooks.js +0 -0
  863. /package/dist/{integrations → src/integrations}/claude-code/lifecycle-hooks.js +0 -0
  864. /package/dist/{integrations → src/integrations}/claude-code/post-task-hooks.js +0 -0
  865. /package/dist/{integrations → src/integrations}/claude-code/subagent-client-stub.js +0 -0
  866. /package/dist/{integrations → src/integrations}/claude-code/subagent-client.js +0 -0
  867. /package/dist/{integrations → src/integrations}/claude-code/task-coordinator.js +0 -0
  868. /package/dist/{integrations → src/integrations}/linear/auth.js +0 -0
  869. /package/dist/{integrations → src/integrations}/linear/auto-sync.js +0 -0
  870. /package/dist/{integrations → src/integrations}/linear/config.js +0 -0
  871. /package/dist/{integrations → src/integrations}/linear/migration.js +0 -0
  872. /package/dist/{integrations → src/integrations}/linear/oauth-server.js +0 -0
  873. /package/dist/{integrations → src/integrations}/linear/rest-client.js +0 -0
  874. /package/dist/{integrations → src/integrations}/linear/sync-manager.js +0 -0
  875. /package/dist/{integrations → src/integrations}/linear/sync-service.js +0 -0
  876. /package/dist/{integrations → src/integrations}/linear/sync.js +0 -0
  877. /package/dist/{integrations/ralph → src/integrations/linear}/types.js +0 -0
  878. /package/dist/{integrations/ralph → src/integrations/linear}/types.js.map +0 -0
  879. /package/dist/{integrations → src/integrations}/linear/unified-sync.js +0 -0
  880. /package/dist/{integrations → src/integrations}/linear/webhook-handler.js +0 -0
  881. /package/dist/{integrations → src/integrations}/linear/webhook-server.js +0 -0
  882. /package/dist/{integrations → src/integrations}/linear/webhook.js +0 -0
  883. /package/dist/{integrations → src/integrations}/mcp/handlers/code-execution-handlers.js +0 -0
  884. /package/dist/{integrations → src/integrations}/mcp/handlers/context-handlers.js +0 -0
  885. /package/dist/{integrations → src/integrations}/mcp/handlers/discovery-handlers.js +0 -0
  886. /package/dist/{integrations → src/integrations}/mcp/handlers/index.js +0 -0
  887. /package/dist/{integrations → src/integrations}/mcp/handlers/linear-handlers.js +0 -0
  888. /package/dist/{integrations → src/integrations}/mcp/handlers/skill-handlers.js +0 -0
  889. /package/dist/{integrations → src/integrations}/mcp/handlers/task-handlers.js +0 -0
  890. /package/dist/{integrations → src/integrations}/mcp/handlers/trace-handlers.js +0 -0
  891. /package/dist/{integrations → src/integrations}/mcp/index.js +0 -0
  892. /package/dist/{integrations → src/integrations}/mcp/middleware/tool-scoring.js +0 -0
  893. /package/dist/{integrations → src/integrations}/mcp/refactored-server.js +0 -0
  894. /package/dist/{integrations → src/integrations}/mcp/schemas.js +0 -0
  895. /package/dist/{integrations → src/integrations}/mcp/tool-definitions-code.js +0 -0
  896. /package/dist/{integrations → src/integrations}/mcp/tool-definitions.js +0 -0
  897. /package/dist/{integrations → src/integrations}/ralph/bridge/ralph-stackmemory-bridge.js +0 -0
  898. /package/dist/{integrations → src/integrations}/ralph/context/context-budget-manager.js +0 -0
  899. /package/dist/{integrations → src/integrations}/ralph/context/stackmemory-context-loader.js +0 -0
  900. /package/dist/{integrations → src/integrations}/ralph/coordination/enhanced-coordination.js +0 -0
  901. /package/dist/{integrations → src/integrations}/ralph/index.js +0 -0
  902. /package/dist/{integrations → src/integrations}/ralph/learning/pattern-learner.js +0 -0
  903. /package/dist/{integrations → src/integrations}/ralph/lifecycle/iteration-lifecycle.js +0 -0
  904. /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-dashboard.js +0 -0
  905. /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-registry.js +0 -0
  906. /package/dist/{integrations → src/integrations}/ralph/orchestration/multi-loop-orchestrator.js +0 -0
  907. /package/dist/{integrations → src/integrations}/ralph/patterns/compounding-engineering-pattern.js +0 -0
  908. /package/dist/{integrations → src/integrations}/ralph/patterns/extended-coherence-sessions.js +0 -0
  909. /package/dist/{integrations → src/integrations}/ralph/patterns/oracle-worker-pattern.js +0 -0
  910. /package/dist/{integrations → src/integrations}/ralph/performance/performance-optimizer.js +0 -0
  911. /package/dist/{integrations → src/integrations}/ralph/recovery/crash-recovery.js +0 -0
  912. /package/dist/{integrations → src/integrations}/ralph/state/state-reconciler.js +0 -0
  913. /package/dist/{integrations → src/integrations}/ralph/swarm/git-workflow-manager.js +0 -0
  914. /package/dist/{integrations → src/integrations}/ralph/swarm/swarm-coordinator.js +0 -0
  915. /package/dist/{types/task.js.map → src/integrations/ralph/types.js.map} +0 -0
  916. /package/dist/{integrations → src/integrations}/ralph/visualization/ralph-debugger.js +0 -0
  917. /package/dist/{mcp → src/mcp}/stackmemory-mcp-server.js +0 -0
  918. /package/dist/{middleware → src/middleware}/exponential-rate-limiter.js +0 -0
  919. /package/dist/{models → src/models}/user.model.js +0 -0
  920. /package/dist/{servers → src/servers}/production/auth-middleware.js +0 -0
  921. /package/dist/{services → src/services}/config-service.js +0 -0
  922. /package/dist/{services → src/services}/context-service.js +0 -0
  923. /package/dist/{skills → src/skills}/api-discovery.js +0 -0
  924. /package/dist/{skills → src/skills}/api-skill.js +0 -0
  925. /package/dist/{skills → src/skills}/claude-skills.js +0 -0
  926. /package/dist/{skills → src/skills}/dashboard-launcher.js +0 -0
  927. /package/dist/{skills → src/skills}/recursive-agent-orchestrator.js +0 -0
  928. /package/dist/{skills → src/skills}/unified-rlm-orchestrator.js +0 -0
  929. /package/dist/{types → src/types}/task.js +0 -0
  930. /package/dist/{utils → src/utils}/env.js +0 -0
  931. /package/dist/{utils → src/utils}/formatting.js +0 -0
  932. /package/dist/{utils → src/utils}/process-cleanup.js +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/daemon/unified-daemon.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n\n/**\n * Unified Daemon for StackMemory\n *\n * Single background process managing multiple services:\n * - Context auto-save\n * - Linear sync\n * - File watch (future)\n */\n\nimport {\n existsSync,\n writeFileSync,\n unlinkSync,\n appendFileSync,\n readFileSync,\n} from 'fs';\nimport {\n loadDaemonConfig,\n getDaemonPaths,\n writeDaemonStatus,\n type DaemonConfig,\n type DaemonStatus,\n} from './daemon-config.js';\nimport { DaemonContextService } from './services/context-service.js';\nimport { DaemonLinearService } from './services/linear-service.js';\n\ninterface LogEntry {\n timestamp: string;\n level: 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';\n service: string;\n message: string;\n data?: unknown;\n}\n\nexport class UnifiedDaemon {\n private config: DaemonConfig;\n private paths: ReturnType<typeof getDaemonPaths>;\n private contextService: DaemonContextService;\n private linearService: DaemonLinearService;\n private heartbeatInterval?: NodeJS.Timeout;\n private isShuttingDown = false;\n private startTime: number = 0;\n\n constructor(config?: Partial<DaemonConfig>) {\n this.paths = getDaemonPaths();\n this.config = { ...loadDaemonConfig(), ...config };\n\n // Initialize services\n this.contextService = new DaemonContextService(\n this.config.context,\n (level, msg, data) => this.log(level, 'context', msg, data)\n );\n\n this.linearService = new DaemonLinearService(\n this.config.linear,\n (level, msg, data) => this.log(level, 'linear', msg, data)\n );\n }\n\n private log(\n level: string,\n service: string,\n message: string,\n data?: unknown\n ): void {\n const logLevel = level.toUpperCase() as LogEntry['level'];\n\n // Check log level\n const levels = ['DEBUG', 'INFO', 'WARN', 'ERROR'];\n const configLevel = this.config.logLevel.toUpperCase();\n if (levels.indexOf(logLevel) < levels.indexOf(configLevel)) {\n return;\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level: logLevel,\n service,\n message,\n data,\n };\n\n const logLine = JSON.stringify(entry) + '\\n';\n\n try {\n appendFileSync(this.paths.logFile, logLine);\n } catch {\n console.error(`[${entry.timestamp}] ${level} [${service}]: ${message}`);\n }\n }\n\n private checkIdempotency(): boolean {\n if (existsSync(this.paths.pidFile)) {\n try {\n const existingPid = readFileSync(this.paths.pidFile, 'utf8').trim();\n const pid = parseInt(existingPid, 10);\n\n // Check if process is running\n try {\n process.kill(pid, 0);\n this.log('WARN', 'daemon', 'Daemon already running', { pid });\n return false;\n } catch {\n // Process not running, stale PID\n this.log('INFO', 'daemon', 'Cleaning stale PID file', { pid });\n unlinkSync(this.paths.pidFile);\n }\n } catch {\n try {\n unlinkSync(this.paths.pidFile);\n } catch {\n // Ignore\n }\n }\n }\n return true;\n }\n\n private writePidFile(): void {\n writeFileSync(this.paths.pidFile, process.pid.toString());\n this.log('INFO', 'daemon', 'PID file created', {\n pid: process.pid,\n file: this.paths.pidFile,\n });\n }\n\n private updateStatus(): void {\n const status: DaemonStatus = {\n running: true,\n pid: process.pid,\n startTime: this.startTime,\n uptime: Date.now() - this.startTime,\n services: {\n context: {\n enabled: this.config.context.enabled,\n lastRun: this.contextService.getState().lastSaveTime || undefined,\n saveCount: this.contextService.getState().saveCount,\n },\n linear: {\n enabled: this.config.linear.enabled,\n lastRun: this.linearService.getState().lastSyncTime || undefined,\n syncCount: this.linearService.getState().syncCount,\n },\n fileWatch: {\n enabled: this.config.fileWatch.enabled,\n },\n },\n errors: [\n ...this.contextService.getState().errors.slice(-5),\n ...this.linearService.getState().errors.slice(-5),\n ],\n };\n\n writeDaemonStatus(status);\n }\n\n private setupSignalHandlers(): void {\n const handleSignal = (signal: string) => {\n this.log('INFO', 'daemon', `Received ${signal}, shutting down`);\n this.shutdown(signal.toLowerCase());\n };\n\n process.on('SIGTERM', () => handleSignal('SIGTERM'));\n process.on('SIGINT', () => handleSignal('SIGINT'));\n process.on('SIGHUP', () => handleSignal('SIGHUP'));\n\n process.on('uncaughtException', (err) => {\n this.log('ERROR', 'daemon', 'Uncaught exception', {\n error: err.message,\n stack: err.stack,\n });\n this.shutdown('uncaught_exception');\n });\n\n process.on('unhandledRejection', (reason) => {\n this.log('ERROR', 'daemon', 'Unhandled rejection', {\n reason: String(reason),\n });\n });\n }\n\n private cleanup(): void {\n // Remove PID file\n try {\n if (existsSync(this.paths.pidFile)) {\n unlinkSync(this.paths.pidFile);\n this.log('INFO', 'daemon', 'PID file removed');\n }\n } catch (e) {\n this.log('WARN', 'daemon', 'Failed to remove PID file', {\n error: String(e),\n });\n }\n\n // Update status\n const finalStatus: DaemonStatus = {\n running: false,\n startTime: this.startTime,\n uptime: Date.now() - this.startTime,\n services: {\n context: {\n enabled: false,\n saveCount: this.contextService.getState().saveCount,\n },\n linear: {\n enabled: false,\n syncCount: this.linearService.getState().syncCount,\n },\n fileWatch: { enabled: false },\n },\n errors: [],\n };\n writeDaemonStatus(finalStatus);\n }\n\n private shutdown(reason: string): void {\n if (this.isShuttingDown) return;\n this.isShuttingDown = true;\n\n this.log('INFO', 'daemon', 'Daemon shutting down', {\n reason,\n uptime: Date.now() - this.startTime,\n contextSaves: this.contextService.getState().saveCount,\n linearSyncs: this.linearService.getState().syncCount,\n });\n\n // Stop heartbeat\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n\n // Stop services\n this.contextService.stop();\n this.linearService.stop();\n\n // Cleanup\n this.cleanup();\n\n const exitCode =\n reason === 'sigterm' || reason === 'sigint' || reason === 'sighup'\n ? 0\n : 1;\n process.exit(exitCode);\n }\n\n async start(): Promise<void> {\n // Check idempotency\n if (!this.checkIdempotency()) {\n this.log('INFO', 'daemon', 'Exiting - daemon already running');\n process.exit(0);\n }\n\n this.startTime = Date.now();\n\n // Write PID file\n this.writePidFile();\n\n // Setup signal handlers\n this.setupSignalHandlers();\n\n this.log('INFO', 'daemon', 'Unified daemon started', {\n pid: process.pid,\n config: {\n context: this.config.context.enabled,\n linear: this.config.linear.enabled,\n fileWatch: this.config.fileWatch.enabled,\n },\n });\n\n // Start services\n this.contextService.start();\n await this.linearService.start();\n\n // Start heartbeat\n this.heartbeatInterval = setInterval(() => {\n this.updateStatus();\n }, this.config.heartbeatInterval * 1000);\n\n // Initial status update\n this.updateStatus();\n }\n\n getStatus(): DaemonStatus {\n return {\n running: !this.isShuttingDown,\n pid: process.pid,\n startTime: this.startTime,\n uptime: Date.now() - this.startTime,\n services: {\n context: {\n enabled: this.config.context.enabled,\n lastRun: this.contextService.getState().lastSaveTime || undefined,\n saveCount: this.contextService.getState().saveCount,\n },\n linear: {\n enabled: this.config.linear.enabled,\n lastRun: this.linearService.getState().lastSyncTime || undefined,\n syncCount: this.linearService.getState().syncCount,\n },\n fileWatch: {\n enabled: this.config.fileWatch.enabled,\n },\n },\n errors: [\n ...this.contextService.getState().errors,\n ...this.linearService.getState().errors,\n ],\n };\n }\n}\n\n// CLI entry point\nif (\n import.meta.url === `file://${process.argv[1]}` ||\n process.argv[1]?.endsWith('unified-daemon.js')\n) {\n const args = process.argv.slice(2);\n const config: Partial<DaemonConfig> = {};\n\n // Parse command line args\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--save-interval' && args[i + 1]) {\n config.context = { enabled: true, interval: parseInt(args[i + 1], 10) };\n i++;\n } else if (arg === '--linear-interval' && args[i + 1]) {\n config.linear = {\n enabled: true,\n interval: parseInt(args[i + 1], 10),\n retryAttempts: 3,\n retryDelay: 30000,\n };\n i++;\n } else if (arg === '--no-linear') {\n config.linear = {\n enabled: false,\n interval: 60,\n retryAttempts: 3,\n retryDelay: 30000,\n };\n } else if (arg === '--log-level' && args[i + 1]) {\n config.logLevel = args[i + 1] as DaemonConfig['logLevel'];\n i++;\n }\n }\n\n const daemon = new UnifiedDaemon(config);\n daemon.start().catch((err) => {\n console.error('Failed to start daemon:', err);\n process.exit(1);\n });\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/analytics/api/analytics-api.ts"],
4
- "sourcesContent": ["import express, { Request, Response, Router } from 'express';\nimport { AnalyticsService } from '../core/analytics-service.js';\nimport { AnalyticsQuery, TimeRange } from '../types/metrics.js';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { Server } from 'http';\n\nexport class AnalyticsAPI {\n private router: Router;\n private analyticsService: AnalyticsService;\n private wss?: WebSocketServer;\n\n constructor(projectPath?: string) {\n this.router = express.Router();\n this.analyticsService = new AnalyticsService(projectPath);\n this.setupRoutes();\n }\n\n private setupRoutes(): void {\n this.router.use(express.json());\n\n this.router.get('/metrics', this.getMetrics.bind(this));\n this.router.get('/tasks', this.getTasks.bind(this));\n this.router.get('/team/:userId', this.getTeamMetrics.bind(this));\n this.router.post('/tasks', this.addTask.bind(this));\n this.router.put('/tasks/:taskId', this.updateTask.bind(this));\n this.router.post('/sync', this.syncLinear.bind(this));\n this.router.get('/export', this.exportMetrics.bind(this));\n }\n\n private async getMetrics(req: Request, res: Response): Promise<void> {\n try {\n const query = this.parseQuery(req.query);\n const dashboardState =\n await this.analyticsService.getDashboardState(query);\n\n res.json({\n success: true,\n data: {\n metrics: dashboardState.metrics,\n lastUpdated: dashboardState.lastUpdated,\n },\n });\n } catch (error: unknown) {\n this.handleError(res, error);\n }\n }\n\n private async getTasks(req: Request, res: Response): Promise<void> {\n try {\n const query = this.parseQuery(req.query);\n const dashboardState =\n await this.analyticsService.getDashboardState(query);\n\n res.json({\n success: true,\n data: {\n tasks: dashboardState.recentTasks,\n total: dashboardState.metrics.totalTasks,\n },\n });\n } catch (error: unknown) {\n this.handleError(res, error);\n }\n }\n\n private async getTeamMetrics(req: Request, res: Response): Promise<void> {\n try {\n const { userId } = req.params;\n const query = this.parseQuery(req.query);\n\n if (userId === 'all') {\n const dashboardState =\n await this.analyticsService.getDashboardState(query);\n res.json({\n success: true,\n data: dashboardState.teamMetrics,\n });\n } else {\n const dashboardState = await this.analyticsService.getDashboardState({\n ...query,\n userIds: [userId],\n });\n\n const userMetrics = dashboardState.teamMetrics.find(\n (m) => m.userId === userId\n );\n\n if (!userMetrics) {\n res.status(404).json({\n success: false,\n error: 'User metrics not found',\n });\n return;\n }\n\n res.json({\n success: true,\n data: userMetrics,\n });\n }\n } catch (error: unknown) {\n this.handleError(res, error);\n }\n }\n\n private async addTask(req: Request, res: Response): Promise<void> {\n try {\n const task = {\n ...req.body,\n createdAt: new Date(req.body.createdAt || Date.now()),\n completedAt: req.body.completedAt\n ? new Date(req.body.completedAt)\n : undefined,\n };\n\n await this.analyticsService.addTask(task);\n\n res.status(201).json({\n success: true,\n message: 'Task added successfully',\n });\n } catch (error: unknown) {\n this.handleError(res, error);\n }\n }\n\n private async updateTask(req: Request, res: Response): Promise<void> {\n try {\n const { taskId } = req.params;\n const updates = req.body;\n\n if (updates.completedAt) {\n updates.completedAt = new Date(updates.completedAt);\n }\n\n await this.analyticsService.updateTask(taskId, updates);\n\n res.json({\n success: true,\n message: 'Task updated successfully',\n });\n } catch (error: unknown) {\n this.handleError(res, error);\n }\n }\n\n private async syncLinear(req: Request, res: Response): Promise<void> {\n try {\n await this.analyticsService.syncLinearTasks();\n\n res.json({\n success: true,\n message: 'Linear tasks synced successfully',\n });\n } catch (error: unknown) {\n this.handleError(res, error);\n }\n }\n\n private async exportMetrics(req: Request, res: Response): Promise<void> {\n try {\n const query = this.parseQuery(req.query);\n const format = (req.query.format as 'json' | 'csv') || 'json';\n const dashboardState =\n await this.analyticsService.getDashboardState(query);\n\n if (format === 'csv') {\n const csv = this.convertToCSV(dashboardState);\n res.setHeader('Content-Type', 'text/csv');\n res.setHeader(\n 'Content-Disposition',\n 'attachment; filename=\"analytics-export.csv\"'\n );\n res.send(csv);\n } else {\n res.json({\n success: true,\n data: dashboardState,\n });\n }\n } catch (error: unknown) {\n this.handleError(res, error);\n }\n }\n\n private parseQuery(query: any): AnalyticsQuery {\n const result: AnalyticsQuery = {};\n\n if (query.start && query.end) {\n result.timeRange = {\n start: new Date(query.start),\n end: new Date(query.end),\n preset: query.preset,\n };\n } else if (query.preset) {\n result.timeRange = this.getPresetTimeRange(query.preset);\n }\n\n if (query.users) {\n result.userIds = Array.isArray(query.users) ? query.users : [query.users];\n }\n\n if (query.states) {\n result.states = Array.isArray(query.states)\n ? query.states\n : [query.states];\n }\n\n if (query.priorities) {\n result.priorities = Array.isArray(query.priorities)\n ? query.priorities\n : [query.priorities];\n }\n\n if (query.labels) {\n result.labels = Array.isArray(query.labels)\n ? query.labels\n : [query.labels];\n }\n\n if (query.limit) {\n result.limit = parseInt(query.limit);\n }\n\n if (query.offset) {\n result.offset = parseInt(query.offset);\n }\n\n return result;\n }\n\n private getPresetTimeRange(preset: string): TimeRange {\n const end = new Date();\n const start = new Date();\n\n switch (preset) {\n case 'today':\n start.setHours(0, 0, 0, 0);\n break;\n case '7d':\n start.setDate(start.getDate() - 7);\n break;\n case '30d':\n start.setDate(start.getDate() - 30);\n break;\n case '90d':\n start.setDate(start.getDate() - 90);\n break;\n default:\n start.setDate(start.getDate() - 7);\n }\n\n return { start, end, preset: preset as TimeRange['preset'] };\n }\n\n private convertToCSV(dashboardState: any): string {\n const tasks = dashboardState.recentTasks;\n if (!tasks || tasks.length === 0) return 'No data';\n\n const headers = Object.keys(tasks[0]).join(',');\n const rows = tasks.map((task: any) =>\n Object.values(task)\n .map((v) => (typeof v === 'object' ? JSON.stringify(v) : v))\n .join(',')\n );\n\n return [headers, ...rows].join('\\n');\n }\n\n private handleError(res: Response, error: any): void {\n console.error('Analytics API error:', error);\n res.status(500).json({\n success: false,\n error: error.message || 'Internal server error',\n });\n }\n\n setupWebSocket(server: Server): void {\n this.wss = new WebSocketServer({\n server,\n path: '/ws/analytics',\n });\n\n this.wss.on('connection', (ws: WebSocket) => {\n console.log('WebSocket client connected to analytics');\n\n const unsubscribe = this.analyticsService.subscribeToUpdates((state) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(\n JSON.stringify({\n type: 'update',\n data: state,\n })\n );\n }\n });\n\n ws.on('message', async (message: string) => {\n try {\n const data = JSON.parse(message);\n\n if (data.type === 'subscribe') {\n const query = this.parseQuery(data.query || {});\n const state = await this.analyticsService.getDashboardState(query);\n\n ws.send(\n JSON.stringify({\n type: 'initial',\n data: state,\n })\n );\n }\n } catch (error: unknown) {\n ws.send(\n JSON.stringify({\n type: 'error',\n error: 'Invalid message format',\n })\n );\n }\n });\n\n ws.on('close', () => {\n unsubscribe();\n console.log('WebSocket client disconnected');\n });\n\n ws.on('error', (error) => {\n console.error('WebSocket error:', error);\n unsubscribe();\n });\n });\n }\n\n getRouter(): Router {\n return this.router;\n }\n\n close(): void {\n this.analyticsService.close();\n if (this.wss) {\n this.wss.close();\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/analytics/core/analytics-service.ts"],
4
- "sourcesContent": ["import { MetricsQueries } from '../queries/metrics-queries.js';\nimport { LinearClient } from '../../../integrations/linear/client.js';\nimport { LinearTaskManager } from '../../tasks/linear-task-manager.js';\nimport Database from 'better-sqlite3';\nimport {\n TaskMetrics,\n TeamMetrics,\n TaskAnalytics,\n DashboardState,\n TimeRange,\n AnalyticsQuery,\n} from '../types/metrics.js';\nimport path from 'path';\nimport fs from 'fs';\nimport os from 'os';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport class AnalyticsService {\n private metricsQueries: MetricsQueries;\n private linearClient?: LinearClient;\n private taskStore?: LinearTaskManager;\n private dbPath: string;\n private projectPath: string;\n private updateCallbacks: Set<(state: DashboardState) => void> = new Set();\n\n constructor(projectPath?: string) {\n this.projectPath = projectPath || process.cwd();\n this.dbPath = path.join(this.projectPath, '.stackmemory', 'analytics.db');\n\n this.ensureDirectoryExists();\n this.metricsQueries = new MetricsQueries(this.dbPath);\n\n // Initialize task store for syncing\n this.initializeTaskStore();\n\n if (process.env['LINEAR_API_KEY']) {\n this.initializeLinearIntegration();\n }\n }\n\n private initializeTaskStore(): void {\n try {\n const contextDbPath = path.join(\n this.projectPath,\n '.stackmemory',\n 'context.db'\n );\n if (fs.existsSync(contextDbPath)) {\n const db = new Database(contextDbPath);\n this.taskStore = new LinearTaskManager(this.projectPath, db);\n }\n } catch (error: unknown) {\n console.error('Failed to initialize task store:', error);\n }\n }\n\n private ensureDirectoryExists(): void {\n const dir = path.dirname(this.dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n private async initializeLinearIntegration(): Promise<void> {\n try {\n const configPath = path.join(\n os.homedir(),\n '.stackmemory',\n 'linear-config.json'\n );\n if (fs.existsSync(configPath)) {\n const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n this.linearClient = new LinearClient(config);\n await this.syncLinearTasks();\n }\n } catch (error: unknown) {\n console.error('Failed to initialize Linear integration:', error);\n }\n }\n\n async syncLinearTasks(): Promise<void> {\n // First sync from task store (which includes Linear-synced tasks)\n await this.syncFromTaskStore();\n\n // Then try direct Linear sync if client available\n if (this.linearClient) {\n try {\n const issues = await this.linearClient.getIssues({ limit: 100 });\n for (const issue of issues) {\n const task: TaskAnalytics = {\n id: issue.id,\n title: issue.title,\n state: this.mapLinearState(issue.state.type),\n createdAt: new Date(issue.createdAt),\n completedAt:\n issue.state.type === 'completed'\n ? new Date(issue.updatedAt)\n : undefined,\n estimatedEffort: issue.estimate ? issue.estimate * 60 : undefined,\n assigneeId: issue.assignee?.id,\n priority: this.mapLinearPriority(issue.priority),\n labels: Array.isArray(issue.labels)\n ? issue.labels.map((l: any) => l.name)\n : (issue.labels as any)?.nodes?.map((l: any) => l.name) || [],\n blockingIssues: [],\n };\n this.metricsQueries.upsertTask(task);\n }\n } catch (error: unknown) {\n console.error('Failed to sync from Linear API:', error);\n }\n }\n\n await this.notifyUpdate();\n }\n\n async syncFromTaskStore(): Promise<number> {\n if (!this.taskStore) return 0;\n\n try {\n // Get all tasks including completed ones\n const allTasks = this.getAllTasksFromStore();\n let synced = 0;\n\n for (const task of allTasks) {\n const analyticsTask: TaskAnalytics = {\n id: task.id,\n title: task.title,\n state: this.mapTaskStatus(task.status),\n createdAt: new Date(task.created_at * 1000),\n completedAt: task.completed_at\n ? new Date(task.completed_at * 1000)\n : undefined,\n estimatedEffort: task.estimated_effort,\n actualEffort: task.actual_effort,\n assigneeId: task.assignee,\n priority: task.priority as TaskAnalytics['priority'],\n labels: task.tags || [],\n blockingIssues: task.depends_on || [],\n };\n this.metricsQueries.upsertTask(analyticsTask);\n synced++;\n }\n\n return synced;\n } catch (error: unknown) {\n console.error('Failed to sync from task store:', error);\n return 0;\n }\n }\n\n private getAllTasksFromStore(): any[] {\n if (!this.taskStore) return [];\n\n try {\n // Access the db directly to get ALL tasks including completed\n const contextDbPath = path.join(\n this.projectPath,\n '.stackmemory',\n 'context.db'\n );\n const db = new Database(contextDbPath);\n\n const rows = db\n .prepare(\n `\n SELECT * FROM task_cache \n ORDER BY created_at DESC\n `\n )\n .all() as any[];\n\n db.close();\n\n // Hydrate the rows\n return rows.map((row) => ({\n id: row.id,\n title: row.title,\n description: row.description,\n status: row.status,\n priority: row.priority,\n created_at: row.created_at,\n completed_at: row.completed_at,\n estimated_effort: row.estimated_effort,\n actual_effort: row.actual_effort,\n assignee: row.assignee,\n tags: JSON.parse(row.tags || '[]'),\n depends_on: JSON.parse(row.depends_on || '[]'),\n }));\n } catch (error: unknown) {\n console.error('Failed to get all tasks:', error);\n return [];\n }\n }\n\n private mapTaskStatus(status: string): TaskAnalytics['state'] {\n const statusMap: Record<string, TaskAnalytics['state']> = {\n pending: 'todo',\n in_progress: 'in_progress',\n completed: 'completed',\n blocked: 'blocked',\n cancelled: 'blocked',\n };\n return statusMap[status] || 'todo';\n }\n\n private mapLinearState(linearState: string): TaskAnalytics['state'] {\n const stateMap: Record<string, TaskAnalytics['state']> = {\n backlog: 'todo',\n unstarted: 'todo',\n started: 'in_progress',\n completed: 'completed',\n done: 'completed',\n canceled: 'blocked',\n };\n return stateMap[linearState.toLowerCase()] || 'todo';\n }\n\n private mapLinearPriority(priority: number): TaskAnalytics['priority'] {\n if (priority === 1) return 'urgent';\n if (priority === 2) return 'high';\n if (priority === 3) return 'medium';\n return 'low';\n }\n\n async getDashboardState(query: AnalyticsQuery = {}): Promise<DashboardState> {\n const timeRange = query.timeRange || this.getDefaultTimeRange();\n\n const metrics = this.metricsQueries.getTaskMetrics({\n ...query,\n timeRange,\n });\n\n const recentTasks = this.metricsQueries.getRecentTasks({\n ...query,\n limit: 20,\n });\n\n const teamMetrics = await this.getTeamMetrics(query);\n\n return {\n metrics,\n teamMetrics,\n recentTasks,\n timeRange,\n teamFilter: query.userIds || [],\n isLive: this.updateCallbacks.size > 0,\n lastUpdated: new Date(),\n };\n }\n\n private async getTeamMetrics(query: AnalyticsQuery): Promise<TeamMetrics[]> {\n const uniqueUserIds = new Set<string>();\n const tasks = this.metricsQueries.getRecentTasks({ limit: 1000 });\n\n tasks.forEach((task) => {\n if (task.assigneeId) {\n uniqueUserIds.add(task.assigneeId);\n }\n });\n\n const teamMetrics: TeamMetrics[] = [];\n const totalCompleted = tasks.filter((t) => t.state === 'completed').length;\n\n for (const userId of uniqueUserIds) {\n const userQuery = { ...query, userIds: [userId] };\n const individualMetrics = this.metricsQueries.getTaskMetrics(userQuery);\n\n teamMetrics.push({\n userId,\n userName: await this.getUserName(userId),\n individualMetrics,\n contributionPercentage:\n totalCompleted > 0\n ? (individualMetrics.completedTasks / totalCompleted) * 100\n : 0,\n lastActive: new Date(),\n });\n }\n\n return teamMetrics.sort(\n (a, b) => b.contributionPercentage - a.contributionPercentage\n );\n }\n\n private async getUserName(userId: string): Promise<string> {\n // Stub for now - would need LinearClient to expose user query method\n return userId;\n }\n\n private getDefaultTimeRange(): TimeRange {\n const end = new Date();\n const start = new Date();\n start.setDate(start.getDate() - 7);\n\n return {\n start,\n end,\n preset: '7d',\n };\n }\n\n subscribeToUpdates(callback: (state: DashboardState) => void): () => void {\n this.updateCallbacks.add(callback);\n\n return () => {\n this.updateCallbacks.delete(callback);\n };\n }\n\n private async notifyUpdate(): Promise<void> {\n const state = await this.getDashboardState();\n this.updateCallbacks.forEach((callback) => callback(state));\n }\n\n async addTask(task: TaskAnalytics): Promise<void> {\n this.metricsQueries.upsertTask(task);\n await this.notifyUpdate();\n }\n\n async updateTask(\n taskId: string,\n updates: Partial<TaskAnalytics>\n ): Promise<void> {\n const tasks = this.metricsQueries.getRecentTasks({ limit: 1 });\n const existingTask = tasks.find((t) => t.id === taskId);\n\n if (existingTask) {\n const updatedTask = { ...existingTask, ...updates };\n this.metricsQueries.upsertTask(updatedTask);\n await this.notifyUpdate();\n }\n }\n\n close(): void {\n this.metricsQueries.close();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/analytics/index.ts"],
4
- "sourcesContent": ["export * from './types/metrics.js';\nexport * from './core/analytics-service.js';\nexport * from './api/analytics-api.js';\nexport * from './queries/metrics-queries.js';\n\nimport { AnalyticsService } from './core/analytics-service.js';\nimport { AnalyticsAPI } from './api/analytics-api.js';\n\nexport default {\n AnalyticsService,\n AnalyticsAPI,\n};\n"],
5
- "mappings": ";;;;AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAE7B,IAAO,oBAAQ;AAAA,EACb;AAAA,EACA;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/analytics/queries/metrics-queries.ts"],
4
- "sourcesContent": ["import Database from 'better-sqlite3';\nimport {\n TaskAnalytics,\n TaskMetrics,\n TimeRange,\n AnalyticsQuery,\n} from '../types/metrics.js';\nimport {\n DatabaseError,\n SystemError,\n ErrorCode,\n createErrorHandler,\n} from '../../../core/errors/index.js';\nimport { retry } from '../../../core/errors/recovery.js';\n\nexport class MetricsQueries {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n try {\n this.db = new Database(dbPath, { readonly: false });\n this.initializeTables();\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to initialize metrics database',\n ErrorCode.DB_CONNECTION_FAILED,\n {\n dbPath,\n operation: 'constructor',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private initializeTables(): void {\n const errorHandler = createErrorHandler({\n operation: 'initializeTables',\n });\n\n try {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS task_analytics (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n state TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n completed_at INTEGER,\n estimated_effort INTEGER,\n actual_effort INTEGER,\n assignee_id TEXT,\n priority TEXT DEFAULT 'medium',\n labels TEXT DEFAULT '[]',\n blocking_issues TEXT DEFAULT '[]',\n updated_at INTEGER DEFAULT (strftime('%s', 'now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_task_state ON task_analytics(state);\n CREATE INDEX IF NOT EXISTS idx_task_created ON task_analytics(created_at);\n CREATE INDEX IF NOT EXISTS idx_task_assignee ON task_analytics(assignee_id);\n `);\n } catch (error: unknown) {\n const dbError = errorHandler(error, {\n operation: 'initializeTables',\n schema: 'task_analytics',\n });\n\n throw new DatabaseError(\n 'Failed to initialize analytics tables',\n ErrorCode.DB_MIGRATION_FAILED,\n {\n operation: 'initializeTables',\n schema: 'task_analytics',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n getTaskMetrics(query: AnalyticsQuery = {}): TaskMetrics {\n try {\n const { timeRange, userIds, states, priorities } = query;\n\n const whereConditions: string[] = ['1=1'];\n const params: any = {};\n\n if (timeRange) {\n whereConditions.push(\n 'created_at >= @startTime AND created_at <= @endTime'\n );\n params.startTime = Math.floor(timeRange.start.getTime() / 1000);\n params.endTime = Math.floor(timeRange.end.getTime() / 1000);\n }\n\n if (userIds && userIds.length > 0) {\n whereConditions.push(\n `assignee_id IN (${userIds.map((_, i) => `@user${i}`).join(',')})`\n );\n userIds.forEach((id, i) => (params[`user${i}`] = id));\n }\n\n if (states && states.length > 0) {\n whereConditions.push(\n `state IN (${states.map((_, i) => `@state${i}`).join(',')})`\n );\n states.forEach((s, i) => (params[`state${i}`] = s));\n }\n\n if (priorities && priorities.length > 0) {\n whereConditions.push(\n `priority IN (${priorities.map((_, i) => `@priority${i}`).join(',')})`\n );\n priorities.forEach((p, i) => (params[`priority${i}`] = p));\n }\n\n const whereClause = whereConditions.join(' AND ');\n\n const metricsQuery = this.db.prepare(`\n SELECT \n COUNT(*) as total_tasks,\n SUM(CASE WHEN state = 'completed' THEN 1 ELSE 0 END) as completed_tasks,\n SUM(CASE WHEN state = 'in_progress' THEN 1 ELSE 0 END) as in_progress_tasks,\n SUM(CASE WHEN state = 'blocked' THEN 1 ELSE 0 END) as blocked_tasks,\n AVG(CASE \n WHEN state = 'completed' AND completed_at IS NOT NULL \n THEN (completed_at - created_at) * 1000\n ELSE NULL \n END) as avg_time_to_complete,\n AVG(CASE \n WHEN actual_effort IS NOT NULL AND estimated_effort IS NOT NULL AND estimated_effort > 0\n THEN (CAST(actual_effort AS REAL) / estimated_effort) * 100\n ELSE NULL\n END) as effort_accuracy,\n SUM(CASE \n WHEN json_array_length(blocking_issues) > 0 \n THEN json_array_length(blocking_issues)\n ELSE 0\n END) as blocking_issues_count\n FROM task_analytics\n WHERE ${whereClause}\n `);\n\n const result = metricsQuery.get(params) as any;\n\n const velocityQuery = this.db.prepare(`\n SELECT \n DATE(created_at, 'unixepoch') as day,\n COUNT(*) as completed_count\n FROM task_analytics\n WHERE state = 'completed' \n AND ${whereClause}\n GROUP BY day\n ORDER BY day DESC\n LIMIT 30\n `);\n\n const velocityData = velocityQuery.all(params) as any[];\n const velocityTrend = velocityData\n .map((v) => v.completed_count)\n .reverse();\n\n return {\n totalTasks: result.total_tasks || 0,\n completedTasks: result.completed_tasks || 0,\n inProgressTasks: result.in_progress_tasks || 0,\n blockedTasks: result.blocked_tasks || 0,\n completionRate:\n result.total_tasks > 0\n ? (result.completed_tasks / result.total_tasks) * 100\n : 0,\n averageTimeToComplete: result.avg_time_to_complete || 0,\n effortAccuracy: result.effort_accuracy || 100,\n blockingIssuesCount: result.blocking_issues_count || 0,\n velocityTrend,\n };\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to get task metrics',\n ErrorCode.DB_QUERY_FAILED,\n {\n query,\n operation: 'getTaskMetrics',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n getRecentTasks(query: AnalyticsQuery = {}): TaskAnalytics[] {\n try {\n const { limit = 100, offset = 0 } = query;\n\n const tasksQuery = this.db.prepare(`\n SELECT \n id,\n title,\n state,\n created_at,\n completed_at,\n estimated_effort,\n actual_effort,\n assignee_id,\n priority,\n labels,\n blocking_issues\n FROM task_analytics\n ORDER BY updated_at DESC\n LIMIT ? OFFSET ?\n `);\n\n const rows = tasksQuery.all(limit, offset) as any[];\n\n return rows.map((row) => ({\n id: row.id,\n title: row.title,\n state: row.state as TaskAnalytics['state'],\n createdAt: new Date(row.created_at * 1000),\n completedAt: row.completed_at\n ? new Date(row.completed_at * 1000)\n : undefined,\n estimatedEffort: row.estimated_effort,\n actualEffort: row.actual_effort,\n assigneeId: row.assignee_id,\n priority: row.priority as TaskAnalytics['priority'],\n labels: JSON.parse(row.labels),\n blockingIssues: JSON.parse(row.blocking_issues),\n }));\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to get recent tasks',\n ErrorCode.DB_QUERY_FAILED,\n {\n limit: query.limit,\n offset: query.offset,\n operation: 'getRecentTasks',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n upsertTask(task: TaskAnalytics): void {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO task_analytics (\n id, title, state, created_at, completed_at,\n estimated_effort, actual_effort, assignee_id,\n priority, labels, blocking_issues\n ) VALUES (\n @id, @title, @state, @created_at, @completed_at,\n @estimated_effort, @actual_effort, @assignee_id,\n @priority, @labels, @blocking_issues\n )\n ON CONFLICT(id) DO UPDATE SET\n title = @title,\n state = @state,\n completed_at = @completed_at,\n estimated_effort = @estimated_effort,\n actual_effort = @actual_effort,\n assignee_id = @assignee_id,\n priority = @priority,\n labels = @labels,\n blocking_issues = @blocking_issues,\n updated_at = strftime('%s', 'now')\n `);\n\n stmt.run({\n id: task.id,\n title: task.title,\n state: task.state,\n created_at: Math.floor(task.createdAt.getTime() / 1000),\n completed_at: task.completedAt\n ? Math.floor(task.completedAt.getTime() / 1000)\n : null,\n estimated_effort: task.estimatedEffort || null,\n actual_effort: task.actualEffort || null,\n assignee_id: task.assigneeId || null,\n priority: task.priority,\n labels: JSON.stringify(task.labels),\n blocking_issues: JSON.stringify(task.blockingIssues),\n });\n } catch (error: unknown) {\n throw new DatabaseError(\n `Failed to upsert task analytics: ${task.id}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n taskId: task.id,\n taskState: task.state,\n operation: 'upsertTask',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n close(): void {\n try {\n this.db.close();\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to close analytics database',\n ErrorCode.DB_CONNECTION_FAILED,\n {\n operation: 'close',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/browser/browser-mcp.ts"],
4
- "sourcesContent": ["/**\n * Browser MCP Integration for StackMemory\n * Provides browser automation capabilities through MCP\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n McpError,\n ErrorCode,\n} from '@modelcontextprotocol/sdk/types.js';\nimport puppeteer, { Browser, Page } from 'puppeteer';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport interface BrowserAction {\n type: 'navigate' | 'click' | 'type' | 'screenshot' | 'evaluate' | 'wait';\n selector?: string;\n value?: string;\n script?: string;\n timeout?: number;\n}\n\nexport interface BrowserSession {\n id: string;\n browser: Browser;\n page: Page;\n createdAt: Date;\n lastActivity: Date;\n url?: string;\n}\n\nexport class BrowserMCPIntegration {\n private sessions: Map<string, BrowserSession> = new Map();\n private server?: Server;\n private maxSessions = 5;\n private sessionTimeout = 30 * 60 * 1000; // 30 minutes\n\n constructor(\n private config: {\n headless?: boolean;\n defaultViewport?: { width: number; height: number };\n userDataDir?: string;\n executablePath?: string;\n } = {}\n ) {\n this.startCleanupInterval();\n }\n\n /**\n * Initialize the Browser MCP server\n */\n async initialize(mcpServer?: Server): Promise<void> {\n this.server =\n mcpServer ||\n new Server(\n {\n name: 'stackmemory-browser',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupHandlers();\n logger.info('Browser MCP integration initialized');\n }\n\n /**\n * Set up MCP request handlers\n */\n private setupHandlers(): void {\n if (!this.server) return;\n\n // List available browser tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n {\n name: 'browser_navigate',\n description: 'Navigate to a URL in the browser',\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'URL to navigate to' },\n sessionId: { type: 'string', description: 'Optional session ID' },\n },\n required: ['url'],\n },\n },\n {\n name: 'browser_screenshot',\n description: 'Take a screenshot of the current page',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'Session ID' },\n fullPage: { type: 'boolean', description: 'Capture full page' },\n selector: {\n type: 'string',\n description: 'CSS selector to screenshot',\n },\n },\n required: ['sessionId'],\n },\n },\n {\n name: 'browser_click',\n description: 'Click an element on the page',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'Session ID' },\n selector: {\n type: 'string',\n description: 'CSS selector to click',\n },\n },\n required: ['sessionId', 'selector'],\n },\n },\n {\n name: 'browser_type',\n description: 'Type text into an input field',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'Session ID' },\n selector: {\n type: 'string',\n description: 'CSS selector of input',\n },\n text: { type: 'string', description: 'Text to type' },\n },\n required: ['sessionId', 'selector', 'text'],\n },\n },\n {\n name: 'browser_evaluate',\n description: 'Execute JavaScript in the browser context',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'Session ID' },\n script: {\n type: 'string',\n description: 'JavaScript code to execute',\n },\n },\n required: ['sessionId', 'script'],\n },\n },\n {\n name: 'browser_wait',\n description: 'Wait for an element or condition',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'Session ID' },\n selector: {\n type: 'string',\n description: 'CSS selector to wait for',\n },\n timeout: {\n type: 'number',\n description: 'Timeout in milliseconds',\n },\n },\n required: ['sessionId'],\n },\n },\n {\n name: 'browser_get_content',\n description: 'Get the text content of the page or element',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'Session ID' },\n selector: {\n type: 'string',\n description: 'CSS selector (optional)',\n },\n },\n required: ['sessionId'],\n },\n },\n {\n name: 'browser_close',\n description: 'Close a browser session',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'Session ID to close' },\n },\n required: ['sessionId'],\n },\n },\n ],\n }));\n\n // Handle tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (!args) {\n throw new McpError(ErrorCode.InvalidParams, 'Missing arguments');\n }\n\n try {\n switch (name) {\n case 'browser_navigate':\n return await this.navigate(\n String(args.url),\n args.sessionId as string\n );\n\n case 'browser_screenshot':\n return await this.screenshot(\n String(args.sessionId),\n args.fullPage as boolean,\n args.selector as string\n );\n\n case 'browser_click':\n return await this.click(\n String(args.sessionId),\n String(args.selector)\n );\n\n case 'browser_type':\n return await this.type(\n String(args.sessionId),\n String(args.selector),\n String(args.text)\n );\n\n case 'browser_evaluate':\n return await this.evaluate(\n String(args.sessionId),\n String(args.script)\n );\n\n case 'browser_wait':\n return await this.waitFor(\n String(args.sessionId),\n args.selector as string,\n args.timeout as number\n );\n\n case 'browser_get_content':\n return await this.getContent(\n String(args.sessionId),\n args.selector as string\n );\n\n case 'browser_close':\n return await this.closeSession(String(args.sessionId));\n\n default:\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${name}`\n );\n }\n } catch (error: any) {\n logger.error('Browser MCP tool error', error);\n throw new McpError(ErrorCode.InternalError, error.message);\n }\n });\n }\n\n /**\n * Navigate to a URL\n */\n private async navigate(url: string, sessionId?: string): Promise<any> {\n const session = await this.getOrCreateSession(sessionId);\n\n await session.page.goto(url, { waitUntil: 'networkidle2' });\n session.url = url;\n session.lastActivity = new Date();\n\n logger.info(`Browser navigated to ${url}`, { sessionId: session.id });\n\n return {\n content: [\n {\n type: 'text',\n text: `Navigated to ${url}`,\n },\n ],\n sessionId: session.id,\n url,\n };\n }\n\n /**\n * Take a screenshot\n */\n private async screenshot(\n sessionId: string,\n fullPage = false,\n selector?: string\n ): Promise<any> {\n const session = this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n let screenshot: Buffer;\n\n if (selector) {\n const element = await session.page.$(selector);\n if (!element) {\n throw new Error(`Element ${selector} not found`);\n }\n screenshot = Buffer.from(await element.screenshot());\n } else {\n screenshot = Buffer.from(await session.page.screenshot({ fullPage }));\n }\n\n session.lastActivity = new Date();\n\n return {\n content: [\n {\n type: 'image',\n data: screenshot.toString('base64'),\n },\n ],\n sessionId: session.id,\n };\n }\n\n /**\n * Click an element\n */\n private async click(sessionId: string, selector: string): Promise<any> {\n const session = this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n await session.page.click(selector);\n session.lastActivity = new Date();\n\n return {\n content: [\n {\n type: 'text',\n text: `Clicked element: ${selector}`,\n },\n ],\n sessionId: session.id,\n };\n }\n\n /**\n * Type text into an input\n */\n private async type(\n sessionId: string,\n selector: string,\n text: string\n ): Promise<any> {\n const session = this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n await session.page.type(selector, text);\n session.lastActivity = new Date();\n\n return {\n content: [\n {\n type: 'text',\n text: `Typed \"${text}\" into ${selector}`,\n },\n ],\n sessionId: session.id,\n };\n }\n\n /**\n * Execute JavaScript in page context\n */\n private async evaluate(sessionId: string, script: string): Promise<any> {\n const session = this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const result = await session.page.evaluate(script);\n session.lastActivity = new Date();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n sessionId: session.id,\n result,\n };\n }\n\n /**\n * Wait for element or timeout\n */\n private async waitFor(\n sessionId: string,\n selector?: string,\n timeout = 5000\n ): Promise<any> {\n const session = this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n if (selector) {\n await session.page.waitForSelector(selector, { timeout });\n } else {\n await new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n session.lastActivity = new Date();\n\n return {\n content: [\n {\n type: 'text',\n text: selector ? `Element ${selector} found` : `Waited ${timeout}ms`,\n },\n ],\n sessionId: session.id,\n };\n }\n\n /**\n * Get page content\n */\n private async getContent(sessionId: string, selector?: string): Promise<any> {\n const session = this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n let content: string;\n\n if (selector) {\n content = await session.page.$eval(\n selector,\n (el) => el.textContent || ''\n );\n } else {\n content = await session.page.content();\n }\n\n session.lastActivity = new Date();\n\n return {\n content: [\n {\n type: 'text',\n text: content,\n },\n ],\n sessionId: session.id,\n };\n }\n\n /**\n * Get or create a browser session\n */\n private async getOrCreateSession(\n sessionId?: string\n ): Promise<BrowserSession> {\n if (sessionId) {\n const existing = this.sessions.get(sessionId);\n if (existing) {\n existing.lastActivity = new Date();\n return existing;\n }\n }\n\n // Clean up old sessions if at max\n if (this.sessions.size >= this.maxSessions) {\n const oldest = Array.from(this.sessions.values()).sort(\n (a, b) => a.lastActivity.getTime() - b.lastActivity.getTime()\n )[0];\n await this.closeSession(oldest.id);\n }\n\n // Create new session\n const browser = await puppeteer.launch({\n headless: this.config.headless ?? true,\n defaultViewport: this.config.defaultViewport || {\n width: 1280,\n height: 720,\n },\n userDataDir: this.config.userDataDir,\n executablePath: this.config.executablePath,\n args: ['--no-sandbox', '--disable-setuid-sandbox'], // For Railway/Docker\n });\n\n const page = await browser.newPage();\n const id = sessionId || `session-${Date.now()}`;\n\n const session: BrowserSession = {\n id,\n browser,\n page,\n createdAt: new Date(),\n lastActivity: new Date(),\n };\n\n this.sessions.set(id, session);\n logger.info(`Created browser session ${id}`);\n\n return session;\n }\n\n /**\n * Get existing session\n */\n private getSession(sessionId: string): BrowserSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Close a browser session\n */\n private async closeSession(sessionId: string): Promise<any> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session ${sessionId} not found`,\n },\n ],\n };\n }\n\n await session.browser.close();\n this.sessions.delete(sessionId);\n\n logger.info(`Closed browser session ${sessionId}`);\n\n return {\n content: [\n {\n type: 'text',\n text: `Session ${sessionId} closed`,\n },\n ],\n };\n }\n\n /**\n * Clean up inactive sessions\n */\n private startCleanupInterval(): void {\n setInterval(async () => {\n const now = Date.now();\n\n for (const [id, session] of this.sessions.entries()) {\n const inactiveTime = now - session.lastActivity.getTime();\n\n if (inactiveTime > this.sessionTimeout) {\n logger.info(`Cleaning up inactive session ${id}`);\n await this.closeSession(id);\n }\n }\n }, 60000); // Check every minute\n }\n\n /**\n * Close all sessions\n */\n async cleanup(): Promise<void> {\n for (const sessionId of this.sessions.keys()) {\n await this.closeSession(sessionId);\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/index.ts"],
4
- "sourcesContent": ["/**\n * Sweep Next-Edit Feature\n *\n * Provides next-edit predictions using Sweep 1.5B model\n * via a local llama-server instance.\n */\n\nexport * from './types.js';\nexport * from './prompt-builder.js';\nexport * from './prediction-client.js';\nexport * from './sweep-server-manager.js';\nexport * from './state-watcher.js';\nexport * from './status-bar.js';\nexport * from './tab-interceptor.js';\nexport {\n PtyWrapper,\n launchWrapper,\n type PtyWrapperConfig,\n} from './pty-wrapper.js';\n"],
5
- "mappings": ";;;;AAOA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd;AAAA,EACE;AAAA,EACA;AAAA,OAEK;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/prediction-client.ts"],
4
- "sourcesContent": ["/**\n * Sweep Prediction Client\n *\n * HTTP client for llama-server's OpenAI-compatible completions API.\n */\n\nimport {\n SweepServerConfig,\n SweepPredictInput,\n SweepPredictResult,\n CompletionRequest,\n CompletionResponse,\n SWEEP_STOP_TOKENS,\n DEFAULT_SERVER_CONFIG,\n} from './types.js';\nimport { buildSweepPrompt } from './prompt-builder.js';\n\nexport class SweepPredictionClient {\n private config: SweepServerConfig;\n private baseUrl: string;\n\n constructor(config: Partial<SweepServerConfig> = {}) {\n this.config = { ...DEFAULT_SERVER_CONFIG, ...config };\n this.baseUrl = `http://${this.config.host}:${this.config.port}`;\n }\n\n /**\n * Check if the server is healthy\n */\n async checkHealth(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n signal: AbortSignal.timeout(2000),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Run a prediction using the Sweep model\n */\n async predict(input: SweepPredictInput): Promise<SweepPredictResult> {\n const startTime = Date.now();\n\n try {\n // Build the prompt\n const prompt = buildSweepPrompt({\n filePath: input.file_path,\n originalContent: input.original_content || input.current_content,\n currentContent: input.current_content,\n recentDiffs: input.recent_diffs || [],\n contextFiles: input.context_files,\n });\n\n // Create completion request\n const request: CompletionRequest = {\n model: 'sweep',\n prompt,\n max_tokens: input.max_tokens || 2048,\n temperature: input.temperature || 0.1,\n top_k: input.top_k || 40,\n stop: SWEEP_STOP_TOKENS,\n stream: false,\n };\n\n // Call the server\n const response = await fetch(`${this.baseUrl}/v1/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n signal: AbortSignal.timeout(30000),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: 'server_error',\n message: `Server returned ${response.status}: ${errorText}`,\n };\n }\n\n const data = (await response.json()) as CompletionResponse;\n const latencyMs = Date.now() - startTime;\n\n if (!data.choices || data.choices.length === 0) {\n return {\n success: false,\n error: 'no_choices',\n message: 'Server returned no completion choices',\n };\n }\n\n const completionText = data.choices[0].text;\n\n // Check for empty or whitespace-only completion\n if (!completionText || completionText.trim().length === 0) {\n return {\n success: true,\n predicted_content: '',\n file_path: input.file_path,\n latency_ms: latencyMs,\n tokens_generated: 0,\n message: 'No changes predicted',\n };\n }\n\n return {\n success: true,\n predicted_content: completionText,\n file_path: input.file_path,\n latency_ms: latencyMs,\n tokens_generated: data.usage?.completion_tokens || 0,\n };\n } catch (error) {\n const latencyMs = Date.now() - startTime;\n\n if (error instanceof Error) {\n if (error.name === 'AbortError' || error.name === 'TimeoutError') {\n return {\n success: false,\n error: 'timeout',\n message: 'Request timed out',\n latency_ms: latencyMs,\n };\n }\n\n if (error.message.includes('ECONNREFUSED')) {\n return {\n success: false,\n error: 'connection_refused',\n message: 'Server not running. Start with: stackmemory sweep start',\n latency_ms: latencyMs,\n };\n }\n\n return {\n success: false,\n error: 'request_error',\n message: error.message,\n latency_ms: latencyMs,\n };\n }\n\n return {\n success: false,\n error: 'unknown_error',\n message: String(error),\n latency_ms: latencyMs,\n };\n }\n }\n\n /**\n * Get server info\n */\n async getServerInfo(): Promise<Record<string, unknown> | null> {\n try {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n method: 'GET',\n signal: AbortSignal.timeout(2000),\n });\n\n if (response.ok) {\n return (await response.json()) as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Create a prediction client with default config\n */\nexport function createPredictionClient(\n config?: Partial<SweepServerConfig>\n): SweepPredictionClient {\n return new SweepPredictionClient(config);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/prompt-builder.ts"],
4
- "sourcesContent": ["/**\n * Sweep Prompt Builder\n *\n * Builds prompts in the Sweep Next-Edit format with <|file_sep|> tokens.\n * Format based on Qwen2.5-Coder pretrained model structure.\n */\n\nimport { SweepPromptInput, DiffEntry } from './types.js';\n\n/**\n * Build a Sweep-format prompt for next-edit prediction\n *\n * Format:\n * <|file_sep|>{file}.diff\n * original:\n * {before}\n * updated:\n * {after}\n * <|file_sep|>original/{file_path}\n * {original_content}\n * <|file_sep|>current/{file_path}\n * {current_content}\n * <|file_sep|>updated/{file_path}\n */\nexport function buildSweepPrompt(input: SweepPromptInput): string {\n const parts: string[] = [];\n\n // Add context files if provided\n if (input.contextFiles) {\n for (const [path, content] of Object.entries(input.contextFiles)) {\n parts.push(`<|file_sep|>${path}`);\n parts.push(content);\n }\n }\n\n // Add recent diffs section\n const diffSection = buildDiffSection(input.recentDiffs);\n if (diffSection) {\n parts.push(diffSection);\n }\n\n // Add original file state\n parts.push(`<|file_sep|>original/${input.filePath}`);\n parts.push(input.originalContent || input.currentContent);\n\n // Add current file state\n parts.push(`<|file_sep|>current/${input.filePath}`);\n parts.push(input.currentContent);\n\n // Add updated marker - model generates from here\n parts.push(`<|file_sep|>updated/${input.filePath}`);\n\n return parts.join('\\n');\n}\n\n/**\n * Build the diff history section\n */\nfunction buildDiffSection(diffs: DiffEntry[]): string {\n if (!diffs || diffs.length === 0) {\n return '';\n }\n\n const parts: string[] = [];\n\n for (const diff of diffs) {\n if (!diff.original && !diff.updated) {\n continue;\n }\n\n parts.push(`<|file_sep|>${diff.file_path}.diff`);\n parts.push('original:');\n parts.push(diff.original || '');\n parts.push('updated:');\n parts.push(diff.updated || '');\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Trim content around cursor position to fit token budget\n */\nexport function trimContentAroundCursor(\n lines: string[],\n cursorLine: number,\n cursorCol: number,\n maxTokens: number\n): { lines: string[]; offset: number; didTrim: boolean } {\n // Estimate tokens: ~4 chars per token\n const totalChars = lines.join('\\n').length;\n const estimatedTokens = Math.ceil(totalChars / 4);\n\n if (estimatedTokens <= maxTokens) {\n return { lines, offset: 0, didTrim: false };\n }\n\n // Calculate window size based on token budget\n const targetChars = maxTokens * 4;\n const avgLineLength = totalChars / lines.length;\n const windowSize = Math.floor(targetChars / avgLineLength);\n\n // Center window around cursor\n const halfWindow = Math.floor(windowSize / 2);\n let start = Math.max(0, cursorLine - halfWindow);\n let end = Math.min(lines.length, start + windowSize);\n\n // Adjust if we hit the end\n if (end === lines.length) {\n start = Math.max(0, end - windowSize);\n }\n\n return {\n lines: lines.slice(start, end),\n offset: start,\n didTrim: true,\n };\n}\n\n/**\n * Parse completion text from model output\n */\nexport function parseCompletion(\n completionText: string,\n originalLines: string[],\n windowStart: number,\n windowEnd: number\n): { lines: string[]; startLine: number; endLine: number } | null {\n // Strip trailing stop tokens\n let text = completionText\n .replace(/<\\|file_sep\\|>$/, '')\n .replace(/<\\/s>$/, '')\n .trimEnd();\n\n if (!text || text.trim().length === 0) {\n return null;\n }\n\n const newLines = text.split('\\n');\n const oldLines = originalLines.slice(windowStart, windowEnd);\n const oldText = oldLines.join('\\n').trimEnd();\n\n // No change if identical\n if (text === oldText) {\n return null;\n }\n\n return {\n lines: newLines,\n startLine: windowStart + 1, // Convert to 1-indexed\n endLine: windowEnd,\n };\n}\n"],
5
- "mappings": ";;;;AAwBO,SAAS,iBAAiB,OAAiC;AAChE,QAAM,QAAkB,CAAC;AAGzB,MAAI,MAAM,cAAc;AACtB,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,YAAY,GAAG;AAChE,YAAM,KAAK,eAAe,IAAI,EAAE;AAChC,YAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,cAAc,iBAAiB,MAAM,WAAW;AACtD,MAAI,aAAa;AACf,UAAM,KAAK,WAAW;AAAA,EACxB;AAGA,QAAM,KAAK,wBAAwB,MAAM,QAAQ,EAAE;AACnD,QAAM,KAAK,MAAM,mBAAmB,MAAM,cAAc;AAGxD,QAAM,KAAK,uBAAuB,MAAM,QAAQ,EAAE;AAClD,QAAM,KAAK,MAAM,cAAc;AAG/B,QAAM,KAAK,uBAAuB,MAAM,QAAQ,EAAE;AAElD,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,iBAAiB,OAA4B;AACpD,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AAEzB,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,SAAS;AACnC;AAAA,IACF;AAEA,UAAM,KAAK,eAAe,KAAK,SAAS,OAAO;AAC/C,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,KAAK,YAAY,EAAE;AAC9B,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,KAAK,WAAW,EAAE;AAAA,EAC/B;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,wBACd,OACA,YACA,WACA,WACuD;AAEvD,QAAM,aAAa,MAAM,KAAK,IAAI,EAAE;AACpC,QAAM,kBAAkB,KAAK,KAAK,aAAa,CAAC;AAEhD,MAAI,mBAAmB,WAAW;AAChC,WAAO,EAAE,OAAO,QAAQ,GAAG,SAAS,MAAM;AAAA,EAC5C;AAGA,QAAM,cAAc,YAAY;AAChC,QAAM,gBAAgB,aAAa,MAAM;AACzC,QAAM,aAAa,KAAK,MAAM,cAAc,aAAa;AAGzD,QAAM,aAAa,KAAK,MAAM,aAAa,CAAC;AAC5C,MAAI,QAAQ,KAAK,IAAI,GAAG,aAAa,UAAU;AAC/C,MAAI,MAAM,KAAK,IAAI,MAAM,QAAQ,QAAQ,UAAU;AAGnD,MAAI,QAAQ,MAAM,QAAQ;AACxB,YAAQ,KAAK,IAAI,GAAG,MAAM,UAAU;AAAA,EACtC;AAEA,SAAO;AAAA,IACL,OAAO,MAAM,MAAM,OAAO,GAAG;AAAA,IAC7B,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAKO,SAAS,gBACd,gBACA,eACA,aACA,WACgE;AAEhE,MAAI,OAAO,eACR,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,UAAU,EAAE,EACpB,QAAQ;AAEX,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,MAAM,IAAI;AAChC,QAAM,WAAW,cAAc,MAAM,aAAa,SAAS;AAC3D,QAAM,UAAU,SAAS,KAAK,IAAI,EAAE,QAAQ;AAG5C,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,WAAW,cAAc;AAAA;AAAA,IACzB,SAAS;AAAA,EACX;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/pty-wrapper.ts"],
4
- "sourcesContent": ["/**\n * Sweep PTY Wrapper\n *\n * Wraps Claude Code in a pseudo-terminal to add a Sweep prediction\n * status bar at the bottom of the terminal. Predictions from the\n * PostToolUse hook are displayed via the status bar. Tab to accept,\n * Esc to dismiss.\n */\n\nimport { join } from 'path';\nimport { writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { execSync } from 'child_process';\nimport { SweepStateWatcher, type PredictionEvent } from './state-watcher.js';\nimport { StatusBar } from './status-bar.js';\nimport { TabInterceptor } from './tab-interceptor.js';\n\nconst HOME = process.env['HOME'] || '/tmp';\nconst PENDING_FILE = join(HOME, '.stackmemory', 'sweep-pending.json');\n\n// Alt screen buffer detection\nconst ALT_SCREEN_ENTER = '\\x1b[?1049h';\nconst ALT_SCREEN_EXIT = '\\x1b[?1049l';\n\nexport interface PtyWrapperConfig {\n claudeBin?: string;\n claudeArgs?: string[];\n stateFile?: string;\n}\n\n// Minimal interface for node-pty process to avoid compile-time dep\ninterface PtyProcess {\n write(data: string): void;\n resize(cols: number, rows: number): void;\n onData(cb: (data: string) => void): void;\n onExit(cb: (e: { exitCode: number }) => void): void;\n kill(): void;\n}\n\nexport class PtyWrapper {\n private config: Required<PtyWrapperConfig>;\n private stateWatcher: SweepStateWatcher;\n private statusBar: StatusBar;\n private tabInterceptor: TabInterceptor;\n private currentPrediction: PredictionEvent | null = null;\n private inAltScreen = false;\n private ptyProcess: PtyProcess | null = null;\n\n constructor(config: PtyWrapperConfig = {}) {\n this.config = {\n claudeBin: config.claudeBin || this.findClaude(),\n claudeArgs: config.claudeArgs || [],\n stateFile:\n config.stateFile || join(HOME, '.stackmemory', 'sweep-state.json'),\n };\n\n this.stateWatcher = new SweepStateWatcher(this.config.stateFile);\n this.statusBar = new StatusBar();\n this.tabInterceptor = new TabInterceptor({\n onAccept: () => this.acceptPrediction(),\n onDismiss: () => this.dismissPrediction(),\n onPassthrough: (data) => this.ptyProcess?.write(data.toString('utf-8')),\n });\n }\n\n async start(): Promise<void> {\n // Dynamic import for optional dependency\n let pty: typeof import('node-pty');\n try {\n pty = await import('node-pty');\n } catch {\n throw new Error(\n 'node-pty is required for the PTY wrapper.\\n' +\n 'Install with: npm install node-pty'\n );\n }\n\n const cols = process.stdout.columns || 80;\n const rows = process.stdout.rows || 24;\n\n // Filter undefined values from env\n const env: Record<string, string> = {};\n for (const [k, v] of Object.entries(process.env)) {\n if (v !== undefined) env[k] = v;\n }\n\n // Spawn Claude Code in a PTY with 1 row reserved for status bar\n this.ptyProcess = pty.spawn(this.config.claudeBin, this.config.claudeArgs, {\n name: process.env['TERM'] || 'xterm-256color',\n cols,\n rows: rows - 1,\n cwd: process.cwd(),\n env,\n }) as PtyProcess;\n\n // Set raw mode on stdin\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n\n // PTY stdout -> parent stdout (transparent passthrough)\n this.ptyProcess.onData((data: string) => {\n // Detect alt screen buffer transitions\n if (data.includes(ALT_SCREEN_ENTER)) {\n this.inAltScreen = true;\n this.statusBar.hide();\n }\n if (data.includes(ALT_SCREEN_EXIT)) {\n this.inAltScreen = false;\n }\n\n process.stdout.write(data);\n });\n\n // Parent stdin -> tab interceptor -> PTY\n process.stdin.on('data', (data: Buffer) => {\n this.tabInterceptor.process(data);\n });\n\n // State watcher -> status bar\n this.stateWatcher.on('loading', () => {\n if (!this.inAltScreen) {\n this.statusBar.showLoading();\n }\n });\n\n this.stateWatcher.on('prediction', (event: PredictionEvent) => {\n this.currentPrediction = event;\n this.tabInterceptor.setPredictionActive(true);\n if (!this.inAltScreen) {\n this.statusBar.show(\n event.prediction,\n event.file_path,\n event.latency_ms\n );\n }\n });\n\n this.stateWatcher.start();\n\n // Handle terminal resize\n process.stdout.on('resize', () => {\n const newCols = process.stdout.columns || 80;\n const newRows = process.stdout.rows || 24;\n this.ptyProcess?.resize(newCols, newRows - 1);\n this.statusBar.resize(newRows, newCols);\n });\n\n // Handle PTY exit\n this.ptyProcess.onExit(({ exitCode }) => {\n this.cleanup();\n process.exit(exitCode);\n });\n\n // Handle signals\n const onSignal = () => {\n this.cleanup();\n process.exit(0);\n };\n process.on('SIGINT', onSignal);\n process.on('SIGTERM', onSignal);\n }\n\n private acceptPrediction(): void {\n if (!this.currentPrediction || !this.ptyProcess) return;\n\n // Write prediction to pending file for Claude to read\n const dir = join(HOME, '.stackmemory');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(\n PENDING_FILE,\n JSON.stringify(\n {\n file_path: this.currentPrediction.file_path,\n predicted_content: this.currentPrediction.prediction,\n timestamp: Date.now(),\n },\n null,\n 2\n )\n );\n\n // Inject acceptance prompt into PTY stdin.\n // SAFETY: PENDING_FILE is a constant path, not user-controlled.\n // The prompt is written to Claude Code's input, which interprets\n // it as a user message, not as a shell command.\n const prompt = `Apply the Sweep prediction from ${PENDING_FILE}\\n`;\n this.ptyProcess.write(prompt);\n\n this.dismissPrediction();\n }\n\n private dismissPrediction(): void {\n this.currentPrediction = null;\n this.tabInterceptor.setPredictionActive(false);\n this.statusBar.hide();\n }\n\n private cleanup(): void {\n this.stateWatcher.stop();\n this.statusBar.hide();\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n }\n\n private findClaude(): string {\n // Check PATH first via which\n try {\n const resolved = execSync('which claude', { encoding: 'utf-8' }).trim();\n if (resolved) return resolved;\n } catch {\n // Not on PATH\n }\n\n // Check known locations\n const candidates = [\n join(HOME, '.bun', 'bin', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n\n return 'claude';\n }\n}\n\n/**\n * Launch the PTY wrapper\n */\nexport async function launchWrapper(config?: PtyWrapperConfig): Promise<void> {\n const wrapper = new PtyWrapper(config);\n await wrapper.start();\n}\n"],
5
- "mappings": ";;;;AASA,SAAS,YAAY;AACrB,SAAS,eAAe,YAAY,iBAAiB;AACrD,SAAS,gBAAgB;AACzB,SAAS,yBAA+C;AACxD,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAE/B,MAAM,OAAO,QAAQ,IAAI,MAAM,KAAK;AACpC,MAAM,eAAe,KAAK,MAAM,gBAAgB,oBAAoB;AAGpE,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AAiBjB,MAAM,WAAW;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAA4C;AAAA,EAC5C,cAAc;AAAA,EACd,aAAgC;AAAA,EAExC,YAAY,SAA2B,CAAC,GAAG;AACzC,SAAK,SAAS;AAAA,MACZ,WAAW,OAAO,aAAa,KAAK,WAAW;AAAA,MAC/C,YAAY,OAAO,cAAc,CAAC;AAAA,MAClC,WACE,OAAO,aAAa,KAAK,MAAM,gBAAgB,kBAAkB;AAAA,IACrE;AAEA,SAAK,eAAe,IAAI,kBAAkB,KAAK,OAAO,SAAS;AAC/D,SAAK,YAAY,IAAI,UAAU;AAC/B,SAAK,iBAAiB,IAAI,eAAe;AAAA,MACvC,UAAU,MAAM,KAAK,iBAAiB;AAAA,MACtC,WAAW,MAAM,KAAK,kBAAkB;AAAA,MACxC,eAAe,CAAC,SAAS,KAAK,YAAY,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,IACxE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAE3B,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,OAAO,UAAU;AAAA,IAC/B,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAEA,UAAM,OAAO,QAAQ,OAAO,WAAW;AACvC,UAAM,OAAO,QAAQ,OAAO,QAAQ;AAGpC,UAAM,MAA8B,CAAC;AACrC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AAChD,UAAI,MAAM,OAAW,KAAI,CAAC,IAAI;AAAA,IAChC;AAGA,SAAK,aAAa,IAAI,MAAM,KAAK,OAAO,WAAW,KAAK,OAAO,YAAY;AAAA,MACzE,MAAM,QAAQ,IAAI,MAAM,KAAK;AAAA,MAC7B;AAAA,MACA,MAAM,OAAO;AAAA,MACb,KAAK,QAAQ,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AAGD,QAAI,QAAQ,MAAM,OAAO;AACvB,cAAQ,MAAM,WAAW,IAAI;AAAA,IAC/B;AACA,YAAQ,MAAM,OAAO;AAGrB,SAAK,WAAW,OAAO,CAAC,SAAiB;AAEvC,UAAI,KAAK,SAAS,gBAAgB,GAAG;AACnC,aAAK,cAAc;AACnB,aAAK,UAAU,KAAK;AAAA,MACtB;AACA,UAAI,KAAK,SAAS,eAAe,GAAG;AAClC,aAAK,cAAc;AAAA,MACrB;AAEA,cAAQ,OAAO,MAAM,IAAI;AAAA,IAC3B,CAAC;AAGD,YAAQ,MAAM,GAAG,QAAQ,CAAC,SAAiB;AACzC,WAAK,eAAe,QAAQ,IAAI;AAAA,IAClC,CAAC;AAGD,SAAK,aAAa,GAAG,WAAW,MAAM;AACpC,UAAI,CAAC,KAAK,aAAa;AACrB,aAAK,UAAU,YAAY;AAAA,MAC7B;AAAA,IACF,CAAC;AAED,SAAK,aAAa,GAAG,cAAc,CAAC,UAA2B;AAC7D,WAAK,oBAAoB;AACzB,WAAK,eAAe,oBAAoB,IAAI;AAC5C,UAAI,CAAC,KAAK,aAAa;AACrB,aAAK,UAAU;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,aAAa,MAAM;AAGxB,YAAQ,OAAO,GAAG,UAAU,MAAM;AAChC,YAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,YAAM,UAAU,QAAQ,OAAO,QAAQ;AACvC,WAAK,YAAY,OAAO,SAAS,UAAU,CAAC;AAC5C,WAAK,UAAU,OAAO,SAAS,OAAO;AAAA,IACxC,CAAC;AAGD,SAAK,WAAW,OAAO,CAAC,EAAE,SAAS,MAAM;AACvC,WAAK,QAAQ;AACb,cAAQ,KAAK,QAAQ;AAAA,IACvB,CAAC;AAGD,UAAM,WAAW,MAAM;AACrB,WAAK,QAAQ;AACb,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAAA,EAChC;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,WAAY;AAGjD,UAAM,MAAM,KAAK,MAAM,cAAc;AACrC,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,gBAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AACA;AAAA,MACE;AAAA,MACA,KAAK;AAAA,QACH;AAAA,UACE,WAAW,KAAK,kBAAkB;AAAA,UAClC,mBAAmB,KAAK,kBAAkB;AAAA,UAC1C,WAAW,KAAK,IAAI;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAMA,UAAM,SAAS,mCAAmC,YAAY;AAAA;AAC9D,SAAK,WAAW,MAAM,MAAM;AAE5B,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,oBAA0B;AAChC,SAAK,oBAAoB;AACzB,SAAK,eAAe,oBAAoB,KAAK;AAC7C,SAAK,UAAU,KAAK;AAAA,EACtB;AAAA,EAEQ,UAAgB;AACtB,SAAK,aAAa,KAAK;AACvB,SAAK,UAAU,KAAK;AAEpB,QAAI,QAAQ,MAAM,OAAO;AACvB,cAAQ,MAAM,WAAW,KAAK;AAAA,IAChC;AACA,YAAQ,MAAM,MAAM;AAAA,EACtB;AAAA,EAEQ,aAAqB;AAE3B,QAAI;AACF,YAAM,WAAW,SAAS,gBAAgB,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AACtE,UAAI,SAAU,QAAO;AAAA,IACvB,QAAQ;AAAA,IAER;AAGA,UAAM,aAAa;AAAA,MACjB,KAAK,MAAM,QAAQ,OAAO,QAAQ;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAEA,eAAW,KAAK,YAAY;AAC1B,UAAI,WAAW,CAAC,EAAG,QAAO;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,cAAc,QAA0C;AAC5E,QAAM,UAAU,IAAI,WAAW,MAAM;AACrC,QAAM,QAAQ,MAAM;AACtB;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/state-watcher.ts"],
4
- "sourcesContent": ["/**\n * Sweep State Watcher\n *\n * Watches sweep-state.json for new predictions via fs.watch.\n * Emits events when predictions arrive or loading begins.\n */\n\nimport { EventEmitter } from 'events';\nimport { watch, readFileSync, existsSync, type FSWatcher } from 'fs';\nimport { join } from 'path';\n\nconst HOME = process.env['HOME'] || '/tmp';\nconst DEFAULT_STATE_FILE = join(HOME, '.stackmemory', 'sweep-state.json');\n\nexport interface PredictionEvent {\n file_path: string;\n prediction: string;\n latency_ms: number;\n timestamp: number;\n}\n\ninterface SweepState {\n recentDiffs: Array<{\n file_path: string;\n original: string;\n updated: string;\n timestamp: number;\n }>;\n lastPrediction: {\n file_path: string;\n prediction: string;\n latency_ms: number;\n timestamp: number;\n } | null;\n pendingPrediction: number | null;\n fileContents: Record<string, unknown>;\n}\n\nexport class SweepStateWatcher extends EventEmitter {\n private stateFile: string;\n private lastPredictionTs = 0;\n private lastPendingTs = 0;\n private watcher: FSWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(stateFile?: string) {\n super();\n this.stateFile = stateFile || DEFAULT_STATE_FILE;\n }\n\n start(): void {\n if (this.watcher) return;\n\n if (!existsSync(this.stateFile)) {\n // Poll until file appears\n this.pollTimer = setInterval(() => {\n if (existsSync(this.stateFile)) {\n clearInterval(this.pollTimer!);\n this.pollTimer = null;\n this.startWatching();\n }\n }, 1000);\n return;\n }\n\n this.startWatching();\n }\n\n private startWatching(): void {\n // Read initial state\n this.readState();\n\n this.watcher = watch(this.stateFile, () => {\n // Debounce rapid writes\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => this.readState(), 100);\n });\n\n this.watcher.on('error', () => {\n // File may have been deleted, try to re-watch\n this.watcher?.close();\n this.watcher = null;\n setTimeout(() => this.start(), 1000);\n });\n }\n\n private readState(): void {\n try {\n if (!existsSync(this.stateFile)) return;\n\n const raw = readFileSync(this.stateFile, 'utf-8');\n const state: SweepState = JSON.parse(raw);\n\n // Check for new pending prediction (loading state)\n if (\n state.pendingPrediction &&\n state.pendingPrediction !== this.lastPendingTs\n ) {\n this.lastPendingTs = state.pendingPrediction;\n this.emit('loading');\n }\n\n // Check for new completed prediction\n if (\n state.lastPrediction &&\n state.lastPrediction.timestamp > this.lastPredictionTs\n ) {\n this.lastPredictionTs = state.lastPrediction.timestamp;\n const event: PredictionEvent = {\n file_path: state.lastPrediction.file_path,\n prediction: state.lastPrediction.prediction,\n latency_ms: state.lastPrediction.latency_ms,\n timestamp: state.lastPrediction.timestamp,\n };\n this.emit('prediction', event);\n }\n } catch {\n // Ignore parse errors from partial writes\n }\n }\n\n stop(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n }\n}\n"],
5
- "mappings": ";;;;AAOA,SAAS,oBAAoB;AAC7B,SAAS,OAAO,cAAc,kBAAkC;AAChE,SAAS,YAAY;AAErB,MAAM,OAAO,QAAQ,IAAI,MAAM,KAAK;AACpC,MAAM,qBAAqB,KAAK,MAAM,gBAAgB,kBAAkB;AA0BjE,MAAM,0BAA0B,aAAa;AAAA,EAC1C;AAAA,EACA,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,UAA4B;AAAA,EAC5B,gBAAsD;AAAA,EACtD,YAAmD;AAAA,EAE3D,YAAY,WAAoB;AAC9B,UAAM;AACN,SAAK,YAAY,aAAa;AAAA,EAChC;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,QAAS;AAElB,QAAI,CAAC,WAAW,KAAK,SAAS,GAAG;AAE/B,WAAK,YAAY,YAAY,MAAM;AACjC,YAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,wBAAc,KAAK,SAAU;AAC7B,eAAK,YAAY;AACjB,eAAK,cAAc;AAAA,QACrB;AAAA,MACF,GAAG,GAAI;AACP;AAAA,IACF;AAEA,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAsB;AAE5B,SAAK,UAAU;AAEf,SAAK,UAAU,MAAM,KAAK,WAAW,MAAM;AAEzC,UAAI,KAAK,cAAe,cAAa,KAAK,aAAa;AACvD,WAAK,gBAAgB,WAAW,MAAM,KAAK,UAAU,GAAG,GAAG;AAAA,IAC7D,CAAC;AAED,SAAK,QAAQ,GAAG,SAAS,MAAM;AAE7B,WAAK,SAAS,MAAM;AACpB,WAAK,UAAU;AACf,iBAAW,MAAM,KAAK,MAAM,GAAG,GAAI;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEQ,YAAkB;AACxB,QAAI;AACF,UAAI,CAAC,WAAW,KAAK,SAAS,EAAG;AAEjC,YAAM,MAAM,aAAa,KAAK,WAAW,OAAO;AAChD,YAAM,QAAoB,KAAK,MAAM,GAAG;AAGxC,UACE,MAAM,qBACN,MAAM,sBAAsB,KAAK,eACjC;AACA,aAAK,gBAAgB,MAAM;AAC3B,aAAK,KAAK,SAAS;AAAA,MACrB;AAGA,UACE,MAAM,kBACN,MAAM,eAAe,YAAY,KAAK,kBACtC;AACA,aAAK,mBAAmB,MAAM,eAAe;AAC7C,cAAM,QAAyB;AAAA,UAC7B,WAAW,MAAM,eAAe;AAAA,UAChC,YAAY,MAAM,eAAe;AAAA,UACjC,YAAY,MAAM,eAAe;AAAA,UACjC,WAAW,MAAM,eAAe;AAAA,QAClC;AACA,aAAK,KAAK,cAAc,KAAK;AAAA,MAC/B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,KAAK,eAAe;AACtB,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AACA,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,MAAM;AACnB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/status-bar.ts"],
4
- "sourcesContent": ["/**\n * Sweep Status Bar\n *\n * Renders a 1-row prediction status bar at the bottom of the terminal\n * using ANSI escape sequences. Preserves cursor position.\n */\n\nimport { basename } from 'path';\n\n// ANSI escape sequences\nconst ESC = '\\x1b';\nconst SAVE_CURSOR = `${ESC}7`;\nconst RESTORE_CURSOR = `${ESC}8`;\nconst CLEAR_LINE = `${ESC}[2K`;\nconst RESET = `${ESC}[0m`;\nconst BG_DARK = `${ESC}[48;5;236m`; // dark gray bg\nconst FG_GRAY = `${ESC}[38;5;244m`; // gray text\nconst FG_CYAN = `${ESC}[38;5;37m`; // cyan for label\nconst FG_DIM = `${ESC}[2m`; // dim\nconst BOLD = `${ESC}[1m`;\n\nfunction moveTo(row: number, col: number): string {\n return `${ESC}[${row};${col}H`;\n}\n\nexport class StatusBar {\n private rows: number;\n private cols: number;\n private visible = false;\n private currentPrediction = '';\n private currentFile = '';\n\n constructor() {\n this.rows = process.stdout.rows || 24;\n this.cols = process.stdout.columns || 80;\n }\n\n show(prediction: string, filePath: string, latencyMs: number): void {\n this.currentPrediction = prediction;\n this.currentFile = filePath;\n this.visible = true;\n\n const file = basename(filePath);\n const preview = this.truncatePreview(prediction);\n const latency = `${latencyMs}ms`;\n\n // Build status bar content\n const label = `${FG_CYAN}${BOLD}[Sweep]${RESET}${BG_DARK}`;\n const fileInfo = `${FG_GRAY} ${file}${RESET}${BG_DARK}`;\n const content = `${FG_GRAY} ${preview}${RESET}${BG_DARK}`;\n const time = `${FG_DIM}${BG_DARK} ${latency}${RESET}${BG_DARK}`;\n const keys = `${BOLD}${BG_DARK} [Tab]${RESET}${BG_DARK}${FG_GRAY} Accept ${BOLD}${BG_DARK}[Esc]${RESET}${BG_DARK}${FG_GRAY} Dismiss${RESET}`;\n\n const bar = `${BG_DARK}${label}${fileInfo}${content}${time}${keys}${RESET}`;\n\n this.render(bar);\n }\n\n showLoading(): void {\n this.visible = true;\n const bar = `${BG_DARK}${FG_CYAN}${BOLD}[Sweep]${RESET}${BG_DARK}${FG_GRAY} Predicting next edit...${RESET}`;\n this.render(bar);\n }\n\n hide(): void {\n if (!this.visible) return;\n this.visible = false;\n this.currentPrediction = '';\n this.currentFile = '';\n\n const output =\n SAVE_CURSOR + moveTo(this.rows, 1) + CLEAR_LINE + RESTORE_CURSOR;\n\n process.stdout.write(output);\n }\n\n resize(rows: number, cols: number): void {\n this.rows = rows;\n this.cols = cols;\n if (this.visible && this.currentPrediction) {\n this.show(this.currentPrediction, this.currentFile, 0);\n }\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n private render(content: string): void {\n if (!process.stdout.isTTY) return;\n\n const output =\n SAVE_CURSOR +\n moveTo(this.rows, 1) +\n CLEAR_LINE +\n content +\n RESTORE_CURSOR;\n\n process.stdout.write(output);\n }\n\n private truncatePreview(prediction: string): string {\n // Take first non-empty line\n const lines = prediction.trim().split('\\n');\n let preview = lines[0] || '';\n\n // Max preview length: cols minus label/keys overhead (~50 chars)\n const maxLen = Math.max(10, this.cols - 55);\n if (preview.length > maxLen) {\n preview = preview.slice(0, maxLen - 3) + '...';\n }\n\n // Indicate more lines\n if (lines.length > 1) {\n preview += ` (+${lines.length - 1} lines)`;\n }\n\n return preview;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/sweep-server-manager.ts"],
4
- "sourcesContent": ["/**\n * Sweep Server Manager\n *\n * Manages the llama-server process for Sweep predictions.\n */\n\nimport { spawn, ChildProcess, execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport {\n SweepServerConfig,\n SweepServerStatus,\n DEFAULT_SERVER_CONFIG,\n} from './types.js';\nimport { createPredictionClient } from './prediction-client.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nconst HOME = process.env['HOME'] || '/tmp';\nconst PID_FILE = join(HOME, '.stackmemory', 'sweep', 'server.pid');\nconst LOG_FILE = join(HOME, '.stackmemory', 'sweep', 'server.log');\n\nexport class SweepServerManager {\n private config: SweepServerConfig;\n private process: ChildProcess | null = null;\n\n constructor(config: Partial<SweepServerConfig> = {}) {\n this.config = { ...DEFAULT_SERVER_CONFIG, ...config };\n\n // Set default model path if not provided\n if (!this.config.modelPath) {\n this.config.modelPath = join(\n HOME,\n '.stackmemory',\n 'models',\n 'sweep',\n 'sweep-next-edit-1.5b.q8_0.v2.gguf'\n );\n }\n }\n\n /**\n * Find llama-server executable\n */\n private findLlamaServer(): string | null {\n const candidates = [\n 'llama-server',\n 'llama.cpp/llama-server',\n '/usr/local/bin/llama-server',\n '/opt/homebrew/bin/llama-server',\n join(HOME, '.local', 'bin', 'llama-server'),\n ];\n\n for (const cmd of candidates) {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return cmd;\n } catch {\n if (existsSync(cmd)) {\n return cmd;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Start the llama-server\n */\n async startServer(): Promise<SweepServerStatus> {\n // Check if already running\n const status = await this.getStatus();\n if (status.running) {\n return status;\n }\n\n // Check model exists\n if (!existsSync(this.config.modelPath)) {\n throw new Error(\n `Model not found: ${this.config.modelPath}\\n` +\n 'Download with: huggingface-cli download sweepai/sweep-next-edit-1.5B sweep-next-edit-1.5b.q8_0.v2.gguf --local-dir ~/.stackmemory/models/sweep'\n );\n }\n\n // Find llama-server\n const llamaServer = this.findLlamaServer();\n if (!llamaServer) {\n throw new Error(\n 'llama-server not found. Install with:\\n' +\n ' brew install llama.cpp\\n' +\n 'or build from source: https://github.com/ggerganov/llama.cpp'\n );\n }\n\n // Ensure log directory exists\n const logDir = dirname(LOG_FILE);\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n // Build command args\n const args = [\n '-m',\n this.config.modelPath,\n '--port',\n String(this.config.port),\n '--host',\n this.config.host,\n '-c',\n String(this.config.contextSize),\n ];\n\n if (this.config.threads) {\n args.push('-t', String(this.config.threads));\n }\n\n if (this.config.gpuLayers && this.config.gpuLayers > 0) {\n args.push('-ngl', String(this.config.gpuLayers));\n }\n\n logger.info('Starting Sweep server', { llamaServer, args });\n\n // Start the process\n this.process = spawn(llamaServer, args, {\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Write PID file\n if (this.process.pid) {\n const pidDir = dirname(PID_FILE);\n if (!existsSync(pidDir)) {\n mkdirSync(pidDir, { recursive: true });\n }\n writeFileSync(\n PID_FILE,\n JSON.stringify({\n pid: this.process.pid,\n port: this.config.port,\n host: this.config.host,\n modelPath: this.config.modelPath,\n startedAt: Date.now(),\n })\n );\n }\n\n // Unref to allow parent to exit\n this.process.unref();\n\n // Wait for server to be ready\n const ready = await this.waitForReady(10000);\n if (!ready) {\n await this.stopServer();\n throw new Error('Server failed to start within timeout');\n }\n\n return this.getStatus();\n }\n\n /**\n * Wait for server to be ready\n */\n private async waitForReady(timeoutMs: number): Promise<boolean> {\n const client = createPredictionClient({\n port: this.config.port,\n host: this.config.host,\n });\n\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n if (await client.checkHealth()) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n\n return false;\n }\n\n /**\n * Stop the server\n */\n async stopServer(): Promise<void> {\n const status = await this.getStatus();\n\n if (!status.running || !status.pid) {\n return;\n }\n\n try {\n process.kill(status.pid, 'SIGTERM');\n\n // Wait for process to exit\n await new Promise<void>((resolve) => {\n const checkInterval = setInterval(() => {\n try {\n process.kill(status.pid!, 0); // Check if still running\n } catch {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n\n // Force kill after 5 seconds\n setTimeout(() => {\n clearInterval(checkInterval);\n try {\n process.kill(status.pid!, 'SIGKILL');\n } catch {\n // Already dead\n }\n resolve();\n }, 5000);\n });\n } catch (error) {\n // Process may already be dead\n logger.warn('Error stopping server', { error });\n }\n\n // Clean up PID file\n try {\n if (existsSync(PID_FILE)) {\n const { unlinkSync } = await import('fs');\n unlinkSync(PID_FILE);\n }\n } catch {\n // Ignore\n }\n }\n\n /**\n * Get server status\n */\n async getStatus(): Promise<SweepServerStatus> {\n // Check PID file\n if (!existsSync(PID_FILE)) {\n return { running: false };\n }\n\n try {\n const data = JSON.parse(readFileSync(PID_FILE, 'utf-8'));\n const { pid, port, host, modelPath, startedAt } = data;\n\n // Check if process is still running\n try {\n process.kill(pid, 0);\n } catch {\n // Process not running\n return { running: false };\n }\n\n // Verify server is responsive\n const client = createPredictionClient({ port, host });\n const healthy = await client.checkHealth();\n\n return {\n running: healthy,\n pid,\n port,\n host,\n modelPath,\n startedAt,\n };\n } catch {\n return { running: false };\n }\n }\n\n /**\n * Check server health\n */\n async checkHealth(): Promise<boolean> {\n const client = createPredictionClient({\n port: this.config.port,\n host: this.config.host,\n });\n return client.checkHealth();\n }\n}\n\n/**\n * Create a server manager with default config\n */\nexport function createServerManager(\n config?: Partial<SweepServerConfig>\n): SweepServerManager {\n return new SweepServerManager(config);\n}\n"],
5
- "mappings": ";;;;AAMA,SAAS,OAAqB,gBAAgB;AAC9C,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,MAAM,eAAe;AAC9B;AAAA,EAGE;AAAA,OACK;AACP,SAAS,8BAA8B;AACvC,SAAS,cAAc;AAEvB,MAAM,OAAO,QAAQ,IAAI,MAAM,KAAK;AACpC,MAAM,WAAW,KAAK,MAAM,gBAAgB,SAAS,YAAY;AACjE,MAAM,WAAW,KAAK,MAAM,gBAAgB,SAAS,YAAY;AAE1D,MAAM,mBAAmB;AAAA,EACtB;AAAA,EACA,UAA+B;AAAA,EAEvC,YAAY,SAAqC,CAAC,GAAG;AACnD,SAAK,SAAS,EAAE,GAAG,uBAAuB,GAAG,OAAO;AAGpD,QAAI,CAAC,KAAK,OAAO,WAAW;AAC1B,WAAK,OAAO,YAAY;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAiC;AACvC,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,MAAM,UAAU,OAAO,cAAc;AAAA,IAC5C;AAEA,eAAW,OAAO,YAAY;AAC5B,UAAI;AACF,iBAAS,SAAS,GAAG,IAAI,EAAE,OAAO,SAAS,CAAC;AAC5C,eAAO;AAAA,MACT,QAAQ;AACN,YAAI,WAAW,GAAG,GAAG;AACnB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAA0C;AAE9C,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,WAAW,KAAK,OAAO,SAAS,GAAG;AACtC,YAAM,IAAI;AAAA,QACR,oBAAoB,KAAK,OAAO,SAAS;AAAA;AAAA,MAE3C;AAAA,IACF;AAGA,UAAM,cAAc,KAAK,gBAAgB;AACzC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,MAGF;AAAA,IACF;AAGA,UAAM,SAAS,QAAQ,QAAQ;AAC/B,QAAI,CAAC,WAAW,MAAM,GAAG;AACvB,gBAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC;AAGA,UAAM,OAAO;AAAA,MACX;AAAA,MACA,KAAK,OAAO;AAAA,MACZ;AAAA,MACA,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB;AAAA,MACA,KAAK,OAAO;AAAA,MACZ;AAAA,MACA,OAAO,KAAK,OAAO,WAAW;AAAA,IAChC;AAEA,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,KAAK,MAAM,OAAO,KAAK,OAAO,OAAO,CAAC;AAAA,IAC7C;AAEA,QAAI,KAAK,OAAO,aAAa,KAAK,OAAO,YAAY,GAAG;AACtD,WAAK,KAAK,QAAQ,OAAO,KAAK,OAAO,SAAS,CAAC;AAAA,IACjD;AAEA,WAAO,KAAK,yBAAyB,EAAE,aAAa,KAAK,CAAC;AAG1D,SAAK,UAAU,MAAM,aAAa,MAAM;AAAA,MACtC,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AAGD,QAAI,KAAK,QAAQ,KAAK;AACpB,YAAM,SAAS,QAAQ,QAAQ;AAC/B,UAAI,CAAC,WAAW,MAAM,GAAG;AACvB,kBAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,MACvC;AACA;AAAA,QACE;AAAA,QACA,KAAK,UAAU;AAAA,UACb,KAAK,KAAK,QAAQ;AAAA,UAClB,MAAM,KAAK,OAAO;AAAA,UAClB,MAAM,KAAK,OAAO;AAAA,UAClB,WAAW,KAAK,OAAO;AAAA,UACvB,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,SAAK,QAAQ,MAAM;AAGnB,UAAM,QAAQ,MAAM,KAAK,aAAa,GAAK;AAC3C,QAAI,CAAC,OAAO;AACV,YAAM,KAAK,WAAW;AACtB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,WAAqC;AAC9D,UAAM,SAAS,uBAAuB;AAAA,MACpC,MAAM,KAAK,OAAO;AAAA,MAClB,MAAM,KAAK,OAAO;AAAA,IACpB,CAAC;AAED,UAAM,YAAY,KAAK,IAAI;AAC3B,WAAO,KAAK,IAAI,IAAI,YAAY,WAAW;AACzC,UAAI,MAAM,OAAO,YAAY,GAAG;AAC9B,eAAO;AAAA,MACT;AACA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,SAAS,MAAM,KAAK,UAAU;AAEpC,QAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAAK;AAClC;AAAA,IACF;AAEA,QAAI;AACF,cAAQ,KAAK,OAAO,KAAK,SAAS;AAGlC,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,cAAM,gBAAgB,YAAY,MAAM;AACtC,cAAI;AACF,oBAAQ,KAAK,OAAO,KAAM,CAAC;AAAA,UAC7B,QAAQ;AACN,0BAAc,aAAa;AAC3B,oBAAQ;AAAA,UACV;AAAA,QACF,GAAG,GAAG;AAGN,mBAAW,MAAM;AACf,wBAAc,aAAa;AAC3B,cAAI;AACF,oBAAQ,KAAK,OAAO,KAAM,SAAS;AAAA,UACrC,QAAQ;AAAA,UAER;AACA,kBAAQ;AAAA,QACV,GAAG,GAAI;AAAA,MACT,CAAC;AAAA,IACH,SAAS,OAAO;AAEd,aAAO,KAAK,yBAAyB,EAAE,MAAM,CAAC;AAAA,IAChD;AAGA,QAAI;AACF,UAAI,WAAW,QAAQ,GAAG;AACxB,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,IAAI;AACxC,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAwC;AAE5C,QAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAEA,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC;AACvD,YAAM,EAAE,KAAK,MAAM,MAAM,WAAW,UAAU,IAAI;AAGlD,UAAI;AACF,gBAAQ,KAAK,KAAK,CAAC;AAAA,MACrB,QAAQ;AAEN,eAAO,EAAE,SAAS,MAAM;AAAA,MAC1B;AAGA,YAAM,SAAS,uBAAuB,EAAE,MAAM,KAAK,CAAC;AACpD,YAAM,UAAU,MAAM,OAAO,YAAY;AAEzC,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAgC;AACpC,UAAM,SAAS,uBAAuB;AAAA,MACpC,MAAM,KAAK,OAAO;AAAA,MAClB,MAAM,KAAK,OAAO;AAAA,IACpB,CAAC;AACD,WAAO,OAAO,YAAY;AAAA,EAC5B;AACF;AAKO,SAAS,oBACd,QACoB;AACpB,SAAO,IAAI,mBAAmB,MAAM;AACtC;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/tab-interceptor.ts"],
4
- "sourcesContent": ["/**\n * Tab Interceptor\n *\n * Intercepts Tab and Esc keystrokes when a Sweep prediction is active.\n * All other input passes through to the PTY child unchanged.\n */\n\nconst TAB = 0x09;\nconst ESC = 0x1b;\n\nexport interface TabInterceptorCallbacks {\n onAccept: () => void;\n onDismiss: () => void;\n onPassthrough: (data: Buffer) => void;\n}\n\nexport class TabInterceptor {\n private predictionActive = false;\n private callbacks: TabInterceptorCallbacks;\n\n constructor(callbacks: TabInterceptorCallbacks) {\n this.callbacks = callbacks;\n }\n\n setPredictionActive(active: boolean): void {\n this.predictionActive = active;\n }\n\n isPredictionActive(): boolean {\n return this.predictionActive;\n }\n\n process(data: Buffer): void {\n if (!this.predictionActive) {\n this.callbacks.onPassthrough(data);\n return;\n }\n\n // Tab key: accept prediction\n if (data.length === 1 && data[0] === TAB) {\n this.callbacks.onAccept();\n return;\n }\n\n // Bare Escape: dismiss prediction\n // Distinguish from escape sequences (arrow keys, etc.) by length.\n // Bare Esc is a single byte; escape sequences are multi-byte.\n if (data.length === 1 && data[0] === ESC) {\n this.callbacks.onDismiss();\n return;\n }\n\n // Everything else passes through (including escape sequences)\n this.callbacks.onPassthrough(data);\n }\n}\n"],
5
- "mappings": ";;;;AAOA,MAAM,MAAM;AACZ,MAAM,MAAM;AAQL,MAAM,eAAe;AAAA,EAClB,mBAAmB;AAAA,EACnB;AAAA,EAER,YAAY,WAAoC;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,oBAAoB,QAAuB;AACzC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,qBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,MAAoB;AAC1B,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,UAAU,cAAc,IAAI;AACjC;AAAA,IACF;AAGA,QAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,KAAK;AACxC,WAAK,UAAU,SAAS;AACxB;AAAA,IACF;AAKA,QAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,KAAK;AACxC,WAAK,UAAU,UAAU;AACzB;AAAA,IACF;AAGA,SAAK,UAAU,cAAc,IAAI;AAAA,EACnC;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/sweep/types.ts"],
4
- "sourcesContent": ["/**\n * Sweep Next-Edit Types\n *\n * Types for the Sweep 1.5B model server integration.\n */\n\nexport interface SweepServerConfig {\n port: number;\n host: string;\n modelPath: string;\n contextSize: number;\n threads?: number;\n gpuLayers?: number;\n}\n\nexport interface SweepServerStatus {\n running: boolean;\n pid?: number;\n port?: number;\n host?: string;\n startedAt?: number;\n modelPath?: string;\n}\n\nexport interface SweepPredictInput {\n file_path: string;\n current_content: string;\n original_content?: string;\n context_files?: Record<string, string>;\n recent_diffs?: DiffEntry[];\n max_tokens?: number;\n temperature?: number;\n top_k?: number;\n}\n\nexport interface DiffEntry {\n file_path: string;\n original: string;\n updated: string;\n timestamp?: number;\n}\n\nexport interface SweepPredictResult {\n success: boolean;\n predicted_content?: string;\n file_path?: string;\n latency_ms?: number;\n tokens_generated?: number;\n error?: string;\n message?: string;\n}\n\nexport interface SweepPromptInput {\n filePath: string;\n originalContent: string;\n currentContent: string;\n recentDiffs: DiffEntry[];\n contextFiles?: Record<string, string>;\n}\n\nexport interface CompletionRequest {\n model: string;\n prompt: string;\n max_tokens: number;\n temperature: number;\n top_k?: number;\n stop?: string[];\n stream?: boolean;\n}\n\nexport interface CompletionResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n text: string;\n index: number;\n logprobs: null;\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\nexport const DEFAULT_SERVER_CONFIG: SweepServerConfig = {\n port: 8766,\n host: '127.0.0.1',\n modelPath: '',\n contextSize: 8192,\n threads: undefined,\n gpuLayers: 0,\n};\n\nexport const SWEEP_STOP_TOKENS = ['<|file_sep|>', '</s>'];\n"],
5
- "mappings": ";;;;AAwFO,MAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AACb;AAEO,MAAM,oBAAoB,CAAC,gBAAgB,MAAM;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/features/tasks/linear-task-manager.ts"],
4
- "sourcesContent": ["/**\n * Linear Task Manager\n * In-memory task storage with Linear synchronization\n * Replaces LinearTaskManager system\n */\n\nimport { EventEmitter } from 'events';\nimport { logger } from '../../core/monitoring/logger.js';\nimport {\n Task,\n TaskStatus,\n TaskPriority,\n TaskMetadata,\n} from '../../types/task.js';\nimport { LinearClient, LinearIssue } from '../../integrations/linear/client.js';\nimport { ProjectIsolationManager } from '../../core/projects/project-isolation.js';\n\nexport interface LinearTaskManagerConfig {\n linearApiKey?: string;\n teamId?: string;\n projectFilter?: string; // Filter tasks by project name/org\n autoSync?: boolean;\n syncInterval?: number; // minutes\n batchSize?: number; // Number of tasks to sync per batch (rate limiting)\n rateLimitDelay?: number; // Delay between API calls in ms\n}\n\nexport interface TaskMetrics {\n total_tasks: number;\n by_status: Record<TaskStatus, number>;\n by_priority: Record<TaskPriority, number>;\n completion_rate: number;\n avg_effort_accuracy: number;\n blocked_tasks: number;\n overdue_tasks: number;\n}\n\nexport class LinearTaskManager extends EventEmitter {\n private tasks: Map<string, Task> = new Map();\n private linearClient?: LinearClient;\n private config: LinearTaskManagerConfig;\n private projectId?: string;\n private syncTimer?: NodeJS.Timeout;\n private isolationManager: ProjectIsolationManager;\n private lastSyncTimestamp: number = 0;\n private syncInProgress: boolean = false;\n\n constructor(\n config: LinearTaskManagerConfig = {},\n projectId?: string,\n projectRoot?: string\n ) {\n super();\n this.config = config;\n this.projectId = projectId;\n this.isolationManager = ProjectIsolationManager.getInstance();\n\n // Get project-specific configuration if projectRoot is provided\n if (projectRoot) {\n const projectInfo =\n this.isolationManager.getProjectIdentification(projectRoot);\n this.projectId = projectInfo.projectId;\n\n // Override config with project-specific settings\n this.config = {\n ...config,\n teamId: config.teamId || projectInfo.linearTeamId,\n projectFilter: config.projectFilter || projectInfo.workspaceFilter,\n batchSize: config.batchSize || 5, // Conservative batch size for rate limiting\n rateLimitDelay: config.rateLimitDelay || 1000, // 1 second between calls\n };\n }\n\n // Initialize Linear client if API key is provided\n if (config.linearApiKey) {\n this.linearClient = new LinearClient({\n apiKey: config.linearApiKey,\n teamId: this.config.teamId,\n });\n }\n\n // Setup auto-sync if enabled\n if (config.autoSync && config.syncInterval && this.linearClient) {\n this.setupAutoSync();\n }\n }\n\n /**\n * Create a new task\n */\n createTask(options: {\n title: string;\n description?: string;\n priority?: TaskPriority;\n tags?: string[];\n metadata?: TaskMetadata;\n }): string {\n const id = this.generateTaskId();\n const now = new Date();\n\n const task: Task = {\n id,\n title: options.title,\n description: options.description || '',\n status: 'todo',\n priority: options.priority || 'medium',\n tags: [...(options.tags || []), ...this.getProjectTags()],\n metadata: {\n ...options.metadata,\n projectId: this.projectId,\n teamId: this.config.teamId,\n projectFilter: this.config.projectFilter,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n this.tasks.set(id, task);\n this.emit('task:created', task);\n this.emit('sync:needed', 'task:created');\n\n return id;\n }\n\n /**\n * Update task status\n */\n updateTaskStatus(\n taskId: string,\n newStatus: TaskStatus,\n _reason?: string\n ): void {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n\n task.status = newStatus;\n task.updatedAt = new Date();\n\n this.tasks.set(taskId, task);\n\n if (newStatus === 'done') {\n this.emit('task:completed', task);\n }\n\n this.emit('task:updated', task);\n this.emit('sync:needed', 'task:updated');\n }\n\n /**\n * Get task by ID\n */\n getTask(taskId: string): Task | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * Get all active tasks (not done/cancelled)\n */\n getActiveTasks(): Task[] {\n return Array.from(this.tasks.values())\n .filter((task) => !['done', 'cancelled'].includes(task.status))\n .sort((a, b) => {\n // Sort by priority then by creation date\n const priorityOrder = { urgent: 4, high: 3, medium: 2, low: 1 };\n const aPriority = priorityOrder[a.priority || 'medium'];\n const bPriority = priorityOrder[b.priority || 'medium'];\n\n if (aPriority !== bPriority) {\n return bPriority - aPriority; // Higher priority first\n }\n\n return a.createdAt.getTime() - b.createdAt.getTime(); // Older first\n });\n }\n\n /**\n * Get tasks by status\n */\n getTasksByStatus(status: TaskStatus): Task[] {\n return Array.from(this.tasks.values()).filter(\n (task) => task.status === status\n );\n }\n\n /**\n * Get metrics for tasks\n */\n getMetrics(): TaskMetrics {\n const allTasks = Array.from(this.tasks.values());\n const totalTasks = allTasks.length;\n\n const byStatus: Record<TaskStatus, number> = {\n todo: 0,\n in_progress: 0,\n done: 0,\n cancelled: 0,\n };\n\n const byPriority: Record<TaskPriority, number> = {\n low: 0,\n medium: 0,\n high: 0,\n urgent: 0,\n };\n\n for (const task of allTasks) {\n byStatus[task.status]++;\n if (task.priority) {\n byPriority[task.priority]++;\n }\n }\n\n const completedTasks = byStatus.done;\n const completionRate = totalTasks > 0 ? completedTasks / totalTasks : 0;\n\n return {\n total_tasks: totalTasks,\n by_status: byStatus,\n by_priority: byPriority,\n completion_rate: completionRate,\n avg_effort_accuracy: 0, // Not implemented in this simplified version\n blocked_tasks: 0, // Could be implemented with tags or metadata\n overdue_tasks: 0, // Could be implemented with due dates\n };\n }\n\n /**\n * Sync with Linear workspace (incremental with rate limiting and exponential backoff)\n */\n async syncWithLinear(): Promise<{ synced: number; errors: string[] }> {\n if (!this.linearClient) {\n throw new Error('Linear client not initialized');\n }\n\n if (this.syncInProgress) {\n logger.warn('Sync already in progress, skipping');\n return { synced: 0, errors: ['Sync already in progress'] };\n }\n\n this.syncInProgress = true;\n const errors: string[] = [];\n let synced = 0;\n\n try {\n // Get tasks that need syncing (created/updated since last sync)\n const tasksToSync = this.getTasksRequiringSync();\n const batchSize = this.config.batchSize || 5;\n const rateLimitDelay = this.config.rateLimitDelay || 1000;\n\n logger.info(\n `Starting incremental sync: ${tasksToSync.length} tasks to process`\n );\n\n // Process tasks in batches to respect rate limits\n for (let i = 0; i < tasksToSync.length; i += batchSize) {\n const batch = tasksToSync.slice(i, i + batchSize);\n\n for (const task of batch) {\n try {\n await this.withExponentialBackoff(\n async () => {\n if (!task.externalId) {\n // Create new issue in Linear\n const linearIssue = await this.createLinearIssue(task);\n task.externalId = linearIssue.id;\n task.externalIdentifier = linearIssue.identifier;\n task.externalUrl = linearIssue.url;\n task.updatedAt = new Date();\n\n logger.debug(\n `Created Linear issue: ${linearIssue.identifier} for task ${task.id}`\n );\n } else {\n // Update existing issue if needed\n await this.updateLinearIssue(task);\n\n logger.debug(\n `Updated Linear issue: ${task.externalIdentifier} for task ${task.id}`\n );\n }\n },\n 3,\n rateLimitDelay\n );\n\n synced++;\n\n // Base rate limiting delay between API calls\n if (rateLimitDelay > 0) {\n await this.sleep(rateLimitDelay);\n }\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error);\n errors.push(`Failed to sync task ${task.id}: ${errorMsg}`);\n logger.error('Failed to sync task to Linear after retries', {\n taskId: task.id,\n error: errorMsg,\n projectId: this.projectId,\n });\n }\n }\n\n // Batch delay (longer between batches)\n if (i + batchSize < tasksToSync.length && rateLimitDelay > 0) {\n await this.sleep(rateLimitDelay * 2);\n }\n }\n\n this.lastSyncTimestamp = Date.now();\n this.emit('sync:completed', {\n synced,\n errors,\n projectId: this.projectId,\n });\n\n logger.info(\n `Linear sync completed: ${synced} tasks synced, ${errors.length} errors`\n );\n return { synced, errors };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n errors.push(`Sync failed: ${errorMsg}`);\n logger.error('Linear sync failed', {\n error: errorMsg,\n projectId: this.projectId,\n });\n throw new Error(`Linear sync failed: ${errorMsg}`);\n } finally {\n this.syncInProgress = false;\n }\n }\n\n /**\n * Load tasks from Linear\n */\n async loadFromLinear(): Promise<number> {\n if (!this.linearClient || !this.config.teamId) {\n throw new Error('Linear client or team ID not configured');\n }\n\n try {\n const issues = await this.linearClient.getIssues({\n teamId: this.config.teamId,\n });\n\n let loaded = 0;\n for (const issue of issues) {\n // Only load issues that belong to this project\n if (this.shouldIncludeIssue(issue)) {\n const task = this.convertLinearIssueToTask(issue);\n this.tasks.set(task.id, task);\n loaded++;\n }\n }\n\n logger.info(\n `Loaded ${loaded} tasks from Linear for project ${this.projectId}`\n );\n this.emit('tasks:loaded', { count: loaded, projectId: this.projectId });\n return loaded;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error('Failed to load tasks from Linear', {\n error: errorMsg,\n projectId: this.projectId,\n teamId: this.config.teamId,\n });\n throw new Error(`Failed to load from Linear: ${errorMsg}`);\n }\n }\n\n /**\n * Clear all tasks (for testing or cleanup)\n */\n clear(): void {\n this.tasks.clear();\n this.emit('tasks:cleared');\n }\n\n /**\n * Get task count\n */\n getTaskCount(): number {\n return this.tasks.size;\n }\n\n // Private methods\n\n private generateTaskId(): string {\n return `tsk-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private async createLinearIssue(task: Task): Promise<LinearIssue> {\n if (!this.linearClient || !this.config.teamId) {\n throw new Error('Linear client or team ID not configured');\n }\n\n const priorityMap: Record<TaskPriority, number> = {\n urgent: 1,\n high: 2,\n medium: 3,\n low: 4,\n };\n\n return await this.linearClient.createIssue({\n title: task.title,\n description: task.description,\n teamId: this.config.teamId,\n priority: task.priority ? priorityMap[task.priority] : 3,\n });\n }\n\n private convertLinearIssueToTask(issue: LinearIssue): Task {\n const priorityMap: Record<number, TaskPriority> = {\n 1: 'urgent',\n 2: 'high',\n 3: 'medium',\n 4: 'low',\n };\n\n const statusMap: Record<string, TaskStatus> = {\n backlog: 'todo',\n unstarted: 'todo',\n started: 'in_progress',\n completed: 'done',\n cancelled: 'cancelled',\n };\n\n return {\n id: `linear-${issue.id}`,\n title: issue.title,\n description: issue.description || '',\n status: statusMap[issue.state.type] || 'todo',\n priority: priorityMap[issue.priority] || 'medium',\n tags: issue.labels?.map((label) => label.name) || [],\n externalId: issue.id,\n externalIdentifier: issue.identifier,\n externalUrl: issue.url,\n metadata: {\n linear: {\n stateId: issue.state.id,\n assigneeId: issue.assignee?.id,\n },\n },\n createdAt: new Date(issue.createdAt),\n updatedAt: new Date(issue.updatedAt),\n };\n }\n\n private setupAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n }\n\n const intervalMs = (this.config.syncInterval || 15) * 60 * 1000;\n this.syncTimer = setInterval(async () => {\n try {\n await this.syncWithLinear();\n } catch (error) {\n logger.error(\n 'Auto-sync failed',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }, intervalMs);\n }\n\n /**\n * Get project-specific tags\n */\n private getProjectTags(): string[] {\n const tags = [];\n if (this.config.projectFilter) {\n tags.push(`project:${this.config.projectFilter}`);\n }\n if (this.projectId) {\n tags.push(`proj:${this.projectId.slice(-8)}`); // Short project ID\n }\n return tags;\n }\n\n /**\n * Check if a Linear issue should be included in this project\n */\n private shouldIncludeIssue(issue: LinearIssue): boolean {\n if (!this.config.projectFilter) {\n return true; // Include all if no filter\n }\n\n // Check if issue has project tags\n const projectTags = issue.labels?.map((label) => label.name) || [];\n return projectTags.some(\n (tag) =>\n tag.includes(this.config.projectFilter!) ||\n tag.includes(`proj:${this.projectId?.slice(-8)}`)\n );\n }\n\n /**\n * Get project information\n */\n getProjectInfo() {\n return {\n projectId: this.projectId,\n teamId: this.config.teamId,\n projectFilter: this.config.projectFilter,\n };\n }\n\n /**\n * Cleanup resources\n */\n /**\n * Get tasks that require syncing (created or updated since last sync)\n */\n private getTasksRequiringSync(): Task[] {\n return Array.from(this.tasks.values()).filter((task) => {\n // Include tasks without external ID (new tasks)\n if (!task.externalId) {\n return true;\n }\n\n // Include tasks updated since last sync\n if (this.lastSyncTimestamp > 0) {\n return task.updatedAt.getTime() > this.lastSyncTimestamp;\n }\n\n return false;\n });\n }\n\n /**\n * Update an existing Linear issue\n */\n private async updateLinearIssue(task: Task): Promise<void> {\n if (!this.linearClient || !task.externalId) {\n return;\n }\n\n const priorityMap: Record<TaskPriority, number> = {\n urgent: 1,\n high: 2,\n medium: 3,\n low: 4,\n };\n\n // Only update if the task was modified after last sync\n if (task.updatedAt.getTime() <= this.lastSyncTimestamp) {\n return;\n }\n\n await this.linearClient.updateIssue(task.externalId, {\n title: task.title,\n description: task.description,\n priority: task.priority ? priorityMap[task.priority] : 3,\n });\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Exponential backoff retry wrapper\n */\n private async withExponentialBackoff<T>(\n operation: () => Promise<T>,\n maxRetries: number = 3,\n baseDelay: number = 1000\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on final attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Check if it's a rate limit error\n const errorMsg = lastError.message.toLowerCase();\n const isRateLimit =\n errorMsg.includes('rate limit') ||\n errorMsg.includes('429') ||\n errorMsg.includes('too many requests');\n\n if (isRateLimit) {\n // Exponential backoff with jitter for rate limit errors\n const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;\n logger.warn(\n `Rate limit hit, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries + 1})`\n );\n await this.sleep(delay);\n } else {\n // For other errors, shorter delay\n const delay = baseDelay * Math.pow(1.5, attempt);\n logger.warn(\n `API error, retrying in ${delay}ms: ${lastError.message}`\n );\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError!;\n }\n\n /**\n * Cleanup resources\n */\n destroy(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = undefined;\n }\n this.removeAllListeners();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }