@stackmemoryai/stackmemory 0.5.58 → 0.5.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (932) hide show
  1. package/README.md +105 -1
  2. package/dist/scripts/benchmark-performance.js +48 -0
  3. package/dist/scripts/benchmark-performance.js.map +7 -0
  4. package/dist/scripts/check-redis.js +42 -0
  5. package/dist/scripts/check-redis.js.map +7 -0
  6. package/dist/scripts/initialize.js +116 -0
  7. package/dist/scripts/initialize.js.map +7 -0
  8. package/dist/scripts/list-linear-tasks.js +124 -0
  9. package/dist/scripts/list-linear-tasks.js.map +7 -0
  10. package/dist/scripts/measure-handoff-impact.js +340 -0
  11. package/dist/scripts/measure-handoff-impact.js.map +7 -0
  12. package/dist/scripts/query-chromadb.js +160 -0
  13. package/dist/scripts/query-chromadb.js.map +7 -0
  14. package/dist/scripts/show-linear-summary.js +119 -0
  15. package/dist/scripts/show-linear-summary.js.map +7 -0
  16. package/dist/scripts/simple-swarm-demo.js +90 -0
  17. package/dist/scripts/simple-swarm-demo.js.map +7 -0
  18. package/dist/scripts/status.js +155 -0
  19. package/dist/scripts/status.js.map +7 -0
  20. package/dist/scripts/test-chromadb-sync.js +192 -0
  21. package/dist/scripts/test-chromadb-sync.js.map +7 -0
  22. package/dist/scripts/test-ralph-iteration-fix.js +86 -0
  23. package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
  24. package/dist/scripts/test-ralph-iterations.js +121 -0
  25. package/dist/scripts/test-ralph-iterations.js.map +7 -0
  26. package/dist/scripts/test-redis-storage.js +389 -0
  27. package/dist/scripts/test-redis-storage.js.map +7 -0
  28. package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
  29. package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
  30. package/dist/scripts/test-swarm-fixes.js +125 -0
  31. package/dist/scripts/test-swarm-fixes.js.map +7 -0
  32. package/dist/scripts/test-swarm-tui.js +23 -0
  33. package/dist/scripts/test-swarm-tui.js.map +7 -0
  34. package/dist/scripts/test-tui-shortcuts.js +52 -0
  35. package/dist/scripts/test-tui-shortcuts.js.map +7 -0
  36. package/dist/scripts/validate-tui-shortcuts.js +60 -0
  37. package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
  38. package/dist/src/agents/core/agent-task-manager.js.map +7 -0
  39. package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
  40. package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
  41. package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
  42. package/dist/src/cli/auto-detect.js.map +7 -0
  43. package/dist/src/cli/claude-sm-danger.js.map +7 -0
  44. package/dist/src/cli/claude-sm.js +1236 -0
  45. package/dist/src/cli/claude-sm.js.map +7 -0
  46. package/dist/src/cli/codex-sm-danger.js.map +7 -0
  47. package/dist/src/cli/codex-sm.js.map +7 -0
  48. package/dist/src/cli/commands/api.js.map +7 -0
  49. package/dist/src/cli/commands/auto-background.js.map +7 -0
  50. package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
  51. package/dist/src/cli/commands/clear.js.map +7 -0
  52. package/dist/src/cli/commands/config.js.map +7 -0
  53. package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
  54. package/dist/src/cli/commands/context.js.map +7 -0
  55. package/dist/src/cli/commands/daemon.js.map +7 -0
  56. package/dist/src/cli/commands/dashboard.js.map +7 -0
  57. package/dist/src/cli/commands/db.js.map +7 -0
  58. package/dist/src/cli/commands/decision.js.map +7 -0
  59. package/dist/src/cli/commands/discovery.js.map +7 -0
  60. package/dist/src/cli/commands/handoff.js.map +7 -0
  61. package/dist/src/cli/commands/hooks.js.map +7 -0
  62. package/dist/src/cli/commands/linear.js.map +7 -0
  63. package/dist/src/cli/commands/log.js.map +7 -0
  64. package/dist/src/cli/commands/login.js.map +7 -0
  65. package/dist/src/cli/commands/migrate.js.map +7 -0
  66. package/dist/src/cli/commands/model.js.map +7 -0
  67. package/dist/src/cli/commands/onboard.js.map +7 -0
  68. package/dist/src/cli/commands/projects.js.map +7 -0
  69. package/dist/src/cli/commands/ralph.js.map +7 -0
  70. package/dist/src/cli/commands/retrieval.js.map +7 -0
  71. package/dist/src/cli/commands/search.js +173 -0
  72. package/dist/src/cli/commands/search.js.map +7 -0
  73. package/dist/src/cli/commands/service.js.map +7 -0
  74. package/dist/src/cli/commands/session.js.map +7 -0
  75. package/dist/src/cli/commands/settings.js.map +7 -0
  76. package/dist/src/cli/commands/setup.js.map +7 -0
  77. package/dist/src/cli/commands/shell.js.map +7 -0
  78. package/dist/src/cli/commands/signup.js.map +7 -0
  79. package/dist/src/cli/commands/skills.js.map +7 -0
  80. package/dist/src/cli/commands/sms-notify.js.map +7 -0
  81. package/dist/src/cli/commands/storage-tier.js.map +7 -0
  82. package/dist/src/cli/commands/sweep.js.map +7 -0
  83. package/dist/src/cli/commands/tasks.js.map +7 -0
  84. package/dist/src/cli/commands/worktree.js.map +7 -0
  85. package/dist/src/cli/index.js +609 -0
  86. package/dist/src/cli/index.js.map +7 -0
  87. package/dist/src/cli/opencode-sm.js.map +7 -0
  88. package/dist/src/cli/utils/viewer.js.map +7 -0
  89. package/dist/src/core/config/config-manager.js.map +7 -0
  90. package/dist/src/core/config/feature-flags.js.map +7 -0
  91. package/dist/src/core/config/storage-config.js.map +7 -0
  92. package/dist/src/core/config/types.js.map +7 -0
  93. package/dist/src/core/context/auto-context.js.map +7 -0
  94. package/dist/src/core/context/dual-stack-manager.js.map +7 -0
  95. package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
  96. package/dist/src/core/context/frame-database.js.map +7 -0
  97. package/dist/src/core/context/frame-digest.js.map +7 -0
  98. package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
  99. package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
  100. package/dist/src/core/context/frame-recovery.js.map +7 -0
  101. package/dist/src/core/context/frame-stack.js.map +7 -0
  102. package/dist/src/core/context/index.js.map +7 -0
  103. package/dist/src/core/context/permission-manager.js.map +7 -0
  104. package/dist/src/core/context/recursive-context-manager.js.map +7 -0
  105. package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
  106. package/dist/src/core/context/shared-context-layer.js.map +7 -0
  107. package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
  108. package/dist/src/core/context/validation.js.map +7 -0
  109. package/dist/src/core/database/batch-operations.js.map +7 -0
  110. package/dist/src/core/database/connection-pool.js.map +7 -0
  111. package/dist/src/core/database/database-adapter.js.map +7 -0
  112. package/dist/src/core/database/migration-manager.js.map +7 -0
  113. package/dist/src/core/database/query-cache.js.map +7 -0
  114. package/dist/src/core/database/query-router.js.map +7 -0
  115. package/dist/src/core/database/sqlite-adapter.js +738 -0
  116. package/dist/src/core/database/sqlite-adapter.js.map +7 -0
  117. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
  118. package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
  119. package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
  120. package/dist/src/core/digest/index.js.map +7 -0
  121. package/dist/src/core/digest/types.js.map +7 -0
  122. package/dist/src/core/errors/error-utils.js +208 -0
  123. package/dist/src/core/errors/error-utils.js.map +7 -0
  124. package/dist/src/core/errors/index.js +521 -0
  125. package/dist/src/core/errors/index.js.map +7 -0
  126. package/dist/src/core/errors/recovery.js.map +7 -0
  127. package/dist/src/core/execution/parallel-executor.js.map +7 -0
  128. package/dist/src/core/extensions/custom-tools.js +567 -0
  129. package/dist/src/core/extensions/custom-tools.js.map +7 -0
  130. package/dist/src/core/extensions/index.js +55 -0
  131. package/dist/src/core/extensions/index.js.map +7 -0
  132. package/dist/src/core/extensions/loader.js +709 -0
  133. package/dist/src/core/extensions/loader.js.map +7 -0
  134. package/dist/src/core/extensions/plugin-system.js +506 -0
  135. package/dist/src/core/extensions/plugin-system.js.map +7 -0
  136. package/dist/src/core/extensions/provider-adapter.js +617 -0
  137. package/dist/src/core/extensions/provider-adapter.js.map +7 -0
  138. package/dist/src/core/extensions/sandbox-runtime.js +664 -0
  139. package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
  140. package/dist/src/core/frame/workflow-templates.js.map +7 -0
  141. package/dist/src/core/merge/conflict-detector.js.map +7 -0
  142. package/dist/src/core/merge/index.js.map +7 -0
  143. package/dist/src/core/merge/resolution-engine.js.map +7 -0
  144. package/dist/src/core/merge/stack-diff.js.map +7 -0
  145. package/dist/src/core/merge/unified-merge-resolver.js +303 -0
  146. package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
  147. package/dist/src/core/models/fallback-monitor.js.map +7 -0
  148. package/dist/src/core/models/model-router.js.map +7 -0
  149. package/dist/src/core/monitoring/error-handler.js.map +7 -0
  150. package/dist/src/core/monitoring/logger.js +202 -0
  151. package/dist/src/core/monitoring/logger.js.map +7 -0
  152. package/dist/src/core/monitoring/metrics.js.map +7 -0
  153. package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
  154. package/dist/src/core/monitoring/session-monitor.js.map +7 -0
  155. package/dist/src/core/performance/context-cache.js.map +7 -0
  156. package/dist/src/core/performance/index.js.map +7 -0
  157. package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
  158. package/dist/src/core/performance/monitor.js.map +7 -0
  159. package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
  160. package/dist/src/core/performance/performance-benchmark.js.map +7 -0
  161. package/dist/src/core/performance/performance-profiler.js.map +7 -0
  162. package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
  163. package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
  164. package/dist/src/core/projects/project-isolation.js.map +7 -0
  165. package/dist/src/core/projects/project-manager.js.map +7 -0
  166. package/dist/src/core/query/query-parser.js.map +7 -0
  167. package/dist/src/core/query/query-templates.js.map +7 -0
  168. package/dist/src/core/retrieval/context-retriever.js.map +7 -0
  169. package/dist/src/core/retrieval/index.js.map +7 -0
  170. package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
  171. package/dist/src/core/retrieval/llm-provider.js.map +7 -0
  172. package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
  173. package/dist/src/core/retrieval/summary-generator.js.map +7 -0
  174. package/dist/src/core/retrieval/types.js.map +7 -0
  175. package/dist/src/core/security/index.js +35 -0
  176. package/dist/src/core/security/index.js.map +7 -0
  177. package/dist/src/core/security/input-sanitizer.js +321 -0
  178. package/dist/src/core/security/input-sanitizer.js.map +7 -0
  179. package/dist/src/core/session/clear-survival.js.map +7 -0
  180. package/dist/src/core/session/enhanced-handoff.js.map +7 -0
  181. package/dist/src/core/session/handoff-generator.js.map +7 -0
  182. package/dist/src/core/session/index.js.map +7 -0
  183. package/dist/src/core/session/session-manager.js.map +7 -0
  184. package/dist/src/core/skills/index.js.map +7 -0
  185. package/dist/src/core/skills/skill-storage.js.map +7 -0
  186. package/dist/src/core/skills/types.js.map +7 -0
  187. package/dist/src/core/storage/chromadb-adapter.js +380 -0
  188. package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
  189. package/dist/src/core/storage/infinite-storage.js.map +7 -0
  190. package/dist/src/core/storage/remote-storage.js.map +7 -0
  191. package/dist/src/core/storage/two-tier-storage.js.map +7 -0
  192. package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
  193. package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
  194. package/dist/src/core/trace/debug-trace.js.map +7 -0
  195. package/dist/src/core/trace/index.js.map +7 -0
  196. package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
  197. package/dist/src/core/trace/trace-detector.js.map +7 -0
  198. package/dist/src/core/trace/trace-store.js.map +7 -0
  199. package/dist/src/core/trace/types.js.map +7 -0
  200. package/dist/src/core/utils/async-mutex.js.map +7 -0
  201. package/dist/src/core/utils/compression.js.map +7 -0
  202. package/dist/src/core/utils/update-checker.js.map +7 -0
  203. package/dist/src/core/worktree/worktree-manager.js.map +7 -0
  204. package/dist/src/daemon/daemon-config.js.map +7 -0
  205. package/dist/src/daemon/services/context-service.js.map +7 -0
  206. package/dist/src/daemon/services/linear-service.js.map +7 -0
  207. package/dist/src/daemon/session-daemon.js.map +7 -0
  208. package/dist/src/daemon/unified-daemon.js.map +7 -0
  209. package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
  210. package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
  211. package/dist/src/features/analytics/index.js.map +7 -0
  212. package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
  213. package/dist/src/features/browser/browser-mcp.js.map +7 -0
  214. package/dist/src/features/sweep/index.js.map +7 -0
  215. package/dist/src/features/sweep/prediction-client.js.map +7 -0
  216. package/dist/src/features/sweep/prompt-builder.js.map +7 -0
  217. package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
  218. package/dist/src/features/sweep/state-watcher.js.map +7 -0
  219. package/dist/src/features/sweep/status-bar.js.map +7 -0
  220. package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
  221. package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
  222. package/dist/src/features/sweep/types.js.map +7 -0
  223. package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
  224. package/dist/src/features/tasks/task-aware-context.js.map +7 -0
  225. package/dist/src/features/tui/simple-monitor.js.map +7 -0
  226. package/dist/src/features/tui/swarm-monitor.js.map +7 -0
  227. package/dist/src/features/web/client/stores/task-store.js.map +7 -0
  228. package/dist/src/features/web/server/index.js.map +7 -0
  229. package/dist/src/hooks/auto-background.js.map +7 -0
  230. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
  231. package/dist/src/hooks/config.js.map +7 -0
  232. package/dist/src/hooks/daemon.js.map +7 -0
  233. package/dist/src/hooks/events.js.map +7 -0
  234. package/dist/src/hooks/index.js.map +7 -0
  235. package/dist/src/hooks/linear-task-picker.js.map +7 -0
  236. package/dist/src/hooks/schemas.js.map +7 -0
  237. package/dist/src/hooks/secure-fs.js.map +7 -0
  238. package/dist/src/hooks/security-logger.js.map +7 -0
  239. package/dist/src/hooks/session-summary.js.map +7 -0
  240. package/dist/src/hooks/sms-action-runner.js.map +7 -0
  241. package/dist/src/hooks/sms-notify.js.map +7 -0
  242. package/dist/src/hooks/sms-watcher.js.map +7 -0
  243. package/dist/src/hooks/sms-webhook.js.map +7 -0
  244. package/dist/src/hooks/whatsapp-commands.js.map +7 -0
  245. package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
  246. package/dist/src/hooks/whatsapp-sync.js.map +7 -0
  247. package/dist/src/index.js.map +7 -0
  248. package/dist/src/integrations/anthropic/client.js.map +7 -0
  249. package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
  250. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
  251. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
  252. package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
  253. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
  254. package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
  255. package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
  256. package/dist/src/integrations/linear/auth.js.map +7 -0
  257. package/dist/src/integrations/linear/auto-sync.js.map +7 -0
  258. package/dist/src/integrations/linear/client.js +634 -0
  259. package/dist/src/integrations/linear/client.js.map +7 -0
  260. package/dist/src/integrations/linear/config.js.map +7 -0
  261. package/dist/src/integrations/linear/migration.js.map +7 -0
  262. package/dist/src/integrations/linear/oauth-server.js.map +7 -0
  263. package/dist/src/integrations/linear/rest-client.js.map +7 -0
  264. package/dist/src/integrations/linear/sync-manager.js.map +7 -0
  265. package/dist/src/integrations/linear/sync-service.js.map +7 -0
  266. package/dist/src/integrations/linear/sync.js.map +7 -0
  267. package/dist/src/integrations/linear/unified-sync.js.map +7 -0
  268. package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
  269. package/dist/src/integrations/linear/webhook-server.js.map +7 -0
  270. package/dist/src/integrations/linear/webhook.js.map +7 -0
  271. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  272. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
  273. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  274. package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
  275. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
  276. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
  277. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
  278. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
  279. package/dist/src/integrations/mcp/index.js.map +7 -0
  280. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
  281. package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
  282. package/dist/src/integrations/mcp/remote-server.js +682 -0
  283. package/dist/src/integrations/mcp/remote-server.js.map +7 -0
  284. package/dist/src/integrations/mcp/schemas.js.map +7 -0
  285. package/dist/src/integrations/mcp/server.js +1975 -0
  286. package/dist/src/integrations/mcp/server.js.map +7 -0
  287. package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
  288. package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
  289. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  290. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
  291. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  292. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
  293. package/dist/src/integrations/ralph/index.js.map +7 -0
  294. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
  295. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  296. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
  297. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
  298. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  299. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  300. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  301. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  302. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  303. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
  304. package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
  305. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
  306. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  307. package/dist/src/integrations/ralph/types.js +5 -0
  308. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  309. package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
  310. package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
  311. package/dist/src/models/user.model.js.map +7 -0
  312. package/dist/src/servers/production/auth-middleware.js.map +7 -0
  313. package/dist/src/services/config-service.js.map +7 -0
  314. package/dist/src/services/context-service.js.map +7 -0
  315. package/dist/src/skills/api-discovery.js.map +7 -0
  316. package/dist/src/skills/api-skill.js.map +7 -0
  317. package/dist/src/skills/claude-skills.js.map +7 -0
  318. package/dist/src/skills/dashboard-launcher.js.map +7 -0
  319. package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
  320. package/dist/src/skills/repo-ingestion-skill.js +632 -0
  321. package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
  322. package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
  323. package/dist/src/types/task.js.map +7 -0
  324. package/dist/src/utils/env.js.map +7 -0
  325. package/dist/src/utils/formatting.js.map +7 -0
  326. package/dist/src/utils/process-cleanup.js.map +7 -0
  327. package/package.json +13 -9
  328. package/scripts/background-sync-manager.js +145 -83
  329. package/scripts/claude-sm-autostart.js +17 -12
  330. package/scripts/gepa/README.md +275 -0
  331. package/scripts/gepa/config.json +53 -0
  332. package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
  333. package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
  334. package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
  335. package/scripts/gepa/generations/gen-000/baseline.md +124 -0
  336. package/scripts/gepa/hooks/auto-optimize.js +494 -0
  337. package/scripts/gepa/hooks/eval-tracker.js +203 -0
  338. package/scripts/gepa/hooks/reflect.js +311 -0
  339. package/scripts/gepa/optimize.js +611 -0
  340. package/scripts/gepa/state.json +14 -0
  341. package/scripts/initialize.ts +16 -7
  342. package/scripts/install.sh +14 -62
  343. package/scripts/status.ts +111 -46
  344. package/scripts/test-pre-publish-quick.sh +1 -1
  345. package/dist/agents/core/agent-task-manager.js.map +0 -7
  346. package/dist/agents/testing-agent.js +0 -614
  347. package/dist/agents/testing-agent.js.map +0 -7
  348. package/dist/agents/verifiers/base-verifier.js.map +0 -7
  349. package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
  350. package/dist/agents/verifiers/llm-judge.js.map +0 -7
  351. package/dist/cli/auto-detect.js.map +0 -7
  352. package/dist/cli/browser-test.js +0 -33
  353. package/dist/cli/browser-test.js.map +0 -7
  354. package/dist/cli/claude-sm-danger.js.map +0 -7
  355. package/dist/cli/claude-sm.js +0 -1156
  356. package/dist/cli/claude-sm.js.map +0 -7
  357. package/dist/cli/codex-sm-danger.js.map +0 -7
  358. package/dist/cli/codex-sm.js.map +0 -7
  359. package/dist/cli/commands/api.js.map +0 -7
  360. package/dist/cli/commands/auto-background.js.map +0 -7
  361. package/dist/cli/commands/cleanup-processes.js.map +0 -7
  362. package/dist/cli/commands/clear.js.map +0 -7
  363. package/dist/cli/commands/config.js.map +0 -7
  364. package/dist/cli/commands/context-rehydrate.js.map +0 -7
  365. package/dist/cli/commands/context.js.map +0 -7
  366. package/dist/cli/commands/daemon.js.map +0 -7
  367. package/dist/cli/commands/dashboard.js.map +0 -7
  368. package/dist/cli/commands/db.js.map +0 -7
  369. package/dist/cli/commands/decision.js.map +0 -7
  370. package/dist/cli/commands/discovery.js.map +0 -7
  371. package/dist/cli/commands/handoff.js.map +0 -7
  372. package/dist/cli/commands/hooks.js.map +0 -7
  373. package/dist/cli/commands/linear-unified.js +0 -353
  374. package/dist/cli/commands/linear-unified.js.map +0 -7
  375. package/dist/cli/commands/linear.js.map +0 -7
  376. package/dist/cli/commands/log.js.map +0 -7
  377. package/dist/cli/commands/login.js.map +0 -7
  378. package/dist/cli/commands/migrate.js.map +0 -7
  379. package/dist/cli/commands/model.js.map +0 -7
  380. package/dist/cli/commands/monitor.js +0 -313
  381. package/dist/cli/commands/monitor.js.map +0 -7
  382. package/dist/cli/commands/onboard.js.map +0 -7
  383. package/dist/cli/commands/projects.js.map +0 -7
  384. package/dist/cli/commands/quality.js +0 -413
  385. package/dist/cli/commands/quality.js.map +0 -7
  386. package/dist/cli/commands/ralph.js.map +0 -7
  387. package/dist/cli/commands/retrieval.js.map +0 -7
  388. package/dist/cli/commands/search.js +0 -156
  389. package/dist/cli/commands/search.js.map +0 -7
  390. package/dist/cli/commands/service.js.map +0 -7
  391. package/dist/cli/commands/session.js.map +0 -7
  392. package/dist/cli/commands/settings.js.map +0 -7
  393. package/dist/cli/commands/setup.js.map +0 -7
  394. package/dist/cli/commands/shell.js.map +0 -7
  395. package/dist/cli/commands/signup.js.map +0 -7
  396. package/dist/cli/commands/skills.js.map +0 -7
  397. package/dist/cli/commands/sms-notify.js.map +0 -7
  398. package/dist/cli/commands/storage-tier.js.map +0 -7
  399. package/dist/cli/commands/storage.js +0 -360
  400. package/dist/cli/commands/storage.js.map +0 -7
  401. package/dist/cli/commands/sweep.js.map +0 -7
  402. package/dist/cli/commands/tasks.js.map +0 -7
  403. package/dist/cli/commands/test.js +0 -286
  404. package/dist/cli/commands/test.js.map +0 -7
  405. package/dist/cli/commands/workflow.js +0 -142
  406. package/dist/cli/commands/workflow.js.map +0 -7
  407. package/dist/cli/commands/worktree.js.map +0 -7
  408. package/dist/cli/index.js +0 -594
  409. package/dist/cli/index.js.map +0 -7
  410. package/dist/cli/opencode-sm.js.map +0 -7
  411. package/dist/cli/utils/viewer.js.map +0 -7
  412. package/dist/core/analytics/team-analytics.js +0 -378
  413. package/dist/core/analytics/team-analytics.js.map +0 -7
  414. package/dist/core/config/config-manager.js.map +0 -7
  415. package/dist/core/config/feature-flags.js.map +0 -7
  416. package/dist/core/config/storage-config.js.map +0 -7
  417. package/dist/core/config/types.js.map +0 -7
  418. package/dist/core/context/auto-context.js.map +0 -7
  419. package/dist/core/context/dual-stack-manager.js.map +0 -7
  420. package/dist/core/context/enhanced-rehydration.js.map +0 -7
  421. package/dist/core/context/frame-database.js.map +0 -7
  422. package/dist/core/context/frame-digest.js.map +0 -7
  423. package/dist/core/context/frame-handoff-manager.js.map +0 -7
  424. package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
  425. package/dist/core/context/frame-manager.js +0 -1069
  426. package/dist/core/context/frame-manager.js.map +0 -7
  427. package/dist/core/context/frame-recovery.js.map +0 -7
  428. package/dist/core/context/frame-stack.js.map +0 -7
  429. package/dist/core/context/incremental-gc.js +0 -290
  430. package/dist/core/context/incremental-gc.js.map +0 -7
  431. package/dist/core/context/index.js.map +0 -7
  432. package/dist/core/context/model-aware-compaction.js +0 -623
  433. package/dist/core/context/model-aware-compaction.js.map +0 -7
  434. package/dist/core/context/permission-manager.js.map +0 -7
  435. package/dist/core/context/recursive-context-manager.js.map +0 -7
  436. package/dist/core/context/refactored-frame-manager.js.map +0 -7
  437. package/dist/core/context/shared-context-layer.js.map +0 -7
  438. package/dist/core/context/stack-merge-resolver.js.map +0 -7
  439. package/dist/core/context/validation.js.map +0 -7
  440. package/dist/core/database/batch-operations.js.map +0 -7
  441. package/dist/core/database/connection-pool.js.map +0 -7
  442. package/dist/core/database/database-adapter.js.map +0 -7
  443. package/dist/core/database/migration-manager.js.map +0 -7
  444. package/dist/core/database/paradedb-adapter.js +0 -990
  445. package/dist/core/database/paradedb-adapter.js.map +0 -7
  446. package/dist/core/database/query-cache.js.map +0 -7
  447. package/dist/core/database/query-router.js.map +0 -7
  448. package/dist/core/database/sqlite-adapter.js +0 -728
  449. package/dist/core/database/sqlite-adapter.js.map +0 -7
  450. package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
  451. package/dist/core/digest/frame-digest-integration.js.map +0 -7
  452. package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
  453. package/dist/core/digest/index.js.map +0 -7
  454. package/dist/core/digest/types.js.map +0 -7
  455. package/dist/core/errors/index.js +0 -512
  456. package/dist/core/errors/index.js.map +0 -7
  457. package/dist/core/errors/recovery.js.map +0 -7
  458. package/dist/core/execution/parallel-executor.js.map +0 -7
  459. package/dist/core/frame/workflow-templates.js.map +0 -7
  460. package/dist/core/merge/conflict-detector.js.map +0 -7
  461. package/dist/core/merge/index.js.map +0 -7
  462. package/dist/core/merge/resolution-engine.js.map +0 -7
  463. package/dist/core/merge/stack-diff.js.map +0 -7
  464. package/dist/core/models/fallback-monitor.js.map +0 -7
  465. package/dist/core/models/model-router.js.map +0 -7
  466. package/dist/core/monitoring/error-handler.js.map +0 -7
  467. package/dist/core/monitoring/logger.js +0 -150
  468. package/dist/core/monitoring/logger.js.map +0 -7
  469. package/dist/core/monitoring/metrics.js.map +0 -7
  470. package/dist/core/monitoring/progress-tracker.js.map +0 -7
  471. package/dist/core/monitoring/session-monitor.js.map +0 -7
  472. package/dist/core/performance/context-cache.js.map +0 -7
  473. package/dist/core/performance/index.js.map +0 -7
  474. package/dist/core/performance/lazy-context-loader.js.map +0 -7
  475. package/dist/core/performance/monitor.js.map +0 -7
  476. package/dist/core/performance/optimized-frame-context.js.map +0 -7
  477. package/dist/core/performance/performance-benchmark.js.map +0 -7
  478. package/dist/core/performance/performance-profiler.js.map +0 -7
  479. package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
  480. package/dist/core/persistence/postgres-adapter.js.map +0 -7
  481. package/dist/core/projects/project-isolation.js.map +0 -7
  482. package/dist/core/projects/project-manager.js.map +0 -7
  483. package/dist/core/query/query-parser.js.map +0 -7
  484. package/dist/core/query/query-templates.js.map +0 -7
  485. package/dist/core/retrieval/context-retriever.js.map +0 -7
  486. package/dist/core/retrieval/graph-retrieval.js +0 -662
  487. package/dist/core/retrieval/graph-retrieval.js.map +0 -7
  488. package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
  489. package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
  490. package/dist/core/retrieval/index.js.map +0 -7
  491. package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
  492. package/dist/core/retrieval/llm-provider.js.map +0 -7
  493. package/dist/core/retrieval/retrieval-audit.js.map +0 -7
  494. package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
  495. package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
  496. package/dist/core/retrieval/summary-generator.js.map +0 -7
  497. package/dist/core/retrieval/types.js.map +0 -7
  498. package/dist/core/session/clear-survival.js.map +0 -7
  499. package/dist/core/session/enhanced-handoff.js.map +0 -7
  500. package/dist/core/session/handoff-generator.js.map +0 -7
  501. package/dist/core/session/index.js.map +0 -7
  502. package/dist/core/session/session-manager.js.map +0 -7
  503. package/dist/core/skills/index.js.map +0 -7
  504. package/dist/core/skills/skill-storage.js.map +0 -7
  505. package/dist/core/skills/types.js.map +0 -7
  506. package/dist/core/storage/chromadb-adapter.js +0 -354
  507. package/dist/core/storage/chromadb-adapter.js.map +0 -7
  508. package/dist/core/storage/infinite-storage.js.map +0 -7
  509. package/dist/core/storage/railway-optimized-storage.js +0 -591
  510. package/dist/core/storage/railway-optimized-storage.js.map +0 -7
  511. package/dist/core/storage/remote-storage.js.map +0 -7
  512. package/dist/core/storage/two-tier-storage.js.map +0 -7
  513. package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
  514. package/dist/core/trace/db-trace-wrapper.js.map +0 -7
  515. package/dist/core/trace/debug-trace.js.map +0 -7
  516. package/dist/core/trace/index.js.map +0 -7
  517. package/dist/core/trace/linear-api-wrapper.js.map +0 -7
  518. package/dist/core/trace/trace-demo.js +0 -154
  519. package/dist/core/trace/trace-demo.js.map +0 -7
  520. package/dist/core/trace/trace-detector.demo.js +0 -142
  521. package/dist/core/trace/trace-detector.demo.js.map +0 -7
  522. package/dist/core/trace/trace-detector.js.map +0 -7
  523. package/dist/core/trace/trace-store.js.map +0 -7
  524. package/dist/core/trace/types.js.map +0 -7
  525. package/dist/core/utils/async-mutex.js.map +0 -7
  526. package/dist/core/utils/compression.js.map +0 -7
  527. package/dist/core/utils/update-checker.js.map +0 -7
  528. package/dist/core/worktree/worktree-manager.js.map +0 -7
  529. package/dist/daemon/daemon-config.js.map +0 -7
  530. package/dist/daemon/services/context-service.js.map +0 -7
  531. package/dist/daemon/services/linear-service.js.map +0 -7
  532. package/dist/daemon/session-daemon.js.map +0 -7
  533. package/dist/daemon/unified-daemon.js.map +0 -7
  534. package/dist/features/analytics/api/analytics-api.js.map +0 -7
  535. package/dist/features/analytics/core/analytics-service.js.map +0 -7
  536. package/dist/features/analytics/index.js.map +0 -7
  537. package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
  538. package/dist/features/browser/browser-mcp.js.map +0 -7
  539. package/dist/features/sweep/index.js.map +0 -7
  540. package/dist/features/sweep/prediction-client.js.map +0 -7
  541. package/dist/features/sweep/prompt-builder.js.map +0 -7
  542. package/dist/features/sweep/pty-wrapper.js.map +0 -7
  543. package/dist/features/sweep/state-watcher.js.map +0 -7
  544. package/dist/features/sweep/status-bar.js.map +0 -7
  545. package/dist/features/sweep/sweep-server-manager.js.map +0 -7
  546. package/dist/features/sweep/tab-interceptor.js.map +0 -7
  547. package/dist/features/sweep/types.js.map +0 -7
  548. package/dist/features/tasks/linear-task-manager.js.map +0 -7
  549. package/dist/features/tasks/task-aware-context.js.map +0 -7
  550. package/dist/features/tui/simple-monitor.js.map +0 -7
  551. package/dist/features/tui/swarm-monitor.js.map +0 -7
  552. package/dist/features/web/client/stores/task-store.js.map +0 -7
  553. package/dist/features/web/server/index.js.map +0 -7
  554. package/dist/hooks/auto-background.js.map +0 -7
  555. package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
  556. package/dist/hooks/config.js.map +0 -7
  557. package/dist/hooks/daemon.js.map +0 -7
  558. package/dist/hooks/events.js.map +0 -7
  559. package/dist/hooks/index.js.map +0 -7
  560. package/dist/hooks/linear-task-picker.js.map +0 -7
  561. package/dist/hooks/schemas.js.map +0 -7
  562. package/dist/hooks/secure-fs.js.map +0 -7
  563. package/dist/hooks/security-logger.js.map +0 -7
  564. package/dist/hooks/session-summary.js.map +0 -7
  565. package/dist/hooks/sms-action-runner.js.map +0 -7
  566. package/dist/hooks/sms-notify.js.map +0 -7
  567. package/dist/hooks/sms-watcher.js.map +0 -7
  568. package/dist/hooks/sms-webhook.js.map +0 -7
  569. package/dist/hooks/whatsapp-commands.js.map +0 -7
  570. package/dist/hooks/whatsapp-scheduler.js.map +0 -7
  571. package/dist/hooks/whatsapp-sync.js.map +0 -7
  572. package/dist/index.js.map +0 -7
  573. package/dist/integrations/anthropic/client.js.map +0 -7
  574. package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
  575. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  576. package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  577. package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
  578. package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
  579. package/dist/integrations/claude-code/subagent-client.js.map +0 -7
  580. package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
  581. package/dist/integrations/linear/auth.js.map +0 -7
  582. package/dist/integrations/linear/auto-sync.js.map +0 -7
  583. package/dist/integrations/linear/client.js +0 -630
  584. package/dist/integrations/linear/client.js.map +0 -7
  585. package/dist/integrations/linear/config.js.map +0 -7
  586. package/dist/integrations/linear/migration.js.map +0 -7
  587. package/dist/integrations/linear/oauth-server.js.map +0 -7
  588. package/dist/integrations/linear/rest-client.js.map +0 -7
  589. package/dist/integrations/linear/sync-manager.js.map +0 -7
  590. package/dist/integrations/linear/sync-service.js.map +0 -7
  591. package/dist/integrations/linear/sync.js.map +0 -7
  592. package/dist/integrations/linear/unified-sync.js.map +0 -7
  593. package/dist/integrations/linear/webhook-handler.js.map +0 -7
  594. package/dist/integrations/linear/webhook-server.js.map +0 -7
  595. package/dist/integrations/linear/webhook.js.map +0 -7
  596. package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  597. package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
  598. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  599. package/dist/integrations/mcp/handlers/index.js.map +0 -7
  600. package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  601. package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  602. package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
  603. package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  604. package/dist/integrations/mcp/index.js.map +0 -7
  605. package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  606. package/dist/integrations/mcp/refactored-server.js.map +0 -7
  607. package/dist/integrations/mcp/remote-server.js +0 -691
  608. package/dist/integrations/mcp/remote-server.js.map +0 -7
  609. package/dist/integrations/mcp/schemas.js.map +0 -7
  610. package/dist/integrations/mcp/server.js +0 -1960
  611. package/dist/integrations/mcp/server.js.map +0 -7
  612. package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
  613. package/dist/integrations/mcp/tool-definitions.js.map +0 -7
  614. package/dist/integrations/mcp/trace-test.js +0 -48
  615. package/dist/integrations/mcp/trace-test.js.map +0 -7
  616. package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
  617. package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
  618. package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
  619. package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
  620. package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
  621. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
  622. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  623. package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
  624. package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  625. package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  626. package/dist/integrations/ralph/index.js.map +0 -7
  627. package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
  628. package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  629. package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  630. package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  631. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  632. package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  633. package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  634. package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  635. package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  636. package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
  637. package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
  638. package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  639. package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
  640. package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  641. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  642. package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  643. package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
  644. package/dist/middleware/exponential-rate-limiter.js.map +0 -7
  645. package/dist/models/user.model.js.map +0 -7
  646. package/dist/servers/production/auth-middleware.js.map +0 -7
  647. package/dist/servers/railway/config.js +0 -55
  648. package/dist/servers/railway/config.js.map +0 -7
  649. package/dist/servers/railway/index-enhanced.js +0 -160
  650. package/dist/servers/railway/index-enhanced.js.map +0 -7
  651. package/dist/servers/railway/index.js +0 -1349
  652. package/dist/servers/railway/index.js.map +0 -7
  653. package/dist/servers/railway/simple.js +0 -64
  654. package/dist/servers/railway/simple.js.map +0 -7
  655. package/dist/servers/railway/storage-test.js +0 -459
  656. package/dist/servers/railway/storage-test.js.map +0 -7
  657. package/dist/services/config-service.js.map +0 -7
  658. package/dist/services/context-service.js.map +0 -7
  659. package/dist/skills/api-discovery.js.map +0 -7
  660. package/dist/skills/api-skill.js.map +0 -7
  661. package/dist/skills/claude-skills.js.map +0 -7
  662. package/dist/skills/dashboard-launcher.js.map +0 -7
  663. package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
  664. package/dist/skills/repo-ingestion-skill.js +0 -609
  665. package/dist/skills/repo-ingestion-skill.js.map +0 -7
  666. package/dist/skills/security-secrets-scanner.js +0 -284
  667. package/dist/skills/security-secrets-scanner.js.map +0 -7
  668. package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
  669. package/dist/utils/env.js.map +0 -7
  670. package/dist/utils/formatting.js.map +0 -7
  671. package/dist/utils/process-cleanup.js.map +0 -7
  672. package/dist/validation/schemas.js +0 -222
  673. package/dist/validation/schemas.js.map +0 -7
  674. /package/dist/{agents → src/agents}/core/agent-task-manager.js +0 -0
  675. /package/dist/{agents → src/agents}/verifiers/base-verifier.js +0 -0
  676. /package/dist/{agents → src/agents}/verifiers/formatter-verifier.js +0 -0
  677. /package/dist/{agents → src/agents}/verifiers/llm-judge.js +0 -0
  678. /package/dist/{cli → src/cli}/auto-detect.js +0 -0
  679. /package/dist/{cli → src/cli}/claude-sm-danger.js +0 -0
  680. /package/dist/{cli → src/cli}/codex-sm-danger.js +0 -0
  681. /package/dist/{cli → src/cli}/codex-sm.js +0 -0
  682. /package/dist/{cli → src/cli}/commands/api.js +0 -0
  683. /package/dist/{cli → src/cli}/commands/auto-background.js +0 -0
  684. /package/dist/{cli → src/cli}/commands/cleanup-processes.js +0 -0
  685. /package/dist/{cli → src/cli}/commands/clear.js +0 -0
  686. /package/dist/{cli → src/cli}/commands/config.js +0 -0
  687. /package/dist/{cli → src/cli}/commands/context-rehydrate.js +0 -0
  688. /package/dist/{cli → src/cli}/commands/context.js +0 -0
  689. /package/dist/{cli → src/cli}/commands/daemon.js +0 -0
  690. /package/dist/{cli → src/cli}/commands/dashboard.js +0 -0
  691. /package/dist/{cli → src/cli}/commands/db.js +0 -0
  692. /package/dist/{cli → src/cli}/commands/decision.js +0 -0
  693. /package/dist/{cli → src/cli}/commands/discovery.js +0 -0
  694. /package/dist/{cli → src/cli}/commands/handoff.js +0 -0
  695. /package/dist/{cli → src/cli}/commands/hooks.js +0 -0
  696. /package/dist/{cli → src/cli}/commands/linear.js +0 -0
  697. /package/dist/{cli → src/cli}/commands/log.js +0 -0
  698. /package/dist/{cli → src/cli}/commands/login.js +0 -0
  699. /package/dist/{cli → src/cli}/commands/migrate.js +0 -0
  700. /package/dist/{cli → src/cli}/commands/model.js +0 -0
  701. /package/dist/{cli → src/cli}/commands/onboard.js +0 -0
  702. /package/dist/{cli → src/cli}/commands/projects.js +0 -0
  703. /package/dist/{cli → src/cli}/commands/ralph.js +0 -0
  704. /package/dist/{cli → src/cli}/commands/retrieval.js +0 -0
  705. /package/dist/{cli → src/cli}/commands/service.js +0 -0
  706. /package/dist/{cli → src/cli}/commands/session.js +0 -0
  707. /package/dist/{cli → src/cli}/commands/settings.js +0 -0
  708. /package/dist/{cli → src/cli}/commands/setup.js +0 -0
  709. /package/dist/{cli → src/cli}/commands/shell.js +0 -0
  710. /package/dist/{cli → src/cli}/commands/signup.js +0 -0
  711. /package/dist/{cli → src/cli}/commands/skills.js +0 -0
  712. /package/dist/{cli → src/cli}/commands/sms-notify.js +0 -0
  713. /package/dist/{cli → src/cli}/commands/storage-tier.js +0 -0
  714. /package/dist/{cli → src/cli}/commands/sweep.js +0 -0
  715. /package/dist/{cli → src/cli}/commands/tasks.js +0 -0
  716. /package/dist/{cli → src/cli}/commands/worktree.js +0 -0
  717. /package/dist/{cli → src/cli}/opencode-sm.js +0 -0
  718. /package/dist/{cli → src/cli}/utils/viewer.js +0 -0
  719. /package/dist/{core → src/core}/config/config-manager.js +0 -0
  720. /package/dist/{core → src/core}/config/feature-flags.js +0 -0
  721. /package/dist/{core → src/core}/config/storage-config.js +0 -0
  722. /package/dist/{core → src/core}/config/types.js +0 -0
  723. /package/dist/{core → src/core}/context/auto-context.js +0 -0
  724. /package/dist/{core → src/core}/context/dual-stack-manager.js +0 -0
  725. /package/dist/{core → src/core}/context/enhanced-rehydration.js +0 -0
  726. /package/dist/{core → src/core}/context/frame-database.js +0 -0
  727. /package/dist/{core → src/core}/context/frame-digest.js +0 -0
  728. /package/dist/{core → src/core}/context/frame-handoff-manager.js +0 -0
  729. /package/dist/{core → src/core}/context/frame-lifecycle-hooks.js +0 -0
  730. /package/dist/{core → src/core}/context/frame-recovery.js +0 -0
  731. /package/dist/{core → src/core}/context/frame-stack.js +0 -0
  732. /package/dist/{core → src/core}/context/frame-types.js +0 -0
  733. /package/dist/{core → src/core}/context/frame-types.js.map +0 -0
  734. /package/dist/{core → src/core}/context/index.js +0 -0
  735. /package/dist/{core → src/core}/context/permission-manager.js +0 -0
  736. /package/dist/{core → src/core}/context/recursive-context-manager.js +0 -0
  737. /package/dist/{core → src/core}/context/refactored-frame-manager.js +0 -0
  738. /package/dist/{core → src/core}/context/shared-context-layer.js +0 -0
  739. /package/dist/{core → src/core}/context/stack-merge-resolver.js +0 -0
  740. /package/dist/{core → src/core}/context/validation.js +0 -0
  741. /package/dist/{core → src/core}/database/batch-operations.js +0 -0
  742. /package/dist/{core → src/core}/database/connection-pool.js +0 -0
  743. /package/dist/{core → src/core}/database/database-adapter.js +0 -0
  744. /package/dist/{core → src/core}/database/migration-manager.js +0 -0
  745. /package/dist/{core → src/core}/database/query-cache.js +0 -0
  746. /package/dist/{core → src/core}/database/query-router.js +0 -0
  747. /package/dist/{core → src/core}/digest/enhanced-hybrid-digest.js +0 -0
  748. /package/dist/{core → src/core}/digest/frame-digest-integration.js +0 -0
  749. /package/dist/{core → src/core}/digest/hybrid-digest-generator.js +0 -0
  750. /package/dist/{core → src/core}/digest/index.js +0 -0
  751. /package/dist/{core → src/core}/digest/types.js +0 -0
  752. /package/dist/{core → src/core}/errors/recovery.js +0 -0
  753. /package/dist/{core → src/core}/execution/parallel-executor.js +0 -0
  754. /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
  755. /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
  756. /package/dist/{core → src/core}/frame/workflow-templates.js +0 -0
  757. /package/dist/{core → src/core}/merge/conflict-detector.js +0 -0
  758. /package/dist/{core → src/core}/merge/index.js +0 -0
  759. /package/dist/{core → src/core}/merge/resolution-engine.js +0 -0
  760. /package/dist/{core → src/core}/merge/stack-diff.js +0 -0
  761. /package/dist/{core → src/core/merge}/types.js +0 -0
  762. /package/dist/{core → src/core/merge}/types.js.map +0 -0
  763. /package/dist/{core → src/core}/models/fallback-monitor.js +0 -0
  764. /package/dist/{core → src/core}/models/model-router.js +0 -0
  765. /package/dist/{core → src/core}/monitoring/error-handler.js +0 -0
  766. /package/dist/{core → src/core}/monitoring/metrics.js +0 -0
  767. /package/dist/{core → src/core}/monitoring/progress-tracker.js +0 -0
  768. /package/dist/{core → src/core}/monitoring/session-monitor.js +0 -0
  769. /package/dist/{core → src/core}/performance/context-cache.js +0 -0
  770. /package/dist/{core → src/core}/performance/index.js +0 -0
  771. /package/dist/{core → src/core}/performance/lazy-context-loader.js +0 -0
  772. /package/dist/{core → src/core}/performance/monitor.js +0 -0
  773. /package/dist/{core → src/core}/performance/optimized-frame-context.js +0 -0
  774. /package/dist/{core → src/core}/performance/performance-benchmark.js +0 -0
  775. /package/dist/{core → src/core}/performance/performance-profiler.js +0 -0
  776. /package/dist/{core → src/core}/performance/streaming-jsonl-parser.js +0 -0
  777. /package/dist/{core → src/core}/persistence/postgres-adapter.js +0 -0
  778. /package/dist/{core → src/core}/projects/project-isolation.js +0 -0
  779. /package/dist/{core → src/core}/projects/project-manager.js +0 -0
  780. /package/dist/{core → src/core}/query/query-parser.js +0 -0
  781. /package/dist/{core → src/core}/query/query-templates.js +0 -0
  782. /package/dist/{core → src/core}/retrieval/context-retriever.js +0 -0
  783. /package/dist/{core → src/core}/retrieval/index.js +0 -0
  784. /package/dist/{core → src/core}/retrieval/llm-context-retrieval.js +0 -0
  785. /package/dist/{core → src/core}/retrieval/llm-provider.js +0 -0
  786. /package/dist/{core → src/core}/retrieval/retrieval-audit.js +0 -0
  787. /package/dist/{core → src/core}/retrieval/summary-generator.js +0 -0
  788. /package/dist/{core → src/core}/retrieval/types.js +0 -0
  789. /package/dist/{core → src/core}/session/clear-survival.js +0 -0
  790. /package/dist/{core → src/core}/session/enhanced-handoff.js +0 -0
  791. /package/dist/{core → src/core}/session/handoff-generator.js +0 -0
  792. /package/dist/{core → src/core}/session/index.js +0 -0
  793. /package/dist/{core → src/core}/session/session-manager.js +0 -0
  794. /package/dist/{core → src/core}/skills/index.js +0 -0
  795. /package/dist/{core → src/core}/skills/skill-storage.js +0 -0
  796. /package/dist/{core → src/core}/skills/types.js +0 -0
  797. /package/dist/{core → src/core}/storage/infinite-storage.js +0 -0
  798. /package/dist/{core → src/core}/storage/remote-storage.js +0 -0
  799. /package/dist/{core → src/core}/storage/two-tier-storage.js +0 -0
  800. /package/dist/{core → src/core}/trace/cli-trace-wrapper.js +0 -0
  801. /package/dist/{core → src/core}/trace/db-trace-wrapper.js +0 -0
  802. /package/dist/{core → src/core}/trace/debug-trace.js +0 -0
  803. /package/dist/{core → src/core}/trace/index.js +0 -0
  804. /package/dist/{core → src/core}/trace/linear-api-wrapper.js +0 -0
  805. /package/dist/{core → src/core}/trace/trace-detector.js +0 -0
  806. /package/dist/{core → src/core}/trace/trace-store.js +0 -0
  807. /package/dist/{core → src/core}/trace/types.js +0 -0
  808. /package/dist/{integrations/linear → src/core}/types.js +0 -0
  809. /package/dist/{integrations/linear → src/core}/types.js.map +0 -0
  810. /package/dist/{core → src/core}/utils/async-mutex.js +0 -0
  811. /package/dist/{core → src/core}/utils/compression.js +0 -0
  812. /package/dist/{core → src/core}/utils/update-checker.js +0 -0
  813. /package/dist/{core → src/core}/worktree/worktree-manager.js +0 -0
  814. /package/dist/{daemon → src/daemon}/daemon-config.js +0 -0
  815. /package/dist/{daemon → src/daemon}/services/context-service.js +0 -0
  816. /package/dist/{daemon → src/daemon}/services/linear-service.js +0 -0
  817. /package/dist/{daemon → src/daemon}/session-daemon.js +0 -0
  818. /package/dist/{daemon → src/daemon}/unified-daemon.js +0 -0
  819. /package/dist/{features → src/features}/analytics/api/analytics-api.js +0 -0
  820. /package/dist/{features → src/features}/analytics/core/analytics-service.js +0 -0
  821. /package/dist/{features → src/features}/analytics/index.js +0 -0
  822. /package/dist/{features → src/features}/analytics/queries/metrics-queries.js +0 -0
  823. /package/dist/{features → src/features}/analytics/types/metrics.js +0 -0
  824. /package/dist/{features → src/features}/analytics/types/metrics.js.map +0 -0
  825. /package/dist/{features → src/features}/browser/browser-mcp.js +0 -0
  826. /package/dist/{features → src/features}/sweep/index.js +0 -0
  827. /package/dist/{features → src/features}/sweep/prediction-client.js +0 -0
  828. /package/dist/{features → src/features}/sweep/prompt-builder.js +0 -0
  829. /package/dist/{features → src/features}/sweep/pty-wrapper.js +0 -0
  830. /package/dist/{features → src/features}/sweep/state-watcher.js +0 -0
  831. /package/dist/{features → src/features}/sweep/status-bar.js +0 -0
  832. /package/dist/{features → src/features}/sweep/sweep-server-manager.js +0 -0
  833. /package/dist/{features → src/features}/sweep/tab-interceptor.js +0 -0
  834. /package/dist/{features → src/features}/sweep/types.js +0 -0
  835. /package/dist/{features → src/features}/tasks/linear-task-manager.js +0 -0
  836. /package/dist/{features → src/features}/tasks/task-aware-context.js +0 -0
  837. /package/dist/{features → src/features}/tui/simple-monitor.js +0 -0
  838. /package/dist/{features → src/features}/tui/swarm-monitor.js +0 -0
  839. /package/dist/{features → src/features}/web/client/stores/task-store.js +0 -0
  840. /package/dist/{features → src/features}/web/server/index.js +0 -0
  841. /package/dist/{hooks → src/hooks}/auto-background.js +0 -0
  842. /package/dist/{hooks → src/hooks}/claude-code-whatsapp-hook.js +0 -0
  843. /package/dist/{hooks → src/hooks}/config.js +0 -0
  844. /package/dist/{hooks → src/hooks}/daemon.js +0 -0
  845. /package/dist/{hooks → src/hooks}/events.js +0 -0
  846. /package/dist/{hooks → src/hooks}/index.js +0 -0
  847. /package/dist/{hooks → src/hooks}/linear-task-picker.js +0 -0
  848. /package/dist/{hooks → src/hooks}/schemas.js +0 -0
  849. /package/dist/{hooks → src/hooks}/secure-fs.js +0 -0
  850. /package/dist/{hooks → src/hooks}/security-logger.js +0 -0
  851. /package/dist/{hooks → src/hooks}/session-summary.js +0 -0
  852. /package/dist/{hooks → src/hooks}/sms-action-runner.js +0 -0
  853. /package/dist/{hooks → src/hooks}/sms-notify.js +0 -0
  854. /package/dist/{hooks → src/hooks}/sms-watcher.js +0 -0
  855. /package/dist/{hooks → src/hooks}/sms-webhook.js +0 -0
  856. /package/dist/{hooks → src/hooks}/whatsapp-commands.js +0 -0
  857. /package/dist/{hooks → src/hooks}/whatsapp-scheduler.js +0 -0
  858. /package/dist/{hooks → src/hooks}/whatsapp-sync.js +0 -0
  859. /package/dist/{index.js → src/index.js} +0 -0
  860. /package/dist/{integrations → src/integrations}/anthropic/client.js +0 -0
  861. /package/dist/{integrations → src/integrations}/claude-code/agent-bridge.js +0 -0
  862. /package/dist/{integrations → src/integrations}/claude-code/enhanced-pre-clear-hooks.js +0 -0
  863. /package/dist/{integrations → src/integrations}/claude-code/lifecycle-hooks.js +0 -0
  864. /package/dist/{integrations → src/integrations}/claude-code/post-task-hooks.js +0 -0
  865. /package/dist/{integrations → src/integrations}/claude-code/subagent-client-stub.js +0 -0
  866. /package/dist/{integrations → src/integrations}/claude-code/subagent-client.js +0 -0
  867. /package/dist/{integrations → src/integrations}/claude-code/task-coordinator.js +0 -0
  868. /package/dist/{integrations → src/integrations}/linear/auth.js +0 -0
  869. /package/dist/{integrations → src/integrations}/linear/auto-sync.js +0 -0
  870. /package/dist/{integrations → src/integrations}/linear/config.js +0 -0
  871. /package/dist/{integrations → src/integrations}/linear/migration.js +0 -0
  872. /package/dist/{integrations → src/integrations}/linear/oauth-server.js +0 -0
  873. /package/dist/{integrations → src/integrations}/linear/rest-client.js +0 -0
  874. /package/dist/{integrations → src/integrations}/linear/sync-manager.js +0 -0
  875. /package/dist/{integrations → src/integrations}/linear/sync-service.js +0 -0
  876. /package/dist/{integrations → src/integrations}/linear/sync.js +0 -0
  877. /package/dist/{integrations/ralph → src/integrations/linear}/types.js +0 -0
  878. /package/dist/{integrations/ralph → src/integrations/linear}/types.js.map +0 -0
  879. /package/dist/{integrations → src/integrations}/linear/unified-sync.js +0 -0
  880. /package/dist/{integrations → src/integrations}/linear/webhook-handler.js +0 -0
  881. /package/dist/{integrations → src/integrations}/linear/webhook-server.js +0 -0
  882. /package/dist/{integrations → src/integrations}/linear/webhook.js +0 -0
  883. /package/dist/{integrations → src/integrations}/mcp/handlers/code-execution-handlers.js +0 -0
  884. /package/dist/{integrations → src/integrations}/mcp/handlers/context-handlers.js +0 -0
  885. /package/dist/{integrations → src/integrations}/mcp/handlers/discovery-handlers.js +0 -0
  886. /package/dist/{integrations → src/integrations}/mcp/handlers/index.js +0 -0
  887. /package/dist/{integrations → src/integrations}/mcp/handlers/linear-handlers.js +0 -0
  888. /package/dist/{integrations → src/integrations}/mcp/handlers/skill-handlers.js +0 -0
  889. /package/dist/{integrations → src/integrations}/mcp/handlers/task-handlers.js +0 -0
  890. /package/dist/{integrations → src/integrations}/mcp/handlers/trace-handlers.js +0 -0
  891. /package/dist/{integrations → src/integrations}/mcp/index.js +0 -0
  892. /package/dist/{integrations → src/integrations}/mcp/middleware/tool-scoring.js +0 -0
  893. /package/dist/{integrations → src/integrations}/mcp/refactored-server.js +0 -0
  894. /package/dist/{integrations → src/integrations}/mcp/schemas.js +0 -0
  895. /package/dist/{integrations → src/integrations}/mcp/tool-definitions-code.js +0 -0
  896. /package/dist/{integrations → src/integrations}/mcp/tool-definitions.js +0 -0
  897. /package/dist/{integrations → src/integrations}/ralph/bridge/ralph-stackmemory-bridge.js +0 -0
  898. /package/dist/{integrations → src/integrations}/ralph/context/context-budget-manager.js +0 -0
  899. /package/dist/{integrations → src/integrations}/ralph/context/stackmemory-context-loader.js +0 -0
  900. /package/dist/{integrations → src/integrations}/ralph/coordination/enhanced-coordination.js +0 -0
  901. /package/dist/{integrations → src/integrations}/ralph/index.js +0 -0
  902. /package/dist/{integrations → src/integrations}/ralph/learning/pattern-learner.js +0 -0
  903. /package/dist/{integrations → src/integrations}/ralph/lifecycle/iteration-lifecycle.js +0 -0
  904. /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-dashboard.js +0 -0
  905. /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-registry.js +0 -0
  906. /package/dist/{integrations → src/integrations}/ralph/orchestration/multi-loop-orchestrator.js +0 -0
  907. /package/dist/{integrations → src/integrations}/ralph/patterns/compounding-engineering-pattern.js +0 -0
  908. /package/dist/{integrations → src/integrations}/ralph/patterns/extended-coherence-sessions.js +0 -0
  909. /package/dist/{integrations → src/integrations}/ralph/patterns/oracle-worker-pattern.js +0 -0
  910. /package/dist/{integrations → src/integrations}/ralph/performance/performance-optimizer.js +0 -0
  911. /package/dist/{integrations → src/integrations}/ralph/recovery/crash-recovery.js +0 -0
  912. /package/dist/{integrations → src/integrations}/ralph/state/state-reconciler.js +0 -0
  913. /package/dist/{integrations → src/integrations}/ralph/swarm/git-workflow-manager.js +0 -0
  914. /package/dist/{integrations → src/integrations}/ralph/swarm/swarm-coordinator.js +0 -0
  915. /package/dist/{types/task.js.map → src/integrations/ralph/types.js.map} +0 -0
  916. /package/dist/{integrations → src/integrations}/ralph/visualization/ralph-debugger.js +0 -0
  917. /package/dist/{mcp → src/mcp}/stackmemory-mcp-server.js +0 -0
  918. /package/dist/{middleware → src/middleware}/exponential-rate-limiter.js +0 -0
  919. /package/dist/{models → src/models}/user.model.js +0 -0
  920. /package/dist/{servers → src/servers}/production/auth-middleware.js +0 -0
  921. /package/dist/{services → src/services}/config-service.js +0 -0
  922. /package/dist/{services → src/services}/context-service.js +0 -0
  923. /package/dist/{skills → src/skills}/api-discovery.js +0 -0
  924. /package/dist/{skills → src/skills}/api-skill.js +0 -0
  925. /package/dist/{skills → src/skills}/claude-skills.js +0 -0
  926. /package/dist/{skills → src/skills}/dashboard-launcher.js +0 -0
  927. /package/dist/{skills → src/skills}/recursive-agent-orchestrator.js +0 -0
  928. /package/dist/{skills → src/skills}/unified-rlm-orchestrator.js +0 -0
  929. /package/dist/{types → src/types}/task.js +0 -0
  930. /package/dist/{utils → src/utils}/env.js +0 -0
  931. /package/dist/{utils → src/utils}/formatting.js +0 -0
  932. /package/dist/{utils → src/utils}/process-cleanup.js +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/retrieval/types.ts"],
4
- "sourcesContent": ["/**\n * Types for LLM-Driven Context Retrieval System\n * Implements intelligent context selection based on compressed summaries\n */\n\nimport { Frame, Anchor, Event } from '../context/index.js';\nimport { StackMemoryQuery } from '../query/query-parser.js';\n\n/**\n * Compressed summary of recent session activity\n */\nexport interface RecentSessionSummary {\n /** Recent frames with their key attributes */\n frames: FrameSummary[];\n /** Dominant operations performed */\n dominantOperations: OperationSummary[];\n /** Files that were touched */\n filesTouched: FileSummary[];\n /** Errors encountered */\n errorsEncountered: ErrorSummary[];\n /** Time range covered */\n timeRange: {\n start: number;\n end: number;\n durationMs: number;\n };\n}\n\nexport interface FrameSummary {\n frameId: string;\n name: string;\n type: string;\n depth: number;\n eventCount: number;\n anchorCount: number;\n score: number;\n createdAt: number;\n closedAt?: number;\n digestPreview?: string;\n}\n\nexport interface OperationSummary {\n operation: string;\n count: number;\n lastOccurrence: number;\n successRate: number;\n}\n\nexport interface FileSummary {\n path: string;\n operationCount: number;\n lastModified: number;\n operations: string[];\n}\n\nexport interface ErrorSummary {\n errorType: string;\n message: string;\n count: number;\n lastOccurrence: number;\n resolved: boolean;\n}\n\n/**\n * Historical patterns extracted from memory\n */\nexport interface HistoricalPatterns {\n /** Frame counts by topic */\n topicFrameCounts: Record<string, number>;\n /** Key decisions made */\n keyDecisions: DecisionSummary[];\n /** Recurring issues */\n recurringIssues: IssueSummary[];\n /** Common tool sequences */\n commonToolSequences: ToolSequence[];\n /** Time-based activity patterns */\n activityPatterns: ActivityPattern[];\n}\n\nexport interface DecisionSummary {\n id: string;\n text: string;\n frameId: string;\n timestamp: number;\n impact: 'low' | 'medium' | 'high';\n relatedFiles?: string[];\n}\n\nexport interface IssueSummary {\n issueType: string;\n occurrenceCount: number;\n lastSeen: number;\n resolutionRate: number;\n commonFixes?: string[];\n}\n\nexport interface ToolSequence {\n pattern: string;\n frequency: number;\n avgDuration: number;\n successRate: number;\n}\n\nexport interface ActivityPattern {\n periodType: 'hourly' | 'daily' | 'weekly';\n peakPeriods: string[];\n avgEventsPerPeriod: number;\n}\n\n/**\n * Queryable indices for fast retrieval\n */\nexport interface QueryableIndices {\n /** Index by error type */\n byErrorType: Record<string, string[]>; // errorType -> frameIds\n /** Index by timeframe */\n byTimeframe: Record<string, string[]>; // timeKey -> frameIds\n /** Index by contributor */\n byContributor: Record<string, string[]>; // userId -> frameIds\n /** Index by topic */\n byTopic: Record<string, string[]>; // topic -> frameIds\n /** Index by file */\n byFile: Record<string, string[]>; // filePath -> frameIds\n}\n\n/**\n * Complete compressed summary for LLM analysis\n */\nexport interface CompressedSummary {\n /** Project identifier */\n projectId: string;\n /** Generation timestamp */\n generatedAt: number;\n /** Recent session summary */\n recentSession: RecentSessionSummary;\n /** Historical patterns */\n historicalPatterns: HistoricalPatterns;\n /** Queryable indices */\n queryableIndices: QueryableIndices;\n /** Summary statistics */\n stats: SummaryStats;\n}\n\nexport interface SummaryStats {\n totalFrames: number;\n totalEvents: number;\n totalAnchors: number;\n totalDecisions: number;\n oldestFrame: number;\n newestFrame: number;\n avgFrameDepth: number;\n avgEventsPerFrame: number;\n}\n\n/**\n * LLM analysis request\n */\nexport interface LLMAnalysisRequest {\n /** Current user query */\n currentQuery: string;\n /** Parsed structured query */\n parsedQuery?: StackMemoryQuery;\n /** Compressed summary */\n compressedSummary: CompressedSummary;\n /** Token budget for context */\n tokenBudget: number;\n /** Optional hints for retrieval */\n hints?: RetrievalHints;\n}\n\nexport interface RetrievalHints {\n /** Prefer recent frames */\n preferRecent?: boolean;\n /** Focus on specific topics */\n focusTopics?: string[];\n /** Include error context */\n includeErrors?: boolean;\n /** Include decision history */\n includeDecisions?: boolean;\n /** Minimum relevance score */\n minRelevance?: number;\n}\n\n/**\n * LLM analysis response\n */\nexport interface LLMAnalysisResponse {\n /** Reasoning for the retrieval decision (auditable) */\n reasoning: string;\n /** Frames to retrieve with priority order */\n framesToRetrieve: FrameRetrievalPlan[];\n /** Confidence score (0.0 - 1.0) */\n confidenceScore: number;\n /** Additional context recommendations */\n recommendations: ContextRecommendation[];\n /** Analysis metadata */\n metadata: AnalysisMetadata;\n}\n\nexport interface FrameRetrievalPlan {\n frameId: string;\n priority: number; // 1-10, higher = more important\n reason: string;\n includeEvents: boolean;\n includeAnchors: boolean;\n includeDigest: boolean;\n estimatedTokens: number;\n}\n\nexport interface ContextRecommendation {\n type: 'include' | 'exclude' | 'summarize';\n target: string; // frameId, anchorId, or description\n reason: string;\n impact: 'low' | 'medium' | 'high';\n}\n\nexport interface AnalysisMetadata {\n analysisTimeMs: number;\n summaryTokens: number;\n queryComplexity: 'simple' | 'moderate' | 'complex';\n matchedPatterns: string[];\n fallbackUsed: boolean;\n}\n\n/**\n * Retrieved context result\n */\nexport interface RetrievedContext {\n /** Assembled context string */\n context: string;\n /** Frames included */\n frames: Frame[];\n /** Anchors included */\n anchors: Anchor[];\n /** Events included */\n events: Event[];\n /** LLM analysis that drove retrieval */\n analysis: LLMAnalysisResponse;\n /** Token usage */\n tokenUsage: {\n budget: number;\n used: number;\n remaining: number;\n };\n /** Retrieval metadata */\n metadata: RetrievalMetadata;\n}\n\nexport interface RetrievalMetadata {\n retrievalTimeMs: number;\n cacheHit: boolean;\n framesScanned: number;\n framesIncluded: number;\n compressionRatio: number;\n}\n\n/**\n * Configuration for the retrieval system\n */\nexport interface RetrievalConfig {\n /** Maximum frames to include in summary */\n maxSummaryFrames: number;\n /** Default token budget */\n defaultTokenBudget: number;\n /** Cache TTL in seconds */\n cacheTtlSeconds: number;\n /** Minimum confidence to use LLM suggestions */\n minConfidenceThreshold: number;\n /** Enable fallback to heuristic retrieval */\n enableFallback: boolean;\n /** LLM provider configuration */\n llmConfig: {\n provider: 'anthropic' | 'openai' | 'local';\n model: string;\n maxTokens: number;\n temperature: number;\n };\n}\n\nexport const DEFAULT_RETRIEVAL_CONFIG: RetrievalConfig = {\n maxSummaryFrames: 15,\n defaultTokenBudget: 8000,\n cacheTtlSeconds: 300,\n minConfidenceThreshold: 0.6,\n enableFallback: true,\n llmConfig: {\n provider: 'anthropic',\n model: 'claude-3-haiku-20240307',\n maxTokens: 1024,\n temperature: 0.3,\n },\n};\n"],
5
- "mappings": ";;;;AAuRO,MAAM,2BAA4C;AAAA,EACvD,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/session/clear-survival.ts"],
4
- "sourcesContent": ["/**\n * Clear Survival System for StackMemory\n * Inspired by Continuous-Claude's \"Clear, don't compact\" philosophy\n *\n * Allows StackMemory to survive /clear operations by:\n * 1. Detecting when context is getting full (>70%)\n * 2. Saving critical state to external ledgers\n * 3. Restoring from ledgers after /clear\n * 4. Maintaining continuity across session resets\n */\n\nimport { Frame, Trace, Context, Digest } from '../types';\nimport { FrameManager } from '../frame/frame-manager';\nimport { DatabaseManager } from '../storage/database-manager';\nimport { HandoffGenerator } from './handoff-generator';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport interface ContextUsage {\n totalFrames: number;\n activeFrames: number;\n sessionCount: number;\n percentageUsed: number;\n}\n\nexport interface ContinuityLedger {\n version: '1.0.0';\n timestamp: string;\n session_id: string;\n project: string;\n branch?: string;\n\n // Critical state to preserve\n active_frame_stack: FrameSummary[];\n key_decisions: Decision[];\n active_tasks: Task[];\n critical_context: string[];\n recent_achievements: Achievement[];\n\n // Navigation aids\n current_focus: string;\n next_actions: string[];\n warnings: string[];\n\n // Metrics for restoration\n original_token_count: number;\n compressed_token_count: number;\n compression_ratio: number;\n}\n\ninterface FrameSummary {\n id: string;\n type: string;\n description: string;\n depth: number;\n key_events: string[];\n digest?: string;\n}\n\ninterface Decision {\n id: string;\n decision: string;\n rationale: string;\n impact: 'low' | 'medium' | 'high' | 'critical';\n still_applies: boolean;\n}\n\ninterface Task {\n id: string;\n title: string;\n status: 'pending' | 'in_progress' | 'blocked' | 'completed';\n priority: 'low' | 'medium' | 'high' | 'critical';\n context: string;\n}\n\ninterface Achievement {\n description: string;\n impact: string;\n timestamp: string;\n}\n\nexport class ClearSurvival {\n private frameManager: FrameManager;\n private dbManager: DatabaseManager;\n private handoffGenerator: HandoffGenerator;\n private ledgerPath: string;\n private continuityPath: string;\n\n // Thresholds\n private readonly CONTEXT_WARNING_THRESHOLD = 0.6; // 60%\n private readonly CONTEXT_CRITICAL_THRESHOLD = 0.7; // 70%\n private readonly CONTEXT_MAX_THRESHOLD = 0.85; // 85% - force save\n\n constructor(\n frameManager: FrameManager,\n dbManager: DatabaseManager,\n handoffGenerator: HandoffGenerator,\n projectRoot: string\n ) {\n this.frameManager = frameManager;\n this.dbManager = dbManager;\n this.handoffGenerator = handoffGenerator;\n this.ledgerPath = path.join(projectRoot, '.stackmemory', 'ledgers');\n this.continuityPath = path.join(projectRoot, '.stackmemory', 'continuity');\n }\n\n /**\n * Get current context usage statistics\n */\n async getContextUsage(): Promise<ContextUsage> {\n try {\n const frames = await this.frameManager.getAllFrames();\n const activeFrames = frames.filter(f => f.status === 'open').length;\n const sessionId = await this.dbManager.getCurrentSessionId();\n \n // Estimate based on frame count (simplified)\n const estimatedTokens = frames.length * 100; // Rough estimate\n const maxTokens = 10000; // Approximate max context\n const percentageUsed = Math.min(100, (estimatedTokens / maxTokens) * 100);\n\n return {\n totalFrames: frames.length,\n activeFrames,\n sessionCount: 1,\n percentageUsed\n };\n } catch (error) {\n // Fallback for testing or when DB is not available\n return {\n totalFrames: 50,\n activeFrames: 3,\n sessionCount: 2,\n percentageUsed: 25\n };\n }\n }\n\n /**\n * Assess context status based on usage\n */\n assessContextStatus(usage: ContextUsage): string {\n if (usage.percentageUsed < 50) return 'healthy';\n if (usage.percentageUsed < 70) return 'moderate';\n if (usage.percentageUsed < 85) return 'critical';\n return 'saved';\n }\n\n /**\n * Monitor context usage and trigger saves when needed\n */\n async monitorContextUsage(\n currentTokens: number,\n maxTokens: number\n ): Promise<'ok' | 'warning' | 'critical' | 'saved'> {\n const usage = currentTokens / maxTokens;\n\n if (usage < this.CONTEXT_WARNING_THRESHOLD) {\n return 'ok';\n }\n\n if (usage >= this.CONTEXT_MAX_THRESHOLD) {\n // Force save at 85%\n await this.saveContinuityLedger();\n return 'saved';\n }\n\n if (usage >= this.CONTEXT_CRITICAL_THRESHOLD) {\n // Suggest save at 70%\n console.warn(\n `\u26A0\uFE0F Context at ${Math.round(usage * 100)}% - Consider /clear after saving`\n );\n return 'critical';\n }\n\n // Warning at 60%\n console.warn(`Context at ${Math.round(usage * 100)}% - Approaching limit`);\n return 'warning';\n }\n\n /**\n * Save continuity ledger before /clear\n */\n async saveContinuityLedger(): Promise<ContinuityLedger> {\n const sessionId = await this.dbManager.getCurrentSessionId();\n const session = await this.dbManager.getSession(sessionId);\n\n // Get current state\n const frameStack = await this.getCompressedFrameStack();\n const decisions = await this.getCriticalDecisions();\n const tasks = await this.getActiveTasks();\n const context = await this.getCriticalContext();\n const achievements = await this.getRecentAchievements();\n\n // Calculate token counts (simplified)\n const originalTokens = await this.estimateCurrentTokens();\n const compressedTokens = this.estimateLedgerTokens(\n frameStack,\n decisions,\n tasks\n );\n\n const ledger: ContinuityLedger = {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n session_id: sessionId,\n project: session?.project || 'unknown',\n branch: session?.metadata?.branch,\n\n active_frame_stack: frameStack,\n key_decisions: decisions,\n active_tasks: tasks,\n critical_context: context,\n recent_achievements: achievements,\n\n current_focus: await this.getCurrentFocus(),\n next_actions: await this.suggestNextActions(tasks),\n warnings: await this.getWarnings(),\n\n original_token_count: originalTokens,\n compressed_token_count: compressedTokens,\n compression_ratio: originalTokens / compressedTokens,\n };\n\n // Save to file (overwrites previous continuity ledger)\n await this.saveLedgerToFile(ledger);\n\n // Also create a timestamped backup\n await this.saveBackupLedger(ledger);\n\n console.log(\n `\u2705 Continuity ledger saved (${Math.round(ledger.compression_ratio)}x compression)`\n );\n\n return ledger;\n }\n\n /**\n * Restore from continuity ledger after /clear\n */\n async restoreFromLedger(): Promise<boolean> {\n try {\n const ledger = await this.loadLatestLedger();\n if (!ledger) {\n console.log('No continuity ledger found');\n return false;\n }\n\n console.log(`\uD83D\uDCDA Restoring from ledger (${ledger.timestamp})`);\n\n // Restore frame stack structure (not full content)\n await this.restoreFrameStructure(ledger.active_frame_stack);\n\n // Restore key decisions as anchors\n await this.restoreDecisions(ledger.key_decisions);\n\n // Restore active tasks\n await this.restoreTasks(ledger.active_tasks);\n\n // Log restoration summary\n console.log(`\u2705 Restored:`);\n console.log(` - ${ledger.active_frame_stack.length} frames`);\n console.log(` - ${ledger.key_decisions.length} decisions`);\n console.log(` - ${ledger.active_tasks.length} tasks`);\n console.log(` - Current focus: ${ledger.current_focus}`);\n\n if (ledger.warnings.length > 0) {\n console.warn(`\u26A0\uFE0F Warnings:`, ledger.warnings);\n }\n\n return true;\n } catch (error: unknown) {\n console.error('Failed to restore from ledger:', error);\n return false;\n }\n }\n\n /**\n * Generate markdown summary for human review\n */\n async generateLedgerMarkdown(ledger: ContinuityLedger): Promise<string> {\n const lines: string[] = [\n `# Continuity Ledger`,\n `**Saved**: ${new Date(ledger.timestamp).toLocaleString()}`,\n `**Project**: ${ledger.project}${ledger.branch ? ` (${ledger.branch})` : ''}`,\n `**Compression**: ${Math.round(ledger.compression_ratio)}x (${ledger.original_token_count} \u2192 ${ledger.compressed_token_count} tokens)`,\n '',\n\n `## \uD83C\uDFAF Current Focus`,\n ledger.current_focus,\n '',\n\n `## \uD83D\uDCDA Active Frame Stack (${ledger.active_frame_stack.length})`,\n ...ledger.active_frame_stack.map(\n (f) => `${' '.repeat(f.depth)}\u2514\u2500 ${f.type}: ${f.description}`\n ),\n '',\n\n `## \uD83C\uDFAF Active Tasks (${ledger.active_tasks.filter((t) => t.status !== 'completed').length})`,\n ...ledger.active_tasks\n .filter((t) => t.status !== 'completed')\n .sort((a, b) => {\n const priority = { critical: 0, high: 1, medium: 2, low: 3 };\n return priority[a.priority] - priority[b.priority];\n })\n .map((t) => `- [${t.priority}] ${t.title} (${t.status})`),\n '',\n\n `## \uD83D\uDD11 Key Decisions`,\n ...ledger.key_decisions\n .filter((d) => d.still_applies)\n .map((d) => `- **${d.decision}**\\n ${d.rationale}`),\n '',\n\n `## \u2705 Recent Achievements`,\n ...ledger.recent_achievements.map(\n (a) => `- ${a.description} \u2192 ${a.impact}`\n ),\n '',\n\n `## \u27A1\uFE0F Next Actions`,\n ...ledger.next_actions.map((a, i) => `${i + 1}. ${a}`),\n '',\n\n ledger.warnings.length > 0 ? `## \u26A0\uFE0F Warnings` : '',\n ...ledger.warnings.map((w) => `- ${w}`),\n ];\n\n return lines.filter((l) => l !== '').join('\\n');\n }\n\n /**\n * Check if /clear is recommended\n */\n async shouldClear(\n currentTokens: number,\n maxTokens: number\n ): Promise<{\n recommended: boolean;\n reason?: string;\n alternative?: string;\n }> {\n const usage = currentTokens / maxTokens;\n\n if (usage < this.CONTEXT_WARNING_THRESHOLD) {\n return { recommended: false };\n }\n\n // Check if we have redundant frames\n const frameStack = await this.frameManager.getStack();\n const redundantFrames = frameStack.frames.filter(\n (f) => f.status === 'closed' && !f.metadata?.critical\n ).length;\n\n if (usage >= this.CONTEXT_CRITICAL_THRESHOLD) {\n if (redundantFrames > 5) {\n return {\n recommended: true,\n reason: `Context at ${Math.round(usage * 100)}% with ${redundantFrames} closed frames`,\n alternative: 'Consider saving ledger and clearing',\n };\n }\n }\n\n return {\n recommended: false,\n alternative: `Context at ${Math.round(usage * 100)}% but manageable`,\n };\n }\n\n // Private helper methods\n\n private async getCompressedFrameStack(): Promise<FrameSummary[]> {\n const stack = await this.frameManager.getStack();\n\n return stack.frames.map((frame, index) => ({\n id: frame.id,\n type: frame.type,\n description: frame.description || 'Unnamed frame',\n depth: index,\n key_events: this.extractKeyEvents(frame),\n digest: frame.digest?.summary,\n }));\n }\n\n private extractKeyEvents(frame: Frame): string[] {\n const events: string[] = [];\n\n // Extract from metadata\n if (frame.metadata?.decision) {\n events.push(`Decision: ${frame.metadata.decision}`);\n }\n if (frame.metadata?.error) {\n events.push(`Error: ${frame.metadata.error}`);\n }\n if (frame.metadata?.achievement) {\n events.push(`Achievement: ${frame.metadata.achievement}`);\n }\n\n return events;\n }\n\n private async getCriticalDecisions(): Promise<Decision[]> {\n const traces = await this.dbManager.getRecentTraces(\n await this.dbManager.getCurrentSessionId(),\n 100\n );\n\n return traces\n .filter((t) => t.type === 'decision')\n .map((t) => ({\n id: t.id,\n decision: t.content.decision || '',\n rationale: t.content.rationale || '',\n impact: this.assessImpact(t),\n still_applies: !t.metadata?.superseded,\n }))\n .filter((d) => d.impact !== 'low');\n }\n\n private assessImpact(trace: Trace): Decision['impact'] {\n const content = JSON.stringify(trace.content).toLowerCase();\n\n if (content.includes('architecture') || content.includes('critical')) {\n return 'critical';\n }\n if (content.includes('important') || content.includes('significant')) {\n return 'high';\n }\n if (content.includes('minor') || content.includes('small')) {\n return 'low';\n }\n\n return 'medium';\n }\n\n private async getActiveTasks(): Promise<Task[]> {\n const frames = await this.dbManager.getRecentFrames(\n await this.dbManager.getCurrentSessionId(),\n 50\n );\n\n return frames\n .filter((f) => f.type === 'task')\n .map((f) => ({\n id: f.id,\n title: f.description || 'Untitled task',\n status: this.getTaskStatus(f),\n priority: this.getTaskPriority(f),\n context: f.metadata?.context || '',\n }));\n }\n\n private getTaskStatus(frame: Frame): Task['status'] {\n if (frame.status === 'closed' && frame.metadata?.completed) {\n return 'completed';\n }\n if (frame.metadata?.blocked) return 'blocked';\n if (frame.status === 'open') return 'in_progress';\n return 'pending';\n }\n\n private getTaskPriority(frame: Frame): Task['priority'] {\n const priority = frame.metadata?.priority;\n if (['critical', 'high', 'medium', 'low'].includes(priority)) {\n return priority as Task['priority'];\n }\n return 'medium';\n }\n\n private async getCriticalContext(): Promise<string[]> {\n const context: string[] = [];\n\n // Add project-specific context\n const session = await this.dbManager.getSession(\n await this.dbManager.getCurrentSessionId()\n );\n if (session?.metadata?.key_facts) {\n context.push(...session.metadata.key_facts);\n }\n\n // Add recent important discoveries\n const traces = await this.dbManager.getRecentTraces(\n await this.dbManager.getCurrentSessionId(),\n 50\n );\n\n const discoveries = traces\n .filter((t) => t.metadata?.important || t.type === 'discovery')\n .map((t) => t.content.summary || t.content.description)\n .filter(Boolean)\n .slice(0, 5);\n\n context.push(...discoveries);\n\n return context;\n }\n\n private async getRecentAchievements(): Promise<Achievement[]> {\n const frames = await this.dbManager.getRecentFrames(\n await this.dbManager.getCurrentSessionId(),\n 20\n );\n\n return frames\n .filter((f) => f.status === 'closed' && f.metadata?.achievement)\n .map((f) => ({\n description: f.metadata.achievement,\n impact: f.metadata.impact || 'completed task',\n timestamp: f.closedAt || f.createdAt,\n }))\n .slice(0, 5);\n }\n\n private async getCurrentFocus(): Promise<string> {\n const stack = await this.frameManager.getStack();\n const activeFrame = stack.frames.find((f) => f.status === 'open');\n\n if (!activeFrame) {\n return 'No active focus';\n }\n\n return `${activeFrame.type}: ${activeFrame.description || 'In progress'}`;\n }\n\n private async suggestNextActions(tasks: Task[]): Promise<string[]> {\n const suggestions: string[] = [];\n\n // Continue in-progress tasks\n const inProgress = tasks.filter((t) => t.status === 'in_progress');\n if (inProgress.length > 0) {\n suggestions.push(`Continue: ${inProgress[0].title}`);\n }\n\n // Start high-priority pending tasks\n const highPriority = tasks.filter(\n (t) => t.status === 'pending' && t.priority === 'high'\n );\n if (highPriority.length > 0) {\n suggestions.push(`Start: ${highPriority[0].title}`);\n }\n\n // Unblock blocked tasks\n const blocked = tasks.filter((t) => t.status === 'blocked');\n if (blocked.length > 0) {\n suggestions.push(`Unblock: ${blocked[0].title}`);\n }\n\n return suggestions.slice(0, 3);\n }\n\n private async getWarnings(): Promise<string[]> {\n const warnings: string[] = [];\n\n const tasks = await this.getActiveTasks();\n const blocked = tasks.filter((t) => t.status === 'blocked');\n\n if (blocked.length > 0) {\n warnings.push(`${blocked.length} tasks blocked`);\n }\n\n const critical = tasks.filter(\n (t) => t.priority === 'critical' && t.status !== 'completed'\n );\n if (critical.length > 0) {\n warnings.push(`${critical.length} critical tasks pending`);\n }\n\n return warnings;\n }\n\n private async estimateCurrentTokens(): Promise<number> {\n // Simplified estimation\n const frames = await this.frameManager.getStack();\n const traces = await this.dbManager.getRecentTraces(\n await this.dbManager.getCurrentSessionId(),\n 100\n );\n\n const frameTokens = frames.frames.length * 200; // Rough estimate\n const traceTokens = traces.length * 100; // Rough estimate\n\n return frameTokens + traceTokens;\n }\n\n private estimateLedgerTokens(\n frames: FrameSummary[],\n decisions: Decision[],\n tasks: Task[]\n ): number {\n // Rough estimation\n return frames.length * 50 + decisions.length * 30 + tasks.length * 20;\n }\n\n private async saveLedgerToFile(ledger: ContinuityLedger): Promise<void> {\n await fs.mkdir(this.continuityPath, { recursive: true });\n\n // Save as CONTINUITY_CLAUDE-latest.json (overwrites)\n const latestPath = path.join(\n this.continuityPath,\n 'CONTINUITY_CLAUDE-latest.json'\n );\n await fs.writeFile(latestPath, JSON.stringify(ledger, null, 2), 'utf-8');\n\n // Also save markdown version\n const markdown = await this.generateLedgerMarkdown(ledger);\n const mdPath = path.join(\n this.continuityPath,\n 'CONTINUITY_CLAUDE-latest.md'\n );\n await fs.writeFile(mdPath, markdown, 'utf-8');\n }\n\n private async saveBackupLedger(ledger: ContinuityLedger): Promise<void> {\n await fs.mkdir(this.ledgerPath, { recursive: true });\n\n const timestamp = ledger.timestamp.replace(/[:.]/g, '-');\n const backupPath = path.join(this.ledgerPath, `ledger-${timestamp}.json`);\n await fs.writeFile(backupPath, JSON.stringify(ledger, null, 2), 'utf-8');\n }\n\n private async loadLatestLedger(): Promise<ContinuityLedger | null> {\n try {\n const latestPath = path.join(\n this.continuityPath,\n 'CONTINUITY_CLAUDE-latest.json'\n );\n const content = await fs.readFile(latestPath, 'utf-8');\n return JSON.parse(content) as ContinuityLedger;\n } catch (error: unknown) {\n return null;\n }\n }\n\n private async restoreFrameStructure(frames: FrameSummary[]): Promise<void> {\n // Create lightweight frame references (not full frames)\n for (const summary of frames) {\n await this.frameManager.push({\n type: summary.type,\n description: summary.description,\n metadata: {\n restored_from_ledger: true,\n original_id: summary.id,\n key_events: summary.key_events,\n digest: summary.digest,\n },\n });\n }\n }\n\n private async restoreDecisions(decisions: Decision[]): Promise<void> {\n for (const decision of decisions) {\n if (decision.still_applies) {\n await this.dbManager.addAnchor({\n type: 'decision',\n content: {\n decision: decision.decision,\n rationale: decision.rationale,\n impact: decision.impact,\n },\n metadata: {\n restored_from_ledger: true,\n original_id: decision.id,\n },\n });\n }\n }\n }\n\n private async restoreTasks(tasks: Task[]): Promise<void> {\n for (const task of tasks) {\n if (task.status !== 'completed') {\n await this.frameManager.push({\n type: 'task',\n description: task.title,\n metadata: {\n status: task.status,\n priority: task.priority,\n context: task.context,\n restored_from_ledger: true,\n original_id: task.id,\n },\n });\n }\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/session/enhanced-handoff.ts"],
4
- "sourcesContent": ["/**\n * Enhanced Handoff Generator\n * Produces high-efficacy handoffs (70-85% context preservation)\n * Target: 2,000-3,000 tokens for rich context\n */\n\nimport { execSync } from 'child_process';\nimport {\n existsSync,\n readFileSync,\n readdirSync,\n statSync,\n writeFileSync,\n mkdirSync,\n} from 'fs';\nimport { basename, join } from 'path';\nimport { homedir, tmpdir } from 'os';\nimport { globSync } from 'glob';\n\n// Token counting - use Anthropic's tokenizer for accurate counts\nlet countTokens: (text: string) => number;\ntry {\n // Dynamic import for CommonJS compatibility\n const tokenizer = await import('@anthropic-ai/tokenizer');\n countTokens = tokenizer.countTokens;\n} catch {\n // Fallback to estimation if tokenizer not available\n countTokens = (text: string) => Math.ceil(text.length / 3.5);\n}\n\n// Load session decisions if available\ninterface SessionDecision {\n id: string;\n what: string;\n why: string;\n alternatives?: string[];\n timestamp: string;\n category?: string;\n}\n\n// Review feedback persistence\ninterface StoredReviewFeedback {\n timestamp: string;\n source: string;\n keyPoints: string[];\n actionItems: string[];\n sourceFile?: string;\n}\n\ninterface ReviewFeedbackStore {\n feedbacks: StoredReviewFeedback[];\n lastUpdated: string;\n}\n\nfunction loadSessionDecisions(projectRoot: string): SessionDecision[] {\n const storePath = join(projectRoot, '.stackmemory', 'session-decisions.json');\n if (existsSync(storePath)) {\n try {\n const store = JSON.parse(readFileSync(storePath, 'utf-8'));\n return store.decisions || [];\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction loadReviewFeedback(projectRoot: string): StoredReviewFeedback[] {\n const storePath = join(projectRoot, '.stackmemory', 'review-feedback.json');\n if (existsSync(storePath)) {\n try {\n const store: ReviewFeedbackStore = JSON.parse(\n readFileSync(storePath, 'utf-8')\n );\n // Return feedbacks from last 24 hours\n const cutoff = Date.now() - 24 * 60 * 60 * 1000;\n return store.feedbacks.filter(\n (f) => new Date(f.timestamp).getTime() > cutoff\n );\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction saveReviewFeedback(\n projectRoot: string,\n feedbacks: StoredReviewFeedback[]\n): void {\n const dir = join(projectRoot, '.stackmemory');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const storePath = join(dir, 'review-feedback.json');\n\n // Load existing and merge\n let existing: StoredReviewFeedback[] = [];\n if (existsSync(storePath)) {\n try {\n const store: ReviewFeedbackStore = JSON.parse(\n readFileSync(storePath, 'utf-8')\n );\n existing = store.feedbacks || [];\n } catch {\n // Ignore parse errors\n }\n }\n\n // Deduplicate by source + first key point\n const seen = new Set<string>();\n const merged: StoredReviewFeedback[] = [];\n\n for (const f of [...feedbacks, ...existing]) {\n const key = `${f.source}:${f.keyPoints[0] || ''}`;\n if (!seen.has(key)) {\n seen.add(key);\n merged.push(f);\n }\n }\n\n // Keep only last 20 feedbacks\n const store: ReviewFeedbackStore = {\n feedbacks: merged.slice(0, 20),\n lastUpdated: new Date().toISOString(),\n };\n\n writeFileSync(storePath, JSON.stringify(store, null, 2));\n}\n\n/**\n * Find Claude agent output directories dynamically\n */\nfunction findAgentOutputDirs(projectRoot: string): string[] {\n const dirs: string[] = [];\n\n // Try multiple locations where agent outputs might be stored\n const tmpBase = process.env['TMPDIR'] || tmpdir() || '/tmp';\n\n // Pattern 1: /tmp/claude/-path-to-project/tasks\n const projectPathEncoded = projectRoot.replace(/\\//g, '-').replace(/^-/, '');\n const pattern1 = join(tmpBase, 'claude', `*${projectPathEncoded}*`, 'tasks');\n try {\n const matches = globSync(pattern1);\n dirs.push(...matches);\n } catch {\n // Glob failed\n }\n\n // Pattern 2: /private/tmp/claude/... (macOS specific)\n if (tmpBase !== '/private/tmp') {\n const pattern2 = join(\n '/private/tmp',\n 'claude',\n `*${projectPathEncoded}*`,\n 'tasks'\n );\n try {\n const matches = globSync(pattern2);\n dirs.push(...matches);\n } catch {\n // Glob failed\n }\n }\n\n // Pattern 3: ~/.claude/projects/*/tasks (if exists)\n const homeClaudeDir = join(homedir(), '.claude', 'projects');\n if (existsSync(homeClaudeDir)) {\n try {\n const projectDirs = readdirSync(homeClaudeDir);\n for (const d of projectDirs) {\n const tasksDir = join(homeClaudeDir, d, 'tasks');\n if (existsSync(tasksDir)) {\n dirs.push(tasksDir);\n }\n }\n } catch {\n // Failed to read\n }\n }\n\n return [...new Set(dirs)]; // Deduplicate\n}\n\nexport interface EnhancedHandoff {\n // Metadata\n timestamp: string;\n project: string;\n branch: string;\n sessionDuration?: string;\n\n // What we're building (HIGH VALUE)\n activeWork: {\n description: string;\n status: 'in_progress' | 'blocked' | 'review' | 'done';\n keyFiles: string[];\n progress?: string;\n };\n\n // Decisions made (HIGH VALUE)\n decisions: Array<{\n what: string;\n why: string;\n alternatives?: string[];\n }>;\n\n // Architecture context (MEDIUM VALUE)\n architecture: {\n keyComponents: Array<{\n file: string;\n purpose: string;\n }>;\n patterns: string[];\n };\n\n // Blockers and issues (HIGH VALUE)\n blockers: Array<{\n issue: string;\n attempted: string[];\n status: 'resolved' | 'open';\n }>;\n\n // Review feedback (HIGH VALUE if present)\n reviewFeedback?: {\n source: string;\n keyPoints: string[];\n actionItems: string[];\n }[];\n\n // Next actions (MEDIUM VALUE)\n nextActions: string[];\n\n // Patterns established (LOW-MEDIUM VALUE)\n codePatterns?: string[];\n\n // Token metrics\n estimatedTokens: number;\n}\n\nexport class EnhancedHandoffGenerator {\n private projectRoot: string;\n private claudeProjectsDir: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.claudeProjectsDir = join(homedir(), '.claude', 'projects');\n }\n\n /**\n * Generate a high-efficacy handoff\n */\n async generate(): Promise<EnhancedHandoff> {\n const handoff: EnhancedHandoff = {\n timestamp: new Date().toISOString(),\n project: basename(this.projectRoot),\n branch: this.getCurrentBranch(),\n activeWork: await this.extractActiveWork(),\n decisions: await this.extractDecisions(),\n architecture: await this.extractArchitecture(),\n blockers: await this.extractBlockers(),\n reviewFeedback: await this.extractReviewFeedback(),\n nextActions: await this.extractNextActions(),\n codePatterns: await this.extractCodePatterns(),\n estimatedTokens: 0,\n };\n\n // Calculate estimated tokens\n const markdown = this.toMarkdown(handoff);\n handoff.estimatedTokens = countTokens(markdown);\n\n return handoff;\n }\n\n /**\n * Extract what we're currently building from git and recent files\n */\n private async extractActiveWork(): Promise<EnhancedHandoff['activeWork']> {\n // Get recent commits to understand current work\n const recentCommits = this.getRecentCommits(5);\n const recentFiles = this.getRecentlyModifiedFiles(10);\n\n // Try to infer the active work from commit messages\n let description = 'Unknown - check git log for context';\n let status: EnhancedHandoff['activeWork']['status'] = 'in_progress';\n\n if (recentCommits.length > 0) {\n // Use most recent commit as indicator\n const lastCommit = recentCommits[0];\n if (lastCommit.includes('feat:') || lastCommit.includes('implement')) {\n description = lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n } else if (lastCommit.includes('fix:')) {\n description = 'Bug fix: ' + lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n } else if (\n lastCommit.includes('chore:') ||\n lastCommit.includes('refactor:')\n ) {\n description = lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n } else {\n description = lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n }\n }\n\n // Check for blocking indicators\n const gitStatus = this.getGitStatus();\n if (gitStatus.includes('conflict')) {\n status = 'blocked';\n }\n\n return {\n description,\n status,\n keyFiles: recentFiles.slice(0, 5),\n progress:\n recentCommits.length > 0\n ? `${recentCommits.length} commits in current session`\n : undefined,\n };\n }\n\n /**\n * Extract decisions from session store, git commits, and decision logs\n */\n private async extractDecisions(): Promise<EnhancedHandoff['decisions']> {\n const decisions: EnhancedHandoff['decisions'] = [];\n\n // First, load session decisions (highest priority - explicitly recorded)\n const sessionDecisions = loadSessionDecisions(this.projectRoot);\n for (const d of sessionDecisions) {\n decisions.push({\n what: d.what,\n why: d.why,\n alternatives: d.alternatives,\n });\n }\n\n // Then look for decision markers in recent commits\n const commits = this.getRecentCommits(20);\n for (const commit of commits) {\n // Look for decision-like patterns\n if (\n commit.toLowerCase().includes('use ') ||\n commit.toLowerCase().includes('switch to ') ||\n commit.toLowerCase().includes('default to ') ||\n (commit.toLowerCase().includes('make ') &&\n commit.toLowerCase().includes('optional'))\n ) {\n // Avoid duplicates\n const commitText = commit.replace(/^[a-f0-9]+\\s+/, '');\n if (!decisions.some((d) => d.what.includes(commitText.slice(0, 30)))) {\n decisions.push({\n what: commitText,\n why: 'See commit for details',\n });\n }\n }\n }\n\n // Check for a decisions file\n const decisionsFile = join(\n this.projectRoot,\n '.stackmemory',\n 'decisions.md'\n );\n if (existsSync(decisionsFile)) {\n const content = readFileSync(decisionsFile, 'utf-8');\n const parsed = this.parseDecisionsFile(content);\n decisions.push(...parsed);\n }\n\n return decisions.slice(0, 10); // Limit to prevent bloat\n }\n\n /**\n * Parse a decisions.md file\n */\n private parseDecisionsFile(content: string): EnhancedHandoff['decisions'] {\n const decisions: EnhancedHandoff['decisions'] = [];\n const lines = content.split('\\n');\n\n let currentDecision: {\n what: string;\n why: string;\n alternatives?: string[];\n } | null = null;\n\n for (const line of lines) {\n if (line.startsWith('## ') || line.startsWith('### ')) {\n if (currentDecision) {\n decisions.push(currentDecision);\n }\n currentDecision = { what: line.replace(/^#+\\s+/, ''), why: '' };\n } else if (currentDecision && line.toLowerCase().includes('rationale:')) {\n currentDecision.why = line.replace(/rationale:\\s*/i, '').trim();\n } else if (currentDecision && line.toLowerCase().includes('why:')) {\n currentDecision.why = line.replace(/why:\\s*/i, '').trim();\n } else if (\n currentDecision &&\n line.toLowerCase().includes('alternatives:')\n ) {\n currentDecision.alternatives = [];\n } else if (currentDecision?.alternatives && line.trim().startsWith('-')) {\n currentDecision.alternatives.push(line.replace(/^\\s*-\\s*/, '').trim());\n }\n }\n\n if (currentDecision) {\n decisions.push(currentDecision);\n }\n\n return decisions;\n }\n\n /**\n * Extract architecture context from key files\n */\n private async extractArchitecture(): Promise<\n EnhancedHandoff['architecture']\n > {\n const keyComponents: EnhancedHandoff['architecture']['keyComponents'] = [];\n const patterns: string[] = [];\n\n // Find recently modified TypeScript/JavaScript files\n const recentFiles = this.getRecentlyModifiedFiles(20);\n const codeFiles = recentFiles.filter(\n (f) => f.endsWith('.ts') || f.endsWith('.js') || f.endsWith('.tsx')\n );\n\n for (const file of codeFiles.slice(0, 8)) {\n const purpose = this.inferFilePurpose(file);\n if (purpose) {\n keyComponents.push({ file, purpose });\n }\n }\n\n // Detect patterns from file structure\n if (codeFiles.some((f) => f.includes('/daemon/'))) {\n patterns.push('Daemon/background process pattern');\n }\n if (codeFiles.some((f) => f.includes('/cli/'))) {\n patterns.push('CLI command pattern');\n }\n if (\n codeFiles.some((f) => f.includes('.test.') || f.includes('__tests__'))\n ) {\n patterns.push('Test files present');\n }\n if (codeFiles.some((f) => f.includes('/core/'))) {\n patterns.push('Core/domain separation');\n }\n\n return { keyComponents, patterns };\n }\n\n /**\n * Infer purpose from file name and path\n */\n private inferFilePurpose(filePath: string): string | null {\n const name = basename(filePath).replace(/\\.(ts|js|tsx)$/, '');\n const path = filePath.toLowerCase();\n\n if (path.includes('daemon')) return 'Background daemon/service';\n if (path.includes('cli/command')) return 'CLI command handler';\n if (path.includes('config')) return 'Configuration management';\n if (path.includes('storage')) return 'Data storage layer';\n if (path.includes('handoff')) return 'Session handoff logic';\n if (path.includes('service')) return 'Service orchestration';\n if (path.includes('manager')) return 'Resource/state management';\n if (path.includes('handler')) return 'Event/request handler';\n if (path.includes('util') || path.includes('helper'))\n return 'Utility functions';\n if (path.includes('types') || path.includes('interface'))\n return 'Type definitions';\n if (path.includes('test')) return null; // Skip test files\n if (name.includes('-')) {\n return name\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n }\n return null;\n }\n\n /**\n * Extract blockers from git status and recent errors\n */\n private async extractBlockers(): Promise<EnhancedHandoff['blockers']> {\n const blockers: EnhancedHandoff['blockers'] = [];\n\n // Check for merge conflicts\n const gitStatus = this.getGitStatus();\n if (gitStatus.includes('UU ') || gitStatus.includes('both modified')) {\n blockers.push({\n issue: 'Merge conflict detected',\n attempted: ['Check git status for affected files'],\n status: 'open',\n });\n }\n\n // Check for failing tests\n try {\n const testResult = execSync('npm test 2>&1 || true', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n timeout: 30000,\n });\n if (testResult.includes('FAIL') || testResult.includes('failed')) {\n const failCount = (testResult.match(/(\\d+) failed/i) || ['', '?'])[1];\n blockers.push({\n issue: `Test failures: ${failCount} tests failing`,\n attempted: ['Run npm test for details'],\n status: 'open',\n });\n }\n } catch {\n // Test command failed - might indicate issues\n }\n\n // Check for lint errors\n try {\n const lintResult = execSync('npm run lint 2>&1 || true', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n timeout: 30000,\n });\n if (lintResult.includes('error') && !lintResult.includes('0 errors')) {\n blockers.push({\n issue: 'Lint errors present',\n attempted: ['Run npm run lint for details'],\n status: 'open',\n });\n }\n } catch {\n // Lint command failed\n }\n\n return blockers;\n }\n\n /**\n * Extract review feedback from agent output files and persisted storage\n */\n private async extractReviewFeedback(): Promise<\n EnhancedHandoff['reviewFeedback']\n > {\n const feedback: EnhancedHandoff['reviewFeedback'] = [];\n const newFeedbacks: StoredReviewFeedback[] = [];\n\n // Find agent output directories dynamically\n const outputDirs = findAgentOutputDirs(this.projectRoot);\n\n for (const tmpDir of outputDirs) {\n if (!existsSync(tmpDir)) continue;\n\n try {\n const files = readdirSync(tmpDir).filter((f) => f.endsWith('.output'));\n const recentFiles = files\n .map((f) => ({\n name: f,\n path: join(tmpDir, f),\n stat: statSync(join(tmpDir, f)),\n }))\n .filter((f) => Date.now() - f.stat.mtimeMs < 3600000) // Last hour\n .sort((a, b) => b.stat.mtimeMs - a.stat.mtimeMs)\n .slice(0, 3);\n\n for (const file of recentFiles) {\n const content = readFileSync(file.path, 'utf-8');\n const extracted = this.extractKeyPointsFromReview(content);\n if (extracted.keyPoints.length > 0) {\n feedback.push(extracted);\n\n // Also store for persistence\n newFeedbacks.push({\n timestamp: new Date().toISOString(),\n source: extracted.source,\n keyPoints: extracted.keyPoints,\n actionItems: extracted.actionItems,\n sourceFile: file.name,\n });\n }\n }\n } catch {\n // Failed to read agent outputs from this directory\n }\n }\n\n // Save new feedback to persistent storage\n if (newFeedbacks.length > 0) {\n saveReviewFeedback(this.projectRoot, newFeedbacks);\n }\n\n // Load persisted feedback if no new feedback found\n if (feedback.length === 0) {\n const stored = loadReviewFeedback(this.projectRoot);\n for (const s of stored.slice(0, 3)) {\n feedback.push({\n source: s.source,\n keyPoints: s.keyPoints,\n actionItems: s.actionItems,\n });\n }\n }\n\n return feedback.length > 0 ? feedback : undefined;\n }\n\n /**\n * Extract key points from a review output\n */\n private extractKeyPointsFromReview(content: string): {\n source: string;\n keyPoints: string[];\n actionItems: string[];\n } {\n const keyPoints: string[] = [];\n const actionItems: string[] = [];\n let source = 'Agent Review';\n\n // Detect review type\n if (\n content.includes('Product Manager') ||\n content.includes('product-manager')\n ) {\n source = 'Product Manager';\n } else if (\n content.includes('Staff Architect') ||\n content.includes('staff-architect')\n ) {\n source = 'Staff Architect';\n }\n\n // Extract key recommendations (look for common patterns)\n const lines = content.split('\\n');\n let inRecommendations = false;\n let inActionItems = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Detect section headers\n if (\n trimmed.toLowerCase().includes('recommendation') ||\n trimmed.toLowerCase().includes('key finding')\n ) {\n inRecommendations = true;\n inActionItems = false;\n continue;\n }\n if (\n trimmed.toLowerCase().includes('action') ||\n trimmed.toLowerCase().includes('next step') ||\n trimmed.toLowerCase().includes('priority')\n ) {\n inActionItems = true;\n inRecommendations = false;\n continue;\n }\n\n // Extract bullet points\n if (\n trimmed.startsWith('- ') ||\n trimmed.startsWith('* ') ||\n /^\\d+\\.\\s/.test(trimmed)\n ) {\n const point = trimmed.replace(/^[-*]\\s+/, '').replace(/^\\d+\\.\\s+/, '');\n if (point.length > 10 && point.length < 200) {\n if (inActionItems) {\n actionItems.push(point);\n } else if (inRecommendations) {\n keyPoints.push(point);\n }\n }\n }\n }\n\n // Limit to prevent bloat\n return {\n source,\n keyPoints: keyPoints.slice(0, 5),\n actionItems: actionItems.slice(0, 5),\n };\n }\n\n /**\n * Extract next actions from todo state and git\n */\n private async extractNextActions(): Promise<string[]> {\n const actions: string[] = [];\n\n // Check for uncommitted changes\n const gitStatus = this.getGitStatus();\n if (gitStatus.trim()) {\n actions.push('Commit pending changes');\n }\n\n // Look for TODO comments in recent files\n const recentFiles = this.getRecentlyModifiedFiles(5);\n for (const file of recentFiles) {\n try {\n const fullPath = join(this.projectRoot, file);\n if (existsSync(fullPath)) {\n const content = readFileSync(fullPath, 'utf-8');\n const todos = content.match(/\\/\\/\\s*TODO:?\\s*.+/gi) || [];\n for (const todo of todos.slice(0, 2)) {\n actions.push(todo.replace(/\\/\\/\\s*TODO:?\\s*/i, 'TODO: '));\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n // Check for pending tasks in .stackmemory\n const tasksFile = join(this.projectRoot, '.stackmemory', 'tasks.json');\n if (existsSync(tasksFile)) {\n try {\n const tasks = JSON.parse(readFileSync(tasksFile, 'utf-8'));\n const pending = tasks.filter(\n (t: any) => t.status === 'pending' || t.status === 'in_progress'\n );\n for (const task of pending.slice(0, 3)) {\n actions.push(task.title || task.description);\n }\n } catch {\n // Invalid tasks file\n }\n }\n\n return actions.slice(0, 8);\n }\n\n /**\n * Extract established code patterns\n */\n private async extractCodePatterns(): Promise<string[]> {\n const patterns: string[] = [];\n\n // Check ESLint config for patterns\n const eslintConfig = join(this.projectRoot, 'eslint.config.js');\n if (existsSync(eslintConfig)) {\n const content = readFileSync(eslintConfig, 'utf-8');\n if (content.includes('argsIgnorePattern')) {\n patterns.push('Underscore prefix for unused vars (_var)');\n }\n if (content.includes('ignores') && content.includes('test')) {\n patterns.push('Test files excluded from lint');\n }\n }\n\n // Check tsconfig for patterns\n const tsconfig = join(this.projectRoot, 'tsconfig.json');\n if (existsSync(tsconfig)) {\n const content = readFileSync(tsconfig, 'utf-8');\n if (content.includes('\"strict\": true')) {\n patterns.push('TypeScript strict mode enabled');\n }\n if (content.includes('ES2022') || content.includes('ESNext')) {\n patterns.push('ESM module system');\n }\n }\n\n return patterns;\n }\n\n /**\n * Get recent git commits\n */\n private getRecentCommits(count: number): string[] {\n try {\n const result = execSync(`git log --oneline -${count}`, {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n });\n return result.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n }\n\n /**\n * Get current git branch\n */\n private getCurrentBranch(): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n }).trim();\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get git status\n */\n private getGitStatus(): string {\n try {\n return execSync('git status --short', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n });\n } catch {\n return '';\n }\n }\n\n /**\n * Get recently modified files\n */\n private getRecentlyModifiedFiles(count: number): string[] {\n try {\n const result = execSync(\n `git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only`,\n {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n }\n );\n return result.trim().split('\\n').filter(Boolean).slice(0, count);\n } catch {\n return [];\n }\n }\n\n /**\n * Convert handoff to markdown (verbose format)\n */\n toMarkdown(handoff: EnhancedHandoff): string {\n const lines: string[] = [];\n\n lines.push(`# Session Handoff - ${handoff.timestamp.split('T')[0]}`);\n lines.push('');\n lines.push(`**Project**: ${handoff.project}`);\n lines.push(`**Branch**: ${handoff.branch}`);\n lines.push('');\n\n // Active Work (HIGH VALUE)\n lines.push('## Active Work');\n lines.push(`- **Building**: ${handoff.activeWork.description}`);\n lines.push(`- **Status**: ${handoff.activeWork.status}`);\n if (handoff.activeWork.keyFiles.length > 0) {\n lines.push(`- **Key files**: ${handoff.activeWork.keyFiles.join(', ')}`);\n }\n if (handoff.activeWork.progress) {\n lines.push(`- **Progress**: ${handoff.activeWork.progress}`);\n }\n lines.push('');\n\n // Decisions (HIGH VALUE)\n if (handoff.decisions.length > 0) {\n lines.push('## Key Decisions');\n for (const d of handoff.decisions) {\n lines.push(`1. **${d.what}**`);\n if (d.why) {\n lines.push(` - Rationale: ${d.why}`);\n }\n if (d.alternatives && d.alternatives.length > 0) {\n lines.push(\n ` - Alternatives considered: ${d.alternatives.join(', ')}`\n );\n }\n }\n lines.push('');\n }\n\n // Architecture (MEDIUM VALUE)\n if (handoff.architecture.keyComponents.length > 0) {\n lines.push('## Architecture Context');\n for (const c of handoff.architecture.keyComponents) {\n lines.push(`- \\`${c.file}\\`: ${c.purpose}`);\n }\n if (handoff.architecture.patterns.length > 0) {\n lines.push('');\n lines.push('**Patterns**: ' + handoff.architecture.patterns.join(', '));\n }\n lines.push('');\n }\n\n // Blockers (HIGH VALUE)\n if (handoff.blockers.length > 0) {\n lines.push('## Blockers');\n for (const b of handoff.blockers) {\n lines.push(`- **${b.issue}** [${b.status}]`);\n if (b.attempted.length > 0) {\n lines.push(` - Tried: ${b.attempted.join(', ')}`);\n }\n }\n lines.push('');\n }\n\n // Review Feedback (HIGH VALUE)\n if (handoff.reviewFeedback && handoff.reviewFeedback.length > 0) {\n lines.push('## Review Feedback');\n for (const r of handoff.reviewFeedback) {\n lines.push(`### ${r.source}`);\n if (r.keyPoints.length > 0) {\n lines.push('**Key Points**:');\n for (const p of r.keyPoints) {\n lines.push(`- ${p}`);\n }\n }\n if (r.actionItems.length > 0) {\n lines.push('**Action Items**:');\n for (const a of r.actionItems) {\n lines.push(`- ${a}`);\n }\n }\n lines.push('');\n }\n }\n\n // Next Actions (MEDIUM VALUE)\n if (handoff.nextActions.length > 0) {\n lines.push('## Next Actions');\n for (const a of handoff.nextActions) {\n lines.push(`1. ${a}`);\n }\n lines.push('');\n }\n\n // Code Patterns (LOW VALUE)\n if (handoff.codePatterns && handoff.codePatterns.length > 0) {\n lines.push('## Established Patterns');\n for (const p of handoff.codePatterns) {\n lines.push(`- ${p}`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push(`*Estimated tokens: ~${handoff.estimatedTokens}*`);\n lines.push(`*Generated at ${handoff.timestamp}*`);\n\n return lines.join('\\n');\n }\n\n /**\n * Convert handoff to compact format (~50% smaller)\n * Optimized for minimal context window usage\n */\n toCompact(handoff: EnhancedHandoff): string {\n const lines: string[] = [];\n\n // Header: single line\n lines.push(`# Handoff: ${handoff.project}@${handoff.branch}`);\n\n // Active Work: condensed\n const status =\n handoff.activeWork.status === 'in_progress'\n ? 'WIP'\n : handoff.activeWork.status;\n lines.push(`## Work: ${handoff.activeWork.description} [${status}]`);\n if (handoff.activeWork.keyFiles.length > 0) {\n // Use basenames only, limit to 5\n const files = handoff.activeWork.keyFiles\n .slice(0, 5)\n .map((f) => basename(f))\n .join(', ');\n const progress = handoff.activeWork.progress\n ? ` (${handoff.activeWork.progress.replace(' in current session', '')})`\n : '';\n lines.push(`Files: ${files}${progress}`);\n }\n\n // Decisions: single line each with arrow notation\n if (handoff.decisions.length > 0) {\n lines.push('');\n lines.push('## Decisions');\n for (const d of handoff.decisions.slice(0, 7)) {\n // Truncate long decisions\n const what = d.what.length > 40 ? d.what.slice(0, 37) + '...' : d.what;\n const why = d.why ? ` \u2192 ${d.why.slice(0, 50)}` : '';\n lines.push(`- ${what}${why}`);\n }\n }\n\n // Blockers: terse format\n if (handoff.blockers.length > 0) {\n lines.push('');\n lines.push('## Blockers');\n for (const b of handoff.blockers) {\n const status = b.status === 'open' ? '!' : '\u2713';\n const tried = b.attempted.length > 0 ? ` \u2192 ${b.attempted[0]}` : '';\n lines.push(`${status} ${b.issue}${tried}`);\n }\n }\n\n // Review Feedback: only if present, condensed\n if (handoff.reviewFeedback && handoff.reviewFeedback.length > 0) {\n lines.push('');\n lines.push('## Feedback');\n for (const r of handoff.reviewFeedback.slice(0, 2)) {\n lines.push(`[${r.source}]`);\n for (const p of r.keyPoints.slice(0, 3)) {\n lines.push(`- ${p.slice(0, 60)}`);\n }\n for (const a of r.actionItems.slice(0, 2)) {\n lines.push(`\u2192 ${a.slice(0, 60)}`);\n }\n }\n }\n\n // Next Actions: only top 3\n if (handoff.nextActions.length > 0) {\n lines.push('');\n lines.push('## Next');\n for (const a of handoff.nextActions.slice(0, 3)) {\n lines.push(`- ${a.slice(0, 60)}`);\n }\n }\n\n // Skip: Architecture, Patterns (can be inferred from codebase)\n\n // Compact footer\n lines.push('');\n lines.push(`---`);\n lines.push(\n `~${handoff.estimatedTokens} tokens | ${handoff.timestamp.split('T')[0]}`\n );\n\n return lines.join('\\n');\n }\n\n /**\n * Convert handoff to ultra-compact pipe-delimited format (~90% smaller)\n * Optimized for minimal token usage while preserving critical context\n * Target: ~100-150 tokens\n */\n toUltraCompact(handoff: EnhancedHandoff): string {\n const lines: string[] = [];\n\n // Header: [H]project@branch|status|commits\n const status =\n handoff.activeWork.status === 'in_progress'\n ? 'WIP'\n : handoff.activeWork.status;\n const commitCount = handoff.activeWork.progress?.match(/(\\d+)/)?.[1] || '0';\n lines.push(\n `[H]${handoff.project}@${handoff.branch}|${status}|${commitCount}c`\n );\n\n // Files: [F]file1,file2,file3 (basenames only, max 5)\n if (handoff.activeWork.keyFiles.length > 0) {\n const files = handoff.activeWork.keyFiles\n .slice(0, 5)\n .map((f) => basename(f).replace(/\\.(ts|js|tsx|jsx)$/, ''))\n .join(',');\n lines.push(`[F]${files}`);\n }\n\n // Decisions: [D]decision1\u2192why|decision2\u2192why (max 5, truncated)\n if (handoff.decisions.length > 0) {\n const decisions = handoff.decisions\n .slice(0, 5)\n .map((d) => {\n const what = d.what.slice(0, 25).replace(/\\|/g, '/');\n const why = d.why ? `\u2192${d.why.slice(0, 20)}` : '';\n return `${what}${why}`;\n })\n .join('|');\n lines.push(`[D]${decisions}`);\n }\n\n // Blockers: [B]!issue1\u2192tried|!issue2 (! = open, \u2713 = resolved)\n if (handoff.blockers.length > 0) {\n const blockers = handoff.blockers\n .slice(0, 3)\n .map((b) => {\n const marker = b.status === 'open' ? '!' : '\u2713';\n const issue = b.issue.slice(0, 20).replace(/\\|/g, '/');\n const tried =\n b.attempted.length > 0 ? `\u2192${b.attempted[0].slice(0, 15)}` : '';\n return `${marker}${issue}${tried}`;\n })\n .join('|');\n lines.push(`[B]${blockers}`);\n }\n\n // Next actions: [N]action1|action2 (max 3)\n if (handoff.nextActions.length > 0) {\n const actions = handoff.nextActions\n .slice(0, 3)\n .map((a) => a.slice(0, 25).replace(/\\|/g, '/'))\n .join('|');\n lines.push(`[N]${actions}`);\n }\n\n // Footer: ~tokens|date\n const ultraCompactContent = lines.join('\\n');\n const tokens = countTokens(ultraCompactContent);\n lines.push(`~${tokens}t|${handoff.timestamp.split('T')[0]}`);\n\n return lines.join('\\n');\n }\n\n /**\n * Auto-select format based on context budget and content complexity\n * Returns: 'ultra' | 'compact' | 'verbose'\n */\n selectFormat(\n handoff: EnhancedHandoff,\n contextBudget?: number\n ): 'ultra' | 'compact' | 'verbose' {\n // If explicit budget provided, use thresholds\n if (contextBudget !== undefined) {\n if (contextBudget < 500) return 'ultra';\n if (contextBudget < 2000) return 'compact';\n return 'verbose';\n }\n\n // Auto-select based on content complexity\n const complexity =\n handoff.decisions.length +\n handoff.blockers.length +\n (handoff.reviewFeedback?.length || 0) * 2 +\n handoff.nextActions.length;\n\n // Simple sessions: ultra-compact is sufficient\n if (complexity <= 3 && handoff.activeWork.keyFiles.length <= 3) {\n return 'ultra';\n }\n\n // Complex sessions: need more detail\n if (\n complexity > 8 ||\n (handoff.reviewFeedback && handoff.reviewFeedback.length > 1)\n ) {\n return 'verbose';\n }\n\n // Default: compact\n return 'compact';\n }\n\n /**\n * Generate handoff in auto-selected format\n */\n toAutoFormat(handoff: EnhancedHandoff, contextBudget?: number): string {\n const format = this.selectFormat(handoff, contextBudget);\n switch (format) {\n case 'ultra':\n return this.toUltraCompact(handoff);\n case 'verbose':\n return this.toMarkdown(handoff);\n default:\n return this.toCompact(handoff);\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["store", "status"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/session/handoff-generator.ts"],
4
- "sourcesContent": ["/**\n * Session Handoff Generator for StackMemory\n * Inspired by Continuous-Claude's handoff documents\n *\n * Generates structured transfer documents when sessions end\n * and loads them when new sessions begin\n */\n\nimport { Frame, Trace, Context } from '../types';\nimport { FrameManager } from '../frame/frame-manager';\nimport { DatabaseManager } from '../storage/database-manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport interface HandoffDocument {\n session_id: string;\n timestamp: string;\n project: string;\n branch?: string;\n\n // Current state\n active_frame_path: string[];\n active_tasks: TaskSummary[];\n pending_decisions: DecisionPoint[];\n blockers: Blocker[];\n\n // Recent context\n recent_files: FileEdit[];\n recent_commands: CommandExecution[];\n recent_errors: ErrorContext[];\n\n // Key insights\n patterns_detected: string[];\n approaches_tried: ApproachSummary[];\n successful_strategies: string[];\n\n // Next steps\n suggested_next_actions: string[];\n warnings: string[];\n\n // Metrics\n session_duration_minutes: number;\n frames_created: number;\n tool_calls_made: number;\n decisions_recorded: number;\n}\n\ninterface TaskSummary {\n id: string;\n title: string;\n status: 'pending' | 'in_progress' | 'blocked' | 'completed';\n progress_percentage: number;\n blocker?: string;\n}\n\ninterface DecisionPoint {\n decision: string;\n rationale: string;\n alternatives_considered?: string[];\n timestamp: string;\n}\n\ninterface Blocker {\n description: string;\n attempted_solutions: string[];\n suggested_approach?: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n}\n\ninterface FileEdit {\n path: string;\n operations: ('created' | 'modified' | 'deleted')[];\n line_changes: { added: number; removed: number };\n}\n\ninterface CommandExecution {\n command: string;\n success: boolean;\n output_summary?: string;\n}\n\ninterface ErrorContext {\n error: string;\n context: string;\n resolved: boolean;\n resolution?: string;\n}\n\ninterface ApproachSummary {\n approach: string;\n outcome: 'successful' | 'failed' | 'partial';\n learnings?: string;\n}\n\nexport class HandoffGenerator {\n private frameManager: FrameManager;\n private dbManager: DatabaseManager;\n private handoffDir: string;\n\n constructor(\n frameManager: FrameManager,\n dbManager: DatabaseManager,\n projectRoot: string\n ) {\n this.frameManager = frameManager;\n this.dbManager = dbManager;\n this.handoffDir = path.join(projectRoot, '.stackmemory', 'handoffs');\n }\n\n /**\n * Generate a handoff document for the current session\n */\n async generateHandoff(sessionId: string): Promise<HandoffDocument> {\n const session = await this.dbManager.getSession(sessionId);\n if (!session) throw new Error(`Session ${sessionId} not found`);\n\n // Get active frame stack\n const activeFramePath = await this.getActiveFramePath();\n\n // Get recent activity\n const recentTraces = await this.dbManager.getRecentTraces(sessionId, 100);\n const recentFrames = await this.dbManager.getRecentFrames(sessionId, 20);\n\n // Extract key information\n const tasks = await this.extractTasks(recentFrames);\n const decisions = await this.extractDecisions(recentTraces);\n const blockers = await this.extractBlockers(recentTraces, recentFrames);\n const fileEdits = await this.extractFileEdits(recentTraces);\n const commands = await this.extractCommands(recentTraces);\n const errors = await this.extractErrors(recentTraces);\n const patterns = await this.detectPatterns(recentTraces);\n const approaches = await this.extractApproaches(recentFrames);\n\n // Calculate metrics\n const sessionDuration = Math.floor(\n (Date.now() - new Date(session.startedAt).getTime()) / 60000\n );\n\n const handoff: HandoffDocument = {\n session_id: sessionId,\n timestamp: new Date().toISOString(),\n project: session.project,\n branch: session.metadata?.branch,\n\n active_frame_path: activeFramePath,\n active_tasks: tasks,\n pending_decisions: decisions.filter((d) => !d.resolved),\n blockers: blockers,\n\n recent_files: fileEdits.slice(0, 10),\n recent_commands: commands.slice(0, 10),\n recent_errors: errors.slice(0, 5),\n\n patterns_detected: patterns,\n approaches_tried: approaches,\n successful_strategies: this.extractSuccessfulStrategies(approaches),\n\n suggested_next_actions: await this.suggestNextActions(\n tasks,\n blockers,\n activeFramePath\n ),\n warnings: await this.generateWarnings(errors, blockers),\n\n session_duration_minutes: sessionDuration,\n frames_created: recentFrames.length,\n tool_calls_made: recentTraces.filter((t) => t.type === 'tool_call')\n .length,\n decisions_recorded: decisions.length,\n };\n\n // Save to file\n await this.saveHandoff(handoff);\n\n return handoff;\n }\n\n /**\n * Load the most recent handoff document\n */\n async loadHandoff(): Promise<HandoffDocument | null> {\n try {\n await fs.mkdir(this.handoffDir, { recursive: true });\n\n const files = await fs.readdir(this.handoffDir);\n const handoffFiles = files\n .filter((f) => f.endsWith('.json'))\n .sort()\n .reverse();\n\n if (handoffFiles.length === 0) return null;\n\n const mostRecent = handoffFiles[0];\n const content = await fs.readFile(\n path.join(this.handoffDir, mostRecent),\n 'utf-8'\n );\n\n return JSON.parse(content) as HandoffDocument;\n } catch (error: unknown) {\n console.error('Error loading handoff:', error);\n return null;\n }\n }\n\n /**\n * Generate a markdown summary of the handoff\n */\n async generateMarkdownSummary(handoff: HandoffDocument): Promise<string> {\n const lines: string[] = [\n `# Session Handoff`,\n `**Generated**: ${new Date(handoff.timestamp).toLocaleString()}`,\n `**Project**: ${handoff.project}`,\n handoff.branch ? `**Branch**: ${handoff.branch}` : '',\n `**Duration**: ${handoff.session_duration_minutes} minutes`,\n '',\n\n `## Current Context`,\n `**Active Frame Path**: ${handoff.active_frame_path.join(' \u2192 ')}`,\n '',\n\n `## Active Tasks (${handoff.active_tasks.length})`,\n ...handoff.active_tasks.map(\n (t) =>\n `- [${t.status}] ${t.title} (${t.progress_percentage}%)${\n t.blocker ? ` \u26A0\uFE0F Blocked: ${t.blocker}` : ''\n }`\n ),\n '',\n\n handoff.blockers.length > 0 ? '## Blockers' : '',\n ...handoff.blockers.map(\n (b) =>\n `- **${b.severity}**: ${b.description}\\n Tried: ${b.attempted_solutions.join(\n ', '\n )}`\n ),\n '',\n\n handoff.pending_decisions.length > 0 ? '## Pending Decisions' : '',\n ...handoff.pending_decisions.map(\n (d) => `- **${d.decision}**\\n Rationale: ${d.rationale}`\n ),\n '',\n\n '## Recent Activity',\n `- Files edited: ${handoff.recent_files.length}`,\n `- Commands run: ${handoff.recent_commands.length}`,\n `- Errors encountered: ${handoff.recent_errors.length}`,\n '',\n\n handoff.patterns_detected.length > 0 ? '## Patterns Detected' : '',\n ...handoff.patterns_detected.map((p) => `- ${p}`),\n '',\n\n handoff.successful_strategies.length > 0\n ? '## Successful Strategies'\n : '',\n ...handoff.successful_strategies.map((s) => `- ${s}`),\n '',\n\n '## Suggested Next Actions',\n ...handoff.suggested_next_actions.map((a) => `1. ${a}`),\n '',\n\n handoff.warnings.length > 0 ? '## \u26A0\uFE0F Warnings' : '',\n ...handoff.warnings.map((w) => `- ${w}`),\n ];\n\n return lines.filter((l) => l !== '').join('\\n');\n }\n\n /**\n * Auto-detect session end and trigger handoff\n */\n async detectSessionEnd(sessionId: string): Promise<boolean> {\n const idleThreshold = 5 * 60 * 1000; // 5 minutes\n const lastActivity = await this.dbManager.getLastActivityTime(sessionId);\n\n if (!lastActivity) return false;\n\n const idleTime = Date.now() - lastActivity.getTime();\n if (idleTime > idleThreshold) {\n await this.generateHandoff(sessionId);\n return true;\n }\n\n return false;\n }\n\n // Private helper methods\n\n private async getActiveFramePath(): Promise<string[]> {\n const stack = await this.frameManager.getStack();\n return stack.frames.map((f) => f.description || f.type);\n }\n\n private async extractTasks(frames: Frame[]): Promise<TaskSummary[]> {\n return frames\n .filter((f) => f.type === 'task')\n .map((f) => ({\n id: f.id,\n title: f.description || 'Untitled task',\n status: this.getTaskStatus(f),\n progress_percentage: f.metadata?.progress || 0,\n blocker: f.metadata?.blocker,\n }));\n }\n\n private getTaskStatus(frame: Frame): TaskSummary['status'] {\n if (frame.status === 'closed') return 'completed';\n if (frame.metadata?.blocker) return 'blocked';\n if (frame.status === 'open') return 'in_progress';\n return 'pending';\n }\n\n private async extractDecisions(traces: Trace[]): Promise<DecisionPoint[]> {\n return traces\n .filter((t) => t.type === 'decision')\n .map((t) => ({\n decision: t.content.decision || '',\n rationale: t.content.rationale || '',\n alternatives_considered: t.content.alternatives,\n timestamp: t.timestamp,\n resolved: t.metadata?.resolved || false,\n }));\n }\n\n private async extractBlockers(\n traces: Trace[],\n frames: Frame[]\n ): Promise<Blocker[]> {\n const blockers: Blocker[] = [];\n\n // Extract from error traces\n const errorTraces = traces.filter(\n (t) => t.type === 'error' && !t.metadata?.resolved\n );\n\n for (const trace of errorTraces) {\n blockers.push({\n description: trace.content.error || 'Unknown error',\n attempted_solutions: trace.metadata?.attempts || [],\n suggested_approach: trace.metadata?.suggestion,\n severity: this.getErrorSeverity(trace),\n });\n }\n\n // Extract from blocked frames\n const blockedFrames = frames.filter((f) => f.metadata?.blocker);\n for (const frame of blockedFrames) {\n blockers.push({\n description: frame.metadata.blocker,\n attempted_solutions: frame.metadata.attempts || [],\n severity: 'medium',\n });\n }\n\n return blockers;\n }\n\n private getErrorSeverity(trace: Trace): Blocker['severity'] {\n const error = trace.content.error?.toLowerCase() || '';\n if (error.includes('critical') || error.includes('fatal'))\n return 'critical';\n if (error.includes('error') || error.includes('fail')) return 'high';\n if (error.includes('warning')) return 'medium';\n return 'low';\n }\n\n private async extractFileEdits(traces: Trace[]): Promise<FileEdit[]> {\n const fileMap = new Map<string, FileEdit>();\n\n const editTraces = traces.filter((t) =>\n ['edit', 'write', 'create', 'delete'].includes(t.type)\n );\n\n for (const trace of editTraces) {\n const path = trace.content.file_path || trace.content.path;\n if (!path) continue;\n\n if (!fileMap.has(path)) {\n fileMap.set(path, {\n path,\n operations: [],\n line_changes: { added: 0, removed: 0 },\n });\n }\n\n const file = fileMap.get(path)!;\n const op = this.getFileOperation(trace.type);\n if (!file.operations.includes(op)) {\n file.operations.push(op);\n }\n\n file.line_changes.added += trace.metadata?.lines_added || 0;\n file.line_changes.removed += trace.metadata?.lines_removed || 0;\n }\n\n return Array.from(fileMap.values());\n }\n\n private getFileOperation(traceType: string): FileEdit['operations'][0] {\n switch (traceType) {\n case 'create':\n case 'write':\n return 'created';\n case 'edit':\n return 'modified';\n case 'delete':\n return 'deleted';\n default:\n return 'modified';\n }\n }\n\n private async extractCommands(traces: Trace[]): Promise<CommandExecution[]> {\n return traces\n .filter((t) => t.type === 'bash' || t.type === 'command')\n .map((t) => ({\n command: t.content.command || '',\n success: !t.metadata?.error,\n output_summary: t.content.output?.substring(0, 100),\n }));\n }\n\n private async extractErrors(traces: Trace[]): Promise<ErrorContext[]> {\n return traces\n .filter((t) => t.type === 'error')\n .map((t) => ({\n error: t.content.error || '',\n context: t.content.context || '',\n resolved: t.metadata?.resolved || false,\n resolution: t.metadata?.resolution,\n }));\n }\n\n private async detectPatterns(traces: Trace[]): Promise<string[]> {\n const patterns: string[] = [];\n\n // Detect TDD pattern\n const testFirst = traces.some(\n (t) =>\n t.type === 'test' &&\n traces.some(\n (t2) => t2.type === 'implement' && t2.timestamp > t.timestamp\n )\n );\n if (testFirst) patterns.push('Test-Driven Development');\n\n // Detect refactoring pattern\n const refactoring =\n traces.filter(\n (t) =>\n t.content.description?.includes('refactor') ||\n t.metadata?.operation === 'refactor'\n ).length > 3;\n if (refactoring) patterns.push('Active Refactoring');\n\n // Detect debugging pattern\n const debugging =\n traces.filter((t) => t.type === 'error' || t.type === 'debug').length > 5;\n if (debugging) patterns.push('Deep Debugging Session');\n\n return patterns;\n }\n\n private async extractApproaches(frames: Frame[]): Promise<ApproachSummary[]> {\n return frames\n .filter((f) => f.metadata?.approach)\n .map((f) => ({\n approach: f.metadata.approach,\n outcome: this.getApproachOutcome(f),\n learnings: f.metadata.learnings,\n }));\n }\n\n private getApproachOutcome(frame: Frame): ApproachSummary['outcome'] {\n if (frame.status === 'closed' && frame.metadata?.success)\n return 'successful';\n if (frame.status === 'closed' && !frame.metadata?.success) return 'failed';\n return 'partial';\n }\n\n private extractSuccessfulStrategies(approaches: ApproachSummary[]): string[] {\n return approaches\n .filter((a) => a.outcome === 'successful')\n .map((a) => a.approach);\n }\n\n private async suggestNextActions(\n tasks: TaskSummary[],\n blockers: Blocker[],\n framePath: string[]\n ): Promise<string[]> {\n const suggestions: string[] = [];\n\n // Resume in-progress tasks\n const inProgress = tasks.filter((t) => t.status === 'in_progress');\n if (inProgress.length > 0) {\n suggestions.push(`Resume task: ${inProgress[0].title}`);\n }\n\n // Address critical blockers\n const criticalBlockers = blockers.filter((b) => b.severity === 'critical');\n if (criticalBlockers.length > 0) {\n suggestions.push(\n `Resolve critical blocker: ${criticalBlockers[0].description}`\n );\n }\n\n // Complete nearly done tasks\n const nearlyDone = tasks.filter((t) => t.progress_percentage >= 80);\n if (nearlyDone.length > 0) {\n suggestions.push(\n `Complete task: ${nearlyDone[0].title} (${nearlyDone[0].progress_percentage}% done)`\n );\n }\n\n return suggestions;\n }\n\n private async generateWarnings(\n errors: ErrorContext[],\n blockers: Blocker[]\n ): Promise<string[]> {\n const warnings: string[] = [];\n\n // Unresolved errors\n const unresolved = errors.filter((e) => !e.resolved);\n if (unresolved.length > 0) {\n warnings.push(`${unresolved.length} unresolved errors`);\n }\n\n // Critical blockers\n const critical = blockers.filter((b) => b.severity === 'critical');\n if (critical.length > 0) {\n warnings.push(\n `${critical.length} critical blockers need immediate attention`\n );\n }\n\n return warnings;\n }\n\n private async saveHandoff(handoff: HandoffDocument): Promise<void> {\n await fs.mkdir(this.handoffDir, { recursive: true });\n\n const filename = `${handoff.timestamp.replace(/[:.]/g, '-')}.json`;\n const filepath = path.join(this.handoffDir, filename);\n\n await fs.writeFile(filepath, JSON.stringify(handoff, null, 2), 'utf-8');\n\n // Also save markdown summary\n const markdown = await this.generateMarkdownSummary(handoff);\n const mdPath = filepath.replace('.json', '.md');\n await fs.writeFile(mdPath, markdown, 'utf-8');\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["path"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/session/index.ts"],
4
- "sourcesContent": ["export {\n SessionManager,\n sessionManager,\n type Session,\n type SessionOptions,\n FrameQueryMode,\n} from './session-manager.js';\n"],
5
- "mappings": ";;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,OACK;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/session/session-manager.ts"],
4
- "sourcesContent": ["/**\n * Session Management for StackMemory\n * Provides session persistence and recovery across CLI invocations\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { logger } from '../monitoring/logger.js';\nimport { SystemError, ErrorCode } from '../errors/index.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport interface Session {\n sessionId: string;\n runId: string;\n projectId: string;\n branch?: string;\n startedAt: number;\n lastActiveAt: number;\n metadata: {\n user?: string;\n environment?: string;\n tags?: string[];\n cliVersion?: string;\n };\n state: 'active' | 'suspended' | 'closed';\n}\n\nexport interface SessionOptions {\n sessionId?: string;\n projectPath?: string;\n branch?: string;\n metadata?: Session['metadata'];\n}\n\nexport enum FrameQueryMode {\n CURRENT_SESSION = 'current',\n PROJECT_ACTIVE = 'project',\n ALL_ACTIVE = 'all',\n HISTORICAL = 'historical',\n}\n\nexport class SessionManager {\n private static instance: SessionManager;\n private sessionsDir: string;\n private currentSession: Session | null = null;\n private readonly STALE_THRESHOLD = 24 * 60 * 60 * 1000; // 24 hours\n\n private constructor() {\n const homeDir = process.env['HOME'] || process.env['USERPROFILE'] || '';\n this.sessionsDir = path.join(homeDir, '.stackmemory', 'sessions');\n }\n\n static getInstance(): SessionManager {\n if (!SessionManager.instance) {\n SessionManager.instance = new SessionManager();\n }\n return SessionManager.instance;\n }\n\n async initialize(): Promise<void> {\n try {\n await fs.mkdir(this.sessionsDir, { recursive: true });\n await fs.mkdir(path.join(this.sessionsDir, 'projects'), {\n recursive: true,\n });\n await fs.mkdir(path.join(this.sessionsDir, 'history'), {\n recursive: true,\n });\n } catch (error: unknown) {\n throw new SystemError(\n 'Failed to initialize session directories',\n ErrorCode.INITIALIZATION_ERROR,\n { error, sessionsDir: this.sessionsDir }\n );\n }\n }\n\n async getOrCreateSession(options?: SessionOptions): Promise<Session> {\n // 1. Check explicit session ID\n if (options?.sessionId) {\n const session = await this.loadSession(options.sessionId);\n if (session) {\n this.currentSession = session;\n return session;\n }\n }\n\n // 2. Check environment variable\n const envSessionId = process.env['STACKMEMORY_SESSION'];\n if (envSessionId) {\n const session = await this.loadSession(envSessionId);\n if (session) {\n this.currentSession = session;\n return session;\n }\n }\n\n // 3. Check project + branch context\n const projectHash = await this.getProjectHash(options?.projectPath);\n const branch =\n options?.branch || (await this.getGitBranch(options?.projectPath));\n\n if (projectHash) {\n // Try project+branch session\n const branchSession = await this.findProjectBranchSession(\n projectHash,\n branch\n );\n if (branchSession && this.isSessionRecent(branchSession)) {\n await this.touchSession(branchSession);\n this.currentSession = branchSession;\n return branchSession;\n }\n\n // Try last active for project\n const lastActive = await this.findLastActiveSession(projectHash);\n if (lastActive && this.isSessionRecent(lastActive)) {\n await this.touchSession(lastActive);\n this.currentSession = lastActive;\n return lastActive;\n }\n }\n\n // 4. Create new session\n const newSession = await this.createSession({\n projectId: projectHash || 'global',\n branch,\n metadata: options?.metadata,\n });\n\n this.currentSession = newSession;\n return newSession;\n }\n\n async createSession(params: {\n projectId: string;\n branch?: string;\n metadata?: Session['metadata'];\n }): Promise<Session> {\n const session: Session = {\n sessionId: uuidv4(),\n runId: uuidv4(),\n projectId: params.projectId,\n branch: params.branch,\n startedAt: Date.now(),\n lastActiveAt: Date.now(),\n metadata: {\n ...params.metadata,\n user: process.env['USER'],\n environment: process.env['NODE_ENV'] || 'development',\n cliVersion: process.env['npm_package_version'],\n },\n state: 'active',\n };\n\n await this.saveSession(session);\n await this.setProjectActiveSession(params.projectId, session.sessionId);\n\n // Set as current session\n this.currentSession = session;\n\n logger.info('Created new session', {\n sessionId: session.sessionId,\n projectId: session.projectId,\n branch: session.branch,\n });\n\n return session;\n }\n\n async loadSession(sessionId: string): Promise<Session | null> {\n try {\n const sessionPath = path.join(this.sessionsDir, `${sessionId}.json`);\n const data = await fs.readFile(sessionPath, 'utf-8');\n return JSON.parse(data) as Session;\n } catch (error: unknown) {\n // Check history\n try {\n const historyPath = path.join(\n this.sessionsDir,\n 'history',\n `${sessionId}.json`\n );\n const data = await fs.readFile(historyPath, 'utf-8');\n return JSON.parse(data) as Session;\n } catch {\n return null;\n }\n }\n }\n\n async saveSession(session: Session): Promise<void> {\n const sessionPath = path.join(\n this.sessionsDir,\n `${session.sessionId}.json`\n );\n await fs.writeFile(sessionPath, JSON.stringify(session, null, 2));\n }\n\n async suspendSession(sessionId?: string): Promise<void> {\n const id = sessionId || this.currentSession?.sessionId;\n if (!id) return;\n\n const session = await this.loadSession(id);\n if (session) {\n session.state = 'suspended';\n session.lastActiveAt = Date.now();\n await this.saveSession(session);\n }\n }\n\n async resumeSession(sessionId: string): Promise<Session> {\n const session = await this.loadSession(sessionId);\n if (!session) {\n throw new SystemError('Session not found', ErrorCode.NOT_FOUND, {\n sessionId,\n });\n }\n\n session.state = 'active';\n session.lastActiveAt = Date.now();\n await this.saveSession(session);\n\n this.currentSession = session;\n return session;\n }\n\n async closeSession(sessionId?: string): Promise<void> {\n const id = sessionId || this.currentSession?.sessionId;\n if (!id) return;\n\n const session = await this.loadSession(id);\n if (session) {\n session.state = 'closed';\n session.lastActiveAt = Date.now();\n\n // Move to history\n const sessionPath = path.join(\n this.sessionsDir,\n `${session.sessionId}.json`\n );\n const historyPath = path.join(\n this.sessionsDir,\n 'history',\n `${session.sessionId}.json`\n );\n\n await fs.rename(sessionPath, historyPath);\n }\n }\n\n async listSessions(filter?: {\n projectId?: string;\n state?: Session['state'];\n branch?: string;\n }): Promise<Session[]> {\n const sessions: Session[] = [];\n\n // Load active sessions\n const files = await fs.readdir(this.sessionsDir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n const session = await this.loadSession(file.replace('.json', ''));\n if (session) {\n sessions.push(session);\n }\n }\n }\n\n // Apply filters\n return sessions.filter((s) => {\n if (filter?.projectId && s.projectId !== filter.projectId) return false;\n if (filter?.state && s.state !== filter.state) return false;\n if (filter?.branch && s.branch !== filter.branch) return false;\n return true;\n });\n }\n\n async mergeSessions(sourceId: string, targetId: string): Promise<Session> {\n const source = await this.loadSession(sourceId);\n const target = await this.loadSession(targetId);\n\n if (!source || !target) {\n throw new SystemError(\n 'Session not found for merge',\n ErrorCode.NOT_FOUND,\n { sourceId, targetId }\n );\n }\n\n // Merge metadata\n target.metadata = {\n ...target.metadata,\n ...source.metadata,\n tags: [...(target.metadata.tags || []), ...(source.metadata.tags || [])],\n };\n\n // Update timestamps\n target.lastActiveAt = Date.now();\n\n // Close source session\n await this.closeSession(sourceId);\n await this.saveSession(target);\n\n logger.info('Merged sessions', {\n source: sourceId,\n target: targetId,\n });\n\n return target;\n }\n\n async cleanupStaleSessions(\n maxAge: number = 30 * 24 * 60 * 60 * 1000\n ): Promise<number> {\n const historyDir = path.join(this.sessionsDir, 'history');\n const files = await fs.readdir(historyDir);\n const cutoff = Date.now() - maxAge;\n let cleaned = 0;\n\n for (const file of files) {\n if (file.endsWith('.json')) {\n const filePath = path.join(historyDir, file);\n const stats = await fs.stat(filePath);\n\n if (stats.mtimeMs < cutoff) {\n await fs.unlink(filePath);\n cleaned++;\n }\n }\n }\n\n logger.info(`Cleaned up ${cleaned} stale sessions`);\n return cleaned;\n }\n\n getCurrentSession(): Session | null {\n return this.currentSession;\n }\n\n getSessionRunId(): string {\n return this.currentSession?.runId || uuidv4();\n }\n\n private async getProjectHash(projectPath?: string): Promise<string | null> {\n try {\n const cwd = projectPath || process.cwd();\n const pathModule = await import('path');\n\n // Try to get git remote first (consistent with project-manager)\n let identifier: string;\n try {\n const { execSync } = await import('child_process');\n identifier = execSync('git config --get remote.origin.url', {\n cwd,\n encoding: 'utf-8',\n timeout: 5000,\n }).trim();\n } catch {\n // Fall back to directory path\n identifier = cwd;\n }\n\n // Use same algorithm as project-manager.generateProjectId\n const cleaned = identifier\n .replace(/\\.git$/, '')\n .replace(/[^a-zA-Z0-9-]/g, '-')\n .toLowerCase();\n\n return cleaned.substring(cleaned.length - 50);\n } catch {\n return null;\n }\n }\n\n private async getGitBranch(\n projectPath?: string\n ): Promise<string | undefined> {\n try {\n const { execSync } = await import('child_process');\n const cwd = projectPath || process.cwd();\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd,\n encoding: 'utf-8',\n }).trim();\n return branch;\n } catch {\n return undefined;\n }\n }\n\n private async findProjectBranchSession(\n projectHash: string,\n branch?: string\n ): Promise<Session | null> {\n if (!branch) return null;\n\n const sessions = await this.listSessions({\n projectId: projectHash,\n state: 'active',\n branch,\n });\n\n return sessions.sort((a, b) => b.lastActiveAt - a.lastActiveAt)[0] || null;\n }\n\n private async findLastActiveSession(\n projectHash: string\n ): Promise<Session | null> {\n const sessions = await this.listSessions({\n projectId: projectHash,\n state: 'active',\n });\n\n return sessions.sort((a, b) => b.lastActiveAt - a.lastActiveAt)[0] || null;\n }\n\n private async setProjectActiveSession(\n projectId: string,\n sessionId: string\n ): Promise<void> {\n const projectFile = path.join(\n this.sessionsDir,\n 'projects',\n `${projectId}.json`\n );\n await fs.writeFile(\n projectFile,\n JSON.stringify(\n {\n projectId,\n activeSessionId: sessionId,\n updatedAt: Date.now(),\n },\n null,\n 2\n )\n );\n }\n\n private isSessionRecent(session: Session): boolean {\n return Date.now() - session.lastActiveAt < this.STALE_THRESHOLD;\n }\n\n private async touchSession(session: Session): Promise<void> {\n session.lastActiveAt = Date.now();\n await this.saveSession(session);\n }\n}\n\nexport const sessionManager = SessionManager.getInstance();\n"],
5
- "mappings": "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",
6
- "names": ["FrameQueryMode"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/skills/index.ts"],
4
- "sourcesContent": ["/**\n * Skills Module\n * Persistent agent learning and skill memory\n */\n\nexport * from './types.js';\nexport * from './skill-storage.js';\n"],
5
- "mappings": ";;;;AAKA,cAAc;AACd,cAAc;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/skills/skill-storage.ts"],
4
- "sourcesContent": ["/**\n * Skill Storage Service\n * Redis-backed persistent storage for agent learnings and skills\n * All skills are namespaced by userId for multi-user support\n */\n\nimport 'dotenv/config';\nimport Redis from 'ioredis';\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../monitoring/logger.js';\n\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nimport {\n Skill,\n CreateSkillInput,\n UpdateSkillInput,\n SkillQuery,\n JournalEntry,\n JournalEntryType,\n SessionSummary,\n SkillCategory,\n SkillPriority,\n REDIS_KEYS,\n CACHE_TTL,\n calculateSkillTTL,\n SkillSchema,\n JournalEntrySchema,\n} from './types.js';\n\nexport interface SkillStorageConfig {\n redisUrl: string;\n userId: string; // Required: user namespace for skills\n keyPrefix?: string;\n enableMetrics?: boolean;\n}\n\nexport interface SkillStorageMetrics {\n userId: string;\n skillsTotal: number;\n skillsByCategory: Record<SkillCategory, number>;\n journalEntriesTotal: number;\n sessionsTracked: number;\n cacheHits: number;\n cacheMisses: number;\n}\n\nexport class SkillStorageService {\n private redis: Redis;\n private userId: string;\n private keyPrefix: string;\n private enableMetrics: boolean;\n\n // Metrics tracking\n private metrics = {\n cacheHits: 0,\n cacheMisses: 0,\n };\n\n constructor(config: SkillStorageConfig) {\n this.redis = new Redis(config.redisUrl);\n this.userId = config.userId;\n this.keyPrefix = config.keyPrefix || 'sm:skills';\n this.enableMetrics = config.enableMetrics ?? true;\n\n this.redis.on('error', (err) => {\n logger.error('Redis connection error in SkillStorage', err);\n });\n\n this.redis.on('connect', () => {\n logger.info('SkillStorage connected to Redis');\n });\n\n logger.info('SkillStorageService initialized', {\n userId: this.userId,\n keyPrefix: this.keyPrefix,\n enableMetrics: this.enableMetrics,\n });\n }\n\n private key(pattern: string): string {\n return `${this.keyPrefix}:${pattern}`;\n }\n\n /**\n * Get the current user ID\n */\n getUserId(): string {\n return this.userId;\n }\n\n // ============================================================\n // SKILL CRUD OPERATIONS\n // ============================================================\n\n /**\n * Create a new skill\n */\n async createSkill(input: CreateSkillInput): Promise<Skill> {\n const now = new Date().toISOString();\n const skill: Skill = {\n ...input,\n id: uuidv4(),\n createdAt: now,\n updatedAt: now,\n validatedCount: 0,\n };\n\n // Validate\n SkillSchema.parse(skill);\n\n const pipeline = this.redis.pipeline();\n const skillKey = this.key(REDIS_KEYS.skill(this.userId, skill.id));\n\n // Store skill\n pipeline.setex(\n skillKey,\n calculateSkillTTL(skill.validatedCount),\n JSON.stringify(skill)\n );\n\n // Index by tool\n if (skill.tool) {\n pipeline.zadd(\n this.key(REDIS_KEYS.skillsByTool(this.userId, skill.tool)),\n Date.now(),\n skill.id\n );\n }\n\n // Index by category\n pipeline.zadd(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, skill.category)),\n this.priorityScore(skill.priority),\n skill.id\n );\n\n // Index by tags\n for (const tag of skill.tags) {\n pipeline.zadd(\n this.key(REDIS_KEYS.skillsByTag(this.userId, tag)),\n Date.now(),\n skill.id\n );\n }\n\n // Add to recent skills\n pipeline.zadd(\n this.key(REDIS_KEYS.skillsRecent(this.userId)),\n Date.now(),\n skill.id\n );\n pipeline.zremrangebyrank(\n this.key(REDIS_KEYS.skillsRecent(this.userId)),\n 0,\n -1001\n ); // Keep last 1000\n\n await pipeline.exec();\n\n logger.info('Created skill', {\n userId: this.userId,\n id: skill.id,\n category: skill.category,\n tool: skill.tool,\n });\n\n return skill;\n }\n\n /**\n * Get skill by ID\n */\n async getSkill(id: string): Promise<Skill | null> {\n const skillKey = this.key(REDIS_KEYS.skill(this.userId, id));\n const data = await this.redis.get(skillKey);\n\n if (!data) {\n this.metrics.cacheMisses++;\n return null;\n }\n\n this.metrics.cacheHits++;\n return JSON.parse(data) as Skill;\n }\n\n /**\n * Update an existing skill\n */\n async updateSkill(input: UpdateSkillInput): Promise<Skill | null> {\n const existing = await this.getSkill(input.id);\n if (!existing) {\n return null;\n }\n\n const updated: Skill = {\n ...existing,\n ...input,\n updatedAt: new Date().toISOString(),\n };\n\n // Validate\n SkillSchema.parse(updated);\n\n const skillKey = this.key(REDIS_KEYS.skill(this.userId, updated.id));\n await this.redis.setex(\n skillKey,\n calculateSkillTTL(updated.validatedCount),\n JSON.stringify(updated)\n );\n\n logger.info('Updated skill', { userId: this.userId, id: updated.id });\n\n return updated;\n }\n\n /**\n * Validate a skill (increment validation count)\n */\n async validateSkill(id: string): Promise<Skill | null> {\n const skill = await this.getSkill(id);\n if (!skill) {\n return null;\n }\n\n skill.validatedCount++;\n skill.lastValidated = new Date().toISOString();\n skill.updatedAt = new Date().toISOString();\n\n const skillKey = this.key(REDIS_KEYS.skill(this.userId, id));\n // TTL increases with validation count: 7 days base + 7 days per validation, max 90 days\n await this.redis.setex(\n skillKey,\n calculateSkillTTL(skill.validatedCount),\n JSON.stringify(skill)\n );\n\n // Update validated index\n await this.redis.zadd(\n this.key(REDIS_KEYS.skillsValidated(this.userId)),\n skill.validatedCount,\n id\n );\n\n // Check for promotion eligibility\n if (skill.validatedCount >= 3 && skill.priority !== 'critical') {\n await this.redis.sadd(\n this.key(REDIS_KEYS.promotionCandidates(this.userId)),\n id\n );\n }\n\n logger.info('Validated skill', {\n userId: this.userId,\n id,\n validatedCount: skill.validatedCount,\n });\n\n return skill;\n }\n\n /**\n * Delete a skill\n */\n async deleteSkill(id: string): Promise<boolean> {\n const skill = await this.getSkill(id);\n if (!skill) {\n return false;\n }\n\n const pipeline = this.redis.pipeline();\n const skillKey = this.key(REDIS_KEYS.skill(this.userId, id));\n\n // Remove skill\n pipeline.del(skillKey);\n\n // Remove from indexes\n if (skill.tool) {\n pipeline.zrem(\n this.key(REDIS_KEYS.skillsByTool(this.userId, skill.tool)),\n id\n );\n }\n\n pipeline.zrem(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, skill.category)),\n id\n );\n\n for (const tag of skill.tags) {\n pipeline.zrem(this.key(REDIS_KEYS.skillsByTag(this.userId, tag)), id);\n }\n\n pipeline.zrem(this.key(REDIS_KEYS.skillsRecent(this.userId)), id);\n pipeline.zrem(this.key(REDIS_KEYS.skillsValidated(this.userId)), id);\n pipeline.srem(this.key(REDIS_KEYS.promotionCandidates(this.userId)), id);\n\n await pipeline.exec();\n\n logger.info('Deleted skill', { userId: this.userId, id });\n\n return true;\n }\n\n // ============================================================\n // SKILL QUERIES\n // ============================================================\n\n /**\n * Query skills with filters\n */\n async querySkills(query: SkillQuery): Promise<Skill[]> {\n let skillIds: string[] = [];\n\n // Determine which index to use\n if (query.tool) {\n skillIds = await this.redis.zrevrange(\n this.key(REDIS_KEYS.skillsByTool(this.userId, query.tool)),\n 0,\n -1\n );\n } else if (query.categories && query.categories.length === 1) {\n skillIds = await this.redis.zrevrange(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, query.categories[0])),\n 0,\n -1\n );\n } else if (query.tags && query.tags.length === 1) {\n skillIds = await this.redis.zrevrange(\n this.key(REDIS_KEYS.skillsByTag(this.userId, query.tags[0])),\n 0,\n -1\n );\n } else {\n // Default to recent skills\n skillIds = await this.redis.zrevrange(\n this.key(REDIS_KEYS.skillsRecent(this.userId)),\n 0,\n query.limit + query.offset\n );\n }\n\n if (skillIds.length === 0) {\n return [];\n }\n\n // Fetch skills\n const pipeline = this.redis.pipeline();\n for (const id of skillIds) {\n pipeline.get(this.key(REDIS_KEYS.skill(this.userId, id)));\n }\n\n const results = await pipeline.exec();\n if (!results) {\n return [];\n }\n\n let skills: Skill[] = results\n .map(([err, data]) => {\n if (err || !data) return null;\n try {\n return JSON.parse(data as string) as Skill;\n } catch {\n return null;\n }\n })\n .filter((s): s is Skill => s !== null);\n\n // Apply additional filters\n if (query.categories && query.categories.length > 0) {\n skills = skills.filter((s) => query.categories!.includes(s.category));\n }\n\n if (query.priorities && query.priorities.length > 0) {\n skills = skills.filter((s) => query.priorities!.includes(s.priority));\n }\n\n if (query.minValidatedCount !== undefined) {\n skills = skills.filter(\n (s) => s.validatedCount >= query.minValidatedCount!\n );\n }\n\n if (query.language) {\n skills = skills.filter((s) => s.language === query.language);\n }\n\n if (query.framework) {\n skills = skills.filter((s) => s.framework === query.framework);\n }\n\n // Sort\n skills.sort((a, b) => {\n let aVal: number, bVal: number;\n\n switch (query.sortBy) {\n case 'priority':\n aVal = this.priorityScore(a.priority);\n bVal = this.priorityScore(b.priority);\n break;\n case 'validatedCount':\n aVal = a.validatedCount;\n bVal = b.validatedCount;\n break;\n case 'createdAt':\n aVal = new Date(a.createdAt).getTime();\n bVal = new Date(b.createdAt).getTime();\n break;\n case 'updatedAt':\n aVal = new Date(a.updatedAt).getTime();\n bVal = new Date(b.updatedAt).getTime();\n break;\n default:\n aVal = this.priorityScore(a.priority);\n bVal = this.priorityScore(b.priority);\n }\n\n return query.sortOrder === 'desc' ? bVal - aVal : aVal - bVal;\n });\n\n // Apply pagination\n return skills.slice(query.offset, query.offset + query.limit);\n }\n\n /**\n * Get skills relevant to current context\n */\n async getRelevantSkills(context: {\n tool?: string;\n language?: string;\n framework?: string;\n tags?: string[];\n }): Promise<Skill[]> {\n const skills: Skill[] = [];\n const seenIds = new Set<string>();\n\n // Always include critical skills\n const criticalIds = await this.redis.zrevrange(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'correction')),\n 0,\n -1\n );\n\n for (const id of criticalIds) {\n const skill = await this.getSkill(id);\n if (skill && skill.priority === 'critical' && !seenIds.has(id)) {\n skills.push(skill);\n seenIds.add(id);\n }\n }\n\n // Get tool-specific skills\n if (context.tool) {\n const toolSkills = await this.querySkills({\n tool: context.tool,\n limit: 20,\n offset: 0,\n sortBy: 'priority',\n sortOrder: 'desc',\n });\n\n for (const skill of toolSkills) {\n if (!seenIds.has(skill.id)) {\n skills.push(skill);\n seenIds.add(skill.id);\n }\n }\n }\n\n // Get highly validated skills\n const validatedIds = await this.redis.zrevrange(\n this.key(REDIS_KEYS.skillsValidated(this.userId)),\n 0,\n 10\n );\n\n for (const id of validatedIds) {\n if (!seenIds.has(id)) {\n const skill = await this.getSkill(id);\n if (skill) {\n skills.push(skill);\n seenIds.add(id);\n }\n }\n }\n\n return skills.slice(0, 50); // Cap at 50 skills\n }\n\n // ============================================================\n // SESSION JOURNAL\n // ============================================================\n\n /**\n * Create a journal entry\n */\n async createJournalEntry(\n sessionId: string,\n type: JournalEntryType,\n title: string,\n content: string,\n context?: JournalEntry['context']\n ): Promise<JournalEntry> {\n const entry: JournalEntry = {\n id: uuidv4(),\n sessionId,\n type,\n title,\n content,\n context,\n createdAt: new Date().toISOString(),\n };\n\n // Validate\n JournalEntrySchema.parse(entry);\n\n const pipeline = this.redis.pipeline();\n\n // Store entry\n pipeline.setex(\n this.key(REDIS_KEYS.journalEntry(this.userId, entry.id)),\n CACHE_TTL.journal,\n JSON.stringify(entry)\n );\n\n // Index by session\n pipeline.zadd(\n this.key(REDIS_KEYS.journalSession(this.userId, sessionId)),\n Date.now(),\n entry.id\n );\n\n // Add to recent journal\n pipeline.zadd(\n this.key(REDIS_KEYS.journalRecent(this.userId)),\n Date.now(),\n entry.id\n );\n pipeline.zremrangebyrank(\n this.key(REDIS_KEYS.journalRecent(this.userId)),\n 0,\n -501\n ); // Keep last 500\n\n await pipeline.exec();\n\n logger.info('Created journal entry', {\n userId: this.userId,\n id: entry.id,\n sessionId,\n type,\n title,\n });\n\n return entry;\n }\n\n /**\n * Get journal entries for a session\n */\n async getSessionJournal(sessionId: string): Promise<JournalEntry[]> {\n const entryIds = await this.redis.zrevrange(\n this.key(REDIS_KEYS.journalSession(this.userId, sessionId)),\n 0,\n -1\n );\n\n if (entryIds.length === 0) {\n return [];\n }\n\n const pipeline = this.redis.pipeline();\n for (const id of entryIds) {\n pipeline.get(this.key(REDIS_KEYS.journalEntry(this.userId, id)));\n }\n\n const results = await pipeline.exec();\n if (!results) {\n return [];\n }\n\n return results\n .map(([err, data]) => {\n if (err || !data) return null;\n try {\n return JSON.parse(data as string) as JournalEntry;\n } catch {\n return null;\n }\n })\n .filter((e): e is JournalEntry => e !== null);\n }\n\n /**\n * Promote a journal entry to a skill\n */\n async promoteToSkill(\n entryId: string,\n category: SkillCategory,\n priority: SkillPriority = 'medium'\n ): Promise<Skill | null> {\n const entryData = await this.redis.get(\n this.key(REDIS_KEYS.journalEntry(this.userId, entryId))\n );\n\n if (!entryData) {\n return null;\n }\n\n const entry = JSON.parse(entryData) as JournalEntry;\n\n const skill = await this.createSkill({\n content: entry.content,\n summary: entry.title,\n category,\n priority,\n tags: [],\n tool: entry.context?.tool,\n source: 'observation',\n sessionId: entry.sessionId,\n });\n\n // Update entry with promotion reference\n entry.promotedToSkillId = skill.id;\n await this.redis.setex(\n this.key(REDIS_KEYS.journalEntry(this.userId, entryId)),\n CACHE_TTL.journal,\n JSON.stringify(entry)\n );\n\n logger.info('Promoted journal entry to skill', {\n userId: this.userId,\n entryId,\n skillId: skill.id,\n });\n\n return skill;\n }\n\n // ============================================================\n // SESSION MANAGEMENT\n // ============================================================\n\n /**\n * Start tracking a new session\n */\n async startSession(sessionId: string): Promise<void> {\n const summary: SessionSummary = {\n sessionId,\n startedAt: new Date().toISOString(),\n entriesCount: 0,\n correctionsCount: 0,\n decisionsCount: 0,\n keyLearnings: [],\n promotedSkillIds: [],\n };\n\n await this.redis.setex(\n this.key(REDIS_KEYS.sessionSummary(this.userId, sessionId)),\n CACHE_TTL.session,\n JSON.stringify(summary)\n );\n\n await this.redis.sadd(\n this.key(REDIS_KEYS.sessionsActive(this.userId)),\n sessionId\n );\n\n logger.info('Started session tracking', { userId: this.userId, sessionId });\n }\n\n /**\n * End a session and generate summary\n */\n async endSession(sessionId: string): Promise<SessionSummary | null> {\n const summaryData = await this.redis.get(\n this.key(REDIS_KEYS.sessionSummary(this.userId, sessionId))\n );\n\n if (!summaryData) {\n return null;\n }\n\n const summary = JSON.parse(summaryData) as SessionSummary;\n summary.endedAt = new Date().toISOString();\n\n // Count entries by type\n const entries = await this.getSessionJournal(sessionId);\n summary.entriesCount = entries.length;\n summary.correctionsCount = entries.filter(\n (e) => e.type === 'correction'\n ).length;\n summary.decisionsCount = entries.filter(\n (e) => e.type === 'decision'\n ).length;\n\n // Extract key learnings\n summary.keyLearnings = entries\n .filter((e) => e.type === 'correction' || e.type === 'resolution')\n .slice(0, 5)\n .map((e) => e.title);\n\n // Get promoted skills\n summary.promotedSkillIds = entries\n .filter((e) => e.promotedToSkillId)\n .map((e) => e.promotedToSkillId!);\n\n await this.redis.setex(\n this.key(REDIS_KEYS.sessionSummary(this.userId, sessionId)),\n CACHE_TTL.session,\n JSON.stringify(summary)\n );\n\n await this.redis.srem(\n this.key(REDIS_KEYS.sessionsActive(this.userId)),\n sessionId\n );\n\n logger.info('Ended session', {\n userId: this.userId,\n sessionId,\n entriesCount: summary.entriesCount,\n keyLearnings: summary.keyLearnings.length,\n });\n\n return summary;\n }\n\n /**\n * Get session summary\n */\n async getSessionSummary(sessionId: string): Promise<SessionSummary | null> {\n const data = await this.redis.get(\n this.key(REDIS_KEYS.sessionSummary(this.userId, sessionId))\n );\n\n if (!data) {\n return null;\n }\n\n return JSON.parse(data) as SessionSummary;\n }\n\n // ============================================================\n // KNOWLEDGE HYGIENE\n // ============================================================\n\n /**\n * Get skills eligible for promotion\n */\n async getPromotionCandidates(): Promise<Skill[]> {\n const ids = await this.redis.smembers(\n this.key(REDIS_KEYS.promotionCandidates(this.userId))\n );\n\n const skills: Skill[] = [];\n for (const id of ids) {\n const skill = await this.getSkill(id);\n if (skill && skill.validatedCount >= 3) {\n skills.push(skill);\n }\n }\n\n return skills;\n }\n\n /**\n * Promote a skill (increase priority)\n */\n async promoteSkill(id: string): Promise<Skill | null> {\n const skill = await this.getSkill(id);\n if (!skill) {\n return null;\n }\n\n const priorityOrder: SkillPriority[] = [\n 'low',\n 'medium',\n 'high',\n 'critical',\n ];\n const currentIndex = priorityOrder.indexOf(skill.priority);\n\n if (currentIndex < priorityOrder.length - 1) {\n skill.priority = priorityOrder[currentIndex + 1];\n skill.updatedAt = new Date().toISOString();\n\n await this.redis.setex(\n this.key(REDIS_KEYS.skill(this.userId, id)),\n calculateSkillTTL(skill.validatedCount),\n JSON.stringify(skill)\n );\n\n // Update category index with new score\n await this.redis.zadd(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, skill.category)),\n this.priorityScore(skill.priority),\n id\n );\n\n // Remove from promotion candidates if now critical\n if (skill.priority === 'critical') {\n await this.redis.srem(\n this.key(REDIS_KEYS.promotionCandidates(this.userId)),\n id\n );\n }\n\n logger.info('Promoted skill', {\n userId: this.userId,\n id,\n newPriority: skill.priority,\n });\n }\n\n return skill;\n }\n\n /**\n * Archive stale skills (not validated in 90 days)\n */\n async archiveStaleSkills(daysThreshold: number = 90): Promise<number> {\n const cutoff = Date.now() - daysThreshold * 24 * 60 * 60 * 1000;\n let archivedCount = 0;\n\n // Get all recent skills\n const skillIds = await this.redis.zrangebyscore(\n this.key(REDIS_KEYS.skillsRecent(this.userId)),\n 0,\n cutoff\n );\n\n for (const id of skillIds) {\n const skill = await this.getSkill(id);\n if (skill && skill.priority !== 'critical') {\n // Check if it was validated recently\n if (\n !skill.lastValidated ||\n new Date(skill.lastValidated).getTime() < cutoff\n ) {\n // Downgrade to low priority instead of deleting\n if (skill.priority !== 'low') {\n skill.priority = 'low';\n skill.updatedAt = new Date().toISOString();\n await this.redis.setex(\n this.key(REDIS_KEYS.skill(this.userId, id)),\n calculateSkillTTL(skill.validatedCount),\n JSON.stringify(skill)\n );\n archivedCount++;\n }\n }\n }\n }\n\n logger.info('Archived stale skills', {\n userId: this.userId,\n archivedCount,\n daysThreshold,\n });\n\n return archivedCount;\n }\n\n // ============================================================\n // METRICS & UTILITIES\n // ============================================================\n\n /**\n * Get storage metrics\n */\n async getMetrics(): Promise<SkillStorageMetrics> {\n const [\n skillsTotal,\n toolSkills,\n workflowSkills,\n correctionSkills,\n patternSkills,\n preferenceSkills,\n pitfallSkills,\n optimizationSkills,\n journalTotal,\n sessionsActive,\n ] = await Promise.all([\n this.redis.zcard(this.key(REDIS_KEYS.skillsRecent(this.userId))),\n this.redis.zcard(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'tool'))\n ),\n this.redis.zcard(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'workflow'))\n ),\n this.redis.zcard(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'correction'))\n ),\n this.redis.zcard(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'pattern'))\n ),\n this.redis.zcard(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'preference'))\n ),\n this.redis.zcard(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'pitfall'))\n ),\n this.redis.zcard(\n this.key(REDIS_KEYS.skillsByCategory(this.userId, 'optimization'))\n ),\n this.redis.zcard(this.key(REDIS_KEYS.journalRecent(this.userId))),\n this.redis.scard(this.key(REDIS_KEYS.sessionsActive(this.userId))),\n ]);\n\n return {\n userId: this.userId,\n skillsTotal,\n skillsByCategory: {\n tool: toolSkills,\n workflow: workflowSkills,\n correction: correctionSkills,\n pattern: patternSkills,\n preference: preferenceSkills,\n pitfall: pitfallSkills,\n optimization: optimizationSkills,\n },\n journalEntriesTotal: journalTotal,\n sessionsTracked: sessionsActive,\n cacheHits: this.metrics.cacheHits,\n cacheMisses: this.metrics.cacheMisses,\n };\n }\n\n /**\n * Priority to numeric score for sorting\n */\n private priorityScore(priority: SkillPriority): number {\n const scores: Record<SkillPriority, number> = {\n critical: 1000,\n high: 100,\n medium: 10,\n low: 1,\n };\n return scores[priority];\n }\n\n /**\n * Close Redis connection\n */\n async close(): Promise<void> {\n await this.redis.quit();\n logger.info('SkillStorageService closed');\n }\n}\n\n// ============================================================\n// SINGLETON INSTANCES (per user)\n// ============================================================\n\nconst userStorageInstances = new Map<string, SkillStorageService>();\n\n/**\n * Get or create skill storage instance for a user\n */\nexport function getSkillStorage(\n config: SkillStorageConfig\n): SkillStorageService {\n const existing = userStorageInstances.get(config.userId);\n if (existing) {\n return existing;\n }\n\n const instance = new SkillStorageService(config);\n userStorageInstances.set(config.userId, instance);\n return instance;\n}\n\n/**\n * Initialize skill storage with Redis URL from environment\n */\nexport function initializeSkillStorage(\n userId: string,\n redisUrl?: string\n): SkillStorageService {\n const url = redisUrl || process.env['REDIS_URL'];\n\n if (!url) {\n throw new Error('REDIS_URL environment variable not set');\n }\n\n return getSkillStorage({ redisUrl: url, userId });\n}\n\n/**\n * Get default user ID from environment or generate one\n */\nexport function getDefaultUserId(): string {\n return (\n process.env['STACKMEMORY_USER_ID'] ||\n process.env['USER'] ||\n process.env['USERNAME'] ||\n 'default'\n );\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/skills/types.ts"],
4
- "sourcesContent": ["/**\n * Skill Storage Types\n * Types for persistent agent learning and skill memory\n */\n\nimport { z } from 'zod';\n\n// ============================================================\n// SKILL SCHEMAS\n// ============================================================\n\n/**\n * Skill category for organization\n */\nexport const SkillCategorySchema = z.enum([\n 'tool', // Tool-specific patterns\n 'workflow', // Process/workflow improvements\n 'correction', // User corrections to remember\n 'pattern', // Code/architecture patterns\n 'preference', // User preferences\n 'pitfall', // Things to avoid\n 'optimization', // Performance/efficiency tips\n]);\n\nexport type SkillCategory = z.infer<typeof SkillCategorySchema>;\n\n/**\n * Skill priority for retrieval ordering\n */\nexport const SkillPrioritySchema = z.enum([\n 'critical', // Always include in context\n 'high', // Include when relevant\n 'medium', // Include if space permits\n 'low', // Archive/reference only\n]);\n\nexport type SkillPriority = z.infer<typeof SkillPrioritySchema>;\n\n/**\n * Individual skill/learning entry\n */\nexport const SkillSchema = z.object({\n id: z.string().uuid(),\n\n // Content\n content: z.string().min(1).max(5000),\n summary: z.string().max(500).optional(),\n\n // Classification\n category: SkillCategorySchema,\n priority: SkillPrioritySchema.default('medium'),\n tags: z.array(z.string()).default([]),\n\n // Context\n tool: z.string().optional(), // Related tool name\n project: z.string().optional(), // Project context\n language: z.string().optional(), // Programming language\n framework: z.string().optional(), // Framework context\n\n // Validation tracking\n validatedCount: z.number().int().min(0).default(0),\n lastValidated: z.string().datetime().optional(),\n\n // Lifecycle\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n expiresAt: z.string().datetime().optional(),\n\n // Source tracking\n source: z.enum(['correction', 'observation', 'explicit', 'inferred']),\n sessionId: z.string().optional(),\n});\n\nexport type Skill = z.infer<typeof SkillSchema>;\n\n/**\n * Skill creation input\n */\nexport const CreateSkillSchema = SkillSchema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n validatedCount: true,\n});\n\nexport type CreateSkillInput = z.infer<typeof CreateSkillSchema>;\n\n/**\n * Skill update input\n */\nexport const UpdateSkillSchema = SkillSchema.partial().extend({\n id: z.string().uuid(),\n});\n\nexport type UpdateSkillInput = z.infer<typeof UpdateSkillSchema>;\n\n// ============================================================\n// SESSION JOURNAL SCHEMAS\n// ============================================================\n\n/**\n * Session journal entry type\n */\nexport const JournalEntryTypeSchema = z.enum([\n 'decision', // Architectural/design decision\n 'correction', // User corrected agent behavior\n 'blocker', // Issue encountered\n 'resolution', // How an issue was resolved\n 'observation', // Noticed pattern or behavior\n 'outcome', // Result of an action\n]);\n\nexport type JournalEntryType = z.infer<typeof JournalEntryTypeSchema>;\n\n/**\n * Session journal entry\n */\nexport const JournalEntrySchema = z.object({\n id: z.string().uuid(),\n sessionId: z.string(),\n type: JournalEntryTypeSchema,\n\n // Content\n title: z.string().max(200),\n content: z.string().max(5000),\n\n // Context\n context: z\n .object({\n file: z.string().optional(),\n tool: z.string().optional(),\n command: z.string().optional(),\n })\n .optional(),\n\n // Outcome tracking\n outcome: z.enum(['success', 'failure', 'partial', 'pending']).optional(),\n\n // Timestamps\n createdAt: z.string().datetime(),\n\n // Link to promoted skill\n promotedToSkillId: z.string().uuid().optional(),\n});\n\nexport type JournalEntry = z.infer<typeof JournalEntrySchema>;\n\n/**\n * Session summary\n */\nexport const SessionSummarySchema = z.object({\n sessionId: z.string(),\n startedAt: z.string().datetime(),\n endedAt: z.string().datetime().optional(),\n\n // Stats\n entriesCount: z.number().int().min(0),\n correctionsCount: z.number().int().min(0),\n decisionsCount: z.number().int().min(0),\n\n // Key learnings from this session\n keyLearnings: z.array(z.string()).default([]),\n\n // Skills promoted from this session\n promotedSkillIds: z.array(z.string().uuid()).default([]),\n});\n\nexport type SessionSummary = z.infer<typeof SessionSummarySchema>;\n\n// ============================================================\n// QUERY SCHEMAS\n// ============================================================\n\n/**\n * Skill query filters\n */\nexport const SkillQuerySchema = z.object({\n // Filter by classification\n categories: z.array(SkillCategorySchema).optional(),\n priorities: z.array(SkillPrioritySchema).optional(),\n tags: z.array(z.string()).optional(),\n\n // Filter by context\n tool: z.string().optional(),\n project: z.string().optional(),\n language: z.string().optional(),\n framework: z.string().optional(),\n\n // Filter by validation\n minValidatedCount: z.number().int().min(0).optional(),\n\n // Pagination\n limit: z.number().int().min(1).max(100).default(50),\n offset: z.number().int().min(0).default(0),\n\n // Sorting\n sortBy: z\n .enum(['priority', 'validatedCount', 'createdAt', 'updatedAt'])\n .default('priority'),\n sortOrder: z.enum(['asc', 'desc']).default('desc'),\n});\n\nexport type SkillQuery = z.infer<typeof SkillQuerySchema>;\n\n// ============================================================\n// REDIS KEY PATTERNS\n// ============================================================\n\n/**\n * Redis key generators - all keys are namespaced by userId\n * Use 'global' as userId for shared/team skills\n */\nexport const REDIS_KEYS = {\n // Skills (namespaced by user)\n skill: (userId: string, id: string) => `user:${userId}:skill:${id}`,\n skillsByTool: (userId: string, tool: string) =>\n `user:${userId}:skills:tool:${tool}`,\n skillsByCategory: (userId: string, category: SkillCategory) =>\n `user:${userId}:skills:category:${category}`,\n skillsByTag: (userId: string, tag: string) =>\n `user:${userId}:skills:tag:${tag}`,\n skillsRecent: (userId: string) => `user:${userId}:skills:recent`,\n skillsValidated: (userId: string) => `user:${userId}:skills:validated`,\n\n // Session journal (namespaced by user)\n journalEntry: (userId: string, id: string) =>\n `user:${userId}:journal:entry:${id}`,\n journalSession: (userId: string, sessionId: string) =>\n `user:${userId}:journal:session:${sessionId}`,\n journalRecent: (userId: string) => `user:${userId}:journal:recent`,\n\n // Session tracking (namespaced by user)\n sessionSummary: (userId: string, sessionId: string) =>\n `user:${userId}:session:summary:${sessionId}`,\n sessionsActive: (userId: string) => `user:${userId}:sessions:active`,\n\n // Promotion tracking (namespaced by user)\n promotionCandidates: (userId: string) =>\n `user:${userId}:skills:promotion:candidates`,\n\n // Locks (global)\n syncLock: (resource: string) => `lock:skill:${resource}`,\n} as const;\n\n// ============================================================\n// CACHE TTL CONSTANTS (in seconds)\n// ============================================================\n\nexport const CACHE_TTL = {\n // Base skill TTL: 7 days minimum\n skillBase: 604800, // 7 days\n // Max skill TTL: 90 days for frequently used skills\n skillMax: 7776000, // 90 days\n // TTL increment per validation/use: +7 days\n skillIncrement: 604800, // 7 days\n\n skillIndex: 86400, // 1 day (was 1 hour)\n session: 604800, // 7 days\n journal: 2592000, // 30 days\n lock: 30, // 30 seconds\n} as const;\n\n/**\n * Calculate TTL for a skill based on usage\n * Base: 7 days, +7 days per validation, max 90 days\n */\nexport function calculateSkillTTL(validatedCount: number): number {\n const ttl = CACHE_TTL.skillBase + validatedCount * CACHE_TTL.skillIncrement;\n return Math.min(ttl, CACHE_TTL.skillMax);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }