@stackmemoryai/stackmemory 0.8.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (788) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +15 -3
  3. package/dist/src/agents/core/agent-task-manager.js +0 -1
  4. package/dist/src/agents/verifiers/base-verifier.js +0 -1
  5. package/dist/src/agents/verifiers/formatter-verifier.js +0 -1
  6. package/dist/src/agents/verifiers/llm-judge.js +0 -1
  7. package/dist/src/cli/auto-detect.js +0 -1
  8. package/dist/src/cli/claude-sm-danger.js +0 -1
  9. package/dist/src/cli/claude-sm.js +0 -1
  10. package/dist/src/cli/codex-sm-danger.js +0 -1
  11. package/dist/src/cli/codex-sm.js +0 -1
  12. package/dist/src/cli/commands/api.js +0 -1
  13. package/dist/src/cli/commands/auto-background.js +0 -1
  14. package/dist/src/cli/commands/cleanup-processes.js +0 -1
  15. package/dist/src/cli/commands/clear.js +0 -1
  16. package/dist/src/cli/commands/config.js +0 -1
  17. package/dist/src/cli/commands/context-rehydrate.js +0 -1
  18. package/dist/src/cli/commands/context.js +0 -1
  19. package/dist/src/cli/commands/daemon.js +0 -1
  20. package/dist/src/cli/commands/dashboard.js +4 -5
  21. package/dist/src/cli/commands/db.js +0 -1
  22. package/dist/src/cli/commands/decision.js +0 -1
  23. package/dist/src/cli/commands/discovery.js +0 -1
  24. package/dist/src/cli/commands/handoff.js +0 -1
  25. package/dist/src/cli/commands/hooks.js +0 -1
  26. package/dist/src/cli/commands/linear.js +0 -1
  27. package/dist/src/cli/commands/log.js +0 -1
  28. package/dist/src/cli/commands/login.js +0 -1
  29. package/dist/src/cli/commands/migrate.js +0 -1
  30. package/dist/src/cli/commands/model.js +0 -1
  31. package/dist/src/cli/commands/onboard.js +0 -1
  32. package/dist/src/cli/commands/ping.js +0 -1
  33. package/dist/src/cli/commands/projects.js +0 -1
  34. package/dist/src/cli/commands/ralph.js +0 -1
  35. package/dist/src/cli/commands/retrieval.js +0 -1
  36. package/dist/src/cli/commands/search.js +0 -1
  37. package/dist/src/cli/commands/service.js +0 -1
  38. package/dist/src/cli/commands/session.js +0 -1
  39. package/dist/src/cli/commands/setup.js +0 -4
  40. package/dist/src/cli/commands/shell.js +0 -1
  41. package/dist/src/cli/commands/signup.js +0 -1
  42. package/dist/src/cli/commands/skills.js +4 -3
  43. package/dist/src/cli/commands/storage-tier.js +0 -1
  44. package/dist/src/cli/commands/sweep.js +0 -1
  45. package/dist/src/cli/commands/tasks.js +0 -1
  46. package/dist/src/cli/commands/worktree.js +10 -5
  47. package/dist/src/cli/index.js +8 -5
  48. package/dist/src/cli/opencode-sm.js +0 -1
  49. package/dist/src/cli/utils/viewer.js +0 -1
  50. package/dist/src/core/config/config-manager.js +0 -1
  51. package/dist/src/core/config/feature-flags.js +0 -1
  52. package/dist/src/core/config/storage-config.js +0 -1
  53. package/dist/src/core/config/types.js +0 -1
  54. package/dist/src/core/context/auto-context.js +0 -1
  55. package/dist/src/core/context/dual-stack-manager.js +0 -1
  56. package/dist/src/core/context/enhanced-rehydration.js +0 -2
  57. package/dist/src/core/context/frame-database.js +60 -6
  58. package/dist/src/core/context/frame-digest.js +0 -1
  59. package/dist/src/core/context/frame-handoff-manager.js +0 -1
  60. package/dist/src/core/context/frame-lifecycle-hooks.js +0 -1
  61. package/dist/src/core/context/frame-recovery.js +0 -1
  62. package/dist/src/core/context/frame-stack.js +0 -1
  63. package/dist/src/core/context/frame-types.js +0 -1
  64. package/dist/src/core/context/index.js +0 -1
  65. package/dist/src/core/context/permission-manager.js +0 -1
  66. package/dist/src/core/context/recursive-context-manager.js +3 -2
  67. package/dist/src/core/context/refactored-frame-manager.js +0 -1
  68. package/dist/src/core/context/shared-context-layer.js +0 -1
  69. package/dist/src/core/context/stack-merge-resolver.js +0 -1
  70. package/dist/src/core/context/validation.js +0 -1
  71. package/dist/src/core/database/batch-operations.js +0 -1
  72. package/dist/src/core/database/connection-pool.js +0 -1
  73. package/dist/src/core/database/database-adapter.js +0 -1
  74. package/dist/src/core/database/embedding-provider-factory.js +0 -1
  75. package/dist/src/core/database/embedding-provider.js +0 -1
  76. package/dist/src/core/database/migration-manager.js +0 -1
  77. package/dist/src/core/database/ollama-embedding-provider.js +0 -1
  78. package/dist/src/core/database/openai-embedding-provider.js +0 -1
  79. package/dist/src/core/database/query-cache.js +0 -1
  80. package/dist/src/core/database/query-router.js +0 -1
  81. package/dist/src/core/database/sqlite-adapter.js +18 -108
  82. package/dist/src/core/database/transformers-embedding-provider.js +0 -1
  83. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -1
  84. package/dist/src/core/digest/frame-digest-integration.js +0 -1
  85. package/dist/src/core/digest/hybrid-digest-generator.js +0 -1
  86. package/dist/src/core/digest/index.js +0 -1
  87. package/dist/src/core/digest/types.js +0 -1
  88. package/dist/src/core/errors/error-utils.js +0 -1
  89. package/dist/src/core/errors/index.js +0 -1
  90. package/dist/src/core/errors/recovery.js +0 -1
  91. package/dist/src/core/execution/parallel-executor.js +0 -1
  92. package/dist/src/core/extensions/custom-tools.js +0 -1
  93. package/dist/src/core/extensions/index.js +0 -1
  94. package/dist/src/core/extensions/loader.js +0 -1
  95. package/dist/src/core/extensions/plugin-system.js +0 -1
  96. package/dist/src/core/extensions/provider-adapter.js +0 -1
  97. package/dist/src/core/extensions/sandbox-runtime.js +0 -1
  98. package/dist/src/core/extensions/types.js +0 -1
  99. package/dist/src/core/frame/workflow-templates.js +0 -1
  100. package/dist/src/core/merge/conflict-detector.js +0 -1
  101. package/dist/src/core/merge/index.js +0 -1
  102. package/dist/src/core/merge/resolution-engine.js +0 -1
  103. package/dist/src/core/merge/stack-diff.js +0 -1
  104. package/dist/src/core/merge/types.js +0 -1
  105. package/dist/src/core/merge/unified-merge-resolver.js +0 -1
  106. package/dist/src/core/models/fallback-monitor.js +0 -1
  107. package/dist/src/core/models/model-router.js +0 -1
  108. package/dist/src/core/monitoring/error-handler.js +0 -1
  109. package/dist/src/core/monitoring/logger.js +0 -1
  110. package/dist/src/core/monitoring/metrics.js +0 -1
  111. package/dist/src/core/monitoring/progress-tracker.js +0 -1
  112. package/dist/src/core/monitoring/session-monitor.js +0 -1
  113. package/dist/src/core/performance/context-cache.js +0 -1
  114. package/dist/src/core/performance/index.js +0 -1
  115. package/dist/src/core/performance/lazy-context-loader.js +3 -8
  116. package/dist/src/core/performance/monitor.js +0 -1
  117. package/dist/src/core/performance/optimized-frame-context.js +0 -1
  118. package/dist/src/core/performance/performance-benchmark.js +0 -1
  119. package/dist/src/core/performance/performance-profiler.js +0 -1
  120. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -1
  121. package/dist/src/core/persistence/postgres-adapter.js +0 -1
  122. package/dist/src/core/projects/project-isolation.js +0 -1
  123. package/dist/src/core/projects/project-manager.js +0 -1
  124. package/dist/src/core/query/query-parser.js +0 -1
  125. package/dist/src/core/query/query-templates.js +0 -1
  126. package/dist/src/core/retrieval/context-retriever.js +0 -1
  127. package/dist/src/core/retrieval/index.js +0 -1
  128. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -1
  129. package/dist/src/core/retrieval/llm-provider.js +0 -1
  130. package/dist/src/core/retrieval/privacy-filter.js +0 -1
  131. package/dist/src/core/retrieval/retrieval-audit.js +0 -1
  132. package/dist/src/core/retrieval/summary-generator.js +15 -6
  133. package/dist/src/core/retrieval/types.js +0 -1
  134. package/dist/src/core/retrieval/unified-context-assembler.js +0 -1
  135. package/dist/src/core/security/index.js +0 -1
  136. package/dist/src/core/security/input-sanitizer.js +0 -1
  137. package/dist/src/core/session/clear-survival.js +0 -1
  138. package/dist/src/core/session/enhanced-handoff.js +0 -1
  139. package/dist/src/core/session/handoff-generator.js +0 -1
  140. package/dist/src/core/session/index.js +0 -1
  141. package/dist/src/core/session/session-manager.js +0 -1
  142. package/dist/src/core/skills/index.js +0 -1
  143. package/dist/src/core/skills/skill-storage.js +0 -1
  144. package/dist/src/core/skills/types.js +0 -1
  145. package/dist/src/core/storage/chromadb-adapter.js +0 -1
  146. package/dist/src/core/storage/infinite-storage.js +0 -1
  147. package/dist/src/core/storage/project-registry.js +0 -1
  148. package/dist/src/core/storage/remote-storage.js +4 -2
  149. package/dist/src/core/storage/storage-tier-manager.js +0 -1
  150. package/dist/src/core/storage/two-tier-storage.js +0 -1
  151. package/dist/src/core/trace/cli-trace-wrapper.js +0 -1
  152. package/dist/src/core/trace/db-trace-wrapper.js +0 -1
  153. package/dist/src/core/trace/debug-trace.js +0 -1
  154. package/dist/src/core/trace/index.js +0 -1
  155. package/dist/src/core/trace/linear-api-wrapper.js +0 -1
  156. package/dist/src/core/trace/trace-detector.js +0 -1
  157. package/dist/src/core/trace/trace-store.js +4 -5
  158. package/dist/src/core/trace/types.js +0 -1
  159. package/dist/src/core/types.js +0 -1
  160. package/dist/src/core/utils/async-mutex.js +0 -1
  161. package/dist/src/core/utils/compression.js +0 -1
  162. package/dist/src/core/utils/update-checker.js +0 -1
  163. package/dist/src/core/worktree/worktree-manager.js +0 -1
  164. package/dist/src/daemon/daemon-config.js +0 -1
  165. package/dist/src/daemon/services/context-service.js +0 -1
  166. package/dist/src/daemon/services/linear-service.js +0 -1
  167. package/dist/src/daemon/services/maintenance-service.js +0 -1
  168. package/dist/src/daemon/services/memory-service.js +0 -1
  169. package/dist/src/daemon/session-daemon.js +0 -1
  170. package/dist/src/daemon/unified-daemon.js +0 -1
  171. package/dist/src/features/analytics/api/analytics-api.js +0 -1
  172. package/dist/src/features/analytics/core/analytics-service.js +1 -2
  173. package/dist/src/features/analytics/index.js +0 -1
  174. package/dist/src/features/analytics/queries/metrics-queries.js +8 -9
  175. package/dist/src/features/analytics/types/metrics.js +0 -1
  176. package/dist/src/features/browser/browser-mcp.js +0 -1
  177. package/dist/src/features/sweep/index.js +0 -1
  178. package/dist/src/features/sweep/prediction-client.js +0 -1
  179. package/dist/src/features/sweep/prompt-builder.js +0 -1
  180. package/dist/src/features/sweep/pty-wrapper.js +0 -1
  181. package/dist/src/features/sweep/state-watcher.js +0 -1
  182. package/dist/src/features/sweep/status-bar.js +0 -1
  183. package/dist/src/features/sweep/sweep-server-manager.js +0 -1
  184. package/dist/src/features/sweep/tab-interceptor.js +0 -1
  185. package/dist/src/features/sweep/types.js +0 -1
  186. package/dist/src/features/tasks/linear-task-manager.js +0 -1
  187. package/dist/src/features/tasks/task-aware-context.js +0 -1
  188. package/dist/src/features/tui/simple-monitor.js +0 -1
  189. package/dist/src/features/tui/swarm-monitor.js +0 -1
  190. package/dist/src/features/web/client/stores/task-store.js +0 -1
  191. package/dist/src/features/web/server/index.js +0 -1
  192. package/dist/src/features/workers/tmux-manager.js +0 -1
  193. package/dist/src/features/workers/worker-registry.js +0 -1
  194. package/dist/src/hooks/auto-background.js +0 -1
  195. package/dist/src/hooks/config.js +0 -1
  196. package/dist/src/hooks/daemon.js +0 -1
  197. package/dist/src/hooks/diffmem-hooks.js +0 -1
  198. package/dist/src/hooks/events.js +0 -1
  199. package/dist/src/hooks/index.js +0 -1
  200. package/dist/src/hooks/linear-task-picker.js +0 -1
  201. package/dist/src/hooks/schemas.js +0 -1
  202. package/dist/src/hooks/secure-fs.js +0 -1
  203. package/dist/src/hooks/security-logger.js +0 -1
  204. package/dist/src/hooks/session-summary.js +0 -1
  205. package/dist/src/index.js +0 -1
  206. package/dist/src/integrations/anthropic/client.js +0 -1
  207. package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
  208. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
  209. package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
  210. package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
  211. package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
  212. package/dist/src/integrations/claude-code/subagent-client.js +0 -1
  213. package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
  214. package/dist/src/integrations/diffmem/client.js +0 -1
  215. package/dist/src/integrations/diffmem/config.js +0 -1
  216. package/dist/src/integrations/diffmem/index.js +0 -1
  217. package/dist/src/integrations/diffmem/types.js +0 -1
  218. package/dist/src/integrations/linear/auth.js +0 -1
  219. package/dist/src/integrations/linear/auto-sync.js +0 -1
  220. package/dist/src/integrations/linear/client.js +0 -1
  221. package/dist/src/integrations/linear/config.js +0 -1
  222. package/dist/src/integrations/linear/migration.js +0 -1
  223. package/dist/src/integrations/linear/oauth-server.js +0 -1
  224. package/dist/src/integrations/linear/rest-client.js +0 -1
  225. package/dist/src/integrations/linear/sync-manager.js +0 -1
  226. package/dist/src/integrations/linear/sync-service.js +0 -1
  227. package/dist/src/integrations/linear/sync.js +0 -1
  228. package/dist/src/integrations/linear/types.js +0 -1
  229. package/dist/src/integrations/linear/unified-sync.js +0 -1
  230. package/dist/src/integrations/linear/webhook-handler.js +0 -1
  231. package/dist/src/integrations/linear/webhook-server.js +0 -1
  232. package/dist/src/integrations/linear/webhook.js +0 -1
  233. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
  234. package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
  235. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
  236. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
  237. package/dist/src/integrations/mcp/handlers/index.js +1 -3
  238. package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
  239. package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
  240. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
  241. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
  242. package/dist/src/integrations/mcp/index.js +0 -1
  243. package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
  244. package/dist/src/integrations/mcp/pending-utils.js +0 -1
  245. package/dist/src/integrations/mcp/refactored-server.js +0 -1
  246. package/dist/src/integrations/mcp/remote-server.js +0 -1
  247. package/dist/src/integrations/mcp/schemas.js +0 -1
  248. package/dist/src/integrations/mcp/server.js +20 -24
  249. package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
  250. package/dist/src/integrations/mcp/tool-definitions.js +0 -1
  251. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
  252. package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
  253. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
  254. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
  255. package/dist/src/integrations/ralph/index.js +0 -1
  256. package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
  257. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
  258. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
  259. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
  260. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
  261. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
  262. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
  263. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
  264. package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
  265. package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
  266. package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
  267. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
  268. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
  269. package/dist/src/integrations/ralph/types.js +0 -1
  270. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
  271. package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
  272. package/dist/src/middleware/exponential-rate-limiter.js +0 -1
  273. package/dist/src/models/user.model.js +0 -1
  274. package/dist/src/orchestrators/multimodal/constants.js +0 -1
  275. package/dist/src/orchestrators/multimodal/harness.js +0 -1
  276. package/dist/src/orchestrators/multimodal/providers.js +0 -1
  277. package/dist/src/orchestrators/multimodal/types.js +0 -1
  278. package/dist/src/orchestrators/multimodal/utils.js +0 -1
  279. package/dist/src/servers/production/auth-middleware.js +0 -1
  280. package/dist/src/services/config-service.js +0 -1
  281. package/dist/src/services/context-service.js +0 -1
  282. package/dist/src/skills/api-discovery.js +0 -1
  283. package/dist/src/skills/api-skill.js +0 -1
  284. package/dist/src/skills/claude-skills.js +0 -1
  285. package/dist/src/skills/dashboard-launcher.js +0 -1
  286. package/dist/src/skills/linear-task-runner.js +0 -1
  287. package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
  288. package/dist/src/skills/repo-ingestion-skill.js +0 -1
  289. package/dist/src/skills/spec-generator-skill.js +0 -1
  290. package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
  291. package/dist/src/types/task.js +0 -1
  292. package/dist/src/utils/env.js +0 -1
  293. package/dist/src/utils/formatting.js +0 -1
  294. package/dist/src/utils/process-cleanup.js +0 -1
  295. package/package.json +32 -7
  296. package/dist/scripts/benchmark-performance.js +0 -48
  297. package/dist/scripts/benchmark-performance.js.map +0 -7
  298. package/dist/scripts/check-redis.js +0 -42
  299. package/dist/scripts/check-redis.js.map +0 -7
  300. package/dist/scripts/initialize.js +0 -183
  301. package/dist/scripts/initialize.js.map +0 -7
  302. package/dist/scripts/list-linear-tasks.js +0 -124
  303. package/dist/scripts/list-linear-tasks.js.map +0 -7
  304. package/dist/scripts/measure-handoff-impact.js +0 -340
  305. package/dist/scripts/measure-handoff-impact.js.map +0 -7
  306. package/dist/scripts/query-chromadb.js +0 -160
  307. package/dist/scripts/query-chromadb.js.map +0 -7
  308. package/dist/scripts/show-linear-summary.js +0 -119
  309. package/dist/scripts/show-linear-summary.js.map +0 -7
  310. package/dist/scripts/simple-swarm-demo.js +0 -90
  311. package/dist/scripts/simple-swarm-demo.js.map +0 -7
  312. package/dist/scripts/status.js +0 -155
  313. package/dist/scripts/status.js.map +0 -7
  314. package/dist/scripts/test-chromadb-sync.js +0 -192
  315. package/dist/scripts/test-chromadb-sync.js.map +0 -7
  316. package/dist/scripts/test-ralph-iteration-fix.js +0 -86
  317. package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
  318. package/dist/scripts/test-ralph-iterations.js +0 -121
  319. package/dist/scripts/test-ralph-iterations.js.map +0 -7
  320. package/dist/scripts/test-redis-storage.js +0 -389
  321. package/dist/scripts/test-redis-storage.js.map +0 -7
  322. package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
  323. package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
  324. package/dist/scripts/test-swarm-fixes.js +0 -125
  325. package/dist/scripts/test-swarm-fixes.js.map +0 -7
  326. package/dist/scripts/test-swarm-tui.js +0 -23
  327. package/dist/scripts/test-swarm-tui.js.map +0 -7
  328. package/dist/scripts/test-tui-shortcuts.js +0 -52
  329. package/dist/scripts/test-tui-shortcuts.js.map +0 -7
  330. package/dist/scripts/validate-tui-shortcuts.js +0 -60
  331. package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
  332. package/dist/src/agents/core/agent-task-manager.js.map +0 -7
  333. package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
  334. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
  335. package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
  336. package/dist/src/cli/auto-detect.js.map +0 -7
  337. package/dist/src/cli/claude-sm-danger.js.map +0 -7
  338. package/dist/src/cli/claude-sm.js.map +0 -7
  339. package/dist/src/cli/codex-sm-danger.js.map +0 -7
  340. package/dist/src/cli/codex-sm.js.map +0 -7
  341. package/dist/src/cli/commands/api.js.map +0 -7
  342. package/dist/src/cli/commands/auto-background.js.map +0 -7
  343. package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
  344. package/dist/src/cli/commands/clear.js.map +0 -7
  345. package/dist/src/cli/commands/config.js.map +0 -7
  346. package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
  347. package/dist/src/cli/commands/context.js.map +0 -7
  348. package/dist/src/cli/commands/daemon.js.map +0 -7
  349. package/dist/src/cli/commands/dashboard.js.map +0 -7
  350. package/dist/src/cli/commands/db.js.map +0 -7
  351. package/dist/src/cli/commands/decision.js.map +0 -7
  352. package/dist/src/cli/commands/discovery.js.map +0 -7
  353. package/dist/src/cli/commands/handoff.js.map +0 -7
  354. package/dist/src/cli/commands/hooks.js.map +0 -7
  355. package/dist/src/cli/commands/linear.js.map +0 -7
  356. package/dist/src/cli/commands/log.js.map +0 -7
  357. package/dist/src/cli/commands/login.js.map +0 -7
  358. package/dist/src/cli/commands/migrate.js.map +0 -7
  359. package/dist/src/cli/commands/model.js.map +0 -7
  360. package/dist/src/cli/commands/onboard.js.map +0 -7
  361. package/dist/src/cli/commands/ping.js.map +0 -7
  362. package/dist/src/cli/commands/projects.js.map +0 -7
  363. package/dist/src/cli/commands/ralph.js.map +0 -7
  364. package/dist/src/cli/commands/retrieval.js.map +0 -7
  365. package/dist/src/cli/commands/search.js.map +0 -7
  366. package/dist/src/cli/commands/service.js.map +0 -7
  367. package/dist/src/cli/commands/session.js.map +0 -7
  368. package/dist/src/cli/commands/settings.js +0 -306
  369. package/dist/src/cli/commands/settings.js.map +0 -7
  370. package/dist/src/cli/commands/setup.js.map +0 -7
  371. package/dist/src/cli/commands/shell.js.map +0 -7
  372. package/dist/src/cli/commands/signup.js.map +0 -7
  373. package/dist/src/cli/commands/skills.js.map +0 -7
  374. package/dist/src/cli/commands/sms-notify.js +0 -795
  375. package/dist/src/cli/commands/sms-notify.js.map +0 -7
  376. package/dist/src/cli/commands/storage-tier.js.map +0 -7
  377. package/dist/src/cli/commands/sweep.js.map +0 -7
  378. package/dist/src/cli/commands/tasks.js.map +0 -7
  379. package/dist/src/cli/commands/worktree.js.map +0 -7
  380. package/dist/src/cli/index.js.map +0 -7
  381. package/dist/src/cli/opencode-sm.js.map +0 -7
  382. package/dist/src/cli/utils/viewer.js.map +0 -7
  383. package/dist/src/core/config/config-manager.js.map +0 -7
  384. package/dist/src/core/config/feature-flags.js.map +0 -7
  385. package/dist/src/core/config/storage-config.js.map +0 -7
  386. package/dist/src/core/config/types.js.map +0 -7
  387. package/dist/src/core/context/auto-context.js.map +0 -7
  388. package/dist/src/core/context/dual-stack-manager.js.map +0 -7
  389. package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
  390. package/dist/src/core/context/frame-database.js.map +0 -7
  391. package/dist/src/core/context/frame-digest.js.map +0 -7
  392. package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
  393. package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
  394. package/dist/src/core/context/frame-recovery.js.map +0 -7
  395. package/dist/src/core/context/frame-stack.js.map +0 -7
  396. package/dist/src/core/context/frame-types.js.map +0 -7
  397. package/dist/src/core/context/index.js.map +0 -7
  398. package/dist/src/core/context/permission-manager.js.map +0 -7
  399. package/dist/src/core/context/recursive-context-manager.js.map +0 -7
  400. package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
  401. package/dist/src/core/context/shared-context-layer.js.map +0 -7
  402. package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
  403. package/dist/src/core/context/validation.js.map +0 -7
  404. package/dist/src/core/database/batch-operations.js.map +0 -7
  405. package/dist/src/core/database/connection-pool.js.map +0 -7
  406. package/dist/src/core/database/database-adapter.js.map +0 -7
  407. package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
  408. package/dist/src/core/database/embedding-provider.js.map +0 -7
  409. package/dist/src/core/database/migration-manager.js.map +0 -7
  410. package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
  411. package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
  412. package/dist/src/core/database/query-cache.js.map +0 -7
  413. package/dist/src/core/database/query-router.js.map +0 -7
  414. package/dist/src/core/database/sqlite-adapter.js.map +0 -7
  415. package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
  416. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
  417. package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
  418. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
  419. package/dist/src/core/digest/index.js.map +0 -7
  420. package/dist/src/core/digest/types.js.map +0 -7
  421. package/dist/src/core/errors/error-utils.js.map +0 -7
  422. package/dist/src/core/errors/index.js.map +0 -7
  423. package/dist/src/core/errors/recovery.js.map +0 -7
  424. package/dist/src/core/execution/parallel-executor.js.map +0 -7
  425. package/dist/src/core/extensions/custom-tools.js.map +0 -7
  426. package/dist/src/core/extensions/index.js.map +0 -7
  427. package/dist/src/core/extensions/loader.js.map +0 -7
  428. package/dist/src/core/extensions/plugin-system.js.map +0 -7
  429. package/dist/src/core/extensions/provider-adapter.js.map +0 -7
  430. package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
  431. package/dist/src/core/extensions/types.js.map +0 -7
  432. package/dist/src/core/frame/workflow-templates.js.map +0 -7
  433. package/dist/src/core/merge/conflict-detector.js.map +0 -7
  434. package/dist/src/core/merge/index.js.map +0 -7
  435. package/dist/src/core/merge/resolution-engine.js.map +0 -7
  436. package/dist/src/core/merge/stack-diff.js.map +0 -7
  437. package/dist/src/core/merge/types.js.map +0 -7
  438. package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
  439. package/dist/src/core/models/fallback-monitor.js.map +0 -7
  440. package/dist/src/core/models/model-router.js.map +0 -7
  441. package/dist/src/core/monitoring/error-handler.js.map +0 -7
  442. package/dist/src/core/monitoring/logger.js.map +0 -7
  443. package/dist/src/core/monitoring/metrics.js.map +0 -7
  444. package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
  445. package/dist/src/core/monitoring/session-monitor.js.map +0 -7
  446. package/dist/src/core/performance/context-cache.js.map +0 -7
  447. package/dist/src/core/performance/index.js.map +0 -7
  448. package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
  449. package/dist/src/core/performance/monitor.js.map +0 -7
  450. package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
  451. package/dist/src/core/performance/performance-benchmark.js.map +0 -7
  452. package/dist/src/core/performance/performance-profiler.js.map +0 -7
  453. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
  454. package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
  455. package/dist/src/core/projects/project-isolation.js.map +0 -7
  456. package/dist/src/core/projects/project-manager.js.map +0 -7
  457. package/dist/src/core/query/query-parser.js.map +0 -7
  458. package/dist/src/core/query/query-templates.js.map +0 -7
  459. package/dist/src/core/retrieval/context-retriever.js.map +0 -7
  460. package/dist/src/core/retrieval/index.js.map +0 -7
  461. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
  462. package/dist/src/core/retrieval/llm-provider.js.map +0 -7
  463. package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
  464. package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
  465. package/dist/src/core/retrieval/summary-generator.js.map +0 -7
  466. package/dist/src/core/retrieval/types.js.map +0 -7
  467. package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
  468. package/dist/src/core/security/index.js.map +0 -7
  469. package/dist/src/core/security/input-sanitizer.js.map +0 -7
  470. package/dist/src/core/session/clear-survival.js.map +0 -7
  471. package/dist/src/core/session/enhanced-handoff.js.map +0 -7
  472. package/dist/src/core/session/handoff-generator.js.map +0 -7
  473. package/dist/src/core/session/index.js.map +0 -7
  474. package/dist/src/core/session/session-manager.js.map +0 -7
  475. package/dist/src/core/skills/index.js.map +0 -7
  476. package/dist/src/core/skills/skill-storage.js.map +0 -7
  477. package/dist/src/core/skills/types.js.map +0 -7
  478. package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
  479. package/dist/src/core/storage/infinite-storage.js.map +0 -7
  480. package/dist/src/core/storage/project-registry.js.map +0 -7
  481. package/dist/src/core/storage/remote-storage.js.map +0 -7
  482. package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
  483. package/dist/src/core/storage/two-tier-storage.js.map +0 -7
  484. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
  485. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
  486. package/dist/src/core/trace/debug-trace.js.map +0 -7
  487. package/dist/src/core/trace/index.js.map +0 -7
  488. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
  489. package/dist/src/core/trace/trace-detector.js.map +0 -7
  490. package/dist/src/core/trace/trace-store.js.map +0 -7
  491. package/dist/src/core/trace/types.js.map +0 -7
  492. package/dist/src/core/types.js.map +0 -7
  493. package/dist/src/core/utils/async-mutex.js.map +0 -7
  494. package/dist/src/core/utils/compression.js.map +0 -7
  495. package/dist/src/core/utils/update-checker.js.map +0 -7
  496. package/dist/src/core/worktree/worktree-manager.js.map +0 -7
  497. package/dist/src/daemon/daemon-config.js.map +0 -7
  498. package/dist/src/daemon/services/context-service.js.map +0 -7
  499. package/dist/src/daemon/services/linear-service.js.map +0 -7
  500. package/dist/src/daemon/services/maintenance-service.js.map +0 -7
  501. package/dist/src/daemon/services/memory-service.js.map +0 -7
  502. package/dist/src/daemon/session-daemon.js.map +0 -7
  503. package/dist/src/daemon/unified-daemon.js.map +0 -7
  504. package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
  505. package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
  506. package/dist/src/features/analytics/index.js.map +0 -7
  507. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
  508. package/dist/src/features/analytics/types/metrics.js.map +0 -7
  509. package/dist/src/features/browser/browser-mcp.js.map +0 -7
  510. package/dist/src/features/sweep/index.js.map +0 -7
  511. package/dist/src/features/sweep/prediction-client.js.map +0 -7
  512. package/dist/src/features/sweep/prompt-builder.js.map +0 -7
  513. package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
  514. package/dist/src/features/sweep/state-watcher.js.map +0 -7
  515. package/dist/src/features/sweep/status-bar.js.map +0 -7
  516. package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
  517. package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
  518. package/dist/src/features/sweep/types.js.map +0 -7
  519. package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
  520. package/dist/src/features/tasks/task-aware-context.js.map +0 -7
  521. package/dist/src/features/tui/simple-monitor.js.map +0 -7
  522. package/dist/src/features/tui/swarm-monitor.js.map +0 -7
  523. package/dist/src/features/web/client/stores/task-store.js.map +0 -7
  524. package/dist/src/features/web/server/index.js.map +0 -7
  525. package/dist/src/features/workers/tmux-manager.js.map +0 -7
  526. package/dist/src/features/workers/worker-registry.js.map +0 -7
  527. package/dist/src/hooks/auto-background.js.map +0 -7
  528. package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
  529. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
  530. package/dist/src/hooks/config.js.map +0 -7
  531. package/dist/src/hooks/daemon.js.map +0 -7
  532. package/dist/src/hooks/diffmem-hooks.js.map +0 -7
  533. package/dist/src/hooks/events.js.map +0 -7
  534. package/dist/src/hooks/index.js.map +0 -7
  535. package/dist/src/hooks/linear-task-picker.js.map +0 -7
  536. package/dist/src/hooks/schemas.js.map +0 -7
  537. package/dist/src/hooks/secure-fs.js.map +0 -7
  538. package/dist/src/hooks/security-logger.js.map +0 -7
  539. package/dist/src/hooks/session-summary.js.map +0 -7
  540. package/dist/src/hooks/sms-action-runner.js +0 -371
  541. package/dist/src/hooks/sms-action-runner.js.map +0 -7
  542. package/dist/src/hooks/sms-notify.js +0 -506
  543. package/dist/src/hooks/sms-notify.js.map +0 -7
  544. package/dist/src/hooks/sms-watcher.js +0 -93
  545. package/dist/src/hooks/sms-watcher.js.map +0 -7
  546. package/dist/src/hooks/sms-webhook.js +0 -555
  547. package/dist/src/hooks/sms-webhook.js.map +0 -7
  548. package/dist/src/hooks/whatsapp-commands.js +0 -479
  549. package/dist/src/hooks/whatsapp-commands.js.map +0 -7
  550. package/dist/src/hooks/whatsapp-scheduler.js +0 -317
  551. package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
  552. package/dist/src/hooks/whatsapp-sync.js +0 -409
  553. package/dist/src/hooks/whatsapp-sync.js.map +0 -7
  554. package/dist/src/index.js.map +0 -7
  555. package/dist/src/integrations/anthropic/client.js.map +0 -7
  556. package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
  557. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  558. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  559. package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
  560. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
  561. package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
  562. package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
  563. package/dist/src/integrations/diffmem/client.js.map +0 -7
  564. package/dist/src/integrations/diffmem/config.js.map +0 -7
  565. package/dist/src/integrations/diffmem/index.js.map +0 -7
  566. package/dist/src/integrations/diffmem/types.js.map +0 -7
  567. package/dist/src/integrations/linear/auth.js.map +0 -7
  568. package/dist/src/integrations/linear/auto-sync.js.map +0 -7
  569. package/dist/src/integrations/linear/client.js.map +0 -7
  570. package/dist/src/integrations/linear/config.js.map +0 -7
  571. package/dist/src/integrations/linear/migration.js.map +0 -7
  572. package/dist/src/integrations/linear/oauth-server.js.map +0 -7
  573. package/dist/src/integrations/linear/rest-client.js.map +0 -7
  574. package/dist/src/integrations/linear/sync-manager.js.map +0 -7
  575. package/dist/src/integrations/linear/sync-service.js.map +0 -7
  576. package/dist/src/integrations/linear/sync.js.map +0 -7
  577. package/dist/src/integrations/linear/types.js.map +0 -7
  578. package/dist/src/integrations/linear/unified-sync.js.map +0 -7
  579. package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
  580. package/dist/src/integrations/linear/webhook-server.js.map +0 -7
  581. package/dist/src/integrations/linear/webhook.js.map +0 -7
  582. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  583. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
  584. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
  585. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  586. package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
  587. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  588. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  589. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
  590. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  591. package/dist/src/integrations/mcp/index.js.map +0 -7
  592. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  593. package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
  594. package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
  595. package/dist/src/integrations/mcp/remote-server.js.map +0 -7
  596. package/dist/src/integrations/mcp/schemas.js.map +0 -7
  597. package/dist/src/integrations/mcp/server.js.map +0 -7
  598. package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
  599. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
  600. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  601. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
  602. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  603. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  604. package/dist/src/integrations/ralph/index.js.map +0 -7
  605. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
  606. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  607. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  608. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  609. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  610. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  611. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  612. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  613. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  614. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  615. package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
  616. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  617. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  618. package/dist/src/integrations/ralph/types.js.map +0 -7
  619. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  620. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
  621. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
  622. package/dist/src/models/user.model.js.map +0 -7
  623. package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
  624. package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
  625. package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
  626. package/dist/src/orchestrators/multimodal/types.js.map +0 -7
  627. package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
  628. package/dist/src/servers/production/auth-middleware.js.map +0 -7
  629. package/dist/src/services/config-service.js.map +0 -7
  630. package/dist/src/services/context-service.js.map +0 -7
  631. package/dist/src/skills/api-discovery.js.map +0 -7
  632. package/dist/src/skills/api-skill.js.map +0 -7
  633. package/dist/src/skills/claude-skills.js.map +0 -7
  634. package/dist/src/skills/dashboard-launcher.js.map +0 -7
  635. package/dist/src/skills/linear-task-runner.js.map +0 -7
  636. package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
  637. package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
  638. package/dist/src/skills/spec-generator-skill.js.map +0 -7
  639. package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
  640. package/dist/src/types/task.js.map +0 -7
  641. package/dist/src/utils/env.js.map +0 -7
  642. package/dist/src/utils/formatting.js.map +0 -7
  643. package/dist/src/utils/process-cleanup.js.map +0 -7
  644. package/scripts/README-TESTING.md +0 -186
  645. package/scripts/analyze-cli-security.js +0 -288
  646. package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
  647. package/scripts/archive/analyze-linear-duplicates.js +0 -214
  648. package/scripts/archive/analyze-remaining-duplicates.js +0 -230
  649. package/scripts/archive/analyze-sta-duplicates.js +0 -292
  650. package/scripts/archive/analyze-sta-graphql.js +0 -399
  651. package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
  652. package/scripts/archive/check-all-duplicates.ts +0 -419
  653. package/scripts/archive/clean-duplicate-tasks.js +0 -114
  654. package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
  655. package/scripts/archive/create-phase-tasks.js +0 -387
  656. package/scripts/archive/delete-linear-duplicates.js +0 -182
  657. package/scripts/archive/delete-remaining-duplicates.js +0 -158
  658. package/scripts/archive/delete-sta-duplicates.js +0 -201
  659. package/scripts/archive/delete-sta-oauth.js +0 -201
  660. package/scripts/archive/export-sta-tasks.js +0 -62
  661. package/scripts/archive/install-auto-sync.js +0 -266
  662. package/scripts/archive/install-chromadb-hooks.sh +0 -133
  663. package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
  664. package/scripts/archive/install-post-task-hooks.sh +0 -289
  665. package/scripts/archive/install-stackmemory-hooks.sh +0 -420
  666. package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
  667. package/scripts/archive/merge-linear-duplicates.ts +0 -182
  668. package/scripts/archive/remove-sta-tasks.js +0 -70
  669. package/scripts/archive/setup-background-sync.sh +0 -168
  670. package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
  671. package/scripts/archive/setup-claude-autostart.sh +0 -305
  672. package/scripts/archive/setup-git-hooks.sh +0 -25
  673. package/scripts/archive/setup-linear-oauth.sh +0 -46
  674. package/scripts/archive/setup-mcp.sh +0 -113
  675. package/scripts/archive/setup-railway-deployment.sh +0 -81
  676. package/scripts/auto-handoff.sh +0 -262
  677. package/scripts/background-sync-manager.js +0 -478
  678. package/scripts/benchmark-performance.ts +0 -57
  679. package/scripts/check-redis.ts +0 -48
  680. package/scripts/chromadb-auto-loader.sh +0 -128
  681. package/scripts/chromadb-context-loader.js +0 -479
  682. package/scripts/claude-chromadb-hook.js +0 -460
  683. package/scripts/claude-linear-skill.js +0 -455
  684. package/scripts/claude-pre-commit.sh +0 -302
  685. package/scripts/claude-sm-autostart.js +0 -579
  686. package/scripts/claude-with-chromadb.sh +0 -69
  687. package/scripts/clean-linear-backlog.js +0 -273
  688. package/scripts/cleanup-old-sessions.sh +0 -57
  689. package/scripts/create-cleanup-issues.js +0 -302
  690. package/scripts/create-sandbox.sh +0 -269
  691. package/scripts/debug-linear-update.js +0 -174
  692. package/scripts/delete-linear-tasks.js +0 -167
  693. package/scripts/demos/browser-test.ts +0 -39
  694. package/scripts/demos/ralph-integration-demo.ts +0 -245
  695. package/scripts/demos/trace-demo.ts +0 -200
  696. package/scripts/demos/trace-detector.demo.ts +0 -171
  697. package/scripts/demos/trace-test.ts +0 -79
  698. package/scripts/deploy-ralph-swarm.sh +0 -365
  699. package/scripts/deploy.sh +0 -89
  700. package/scripts/deployment/test-deployment.js +0 -194
  701. package/scripts/detect-and-rehydrate.js +0 -162
  702. package/scripts/detect-and-rehydrate.mjs +0 -165
  703. package/scripts/development/create-demo-tasks.js +0 -143
  704. package/scripts/development/debug-frame-test.js +0 -16
  705. package/scripts/development/demo-auto-sync.js +0 -128
  706. package/scripts/development/fix-all-imports.js +0 -213
  707. package/scripts/development/fix-imports.js +0 -229
  708. package/scripts/development/fix-lint-loop.cjs +0 -103
  709. package/scripts/development/fix-project-id.ts +0 -161
  710. package/scripts/development/fix-strict-mode-issues.ts +0 -291
  711. package/scripts/development/reorganize-structure.sh +0 -228
  712. package/scripts/development/test-persistence-direct.js +0 -148
  713. package/scripts/development/test-persistence.js +0 -114
  714. package/scripts/development/test-tasks.js +0 -93
  715. package/scripts/development/update-imports.js +0 -212
  716. package/scripts/fetch-linear-status.js +0 -125
  717. package/scripts/initialize.ts +0 -220
  718. package/scripts/linear-auto-sync.js +0 -262
  719. package/scripts/linear-auto-sync.sh +0 -161
  720. package/scripts/linear-sync-daemon.js +0 -150
  721. package/scripts/linear-task-review.js +0 -237
  722. package/scripts/list-linear-tasks.ts +0 -178
  723. package/scripts/mcp-proxy.js +0 -66
  724. package/scripts/measure-handoff-impact.mjs +0 -395
  725. package/scripts/measure-handoff-impact.ts +0 -450
  726. package/scripts/publish-local.js +0 -74
  727. package/scripts/query-chromadb.ts +0 -201
  728. package/scripts/ralph-integration-test.js +0 -274
  729. package/scripts/reconcile-local-tasks.js +0 -170
  730. package/scripts/recreate-frames-db.js +0 -89
  731. package/scripts/show-linear-summary.ts +0 -172
  732. package/scripts/simple-swarm-demo.ts +0 -114
  733. package/scripts/stackmemory-auto-handoff.sh +0 -231
  734. package/scripts/start-linear-sync-daemon.sh +0 -141
  735. package/scripts/start-temporal-paradox.sh +0 -214
  736. package/scripts/status.ts +0 -224
  737. package/scripts/stop-notify-webhook.sh +0 -19
  738. package/scripts/swarm-monitor.js +0 -509
  739. package/scripts/sync-and-clean-tasks.js +0 -258
  740. package/scripts/sync-linear-graphql.js +0 -303
  741. package/scripts/sync-linear-tasks.js +0 -186
  742. package/scripts/test-auto-triggers.sh +0 -57
  743. package/scripts/test-browser-mcp.js +0 -74
  744. package/scripts/test-chromadb-full.js +0 -115
  745. package/scripts/test-chromadb-hooks.sh +0 -28
  746. package/scripts/test-chromadb-sync.ts +0 -245
  747. package/scripts/test-claude-config.sh +0 -123
  748. package/scripts/test-cli-security.js +0 -293
  749. package/scripts/test-code-execution.js +0 -143
  750. package/scripts/test-hooks-persistence.sh +0 -220
  751. package/scripts/test-installation-scenarios.sh +0 -359
  752. package/scripts/test-installation.sh +0 -224
  753. package/scripts/test-mcp.js +0 -163
  754. package/scripts/test-parallel-swarms.js +0 -443
  755. package/scripts/test-pre-publish-quick.sh +0 -69
  756. package/scripts/test-quality-gates.sh +0 -263
  757. package/scripts/test-ralph-iteration-fix.ts +0 -118
  758. package/scripts/test-ralph-iterations.ts +0 -164
  759. package/scripts/test-redis-storage.ts +0 -490
  760. package/scripts/test-rlm-basic.sh +0 -122
  761. package/scripts/test-rlm-comprehensive.sh +0 -260
  762. package/scripts/test-rlm-e2e.sh +0 -268
  763. package/scripts/test-rlm-simple.js +0 -90
  764. package/scripts/test-rlm.js +0 -110
  765. package/scripts/test-session-handoff.sh +0 -165
  766. package/scripts/test-setup-e2e.sh +0 -154
  767. package/scripts/test-shell-integration.sh +0 -275
  768. package/scripts/test-simple-ralph-state-sync.ts +0 -178
  769. package/scripts/test-swarm-fixes.ts +0 -161
  770. package/scripts/test-swarm-git-workflow.js +0 -338
  771. package/scripts/test-swarm-tui.ts +0 -34
  772. package/scripts/test-tui-shortcuts.ts +0 -66
  773. package/scripts/testing/ab-test-runner.ts +0 -510
  774. package/scripts/testing/collect-metrics.ts +0 -457
  775. package/scripts/testing/quick-effectiveness-demo.js +0 -187
  776. package/scripts/testing/ralph-cli-test.js +0 -88
  777. package/scripts/testing/ralph-integration-validation.js +0 -727
  778. package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
  779. package/scripts/testing/real-performance-test.js +0 -422
  780. package/scripts/testing/results/real-performance-results.json +0 -90
  781. package/scripts/testing/run-effectiveness-tests.sh +0 -176
  782. package/scripts/testing/simple-effectiveness-test.js +0 -310
  783. package/scripts/testing/test-tier-migration.js +0 -100
  784. package/scripts/update-linear-status.js +0 -268
  785. package/scripts/update-linear-tasks-fixed.js +0 -284
  786. package/scripts/validate-claude-config.sh +0 -155
  787. package/scripts/validate-swarm-implementation.js +0 -467
  788. package/scripts/validate-tui-shortcuts.ts +0 -83
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/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
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/tasks/task-aware-context.ts"],
4
- "sourcesContent": ["/**\n * Task-Aware Context Assembly\n * Intelligently selects context based on active tasks and their relationships\n */\n\nimport Database from 'better-sqlite3';\nimport {\n Frame,\n Anchor,\n Event,\n FrameManager,\n} from '../../core/context/index.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport type TaskStatus =\n | 'pending'\n | 'in_progress'\n | 'completed'\n | 'blocked'\n | 'cancelled';\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';\n\nexport interface Task {\n task_id: string;\n frame_id: string;\n anchor_id?: string; // Reference to TODO anchor if exists\n name: string;\n description?: string;\n status: TaskStatus;\n priority: TaskPriority;\n parent_task_id?: string;\n depends_on: string[]; // Task IDs this depends on\n assigned_to?: string; // For team contexts\n estimated_effort?: number; // In minutes\n actual_effort?: number;\n created_at: number;\n started_at?: number;\n completed_at?: number;\n blocked_reason?: string;\n context_tags: string[]; // For context relevance scoring\n metadata: Record<string, any>;\n}\n\nexport interface TaskContext {\n activeTasks: Task[];\n blockedTasks: Task[];\n relatedContext: {\n frames: Frame[];\n anchors: Anchor[];\n recentEvents: Event[];\n };\n contextScore: number; // Relevance score for current work\n}\n\nexport interface ContextRequest {\n query?: string;\n maxTokens?: number;\n taskFocus?: string[]; // Specific task IDs to focus on\n includeHistory?: boolean;\n priorityFilter?: TaskPriority[];\n}\n\nexport class TaskAwareContextManager {\n private db: Database.Database;\n private frameManager: FrameManager;\n private projectId: string;\n\n constructor(\n db: Database.Database,\n frameManager: FrameManager,\n projectId: string\n ) {\n this.db = db;\n this.frameManager = frameManager;\n this.projectId = projectId;\n this.initializeTaskSchema();\n }\n\n private initializeTaskSchema() {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS tasks (\n task_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n anchor_id TEXT,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'pending',\n priority TEXT DEFAULT 'medium',\n parent_task_id TEXT,\n depends_on TEXT DEFAULT '[]',\n assigned_to TEXT,\n estimated_effort INTEGER,\n actual_effort INTEGER,\n created_at INTEGER DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n blocked_reason TEXT,\n context_tags TEXT DEFAULT '[]',\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id),\n FOREIGN KEY(anchor_id) REFERENCES anchors(anchor_id),\n FOREIGN KEY(parent_task_id) REFERENCES tasks(task_id)\n );\n\n CREATE TABLE IF NOT EXISTS task_dependencies (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL,\n depends_on_task_id TEXT NOT NULL,\n dependency_type TEXT DEFAULT 'blocks',\n created_at INTEGER DEFAULT (unixepoch()),\n FOREIGN KEY(task_id) REFERENCES tasks(task_id),\n FOREIGN KEY(depends_on_task_id) REFERENCES tasks(task_id)\n );\n\n CREATE TABLE IF NOT EXISTS context_access_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n request_id TEXT NOT NULL,\n task_ids TEXT, -- JSON array of relevant task IDs\n context_items TEXT, -- JSON array of included context items\n relevance_scores TEXT, -- JSON object of item -> score mappings\n total_tokens INTEGER,\n query_hash TEXT,\n timestamp INTEGER DEFAULT (unixepoch())\n );\n\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);\n CREATE INDEX IF NOT EXISTS idx_tasks_frame ON tasks(frame_id);\n CREATE INDEX IF NOT EXISTS idx_task_deps ON task_dependencies(task_id);\n `);\n }\n\n /**\n * Create task from TODO anchor or standalone\n */\n public createTask(options: {\n name: string;\n description?: string;\n priority?: TaskPriority;\n frameId?: string;\n anchorId?: string;\n parentTaskId?: string;\n dependsOn?: string[];\n contextTags?: string[];\n estimatedEffort?: number;\n metadata?: Record<string, any>;\n }): string {\n const taskId = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const frameId = options.frameId || this.frameManager.getCurrentFrameId();\n\n if (!frameId) {\n throw new Error('No active frame for task creation');\n }\n\n const task: Omit<\n Task,\n 'started_at' | 'completed_at' | 'blocked_reason' | 'actual_effort'\n > = {\n task_id: taskId,\n frame_id: frameId,\n anchor_id: options.anchorId,\n name: options.name,\n description: options.description,\n status: 'pending',\n priority: options.priority || 'medium',\n parent_task_id: options.parentTaskId,\n depends_on: options.dependsOn || [],\n estimated_effort: options.estimatedEffort,\n created_at: Math.floor(Date.now() / 1000),\n context_tags: options.contextTags || [],\n metadata: options.metadata || {},\n };\n\n // Insert task\n this.db\n .prepare(\n `\n INSERT INTO tasks (\n task_id, frame_id, anchor_id, name, description, status, priority,\n parent_task_id, depends_on, estimated_effort, created_at, context_tags, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n task.task_id,\n task.frame_id,\n task.anchor_id,\n task.name,\n task.description,\n task.status,\n task.priority,\n task.parent_task_id,\n JSON.stringify(task.depends_on),\n task.estimated_effort,\n task.created_at,\n JSON.stringify(task.context_tags),\n JSON.stringify(task.metadata)\n );\n\n // Create dependency relationships\n if (task.depends_on.length > 0) {\n const dependencyStmt = this.db.prepare(`\n INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (?, ?)\n `);\n\n task.depends_on.forEach((depTaskId) => {\n dependencyStmt.run(taskId, depTaskId);\n });\n }\n\n // Log event\n this.frameManager.addEvent('decision', {\n action: 'create_task',\n task_id: taskId,\n name: task.name,\n priority: task.priority,\n });\n\n logger.info('Created task', { taskId, name: task.name, frameId });\n return taskId;\n }\n\n /**\n * Update task status with automatic time tracking\n */\n public updateTaskStatus(\n taskId: string,\n newStatus: TaskStatus,\n reason?: string\n ): void {\n const task = this.getTask(taskId);\n if (!task) throw new Error(`Task not found: ${taskId}`);\n\n const now = Math.floor(Date.now() / 1000);\n const updates: Record<string, any> = { status: newStatus };\n\n // Automatic time tracking\n if (newStatus === 'in_progress' && task.status === 'pending') {\n updates.started_at = now;\n } else if (newStatus === 'completed' && task.status === 'in_progress') {\n updates.completed_at = now;\n if (task.started_at) {\n updates.actual_effort = now - task.started_at;\n }\n } else if (newStatus === 'blocked') {\n updates.blocked_reason = reason || 'No reason provided';\n }\n\n // Build dynamic update query\n const setClause = Object.keys(updates)\n .map((key) => `${key} = ?`)\n .join(', ');\n const values = Object.values(updates);\n\n this.db\n .prepare(`UPDATE tasks SET ${setClause} WHERE task_id = ?`)\n .run(...values, taskId);\n\n // Log status change\n this.frameManager.addEvent('observation', {\n action: 'task_status_change',\n task_id: taskId,\n old_status: task.status,\n new_status: newStatus,\n reason,\n });\n\n logger.info('Updated task status', {\n taskId,\n oldStatus: task.status,\n newStatus,\n });\n }\n\n /**\n * Assemble context optimized for active tasks and query\n */\n public assembleTaskAwareContext(request: ContextRequest): {\n context: string;\n metadata: {\n includedTasks: Task[];\n contextSources: string[];\n totalTokens: number;\n relevanceScores: Record<string, number>;\n };\n } {\n const startTime = Date.now();\n\n // 1. Get active and relevant tasks\n const activeTasks = this.getActiveTasks(request.taskFocus);\n const blockedTasks = this.getBlockedTasks();\n\n // 2. Score and select relevant context\n const contextItems = this.selectRelevantContext(activeTasks, request);\n\n // 3. Assemble final context with smart ordering\n const { context, totalTokens, relevanceScores } = this.buildContextString(\n contextItems,\n activeTasks,\n request.maxTokens || 4000\n );\n\n // 4. Log context access for learning\n this.logContextAccess({\n taskIds: activeTasks.map((t) => t.task_id),\n contextItems: contextItems.map((item) => item.id),\n relevanceScores,\n totalTokens,\n query: request.query || '',\n });\n\n const metadata = {\n includedTasks: activeTasks,\n contextSources: contextItems.map((item) => `${item.type}:${item.id}`),\n totalTokens,\n relevanceScores,\n };\n\n logger.info('Assembled task-aware context', {\n activeTasks: activeTasks.length,\n blockedTasks: blockedTasks.length,\n contextItems: contextItems.length,\n totalTokens,\n assemblyTimeMs: Date.now() - startTime,\n });\n\n return { context, metadata };\n }\n\n /**\n * Get tasks that are currently active or should be in context\n */\n private getActiveTasks(taskFocus?: string[]): Task[] {\n let query = `\n SELECT * FROM tasks \n WHERE status IN ('in_progress', 'pending') \n `;\n let params: any[] = [];\n\n if (taskFocus && taskFocus.length > 0) {\n query += ` AND task_id IN (${taskFocus.map(() => '?').join(',')})`;\n params = taskFocus;\n }\n\n query += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows = this.db.prepare(query).all(...params) as any[];\n return this.hydrateTasks(rows);\n }\n\n private getBlockedTasks(): Task[] {\n const rows = this.db\n .prepare(\n `\n SELECT * FROM tasks WHERE status = 'blocked' ORDER BY priority DESC\n `\n )\n .all() as any[];\n return this.hydrateTasks(rows);\n }\n\n /**\n * Select context items relevant to active tasks\n */\n private selectRelevantContext(activeTasks: Task[], request: ContextRequest) {\n const contextItems: Array<{\n id: string;\n type: 'frame' | 'anchor' | 'event';\n content: string;\n relevanceScore: number;\n tokenEstimate: number;\n }> = [];\n\n // Get frames for active tasks\n const frameIds = [...new Set(activeTasks.map((t) => t.frame_id))];\n frameIds.forEach((frameId) => {\n const frame = this.frameManager.getFrame(frameId);\n if (frame) {\n const score = this.calculateFrameRelevance(\n frame,\n activeTasks,\n request.query\n );\n contextItems.push({\n id: frameId,\n type: 'frame',\n content: `Frame: ${frame.name} (${frame.type})`,\n relevanceScore: score,\n tokenEstimate: frame.name.length + 20,\n });\n }\n });\n\n // Get relevant anchors\n const anchors = this.getRelevantAnchors(frameIds, request);\n anchors.forEach((anchor) => {\n const score = this.calculateAnchorRelevance(\n anchor,\n activeTasks,\n request.query\n );\n contextItems.push({\n id: anchor.anchor_id,\n type: 'anchor',\n content: `${anchor.type}: ${anchor.text}`,\n relevanceScore: score,\n tokenEstimate: anchor.text.length + 10,\n });\n });\n\n // Get recent events from active frames\n if (request.includeHistory) {\n frameIds.forEach((frameId) => {\n const events = this.frameManager.getFrameEvents(frameId, 5);\n events.forEach((event) => {\n const score = this.calculateEventRelevance(\n event,\n activeTasks,\n request.query\n );\n if (score > 0.3) {\n contextItems.push({\n id: event.event_id,\n type: 'event',\n content: `Event: ${event.event_type}`,\n relevanceScore: score,\n tokenEstimate: 30,\n });\n }\n });\n });\n }\n\n // Sort by relevance score\n return contextItems.sort((a, b) => b.relevanceScore - a.relevanceScore);\n }\n\n private buildContextString(\n contextItems: any[],\n activeTasks: Task[],\n maxTokens: number\n ): {\n context: string;\n totalTokens: number;\n relevanceScores: Record<string, number>;\n } {\n let context = '# Active Task Context\\n\\n';\n let totalTokens = 20; // Header estimate\n const relevanceScores: Record<string, number> = {};\n\n // Always include active tasks summary\n context += '## Current Tasks\\n';\n activeTasks.forEach((task) => {\n const line = `- [${task.status.toUpperCase()}] ${task.name} (${task.priority})\\n`;\n context += line;\n totalTokens += line.length / 4; // Rough token estimate\n relevanceScores[task.task_id] = 1.0;\n });\n context += '\\n';\n\n // Add context items within token budget\n context += '## Relevant Context\\n';\n for (const item of contextItems) {\n if (totalTokens + item.tokenEstimate > maxTokens) break;\n\n context += `${item.content}\\n`;\n totalTokens += item.tokenEstimate;\n relevanceScores[item.id] = item.relevanceScore;\n }\n\n return { context, totalTokens, relevanceScores };\n }\n\n // Relevance scoring methods\n private calculateFrameRelevance(\n frame: Frame,\n activeTasks: Task[],\n query?: string\n ): number {\n let score = 0.5; // Base relevance\n\n // Higher score if frame contains active tasks\n if (activeTasks.some((t) => t.frame_id === frame.frame_id)) {\n score += 0.4;\n }\n\n // Query matching\n if (query) {\n const queryLower = query.toLowerCase();\n if (frame.name.toLowerCase().includes(queryLower)) {\n score += 0.3;\n }\n }\n\n // Recent frames get boost\n const ageHours = (Date.now() / 1000 - frame.created_at) / 3600;\n if (ageHours < 24) score += 0.2;\n\n return Math.min(score, 1.0);\n }\n\n private calculateAnchorRelevance(\n anchor: Anchor,\n activeTasks: Task[],\n query?: string\n ): number {\n let score = 0.3; // Base relevance\n\n // Task-related anchors get priority\n if (anchor.type === 'TODO') score += 0.4;\n if (anchor.type === 'DECISION') score += 0.3;\n if (anchor.type === 'CONSTRAINT') score += 0.2;\n\n // Priority-based boost\n score += (anchor.priority / 10) * 0.2;\n\n // Query matching\n if (query) {\n const queryLower = query.toLowerCase();\n if (anchor.text.toLowerCase().includes(queryLower)) {\n score += 0.3;\n }\n }\n\n return Math.min(score, 1.0);\n }\n\n private calculateEventRelevance(\n event: Event,\n _activeTasks: Task[],\n _query?: string\n ): number {\n let score = 0.1; // Base relevance\n\n // Event type relevance\n if (event.event_type === 'decision') score += 0.4;\n if (event.event_type === 'tool_call') score += 0.3;\n if (event.event_type === 'observation') score += 0.2;\n\n // Recent events get boost\n const ageHours = (Date.now() / 1000 - event.ts) / 3600;\n if (ageHours < 1) score += 0.3;\n else if (ageHours < 6) score += 0.2;\n\n return Math.min(score, 1.0);\n }\n\n // Helper methods\n private getTask(taskId: string): Task | undefined {\n const row = this.db\n .prepare(`SELECT * FROM tasks WHERE task_id = ?`)\n .get(taskId) as any;\n return row ? this.hydrateTask(row) : undefined;\n }\n\n private getRelevantAnchors(\n frameIds: string[],\n _request: ContextRequest\n ): Anchor[] {\n if (frameIds.length === 0) return [];\n\n const placeholders = frameIds.map(() => '?').join(',');\n const rows = this.db\n .prepare(\n `\n SELECT * FROM anchors \n WHERE frame_id IN (${placeholders})\n ORDER BY priority DESC, created_at DESC\n LIMIT 20\n `\n )\n .all(...frameIds) as any[];\n\n return rows.map((row) => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n }\n\n private hydrateTasks(rows: any[]): Task[] {\n return rows.map(this.hydrateTask);\n }\n\n private hydrateTask = (row: any): Task => ({\n ...row,\n depends_on: JSON.parse(row.depends_on || '[]'),\n context_tags: JSON.parse(row.context_tags || '[]'),\n metadata: JSON.parse(row.metadata || '{}'),\n });\n\n private logContextAccess(data: {\n taskIds: string[];\n contextItems: string[];\n relevanceScores: Record<string, number>;\n totalTokens: number;\n query: string;\n }) {\n const requestId = `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n\n this.db\n .prepare(\n `\n INSERT INTO context_access_log (\n request_id, task_ids, context_items, relevance_scores, total_tokens, query_hash\n ) VALUES (?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n requestId,\n JSON.stringify(data.taskIds),\n JSON.stringify(data.contextItems),\n JSON.stringify(data.relevanceScores),\n data.totalTokens,\n this.hashString(data.query)\n );\n }\n\n private hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(16);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/tui/simple-monitor.ts"],
4
- "sourcesContent": ["/**\n * Simple text-based swarm monitor for terminal compatibility\n * Fallback for terminals that can't handle blessed TUI\n */\n\nimport { SwarmRegistry } from '../../integrations/ralph/monitoring/swarm-registry.js';\nimport { execSync } from 'child_process';\n// Simple monitor for terminal compatibility\n\nexport class SimpleSwarmMonitor {\n private refreshInterval: NodeJS.Timeout | null = null;\n\n /**\n * Start simple text-based monitoring\n */\n start(): void {\n console.log('\uD83E\uDDBE Ralph Swarm Monitor (Text Mode)');\n console.log('=====================================');\n console.log('');\n console.log('Press Ctrl+C to quit');\n console.log('');\n\n // Show initial status\n this.displayStatus();\n\n // Set up refresh interval\n this.refreshInterval = setInterval(() => {\n this.displayStatus();\n }, 5000);\n\n // Handle graceful shutdown\n process.on('SIGINT', () => {\n this.stop();\n process.exit(0);\n });\n }\n\n /**\n * Stop monitoring\n */\n stop(): void {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n console.log('\\n\uD83D\uDC4B Swarm monitoring stopped');\n }\n\n /**\n * Display current status\n */\n private displayStatus(): void {\n const timestamp = new Date().toLocaleTimeString();\n\n console.log(`\\n\u23F0 ${timestamp} - Swarm Status Update`);\n console.log('\u2500'.repeat(50));\n\n try {\n // Check registry\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n const stats = registry.getStatistics();\n\n console.log(\n `\uD83D\uDCCA Registry Stats: ${stats.activeSwarms} active, ${stats.totalSwarms} total`\n );\n\n if (activeSwarms.length > 0) {\n console.log('\\n\uD83E\uDDBE Active Swarms:');\n for (const swarm of activeSwarms) {\n const uptime = this.formatDuration(Date.now() - swarm.startTime);\n console.log(\n ` \u2022 ${swarm.id.substring(0, 8)}: ${swarm.status} (${uptime})`\n );\n }\n } else {\n console.log('\u274C No active swarms in registry');\n }\n\n // Check for external processes\n try {\n const ralphProcesses = execSync(\n 'ps aux | grep \"ralph\" | grep -v grep',\n { encoding: 'utf8' }\n );\n if (ralphProcesses.trim()) {\n console.log('\\n\uD83D\uDD0D External Ralph Processes:');\n const processLines = ralphProcesses\n .split('\\n')\n .filter((line) => line.trim());\n processLines.slice(0, 3).forEach((line) => {\n const parts = line.split(/\\s+/);\n console.log(\n ` PID ${parts[1]}: ${parts.slice(10).join(' ').slice(0, 50)}...`\n );\n });\n if (processLines.length > 3) {\n console.log(` ... and ${processLines.length - 3} more processes`);\n }\n }\n } catch {\n // No external processes\n }\n\n // Show recent commits\n try {\n const recentCommits = execSync(\n 'git log --oneline --since=\"1 hour ago\" --pretty=format:\"%h %an %s\" | head -3',\n { encoding: 'utf8', cwd: process.cwd() }\n );\n\n if (recentCommits.trim()) {\n console.log('\\n\uD83D\uDCDD Recent Commits:');\n recentCommits\n .split('\\n')\n .filter((line) => line.trim())\n .forEach((line) => {\n console.log(` ${line}`);\n });\n }\n } catch {\n // No git or commits\n }\n } catch (error: unknown) {\n console.log(`\u274C Status error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Format duration string\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n }\n}\n\nexport default SimpleSwarmMonitor;\n"],
5
- "mappings": ";;;;AAKA,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAGlB,MAAM,mBAAmB;AAAA,EACtB,kBAAyC;AAAA;AAAA;AAAA;AAAA,EAKjD,QAAc;AACZ,YAAQ,IAAI,2CAAoC;AAChD,YAAQ,IAAI,uCAAuC;AACnD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,sBAAsB;AAClC,YAAQ,IAAI,EAAE;AAGd,SAAK,cAAc;AAGnB,SAAK,kBAAkB,YAAY,MAAM;AACvC,WAAK,cAAc;AAAA,IACrB,GAAG,GAAI;AAGP,YAAQ,GAAG,UAAU,MAAM;AACzB,WAAK,KAAK;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,KAAK,iBAAiB;AACxB,oBAAc,KAAK,eAAe;AAAA,IACpC;AACA,YAAQ,IAAI,sCAA+B;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAsB;AAC5B,UAAM,aAAY,oBAAI,KAAK,GAAE,mBAAmB;AAEhD,YAAQ,IAAI;AAAA,SAAO,SAAS,wBAAwB;AACpD,YAAQ,IAAI,SAAI,OAAO,EAAE,CAAC;AAE1B,QAAI;AAEF,YAAM,WAAW,cAAc,YAAY;AAC3C,YAAM,eAAe,SAAS,iBAAiB;AAC/C,YAAM,QAAQ,SAAS,cAAc;AAErC,cAAQ;AAAA,QACN,6BAAsB,MAAM,YAAY,YAAY,MAAM,WAAW;AAAA,MACvE;AAEA,UAAI,aAAa,SAAS,GAAG;AAC3B,gBAAQ,IAAI,4BAAqB;AACjC,mBAAW,SAAS,cAAc;AAChC,gBAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,MAAM,SAAS;AAC/D,kBAAQ;AAAA,YACN,aAAQ,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,MAAM,MAAM,KAAK,MAAM;AAAA,UAC9D;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,qCAAgC;AAAA,MAC9C;AAGA,UAAI;AACF,cAAM,iBAAiB;AAAA,UACrB;AAAA,UACA,EAAE,UAAU,OAAO;AAAA,QACrB;AACA,YAAI,eAAe,KAAK,GAAG;AACzB,kBAAQ,IAAI,uCAAgC;AAC5C,gBAAM,eAAe,eAClB,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAC/B,uBAAa,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,SAAS;AACzC,kBAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,oBAAQ;AAAA,cACN,UAAU,MAAM,CAAC,CAAC,KAAK,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,YAC/D;AAAA,UACF,CAAC;AACD,cAAI,aAAa,SAAS,GAAG;AAC3B,oBAAQ,IAAI,cAAc,aAAa,SAAS,CAAC,iBAAiB;AAAA,UACpE;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,UAAI;AACF,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA,EAAE,UAAU,QAAQ,KAAK,QAAQ,IAAI,EAAE;AAAA,QACzC;AAEA,YAAI,cAAc,KAAK,GAAG;AACxB,kBAAQ,IAAI,6BAAsB;AAClC,wBACG,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAC5B,QAAQ,CAAC,SAAS;AACjB,oBAAQ,IAAI,MAAM,IAAI,EAAE;AAAA,UAC1B,CAAC;AAAA,QACL;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,SAAS,OAAgB;AACvB,cAAQ,IAAI,wBAAoB,MAAgB,OAAO,EAAE;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,IAAoB;AACzC,UAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,UAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,UAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AAErC,QAAI,QAAQ,EAAG,QAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAC/C,QAAI,UAAU,EAAG,QAAO,GAAG,OAAO,KAAK,UAAU,EAAE;AACnD,WAAO,GAAG,OAAO;AAAA,EACnB;AACF;AAEA,IAAO,yBAAQ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/tui/swarm-monitor.ts"],
4
- "sourcesContent": ["/**\n * Real-time TUI for monitoring Ralph Swarm operations\n * Tracks commits, status, agents, and lines edited per agent\n */\n\nimport blessed from 'blessed';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { SwarmCoordinator } from '../../integrations/ralph/swarm/swarm-coordinator.js';\nimport { SwarmDashboard } from '../../integrations/ralph/monitoring/swarm-dashboard.js';\nimport { SwarmRegistry } from '../../integrations/ralph/monitoring/swarm-registry.js';\nimport { execSync } from 'child_process';\n\nexport interface SwarmCommitMetrics {\n agentId: string;\n role: string;\n commits: Array<{\n hash: string;\n message: string;\n timestamp: number;\n linesAdded: number;\n linesDeleted: number;\n filesChanged: number;\n }>;\n totalCommits: number;\n totalLinesAdded: number;\n totalLinesDeleted: number;\n lastActivity: number;\n}\n\nexport interface SwarmStatus {\n swarmId: string;\n status: 'active' | 'idle' | 'completed' | 'error';\n startTime: number;\n uptime: number;\n agents: Array<{\n id: string;\n role: string;\n status: string;\n currentTask?: string;\n iteration: number;\n lastActivity: number;\n }>;\n performance: {\n throughput: number;\n efficiency: number;\n totalTasks: number;\n completedTasks: number;\n };\n}\n\nexport class SwarmTUI {\n private screen: blessed.Widgets.Screen;\n private commitsTable: blessed.Widgets.TableElement;\n private statusBox: blessed.Widgets.BoxElement;\n private agentsTable: blessed.Widgets.TableElement;\n private metricsBox: blessed.Widgets.BoxElement;\n private logBox: blessed.Widgets.LogElement;\n\n private swarmCoordinator: SwarmCoordinator | null = null;\n private swarmDashboard: SwarmDashboard | null = null;\n private refreshInterval: NodeJS.Timeout | null = null;\n private commitMetrics: Map<string, SwarmCommitMetrics> = new Map();\n\n constructor() {\n // Detect terminal capabilities and set safe defaults\n const isGhostty =\n process.env.TERM_PROGRAM === 'ghostty' ||\n process.env.TERM?.includes('ghostty');\n const isBasicTerm =\n process.env.TERM === 'dumb' || process.env.TERM === 'unknown';\n\n this.screen = blessed.screen({\n smartCSR: !isGhostty, // Disable smart CSR for ghostty\n title: 'Ralph Swarm Monitor',\n terminal: isGhostty ? 'xterm-256color' : undefined,\n fullUnicode: !isBasicTerm,\n dockBorders: false,\n ignoreDockContrast: true,\n useBCE: false, // Disable background color erase for compatibility\n forceUnicode: false,\n debug: false,\n });\n\n // Add error handler for terminal issues\n this.screen.on('error', (err) => {\n logger.error('TUI screen error:', err);\n console.log(\n '\u26A0\uFE0F TUI display error detected. Try setting TERM=xterm-256color'\n );\n console.log(\n ' Alternative: Use stackmemory ralph status for text-based monitoring'\n );\n });\n\n this.createUI();\n this.setupKeyHandlers();\n\n logger.info('SwarmTUI initialized');\n }\n\n private createUI(): void {\n // Main layout container\n const container = blessed.box({\n parent: this.screen,\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n style: {\n bg: 'black',\n },\n });\n\n // Detect terminal capabilities for styling\n const isGhostty =\n process.env.TERM_PROGRAM === 'ghostty' ||\n process.env.TERM?.includes('ghostty');\n const safeColors = isGhostty;\n\n // Title bar\n blessed.box({\n parent: container,\n top: 0,\n left: 0,\n width: '100%',\n height: 3,\n content: '\uD83E\uDDBE Ralph Swarm Monitor - Real-time Swarm Operations',\n style: safeColors\n ? {\n fg: 'white',\n bold: false,\n }\n : {\n bg: 'blue',\n fg: 'white',\n bold: true,\n },\n border: {\n type: 'line',\n },\n });\n\n // Status box (top right)\n this.statusBox = blessed.box({\n parent: container,\n top: 3,\n left: '50%',\n width: '50%',\n height: 8,\n label: ' Swarm Status ',\n content: 'No active swarm',\n style: {\n bg: 'black',\n fg: 'white',\n },\n border: {\n type: 'line',\n fg: 'cyan',\n },\n });\n\n // Metrics box (top left)\n this.metricsBox = blessed.box({\n parent: container,\n top: 3,\n left: 0,\n width: '50%',\n height: 8,\n label: ' Performance Metrics ',\n content: 'Waiting for data...',\n style: {\n bg: 'black',\n fg: 'white',\n },\n border: {\n type: 'line',\n fg: 'green',\n },\n });\n\n // Agents table (middle left)\n this.agentsTable = blessed.table({\n parent: container,\n top: 11,\n left: 0,\n width: '50%',\n height: 12,\n label: ' Active Agents ',\n style: {\n bg: 'black',\n fg: 'white',\n header: {\n bg: 'blue',\n fg: 'white',\n bold: true,\n },\n cell: {\n selected: {\n bg: 'blue',\n fg: 'white',\n },\n },\n },\n border: {\n type: 'line',\n fg: 'yellow',\n },\n data: [['Role', 'Status', 'Iteration', 'Task', 'Last Active']],\n });\n\n // Commits table (middle right)\n this.commitsTable = blessed.table({\n parent: container,\n top: 11,\n left: '50%',\n width: '50%',\n height: 12,\n label: ' Recent Commits ',\n style: {\n bg: 'black',\n fg: 'white',\n header: {\n bg: 'blue',\n fg: 'white',\n bold: true,\n },\n cell: {\n selected: {\n bg: 'blue',\n fg: 'white',\n },\n },\n },\n border: {\n type: 'line',\n fg: 'magenta',\n },\n data: [['Agent', 'Message', 'Lines +/-', 'Time']],\n });\n\n // Log output (bottom)\n this.logBox = blessed.log({\n parent: container,\n top: 23,\n left: 0,\n width: '100%',\n height: '100%-23',\n label: ' Swarm Logs ',\n style: {\n bg: 'black',\n fg: 'white',\n },\n border: {\n type: 'line',\n fg: 'white',\n },\n scrollable: true,\n alwaysScroll: true,\n mouse: true,\n });\n\n // Help text\n blessed.box({\n parent: container,\n bottom: 0,\n left: 0,\n width: '100%',\n height: 1,\n content:\n 'q=quit | r=refresh | s=start swarm | t=stop swarm | h=help | c=clear logs | d=detect swarms',\n style: {\n bg: 'white',\n fg: 'black',\n },\n });\n }\n\n private setupKeyHandlers(): void {\n this.screen.key(['escape', 'q', 'C-c'], () => {\n this.cleanup();\n process.exit(0);\n });\n\n this.screen.key(['r'], () => {\n this.refreshData();\n this.logBox.log('Manual refresh triggered');\n });\n\n this.screen.key(['s'], () => {\n this.startSwarmInteractive();\n });\n\n this.screen.key(['t'], () => {\n this.stopSwarmInteractive();\n });\n\n this.screen.key(['h'], () => {\n this.showHelp();\n });\n\n this.screen.key(['c'], () => {\n this.clearLogs();\n });\n\n this.screen.key(['d'], () => {\n this.showDetectedSwarms();\n });\n }\n\n /**\n * Initialize swarm monitoring\n */\n async initialize(\n swarmCoordinator?: SwarmCoordinator,\n swarmId?: string\n ): Promise<void> {\n try {\n // Connect to existing swarm if ID provided\n if (swarmId) {\n const registry = SwarmRegistry.getInstance();\n const swarm = registry.getSwarm(swarmId);\n if (swarm) {\n this.swarmCoordinator = swarm.coordinator;\n this.logBox.log(`Connected to swarm: ${swarmId}`);\n } else {\n this.logBox.log(`Swarm not found: ${swarmId}`);\n }\n } else if (swarmCoordinator) {\n this.swarmCoordinator = swarmCoordinator;\n } else {\n // Auto-detect active swarms\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n if (activeSwarms.length > 0) {\n this.swarmCoordinator = activeSwarms[0].coordinator;\n this.logBox.log(`Auto-connected to swarm: ${activeSwarms[0].id}`);\n }\n }\n\n if (this.swarmCoordinator) {\n this.swarmDashboard = new SwarmDashboard(this.swarmCoordinator);\n this.swarmDashboard.startMonitoring(2000); // 2 second refresh\n\n // Listen to swarm events\n this.swarmDashboard.on('metricsUpdated', (metrics) => {\n this.updateUI(metrics);\n });\n }\n\n // Start refresh interval\n this.refreshInterval = setInterval(() => {\n this.refreshData();\n }, 3000);\n\n this.logBox.log('SwarmTUI monitoring initialized');\n } catch (error: unknown) {\n logger.error('Failed to initialize SwarmTUI', error as Error);\n this.logBox.log(`Error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Start the TUI display\n */\n start(): void {\n this.screen.render();\n this.logBox.log('Ralph Swarm Monitor started');\n this.logBox.log('Monitoring for active swarms...');\n }\n\n /**\n * Refresh all data\n */\n private async refreshData(): Promise<void> {\n try {\n // Update commit metrics\n await this.updateCommitMetrics();\n\n // Update swarm status if coordinator available\n if (this.swarmCoordinator) {\n const status = this.getSwarmStatus();\n this.updateStatusDisplay(status);\n } else {\n // Try to detect active swarms\n await this.detectActiveSwarms();\n }\n\n this.screen.render();\n } catch (error: unknown) {\n logger.error('Failed to refresh TUI data', error as Error);\n this.logBox.log(`Refresh error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Update commit metrics for all agents\n */\n private async updateCommitMetrics(): Promise<void> {\n try {\n // Get recent commits from git log\n const gitLog = execSync(\n 'git log --oneline --since=\"1 hour ago\" --pretty=format:\"%H|%an|%s|%ct\" --numstat',\n { encoding: 'utf8', cwd: process.cwd() }\n );\n\n const commits = this.parseGitCommits(gitLog);\n this.updateCommitsTable(commits);\n } catch {\n // Git might fail if no commits, that's okay\n this.logBox.log('No recent commits found');\n }\n }\n\n /**\n * Parse git log output into commit data\n */\n private parseGitCommits(gitLog: string): Array<{\n hash: string;\n agent: string;\n message: string;\n timestamp: number;\n linesAdded: number;\n linesDeleted: number;\n }> {\n const commits = [];\n const lines = gitLog.split('\\n').filter(Boolean);\n\n let currentCommit: any = null;\n\n for (const line of lines) {\n if (line.includes('|')) {\n // Commit info line\n const [hash, author, message, timestamp] = line.split('|');\n currentCommit = {\n hash: hash.substring(0, 8),\n agent: this.extractAgentFromAuthor(author),\n message: message.substring(0, 50),\n timestamp: parseInt(timestamp),\n linesAdded: 0,\n linesDeleted: 0,\n };\n } else if (currentCommit && line.match(/^\\d+\\s+\\d+/)) {\n // Stat line (added/deleted)\n const [added, deleted] = line.split('\\t')[0].split(' ');\n currentCommit.linesAdded += parseInt(added) || 0;\n currentCommit.linesDeleted += parseInt(deleted) || 0;\n\n commits.push({ ...currentCommit });\n currentCommit = null;\n }\n }\n\n return commits.slice(0, 10); // Show last 10 commits\n }\n\n /**\n * Extract agent info from git author\n */\n private extractAgentFromAuthor(author: string): string {\n // Look for [agent_role] pattern in commit author or message\n const agentMatch = author.match(/\\[(\\w+)\\]/);\n if (agentMatch) {\n return agentMatch[1];\n }\n\n // Fallback to checking if author contains known agent roles\n const roles = [\n 'developer',\n 'tester',\n 'optimizer',\n 'documenter',\n 'architect',\n ];\n for (const role of roles) {\n if (author.toLowerCase().includes(role)) {\n return role;\n }\n }\n\n return 'user';\n }\n\n /**\n * Update commits table display\n */\n private updateCommitsTable(commits: any[]): void {\n const tableData = [['Agent', 'Message', 'Lines +/-', 'Time']];\n\n for (const commit of commits) {\n const timeAgo = this.formatTimeAgo(commit.timestamp * 1000);\n const linesChange = `+${commit.linesAdded}/-${commit.linesDeleted}`;\n\n tableData.push([commit.agent, commit.message, linesChange, timeAgo]);\n }\n\n this.commitsTable.setData(tableData);\n }\n\n /**\n * Get current swarm status\n */\n private getSwarmStatus(): SwarmStatus | null {\n if (!this.swarmCoordinator) return null;\n\n const usage = this.swarmCoordinator.getResourceUsage();\n const swarmState = (this.swarmCoordinator as any).swarmState;\n\n if (!swarmState) return null;\n\n return {\n swarmId: swarmState.id,\n status: swarmState.status,\n startTime: swarmState.startTime,\n uptime: Date.now() - swarmState.startTime,\n agents: usage.activeAgents\n ? Array.from(\n (this.swarmCoordinator as any).activeAgents?.values() || []\n ).map((agent: any) => ({\n id: agent.id,\n role: agent.role,\n status: agent.status,\n currentTask: agent.currentTask,\n iteration: agent.performance?.tasksCompleted || 0,\n lastActivity: agent.performance?.lastFreshStart || Date.now(),\n }))\n : [],\n performance: {\n throughput: swarmState.performance?.throughput || 0,\n efficiency: swarmState.performance?.efficiency || 0,\n totalTasks: swarmState.totalTaskCount || 0,\n completedTasks: swarmState.completedTaskCount || 0,\n },\n };\n }\n\n /**\n * Update status display\n */\n private updateStatusDisplay(status: SwarmStatus | null): void {\n if (!status) {\n this.statusBox.setContent('No active swarm detected');\n this.agentsTable.setData([\n ['Role', 'Status', 'Iteration', 'Task', 'Last Active'],\n ]);\n this.metricsBox.setContent('Waiting for swarm data...');\n return;\n }\n\n // Update status box\n const uptimeStr = this.formatDuration(status.uptime);\n const statusContent = `Swarm: ${status.swarmId.substring(0, 8)}\nStatus: ${status.status.toUpperCase()}\nUptime: ${uptimeStr}\nAgents: ${status.agents.length}`;\n\n this.statusBox.setContent(statusContent);\n\n // Update agents table\n const agentData = [['Role', 'Status', 'Iteration', 'Task', 'Last Active']];\n for (const agent of status.agents) {\n const lastActivity = this.formatTimeAgo(agent.lastActivity);\n const task = agent.currentTask\n ? agent.currentTask.substring(0, 20)\n : 'idle';\n\n agentData.push([\n agent.role,\n agent.status,\n agent.iteration.toString(),\n task,\n lastActivity,\n ]);\n }\n this.agentsTable.setData(agentData);\n\n // Update metrics box\n const metricsContent = `Throughput: ${status.performance.throughput.toFixed(2)} tasks/min\nEfficiency: ${(status.performance.efficiency * 100).toFixed(1)}%\nTasks: ${status.performance.completedTasks}/${status.performance.totalTasks}\nSuccess Rate: ${status.performance.efficiency > 0 ? (status.performance.efficiency * 100).toFixed(1) : 'N/A'}%`;\n\n this.metricsBox.setContent(metricsContent);\n }\n\n /**\n * Update UI with metrics from dashboard\n */\n private updateUI(metrics: any): void {\n this.logBox.log(\n `Metrics updated: ${metrics.status} - ${metrics.activeAgents} agents`\n );\n }\n\n /**\n * Detect active swarms in the system\n */\n private async detectActiveSwarms(): Promise<void> {\n try {\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n const stats = registry.getStatistics();\n\n if (activeSwarms.length > 0) {\n let statusContent = `Available Swarms (${activeSwarms.length}):\\n`;\n for (const swarm of activeSwarms.slice(0, 3)) {\n const uptime = this.formatDuration(Date.now() - swarm.startTime);\n statusContent += `\u2022 ${swarm.id.substring(0, 8)}: ${swarm.status} (${uptime})\\n`;\n }\n if (activeSwarms.length > 3) {\n statusContent += `... and ${activeSwarms.length - 3} more`;\n }\n this.statusBox.setContent(statusContent);\n this.logBox.log(\n `Found ${activeSwarms.length} active swarms in registry`\n );\n } else {\n // Check for Ralph processes as fallback\n const ralphProcesses = execSync(\n 'ps aux | grep \"ralph\" | grep -v grep',\n { encoding: 'utf8' }\n );\n\n if (ralphProcesses.trim()) {\n this.logBox.log('Detected Ralph processes running');\n this.statusBox.setContent(\n 'External Ralph processes detected\\n(Use swarm coordinator for full monitoring)'\n );\n } else {\n this.statusBox.setContent(`No active swarms detected\nTotal swarms: ${stats.totalSwarms}\nCompleted: ${stats.completedSwarms}\n\nRun: stackmemory ralph swarm <task>`);\n }\n }\n } catch {\n // No processes found, that's fine\n }\n }\n\n /**\n * Format time ago string\n */\n private formatTimeAgo(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n }\n\n /**\n * Format duration string\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n }\n\n /**\n * Start swarm interactively\n */\n private startSwarmInteractive(): void {\n this.logBox.log('\uD83D\uDE80 Start Swarm Interactive Mode:');\n this.logBox.log(\n 'Example: stackmemory ralph swarm \"Implement feature\" --agents developer,tester'\n );\n this.logBox.log(\n 'Tip: Run the command in another terminal, then press \"d\" to detect it'\n );\n }\n\n /**\n * Stop swarm interactively\n */\n private stopSwarmInteractive(): void {\n if (this.swarmCoordinator) {\n this.logBox.log('\uD83D\uDED1 Stopping current swarm...');\n // In a real implementation, we'd call swarmCoordinator.stop()\n this.logBox.log(\n 'Note: Swarm stopping not yet implemented - use Ctrl+C in swarm terminal'\n );\n } else {\n this.logBox.log('\u274C No active swarm coordinator to stop');\n this.logBox.log('External Ralph processes must be stopped manually');\n }\n }\n\n /**\n * Show help dialog\n */\n private showHelp(): void {\n this.logBox.log('\uD83E\uDDBE Ralph Swarm Monitor - Help');\n this.logBox.log('');\n this.logBox.log('Keyboard Shortcuts:');\n this.logBox.log(' q, Esc, Ctrl+C - Quit TUI');\n this.logBox.log(' r - Refresh data manually');\n this.logBox.log(' s - Show start swarm commands');\n this.logBox.log(' t - Stop current swarm');\n this.logBox.log(' h - Show this help');\n this.logBox.log(' c - Clear log output');\n this.logBox.log(' d - Detect and list available swarms');\n this.logBox.log('');\n this.logBox.log('Usage:');\n this.logBox.log(\n ' stackmemory ralph tui # Auto-detect swarms'\n );\n this.logBox.log(\n ' stackmemory ralph tui --swarm-id <id> # Monitor specific swarm'\n );\n this.logBox.log('');\n this.logBox.log('Starting Swarms:');\n this.logBox.log(\n ' stackmemory ralph swarm \"Task description\" --agents developer,tester'\n );\n this.logBox.log('');\n }\n\n /**\n * Clear log output\n */\n private clearLogs(): void {\n this.logBox.setContent('');\n this.logBox.log('\uD83D\uDCDD Logs cleared - monitoring continues...');\n }\n\n /**\n * Show detected swarms\n */\n private async showDetectedSwarms(): Promise<void> {\n this.logBox.log('\uD83D\uDD0D Detecting active swarms...');\n\n try {\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n const stats = registry.getStatistics();\n\n this.logBox.log('');\n this.logBox.log('\uD83D\uDCCA Swarm Registry Status:');\n this.logBox.log(` Total swarms: ${stats.totalSwarms}`);\n this.logBox.log(` Active swarms: ${stats.activeSwarms}`);\n this.logBox.log(` Completed swarms: ${stats.completedSwarms}`);\n\n if (activeSwarms.length > 0) {\n this.logBox.log('');\n this.logBox.log('\uD83E\uDDBE Active Swarms:');\n\n for (const swarm of activeSwarms) {\n const uptime = this.formatDuration(Date.now() - swarm.startTime);\n this.logBox.log(` \u2022 ${swarm.id}: ${swarm.description} (${uptime})`);\n }\n\n this.logBox.log('');\n this.logBox.log('\uD83D\uDCA1 Use --swarm-id to connect to specific swarm');\n } else {\n this.logBox.log('');\n this.logBox.log('\u274C No active swarms in registry');\n\n // Check for external processes\n try {\n const ralphProcesses = execSync(\n 'ps aux | grep \"ralph\" | grep -v grep',\n { encoding: 'utf8' }\n );\n if (ralphProcesses.trim()) {\n this.logBox.log('\uD83D\uDD0D External Ralph processes detected:');\n ralphProcesses\n .split('\\n')\n .filter((line) => line.trim())\n .forEach((line) => {\n const parts = line.split(/\\s+/);\n this.logBox.log(\n ` PID ${parts[1]}: ${parts.slice(10).join(' ').slice(0, 60)}`\n );\n });\n }\n } catch {\n this.logBox.log('\uD83D\uDD0D No external Ralph processes found');\n }\n\n this.logBox.log('');\n this.logBox.log(\n '\uD83D\uDCA1 Start a swarm: stackmemory ralph swarm \"Task\" --agents developer'\n );\n }\n } catch (error: unknown) {\n this.logBox.log(`\u274C Detection failed: ${(error as Error).message}`);\n }\n }\n\n /**\n * Cleanup resources\n */\n private cleanup(): void {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n\n if (this.swarmDashboard) {\n this.swarmDashboard.stopMonitoring();\n }\n\n logger.info('SwarmTUI cleaned up');\n }\n}\n\nexport default SwarmTUI;\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/features/web/client/stores/task-store.ts"],
4
- "sourcesContent": ["import { create } from 'zustand';\n\nexport interface Task {\n id: string;\n identifier: string;\n title: string;\n description?: string;\n state: string;\n priority?: number;\n estimate?: number;\n assignee?: string;\n createdAt: string;\n updatedAt: string;\n lastSyncedAt?: string;\n syncStatus?: string;\n}\n\ninterface TaskStore {\n tasks: Task[];\n setTasks: (tasks: Task[]) => void;\n addTask: (task: Task) => void;\n updateTask: (id: string, updates: Partial<Task>) => void;\n removeTask: (id: string) => void;\n getTaskById: (id: string) => Task | undefined;\n getTasksByState: (state: string) => Task[];\n}\n\nexport const useTaskStore = create<TaskStore>((set, get) => ({\n tasks: [],\n\n setTasks: (tasks) => set({ tasks }),\n\n addTask: (task) =>\n set((state) => ({\n tasks: [...state.tasks, task],\n })),\n\n updateTask: (id, updates) =>\n set((state) => ({\n tasks: state.tasks.map((task: any) =>\n task.id === id ? { ...task, ...updates } : task\n ),\n })),\n\n removeTask: (id) =>\n set((state) => ({\n tasks: state.tasks.filter((task: any) => task.id !== id),\n })),\n\n getTaskById: (id) => get().tasks.find((task: any) => task.id === id),\n\n getTasksByState: (state) =>\n get().tasks.filter((task: any) => task.state === state),\n}));\n"],
5
- "mappings": ";;;;AAAA,SAAS,cAAc;AA2BhB,MAAM,eAAe,OAAkB,CAAC,KAAK,SAAS;AAAA,EAC3D,OAAO,CAAC;AAAA,EAER,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,EAElC,SAAS,CAAC,SACR,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,CAAC,GAAG,MAAM,OAAO,IAAI;AAAA,EAC9B,EAAE;AAAA,EAEJ,YAAY,CAAC,IAAI,YACf,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,MAAM,MAAM;AAAA,MAAI,CAAC,SACtB,KAAK,OAAO,KAAK,EAAE,GAAG,MAAM,GAAG,QAAQ,IAAI;AAAA,IAC7C;AAAA,EACF,EAAE;AAAA,EAEJ,YAAY,CAAC,OACX,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,MAAM,MAAM,OAAO,CAAC,SAAc,KAAK,OAAO,EAAE;AAAA,EACzD,EAAE;AAAA,EAEJ,aAAa,CAAC,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,SAAc,KAAK,OAAO,EAAE;AAAA,EAEnE,iBAAiB,CAAC,UAChB,IAAI,EAAE,MAAM,OAAO,CAAC,SAAc,KAAK,UAAU,KAAK;AAC1D,EAAE;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/features/web/server/index.ts"],
4
- "sourcesContent": ["/**\n * StackMemory Web Dashboard Server\n * Express + Socket.io server for real-time dashboard\n */\n\nimport express from 'express';\nimport { createServer } from 'http';\nimport { Server as SocketServer } from 'socket.io';\nimport cors from 'cors';\nimport { LinearTaskReader } from '../../tui/services/linear-task-reader.js';\nimport { SessionManager } from '../../../core/session/session-manager.js';\nimport { FrameManager } from '../../../core/context/index.js';\nimport Database from 'better-sqlite3';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\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\nconst app = express();\nconst httpServer = createServer(app);\nconst io = new SocketServer(httpServer, {\n cors: {\n origin: process.env['CLIENT_URL'] || 'http://localhost:3000',\n methods: ['GET', 'POST'],\n },\n});\n\n// Middleware\napp.use(cors());\napp.use(express.json());\n\n// Data services\nlet taskReader: LinearTaskReader;\nlet sessionManager: SessionManager;\nlet frameManager: FrameManager | null = null;\nlet db: Database.Database | null = null;\n\n// Initialize services\nfunction initializeServices() {\n console.log('\uD83D\uDE80 Initializing StackMemory Web Server...');\n\n // Initialize task reader\n taskReader = new LinearTaskReader(process.cwd());\n console.log(\n `\uD83D\uDCCB TaskReader initialized with ${taskReader.getTasks().length} tasks`\n );\n\n // Initialize session manager\n sessionManager = new SessionManager({ enableMonitoring: true });\n console.log('\uD83D\uDCCA SessionManager initialized');\n\n // Initialize database and frame manager\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n if (existsSync(dbPath)) {\n try {\n db = new Database(dbPath);\n frameManager = new FrameManager(db, 'web');\n console.log('\uD83D\uDCBE Database and FrameManager initialized');\n } catch (error: unknown) {\n console.error('\u274C Failed to initialize database:', error);\n }\n }\n}\n\n// REST API Routes\napp.get('/api/health', (req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\napp.get('/api/tasks', (req, res) => {\n try {\n const tasks = taskReader.getTasks();\n res.json({ tasks, total: tasks.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch tasks' });\n }\n});\n\napp.get('/api/tasks/active', (req, res) => {\n try {\n const tasks = taskReader.getActiveTasks();\n res.json({ tasks, total: tasks.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch active tasks' });\n }\n});\n\napp.get('/api/tasks/by-state/:state', (req, res) => {\n try {\n const tasks = taskReader.getTasksByState(req.params.state);\n res.json({ tasks, total: tasks.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch tasks by state' });\n }\n});\n\napp.get('/api/sessions', (req, res) => {\n try {\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n res.json({ sessions, total: sessions.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch sessions' });\n }\n});\n\napp.get('/api/frames', (req, res) => {\n try {\n if (!frameManager) {\n res.json({ frames: [], total: 0 });\n return;\n }\n const frames = frameManager.getAllFrames();\n res.json({ frames, total: frames.length });\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch frames' });\n }\n});\n\napp.get('/api/analytics', (req, res) => {\n try {\n const tasks = taskReader.getTasks();\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n const frames = frameManager?.getAllFrames() || [];\n\n // Calculate analytics\n const analytics = {\n summary: {\n totalTasks: tasks.length,\n activeTasks: tasks.filter((t: any) => t.state === 'In Progress').length,\n completedTasks: tasks.filter((t: any) => t.state === 'Done').length,\n totalSessions: sessions.length,\n totalFrames: frames.length,\n },\n tasksByState: tasks.reduce(\n (acc, task) => {\n acc[task.state] = (acc[task.state] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n ),\n tasksByPriority: tasks.reduce(\n (acc, task) => {\n const priority = task.priority || 4;\n acc[priority] = (acc[priority] || 0) + 1;\n return acc;\n },\n {} as Record<number, number>\n ),\n recentActivity: {\n tasksUpdatedToday: tasks.filter((t: any) => {\n const updated = new Date(t.updatedAt);\n const today = new Date();\n return updated.toDateString() === today.toDateString();\n }).length,\n sessionsToday: sessions.filter((s: any) => {\n const started = new Date(s.startTime);\n const today = new Date();\n return started.toDateString() === today.toDateString();\n }).length,\n },\n };\n\n res.json(analytics);\n } catch (error: unknown) {\n res.status(500).json({ error: 'Failed to fetch analytics' });\n }\n});\n\n// WebSocket handling\nio.on('connection', (socket) => {\n console.log('\uD83D\uDC64 Client connected:', socket.id);\n\n // Send initial data\n socket.emit('initial-data', {\n tasks: taskReader.getTasks(),\n sessions: sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [],\n frames: frameManager?.getAllFrames() || [],\n });\n\n // Handle client requests\n socket.on('refresh-tasks', () => {\n socket.emit('tasks:update', taskReader.getTasks());\n });\n\n socket.on('refresh-sessions', () => {\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n socket.emit('sessions:update', sessions);\n });\n\n socket.on('refresh-frames', () => {\n socket.emit('frames:update', frameManager?.getAllFrames() || []);\n });\n\n socket.on('disconnect', () => {\n console.log('\uD83D\uDC4B Client disconnected:', socket.id);\n });\n});\n\n// Periodic updates (every 5 seconds)\nsetInterval(() => {\n try {\n io.emit('tasks:update', taskReader.getTasks());\n // SessionManager might not have getActiveSessions yet\n const sessions = sessionManager?.getActiveSessions\n ? sessionManager.getActiveSessions()\n : [];\n io.emit('sessions:update', sessions);\n io.emit('frames:update', frameManager?.getAllFrames() || []);\n } catch (error: unknown) {\n console.error('Error in periodic update:', error);\n }\n}, 5000);\n\n// Start server\nconst PORT = process.env['WS_PORT'] || 8080;\n\ninitializeServices();\n\nhttpServer.listen(PORT, () => {\n console.log(`\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 StackMemory Web Dashboard Server \u2551\n\u2551 Running on http://localhost:${PORT} \u2551\n\u2551 WebSocket: ws://localhost:${PORT} \u2551\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n `);\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/workers/tmux-manager.ts"],
4
- "sourcesContent": ["/**\n * Tmux Manager\n *\n * Creates and manages tmux sessions for parallel Claude workers.\n * Each pane runs an isolated claude-sm instance.\n */\n\nimport { execSync } from 'child_process';\n\nexport function isTmuxAvailable(): boolean {\n try {\n execSync('which tmux', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createTmuxSession(name: string, paneCount: number): void {\n // Create a detached session with the first pane\n execSync(`tmux new-session -d -s ${name}`, { stdio: 'ignore' });\n\n // Add remaining panes\n for (let i = 1; i < paneCount; i++) {\n execSync(`tmux split-window -t ${name}`, { stdio: 'ignore' });\n // Rebalance after each split to prevent \"no space\" errors\n execSync(`tmux select-layout -t ${name} tiled`, { stdio: 'ignore' });\n }\n\n // Final tiled layout\n execSync(`tmux select-layout -t ${name} tiled`, { stdio: 'ignore' });\n}\n\nexport function sendToPane(\n session: string,\n pane: string,\n command: string\n): void {\n execSync(\n `tmux send-keys -t ${session}:${pane} ${shellEscape(command)} Enter`,\n {\n stdio: 'ignore',\n }\n );\n}\n\nexport function killTmuxSession(name: string): void {\n execSync(`tmux kill-session -t ${name}`, { stdio: 'ignore' });\n}\n\nexport function attachToSession(name: string): void {\n execSync(`tmux attach-session -t ${name}`, { stdio: 'inherit' });\n}\n\nexport function listPanes(session: string): string[] {\n try {\n const output = execSync(\n `tmux list-panes -t ${session} -F \"#{pane_index}\"`,\n { encoding: 'utf-8' }\n );\n return output.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function sendCtrlC(session: string, pane: string): void {\n execSync(`tmux send-keys -t ${session}:${pane} C-c`, { stdio: 'ignore' });\n}\n\nexport function sessionExists(name: string): boolean {\n try {\n execSync(`tmux has-session -t ${name}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellEscape(cmd: string): string {\n // Wrap in single quotes, escaping existing single quotes\n return \"'\" + cmd.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n"],
5
- "mappings": ";;;;AAOA,SAAS,gBAAgB;AAElB,SAAS,kBAA2B;AACzC,MAAI;AACF,aAAS,cAAc,EAAE,OAAO,SAAS,CAAC;AAC1C,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,MAAc,WAAyB;AAEvE,WAAS,0BAA0B,IAAI,IAAI,EAAE,OAAO,SAAS,CAAC;AAG9D,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,aAAS,wBAAwB,IAAI,IAAI,EAAE,OAAO,SAAS,CAAC;AAE5D,aAAS,yBAAyB,IAAI,UAAU,EAAE,OAAO,SAAS,CAAC;AAAA,EACrE;AAGA,WAAS,yBAAyB,IAAI,UAAU,EAAE,OAAO,SAAS,CAAC;AACrE;AAEO,SAAS,WACd,SACA,MACA,SACM;AACN;AAAA,IACE,qBAAqB,OAAO,IAAI,IAAI,IAAI,YAAY,OAAO,CAAC;AAAA,IAC5D;AAAA,MACE,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,MAAoB;AAClD,WAAS,wBAAwB,IAAI,IAAI,EAAE,OAAO,SAAS,CAAC;AAC9D;AAEO,SAAS,gBAAgB,MAAoB;AAClD,WAAS,0BAA0B,IAAI,IAAI,EAAE,OAAO,UAAU,CAAC;AACjE;AAEO,SAAS,UAAU,SAA2B;AACnD,MAAI;AACF,UAAM,SAAS;AAAA,MACb,sBAAsB,OAAO;AAAA,MAC7B,EAAE,UAAU,QAAQ;AAAA,IACtB;AACA,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,UAAU,SAAiB,MAAoB;AAC7D,WAAS,qBAAqB,OAAO,IAAI,IAAI,QAAQ,EAAE,OAAO,SAAS,CAAC;AAC1E;AAEO,SAAS,cAAc,MAAuB;AACnD,MAAI;AACF,aAAS,uBAAuB,IAAI,IAAI,EAAE,OAAO,SAAS,CAAC;AAC3D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,KAAqB;AAExC,SAAO,MAAM,IAAI,QAAQ,MAAM,OAAO,IAAI;AAC5C;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/features/workers/worker-registry.ts"],
4
- "sourcesContent": ["/**\n * Worker Registry\n *\n * Tracks parallel Claude worker sessions spawned via tmux.\n * Each worker gets an isolated state directory for Sweep predictions.\n */\n\nimport { join } from 'path';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync } from 'fs';\nimport { homedir } from 'os';\n\nfunction workersDir(): string {\n return join(homedir(), '.stackmemory', 'workers');\n}\n\nfunction registryFile(): string {\n return join(workersDir(), 'registry.json');\n}\n\nexport interface WorkerEntry {\n id: string;\n pane: string;\n pid?: number;\n task?: string;\n cwd: string;\n startedAt: string;\n stateDir: string;\n}\n\nexport interface WorkerSession {\n sessionName: string;\n workers: WorkerEntry[];\n createdAt: string;\n}\n\nexport function ensureWorkerStateDir(workerId: string): string {\n const dir = join(workersDir(), workerId);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return dir;\n}\n\nexport function saveRegistry(session: WorkerSession): void {\n const dir = workersDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(registryFile(), JSON.stringify(session, null, 2));\n}\n\nexport function loadRegistry(): WorkerSession | null {\n if (!existsSync(registryFile())) return null;\n try {\n return JSON.parse(readFileSync(registryFile(), 'utf-8')) as WorkerSession;\n } catch {\n return null;\n }\n}\n\nexport function clearRegistry(): void {\n const file = registryFile();\n if (existsSync(file)) {\n rmSync(file, { force: true });\n }\n}\n\nexport function getWorkersDir(): string {\n return workersDir();\n}\n"],
5
- "mappings": ";;;;AAOA,SAAS,YAAY;AACrB,SAAS,YAAY,WAAW,cAAc,eAAe,cAAc;AAC3E,SAAS,eAAe;AAExB,SAAS,aAAqB;AAC5B,SAAO,KAAK,QAAQ,GAAG,gBAAgB,SAAS;AAClD;AAEA,SAAS,eAAuB;AAC9B,SAAO,KAAK,WAAW,GAAG,eAAe;AAC3C;AAkBO,SAAS,qBAAqB,UAA0B;AAC7D,QAAM,MAAM,KAAK,WAAW,GAAG,QAAQ;AACvC,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,SAAO;AACT;AAEO,SAAS,aAAa,SAA8B;AACzD,QAAM,MAAM,WAAW;AACvB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,gBAAc,aAAa,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAChE;AAEO,SAAS,eAAqC;AACnD,MAAI,CAAC,WAAW,aAAa,CAAC,EAAG,QAAO;AACxC,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,aAAa,GAAG,OAAO,CAAC;AAAA,EACzD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAsB;AACpC,QAAM,OAAO,aAAa;AAC1B,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EAC9B;AACF;AAEO,SAAS,gBAAwB;AACtC,SAAO,WAAW;AACpB;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/hooks/auto-background.ts"],
4
- "sourcesContent": ["/**\n * Auto-background hook for Claude Code\n * Automatically backgrounds long-running or specific commands\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { writeFileSecure, ensureSecureDir } from './secure-fs.js';\nimport { AutoBackgroundConfigSchema, parseConfigSafe } from './schemas.js';\n\nexport interface AutoBackgroundConfig {\n enabled: boolean;\n // Time-based: background if command runs longer than this (ms)\n timeoutMs: number;\n // Pattern-based: always background these commands\n alwaysBackground: string[];\n // Never background these (override)\n neverBackground: string[];\n // Log backgrounded commands\n verbose: boolean;\n}\n\nconst DEFAULT_CONFIG: AutoBackgroundConfig = {\n enabled: true,\n timeoutMs: 5000, // 5 seconds\n alwaysBackground: [\n // Package managers\n 'npm install',\n 'npm ci',\n 'yarn install',\n 'pnpm install',\n 'bun install',\n // Builds\n 'npm run build',\n 'yarn build',\n 'pnpm build',\n 'cargo build',\n 'go build',\n 'make',\n 'cmake',\n // Tests\n 'npm test',\n 'npm run test',\n 'yarn test',\n 'pnpm test',\n 'pytest',\n 'jest',\n 'vitest',\n 'cargo test',\n 'go test',\n // Docker\n 'docker build',\n 'docker-compose up',\n 'docker compose up',\n // Git operations that can be slow\n 'git clone',\n 'git fetch --all',\n 'git pull --all',\n // Type checking\n 'npx tsc',\n 'tsc --noEmit',\n // Linting large codebases\n 'eslint .',\n 'npm run lint',\n ],\n neverBackground: [\n // Interactive commands\n 'vim',\n 'nvim',\n 'nano',\n 'less',\n 'more',\n 'top',\n 'htop',\n // Quick commands\n 'echo',\n 'cat',\n 'ls',\n 'pwd',\n 'cd',\n 'which',\n 'git status',\n 'git diff',\n 'git log',\n ],\n verbose: false,\n};\n\nconst CONFIG_PATH = join(homedir(), '.stackmemory', 'auto-background.json');\n\nexport function loadConfig(): AutoBackgroundConfig {\n try {\n if (existsSync(CONFIG_PATH)) {\n const data = readFileSync(CONFIG_PATH, 'utf8');\n const parsed = JSON.parse(data);\n return parseConfigSafe(\n AutoBackgroundConfigSchema,\n { ...DEFAULT_CONFIG, ...parsed },\n DEFAULT_CONFIG,\n 'auto-background'\n );\n }\n } catch {\n // Use defaults\n }\n return DEFAULT_CONFIG;\n}\n\nexport function saveConfig(config: AutoBackgroundConfig): void {\n try {\n ensureSecureDir(join(homedir(), '.stackmemory'));\n writeFileSecure(CONFIG_PATH, JSON.stringify(config, null, 2));\n } catch {\n // Silently fail\n }\n}\n\nexport function shouldAutoBackground(\n command: string,\n config?: AutoBackgroundConfig\n): boolean {\n const cfg = config || loadConfig();\n\n if (!cfg.enabled) return false;\n\n const normalizedCmd = command.trim().toLowerCase();\n\n // Check never-background list first (highest priority)\n for (const pattern of cfg.neverBackground) {\n if (normalizedCmd.startsWith(pattern.toLowerCase())) {\n return false;\n }\n }\n\n // Check always-background list\n for (const pattern of cfg.alwaysBackground) {\n if (normalizedCmd.startsWith(pattern.toLowerCase())) {\n return true;\n }\n }\n\n // Default: don't auto-background (let timeout handle it)\n return false;\n}\n\n/**\n * Hook response format for Claude Code\n * Returns modified tool input if command should be backgrounded\n */\nexport interface HookResponse {\n decision: 'allow' | 'modify' | 'block';\n modifiedInput?: Record<string, unknown>;\n reason?: string;\n}\n\nexport function processToolUse(\n toolName: string,\n toolInput: Record<string, unknown>\n): HookResponse {\n // Only process Bash tool\n if (toolName !== 'Bash') {\n return { decision: 'allow' };\n }\n\n const command = toolInput.command as string;\n if (!command) {\n return { decision: 'allow' };\n }\n\n // Skip if already backgrounded\n if (toolInput.run_in_background === true) {\n return { decision: 'allow' };\n }\n\n const config = loadConfig();\n\n if (shouldAutoBackground(command, config)) {\n if (config.verbose) {\n console.error(\n `[auto-background] Backgrounding: ${command.substring(0, 50)}...`\n );\n }\n\n return {\n decision: 'modify',\n modifiedInput: {\n ...toolInput,\n run_in_background: true,\n },\n reason: `Auto-backgrounded: matches pattern`,\n };\n }\n\n return { decision: 'allow' };\n}\n\n// CLI entry point removed - use stackmemory auto-bg command instead\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,197 +0,0 @@
1
- #!/usr/bin/env node
2
- import { fileURLToPath as __fileURLToPath } from 'url';
3
- import { dirname as __pathDirname } from 'path';
4
- const __filename = __fileURLToPath(import.meta.url);
5
- const __dirname = __pathDirname(__filename);
6
- import { existsSync, readFileSync, writeFileSync } from "fs";
7
- import { join } from "path";
8
- import { homedir } from "os";
9
- import { sendNotification, loadSMSConfig } from "./sms-notify.js";
10
- import {
11
- getFrameDigestData,
12
- generateMobileDigest,
13
- loadSyncOptions
14
- } from "./whatsapp-sync.js";
15
- const STACKMEMORY_DIR = join(homedir(), ".stackmemory");
16
- const INCOMING_REQUEST_PATH = join(
17
- STACKMEMORY_DIR,
18
- "sms-incoming-request.json"
19
- );
20
- const LATEST_RESPONSE_PATH = join(STACKMEMORY_DIR, "sms-latest-response.json");
21
- const HOOK_STATE_PATH = join(STACKMEMORY_DIR, "claude-hook-state.json");
22
- function loadHookState() {
23
- try {
24
- if (existsSync(HOOK_STATE_PATH)) {
25
- return JSON.parse(readFileSync(HOOK_STATE_PATH, "utf8"));
26
- }
27
- } catch {
28
- }
29
- return { toolCount: 0, significantChanges: false };
30
- }
31
- function saveHookState(state) {
32
- try {
33
- writeFileSync(HOOK_STATE_PATH, JSON.stringify(state, null, 2));
34
- } catch {
35
- }
36
- }
37
- function checkIncomingRequests() {
38
- try {
39
- if (!existsSync(INCOMING_REQUEST_PATH)) return null;
40
- const data = JSON.parse(
41
- readFileSync(INCOMING_REQUEST_PATH, "utf8")
42
- );
43
- if (data.processed) return null;
44
- return data;
45
- } catch {
46
- return null;
47
- }
48
- }
49
- function markRequestProcessed() {
50
- try {
51
- if (!existsSync(INCOMING_REQUEST_PATH)) return;
52
- const data = JSON.parse(readFileSync(INCOMING_REQUEST_PATH, "utf8"));
53
- data.processed = true;
54
- writeFileSync(INCOMING_REQUEST_PATH, JSON.stringify(data, null, 2));
55
- } catch {
56
- }
57
- }
58
- function getLatestResponse() {
59
- try {
60
- if (!existsSync(LATEST_RESPONSE_PATH)) return null;
61
- return JSON.parse(readFileSync(LATEST_RESPONSE_PATH, "utf8"));
62
- } catch {
63
- return null;
64
- }
65
- }
66
- async function sendDigest() {
67
- const data = await getFrameDigestData();
68
- if (!data) return;
69
- const options = loadSyncOptions();
70
- const digest = generateMobileDigest(data, options);
71
- await sendNotification({
72
- type: "context_sync",
73
- title: "Context Update",
74
- message: digest
75
- });
76
- }
77
- async function handlePreToolUse() {
78
- const state = loadHookState();
79
- state.toolCount++;
80
- if (state.toolCount % 5 === 0) {
81
- const incoming = checkIncomingRequests();
82
- if (incoming) {
83
- console.error(`
84
- [WhatsApp] Message from ${incoming.from}:`);
85
- console.error(` "${incoming.message}"`);
86
- console.error(` (Received at ${incoming.timestamp})
87
- `);
88
- markRequestProcessed();
89
- }
90
- }
91
- saveHookState(state);
92
- }
93
- async function handleStop() {
94
- const config = loadSMSConfig();
95
- if (!config.enabled) return;
96
- const state = loadHookState();
97
- console.error(`[WhatsApp] Session ended after ${state.toolCount} tool calls`);
98
- try {
99
- await sendDigest();
100
- console.error("[WhatsApp] Session digest sent");
101
- } catch (err) {
102
- console.error("[WhatsApp] Failed to send digest:", err);
103
- }
104
- saveHookState({ toolCount: 0, significantChanges: false });
105
- }
106
- async function handleNotification(input) {
107
- if (input.includes("[notify]") || input.includes("[whatsapp]")) {
108
- const message = input.replace(/\[notify\]|\[whatsapp\]/gi, "").trim();
109
- await sendNotification({
110
- type: "custom",
111
- title: "Claude",
112
- message: message.slice(0, 300)
113
- });
114
- }
115
- }
116
- async function pollForResponse(timeoutMs = 6e4) {
117
- const startTime = Date.now();
118
- const pollInterval = 2e3;
119
- while (Date.now() - startTime < timeoutMs) {
120
- const response = getLatestResponse();
121
- if (response) {
122
- const responseAge = Date.now() - new Date(response.timestamp).getTime();
123
- if (responseAge < 5e3) {
124
- return response.response;
125
- }
126
- }
127
- await new Promise((resolve) => setTimeout(resolve, pollInterval));
128
- }
129
- return null;
130
- }
131
- async function askViaWhatsApp(question, options) {
132
- const config = loadSMSConfig();
133
- if (!config.enabled) {
134
- console.error("[WhatsApp] Notifications not enabled");
135
- return null;
136
- }
137
- await sendNotification({
138
- type: "custom",
139
- title: "Claude Question",
140
- message: question,
141
- prompt: options ? {
142
- type: "options",
143
- options: options.map((o) => ({ ...o, action: o.key }))
144
- } : void 0
145
- });
146
- return pollForResponse(12e4);
147
- }
148
- async function main() {
149
- const args = process.argv.slice(2);
150
- const hookType = args[0];
151
- let input = "";
152
- if (!process.stdin.isTTY) {
153
- input = readFileSync(0, "utf8");
154
- }
155
- switch (hookType) {
156
- case "pre-tool":
157
- case "PreToolUse":
158
- await handlePreToolUse();
159
- break;
160
- case "stop":
161
- case "Stop":
162
- await handleStop();
163
- break;
164
- case "notification":
165
- case "Notification":
166
- await handleNotification(input);
167
- break;
168
- case "check":
169
- const incoming = checkIncomingRequests();
170
- if (incoming) {
171
- console.log(JSON.stringify(incoming));
172
- }
173
- break;
174
- case "send-digest":
175
- await sendDigest();
176
- break;
177
- case "poll":
178
- const response = await pollForResponse(parseInt(args[1] || "60000", 10));
179
- if (response) {
180
- console.log(response);
181
- }
182
- break;
183
- default:
184
- console.error("Usage: claude-code-whatsapp-hook.js <hook-type>");
185
- console.error(
186
- "Hook types: pre-tool, stop, notification, check, send-digest, poll"
187
- );
188
- process.exit(1);
189
- }
190
- }
191
- if (process.argv[1]?.includes("claude-code-whatsapp-hook")) {
192
- main().catch(console.error);
193
- }
194
- export {
195
- askViaWhatsApp
196
- };
197
- //# sourceMappingURL=claude-code-whatsapp-hook.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/hooks/claude-code-whatsapp-hook.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * Claude Code WhatsApp Hook\n * Automatically integrates WhatsApp messages into Claude Code sessions\n *\n * Installation:\n * Add to ~/.claude/settings.json under \"hooks\":\n * {\n * \"hooks\": {\n * \"Stop\": [\"node\", \"/path/to/claude-code-whatsapp-hook.js\", \"stop\"],\n * \"PreToolUse\": [\"node\", \"/path/to/claude-code-whatsapp-hook.js\", \"pre-tool\"]\n * }\n * }\n *\n * Or add to ~/.claude/hooks/ directory\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { sendNotification, loadSMSConfig } from './sms-notify.js';\nimport {\n getFrameDigestData,\n generateMobileDigest,\n loadSyncOptions,\n} from './whatsapp-sync.js';\n\nconst STACKMEMORY_DIR = join(homedir(), '.stackmemory');\nconst INCOMING_REQUEST_PATH = join(\n STACKMEMORY_DIR,\n 'sms-incoming-request.json'\n);\nconst LATEST_RESPONSE_PATH = join(STACKMEMORY_DIR, 'sms-latest-response.json');\nconst HOOK_STATE_PATH = join(STACKMEMORY_DIR, 'claude-hook-state.json');\n\ninterface HookState {\n sessionId?: string;\n lastCheckedAt?: string;\n lastDigestSentAt?: string;\n toolCount: number;\n significantChanges: boolean;\n}\n\ninterface IncomingRequest {\n from: string;\n message: string;\n timestamp: string;\n processed: boolean;\n}\n\n/**\n * Load hook state\n */\nfunction loadHookState(): HookState {\n try {\n if (existsSync(HOOK_STATE_PATH)) {\n return JSON.parse(readFileSync(HOOK_STATE_PATH, 'utf8'));\n }\n } catch {\n // Use defaults\n }\n return { toolCount: 0, significantChanges: false };\n}\n\n/**\n * Save hook state\n */\nfunction saveHookState(state: HookState): void {\n try {\n writeFileSync(HOOK_STATE_PATH, JSON.stringify(state, null, 2));\n } catch {\n // Ignore\n }\n}\n\n/**\n * Check for incoming WhatsApp requests\n */\nfunction checkIncomingRequests(): IncomingRequest | null {\n try {\n if (!existsSync(INCOMING_REQUEST_PATH)) return null;\n\n const data: IncomingRequest = JSON.parse(\n readFileSync(INCOMING_REQUEST_PATH, 'utf8')\n );\n if (data.processed) return null;\n\n return data;\n } catch {\n return null;\n }\n}\n\n/**\n * Mark incoming request as processed\n */\nfunction markRequestProcessed(): void {\n try {\n if (!existsSync(INCOMING_REQUEST_PATH)) return;\n\n const data = JSON.parse(readFileSync(INCOMING_REQUEST_PATH, 'utf8'));\n data.processed = true;\n writeFileSync(INCOMING_REQUEST_PATH, JSON.stringify(data, null, 2));\n } catch {\n // Ignore\n }\n}\n\n/**\n * Get latest response from file\n */\nfunction getLatestResponse(): {\n promptId: string;\n response: string;\n timestamp: string;\n} | null {\n try {\n if (!existsSync(LATEST_RESPONSE_PATH)) return null;\n return JSON.parse(readFileSync(LATEST_RESPONSE_PATH, 'utf8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Send context digest to WhatsApp\n */\nasync function sendDigest(): Promise<void> {\n const data = await getFrameDigestData();\n if (!data) return;\n\n const options = loadSyncOptions();\n const digest = generateMobileDigest(data, options);\n\n await sendNotification({\n type: 'context_sync',\n title: 'Context Update',\n message: digest,\n });\n}\n\n/**\n * Handle PreToolUse hook - check for incoming messages\n */\nasync function handlePreToolUse(): Promise<void> {\n const state = loadHookState();\n state.toolCount++;\n\n // Check for incoming WhatsApp messages every 5 tool uses\n if (state.toolCount % 5 === 0) {\n const incoming = checkIncomingRequests();\n if (incoming) {\n // Print to stderr so Claude sees it\n console.error(`\\n[WhatsApp] Message from ${incoming.from}:`);\n console.error(` \"${incoming.message}\"`);\n console.error(` (Received at ${incoming.timestamp})\\n`);\n\n // Mark as processed\n markRequestProcessed();\n }\n }\n\n saveHookState(state);\n}\n\n/**\n * Handle Stop hook - send session summary to WhatsApp\n */\nasync function handleStop(): Promise<void> {\n const config = loadSMSConfig();\n if (!config.enabled) return;\n\n // Load state for logging\n const state = loadHookState();\n console.error(`[WhatsApp] Session ended after ${state.toolCount} tool calls`);\n\n // Send final digest\n try {\n await sendDigest();\n console.error('[WhatsApp] Session digest sent');\n } catch (err) {\n console.error('[WhatsApp] Failed to send digest:', err);\n }\n\n // Reset state\n saveHookState({ toolCount: 0, significantChanges: false });\n}\n\n/**\n * Handle Notification hook - relay Claude's output to WhatsApp if requested\n */\nasync function handleNotification(input: string): Promise<void> {\n // Check if user requested WhatsApp notification\n if (input.includes('[notify]') || input.includes('[whatsapp]')) {\n const message = input.replace(/\\[notify\\]|\\[whatsapp\\]/gi, '').trim();\n\n await sendNotification({\n type: 'custom',\n title: 'Claude',\n message: message.slice(0, 300),\n });\n }\n}\n\n/**\n * Poll for WhatsApp responses (for long-running tasks)\n */\nasync function pollForResponse(\n timeoutMs: number = 60000\n): Promise<string | null> {\n const startTime = Date.now();\n const pollInterval = 2000;\n\n while (Date.now() - startTime < timeoutMs) {\n const response = getLatestResponse();\n if (response) {\n const responseAge = Date.now() - new Date(response.timestamp).getTime();\n if (responseAge < 5000) {\n // Fresh response (within 5 seconds)\n return response.response;\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n return null;\n}\n\n/**\n * Send a prompt to WhatsApp and wait for response\n */\nexport async function askViaWhatsApp(\n question: string,\n options?: { key: string; label: string }[]\n): Promise<string | null> {\n const config = loadSMSConfig();\n if (!config.enabled) {\n console.error('[WhatsApp] Notifications not enabled');\n return null;\n }\n\n // Send the question\n await sendNotification({\n type: 'custom',\n title: 'Claude Question',\n message: question,\n prompt: options\n ? {\n type: 'options',\n options: options.map((o) => ({ ...o, action: o.key })),\n }\n : undefined,\n });\n\n // Wait for response\n return pollForResponse(120000); // 2 minute timeout\n}\n\n/**\n * Main entry point\n */\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const hookType = args[0];\n\n // Read stdin for hook input\n let input = '';\n if (!process.stdin.isTTY) {\n input = readFileSync(0, 'utf8');\n }\n\n switch (hookType) {\n case 'pre-tool':\n case 'PreToolUse':\n await handlePreToolUse();\n break;\n\n case 'stop':\n case 'Stop':\n await handleStop();\n break;\n\n case 'notification':\n case 'Notification':\n await handleNotification(input);\n break;\n\n case 'check':\n // Just check for incoming messages\n const incoming = checkIncomingRequests();\n if (incoming) {\n console.log(JSON.stringify(incoming));\n }\n break;\n\n case 'send-digest':\n await sendDigest();\n break;\n\n case 'poll':\n const response = await pollForResponse(parseInt(args[1] || '60000', 10));\n if (response) {\n console.log(response);\n }\n break;\n\n default:\n console.error('Usage: claude-code-whatsapp-hook.js <hook-type>');\n console.error(\n 'Hook types: pre-tool, stop, notification, check, send-digest, poll'\n );\n process.exit(1);\n }\n}\n\n// Run if called directly\nif (process.argv[1]?.includes('claude-code-whatsapp-hook')) {\n main().catch(console.error);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }