@stackmemoryai/stackmemory 0.8.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +64 -0
- package/README.md +54 -4
- package/dist/src/agents/core/agent-task-manager.js +0 -1
- package/dist/src/agents/verifiers/base-verifier.js +0 -1
- package/dist/src/agents/verifiers/formatter-verifier.js +0 -1
- package/dist/src/agents/verifiers/llm-judge.js +0 -1
- package/dist/src/cli/auto-detect.js +0 -1
- package/dist/src/cli/claude-sm-danger.js +0 -1
- package/dist/src/cli/claude-sm.js +69 -373
- package/dist/src/cli/codex-sm-danger.js +0 -1
- package/dist/src/cli/codex-sm.js +28 -1
- package/dist/src/cli/commands/api.js +0 -1
- package/dist/src/cli/commands/auto-background.js +0 -1
- package/dist/src/cli/commands/cleanup-processes.js +0 -1
- package/dist/src/cli/commands/clear.js +0 -1
- package/dist/src/cli/commands/config.js +0 -1
- package/dist/src/cli/commands/context-rehydrate.js +0 -1
- package/dist/src/cli/commands/context.js +0 -1
- package/dist/src/cli/commands/daemon.js +0 -1
- package/dist/src/cli/commands/dashboard.js +4 -5
- package/dist/src/cli/commands/db.js +0 -1
- package/dist/src/cli/commands/decision.js +0 -1
- package/dist/src/cli/commands/discovery.js +0 -1
- package/dist/src/cli/commands/handoff.js +0 -1
- package/dist/src/cli/commands/hooks.js +0 -1
- package/dist/src/cli/commands/linear.js +0 -1
- package/dist/src/cli/commands/log.js +0 -1
- package/dist/src/cli/commands/login.js +0 -1
- package/dist/src/cli/commands/migrate.js +0 -1
- package/dist/src/cli/commands/model.js +0 -1
- package/dist/src/cli/commands/onboard.js +22 -7
- package/dist/src/cli/commands/ping.js +0 -1
- package/dist/src/cli/commands/projects.js +0 -1
- package/dist/src/cli/commands/ralph.js +0 -1
- package/dist/src/cli/commands/retrieval.js +0 -1
- package/dist/src/cli/commands/search.js +0 -1
- package/dist/src/cli/commands/service.js +0 -1
- package/dist/src/cli/commands/session.js +0 -1
- package/dist/src/cli/commands/setup.js +1 -6
- package/dist/src/cli/commands/shell.js +0 -1
- package/dist/src/cli/commands/signup.js +0 -1
- package/dist/src/cli/commands/skills.js +4 -3
- package/dist/src/cli/commands/storage-tier.js +0 -1
- package/dist/src/cli/commands/sweep.js +0 -1
- package/dist/src/cli/commands/tasks.js +0 -1
- package/dist/src/cli/commands/worktree.js +10 -5
- package/dist/src/cli/index.js +9 -76
- package/dist/src/cli/opencode-sm.js +28 -1
- package/dist/src/cli/utils/viewer.js +0 -1
- package/dist/src/core/config/config-manager.js +0 -1
- package/dist/src/core/config/feature-flags.js +1 -14
- package/dist/src/core/config/storage-config.js +0 -1
- package/dist/src/core/config/types.js +0 -1
- package/dist/src/core/context/auto-context.js +0 -1
- package/dist/src/core/context/dual-stack-manager.js +0 -1
- package/dist/src/core/context/enhanced-rehydration.js +0 -2
- package/dist/src/core/context/frame-database.js +60 -6
- package/dist/src/core/context/frame-digest.js +0 -1
- package/dist/src/core/context/frame-handoff-manager.js +0 -1
- package/dist/src/core/context/frame-lifecycle-hooks.js +0 -1
- package/dist/src/core/context/frame-recovery.js +0 -1
- package/dist/src/core/context/frame-stack.js +0 -1
- package/dist/src/core/context/frame-types.js +0 -1
- package/dist/src/core/context/index.js +0 -1
- package/dist/src/core/context/permission-manager.js +0 -1
- package/dist/src/core/context/recursive-context-manager.js +3 -2
- package/dist/src/core/context/refactored-frame-manager.js +0 -1
- package/dist/src/core/context/shared-context-layer.js +0 -1
- package/dist/src/core/context/stack-merge-resolver.js +0 -1
- package/dist/src/core/context/validation.js +0 -1
- package/dist/src/core/database/batch-operations.js +0 -1
- package/dist/src/core/database/connection-pool.js +0 -1
- package/dist/src/core/database/database-adapter.js +0 -1
- package/dist/src/core/database/embedding-provider-factory.js +0 -1
- package/dist/src/core/database/embedding-provider.js +0 -1
- package/dist/src/core/database/migration-manager.js +0 -1
- package/dist/src/core/database/ollama-embedding-provider.js +0 -1
- package/dist/src/core/database/openai-embedding-provider.js +0 -1
- package/dist/src/core/database/query-cache.js +0 -1
- package/dist/src/core/database/query-router.js +0 -1
- package/dist/src/core/database/sqlite-adapter.js +18 -108
- package/dist/src/core/database/transformers-embedding-provider.js +0 -1
- package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -1
- package/dist/src/core/digest/frame-digest-integration.js +0 -1
- package/dist/src/core/digest/hybrid-digest-generator.js +0 -1
- package/dist/src/core/digest/index.js +0 -1
- package/dist/src/core/digest/types.js +0 -1
- package/dist/src/core/errors/error-utils.js +0 -1
- package/dist/src/core/errors/index.js +0 -1
- package/dist/src/core/errors/recovery.js +0 -1
- package/dist/src/core/execution/parallel-executor.js +0 -1
- package/dist/src/core/extensions/custom-tools.js +0 -1
- package/dist/src/core/extensions/index.js +0 -1
- package/dist/src/core/extensions/loader.js +0 -1
- package/dist/src/core/extensions/plugin-system.js +0 -1
- package/dist/src/core/extensions/provider-adapter.js +0 -1
- package/dist/src/core/extensions/sandbox-runtime.js +0 -1
- package/dist/src/core/extensions/types.js +0 -1
- package/dist/src/core/frame/workflow-templates.js +0 -1
- package/dist/src/core/merge/conflict-detector.js +0 -1
- package/dist/src/core/merge/index.js +0 -1
- package/dist/src/core/merge/resolution-engine.js +0 -1
- package/dist/src/core/merge/stack-diff.js +0 -1
- package/dist/src/core/merge/types.js +0 -1
- package/dist/src/core/merge/unified-merge-resolver.js +0 -1
- package/dist/src/core/models/fallback-monitor.js +0 -1
- package/dist/src/core/models/model-router.js +0 -1
- package/dist/src/core/monitoring/error-handler.js +0 -1
- package/dist/src/core/monitoring/logger.js +0 -1
- package/dist/src/core/monitoring/metrics.js +0 -1
- package/dist/src/core/monitoring/progress-tracker.js +0 -1
- package/dist/src/core/monitoring/session-monitor.js +0 -1
- package/dist/src/core/performance/context-cache.js +0 -1
- package/dist/src/core/performance/index.js +0 -1
- package/dist/src/core/performance/lazy-context-loader.js +3 -8
- package/dist/src/core/performance/monitor.js +0 -1
- package/dist/src/core/performance/optimized-frame-context.js +0 -1
- package/dist/src/core/performance/performance-benchmark.js +0 -1
- package/dist/src/core/performance/performance-profiler.js +0 -1
- package/dist/src/core/performance/streaming-jsonl-parser.js +0 -1
- package/dist/src/core/persistence/postgres-adapter.js +0 -1
- package/dist/src/core/projects/project-isolation.js +0 -1
- package/dist/src/core/projects/project-manager.js +0 -1
- package/dist/src/core/query/query-parser.js +0 -1
- package/dist/src/core/query/query-templates.js +0 -1
- package/dist/src/core/retrieval/context-retriever.js +0 -1
- package/dist/src/core/retrieval/index.js +0 -1
- package/dist/src/core/retrieval/llm-context-retrieval.js +0 -1
- package/dist/src/core/retrieval/llm-provider.js +0 -1
- package/dist/src/core/retrieval/privacy-filter.js +0 -1
- package/dist/src/core/retrieval/retrieval-audit.js +0 -1
- package/dist/src/core/retrieval/summary-generator.js +15 -6
- package/dist/src/core/retrieval/types.js +0 -1
- package/dist/src/core/retrieval/unified-context-assembler.js +0 -1
- package/dist/src/core/security/index.js +0 -1
- package/dist/src/core/security/input-sanitizer.js +0 -1
- package/dist/src/core/session/clear-survival.js +0 -1
- package/dist/src/core/session/enhanced-handoff.js +0 -1
- package/dist/src/core/session/handoff-generator.js +0 -1
- package/dist/src/core/session/index.js +0 -1
- package/dist/src/core/session/session-manager.js +0 -1
- package/dist/src/core/skills/index.js +0 -1
- package/dist/src/core/skills/skill-storage.js +0 -1
- package/dist/src/core/skills/types.js +0 -1
- package/dist/src/core/storage/chromadb-adapter.js +0 -1
- package/dist/src/core/storage/infinite-storage.js +0 -1
- package/dist/src/core/storage/project-registry.js +0 -1
- package/dist/src/core/storage/remote-storage.js +4 -2
- package/dist/src/core/storage/storage-tier-manager.js +0 -1
- package/dist/src/core/storage/two-tier-storage.js +0 -1
- package/dist/src/core/trace/cli-trace-wrapper.js +0 -1
- package/dist/src/core/trace/db-trace-wrapper.js +0 -1
- package/dist/src/core/trace/debug-trace.js +0 -1
- package/dist/src/core/trace/index.js +0 -1
- package/dist/src/core/trace/linear-api-wrapper.js +0 -1
- package/dist/src/core/trace/trace-detector.js +0 -1
- package/dist/src/core/trace/trace-store.js +4 -5
- package/dist/src/core/trace/types.js +0 -1
- package/dist/src/core/types.js +0 -1
- package/dist/src/core/utils/async-mutex.js +0 -1
- package/dist/src/core/utils/compression.js +0 -1
- package/dist/src/core/utils/update-checker.js +0 -1
- package/dist/src/core/worktree/worktree-manager.js +0 -1
- package/dist/src/daemon/daemon-config.js +0 -1
- package/dist/src/daemon/services/context-service.js +0 -1
- package/dist/src/daemon/services/linear-service.js +0 -1
- package/dist/src/daemon/services/maintenance-service.js +0 -1
- package/dist/src/daemon/services/memory-service.js +0 -1
- package/dist/src/daemon/session-daemon.js +0 -1
- package/dist/src/daemon/unified-daemon.js +0 -1
- package/dist/src/features/analytics/api/analytics-api.js +0 -1
- package/dist/src/features/analytics/core/analytics-service.js +1 -2
- package/dist/src/features/analytics/index.js +0 -1
- package/dist/src/features/analytics/queries/metrics-queries.js +8 -9
- package/dist/src/features/analytics/types/metrics.js +0 -1
- package/dist/src/features/browser/browser-mcp.js +0 -1
- package/dist/src/features/sweep/index.js +0 -1
- package/dist/src/features/sweep/prediction-client.js +0 -1
- package/dist/src/features/sweep/prompt-builder.js +0 -1
- package/dist/src/features/sweep/pty-wrapper.js +11 -2
- package/dist/src/features/sweep/state-watcher.js +0 -1
- package/dist/src/features/sweep/status-bar.js +0 -1
- package/dist/src/features/sweep/sweep-server-manager.js +0 -1
- package/dist/src/features/sweep/tab-interceptor.js +0 -1
- package/dist/src/features/sweep/types.js +0 -1
- package/dist/src/features/tasks/linear-task-manager.js +0 -1
- package/dist/src/features/tasks/task-aware-context.js +0 -1
- package/dist/src/features/tui/simple-monitor.js +0 -1
- package/dist/src/features/tui/swarm-monitor.js +0 -1
- package/dist/src/features/web/client/stores/task-store.js +0 -1
- package/dist/src/features/web/server/index.js +0 -1
- package/dist/src/features/workers/tmux-manager.js +0 -1
- package/dist/src/features/workers/worker-registry.js +0 -1
- package/dist/src/hooks/auto-background.js +0 -1
- package/dist/src/hooks/config.js +0 -1
- package/dist/src/hooks/daemon.js +0 -1
- package/dist/src/hooks/diffmem-hooks.js +0 -1
- package/dist/src/hooks/events.js +0 -1
- package/dist/src/hooks/index.js +0 -4
- package/dist/src/hooks/linear-task-picker.js +0 -1
- package/dist/src/hooks/schemas.js +0 -118
- package/dist/src/hooks/secure-fs.js +0 -1
- package/dist/src/hooks/security-logger.js +0 -1
- package/dist/src/hooks/session-summary.js +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/integrations/anthropic/client.js +0 -1
- package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
- package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
- package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
- package/dist/src/integrations/claude-code/subagent-client.js +0 -1
- package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
- package/dist/src/integrations/diffmem/client.js +0 -1
- package/dist/src/integrations/diffmem/config.js +0 -1
- package/dist/src/integrations/diffmem/index.js +0 -1
- package/dist/src/integrations/diffmem/types.js +0 -1
- package/dist/src/integrations/linear/auth.js +0 -1
- package/dist/src/integrations/linear/auto-sync.js +0 -1
- package/dist/src/integrations/linear/client.js +0 -1
- package/dist/src/integrations/linear/config.js +0 -1
- package/dist/src/integrations/linear/migration.js +0 -1
- package/dist/src/integrations/linear/oauth-server.js +0 -1
- package/dist/src/integrations/linear/rest-client.js +0 -1
- package/dist/src/integrations/linear/sync-manager.js +0 -1
- package/dist/src/integrations/linear/sync-service.js +0 -1
- package/dist/src/integrations/linear/sync.js +0 -1
- package/dist/src/integrations/linear/types.js +0 -1
- package/dist/src/integrations/linear/unified-sync.js +0 -1
- package/dist/src/integrations/linear/webhook-handler.js +0 -1
- package/dist/src/integrations/linear/webhook-server.js +0 -1
- package/dist/src/integrations/linear/webhook.js +0 -1
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/index.js +1 -3
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
- package/dist/src/integrations/mcp/index.js +0 -1
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
- package/dist/src/integrations/mcp/pending-utils.js +0 -1
- package/dist/src/integrations/mcp/refactored-server.js +0 -1
- package/dist/src/integrations/mcp/remote-server.js +0 -1
- package/dist/src/integrations/mcp/schemas.js +0 -1
- package/dist/src/integrations/mcp/server.js +20 -24
- package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
- package/dist/src/integrations/mcp/tool-definitions.js +0 -1
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
- package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
- package/dist/src/integrations/ralph/index.js +0 -1
- package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
- package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
- package/dist/src/integrations/ralph/types.js +0 -1
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
- package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
- package/dist/src/middleware/exponential-rate-limiter.js +0 -1
- package/dist/src/models/user.model.js +0 -1
- package/dist/src/orchestrators/multimodal/constants.js +0 -1
- package/dist/src/orchestrators/multimodal/harness.js +0 -1
- package/dist/src/orchestrators/multimodal/providers.js +0 -1
- package/dist/src/orchestrators/multimodal/types.js +0 -1
- package/dist/src/orchestrators/multimodal/utils.js +0 -1
- package/dist/src/servers/production/auth-middleware.js +0 -1
- package/dist/src/services/config-service.js +0 -1
- package/dist/src/services/context-service.js +0 -1
- package/dist/src/skills/api-discovery.js +0 -1
- package/dist/src/skills/api-skill.js +0 -1
- package/dist/src/skills/claude-skills.js +0 -1
- package/dist/src/skills/dashboard-launcher.js +0 -1
- package/dist/src/skills/linear-task-runner.js +0 -1
- package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
- package/dist/src/skills/repo-ingestion-skill.js +0 -1
- package/dist/src/skills/spec-generator-skill.js +0 -1
- package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
- package/dist/src/types/task.js +0 -1
- package/dist/src/utils/env.js +0 -1
- package/dist/src/utils/formatting.js +0 -1
- package/dist/src/utils/process-cleanup.js +0 -1
- package/package.json +33 -8
- package/scripts/smoke-init-db.sh +77 -0
- package/dist/scripts/benchmark-performance.js +0 -48
- package/dist/scripts/benchmark-performance.js.map +0 -7
- package/dist/scripts/check-redis.js +0 -42
- package/dist/scripts/check-redis.js.map +0 -7
- package/dist/scripts/initialize.js +0 -183
- package/dist/scripts/initialize.js.map +0 -7
- package/dist/scripts/list-linear-tasks.js +0 -124
- package/dist/scripts/list-linear-tasks.js.map +0 -7
- package/dist/scripts/measure-handoff-impact.js +0 -340
- package/dist/scripts/measure-handoff-impact.js.map +0 -7
- package/dist/scripts/query-chromadb.js +0 -160
- package/dist/scripts/query-chromadb.js.map +0 -7
- package/dist/scripts/show-linear-summary.js +0 -119
- package/dist/scripts/show-linear-summary.js.map +0 -7
- package/dist/scripts/simple-swarm-demo.js +0 -90
- package/dist/scripts/simple-swarm-demo.js.map +0 -7
- package/dist/scripts/status.js +0 -155
- package/dist/scripts/status.js.map +0 -7
- package/dist/scripts/test-chromadb-sync.js +0 -192
- package/dist/scripts/test-chromadb-sync.js.map +0 -7
- package/dist/scripts/test-ralph-iteration-fix.js +0 -86
- package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
- package/dist/scripts/test-ralph-iterations.js +0 -121
- package/dist/scripts/test-ralph-iterations.js.map +0 -7
- package/dist/scripts/test-redis-storage.js +0 -389
- package/dist/scripts/test-redis-storage.js.map +0 -7
- package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
- package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
- package/dist/scripts/test-swarm-fixes.js +0 -125
- package/dist/scripts/test-swarm-fixes.js.map +0 -7
- package/dist/scripts/test-swarm-tui.js +0 -23
- package/dist/scripts/test-swarm-tui.js.map +0 -7
- package/dist/scripts/test-tui-shortcuts.js +0 -52
- package/dist/scripts/test-tui-shortcuts.js.map +0 -7
- package/dist/scripts/validate-tui-shortcuts.js +0 -60
- package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
- package/dist/src/agents/core/agent-task-manager.js.map +0 -7
- package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/src/cli/auto-detect.js.map +0 -7
- package/dist/src/cli/claude-sm-danger.js.map +0 -7
- package/dist/src/cli/claude-sm.js.map +0 -7
- package/dist/src/cli/codex-sm-danger.js.map +0 -7
- package/dist/src/cli/codex-sm.js.map +0 -7
- package/dist/src/cli/commands/api.js.map +0 -7
- package/dist/src/cli/commands/auto-background.js.map +0 -7
- package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/src/cli/commands/clear.js.map +0 -7
- package/dist/src/cli/commands/config.js.map +0 -7
- package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/src/cli/commands/context.js.map +0 -7
- package/dist/src/cli/commands/daemon.js.map +0 -7
- package/dist/src/cli/commands/dashboard.js.map +0 -7
- package/dist/src/cli/commands/db.js.map +0 -7
- package/dist/src/cli/commands/decision.js.map +0 -7
- package/dist/src/cli/commands/discovery.js.map +0 -7
- package/dist/src/cli/commands/handoff.js.map +0 -7
- package/dist/src/cli/commands/hooks.js.map +0 -7
- package/dist/src/cli/commands/linear.js.map +0 -7
- package/dist/src/cli/commands/log.js.map +0 -7
- package/dist/src/cli/commands/login.js.map +0 -7
- package/dist/src/cli/commands/migrate.js.map +0 -7
- package/dist/src/cli/commands/model.js.map +0 -7
- package/dist/src/cli/commands/onboard.js.map +0 -7
- package/dist/src/cli/commands/ping.js.map +0 -7
- package/dist/src/cli/commands/projects.js.map +0 -7
- package/dist/src/cli/commands/ralph.js.map +0 -7
- package/dist/src/cli/commands/retrieval.js.map +0 -7
- package/dist/src/cli/commands/search.js.map +0 -7
- package/dist/src/cli/commands/service.js.map +0 -7
- package/dist/src/cli/commands/session.js.map +0 -7
- package/dist/src/cli/commands/settings.js +0 -306
- package/dist/src/cli/commands/settings.js.map +0 -7
- package/dist/src/cli/commands/setup.js.map +0 -7
- package/dist/src/cli/commands/shell.js.map +0 -7
- package/dist/src/cli/commands/signup.js.map +0 -7
- package/dist/src/cli/commands/skills.js.map +0 -7
- package/dist/src/cli/commands/sms-notify.js +0 -795
- package/dist/src/cli/commands/sms-notify.js.map +0 -7
- package/dist/src/cli/commands/storage-tier.js.map +0 -7
- package/dist/src/cli/commands/sweep.js.map +0 -7
- package/dist/src/cli/commands/tasks.js.map +0 -7
- package/dist/src/cli/commands/worktree.js.map +0 -7
- package/dist/src/cli/index.js.map +0 -7
- package/dist/src/cli/opencode-sm.js.map +0 -7
- package/dist/src/cli/utils/viewer.js.map +0 -7
- package/dist/src/core/config/config-manager.js.map +0 -7
- package/dist/src/core/config/feature-flags.js.map +0 -7
- package/dist/src/core/config/storage-config.js.map +0 -7
- package/dist/src/core/config/types.js.map +0 -7
- package/dist/src/core/context/auto-context.js.map +0 -7
- package/dist/src/core/context/dual-stack-manager.js.map +0 -7
- package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/src/core/context/frame-database.js.map +0 -7
- package/dist/src/core/context/frame-digest.js.map +0 -7
- package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/src/core/context/frame-recovery.js.map +0 -7
- package/dist/src/core/context/frame-stack.js.map +0 -7
- package/dist/src/core/context/frame-types.js.map +0 -7
- package/dist/src/core/context/index.js.map +0 -7
- package/dist/src/core/context/permission-manager.js.map +0 -7
- package/dist/src/core/context/recursive-context-manager.js.map +0 -7
- package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/src/core/context/shared-context-layer.js.map +0 -7
- package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/src/core/context/validation.js.map +0 -7
- package/dist/src/core/database/batch-operations.js.map +0 -7
- package/dist/src/core/database/connection-pool.js.map +0 -7
- package/dist/src/core/database/database-adapter.js.map +0 -7
- package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
- package/dist/src/core/database/embedding-provider.js.map +0 -7
- package/dist/src/core/database/migration-manager.js.map +0 -7
- package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
- package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
- package/dist/src/core/database/query-cache.js.map +0 -7
- package/dist/src/core/database/query-router.js.map +0 -7
- package/dist/src/core/database/sqlite-adapter.js.map +0 -7
- package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/src/core/digest/index.js.map +0 -7
- package/dist/src/core/digest/types.js.map +0 -7
- package/dist/src/core/errors/error-utils.js.map +0 -7
- package/dist/src/core/errors/index.js.map +0 -7
- package/dist/src/core/errors/recovery.js.map +0 -7
- package/dist/src/core/execution/parallel-executor.js.map +0 -7
- package/dist/src/core/extensions/custom-tools.js.map +0 -7
- package/dist/src/core/extensions/index.js.map +0 -7
- package/dist/src/core/extensions/loader.js.map +0 -7
- package/dist/src/core/extensions/plugin-system.js.map +0 -7
- package/dist/src/core/extensions/provider-adapter.js.map +0 -7
- package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
- package/dist/src/core/extensions/types.js.map +0 -7
- package/dist/src/core/frame/workflow-templates.js.map +0 -7
- package/dist/src/core/merge/conflict-detector.js.map +0 -7
- package/dist/src/core/merge/index.js.map +0 -7
- package/dist/src/core/merge/resolution-engine.js.map +0 -7
- package/dist/src/core/merge/stack-diff.js.map +0 -7
- package/dist/src/core/merge/types.js.map +0 -7
- package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
- package/dist/src/core/models/fallback-monitor.js.map +0 -7
- package/dist/src/core/models/model-router.js.map +0 -7
- package/dist/src/core/monitoring/error-handler.js.map +0 -7
- package/dist/src/core/monitoring/logger.js.map +0 -7
- package/dist/src/core/monitoring/metrics.js.map +0 -7
- package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/src/core/monitoring/session-monitor.js.map +0 -7
- package/dist/src/core/performance/context-cache.js.map +0 -7
- package/dist/src/core/performance/index.js.map +0 -7
- package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/src/core/performance/monitor.js.map +0 -7
- package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/src/core/performance/performance-benchmark.js.map +0 -7
- package/dist/src/core/performance/performance-profiler.js.map +0 -7
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/src/core/projects/project-isolation.js.map +0 -7
- package/dist/src/core/projects/project-manager.js.map +0 -7
- package/dist/src/core/query/query-parser.js.map +0 -7
- package/dist/src/core/query/query-templates.js.map +0 -7
- package/dist/src/core/retrieval/context-retriever.js.map +0 -7
- package/dist/src/core/retrieval/index.js.map +0 -7
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/src/core/retrieval/llm-provider.js.map +0 -7
- package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
- package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/src/core/retrieval/summary-generator.js.map +0 -7
- package/dist/src/core/retrieval/types.js.map +0 -7
- package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
- package/dist/src/core/security/index.js.map +0 -7
- package/dist/src/core/security/input-sanitizer.js.map +0 -7
- package/dist/src/core/session/clear-survival.js.map +0 -7
- package/dist/src/core/session/enhanced-handoff.js.map +0 -7
- package/dist/src/core/session/handoff-generator.js.map +0 -7
- package/dist/src/core/session/index.js.map +0 -7
- package/dist/src/core/session/session-manager.js.map +0 -7
- package/dist/src/core/skills/index.js.map +0 -7
- package/dist/src/core/skills/skill-storage.js.map +0 -7
- package/dist/src/core/skills/types.js.map +0 -7
- package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/src/core/storage/infinite-storage.js.map +0 -7
- package/dist/src/core/storage/project-registry.js.map +0 -7
- package/dist/src/core/storage/remote-storage.js.map +0 -7
- package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
- package/dist/src/core/storage/two-tier-storage.js.map +0 -7
- package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/src/core/trace/debug-trace.js.map +0 -7
- package/dist/src/core/trace/index.js.map +0 -7
- package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/src/core/trace/trace-detector.js.map +0 -7
- package/dist/src/core/trace/trace-store.js.map +0 -7
- package/dist/src/core/trace/types.js.map +0 -7
- package/dist/src/core/types.js.map +0 -7
- package/dist/src/core/utils/async-mutex.js.map +0 -7
- package/dist/src/core/utils/compression.js.map +0 -7
- package/dist/src/core/utils/update-checker.js.map +0 -7
- package/dist/src/core/worktree/worktree-manager.js.map +0 -7
- package/dist/src/daemon/daemon-config.js.map +0 -7
- package/dist/src/daemon/services/context-service.js.map +0 -7
- package/dist/src/daemon/services/linear-service.js.map +0 -7
- package/dist/src/daemon/services/maintenance-service.js.map +0 -7
- package/dist/src/daemon/services/memory-service.js.map +0 -7
- package/dist/src/daemon/session-daemon.js.map +0 -7
- package/dist/src/daemon/unified-daemon.js.map +0 -7
- package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/src/features/analytics/index.js.map +0 -7
- package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/src/features/analytics/types/metrics.js.map +0 -7
- package/dist/src/features/browser/browser-mcp.js.map +0 -7
- package/dist/src/features/sweep/index.js.map +0 -7
- package/dist/src/features/sweep/prediction-client.js.map +0 -7
- package/dist/src/features/sweep/prompt-builder.js.map +0 -7
- package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/src/features/sweep/state-watcher.js.map +0 -7
- package/dist/src/features/sweep/status-bar.js.map +0 -7
- package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/src/features/sweep/types.js.map +0 -7
- package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/src/features/tasks/task-aware-context.js.map +0 -7
- package/dist/src/features/tui/simple-monitor.js.map +0 -7
- package/dist/src/features/tui/swarm-monitor.js.map +0 -7
- package/dist/src/features/web/client/stores/task-store.js.map +0 -7
- package/dist/src/features/web/server/index.js.map +0 -7
- package/dist/src/features/workers/tmux-manager.js.map +0 -7
- package/dist/src/features/workers/worker-registry.js.map +0 -7
- package/dist/src/hooks/auto-background.js.map +0 -7
- package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/src/hooks/config.js.map +0 -7
- package/dist/src/hooks/daemon.js.map +0 -7
- package/dist/src/hooks/diffmem-hooks.js.map +0 -7
- package/dist/src/hooks/events.js.map +0 -7
- package/dist/src/hooks/index.js.map +0 -7
- package/dist/src/hooks/linear-task-picker.js.map +0 -7
- package/dist/src/hooks/schemas.js.map +0 -7
- package/dist/src/hooks/secure-fs.js.map +0 -7
- package/dist/src/hooks/security-logger.js.map +0 -7
- package/dist/src/hooks/session-summary.js.map +0 -7
- package/dist/src/hooks/sms-action-runner.js +0 -371
- package/dist/src/hooks/sms-action-runner.js.map +0 -7
- package/dist/src/hooks/sms-notify.js +0 -506
- package/dist/src/hooks/sms-notify.js.map +0 -7
- package/dist/src/hooks/sms-watcher.js +0 -93
- package/dist/src/hooks/sms-watcher.js.map +0 -7
- package/dist/src/hooks/sms-webhook.js +0 -555
- package/dist/src/hooks/sms-webhook.js.map +0 -7
- package/dist/src/hooks/whatsapp-commands.js +0 -479
- package/dist/src/hooks/whatsapp-commands.js.map +0 -7
- package/dist/src/hooks/whatsapp-scheduler.js +0 -317
- package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/src/hooks/whatsapp-sync.js +0 -409
- package/dist/src/hooks/whatsapp-sync.js.map +0 -7
- package/dist/src/index.js.map +0 -7
- package/dist/src/integrations/anthropic/client.js.map +0 -7
- package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/src/integrations/diffmem/client.js.map +0 -7
- package/dist/src/integrations/diffmem/config.js.map +0 -7
- package/dist/src/integrations/diffmem/index.js.map +0 -7
- package/dist/src/integrations/diffmem/types.js.map +0 -7
- package/dist/src/integrations/linear/auth.js.map +0 -7
- package/dist/src/integrations/linear/auto-sync.js.map +0 -7
- package/dist/src/integrations/linear/client.js.map +0 -7
- package/dist/src/integrations/linear/config.js.map +0 -7
- package/dist/src/integrations/linear/migration.js.map +0 -7
- package/dist/src/integrations/linear/oauth-server.js.map +0 -7
- package/dist/src/integrations/linear/rest-client.js.map +0 -7
- package/dist/src/integrations/linear/sync-manager.js.map +0 -7
- package/dist/src/integrations/linear/sync-service.js.map +0 -7
- package/dist/src/integrations/linear/sync.js.map +0 -7
- package/dist/src/integrations/linear/types.js.map +0 -7
- package/dist/src/integrations/linear/unified-sync.js.map +0 -7
- package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/src/integrations/linear/webhook-server.js.map +0 -7
- package/dist/src/integrations/linear/webhook.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/src/integrations/mcp/index.js.map +0 -7
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
- package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/src/integrations/mcp/remote-server.js.map +0 -7
- package/dist/src/integrations/mcp/schemas.js.map +0 -7
- package/dist/src/integrations/mcp/server.js.map +0 -7
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/src/integrations/ralph/index.js.map +0 -7
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/src/integrations/ralph/types.js.map +0 -7
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/src/models/user.model.js.map +0 -7
- package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
- package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
- package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
- package/dist/src/orchestrators/multimodal/types.js.map +0 -7
- package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
- package/dist/src/servers/production/auth-middleware.js.map +0 -7
- package/dist/src/services/config-service.js.map +0 -7
- package/dist/src/services/context-service.js.map +0 -7
- package/dist/src/skills/api-discovery.js.map +0 -7
- package/dist/src/skills/api-skill.js.map +0 -7
- package/dist/src/skills/claude-skills.js.map +0 -7
- package/dist/src/skills/dashboard-launcher.js.map +0 -7
- package/dist/src/skills/linear-task-runner.js.map +0 -7
- package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/src/skills/spec-generator-skill.js.map +0 -7
- package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/src/types/task.js.map +0 -7
- package/dist/src/utils/env.js.map +0 -7
- package/dist/src/utils/formatting.js.map +0 -7
- package/dist/src/utils/process-cleanup.js.map +0 -7
- package/scripts/README-TESTING.md +0 -186
- package/scripts/analyze-cli-security.js +0 -288
- package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
- package/scripts/archive/analyze-linear-duplicates.js +0 -214
- package/scripts/archive/analyze-remaining-duplicates.js +0 -230
- package/scripts/archive/analyze-sta-duplicates.js +0 -292
- package/scripts/archive/analyze-sta-graphql.js +0 -399
- package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
- package/scripts/archive/check-all-duplicates.ts +0 -419
- package/scripts/archive/clean-duplicate-tasks.js +0 -114
- package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
- package/scripts/archive/create-phase-tasks.js +0 -387
- package/scripts/archive/delete-linear-duplicates.js +0 -182
- package/scripts/archive/delete-remaining-duplicates.js +0 -158
- package/scripts/archive/delete-sta-duplicates.js +0 -201
- package/scripts/archive/delete-sta-oauth.js +0 -201
- package/scripts/archive/export-sta-tasks.js +0 -62
- package/scripts/archive/install-auto-sync.js +0 -266
- package/scripts/archive/install-chromadb-hooks.sh +0 -133
- package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
- package/scripts/archive/install-post-task-hooks.sh +0 -289
- package/scripts/archive/install-stackmemory-hooks.sh +0 -420
- package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
- package/scripts/archive/merge-linear-duplicates.ts +0 -182
- package/scripts/archive/remove-sta-tasks.js +0 -70
- package/scripts/archive/setup-background-sync.sh +0 -168
- package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
- package/scripts/archive/setup-claude-autostart.sh +0 -305
- package/scripts/archive/setup-git-hooks.sh +0 -25
- package/scripts/archive/setup-linear-oauth.sh +0 -46
- package/scripts/archive/setup-mcp.sh +0 -113
- package/scripts/archive/setup-railway-deployment.sh +0 -81
- package/scripts/auto-handoff.sh +0 -262
- package/scripts/background-sync-manager.js +0 -478
- package/scripts/benchmark-performance.ts +0 -57
- package/scripts/check-redis.ts +0 -48
- package/scripts/chromadb-auto-loader.sh +0 -128
- package/scripts/chromadb-context-loader.js +0 -479
- package/scripts/claude-chromadb-hook.js +0 -460
- package/scripts/claude-linear-skill.js +0 -455
- package/scripts/claude-pre-commit.sh +0 -302
- package/scripts/claude-sm-autostart.js +0 -579
- package/scripts/claude-with-chromadb.sh +0 -69
- package/scripts/clean-linear-backlog.js +0 -273
- package/scripts/cleanup-old-sessions.sh +0 -57
- package/scripts/create-cleanup-issues.js +0 -302
- package/scripts/create-sandbox.sh +0 -269
- package/scripts/debug-linear-update.js +0 -174
- package/scripts/delete-linear-tasks.js +0 -167
- package/scripts/demos/browser-test.ts +0 -39
- package/scripts/demos/ralph-integration-demo.ts +0 -245
- package/scripts/demos/trace-demo.ts +0 -200
- package/scripts/demos/trace-detector.demo.ts +0 -171
- package/scripts/demos/trace-test.ts +0 -79
- package/scripts/deploy-ralph-swarm.sh +0 -365
- package/scripts/deploy.sh +0 -89
- package/scripts/deployment/test-deployment.js +0 -194
- package/scripts/detect-and-rehydrate.js +0 -162
- package/scripts/detect-and-rehydrate.mjs +0 -165
- package/scripts/development/create-demo-tasks.js +0 -143
- package/scripts/development/debug-frame-test.js +0 -16
- package/scripts/development/demo-auto-sync.js +0 -128
- package/scripts/development/fix-all-imports.js +0 -213
- package/scripts/development/fix-imports.js +0 -229
- package/scripts/development/fix-lint-loop.cjs +0 -103
- package/scripts/development/fix-project-id.ts +0 -161
- package/scripts/development/fix-strict-mode-issues.ts +0 -291
- package/scripts/development/reorganize-structure.sh +0 -228
- package/scripts/development/test-persistence-direct.js +0 -148
- package/scripts/development/test-persistence.js +0 -114
- package/scripts/development/test-tasks.js +0 -93
- package/scripts/development/update-imports.js +0 -212
- package/scripts/fetch-linear-status.js +0 -125
- package/scripts/initialize.ts +0 -220
- package/scripts/install-notify-hook.sh +0 -84
- package/scripts/linear-auto-sync.js +0 -262
- package/scripts/linear-auto-sync.sh +0 -161
- package/scripts/linear-sync-daemon.js +0 -150
- package/scripts/linear-task-review.js +0 -237
- package/scripts/list-linear-tasks.ts +0 -178
- package/scripts/mcp-proxy.js +0 -66
- package/scripts/measure-handoff-impact.mjs +0 -395
- package/scripts/measure-handoff-impact.ts +0 -450
- package/scripts/publish-local.js +0 -74
- package/scripts/query-chromadb.ts +0 -201
- package/scripts/ralph-integration-test.js +0 -274
- package/scripts/reconcile-local-tasks.js +0 -170
- package/scripts/recreate-frames-db.js +0 -89
- package/scripts/setup-notify-webhook.sh +0 -103
- package/scripts/show-linear-summary.ts +0 -172
- package/scripts/simple-swarm-demo.ts +0 -114
- package/scripts/stackmemory-auto-handoff.sh +0 -231
- package/scripts/start-linear-sync-daemon.sh +0 -141
- package/scripts/start-temporal-paradox.sh +0 -214
- package/scripts/status.ts +0 -224
- package/scripts/stop-notify-webhook.sh +0 -19
- package/scripts/swarm-monitor.js +0 -509
- package/scripts/sync-and-clean-tasks.js +0 -258
- package/scripts/sync-linear-graphql.js +0 -303
- package/scripts/sync-linear-tasks.js +0 -186
- package/scripts/test-auto-triggers.sh +0 -57
- package/scripts/test-browser-mcp.js +0 -74
- package/scripts/test-chromadb-full.js +0 -115
- package/scripts/test-chromadb-hooks.sh +0 -28
- package/scripts/test-chromadb-sync.ts +0 -245
- package/scripts/test-claude-config.sh +0 -123
- package/scripts/test-cli-security.js +0 -293
- package/scripts/test-code-execution.js +0 -143
- package/scripts/test-hooks-persistence.sh +0 -220
- package/scripts/test-installation-scenarios.sh +0 -359
- package/scripts/test-installation.sh +0 -224
- package/scripts/test-mcp.js +0 -163
- package/scripts/test-parallel-swarms.js +0 -443
- package/scripts/test-pre-publish-quick.sh +0 -77
- package/scripts/test-quality-gates.sh +0 -263
- package/scripts/test-ralph-iteration-fix.ts +0 -118
- package/scripts/test-ralph-iterations.ts +0 -164
- package/scripts/test-redis-storage.ts +0 -490
- package/scripts/test-rlm-basic.sh +0 -122
- package/scripts/test-rlm-comprehensive.sh +0 -260
- package/scripts/test-rlm-e2e.sh +0 -268
- package/scripts/test-rlm-simple.js +0 -90
- package/scripts/test-rlm.js +0 -110
- package/scripts/test-session-handoff.sh +0 -165
- package/scripts/test-setup-e2e.sh +0 -154
- package/scripts/test-shell-integration.sh +0 -275
- package/scripts/test-simple-ralph-state-sync.ts +0 -178
- package/scripts/test-swarm-fixes.ts +0 -161
- package/scripts/test-swarm-git-workflow.js +0 -338
- package/scripts/test-swarm-tui.ts +0 -34
- package/scripts/test-tui-shortcuts.ts +0 -66
- package/scripts/testing/ab-test-runner.ts +0 -510
- package/scripts/testing/collect-metrics.ts +0 -457
- package/scripts/testing/quick-effectiveness-demo.js +0 -187
- package/scripts/testing/ralph-cli-test.js +0 -88
- package/scripts/testing/ralph-integration-validation.js +0 -727
- package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
- package/scripts/testing/real-performance-test.js +0 -422
- package/scripts/testing/results/real-performance-results.json +0 -90
- package/scripts/testing/run-effectiveness-tests.sh +0 -176
- package/scripts/testing/simple-effectiveness-test.js +0 -310
- package/scripts/testing/test-tier-migration.js +0 -100
- package/scripts/update-linear-status.js +0 -268
- package/scripts/update-linear-tasks-fixed.js +0 -284
- package/scripts/validate-claude-config.sh +0 -155
- package/scripts/validate-swarm-implementation.js +0 -467
- package/scripts/validate-tui-shortcuts.ts +0 -83
- package/templates/claude-hooks/notify-review-hook.js +0 -360
- package/templates/claude-hooks/sms-response-handler.js +0 -174
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/retrieval/types.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Types for LLM-Driven Context Retrieval System\n * Implements intelligent context selection based on compressed summaries\n */\n\nimport { Frame, Anchor, Event } from '../context/index.js';\nimport { StackMemoryQuery } from '../query/query-parser.js';\n\n/**\n * Compressed summary of recent session activity\n */\nexport interface RecentSessionSummary {\n /** Recent frames with their key attributes */\n frames: FrameSummary[];\n /** Dominant operations performed */\n dominantOperations: OperationSummary[];\n /** Files that were touched */\n filesTouched: FileSummary[];\n /** Errors encountered */\n errorsEncountered: ErrorSummary[];\n /** Time range covered */\n timeRange: {\n start: number;\n end: number;\n durationMs: number;\n };\n}\n\nexport interface FrameSummary {\n frameId: string;\n name: string;\n type: string;\n depth: number;\n eventCount: number;\n anchorCount: number;\n score: number;\n createdAt: number;\n closedAt?: number;\n digestPreview?: string;\n}\n\nexport interface OperationSummary {\n operation: string;\n count: number;\n lastOccurrence: number;\n successRate: number;\n}\n\nexport interface FileSummary {\n path: string;\n operationCount: number;\n lastModified: number;\n operations: string[];\n}\n\nexport interface ErrorSummary {\n errorType: string;\n message: string;\n count: number;\n lastOccurrence: number;\n resolved: boolean;\n}\n\n/**\n * Historical patterns extracted from memory\n */\nexport interface HistoricalPatterns {\n /** Frame counts by topic */\n topicFrameCounts: Record<string, number>;\n /** Key decisions made */\n keyDecisions: DecisionSummary[];\n /** Recurring issues */\n recurringIssues: IssueSummary[];\n /** Common tool sequences */\n commonToolSequences: ToolSequence[];\n /** Time-based activity patterns */\n activityPatterns: ActivityPattern[];\n}\n\nexport interface DecisionSummary {\n id: string;\n text: string;\n frameId: string;\n timestamp: number;\n impact: 'low' | 'medium' | 'high';\n relatedFiles?: string[];\n}\n\nexport interface IssueSummary {\n issueType: string;\n occurrenceCount: number;\n lastSeen: number;\n resolutionRate: number;\n commonFixes?: string[];\n}\n\nexport interface ToolSequence {\n pattern: string;\n frequency: number;\n avgDuration: number;\n successRate: number;\n}\n\nexport interface ActivityPattern {\n periodType: 'hourly' | 'daily' | 'weekly';\n peakPeriods: string[];\n avgEventsPerPeriod: number;\n}\n\n/**\n * Queryable indices for fast retrieval\n */\nexport interface QueryableIndices {\n /** Index by error type */\n byErrorType: Record<string, string[]>; // errorType -> frameIds\n /** Index by timeframe */\n byTimeframe: Record<string, string[]>; // timeKey -> frameIds\n /** Index by contributor */\n byContributor: Record<string, string[]>; // userId -> frameIds\n /** Index by topic */\n byTopic: Record<string, string[]>; // topic -> frameIds\n /** Index by file */\n byFile: Record<string, string[]>; // filePath -> frameIds\n}\n\n/**\n * Complete compressed summary for LLM analysis\n */\nexport interface CompressedSummary {\n /** Project identifier */\n projectId: string;\n /** Generation timestamp */\n generatedAt: number;\n /** Recent session summary */\n recentSession: RecentSessionSummary;\n /** Historical patterns */\n historicalPatterns: HistoricalPatterns;\n /** Queryable indices */\n queryableIndices: QueryableIndices;\n /** Summary statistics */\n stats: SummaryStats;\n}\n\nexport interface SummaryStats {\n totalFrames: number;\n totalEvents: number;\n totalAnchors: number;\n totalDecisions: number;\n oldestFrame: number;\n newestFrame: number;\n avgFrameDepth: number;\n avgEventsPerFrame: number;\n}\n\n/**\n * LLM analysis request\n */\nexport interface LLMAnalysisRequest {\n /** Current user query */\n currentQuery: string;\n /** Parsed structured query */\n parsedQuery?: StackMemoryQuery;\n /** Compressed summary */\n compressedSummary: CompressedSummary;\n /** Token budget for context */\n tokenBudget: number;\n /** Optional hints for retrieval */\n hints?: RetrievalHints;\n}\n\nexport interface RetrievalHints {\n /** Prefer recent frames */\n preferRecent?: boolean;\n /** Focus on specific topics */\n focusTopics?: string[];\n /** Include error context */\n includeErrors?: boolean;\n /** Include decision history */\n includeDecisions?: boolean;\n /** Minimum relevance score */\n minRelevance?: number;\n}\n\n/**\n * LLM analysis response\n */\nexport interface LLMAnalysisResponse {\n /** Reasoning for the retrieval decision (auditable) */\n reasoning: string;\n /** Frames to retrieve with priority order */\n framesToRetrieve: FrameRetrievalPlan[];\n /** Confidence score (0.0 - 1.0) */\n confidenceScore: number;\n /** Additional context recommendations */\n recommendations: ContextRecommendation[];\n /** Analysis metadata */\n metadata: AnalysisMetadata;\n}\n\nexport interface FrameRetrievalPlan {\n frameId: string;\n priority: number; // 1-10, higher = more important\n reason: string;\n includeEvents: boolean;\n includeAnchors: boolean;\n includeDigest: boolean;\n estimatedTokens: number;\n}\n\nexport interface ContextRecommendation {\n type: 'include' | 'exclude' | 'summarize';\n target: string; // frameId, anchorId, or description\n reason: string;\n impact: 'low' | 'medium' | 'high';\n}\n\nexport interface AnalysisMetadata {\n analysisTimeMs: number;\n summaryTokens: number;\n queryComplexity: 'simple' | 'moderate' | 'complex';\n matchedPatterns: string[];\n fallbackUsed: boolean;\n}\n\n/**\n * Retrieved context result\n */\nexport interface RetrievedContext {\n /** Assembled context string */\n context: string;\n /** Frames included */\n frames: Frame[];\n /** Anchors included */\n anchors: Anchor[];\n /** Events included */\n events: Event[];\n /** LLM analysis that drove retrieval */\n analysis: LLMAnalysisResponse;\n /** Token usage */\n tokenUsage: {\n budget: number;\n used: number;\n remaining: number;\n };\n /** Retrieval metadata */\n metadata: RetrievalMetadata;\n}\n\nexport interface RetrievalMetadata {\n retrievalTimeMs: number;\n cacheHit: boolean;\n framesScanned: number;\n framesIncluded: number;\n compressionRatio: number;\n}\n\n/**\n * Configuration for the retrieval system\n */\nexport interface RetrievalConfig {\n /** Maximum frames to include in summary */\n maxSummaryFrames: number;\n /** Default token budget */\n defaultTokenBudget: number;\n /** Cache TTL in seconds */\n cacheTtlSeconds: number;\n /** Minimum confidence to use LLM suggestions */\n minConfidenceThreshold: number;\n /** Enable fallback to heuristic retrieval */\n enableFallback: boolean;\n /** LLM provider configuration */\n llmConfig: {\n provider: 'anthropic' | 'openai' | 'local';\n model: string;\n maxTokens: number;\n temperature: number;\n };\n}\n\nexport const DEFAULT_RETRIEVAL_CONFIG: RetrievalConfig = {\n maxSummaryFrames: 15,\n defaultTokenBudget: 8000,\n cacheTtlSeconds: 300,\n minConfidenceThreshold: 0.6,\n enableFallback: true,\n llmConfig: {\n provider: 'anthropic',\n model: 'claude-3-5-haiku-20241022',\n maxTokens: 1024,\n temperature: 0.3,\n },\n};\n"],
|
|
5
|
-
"mappings": ";;;;AAuRO,MAAM,2BAA4C;AAAA,EACvD,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,WAAW;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/retrieval/unified-context-assembler.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Unified Context Assembler\n * Combines StackMemory task context with DiffMem user knowledge\n * Applies privacy filtering and respects token budgets\n */\n\nimport {\n PrivacyFilter,\n PrivacyMode,\n createPrivacyFilter,\n} from './privacy-filter.js';\nimport { LLMContextRetrieval } from './llm-context-retrieval.js';\nimport {\n UserMemory,\n MemoryQuery,\n DiffMemStatus,\n} from '../../integrations/diffmem/types.js';\nimport { logger } from '../monitoring/logger.js';\n\n/**\n * Configuration for unified context assembly\n */\nexport interface UnifiedContextConfig {\n /** Total token budget for all context */\n totalTokenBudget: number;\n /** Fraction of budget for user knowledge (0.0-1.0) */\n userKnowledgeBudget: number;\n /** Fraction of budget for task context (0.0-1.0) */\n taskContextBudget: number;\n /** Fraction of budget for system context (0.0-1.0) */\n systemContextBudget: number;\n /** Privacy filtering mode */\n privacyMode: PrivacyMode;\n}\n\n/**\n * Token usage breakdown\n */\nexport interface TokenUsage {\n userKnowledge: number;\n taskContext: number;\n systemContext: number;\n total: number;\n budget: number;\n}\n\n/**\n * Metadata about the assembled context\n */\nexport interface ContextMetadata {\n diffMemAvailable: boolean;\n diffMemMemories: number;\n stackMemoryFrames: number;\n privacyFiltered: number;\n}\n\n/**\n * Result of unified context assembly\n */\nexport interface UnifiedContext {\n /** User knowledge from DiffMem */\n userKnowledge: string;\n /** Task context from StackMemory */\n taskContext: string;\n /** System context (environment, configuration) */\n systemContext: string;\n /** Combined context string */\n combined: string;\n /** Token usage breakdown */\n tokenUsage: TokenUsage;\n /** Assembly metadata */\n metadata: ContextMetadata;\n}\n\n/**\n * Interface for DiffMem hooks (to be implemented by DiffMem integration)\n */\nexport interface DiffMemHooks {\n /** Check if DiffMem is available and connected */\n getStatus(): Promise<DiffMemStatus>;\n /** Query user memories */\n queryMemories(query: MemoryQuery): Promise<UserMemory[]>;\n /** Get memories relevant to a query string */\n getRelevantMemories(query: string, limit?: number): Promise<UserMemory[]>;\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_UNIFIED_CONTEXT_CONFIG: UnifiedContextConfig = {\n totalTokenBudget: 8000,\n userKnowledgeBudget: 0.2, // 20%\n taskContextBudget: 0.7, // 70%\n systemContextBudget: 0.1, // 10%\n privacyMode: 'standard',\n};\n\n/**\n * Estimate token count from content\n * Uses rough approximation: 1 token \u2248 4 characters\n */\nfunction estimateTokens(content: string): number {\n if (!content) return 0;\n return Math.ceil(content.length / 4);\n}\n\n/**\n * Truncate content to fit within token budget\n */\nfunction truncateToTokenBudget(content: string, tokenBudget: number): string {\n if (!content) return '';\n\n const estimatedTokens = estimateTokens(content);\n if (estimatedTokens <= tokenBudget) {\n return content;\n }\n\n // Truncate to approximate character limit\n const charLimit = tokenBudget * 4;\n const truncated = content.substring(0, charLimit);\n\n // Try to truncate at a word boundary\n const lastSpace = truncated.lastIndexOf(' ');\n if (lastSpace > charLimit * 0.8) {\n return truncated.substring(0, lastSpace) + '...';\n }\n\n return truncated + '...';\n}\n\n/**\n * Unified Context Assembler\n * Orchestrates context retrieval from multiple sources\n */\nexport class UnifiedContextAssembler {\n private stackMemoryRetrieval: LLMContextRetrieval;\n private diffMemHooks: DiffMemHooks | null;\n private config: UnifiedContextConfig;\n private privacyFilter: PrivacyFilter;\n\n constructor(\n stackMemoryRetrieval: LLMContextRetrieval,\n diffMemHooks: DiffMemHooks | null,\n config: Partial<UnifiedContextConfig> = {}\n ) {\n this.stackMemoryRetrieval = stackMemoryRetrieval;\n this.diffMemHooks = diffMemHooks;\n this.config = { ...DEFAULT_UNIFIED_CONTEXT_CONFIG, ...config };\n this.privacyFilter = createPrivacyFilter(this.config.privacyMode);\n\n // Validate budget allocations\n const totalAllocation =\n this.config.userKnowledgeBudget +\n this.config.taskContextBudget +\n this.config.systemContextBudget;\n\n if (Math.abs(totalAllocation - 1.0) > 0.001) {\n logger.warn('Budget allocations do not sum to 1.0', {\n userKnowledge: this.config.userKnowledgeBudget,\n taskContext: this.config.taskContextBudget,\n systemContext: this.config.systemContextBudget,\n total: totalAllocation,\n });\n }\n }\n\n /**\n * Assemble unified context from all sources\n */\n async assemble(query: string): Promise<UnifiedContext> {\n const startTime = Date.now();\n let totalPrivacyFiltered = 0;\n\n // Calculate token budgets for each section\n const userKnowledgeBudget = Math.floor(\n this.config.totalTokenBudget * this.config.userKnowledgeBudget\n );\n const taskContextBudget = Math.floor(\n this.config.totalTokenBudget * this.config.taskContextBudget\n );\n const systemContextBudget = Math.floor(\n this.config.totalTokenBudget * this.config.systemContextBudget\n );\n\n // 1. Gather user knowledge from DiffMem\n const {\n content: userKnowledge,\n memories: diffMemMemories,\n available: diffMemAvailable,\n } = await this.gatherUserKnowledge(query, userKnowledgeBudget);\n\n // Apply privacy filter to user knowledge\n const userKnowledgeFiltered = this.privacyFilter.filter(userKnowledge);\n totalPrivacyFiltered += userKnowledgeFiltered.redactedCount;\n const filteredUserKnowledge = truncateToTokenBudget(\n userKnowledgeFiltered.filtered,\n userKnowledgeBudget\n );\n\n // 2. Gather task context from StackMemory\n const { content: taskContext, frameCount } = await this.gatherTaskContext(\n query,\n taskContextBudget\n );\n\n // Apply privacy filter to task context\n const taskContextFiltered = this.privacyFilter.filter(taskContext);\n totalPrivacyFiltered += taskContextFiltered.redactedCount;\n const filteredTaskContext = truncateToTokenBudget(\n taskContextFiltered.filtered,\n taskContextBudget\n );\n\n // 3. Gather system context\n const systemContext = this.gatherSystemContext(systemContextBudget);\n\n // Apply privacy filter to system context\n const systemContextFiltered = this.privacyFilter.filter(systemContext);\n totalPrivacyFiltered += systemContextFiltered.redactedCount;\n const filteredSystemContext = truncateToTokenBudget(\n systemContextFiltered.filtered,\n systemContextBudget\n );\n\n // 4. Combine all context sections\n const combined = this.combineContextSections(\n filteredUserKnowledge,\n filteredTaskContext,\n filteredSystemContext\n );\n\n // Calculate token usage\n const tokenUsage: TokenUsage = {\n userKnowledge: estimateTokens(filteredUserKnowledge),\n taskContext: estimateTokens(filteredTaskContext),\n systemContext: estimateTokens(filteredSystemContext),\n total: estimateTokens(combined),\n budget: this.config.totalTokenBudget,\n };\n\n const metadata: ContextMetadata = {\n diffMemAvailable,\n diffMemMemories,\n stackMemoryFrames: frameCount,\n privacyFiltered: totalPrivacyFiltered,\n };\n\n logger.info('Unified context assembled', {\n query: query.substring(0, 50),\n tokenUsage,\n metadata,\n assemblyTimeMs: Date.now() - startTime,\n });\n\n return {\n userKnowledge: filteredUserKnowledge,\n taskContext: filteredTaskContext,\n systemContext: filteredSystemContext,\n combined,\n tokenUsage,\n metadata,\n };\n }\n\n /**\n * Gather user knowledge from DiffMem\n */\n private async gatherUserKnowledge(\n query: string,\n tokenBudget: number\n ): Promise<{ content: string; memories: number; available: boolean }> {\n if (!this.diffMemHooks) {\n return { content: '', memories: 0, available: false };\n }\n\n try {\n // Check DiffMem status\n const status = await this.diffMemHooks.getStatus();\n if (!status.connected) {\n logger.debug('DiffMem not connected');\n return { content: '', memories: 0, available: false };\n }\n\n // Query relevant memories\n const memories = await this.diffMemHooks.getRelevantMemories(query, 10);\n\n if (memories.length === 0) {\n return { content: '', memories: 0, available: true };\n }\n\n // Format memories into context string\n const sections: string[] = ['## User Knowledge'];\n\n // Group memories by category\n const byCategory = new Map<string, UserMemory[]>();\n for (const memory of memories) {\n const existing = byCategory.get(memory.category) || [];\n existing.push(memory);\n byCategory.set(memory.category, existing);\n }\n\n // Format each category\n for (const [category, categoryMemories] of byCategory) {\n sections.push(`\\n### ${this.formatCategory(category)}`);\n for (const memory of categoryMemories) {\n const confidence =\n memory.confidence >= 0.8\n ? '(high confidence)'\n : memory.confidence >= 0.5\n ? ''\n : '(tentative)';\n sections.push(`- ${memory.content} ${confidence}`);\n }\n }\n\n const content = sections.join('\\n');\n return {\n content: truncateToTokenBudget(content, tokenBudget),\n memories: memories.length,\n available: true,\n };\n } catch (error) {\n logger.warn('Failed to gather user knowledge from DiffMem', { error });\n return { content: '', memories: 0, available: false };\n }\n }\n\n /**\n * Format category name for display\n */\n private formatCategory(category: string): string {\n return category\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n\n /**\n * Gather task context from StackMemory\n */\n private async gatherTaskContext(\n query: string,\n tokenBudget: number\n ): Promise<{ content: string; frameCount: number }> {\n try {\n const retrievedContext = await this.stackMemoryRetrieval.retrieveContext(\n query,\n {\n tokenBudget,\n }\n );\n\n return {\n content: retrievedContext.context,\n frameCount: retrievedContext.frames.length,\n };\n } catch (error) {\n logger.warn('Failed to gather task context from StackMemory', { error });\n return { content: '', frameCount: 0 };\n }\n }\n\n /**\n * Gather system context (environment, timestamps, etc.)\n */\n private gatherSystemContext(tokenBudget: number): string {\n const sections: string[] = ['## System Context'];\n\n // Add timestamp\n sections.push(`\\n**Current Time**: ${new Date().toISOString()}`);\n\n // Add environment info (sanitized)\n const nodeEnv = process.env.NODE_ENV || 'development';\n sections.push(`**Environment**: ${nodeEnv}`);\n\n // Add project info if available\n const projectId = process.env.STACKMEMORY_PROJECT_ID;\n if (projectId) {\n sections.push(`**Project**: ${projectId}`);\n }\n\n // Add session info\n const sessionId = process.env.STACKMEMORY_SESSION_ID;\n if (sessionId) {\n sections.push(`**Session**: ${sessionId.substring(0, 8)}...`);\n }\n\n const content = sections.join('\\n');\n return truncateToTokenBudget(content, tokenBudget);\n }\n\n /**\n * Combine all context sections into a single string\n */\n private combineContextSections(\n userKnowledge: string,\n taskContext: string,\n systemContext: string\n ): string {\n const sections: string[] = [];\n\n // Add sections in priority order\n if (taskContext) {\n sections.push(taskContext);\n }\n\n if (userKnowledge) {\n sections.push(userKnowledge);\n }\n\n if (systemContext) {\n sections.push(systemContext);\n }\n\n return sections.join('\\n\\n---\\n\\n');\n }\n\n /**\n * Update privacy mode\n */\n setPrivacyMode(mode: PrivacyMode): void {\n this.config.privacyMode = mode;\n this.privacyFilter.setMode(mode);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): UnifiedContextConfig {\n return { ...this.config };\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<UnifiedContextConfig>): void {\n this.config = { ...this.config, ...config };\n if (config.privacyMode) {\n this.privacyFilter.setMode(config.privacyMode);\n }\n }\n}\n\n/**\n * Factory function to create a unified context assembler\n */\nexport function createUnifiedContextAssembler(\n stackMemoryRetrieval: LLMContextRetrieval,\n diffMemHooks: DiffMemHooks | null = null,\n config: Partial<UnifiedContextConfig> = {}\n): UnifiedContextAssembler {\n return new UnifiedContextAssembler(\n stackMemoryRetrieval,\n diffMemHooks,\n config\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/security/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Security module exports\n * Provides centralized security utilities for the application\n */\n\nexport {\n // Sensitive data handling\n SENSITIVE_PATTERNS,\n redactSensitiveData,\n containsSensitiveData,\n sanitizeForLogging,\n\n // SQL safety\n sanitizeForSqlLike,\n sanitizeIdentifier,\n validateTableName,\n\n // File path safety\n sanitizeFilePath,\n\n // Input validation\n InputSchemas,\n validateInput,\n createAggregateSchema,\n\n // Shell command safety\n validateShellArg,\n\n // JSON safety\n safeJsonParse,\n} from './input-sanitizer.js';\n"],
|
|
5
|
-
"mappings": ";;;;AAKA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAGA;AAAA,OACK;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/security/input-sanitizer.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Input Sanitizer - Centralized input validation and sanitization\n * Provides security utilities to prevent injection attacks and ensure data integrity\n */\n\nimport { z } from 'zod';\nimport { resolve as pathResolve, relative as pathRelative } from 'path';\nimport { ValidationError, ErrorCode } from '../errors/index.js';\n\n/**\n * Sensitive data patterns that should never be logged\n */\nexport const SENSITIVE_PATTERNS = [\n /\\b(api[_-]?key|apikey)\\s*[:=]\\s*['\"]?[\\w-]+['\"]?/gi,\n /\\b(secret|password|token|credential|auth)\\s*[:=]\\s*['\"]?[\\w-]+['\"]?/gi,\n /\\b(lin_api_[\\w]+)/gi, // Linear API keys\n /\\b(lin_oauth_[\\w]+)/gi, // Linear OAuth tokens\n /\\b(sk-[\\w]+)/gi, // OpenAI-style API keys\n /\\b(npm_[\\w]+)/gi, // NPM tokens\n /\\b(ghp_[\\w]+)/gi, // GitHub personal access tokens\n /\\b(ghs_[\\w]+)/gi, // GitHub secret tokens\n /Bearer\\s+[\\w.-]+/gi,\n /Basic\\s+[\\w=]+/gi,\n /postgres(ql)?:\\/\\/[^@\\s]+:[^@\\s]+@/gi, // Database URLs with credentials\n];\n\n/**\n * Redact sensitive information from a string\n */\nexport function redactSensitiveData(input: string): string {\n let result = input;\n for (const pattern of SENSITIVE_PATTERNS) {\n pattern.lastIndex = 0;\n result = result.replace(pattern, '[REDACTED]');\n }\n return result;\n}\n\n/**\n * Check if a string contains potentially sensitive data\n */\nexport function containsSensitiveData(input: string): boolean {\n return SENSITIVE_PATTERNS.some((pattern) => {\n pattern.lastIndex = 0; // Reset regex state\n return pattern.test(input);\n });\n}\n\n/**\n * Sanitize a string for safe SQL LIKE queries\n * Escapes special characters that could be used for SQL injection\n */\nexport function sanitizeForSqlLike(input: string): string {\n if (!input) return '';\n // Escape SQL LIKE special characters\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/%/g, '\\\\%')\n .replace(/_/g, '\\\\_')\n .replace(/'/g, \"''\");\n}\n\n/**\n * Validate and sanitize table/column names to prevent SQL injection\n * Only allows alphanumeric characters and underscores\n */\nexport function sanitizeIdentifier(input: string): string {\n if (!input) {\n throw new ValidationError(\n 'Identifier cannot be empty',\n ErrorCode.VALIDATION_FAILED\n );\n }\n // Only allow alphanumeric and underscores\n const sanitized = input.replace(/[^a-zA-Z0-9_]/g, '');\n if (sanitized !== input) {\n throw new ValidationError(\n `Invalid identifier: ${input}. Only alphanumeric characters and underscores are allowed.`,\n ErrorCode.VALIDATION_FAILED,\n { input, sanitized }\n );\n }\n // Prevent SQL keywords\n const sqlKeywords = [\n 'DROP',\n 'DELETE',\n 'INSERT',\n 'UPDATE',\n 'SELECT',\n 'UNION',\n 'ALTER',\n 'CREATE',\n 'TRUNCATE',\n 'EXEC',\n 'EXECUTE',\n ];\n if (sqlKeywords.includes(sanitized.toUpperCase())) {\n throw new ValidationError(\n `Invalid identifier: ${input}. SQL keywords are not allowed.`,\n ErrorCode.VALIDATION_FAILED,\n { input }\n );\n }\n return sanitized;\n}\n\n/**\n * Validate allowed table names\n */\nconst ALLOWED_TABLES = [\n 'frames',\n 'events',\n 'anchors',\n 'contexts',\n 'task_cache',\n 'schema_version',\n 'attention_log',\n 'traces',\n];\n\nexport function validateTableName(tableName: string): string {\n const sanitized = sanitizeIdentifier(tableName);\n if (!ALLOWED_TABLES.includes(sanitized)) {\n throw new ValidationError(\n `Invalid table name: ${tableName}. Allowed tables: ${ALLOWED_TABLES.join(', ')}`,\n ErrorCode.VALIDATION_FAILED,\n { tableName, allowed: ALLOWED_TABLES }\n );\n }\n return sanitized;\n}\n\n/**\n * Validate and sanitize file paths\n * Prevents path traversal attacks\n */\nexport function sanitizeFilePath(input: string, baseDir?: string): string {\n if (!input) {\n throw new ValidationError(\n 'File path cannot be empty',\n ErrorCode.VALIDATION_FAILED\n );\n }\n\n // Check for null bytes\n if (input.includes('\\0')) {\n throw new ValidationError(\n 'File path contains invalid characters',\n ErrorCode.VALIDATION_FAILED,\n { reason: 'null_byte' }\n );\n }\n\n // Check for path traversal\n if (input.includes('..')) {\n throw new ValidationError(\n 'Path traversal not allowed',\n ErrorCode.VALIDATION_FAILED,\n { path: input }\n );\n }\n\n // If baseDir provided, ensure path stays within it\n if (baseDir) {\n const resolvedPath = pathResolve(baseDir, input);\n const relativePath = pathRelative(baseDir, resolvedPath);\n if (\n relativePath.startsWith('..') ||\n pathResolve(relativePath) === resolvedPath\n ) {\n // Path escapes baseDir\n if (relativePath.startsWith('..')) {\n throw new ValidationError(\n 'Path escapes base directory',\n ErrorCode.VALIDATION_FAILED,\n { path: input, baseDir }\n );\n }\n }\n return resolvedPath;\n }\n\n return input;\n}\n\n/**\n * Sensitive field names that should be redacted in logs\n */\nconst SENSITIVE_FIELD_NAMES = [\n 'password',\n 'token',\n 'apikey',\n 'api_key',\n 'secret',\n 'credential',\n 'authorization',\n 'auth',\n 'accesstoken',\n 'access_token',\n 'refreshtoken',\n 'refresh_token',\n];\n\n/**\n * Check if a field name is sensitive\n */\nfunction isSensitiveFieldName(key: string): boolean {\n const lowerKey = key.toLowerCase();\n return SENSITIVE_FIELD_NAMES.some((sf) => lowerKey.includes(sf));\n}\n\n/**\n * Sanitize an object for logging (redact sensitive fields)\n */\nexport function sanitizeForLogging(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return redactSensitiveData(obj);\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sanitizeForLogging);\n }\n\n if (typeof obj === 'object') {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n // Check if this key is sensitive\n if (isSensitiveFieldName(key)) {\n sanitized[key] = '[REDACTED]';\n } else {\n // Recursively sanitize nested objects\n sanitized[key] = sanitizeForLogging(value);\n }\n }\n return sanitized;\n }\n\n return obj;\n}\n\n/**\n * Zod schemas for common input validation\n */\nexport const InputSchemas = {\n // Frame-related\n frameId: z.string().uuid('Invalid frame ID format'),\n frameName: z\n .string()\n .min(1, 'Frame name is required')\n .max(500, 'Frame name too long')\n .refine(\n (val) => !containsSensitiveData(val),\n 'Frame name may contain sensitive data'\n ),\n frameType: z.enum([\n 'task',\n 'subtask',\n 'tool_scope',\n 'review',\n 'write',\n 'debug',\n ]),\n\n // Query-related\n searchQuery: z\n .string()\n .min(1, 'Search query is required')\n .max(1000, 'Search query too long')\n .transform((val) => sanitizeForSqlLike(val)),\n\n limit: z.number().int().min(1).max(1000).default(50),\n offset: z.number().int().min(0).default(0),\n\n // Task-related\n taskTitle: z\n .string()\n .min(1, 'Task title is required')\n .max(500, 'Task title too long'),\n taskDescription: z.string().max(10000, 'Description too long').optional(),\n taskPriority: z.enum(['low', 'medium', 'high', 'urgent', 'critical']),\n taskStatus: z.enum([\n 'pending',\n 'in_progress',\n 'completed',\n 'blocked',\n 'cancelled',\n ]),\n\n // Anchor-related\n anchorType: z.enum([\n 'FACT',\n 'DECISION',\n 'CONSTRAINT',\n 'INTERFACE_CONTRACT',\n 'TODO',\n 'RISK',\n ]),\n anchorText: z\n .string()\n .min(1, 'Anchor text is required')\n .max(10000, 'Anchor text too long'),\n priority: z.number().int().min(0).max(10).default(5),\n\n // File path\n filePath: z\n .string()\n .min(1, 'File path is required')\n .max(4096, 'File path too long')\n .refine((val) => !val.includes('\\0'), 'Invalid characters in path')\n .refine((val) => !val.includes('..'), 'Path traversal not allowed'),\n\n // Project ID\n projectId: z\n .string()\n .min(1, 'Project ID is required')\n .max(100, 'Project ID too long')\n .regex(\n /^[a-zA-Z0-9_-]+$/,\n 'Project ID can only contain letters, numbers, hyphens, and underscores'\n ),\n\n // Session ID\n sessionId: z.string().uuid('Invalid session ID format').optional(),\n\n // Date/time\n timestamp: z.number().int().positive(),\n dateString: z.string().datetime(),\n\n // Generic content (with sensitive data check)\n safeContent: z\n .string()\n .max(100000, 'Content too large')\n .refine(\n (val) => !containsSensitiveData(val),\n 'Content may contain sensitive data that should not be stored'\n ),\n\n // Email\n email: z\n .string()\n .email('Invalid email format')\n .max(254, 'Email too long')\n .transform((val) => val.toLowerCase()),\n\n // URL\n url: z.string().url('Invalid URL format').max(2048, 'URL too long'),\n};\n\n/**\n * Validate input using a Zod schema with detailed error messages\n */\nexport function validateInput<T>(\n schema: z.ZodSchema<T>,\n input: unknown,\n context: string\n): T {\n const result = schema.safeParse(input);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n }));\n\n throw new ValidationError(\n `Invalid input for ${context}: ${errors.map((e) => e.message).join(', ')}`,\n ErrorCode.VALIDATION_FAILED,\n { context, errors }\n );\n }\n\n return result.data;\n}\n\n/**\n * Create a schema for validating aggregate query options\n * Prevents SQL injection through dynamic field names\n */\nexport function createAggregateSchema(allowedFields: string[]) {\n return z.object({\n groupBy: z\n .array(z.string())\n .refine(\n (fields) => fields.every((f) => allowedFields.includes(f)),\n `Group by fields must be one of: ${allowedFields.join(', ')}`\n ),\n metrics: z.array(\n z.object({\n operation: z.enum(['COUNT', 'SUM', 'AVG', 'MIN', 'MAX']),\n field: z\n .string()\n .refine(\n (f) => f === '*' || allowedFields.includes(f),\n `Field must be one of: ${allowedFields.join(', ')}`\n ),\n alias: z\n .string()\n .regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/)\n .optional(),\n })\n ),\n orderBy: z\n .string()\n .refine(\n (f) => allowedFields.includes(f),\n `Order by must be one of: ${allowedFields.join(', ')}`\n )\n .optional(),\n limit: z.number().int().min(1).max(1000).optional(),\n });\n}\n\n/**\n * Validate command line arguments for shell safety\n * Prevents command injection\n */\nexport function validateShellArg(arg: string): string {\n if (!arg) return '';\n\n // Check for shell metacharacters\n const dangerousChars = /[;&|`$(){}[\\]<>!#*?~\\n\\r]/;\n if (dangerousChars.test(arg)) {\n throw new ValidationError(\n 'Argument contains potentially dangerous shell characters',\n ErrorCode.VALIDATION_FAILED,\n { arg: arg.substring(0, 50) }\n );\n }\n\n return arg;\n}\n\n/**\n * Safe JSON parse with validation\n */\nexport function safeJsonParse<T>(\n input: string,\n schema?: z.ZodSchema<T>\n): T | null {\n try {\n const parsed = JSON.parse(input);\n if (schema) {\n return validateInput(schema, parsed, 'JSON parse');\n }\n return parsed as T;\n } catch {\n return null;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/session/clear-survival.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Clear Survival System for StackMemory\n * Inspired by Continuous-Claude's \"Clear, don't compact\" philosophy\n *\n * Allows StackMemory to survive /clear operations by:\n * 1. Detecting when context is getting full (>70%)\n * 2. Saving critical state to external ledgers\n * 3. Restoring from ledgers after /clear\n * 4. Maintaining continuity across session resets\n */\n\nimport { Frame, Trace, Context, Digest } from '../types';\nimport { FrameManager } from '../frame/frame-manager';\nimport { DatabaseManager } from '../storage/database-manager';\nimport { HandoffGenerator } from './handoff-generator';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport interface ContextUsage {\n totalFrames: number;\n activeFrames: number;\n sessionCount: number;\n percentageUsed: number;\n}\n\nexport interface ContinuityLedger {\n version: '1.0.0';\n timestamp: string;\n session_id: string;\n project: string;\n branch?: string;\n\n // Critical state to preserve\n active_frame_stack: FrameSummary[];\n key_decisions: Decision[];\n active_tasks: Task[];\n critical_context: string[];\n recent_achievements: Achievement[];\n\n // Navigation aids\n current_focus: string;\n next_actions: string[];\n warnings: string[];\n\n // Metrics for restoration\n original_token_count: number;\n compressed_token_count: number;\n compression_ratio: number;\n}\n\ninterface FrameSummary {\n id: string;\n type: string;\n description: string;\n depth: number;\n key_events: string[];\n digest?: string;\n}\n\ninterface Decision {\n id: string;\n decision: string;\n rationale: string;\n impact: 'low' | 'medium' | 'high' | 'critical';\n still_applies: boolean;\n}\n\ninterface Task {\n id: string;\n title: string;\n status: 'pending' | 'in_progress' | 'blocked' | 'completed';\n priority: 'low' | 'medium' | 'high' | 'critical';\n context: string;\n}\n\ninterface Achievement {\n description: string;\n impact: string;\n timestamp: string;\n}\n\nexport class ClearSurvival {\n private frameManager: FrameManager;\n private dbManager: DatabaseManager;\n private handoffGenerator: HandoffGenerator;\n private ledgerPath: string;\n private continuityPath: string;\n\n // Thresholds\n private readonly CONTEXT_WARNING_THRESHOLD = 0.6; // 60%\n private readonly CONTEXT_CRITICAL_THRESHOLD = 0.7; // 70%\n private readonly CONTEXT_MAX_THRESHOLD = 0.85; // 85% - force save\n\n constructor(\n frameManager: FrameManager,\n dbManager: DatabaseManager,\n handoffGenerator: HandoffGenerator,\n projectRoot: string\n ) {\n this.frameManager = frameManager;\n this.dbManager = dbManager;\n this.handoffGenerator = handoffGenerator;\n this.ledgerPath = path.join(projectRoot, '.stackmemory', 'ledgers');\n this.continuityPath = path.join(projectRoot, '.stackmemory', 'continuity');\n }\n\n /**\n * Get current context usage statistics\n */\n async getContextUsage(): Promise<ContextUsage> {\n try {\n const frames = await this.frameManager.getAllFrames();\n const activeFrames = frames.filter(f => f.status === 'open').length;\n const sessionId = await this.dbManager.getCurrentSessionId();\n \n // Estimate based on frame count (simplified)\n const estimatedTokens = frames.length * 100; // Rough estimate\n const maxTokens = 10000; // Approximate max context\n const percentageUsed = Math.min(100, (estimatedTokens / maxTokens) * 100);\n\n return {\n totalFrames: frames.length,\n activeFrames,\n sessionCount: 1,\n percentageUsed\n };\n } catch (error) {\n // Fallback for testing or when DB is not available\n return {\n totalFrames: 50,\n activeFrames: 3,\n sessionCount: 2,\n percentageUsed: 25\n };\n }\n }\n\n /**\n * Assess context status based on usage\n */\n assessContextStatus(usage: ContextUsage): string {\n if (usage.percentageUsed < 50) return 'healthy';\n if (usage.percentageUsed < 70) return 'moderate';\n if (usage.percentageUsed < 85) return 'critical';\n return 'saved';\n }\n\n /**\n * Monitor context usage and trigger saves when needed\n */\n async monitorContextUsage(\n currentTokens: number,\n maxTokens: number\n ): Promise<'ok' | 'warning' | 'critical' | 'saved'> {\n const usage = currentTokens / maxTokens;\n\n if (usage < this.CONTEXT_WARNING_THRESHOLD) {\n return 'ok';\n }\n\n if (usage >= this.CONTEXT_MAX_THRESHOLD) {\n // Force save at 85%\n await this.saveContinuityLedger();\n return 'saved';\n }\n\n if (usage >= this.CONTEXT_CRITICAL_THRESHOLD) {\n // Suggest save at 70%\n console.warn(\n `\u26A0\uFE0F Context at ${Math.round(usage * 100)}% - Consider /clear after saving`\n );\n return 'critical';\n }\n\n // Warning at 60%\n console.warn(`Context at ${Math.round(usage * 100)}% - Approaching limit`);\n return 'warning';\n }\n\n /**\n * Save continuity ledger before /clear\n */\n async saveContinuityLedger(): Promise<ContinuityLedger> {\n const sessionId = await this.dbManager.getCurrentSessionId();\n const session = await this.dbManager.getSession(sessionId);\n\n // Get current state\n const frameStack = await this.getCompressedFrameStack();\n const decisions = await this.getCriticalDecisions();\n const tasks = await this.getActiveTasks();\n const context = await this.getCriticalContext();\n const achievements = await this.getRecentAchievements();\n\n // Calculate token counts (simplified)\n const originalTokens = await this.estimateCurrentTokens();\n const compressedTokens = this.estimateLedgerTokens(\n frameStack,\n decisions,\n tasks\n );\n\n const ledger: ContinuityLedger = {\n version: '1.0.0',\n timestamp: new Date().toISOString(),\n session_id: sessionId,\n project: session?.project || 'unknown',\n branch: session?.metadata?.branch,\n\n active_frame_stack: frameStack,\n key_decisions: decisions,\n active_tasks: tasks,\n critical_context: context,\n recent_achievements: achievements,\n\n current_focus: await this.getCurrentFocus(),\n next_actions: await this.suggestNextActions(tasks),\n warnings: await this.getWarnings(),\n\n original_token_count: originalTokens,\n compressed_token_count: compressedTokens,\n compression_ratio: originalTokens / compressedTokens,\n };\n\n // Save to file (overwrites previous continuity ledger)\n await this.saveLedgerToFile(ledger);\n\n // Also create a timestamped backup\n await this.saveBackupLedger(ledger);\n\n console.log(\n `\u2705 Continuity ledger saved (${Math.round(ledger.compression_ratio)}x compression)`\n );\n\n return ledger;\n }\n\n /**\n * Restore from continuity ledger after /clear\n */\n async restoreFromLedger(): Promise<boolean> {\n try {\n const ledger = await this.loadLatestLedger();\n if (!ledger) {\n console.log('No continuity ledger found');\n return false;\n }\n\n console.log(`\uD83D\uDCDA Restoring from ledger (${ledger.timestamp})`);\n\n // Restore frame stack structure (not full content)\n await this.restoreFrameStructure(ledger.active_frame_stack);\n\n // Restore key decisions as anchors\n await this.restoreDecisions(ledger.key_decisions);\n\n // Restore active tasks\n await this.restoreTasks(ledger.active_tasks);\n\n // Log restoration summary\n console.log(`\u2705 Restored:`);\n console.log(` - ${ledger.active_frame_stack.length} frames`);\n console.log(` - ${ledger.key_decisions.length} decisions`);\n console.log(` - ${ledger.active_tasks.length} tasks`);\n console.log(` - Current focus: ${ledger.current_focus}`);\n\n if (ledger.warnings.length > 0) {\n console.warn(`\u26A0\uFE0F Warnings:`, ledger.warnings);\n }\n\n return true;\n } catch (error: unknown) {\n console.error('Failed to restore from ledger:', error);\n return false;\n }\n }\n\n /**\n * Generate markdown summary for human review\n */\n async generateLedgerMarkdown(ledger: ContinuityLedger): Promise<string> {\n const lines: string[] = [\n `# Continuity Ledger`,\n `**Saved**: ${new Date(ledger.timestamp).toLocaleString()}`,\n `**Project**: ${ledger.project}${ledger.branch ? ` (${ledger.branch})` : ''}`,\n `**Compression**: ${Math.round(ledger.compression_ratio)}x (${ledger.original_token_count} \u2192 ${ledger.compressed_token_count} tokens)`,\n '',\n\n `## \uD83C\uDFAF Current Focus`,\n ledger.current_focus,\n '',\n\n `## \uD83D\uDCDA Active Frame Stack (${ledger.active_frame_stack.length})`,\n ...ledger.active_frame_stack.map(\n (f) => `${' '.repeat(f.depth)}\u2514\u2500 ${f.type}: ${f.description}`\n ),\n '',\n\n `## \uD83C\uDFAF Active Tasks (${ledger.active_tasks.filter((t) => t.status !== 'completed').length})`,\n ...ledger.active_tasks\n .filter((t) => t.status !== 'completed')\n .sort((a, b) => {\n const priority = { critical: 0, high: 1, medium: 2, low: 3 };\n return priority[a.priority] - priority[b.priority];\n })\n .map((t) => `- [${t.priority}] ${t.title} (${t.status})`),\n '',\n\n `## \uD83D\uDD11 Key Decisions`,\n ...ledger.key_decisions\n .filter((d) => d.still_applies)\n .map((d) => `- **${d.decision}**\\n ${d.rationale}`),\n '',\n\n `## \u2705 Recent Achievements`,\n ...ledger.recent_achievements.map(\n (a) => `- ${a.description} \u2192 ${a.impact}`\n ),\n '',\n\n `## \u27A1\uFE0F Next Actions`,\n ...ledger.next_actions.map((a, i) => `${i + 1}. ${a}`),\n '',\n\n ledger.warnings.length > 0 ? `## \u26A0\uFE0F Warnings` : '',\n ...ledger.warnings.map((w) => `- ${w}`),\n ];\n\n return lines.filter((l) => l !== '').join('\\n');\n }\n\n /**\n * Check if /clear is recommended\n */\n async shouldClear(\n currentTokens: number,\n maxTokens: number\n ): Promise<{\n recommended: boolean;\n reason?: string;\n alternative?: string;\n }> {\n const usage = currentTokens / maxTokens;\n\n if (usage < this.CONTEXT_WARNING_THRESHOLD) {\n return { recommended: false };\n }\n\n // Check if we have redundant frames\n const frameStack = await this.frameManager.getStack();\n const redundantFrames = frameStack.frames.filter(\n (f) => f.status === 'closed' && !f.metadata?.critical\n ).length;\n\n if (usage >= this.CONTEXT_CRITICAL_THRESHOLD) {\n if (redundantFrames > 5) {\n return {\n recommended: true,\n reason: `Context at ${Math.round(usage * 100)}% with ${redundantFrames} closed frames`,\n alternative: 'Consider saving ledger and clearing',\n };\n }\n }\n\n return {\n recommended: false,\n alternative: `Context at ${Math.round(usage * 100)}% but manageable`,\n };\n }\n\n // Private helper methods\n\n private async getCompressedFrameStack(): Promise<FrameSummary[]> {\n const stack = await this.frameManager.getStack();\n\n return stack.frames.map((frame, index) => ({\n id: frame.id,\n type: frame.type,\n description: frame.description || 'Unnamed frame',\n depth: index,\n key_events: this.extractKeyEvents(frame),\n digest: frame.digest?.summary,\n }));\n }\n\n private extractKeyEvents(frame: Frame): string[] {\n const events: string[] = [];\n\n // Extract from metadata\n if (frame.metadata?.decision) {\n events.push(`Decision: ${frame.metadata.decision}`);\n }\n if (frame.metadata?.error) {\n events.push(`Error: ${frame.metadata.error}`);\n }\n if (frame.metadata?.achievement) {\n events.push(`Achievement: ${frame.metadata.achievement}`);\n }\n\n return events;\n }\n\n private async getCriticalDecisions(): Promise<Decision[]> {\n const traces = await this.dbManager.getRecentTraces(\n await this.dbManager.getCurrentSessionId(),\n 100\n );\n\n return traces\n .filter((t) => t.type === 'decision')\n .map((t) => ({\n id: t.id,\n decision: t.content.decision || '',\n rationale: t.content.rationale || '',\n impact: this.assessImpact(t),\n still_applies: !t.metadata?.superseded,\n }))\n .filter((d) => d.impact !== 'low');\n }\n\n private assessImpact(trace: Trace): Decision['impact'] {\n const content = JSON.stringify(trace.content).toLowerCase();\n\n if (content.includes('architecture') || content.includes('critical')) {\n return 'critical';\n }\n if (content.includes('important') || content.includes('significant')) {\n return 'high';\n }\n if (content.includes('minor') || content.includes('small')) {\n return 'low';\n }\n\n return 'medium';\n }\n\n private async getActiveTasks(): Promise<Task[]> {\n const frames = await this.dbManager.getRecentFrames(\n await this.dbManager.getCurrentSessionId(),\n 50\n );\n\n return frames\n .filter((f) => f.type === 'task')\n .map((f) => ({\n id: f.id,\n title: f.description || 'Untitled task',\n status: this.getTaskStatus(f),\n priority: this.getTaskPriority(f),\n context: f.metadata?.context || '',\n }));\n }\n\n private getTaskStatus(frame: Frame): Task['status'] {\n if (frame.status === 'closed' && frame.metadata?.completed) {\n return 'completed';\n }\n if (frame.metadata?.blocked) return 'blocked';\n if (frame.status === 'open') return 'in_progress';\n return 'pending';\n }\n\n private getTaskPriority(frame: Frame): Task['priority'] {\n const priority = frame.metadata?.priority;\n if (['critical', 'high', 'medium', 'low'].includes(priority)) {\n return priority as Task['priority'];\n }\n return 'medium';\n }\n\n private async getCriticalContext(): Promise<string[]> {\n const context: string[] = [];\n\n // Add project-specific context\n const session = await this.dbManager.getSession(\n await this.dbManager.getCurrentSessionId()\n );\n if (session?.metadata?.key_facts) {\n context.push(...session.metadata.key_facts);\n }\n\n // Add recent important discoveries\n const traces = await this.dbManager.getRecentTraces(\n await this.dbManager.getCurrentSessionId(),\n 50\n );\n\n const discoveries = traces\n .filter((t) => t.metadata?.important || t.type === 'discovery')\n .map((t) => t.content.summary || t.content.description)\n .filter(Boolean)\n .slice(0, 5);\n\n context.push(...discoveries);\n\n return context;\n }\n\n private async getRecentAchievements(): Promise<Achievement[]> {\n const frames = await this.dbManager.getRecentFrames(\n await this.dbManager.getCurrentSessionId(),\n 20\n );\n\n return frames\n .filter((f) => f.status === 'closed' && f.metadata?.achievement)\n .map((f) => ({\n description: f.metadata.achievement,\n impact: f.metadata.impact || 'completed task',\n timestamp: f.closedAt || f.createdAt,\n }))\n .slice(0, 5);\n }\n\n private async getCurrentFocus(): Promise<string> {\n const stack = await this.frameManager.getStack();\n const activeFrame = stack.frames.find((f) => f.status === 'open');\n\n if (!activeFrame) {\n return 'No active focus';\n }\n\n return `${activeFrame.type}: ${activeFrame.description || 'In progress'}`;\n }\n\n private async suggestNextActions(tasks: Task[]): Promise<string[]> {\n const suggestions: string[] = [];\n\n // Continue in-progress tasks\n const inProgress = tasks.filter((t) => t.status === 'in_progress');\n if (inProgress.length > 0) {\n suggestions.push(`Continue: ${inProgress[0].title}`);\n }\n\n // Start high-priority pending tasks\n const highPriority = tasks.filter(\n (t) => t.status === 'pending' && t.priority === 'high'\n );\n if (highPriority.length > 0) {\n suggestions.push(`Start: ${highPriority[0].title}`);\n }\n\n // Unblock blocked tasks\n const blocked = tasks.filter((t) => t.status === 'blocked');\n if (blocked.length > 0) {\n suggestions.push(`Unblock: ${blocked[0].title}`);\n }\n\n return suggestions.slice(0, 3);\n }\n\n private async getWarnings(): Promise<string[]> {\n const warnings: string[] = [];\n\n const tasks = await this.getActiveTasks();\n const blocked = tasks.filter((t) => t.status === 'blocked');\n\n if (blocked.length > 0) {\n warnings.push(`${blocked.length} tasks blocked`);\n }\n\n const critical = tasks.filter(\n (t) => t.priority === 'critical' && t.status !== 'completed'\n );\n if (critical.length > 0) {\n warnings.push(`${critical.length} critical tasks pending`);\n }\n\n return warnings;\n }\n\n private async estimateCurrentTokens(): Promise<number> {\n // Simplified estimation\n const frames = await this.frameManager.getStack();\n const traces = await this.dbManager.getRecentTraces(\n await this.dbManager.getCurrentSessionId(),\n 100\n );\n\n const frameTokens = frames.frames.length * 200; // Rough estimate\n const traceTokens = traces.length * 100; // Rough estimate\n\n return frameTokens + traceTokens;\n }\n\n private estimateLedgerTokens(\n frames: FrameSummary[],\n decisions: Decision[],\n tasks: Task[]\n ): number {\n // Rough estimation\n return frames.length * 50 + decisions.length * 30 + tasks.length * 20;\n }\n\n private async saveLedgerToFile(ledger: ContinuityLedger): Promise<void> {\n await fs.mkdir(this.continuityPath, { recursive: true });\n\n // Save as CONTINUITY_CLAUDE-latest.json (overwrites)\n const latestPath = path.join(\n this.continuityPath,\n 'CONTINUITY_CLAUDE-latest.json'\n );\n await fs.writeFile(latestPath, JSON.stringify(ledger, null, 2), 'utf-8');\n\n // Also save markdown version\n const markdown = await this.generateLedgerMarkdown(ledger);\n const mdPath = path.join(\n this.continuityPath,\n 'CONTINUITY_CLAUDE-latest.md'\n );\n await fs.writeFile(mdPath, markdown, 'utf-8');\n }\n\n private async saveBackupLedger(ledger: ContinuityLedger): Promise<void> {\n await fs.mkdir(this.ledgerPath, { recursive: true });\n\n const timestamp = ledger.timestamp.replace(/[:.]/g, '-');\n const backupPath = path.join(this.ledgerPath, `ledger-${timestamp}.json`);\n await fs.writeFile(backupPath, JSON.stringify(ledger, null, 2), 'utf-8');\n }\n\n private async loadLatestLedger(): Promise<ContinuityLedger | null> {\n try {\n const latestPath = path.join(\n this.continuityPath,\n 'CONTINUITY_CLAUDE-latest.json'\n );\n const content = await fs.readFile(latestPath, 'utf-8');\n return JSON.parse(content) as ContinuityLedger;\n } catch (error: unknown) {\n return null;\n }\n }\n\n private async restoreFrameStructure(frames: FrameSummary[]): Promise<void> {\n // Create lightweight frame references (not full frames)\n for (const summary of frames) {\n await this.frameManager.push({\n type: summary.type,\n description: summary.description,\n metadata: {\n restored_from_ledger: true,\n original_id: summary.id,\n key_events: summary.key_events,\n digest: summary.digest,\n },\n });\n }\n }\n\n private async restoreDecisions(decisions: Decision[]): Promise<void> {\n for (const decision of decisions) {\n if (decision.still_applies) {\n await this.dbManager.addAnchor({\n type: 'decision',\n content: {\n decision: decision.decision,\n rationale: decision.rationale,\n impact: decision.impact,\n },\n metadata: {\n restored_from_ledger: true,\n original_id: decision.id,\n },\n });\n }\n }\n }\n\n private async restoreTasks(tasks: Task[]): Promise<void> {\n for (const task of tasks) {\n if (task.status !== 'completed') {\n await this.frameManager.push({\n type: 'task',\n description: task.title,\n metadata: {\n status: task.status,\n priority: task.priority,\n context: task.context,\n restored_from_ledger: true,\n original_id: task.id,\n },\n });\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/session/enhanced-handoff.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Enhanced Handoff Generator\n * Produces high-efficacy handoffs (70-85% context preservation)\n * Target: 2,000-3,000 tokens for rich context\n */\n\nimport { execSync } from 'child_process';\nimport {\n existsSync,\n readFileSync,\n readdirSync,\n statSync,\n writeFileSync,\n mkdirSync,\n} from 'fs';\nimport { basename, join } from 'path';\nimport { homedir, tmpdir } from 'os';\nimport { globSync } from 'glob';\n\n// Token counting - use Anthropic's tokenizer for accurate counts\nlet countTokens: (text: string) => number;\ntry {\n // Dynamic import for CommonJS compatibility\n const tokenizer = await import('@anthropic-ai/tokenizer');\n countTokens = tokenizer.countTokens;\n} catch {\n // Fallback to estimation if tokenizer not available\n countTokens = (text: string) => Math.ceil(text.length / 3.5);\n}\n\n// Load session decisions if available\ninterface SessionDecision {\n id: string;\n what: string;\n why: string;\n alternatives?: string[];\n timestamp: string;\n category?: string;\n}\n\n// Review feedback persistence\ninterface StoredReviewFeedback {\n timestamp: string;\n source: string;\n keyPoints: string[];\n actionItems: string[];\n sourceFile?: string;\n}\n\ninterface ReviewFeedbackStore {\n feedbacks: StoredReviewFeedback[];\n lastUpdated: string;\n}\n\nfunction loadSessionDecisions(projectRoot: string): SessionDecision[] {\n const storePath = join(projectRoot, '.stackmemory', 'session-decisions.json');\n if (existsSync(storePath)) {\n try {\n const store = JSON.parse(readFileSync(storePath, 'utf-8'));\n return store.decisions || [];\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction loadReviewFeedback(projectRoot: string): StoredReviewFeedback[] {\n const storePath = join(projectRoot, '.stackmemory', 'review-feedback.json');\n if (existsSync(storePath)) {\n try {\n const store: ReviewFeedbackStore = JSON.parse(\n readFileSync(storePath, 'utf-8')\n );\n // Return feedbacks from last 24 hours\n const cutoff = Date.now() - 24 * 60 * 60 * 1000;\n return store.feedbacks.filter(\n (f) => new Date(f.timestamp).getTime() > cutoff\n );\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction saveReviewFeedback(\n projectRoot: string,\n feedbacks: StoredReviewFeedback[]\n): void {\n const dir = join(projectRoot, '.stackmemory');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const storePath = join(dir, 'review-feedback.json');\n\n // Load existing and merge\n let existing: StoredReviewFeedback[] = [];\n if (existsSync(storePath)) {\n try {\n const store: ReviewFeedbackStore = JSON.parse(\n readFileSync(storePath, 'utf-8')\n );\n existing = store.feedbacks || [];\n } catch {\n // Ignore parse errors\n }\n }\n\n // Deduplicate by source + first key point\n const seen = new Set<string>();\n const merged: StoredReviewFeedback[] = [];\n\n for (const f of [...feedbacks, ...existing]) {\n const key = `${f.source}:${f.keyPoints[0] || ''}`;\n if (!seen.has(key)) {\n seen.add(key);\n merged.push(f);\n }\n }\n\n // Keep only last 20 feedbacks\n const store: ReviewFeedbackStore = {\n feedbacks: merged.slice(0, 20),\n lastUpdated: new Date().toISOString(),\n };\n\n writeFileSync(storePath, JSON.stringify(store, null, 2));\n}\n\n/**\n * Find Claude agent output directories dynamically\n */\nfunction findAgentOutputDirs(projectRoot: string): string[] {\n const dirs: string[] = [];\n\n // Try multiple locations where agent outputs might be stored\n const tmpBase = process.env['TMPDIR'] || tmpdir() || '/tmp';\n\n // Pattern 1: /tmp/claude/-path-to-project/tasks\n const projectPathEncoded = projectRoot.replace(/\\//g, '-').replace(/^-/, '');\n const pattern1 = join(tmpBase, 'claude', `*${projectPathEncoded}*`, 'tasks');\n try {\n const matches = globSync(pattern1);\n dirs.push(...matches);\n } catch {\n // Glob failed\n }\n\n // Pattern 2: /private/tmp/claude/... (macOS specific)\n if (tmpBase !== '/private/tmp') {\n const pattern2 = join(\n '/private/tmp',\n 'claude',\n `*${projectPathEncoded}*`,\n 'tasks'\n );\n try {\n const matches = globSync(pattern2);\n dirs.push(...matches);\n } catch {\n // Glob failed\n }\n }\n\n // Pattern 3: ~/.claude/projects/*/tasks (if exists)\n const homeClaudeDir = join(homedir(), '.claude', 'projects');\n if (existsSync(homeClaudeDir)) {\n try {\n const projectDirs = readdirSync(homeClaudeDir);\n for (const d of projectDirs) {\n const tasksDir = join(homeClaudeDir, d, 'tasks');\n if (existsSync(tasksDir)) {\n dirs.push(tasksDir);\n }\n }\n } catch {\n // Failed to read\n }\n }\n\n return [...new Set(dirs)]; // Deduplicate\n}\n\nexport interface EnhancedHandoff {\n // Metadata\n timestamp: string;\n project: string;\n branch: string;\n sessionDuration?: string;\n\n // What we're building (HIGH VALUE)\n activeWork: {\n description: string;\n status: 'in_progress' | 'blocked' | 'review' | 'done';\n keyFiles: string[];\n progress?: string;\n };\n\n // Decisions made (HIGH VALUE)\n decisions: Array<{\n what: string;\n why: string;\n alternatives?: string[];\n }>;\n\n // Architecture context (MEDIUM VALUE)\n architecture: {\n keyComponents: Array<{\n file: string;\n purpose: string;\n }>;\n patterns: string[];\n };\n\n // Blockers and issues (HIGH VALUE)\n blockers: Array<{\n issue: string;\n attempted: string[];\n status: 'resolved' | 'open';\n }>;\n\n // Review feedback (HIGH VALUE if present)\n reviewFeedback?: {\n source: string;\n keyPoints: string[];\n actionItems: string[];\n }[];\n\n // Next actions (MEDIUM VALUE)\n nextActions: string[];\n\n // Patterns established (LOW-MEDIUM VALUE)\n codePatterns?: string[];\n\n // Token metrics\n estimatedTokens: number;\n}\n\nexport class EnhancedHandoffGenerator {\n private projectRoot: string;\n private claudeProjectsDir: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.claudeProjectsDir = join(homedir(), '.claude', 'projects');\n }\n\n /**\n * Generate a high-efficacy handoff\n */\n async generate(): Promise<EnhancedHandoff> {\n const handoff: EnhancedHandoff = {\n timestamp: new Date().toISOString(),\n project: basename(this.projectRoot),\n branch: this.getCurrentBranch(),\n activeWork: await this.extractActiveWork(),\n decisions: await this.extractDecisions(),\n architecture: await this.extractArchitecture(),\n blockers: await this.extractBlockers(),\n reviewFeedback: await this.extractReviewFeedback(),\n nextActions: await this.extractNextActions(),\n codePatterns: await this.extractCodePatterns(),\n estimatedTokens: 0,\n };\n\n // Calculate estimated tokens\n const markdown = this.toMarkdown(handoff);\n handoff.estimatedTokens = countTokens(markdown);\n\n return handoff;\n }\n\n /**\n * Extract what we're currently building from git and recent files\n */\n private async extractActiveWork(): Promise<EnhancedHandoff['activeWork']> {\n // Get recent commits to understand current work\n const recentCommits = this.getRecentCommits(5);\n const recentFiles = this.getRecentlyModifiedFiles(10);\n\n // Try to infer the active work from commit messages\n let description = 'Unknown - check git log for context';\n let status: EnhancedHandoff['activeWork']['status'] = 'in_progress';\n\n if (recentCommits.length > 0) {\n // Use most recent commit as indicator\n const lastCommit = recentCommits[0];\n if (lastCommit.includes('feat:') || lastCommit.includes('implement')) {\n description = lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n } else if (lastCommit.includes('fix:')) {\n description = 'Bug fix: ' + lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n } else if (\n lastCommit.includes('chore:') ||\n lastCommit.includes('refactor:')\n ) {\n description = lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n } else {\n description = lastCommit.replace(/^[a-f0-9]+\\s+/, '');\n }\n }\n\n // Check for blocking indicators\n const gitStatus = this.getGitStatus();\n if (gitStatus.includes('conflict')) {\n status = 'blocked';\n }\n\n return {\n description,\n status,\n keyFiles: recentFiles.slice(0, 5),\n progress:\n recentCommits.length > 0\n ? `${recentCommits.length} commits in current session`\n : undefined,\n };\n }\n\n /**\n * Extract decisions from session store, git commits, and decision logs\n */\n private async extractDecisions(): Promise<EnhancedHandoff['decisions']> {\n const decisions: EnhancedHandoff['decisions'] = [];\n\n // First, load session decisions (highest priority - explicitly recorded)\n const sessionDecisions = loadSessionDecisions(this.projectRoot);\n for (const d of sessionDecisions) {\n decisions.push({\n what: d.what,\n why: d.why,\n alternatives: d.alternatives,\n });\n }\n\n // Then look for decision markers in recent commits\n const commits = this.getRecentCommits(20);\n for (const commit of commits) {\n // Look for decision-like patterns\n if (\n commit.toLowerCase().includes('use ') ||\n commit.toLowerCase().includes('switch to ') ||\n commit.toLowerCase().includes('default to ') ||\n (commit.toLowerCase().includes('make ') &&\n commit.toLowerCase().includes('optional'))\n ) {\n // Avoid duplicates\n const commitText = commit.replace(/^[a-f0-9]+\\s+/, '');\n if (!decisions.some((d) => d.what.includes(commitText.slice(0, 30)))) {\n decisions.push({\n what: commitText,\n why: 'See commit for details',\n });\n }\n }\n }\n\n // Check for a decisions file\n const decisionsFile = join(\n this.projectRoot,\n '.stackmemory',\n 'decisions.md'\n );\n if (existsSync(decisionsFile)) {\n const content = readFileSync(decisionsFile, 'utf-8');\n const parsed = this.parseDecisionsFile(content);\n decisions.push(...parsed);\n }\n\n return decisions.slice(0, 10); // Limit to prevent bloat\n }\n\n /**\n * Parse a decisions.md file\n */\n private parseDecisionsFile(content: string): EnhancedHandoff['decisions'] {\n const decisions: EnhancedHandoff['decisions'] = [];\n const lines = content.split('\\n');\n\n let currentDecision: {\n what: string;\n why: string;\n alternatives?: string[];\n } | null = null;\n\n for (const line of lines) {\n if (line.startsWith('## ') || line.startsWith('### ')) {\n if (currentDecision) {\n decisions.push(currentDecision);\n }\n currentDecision = { what: line.replace(/^#+\\s+/, ''), why: '' };\n } else if (currentDecision && line.toLowerCase().includes('rationale:')) {\n currentDecision.why = line.replace(/rationale:\\s*/i, '').trim();\n } else if (currentDecision && line.toLowerCase().includes('why:')) {\n currentDecision.why = line.replace(/why:\\s*/i, '').trim();\n } else if (\n currentDecision &&\n line.toLowerCase().includes('alternatives:')\n ) {\n currentDecision.alternatives = [];\n } else if (currentDecision?.alternatives && line.trim().startsWith('-')) {\n currentDecision.alternatives.push(line.replace(/^\\s*-\\s*/, '').trim());\n }\n }\n\n if (currentDecision) {\n decisions.push(currentDecision);\n }\n\n return decisions;\n }\n\n /**\n * Extract architecture context from key files\n */\n private async extractArchitecture(): Promise<\n EnhancedHandoff['architecture']\n > {\n const keyComponents: EnhancedHandoff['architecture']['keyComponents'] = [];\n const patterns: string[] = [];\n\n // Find recently modified TypeScript/JavaScript files\n const recentFiles = this.getRecentlyModifiedFiles(20);\n const codeFiles = recentFiles.filter(\n (f) => f.endsWith('.ts') || f.endsWith('.js') || f.endsWith('.tsx')\n );\n\n for (const file of codeFiles.slice(0, 8)) {\n const purpose = this.inferFilePurpose(file);\n if (purpose) {\n keyComponents.push({ file, purpose });\n }\n }\n\n // Detect patterns from file structure\n if (codeFiles.some((f) => f.includes('/daemon/'))) {\n patterns.push('Daemon/background process pattern');\n }\n if (codeFiles.some((f) => f.includes('/cli/'))) {\n patterns.push('CLI command pattern');\n }\n if (\n codeFiles.some((f) => f.includes('.test.') || f.includes('__tests__'))\n ) {\n patterns.push('Test files present');\n }\n if (codeFiles.some((f) => f.includes('/core/'))) {\n patterns.push('Core/domain separation');\n }\n\n return { keyComponents, patterns };\n }\n\n /**\n * Infer purpose from file name and path\n */\n private inferFilePurpose(filePath: string): string | null {\n const name = basename(filePath).replace(/\\.(ts|js|tsx)$/, '');\n const path = filePath.toLowerCase();\n\n if (path.includes('daemon')) return 'Background daemon/service';\n if (path.includes('cli/command')) return 'CLI command handler';\n if (path.includes('config')) return 'Configuration management';\n if (path.includes('storage')) return 'Data storage layer';\n if (path.includes('handoff')) return 'Session handoff logic';\n if (path.includes('service')) return 'Service orchestration';\n if (path.includes('manager')) return 'Resource/state management';\n if (path.includes('handler')) return 'Event/request handler';\n if (path.includes('util') || path.includes('helper'))\n return 'Utility functions';\n if (path.includes('types') || path.includes('interface'))\n return 'Type definitions';\n if (path.includes('test')) return null; // Skip test files\n if (name.includes('-')) {\n return name\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n }\n return null;\n }\n\n /**\n * Extract blockers from git status and recent errors\n */\n private async extractBlockers(): Promise<EnhancedHandoff['blockers']> {\n const blockers: EnhancedHandoff['blockers'] = [];\n\n // Check for merge conflicts\n const gitStatus = this.getGitStatus();\n if (gitStatus.includes('UU ') || gitStatus.includes('both modified')) {\n blockers.push({\n issue: 'Merge conflict detected',\n attempted: ['Check git status for affected files'],\n status: 'open',\n });\n }\n\n // Check for failing tests\n try {\n const testResult = execSync('npm run test:run 2>&1 || true', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n timeout: 30000,\n });\n if (testResult.includes('FAIL') || testResult.includes('failed')) {\n const failCount = (testResult.match(/(\\d+) failed/i) || ['', '?'])[1];\n blockers.push({\n issue: `Test failures: ${failCount} tests failing`,\n attempted: ['Run npm test for details'],\n status: 'open',\n });\n }\n } catch {\n // Test command failed - might indicate issues\n }\n\n // Check for lint errors\n try {\n const lintResult = execSync('npm run lint 2>&1 || true', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n timeout: 30000,\n });\n if (lintResult.includes('error') && !lintResult.includes('0 errors')) {\n blockers.push({\n issue: 'Lint errors present',\n attempted: ['Run npm run lint for details'],\n status: 'open',\n });\n }\n } catch {\n // Lint command failed\n }\n\n return blockers;\n }\n\n /**\n * Extract review feedback from agent output files and persisted storage\n */\n private async extractReviewFeedback(): Promise<\n EnhancedHandoff['reviewFeedback']\n > {\n const feedback: EnhancedHandoff['reviewFeedback'] = [];\n const newFeedbacks: StoredReviewFeedback[] = [];\n\n // Find agent output directories dynamically\n const outputDirs = findAgentOutputDirs(this.projectRoot);\n\n for (const tmpDir of outputDirs) {\n if (!existsSync(tmpDir)) continue;\n\n try {\n const files = readdirSync(tmpDir).filter((f) => f.endsWith('.output'));\n const recentFiles = files\n .map((f) => ({\n name: f,\n path: join(tmpDir, f),\n stat: statSync(join(tmpDir, f)),\n }))\n .filter((f) => Date.now() - f.stat.mtimeMs < 3600000) // Last hour\n .sort((a, b) => b.stat.mtimeMs - a.stat.mtimeMs)\n .slice(0, 3);\n\n for (const file of recentFiles) {\n const content = readFileSync(file.path, 'utf-8');\n const extracted = this.extractKeyPointsFromReview(content);\n if (extracted.keyPoints.length > 0) {\n feedback.push(extracted);\n\n // Also store for persistence\n newFeedbacks.push({\n timestamp: new Date().toISOString(),\n source: extracted.source,\n keyPoints: extracted.keyPoints,\n actionItems: extracted.actionItems,\n sourceFile: file.name,\n });\n }\n }\n } catch {\n // Failed to read agent outputs from this directory\n }\n }\n\n // Save new feedback to persistent storage\n if (newFeedbacks.length > 0) {\n saveReviewFeedback(this.projectRoot, newFeedbacks);\n }\n\n // Load persisted feedback if no new feedback found\n if (feedback.length === 0) {\n const stored = loadReviewFeedback(this.projectRoot);\n for (const s of stored.slice(0, 3)) {\n feedback.push({\n source: s.source,\n keyPoints: s.keyPoints,\n actionItems: s.actionItems,\n });\n }\n }\n\n return feedback.length > 0 ? feedback : undefined;\n }\n\n /**\n * Extract key points from a review output\n */\n private extractKeyPointsFromReview(content: string): {\n source: string;\n keyPoints: string[];\n actionItems: string[];\n } {\n const keyPoints: string[] = [];\n const actionItems: string[] = [];\n let source = 'Agent Review';\n\n // Detect review type\n if (\n content.includes('Product Manager') ||\n content.includes('product-manager')\n ) {\n source = 'Product Manager';\n } else if (\n content.includes('Staff Architect') ||\n content.includes('staff-architect')\n ) {\n source = 'Staff Architect';\n }\n\n // Extract key recommendations (look for common patterns)\n const lines = content.split('\\n');\n let inRecommendations = false;\n let inActionItems = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Detect section headers\n if (\n trimmed.toLowerCase().includes('recommendation') ||\n trimmed.toLowerCase().includes('key finding')\n ) {\n inRecommendations = true;\n inActionItems = false;\n continue;\n }\n if (\n trimmed.toLowerCase().includes('action') ||\n trimmed.toLowerCase().includes('next step') ||\n trimmed.toLowerCase().includes('priority')\n ) {\n inActionItems = true;\n inRecommendations = false;\n continue;\n }\n\n // Extract bullet points\n if (\n trimmed.startsWith('- ') ||\n trimmed.startsWith('* ') ||\n /^\\d+\\.\\s/.test(trimmed)\n ) {\n const point = trimmed.replace(/^[-*]\\s+/, '').replace(/^\\d+\\.\\s+/, '');\n if (point.length > 10 && point.length < 200) {\n if (inActionItems) {\n actionItems.push(point);\n } else if (inRecommendations) {\n keyPoints.push(point);\n }\n }\n }\n }\n\n // Limit to prevent bloat\n return {\n source,\n keyPoints: keyPoints.slice(0, 5),\n actionItems: actionItems.slice(0, 5),\n };\n }\n\n /**\n * Extract next actions from todo state and git\n */\n private async extractNextActions(): Promise<string[]> {\n const actions: string[] = [];\n\n // Check for uncommitted changes\n const gitStatus = this.getGitStatus();\n if (gitStatus.trim()) {\n actions.push('Commit pending changes');\n }\n\n // Look for TODO comments in recent files\n const recentFiles = this.getRecentlyModifiedFiles(5);\n for (const file of recentFiles) {\n try {\n const fullPath = join(this.projectRoot, file);\n if (existsSync(fullPath)) {\n const content = readFileSync(fullPath, 'utf-8');\n const todos = content.match(/\\/\\/\\s*TODO:?\\s*.+/gi) || [];\n for (const todo of todos.slice(0, 2)) {\n actions.push(todo.replace(/\\/\\/\\s*TODO:?\\s*/i, 'TODO: '));\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n // Check for pending tasks in .stackmemory\n const tasksFile = join(this.projectRoot, '.stackmemory', 'tasks.json');\n if (existsSync(tasksFile)) {\n try {\n const tasks = JSON.parse(readFileSync(tasksFile, 'utf-8'));\n const pending = tasks.filter(\n (t: any) => t.status === 'pending' || t.status === 'in_progress'\n );\n for (const task of pending.slice(0, 3)) {\n actions.push(task.title || task.description);\n }\n } catch {\n // Invalid tasks file\n }\n }\n\n return actions.slice(0, 8);\n }\n\n /**\n * Extract established code patterns\n */\n private async extractCodePatterns(): Promise<string[]> {\n const patterns: string[] = [];\n\n // Check ESLint config for patterns\n const eslintConfig = join(this.projectRoot, 'eslint.config.js');\n if (existsSync(eslintConfig)) {\n const content = readFileSync(eslintConfig, 'utf-8');\n if (content.includes('argsIgnorePattern')) {\n patterns.push('Underscore prefix for unused vars (_var)');\n }\n if (content.includes('ignores') && content.includes('test')) {\n patterns.push('Test files excluded from lint');\n }\n }\n\n // Check tsconfig for patterns\n const tsconfig = join(this.projectRoot, 'tsconfig.json');\n if (existsSync(tsconfig)) {\n const content = readFileSync(tsconfig, 'utf-8');\n if (content.includes('\"strict\": true')) {\n patterns.push('TypeScript strict mode enabled');\n }\n if (content.includes('ES2022') || content.includes('ESNext')) {\n patterns.push('ESM module system');\n }\n }\n\n return patterns;\n }\n\n /**\n * Get recent git commits\n */\n private getRecentCommits(count: number): string[] {\n try {\n const result = execSync(`git log --oneline -${count}`, {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n });\n return result.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n }\n\n /**\n * Get current git branch\n */\n private getCurrentBranch(): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n }).trim();\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get git status\n */\n private getGitStatus(): string {\n try {\n return execSync('git status --short', {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n });\n } catch {\n return '';\n }\n }\n\n /**\n * Get recently modified files\n */\n private getRecentlyModifiedFiles(count: number): string[] {\n try {\n const result = execSync(\n `git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only`,\n {\n encoding: 'utf-8',\n cwd: this.projectRoot,\n }\n );\n return result.trim().split('\\n').filter(Boolean).slice(0, count);\n } catch {\n return [];\n }\n }\n\n /**\n * Convert handoff to markdown (verbose format)\n */\n toMarkdown(handoff: EnhancedHandoff): string {\n const lines: string[] = [];\n\n lines.push(`# Session Handoff - ${handoff.timestamp.split('T')[0]}`);\n lines.push('');\n lines.push(`**Project**: ${handoff.project}`);\n lines.push(`**Branch**: ${handoff.branch}`);\n lines.push('');\n\n // Active Work (HIGH VALUE)\n lines.push('## Active Work');\n lines.push(`- **Building**: ${handoff.activeWork.description}`);\n lines.push(`- **Status**: ${handoff.activeWork.status}`);\n if (handoff.activeWork.keyFiles.length > 0) {\n lines.push(`- **Key files**: ${handoff.activeWork.keyFiles.join(', ')}`);\n }\n if (handoff.activeWork.progress) {\n lines.push(`- **Progress**: ${handoff.activeWork.progress}`);\n }\n lines.push('');\n\n // Decisions (HIGH VALUE)\n if (handoff.decisions.length > 0) {\n lines.push('## Key Decisions');\n for (const d of handoff.decisions) {\n lines.push(`1. **${d.what}**`);\n if (d.why) {\n lines.push(` - Rationale: ${d.why}`);\n }\n if (d.alternatives && d.alternatives.length > 0) {\n lines.push(\n ` - Alternatives considered: ${d.alternatives.join(', ')}`\n );\n }\n }\n lines.push('');\n }\n\n // Architecture (MEDIUM VALUE)\n if (handoff.architecture.keyComponents.length > 0) {\n lines.push('## Architecture Context');\n for (const c of handoff.architecture.keyComponents) {\n lines.push(`- \\`${c.file}\\`: ${c.purpose}`);\n }\n if (handoff.architecture.patterns.length > 0) {\n lines.push('');\n lines.push('**Patterns**: ' + handoff.architecture.patterns.join(', '));\n }\n lines.push('');\n }\n\n // Blockers (HIGH VALUE)\n if (handoff.blockers.length > 0) {\n lines.push('## Blockers');\n for (const b of handoff.blockers) {\n lines.push(`- **${b.issue}** [${b.status}]`);\n if (b.attempted.length > 0) {\n lines.push(` - Tried: ${b.attempted.join(', ')}`);\n }\n }\n lines.push('');\n }\n\n // Review Feedback (HIGH VALUE)\n if (handoff.reviewFeedback && handoff.reviewFeedback.length > 0) {\n lines.push('## Review Feedback');\n for (const r of handoff.reviewFeedback) {\n lines.push(`### ${r.source}`);\n if (r.keyPoints.length > 0) {\n lines.push('**Key Points**:');\n for (const p of r.keyPoints) {\n lines.push(`- ${p}`);\n }\n }\n if (r.actionItems.length > 0) {\n lines.push('**Action Items**:');\n for (const a of r.actionItems) {\n lines.push(`- ${a}`);\n }\n }\n lines.push('');\n }\n }\n\n // Next Actions (MEDIUM VALUE)\n if (handoff.nextActions.length > 0) {\n lines.push('## Next Actions');\n for (const a of handoff.nextActions) {\n lines.push(`1. ${a}`);\n }\n lines.push('');\n }\n\n // Code Patterns (LOW VALUE)\n if (handoff.codePatterns && handoff.codePatterns.length > 0) {\n lines.push('## Established Patterns');\n for (const p of handoff.codePatterns) {\n lines.push(`- ${p}`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push(`*Estimated tokens: ~${handoff.estimatedTokens}*`);\n lines.push(`*Generated at ${handoff.timestamp}*`);\n\n return lines.join('\\n');\n }\n\n /**\n * Convert handoff to compact format (~50% smaller)\n * Optimized for minimal context window usage\n */\n toCompact(handoff: EnhancedHandoff): string {\n const lines: string[] = [];\n\n // Header: single line\n lines.push(`# Handoff: ${handoff.project}@${handoff.branch}`);\n\n // Active Work: condensed\n const status =\n handoff.activeWork.status === 'in_progress'\n ? 'WIP'\n : handoff.activeWork.status;\n lines.push(`## Work: ${handoff.activeWork.description} [${status}]`);\n if (handoff.activeWork.keyFiles.length > 0) {\n // Use basenames only, limit to 5\n const files = handoff.activeWork.keyFiles\n .slice(0, 5)\n .map((f) => basename(f))\n .join(', ');\n const progress = handoff.activeWork.progress\n ? ` (${handoff.activeWork.progress.replace(' in current session', '')})`\n : '';\n lines.push(`Files: ${files}${progress}`);\n }\n\n // Decisions: single line each with arrow notation\n if (handoff.decisions.length > 0) {\n lines.push('');\n lines.push('## Decisions');\n for (const d of handoff.decisions.slice(0, 7)) {\n // Truncate long decisions\n const what = d.what.length > 40 ? d.what.slice(0, 37) + '...' : d.what;\n const why = d.why ? ` \u2192 ${d.why.slice(0, 50)}` : '';\n lines.push(`- ${what}${why}`);\n }\n }\n\n // Blockers: terse format\n if (handoff.blockers.length > 0) {\n lines.push('');\n lines.push('## Blockers');\n for (const b of handoff.blockers) {\n const status = b.status === 'open' ? '!' : '\u2713';\n const tried = b.attempted.length > 0 ? ` \u2192 ${b.attempted[0]}` : '';\n lines.push(`${status} ${b.issue}${tried}`);\n }\n }\n\n // Review Feedback: only if present, condensed\n if (handoff.reviewFeedback && handoff.reviewFeedback.length > 0) {\n lines.push('');\n lines.push('## Feedback');\n for (const r of handoff.reviewFeedback.slice(0, 2)) {\n lines.push(`[${r.source}]`);\n for (const p of r.keyPoints.slice(0, 3)) {\n lines.push(`- ${p.slice(0, 60)}`);\n }\n for (const a of r.actionItems.slice(0, 2)) {\n lines.push(`\u2192 ${a.slice(0, 60)}`);\n }\n }\n }\n\n // Next Actions: only top 3\n if (handoff.nextActions.length > 0) {\n lines.push('');\n lines.push('## Next');\n for (const a of handoff.nextActions.slice(0, 3)) {\n lines.push(`- ${a.slice(0, 60)}`);\n }\n }\n\n // Skip: Architecture, Patterns (can be inferred from codebase)\n\n // Compact footer\n lines.push('');\n lines.push(`---`);\n lines.push(\n `~${handoff.estimatedTokens} tokens | ${handoff.timestamp.split('T')[0]}`\n );\n\n return lines.join('\\n');\n }\n\n /**\n * Convert handoff to ultra-compact pipe-delimited format (~90% smaller)\n * Optimized for minimal token usage while preserving critical context\n * Target: ~100-150 tokens\n */\n toUltraCompact(handoff: EnhancedHandoff): string {\n const lines: string[] = [];\n\n // Header: [H]project@branch|status|commits\n const status =\n handoff.activeWork.status === 'in_progress'\n ? 'WIP'\n : handoff.activeWork.status;\n const commitCount = handoff.activeWork.progress?.match(/(\\d+)/)?.[1] || '0';\n lines.push(\n `[H]${handoff.project}@${handoff.branch}|${status}|${commitCount}c`\n );\n\n // Files: [F]file1,file2,file3 (basenames only, max 5)\n if (handoff.activeWork.keyFiles.length > 0) {\n const files = handoff.activeWork.keyFiles\n .slice(0, 5)\n .map((f) => basename(f).replace(/\\.(ts|js|tsx|jsx)$/, ''))\n .join(',');\n lines.push(`[F]${files}`);\n }\n\n // Decisions: [D]decision1\u2192why|decision2\u2192why (max 5, truncated)\n if (handoff.decisions.length > 0) {\n const decisions = handoff.decisions\n .slice(0, 5)\n .map((d) => {\n const what = d.what.slice(0, 25).replace(/\\|/g, '/');\n const why = d.why ? `\u2192${d.why.slice(0, 20)}` : '';\n return `${what}${why}`;\n })\n .join('|');\n lines.push(`[D]${decisions}`);\n }\n\n // Blockers: [B]!issue1\u2192tried|!issue2 (! = open, \u2713 = resolved)\n if (handoff.blockers.length > 0) {\n const blockers = handoff.blockers\n .slice(0, 3)\n .map((b) => {\n const marker = b.status === 'open' ? '!' : '\u2713';\n const issue = b.issue.slice(0, 20).replace(/\\|/g, '/');\n const tried =\n b.attempted.length > 0 ? `\u2192${b.attempted[0].slice(0, 15)}` : '';\n return `${marker}${issue}${tried}`;\n })\n .join('|');\n lines.push(`[B]${blockers}`);\n }\n\n // Next actions: [N]action1|action2 (max 3)\n if (handoff.nextActions.length > 0) {\n const actions = handoff.nextActions\n .slice(0, 3)\n .map((a) => a.slice(0, 25).replace(/\\|/g, '/'))\n .join('|');\n lines.push(`[N]${actions}`);\n }\n\n // Footer: ~tokens|date\n const ultraCompactContent = lines.join('\\n');\n const tokens = countTokens(ultraCompactContent);\n lines.push(`~${tokens}t|${handoff.timestamp.split('T')[0]}`);\n\n return lines.join('\\n');\n }\n\n /**\n * Auto-select format based on context budget and content complexity\n * Returns: 'ultra' | 'compact' | 'verbose'\n */\n selectFormat(\n handoff: EnhancedHandoff,\n contextBudget?: number\n ): 'ultra' | 'compact' | 'verbose' {\n // If explicit budget provided, use thresholds\n if (contextBudget !== undefined) {\n if (contextBudget < 500) return 'ultra';\n if (contextBudget < 2000) return 'compact';\n return 'verbose';\n }\n\n // Auto-select based on content complexity\n const complexity =\n handoff.decisions.length +\n handoff.blockers.length +\n (handoff.reviewFeedback?.length || 0) * 2 +\n handoff.nextActions.length;\n\n // Simple sessions: ultra-compact is sufficient\n if (complexity <= 3 && handoff.activeWork.keyFiles.length <= 3) {\n return 'ultra';\n }\n\n // Complex sessions: need more detail\n if (\n complexity > 8 ||\n (handoff.reviewFeedback && handoff.reviewFeedback.length > 1)\n ) {\n return 'verbose';\n }\n\n // Default: compact\n return 'compact';\n }\n\n /**\n * Generate handoff in auto-selected format\n */\n toAutoFormat(handoff: EnhancedHandoff, contextBudget?: number): string {\n const format = this.selectFormat(handoff, contextBudget);\n switch (format) {\n case 'ultra':\n return this.toUltraCompact(handoff);\n case 'verbose':\n return this.toMarkdown(handoff);\n default:\n return this.toCompact(handoff);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAMA,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU,YAAY;AAC/B,SAAS,SAAS,cAAc;AAChC,SAAS,gBAAgB;AAGzB,IAAI;AACJ,IAAI;AAEF,QAAM,YAAY,MAAM,OAAO,yBAAyB;AACxD,gBAAc,UAAU;AAC1B,QAAQ;AAEN,gBAAc,CAAC,SAAiB,KAAK,KAAK,KAAK,SAAS,GAAG;AAC7D;AA0BA,SAAS,qBAAqB,aAAwC;AACpE,QAAM,YAAY,KAAK,aAAa,gBAAgB,wBAAwB;AAC5E,MAAI,WAAW,SAAS,GAAG;AACzB,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,aAAa,WAAW,OAAO,CAAC;AACzD,aAAO,MAAM,aAAa,CAAC;AAAA,IAC7B,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,mBAAmB,aAA6C;AACvE,QAAM,YAAY,KAAK,aAAa,gBAAgB,sBAAsB;AAC1E,MAAI,WAAW,SAAS,GAAG;AACzB,QAAI;AACF,YAAM,QAA6B,KAAK;AAAA,QACtC,aAAa,WAAW,OAAO;AAAA,MACjC;AAEA,YAAM,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK;AAC3C,aAAO,MAAM,UAAU;AAAA,QACrB,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,MAC3C;AAAA,IACF,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,mBACP,aACA,WACM;AACN,QAAM,MAAM,KAAK,aAAa,cAAc;AAC5C,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,QAAM,YAAY,KAAK,KAAK,sBAAsB;AAGlD,MAAI,WAAmC,CAAC;AACxC,MAAI,WAAW,SAAS,GAAG;AACzB,QAAI;AACF,YAAMA,SAA6B,KAAK;AAAA,QACtC,aAAa,WAAW,OAAO;AAAA,MACjC;AACA,iBAAWA,OAAM,aAAa,CAAC;AAAA,IACjC,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAiC,CAAC;AAExC,aAAW,KAAK,CAAC,GAAG,WAAW,GAAG,QAAQ,GAAG;AAC3C,UAAM,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE;AAC/C,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,GAAG;AACZ,aAAO,KAAK,CAAC;AAAA,IACf;AAAA,EACF;AAGA,QAAM,QAA6B;AAAA,IACjC,WAAW,OAAO,MAAM,GAAG,EAAE;AAAA,IAC7B,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AAEA,gBAAc,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AACzD;AAKA,SAAS,oBAAoB,aAA+B;AAC1D,QAAM,OAAiB,CAAC;AAGxB,QAAM,UAAU,QAAQ,IAAI,QAAQ,KAAK,OAAO,KAAK;AAGrD,QAAM,qBAAqB,YAAY,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAC3E,QAAM,WAAW,KAAK,SAAS,UAAU,IAAI,kBAAkB,KAAK,OAAO;AAC3E,MAAI;AACF,UAAM,UAAU,SAAS,QAAQ;AACjC,SAAK,KAAK,GAAG,OAAO;AAAA,EACtB,QAAQ;AAAA,EAER;AAGA,MAAI,YAAY,gBAAgB;AAC9B,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,IAAI,kBAAkB;AAAA,MACtB;AAAA,IACF;AACA,QAAI;AACF,YAAM,UAAU,SAAS,QAAQ;AACjC,WAAK,KAAK,GAAG,OAAO;AAAA,IACtB,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,gBAAgB,KAAK,QAAQ,GAAG,WAAW,UAAU;AAC3D,MAAI,WAAW,aAAa,GAAG;AAC7B,QAAI;AACF,YAAM,cAAc,YAAY,aAAa;AAC7C,iBAAW,KAAK,aAAa;AAC3B,cAAM,WAAW,KAAK,eAAe,GAAG,OAAO;AAC/C,YAAI,WAAW,QAAQ,GAAG;AACxB,eAAK,KAAK,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;AAyDO,MAAM,yBAAyB;AAAA,EAC5B;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,SAAK,cAAc;AACnB,SAAK,oBAAoB,KAAK,QAAQ,GAAG,WAAW,UAAU;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAqC;AACzC,UAAM,UAA2B;AAAA,MAC/B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,SAAS,SAAS,KAAK,WAAW;AAAA,MAClC,QAAQ,KAAK,iBAAiB;AAAA,MAC9B,YAAY,MAAM,KAAK,kBAAkB;AAAA,MACzC,WAAW,MAAM,KAAK,iBAAiB;AAAA,MACvC,cAAc,MAAM,KAAK,oBAAoB;AAAA,MAC7C,UAAU,MAAM,KAAK,gBAAgB;AAAA,MACrC,gBAAgB,MAAM,KAAK,sBAAsB;AAAA,MACjD,aAAa,MAAM,KAAK,mBAAmB;AAAA,MAC3C,cAAc,MAAM,KAAK,oBAAoB;AAAA,MAC7C,iBAAiB;AAAA,IACnB;AAGA,UAAM,WAAW,KAAK,WAAW,OAAO;AACxC,YAAQ,kBAAkB,YAAY,QAAQ;AAE9C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAA4D;AAExE,UAAM,gBAAgB,KAAK,iBAAiB,CAAC;AAC7C,UAAM,cAAc,KAAK,yBAAyB,EAAE;AAGpD,QAAI,cAAc;AAClB,QAAI,SAAkD;AAEtD,QAAI,cAAc,SAAS,GAAG;AAE5B,YAAM,aAAa,cAAc,CAAC;AAClC,UAAI,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,WAAW,GAAG;AACpE,sBAAc,WAAW,QAAQ,iBAAiB,EAAE;AAAA,MACtD,WAAW,WAAW,SAAS,MAAM,GAAG;AACtC,sBAAc,cAAc,WAAW,QAAQ,iBAAiB,EAAE;AAAA,MACpE,WACE,WAAW,SAAS,QAAQ,KAC5B,WAAW,SAAS,WAAW,GAC/B;AACA,sBAAc,WAAW,QAAQ,iBAAiB,EAAE;AAAA,MACtD,OAAO;AACL,sBAAc,WAAW,QAAQ,iBAAiB,EAAE;AAAA,MACtD;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,aAAa;AACpC,QAAI,UAAU,SAAS,UAAU,GAAG;AAClC,eAAS;AAAA,IACX;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,YAAY,MAAM,GAAG,CAAC;AAAA,MAChC,UACE,cAAc,SAAS,IACnB,GAAG,cAAc,MAAM,gCACvB;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAA0D;AACtE,UAAM,YAA0C,CAAC;AAGjD,UAAM,mBAAmB,qBAAqB,KAAK,WAAW;AAC9D,eAAW,KAAK,kBAAkB;AAChC,gBAAU,KAAK;AAAA,QACb,MAAM,EAAE;AAAA,QACR,KAAK,EAAE;AAAA,QACP,cAAc,EAAE;AAAA,MAClB,CAAC;AAAA,IACH;AAGA,UAAM,UAAU,KAAK,iBAAiB,EAAE;AACxC,eAAW,UAAU,SAAS;AAE5B,UACE,OAAO,YAAY,EAAE,SAAS,MAAM,KACpC,OAAO,YAAY,EAAE,SAAS,YAAY,KAC1C,OAAO,YAAY,EAAE,SAAS,aAAa,KAC1C,OAAO,YAAY,EAAE,SAAS,OAAO,KACpC,OAAO,YAAY,EAAE,SAAS,UAAU,GAC1C;AAEA,cAAM,aAAa,OAAO,QAAQ,iBAAiB,EAAE;AACrD,YAAI,CAAC,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,WAAW,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG;AACpE,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,KAAK;AAAA,UACP,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB;AAAA,MACpB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,aAAa,GAAG;AAC7B,YAAM,UAAU,aAAa,eAAe,OAAO;AACnD,YAAM,SAAS,KAAK,mBAAmB,OAAO;AAC9C,gBAAU,KAAK,GAAG,MAAM;AAAA,IAC1B;AAEA,WAAO,UAAU,MAAM,GAAG,EAAE;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,SAA+C;AACxE,UAAM,YAA0C,CAAC;AACjD,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,QAAI,kBAIO;AAEX,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,MAAM,GAAG;AACrD,YAAI,iBAAiB;AACnB,oBAAU,KAAK,eAAe;AAAA,QAChC;AACA,0BAAkB,EAAE,MAAM,KAAK,QAAQ,UAAU,EAAE,GAAG,KAAK,GAAG;AAAA,MAChE,WAAW,mBAAmB,KAAK,YAAY,EAAE,SAAS,YAAY,GAAG;AACvE,wBAAgB,MAAM,KAAK,QAAQ,kBAAkB,EAAE,EAAE,KAAK;AAAA,MAChE,WAAW,mBAAmB,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AACjE,wBAAgB,MAAM,KAAK,QAAQ,YAAY,EAAE,EAAE,KAAK;AAAA,MAC1D,WACE,mBACA,KAAK,YAAY,EAAE,SAAS,eAAe,GAC3C;AACA,wBAAgB,eAAe,CAAC;AAAA,MAClC,WAAW,iBAAiB,gBAAgB,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AACvE,wBAAgB,aAAa,KAAK,KAAK,QAAQ,YAAY,EAAE,EAAE,KAAK,CAAC;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,iBAAiB;AACnB,gBAAU,KAAK,eAAe;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAEZ;AACA,UAAM,gBAAkE,CAAC;AACzE,UAAM,WAAqB,CAAC;AAG5B,UAAM,cAAc,KAAK,yBAAyB,EAAE;AACpD,UAAM,YAAY,YAAY;AAAA,MAC5B,CAAC,MAAM,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,MAAM;AAAA,IACpE;AAEA,eAAW,QAAQ,UAAU,MAAM,GAAG,CAAC,GAAG;AACxC,YAAM,UAAU,KAAK,iBAAiB,IAAI;AAC1C,UAAI,SAAS;AACX,sBAAc,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,MACtC;AAAA,IACF;AAGA,QAAI,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,CAAC,GAAG;AACjD,eAAS,KAAK,mCAAmC;AAAA,IACnD;AACA,QAAI,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,GAAG;AAC9C,eAAS,KAAK,qBAAqB;AAAA,IACrC;AACA,QACE,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,WAAW,CAAC,GACrE;AACA,eAAS,KAAK,oBAAoB;AAAA,IACpC;AACA,QAAI,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC,GAAG;AAC/C,eAAS,KAAK,wBAAwB;AAAA,IACxC;AAEA,WAAO,EAAE,eAAe,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,UAAiC;AACxD,UAAM,OAAO,SAAS,QAAQ,EAAE,QAAQ,kBAAkB,EAAE;AAC5D,UAAM,OAAO,SAAS,YAAY;AAElC,QAAI,KAAK,SAAS,QAAQ,EAAG,QAAO;AACpC,QAAI,KAAK,SAAS,aAAa,EAAG,QAAO;AACzC,QAAI,KAAK,SAAS,QAAQ,EAAG,QAAO;AACpC,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO;AACrC,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO;AACrC,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO;AACrC,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO;AACrC,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO;AACrC,QAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,QAAQ;AACjD,aAAO;AACT,QAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,WAAW;AACrD,aAAO;AACT,QAAI,KAAK,SAAS,MAAM,EAAG,QAAO;AAClC,QAAI,KAAK,SAAS,GAAG,GAAG;AACtB,aAAO,KACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,GAAG;AAAA,IACb;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAwD;AACpE,UAAM,WAAwC,CAAC;AAG/C,UAAM,YAAY,KAAK,aAAa;AACpC,QAAI,UAAU,SAAS,KAAK,KAAK,UAAU,SAAS,eAAe,GAAG;AACpE,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,WAAW,CAAC,qCAAqC;AAAA,QACjD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI;AACF,YAAM,aAAa,SAAS,iCAAiC;AAAA,QAC3D,UAAU;AAAA,QACV,KAAK,KAAK;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AACD,UAAI,WAAW,SAAS,MAAM,KAAK,WAAW,SAAS,QAAQ,GAAG;AAChE,cAAM,aAAa,WAAW,MAAM,eAAe,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;AACpE,iBAAS,KAAK;AAAA,UACZ,OAAO,kBAAkB,SAAS;AAAA,UAClC,WAAW,CAAC,0BAA0B;AAAA,UACtC,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAGA,QAAI;AACF,YAAM,aAAa,SAAS,6BAA6B;AAAA,QACvD,UAAU;AAAA,QACV,KAAK,KAAK;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AACD,UAAI,WAAW,SAAS,OAAO,KAAK,CAAC,WAAW,SAAS,UAAU,GAAG;AACpE,iBAAS,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,WAAW,CAAC,8BAA8B;AAAA,UAC1C,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAEZ;AACA,UAAM,WAA8C,CAAC;AACrD,UAAM,eAAuC,CAAC;AAG9C,UAAM,aAAa,oBAAoB,KAAK,WAAW;AAEvD,eAAW,UAAU,YAAY;AAC/B,UAAI,CAAC,WAAW,MAAM,EAAG;AAEzB,UAAI;AACF,cAAM,QAAQ,YAAY,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,CAAC;AACrE,cAAM,cAAc,MACjB,IAAI,CAAC,OAAO;AAAA,UACX,MAAM;AAAA,UACN,MAAM,KAAK,QAAQ,CAAC;AAAA,UACpB,MAAM,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,QAChC,EAAE,EACD,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,EAAE,KAAK,UAAU,IAAO,EACnD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAC9C,MAAM,GAAG,CAAC;AAEb,mBAAW,QAAQ,aAAa;AAC9B,gBAAM,UAAU,aAAa,KAAK,MAAM,OAAO;AAC/C,gBAAM,YAAY,KAAK,2BAA2B,OAAO;AACzD,cAAI,UAAU,UAAU,SAAS,GAAG;AAClC,qBAAS,KAAK,SAAS;AAGvB,yBAAa,KAAK;AAAA,cAChB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,cAClC,QAAQ,UAAU;AAAA,cAClB,WAAW,UAAU;AAAA,cACrB,aAAa,UAAU;AAAA,cACvB,YAAY,KAAK;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,aAAa,SAAS,GAAG;AAC3B,yBAAmB,KAAK,aAAa,YAAY;AAAA,IACnD;AAGA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,SAAS,mBAAmB,KAAK,WAAW;AAClD,iBAAW,KAAK,OAAO,MAAM,GAAG,CAAC,GAAG;AAClC,iBAAS,KAAK;AAAA,UACZ,QAAQ,EAAE;AAAA,UACV,WAAW,EAAE;AAAA,UACb,aAAa,EAAE;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,SAAS,SAAS,IAAI,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,SAIjC;AACA,UAAM,YAAsB,CAAC;AAC7B,UAAM,cAAwB,CAAC;AAC/B,QAAI,SAAS;AAGb,QACE,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,iBAAiB,GAClC;AACA,eAAS;AAAA,IACX,WACE,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,iBAAiB,GAClC;AACA,eAAS;AAAA,IACX;AAGA,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAI,oBAAoB;AACxB,QAAI,gBAAgB;AAEpB,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,KAAK;AAG1B,UACE,QAAQ,YAAY,EAAE,SAAS,gBAAgB,KAC/C,QAAQ,YAAY,EAAE,SAAS,aAAa,GAC5C;AACA,4BAAoB;AACpB,wBAAgB;AAChB;AAAA,MACF;AACA,UACE,QAAQ,YAAY,EAAE,SAAS,QAAQ,KACvC,QAAQ,YAAY,EAAE,SAAS,WAAW,KAC1C,QAAQ,YAAY,EAAE,SAAS,UAAU,GACzC;AACA,wBAAgB;AAChB,4BAAoB;AACpB;AAAA,MACF;AAGA,UACE,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,IAAI,KACvB,WAAW,KAAK,OAAO,GACvB;AACA,cAAM,QAAQ,QAAQ,QAAQ,YAAY,EAAE,EAAE,QAAQ,aAAa,EAAE;AACrE,YAAI,MAAM,SAAS,MAAM,MAAM,SAAS,KAAK;AAC3C,cAAI,eAAe;AACjB,wBAAY,KAAK,KAAK;AAAA,UACxB,WAAW,mBAAmB;AAC5B,sBAAU,KAAK,KAAK;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,WAAO;AAAA,MACL;AAAA,MACA,WAAW,UAAU,MAAM,GAAG,CAAC;AAAA,MAC/B,aAAa,YAAY,MAAM,GAAG,CAAC;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAwC;AACpD,UAAM,UAAoB,CAAC;AAG3B,UAAM,YAAY,KAAK,aAAa;AACpC,QAAI,UAAU,KAAK,GAAG;AACpB,cAAQ,KAAK,wBAAwB;AAAA,IACvC;AAGA,UAAM,cAAc,KAAK,yBAAyB,CAAC;AACnD,eAAW,QAAQ,aAAa;AAC9B,UAAI;AACF,cAAM,WAAW,KAAK,KAAK,aAAa,IAAI;AAC5C,YAAI,WAAW,QAAQ,GAAG;AACxB,gBAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,gBAAM,QAAQ,QAAQ,MAAM,sBAAsB,KAAK,CAAC;AACxD,qBAAW,QAAQ,MAAM,MAAM,GAAG,CAAC,GAAG;AACpC,oBAAQ,KAAK,KAAK,QAAQ,qBAAqB,QAAQ,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,KAAK,aAAa,gBAAgB,YAAY;AACrE,QAAI,WAAW,SAAS,GAAG;AACzB,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,aAAa,WAAW,OAAO,CAAC;AACzD,cAAM,UAAU,MAAM;AAAA,UACpB,CAAC,MAAW,EAAE,WAAW,aAAa,EAAE,WAAW;AAAA,QACrD;AACA,mBAAW,QAAQ,QAAQ,MAAM,GAAG,CAAC,GAAG;AACtC,kBAAQ,KAAK,KAAK,SAAS,KAAK,WAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,QAAQ,MAAM,GAAG,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAyC;AACrD,UAAM,WAAqB,CAAC;AAG5B,UAAM,eAAe,KAAK,KAAK,aAAa,kBAAkB;AAC9D,QAAI,WAAW,YAAY,GAAG;AAC5B,YAAM,UAAU,aAAa,cAAc,OAAO;AAClD,UAAI,QAAQ,SAAS,mBAAmB,GAAG;AACzC,iBAAS,KAAK,0CAA0C;AAAA,MAC1D;AACA,UAAI,QAAQ,SAAS,SAAS,KAAK,QAAQ,SAAS,MAAM,GAAG;AAC3D,iBAAS,KAAK,+BAA+B;AAAA,MAC/C;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,KAAK,aAAa,eAAe;AACvD,QAAI,WAAW,QAAQ,GAAG;AACxB,YAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,UAAI,QAAQ,SAAS,gBAAgB,GAAG;AACtC,iBAAS,KAAK,gCAAgC;AAAA,MAChD;AACA,UAAI,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,QAAQ,GAAG;AAC5D,iBAAS,KAAK,mBAAmB;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,OAAyB;AAChD,QAAI;AACF,YAAM,SAAS,SAAS,sBAAsB,KAAK,IAAI;AAAA,QACrD,UAAU;AAAA,QACV,KAAK,KAAK;AAAA,MACZ,CAAC;AACD,aAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,IACjD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAA2B;AACjC,QAAI;AACF,aAAO,SAAS,mCAAmC;AAAA,QACjD,UAAU;AAAA,QACV,KAAK,KAAK;AAAA,MACZ,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAuB;AAC7B,QAAI;AACF,aAAO,SAAS,sBAAsB;AAAA,QACpC,UAAU;AAAA,QACV,KAAK,KAAK;AAAA,MACZ,CAAC;AAAA,IACH,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,OAAyB;AACxD,QAAI;AACF,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACE,UAAU;AAAA,UACV,KAAK,KAAK;AAAA,QACZ;AAAA,MACF;AACA,aAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,MAAM,GAAG,KAAK;AAAA,IACjE,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,SAAkC;AAC3C,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,uBAAuB,QAAQ,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AACnE,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,gBAAgB,QAAQ,OAAO,EAAE;AAC5C,UAAM,KAAK,eAAe,QAAQ,MAAM,EAAE;AAC1C,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,mBAAmB,QAAQ,WAAW,WAAW,EAAE;AAC9D,UAAM,KAAK,iBAAiB,QAAQ,WAAW,MAAM,EAAE;AACvD,QAAI,QAAQ,WAAW,SAAS,SAAS,GAAG;AAC1C,YAAM,KAAK,oBAAoB,QAAQ,WAAW,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,IACzE;AACA,QAAI,QAAQ,WAAW,UAAU;AAC/B,YAAM,KAAK,mBAAmB,QAAQ,WAAW,QAAQ,EAAE;AAAA,IAC7D;AACA,UAAM,KAAK,EAAE;AAGb,QAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,YAAM,KAAK,kBAAkB;AAC7B,iBAAW,KAAK,QAAQ,WAAW;AACjC,cAAM,KAAK,QAAQ,EAAE,IAAI,IAAI;AAC7B,YAAI,EAAE,KAAK;AACT,gBAAM,KAAK,mBAAmB,EAAE,GAAG,EAAE;AAAA,QACvC;AACA,YAAI,EAAE,gBAAgB,EAAE,aAAa,SAAS,GAAG;AAC/C,gBAAM;AAAA,YACJ,iCAAiC,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,QAAQ,aAAa,cAAc,SAAS,GAAG;AACjD,YAAM,KAAK,yBAAyB;AACpC,iBAAW,KAAK,QAAQ,aAAa,eAAe;AAClD,cAAM,KAAK,OAAO,EAAE,IAAI,OAAO,EAAE,OAAO,EAAE;AAAA,MAC5C;AACA,UAAI,QAAQ,aAAa,SAAS,SAAS,GAAG;AAC5C,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,mBAAmB,QAAQ,aAAa,SAAS,KAAK,IAAI,CAAC;AAAA,MACxE;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,YAAM,KAAK,aAAa;AACxB,iBAAW,KAAK,QAAQ,UAAU;AAChC,cAAM,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,GAAG;AAC3C,YAAI,EAAE,UAAU,SAAS,GAAG;AAC1B,gBAAM,KAAK,cAAc,EAAE,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,QACnD;AAAA,MACF;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,QAAQ,kBAAkB,QAAQ,eAAe,SAAS,GAAG;AAC/D,YAAM,KAAK,oBAAoB;AAC/B,iBAAW,KAAK,QAAQ,gBAAgB;AACtC,cAAM,KAAK,OAAO,EAAE,MAAM,EAAE;AAC5B,YAAI,EAAE,UAAU,SAAS,GAAG;AAC1B,gBAAM,KAAK,iBAAiB;AAC5B,qBAAW,KAAK,EAAE,WAAW;AAC3B,kBAAM,KAAK,KAAK,CAAC,EAAE;AAAA,UACrB;AAAA,QACF;AACA,YAAI,EAAE,YAAY,SAAS,GAAG;AAC5B,gBAAM,KAAK,mBAAmB;AAC9B,qBAAW,KAAK,EAAE,aAAa;AAC7B,kBAAM,KAAK,KAAK,CAAC,EAAE;AAAA,UACrB;AAAA,QACF;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAGA,QAAI,QAAQ,YAAY,SAAS,GAAG;AAClC,YAAM,KAAK,iBAAiB;AAC5B,iBAAW,KAAK,QAAQ,aAAa;AACnC,cAAM,KAAK,MAAM,CAAC,EAAE;AAAA,MACtB;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC3D,YAAM,KAAK,yBAAyB;AACpC,iBAAW,KAAK,QAAQ,cAAc;AACpC,cAAM,KAAK,KAAK,CAAC,EAAE;AAAA,MACrB;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,uBAAuB,QAAQ,eAAe,GAAG;AAC5D,UAAM,KAAK,iBAAiB,QAAQ,SAAS,GAAG;AAEhD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,SAAkC;AAC1C,UAAM,QAAkB,CAAC;AAGzB,UAAM,KAAK,cAAc,QAAQ,OAAO,IAAI,QAAQ,MAAM,EAAE;AAG5D,UAAM,SACJ,QAAQ,WAAW,WAAW,gBAC1B,QACA,QAAQ,WAAW;AACzB,UAAM,KAAK,YAAY,QAAQ,WAAW,WAAW,KAAK,MAAM,GAAG;AACnE,QAAI,QAAQ,WAAW,SAAS,SAAS,GAAG;AAE1C,YAAM,QAAQ,QAAQ,WAAW,SAC9B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,EACtB,KAAK,IAAI;AACZ,YAAM,WAAW,QAAQ,WAAW,WAChC,KAAK,QAAQ,WAAW,SAAS,QAAQ,uBAAuB,EAAE,CAAC,MACnE;AACJ,YAAM,KAAK,UAAU,KAAK,GAAG,QAAQ,EAAE;AAAA,IACzC;AAGA,QAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,cAAc;AACzB,iBAAW,KAAK,QAAQ,UAAU,MAAM,GAAG,CAAC,GAAG;AAE7C,cAAM,OAAO,EAAE,KAAK,SAAS,KAAK,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQ,EAAE;AAClE,cAAM,MAAM,EAAE,MAAM,WAAM,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AACjD,cAAM,KAAK,KAAK,IAAI,GAAG,GAAG,EAAE;AAAA,MAC9B;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,aAAa;AACxB,iBAAW,KAAK,QAAQ,UAAU;AAChC,cAAMC,UAAS,EAAE,WAAW,SAAS,MAAM;AAC3C,cAAM,QAAQ,EAAE,UAAU,SAAS,IAAI,WAAM,EAAE,UAAU,CAAC,CAAC,KAAK;AAChE,cAAM,KAAK,GAAGA,OAAM,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,MAC3C;AAAA,IACF;AAGA,QAAI,QAAQ,kBAAkB,QAAQ,eAAe,SAAS,GAAG;AAC/D,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,aAAa;AACxB,iBAAW,KAAK,QAAQ,eAAe,MAAM,GAAG,CAAC,GAAG;AAClD,cAAM,KAAK,IAAI,EAAE,MAAM,GAAG;AAC1B,mBAAW,KAAK,EAAE,UAAU,MAAM,GAAG,CAAC,GAAG;AACvC,gBAAM,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,QAClC;AACA,mBAAW,KAAK,EAAE,YAAY,MAAM,GAAG,CAAC,GAAG;AACzC,gBAAM,KAAK,UAAK,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,YAAY,SAAS,GAAG;AAClC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,SAAS;AACpB,iBAAW,KAAK,QAAQ,YAAY,MAAM,GAAG,CAAC,GAAG;AAC/C,cAAM,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,MAClC;AAAA,IACF;AAKA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK;AAChB,UAAM;AAAA,MACJ,IAAI,QAAQ,eAAe,aAAa,QAAQ,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,IACzE;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,SAAkC;AAC/C,UAAM,QAAkB,CAAC;AAGzB,UAAM,SACJ,QAAQ,WAAW,WAAW,gBAC1B,QACA,QAAQ,WAAW;AACzB,UAAM,cAAc,QAAQ,WAAW,UAAU,MAAM,OAAO,IAAI,CAAC,KAAK;AACxE,UAAM;AAAA,MACJ,MAAM,QAAQ,OAAO,IAAI,QAAQ,MAAM,IAAI,MAAM,IAAI,WAAW;AAAA,IAClE;AAGA,QAAI,QAAQ,WAAW,SAAS,SAAS,GAAG;AAC1C,YAAM,QAAQ,QAAQ,WAAW,SAC9B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,SAAS,CAAC,EAAE,QAAQ,sBAAsB,EAAE,CAAC,EACxD,KAAK,GAAG;AACX,YAAM,KAAK,MAAM,KAAK,EAAE;AAAA,IAC1B;AAGA,QAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,YAAM,YAAY,QAAQ,UACvB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM;AACV,cAAM,OAAO,EAAE,KAAK,MAAM,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG;AACnD,cAAM,MAAM,EAAE,MAAM,SAAI,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AAC/C,eAAO,GAAG,IAAI,GAAG,GAAG;AAAA,MACtB,CAAC,EACA,KAAK,GAAG;AACX,YAAM,KAAK,MAAM,SAAS,EAAE;AAAA,IAC9B;AAGA,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,YAAM,WAAW,QAAQ,SACtB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM;AACV,cAAM,SAAS,EAAE,WAAW,SAAS,MAAM;AAC3C,cAAM,QAAQ,EAAE,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG;AACrD,cAAM,QACJ,EAAE,UAAU,SAAS,IAAI,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AAC/D,eAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK;AAAA,MAClC,CAAC,EACA,KAAK,GAAG;AACX,YAAM,KAAK,MAAM,QAAQ,EAAE;AAAA,IAC7B;AAGA,QAAI,QAAQ,YAAY,SAAS,GAAG;AAClC,YAAM,UAAU,QAAQ,YACrB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG,CAAC,EAC7C,KAAK,GAAG;AACX,YAAM,KAAK,MAAM,OAAO,EAAE;AAAA,IAC5B;AAGA,UAAM,sBAAsB,MAAM,KAAK,IAAI;AAC3C,UAAM,SAAS,YAAY,mBAAmB;AAC9C,UAAM,KAAK,IAAI,MAAM,KAAK,QAAQ,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAE3D,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,SACA,eACiC;AAEjC,QAAI,kBAAkB,QAAW;AAC/B,UAAI,gBAAgB,IAAK,QAAO;AAChC,UAAI,gBAAgB,IAAM,QAAO;AACjC,aAAO;AAAA,IACT;AAGA,UAAM,aACJ,QAAQ,UAAU,SAClB,QAAQ,SAAS,UAChB,QAAQ,gBAAgB,UAAU,KAAK,IACxC,QAAQ,YAAY;AAGtB,QAAI,cAAc,KAAK,QAAQ,WAAW,SAAS,UAAU,GAAG;AAC9D,aAAO;AAAA,IACT;AAGA,QACE,aAAa,KACZ,QAAQ,kBAAkB,QAAQ,eAAe,SAAS,GAC3D;AACA,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAA0B,eAAgC;AACrE,UAAM,SAAS,KAAK,aAAa,SAAS,aAAa;AACvD,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,KAAK,eAAe,OAAO;AAAA,MACpC,KAAK;AACH,eAAO,KAAK,WAAW,OAAO;AAAA,MAChC;AACE,eAAO,KAAK,UAAU,OAAO;AAAA,IACjC;AAAA,EACF;AACF;",
|
|
6
|
-
"names": ["store", "status"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/session/handoff-generator.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Session Handoff Generator for StackMemory\n * Inspired by Continuous-Claude's handoff documents\n *\n * Generates structured transfer documents when sessions end\n * and loads them when new sessions begin\n */\n\nimport { Frame, Trace, Context } from '../types';\nimport { FrameManager } from '../frame/frame-manager';\nimport { DatabaseManager } from '../storage/database-manager';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport interface HandoffDocument {\n session_id: string;\n timestamp: string;\n project: string;\n branch?: string;\n\n // Current state\n active_frame_path: string[];\n active_tasks: TaskSummary[];\n pending_decisions: DecisionPoint[];\n blockers: Blocker[];\n\n // Recent context\n recent_files: FileEdit[];\n recent_commands: CommandExecution[];\n recent_errors: ErrorContext[];\n\n // Key insights\n patterns_detected: string[];\n approaches_tried: ApproachSummary[];\n successful_strategies: string[];\n\n // Next steps\n suggested_next_actions: string[];\n warnings: string[];\n\n // Metrics\n session_duration_minutes: number;\n frames_created: number;\n tool_calls_made: number;\n decisions_recorded: number;\n}\n\ninterface TaskSummary {\n id: string;\n title: string;\n status: 'pending' | 'in_progress' | 'blocked' | 'completed';\n progress_percentage: number;\n blocker?: string;\n}\n\ninterface DecisionPoint {\n decision: string;\n rationale: string;\n alternatives_considered?: string[];\n timestamp: string;\n}\n\ninterface Blocker {\n description: string;\n attempted_solutions: string[];\n suggested_approach?: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n}\n\ninterface FileEdit {\n path: string;\n operations: ('created' | 'modified' | 'deleted')[];\n line_changes: { added: number; removed: number };\n}\n\ninterface CommandExecution {\n command: string;\n success: boolean;\n output_summary?: string;\n}\n\ninterface ErrorContext {\n error: string;\n context: string;\n resolved: boolean;\n resolution?: string;\n}\n\ninterface ApproachSummary {\n approach: string;\n outcome: 'successful' | 'failed' | 'partial';\n learnings?: string;\n}\n\nexport class HandoffGenerator {\n private frameManager: FrameManager;\n private dbManager: DatabaseManager;\n private handoffDir: string;\n\n constructor(\n frameManager: FrameManager,\n dbManager: DatabaseManager,\n projectRoot: string\n ) {\n this.frameManager = frameManager;\n this.dbManager = dbManager;\n this.handoffDir = path.join(projectRoot, '.stackmemory', 'handoffs');\n }\n\n /**\n * Generate a handoff document for the current session\n */\n async generateHandoff(sessionId: string): Promise<HandoffDocument> {\n const session = await this.dbManager.getSession(sessionId);\n if (!session) throw new Error(`Session ${sessionId} not found`);\n\n // Get active frame stack\n const activeFramePath = await this.getActiveFramePath();\n\n // Get recent activity\n const recentTraces = await this.dbManager.getRecentTraces(sessionId, 100);\n const recentFrames = await this.dbManager.getRecentFrames(sessionId, 20);\n\n // Extract key information\n const tasks = await this.extractTasks(recentFrames);\n const decisions = await this.extractDecisions(recentTraces);\n const blockers = await this.extractBlockers(recentTraces, recentFrames);\n const fileEdits = await this.extractFileEdits(recentTraces);\n const commands = await this.extractCommands(recentTraces);\n const errors = await this.extractErrors(recentTraces);\n const patterns = await this.detectPatterns(recentTraces);\n const approaches = await this.extractApproaches(recentFrames);\n\n // Calculate metrics\n const sessionDuration = Math.floor(\n (Date.now() - new Date(session.startedAt).getTime()) / 60000\n );\n\n const handoff: HandoffDocument = {\n session_id: sessionId,\n timestamp: new Date().toISOString(),\n project: session.project,\n branch: session.metadata?.branch,\n\n active_frame_path: activeFramePath,\n active_tasks: tasks,\n pending_decisions: decisions.filter((d) => !d.resolved),\n blockers: blockers,\n\n recent_files: fileEdits.slice(0, 10),\n recent_commands: commands.slice(0, 10),\n recent_errors: errors.slice(0, 5),\n\n patterns_detected: patterns,\n approaches_tried: approaches,\n successful_strategies: this.extractSuccessfulStrategies(approaches),\n\n suggested_next_actions: await this.suggestNextActions(\n tasks,\n blockers,\n activeFramePath\n ),\n warnings: await this.generateWarnings(errors, blockers),\n\n session_duration_minutes: sessionDuration,\n frames_created: recentFrames.length,\n tool_calls_made: recentTraces.filter((t) => t.type === 'tool_call')\n .length,\n decisions_recorded: decisions.length,\n };\n\n // Save to file\n await this.saveHandoff(handoff);\n\n return handoff;\n }\n\n /**\n * Load the most recent handoff document\n */\n async loadHandoff(): Promise<HandoffDocument | null> {\n try {\n await fs.mkdir(this.handoffDir, { recursive: true });\n\n const files = await fs.readdir(this.handoffDir);\n const handoffFiles = files\n .filter((f) => f.endsWith('.json'))\n .sort()\n .reverse();\n\n if (handoffFiles.length === 0) return null;\n\n const mostRecent = handoffFiles[0];\n const content = await fs.readFile(\n path.join(this.handoffDir, mostRecent),\n 'utf-8'\n );\n\n return JSON.parse(content) as HandoffDocument;\n } catch (error: unknown) {\n console.error('Error loading handoff:', error);\n return null;\n }\n }\n\n /**\n * Generate a markdown summary of the handoff\n */\n async generateMarkdownSummary(handoff: HandoffDocument): Promise<string> {\n const lines: string[] = [\n `# Session Handoff`,\n `**Generated**: ${new Date(handoff.timestamp).toLocaleString()}`,\n `**Project**: ${handoff.project}`,\n handoff.branch ? `**Branch**: ${handoff.branch}` : '',\n `**Duration**: ${handoff.session_duration_minutes} minutes`,\n '',\n\n `## Current Context`,\n `**Active Frame Path**: ${handoff.active_frame_path.join(' \u2192 ')}`,\n '',\n\n `## Active Tasks (${handoff.active_tasks.length})`,\n ...handoff.active_tasks.map(\n (t) =>\n `- [${t.status}] ${t.title} (${t.progress_percentage}%)${\n t.blocker ? ` \u26A0\uFE0F Blocked: ${t.blocker}` : ''\n }`\n ),\n '',\n\n handoff.blockers.length > 0 ? '## Blockers' : '',\n ...handoff.blockers.map(\n (b) =>\n `- **${b.severity}**: ${b.description}\\n Tried: ${b.attempted_solutions.join(\n ', '\n )}`\n ),\n '',\n\n handoff.pending_decisions.length > 0 ? '## Pending Decisions' : '',\n ...handoff.pending_decisions.map(\n (d) => `- **${d.decision}**\\n Rationale: ${d.rationale}`\n ),\n '',\n\n '## Recent Activity',\n `- Files edited: ${handoff.recent_files.length}`,\n `- Commands run: ${handoff.recent_commands.length}`,\n `- Errors encountered: ${handoff.recent_errors.length}`,\n '',\n\n handoff.patterns_detected.length > 0 ? '## Patterns Detected' : '',\n ...handoff.patterns_detected.map((p) => `- ${p}`),\n '',\n\n handoff.successful_strategies.length > 0\n ? '## Successful Strategies'\n : '',\n ...handoff.successful_strategies.map((s) => `- ${s}`),\n '',\n\n '## Suggested Next Actions',\n ...handoff.suggested_next_actions.map((a) => `1. ${a}`),\n '',\n\n handoff.warnings.length > 0 ? '## \u26A0\uFE0F Warnings' : '',\n ...handoff.warnings.map((w) => `- ${w}`),\n ];\n\n return lines.filter((l) => l !== '').join('\\n');\n }\n\n /**\n * Auto-detect session end and trigger handoff\n */\n async detectSessionEnd(sessionId: string): Promise<boolean> {\n const idleThreshold = 5 * 60 * 1000; // 5 minutes\n const lastActivity = await this.dbManager.getLastActivityTime(sessionId);\n\n if (!lastActivity) return false;\n\n const idleTime = Date.now() - lastActivity.getTime();\n if (idleTime > idleThreshold) {\n await this.generateHandoff(sessionId);\n return true;\n }\n\n return false;\n }\n\n // Private helper methods\n\n private async getActiveFramePath(): Promise<string[]> {\n const stack = await this.frameManager.getStack();\n return stack.frames.map((f) => f.description || f.type);\n }\n\n private async extractTasks(frames: Frame[]): Promise<TaskSummary[]> {\n return frames\n .filter((f) => f.type === 'task')\n .map((f) => ({\n id: f.id,\n title: f.description || 'Untitled task',\n status: this.getTaskStatus(f),\n progress_percentage: f.metadata?.progress || 0,\n blocker: f.metadata?.blocker,\n }));\n }\n\n private getTaskStatus(frame: Frame): TaskSummary['status'] {\n if (frame.status === 'closed') return 'completed';\n if (frame.metadata?.blocker) return 'blocked';\n if (frame.status === 'open') return 'in_progress';\n return 'pending';\n }\n\n private async extractDecisions(traces: Trace[]): Promise<DecisionPoint[]> {\n return traces\n .filter((t) => t.type === 'decision')\n .map((t) => ({\n decision: t.content.decision || '',\n rationale: t.content.rationale || '',\n alternatives_considered: t.content.alternatives,\n timestamp: t.timestamp,\n resolved: t.metadata?.resolved || false,\n }));\n }\n\n private async extractBlockers(\n traces: Trace[],\n frames: Frame[]\n ): Promise<Blocker[]> {\n const blockers: Blocker[] = [];\n\n // Extract from error traces\n const errorTraces = traces.filter(\n (t) => t.type === 'error' && !t.metadata?.resolved\n );\n\n for (const trace of errorTraces) {\n blockers.push({\n description: trace.content.error || 'Unknown error',\n attempted_solutions: trace.metadata?.attempts || [],\n suggested_approach: trace.metadata?.suggestion,\n severity: this.getErrorSeverity(trace),\n });\n }\n\n // Extract from blocked frames\n const blockedFrames = frames.filter((f) => f.metadata?.blocker);\n for (const frame of blockedFrames) {\n blockers.push({\n description: frame.metadata.blocker,\n attempted_solutions: frame.metadata.attempts || [],\n severity: 'medium',\n });\n }\n\n return blockers;\n }\n\n private getErrorSeverity(trace: Trace): Blocker['severity'] {\n const error = trace.content.error?.toLowerCase() || '';\n if (error.includes('critical') || error.includes('fatal'))\n return 'critical';\n if (error.includes('error') || error.includes('fail')) return 'high';\n if (error.includes('warning')) return 'medium';\n return 'low';\n }\n\n private async extractFileEdits(traces: Trace[]): Promise<FileEdit[]> {\n const fileMap = new Map<string, FileEdit>();\n\n const editTraces = traces.filter((t) =>\n ['edit', 'write', 'create', 'delete'].includes(t.type)\n );\n\n for (const trace of editTraces) {\n const path = trace.content.file_path || trace.content.path;\n if (!path) continue;\n\n if (!fileMap.has(path)) {\n fileMap.set(path, {\n path,\n operations: [],\n line_changes: { added: 0, removed: 0 },\n });\n }\n\n const file = fileMap.get(path)!;\n const op = this.getFileOperation(trace.type);\n if (!file.operations.includes(op)) {\n file.operations.push(op);\n }\n\n file.line_changes.added += trace.metadata?.lines_added || 0;\n file.line_changes.removed += trace.metadata?.lines_removed || 0;\n }\n\n return Array.from(fileMap.values());\n }\n\n private getFileOperation(traceType: string): FileEdit['operations'][0] {\n switch (traceType) {\n case 'create':\n case 'write':\n return 'created';\n case 'edit':\n return 'modified';\n case 'delete':\n return 'deleted';\n default:\n return 'modified';\n }\n }\n\n private async extractCommands(traces: Trace[]): Promise<CommandExecution[]> {\n return traces\n .filter((t) => t.type === 'bash' || t.type === 'command')\n .map((t) => ({\n command: t.content.command || '',\n success: !t.metadata?.error,\n output_summary: t.content.output?.substring(0, 100),\n }));\n }\n\n private async extractErrors(traces: Trace[]): Promise<ErrorContext[]> {\n return traces\n .filter((t) => t.type === 'error')\n .map((t) => ({\n error: t.content.error || '',\n context: t.content.context || '',\n resolved: t.metadata?.resolved || false,\n resolution: t.metadata?.resolution,\n }));\n }\n\n private async detectPatterns(traces: Trace[]): Promise<string[]> {\n const patterns: string[] = [];\n\n // Detect TDD pattern\n const testFirst = traces.some(\n (t) =>\n t.type === 'test' &&\n traces.some(\n (t2) => t2.type === 'implement' && t2.timestamp > t.timestamp\n )\n );\n if (testFirst) patterns.push('Test-Driven Development');\n\n // Detect refactoring pattern\n const refactoring =\n traces.filter(\n (t) =>\n t.content.description?.includes('refactor') ||\n t.metadata?.operation === 'refactor'\n ).length > 3;\n if (refactoring) patterns.push('Active Refactoring');\n\n // Detect debugging pattern\n const debugging =\n traces.filter((t) => t.type === 'error' || t.type === 'debug').length > 5;\n if (debugging) patterns.push('Deep Debugging Session');\n\n return patterns;\n }\n\n private async extractApproaches(frames: Frame[]): Promise<ApproachSummary[]> {\n return frames\n .filter((f) => f.metadata?.approach)\n .map((f) => ({\n approach: f.metadata.approach,\n outcome: this.getApproachOutcome(f),\n learnings: f.metadata.learnings,\n }));\n }\n\n private getApproachOutcome(frame: Frame): ApproachSummary['outcome'] {\n if (frame.status === 'closed' && frame.metadata?.success)\n return 'successful';\n if (frame.status === 'closed' && !frame.metadata?.success) return 'failed';\n return 'partial';\n }\n\n private extractSuccessfulStrategies(approaches: ApproachSummary[]): string[] {\n return approaches\n .filter((a) => a.outcome === 'successful')\n .map((a) => a.approach);\n }\n\n private async suggestNextActions(\n tasks: TaskSummary[],\n blockers: Blocker[],\n framePath: string[]\n ): Promise<string[]> {\n const suggestions: string[] = [];\n\n // Resume in-progress tasks\n const inProgress = tasks.filter((t) => t.status === 'in_progress');\n if (inProgress.length > 0) {\n suggestions.push(`Resume task: ${inProgress[0].title}`);\n }\n\n // Address critical blockers\n const criticalBlockers = blockers.filter((b) => b.severity === 'critical');\n if (criticalBlockers.length > 0) {\n suggestions.push(\n `Resolve critical blocker: ${criticalBlockers[0].description}`\n );\n }\n\n // Complete nearly done tasks\n const nearlyDone = tasks.filter((t) => t.progress_percentage >= 80);\n if (nearlyDone.length > 0) {\n suggestions.push(\n `Complete task: ${nearlyDone[0].title} (${nearlyDone[0].progress_percentage}% done)`\n );\n }\n\n return suggestions;\n }\n\n private async generateWarnings(\n errors: ErrorContext[],\n blockers: Blocker[]\n ): Promise<string[]> {\n const warnings: string[] = [];\n\n // Unresolved errors\n const unresolved = errors.filter((e) => !e.resolved);\n if (unresolved.length > 0) {\n warnings.push(`${unresolved.length} unresolved errors`);\n }\n\n // Critical blockers\n const critical = blockers.filter((b) => b.severity === 'critical');\n if (critical.length > 0) {\n warnings.push(\n `${critical.length} critical blockers need immediate attention`\n );\n }\n\n return warnings;\n }\n\n private async saveHandoff(handoff: HandoffDocument): Promise<void> {\n await fs.mkdir(this.handoffDir, { recursive: true });\n\n const filename = `${handoff.timestamp.replace(/[:.]/g, '-')}.json`;\n const filepath = path.join(this.handoffDir, filename);\n\n await fs.writeFile(filepath, JSON.stringify(handoff, null, 2), 'utf-8');\n\n // Also save markdown summary\n const markdown = await this.generateMarkdownSummary(handoff);\n const mdPath = filepath.replace('.json', '.md');\n await fs.writeFile(mdPath, markdown, 'utf-8');\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;AAWA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAkFf,MAAM,iBAAiB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,cACA,WACA,aACA;AACA,SAAK,eAAe;AACpB,SAAK,YAAY;AACjB,SAAK,aAAa,KAAK,KAAK,aAAa,gBAAgB,UAAU;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,WAA6C;AACjE,UAAM,UAAU,MAAM,KAAK,UAAU,WAAW,SAAS;AACzD,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,WAAW,SAAS,YAAY;AAG9D,UAAM,kBAAkB,MAAM,KAAK,mBAAmB;AAGtD,UAAM,eAAe,MAAM,KAAK,UAAU,gBAAgB,WAAW,GAAG;AACxE,UAAM,eAAe,MAAM,KAAK,UAAU,gBAAgB,WAAW,EAAE;AAGvE,UAAM,QAAQ,MAAM,KAAK,aAAa,YAAY;AAClD,UAAM,YAAY,MAAM,KAAK,iBAAiB,YAAY;AAC1D,UAAM,WAAW,MAAM,KAAK,gBAAgB,cAAc,YAAY;AACtE,UAAM,YAAY,MAAM,KAAK,iBAAiB,YAAY;AAC1D,UAAM,WAAW,MAAM,KAAK,gBAAgB,YAAY;AACxD,UAAM,SAAS,MAAM,KAAK,cAAc,YAAY;AACpD,UAAM,WAAW,MAAM,KAAK,eAAe,YAAY;AACvD,UAAM,aAAa,MAAM,KAAK,kBAAkB,YAAY;AAG5D,UAAM,kBAAkB,KAAK;AAAA,OAC1B,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,KAAK;AAAA,IACzD;AAEA,UAAM,UAA2B;AAAA,MAC/B,YAAY;AAAA,MACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ,UAAU;AAAA,MAE1B,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,mBAAmB,UAAU,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAAA,MACtD;AAAA,MAEA,cAAc,UAAU,MAAM,GAAG,EAAE;AAAA,MACnC,iBAAiB,SAAS,MAAM,GAAG,EAAE;AAAA,MACrC,eAAe,OAAO,MAAM,GAAG,CAAC;AAAA,MAEhC,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,uBAAuB,KAAK,4BAA4B,UAAU;AAAA,MAElE,wBAAwB,MAAM,KAAK;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU,MAAM,KAAK,iBAAiB,QAAQ,QAAQ;AAAA,MAEtD,0BAA0B;AAAA,MAC1B,gBAAgB,aAAa;AAAA,MAC7B,iBAAiB,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAC/D;AAAA,MACH,oBAAoB,UAAU;AAAA,IAChC;AAGA,UAAM,KAAK,YAAY,OAAO;AAE9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAA+C;AACnD,QAAI;AACF,YAAM,GAAG,MAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAEnD,YAAM,QAAQ,MAAM,GAAG,QAAQ,KAAK,UAAU;AAC9C,YAAM,eAAe,MAClB,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EACjC,KAAK,EACL,QAAQ;AAEX,UAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,YAAM,aAAa,aAAa,CAAC;AACjC,YAAM,UAAU,MAAM,GAAG;AAAA,QACvB,KAAK,KAAK,KAAK,YAAY,UAAU;AAAA,QACrC;AAAA,MACF;AAEA,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,SAAS,OAAgB;AACvB,cAAQ,MAAM,0BAA0B,KAAK;AAC7C,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,SAA2C;AACvE,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA,kBAAkB,IAAI,KAAK,QAAQ,SAAS,EAAE,eAAe,CAAC;AAAA,MAC9D,gBAAgB,QAAQ,OAAO;AAAA,MAC/B,QAAQ,SAAS,eAAe,QAAQ,MAAM,KAAK;AAAA,MACnD,iBAAiB,QAAQ,wBAAwB;AAAA,MACjD;AAAA,MAEA;AAAA,MACA,0BAA0B,QAAQ,kBAAkB,KAAK,UAAK,CAAC;AAAA,MAC/D;AAAA,MAEA,oBAAoB,QAAQ,aAAa,MAAM;AAAA,MAC/C,GAAG,QAAQ,aAAa;AAAA,QACtB,CAAC,MACC,MAAM,EAAE,MAAM,KAAK,EAAE,KAAK,KAAK,EAAE,mBAAmB,KAClD,EAAE,UAAU,0BAAgB,EAAE,OAAO,KAAK,EAC5C;AAAA,MACJ;AAAA,MACA;AAAA,MAEA,QAAQ,SAAS,SAAS,IAAI,gBAAgB;AAAA,MAC9C,GAAG,QAAQ,SAAS;AAAA,QAClB,CAAC,MACC,OAAO,EAAE,QAAQ,OAAO,EAAE,WAAW;AAAA,WAAc,EAAE,oBAAoB;AAAA,UACvE;AAAA,QACF,CAAC;AAAA,MACL;AAAA,MACA;AAAA,MAEA,QAAQ,kBAAkB,SAAS,IAAI,yBAAyB;AAAA,MAChE,GAAG,QAAQ,kBAAkB;AAAA,QAC3B,CAAC,MAAM,OAAO,EAAE,QAAQ;AAAA,eAAoB,EAAE,SAAS;AAAA,MACzD;AAAA,MACA;AAAA,MAEA;AAAA,MACA,mBAAmB,QAAQ,aAAa,MAAM;AAAA,MAC9C,mBAAmB,QAAQ,gBAAgB,MAAM;AAAA,MACjD,yBAAyB,QAAQ,cAAc,MAAM;AAAA,MACrD;AAAA,MAEA,QAAQ,kBAAkB,SAAS,IAAI,yBAAyB;AAAA,MAChE,GAAG,QAAQ,kBAAkB,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA,MAChD;AAAA,MAEA,QAAQ,sBAAsB,SAAS,IACnC,6BACA;AAAA,MACJ,GAAG,QAAQ,sBAAsB,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA,MACpD;AAAA,MAEA;AAAA,MACA,GAAG,QAAQ,uBAAuB,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE;AAAA,MACtD;AAAA,MAEA,QAAQ,SAAS,SAAS,IAAI,6BAAmB;AAAA,MACjD,GAAG,QAAQ,SAAS,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA,IACzC;AAEA,WAAO,MAAM,OAAO,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,WAAqC;AAC1D,UAAM,gBAAgB,IAAI,KAAK;AAC/B,UAAM,eAAe,MAAM,KAAK,UAAU,oBAAoB,SAAS;AAEvE,QAAI,CAAC,aAAc,QAAO;AAE1B,UAAM,WAAW,KAAK,IAAI,IAAI,aAAa,QAAQ;AACnD,QAAI,WAAW,eAAe;AAC5B,YAAM,KAAK,gBAAgB,SAAS;AACpC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAc,qBAAwC;AACpD,UAAM,QAAQ,MAAM,KAAK,aAAa,SAAS;AAC/C,WAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI;AAAA,EACxD;AAAA,EAEA,MAAc,aAAa,QAAyC;AAClE,WAAO,OACJ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,OAAO;AAAA,MACX,IAAI,EAAE;AAAA,MACN,OAAO,EAAE,eAAe;AAAA,MACxB,QAAQ,KAAK,cAAc,CAAC;AAAA,MAC5B,qBAAqB,EAAE,UAAU,YAAY;AAAA,MAC7C,SAAS,EAAE,UAAU;AAAA,IACvB,EAAE;AAAA,EACN;AAAA,EAEQ,cAAc,OAAqC;AACzD,QAAI,MAAM,WAAW,SAAU,QAAO;AACtC,QAAI,MAAM,UAAU,QAAS,QAAO;AACpC,QAAI,MAAM,WAAW,OAAQ,QAAO;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,QAA2C;AACxE,WAAO,OACJ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EACnC,IAAI,CAAC,OAAO;AAAA,MACX,UAAU,EAAE,QAAQ,YAAY;AAAA,MAChC,WAAW,EAAE,QAAQ,aAAa;AAAA,MAClC,yBAAyB,EAAE,QAAQ;AAAA,MACnC,WAAW,EAAE;AAAA,MACb,UAAU,EAAE,UAAU,YAAY;AAAA,IACpC,EAAE;AAAA,EACN;AAAA,EAEA,MAAc,gBACZ,QACA,QACoB;AACpB,UAAM,WAAsB,CAAC;AAG7B,UAAM,cAAc,OAAO;AAAA,MACzB,CAAC,MAAM,EAAE,SAAS,WAAW,CAAC,EAAE,UAAU;AAAA,IAC5C;AAEA,eAAW,SAAS,aAAa;AAC/B,eAAS,KAAK;AAAA,QACZ,aAAa,MAAM,QAAQ,SAAS;AAAA,QACpC,qBAAqB,MAAM,UAAU,YAAY,CAAC;AAAA,QAClD,oBAAoB,MAAM,UAAU;AAAA,QACpC,UAAU,KAAK,iBAAiB,KAAK;AAAA,MACvC,CAAC;AAAA,IACH;AAGA,UAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO;AAC9D,eAAW,SAAS,eAAe;AACjC,eAAS,KAAK;AAAA,QACZ,aAAa,MAAM,SAAS;AAAA,QAC5B,qBAAqB,MAAM,SAAS,YAAY,CAAC;AAAA,QACjD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,OAAmC;AAC1D,UAAM,QAAQ,MAAM,QAAQ,OAAO,YAAY,KAAK;AACpD,QAAI,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,OAAO;AACtD,aAAO;AACT,QAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC9D,QAAI,MAAM,SAAS,SAAS,EAAG,QAAO;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,QAAsC;AACnE,UAAM,UAAU,oBAAI,IAAsB;AAE1C,UAAM,aAAa,OAAO;AAAA,MAAO,CAAC,MAChC,CAAC,QAAQ,SAAS,UAAU,QAAQ,EAAE,SAAS,EAAE,IAAI;AAAA,IACvD;AAEA,eAAW,SAAS,YAAY;AAC9B,YAAMA,QAAO,MAAM,QAAQ,aAAa,MAAM,QAAQ;AACtD,UAAI,CAACA,MAAM;AAEX,UAAI,CAAC,QAAQ,IAAIA,KAAI,GAAG;AACtB,gBAAQ,IAAIA,OAAM;AAAA,UAChB,MAAAA;AAAA,UACA,YAAY,CAAC;AAAA,UACb,cAAc,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,QACvC,CAAC;AAAA,MACH;AAEA,YAAM,OAAO,QAAQ,IAAIA,KAAI;AAC7B,YAAM,KAAK,KAAK,iBAAiB,MAAM,IAAI;AAC3C,UAAI,CAAC,KAAK,WAAW,SAAS,EAAE,GAAG;AACjC,aAAK,WAAW,KAAK,EAAE;AAAA,MACzB;AAEA,WAAK,aAAa,SAAS,MAAM,UAAU,eAAe;AAC1D,WAAK,aAAa,WAAW,MAAM,UAAU,iBAAiB;AAAA,IAChE;AAEA,WAAO,MAAM,KAAK,QAAQ,OAAO,CAAC;AAAA,EACpC;AAAA,EAEQ,iBAAiB,WAA8C;AACrE,YAAQ,WAAW;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,QAA8C;AAC1E,WAAO,OACJ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,SAAS,EACvD,IAAI,CAAC,OAAO;AAAA,MACX,SAAS,EAAE,QAAQ,WAAW;AAAA,MAC9B,SAAS,CAAC,EAAE,UAAU;AAAA,MACtB,gBAAgB,EAAE,QAAQ,QAAQ,UAAU,GAAG,GAAG;AAAA,IACpD,EAAE;AAAA,EACN;AAAA,EAEA,MAAc,cAAc,QAA0C;AACpE,WAAO,OACJ,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAChC,IAAI,CAAC,OAAO;AAAA,MACX,OAAO,EAAE,QAAQ,SAAS;AAAA,MAC1B,SAAS,EAAE,QAAQ,WAAW;AAAA,MAC9B,UAAU,EAAE,UAAU,YAAY;AAAA,MAClC,YAAY,EAAE,UAAU;AAAA,IAC1B,EAAE;AAAA,EACN;AAAA,EAEA,MAAc,eAAe,QAAoC;AAC/D,UAAM,WAAqB,CAAC;AAG5B,UAAM,YAAY,OAAO;AAAA,MACvB,CAAC,MACC,EAAE,SAAS,UACX,OAAO;AAAA,QACL,CAAC,OAAO,GAAG,SAAS,eAAe,GAAG,YAAY,EAAE;AAAA,MACtD;AAAA,IACJ;AACA,QAAI,UAAW,UAAS,KAAK,yBAAyB;AAGtD,UAAM,cACJ,OAAO;AAAA,MACL,CAAC,MACC,EAAE,QAAQ,aAAa,SAAS,UAAU,KAC1C,EAAE,UAAU,cAAc;AAAA,IAC9B,EAAE,SAAS;AACb,QAAI,YAAa,UAAS,KAAK,oBAAoB;AAGnD,UAAM,YACJ,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,SAAS,OAAO,EAAE,SAAS;AAC1E,QAAI,UAAW,UAAS,KAAK,wBAAwB;AAErD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBAAkB,QAA6C;AAC3E,WAAO,OACJ,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,EAClC,IAAI,CAAC,OAAO;AAAA,MACX,UAAU,EAAE,SAAS;AAAA,MACrB,SAAS,KAAK,mBAAmB,CAAC;AAAA,MAClC,WAAW,EAAE,SAAS;AAAA,IACxB,EAAE;AAAA,EACN;AAAA,EAEQ,mBAAmB,OAA0C;AACnE,QAAI,MAAM,WAAW,YAAY,MAAM,UAAU;AAC/C,aAAO;AACT,QAAI,MAAM,WAAW,YAAY,CAAC,MAAM,UAAU,QAAS,QAAO;AAClE,WAAO;AAAA,EACT;AAAA,EAEQ,4BAA4B,YAAyC;AAC3E,WAAO,WACJ,OAAO,CAAC,MAAM,EAAE,YAAY,YAAY,EACxC,IAAI,CAAC,MAAM,EAAE,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAc,mBACZ,OACA,UACA,WACmB;AACnB,UAAM,cAAwB,CAAC;AAG/B,UAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa;AACjE,QAAI,WAAW,SAAS,GAAG;AACzB,kBAAY,KAAK,gBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE;AAAA,IACxD;AAGA,UAAM,mBAAmB,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU;AACzE,QAAI,iBAAiB,SAAS,GAAG;AAC/B,kBAAY;AAAA,QACV,6BAA6B,iBAAiB,CAAC,EAAE,WAAW;AAAA,MAC9D;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE;AAClE,QAAI,WAAW,SAAS,GAAG;AACzB,kBAAY;AAAA,QACV,kBAAkB,WAAW,CAAC,EAAE,KAAK,KAAK,WAAW,CAAC,EAAE,mBAAmB;AAAA,MAC7E;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBACZ,QACA,UACmB;AACnB,UAAM,WAAqB,CAAC;AAG5B,UAAM,aAAa,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AACnD,QAAI,WAAW,SAAS,GAAG;AACzB,eAAS,KAAK,GAAG,WAAW,MAAM,oBAAoB;AAAA,IACxD;AAGA,UAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU;AACjE,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS;AAAA,QACP,GAAG,SAAS,MAAM;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YAAY,SAAyC;AACjE,UAAM,GAAG,MAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAEnD,UAAM,WAAW,GAAG,QAAQ,UAAU,QAAQ,SAAS,GAAG,CAAC;AAC3D,UAAM,WAAW,KAAK,KAAK,KAAK,YAAY,QAAQ;AAEpD,UAAM,GAAG,UAAU,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAGtE,UAAM,WAAW,MAAM,KAAK,wBAAwB,OAAO;AAC3D,UAAM,SAAS,SAAS,QAAQ,SAAS,KAAK;AAC9C,UAAM,GAAG,UAAU,QAAQ,UAAU,OAAO;AAAA,EAC9C;AACF;",
|
|
6
|
-
"names": ["path"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/session/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {\n SessionManager,\n sessionManager,\n type Session,\n type SessionOptions,\n FrameQueryMode,\n} from './session-manager.js';\n"],
|
|
5
|
-
"mappings": ";;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,OACK;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/session/session-manager.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Session Management for StackMemory\n * Provides session persistence and recovery across CLI invocations\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { logger } from '../monitoring/logger.js';\nimport { SystemError, ErrorCode } from '../errors/index.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport interface Session {\n sessionId: string;\n runId: string;\n projectId: string;\n branch?: string;\n startedAt: number;\n lastActiveAt: number;\n metadata: {\n user?: string;\n environment?: string;\n tags?: string[];\n cliVersion?: string;\n };\n state: 'active' | 'suspended' | 'closed';\n}\n\nexport interface SessionOptions {\n sessionId?: string;\n projectPath?: string;\n branch?: string;\n metadata?: Session['metadata'];\n}\n\nexport enum FrameQueryMode {\n CURRENT_SESSION = 'current',\n PROJECT_ACTIVE = 'project',\n ALL_ACTIVE = 'all',\n HISTORICAL = 'historical',\n}\n\nexport class SessionManager {\n private static instance: SessionManager;\n private sessionsDir: string;\n private currentSession: Session | null = null;\n private readonly STALE_THRESHOLD = 24 * 60 * 60 * 1000; // 24 hours\n\n private constructor() {\n const homeDir = process.env['HOME'] || process.env['USERPROFILE'] || '';\n this.sessionsDir = path.join(homeDir, '.stackmemory', 'sessions');\n }\n\n static getInstance(): SessionManager {\n if (!SessionManager.instance) {\n SessionManager.instance = new SessionManager();\n }\n return SessionManager.instance;\n }\n\n async initialize(): Promise<void> {\n try {\n await fs.mkdir(this.sessionsDir, { recursive: true });\n await fs.mkdir(path.join(this.sessionsDir, 'projects'), {\n recursive: true,\n });\n await fs.mkdir(path.join(this.sessionsDir, 'history'), {\n recursive: true,\n });\n } catch (error: unknown) {\n throw new SystemError(\n 'Failed to initialize session directories',\n ErrorCode.INITIALIZATION_ERROR,\n { error, sessionsDir: this.sessionsDir }\n );\n }\n }\n\n async getOrCreateSession(options?: SessionOptions): Promise<Session> {\n // 1. Check explicit session ID\n if (options?.sessionId) {\n const session = await this.loadSession(options.sessionId);\n if (session) {\n this.currentSession = session;\n return session;\n }\n }\n\n // 2. Check environment variable\n const envSessionId = process.env['STACKMEMORY_SESSION'];\n if (envSessionId) {\n const session = await this.loadSession(envSessionId);\n if (session) {\n this.currentSession = session;\n return session;\n }\n }\n\n // 3. Check project + branch context\n const projectHash = await this.getProjectHash(options?.projectPath);\n const branch =\n options?.branch || (await this.getGitBranch(options?.projectPath));\n\n if (projectHash) {\n // Try project+branch session\n const branchSession = await this.findProjectBranchSession(\n projectHash,\n branch\n );\n if (branchSession && this.isSessionRecent(branchSession)) {\n await this.touchSession(branchSession);\n this.currentSession = branchSession;\n return branchSession;\n }\n\n // Try last active for project\n const lastActive = await this.findLastActiveSession(projectHash);\n if (lastActive && this.isSessionRecent(lastActive)) {\n await this.touchSession(lastActive);\n this.currentSession = lastActive;\n return lastActive;\n }\n }\n\n // 4. Create new session\n const newSession = await this.createSession({\n projectId: projectHash || 'global',\n branch,\n metadata: options?.metadata,\n });\n\n this.currentSession = newSession;\n return newSession;\n }\n\n async createSession(params: {\n projectId: string;\n branch?: string;\n metadata?: Session['metadata'];\n }): Promise<Session> {\n const session: Session = {\n sessionId: uuidv4(),\n runId: uuidv4(),\n projectId: params.projectId,\n branch: params.branch,\n startedAt: Date.now(),\n lastActiveAt: Date.now(),\n metadata: {\n ...params.metadata,\n user: process.env['USER'],\n environment: process.env['NODE_ENV'] || 'development',\n cliVersion: process.env['npm_package_version'],\n },\n state: 'active',\n };\n\n await this.saveSession(session);\n await this.setProjectActiveSession(params.projectId, session.sessionId);\n\n // Set as current session\n this.currentSession = session;\n\n logger.info('Created new session', {\n sessionId: session.sessionId,\n projectId: session.projectId,\n branch: session.branch,\n });\n\n return session;\n }\n\n async loadSession(sessionId: string): Promise<Session | null> {\n try {\n const sessionPath = path.join(this.sessionsDir, `${sessionId}.json`);\n const data = await fs.readFile(sessionPath, 'utf-8');\n return JSON.parse(data) as Session;\n } catch (error: unknown) {\n // Check history\n try {\n const historyPath = path.join(\n this.sessionsDir,\n 'history',\n `${sessionId}.json`\n );\n const data = await fs.readFile(historyPath, 'utf-8');\n return JSON.parse(data) as Session;\n } catch {\n return null;\n }\n }\n }\n\n async saveSession(session: Session): Promise<void> {\n const sessionPath = path.join(\n this.sessionsDir,\n `${session.sessionId}.json`\n );\n await fs.writeFile(sessionPath, JSON.stringify(session, null, 2));\n }\n\n async suspendSession(sessionId?: string): Promise<void> {\n const id = sessionId || this.currentSession?.sessionId;\n if (!id) return;\n\n const session = await this.loadSession(id);\n if (session) {\n session.state = 'suspended';\n session.lastActiveAt = Date.now();\n await this.saveSession(session);\n }\n }\n\n async resumeSession(sessionId: string): Promise<Session> {\n const session = await this.loadSession(sessionId);\n if (!session) {\n throw new SystemError('Session not found', ErrorCode.NOT_FOUND, {\n sessionId,\n });\n }\n\n session.state = 'active';\n session.lastActiveAt = Date.now();\n await this.saveSession(session);\n\n this.currentSession = session;\n return session;\n }\n\n async closeSession(sessionId?: string): Promise<void> {\n const id = sessionId || this.currentSession?.sessionId;\n if (!id) return;\n\n const session = await this.loadSession(id);\n if (session) {\n session.state = 'closed';\n session.lastActiveAt = Date.now();\n\n // Move to history\n const sessionPath = path.join(\n this.sessionsDir,\n `${session.sessionId}.json`\n );\n const historyPath = path.join(\n this.sessionsDir,\n 'history',\n `${session.sessionId}.json`\n );\n\n await fs.rename(sessionPath, historyPath);\n }\n }\n\n async listSessions(filter?: {\n projectId?: string;\n state?: Session['state'];\n branch?: string;\n }): Promise<Session[]> {\n const sessions: Session[] = [];\n\n // Load active sessions\n const files = await fs.readdir(this.sessionsDir);\n for (const file of files) {\n if (file.endsWith('.json')) {\n const session = await this.loadSession(file.replace('.json', ''));\n if (session) {\n sessions.push(session);\n }\n }\n }\n\n // Apply filters\n return sessions.filter((s) => {\n if (filter?.projectId && s.projectId !== filter.projectId) return false;\n if (filter?.state && s.state !== filter.state) return false;\n if (filter?.branch && s.branch !== filter.branch) return false;\n return true;\n });\n }\n\n async mergeSessions(sourceId: string, targetId: string): Promise<Session> {\n const source = await this.loadSession(sourceId);\n const target = await this.loadSession(targetId);\n\n if (!source || !target) {\n throw new SystemError(\n 'Session not found for merge',\n ErrorCode.NOT_FOUND,\n { sourceId, targetId }\n );\n }\n\n // Merge metadata\n target.metadata = {\n ...target.metadata,\n ...source.metadata,\n tags: [...(target.metadata.tags || []), ...(source.metadata.tags || [])],\n };\n\n // Update timestamps\n target.lastActiveAt = Date.now();\n\n // Close source session\n await this.closeSession(sourceId);\n await this.saveSession(target);\n\n logger.info('Merged sessions', {\n source: sourceId,\n target: targetId,\n });\n\n return target;\n }\n\n async cleanupStaleSessions(\n maxAge: number = 30 * 24 * 60 * 60 * 1000\n ): Promise<number> {\n const historyDir = path.join(this.sessionsDir, 'history');\n const files = await fs.readdir(historyDir);\n const cutoff = Date.now() - maxAge;\n let cleaned = 0;\n\n for (const file of files) {\n if (file.endsWith('.json')) {\n const filePath = path.join(historyDir, file);\n const stats = await fs.stat(filePath);\n\n if (stats.mtimeMs < cutoff) {\n await fs.unlink(filePath);\n cleaned++;\n }\n }\n }\n\n logger.info(`Cleaned up ${cleaned} stale sessions`);\n return cleaned;\n }\n\n getCurrentSession(): Session | null {\n return this.currentSession;\n }\n\n getSessionRunId(): string {\n return this.currentSession?.runId || uuidv4();\n }\n\n private async getProjectHash(projectPath?: string): Promise<string | null> {\n try {\n const cwd = projectPath || process.cwd();\n const pathModule = await import('path');\n\n // Try to get git remote first (consistent with project-manager)\n let identifier: string;\n try {\n const { execSync } = await import('child_process');\n identifier = execSync('git config --get remote.origin.url', {\n cwd,\n encoding: 'utf-8',\n timeout: 5000,\n }).trim();\n } catch {\n // Fall back to directory path\n identifier = cwd;\n }\n\n // Use same algorithm as project-manager.generateProjectId\n const cleaned = identifier\n .replace(/\\.git$/, '')\n .replace(/[^a-zA-Z0-9-]/g, '-')\n .toLowerCase();\n\n return cleaned.substring(cleaned.length - 50);\n } catch {\n return null;\n }\n }\n\n private async getGitBranch(\n projectPath?: string\n ): Promise<string | undefined> {\n try {\n const { execSync } = await import('child_process');\n const cwd = projectPath || process.cwd();\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd,\n encoding: 'utf-8',\n }).trim();\n return branch;\n } catch {\n return undefined;\n }\n }\n\n private async findProjectBranchSession(\n projectHash: string,\n branch?: string\n ): Promise<Session | null> {\n if (!branch) return null;\n\n const sessions = await this.listSessions({\n projectId: projectHash,\n state: 'active',\n branch,\n });\n\n return sessions.sort((a, b) => b.lastActiveAt - a.lastActiveAt)[0] || null;\n }\n\n private async findLastActiveSession(\n projectHash: string\n ): Promise<Session | null> {\n const sessions = await this.listSessions({\n projectId: projectHash,\n state: 'active',\n });\n\n return sessions.sort((a, b) => b.lastActiveAt - a.lastActiveAt)[0] || null;\n }\n\n private async setProjectActiveSession(\n projectId: string,\n sessionId: string\n ): Promise<void> {\n const projectFile = path.join(\n this.sessionsDir,\n 'projects',\n `${projectId}.json`\n );\n await fs.writeFile(\n projectFile,\n JSON.stringify(\n {\n projectId,\n activeSessionId: sessionId,\n updatedAt: Date.now(),\n },\n null,\n 2\n )\n );\n }\n\n private isSessionRecent(session: Session): boolean {\n return Date.now() - session.lastActiveAt < this.STALE_THRESHOLD;\n }\n\n private async touchSession(session: Session): Promise<void> {\n session.lastActiveAt = Date.now();\n await this.saveSession(session);\n }\n}\n\nexport const sessionManager = SessionManager.getInstance();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["FrameQueryMode"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/skills/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Skills Module\n * Persistent agent learning and skill memory\n */\n\nexport * from './types.js';\nexport * from './skill-storage.js';\n"],
|
|
5
|
-
"mappings": ";;;;AAKA,cAAc;AACd,cAAc;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|