@stackmemoryai/stackmemory 0.8.1 → 1.0.1

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 (792) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +81 -273
  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 +9 -1
  10. package/dist/src/cli/codex-sm-danger.js +0 -1
  11. package/dist/src/cli/codex-sm.js +9 -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 +9 -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 +8 -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/graphiti-hooks.js +104 -0
  200. package/dist/src/hooks/index.js +0 -1
  201. package/dist/src/hooks/linear-task-picker.js +0 -1
  202. package/dist/src/hooks/schemas.js +0 -1
  203. package/dist/src/hooks/secure-fs.js +0 -1
  204. package/dist/src/hooks/security-logger.js +0 -1
  205. package/dist/src/hooks/session-summary.js +0 -1
  206. package/dist/src/index.js +0 -1
  207. package/dist/src/integrations/anthropic/client.js +0 -1
  208. package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
  209. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
  210. package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
  211. package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
  212. package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
  213. package/dist/src/integrations/claude-code/subagent-client.js +0 -1
  214. package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
  215. package/dist/src/integrations/diffmem/client.js +0 -1
  216. package/dist/src/integrations/diffmem/config.js +0 -1
  217. package/dist/src/integrations/diffmem/index.js +0 -1
  218. package/dist/src/integrations/diffmem/types.js +0 -1
  219. package/dist/src/integrations/graphiti/client.js +103 -0
  220. package/dist/src/integrations/graphiti/config.js +17 -0
  221. package/dist/src/integrations/graphiti/types.js +4 -0
  222. package/dist/src/integrations/linear/auth.js +0 -1
  223. package/dist/src/integrations/linear/auto-sync.js +0 -1
  224. package/dist/src/integrations/linear/client.js +0 -1
  225. package/dist/src/integrations/linear/config.js +0 -1
  226. package/dist/src/integrations/linear/migration.js +0 -1
  227. package/dist/src/integrations/linear/oauth-server.js +0 -1
  228. package/dist/src/integrations/linear/rest-client.js +0 -1
  229. package/dist/src/integrations/linear/sync-manager.js +0 -1
  230. package/dist/src/integrations/linear/sync-service.js +0 -1
  231. package/dist/src/integrations/linear/sync.js +0 -1
  232. package/dist/src/integrations/linear/types.js +0 -1
  233. package/dist/src/integrations/linear/unified-sync.js +0 -1
  234. package/dist/src/integrations/linear/webhook-handler.js +0 -1
  235. package/dist/src/integrations/linear/webhook-server.js +0 -1
  236. package/dist/src/integrations/linear/webhook.js +0 -1
  237. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
  238. package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
  239. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
  240. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
  241. package/dist/src/integrations/mcp/handlers/index.js +1 -3
  242. package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
  243. package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
  244. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
  245. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
  246. package/dist/src/integrations/mcp/index.js +0 -1
  247. package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
  248. package/dist/src/integrations/mcp/pending-utils.js +0 -1
  249. package/dist/src/integrations/mcp/refactored-server.js +0 -1
  250. package/dist/src/integrations/mcp/remote-server.js +0 -1
  251. package/dist/src/integrations/mcp/schemas.js +0 -1
  252. package/dist/src/integrations/mcp/server.js +20 -24
  253. package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
  254. package/dist/src/integrations/mcp/tool-definitions.js +0 -1
  255. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
  256. package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
  257. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
  258. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
  259. package/dist/src/integrations/ralph/index.js +0 -1
  260. package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
  261. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
  262. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
  263. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
  264. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
  265. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
  266. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
  267. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
  268. package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
  269. package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
  270. package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
  271. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
  272. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
  273. package/dist/src/integrations/ralph/types.js +0 -1
  274. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
  275. package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
  276. package/dist/src/middleware/exponential-rate-limiter.js +0 -1
  277. package/dist/src/models/user.model.js +0 -1
  278. package/dist/src/orchestrators/multimodal/constants.js +0 -1
  279. package/dist/src/orchestrators/multimodal/harness.js +0 -1
  280. package/dist/src/orchestrators/multimodal/providers.js +0 -1
  281. package/dist/src/orchestrators/multimodal/types.js +0 -1
  282. package/dist/src/orchestrators/multimodal/utils.js +0 -1
  283. package/dist/src/servers/production/auth-middleware.js +0 -1
  284. package/dist/src/services/config-service.js +0 -1
  285. package/dist/src/services/context-service.js +0 -1
  286. package/dist/src/skills/api-discovery.js +0 -1
  287. package/dist/src/skills/api-skill.js +0 -1
  288. package/dist/src/skills/claude-skills.js +0 -1
  289. package/dist/src/skills/dashboard-launcher.js +0 -1
  290. package/dist/src/skills/linear-task-runner.js +0 -1
  291. package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
  292. package/dist/src/skills/repo-ingestion-skill.js +0 -1
  293. package/dist/src/skills/spec-generator-skill.js +0 -1
  294. package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
  295. package/dist/src/types/task.js +0 -1
  296. package/dist/src/utils/env.js +0 -1
  297. package/dist/src/utils/formatting.js +0 -1
  298. package/dist/src/utils/process-cleanup.js +0 -1
  299. package/package.json +32 -7
  300. package/dist/scripts/benchmark-performance.js +0 -48
  301. package/dist/scripts/benchmark-performance.js.map +0 -7
  302. package/dist/scripts/check-redis.js +0 -42
  303. package/dist/scripts/check-redis.js.map +0 -7
  304. package/dist/scripts/initialize.js +0 -183
  305. package/dist/scripts/initialize.js.map +0 -7
  306. package/dist/scripts/list-linear-tasks.js +0 -124
  307. package/dist/scripts/list-linear-tasks.js.map +0 -7
  308. package/dist/scripts/measure-handoff-impact.js +0 -340
  309. package/dist/scripts/measure-handoff-impact.js.map +0 -7
  310. package/dist/scripts/query-chromadb.js +0 -160
  311. package/dist/scripts/query-chromadb.js.map +0 -7
  312. package/dist/scripts/show-linear-summary.js +0 -119
  313. package/dist/scripts/show-linear-summary.js.map +0 -7
  314. package/dist/scripts/simple-swarm-demo.js +0 -90
  315. package/dist/scripts/simple-swarm-demo.js.map +0 -7
  316. package/dist/scripts/status.js +0 -155
  317. package/dist/scripts/status.js.map +0 -7
  318. package/dist/scripts/test-chromadb-sync.js +0 -192
  319. package/dist/scripts/test-chromadb-sync.js.map +0 -7
  320. package/dist/scripts/test-ralph-iteration-fix.js +0 -86
  321. package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
  322. package/dist/scripts/test-ralph-iterations.js +0 -121
  323. package/dist/scripts/test-ralph-iterations.js.map +0 -7
  324. package/dist/scripts/test-redis-storage.js +0 -389
  325. package/dist/scripts/test-redis-storage.js.map +0 -7
  326. package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
  327. package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
  328. package/dist/scripts/test-swarm-fixes.js +0 -125
  329. package/dist/scripts/test-swarm-fixes.js.map +0 -7
  330. package/dist/scripts/test-swarm-tui.js +0 -23
  331. package/dist/scripts/test-swarm-tui.js.map +0 -7
  332. package/dist/scripts/test-tui-shortcuts.js +0 -52
  333. package/dist/scripts/test-tui-shortcuts.js.map +0 -7
  334. package/dist/scripts/validate-tui-shortcuts.js +0 -60
  335. package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
  336. package/dist/src/agents/core/agent-task-manager.js.map +0 -7
  337. package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
  338. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
  339. package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
  340. package/dist/src/cli/auto-detect.js.map +0 -7
  341. package/dist/src/cli/claude-sm-danger.js.map +0 -7
  342. package/dist/src/cli/claude-sm.js.map +0 -7
  343. package/dist/src/cli/codex-sm-danger.js.map +0 -7
  344. package/dist/src/cli/codex-sm.js.map +0 -7
  345. package/dist/src/cli/commands/api.js.map +0 -7
  346. package/dist/src/cli/commands/auto-background.js.map +0 -7
  347. package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
  348. package/dist/src/cli/commands/clear.js.map +0 -7
  349. package/dist/src/cli/commands/config.js.map +0 -7
  350. package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
  351. package/dist/src/cli/commands/context.js.map +0 -7
  352. package/dist/src/cli/commands/daemon.js.map +0 -7
  353. package/dist/src/cli/commands/dashboard.js.map +0 -7
  354. package/dist/src/cli/commands/db.js.map +0 -7
  355. package/dist/src/cli/commands/decision.js.map +0 -7
  356. package/dist/src/cli/commands/discovery.js.map +0 -7
  357. package/dist/src/cli/commands/handoff.js.map +0 -7
  358. package/dist/src/cli/commands/hooks.js.map +0 -7
  359. package/dist/src/cli/commands/linear.js.map +0 -7
  360. package/dist/src/cli/commands/log.js.map +0 -7
  361. package/dist/src/cli/commands/login.js.map +0 -7
  362. package/dist/src/cli/commands/migrate.js.map +0 -7
  363. package/dist/src/cli/commands/model.js.map +0 -7
  364. package/dist/src/cli/commands/onboard.js.map +0 -7
  365. package/dist/src/cli/commands/ping.js.map +0 -7
  366. package/dist/src/cli/commands/projects.js.map +0 -7
  367. package/dist/src/cli/commands/ralph.js.map +0 -7
  368. package/dist/src/cli/commands/retrieval.js.map +0 -7
  369. package/dist/src/cli/commands/search.js.map +0 -7
  370. package/dist/src/cli/commands/service.js.map +0 -7
  371. package/dist/src/cli/commands/session.js.map +0 -7
  372. package/dist/src/cli/commands/settings.js +0 -306
  373. package/dist/src/cli/commands/settings.js.map +0 -7
  374. package/dist/src/cli/commands/setup.js.map +0 -7
  375. package/dist/src/cli/commands/shell.js.map +0 -7
  376. package/dist/src/cli/commands/signup.js.map +0 -7
  377. package/dist/src/cli/commands/skills.js.map +0 -7
  378. package/dist/src/cli/commands/sms-notify.js +0 -795
  379. package/dist/src/cli/commands/sms-notify.js.map +0 -7
  380. package/dist/src/cli/commands/storage-tier.js.map +0 -7
  381. package/dist/src/cli/commands/sweep.js.map +0 -7
  382. package/dist/src/cli/commands/tasks.js.map +0 -7
  383. package/dist/src/cli/commands/worktree.js.map +0 -7
  384. package/dist/src/cli/index.js.map +0 -7
  385. package/dist/src/cli/opencode-sm.js.map +0 -7
  386. package/dist/src/cli/utils/viewer.js.map +0 -7
  387. package/dist/src/core/config/config-manager.js.map +0 -7
  388. package/dist/src/core/config/feature-flags.js.map +0 -7
  389. package/dist/src/core/config/storage-config.js.map +0 -7
  390. package/dist/src/core/config/types.js.map +0 -7
  391. package/dist/src/core/context/auto-context.js.map +0 -7
  392. package/dist/src/core/context/dual-stack-manager.js.map +0 -7
  393. package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
  394. package/dist/src/core/context/frame-database.js.map +0 -7
  395. package/dist/src/core/context/frame-digest.js.map +0 -7
  396. package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
  397. package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
  398. package/dist/src/core/context/frame-recovery.js.map +0 -7
  399. package/dist/src/core/context/frame-stack.js.map +0 -7
  400. package/dist/src/core/context/frame-types.js.map +0 -7
  401. package/dist/src/core/context/index.js.map +0 -7
  402. package/dist/src/core/context/permission-manager.js.map +0 -7
  403. package/dist/src/core/context/recursive-context-manager.js.map +0 -7
  404. package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
  405. package/dist/src/core/context/shared-context-layer.js.map +0 -7
  406. package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
  407. package/dist/src/core/context/validation.js.map +0 -7
  408. package/dist/src/core/database/batch-operations.js.map +0 -7
  409. package/dist/src/core/database/connection-pool.js.map +0 -7
  410. package/dist/src/core/database/database-adapter.js.map +0 -7
  411. package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
  412. package/dist/src/core/database/embedding-provider.js.map +0 -7
  413. package/dist/src/core/database/migration-manager.js.map +0 -7
  414. package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
  415. package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
  416. package/dist/src/core/database/query-cache.js.map +0 -7
  417. package/dist/src/core/database/query-router.js.map +0 -7
  418. package/dist/src/core/database/sqlite-adapter.js.map +0 -7
  419. package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
  420. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
  421. package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
  422. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
  423. package/dist/src/core/digest/index.js.map +0 -7
  424. package/dist/src/core/digest/types.js.map +0 -7
  425. package/dist/src/core/errors/error-utils.js.map +0 -7
  426. package/dist/src/core/errors/index.js.map +0 -7
  427. package/dist/src/core/errors/recovery.js.map +0 -7
  428. package/dist/src/core/execution/parallel-executor.js.map +0 -7
  429. package/dist/src/core/extensions/custom-tools.js.map +0 -7
  430. package/dist/src/core/extensions/index.js.map +0 -7
  431. package/dist/src/core/extensions/loader.js.map +0 -7
  432. package/dist/src/core/extensions/plugin-system.js.map +0 -7
  433. package/dist/src/core/extensions/provider-adapter.js.map +0 -7
  434. package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
  435. package/dist/src/core/extensions/types.js.map +0 -7
  436. package/dist/src/core/frame/workflow-templates.js.map +0 -7
  437. package/dist/src/core/merge/conflict-detector.js.map +0 -7
  438. package/dist/src/core/merge/index.js.map +0 -7
  439. package/dist/src/core/merge/resolution-engine.js.map +0 -7
  440. package/dist/src/core/merge/stack-diff.js.map +0 -7
  441. package/dist/src/core/merge/types.js.map +0 -7
  442. package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
  443. package/dist/src/core/models/fallback-monitor.js.map +0 -7
  444. package/dist/src/core/models/model-router.js.map +0 -7
  445. package/dist/src/core/monitoring/error-handler.js.map +0 -7
  446. package/dist/src/core/monitoring/logger.js.map +0 -7
  447. package/dist/src/core/monitoring/metrics.js.map +0 -7
  448. package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
  449. package/dist/src/core/monitoring/session-monitor.js.map +0 -7
  450. package/dist/src/core/performance/context-cache.js.map +0 -7
  451. package/dist/src/core/performance/index.js.map +0 -7
  452. package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
  453. package/dist/src/core/performance/monitor.js.map +0 -7
  454. package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
  455. package/dist/src/core/performance/performance-benchmark.js.map +0 -7
  456. package/dist/src/core/performance/performance-profiler.js.map +0 -7
  457. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
  458. package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
  459. package/dist/src/core/projects/project-isolation.js.map +0 -7
  460. package/dist/src/core/projects/project-manager.js.map +0 -7
  461. package/dist/src/core/query/query-parser.js.map +0 -7
  462. package/dist/src/core/query/query-templates.js.map +0 -7
  463. package/dist/src/core/retrieval/context-retriever.js.map +0 -7
  464. package/dist/src/core/retrieval/index.js.map +0 -7
  465. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
  466. package/dist/src/core/retrieval/llm-provider.js.map +0 -7
  467. package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
  468. package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
  469. package/dist/src/core/retrieval/summary-generator.js.map +0 -7
  470. package/dist/src/core/retrieval/types.js.map +0 -7
  471. package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
  472. package/dist/src/core/security/index.js.map +0 -7
  473. package/dist/src/core/security/input-sanitizer.js.map +0 -7
  474. package/dist/src/core/session/clear-survival.js.map +0 -7
  475. package/dist/src/core/session/enhanced-handoff.js.map +0 -7
  476. package/dist/src/core/session/handoff-generator.js.map +0 -7
  477. package/dist/src/core/session/index.js.map +0 -7
  478. package/dist/src/core/session/session-manager.js.map +0 -7
  479. package/dist/src/core/skills/index.js.map +0 -7
  480. package/dist/src/core/skills/skill-storage.js.map +0 -7
  481. package/dist/src/core/skills/types.js.map +0 -7
  482. package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
  483. package/dist/src/core/storage/infinite-storage.js.map +0 -7
  484. package/dist/src/core/storage/project-registry.js.map +0 -7
  485. package/dist/src/core/storage/remote-storage.js.map +0 -7
  486. package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
  487. package/dist/src/core/storage/two-tier-storage.js.map +0 -7
  488. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
  489. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
  490. package/dist/src/core/trace/debug-trace.js.map +0 -7
  491. package/dist/src/core/trace/index.js.map +0 -7
  492. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
  493. package/dist/src/core/trace/trace-detector.js.map +0 -7
  494. package/dist/src/core/trace/trace-store.js.map +0 -7
  495. package/dist/src/core/trace/types.js.map +0 -7
  496. package/dist/src/core/types.js.map +0 -7
  497. package/dist/src/core/utils/async-mutex.js.map +0 -7
  498. package/dist/src/core/utils/compression.js.map +0 -7
  499. package/dist/src/core/utils/update-checker.js.map +0 -7
  500. package/dist/src/core/worktree/worktree-manager.js.map +0 -7
  501. package/dist/src/daemon/daemon-config.js.map +0 -7
  502. package/dist/src/daemon/services/context-service.js.map +0 -7
  503. package/dist/src/daemon/services/linear-service.js.map +0 -7
  504. package/dist/src/daemon/services/maintenance-service.js.map +0 -7
  505. package/dist/src/daemon/services/memory-service.js.map +0 -7
  506. package/dist/src/daemon/session-daemon.js.map +0 -7
  507. package/dist/src/daemon/unified-daemon.js.map +0 -7
  508. package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
  509. package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
  510. package/dist/src/features/analytics/index.js.map +0 -7
  511. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
  512. package/dist/src/features/analytics/types/metrics.js.map +0 -7
  513. package/dist/src/features/browser/browser-mcp.js.map +0 -7
  514. package/dist/src/features/sweep/index.js.map +0 -7
  515. package/dist/src/features/sweep/prediction-client.js.map +0 -7
  516. package/dist/src/features/sweep/prompt-builder.js.map +0 -7
  517. package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
  518. package/dist/src/features/sweep/state-watcher.js.map +0 -7
  519. package/dist/src/features/sweep/status-bar.js.map +0 -7
  520. package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
  521. package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
  522. package/dist/src/features/sweep/types.js.map +0 -7
  523. package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
  524. package/dist/src/features/tasks/task-aware-context.js.map +0 -7
  525. package/dist/src/features/tui/simple-monitor.js.map +0 -7
  526. package/dist/src/features/tui/swarm-monitor.js.map +0 -7
  527. package/dist/src/features/web/client/stores/task-store.js.map +0 -7
  528. package/dist/src/features/web/server/index.js.map +0 -7
  529. package/dist/src/features/workers/tmux-manager.js.map +0 -7
  530. package/dist/src/features/workers/worker-registry.js.map +0 -7
  531. package/dist/src/hooks/auto-background.js.map +0 -7
  532. package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
  533. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
  534. package/dist/src/hooks/config.js.map +0 -7
  535. package/dist/src/hooks/daemon.js.map +0 -7
  536. package/dist/src/hooks/diffmem-hooks.js.map +0 -7
  537. package/dist/src/hooks/events.js.map +0 -7
  538. package/dist/src/hooks/index.js.map +0 -7
  539. package/dist/src/hooks/linear-task-picker.js.map +0 -7
  540. package/dist/src/hooks/schemas.js.map +0 -7
  541. package/dist/src/hooks/secure-fs.js.map +0 -7
  542. package/dist/src/hooks/security-logger.js.map +0 -7
  543. package/dist/src/hooks/session-summary.js.map +0 -7
  544. package/dist/src/hooks/sms-action-runner.js +0 -371
  545. package/dist/src/hooks/sms-action-runner.js.map +0 -7
  546. package/dist/src/hooks/sms-notify.js +0 -506
  547. package/dist/src/hooks/sms-notify.js.map +0 -7
  548. package/dist/src/hooks/sms-watcher.js +0 -93
  549. package/dist/src/hooks/sms-watcher.js.map +0 -7
  550. package/dist/src/hooks/sms-webhook.js +0 -555
  551. package/dist/src/hooks/sms-webhook.js.map +0 -7
  552. package/dist/src/hooks/whatsapp-commands.js +0 -479
  553. package/dist/src/hooks/whatsapp-commands.js.map +0 -7
  554. package/dist/src/hooks/whatsapp-scheduler.js +0 -317
  555. package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
  556. package/dist/src/hooks/whatsapp-sync.js +0 -409
  557. package/dist/src/hooks/whatsapp-sync.js.map +0 -7
  558. package/dist/src/index.js.map +0 -7
  559. package/dist/src/integrations/anthropic/client.js.map +0 -7
  560. package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
  561. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  562. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  563. package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
  564. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
  565. package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
  566. package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
  567. package/dist/src/integrations/diffmem/client.js.map +0 -7
  568. package/dist/src/integrations/diffmem/config.js.map +0 -7
  569. package/dist/src/integrations/diffmem/index.js.map +0 -7
  570. package/dist/src/integrations/diffmem/types.js.map +0 -7
  571. package/dist/src/integrations/linear/auth.js.map +0 -7
  572. package/dist/src/integrations/linear/auto-sync.js.map +0 -7
  573. package/dist/src/integrations/linear/client.js.map +0 -7
  574. package/dist/src/integrations/linear/config.js.map +0 -7
  575. package/dist/src/integrations/linear/migration.js.map +0 -7
  576. package/dist/src/integrations/linear/oauth-server.js.map +0 -7
  577. package/dist/src/integrations/linear/rest-client.js.map +0 -7
  578. package/dist/src/integrations/linear/sync-manager.js.map +0 -7
  579. package/dist/src/integrations/linear/sync-service.js.map +0 -7
  580. package/dist/src/integrations/linear/sync.js.map +0 -7
  581. package/dist/src/integrations/linear/types.js.map +0 -7
  582. package/dist/src/integrations/linear/unified-sync.js.map +0 -7
  583. package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
  584. package/dist/src/integrations/linear/webhook-server.js.map +0 -7
  585. package/dist/src/integrations/linear/webhook.js.map +0 -7
  586. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  587. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
  588. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
  589. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  590. package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
  591. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  592. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  593. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
  594. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  595. package/dist/src/integrations/mcp/index.js.map +0 -7
  596. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  597. package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
  598. package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
  599. package/dist/src/integrations/mcp/remote-server.js.map +0 -7
  600. package/dist/src/integrations/mcp/schemas.js.map +0 -7
  601. package/dist/src/integrations/mcp/server.js.map +0 -7
  602. package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
  603. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
  604. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  605. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
  606. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  607. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  608. package/dist/src/integrations/ralph/index.js.map +0 -7
  609. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
  610. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  611. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  612. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  613. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  614. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  615. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  616. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  617. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  618. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  619. package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
  620. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  621. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  622. package/dist/src/integrations/ralph/types.js.map +0 -7
  623. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  624. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
  625. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
  626. package/dist/src/models/user.model.js.map +0 -7
  627. package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
  628. package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
  629. package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
  630. package/dist/src/orchestrators/multimodal/types.js.map +0 -7
  631. package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
  632. package/dist/src/servers/production/auth-middleware.js.map +0 -7
  633. package/dist/src/services/config-service.js.map +0 -7
  634. package/dist/src/services/context-service.js.map +0 -7
  635. package/dist/src/skills/api-discovery.js.map +0 -7
  636. package/dist/src/skills/api-skill.js.map +0 -7
  637. package/dist/src/skills/claude-skills.js.map +0 -7
  638. package/dist/src/skills/dashboard-launcher.js.map +0 -7
  639. package/dist/src/skills/linear-task-runner.js.map +0 -7
  640. package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
  641. package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
  642. package/dist/src/skills/spec-generator-skill.js.map +0 -7
  643. package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
  644. package/dist/src/types/task.js.map +0 -7
  645. package/dist/src/utils/env.js.map +0 -7
  646. package/dist/src/utils/formatting.js.map +0 -7
  647. package/dist/src/utils/process-cleanup.js.map +0 -7
  648. package/scripts/README-TESTING.md +0 -186
  649. package/scripts/analyze-cli-security.js +0 -288
  650. package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
  651. package/scripts/archive/analyze-linear-duplicates.js +0 -214
  652. package/scripts/archive/analyze-remaining-duplicates.js +0 -230
  653. package/scripts/archive/analyze-sta-duplicates.js +0 -292
  654. package/scripts/archive/analyze-sta-graphql.js +0 -399
  655. package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
  656. package/scripts/archive/check-all-duplicates.ts +0 -419
  657. package/scripts/archive/clean-duplicate-tasks.js +0 -114
  658. package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
  659. package/scripts/archive/create-phase-tasks.js +0 -387
  660. package/scripts/archive/delete-linear-duplicates.js +0 -182
  661. package/scripts/archive/delete-remaining-duplicates.js +0 -158
  662. package/scripts/archive/delete-sta-duplicates.js +0 -201
  663. package/scripts/archive/delete-sta-oauth.js +0 -201
  664. package/scripts/archive/export-sta-tasks.js +0 -62
  665. package/scripts/archive/install-auto-sync.js +0 -266
  666. package/scripts/archive/install-chromadb-hooks.sh +0 -133
  667. package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
  668. package/scripts/archive/install-post-task-hooks.sh +0 -289
  669. package/scripts/archive/install-stackmemory-hooks.sh +0 -420
  670. package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
  671. package/scripts/archive/merge-linear-duplicates.ts +0 -182
  672. package/scripts/archive/remove-sta-tasks.js +0 -70
  673. package/scripts/archive/setup-background-sync.sh +0 -168
  674. package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
  675. package/scripts/archive/setup-claude-autostart.sh +0 -305
  676. package/scripts/archive/setup-git-hooks.sh +0 -25
  677. package/scripts/archive/setup-linear-oauth.sh +0 -46
  678. package/scripts/archive/setup-mcp.sh +0 -113
  679. package/scripts/archive/setup-railway-deployment.sh +0 -81
  680. package/scripts/auto-handoff.sh +0 -262
  681. package/scripts/background-sync-manager.js +0 -478
  682. package/scripts/benchmark-performance.ts +0 -57
  683. package/scripts/check-redis.ts +0 -48
  684. package/scripts/chromadb-auto-loader.sh +0 -128
  685. package/scripts/chromadb-context-loader.js +0 -479
  686. package/scripts/claude-chromadb-hook.js +0 -460
  687. package/scripts/claude-linear-skill.js +0 -455
  688. package/scripts/claude-pre-commit.sh +0 -302
  689. package/scripts/claude-sm-autostart.js +0 -579
  690. package/scripts/claude-with-chromadb.sh +0 -69
  691. package/scripts/clean-linear-backlog.js +0 -273
  692. package/scripts/cleanup-old-sessions.sh +0 -57
  693. package/scripts/create-cleanup-issues.js +0 -302
  694. package/scripts/create-sandbox.sh +0 -269
  695. package/scripts/debug-linear-update.js +0 -174
  696. package/scripts/delete-linear-tasks.js +0 -167
  697. package/scripts/demos/browser-test.ts +0 -39
  698. package/scripts/demos/ralph-integration-demo.ts +0 -245
  699. package/scripts/demos/trace-demo.ts +0 -200
  700. package/scripts/demos/trace-detector.demo.ts +0 -171
  701. package/scripts/demos/trace-test.ts +0 -79
  702. package/scripts/deploy-ralph-swarm.sh +0 -365
  703. package/scripts/deploy.sh +0 -89
  704. package/scripts/deployment/test-deployment.js +0 -194
  705. package/scripts/detect-and-rehydrate.js +0 -162
  706. package/scripts/detect-and-rehydrate.mjs +0 -165
  707. package/scripts/development/create-demo-tasks.js +0 -143
  708. package/scripts/development/debug-frame-test.js +0 -16
  709. package/scripts/development/demo-auto-sync.js +0 -128
  710. package/scripts/development/fix-all-imports.js +0 -213
  711. package/scripts/development/fix-imports.js +0 -229
  712. package/scripts/development/fix-lint-loop.cjs +0 -103
  713. package/scripts/development/fix-project-id.ts +0 -161
  714. package/scripts/development/fix-strict-mode-issues.ts +0 -291
  715. package/scripts/development/reorganize-structure.sh +0 -228
  716. package/scripts/development/test-persistence-direct.js +0 -148
  717. package/scripts/development/test-persistence.js +0 -114
  718. package/scripts/development/test-tasks.js +0 -93
  719. package/scripts/development/update-imports.js +0 -212
  720. package/scripts/fetch-linear-status.js +0 -125
  721. package/scripts/initialize.ts +0 -220
  722. package/scripts/linear-auto-sync.js +0 -262
  723. package/scripts/linear-auto-sync.sh +0 -161
  724. package/scripts/linear-sync-daemon.js +0 -150
  725. package/scripts/linear-task-review.js +0 -237
  726. package/scripts/list-linear-tasks.ts +0 -178
  727. package/scripts/mcp-proxy.js +0 -66
  728. package/scripts/measure-handoff-impact.mjs +0 -395
  729. package/scripts/measure-handoff-impact.ts +0 -450
  730. package/scripts/publish-local.js +0 -74
  731. package/scripts/query-chromadb.ts +0 -201
  732. package/scripts/ralph-integration-test.js +0 -274
  733. package/scripts/reconcile-local-tasks.js +0 -170
  734. package/scripts/recreate-frames-db.js +0 -89
  735. package/scripts/show-linear-summary.ts +0 -172
  736. package/scripts/simple-swarm-demo.ts +0 -114
  737. package/scripts/stackmemory-auto-handoff.sh +0 -231
  738. package/scripts/start-linear-sync-daemon.sh +0 -141
  739. package/scripts/start-temporal-paradox.sh +0 -214
  740. package/scripts/status.ts +0 -224
  741. package/scripts/stop-notify-webhook.sh +0 -19
  742. package/scripts/swarm-monitor.js +0 -509
  743. package/scripts/sync-and-clean-tasks.js +0 -258
  744. package/scripts/sync-linear-graphql.js +0 -303
  745. package/scripts/sync-linear-tasks.js +0 -186
  746. package/scripts/test-auto-triggers.sh +0 -57
  747. package/scripts/test-browser-mcp.js +0 -74
  748. package/scripts/test-chromadb-full.js +0 -115
  749. package/scripts/test-chromadb-hooks.sh +0 -28
  750. package/scripts/test-chromadb-sync.ts +0 -245
  751. package/scripts/test-claude-config.sh +0 -123
  752. package/scripts/test-cli-security.js +0 -293
  753. package/scripts/test-code-execution.js +0 -143
  754. package/scripts/test-hooks-persistence.sh +0 -220
  755. package/scripts/test-installation-scenarios.sh +0 -359
  756. package/scripts/test-installation.sh +0 -224
  757. package/scripts/test-mcp.js +0 -163
  758. package/scripts/test-parallel-swarms.js +0 -443
  759. package/scripts/test-pre-publish-quick.sh +0 -69
  760. package/scripts/test-quality-gates.sh +0 -263
  761. package/scripts/test-ralph-iteration-fix.ts +0 -118
  762. package/scripts/test-ralph-iterations.ts +0 -164
  763. package/scripts/test-redis-storage.ts +0 -490
  764. package/scripts/test-rlm-basic.sh +0 -122
  765. package/scripts/test-rlm-comprehensive.sh +0 -260
  766. package/scripts/test-rlm-e2e.sh +0 -268
  767. package/scripts/test-rlm-simple.js +0 -90
  768. package/scripts/test-rlm.js +0 -110
  769. package/scripts/test-session-handoff.sh +0 -165
  770. package/scripts/test-setup-e2e.sh +0 -154
  771. package/scripts/test-shell-integration.sh +0 -275
  772. package/scripts/test-simple-ralph-state-sync.ts +0 -178
  773. package/scripts/test-swarm-fixes.ts +0 -161
  774. package/scripts/test-swarm-git-workflow.js +0 -338
  775. package/scripts/test-swarm-tui.ts +0 -34
  776. package/scripts/test-tui-shortcuts.ts +0 -66
  777. package/scripts/testing/ab-test-runner.ts +0 -510
  778. package/scripts/testing/collect-metrics.ts +0 -457
  779. package/scripts/testing/quick-effectiveness-demo.js +0 -187
  780. package/scripts/testing/ralph-cli-test.js +0 -88
  781. package/scripts/testing/ralph-integration-validation.js +0 -727
  782. package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
  783. package/scripts/testing/real-performance-test.js +0 -422
  784. package/scripts/testing/results/real-performance-results.json +0 -90
  785. package/scripts/testing/run-effectiveness-tests.sh +0 -176
  786. package/scripts/testing/simple-effectiveness-test.js +0 -310
  787. package/scripts/testing/test-tier-migration.js +0 -100
  788. package/scripts/update-linear-status.js +0 -268
  789. package/scripts/update-linear-tasks-fixed.js +0 -284
  790. package/scripts/validate-claude-config.sh +0 -155
  791. package/scripts/validate-swarm-implementation.js +0 -467
  792. package/scripts/validate-tui-shortcuts.ts +0 -83
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/hooks/sms-watcher.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * SMS Response Watcher\n * Watches for incoming SMS/WhatsApp responses and triggers notifications\n *\n * Run in background: stackmemory notify watch-responses &\n */\n\nimport { existsSync, readFileSync, watchFile, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\n\nconst RESPONSE_PATH = join(\n homedir(),\n '.stackmemory',\n 'sms-latest-response.json'\n);\nconst SIGNAL_PATH = join(homedir(), '.stackmemory', 'sms-signal.txt');\n\ninterface SMSResponse {\n promptId: string;\n response: string;\n timestamp: string;\n}\n\nlet lastProcessedTimestamp = '';\n\nfunction checkForResponse(): SMSResponse | null {\n try {\n if (existsSync(RESPONSE_PATH)) {\n const data = JSON.parse(\n readFileSync(RESPONSE_PATH, 'utf8')\n ) as SMSResponse;\n\n // Only process new responses\n if (data.timestamp !== lastProcessedTimestamp) {\n lastProcessedTimestamp = data.timestamp;\n return data;\n }\n }\n } catch {\n // Ignore errors\n }\n return null;\n}\n\nfunction triggerNotification(response: SMSResponse): void {\n const message = `SMS Response: \"${response.response}\"`;\n\n // macOS notification\n try {\n execSync(\n `osascript -e 'display notification \"${message}\" with title \"StackMemory\"'`,\n {\n stdio: 'ignore',\n }\n );\n } catch {\n // Ignore if not on macOS\n }\n\n // Terminal bell\n process.stdout.write('\\x07');\n\n // Write to signal file (for other processes to detect)\n try {\n writeFileSync(\n SIGNAL_PATH,\n JSON.stringify({\n type: 'sms_response',\n response: response.response,\n promptId: response.promptId,\n timestamp: new Date().toISOString(),\n })\n );\n } catch {\n // Ignore\n }\n\n // Output to terminal\n console.log(`\\n[SMS] User responded: \"${response.response}\"`);\n console.log(`[SMS] Run: stackmemory notify run-actions\\n`);\n}\n\nexport function startResponseWatcher(intervalMs: number = 2000): void {\n console.log('[SMS Watcher] Watching for responses...');\n console.log('[SMS Watcher] Press Ctrl+C to stop\\n');\n\n // Initial check\n const initial = checkForResponse();\n if (initial) {\n triggerNotification(initial);\n }\n\n // Poll for changes\n setInterval(() => {\n const response = checkForResponse();\n if (response) {\n triggerNotification(response);\n }\n }, intervalMs);\n}\n\n// Also watch file for immediate notification\nexport function startFileWatcher(): void {\n console.log('[SMS Watcher] Watching for responses (file mode)...');\n\n watchFile(RESPONSE_PATH, { interval: 1000 }, () => {\n const response = checkForResponse();\n if (response) {\n triggerNotification(response);\n }\n });\n}\n\n// CLI entry\nif (process.argv[1]?.includes('sms-watcher')) {\n startResponseWatcher();\n}\n\nexport { checkForResponse, triggerNotification };\n"],
5
- "mappings": ";;;;;AAQA,SAAS,YAAY,cAAc,WAAW,qBAAqB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAEzB,MAAM,gBAAgB;AAAA,EACpB,QAAQ;AAAA,EACR;AAAA,EACA;AACF;AACA,MAAM,cAAc,KAAK,QAAQ,GAAG,gBAAgB,gBAAgB;AAQpE,IAAI,yBAAyB;AAE7B,SAAS,mBAAuC;AAC9C,MAAI;AACF,QAAI,WAAW,aAAa,GAAG;AAC7B,YAAM,OAAO,KAAK;AAAA,QAChB,aAAa,eAAe,MAAM;AAAA,MACpC;AAGA,UAAI,KAAK,cAAc,wBAAwB;AAC7C,iCAAyB,KAAK;AAC9B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAA6B;AACxD,QAAM,UAAU,kBAAkB,SAAS,QAAQ;AAGnD,MAAI;AACF;AAAA,MACE,uCAAuC,OAAO;AAAA,MAC9C;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,UAAQ,OAAO,MAAM,MAAM;AAG3B,MAAI;AACF;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb,MAAM;AAAA,QACN,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,QACnB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,UAAQ,IAAI;AAAA,yBAA4B,SAAS,QAAQ,GAAG;AAC5D,UAAQ,IAAI;AAAA,CAA6C;AAC3D;AAEO,SAAS,qBAAqB,aAAqB,KAAY;AACpE,UAAQ,IAAI,yCAAyC;AACrD,UAAQ,IAAI,sCAAsC;AAGlD,QAAM,UAAU,iBAAiB;AACjC,MAAI,SAAS;AACX,wBAAoB,OAAO;AAAA,EAC7B;AAGA,cAAY,MAAM;AAChB,UAAM,WAAW,iBAAiB;AAClC,QAAI,UAAU;AACZ,0BAAoB,QAAQ;AAAA,IAC9B;AAAA,EACF,GAAG,UAAU;AACf;AAGO,SAAS,mBAAyB;AACvC,UAAQ,IAAI,qDAAqD;AAEjE,YAAU,eAAe,EAAE,UAAU,IAAK,GAAG,MAAM;AACjD,UAAM,WAAW,iBAAiB;AAClC,QAAI,UAAU;AACZ,0BAAoB,QAAQ;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;AAGA,IAAI,QAAQ,KAAK,CAAC,GAAG,SAAS,aAAa,GAAG;AAC5C,uBAAqB;AACvB;",
6
- "names": []
7
- }
@@ -1,555 +0,0 @@
1
- import { fileURLToPath as __fileURLToPath } from 'url';
2
- import { dirname as __pathDirname } from 'path';
3
- const __filename = __fileURLToPath(import.meta.url);
4
- const __dirname = __pathDirname(__filename);
5
- import { createServer } from "http";
6
- import { parse as parseUrl } from "url";
7
- import { existsSync, readFileSync } from "fs";
8
- import { join } from "path";
9
- import { homedir } from "os";
10
- import { createHmac } from "crypto";
11
- import { execFileSync } from "child_process";
12
- import {
13
- processIncomingResponse,
14
- loadSMSConfig,
15
- cleanupExpiredPrompts,
16
- sendNotification
17
- } from "./sms-notify.js";
18
- import {
19
- queueAction,
20
- executeActionSafe,
21
- cleanupOldActions
22
- } from "./sms-action-runner.js";
23
- import {
24
- isCommand,
25
- processCommand,
26
- sendCommandResponse
27
- } from "./whatsapp-commands.js";
28
- import { writeFileSecure, ensureSecureDir } from "./secure-fs.js";
29
- import {
30
- logWebhookRequest,
31
- logRateLimit,
32
- logSignatureInvalid,
33
- logBodyTooLarge,
34
- logContentTypeInvalid,
35
- logActionAllowed,
36
- logActionBlocked,
37
- logCleanup
38
- } from "./security-logger.js";
39
- const CLEANUP_INTERVAL_MS = 5 * 60 * 1e3;
40
- const MAX_SMS_BODY_LENGTH = 1e3;
41
- const MAX_PHONE_LENGTH = 50;
42
- const MAX_BODY_SIZE = 50 * 1024;
43
- const RATE_LIMIT_WINDOW_MS = 60 * 1e3;
44
- const RATE_LIMIT_MAX_REQUESTS = 30;
45
- const ACTION_TIMEOUT_MS = 6e4;
46
- async function executeActionWithTimeout(action, response) {
47
- return Promise.race([
48
- executeActionSafe(action, response),
49
- new Promise(
50
- (_, reject) => setTimeout(
51
- () => reject(new Error(`Action timed out after ${ACTION_TIMEOUT_MS}ms`)),
52
- ACTION_TIMEOUT_MS
53
- )
54
- )
55
- ]).catch((error) => ({
56
- success: false,
57
- error: error instanceof Error ? error.message : String(error)
58
- }));
59
- }
60
- const RATE_LIMIT_PATH = join(homedir(), ".stackmemory", "rate-limits.json");
61
- let rateLimitCache = {};
62
- let rateLimitCacheDirty = false;
63
- function loadRateLimits() {
64
- try {
65
- if (existsSync(RATE_LIMIT_PATH)) {
66
- const data = JSON.parse(readFileSync(RATE_LIMIT_PATH, "utf8"));
67
- const now = Date.now();
68
- const cleaned = {};
69
- for (const [ip, record] of Object.entries(data)) {
70
- const r = record;
71
- if (r.resetTime > now) {
72
- cleaned[ip] = r;
73
- }
74
- }
75
- return cleaned;
76
- }
77
- } catch {
78
- }
79
- return {};
80
- }
81
- function saveRateLimits() {
82
- if (!rateLimitCacheDirty) return;
83
- try {
84
- ensureSecureDir(join(homedir(), ".stackmemory"));
85
- writeFileSecure(RATE_LIMIT_PATH, JSON.stringify(rateLimitCache));
86
- rateLimitCacheDirty = false;
87
- } catch {
88
- }
89
- }
90
- setInterval(saveRateLimits, 3e4);
91
- rateLimitCache = loadRateLimits();
92
- function checkRateLimit(ip) {
93
- const now = Date.now();
94
- const record = rateLimitCache[ip];
95
- if (!record || now > record.resetTime) {
96
- rateLimitCache[ip] = { count: 1, resetTime: now + RATE_LIMIT_WINDOW_MS };
97
- rateLimitCacheDirty = true;
98
- return true;
99
- }
100
- if (record.count >= RATE_LIMIT_MAX_REQUESTS) {
101
- return false;
102
- }
103
- record.count++;
104
- rateLimitCacheDirty = true;
105
- return true;
106
- }
107
- function verifyTwilioSignature(url, params, signature) {
108
- const authToken = process.env["TWILIO_AUTH_TOKEN"];
109
- if (!authToken) {
110
- const isDev = process.env["NODE_ENV"] === "development" || process.env["SKIP_TWILIO_VERIFICATION"] === "true";
111
- if (isDev) {
112
- console.warn(
113
- "[sms-webhook] TWILIO_AUTH_TOKEN not set, skipping verification (dev mode)"
114
- );
115
- return true;
116
- }
117
- console.error(
118
- "[sms-webhook] TWILIO_AUTH_TOKEN not set - rejecting request in production"
119
- );
120
- return false;
121
- }
122
- const sortedKeys = Object.keys(params).sort();
123
- let data = url;
124
- for (const key of sortedKeys) {
125
- data += key + params[key];
126
- }
127
- const hmac = createHmac("sha1", authToken);
128
- hmac.update(data);
129
- const expectedSignature = hmac.digest("base64");
130
- return signature === expectedSignature;
131
- }
132
- function parseFormData(body) {
133
- const params = new URLSearchParams(body);
134
- const result = {};
135
- params.forEach((value, key) => {
136
- result[key] = value;
137
- });
138
- return result;
139
- }
140
- function storeLatestResponse(promptId, response, action) {
141
- ensureSecureDir(join(homedir(), ".stackmemory"));
142
- const responsePath = join(
143
- homedir(),
144
- ".stackmemory",
145
- "sms-latest-response.json"
146
- );
147
- writeFileSecure(
148
- responsePath,
149
- JSON.stringify({
150
- promptId,
151
- response,
152
- action,
153
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
154
- })
155
- );
156
- }
157
- function storeIncomingRequest(from, message) {
158
- ensureSecureDir(join(homedir(), ".stackmemory"));
159
- const requestPath = join(
160
- homedir(),
161
- ".stackmemory",
162
- "sms-incoming-request.json"
163
- );
164
- writeFileSecure(
165
- requestPath,
166
- JSON.stringify({
167
- from,
168
- message,
169
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
170
- processed: false
171
- })
172
- );
173
- }
174
- function getIncomingRequest() {
175
- const requestPath = join(
176
- homedir(),
177
- ".stackmemory",
178
- "sms-incoming-request.json"
179
- );
180
- if (!existsSync(requestPath)) {
181
- return null;
182
- }
183
- try {
184
- const data = JSON.parse(readFileSync(requestPath, "utf-8"));
185
- if (data.processed) {
186
- return null;
187
- }
188
- return data;
189
- } catch {
190
- return null;
191
- }
192
- }
193
- function markRequestProcessed() {
194
- const requestPath = join(
195
- homedir(),
196
- ".stackmemory",
197
- "sms-incoming-request.json"
198
- );
199
- if (!existsSync(requestPath)) {
200
- return;
201
- }
202
- try {
203
- const data = JSON.parse(readFileSync(requestPath, "utf-8"));
204
- data.processed = true;
205
- writeFileSecure(requestPath, JSON.stringify(data));
206
- } catch {
207
- }
208
- }
209
- async function handleSMSWebhook(payload) {
210
- const { From, Body } = payload;
211
- if (Body && Body.length > MAX_SMS_BODY_LENGTH) {
212
- console.log(`[sms-webhook] Body too long: ${Body.length} chars`);
213
- return { response: "Message too long. Max 1000 characters." };
214
- }
215
- if (From && From.length > MAX_PHONE_LENGTH) {
216
- console.log(
217
- `[sms-webhook] Phone number too long: ${From.length} chars (max ${MAX_PHONE_LENGTH}): ${From.substring(0, 30)}...`
218
- );
219
- return { response: "Invalid phone number." };
220
- }
221
- console.log(`[sms-webhook] Received from ${From}: ${Body}`);
222
- if (isCommand(Body)) {
223
- console.log(`[sms-webhook] Processing command: ${Body}`);
224
- const cmdResult = await processCommand(From, Body);
225
- if (cmdResult.handled) {
226
- if (cmdResult.response) {
227
- sendCommandResponse(cmdResult.response).catch(console.error);
228
- }
229
- return {
230
- response: cmdResult.response || "Command processed",
231
- action: cmdResult.action,
232
- queued: false
233
- };
234
- }
235
- }
236
- const result = processIncomingResponse(From, Body);
237
- if (!result.matched) {
238
- if (result.prompt) {
239
- return {
240
- response: `Invalid response. Expected: ${result.prompt.options.map((o) => o.key).join(", ")}`
241
- };
242
- }
243
- storeIncomingRequest(From, Body);
244
- console.log(
245
- `[sms-webhook] Stored new request from ${From}: ${Body.substring(0, 50)}...`
246
- );
247
- return { response: "Got it! Your request has been queued." };
248
- }
249
- storeLatestResponse(
250
- result.prompt?.id || "unknown",
251
- result.response || Body,
252
- result.action
253
- );
254
- triggerResponseNotification(result.response || Body);
255
- if (result.action) {
256
- console.log(`[sms-webhook] Executing action: ${result.action}`);
257
- const actionResult = await executeActionWithTimeout(
258
- result.action,
259
- result.response || Body
260
- );
261
- if (actionResult.success) {
262
- logActionAllowed("sms-webhook", result.action);
263
- console.log(
264
- `[sms-webhook] Action completed: ${(actionResult.output || "").substring(0, 200)}`
265
- );
266
- return {
267
- response: `Done! Action executed successfully.`,
268
- action: result.action,
269
- queued: false
270
- };
271
- } else {
272
- logActionBlocked(
273
- "sms-webhook",
274
- result.action,
275
- actionResult.error || "unknown"
276
- );
277
- console.log(`[sms-webhook] Action failed: ${actionResult.error}`);
278
- queueAction(
279
- result.prompt?.id || "unknown",
280
- result.response || Body,
281
- result.action
282
- );
283
- return {
284
- response: `Action failed, queued for retry: ${(actionResult.error || "").substring(0, 50)}`,
285
- action: result.action,
286
- queued: true
287
- };
288
- }
289
- }
290
- return {
291
- response: `Received: ${result.response}. Next action will be triggered.`
292
- };
293
- }
294
- function escapeAppleScript(str) {
295
- return str.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").substring(0, 200);
296
- }
297
- function triggerResponseNotification(response) {
298
- const safeMessage = escapeAppleScript(`SMS Response: ${response}`);
299
- try {
300
- execFileSync(
301
- "osascript",
302
- [
303
- "-e",
304
- `display notification "${safeMessage}" with title "StackMemory" sound name "Glass"`
305
- ],
306
- { stdio: "ignore", timeout: 5e3 }
307
- );
308
- } catch {
309
- }
310
- try {
311
- const signalPath = join(homedir(), ".stackmemory", "sms-signal.txt");
312
- writeFileSecure(
313
- signalPath,
314
- JSON.stringify({
315
- type: "sms_response",
316
- response,
317
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
318
- })
319
- );
320
- } catch {
321
- }
322
- console.log(`
323
- *** SMS RESPONSE RECEIVED: "${response}" ***`);
324
- console.log(`*** Run: stackmemory notify run-actions ***
325
- `);
326
- }
327
- function twimlResponse(message) {
328
- return `<?xml version="1.0" encoding="UTF-8"?>
329
- <Response>
330
- <Message>${escapeXml(message)}</Message>
331
- </Response>`;
332
- }
333
- function escapeXml(str) {
334
- return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
335
- }
336
- function startWebhookServer(port = 3456) {
337
- const server = createServer(
338
- async (req, res) => {
339
- const url = parseUrl(req.url || "/", true);
340
- if (url.pathname === "/health") {
341
- res.writeHead(200, { "Content-Type": "application/json" });
342
- res.end(JSON.stringify({ status: "ok" }));
343
- return;
344
- }
345
- if ((url.pathname === "/sms" || url.pathname === "/sms/incoming" || url.pathname === "/webhook") && req.method === "POST") {
346
- const clientIp = req.socket.remoteAddress || "unknown";
347
- logWebhookRequest(
348
- "sms-webhook",
349
- req.method || "POST",
350
- url.pathname || "/sms",
351
- clientIp
352
- );
353
- if (!checkRateLimit(clientIp)) {
354
- logRateLimit("sms-webhook", clientIp);
355
- res.writeHead(429, {
356
- "Content-Type": "text/xml",
357
- "Retry-After": "60"
358
- });
359
- res.end(twimlResponse("Too many requests. Please try again later."));
360
- return;
361
- }
362
- const contentType = req.headers["content-type"] || "";
363
- if (!contentType.includes("application/x-www-form-urlencoded")) {
364
- logContentTypeInvalid("sms-webhook", contentType, clientIp);
365
- res.writeHead(400, { "Content-Type": "text/xml" });
366
- res.end(twimlResponse("Invalid content type"));
367
- return;
368
- }
369
- let body = "";
370
- let bodyTooLarge = false;
371
- req.on("data", (chunk) => {
372
- body += chunk;
373
- if (body.length > MAX_BODY_SIZE) {
374
- bodyTooLarge = true;
375
- logBodyTooLarge("sms-webhook", body.length, clientIp);
376
- req.destroy();
377
- }
378
- });
379
- req.on("end", async () => {
380
- if (bodyTooLarge) {
381
- res.writeHead(413, { "Content-Type": "text/xml" });
382
- res.end(twimlResponse("Request too large"));
383
- return;
384
- }
385
- try {
386
- const payload = parseFormData(
387
- body
388
- );
389
- const twilioSignature = req.headers["x-twilio-signature"];
390
- const webhookUrl = `${req.headers["x-forwarded-proto"] || "http"}://${req.headers.host}${req.url}`;
391
- if (twilioSignature && !verifyTwilioSignature(
392
- webhookUrl,
393
- payload,
394
- twilioSignature
395
- )) {
396
- logSignatureInvalid("sms-webhook", clientIp);
397
- console.error("[sms-webhook] Invalid Twilio signature");
398
- res.writeHead(401, { "Content-Type": "text/xml" });
399
- res.end(twimlResponse("Unauthorized"));
400
- return;
401
- }
402
- const result = await handleSMSWebhook(payload);
403
- res.writeHead(200, { "Content-Type": "text/xml" });
404
- res.end(twimlResponse(result.response));
405
- } catch (err) {
406
- console.error("[sms-webhook] Error:", err);
407
- res.writeHead(500, { "Content-Type": "text/xml" });
408
- res.end(twimlResponse("Error processing message"));
409
- }
410
- });
411
- return;
412
- }
413
- if (url.pathname === "/sms/status" && req.method === "POST") {
414
- let body = "";
415
- req.on("data", (chunk) => {
416
- body += chunk;
417
- });
418
- req.on("end", () => {
419
- try {
420
- const payload = parseFormData(body);
421
- console.log(
422
- `[sms-webhook] Status update: ${payload["MessageSid"]} -> ${payload["MessageStatus"]}`
423
- );
424
- const statusPath = join(
425
- homedir(),
426
- ".stackmemory",
427
- "sms-status.json"
428
- );
429
- const statuses = existsSync(statusPath) ? JSON.parse(readFileSync(statusPath, "utf8")) : {};
430
- statuses[payload["MessageSid"]] = payload["MessageStatus"];
431
- writeFileSecure(statusPath, JSON.stringify(statuses, null, 2));
432
- res.writeHead(200, { "Content-Type": "text/plain" });
433
- res.end("OK");
434
- } catch (err) {
435
- console.error("[sms-webhook] Status error:", err);
436
- res.writeHead(500);
437
- res.end("Error");
438
- }
439
- });
440
- return;
441
- }
442
- if (url.pathname === "/status") {
443
- const config = loadSMSConfig();
444
- res.writeHead(200, { "Content-Type": "application/json" });
445
- res.end(
446
- JSON.stringify({
447
- enabled: config.enabled,
448
- pendingPrompts: config.pendingPrompts.length
449
- })
450
- );
451
- return;
452
- }
453
- if (url.pathname === "/request" && req.method === "GET") {
454
- const request = getIncomingRequest();
455
- res.writeHead(200, { "Content-Type": "application/json" });
456
- res.end(JSON.stringify({ request }));
457
- return;
458
- }
459
- if (url.pathname === "/request/ack" && req.method === "POST") {
460
- markRequestProcessed();
461
- res.writeHead(200, { "Content-Type": "application/json" });
462
- res.end(JSON.stringify({ success: true }));
463
- return;
464
- }
465
- if (url.pathname === "/send" && req.method === "POST") {
466
- let body = "";
467
- req.on("data", (chunk) => {
468
- body += chunk;
469
- if (body.length > MAX_BODY_SIZE) {
470
- req.destroy();
471
- }
472
- });
473
- req.on("end", async () => {
474
- try {
475
- const payload = JSON.parse(body);
476
- const message = payload.message || payload.body || "";
477
- const title = payload.title || "Notification";
478
- const type = payload.type || "custom";
479
- if (!message) {
480
- res.writeHead(400, { "Content-Type": "application/json" });
481
- res.end(
482
- JSON.stringify({ success: false, error: "Message required" })
483
- );
484
- return;
485
- }
486
- const result = await sendNotification({
487
- type,
488
- title,
489
- message
490
- });
491
- res.writeHead(result.success ? 200 : 500, {
492
- "Content-Type": "application/json"
493
- });
494
- res.end(JSON.stringify(result));
495
- } catch (err) {
496
- console.error("[sms-webhook] Send error:", err);
497
- res.writeHead(500, { "Content-Type": "application/json" });
498
- res.end(
499
- JSON.stringify({
500
- success: false,
501
- error: err instanceof Error ? err.message : "Send failed"
502
- })
503
- );
504
- }
505
- });
506
- return;
507
- }
508
- res.writeHead(404);
509
- res.end("Not found");
510
- }
511
- );
512
- server.listen(port, () => {
513
- console.log(`[sms-webhook] Server listening on port ${port}`);
514
- console.log(
515
- `[sms-webhook] Incoming messages: http://localhost:${port}/sms/incoming`
516
- );
517
- console.log(
518
- `[sms-webhook] Status callback: http://localhost:${port}/sms/status`
519
- );
520
- console.log(`[sms-webhook] Configure these URLs in Twilio console`);
521
- setInterval(() => {
522
- try {
523
- const expiredPrompts = cleanupExpiredPrompts();
524
- const oldActions = cleanupOldActions();
525
- if (expiredPrompts > 0 || oldActions > 0) {
526
- logCleanup("sms-webhook", expiredPrompts, oldActions);
527
- console.log(
528
- `[sms-webhook] Cleanup: ${expiredPrompts} expired prompts, ${oldActions} old actions`
529
- );
530
- }
531
- } catch {
532
- }
533
- }, CLEANUP_INTERVAL_MS);
534
- console.log(
535
- `[sms-webhook] Cleanup interval: every ${CLEANUP_INTERVAL_MS / 1e3}s`
536
- );
537
- });
538
- }
539
- async function smsWebhookMiddleware(req, res) {
540
- const result = await handleSMSWebhook(req.body);
541
- res.type("text/xml");
542
- res.send(twimlResponse(result.response));
543
- }
544
- if (process.argv[1]?.endsWith("sms-webhook.js")) {
545
- const port = parseInt(process.env["SMS_WEBHOOK_PORT"] || "3456", 10);
546
- startWebhookServer(port);
547
- }
548
- export {
549
- getIncomingRequest,
550
- handleSMSWebhook,
551
- markRequestProcessed,
552
- smsWebhookMiddleware,
553
- startWebhookServer
554
- };
555
- //# sourceMappingURL=sms-webhook.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/hooks/sms-webhook.ts"],
4
- "sourcesContent": ["/**\n * SMS Webhook Handler for receiving Twilio responses\n * Can run as standalone server or integrate with existing Express app\n *\n * Security features:\n * - Twilio signature verification\n * - Rate limiting per IP\n * - Body size limits\n * - Content-type validation\n * - Safe action execution (no shell injection)\n */\n\nimport { createServer, IncomingMessage, ServerResponse } from 'http';\nimport { parse as parseUrl } from 'url';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { createHmac } from 'crypto';\nimport { execFileSync } from 'child_process';\nimport {\n processIncomingResponse,\n loadSMSConfig,\n cleanupExpiredPrompts,\n sendNotification,\n} from './sms-notify.js';\nimport {\n queueAction,\n executeActionSafe,\n cleanupOldActions,\n type ActionResult,\n} from './sms-action-runner.js';\nimport {\n isCommand,\n processCommand,\n sendCommandResponse,\n} from './whatsapp-commands.js';\nimport { writeFileSecure, ensureSecureDir } from './secure-fs.js';\nimport {\n logWebhookRequest,\n logRateLimit,\n logSignatureInvalid,\n logBodyTooLarge,\n logContentTypeInvalid,\n logActionAllowed,\n logActionBlocked,\n logCleanup,\n} from './security-logger.js';\n\n// Cleanup interval (5 minutes)\nconst CLEANUP_INTERVAL_MS = 5 * 60 * 1000;\n\n// Input validation constants\nconst MAX_SMS_BODY_LENGTH = 1000;\nconst MAX_PHONE_LENGTH = 50; // WhatsApp format: whatsapp:+12345678901\n\n// Security constants\nconst MAX_BODY_SIZE = 50 * 1024; // 50KB max body\nconst RATE_LIMIT_WINDOW_MS = 60 * 1000; // 1 minute\nconst RATE_LIMIT_MAX_REQUESTS = 30; // 30 requests per minute per IP\nconst ACTION_TIMEOUT_MS = 60000; // 60 second timeout for action execution\n\n/**\n * Execute action with timeout to prevent hanging requests\n */\nasync function executeActionWithTimeout(\n action: string,\n response: string\n): Promise<ActionResult> {\n return Promise.race([\n executeActionSafe(action, response),\n new Promise<ActionResult>((_, reject) =>\n setTimeout(\n () =>\n reject(new Error(`Action timed out after ${ACTION_TIMEOUT_MS}ms`)),\n ACTION_TIMEOUT_MS\n )\n ),\n ]).catch((error) => ({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }));\n}\n\n// Rate limiting store - persisted to disk to survive restarts\nconst RATE_LIMIT_PATH = join(homedir(), '.stackmemory', 'rate-limits.json');\n\ninterface RateLimitRecord {\n count: number;\n resetTime: number;\n}\n\ninterface RateLimitStore {\n [ip: string]: RateLimitRecord;\n}\n\n// In-memory cache with periodic persistence\nlet rateLimitCache: RateLimitStore = {};\nlet rateLimitCacheDirty = false;\n\nfunction loadRateLimits(): RateLimitStore {\n try {\n if (existsSync(RATE_LIMIT_PATH)) {\n const data = JSON.parse(readFileSync(RATE_LIMIT_PATH, 'utf8'));\n // Clean up expired entries on load\n const now = Date.now();\n const cleaned: RateLimitStore = {};\n for (const [ip, record] of Object.entries(data)) {\n const r = record as RateLimitRecord;\n if (r.resetTime > now) {\n cleaned[ip] = r;\n }\n }\n return cleaned;\n }\n } catch {\n // Use empty store on error\n }\n return {};\n}\n\nfunction saveRateLimits(): void {\n if (!rateLimitCacheDirty) return;\n try {\n ensureSecureDir(join(homedir(), '.stackmemory'));\n writeFileSecure(RATE_LIMIT_PATH, JSON.stringify(rateLimitCache));\n rateLimitCacheDirty = false;\n } catch {\n // Ignore save errors - rate limiting is best-effort\n }\n}\n\n// Persist rate limits periodically (every 30 seconds)\nsetInterval(saveRateLimits, 30000);\n\n// Load on startup\nrateLimitCache = loadRateLimits();\n\nfunction checkRateLimit(ip: string): boolean {\n const now = Date.now();\n const record = rateLimitCache[ip];\n\n if (!record || now > record.resetTime) {\n rateLimitCache[ip] = { count: 1, resetTime: now + RATE_LIMIT_WINDOW_MS };\n rateLimitCacheDirty = true;\n return true;\n }\n\n if (record.count >= RATE_LIMIT_MAX_REQUESTS) {\n return false;\n }\n\n record.count++;\n rateLimitCacheDirty = true;\n return true;\n}\n\n// Twilio signature verification\nfunction verifyTwilioSignature(\n url: string,\n params: Record<string, string>,\n signature: string\n): boolean {\n const authToken = process.env['TWILIO_AUTH_TOKEN'];\n if (!authToken) {\n // Only allow bypass in explicit development mode\n const isDev =\n process.env['NODE_ENV'] === 'development' ||\n process.env['SKIP_TWILIO_VERIFICATION'] === 'true';\n\n if (isDev) {\n console.warn(\n '[sms-webhook] TWILIO_AUTH_TOKEN not set, skipping verification (dev mode)'\n );\n return true;\n }\n\n // In production, reject requests without auth token configured\n console.error(\n '[sms-webhook] TWILIO_AUTH_TOKEN not set - rejecting request in production'\n );\n return false;\n }\n\n // Build the data string (URL + sorted params)\n const sortedKeys = Object.keys(params).sort();\n let data = url;\n for (const key of sortedKeys) {\n data += key + params[key];\n }\n\n // Calculate expected signature\n const hmac = createHmac('sha1', authToken);\n hmac.update(data);\n const expectedSignature = hmac.digest('base64');\n\n return signature === expectedSignature;\n}\n\ninterface TwilioWebhookPayload {\n From: string;\n To: string;\n Body: string;\n MessageSid: string;\n}\n\nfunction parseFormData(body: string): Record<string, string> {\n const params = new URLSearchParams(body);\n const result: Record<string, string> = {};\n params.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\n// Store response for Claude hook to pick up\nfunction storeLatestResponse(\n promptId: string,\n response: string,\n action?: string\n): void {\n ensureSecureDir(join(homedir(), '.stackmemory'));\n const responsePath = join(\n homedir(),\n '.stackmemory',\n 'sms-latest-response.json'\n );\n writeFileSecure(\n responsePath,\n JSON.stringify({\n promptId,\n response,\n action,\n timestamp: new Date().toISOString(),\n })\n );\n}\n\n/**\n * Store incoming request for Claude to pick up\n * Used when a WhatsApp/SMS message arrives without a pending prompt\n */\nfunction storeIncomingRequest(from: string, message: string): void {\n ensureSecureDir(join(homedir(), '.stackmemory'));\n const requestPath = join(\n homedir(),\n '.stackmemory',\n 'sms-incoming-request.json'\n );\n writeFileSecure(\n requestPath,\n JSON.stringify({\n from,\n message,\n timestamp: new Date().toISOString(),\n processed: false,\n })\n );\n}\n\n/**\n * Get pending incoming request (if any)\n */\nexport function getIncomingRequest(): {\n from: string;\n message: string;\n timestamp: string;\n processed: boolean;\n} | null {\n const requestPath = join(\n homedir(),\n '.stackmemory',\n 'sms-incoming-request.json'\n );\n if (!existsSync(requestPath)) {\n return null;\n }\n try {\n const data = JSON.parse(readFileSync(requestPath, 'utf-8'));\n if (data.processed) {\n return null;\n }\n return data;\n } catch {\n return null;\n }\n}\n\n/**\n * Mark incoming request as processed\n */\nexport function markRequestProcessed(): void {\n const requestPath = join(\n homedir(),\n '.stackmemory',\n 'sms-incoming-request.json'\n );\n if (!existsSync(requestPath)) {\n return;\n }\n try {\n const data = JSON.parse(readFileSync(requestPath, 'utf-8'));\n data.processed = true;\n writeFileSecure(requestPath, JSON.stringify(data));\n } catch {\n // Ignore errors\n }\n}\n\nexport async function handleSMSWebhook(payload: TwilioWebhookPayload): Promise<{\n response: string;\n action?: string;\n queued?: boolean;\n}> {\n const { From, Body } = payload;\n\n // Input length validation\n if (Body && Body.length > MAX_SMS_BODY_LENGTH) {\n console.log(`[sms-webhook] Body too long: ${Body.length} chars`);\n return { response: 'Message too long. Max 1000 characters.' };\n }\n\n if (From && From.length > MAX_PHONE_LENGTH) {\n console.log(\n `[sms-webhook] Phone number too long: ${From.length} chars (max ${MAX_PHONE_LENGTH}): ${From.substring(0, 30)}...`\n );\n return { response: 'Invalid phone number.' };\n }\n\n console.log(`[sms-webhook] Received from ${From}: ${Body}`);\n\n // Check for command prefix before prompt matching\n if (isCommand(Body)) {\n console.log(`[sms-webhook] Processing command: ${Body}`);\n const cmdResult = await processCommand(From, Body);\n\n if (cmdResult.handled) {\n // Send response back if we have one\n if (cmdResult.response) {\n // Don't await - fire and forget the response notification\n sendCommandResponse(cmdResult.response).catch(console.error);\n }\n\n return {\n response: cmdResult.response || 'Command processed',\n action: cmdResult.action,\n queued: false,\n };\n }\n // If not handled, fall through to regular prompt matching\n }\n\n const result = processIncomingResponse(From, Body);\n\n if (!result.matched) {\n if (result.prompt) {\n return {\n response: `Invalid response. Expected: ${result.prompt.options.map((o) => o.key).join(', ')}`,\n };\n }\n // No pending prompt - store as new incoming request for Claude\n storeIncomingRequest(From, Body);\n console.log(\n `[sms-webhook] Stored new request from ${From}: ${Body.substring(0, 50)}...`\n );\n return { response: 'Got it! Your request has been queued.' };\n }\n\n // Store response for Claude hook\n storeLatestResponse(\n result.prompt?.id || 'unknown',\n result.response || Body,\n result.action\n );\n\n // Trigger notification to alert user/Claude\n triggerResponseNotification(result.response || Body);\n\n // Execute action safely if present (no shell injection, with timeout)\n if (result.action) {\n console.log(`[sms-webhook] Executing action: ${result.action}`);\n\n const actionResult = await executeActionWithTimeout(\n result.action,\n result.response || Body\n );\n\n if (actionResult.success) {\n logActionAllowed('sms-webhook', result.action);\n console.log(\n `[sms-webhook] Action completed: ${(actionResult.output || '').substring(0, 200)}`\n );\n\n return {\n response: `Done! Action executed successfully.`,\n action: result.action,\n queued: false,\n };\n } else {\n logActionBlocked(\n 'sms-webhook',\n result.action,\n actionResult.error || 'unknown'\n );\n console.log(`[sms-webhook] Action failed: ${actionResult.error}`);\n\n // Queue for retry\n queueAction(\n result.prompt?.id || 'unknown',\n result.response || Body,\n result.action\n );\n\n return {\n response: `Action failed, queued for retry: ${(actionResult.error || '').substring(0, 50)}`,\n action: result.action,\n queued: true,\n };\n }\n }\n\n return {\n response: `Received: ${result.response}. Next action will be triggered.`,\n };\n}\n\n// Escape string for AppleScript (prevent injection)\nfunction escapeAppleScript(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .substring(0, 200); // Limit length\n}\n\n// Trigger notification when response received\nfunction triggerResponseNotification(response: string): void {\n const safeMessage = escapeAppleScript(`SMS Response: ${response}`);\n\n // macOS notification using execFile (safer than execSync with shell)\n try {\n execFileSync(\n 'osascript',\n [\n '-e',\n `display notification \"${safeMessage}\" with title \"StackMemory\" sound name \"Glass\"`,\n ],\n { stdio: 'ignore', timeout: 5000 }\n );\n } catch {\n // Ignore if not on macOS\n }\n\n // Write signal file for other processes\n try {\n const signalPath = join(homedir(), '.stackmemory', 'sms-signal.txt');\n writeFileSecure(\n signalPath,\n JSON.stringify({\n type: 'sms_response',\n response,\n timestamp: new Date().toISOString(),\n })\n );\n } catch {\n // Ignore\n }\n\n console.log(`\\n*** SMS RESPONSE RECEIVED: \"${response}\" ***`);\n console.log(`*** Run: stackmemory notify run-actions ***\\n`);\n}\n\n// TwiML response helper\nfunction twimlResponse(message: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n <Message>${escapeXml(message)}</Message>\n</Response>`;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\n// Standalone webhook server\nexport function startWebhookServer(port: number = 3456): void {\n const server = createServer(\n async (req: IncomingMessage, res: ServerResponse) => {\n const url = parseUrl(req.url || '/', true);\n\n // Health check\n if (url.pathname === '/health') {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok' }));\n return;\n }\n\n // SMS webhook endpoint (incoming messages)\n if (\n (url.pathname === '/sms' ||\n url.pathname === '/sms/incoming' ||\n url.pathname === '/webhook') &&\n req.method === 'POST'\n ) {\n const clientIp = req.socket.remoteAddress || 'unknown';\n\n // Log webhook request\n logWebhookRequest(\n 'sms-webhook',\n req.method || 'POST',\n url.pathname || '/sms',\n clientIp\n );\n\n // Rate limiting\n if (!checkRateLimit(clientIp)) {\n logRateLimit('sms-webhook', clientIp);\n res.writeHead(429, {\n 'Content-Type': 'text/xml',\n 'Retry-After': '60',\n });\n res.end(twimlResponse('Too many requests. Please try again later.'));\n return;\n }\n\n // Content-type validation\n const contentType = req.headers['content-type'] || '';\n if (!contentType.includes('application/x-www-form-urlencoded')) {\n logContentTypeInvalid('sms-webhook', contentType, clientIp);\n res.writeHead(400, { 'Content-Type': 'text/xml' });\n res.end(twimlResponse('Invalid content type'));\n return;\n }\n\n let body = '';\n let bodyTooLarge = false;\n\n req.on('data', (chunk) => {\n body += chunk;\n // Body size limit\n if (body.length > MAX_BODY_SIZE) {\n bodyTooLarge = true;\n logBodyTooLarge('sms-webhook', body.length, clientIp);\n req.destroy();\n }\n });\n\n req.on('end', async () => {\n if (bodyTooLarge) {\n res.writeHead(413, { 'Content-Type': 'text/xml' });\n res.end(twimlResponse('Request too large'));\n return;\n }\n\n try {\n const payload = parseFormData(\n body\n ) as unknown as TwilioWebhookPayload;\n\n // Verify Twilio signature\n const twilioSignature = req.headers['x-twilio-signature'] as string;\n const webhookUrl = `${req.headers['x-forwarded-proto'] || 'http'}://${req.headers.host}${req.url}`;\n\n if (\n twilioSignature &&\n !verifyTwilioSignature(\n webhookUrl,\n payload as unknown as Record<string, string>,\n twilioSignature\n )\n ) {\n logSignatureInvalid('sms-webhook', clientIp);\n console.error('[sms-webhook] Invalid Twilio signature');\n res.writeHead(401, { 'Content-Type': 'text/xml' });\n res.end(twimlResponse('Unauthorized'));\n return;\n }\n\n const result = await handleSMSWebhook(payload);\n\n res.writeHead(200, { 'Content-Type': 'text/xml' });\n res.end(twimlResponse(result.response));\n } catch (err) {\n console.error('[sms-webhook] Error:', err);\n res.writeHead(500, { 'Content-Type': 'text/xml' });\n res.end(twimlResponse('Error processing message'));\n }\n });\n return;\n }\n\n // Status callback endpoint (delivery status updates)\n if (url.pathname === '/sms/status' && req.method === 'POST') {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n });\n\n req.on('end', () => {\n try {\n const payload = parseFormData(body);\n console.log(\n `[sms-webhook] Status update: ${payload['MessageSid']} -> ${payload['MessageStatus']}`\n );\n\n // Store status for tracking\n const statusPath = join(\n homedir(),\n '.stackmemory',\n 'sms-status.json'\n );\n const statuses: Record<string, string> = existsSync(statusPath)\n ? JSON.parse(readFileSync(statusPath, 'utf8'))\n : {};\n statuses[payload['MessageSid']] = payload['MessageStatus'];\n writeFileSecure(statusPath, JSON.stringify(statuses, null, 2));\n\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end('OK');\n } catch (err) {\n console.error('[sms-webhook] Status error:', err);\n res.writeHead(500);\n res.end('Error');\n }\n });\n return;\n }\n\n // Server status endpoint\n if (url.pathname === '/status') {\n const config = loadSMSConfig();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n enabled: config.enabled,\n pendingPrompts: config.pendingPrompts.length,\n })\n );\n return;\n }\n\n // Get pending incoming request endpoint\n if (url.pathname === '/request' && req.method === 'GET') {\n const request = getIncomingRequest();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ request }));\n return;\n }\n\n // Mark request as processed endpoint\n if (url.pathname === '/request/ack' && req.method === 'POST') {\n markRequestProcessed();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ success: true }));\n return;\n }\n\n // Send outgoing notification endpoint\n if (url.pathname === '/send' && req.method === 'POST') {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n if (body.length > MAX_BODY_SIZE) {\n req.destroy();\n }\n });\n\n req.on('end', async () => {\n try {\n const payload = JSON.parse(body);\n const message = payload.message || payload.body || '';\n const title = payload.title || 'Notification';\n const type = payload.type || 'custom';\n\n if (!message) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({ success: false, error: 'Message required' })\n );\n return;\n }\n\n const result = await sendNotification({\n type: type as\n | 'task_complete'\n | 'review_ready'\n | 'error'\n | 'custom',\n title,\n message,\n });\n\n res.writeHead(result.success ? 200 : 500, {\n 'Content-Type': 'application/json',\n });\n res.end(JSON.stringify(result));\n } catch (err) {\n console.error('[sms-webhook] Send error:', err);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n success: false,\n error: err instanceof Error ? err.message : 'Send failed',\n })\n );\n }\n });\n return;\n }\n\n res.writeHead(404);\n res.end('Not found');\n }\n );\n\n server.listen(port, () => {\n console.log(`[sms-webhook] Server listening on port ${port}`);\n console.log(\n `[sms-webhook] Incoming messages: http://localhost:${port}/sms/incoming`\n );\n console.log(\n `[sms-webhook] Status callback: http://localhost:${port}/sms/status`\n );\n console.log(`[sms-webhook] Configure these URLs in Twilio console`);\n\n // Start timed cleanup of expired prompts and old actions\n setInterval(() => {\n try {\n const expiredPrompts = cleanupExpiredPrompts();\n const oldActions = cleanupOldActions();\n if (expiredPrompts > 0 || oldActions > 0) {\n logCleanup('sms-webhook', expiredPrompts, oldActions);\n console.log(\n `[sms-webhook] Cleanup: ${expiredPrompts} expired prompts, ${oldActions} old actions`\n );\n }\n } catch {\n // Ignore cleanup errors\n }\n }, CLEANUP_INTERVAL_MS);\n console.log(\n `[sms-webhook] Cleanup interval: every ${CLEANUP_INTERVAL_MS / 1000}s`\n );\n });\n}\n\n// Express middleware for integration\nexport async function smsWebhookMiddleware(\n req: { body: TwilioWebhookPayload },\n res: { type: (t: string) => void; send: (s: string) => void }\n): Promise<void> {\n const result = await handleSMSWebhook(req.body);\n res.type('text/xml');\n res.send(twimlResponse(result.response));\n}\n\n// CLI entry\nif (process.argv[1]?.endsWith('sms-webhook.js')) {\n const port = parseInt(process.env['SMS_WEBHOOK_PORT'] || '3456', 10);\n startWebhookServer(port);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }