@stackmemoryai/stackmemory 0.5.57 → 0.5.59

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 (611) hide show
  1. package/bin/codex-smd +6 -0
  2. package/dist/cli/codex-sm-danger.js +21 -0
  3. package/dist/cli/codex-sm-danger.js.map +7 -0
  4. package/dist/cli/commands/handoff.js +33 -3
  5. package/dist/cli/commands/handoff.js.map +2 -2
  6. package/dist/cli/commands/search.js +20 -3
  7. package/dist/cli/commands/search.js.map +2 -2
  8. package/dist/core/database/sqlite-adapter.js +13 -3
  9. package/dist/core/database/sqlite-adapter.js.map +2 -2
  10. package/dist/core/errors/error-utils.js +208 -0
  11. package/dist/core/errors/error-utils.js.map +7 -0
  12. package/dist/core/errors/index.js +13 -4
  13. package/dist/core/errors/index.js.map +2 -2
  14. package/dist/core/merge/unified-merge-resolver.js +303 -0
  15. package/dist/core/merge/unified-merge-resolver.js.map +7 -0
  16. package/dist/core/monitoring/logger.js +61 -9
  17. package/dist/core/monitoring/logger.js.map +2 -2
  18. package/dist/core/security/index.js +35 -0
  19. package/dist/core/security/index.js.map +7 -0
  20. package/dist/core/security/input-sanitizer.js +321 -0
  21. package/dist/core/security/input-sanitizer.js.map +7 -0
  22. package/dist/core/session/enhanced-handoff.js +136 -2
  23. package/dist/core/session/enhanced-handoff.js.map +3 -3
  24. package/dist/integrations/linear/client.js +5 -1
  25. package/dist/integrations/linear/client.js.map +2 -2
  26. package/dist/integrations/mcp/remote-server.js +27 -36
  27. package/dist/integrations/mcp/remote-server.js.map +2 -2
  28. package/dist/integrations/mcp/server.js +44 -29
  29. package/dist/integrations/mcp/server.js.map +3 -3
  30. package/dist/scripts/benchmark-performance.js +48 -0
  31. package/dist/scripts/benchmark-performance.js.map +7 -0
  32. package/dist/scripts/check-redis.js +42 -0
  33. package/dist/scripts/check-redis.js.map +7 -0
  34. package/dist/scripts/initialize.js +116 -0
  35. package/dist/scripts/initialize.js.map +7 -0
  36. package/dist/scripts/list-linear-tasks.js +124 -0
  37. package/dist/scripts/list-linear-tasks.js.map +7 -0
  38. package/dist/scripts/measure-handoff-impact.js +340 -0
  39. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  40. package/dist/scripts/query-chromadb.js +160 -0
  41. package/dist/scripts/query-chromadb.js.map +7 -0
  42. package/dist/scripts/show-linear-summary.js +119 -0
  43. package/dist/scripts/show-linear-summary.js.map +7 -0
  44. package/dist/scripts/simple-swarm-demo.js +90 -0
  45. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  46. package/dist/scripts/status.js +155 -0
  47. package/dist/scripts/status.js.map +7 -0
  48. package/dist/scripts/test-chromadb-sync.js +192 -0
  49. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  50. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  51. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  52. package/dist/scripts/test-ralph-iterations.js +121 -0
  53. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  54. package/dist/scripts/test-redis-storage.js +389 -0
  55. package/dist/scripts/test-redis-storage.js.map +7 -0
  56. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  57. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  58. package/dist/scripts/test-swarm-fixes.js +125 -0
  59. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  60. package/dist/scripts/test-swarm-tui.js +23 -0
  61. package/dist/scripts/test-swarm-tui.js.map +7 -0
  62. package/dist/scripts/test-tui-shortcuts.js +52 -0
  63. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  64. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  65. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  66. package/dist/src/agents/core/agent-task-manager.js +527 -0
  67. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  68. package/dist/src/agents/verifiers/base-verifier.js +133 -0
  69. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  70. package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
  71. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  72. package/dist/src/agents/verifiers/llm-judge.js +252 -0
  73. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  74. package/dist/src/cli/auto-detect.js +321 -0
  75. package/dist/src/cli/auto-detect.js.map +7 -0
  76. package/dist/src/cli/claude-sm-danger.js +21 -0
  77. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  78. package/dist/src/cli/claude-sm.js +1156 -0
  79. package/dist/src/cli/claude-sm.js.map +7 -0
  80. package/dist/src/cli/codex-sm-danger.js +21 -0
  81. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  82. package/dist/src/cli/codex-sm.js +349 -0
  83. package/dist/src/cli/codex-sm.js.map +7 -0
  84. package/dist/src/cli/commands/api.js +232 -0
  85. package/dist/src/cli/commands/api.js.map +7 -0
  86. package/dist/src/cli/commands/auto-background.js +180 -0
  87. package/dist/src/cli/commands/auto-background.js.map +7 -0
  88. package/dist/src/cli/commands/cleanup-processes.js +68 -0
  89. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  90. package/dist/src/cli/commands/clear.js +202 -0
  91. package/dist/src/cli/commands/clear.js.map +7 -0
  92. package/dist/src/cli/commands/config.js +445 -0
  93. package/dist/src/cli/commands/config.js.map +7 -0
  94. package/dist/src/cli/commands/context-rehydrate.js +751 -0
  95. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  96. package/dist/src/cli/commands/context.js +343 -0
  97. package/dist/src/cli/commands/context.js.map +7 -0
  98. package/dist/src/cli/commands/daemon.js +392 -0
  99. package/dist/src/cli/commands/daemon.js.map +7 -0
  100. package/dist/src/cli/commands/dashboard.js +210 -0
  101. package/dist/src/cli/commands/dashboard.js.map +7 -0
  102. package/dist/src/cli/commands/db.js +147 -0
  103. package/dist/src/cli/commands/db.js.map +7 -0
  104. package/dist/src/cli/commands/decision.js +266 -0
  105. package/dist/src/cli/commands/decision.js.map +7 -0
  106. package/dist/src/cli/commands/discovery.js +279 -0
  107. package/dist/src/cli/commands/discovery.js.map +7 -0
  108. package/dist/src/cli/commands/handoff.js +624 -0
  109. package/dist/src/cli/commands/handoff.js.map +7 -0
  110. package/dist/src/cli/commands/hooks.js +298 -0
  111. package/dist/src/cli/commands/hooks.js.map +7 -0
  112. package/dist/src/cli/commands/linear.js +529 -0
  113. package/dist/src/cli/commands/linear.js.map +7 -0
  114. package/dist/src/cli/commands/log.js +169 -0
  115. package/dist/src/cli/commands/log.js.map +7 -0
  116. package/dist/src/cli/commands/login.js +172 -0
  117. package/dist/src/cli/commands/login.js.map +7 -0
  118. package/dist/src/cli/commands/migrate.js +240 -0
  119. package/dist/src/cli/commands/migrate.js.map +7 -0
  120. package/dist/src/cli/commands/model.js +533 -0
  121. package/dist/src/cli/commands/model.js.map +7 -0
  122. package/dist/src/cli/commands/onboard.js +536 -0
  123. package/dist/src/cli/commands/onboard.js.map +7 -0
  124. package/dist/src/cli/commands/projects.js +199 -0
  125. package/dist/src/cli/commands/projects.js.map +7 -0
  126. package/dist/src/cli/commands/ralph.js +909 -0
  127. package/dist/src/cli/commands/ralph.js.map +7 -0
  128. package/dist/src/cli/commands/retrieval.js +248 -0
  129. package/dist/src/cli/commands/retrieval.js.map +7 -0
  130. package/dist/src/cli/commands/search.js +173 -0
  131. package/dist/src/cli/commands/search.js.map +7 -0
  132. package/dist/src/cli/commands/service.js +749 -0
  133. package/dist/src/cli/commands/service.js.map +7 -0
  134. package/dist/src/cli/commands/session.js +200 -0
  135. package/dist/src/cli/commands/session.js.map +7 -0
  136. package/dist/src/cli/commands/settings.js +306 -0
  137. package/dist/src/cli/commands/settings.js.map +7 -0
  138. package/dist/src/cli/commands/setup.js +701 -0
  139. package/dist/src/cli/commands/setup.js.map +7 -0
  140. package/dist/src/cli/commands/shell.js +249 -0
  141. package/dist/src/cli/commands/shell.js.map +7 -0
  142. package/dist/src/cli/commands/signup.js +50 -0
  143. package/dist/src/cli/commands/signup.js.map +7 -0
  144. package/dist/src/cli/commands/skills.js +470 -0
  145. package/dist/src/cli/commands/skills.js.map +7 -0
  146. package/dist/src/cli/commands/sms-notify.js +795 -0
  147. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  148. package/dist/src/cli/commands/storage-tier.js +183 -0
  149. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  150. package/dist/src/cli/commands/sweep.js +249 -0
  151. package/dist/src/cli/commands/sweep.js.map +7 -0
  152. package/dist/src/cli/commands/tasks.js +213 -0
  153. package/dist/src/cli/commands/tasks.js.map +7 -0
  154. package/dist/src/cli/commands/worktree.js +319 -0
  155. package/dist/src/cli/commands/worktree.js.map +7 -0
  156. package/dist/src/cli/index.js +594 -0
  157. package/dist/src/cli/index.js.map +7 -0
  158. package/dist/src/cli/opencode-sm.js +448 -0
  159. package/dist/src/cli/opencode-sm.js.map +7 -0
  160. package/dist/src/cli/utils/viewer.js +96 -0
  161. package/dist/src/cli/utils/viewer.js.map +7 -0
  162. package/dist/src/core/config/config-manager.js +398 -0
  163. package/dist/src/core/config/config-manager.js.map +7 -0
  164. package/dist/src/core/config/feature-flags.js +76 -0
  165. package/dist/src/core/config/feature-flags.js.map +7 -0
  166. package/dist/src/core/config/storage-config.js +115 -0
  167. package/dist/src/core/config/storage-config.js.map +7 -0
  168. package/dist/src/core/config/types.js +144 -0
  169. package/dist/src/core/config/types.js.map +7 -0
  170. package/dist/src/core/context/auto-context.js +80 -0
  171. package/dist/src/core/context/auto-context.js.map +7 -0
  172. package/dist/src/core/context/dual-stack-manager.js +870 -0
  173. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  174. package/dist/src/core/context/enhanced-rehydration.js +994 -0
  175. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  176. package/dist/src/core/context/frame-database.js +479 -0
  177. package/dist/src/core/context/frame-database.js.map +7 -0
  178. package/dist/src/core/context/frame-digest.js +250 -0
  179. package/dist/src/core/context/frame-digest.js.map +7 -0
  180. package/dist/src/core/context/frame-handoff-manager.js +778 -0
  181. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  182. package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
  183. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  184. package/dist/src/core/context/frame-recovery.js +302 -0
  185. package/dist/src/core/context/frame-recovery.js.map +7 -0
  186. package/dist/src/core/context/frame-stack.js +314 -0
  187. package/dist/src/core/context/frame-stack.js.map +7 -0
  188. package/dist/src/core/context/frame-types.js +5 -0
  189. package/dist/src/core/context/frame-types.js.map +7 -0
  190. package/dist/src/core/context/index.js +25 -0
  191. package/dist/src/core/context/index.js.map +7 -0
  192. package/dist/src/core/context/permission-manager.js +185 -0
  193. package/dist/src/core/context/permission-manager.js.map +7 -0
  194. package/dist/src/core/context/recursive-context-manager.js +592 -0
  195. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  196. package/dist/src/core/context/refactored-frame-manager.js +754 -0
  197. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  198. package/dist/src/core/context/shared-context-layer.js +621 -0
  199. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  200. package/dist/src/core/context/stack-merge-resolver.js +749 -0
  201. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  202. package/dist/src/core/context/validation.js +130 -0
  203. package/dist/src/core/context/validation.js.map +7 -0
  204. package/dist/src/core/database/batch-operations.js +384 -0
  205. package/dist/src/core/database/batch-operations.js.map +7 -0
  206. package/dist/src/core/database/connection-pool.js +330 -0
  207. package/dist/src/core/database/connection-pool.js.map +7 -0
  208. package/dist/src/core/database/database-adapter.js +60 -0
  209. package/dist/src/core/database/database-adapter.js.map +7 -0
  210. package/dist/src/core/database/migration-manager.js +614 -0
  211. package/dist/src/core/database/migration-manager.js.map +7 -0
  212. package/dist/src/core/database/query-cache.js +298 -0
  213. package/dist/src/core/database/query-cache.js.map +7 -0
  214. package/dist/src/core/database/query-router.js +430 -0
  215. package/dist/src/core/database/query-router.js.map +7 -0
  216. package/dist/src/core/database/sqlite-adapter.js +738 -0
  217. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  218. package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
  219. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  220. package/dist/src/core/digest/frame-digest-integration.js +176 -0
  221. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  222. package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
  223. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  224. package/dist/src/core/digest/index.js +9 -0
  225. package/dist/src/core/digest/index.js.map +7 -0
  226. package/dist/src/core/digest/types.js +25 -0
  227. package/dist/src/core/digest/types.js.map +7 -0
  228. package/dist/src/core/errors/error-utils.js +208 -0
  229. package/dist/src/core/errors/error-utils.js.map +7 -0
  230. package/dist/src/core/errors/index.js +521 -0
  231. package/dist/src/core/errors/index.js.map +7 -0
  232. package/dist/src/core/errors/recovery.js +269 -0
  233. package/dist/src/core/errors/recovery.js.map +7 -0
  234. package/dist/src/core/execution/parallel-executor.js +258 -0
  235. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  236. package/dist/src/core/frame/workflow-templates.js +319 -0
  237. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  238. package/dist/src/core/merge/conflict-detector.js +431 -0
  239. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  240. package/dist/src/core/merge/index.js +9 -0
  241. package/dist/src/core/merge/index.js.map +7 -0
  242. package/dist/src/core/merge/resolution-engine.js +558 -0
  243. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  244. package/dist/src/core/merge/stack-diff.js +532 -0
  245. package/dist/src/core/merge/stack-diff.js.map +7 -0
  246. package/dist/src/core/merge/types.js +5 -0
  247. package/dist/src/core/merge/types.js.map +7 -0
  248. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  249. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  250. package/dist/src/core/models/fallback-monitor.js +232 -0
  251. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  252. package/dist/src/core/models/model-router.js +340 -0
  253. package/dist/src/core/models/model-router.js.map +7 -0
  254. package/dist/src/core/monitoring/error-handler.js +49 -0
  255. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  256. package/dist/src/core/monitoring/logger.js +202 -0
  257. package/dist/src/core/monitoring/logger.js.map +7 -0
  258. package/dist/src/core/monitoring/metrics.js +172 -0
  259. package/dist/src/core/monitoring/metrics.js.map +7 -0
  260. package/dist/src/core/monitoring/progress-tracker.js +189 -0
  261. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  262. package/dist/src/core/monitoring/session-monitor.js +300 -0
  263. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  264. package/dist/src/core/performance/context-cache.js +273 -0
  265. package/dist/src/core/performance/context-cache.js.map +7 -0
  266. package/dist/src/core/performance/index.js +11 -0
  267. package/dist/src/core/performance/index.js.map +7 -0
  268. package/dist/src/core/performance/lazy-context-loader.js +327 -0
  269. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  270. package/dist/src/core/performance/monitor.js +221 -0
  271. package/dist/src/core/performance/monitor.js.map +7 -0
  272. package/dist/src/core/performance/optimized-frame-context.js +345 -0
  273. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  274. package/dist/src/core/performance/performance-benchmark.js +277 -0
  275. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  276. package/dist/src/core/performance/performance-profiler.js +370 -0
  277. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  278. package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
  279. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  280. package/dist/src/core/persistence/postgres-adapter.js +349 -0
  281. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  282. package/dist/src/core/projects/project-isolation.js +201 -0
  283. package/dist/src/core/projects/project-isolation.js.map +7 -0
  284. package/dist/src/core/projects/project-manager.js +697 -0
  285. package/dist/src/core/projects/project-manager.js.map +7 -0
  286. package/dist/src/core/query/query-parser.js +370 -0
  287. package/dist/src/core/query/query-parser.js.map +7 -0
  288. package/dist/src/core/query/query-templates.js +321 -0
  289. package/dist/src/core/query/query-templates.js.map +7 -0
  290. package/dist/src/core/retrieval/context-retriever.js +479 -0
  291. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  292. package/dist/src/core/retrieval/index.js +8 -0
  293. package/dist/src/core/retrieval/index.js.map +7 -0
  294. package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
  295. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  296. package/dist/src/core/retrieval/llm-provider.js +151 -0
  297. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  298. package/dist/src/core/retrieval/retrieval-audit.js +236 -0
  299. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  300. package/dist/src/core/retrieval/summary-generator.js +589 -0
  301. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  302. package/dist/src/core/retrieval/types.js +21 -0
  303. package/dist/src/core/retrieval/types.js.map +7 -0
  304. package/dist/src/core/security/index.js +35 -0
  305. package/dist/src/core/security/index.js.map +7 -0
  306. package/dist/src/core/security/input-sanitizer.js +321 -0
  307. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  308. package/dist/src/core/session/clear-survival.js +465 -0
  309. package/dist/src/core/session/clear-survival.js.map +7 -0
  310. package/dist/src/core/session/enhanced-handoff.js +792 -0
  311. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  312. package/dist/src/core/session/handoff-generator.js +343 -0
  313. package/dist/src/core/session/handoff-generator.js.map +7 -0
  314. package/dist/src/core/session/index.js +15 -0
  315. package/dist/src/core/session/index.js.map +7 -0
  316. package/dist/src/core/session/session-manager.js +347 -0
  317. package/dist/src/core/session/session-manager.js.map +7 -0
  318. package/dist/src/core/skills/index.js +7 -0
  319. package/dist/src/core/skills/index.js.map +7 -0
  320. package/dist/src/core/skills/skill-storage.js +764 -0
  321. package/dist/src/core/skills/skill-storage.js.map +7 -0
  322. package/dist/src/core/skills/types.js +193 -0
  323. package/dist/src/core/skills/types.js.map +7 -0
  324. package/dist/src/core/storage/chromadb-adapter.js +354 -0
  325. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  326. package/dist/src/core/storage/infinite-storage.js +510 -0
  327. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  328. package/dist/src/core/storage/remote-storage.js +489 -0
  329. package/dist/src/core/storage/remote-storage.js.map +7 -0
  330. package/dist/src/core/storage/two-tier-storage.js +766 -0
  331. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  332. package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
  333. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  334. package/dist/src/core/trace/db-trace-wrapper.js +247 -0
  335. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  336. package/dist/src/core/trace/debug-trace.js +417 -0
  337. package/dist/src/core/trace/debug-trace.js.map +7 -0
  338. package/dist/src/core/trace/index.js +109 -0
  339. package/dist/src/core/trace/index.js.map +7 -0
  340. package/dist/src/core/trace/linear-api-wrapper.js +178 -0
  341. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  342. package/dist/src/core/trace/trace-detector.js +528 -0
  343. package/dist/src/core/trace/trace-detector.js.map +7 -0
  344. package/dist/src/core/trace/trace-store.js +345 -0
  345. package/dist/src/core/trace/trace-store.js.map +7 -0
  346. package/dist/src/core/trace/types.js +77 -0
  347. package/dist/src/core/trace/types.js.map +7 -0
  348. package/dist/src/core/types.js +5 -0
  349. package/dist/src/core/types.js.map +7 -0
  350. package/dist/src/core/utils/async-mutex.js +114 -0
  351. package/dist/src/core/utils/async-mutex.js.map +7 -0
  352. package/dist/src/core/utils/compression.js +83 -0
  353. package/dist/src/core/utils/compression.js.map +7 -0
  354. package/dist/src/core/utils/update-checker.js +218 -0
  355. package/dist/src/core/utils/update-checker.js.map +7 -0
  356. package/dist/src/core/worktree/worktree-manager.js +465 -0
  357. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  358. package/dist/src/daemon/daemon-config.js +149 -0
  359. package/dist/src/daemon/daemon-config.js.map +7 -0
  360. package/dist/src/daemon/services/context-service.js +122 -0
  361. package/dist/src/daemon/services/context-service.js.map +7 -0
  362. package/dist/src/daemon/services/linear-service.js +136 -0
  363. package/dist/src/daemon/services/linear-service.js.map +7 -0
  364. package/dist/src/daemon/session-daemon.js +312 -0
  365. package/dist/src/daemon/session-daemon.js.map +7 -0
  366. package/dist/src/daemon/unified-daemon.js +276 -0
  367. package/dist/src/daemon/unified-daemon.js.map +7 -0
  368. package/dist/src/features/analytics/api/analytics-api.js +287 -0
  369. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  370. package/dist/src/features/analytics/core/analytics-service.js +282 -0
  371. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  372. package/dist/src/features/analytics/index.js +18 -0
  373. package/dist/src/features/analytics/index.js.map +7 -0
  374. package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
  375. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  376. package/dist/src/features/analytics/types/metrics.js +5 -0
  377. package/dist/src/features/analytics/types/metrics.js.map +7 -0
  378. package/dist/src/features/browser/browser-mcp.js +492 -0
  379. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  380. package/dist/src/features/sweep/index.js +20 -0
  381. package/dist/src/features/sweep/index.js.map +7 -0
  382. package/dist/src/features/sweep/prediction-client.js +155 -0
  383. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  384. package/dist/src/features/sweep/prompt-builder.js +85 -0
  385. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  386. package/dist/src/features/sweep/pty-wrapper.js +171 -0
  387. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  388. package/dist/src/features/sweep/state-watcher.js +87 -0
  389. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  390. package/dist/src/features/sweep/status-bar.js +88 -0
  391. package/dist/src/features/sweep/status-bar.js.map +7 -0
  392. package/dist/src/features/sweep/sweep-server-manager.js +226 -0
  393. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  394. package/dist/src/features/sweep/tab-interceptor.js +38 -0
  395. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  396. package/dist/src/features/sweep/types.js +18 -0
  397. package/dist/src/features/sweep/types.js.map +7 -0
  398. package/dist/src/features/tasks/linear-task-manager.js +487 -0
  399. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  400. package/dist/src/features/tasks/task-aware-context.js +410 -0
  401. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  402. package/dist/src/features/tui/simple-monitor.js +116 -0
  403. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  404. package/dist/src/features/tui/swarm-monitor.js +648 -0
  405. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  406. package/dist/src/features/web/client/stores/task-store.js +26 -0
  407. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  408. package/dist/src/features/web/server/index.js +194 -0
  409. package/dist/src/features/web/server/index.js.map +7 -0
  410. package/dist/src/hooks/auto-background.js +151 -0
  411. package/dist/src/hooks/auto-background.js.map +7 -0
  412. package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
  413. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  414. package/dist/src/hooks/config.js +150 -0
  415. package/dist/src/hooks/config.js.map +7 -0
  416. package/dist/src/hooks/daemon.js +364 -0
  417. package/dist/src/hooks/daemon.js.map +7 -0
  418. package/dist/src/hooks/events.js +58 -0
  419. package/dist/src/hooks/events.js.map +7 -0
  420. package/dist/src/hooks/index.js +12 -0
  421. package/dist/src/hooks/index.js.map +7 -0
  422. package/dist/src/hooks/linear-task-picker.js +186 -0
  423. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  424. package/dist/src/hooks/schemas.js +197 -0
  425. package/dist/src/hooks/schemas.js.map +7 -0
  426. package/dist/src/hooks/secure-fs.js +49 -0
  427. package/dist/src/hooks/secure-fs.js.map +7 -0
  428. package/dist/src/hooks/security-logger.js +155 -0
  429. package/dist/src/hooks/security-logger.js.map +7 -0
  430. package/dist/src/hooks/session-summary.js +222 -0
  431. package/dist/src/hooks/session-summary.js.map +7 -0
  432. package/dist/src/hooks/sms-action-runner.js +371 -0
  433. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  434. package/dist/src/hooks/sms-notify.js +506 -0
  435. package/dist/src/hooks/sms-notify.js.map +7 -0
  436. package/dist/src/hooks/sms-watcher.js +93 -0
  437. package/dist/src/hooks/sms-watcher.js.map +7 -0
  438. package/dist/src/hooks/sms-webhook.js +555 -0
  439. package/dist/src/hooks/sms-webhook.js.map +7 -0
  440. package/dist/src/hooks/whatsapp-commands.js +479 -0
  441. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  442. package/dist/src/hooks/whatsapp-scheduler.js +317 -0
  443. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  444. package/dist/src/hooks/whatsapp-sync.js +409 -0
  445. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  446. package/dist/src/index.js +25 -0
  447. package/dist/src/index.js.map +7 -0
  448. package/dist/src/integrations/anthropic/client.js +263 -0
  449. package/dist/src/integrations/anthropic/client.js.map +7 -0
  450. package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
  451. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  452. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
  453. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  454. package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
  455. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  456. package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
  457. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  458. package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
  459. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  460. package/dist/src/integrations/claude-code/subagent-client.js +511 -0
  461. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  462. package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
  463. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  464. package/dist/src/integrations/linear/auth.js +337 -0
  465. package/dist/src/integrations/linear/auth.js.map +7 -0
  466. package/dist/src/integrations/linear/auto-sync.js +258 -0
  467. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  468. package/dist/src/integrations/linear/client.js +634 -0
  469. package/dist/src/integrations/linear/client.js.map +7 -0
  470. package/dist/src/integrations/linear/config.js +130 -0
  471. package/dist/src/integrations/linear/config.js.map +7 -0
  472. package/dist/src/integrations/linear/migration.js +361 -0
  473. package/dist/src/integrations/linear/migration.js.map +7 -0
  474. package/dist/src/integrations/linear/oauth-server.js +454 -0
  475. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  476. package/dist/src/integrations/linear/rest-client.js +213 -0
  477. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  478. package/dist/src/integrations/linear/sync-manager.js +236 -0
  479. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  480. package/dist/src/integrations/linear/sync-service.js +231 -0
  481. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  482. package/dist/src/integrations/linear/sync.js +782 -0
  483. package/dist/src/integrations/linear/sync.js.map +7 -0
  484. package/dist/src/integrations/linear/types.js +5 -0
  485. package/dist/src/integrations/linear/types.js.map +7 -0
  486. package/dist/src/integrations/linear/unified-sync.js +589 -0
  487. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  488. package/dist/src/integrations/linear/webhook-handler.js +219 -0
  489. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  490. package/dist/src/integrations/linear/webhook-server.js +218 -0
  491. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  492. package/dist/src/integrations/linear/webhook.js +291 -0
  493. package/dist/src/integrations/linear/webhook.js.map +7 -0
  494. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
  495. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  496. package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
  497. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  498. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
  499. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  500. package/dist/src/integrations/mcp/handlers/index.js +166 -0
  501. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  502. package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
  503. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  504. package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
  505. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  506. package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
  507. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  508. package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
  509. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  510. package/dist/src/integrations/mcp/index.js +23 -0
  511. package/dist/src/integrations/mcp/index.js.map +7 -0
  512. package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
  513. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  514. package/dist/src/integrations/mcp/refactored-server.js +374 -0
  515. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  516. package/dist/src/integrations/mcp/remote-server.js +682 -0
  517. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  518. package/dist/src/integrations/mcp/schemas.js +147 -0
  519. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  520. package/dist/src/integrations/mcp/server.js +1975 -0
  521. package/dist/src/integrations/mcp/server.js.map +7 -0
  522. package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
  523. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  524. package/dist/src/integrations/mcp/tool-definitions.js +702 -0
  525. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  526. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
  527. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  528. package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
  529. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  530. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
  531. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  532. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
  533. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  534. package/dist/src/integrations/ralph/index.js +18 -0
  535. package/dist/src/integrations/ralph/index.js.map +7 -0
  536. package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
  537. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  538. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
  539. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  540. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
  541. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  542. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
  543. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  544. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
  545. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  546. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
  547. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  548. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
  549. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  550. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
  551. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  552. package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
  553. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  554. package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
  555. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  556. package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
  557. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  558. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
  559. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  560. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
  561. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  562. package/dist/src/integrations/ralph/types.js +5 -0
  563. package/dist/src/integrations/ralph/types.js.map +7 -0
  564. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
  565. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  566. package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
  567. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  568. package/dist/src/middleware/exponential-rate-limiter.js +289 -0
  569. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  570. package/dist/src/models/user.model.js +358 -0
  571. package/dist/src/models/user.model.js.map +7 -0
  572. package/dist/src/servers/production/auth-middleware.js +528 -0
  573. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  574. package/dist/src/services/config-service.js +65 -0
  575. package/dist/src/services/config-service.js.map +7 -0
  576. package/dist/src/services/context-service.js +194 -0
  577. package/dist/src/services/context-service.js.map +7 -0
  578. package/dist/src/skills/api-discovery.js +354 -0
  579. package/dist/src/skills/api-discovery.js.map +7 -0
  580. package/dist/src/skills/api-skill.js +475 -0
  581. package/dist/src/skills/api-skill.js.map +7 -0
  582. package/dist/src/skills/claude-skills.js +1061 -0
  583. package/dist/src/skills/claude-skills.js.map +7 -0
  584. package/dist/src/skills/dashboard-launcher.js +216 -0
  585. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  586. package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
  587. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  588. package/dist/src/skills/repo-ingestion-skill.js +609 -0
  589. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  590. package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
  591. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  592. package/dist/src/types/task.js +5 -0
  593. package/dist/src/types/task.js.map +7 -0
  594. package/dist/src/utils/env.js +50 -0
  595. package/dist/src/utils/env.js.map +7 -0
  596. package/dist/src/utils/formatting.js +62 -0
  597. package/dist/src/utils/formatting.js.map +7 -0
  598. package/dist/src/utils/process-cleanup.js +136 -0
  599. package/dist/src/utils/process-cleanup.js.map +7 -0
  600. package/package.json +4 -3
  601. package/scripts/create-cleanup-issues.js +302 -0
  602. package/scripts/demos/browser-test.ts +39 -0
  603. package/scripts/demos/ralph-integration-demo.ts +244 -0
  604. package/scripts/demos/trace-demo.ts +214 -0
  605. package/scripts/demos/trace-detector.demo.ts +171 -0
  606. package/scripts/demos/trace-test.ts +67 -0
  607. package/scripts/initialize.ts +16 -7
  608. package/scripts/install.sh +14 -62
  609. package/scripts/status.ts +111 -46
  610. package/scripts/test-claude-config.sh +123 -0
  611. package/scripts/validate-claude-config.sh +155 -0
@@ -0,0 +1,321 @@
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 { z } from "zod";
6
+ import { resolve as pathResolve, relative as pathRelative } from "path";
7
+ import { ValidationError, ErrorCode } from "../errors/index.js";
8
+ const SENSITIVE_PATTERNS = [
9
+ /\b(api[_-]?key|apikey)\s*[:=]\s*['"]?[\w-]+['"]?/gi,
10
+ /\b(secret|password|token|credential|auth)\s*[:=]\s*['"]?[\w-]+['"]?/gi,
11
+ /\b(lin_api_[\w]+)/gi,
12
+ // Linear API keys
13
+ /\b(lin_oauth_[\w]+)/gi,
14
+ // Linear OAuth tokens
15
+ /\b(sk-[\w]+)/gi,
16
+ // OpenAI-style API keys
17
+ /\b(npm_[\w]+)/gi,
18
+ // NPM tokens
19
+ /\b(ghp_[\w]+)/gi,
20
+ // GitHub personal access tokens
21
+ /\b(ghs_[\w]+)/gi,
22
+ // GitHub secret tokens
23
+ /Bearer\s+[\w.-]+/gi,
24
+ /Basic\s+[\w=]+/gi,
25
+ /postgres(ql)?:\/\/[^@\s]+:[^@\s]+@/gi
26
+ // Database URLs with credentials
27
+ ];
28
+ function redactSensitiveData(input) {
29
+ let result = input;
30
+ for (const pattern of SENSITIVE_PATTERNS) {
31
+ pattern.lastIndex = 0;
32
+ result = result.replace(pattern, "[REDACTED]");
33
+ }
34
+ return result;
35
+ }
36
+ function containsSensitiveData(input) {
37
+ return SENSITIVE_PATTERNS.some((pattern) => {
38
+ pattern.lastIndex = 0;
39
+ return pattern.test(input);
40
+ });
41
+ }
42
+ function sanitizeForSqlLike(input) {
43
+ if (!input) return "";
44
+ return input.replace(/\\/g, "\\\\").replace(/%/g, "\\%").replace(/_/g, "\\_").replace(/'/g, "''");
45
+ }
46
+ function sanitizeIdentifier(input) {
47
+ if (!input) {
48
+ throw new ValidationError(
49
+ "Identifier cannot be empty",
50
+ ErrorCode.VALIDATION_FAILED
51
+ );
52
+ }
53
+ const sanitized = input.replace(/[^a-zA-Z0-9_]/g, "");
54
+ if (sanitized !== input) {
55
+ throw new ValidationError(
56
+ `Invalid identifier: ${input}. Only alphanumeric characters and underscores are allowed.`,
57
+ ErrorCode.VALIDATION_FAILED,
58
+ { input, sanitized }
59
+ );
60
+ }
61
+ const sqlKeywords = [
62
+ "DROP",
63
+ "DELETE",
64
+ "INSERT",
65
+ "UPDATE",
66
+ "SELECT",
67
+ "UNION",
68
+ "ALTER",
69
+ "CREATE",
70
+ "TRUNCATE",
71
+ "EXEC",
72
+ "EXECUTE"
73
+ ];
74
+ if (sqlKeywords.includes(sanitized.toUpperCase())) {
75
+ throw new ValidationError(
76
+ `Invalid identifier: ${input}. SQL keywords are not allowed.`,
77
+ ErrorCode.VALIDATION_FAILED,
78
+ { input }
79
+ );
80
+ }
81
+ return sanitized;
82
+ }
83
+ const ALLOWED_TABLES = [
84
+ "frames",
85
+ "events",
86
+ "anchors",
87
+ "contexts",
88
+ "task_cache",
89
+ "schema_version",
90
+ "attention_log",
91
+ "traces"
92
+ ];
93
+ function validateTableName(tableName) {
94
+ const sanitized = sanitizeIdentifier(tableName);
95
+ if (!ALLOWED_TABLES.includes(sanitized)) {
96
+ throw new ValidationError(
97
+ `Invalid table name: ${tableName}. Allowed tables: ${ALLOWED_TABLES.join(", ")}`,
98
+ ErrorCode.VALIDATION_FAILED,
99
+ { tableName, allowed: ALLOWED_TABLES }
100
+ );
101
+ }
102
+ return sanitized;
103
+ }
104
+ function sanitizeFilePath(input, baseDir) {
105
+ if (!input) {
106
+ throw new ValidationError(
107
+ "File path cannot be empty",
108
+ ErrorCode.VALIDATION_FAILED
109
+ );
110
+ }
111
+ if (input.includes("\0")) {
112
+ throw new ValidationError(
113
+ "File path contains invalid characters",
114
+ ErrorCode.VALIDATION_FAILED,
115
+ { reason: "null_byte" }
116
+ );
117
+ }
118
+ if (input.includes("..")) {
119
+ throw new ValidationError(
120
+ "Path traversal not allowed",
121
+ ErrorCode.VALIDATION_FAILED,
122
+ { path: input }
123
+ );
124
+ }
125
+ if (baseDir) {
126
+ const resolvedPath = pathResolve(baseDir, input);
127
+ const relativePath = pathRelative(baseDir, resolvedPath);
128
+ if (relativePath.startsWith("..") || pathResolve(relativePath) === resolvedPath) {
129
+ if (relativePath.startsWith("..")) {
130
+ throw new ValidationError(
131
+ "Path escapes base directory",
132
+ ErrorCode.VALIDATION_FAILED,
133
+ { path: input, baseDir }
134
+ );
135
+ }
136
+ }
137
+ return resolvedPath;
138
+ }
139
+ return input;
140
+ }
141
+ const SENSITIVE_FIELD_NAMES = [
142
+ "password",
143
+ "token",
144
+ "apikey",
145
+ "api_key",
146
+ "secret",
147
+ "credential",
148
+ "authorization",
149
+ "auth",
150
+ "accesstoken",
151
+ "access_token",
152
+ "refreshtoken",
153
+ "refresh_token"
154
+ ];
155
+ function isSensitiveFieldName(key) {
156
+ const lowerKey = key.toLowerCase();
157
+ return SENSITIVE_FIELD_NAMES.some((sf) => lowerKey.includes(sf));
158
+ }
159
+ function sanitizeForLogging(obj) {
160
+ if (obj === null || obj === void 0) {
161
+ return obj;
162
+ }
163
+ if (typeof obj === "string") {
164
+ return redactSensitiveData(obj);
165
+ }
166
+ if (Array.isArray(obj)) {
167
+ return obj.map(sanitizeForLogging);
168
+ }
169
+ if (typeof obj === "object") {
170
+ const sanitized = {};
171
+ for (const [key, value] of Object.entries(obj)) {
172
+ if (isSensitiveFieldName(key)) {
173
+ sanitized[key] = "[REDACTED]";
174
+ } else {
175
+ sanitized[key] = sanitizeForLogging(value);
176
+ }
177
+ }
178
+ return sanitized;
179
+ }
180
+ return obj;
181
+ }
182
+ const InputSchemas = {
183
+ // Frame-related
184
+ frameId: z.string().uuid("Invalid frame ID format"),
185
+ frameName: z.string().min(1, "Frame name is required").max(500, "Frame name too long").refine(
186
+ (val) => !containsSensitiveData(val),
187
+ "Frame name may contain sensitive data"
188
+ ),
189
+ frameType: z.enum([
190
+ "task",
191
+ "subtask",
192
+ "tool_scope",
193
+ "review",
194
+ "write",
195
+ "debug"
196
+ ]),
197
+ // Query-related
198
+ searchQuery: z.string().min(1, "Search query is required").max(1e3, "Search query too long").transform((val) => sanitizeForSqlLike(val)),
199
+ limit: z.number().int().min(1).max(1e3).default(50),
200
+ offset: z.number().int().min(0).default(0),
201
+ // Task-related
202
+ taskTitle: z.string().min(1, "Task title is required").max(500, "Task title too long"),
203
+ taskDescription: z.string().max(1e4, "Description too long").optional(),
204
+ taskPriority: z.enum(["low", "medium", "high", "urgent", "critical"]),
205
+ taskStatus: z.enum([
206
+ "pending",
207
+ "in_progress",
208
+ "completed",
209
+ "blocked",
210
+ "cancelled"
211
+ ]),
212
+ // Anchor-related
213
+ anchorType: z.enum([
214
+ "FACT",
215
+ "DECISION",
216
+ "CONSTRAINT",
217
+ "INTERFACE_CONTRACT",
218
+ "TODO",
219
+ "RISK"
220
+ ]),
221
+ anchorText: z.string().min(1, "Anchor text is required").max(1e4, "Anchor text too long"),
222
+ priority: z.number().int().min(0).max(10).default(5),
223
+ // File path
224
+ filePath: z.string().min(1, "File path is required").max(4096, "File path too long").refine((val) => !val.includes("\0"), "Invalid characters in path").refine((val) => !val.includes(".."), "Path traversal not allowed"),
225
+ // Project ID
226
+ projectId: z.string().min(1, "Project ID is required").max(100, "Project ID too long").regex(
227
+ /^[a-zA-Z0-9_-]+$/,
228
+ "Project ID can only contain letters, numbers, hyphens, and underscores"
229
+ ),
230
+ // Session ID
231
+ sessionId: z.string().uuid("Invalid session ID format").optional(),
232
+ // Date/time
233
+ timestamp: z.number().int().positive(),
234
+ dateString: z.string().datetime(),
235
+ // Generic content (with sensitive data check)
236
+ safeContent: z.string().max(1e5, "Content too large").refine(
237
+ (val) => !containsSensitiveData(val),
238
+ "Content may contain sensitive data that should not be stored"
239
+ ),
240
+ // Email
241
+ email: z.string().email("Invalid email format").max(254, "Email too long").transform((val) => val.toLowerCase()),
242
+ // URL
243
+ url: z.string().url("Invalid URL format").max(2048, "URL too long")
244
+ };
245
+ function validateInput(schema, input, context) {
246
+ const result = schema.safeParse(input);
247
+ if (!result.success) {
248
+ const errors = result.error.errors.map((e) => ({
249
+ path: e.path.join("."),
250
+ message: e.message
251
+ }));
252
+ throw new ValidationError(
253
+ `Invalid input for ${context}: ${errors.map((e) => e.message).join(", ")}`,
254
+ ErrorCode.VALIDATION_FAILED,
255
+ { context, errors }
256
+ );
257
+ }
258
+ return result.data;
259
+ }
260
+ function createAggregateSchema(allowedFields) {
261
+ return z.object({
262
+ groupBy: z.array(z.string()).refine(
263
+ (fields) => fields.every((f) => allowedFields.includes(f)),
264
+ `Group by fields must be one of: ${allowedFields.join(", ")}`
265
+ ),
266
+ metrics: z.array(
267
+ z.object({
268
+ operation: z.enum(["COUNT", "SUM", "AVG", "MIN", "MAX"]),
269
+ field: z.string().refine(
270
+ (f) => f === "*" || allowedFields.includes(f),
271
+ `Field must be one of: ${allowedFields.join(", ")}`
272
+ ),
273
+ alias: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/).optional()
274
+ })
275
+ ),
276
+ orderBy: z.string().refine(
277
+ (f) => allowedFields.includes(f),
278
+ `Order by must be one of: ${allowedFields.join(", ")}`
279
+ ).optional(),
280
+ limit: z.number().int().min(1).max(1e3).optional()
281
+ });
282
+ }
283
+ function validateShellArg(arg) {
284
+ if (!arg) return "";
285
+ const dangerousChars = /[;&|`$(){}[\]<>!#*?~\n\r]/;
286
+ if (dangerousChars.test(arg)) {
287
+ throw new ValidationError(
288
+ "Argument contains potentially dangerous shell characters",
289
+ ErrorCode.VALIDATION_FAILED,
290
+ { arg: arg.substring(0, 50) }
291
+ );
292
+ }
293
+ return arg;
294
+ }
295
+ function safeJsonParse(input, schema) {
296
+ try {
297
+ const parsed = JSON.parse(input);
298
+ if (schema) {
299
+ return validateInput(schema, parsed, "JSON parse");
300
+ }
301
+ return parsed;
302
+ } catch {
303
+ return null;
304
+ }
305
+ }
306
+ export {
307
+ InputSchemas,
308
+ SENSITIVE_PATTERNS,
309
+ containsSensitiveData,
310
+ createAggregateSchema,
311
+ redactSensitiveData,
312
+ safeJsonParse,
313
+ sanitizeFilePath,
314
+ sanitizeForLogging,
315
+ sanitizeForSqlLike,
316
+ sanitizeIdentifier,
317
+ validateInput,
318
+ validateShellArg,
319
+ validateTableName
320
+ };
321
+ //# sourceMappingURL=input-sanitizer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/security/input-sanitizer.ts"],
4
+ "sourcesContent": ["/**\n * Input Sanitizer - Centralized input validation and sanitization\n * Provides security utilities to prevent injection attacks and ensure data integrity\n */\n\nimport { z } from 'zod';\nimport { resolve as pathResolve, relative as pathRelative } from 'path';\nimport { ValidationError, ErrorCode } from '../errors/index.js';\n\n/**\n * Sensitive data patterns that should never be logged\n */\nexport const SENSITIVE_PATTERNS = [\n /\\b(api[_-]?key|apikey)\\s*[:=]\\s*['\"]?[\\w-]+['\"]?/gi,\n /\\b(secret|password|token|credential|auth)\\s*[:=]\\s*['\"]?[\\w-]+['\"]?/gi,\n /\\b(lin_api_[\\w]+)/gi, // Linear API keys\n /\\b(lin_oauth_[\\w]+)/gi, // Linear OAuth tokens\n /\\b(sk-[\\w]+)/gi, // OpenAI-style API keys\n /\\b(npm_[\\w]+)/gi, // NPM tokens\n /\\b(ghp_[\\w]+)/gi, // GitHub personal access tokens\n /\\b(ghs_[\\w]+)/gi, // GitHub secret tokens\n /Bearer\\s+[\\w.-]+/gi,\n /Basic\\s+[\\w=]+/gi,\n /postgres(ql)?:\\/\\/[^@\\s]+:[^@\\s]+@/gi, // Database URLs with credentials\n];\n\n/**\n * Redact sensitive information from a string\n */\nexport function redactSensitiveData(input: string): string {\n let result = input;\n for (const pattern of SENSITIVE_PATTERNS) {\n pattern.lastIndex = 0;\n result = result.replace(pattern, '[REDACTED]');\n }\n return result;\n}\n\n/**\n * Check if a string contains potentially sensitive data\n */\nexport function containsSensitiveData(input: string): boolean {\n return SENSITIVE_PATTERNS.some((pattern) => {\n pattern.lastIndex = 0; // Reset regex state\n return pattern.test(input);\n });\n}\n\n/**\n * Sanitize a string for safe SQL LIKE queries\n * Escapes special characters that could be used for SQL injection\n */\nexport function sanitizeForSqlLike(input: string): string {\n if (!input) return '';\n // Escape SQL LIKE special characters\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/%/g, '\\\\%')\n .replace(/_/g, '\\\\_')\n .replace(/'/g, \"''\");\n}\n\n/**\n * Validate and sanitize table/column names to prevent SQL injection\n * Only allows alphanumeric characters and underscores\n */\nexport function sanitizeIdentifier(input: string): string {\n if (!input) {\n throw new ValidationError(\n 'Identifier cannot be empty',\n ErrorCode.VALIDATION_FAILED\n );\n }\n // Only allow alphanumeric and underscores\n const sanitized = input.replace(/[^a-zA-Z0-9_]/g, '');\n if (sanitized !== input) {\n throw new ValidationError(\n `Invalid identifier: ${input}. Only alphanumeric characters and underscores are allowed.`,\n ErrorCode.VALIDATION_FAILED,\n { input, sanitized }\n );\n }\n // Prevent SQL keywords\n const sqlKeywords = [\n 'DROP',\n 'DELETE',\n 'INSERT',\n 'UPDATE',\n 'SELECT',\n 'UNION',\n 'ALTER',\n 'CREATE',\n 'TRUNCATE',\n 'EXEC',\n 'EXECUTE',\n ];\n if (sqlKeywords.includes(sanitized.toUpperCase())) {\n throw new ValidationError(\n `Invalid identifier: ${input}. SQL keywords are not allowed.`,\n ErrorCode.VALIDATION_FAILED,\n { input }\n );\n }\n return sanitized;\n}\n\n/**\n * Validate allowed table names\n */\nconst ALLOWED_TABLES = [\n 'frames',\n 'events',\n 'anchors',\n 'contexts',\n 'task_cache',\n 'schema_version',\n 'attention_log',\n 'traces',\n];\n\nexport function validateTableName(tableName: string): string {\n const sanitized = sanitizeIdentifier(tableName);\n if (!ALLOWED_TABLES.includes(sanitized)) {\n throw new ValidationError(\n `Invalid table name: ${tableName}. Allowed tables: ${ALLOWED_TABLES.join(', ')}`,\n ErrorCode.VALIDATION_FAILED,\n { tableName, allowed: ALLOWED_TABLES }\n );\n }\n return sanitized;\n}\n\n/**\n * Validate and sanitize file paths\n * Prevents path traversal attacks\n */\nexport function sanitizeFilePath(input: string, baseDir?: string): string {\n if (!input) {\n throw new ValidationError(\n 'File path cannot be empty',\n ErrorCode.VALIDATION_FAILED\n );\n }\n\n // Check for null bytes\n if (input.includes('\\0')) {\n throw new ValidationError(\n 'File path contains invalid characters',\n ErrorCode.VALIDATION_FAILED,\n { reason: 'null_byte' }\n );\n }\n\n // Check for path traversal\n if (input.includes('..')) {\n throw new ValidationError(\n 'Path traversal not allowed',\n ErrorCode.VALIDATION_FAILED,\n { path: input }\n );\n }\n\n // If baseDir provided, ensure path stays within it\n if (baseDir) {\n const resolvedPath = pathResolve(baseDir, input);\n const relativePath = pathRelative(baseDir, resolvedPath);\n if (\n relativePath.startsWith('..') ||\n pathResolve(relativePath) === resolvedPath\n ) {\n // Path escapes baseDir\n if (relativePath.startsWith('..')) {\n throw new ValidationError(\n 'Path escapes base directory',\n ErrorCode.VALIDATION_FAILED,\n { path: input, baseDir }\n );\n }\n }\n return resolvedPath;\n }\n\n return input;\n}\n\n/**\n * Sensitive field names that should be redacted in logs\n */\nconst SENSITIVE_FIELD_NAMES = [\n 'password',\n 'token',\n 'apikey',\n 'api_key',\n 'secret',\n 'credential',\n 'authorization',\n 'auth',\n 'accesstoken',\n 'access_token',\n 'refreshtoken',\n 'refresh_token',\n];\n\n/**\n * Check if a field name is sensitive\n */\nfunction isSensitiveFieldName(key: string): boolean {\n const lowerKey = key.toLowerCase();\n return SENSITIVE_FIELD_NAMES.some((sf) => lowerKey.includes(sf));\n}\n\n/**\n * Sanitize an object for logging (redact sensitive fields)\n */\nexport function sanitizeForLogging(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return redactSensitiveData(obj);\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sanitizeForLogging);\n }\n\n if (typeof obj === 'object') {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n // Check if this key is sensitive\n if (isSensitiveFieldName(key)) {\n sanitized[key] = '[REDACTED]';\n } else {\n // Recursively sanitize nested objects\n sanitized[key] = sanitizeForLogging(value);\n }\n }\n return sanitized;\n }\n\n return obj;\n}\n\n/**\n * Zod schemas for common input validation\n */\nexport const InputSchemas = {\n // Frame-related\n frameId: z.string().uuid('Invalid frame ID format'),\n frameName: z\n .string()\n .min(1, 'Frame name is required')\n .max(500, 'Frame name too long')\n .refine(\n (val) => !containsSensitiveData(val),\n 'Frame name may contain sensitive data'\n ),\n frameType: z.enum([\n 'task',\n 'subtask',\n 'tool_scope',\n 'review',\n 'write',\n 'debug',\n ]),\n\n // Query-related\n searchQuery: z\n .string()\n .min(1, 'Search query is required')\n .max(1000, 'Search query too long')\n .transform((val) => sanitizeForSqlLike(val)),\n\n limit: z.number().int().min(1).max(1000).default(50),\n offset: z.number().int().min(0).default(0),\n\n // Task-related\n taskTitle: z\n .string()\n .min(1, 'Task title is required')\n .max(500, 'Task title too long'),\n taskDescription: z.string().max(10000, 'Description too long').optional(),\n taskPriority: z.enum(['low', 'medium', 'high', 'urgent', 'critical']),\n taskStatus: z.enum([\n 'pending',\n 'in_progress',\n 'completed',\n 'blocked',\n 'cancelled',\n ]),\n\n // Anchor-related\n anchorType: z.enum([\n 'FACT',\n 'DECISION',\n 'CONSTRAINT',\n 'INTERFACE_CONTRACT',\n 'TODO',\n 'RISK',\n ]),\n anchorText: z\n .string()\n .min(1, 'Anchor text is required')\n .max(10000, 'Anchor text too long'),\n priority: z.number().int().min(0).max(10).default(5),\n\n // File path\n filePath: z\n .string()\n .min(1, 'File path is required')\n .max(4096, 'File path too long')\n .refine((val) => !val.includes('\\0'), 'Invalid characters in path')\n .refine((val) => !val.includes('..'), 'Path traversal not allowed'),\n\n // Project ID\n projectId: z\n .string()\n .min(1, 'Project ID is required')\n .max(100, 'Project ID too long')\n .regex(\n /^[a-zA-Z0-9_-]+$/,\n 'Project ID can only contain letters, numbers, hyphens, and underscores'\n ),\n\n // Session ID\n sessionId: z.string().uuid('Invalid session ID format').optional(),\n\n // Date/time\n timestamp: z.number().int().positive(),\n dateString: z.string().datetime(),\n\n // Generic content (with sensitive data check)\n safeContent: z\n .string()\n .max(100000, 'Content too large')\n .refine(\n (val) => !containsSensitiveData(val),\n 'Content may contain sensitive data that should not be stored'\n ),\n\n // Email\n email: z\n .string()\n .email('Invalid email format')\n .max(254, 'Email too long')\n .transform((val) => val.toLowerCase()),\n\n // URL\n url: z.string().url('Invalid URL format').max(2048, 'URL too long'),\n};\n\n/**\n * Validate input using a Zod schema with detailed error messages\n */\nexport function validateInput<T>(\n schema: z.ZodSchema<T>,\n input: unknown,\n context: string\n): T {\n const result = schema.safeParse(input);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n }));\n\n throw new ValidationError(\n `Invalid input for ${context}: ${errors.map((e) => e.message).join(', ')}`,\n ErrorCode.VALIDATION_FAILED,\n { context, errors }\n );\n }\n\n return result.data;\n}\n\n/**\n * Create a schema for validating aggregate query options\n * Prevents SQL injection through dynamic field names\n */\nexport function createAggregateSchema(allowedFields: string[]) {\n return z.object({\n groupBy: z\n .array(z.string())\n .refine(\n (fields) => fields.every((f) => allowedFields.includes(f)),\n `Group by fields must be one of: ${allowedFields.join(', ')}`\n ),\n metrics: z.array(\n z.object({\n operation: z.enum(['COUNT', 'SUM', 'AVG', 'MIN', 'MAX']),\n field: z\n .string()\n .refine(\n (f) => f === '*' || allowedFields.includes(f),\n `Field must be one of: ${allowedFields.join(', ')}`\n ),\n alias: z\n .string()\n .regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/)\n .optional(),\n })\n ),\n orderBy: z\n .string()\n .refine(\n (f) => allowedFields.includes(f),\n `Order by must be one of: ${allowedFields.join(', ')}`\n )\n .optional(),\n limit: z.number().int().min(1).max(1000).optional(),\n });\n}\n\n/**\n * Validate command line arguments for shell safety\n * Prevents command injection\n */\nexport function validateShellArg(arg: string): string {\n if (!arg) return '';\n\n // Check for shell metacharacters\n const dangerousChars = /[;&|`$(){}[\\]<>!#*?~\\n\\r]/;\n if (dangerousChars.test(arg)) {\n throw new ValidationError(\n 'Argument contains potentially dangerous shell characters',\n ErrorCode.VALIDATION_FAILED,\n { arg: arg.substring(0, 50) }\n );\n }\n\n return arg;\n}\n\n/**\n * Safe JSON parse with validation\n */\nexport function safeJsonParse<T>(\n input: string,\n schema?: z.ZodSchema<T>\n): T | null {\n try {\n const parsed = JSON.parse(input);\n if (schema) {\n return validateInput(schema, parsed, 'JSON parse');\n }\n return parsed as T;\n } catch {\n return null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -11,7 +11,7 @@ import {
11
11
  writeFileSync,
12
12
  mkdirSync
13
13
  } from "fs";
14
- import { join, basename } from "path";
14
+ import { basename, join } from "path";
15
15
  import { homedir, tmpdir } from "os";
16
16
  import { globSync } from "glob";
17
17
  let countTokens;
@@ -558,7 +558,7 @@ class EnhancedHandoffGenerator {
558
558
  }
559
559
  }
560
560
  /**
561
- * Convert handoff to markdown
561
+ * Convert handoff to markdown (verbose format)
562
562
  */
563
563
  toMarkdown(handoff) {
564
564
  const lines = [];
@@ -651,6 +651,140 @@ class EnhancedHandoffGenerator {
651
651
  lines.push(`*Generated at ${handoff.timestamp}*`);
652
652
  return lines.join("\n");
653
653
  }
654
+ /**
655
+ * Convert handoff to compact format (~50% smaller)
656
+ * Optimized for minimal context window usage
657
+ */
658
+ toCompact(handoff) {
659
+ const lines = [];
660
+ lines.push(`# Handoff: ${handoff.project}@${handoff.branch}`);
661
+ const status = handoff.activeWork.status === "in_progress" ? "WIP" : handoff.activeWork.status;
662
+ lines.push(`## Work: ${handoff.activeWork.description} [${status}]`);
663
+ if (handoff.activeWork.keyFiles.length > 0) {
664
+ const files = handoff.activeWork.keyFiles.slice(0, 5).map((f) => basename(f)).join(", ");
665
+ const progress = handoff.activeWork.progress ? ` (${handoff.activeWork.progress.replace(" in current session", "")})` : "";
666
+ lines.push(`Files: ${files}${progress}`);
667
+ }
668
+ if (handoff.decisions.length > 0) {
669
+ lines.push("");
670
+ lines.push("## Decisions");
671
+ for (const d of handoff.decisions.slice(0, 7)) {
672
+ const what = d.what.length > 40 ? d.what.slice(0, 37) + "..." : d.what;
673
+ const why = d.why ? ` \u2192 ${d.why.slice(0, 50)}` : "";
674
+ lines.push(`- ${what}${why}`);
675
+ }
676
+ }
677
+ if (handoff.blockers.length > 0) {
678
+ lines.push("");
679
+ lines.push("## Blockers");
680
+ for (const b of handoff.blockers) {
681
+ const status2 = b.status === "open" ? "!" : "\u2713";
682
+ const tried = b.attempted.length > 0 ? ` \u2192 ${b.attempted[0]}` : "";
683
+ lines.push(`${status2} ${b.issue}${tried}`);
684
+ }
685
+ }
686
+ if (handoff.reviewFeedback && handoff.reviewFeedback.length > 0) {
687
+ lines.push("");
688
+ lines.push("## Feedback");
689
+ for (const r of handoff.reviewFeedback.slice(0, 2)) {
690
+ lines.push(`[${r.source}]`);
691
+ for (const p of r.keyPoints.slice(0, 3)) {
692
+ lines.push(`- ${p.slice(0, 60)}`);
693
+ }
694
+ for (const a of r.actionItems.slice(0, 2)) {
695
+ lines.push(`\u2192 ${a.slice(0, 60)}`);
696
+ }
697
+ }
698
+ }
699
+ if (handoff.nextActions.length > 0) {
700
+ lines.push("");
701
+ lines.push("## Next");
702
+ for (const a of handoff.nextActions.slice(0, 3)) {
703
+ lines.push(`- ${a.slice(0, 60)}`);
704
+ }
705
+ }
706
+ lines.push("");
707
+ lines.push(`---`);
708
+ lines.push(
709
+ `~${handoff.estimatedTokens} tokens | ${handoff.timestamp.split("T")[0]}`
710
+ );
711
+ return lines.join("\n");
712
+ }
713
+ /**
714
+ * Convert handoff to ultra-compact pipe-delimited format (~90% smaller)
715
+ * Optimized for minimal token usage while preserving critical context
716
+ * Target: ~100-150 tokens
717
+ */
718
+ toUltraCompact(handoff) {
719
+ const lines = [];
720
+ const status = handoff.activeWork.status === "in_progress" ? "WIP" : handoff.activeWork.status;
721
+ const commitCount = handoff.activeWork.progress?.match(/(\d+)/)?.[1] || "0";
722
+ lines.push(
723
+ `[H]${handoff.project}@${handoff.branch}|${status}|${commitCount}c`
724
+ );
725
+ if (handoff.activeWork.keyFiles.length > 0) {
726
+ const files = handoff.activeWork.keyFiles.slice(0, 5).map((f) => basename(f).replace(/\.(ts|js|tsx|jsx)$/, "")).join(",");
727
+ lines.push(`[F]${files}`);
728
+ }
729
+ if (handoff.decisions.length > 0) {
730
+ const decisions = handoff.decisions.slice(0, 5).map((d) => {
731
+ const what = d.what.slice(0, 25).replace(/\|/g, "/");
732
+ const why = d.why ? `\u2192${d.why.slice(0, 20)}` : "";
733
+ return `${what}${why}`;
734
+ }).join("|");
735
+ lines.push(`[D]${decisions}`);
736
+ }
737
+ if (handoff.blockers.length > 0) {
738
+ const blockers = handoff.blockers.slice(0, 3).map((b) => {
739
+ const marker = b.status === "open" ? "!" : "\u2713";
740
+ const issue = b.issue.slice(0, 20).replace(/\|/g, "/");
741
+ const tried = b.attempted.length > 0 ? `\u2192${b.attempted[0].slice(0, 15)}` : "";
742
+ return `${marker}${issue}${tried}`;
743
+ }).join("|");
744
+ lines.push(`[B]${blockers}`);
745
+ }
746
+ if (handoff.nextActions.length > 0) {
747
+ const actions = handoff.nextActions.slice(0, 3).map((a) => a.slice(0, 25).replace(/\|/g, "/")).join("|");
748
+ lines.push(`[N]${actions}`);
749
+ }
750
+ const ultraCompactContent = lines.join("\n");
751
+ const tokens = countTokens(ultraCompactContent);
752
+ lines.push(`~${tokens}t|${handoff.timestamp.split("T")[0]}`);
753
+ return lines.join("\n");
754
+ }
755
+ /**
756
+ * Auto-select format based on context budget and content complexity
757
+ * Returns: 'ultra' | 'compact' | 'verbose'
758
+ */
759
+ selectFormat(handoff, contextBudget) {
760
+ if (contextBudget !== void 0) {
761
+ if (contextBudget < 500) return "ultra";
762
+ if (contextBudget < 2e3) return "compact";
763
+ return "verbose";
764
+ }
765
+ const complexity = handoff.decisions.length + handoff.blockers.length + (handoff.reviewFeedback?.length || 0) * 2 + handoff.nextActions.length;
766
+ if (complexity <= 3 && handoff.activeWork.keyFiles.length <= 3) {
767
+ return "ultra";
768
+ }
769
+ if (complexity > 8 || handoff.reviewFeedback && handoff.reviewFeedback.length > 1) {
770
+ return "verbose";
771
+ }
772
+ return "compact";
773
+ }
774
+ /**
775
+ * Generate handoff in auto-selected format
776
+ */
777
+ toAutoFormat(handoff, contextBudget) {
778
+ const format = this.selectFormat(handoff, contextBudget);
779
+ switch (format) {
780
+ case "ultra":
781
+ return this.toUltraCompact(handoff);
782
+ case "verbose":
783
+ return this.toMarkdown(handoff);
784
+ default:
785
+ return this.toCompact(handoff);
786
+ }
787
+ }
654
788
  }
655
789
  export {
656
790
  EnhancedHandoffGenerator