@stackmemoryai/stackmemory 0.5.57 → 0.5.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/codex-smd +6 -0
- package/dist/cli/codex-sm-danger.js +21 -0
- package/dist/cli/codex-sm-danger.js.map +7 -0
- package/dist/cli/commands/handoff.js +33 -3
- package/dist/cli/commands/handoff.js.map +2 -2
- package/dist/cli/commands/search.js +20 -3
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +13 -3
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/errors/error-utils.js +208 -0
- package/dist/core/errors/error-utils.js.map +7 -0
- package/dist/core/errors/index.js +13 -4
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/merge/unified-merge-resolver.js +303 -0
- package/dist/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/core/monitoring/logger.js +61 -9
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/security/index.js +35 -0
- package/dist/core/security/index.js.map +7 -0
- package/dist/core/security/input-sanitizer.js +321 -0
- package/dist/core/security/input-sanitizer.js.map +7 -0
- package/dist/core/session/enhanced-handoff.js +136 -2
- package/dist/core/session/enhanced-handoff.js.map +3 -3
- package/dist/integrations/linear/client.js +5 -1
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/mcp/remote-server.js +27 -36
- package/dist/integrations/mcp/remote-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +44 -29
- package/dist/integrations/mcp/server.js.map +3 -3
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js +527 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js +133 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js +252 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js +321 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js +21 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1156 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js +21 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js +349 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js +232 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js +180 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js +68 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js +202 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js +445 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js +751 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js +343 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js +392 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js +210 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js +147 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js +266 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js +279 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js +624 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js +298 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js +529 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js +169 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js +172 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js +240 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js +533 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js +536 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js +199 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js +909 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js +248 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js +749 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js +200 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js +306 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js +701 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js +249 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js +50 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js +470 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js +795 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js +183 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js +249 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js +213 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js +319 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +594 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js +448 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js +96 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js +398 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js +76 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js +115 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js +144 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js +80 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js +870 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js +994 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js +479 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js +250 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js +778 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js +302 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js +314 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/frame-types.js +5 -0
- package/dist/src/core/context/frame-types.js.map +7 -0
- package/dist/src/core/context/index.js +25 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js +185 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js +592 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js +754 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js +621 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js +749 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js +130 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js +384 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js +330 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js +60 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js +614 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js +298 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js +430 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js +176 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js +25 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js +269 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js +258 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js +319 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js +431 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js +558 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js +532 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/types.js +5 -0
- package/dist/src/core/merge/types.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js +232 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js +340 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js +49 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js +172 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js +189 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js +300 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js +273 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js +11 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js +327 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js +221 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js +345 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js +277 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js +370 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js +349 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js +201 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js +697 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js +370 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js +321 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js +479 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js +151 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js +236 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js +589 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js +21 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js +465 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js +792 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js +343 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js +15 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js +347 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js +764 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js +193 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +354 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js +510 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js +489 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js +766 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js +247 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js +417 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js +109 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js +178 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js +528 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js +345 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js +77 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js +114 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js +83 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js +218 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js +465 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js +149 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js +122 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js +136 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js +312 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js +276 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js +287 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js +282 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js +18 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/analytics/types/metrics.js +5 -0
- package/dist/src/features/analytics/types/metrics.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js +492 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js +20 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js +155 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js +85 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js +171 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js +87 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js +88 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js +226 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js +38 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js +18 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js +487 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js +410 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js +116 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js +648 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js +26 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js +194 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js +151 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js +150 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js +364 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js +58 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js +186 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js +197 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js +49 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js +155 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js +222 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js +371 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js +506 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js +93 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js +555 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js +479 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js +317 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js +409 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js +263 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js +511 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js +337 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js +258 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js +130 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js +361 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js +454 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js +213 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js +236 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js +231 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js +782 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/types.js +5 -0
- package/dist/src/integrations/linear/types.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js +589 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js +219 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js +218 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js +291 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js +166 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js +23 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js +374 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js +147 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js +702 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js +18 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/types.js.map +7 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js +289 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js +358 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js +528 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js +65 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js +194 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js +354 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js +475 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js +1061 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js +216 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +609 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js +5 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js +50 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js +62 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js +136 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +4 -3
- package/scripts/create-cleanup-issues.js +302 -0
- package/scripts/demos/browser-test.ts +39 -0
- package/scripts/demos/ralph-integration-demo.ts +244 -0
- package/scripts/demos/trace-demo.ts +214 -0
- package/scripts/demos/trace-detector.demo.ts +171 -0
- package/scripts/demos/trace-test.ts +67 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-claude-config.sh +123 -0
- package/scripts/validate-claude-config.sh +155 -0
package/bin/codex-smd
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
3
|
+
import { dirname as __pathDirname } from 'path';
|
|
4
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = __pathDirname(__filename);
|
|
6
|
+
import { spawn } from "child_process";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
const codexSmPath = path.join(__dirname, "codex-sm.js");
|
|
9
|
+
const args = ["--dangerously-skip-permissions", ...process.argv.slice(2)];
|
|
10
|
+
const child = spawn("node", [codexSmPath, ...args], {
|
|
11
|
+
stdio: "inherit",
|
|
12
|
+
env: process.env
|
|
13
|
+
});
|
|
14
|
+
child.on("exit", (code) => {
|
|
15
|
+
process.exit(code || 0);
|
|
16
|
+
});
|
|
17
|
+
child.on("error", (err) => {
|
|
18
|
+
console.error("Failed to launch codex-sm:", err.message);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=codex-sm-danger.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/cli/codex-sm-danger.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\n/**\n * codex-sm-danger: Codex-SM wrapper with --dangerously-skip-permissions\n * Shorthand for: codex-sm --dangerously-skip-permissions [args]\n */\n\nimport { spawn } from 'child_process';\nimport * as path from 'path';\n\n// __filename and __dirname are provided by esbuild banner for ESM compatibility\n\n// Get the codex-sm script path\nconst codexSmPath = path.join(__dirname, 'codex-sm.js');\n\n// Prepend the danger flag to all args\nconst args = ['--dangerously-skip-permissions', ...process.argv.slice(2)];\n\n// Spawn codex-sm with the danger flag\nconst child = spawn('node', [codexSmPath, ...args], {\n stdio: 'inherit',\n env: process.env,\n});\n\nchild.on('exit', (code) => {\n process.exit(code || 0);\n});\n\nchild.on('error', (err) => {\n console.error('Failed to launch codex-sm:', err.message);\n process.exit(1);\n});\n"],
|
|
5
|
+
"mappings": ";;;;;AAOA,SAAS,aAAa;AACtB,YAAY,UAAU;AAKtB,MAAM,cAAc,KAAK,KAAK,WAAW,aAAa;AAGtD,MAAM,OAAO,CAAC,kCAAkC,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC;AAGxE,MAAM,QAAQ,MAAM,QAAQ,CAAC,aAAa,GAAG,IAAI,GAAG;AAAA,EAClD,OAAO;AAAA,EACP,KAAK,QAAQ;AACf,CAAC;AAED,MAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,UAAQ,KAAK,QAAQ,CAAC;AACxB,CAAC;AAED,MAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,UAAQ,MAAM,8BAA8B,IAAI,OAAO;AACvD,UAAQ,KAAK,CAAC;AAChB,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -20,6 +20,7 @@ import { FrameManager } from "../../core/context/index.js";
|
|
|
20
20
|
import { LinearTaskManager } from "../../features/tasks/linear-task-manager.js";
|
|
21
21
|
import { logger } from "../../core/monitoring/logger.js";
|
|
22
22
|
import { EnhancedHandoffGenerator } from "../../core/session/enhanced-handoff.js";
|
|
23
|
+
const countTokens = (text) => Math.ceil(text.length / 3.5);
|
|
23
24
|
const MAX_HANDOFF_VERSIONS = 10;
|
|
24
25
|
function saveVersionedHandoff(projectRoot, branch, content) {
|
|
25
26
|
const handoffsDir = join(projectRoot, ".stackmemory", "handoffs");
|
|
@@ -56,7 +57,10 @@ const CommitMessageSchema = z.string().min(1, "Commit message cannot be empty").
|
|
|
56
57
|
);
|
|
57
58
|
function createCaptureCommand() {
|
|
58
59
|
const cmd = new Command("capture");
|
|
59
|
-
cmd.description("Commit current work and generate a handoff prompt").option("-m, --message <message>", "Custom commit message").option("--no-commit", "Skip git commit").option("--copy", "Copy the handoff prompt to clipboard").option("--basic", "Use basic handoff format instead of enhanced").
|
|
60
|
+
cmd.description("Commit current work and generate a handoff prompt").option("-m, --message <message>", "Custom commit message").option("--no-commit", "Skip git commit").option("--copy", "Copy the handoff prompt to clipboard").option("--basic", "Use basic handoff format instead of enhanced").option("--verbose", "Use verbose handoff format (full markdown)").option("--ultra", "Use ultra-compact pipe-delimited format").option(
|
|
61
|
+
"--format <format>",
|
|
62
|
+
"Output format: auto, ultra, compact, verbose (default: auto)"
|
|
63
|
+
).action(async (options) => {
|
|
60
64
|
try {
|
|
61
65
|
const projectRoot = process.cwd();
|
|
62
66
|
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
@@ -236,8 +240,34 @@ Generated by stackmemory capture at ${timestamp}
|
|
|
236
240
|
} else {
|
|
237
241
|
const enhancedGenerator = new EnhancedHandoffGenerator(projectRoot);
|
|
238
242
|
const enhancedHandoff = await enhancedGenerator.generate();
|
|
239
|
-
|
|
240
|
-
|
|
243
|
+
let format = "auto";
|
|
244
|
+
if (options.verbose) {
|
|
245
|
+
format = "verbose";
|
|
246
|
+
} else if (options.ultra) {
|
|
247
|
+
format = "ultra";
|
|
248
|
+
} else if (options.format) {
|
|
249
|
+
format = options.format;
|
|
250
|
+
}
|
|
251
|
+
if (format === "auto") {
|
|
252
|
+
const selectedFormat = enhancedGenerator.selectFormat(enhancedHandoff);
|
|
253
|
+
handoffPrompt = enhancedGenerator.toAutoFormat(enhancedHandoff);
|
|
254
|
+
const actualTokens = countTokens(handoffPrompt);
|
|
255
|
+
console.log(
|
|
256
|
+
`Estimated tokens: ~${actualTokens} (${selectedFormat}, auto-selected)`
|
|
257
|
+
);
|
|
258
|
+
} else if (format === "ultra") {
|
|
259
|
+
handoffPrompt = enhancedGenerator.toUltraCompact(enhancedHandoff);
|
|
260
|
+
const actualTokens = countTokens(handoffPrompt);
|
|
261
|
+
console.log(`Estimated tokens: ~${actualTokens} (ultra-compact)`);
|
|
262
|
+
} else if (format === "verbose") {
|
|
263
|
+
handoffPrompt = enhancedGenerator.toMarkdown(enhancedHandoff);
|
|
264
|
+
const actualTokens = countTokens(handoffPrompt);
|
|
265
|
+
console.log(`Estimated tokens: ~${actualTokens} (verbose)`);
|
|
266
|
+
} else {
|
|
267
|
+
handoffPrompt = enhancedGenerator.toCompact(enhancedHandoff);
|
|
268
|
+
const actualTokens = countTokens(handoffPrompt);
|
|
269
|
+
console.log(`Estimated tokens: ~${actualTokens} (compact)`);
|
|
270
|
+
}
|
|
241
271
|
}
|
|
242
272
|
const stackmemoryDir = join(projectRoot, ".stackmemory");
|
|
243
273
|
if (!existsSync(stackmemoryDir)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/commands/handoff.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Handoff command - Commits work and generates a prompt for the next session\n */\n\nimport { Command } from 'commander';\nimport { execSync, execFileSync, spawn, ChildProcess } from 'child_process';\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n readdirSync,\n unlinkSync,\n} from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport Database from 'better-sqlite3';\nimport { z } from 'zod';\nimport { FrameManager } from '../../core/context/index.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { EnhancedHandoffGenerator } from '../../core/session/enhanced-handoff.js';\n\n// Handoff versioning - keep last N handoffs\nconst MAX_HANDOFF_VERSIONS = 10;\n\nfunction saveVersionedHandoff(\n projectRoot: string,\n branch: string,\n content: string\n): string {\n const handoffsDir = join(projectRoot, '.stackmemory', 'handoffs');\n if (!existsSync(handoffsDir)) {\n mkdirSync(handoffsDir, { recursive: true });\n }\n\n // Generate versioned filename: YYYY-MM-DD-HH-mm-branch.md\n const now = new Date();\n const timestamp = now.toISOString().slice(0, 16).replace(/[T:]/g, '-');\n const safeBranch = branch.replace(/[^a-zA-Z0-9-]/g, '-').slice(0, 30);\n const filename = `${timestamp}-${safeBranch}.md`;\n const versionedPath = join(handoffsDir, filename);\n\n // Save versioned handoff\n writeFileSync(versionedPath, content);\n\n // Clean up old handoffs (keep last N)\n try {\n const files = readdirSync(handoffsDir)\n .filter((f) => f.endsWith('.md'))\n .sort()\n .reverse();\n\n for (const oldFile of files.slice(MAX_HANDOFF_VERSIONS)) {\n unlinkSync(join(handoffsDir, oldFile));\n }\n } catch {\n // Cleanup failed, not critical\n }\n\n return versionedPath;\n}\n\n// Input validation schemas\nconst CommitMessageSchema = z\n .string()\n .min(1, 'Commit message cannot be empty')\n .max(200, 'Commit message too long')\n .regex(\n /^[a-zA-Z0-9\\s\\-_.,:()\\/\\[\\]]+$/,\n 'Commit message contains invalid characters'\n )\n .refine(\n (msg) => !msg.includes('\\n'),\n 'Commit message cannot contain newlines'\n )\n .refine(\n (msg) => !msg.includes('\"'),\n 'Commit message cannot contain double quotes'\n )\n .refine(\n (msg) => !msg.includes('`'),\n 'Commit message cannot contain backticks'\n );\n\nexport function createCaptureCommand(): Command {\n const cmd = new Command('capture');\n\n cmd\n .description('Commit current work and generate a handoff prompt')\n .option('-m, --message <message>', 'Custom commit message')\n .option('--no-commit', 'Skip git commit')\n .option('--copy', 'Copy the handoff prompt to clipboard')\n .option('--basic', 'Use basic handoff format instead of enhanced')\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n // 1. Check git status\n let gitStatus = '';\n let hasChanges = false;\n\n try {\n gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n hasChanges = gitStatus.trim().length > 0;\n } catch {\n // Not a git repository - silently skip git operations\n }\n\n // 2. Commit if there are changes and not skipped\n if (hasChanges && options.commit !== false) {\n try {\n // Get current branch\n const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n // Stage all changes\n execSync('git add -A', { cwd: projectRoot });\n\n // Generate or use custom commit message\n let commitMessage =\n options.message ||\n `chore: handoff checkpoint on ${currentBranch}`;\n\n // Validate commit message\n try {\n commitMessage = CommitMessageSchema.parse(commitMessage);\n } catch (validationError) {\n console.error(\n '\u274C Invalid commit message:',\n (validationError as Error).message\n );\n return;\n }\n\n // Commit using execFileSync for safety\n execFileSync('git', ['commit', '-m', commitMessage], {\n cwd: projectRoot,\n stdio: 'inherit',\n });\n\n console.log(`\u2705 Committed changes: \"${commitMessage}\"`);\n console.log(` Branch: ${currentBranch}`);\n } catch (err: unknown) {\n console.error(\n '\u274C Failed to commit changes:',\n (err as Error).message\n );\n }\n } else if (!hasChanges) {\n console.log('\u2139\uFE0F No changes to commit');\n }\n\n // 3. Gather context for handoff prompt\n let contextSummary = '';\n let tasksSummary = '';\n let recentWork = '';\n\n if (existsSync(dbPath)) {\n const db = new Database(dbPath);\n\n // Get recent context\n const frameManager = new FrameManager(db, 'cli-project');\n const activeFrames = frameManager.getActiveFramePath();\n\n if (activeFrames.length > 0) {\n contextSummary = 'Active context frames:\\n';\n activeFrames.forEach((frame) => {\n contextSummary += ` - ${frame.name} [${frame.type}]\\n`;\n });\n }\n\n // Get task status\n const taskStore = new LinearTaskManager(projectRoot, db);\n const activeTasks = taskStore.getActiveTasks();\n\n const inProgress = activeTasks.filter(\n (t: any) => t.status === 'in_progress'\n );\n const todo = activeTasks.filter((t: any) => t.status === 'pending');\n const recentlyCompleted = activeTasks\n .filter((t: any) => t.status === 'completed' && t.completed_at)\n .sort(\n (a: any, b: any) => (b.completed_at || 0) - (a.completed_at || 0)\n )\n .slice(0, 3);\n\n if (inProgress.length > 0 || todo.length > 0) {\n tasksSummary = '\\nTasks:\\n';\n\n if (inProgress.length > 0) {\n tasksSummary += 'In Progress:\\n';\n inProgress.forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n }\n\n if (todo.length > 0) {\n tasksSummary += 'TODO:\\n';\n todo.slice(0, 5).forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n if (todo.length > 5) {\n tasksSummary += ` ... and ${todo.length - 5} more\\n`;\n }\n }\n }\n\n if (recentlyCompleted.length > 0) {\n recentWork = '\\nRecently Completed:\\n';\n recentlyCompleted.forEach((t: any) => {\n recentWork += ` \u2713 ${t.title}\\n`;\n });\n }\n\n // Get recent events\n const recentEvents = db\n .prepare(\n `\n SELECT event_type as type, payload as data, datetime(ts, 'unixepoch') as time\n FROM events\n ORDER BY ts DESC\n LIMIT 5\n `\n )\n .all() as any[];\n\n if (recentEvents.length > 0) {\n recentWork += '\\nRecent Activity:\\n';\n recentEvents.forEach((event) => {\n const data = JSON.parse(event.data);\n recentWork += ` - ${event.type}: ${data.message || data.name || 'activity'}\\n`;\n });\n }\n\n db.close();\n }\n\n // 4. Get current git info\n let gitInfo = '';\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const lastCommit = execSync('git log -1 --oneline', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n gitInfo = `\\nGit Status:\\n Branch: ${branch}\\n Last commit: ${lastCommit}\\n`;\n } catch {\n // Not a git repository - silently ignore\n }\n\n // 5. Check for any blockers or notes\n let notes = '';\n const notesPath = join(projectRoot, '.stackmemory', 'handoff.md');\n if (existsSync(notesPath)) {\n const handoffNotes = readFileSync(notesPath, 'utf-8');\n if (handoffNotes.trim()) {\n notes = `\\nNotes from previous handoff:\\n${handoffNotes}\\n`;\n }\n }\n\n // 6. Generate the handoff prompt\n let handoffPrompt: string;\n\n if (options.basic) {\n // Use basic handoff format\n const timestamp = new Date().toISOString();\n handoffPrompt = `# Session Handoff - ${timestamp}\n\n## Project: ${projectRoot.split('/').pop()}\n\n${gitInfo}\n${contextSummary}\n${tasksSummary}\n${recentWork}\n${notes}\n\n## Continue from here:\n\n1. Run \\`stackmemory status\\` to check the current state\n2. Review any in-progress tasks above\n3. Check for any uncommitted changes with \\`git status\\`\n4. Resume work on the active context\n\n## Quick Commands:\n- \\`stackmemory context load --recent\\` - Load recent context\n- \\`stackmemory task list --state in_progress\\` - Show in-progress tasks\n- \\`stackmemory linear sync\\` - Sync with Linear if configured\n- \\`stackmemory log recent\\` - View recent activity\n\n---\nGenerated by stackmemory capture at ${timestamp}\n`;\n } else {\n // Use high-efficacy enhanced handoff generator (default)\n const enhancedGenerator = new EnhancedHandoffGenerator(projectRoot);\n const enhancedHandoff = await enhancedGenerator.generate();\n handoffPrompt = enhancedGenerator.toMarkdown(enhancedHandoff);\n console.log(`Estimated tokens: ~${enhancedHandoff.estimatedTokens}`);\n }\n\n // 7. Save handoff prompt (both latest and versioned)\n const stackmemoryDir = join(projectRoot, '.stackmemory');\n if (!existsSync(stackmemoryDir)) {\n mkdirSync(stackmemoryDir, { recursive: true });\n }\n const handoffPath = join(stackmemoryDir, 'last-handoff.md');\n writeFileSync(handoffPath, handoffPrompt);\n\n // Save versioned copy\n let branch = 'unknown';\n try {\n branch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n // Not a git repo\n }\n const versionedPath = saveVersionedHandoff(\n projectRoot,\n branch,\n handoffPrompt\n );\n console.log(\n `Versioned: ${versionedPath.split('/').slice(-2).join('/')}`\n );\n\n // 8. Display the prompt\n console.log('\\n' + '='.repeat(60));\n console.log(handoffPrompt);\n console.log('='.repeat(60));\n\n // 9. Copy to clipboard if requested\n if (options.copy) {\n try {\n // Use execFileSync with predefined commands for safety\n if (process.platform === 'darwin') {\n execFileSync('pbcopy', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else if (process.platform === 'win32') {\n execFileSync('clip', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else {\n execFileSync('xclip', ['-selection', 'clipboard'], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n }\n\n console.log('\\n\u2705 Handoff prompt copied to clipboard!');\n } catch {\n console.log('\\n\u26A0\uFE0F Could not copy to clipboard');\n }\n }\n\n console.log(`\\n\uD83D\uDCBE Handoff saved to: ${handoffPath}`);\n console.log('\uD83D\uDCCB Use this prompt when starting your next session');\n } catch (error: unknown) {\n logger.error('Capture command failed', error as Error);\n console.error('\u274C Capture failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nexport function createRestoreCommand(): Command {\n const cmd = new Command('restore');\n\n cmd\n .description('Restore context from last handoff')\n .option('--no-copy', 'Do not copy prompt to clipboard')\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const handoffPath = join(\n projectRoot,\n '.stackmemory',\n 'last-handoff.md'\n );\n const metaPath = join(\n process.env['HOME'] || '~',\n '.stackmemory',\n 'handoffs',\n 'last-handoff-meta.json'\n );\n\n if (!existsSync(handoffPath)) {\n console.log('\u274C No handoff found in this project');\n console.log('\uD83D\uDCA1 Run \"stackmemory capture\" to create one');\n return;\n }\n\n // Read handoff prompt\n const handoffPrompt = readFileSync(handoffPath, 'utf-8');\n\n // Display the prompt\n console.log('\\n' + '='.repeat(60));\n console.log('\uD83D\uDCCB RESTORED HANDOFF');\n console.log('='.repeat(60));\n console.log(handoffPrompt);\n console.log('='.repeat(60));\n\n // Check for metadata\n if (existsSync(metaPath)) {\n const metadata = JSON.parse(readFileSync(metaPath, 'utf-8'));\n console.log('\\n\uD83D\uDCCA Session Metadata:');\n console.log(` Timestamp: ${metadata.timestamp}`);\n console.log(` Reason: ${metadata.reason}`);\n console.log(` Duration: ${metadata.session_duration}s`);\n console.log(` Command: ${metadata.command}`);\n }\n\n // Check current git status\n try {\n const gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (gitStatus) {\n console.log('\\n Current uncommitted changes:');\n console.log(gitStatus);\n }\n } catch {\n // Not a git repo - silently ignore\n }\n\n // Copy to clipboard unless disabled\n if (options.copy !== false) {\n try {\n // Use execFileSync with predefined commands for safety\n if (process.platform === 'darwin') {\n execFileSync('pbcopy', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else if (process.platform === 'win32') {\n execFileSync('clip', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else {\n execFileSync('xclip', ['-selection', 'clipboard'], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n }\n\n console.log('\\n\u2705 Handoff prompt copied to clipboard!');\n } catch {\n console.log('\\n\u26A0\uFE0F Could not copy to clipboard');\n }\n }\n\n console.log('\\n\uD83D\uDE80 Ready to continue where you left off!');\n } catch (error: unknown) {\n logger.error('Restore failed', error as Error);\n console.error('\u274C Restore failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\ninterface AutoCaptureMetadata {\n timestamp: string;\n reason: string;\n exit_code: number;\n command: string;\n pid: number;\n cwd: string;\n user: string;\n session_duration: number;\n}\n\nasync function captureHandoff(\n reason: string,\n exitCode: number,\n wrappedCommand: string,\n sessionStart: number,\n quiet: boolean\n): Promise<void> {\n const projectRoot = process.cwd();\n const handoffDir = join(homedir(), '.stackmemory', 'handoffs');\n const logFile = join(handoffDir, 'auto-handoff.log');\n\n // Ensure handoff directory exists\n if (!existsSync(handoffDir)) {\n mkdirSync(handoffDir, { recursive: true });\n }\n\n const logMessage = (msg: string): void => {\n const timestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');\n const logLine = `[${timestamp}] ${msg}\\n`;\n try {\n writeFileSync(logFile, logLine, { flag: 'a' });\n } catch {\n // Logging failed, continue anyway\n }\n };\n\n if (!quiet) {\n console.log('\\nCapturing handoff context...');\n }\n logMessage(`Capturing handoff: reason=${reason}, exit_code=${exitCode}`);\n\n try {\n // Run stackmemory capture --no-commit\n execFileSync(\n process.execPath,\n [process.argv[1], 'capture', '--no-commit'],\n {\n cwd: projectRoot,\n stdio: quiet ? 'pipe' : 'inherit',\n }\n );\n\n // Save metadata\n const metadata: AutoCaptureMetadata = {\n timestamp: new Date().toISOString(),\n reason,\n exit_code: exitCode,\n command: wrappedCommand,\n pid: process.pid,\n cwd: projectRoot,\n user: process.env['USER'] || 'unknown',\n session_duration: Math.floor((Date.now() - sessionStart) / 1000),\n };\n\n const metadataPath = join(handoffDir, 'last-handoff-meta.json');\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));\n\n if (!quiet) {\n console.log('Handoff captured successfully');\n logMessage(`Handoff captured: ${metadataPath}`);\n\n // Show session summary\n console.log('\\nSession Summary:');\n console.log(` Duration: ${metadata.session_duration} seconds`);\n console.log(` Exit reason: ${reason}`);\n\n // Check for uncommitted changes\n try {\n const gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (gitStatus) {\n console.log('\\nYou have uncommitted changes');\n console.log(' Run \"git status\" to review');\n }\n } catch {\n // Not a git repo - silently ignore\n }\n\n console.log('\\nRun \"stackmemory restore\" in your next session');\n }\n } catch (err) {\n if (!quiet) {\n console.error('Failed to capture handoff:', (err as Error).message);\n }\n logMessage(`ERROR: ${(err as Error).message}`);\n }\n}\n\nexport function createAutoCaptureCommand(): Command {\n const cmd = new Command('auto-capture');\n\n cmd\n .description('Wrap a command with automatic handoff capture on termination')\n .option('-a, --auto', 'Auto-capture on normal exit (no prompt)')\n .option('-q, --quiet', 'Suppress output')\n .option('-t, --tag <tag>', 'Tag this session')\n .argument('[command...]', 'Command to wrap with auto-handoff')\n .action(async (commandArgs: string[], options) => {\n const autoCapture = options.auto || false;\n const quiet = options.quiet || false;\n const tag = options.tag || '';\n\n // If no command provided, show usage\n if (!commandArgs || commandArgs.length === 0) {\n console.log('StackMemory Auto-Handoff');\n console.log('-'.repeat(50));\n console.log('');\n console.log(\n 'Wraps a command with automatic handoff capture on termination.'\n );\n console.log('');\n console.log('Usage:');\n console.log(' stackmemory auto-capture [options] <command> [args...]');\n console.log('');\n console.log('Examples:');\n console.log(' stackmemory auto-capture claude');\n console.log(' stackmemory auto-capture -a npm run dev');\n console.log(' stackmemory auto-capture -t \"feature-work\" vim');\n console.log('');\n console.log('Options:');\n console.log(\n ' -a, --auto Auto-capture on normal exit (no prompt)'\n );\n console.log(' -q, --quiet Suppress output');\n console.log(' -t, --tag <tag> Tag this session');\n return;\n }\n\n const wrappedCommand = commandArgs.join(' ');\n const sessionStart = Date.now();\n let capturedAlready = false;\n\n if (!quiet) {\n console.log('StackMemory Auto-Handoff Wrapper');\n console.log(`Wrapping: ${wrappedCommand}`);\n if (tag) {\n console.log(`Tag: ${tag}`);\n }\n console.log('Handoff will be captured on termination');\n console.log('');\n }\n\n // Spawn the wrapped command\n const [cmd, ...args] = commandArgs;\n let childProcess: ChildProcess;\n\n try {\n childProcess = spawn(cmd, args, {\n stdio: 'inherit',\n shell: false,\n cwd: process.cwd(),\n env: process.env,\n });\n } catch (err) {\n console.error(`Failed to start command: ${(err as Error).message}`);\n process.exit(1);\n return;\n }\n\n // Handle signals - forward to child and capture on termination\n const handleSignal = async (\n signal: NodeJS.Signals,\n exitCode: number\n ): Promise<void> => {\n if (capturedAlready) return;\n capturedAlready = true;\n\n if (!quiet) {\n console.log(`\\nReceived ${signal}`);\n }\n\n // Kill the child process if still running\n if (childProcess.pid && !childProcess.killed) {\n childProcess.kill(signal);\n }\n\n await captureHandoff(\n signal,\n exitCode,\n wrappedCommand,\n sessionStart,\n quiet\n );\n process.exit(exitCode);\n };\n\n process.on('SIGINT', () => handleSignal('SIGINT', 130));\n process.on('SIGTERM', () => handleSignal('SIGTERM', 143));\n process.on('SIGHUP', () => handleSignal('SIGHUP', 129));\n\n // Handle child process exit\n childProcess.on('exit', async (code, signal) => {\n if (capturedAlready) return;\n capturedAlready = true;\n\n const exitCode = code ?? (signal ? 128 : 0);\n\n if (signal) {\n // Child was killed by a signal\n await captureHandoff(\n signal,\n exitCode,\n wrappedCommand,\n sessionStart,\n quiet\n );\n } else if (exitCode !== 0) {\n // Unexpected exit\n if (!quiet) {\n console.log(`\\nCommand exited with code: ${exitCode}`);\n }\n await captureHandoff(\n 'unexpected_exit',\n exitCode,\n wrappedCommand,\n sessionStart,\n quiet\n );\n } else if (autoCapture) {\n // Normal exit with auto-capture enabled\n await captureHandoff(\n 'normal_exit',\n 0,\n wrappedCommand,\n sessionStart,\n quiet\n );\n } else {\n // Normal exit - prompt for capture (simplified for CLI, auto-capture)\n // In non-interactive contexts, default to capturing\n if (process.stdin.isTTY) {\n // Interactive - we could prompt but keeping it simple\n console.log(\n '\\nSession ending. Use -a flag for auto-capture on normal exit.'\n );\n }\n }\n\n process.exit(exitCode);\n });\n\n // Handle spawn errors\n childProcess.on('error', async (err) => {\n if (capturedAlready) return;\n capturedAlready = true;\n\n console.error(`Command error: ${err.message}`);\n await captureHandoff(\n 'spawn_error',\n 1,\n wrappedCommand,\n sessionStart,\n quiet\n );\n process.exit(1);\n });\n });\n\n return cmd;\n}\n\n/** @deprecated Use createCaptureCommand, createRestoreCommand, createAutoCaptureCommand */\nexport function createHandoffCommand(): Command {\n const cmd = new Command('handoff');\n cmd.description('(deprecated) Use \"capture\" or \"restore\" instead');\n return cmd;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Handoff command - Commits work and generates a prompt for the next session\n */\n\nimport { Command } from 'commander';\nimport { execSync, execFileSync, spawn, ChildProcess } from 'child_process';\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n readdirSync,\n unlinkSync,\n} from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport Database from 'better-sqlite3';\nimport { z } from 'zod';\nimport { FrameManager } from '../../core/context/index.js';\nimport { LinearTaskManager } from '../../features/tasks/linear-task-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { EnhancedHandoffGenerator } from '../../core/session/enhanced-handoff.js';\n\n// Simple token estimation (avg 3.5 chars per token for English)\nconst countTokens = (text: string): number => Math.ceil(text.length / 3.5);\n\n// Handoff versioning - keep last N handoffs\nconst MAX_HANDOFF_VERSIONS = 10;\n\nfunction saveVersionedHandoff(\n projectRoot: string,\n branch: string,\n content: string\n): string {\n const handoffsDir = join(projectRoot, '.stackmemory', 'handoffs');\n if (!existsSync(handoffsDir)) {\n mkdirSync(handoffsDir, { recursive: true });\n }\n\n // Generate versioned filename: YYYY-MM-DD-HH-mm-branch.md\n const now = new Date();\n const timestamp = now.toISOString().slice(0, 16).replace(/[T:]/g, '-');\n const safeBranch = branch.replace(/[^a-zA-Z0-9-]/g, '-').slice(0, 30);\n const filename = `${timestamp}-${safeBranch}.md`;\n const versionedPath = join(handoffsDir, filename);\n\n // Save versioned handoff\n writeFileSync(versionedPath, content);\n\n // Clean up old handoffs (keep last N)\n try {\n const files = readdirSync(handoffsDir)\n .filter((f) => f.endsWith('.md'))\n .sort()\n .reverse();\n\n for (const oldFile of files.slice(MAX_HANDOFF_VERSIONS)) {\n unlinkSync(join(handoffsDir, oldFile));\n }\n } catch {\n // Cleanup failed, not critical\n }\n\n return versionedPath;\n}\n\n// Input validation schemas\nconst CommitMessageSchema = z\n .string()\n .min(1, 'Commit message cannot be empty')\n .max(200, 'Commit message too long')\n .regex(\n /^[a-zA-Z0-9\\s\\-_.,:()\\/\\[\\]]+$/,\n 'Commit message contains invalid characters'\n )\n .refine(\n (msg) => !msg.includes('\\n'),\n 'Commit message cannot contain newlines'\n )\n .refine(\n (msg) => !msg.includes('\"'),\n 'Commit message cannot contain double quotes'\n )\n .refine(\n (msg) => !msg.includes('`'),\n 'Commit message cannot contain backticks'\n );\n\nexport function createCaptureCommand(): Command {\n const cmd = new Command('capture');\n\n cmd\n .description('Commit current work and generate a handoff prompt')\n .option('-m, --message <message>', 'Custom commit message')\n .option('--no-commit', 'Skip git commit')\n .option('--copy', 'Copy the handoff prompt to clipboard')\n .option('--basic', 'Use basic handoff format instead of enhanced')\n .option('--verbose', 'Use verbose handoff format (full markdown)')\n .option('--ultra', 'Use ultra-compact pipe-delimited format')\n .option(\n '--format <format>',\n 'Output format: auto, ultra, compact, verbose (default: auto)'\n )\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n // 1. Check git status\n let gitStatus = '';\n let hasChanges = false;\n\n try {\n gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n hasChanges = gitStatus.trim().length > 0;\n } catch {\n // Not a git repository - silently skip git operations\n }\n\n // 2. Commit if there are changes and not skipped\n if (hasChanges && options.commit !== false) {\n try {\n // Get current branch\n const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n // Stage all changes\n execSync('git add -A', { cwd: projectRoot });\n\n // Generate or use custom commit message\n let commitMessage =\n options.message ||\n `chore: handoff checkpoint on ${currentBranch}`;\n\n // Validate commit message\n try {\n commitMessage = CommitMessageSchema.parse(commitMessage);\n } catch (validationError) {\n console.error(\n '\u274C Invalid commit message:',\n (validationError as Error).message\n );\n return;\n }\n\n // Commit using execFileSync for safety\n execFileSync('git', ['commit', '-m', commitMessage], {\n cwd: projectRoot,\n stdio: 'inherit',\n });\n\n console.log(`\u2705 Committed changes: \"${commitMessage}\"`);\n console.log(` Branch: ${currentBranch}`);\n } catch (err: unknown) {\n console.error(\n '\u274C Failed to commit changes:',\n (err as Error).message\n );\n }\n } else if (!hasChanges) {\n console.log('\u2139\uFE0F No changes to commit');\n }\n\n // 3. Gather context for handoff prompt\n let contextSummary = '';\n let tasksSummary = '';\n let recentWork = '';\n\n if (existsSync(dbPath)) {\n const db = new Database(dbPath);\n\n // Get recent context\n const frameManager = new FrameManager(db, 'cli-project');\n const activeFrames = frameManager.getActiveFramePath();\n\n if (activeFrames.length > 0) {\n contextSummary = 'Active context frames:\\n';\n activeFrames.forEach((frame) => {\n contextSummary += ` - ${frame.name} [${frame.type}]\\n`;\n });\n }\n\n // Get task status\n const taskStore = new LinearTaskManager(projectRoot, db);\n const activeTasks = taskStore.getActiveTasks();\n\n const inProgress = activeTasks.filter(\n (t: any) => t.status === 'in_progress'\n );\n const todo = activeTasks.filter((t: any) => t.status === 'pending');\n const recentlyCompleted = activeTasks\n .filter((t: any) => t.status === 'completed' && t.completed_at)\n .sort(\n (a: any, b: any) => (b.completed_at || 0) - (a.completed_at || 0)\n )\n .slice(0, 3);\n\n if (inProgress.length > 0 || todo.length > 0) {\n tasksSummary = '\\nTasks:\\n';\n\n if (inProgress.length > 0) {\n tasksSummary += 'In Progress:\\n';\n inProgress.forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n }\n\n if (todo.length > 0) {\n tasksSummary += 'TODO:\\n';\n todo.slice(0, 5).forEach((t: any) => {\n const externalId = t.external_refs?.linear?.id;\n tasksSummary += ` - ${t.title}${externalId ? ` [${externalId}]` : ''}\\n`;\n });\n if (todo.length > 5) {\n tasksSummary += ` ... and ${todo.length - 5} more\\n`;\n }\n }\n }\n\n if (recentlyCompleted.length > 0) {\n recentWork = '\\nRecently Completed:\\n';\n recentlyCompleted.forEach((t: any) => {\n recentWork += ` \u2713 ${t.title}\\n`;\n });\n }\n\n // Get recent events\n const recentEvents = db\n .prepare(\n `\n SELECT event_type as type, payload as data, datetime(ts, 'unixepoch') as time\n FROM events\n ORDER BY ts DESC\n LIMIT 5\n `\n )\n .all() as any[];\n\n if (recentEvents.length > 0) {\n recentWork += '\\nRecent Activity:\\n';\n recentEvents.forEach((event) => {\n const data = JSON.parse(event.data);\n recentWork += ` - ${event.type}: ${data.message || data.name || 'activity'}\\n`;\n });\n }\n\n db.close();\n }\n\n // 4. Get current git info\n let gitInfo = '';\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const lastCommit = execSync('git log -1 --oneline', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n gitInfo = `\\nGit Status:\\n Branch: ${branch}\\n Last commit: ${lastCommit}\\n`;\n } catch {\n // Not a git repository - silently ignore\n }\n\n // 5. Check for any blockers or notes\n let notes = '';\n const notesPath = join(projectRoot, '.stackmemory', 'handoff.md');\n if (existsSync(notesPath)) {\n const handoffNotes = readFileSync(notesPath, 'utf-8');\n if (handoffNotes.trim()) {\n notes = `\\nNotes from previous handoff:\\n${handoffNotes}\\n`;\n }\n }\n\n // 6. Generate the handoff prompt\n let handoffPrompt: string;\n\n if (options.basic) {\n // Use basic handoff format\n const timestamp = new Date().toISOString();\n handoffPrompt = `# Session Handoff - ${timestamp}\n\n## Project: ${projectRoot.split('/').pop()}\n\n${gitInfo}\n${contextSummary}\n${tasksSummary}\n${recentWork}\n${notes}\n\n## Continue from here:\n\n1. Run \\`stackmemory status\\` to check the current state\n2. Review any in-progress tasks above\n3. Check for any uncommitted changes with \\`git status\\`\n4. Resume work on the active context\n\n## Quick Commands:\n- \\`stackmemory context load --recent\\` - Load recent context\n- \\`stackmemory task list --state in_progress\\` - Show in-progress tasks\n- \\`stackmemory linear sync\\` - Sync with Linear if configured\n- \\`stackmemory log recent\\` - View recent activity\n\n---\nGenerated by stackmemory capture at ${timestamp}\n`;\n } else {\n // Use high-efficacy enhanced handoff generator (default)\n const enhancedGenerator = new EnhancedHandoffGenerator(projectRoot);\n const enhancedHandoff = await enhancedGenerator.generate();\n\n // Determine format: explicit flags > --format option > auto-select\n let format: 'ultra' | 'compact' | 'verbose' | 'auto' = 'auto';\n if (options.verbose) {\n format = 'verbose';\n } else if (options.ultra) {\n format = 'ultra';\n } else if (options.format) {\n format = options.format as typeof format;\n }\n\n // Generate handoff in selected format\n if (format === 'auto') {\n const selectedFormat =\n enhancedGenerator.selectFormat(enhancedHandoff);\n handoffPrompt = enhancedGenerator.toAutoFormat(enhancedHandoff);\n const actualTokens = countTokens(handoffPrompt);\n console.log(\n `Estimated tokens: ~${actualTokens} (${selectedFormat}, auto-selected)`\n );\n } else if (format === 'ultra') {\n handoffPrompt = enhancedGenerator.toUltraCompact(enhancedHandoff);\n const actualTokens = countTokens(handoffPrompt);\n console.log(`Estimated tokens: ~${actualTokens} (ultra-compact)`);\n } else if (format === 'verbose') {\n handoffPrompt = enhancedGenerator.toMarkdown(enhancedHandoff);\n const actualTokens = countTokens(handoffPrompt);\n console.log(`Estimated tokens: ~${actualTokens} (verbose)`);\n } else {\n handoffPrompt = enhancedGenerator.toCompact(enhancedHandoff);\n const actualTokens = countTokens(handoffPrompt);\n console.log(`Estimated tokens: ~${actualTokens} (compact)`);\n }\n }\n\n // 7. Save handoff prompt (both latest and versioned)\n const stackmemoryDir = join(projectRoot, '.stackmemory');\n if (!existsSync(stackmemoryDir)) {\n mkdirSync(stackmemoryDir, { recursive: true });\n }\n const handoffPath = join(stackmemoryDir, 'last-handoff.md');\n writeFileSync(handoffPath, handoffPrompt);\n\n // Save versioned copy\n let branch = 'unknown';\n try {\n branch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n // Not a git repo\n }\n const versionedPath = saveVersionedHandoff(\n projectRoot,\n branch,\n handoffPrompt\n );\n console.log(\n `Versioned: ${versionedPath.split('/').slice(-2).join('/')}`\n );\n\n // 8. Display the prompt\n console.log('\\n' + '='.repeat(60));\n console.log(handoffPrompt);\n console.log('='.repeat(60));\n\n // 9. Copy to clipboard if requested\n if (options.copy) {\n try {\n // Use execFileSync with predefined commands for safety\n if (process.platform === 'darwin') {\n execFileSync('pbcopy', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else if (process.platform === 'win32') {\n execFileSync('clip', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else {\n execFileSync('xclip', ['-selection', 'clipboard'], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n }\n\n console.log('\\n\u2705 Handoff prompt copied to clipboard!');\n } catch {\n console.log('\\n\u26A0\uFE0F Could not copy to clipboard');\n }\n }\n\n console.log(`\\n\uD83D\uDCBE Handoff saved to: ${handoffPath}`);\n console.log('\uD83D\uDCCB Use this prompt when starting your next session');\n } catch (error: unknown) {\n logger.error('Capture command failed', error as Error);\n console.error('\u274C Capture failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nexport function createRestoreCommand(): Command {\n const cmd = new Command('restore');\n\n cmd\n .description('Restore context from last handoff')\n .option('--no-copy', 'Do not copy prompt to clipboard')\n .action(async (options) => {\n try {\n const projectRoot = process.cwd();\n const handoffPath = join(\n projectRoot,\n '.stackmemory',\n 'last-handoff.md'\n );\n const metaPath = join(\n process.env['HOME'] || '~',\n '.stackmemory',\n 'handoffs',\n 'last-handoff-meta.json'\n );\n\n if (!existsSync(handoffPath)) {\n console.log('\u274C No handoff found in this project');\n console.log('\uD83D\uDCA1 Run \"stackmemory capture\" to create one');\n return;\n }\n\n // Read handoff prompt\n const handoffPrompt = readFileSync(handoffPath, 'utf-8');\n\n // Display the prompt\n console.log('\\n' + '='.repeat(60));\n console.log('\uD83D\uDCCB RESTORED HANDOFF');\n console.log('='.repeat(60));\n console.log(handoffPrompt);\n console.log('='.repeat(60));\n\n // Check for metadata\n if (existsSync(metaPath)) {\n const metadata = JSON.parse(readFileSync(metaPath, 'utf-8'));\n console.log('\\n\uD83D\uDCCA Session Metadata:');\n console.log(` Timestamp: ${metadata.timestamp}`);\n console.log(` Reason: ${metadata.reason}`);\n console.log(` Duration: ${metadata.session_duration}s`);\n console.log(` Command: ${metadata.command}`);\n }\n\n // Check current git status\n try {\n const gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (gitStatus) {\n console.log('\\n Current uncommitted changes:');\n console.log(gitStatus);\n }\n } catch {\n // Not a git repo - silently ignore\n }\n\n // Copy to clipboard unless disabled\n if (options.copy !== false) {\n try {\n // Use execFileSync with predefined commands for safety\n if (process.platform === 'darwin') {\n execFileSync('pbcopy', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else if (process.platform === 'win32') {\n execFileSync('clip', [], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n } else {\n execFileSync('xclip', ['-selection', 'clipboard'], {\n input: handoffPrompt,\n cwd: projectRoot,\n });\n }\n\n console.log('\\n\u2705 Handoff prompt copied to clipboard!');\n } catch {\n console.log('\\n\u26A0\uFE0F Could not copy to clipboard');\n }\n }\n\n console.log('\\n\uD83D\uDE80 Ready to continue where you left off!');\n } catch (error: unknown) {\n logger.error('Restore failed', error as Error);\n console.error('\u274C Restore failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\ninterface AutoCaptureMetadata {\n timestamp: string;\n reason: string;\n exit_code: number;\n command: string;\n pid: number;\n cwd: string;\n user: string;\n session_duration: number;\n}\n\nasync function captureHandoff(\n reason: string,\n exitCode: number,\n wrappedCommand: string,\n sessionStart: number,\n quiet: boolean\n): Promise<void> {\n const projectRoot = process.cwd();\n const handoffDir = join(homedir(), '.stackmemory', 'handoffs');\n const logFile = join(handoffDir, 'auto-handoff.log');\n\n // Ensure handoff directory exists\n if (!existsSync(handoffDir)) {\n mkdirSync(handoffDir, { recursive: true });\n }\n\n const logMessage = (msg: string): void => {\n const timestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');\n const logLine = `[${timestamp}] ${msg}\\n`;\n try {\n writeFileSync(logFile, logLine, { flag: 'a' });\n } catch {\n // Logging failed, continue anyway\n }\n };\n\n if (!quiet) {\n console.log('\\nCapturing handoff context...');\n }\n logMessage(`Capturing handoff: reason=${reason}, exit_code=${exitCode}`);\n\n try {\n // Run stackmemory capture --no-commit\n execFileSync(\n process.execPath,\n [process.argv[1], 'capture', '--no-commit'],\n {\n cwd: projectRoot,\n stdio: quiet ? 'pipe' : 'inherit',\n }\n );\n\n // Save metadata\n const metadata: AutoCaptureMetadata = {\n timestamp: new Date().toISOString(),\n reason,\n exit_code: exitCode,\n command: wrappedCommand,\n pid: process.pid,\n cwd: projectRoot,\n user: process.env['USER'] || 'unknown',\n session_duration: Math.floor((Date.now() - sessionStart) / 1000),\n };\n\n const metadataPath = join(handoffDir, 'last-handoff-meta.json');\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));\n\n if (!quiet) {\n console.log('Handoff captured successfully');\n logMessage(`Handoff captured: ${metadataPath}`);\n\n // Show session summary\n console.log('\\nSession Summary:');\n console.log(` Duration: ${metadata.session_duration} seconds`);\n console.log(` Exit reason: ${reason}`);\n\n // Check for uncommitted changes\n try {\n const gitStatus = execSync('git status --short', {\n encoding: 'utf-8',\n cwd: projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (gitStatus) {\n console.log('\\nYou have uncommitted changes');\n console.log(' Run \"git status\" to review');\n }\n } catch {\n // Not a git repo - silently ignore\n }\n\n console.log('\\nRun \"stackmemory restore\" in your next session');\n }\n } catch (err) {\n if (!quiet) {\n console.error('Failed to capture handoff:', (err as Error).message);\n }\n logMessage(`ERROR: ${(err as Error).message}`);\n }\n}\n\nexport function createAutoCaptureCommand(): Command {\n const cmd = new Command('auto-capture');\n\n cmd\n .description('Wrap a command with automatic handoff capture on termination')\n .option('-a, --auto', 'Auto-capture on normal exit (no prompt)')\n .option('-q, --quiet', 'Suppress output')\n .option('-t, --tag <tag>', 'Tag this session')\n .argument('[command...]', 'Command to wrap with auto-handoff')\n .action(async (commandArgs: string[], options) => {\n const autoCapture = options.auto || false;\n const quiet = options.quiet || false;\n const tag = options.tag || '';\n\n // If no command provided, show usage\n if (!commandArgs || commandArgs.length === 0) {\n console.log('StackMemory Auto-Handoff');\n console.log('-'.repeat(50));\n console.log('');\n console.log(\n 'Wraps a command with automatic handoff capture on termination.'\n );\n console.log('');\n console.log('Usage:');\n console.log(' stackmemory auto-capture [options] <command> [args...]');\n console.log('');\n console.log('Examples:');\n console.log(' stackmemory auto-capture claude');\n console.log(' stackmemory auto-capture -a npm run dev');\n console.log(' stackmemory auto-capture -t \"feature-work\" vim');\n console.log('');\n console.log('Options:');\n console.log(\n ' -a, --auto Auto-capture on normal exit (no prompt)'\n );\n console.log(' -q, --quiet Suppress output');\n console.log(' -t, --tag <tag> Tag this session');\n return;\n }\n\n const wrappedCommand = commandArgs.join(' ');\n const sessionStart = Date.now();\n let capturedAlready = false;\n\n if (!quiet) {\n console.log('StackMemory Auto-Handoff Wrapper');\n console.log(`Wrapping: ${wrappedCommand}`);\n if (tag) {\n console.log(`Tag: ${tag}`);\n }\n console.log('Handoff will be captured on termination');\n console.log('');\n }\n\n // Spawn the wrapped command\n const [cmd, ...args] = commandArgs;\n let childProcess: ChildProcess;\n\n try {\n childProcess = spawn(cmd, args, {\n stdio: 'inherit',\n shell: false,\n cwd: process.cwd(),\n env: process.env,\n });\n } catch (err) {\n console.error(`Failed to start command: ${(err as Error).message}`);\n process.exit(1);\n return;\n }\n\n // Handle signals - forward to child and capture on termination\n const handleSignal = async (\n signal: NodeJS.Signals,\n exitCode: number\n ): Promise<void> => {\n if (capturedAlready) return;\n capturedAlready = true;\n\n if (!quiet) {\n console.log(`\\nReceived ${signal}`);\n }\n\n // Kill the child process if still running\n if (childProcess.pid && !childProcess.killed) {\n childProcess.kill(signal);\n }\n\n await captureHandoff(\n signal,\n exitCode,\n wrappedCommand,\n sessionStart,\n quiet\n );\n process.exit(exitCode);\n };\n\n process.on('SIGINT', () => handleSignal('SIGINT', 130));\n process.on('SIGTERM', () => handleSignal('SIGTERM', 143));\n process.on('SIGHUP', () => handleSignal('SIGHUP', 129));\n\n // Handle child process exit\n childProcess.on('exit', async (code, signal) => {\n if (capturedAlready) return;\n capturedAlready = true;\n\n const exitCode = code ?? (signal ? 128 : 0);\n\n if (signal) {\n // Child was killed by a signal\n await captureHandoff(\n signal,\n exitCode,\n wrappedCommand,\n sessionStart,\n quiet\n );\n } else if (exitCode !== 0) {\n // Unexpected exit\n if (!quiet) {\n console.log(`\\nCommand exited with code: ${exitCode}`);\n }\n await captureHandoff(\n 'unexpected_exit',\n exitCode,\n wrappedCommand,\n sessionStart,\n quiet\n );\n } else if (autoCapture) {\n // Normal exit with auto-capture enabled\n await captureHandoff(\n 'normal_exit',\n 0,\n wrappedCommand,\n sessionStart,\n quiet\n );\n } else {\n // Normal exit - prompt for capture (simplified for CLI, auto-capture)\n // In non-interactive contexts, default to capturing\n if (process.stdin.isTTY) {\n // Interactive - we could prompt but keeping it simple\n console.log(\n '\\nSession ending. Use -a flag for auto-capture on normal exit.'\n );\n }\n }\n\n process.exit(exitCode);\n });\n\n // Handle spawn errors\n childProcess.on('error', async (err) => {\n if (capturedAlready) return;\n capturedAlready = true;\n\n console.error(`Command error: ${err.message}`);\n await captureHandoff(\n 'spawn_error',\n 1,\n wrappedCommand,\n sessionStart,\n quiet\n );\n process.exit(1);\n });\n });\n\n return cmd;\n}\n\n/** @deprecated Use createCaptureCommand, createRestoreCommand, createAutoCaptureCommand */\nexport function createHandoffCommand(): Command {\n const cmd = new Command('handoff');\n cmd.description('(deprecated) Use \"capture\" or \"restore\" instead');\n return cmd;\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAIA,SAAS,eAAe;AACxB,SAAS,UAAU,cAAc,aAA2B;AAC5D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,OAAO,cAAc;AACrB,SAAS,SAAS;AAClB,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC,SAAS,cAAc;AACvB,SAAS,gCAAgC;AAGzC,MAAM,cAAc,CAAC,SAAyB,KAAK,KAAK,KAAK,SAAS,GAAG;AAGzE,MAAM,uBAAuB;AAE7B,SAAS,qBACP,aACA,QACA,SACQ;AACR,QAAM,cAAc,KAAK,aAAa,gBAAgB,UAAU;AAChE,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,cAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAGA,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,YAAY,IAAI,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,SAAS,GAAG;AACrE,QAAM,aAAa,OAAO,QAAQ,kBAAkB,GAAG,EAAE,MAAM,GAAG,EAAE;AACpE,QAAM,WAAW,GAAG,SAAS,IAAI,UAAU;AAC3C,QAAM,gBAAgB,KAAK,aAAa,QAAQ;AAGhD,gBAAc,eAAe,OAAO;AAGpC,MAAI;AACF,UAAM,QAAQ,YAAY,WAAW,EAClC,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAC/B,KAAK,EACL,QAAQ;AAEX,eAAW,WAAW,MAAM,MAAM,oBAAoB,GAAG;AACvD,iBAAW,KAAK,aAAa,OAAO,CAAC;AAAA,IACvC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAGA,MAAM,sBAAsB,EACzB,OAAO,EACP,IAAI,GAAG,gCAAgC,EACvC,IAAI,KAAK,yBAAyB,EAClC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC,CAAC,QAAQ,CAAC,IAAI,SAAS,IAAI;AAAA,EAC3B;AACF,EACC;AAAA,EACC,CAAC,QAAQ,CAAC,IAAI,SAAS,GAAG;AAAA,EAC1B;AACF,EACC;AAAA,EACC,CAAC,QAAQ,CAAC,IAAI,SAAS,GAAG;AAAA,EAC1B;AACF;AAEK,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,QAAQ,SAAS;AAEjC,MACG,YAAY,mDAAmD,EAC/D,OAAO,2BAA2B,uBAAuB,EACzD,OAAO,eAAe,iBAAiB,EACvC,OAAO,UAAU,sCAAsC,EACvD,OAAO,WAAW,8CAA8C,EAChE,OAAO,aAAa,4CAA4C,EAChE,OAAO,WAAW,yCAAyC,EAC3D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,cAAc,QAAQ,IAAI;AAChC,YAAM,SAAS,KAAK,aAAa,gBAAgB,YAAY;AAG7D,UAAI,YAAY;AAChB,UAAI,aAAa;AAEjB,UAAI;AACF,oBAAY,SAAS,sBAAsB;AAAA,UACzC,UAAU;AAAA,UACV,KAAK;AAAA,UACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAChC,CAAC;AACD,qBAAa,UAAU,KAAK,EAAE,SAAS;AAAA,MACzC,QAAQ;AAAA,MAER;AAGA,UAAI,cAAc,QAAQ,WAAW,OAAO;AAC1C,YAAI;AAEF,gBAAM,gBAAgB,SAAS,mCAAmC;AAAA,YAChE,UAAU;AAAA,YACV,KAAK;AAAA,UACP,CAAC,EAAE,KAAK;AAGR,mBAAS,cAAc,EAAE,KAAK,YAAY,CAAC;AAG3C,cAAI,gBACF,QAAQ,WACR,gCAAgC,aAAa;AAG/C,cAAI;AACF,4BAAgB,oBAAoB,MAAM,aAAa;AAAA,UACzD,SAAS,iBAAiB;AACxB,oBAAQ;AAAA,cACN;AAAA,cACC,gBAA0B;AAAA,YAC7B;AACA;AAAA,UACF;AAGA,uBAAa,OAAO,CAAC,UAAU,MAAM,aAAa,GAAG;AAAA,YACnD,KAAK;AAAA,YACL,OAAO;AAAA,UACT,CAAC;AAED,kBAAQ,IAAI,8BAAyB,aAAa,GAAG;AACrD,kBAAQ,IAAI,cAAc,aAAa,EAAE;AAAA,QAC3C,SAAS,KAAc;AACrB,kBAAQ;AAAA,YACN;AAAA,YACC,IAAc;AAAA,UACjB;AAAA,QACF;AAAA,MACF,WAAW,CAAC,YAAY;AACtB,gBAAQ,IAAI,oCAA0B;AAAA,MACxC;AAGA,UAAI,iBAAiB;AACrB,UAAI,eAAe;AACnB,UAAI,aAAa;AAEjB,UAAI,WAAW,MAAM,GAAG;AACtB,cAAM,KAAK,IAAI,SAAS,MAAM;AAG9B,cAAM,eAAe,IAAI,aAAa,IAAI,aAAa;AACvD,cAAM,eAAe,aAAa,mBAAmB;AAErD,YAAI,aAAa,SAAS,GAAG;AAC3B,2BAAiB;AACjB,uBAAa,QAAQ,CAAC,UAAU;AAC9B,8BAAkB,OAAO,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA;AAAA,UACpD,CAAC;AAAA,QACH;AAGA,cAAM,YAAY,IAAI,kBAAkB,aAAa,EAAE;AACvD,cAAM,cAAc,UAAU,eAAe;AAE7C,cAAM,aAAa,YAAY;AAAA,UAC7B,CAAC,MAAW,EAAE,WAAW;AAAA,QAC3B;AACA,cAAM,OAAO,YAAY,OAAO,CAAC,MAAW,EAAE,WAAW,SAAS;AAClE,cAAM,oBAAoB,YACvB,OAAO,CAAC,MAAW,EAAE,WAAW,eAAe,EAAE,YAAY,EAC7D;AAAA,UACC,CAAC,GAAQ,OAAY,EAAE,gBAAgB,MAAM,EAAE,gBAAgB;AAAA,QACjE,EACC,MAAM,GAAG,CAAC;AAEb,YAAI,WAAW,SAAS,KAAK,KAAK,SAAS,GAAG;AAC5C,yBAAe;AAEf,cAAI,WAAW,SAAS,GAAG;AACzB,4BAAgB;AAChB,uBAAW,QAAQ,CAAC,MAAW;AAC7B,oBAAM,aAAa,EAAE,eAAe,QAAQ;AAC5C,8BAAgB,OAAO,EAAE,KAAK,GAAG,aAAa,KAAK,UAAU,MAAM,EAAE;AAAA;AAAA,YACvE,CAAC;AAAA,UACH;AAEA,cAAI,KAAK,SAAS,GAAG;AACnB,4BAAgB;AAChB,iBAAK,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAW;AACnC,oBAAM,aAAa,EAAE,eAAe,QAAQ;AAC5C,8BAAgB,OAAO,EAAE,KAAK,GAAG,aAAa,KAAK,UAAU,MAAM,EAAE;AAAA;AAAA,YACvE,CAAC;AACD,gBAAI,KAAK,SAAS,GAAG;AACnB,8BAAgB,aAAa,KAAK,SAAS,CAAC;AAAA;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AAEA,YAAI,kBAAkB,SAAS,GAAG;AAChC,uBAAa;AACb,4BAAkB,QAAQ,CAAC,MAAW;AACpC,0BAAc,YAAO,EAAE,KAAK;AAAA;AAAA,UAC9B,CAAC;AAAA,QACH;AAGA,cAAM,eAAe,GAClB;AAAA,UACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMF,EACC,IAAI;AAEP,YAAI,aAAa,SAAS,GAAG;AAC3B,wBAAc;AACd,uBAAa,QAAQ,CAAC,UAAU;AAC9B,kBAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAClC,0BAAc,OAAO,MAAM,IAAI,KAAK,KAAK,WAAW,KAAK,QAAQ,UAAU;AAAA;AAAA,UAC7E,CAAC;AAAA,QACH;AAEA,WAAG,MAAM;AAAA,MACX;AAGA,UAAI,UAAU;AACd,UAAI;AACF,cAAMA,UAAS,SAAS,mCAAmC;AAAA,UACzD,UAAU;AAAA,UACV,KAAK;AAAA,UACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAChC,CAAC,EAAE,KAAK;AAER,cAAM,aAAa,SAAS,wBAAwB;AAAA,UAClD,UAAU;AAAA,UACV,KAAK;AAAA,UACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAChC,CAAC,EAAE,KAAK;AAER,kBAAU;AAAA;AAAA,YAA4BA,OAAM;AAAA,iBAAoB,UAAU;AAAA;AAAA,MAC5E,QAAQ;AAAA,MAER;AAGA,UAAI,QAAQ;AACZ,YAAM,YAAY,KAAK,aAAa,gBAAgB,YAAY;AAChE,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,eAAe,aAAa,WAAW,OAAO;AACpD,YAAI,aAAa,KAAK,GAAG;AACvB,kBAAQ;AAAA;AAAA,EAAmC,YAAY;AAAA;AAAA,QACzD;AAAA,MACF;AAGA,UAAI;AAEJ,UAAI,QAAQ,OAAO;AAEjB,cAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,wBAAgB,uBAAuB,SAAS;AAAA;AAAA,cAE5C,YAAY,MAAM,GAAG,EAAE,IAAI,CAAC;AAAA;AAAA,EAExC,OAAO;AAAA,EACP,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAgB+B,SAAS;AAAA;AAAA,MAEvC,OAAO;AAEL,cAAM,oBAAoB,IAAI,yBAAyB,WAAW;AAClE,cAAM,kBAAkB,MAAM,kBAAkB,SAAS;AAGzD,YAAI,SAAmD;AACvD,YAAI,QAAQ,SAAS;AACnB,mBAAS;AAAA,QACX,WAAW,QAAQ,OAAO;AACxB,mBAAS;AAAA,QACX,WAAW,QAAQ,QAAQ;AACzB,mBAAS,QAAQ;AAAA,QACnB;AAGA,YAAI,WAAW,QAAQ;AACrB,gBAAM,iBACJ,kBAAkB,aAAa,eAAe;AAChD,0BAAgB,kBAAkB,aAAa,eAAe;AAC9D,gBAAM,eAAe,YAAY,aAAa;AAC9C,kBAAQ;AAAA,YACN,sBAAsB,YAAY,KAAK,cAAc;AAAA,UACvD;AAAA,QACF,WAAW,WAAW,SAAS;AAC7B,0BAAgB,kBAAkB,eAAe,eAAe;AAChE,gBAAM,eAAe,YAAY,aAAa;AAC9C,kBAAQ,IAAI,sBAAsB,YAAY,kBAAkB;AAAA,QAClE,WAAW,WAAW,WAAW;AAC/B,0BAAgB,kBAAkB,WAAW,eAAe;AAC5D,gBAAM,eAAe,YAAY,aAAa;AAC9C,kBAAQ,IAAI,sBAAsB,YAAY,YAAY;AAAA,QAC5D,OAAO;AACL,0BAAgB,kBAAkB,UAAU,eAAe;AAC3D,gBAAM,eAAe,YAAY,aAAa;AAC9C,kBAAQ,IAAI,sBAAsB,YAAY,YAAY;AAAA,QAC5D;AAAA,MACF;AAGA,YAAM,iBAAiB,KAAK,aAAa,cAAc;AACvD,UAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,kBAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/C;AACA,YAAM,cAAc,KAAK,gBAAgB,iBAAiB;AAC1D,oBAAc,aAAa,aAAa;AAGxC,UAAI,SAAS;AACb,UAAI;AACF,iBAAS,SAAS,mCAAmC;AAAA,UACnD,UAAU;AAAA,UACV,KAAK;AAAA,UACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAChC,CAAC,EAAE,KAAK;AAAA,MACV,QAAQ;AAAA,MAER;AACA,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ;AAAA,QACN,cAAc,cAAc,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,MAC5D;AAGA,cAAQ,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;AACjC,cAAQ,IAAI,aAAa;AACzB,cAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAG1B,UAAI,QAAQ,MAAM;AAChB,YAAI;AAEF,cAAI,QAAQ,aAAa,UAAU;AACjC,yBAAa,UAAU,CAAC,GAAG;AAAA,cACzB,OAAO;AAAA,cACP,KAAK;AAAA,YACP,CAAC;AAAA,UACH,WAAW,QAAQ,aAAa,SAAS;AACvC,yBAAa,QAAQ,CAAC,GAAG;AAAA,cACvB,OAAO;AAAA,cACP,KAAK;AAAA,YACP,CAAC;AAAA,UACH,OAAO;AACL,yBAAa,SAAS,CAAC,cAAc,WAAW,GAAG;AAAA,cACjD,OAAO;AAAA,cACP,KAAK;AAAA,YACP,CAAC;AAAA,UACH;AAEA,kBAAQ,IAAI,8CAAyC;AAAA,QACvD,QAAQ;AACN,kBAAQ,IAAI,6CAAmC;AAAA,QACjD;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA,8BAA0B,WAAW,EAAE;AACnD,cAAQ,IAAI,2DAAoD;AAAA,IAClE,SAAS,OAAgB;AACvB,aAAO,MAAM,0BAA0B,KAAc;AACrD,cAAQ,MAAM,0BAAsB,MAAgB,OAAO;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAEO,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,QAAQ,SAAS;AAEjC,MACG,YAAY,mCAAmC,EAC/C,OAAO,aAAa,iCAAiC,EACrD,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,cAAc,QAAQ,IAAI;AAChC,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,WAAW;AAAA,QACf,QAAQ,IAAI,MAAM,KAAK;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,gBAAQ,IAAI,yCAAoC;AAChD,gBAAQ,IAAI,mDAA4C;AACxD;AAAA,MACF;AAGA,YAAM,gBAAgB,aAAa,aAAa,OAAO;AAGvD,cAAQ,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;AACjC,cAAQ,IAAI,4BAAqB;AACjC,cAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1B,cAAQ,IAAI,aAAa;AACzB,cAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAG1B,UAAI,WAAW,QAAQ,GAAG;AACxB,cAAM,WAAW,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC;AAC3D,gBAAQ,IAAI,+BAAwB;AACpC,gBAAQ,IAAI,gBAAgB,SAAS,SAAS,EAAE;AAChD,gBAAQ,IAAI,aAAa,SAAS,MAAM,EAAE;AAC1C,gBAAQ,IAAI,eAAe,SAAS,gBAAgB,GAAG;AACvD,gBAAQ,IAAI,cAAc,SAAS,OAAO,EAAE;AAAA,MAC9C;AAGA,UAAI;AACF,cAAM,YAAY,SAAS,sBAAsB;AAAA,UAC/C,UAAU;AAAA,UACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAChC,CAAC,EAAE,KAAK;AACR,YAAI,WAAW;AACb,kBAAQ,IAAI,kCAAkC;AAC9C,kBAAQ,IAAI,SAAS;AAAA,QACvB;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,UAAI,QAAQ,SAAS,OAAO;AAC1B,YAAI;AAEF,cAAI,QAAQ,aAAa,UAAU;AACjC,yBAAa,UAAU,CAAC,GAAG;AAAA,cACzB,OAAO;AAAA,cACP,KAAK;AAAA,YACP,CAAC;AAAA,UACH,WAAW,QAAQ,aAAa,SAAS;AACvC,yBAAa,QAAQ,CAAC,GAAG;AAAA,cACvB,OAAO;AAAA,cACP,KAAK;AAAA,YACP,CAAC;AAAA,UACH,OAAO;AACL,yBAAa,SAAS,CAAC,cAAc,WAAW,GAAG;AAAA,cACjD,OAAO;AAAA,cACP,KAAK;AAAA,YACP,CAAC;AAAA,UACH;AAEA,kBAAQ,IAAI,8CAAyC;AAAA,QACvD,QAAQ;AACN,kBAAQ,IAAI,6CAAmC;AAAA,QACjD;AAAA,MACF;AAEA,cAAQ,IAAI,mDAA4C;AAAA,IAC1D,SAAS,OAAgB;AACvB,aAAO,MAAM,kBAAkB,KAAc;AAC7C,cAAQ,MAAM,0BAAsB,MAAgB,OAAO;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAaA,eAAe,eACb,QACA,UACA,gBACA,cACA,OACe;AACf,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,aAAa,KAAK,QAAQ,GAAG,gBAAgB,UAAU;AAC7D,QAAM,UAAU,KAAK,YAAY,kBAAkB;AAGnD,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAEA,QAAM,aAAa,CAAC,QAAsB;AACxC,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AACxE,UAAM,UAAU,IAAI,SAAS,KAAK,GAAG;AAAA;AACrC,QAAI;AACF,oBAAc,SAAS,SAAS,EAAE,MAAM,IAAI,CAAC;AAAA,IAC/C,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,gCAAgC;AAAA,EAC9C;AACA,aAAW,6BAA6B,MAAM,eAAe,QAAQ,EAAE;AAEvE,MAAI;AAEF;AAAA,MACE,QAAQ;AAAA,MACR,CAAC,QAAQ,KAAK,CAAC,GAAG,WAAW,aAAa;AAAA,MAC1C;AAAA,QACE,KAAK;AAAA,QACL,OAAO,QAAQ,SAAS;AAAA,MAC1B;AAAA,IACF;AAGA,UAAM,WAAgC;AAAA,MACpC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT,KAAK,QAAQ;AAAA,MACb,KAAK;AAAA,MACL,MAAM,QAAQ,IAAI,MAAM,KAAK;AAAA,MAC7B,kBAAkB,KAAK,OAAO,KAAK,IAAI,IAAI,gBAAgB,GAAI;AAAA,IACjE;AAEA,UAAM,eAAe,KAAK,YAAY,wBAAwB;AAC9D,kBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAE7D,QAAI,CAAC,OAAO;AACV,cAAQ,IAAI,+BAA+B;AAC3C,iBAAW,qBAAqB,YAAY,EAAE;AAG9C,cAAQ,IAAI,oBAAoB;AAChC,cAAQ,IAAI,eAAe,SAAS,gBAAgB,UAAU;AAC9D,cAAQ,IAAI,kBAAkB,MAAM,EAAE;AAGtC,UAAI;AACF,cAAM,YAAY,SAAS,sBAAsB;AAAA,UAC/C,UAAU;AAAA,UACV,KAAK;AAAA,UACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAChC,CAAC,EAAE,KAAK;AACR,YAAI,WAAW;AACb,kBAAQ,IAAI,gCAAgC;AAC5C,kBAAQ,IAAI,8BAA8B;AAAA,QAC5C;AAAA,MACF,QAAQ;AAAA,MAER;AAEA,cAAQ,IAAI,kDAAkD;AAAA,IAChE;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,8BAA+B,IAAc,OAAO;AAAA,IACpE;AACA,eAAW,UAAW,IAAc,OAAO,EAAE;AAAA,EAC/C;AACF;AAEO,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAI,QAAQ,cAAc;AAEtC,MACG,YAAY,8DAA8D,EAC1E,OAAO,cAAc,yCAAyC,EAC9D,OAAO,eAAe,iBAAiB,EACvC,OAAO,mBAAmB,kBAAkB,EAC5C,SAAS,gBAAgB,mCAAmC,EAC5D,OAAO,OAAO,aAAuB,YAAY;AAChD,UAAM,cAAc,QAAQ,QAAQ;AACpC,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,MAAM,QAAQ,OAAO;AAG3B,QAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC5C,cAAQ,IAAI,0BAA0B;AACtC,cAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1B,cAAQ,IAAI,EAAE;AACd,cAAQ;AAAA,QACN;AAAA,MACF;AACA,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,QAAQ;AACpB,cAAQ,IAAI,0DAA0D;AACtE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW;AACvB,cAAQ,IAAI,mCAAmC;AAC/C,cAAQ,IAAI,2CAA2C;AACvD,cAAQ,IAAI,kDAAkD;AAC9D,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU;AACtB,cAAQ;AAAA,QACN;AAAA,MACF;AACA,cAAQ,IAAI,oCAAoC;AAChD,cAAQ,IAAI,qCAAqC;AACjD;AAAA,IACF;AAEA,UAAM,iBAAiB,YAAY,KAAK,GAAG;AAC3C,UAAM,eAAe,KAAK,IAAI;AAC9B,QAAI,kBAAkB;AAEtB,QAAI,CAAC,OAAO;AACV,cAAQ,IAAI,kCAAkC;AAC9C,cAAQ,IAAI,aAAa,cAAc,EAAE;AACzC,UAAI,KAAK;AACP,gBAAQ,IAAI,QAAQ,GAAG,EAAE;AAAA,MAC3B;AACA,cAAQ,IAAI,yCAAyC;AACrD,cAAQ,IAAI,EAAE;AAAA,IAChB;AAGA,UAAM,CAACC,MAAK,GAAG,IAAI,IAAI;AACvB,QAAI;AAEJ,QAAI;AACF,qBAAe,MAAMA,MAAK,MAAM;AAAA,QAC9B,OAAO;AAAA,QACP,OAAO;AAAA,QACP,KAAK,QAAQ,IAAI;AAAA,QACjB,KAAK,QAAQ;AAAA,MACf,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,MAAM,4BAA6B,IAAc,OAAO,EAAE;AAClE,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAGA,UAAM,eAAe,OACnB,QACA,aACkB;AAClB,UAAI,gBAAiB;AACrB,wBAAkB;AAElB,UAAI,CAAC,OAAO;AACV,gBAAQ,IAAI;AAAA,WAAc,MAAM,EAAE;AAAA,MACpC;AAGA,UAAI,aAAa,OAAO,CAAC,aAAa,QAAQ;AAC5C,qBAAa,KAAK,MAAM;AAAA,MAC1B;AAEA,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAEA,YAAQ,GAAG,UAAU,MAAM,aAAa,UAAU,GAAG,CAAC;AACtD,YAAQ,GAAG,WAAW,MAAM,aAAa,WAAW,GAAG,CAAC;AACxD,YAAQ,GAAG,UAAU,MAAM,aAAa,UAAU,GAAG,CAAC;AAGtD,iBAAa,GAAG,QAAQ,OAAO,MAAM,WAAW;AAC9C,UAAI,gBAAiB;AACrB,wBAAkB;AAElB,YAAM,WAAW,SAAS,SAAS,MAAM;AAEzC,UAAI,QAAQ;AAEV,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,aAAa,GAAG;AAEzB,YAAI,CAAC,OAAO;AACV,kBAAQ,IAAI;AAAA,4BAA+B,QAAQ,EAAE;AAAA,QACvD;AACA,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,aAAa;AAEtB,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AAGL,YAAI,QAAQ,MAAM,OAAO;AAEvB,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,KAAK,QAAQ;AAAA,IACvB,CAAC;AAGD,iBAAa,GAAG,SAAS,OAAO,QAAQ;AACtC,UAAI,gBAAiB;AACrB,wBAAkB;AAElB,cAAQ,MAAM,kBAAkB,IAAI,OAAO,EAAE;AAC7C,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AAEH,SAAO;AACT;AAGO,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAI,QAAQ,SAAS;AACjC,MAAI,YAAY,iDAAiD;AACjE,SAAO;AACT;",
|
|
6
6
|
"names": ["branch", "cmd"]
|
|
7
7
|
}
|
|
@@ -6,8 +6,13 @@ import { Command } from "commander";
|
|
|
6
6
|
import Database from "better-sqlite3";
|
|
7
7
|
import { join } from "path";
|
|
8
8
|
import { existsSync } from "fs";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
const SearchQuerySchema = z.string().min(1, "Search query is required").max(500, "Search query too long (max 500 characters)").transform((val) => {
|
|
11
|
+
return val.replace(/[%_\\]/g, "\\$&");
|
|
12
|
+
});
|
|
13
|
+
const LimitSchema = z.string().transform((val) => parseInt(val, 10)).pipe(z.number().int().min(1).max(100).default(20));
|
|
9
14
|
function createSearchCommand() {
|
|
10
|
-
const search = new Command("search").alias("find").description("Search across tasks and context").argument("<query>", "Search query").option("-t, --tasks", "Search only tasks").option("-c, --context", "Search only context").option("-l, --limit <n>", "Limit results", "20").action(async (
|
|
15
|
+
const search = new Command("search").alias("find").description("Search across tasks and context").argument("<query>", "Search query").option("-t, --tasks", "Search only tasks").option("-c, --context", "Search only context").option("-l, --limit <n>", "Limit results", "20").action(async (rawQuery, options) => {
|
|
11
16
|
const projectRoot = process.cwd();
|
|
12
17
|
const dbPath = join(projectRoot, ".stackmemory", "context.db");
|
|
13
18
|
if (!existsSync(dbPath)) {
|
|
@@ -16,12 +21,24 @@ function createSearchCommand() {
|
|
|
16
21
|
);
|
|
17
22
|
return;
|
|
18
23
|
}
|
|
24
|
+
let query;
|
|
25
|
+
let limit;
|
|
26
|
+
try {
|
|
27
|
+
query = SearchQuerySchema.parse(rawQuery);
|
|
28
|
+
limit = LimitSchema.parse(options.limit);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
if (error instanceof z.ZodError) {
|
|
31
|
+
console.error("\u274C Invalid input:", error.errors[0].message);
|
|
32
|
+
} else {
|
|
33
|
+
console.error("\u274C Invalid input");
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
19
37
|
const db = new Database(dbPath);
|
|
20
|
-
const limit = parseInt(options.limit);
|
|
21
38
|
const searchTasks = !options.context || options.tasks;
|
|
22
39
|
const searchContext = !options.tasks || options.context;
|
|
23
40
|
console.log(`
|
|
24
|
-
\u{1F50D} Searching for "${
|
|
41
|
+
\u{1F50D} Searching for "${rawQuery}"...
|
|
25
42
|
`);
|
|
26
43
|
let totalResults = 0;
|
|
27
44
|
if (searchTasks) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/commands/search.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Search Command for StackMemory CLI\n * Search across tasks and context\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\nexport function createSearchCommand(): Command {\n const search = new Command('search')\n .alias('find')\n .description('Search across tasks and context')\n .argument('<query>', 'Search query')\n .option('-t, --tasks', 'Search only tasks')\n .option('-c, --context', 'Search only context')\n .option('-l, --limit <n>', 'Limit results', '20')\n .action(async (
|
|
5
|
-
"mappings": ";;;;AAKA,SAAS,eAAe;AACxB,OAAO,cAAc;AACrB,SAAS,YAAY;AACrB,SAAS,kBAAkB;
|
|
4
|
+
"sourcesContent": ["/**\n * Search Command for StackMemory CLI\n * Search across tasks and context\n */\n\nimport { Command } from 'commander';\nimport Database from 'better-sqlite3';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { z } from 'zod';\n\n// Input validation schemas\nconst SearchQuerySchema = z\n .string()\n .min(1, 'Search query is required')\n .max(500, 'Search query too long (max 500 characters)')\n .transform((val) => {\n // Escape SQL LIKE special characters to prevent injection\n return val.replace(/[%_\\\\]/g, '\\\\$&');\n });\n\nconst LimitSchema = z\n .string()\n .transform((val) => parseInt(val, 10))\n .pipe(z.number().int().min(1).max(100).default(20));\n\nexport function createSearchCommand(): Command {\n const search = new Command('search')\n .alias('find')\n .description('Search across tasks and context')\n .argument('<query>', 'Search query')\n .option('-t, --tasks', 'Search only tasks')\n .option('-c, --context', 'Search only context')\n .option('-l, --limit <n>', 'Limit results', '20')\n .action(async (rawQuery, options) => {\n const projectRoot = process.cwd();\n const dbPath = join(projectRoot, '.stackmemory', 'context.db');\n\n if (!existsSync(dbPath)) {\n console.log(\n '\u274C StackMemory not initialized. Run \"stackmemory init\" first.'\n );\n return;\n }\n\n // Validate inputs\n let query: string;\n let limit: number;\n\n try {\n query = SearchQuerySchema.parse(rawQuery);\n limit = LimitSchema.parse(options.limit);\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error('\u274C Invalid input:', error.errors[0].message);\n } else {\n console.error('\u274C Invalid input');\n }\n return;\n }\n\n const db = new Database(dbPath);\n const searchTasks = !options.context || options.tasks;\n const searchContext = !options.tasks || options.context;\n\n // Display the original query (not the escaped one) for user\n console.log(`\\n\uD83D\uDD0D Searching for \"${rawQuery}\"...\\n`);\n\n let totalResults = 0;\n\n // Search tasks\n if (searchTasks) {\n try {\n const tasks = db\n .prepare(\n `\n SELECT id, title, description, status, priority, created_at\n FROM task_cache \n WHERE title LIKE ? OR description LIKE ?\n ORDER BY created_at DESC\n LIMIT ?\n `\n )\n .all(`%${query}%`, `%${query}%`, limit) as any[];\n\n if (tasks.length > 0) {\n console.log(`\uD83D\uDCCB Tasks (${tasks.length})\\n`);\n\n const priorityIcon: Record<string, string> = {\n urgent: '\uD83D\uDD34',\n high: '\uD83D\uDFE0',\n medium: '\uD83D\uDFE1',\n low: '\uD83D\uDFE2',\n };\n const statusIcon: Record<string, string> = {\n pending: '\u23F3',\n in_progress: '\uD83D\uDD04',\n completed: '\u2705',\n blocked: '\uD83D\uDEAB',\n };\n\n tasks.forEach((task) => {\n const pIcon = priorityIcon[task.priority] || '\u26AA';\n const sIcon = statusIcon[task.status] || '\u26AA';\n console.log(`${sIcon} ${pIcon} ${task.title}`);\n\n // Highlight match in description\n if (task.description) {\n const desc = task.description.split('\\n')[0];\n const matchIdx = desc\n .toLowerCase()\n .indexOf(query.toLowerCase());\n if (matchIdx >= 0) {\n const start = Math.max(0, matchIdx - 20);\n const end = Math.min(\n desc.length,\n matchIdx + query.length + 20\n );\n const snippet =\n (start > 0 ? '...' : '') +\n desc.slice(start, end) +\n (end < desc.length ? '...' : '');\n console.log(` ${snippet}`);\n }\n }\n });\n console.log('');\n totalResults += tasks.length;\n }\n } catch (error: unknown) {\n // Task table might not exist\n }\n }\n\n // Search context/frames\n if (searchContext) {\n try {\n const contexts = db\n .prepare(\n `\n SELECT id, type, name, metadata, created_at\n FROM frames \n WHERE name LIKE ? OR metadata LIKE ?\n ORDER BY created_at DESC\n LIMIT ?\n `\n )\n .all(`%${query}%`, `%${query}%`, limit) as any[];\n\n if (contexts.length > 0) {\n console.log(`\uD83D\uDCC1 Context Frames (${contexts.length})\\n`);\n\n const typeIcon: Record<string, string> = {\n session: '\uD83D\uDD37',\n task: '\uD83D\uDCCB',\n command: '\u26A1',\n file: '\uD83D\uDCC4',\n decision: '\uD83D\uDCA1',\n };\n\n contexts.forEach((ctx) => {\n const icon = typeIcon[ctx.type] || '\uD83D\uDCE6';\n const date = new Date(ctx.created_at * 1000).toLocaleDateString();\n console.log(\n `${icon} [${ctx.type}] ${ctx.name || ctx.id.slice(0, 10)}`\n );\n console.log(` Created: ${date}`);\n });\n console.log('');\n totalResults += contexts.length;\n }\n } catch (error: unknown) {\n // Frames table might not exist\n }\n }\n\n // Search decisions/observations in events\n if (searchContext) {\n try {\n const events = db\n .prepare(\n `\n SELECT id, type, data, timestamp\n FROM events \n WHERE data LIKE ?\n ORDER BY timestamp DESC\n LIMIT ?\n `\n )\n .all(`%${query}%`, limit) as any[];\n\n if (events.length > 0) {\n console.log(`\uD83D\uDCDD Events (${events.length})\\n`);\n\n events.forEach((evt) => {\n const date = new Date(evt.timestamp * 1000).toLocaleDateString();\n let data: any = {};\n try {\n data = JSON.parse(evt.data);\n } catch {}\n\n const summary =\n data.content || data.message || data.decision || evt.type;\n console.log(`\u26A1 [${evt.type}] ${String(summary).slice(0, 60)}`);\n console.log(` ${date}`);\n });\n console.log('');\n totalResults += events.length;\n }\n } catch (error: unknown) {\n // Events table might not exist\n }\n }\n\n db.close();\n\n if (totalResults === 0) {\n console.log('No results found.\\n');\n } else {\n console.log(`Found ${totalResults} results.\\n`);\n }\n });\n\n return search;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -72,7 +72,10 @@ class SQLiteAdapter extends FeatureAwareDatabaseAdapter {
|
|
|
72
72
|
try {
|
|
73
73
|
this.db.prepare("SELECT 1").get();
|
|
74
74
|
return true;
|
|
75
|
-
} catch {
|
|
75
|
+
} catch (error) {
|
|
76
|
+
logger.debug("Database ping failed", {
|
|
77
|
+
error: error instanceof Error ? error.message : String(error)
|
|
78
|
+
});
|
|
76
79
|
return false;
|
|
77
80
|
}
|
|
78
81
|
}
|
|
@@ -233,7 +236,10 @@ class SQLiteAdapter extends FeatureAwareDatabaseAdapter {
|
|
|
233
236
|
try {
|
|
234
237
|
const result = this.db.prepare("SELECT MAX(version) as version FROM schema_version").get();
|
|
235
238
|
return result?.version || 0;
|
|
236
|
-
} catch {
|
|
239
|
+
} catch (error) {
|
|
240
|
+
logger.debug("Schema version table not found, returning 0", {
|
|
241
|
+
error: error instanceof Error ? error.message : String(error)
|
|
242
|
+
});
|
|
237
243
|
return 0;
|
|
238
244
|
}
|
|
239
245
|
}
|
|
@@ -618,7 +624,11 @@ class SQLiteAdapter extends FeatureAwareDatabaseAdapter {
|
|
|
618
624
|
try {
|
|
619
625
|
const fileStats = await fs.stat(this.dbPath);
|
|
620
626
|
stats.diskUsage = fileStats.size;
|
|
621
|
-
} catch {
|
|
627
|
+
} catch (error) {
|
|
628
|
+
logger.debug("Failed to get database file size", {
|
|
629
|
+
dbPath: this.dbPath,
|
|
630
|
+
error: error instanceof Error ? error.message : String(error)
|
|
631
|
+
});
|
|
622
632
|
}
|
|
623
633
|
return stats;
|
|
624
634
|
}
|