@stackmemoryai/stackmemory 0.5.58 → 0.5.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -1
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1236 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +609 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/extensions/custom-tools.js +567 -0
- package/dist/src/core/extensions/custom-tools.js.map +7 -0
- package/dist/src/core/extensions/index.js +55 -0
- package/dist/src/core/extensions/index.js.map +7 -0
- package/dist/src/core/extensions/loader.js +709 -0
- package/dist/src/core/extensions/loader.js.map +7 -0
- package/dist/src/core/extensions/plugin-system.js +506 -0
- package/dist/src/core/extensions/plugin-system.js.map +7 -0
- package/dist/src/core/extensions/provider-adapter.js +617 -0
- package/dist/src/core/extensions/provider-adapter.js.map +7 -0
- package/dist/src/core/extensions/sandbox-runtime.js +664 -0
- package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +380 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +632 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +13 -9
- package/scripts/background-sync-manager.js +145 -83
- package/scripts/claude-sm-autostart.js +17 -12
- package/scripts/gepa/README.md +275 -0
- package/scripts/gepa/config.json +53 -0
- package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
- package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
- package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
- package/scripts/gepa/generations/gen-000/baseline.md +124 -0
- package/scripts/gepa/hooks/auto-optimize.js +494 -0
- package/scripts/gepa/hooks/eval-tracker.js +203 -0
- package/scripts/gepa/hooks/reflect.js +311 -0
- package/scripts/gepa/optimize.js +611 -0
- package/scripts/gepa/state.json +14 -0
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
- package/scripts/test-pre-publish-quick.sh +1 -1
- package/dist/agents/core/agent-task-manager.js.map +0 -7
- package/dist/agents/testing-agent.js +0 -614
- package/dist/agents/testing-agent.js.map +0 -7
- package/dist/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/cli/auto-detect.js.map +0 -7
- package/dist/cli/browser-test.js +0 -33
- package/dist/cli/browser-test.js.map +0 -7
- package/dist/cli/claude-sm-danger.js.map +0 -7
- package/dist/cli/claude-sm.js +0 -1156
- package/dist/cli/claude-sm.js.map +0 -7
- package/dist/cli/codex-sm-danger.js.map +0 -7
- package/dist/cli/codex-sm.js.map +0 -7
- package/dist/cli/commands/api.js.map +0 -7
- package/dist/cli/commands/auto-background.js.map +0 -7
- package/dist/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/cli/commands/clear.js.map +0 -7
- package/dist/cli/commands/config.js.map +0 -7
- package/dist/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/cli/commands/context.js.map +0 -7
- package/dist/cli/commands/daemon.js.map +0 -7
- package/dist/cli/commands/dashboard.js.map +0 -7
- package/dist/cli/commands/db.js.map +0 -7
- package/dist/cli/commands/decision.js.map +0 -7
- package/dist/cli/commands/discovery.js.map +0 -7
- package/dist/cli/commands/handoff.js.map +0 -7
- package/dist/cli/commands/hooks.js.map +0 -7
- package/dist/cli/commands/linear-unified.js +0 -353
- package/dist/cli/commands/linear-unified.js.map +0 -7
- package/dist/cli/commands/linear.js.map +0 -7
- package/dist/cli/commands/log.js.map +0 -7
- package/dist/cli/commands/login.js.map +0 -7
- package/dist/cli/commands/migrate.js.map +0 -7
- package/dist/cli/commands/model.js.map +0 -7
- package/dist/cli/commands/monitor.js +0 -313
- package/dist/cli/commands/monitor.js.map +0 -7
- package/dist/cli/commands/onboard.js.map +0 -7
- package/dist/cli/commands/projects.js.map +0 -7
- package/dist/cli/commands/quality.js +0 -413
- package/dist/cli/commands/quality.js.map +0 -7
- package/dist/cli/commands/ralph.js.map +0 -7
- package/dist/cli/commands/retrieval.js.map +0 -7
- package/dist/cli/commands/search.js +0 -156
- package/dist/cli/commands/search.js.map +0 -7
- package/dist/cli/commands/service.js.map +0 -7
- package/dist/cli/commands/session.js.map +0 -7
- package/dist/cli/commands/settings.js.map +0 -7
- package/dist/cli/commands/setup.js.map +0 -7
- package/dist/cli/commands/shell.js.map +0 -7
- package/dist/cli/commands/signup.js.map +0 -7
- package/dist/cli/commands/skills.js.map +0 -7
- package/dist/cli/commands/sms-notify.js.map +0 -7
- package/dist/cli/commands/storage-tier.js.map +0 -7
- package/dist/cli/commands/storage.js +0 -360
- package/dist/cli/commands/storage.js.map +0 -7
- package/dist/cli/commands/sweep.js.map +0 -7
- package/dist/cli/commands/tasks.js.map +0 -7
- package/dist/cli/commands/test.js +0 -286
- package/dist/cli/commands/test.js.map +0 -7
- package/dist/cli/commands/workflow.js +0 -142
- package/dist/cli/commands/workflow.js.map +0 -7
- package/dist/cli/commands/worktree.js.map +0 -7
- package/dist/cli/index.js +0 -594
- package/dist/cli/index.js.map +0 -7
- package/dist/cli/opencode-sm.js.map +0 -7
- package/dist/cli/utils/viewer.js.map +0 -7
- package/dist/core/analytics/team-analytics.js +0 -378
- package/dist/core/analytics/team-analytics.js.map +0 -7
- package/dist/core/config/config-manager.js.map +0 -7
- package/dist/core/config/feature-flags.js.map +0 -7
- package/dist/core/config/storage-config.js.map +0 -7
- package/dist/core/config/types.js.map +0 -7
- package/dist/core/context/auto-context.js.map +0 -7
- package/dist/core/context/dual-stack-manager.js.map +0 -7
- package/dist/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/core/context/frame-database.js.map +0 -7
- package/dist/core/context/frame-digest.js.map +0 -7
- package/dist/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/core/context/frame-manager.js +0 -1069
- package/dist/core/context/frame-manager.js.map +0 -7
- package/dist/core/context/frame-recovery.js.map +0 -7
- package/dist/core/context/frame-stack.js.map +0 -7
- package/dist/core/context/incremental-gc.js +0 -290
- package/dist/core/context/incremental-gc.js.map +0 -7
- package/dist/core/context/index.js.map +0 -7
- package/dist/core/context/model-aware-compaction.js +0 -623
- package/dist/core/context/model-aware-compaction.js.map +0 -7
- package/dist/core/context/permission-manager.js.map +0 -7
- package/dist/core/context/recursive-context-manager.js.map +0 -7
- package/dist/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/core/context/shared-context-layer.js.map +0 -7
- package/dist/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/core/context/validation.js.map +0 -7
- package/dist/core/database/batch-operations.js.map +0 -7
- package/dist/core/database/connection-pool.js.map +0 -7
- package/dist/core/database/database-adapter.js.map +0 -7
- package/dist/core/database/migration-manager.js.map +0 -7
- package/dist/core/database/paradedb-adapter.js +0 -990
- package/dist/core/database/paradedb-adapter.js.map +0 -7
- package/dist/core/database/query-cache.js.map +0 -7
- package/dist/core/database/query-router.js.map +0 -7
- package/dist/core/database/sqlite-adapter.js +0 -728
- package/dist/core/database/sqlite-adapter.js.map +0 -7
- package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/core/digest/index.js.map +0 -7
- package/dist/core/digest/types.js.map +0 -7
- package/dist/core/errors/index.js +0 -512
- package/dist/core/errors/index.js.map +0 -7
- package/dist/core/errors/recovery.js.map +0 -7
- package/dist/core/execution/parallel-executor.js.map +0 -7
- package/dist/core/frame/workflow-templates.js.map +0 -7
- package/dist/core/merge/conflict-detector.js.map +0 -7
- package/dist/core/merge/index.js.map +0 -7
- package/dist/core/merge/resolution-engine.js.map +0 -7
- package/dist/core/merge/stack-diff.js.map +0 -7
- package/dist/core/models/fallback-monitor.js.map +0 -7
- package/dist/core/models/model-router.js.map +0 -7
- package/dist/core/monitoring/error-handler.js.map +0 -7
- package/dist/core/monitoring/logger.js +0 -150
- package/dist/core/monitoring/logger.js.map +0 -7
- package/dist/core/monitoring/metrics.js.map +0 -7
- package/dist/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/core/monitoring/session-monitor.js.map +0 -7
- package/dist/core/performance/context-cache.js.map +0 -7
- package/dist/core/performance/index.js.map +0 -7
- package/dist/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/core/performance/monitor.js.map +0 -7
- package/dist/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/core/performance/performance-benchmark.js.map +0 -7
- package/dist/core/performance/performance-profiler.js.map +0 -7
- package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/core/projects/project-isolation.js.map +0 -7
- package/dist/core/projects/project-manager.js.map +0 -7
- package/dist/core/query/query-parser.js.map +0 -7
- package/dist/core/query/query-templates.js.map +0 -7
- package/dist/core/retrieval/context-retriever.js.map +0 -7
- package/dist/core/retrieval/graph-retrieval.js +0 -662
- package/dist/core/retrieval/graph-retrieval.js.map +0 -7
- package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
- package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
- package/dist/core/retrieval/index.js.map +0 -7
- package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/core/retrieval/llm-provider.js.map +0 -7
- package/dist/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
- package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
- package/dist/core/retrieval/summary-generator.js.map +0 -7
- package/dist/core/retrieval/types.js.map +0 -7
- package/dist/core/session/clear-survival.js.map +0 -7
- package/dist/core/session/enhanced-handoff.js.map +0 -7
- package/dist/core/session/handoff-generator.js.map +0 -7
- package/dist/core/session/index.js.map +0 -7
- package/dist/core/session/session-manager.js.map +0 -7
- package/dist/core/skills/index.js.map +0 -7
- package/dist/core/skills/skill-storage.js.map +0 -7
- package/dist/core/skills/types.js.map +0 -7
- package/dist/core/storage/chromadb-adapter.js +0 -354
- package/dist/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/core/storage/infinite-storage.js.map +0 -7
- package/dist/core/storage/railway-optimized-storage.js +0 -591
- package/dist/core/storage/railway-optimized-storage.js.map +0 -7
- package/dist/core/storage/remote-storage.js.map +0 -7
- package/dist/core/storage/two-tier-storage.js.map +0 -7
- package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/core/trace/debug-trace.js.map +0 -7
- package/dist/core/trace/index.js.map +0 -7
- package/dist/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/core/trace/trace-demo.js +0 -154
- package/dist/core/trace/trace-demo.js.map +0 -7
- package/dist/core/trace/trace-detector.demo.js +0 -142
- package/dist/core/trace/trace-detector.demo.js.map +0 -7
- package/dist/core/trace/trace-detector.js.map +0 -7
- package/dist/core/trace/trace-store.js.map +0 -7
- package/dist/core/trace/types.js.map +0 -7
- package/dist/core/utils/async-mutex.js.map +0 -7
- package/dist/core/utils/compression.js.map +0 -7
- package/dist/core/utils/update-checker.js.map +0 -7
- package/dist/core/worktree/worktree-manager.js.map +0 -7
- package/dist/daemon/daemon-config.js.map +0 -7
- package/dist/daemon/services/context-service.js.map +0 -7
- package/dist/daemon/services/linear-service.js.map +0 -7
- package/dist/daemon/session-daemon.js.map +0 -7
- package/dist/daemon/unified-daemon.js.map +0 -7
- package/dist/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/features/analytics/index.js.map +0 -7
- package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/features/browser/browser-mcp.js.map +0 -7
- package/dist/features/sweep/index.js.map +0 -7
- package/dist/features/sweep/prediction-client.js.map +0 -7
- package/dist/features/sweep/prompt-builder.js.map +0 -7
- package/dist/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/features/sweep/state-watcher.js.map +0 -7
- package/dist/features/sweep/status-bar.js.map +0 -7
- package/dist/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/features/sweep/types.js.map +0 -7
- package/dist/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/features/tasks/task-aware-context.js.map +0 -7
- package/dist/features/tui/simple-monitor.js.map +0 -7
- package/dist/features/tui/swarm-monitor.js.map +0 -7
- package/dist/features/web/client/stores/task-store.js.map +0 -7
- package/dist/features/web/server/index.js.map +0 -7
- package/dist/hooks/auto-background.js.map +0 -7
- package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/hooks/config.js.map +0 -7
- package/dist/hooks/daemon.js.map +0 -7
- package/dist/hooks/events.js.map +0 -7
- package/dist/hooks/index.js.map +0 -7
- package/dist/hooks/linear-task-picker.js.map +0 -7
- package/dist/hooks/schemas.js.map +0 -7
- package/dist/hooks/secure-fs.js.map +0 -7
- package/dist/hooks/security-logger.js.map +0 -7
- package/dist/hooks/session-summary.js.map +0 -7
- package/dist/hooks/sms-action-runner.js.map +0 -7
- package/dist/hooks/sms-notify.js.map +0 -7
- package/dist/hooks/sms-watcher.js.map +0 -7
- package/dist/hooks/sms-webhook.js.map +0 -7
- package/dist/hooks/whatsapp-commands.js.map +0 -7
- package/dist/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/hooks/whatsapp-sync.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/integrations/anthropic/client.js.map +0 -7
- package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/integrations/linear/auth.js.map +0 -7
- package/dist/integrations/linear/auto-sync.js.map +0 -7
- package/dist/integrations/linear/client.js +0 -630
- package/dist/integrations/linear/client.js.map +0 -7
- package/dist/integrations/linear/config.js.map +0 -7
- package/dist/integrations/linear/migration.js.map +0 -7
- package/dist/integrations/linear/oauth-server.js.map +0 -7
- package/dist/integrations/linear/rest-client.js.map +0 -7
- package/dist/integrations/linear/sync-manager.js.map +0 -7
- package/dist/integrations/linear/sync-service.js.map +0 -7
- package/dist/integrations/linear/sync.js.map +0 -7
- package/dist/integrations/linear/unified-sync.js.map +0 -7
- package/dist/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/integrations/linear/webhook-server.js.map +0 -7
- package/dist/integrations/linear/webhook.js.map +0 -7
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/integrations/mcp/index.js.map +0 -7
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/integrations/mcp/remote-server.js +0 -691
- package/dist/integrations/mcp/remote-server.js.map +0 -7
- package/dist/integrations/mcp/schemas.js.map +0 -7
- package/dist/integrations/mcp/server.js +0 -1960
- package/dist/integrations/mcp/server.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/integrations/mcp/trace-test.js +0 -48
- package/dist/integrations/mcp/trace-test.js.map +0 -7
- package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
- package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
- package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
- package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/integrations/ralph/index.js.map +0 -7
- package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
- package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/models/user.model.js.map +0 -7
- package/dist/servers/production/auth-middleware.js.map +0 -7
- package/dist/servers/railway/config.js +0 -55
- package/dist/servers/railway/config.js.map +0 -7
- package/dist/servers/railway/index-enhanced.js +0 -160
- package/dist/servers/railway/index-enhanced.js.map +0 -7
- package/dist/servers/railway/index.js +0 -1349
- package/dist/servers/railway/index.js.map +0 -7
- package/dist/servers/railway/simple.js +0 -64
- package/dist/servers/railway/simple.js.map +0 -7
- package/dist/servers/railway/storage-test.js +0 -459
- package/dist/servers/railway/storage-test.js.map +0 -7
- package/dist/services/config-service.js.map +0 -7
- package/dist/services/context-service.js.map +0 -7
- package/dist/skills/api-discovery.js.map +0 -7
- package/dist/skills/api-skill.js.map +0 -7
- package/dist/skills/claude-skills.js.map +0 -7
- package/dist/skills/dashboard-launcher.js.map +0 -7
- package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/skills/repo-ingestion-skill.js +0 -609
- package/dist/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/skills/security-secrets-scanner.js +0 -284
- package/dist/skills/security-secrets-scanner.js.map +0 -7
- package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/utils/env.js.map +0 -7
- package/dist/utils/formatting.js.map +0 -7
- package/dist/utils/process-cleanup.js.map +0 -7
- package/dist/validation/schemas.js +0 -222
- package/dist/validation/schemas.js.map +0 -7
- /package/dist/{agents → src/agents}/core/agent-task-manager.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/base-verifier.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/formatter-verifier.js +0 -0
- /package/dist/{agents → src/agents}/verifiers/llm-judge.js +0 -0
- /package/dist/{cli → src/cli}/auto-detect.js +0 -0
- /package/dist/{cli → src/cli}/claude-sm-danger.js +0 -0
- /package/dist/{cli → src/cli}/codex-sm-danger.js +0 -0
- /package/dist/{cli → src/cli}/codex-sm.js +0 -0
- /package/dist/{cli → src/cli}/commands/api.js +0 -0
- /package/dist/{cli → src/cli}/commands/auto-background.js +0 -0
- /package/dist/{cli → src/cli}/commands/cleanup-processes.js +0 -0
- /package/dist/{cli → src/cli}/commands/clear.js +0 -0
- /package/dist/{cli → src/cli}/commands/config.js +0 -0
- /package/dist/{cli → src/cli}/commands/context-rehydrate.js +0 -0
- /package/dist/{cli → src/cli}/commands/context.js +0 -0
- /package/dist/{cli → src/cli}/commands/daemon.js +0 -0
- /package/dist/{cli → src/cli}/commands/dashboard.js +0 -0
- /package/dist/{cli → src/cli}/commands/db.js +0 -0
- /package/dist/{cli → src/cli}/commands/decision.js +0 -0
- /package/dist/{cli → src/cli}/commands/discovery.js +0 -0
- /package/dist/{cli → src/cli}/commands/handoff.js +0 -0
- /package/dist/{cli → src/cli}/commands/hooks.js +0 -0
- /package/dist/{cli → src/cli}/commands/linear.js +0 -0
- /package/dist/{cli → src/cli}/commands/log.js +0 -0
- /package/dist/{cli → src/cli}/commands/login.js +0 -0
- /package/dist/{cli → src/cli}/commands/migrate.js +0 -0
- /package/dist/{cli → src/cli}/commands/model.js +0 -0
- /package/dist/{cli → src/cli}/commands/onboard.js +0 -0
- /package/dist/{cli → src/cli}/commands/projects.js +0 -0
- /package/dist/{cli → src/cli}/commands/ralph.js +0 -0
- /package/dist/{cli → src/cli}/commands/retrieval.js +0 -0
- /package/dist/{cli → src/cli}/commands/service.js +0 -0
- /package/dist/{cli → src/cli}/commands/session.js +0 -0
- /package/dist/{cli → src/cli}/commands/settings.js +0 -0
- /package/dist/{cli → src/cli}/commands/setup.js +0 -0
- /package/dist/{cli → src/cli}/commands/shell.js +0 -0
- /package/dist/{cli → src/cli}/commands/signup.js +0 -0
- /package/dist/{cli → src/cli}/commands/skills.js +0 -0
- /package/dist/{cli → src/cli}/commands/sms-notify.js +0 -0
- /package/dist/{cli → src/cli}/commands/storage-tier.js +0 -0
- /package/dist/{cli → src/cli}/commands/sweep.js +0 -0
- /package/dist/{cli → src/cli}/commands/tasks.js +0 -0
- /package/dist/{cli → src/cli}/commands/worktree.js +0 -0
- /package/dist/{cli → src/cli}/opencode-sm.js +0 -0
- /package/dist/{cli → src/cli}/utils/viewer.js +0 -0
- /package/dist/{core → src/core}/config/config-manager.js +0 -0
- /package/dist/{core → src/core}/config/feature-flags.js +0 -0
- /package/dist/{core → src/core}/config/storage-config.js +0 -0
- /package/dist/{core → src/core}/config/types.js +0 -0
- /package/dist/{core → src/core}/context/auto-context.js +0 -0
- /package/dist/{core → src/core}/context/dual-stack-manager.js +0 -0
- /package/dist/{core → src/core}/context/enhanced-rehydration.js +0 -0
- /package/dist/{core → src/core}/context/frame-database.js +0 -0
- /package/dist/{core → src/core}/context/frame-digest.js +0 -0
- /package/dist/{core → src/core}/context/frame-handoff-manager.js +0 -0
- /package/dist/{core → src/core}/context/frame-lifecycle-hooks.js +0 -0
- /package/dist/{core → src/core}/context/frame-recovery.js +0 -0
- /package/dist/{core → src/core}/context/frame-stack.js +0 -0
- /package/dist/{core → src/core}/context/frame-types.js +0 -0
- /package/dist/{core → src/core}/context/frame-types.js.map +0 -0
- /package/dist/{core → src/core}/context/index.js +0 -0
- /package/dist/{core → src/core}/context/permission-manager.js +0 -0
- /package/dist/{core → src/core}/context/recursive-context-manager.js +0 -0
- /package/dist/{core → src/core}/context/refactored-frame-manager.js +0 -0
- /package/dist/{core → src/core}/context/shared-context-layer.js +0 -0
- /package/dist/{core → src/core}/context/stack-merge-resolver.js +0 -0
- /package/dist/{core → src/core}/context/validation.js +0 -0
- /package/dist/{core → src/core}/database/batch-operations.js +0 -0
- /package/dist/{core → src/core}/database/connection-pool.js +0 -0
- /package/dist/{core → src/core}/database/database-adapter.js +0 -0
- /package/dist/{core → src/core}/database/migration-manager.js +0 -0
- /package/dist/{core → src/core}/database/query-cache.js +0 -0
- /package/dist/{core → src/core}/database/query-router.js +0 -0
- /package/dist/{core → src/core}/digest/enhanced-hybrid-digest.js +0 -0
- /package/dist/{core → src/core}/digest/frame-digest-integration.js +0 -0
- /package/dist/{core → src/core}/digest/hybrid-digest-generator.js +0 -0
- /package/dist/{core → src/core}/digest/index.js +0 -0
- /package/dist/{core → src/core}/digest/types.js +0 -0
- /package/dist/{core → src/core}/errors/recovery.js +0 -0
- /package/dist/{core → src/core}/execution/parallel-executor.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
- /package/dist/{core → src/core}/frame/workflow-templates.js +0 -0
- /package/dist/{core → src/core}/merge/conflict-detector.js +0 -0
- /package/dist/{core → src/core}/merge/index.js +0 -0
- /package/dist/{core → src/core}/merge/resolution-engine.js +0 -0
- /package/dist/{core → src/core}/merge/stack-diff.js +0 -0
- /package/dist/{core → src/core/merge}/types.js +0 -0
- /package/dist/{core → src/core/merge}/types.js.map +0 -0
- /package/dist/{core → src/core}/models/fallback-monitor.js +0 -0
- /package/dist/{core → src/core}/models/model-router.js +0 -0
- /package/dist/{core → src/core}/monitoring/error-handler.js +0 -0
- /package/dist/{core → src/core}/monitoring/metrics.js +0 -0
- /package/dist/{core → src/core}/monitoring/progress-tracker.js +0 -0
- /package/dist/{core → src/core}/monitoring/session-monitor.js +0 -0
- /package/dist/{core → src/core}/performance/context-cache.js +0 -0
- /package/dist/{core → src/core}/performance/index.js +0 -0
- /package/dist/{core → src/core}/performance/lazy-context-loader.js +0 -0
- /package/dist/{core → src/core}/performance/monitor.js +0 -0
- /package/dist/{core → src/core}/performance/optimized-frame-context.js +0 -0
- /package/dist/{core → src/core}/performance/performance-benchmark.js +0 -0
- /package/dist/{core → src/core}/performance/performance-profiler.js +0 -0
- /package/dist/{core → src/core}/performance/streaming-jsonl-parser.js +0 -0
- /package/dist/{core → src/core}/persistence/postgres-adapter.js +0 -0
- /package/dist/{core → src/core}/projects/project-isolation.js +0 -0
- /package/dist/{core → src/core}/projects/project-manager.js +0 -0
- /package/dist/{core → src/core}/query/query-parser.js +0 -0
- /package/dist/{core → src/core}/query/query-templates.js +0 -0
- /package/dist/{core → src/core}/retrieval/context-retriever.js +0 -0
- /package/dist/{core → src/core}/retrieval/index.js +0 -0
- /package/dist/{core → src/core}/retrieval/llm-context-retrieval.js +0 -0
- /package/dist/{core → src/core}/retrieval/llm-provider.js +0 -0
- /package/dist/{core → src/core}/retrieval/retrieval-audit.js +0 -0
- /package/dist/{core → src/core}/retrieval/summary-generator.js +0 -0
- /package/dist/{core → src/core}/retrieval/types.js +0 -0
- /package/dist/{core → src/core}/session/clear-survival.js +0 -0
- /package/dist/{core → src/core}/session/enhanced-handoff.js +0 -0
- /package/dist/{core → src/core}/session/handoff-generator.js +0 -0
- /package/dist/{core → src/core}/session/index.js +0 -0
- /package/dist/{core → src/core}/session/session-manager.js +0 -0
- /package/dist/{core → src/core}/skills/index.js +0 -0
- /package/dist/{core → src/core}/skills/skill-storage.js +0 -0
- /package/dist/{core → src/core}/skills/types.js +0 -0
- /package/dist/{core → src/core}/storage/infinite-storage.js +0 -0
- /package/dist/{core → src/core}/storage/remote-storage.js +0 -0
- /package/dist/{core → src/core}/storage/two-tier-storage.js +0 -0
- /package/dist/{core → src/core}/trace/cli-trace-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/db-trace-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/debug-trace.js +0 -0
- /package/dist/{core → src/core}/trace/index.js +0 -0
- /package/dist/{core → src/core}/trace/linear-api-wrapper.js +0 -0
- /package/dist/{core → src/core}/trace/trace-detector.js +0 -0
- /package/dist/{core → src/core}/trace/trace-store.js +0 -0
- /package/dist/{core → src/core}/trace/types.js +0 -0
- /package/dist/{integrations/linear → src/core}/types.js +0 -0
- /package/dist/{integrations/linear → src/core}/types.js.map +0 -0
- /package/dist/{core → src/core}/utils/async-mutex.js +0 -0
- /package/dist/{core → src/core}/utils/compression.js +0 -0
- /package/dist/{core → src/core}/utils/update-checker.js +0 -0
- /package/dist/{core → src/core}/worktree/worktree-manager.js +0 -0
- /package/dist/{daemon → src/daemon}/daemon-config.js +0 -0
- /package/dist/{daemon → src/daemon}/services/context-service.js +0 -0
- /package/dist/{daemon → src/daemon}/services/linear-service.js +0 -0
- /package/dist/{daemon → src/daemon}/session-daemon.js +0 -0
- /package/dist/{daemon → src/daemon}/unified-daemon.js +0 -0
- /package/dist/{features → src/features}/analytics/api/analytics-api.js +0 -0
- /package/dist/{features → src/features}/analytics/core/analytics-service.js +0 -0
- /package/dist/{features → src/features}/analytics/index.js +0 -0
- /package/dist/{features → src/features}/analytics/queries/metrics-queries.js +0 -0
- /package/dist/{features → src/features}/analytics/types/metrics.js +0 -0
- /package/dist/{features → src/features}/analytics/types/metrics.js.map +0 -0
- /package/dist/{features → src/features}/browser/browser-mcp.js +0 -0
- /package/dist/{features → src/features}/sweep/index.js +0 -0
- /package/dist/{features → src/features}/sweep/prediction-client.js +0 -0
- /package/dist/{features → src/features}/sweep/prompt-builder.js +0 -0
- /package/dist/{features → src/features}/sweep/pty-wrapper.js +0 -0
- /package/dist/{features → src/features}/sweep/state-watcher.js +0 -0
- /package/dist/{features → src/features}/sweep/status-bar.js +0 -0
- /package/dist/{features → src/features}/sweep/sweep-server-manager.js +0 -0
- /package/dist/{features → src/features}/sweep/tab-interceptor.js +0 -0
- /package/dist/{features → src/features}/sweep/types.js +0 -0
- /package/dist/{features → src/features}/tasks/linear-task-manager.js +0 -0
- /package/dist/{features → src/features}/tasks/task-aware-context.js +0 -0
- /package/dist/{features → src/features}/tui/simple-monitor.js +0 -0
- /package/dist/{features → src/features}/tui/swarm-monitor.js +0 -0
- /package/dist/{features → src/features}/web/client/stores/task-store.js +0 -0
- /package/dist/{features → src/features}/web/server/index.js +0 -0
- /package/dist/{hooks → src/hooks}/auto-background.js +0 -0
- /package/dist/{hooks → src/hooks}/claude-code-whatsapp-hook.js +0 -0
- /package/dist/{hooks → src/hooks}/config.js +0 -0
- /package/dist/{hooks → src/hooks}/daemon.js +0 -0
- /package/dist/{hooks → src/hooks}/events.js +0 -0
- /package/dist/{hooks → src/hooks}/index.js +0 -0
- /package/dist/{hooks → src/hooks}/linear-task-picker.js +0 -0
- /package/dist/{hooks → src/hooks}/schemas.js +0 -0
- /package/dist/{hooks → src/hooks}/secure-fs.js +0 -0
- /package/dist/{hooks → src/hooks}/security-logger.js +0 -0
- /package/dist/{hooks → src/hooks}/session-summary.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-action-runner.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-notify.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-watcher.js +0 -0
- /package/dist/{hooks → src/hooks}/sms-webhook.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-commands.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-scheduler.js +0 -0
- /package/dist/{hooks → src/hooks}/whatsapp-sync.js +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{integrations → src/integrations}/anthropic/client.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/agent-bridge.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/enhanced-pre-clear-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/lifecycle-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/post-task-hooks.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/subagent-client-stub.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/subagent-client.js +0 -0
- /package/dist/{integrations → src/integrations}/claude-code/task-coordinator.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/auth.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/auto-sync.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/config.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/migration.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/oauth-server.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/rest-client.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync-service.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/sync.js +0 -0
- /package/dist/{integrations/ralph → src/integrations/linear}/types.js +0 -0
- /package/dist/{integrations/ralph → src/integrations/linear}/types.js.map +0 -0
- /package/dist/{integrations → src/integrations}/linear/unified-sync.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook-handler.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook-server.js +0 -0
- /package/dist/{integrations → src/integrations}/linear/webhook.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/code-execution-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/context-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/discovery-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/index.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/linear-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/skill-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/task-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/handlers/trace-handlers.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/index.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/middleware/tool-scoring.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/refactored-server.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/schemas.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/tool-definitions-code.js +0 -0
- /package/dist/{integrations → src/integrations}/mcp/tool-definitions.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/bridge/ralph-stackmemory-bridge.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/context/context-budget-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/context/stackmemory-context-loader.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/coordination/enhanced-coordination.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/index.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/learning/pattern-learner.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/lifecycle/iteration-lifecycle.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-dashboard.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/monitoring/swarm-registry.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/orchestration/multi-loop-orchestrator.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/compounding-engineering-pattern.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/extended-coherence-sessions.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/patterns/oracle-worker-pattern.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/performance/performance-optimizer.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/recovery/crash-recovery.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/state/state-reconciler.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/swarm/git-workflow-manager.js +0 -0
- /package/dist/{integrations → src/integrations}/ralph/swarm/swarm-coordinator.js +0 -0
- /package/dist/{types/task.js.map → src/integrations/ralph/types.js.map} +0 -0
- /package/dist/{integrations → src/integrations}/ralph/visualization/ralph-debugger.js +0 -0
- /package/dist/{mcp → src/mcp}/stackmemory-mcp-server.js +0 -0
- /package/dist/{middleware → src/middleware}/exponential-rate-limiter.js +0 -0
- /package/dist/{models → src/models}/user.model.js +0 -0
- /package/dist/{servers → src/servers}/production/auth-middleware.js +0 -0
- /package/dist/{services → src/services}/config-service.js +0 -0
- /package/dist/{services → src/services}/context-service.js +0 -0
- /package/dist/{skills → src/skills}/api-discovery.js +0 -0
- /package/dist/{skills → src/skills}/api-skill.js +0 -0
- /package/dist/{skills → src/skills}/claude-skills.js +0 -0
- /package/dist/{skills → src/skills}/dashboard-launcher.js +0 -0
- /package/dist/{skills → src/skills}/recursive-agent-orchestrator.js +0 -0
- /package/dist/{skills → src/skills}/unified-rlm-orchestrator.js +0 -0
- /package/dist/{types → src/types}/task.js +0 -0
- /package/dist/{utils → src/utils}/env.js +0 -0
- /package/dist/{utils → src/utils}/formatting.js +0 -0
- /package/dist/{utils → src/utils}/process-cleanup.js +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/context/recursive-context-manager.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Recursive Context Manager for RLM\n *\n * Handles context chunking, decomposition, and distribution\n * for recursive agent execution\n */\n\nimport { DualStackManager } from './dual-stack-manager.js';\nimport { ContextRetriever } from '../retrieval/context-retriever.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, ErrorCode } from '../errors/index.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { SubagentType } from '../../skills/recursive-agent-orchestrator.js';\n\nexport interface ContextChunk {\n id: string;\n type: 'code' | 'frame' | 'documentation' | 'test' | 'config';\n content: string;\n metadata: {\n filePath?: string;\n frameId?: string;\n language?: string;\n size: number;\n score: number;\n timestamp?: Date;\n };\n boundaries: {\n start?: number;\n end?: number;\n overlap?: number;\n };\n}\n\nexport interface ChunkingStrategy {\n type: 'file' | 'semantic' | 'size' | 'time';\n maxChunkSize: number;\n overlapSize: number;\n priorityThreshold: number;\n}\n\nexport interface AgentContextConfig {\n agent: SubagentType;\n _maxTokens: number;\n priorityWeights: {\n recent: number;\n relevant: number;\n dependency: number;\n error: number;\n test: number;\n };\n includeTypes: string[];\n excludeTypes: string[];\n}\n\n/**\n * Manages context for recursive agent execution\n */\nexport class RecursiveContextManager {\n private dualStackManager: DualStackManager;\n private contextRetriever: ContextRetriever;\n\n // Context cache for sharing between agents\n private sharedContextCache: Map<string, ContextChunk[]> = new Map();\n\n // Agent-specific configurations\n private agentConfigs: Map<SubagentType, AgentContextConfig>;\n\n constructor(\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever\n ) {\n this.dualStackManager = dualStackManager;\n this.contextRetriever = contextRetriever;\n this.agentConfigs = this.initializeAgentConfigs();\n }\n\n /**\n * Initialize agent-specific context configurations\n */\n private initializeAgentConfigs(): Map<SubagentType, AgentContextConfig> {\n const configs = new Map<SubagentType, AgentContextConfig>();\n\n // Planning agent needs broad context\n configs.set('planning', {\n agent: 'planning',\n maxTokens: 20000,\n priorityWeights: {\n recent: 0.3,\n relevant: 0.4,\n dependency: 0.2,\n error: 0.05,\n test: 0.05,\n },\n includeTypes: ['frame', 'documentation', 'config'],\n excludeTypes: [],\n });\n\n // Code agent needs implementation context\n configs.set('code', {\n agent: 'code',\n maxTokens: 30000,\n priorityWeights: {\n recent: 0.2,\n relevant: 0.5,\n dependency: 0.2,\n error: 0.05,\n test: 0.05,\n },\n includeTypes: ['code', 'frame', 'test'],\n excludeTypes: ['documentation'],\n });\n\n // Testing agent needs code and existing tests\n configs.set('testing', {\n agent: 'testing',\n maxTokens: 25000,\n priorityWeights: {\n recent: 0.1,\n relevant: 0.3,\n dependency: 0.1,\n error: 0.1,\n test: 0.4,\n },\n includeTypes: ['code', 'test', 'frame'],\n excludeTypes: ['documentation', 'config'],\n });\n\n // Linting agent needs code and config\n configs.set('linting', {\n agent: 'linting',\n maxTokens: 15000,\n priorityWeights: {\n recent: 0.2,\n relevant: 0.4,\n dependency: 0.1,\n error: 0.2,\n test: 0.1,\n },\n includeTypes: ['code', 'config'],\n excludeTypes: ['documentation', 'test'],\n });\n\n // Review agent needs comprehensive context\n configs.set('review', {\n agent: 'review',\n maxTokens: 25000,\n priorityWeights: {\n recent: 0.3,\n relevant: 0.3,\n dependency: 0.1,\n error: 0.2,\n test: 0.1,\n },\n includeTypes: ['code', 'test', 'frame', 'documentation'],\n excludeTypes: [],\n });\n\n // Context agent for searching\n configs.set('context', {\n agent: 'context',\n maxTokens: 10000,\n priorityWeights: {\n recent: 0.1,\n relevant: 0.6,\n dependency: 0.2,\n error: 0.05,\n test: 0.05,\n },\n includeTypes: ['frame', 'documentation'],\n excludeTypes: [],\n });\n\n // Improvement agent needs review context\n configs.set('improve', {\n agent: 'improve',\n maxTokens: 30000,\n priorityWeights: {\n recent: 0.3,\n relevant: 0.4,\n dependency: 0.1,\n error: 0.15,\n test: 0.05,\n },\n includeTypes: ['code', 'test', 'frame'],\n excludeTypes: ['documentation'],\n });\n\n // Publish agent needs build/config context\n configs.set('publish', {\n agent: 'publish',\n maxTokens: 15000,\n priorityWeights: {\n recent: 0.4,\n relevant: 0.2,\n dependency: 0.1,\n error: 0.2,\n test: 0.1,\n },\n includeTypes: ['config', 'frame'],\n excludeTypes: ['code', 'test'],\n });\n\n return configs;\n }\n\n /**\n * Prepare context for a specific agent type\n */\n async prepareAgentContext(\n agentType: SubagentType,\n baseContext: Record<string, any>,\n _maxTokens: number\n ): Promise<Record<string, any>> {\n const config = this.agentConfigs.get(agentType);\n if (!config) {\n throw new ValidationError(\n `Unknown agent type: ${agentType}`,\n ErrorCode.VALIDATION_FAILED,\n { agentType }\n );\n }\n\n logger.debug(`Preparing context for ${agentType} agent`, { maxTokens });\n\n // Collect relevant chunks\n const chunks = await this.collectRelevantChunks(\n baseContext,\n config,\n maxTokens\n );\n\n // Sort by priority\n const sortedChunks = this.prioritizeChunks(chunks, config.priorityWeights);\n\n // Fit within token budget\n const selectedChunks = this.fitChunksToTokenBudget(sortedChunks, maxTokens);\n\n // Build agent context\n const agentContext: Record<string, any> = {\n ...baseContext,\n chunks: selectedChunks.map((c) => ({\n type: c.type,\n content: c.content,\n metadata: c.metadata,\n })),\n };\n\n // Cache for potential reuse\n this.sharedContextCache.set(`${agentType}-${Date.now()}`, selectedChunks);\n\n logger.debug(`Prepared context for ${agentType}`, {\n chunksSelected: selectedChunks.length,\n totalSize: selectedChunks.reduce((sum, c) => sum + c.metadata.size, 0),\n });\n\n return agentContext;\n }\n\n /**\n * Chunk large codebase for processing\n */\n async chunkCodebase(\n rootPath: string,\n strategy: ChunkingStrategy\n ): Promise<ContextChunk[]> {\n const chunks: ContextChunk[] = [];\n\n logger.info('Chunking codebase', { rootPath, strategy: strategy.type });\n\n switch (strategy.type) {\n case 'file':\n chunks.push(...(await this.chunkByFile(rootPath, strategy)));\n break;\n\n case 'semantic':\n chunks.push(...(await this.chunkBySemantic(rootPath, strategy)));\n break;\n\n case 'size':\n chunks.push(...(await this.chunkBySize(rootPath, strategy)));\n break;\n\n default:\n throw new ValidationError(\n `Unknown chunking strategy: ${strategy.type}`,\n ErrorCode.VALIDATION_FAILED,\n { strategyType: strategy.type }\n );\n }\n\n logger.info('Codebase chunked', {\n totalChunks: chunks.length,\n totalSize: chunks.reduce((sum, c) => sum + c.metadata.size, 0),\n });\n\n return chunks;\n }\n\n /**\n * Chunk by file boundaries\n */\n private async chunkByFile(\n rootPath: string,\n strategy: ChunkingStrategy\n ): Promise<ContextChunk[]> {\n const chunks: ContextChunk[] = [];\n const files = await this.walkDirectory(rootPath);\n\n for (const file of files) {\n const content = await fs.promises.readFile(file, 'utf-8');\n\n // Skip files larger than max chunk size\n if (content.length > strategy.maxChunkSize) {\n // Split large files\n const fileChunks = this.splitLargeFile(file, content, strategy);\n chunks.push(...fileChunks);\n } else {\n chunks.push({\n id: `file-${path.basename(file)}`,\n type: 'code',\n content,\n metadata: {\n filePath: file,\n language: this.detectLanguage(file),\n size: content.length,\n score: 0.5,\n },\n boundaries: {\n start: 0,\n end: content.length,\n },\n });\n }\n }\n\n return chunks;\n }\n\n /**\n * Chunk by semantic boundaries (classes, functions)\n */\n private async chunkBySemantic(\n rootPath: string,\n strategy: ChunkingStrategy\n ): Promise<ContextChunk[]> {\n const chunks: ContextChunk[] = [];\n const files = await this.walkDirectory(rootPath);\n\n for (const file of files) {\n const content = await fs.promises.readFile(file, 'utf-8');\n const language = this.detectLanguage(file);\n\n // Extract semantic units based on language\n const semanticUnits = this.extractSemanticUnits(content, language);\n\n for (const unit of semanticUnits) {\n if (unit.content.length <= strategy.maxChunkSize) {\n chunks.push({\n id: `semantic-${file}-${unit.name}`,\n type: 'code',\n content: unit.content,\n metadata: {\n filePath: file,\n language,\n size: unit.content.length,\n score: unit.importance,\n },\n boundaries: {\n start: unit.start,\n end: unit.end,\n },\n });\n }\n }\n }\n\n return chunks;\n }\n\n /**\n * Chunk by fixed size with overlap\n */\n private async chunkBySize(\n rootPath: string,\n strategy: ChunkingStrategy\n ): Promise<ContextChunk[]> {\n const chunks: ContextChunk[] = [];\n const files = await this.walkDirectory(rootPath);\n\n for (const file of files) {\n const content = await fs.promises.readFile(file, 'utf-8');\n const lines = content.split('\\n');\n\n let currentChunk = '';\n let startLine = 0;\n\n for (let i = 0; i < lines.length; i++) {\n currentChunk += lines[i] + '\\n';\n\n if (currentChunk.length >= strategy.maxChunkSize) {\n chunks.push({\n id: `size-${file}-${startLine}`,\n type: 'code',\n content: currentChunk,\n metadata: {\n filePath: file,\n language: this.detectLanguage(file),\n size: currentChunk.length,\n score: 0.5,\n },\n boundaries: {\n start: startLine,\n end: i,\n overlap: strategy.overlapSize,\n },\n });\n\n // Move window with overlap\n const overlapLines = Math.floor(strategy.overlapSize / 50); // Estimate lines\n startLine = Math.max(0, i - overlapLines);\n currentChunk = lines.slice(startLine, i + 1).join('\\n');\n }\n }\n\n // Add remaining chunk\n if (currentChunk.trim()) {\n chunks.push({\n id: `size-${file}-${startLine}`,\n type: 'code',\n content: currentChunk,\n metadata: {\n filePath: file,\n language: this.detectLanguage(file),\n size: currentChunk.length,\n score: 0.5,\n },\n boundaries: {\n start: startLine,\n end: lines.length - 1,\n },\n });\n }\n }\n\n return chunks;\n }\n\n /**\n * Collect relevant chunks for agent context\n */\n private async collectRelevantChunks(\n baseContext: Record<string, any>,\n config: AgentContextConfig,\n _maxTokens: number\n ): Promise<ContextChunk[]> {\n const chunks: ContextChunk[] = [];\n\n // Get recent frames\n if (config.includeTypes.includes('frame')) {\n const recentFrames = await this.getRecentFrameChunks(10);\n chunks.push(...recentFrames);\n }\n\n // Get relevant code files\n if (config.includeTypes.includes('code') && baseContext.files) {\n const codeChunks = await this.getCodeChunks(baseContext.files);\n chunks.push(...codeChunks);\n }\n\n // Get test files\n if (config.includeTypes.includes('test') && baseContext.testFiles) {\n const testChunks = await this.getTestChunks(baseContext.testFiles);\n chunks.push(...testChunks);\n }\n\n // Search for relevant context\n if (baseContext.query) {\n const searchResults = await this.contextRetriever.retrieve({\n query: baseContext.query,\n limit: 20,\n });\n\n for (const result of searchResults) {\n chunks.push({\n id: `search-${result.frameId}`,\n type: 'frame',\n content: result.content,\n metadata: {\n frameId: result.frameId,\n size: result.content.length,\n score: result.score,\n timestamp: new Date(result.timestamp),\n },\n boundaries: {},\n });\n }\n }\n\n // Check shared cache for relevant chunks\n const cachedChunks = this.getRelevantCachedChunks(config.agent);\n chunks.push(...cachedChunks);\n\n return chunks;\n }\n\n /**\n * Prioritize chunks based on agent weights\n */\n private prioritizeChunks(\n chunks: ContextChunk[],\n weights: AgentContextConfig['priorityWeights']\n ): ContextChunk[] {\n return chunks\n .map((chunk) => {\n let priority = 0;\n\n // Recent weight\n if (chunk.metadata.timestamp) {\n const age = Date.now() - chunk.metadata.timestamp.getTime();\n const recentScore = Math.max(0, 1 - age / (24 * 60 * 60 * 1000)); // Decay over 24h\n priority += recentScore * weights.recent;\n }\n\n // Relevance weight\n priority += (chunk.metadata.score || 0.5) * weights.relevant;\n\n // Type-specific weights\n if (chunk.type === 'test') {\n priority += weights.test;\n }\n if (chunk.metadata.filePath?.includes('error')) {\n priority += weights.error;\n }\n\n return { ...chunk, priority };\n })\n .sort((a, b) => (b as any).priority - (a as any).priority);\n }\n\n /**\n * Fit chunks within token budget\n */\n private fitChunksToTokenBudget(\n chunks: ContextChunk[],\n _maxTokens: number\n ): ContextChunk[] {\n const selected: ContextChunk[] = [];\n let totalTokens = 0;\n\n // Rough token estimation (1 token \u2248 4 chars)\n const estimateTokens = (text: string) => Math.ceil(text.length / 4);\n\n for (const chunk of chunks) {\n const chunkTokens = estimateTokens(chunk.content);\n\n if (totalTokens + chunkTokens <= maxTokens) {\n selected.push(chunk);\n totalTokens += chunkTokens;\n } else if (selected.length === 0) {\n // Always include at least one chunk, truncated if necessary\n const truncatedContent = chunk.content.slice(0, maxTokens * 4);\n selected.push({\n ...chunk,\n content: truncatedContent,\n metadata: {\n ...chunk.metadata,\n size: truncatedContent.length,\n },\n });\n break;\n } else {\n break;\n }\n }\n\n return selected;\n }\n\n /**\n * Helper methods\n */\n\n private async walkDirectory(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules, .git, etc\n if (!['node_modules', '.git', 'dist', 'build'].includes(entry.name)) {\n files.push(...(await this.walkDirectory(fullPath)));\n }\n } else if (entry.isFile()) {\n // Include code files\n if (/\\.(ts|tsx|js|jsx|py|java|go|rs|cpp|c|h)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n }\n\n private detectLanguage(filePath: string): string {\n const ext = path.extname(filePath);\n const langMap: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.py': 'python',\n '.java': 'java',\n '.go': 'go',\n '.rs': 'rust',\n '.cpp': 'cpp',\n '.c': 'c',\n '.h': 'c',\n };\n return langMap[ext] || 'unknown';\n }\n\n private splitLargeFile(\n filePath: string,\n content: string,\n strategy: ChunkingStrategy\n ): ContextChunk[] {\n const chunks: ContextChunk[] = [];\n const lines = content.split('\\n');\n const linesPerChunk = Math.ceil(strategy.maxChunkSize / 50); // Estimate\n\n for (let i = 0; i < lines.length; i += linesPerChunk) {\n const chunkLines = lines.slice(i, i + linesPerChunk);\n const chunkContent = chunkLines.join('\\n');\n\n chunks.push({\n id: `file-${path.basename(filePath)}-part-${i}`,\n type: 'code',\n content: chunkContent,\n metadata: {\n filePath,\n language: this.detectLanguage(filePath),\n size: chunkContent.length,\n score: 0.5,\n },\n boundaries: {\n start: i,\n end: Math.min(i + linesPerChunk, lines.length),\n overlap: strategy.overlapSize,\n },\n });\n }\n\n return chunks;\n }\n\n private extractSemanticUnits(\n content: string,\n language: string\n ): Array<{\n name: string;\n content: string;\n start: number;\n end: number;\n importance: number;\n }> {\n const units: Array<{\n name: string;\n content: string;\n start: number;\n end: number;\n importance: number;\n }> = [];\n\n // Simple regex-based extraction (would need proper AST parsing for production)\n if (language === 'typescript' || language === 'javascript') {\n // Extract classes\n const classRegex = /class\\s+(\\w+)[^{]*\\{[^}]+\\}/g;\n let match;\n while ((match = classRegex.exec(content)) !== null) {\n units.push({\n name: match[1],\n content: match[0],\n start: match.index,\n end: match.index + match[0].length,\n importance: 0.8,\n });\n }\n\n // Extract functions\n const funcRegex =\n /(?:function|const|let)\\s+(\\w+)\\s*=?\\s*(?:\\([^)]*\\)|\\w+)\\s*(?:=>|{)[^}]+}/g;\n while ((match = funcRegex.exec(content)) !== null) {\n units.push({\n name: match[1],\n content: match[0],\n start: match.index,\n end: match.index + match[0].length,\n importance: 0.6,\n });\n }\n }\n\n return units;\n }\n\n private async getRecentFrameChunks(limit: number): Promise<ContextChunk[]> {\n const activeStack = this.dualStackManager.getActiveStack();\n const frames = await activeStack.getAllFrames();\n\n return frames.slice(-limit).map((frame) => ({\n id: `frame-${frame.frameId}`,\n type: 'frame',\n content: JSON.stringify(frame, null, 2),\n metadata: {\n frameId: frame.frameId,\n size: JSON.stringify(frame).length,\n score: 0.7,\n timestamp: new Date(frame.timestamp),\n },\n boundaries: {},\n }));\n }\n\n private async getCodeChunks(files: string[]): Promise<ContextChunk[]> {\n const chunks: ContextChunk[] = [];\n\n for (const file of files) {\n if (fs.existsSync(file)) {\n const content = await fs.promises.readFile(file, 'utf-8');\n chunks.push({\n id: `code-${path.basename(file)}`,\n type: 'code',\n content,\n metadata: {\n filePath: file,\n language: this.detectLanguage(file),\n size: content.length,\n score: 0.8,\n },\n boundaries: {},\n });\n }\n }\n\n return chunks;\n }\n\n private async getTestChunks(testFiles: string[]): Promise<ContextChunk[]> {\n const chunks: ContextChunk[] = [];\n\n for (const file of testFiles) {\n if (fs.existsSync(file)) {\n const content = await fs.promises.readFile(file, 'utf-8');\n chunks.push({\n id: `test-${path.basename(file)}`,\n type: 'test',\n content,\n metadata: {\n filePath: file,\n language: this.detectLanguage(file),\n size: content.length,\n score: 0.7,\n },\n boundaries: {},\n });\n }\n }\n\n return chunks;\n }\n\n private getRelevantCachedChunks(agentType: SubagentType): ContextChunk[] {\n const relevantChunks: ContextChunk[] = [];\n\n // Get chunks from cache that might be relevant\n for (const [key, chunks] of this.sharedContextCache.entries()) {\n // Skip very old cache entries\n const timestamp = parseInt(key.split('-').pop() || '0');\n if (Date.now() - timestamp > 5 * 60 * 1000) {\n // 5 minutes\n continue;\n }\n\n // Add relevant chunks based on agent type\n if (agentType === 'review' || agentType === 'improve') {\n relevantChunks.push(...chunks.filter((c) => c.type === 'code'));\n }\n }\n\n return relevantChunks;\n }\n\n /**\n * Clear context cache\n */\n clearCache(): void {\n this.sharedContextCache.clear();\n logger.debug('Context cache cleared');\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats() {\n const stats = {\n cacheSize: this.sharedContextCache.size,\n totalChunks: 0,\n totalBytes: 0,\n };\n\n for (const chunks of this.sharedContextCache.values()) {\n stats.totalChunks += chunks.length;\n stats.totalBytes += chunks.reduce((sum, c) => sum + c.metadata.size, 0);\n }\n\n return stats;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/context/refactored-frame-manager.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Refactored Frame Manager - Modular Implementation\n * Main orchestrator that uses focused modules for frame management\n */\n\nimport Database from 'better-sqlite3';\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../monitoring/logger.js';\nimport { trace } from '../trace/index.js';\nimport {\n FrameError,\n SystemError,\n ErrorCode,\n wrapError,\n createErrorHandler,\n} from '../errors/index.js';\nimport { retry, withTimeout } from '../errors/recovery.js';\nimport { sessionManager, FrameQueryMode } from '../session/index.js';\nimport { frameLifecycleHooks } from './frame-lifecycle-hooks.js';\n\n// Constants for frame validation\nconst MAX_FRAME_DEPTH = 100; // Maximum allowed frame depth\nconst DEFAULT_MAX_DEPTH = 100; // Default if not configured\n\n// Import refactored modules\nimport {\n Frame,\n FrameContext,\n Anchor,\n Event,\n FrameType,\n FrameState,\n FrameCreationOptions,\n FrameManagerConfig,\n DigestResult,\n} from './frame-types.js';\nimport { FrameDatabase } from './frame-database.js';\nimport { FrameStack } from './frame-stack.js';\nimport { FrameDigestGenerator } from './frame-digest.js';\nimport { FrameRecovery, type RecoveryReport } from './frame-recovery.js';\n\nexport class RefactoredFrameManager {\n private frameDb: FrameDatabase;\n private frameStack: FrameStack;\n private digestGenerator: FrameDigestGenerator;\n private frameRecovery: FrameRecovery;\n private db: Database.Database;\n\n private currentRunId: string;\n private sessionId: string;\n private projectId: string;\n private queryMode: FrameQueryMode = FrameQueryMode.PROJECT_ACTIVE;\n private config: FrameManagerConfig;\n private maxFrameDepth: number = DEFAULT_MAX_DEPTH;\n private lastRecoveryReport: RecoveryReport | null = null;\n\n constructor(\n db: Database.Database,\n projectId: string,\n config?: Partial<FrameManagerConfig>\n ) {\n this.projectId = projectId;\n this.db = db;\n this.config = {\n projectId,\n runId: config?.runId || uuidv4(),\n sessionId: config?.sessionId || uuidv4(),\n maxStackDepth: config?.maxStackDepth || 50,\n };\n\n // Set max frame depth from config if provided\n this.maxFrameDepth = config?.maxStackDepth || DEFAULT_MAX_DEPTH;\n\n this.currentRunId = this.config.runId!;\n this.sessionId = this.config.sessionId!;\n\n // Initialize modules\n this.frameDb = new FrameDatabase(db);\n this.frameStack = new FrameStack(\n this.frameDb,\n projectId,\n this.currentRunId\n );\n this.digestGenerator = new FrameDigestGenerator(this.frameDb);\n this.frameRecovery = new FrameRecovery(db);\n this.frameRecovery.setCurrentRunId(this.currentRunId);\n\n // Initialize database schema\n this.frameDb.initSchema();\n\n logger.info('RefactoredFrameManager initialized', {\n projectId: this.projectId,\n runId: this.currentRunId,\n sessionId: this.sessionId,\n });\n }\n\n /**\n * Initialize the frame manager\n */\n async initialize(): Promise<void> {\n try {\n // Run crash recovery first\n this.lastRecoveryReport = await this.frameRecovery.recoverOnStartup();\n\n if (!this.lastRecoveryReport.recovered) {\n logger.warn('Recovery completed with issues', {\n errors: this.lastRecoveryReport.errors,\n orphansFound: this.lastRecoveryReport.orphanedFrames.detected,\n integrityPassed: this.lastRecoveryReport.integrityCheck.passed,\n });\n }\n\n await this.frameStack.initialize();\n\n logger.info('Frame manager initialization completed', {\n stackDepth: this.frameStack.getDepth(),\n recoveryRan: true,\n orphansClosed: this.lastRecoveryReport.orphanedFrames.closed,\n });\n } catch (error: unknown) {\n throw new SystemError(\n 'Failed to initialize frame manager',\n ErrorCode.SYSTEM_INIT_FAILED,\n { projectId: this.projectId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Create a new frame\n */\n createFrame(options: FrameCreationOptions): string;\n createFrame(\n type: FrameType,\n name: string,\n inputs?: Record<string, any>,\n parentFrameId?: string\n ): string;\n createFrame(\n typeOrOptions: FrameType | FrameCreationOptions,\n name?: string,\n inputs?: Record<string, any>,\n parentFrameId?: string\n ): string {\n return trace.traceSync(\n 'function',\n 'FrameManager.createFrame',\n { typeOrOptions, name },\n () => this._createFrame(typeOrOptions, name, inputs, parentFrameId)\n );\n }\n\n private _createFrame(\n typeOrOptions: FrameType | FrameCreationOptions,\n name?: string,\n inputs?: Record<string, any>,\n parentFrameId?: string\n ): string {\n let frameOptions: FrameCreationOptions;\n\n // Handle both function signatures\n if (typeof typeOrOptions === 'string') {\n frameOptions = {\n type: typeOrOptions,\n name: name!,\n inputs: inputs || {},\n parentFrameId,\n };\n } else {\n frameOptions = typeOrOptions;\n }\n\n // Validate inputs\n if (!frameOptions.name || frameOptions.name.trim().length === 0) {\n throw new FrameError(\n 'Frame name is required',\n ErrorCode.FRAME_INVALID_INPUT,\n { frameOptions }\n );\n }\n\n // Check stack depth limit\n if (this.frameStack.getDepth() >= this.config.maxStackDepth!) {\n throw new FrameError(\n `Maximum stack depth reached: ${this.config.maxStackDepth}`,\n ErrorCode.FRAME_STACK_OVERFLOW,\n { currentDepth: this.frameStack.getDepth() }\n );\n }\n\n // Determine parent frame\n const resolvedParentId =\n frameOptions.parentFrameId || this.frameStack.getCurrentFrameId();\n\n // Get depth from parent frame, not from stack position\n let depth = 0;\n if (resolvedParentId) {\n const parentFrame = this.frameDb.getFrame(resolvedParentId);\n depth = parentFrame ? parentFrame.depth + 1 : 0;\n }\n\n // Check for depth limit\n if (depth > this.maxFrameDepth) {\n throw new FrameError(\n `Maximum frame depth exceeded: ${depth} > ${this.maxFrameDepth}`,\n ErrorCode.FRAME_STACK_OVERFLOW,\n {\n currentDepth: depth,\n maxDepth: this.maxFrameDepth,\n frameName: frameOptions.name,\n parentFrameId: resolvedParentId,\n }\n );\n }\n\n // Check for circular reference before creating frame\n if (resolvedParentId) {\n const cycle = this.detectCycle(uuidv4(), resolvedParentId);\n if (cycle) {\n throw new FrameError(\n `Circular reference detected in frame hierarchy`,\n ErrorCode.FRAME_CYCLE_DETECTED,\n {\n parentFrameId: resolvedParentId,\n cycle,\n frameName: frameOptions.name,\n }\n );\n }\n }\n\n // Create frame data\n const frameId = uuidv4();\n const frame: Omit<Frame, 'created_at' | 'closed_at'> = {\n frame_id: frameId,\n run_id: this.currentRunId,\n project_id: this.projectId,\n parent_frame_id: resolvedParentId,\n depth,\n type: frameOptions.type,\n name: frameOptions.name,\n state: 'active',\n inputs: frameOptions.inputs || {},\n outputs: {},\n digest_json: {},\n };\n\n // Insert into database\n const createdFrame = this.frameDb.insertFrame(frame);\n\n // Add to stack\n this.frameStack.pushFrame(frameId);\n\n logger.info('Created frame', {\n frameId,\n name: frameOptions.name,\n type: frameOptions.type,\n parentFrameId: resolvedParentId,\n stackDepth: this.frameStack.getDepth(),\n });\n\n return frameId;\n }\n\n /**\n * Close a frame and generate digest\n */\n closeFrame(frameId?: string, outputs?: Record<string, any>): void {\n trace.traceSync(\n 'function',\n 'FrameManager.closeFrame',\n { frameId, outputs },\n () => this._closeFrame(frameId, outputs)\n );\n }\n\n private _closeFrame(frameId?: string, outputs?: Record<string, any>): void {\n const targetFrameId = frameId || this.frameStack.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame to close',\n ErrorCode.FRAME_INVALID_STATE,\n {\n operation: 'closeFrame',\n stackDepth: this.frameStack.getDepth(),\n }\n );\n }\n\n // Get frame details\n const frame = this.frameDb.getFrame(targetFrameId);\n if (!frame) {\n throw new FrameError(\n `Frame not found: ${targetFrameId}`,\n ErrorCode.FRAME_NOT_FOUND,\n {\n frameId: targetFrameId,\n operation: 'closeFrame',\n runId: this.currentRunId,\n }\n );\n }\n\n if (frame.state === 'closed') {\n logger.warn('Attempted to close already closed frame', {\n frameId: targetFrameId,\n });\n return;\n }\n\n // Generate digest before closing\n const digest = this.digestGenerator.generateDigest(targetFrameId);\n const finalOutputs = { ...outputs, ...digest.structured };\n\n // Update frame to closed state\n this.frameDb.updateFrame(targetFrameId, {\n state: 'closed',\n outputs: finalOutputs,\n digest_text: digest.text,\n digest_json: digest.structured,\n closed_at: Math.floor(Date.now() / 1000),\n });\n\n // Remove from stack (this will also remove any child frames)\n this.frameStack.popFrame(targetFrameId);\n\n // Close all child frames recursively\n this.closeChildFrames(targetFrameId);\n\n // Trigger lifecycle hooks (fire and forget)\n const events = this.frameDb.getFrameEvents(targetFrameId);\n const anchors = this.frameDb.getFrameAnchors(targetFrameId);\n frameLifecycleHooks\n .triggerClose({ frame: { ...frame, state: 'closed' }, events, anchors })\n .catch(() => {\n // Silently ignore errors - hooks are non-critical\n });\n\n logger.info('Closed frame', {\n frameId: targetFrameId,\n name: frame.name,\n duration: Math.floor(Date.now() / 1000) - frame.created_at,\n digestLength: digest.text.length,\n stackDepth: this.frameStack.getDepth(),\n });\n }\n\n /**\n * Add an event to the current frame\n */\n addEvent(\n eventType: Event['event_type'],\n payload: Record<string, any>,\n frameId?: string\n ): string {\n return trace.traceSync(\n 'function',\n 'FrameManager.addEvent',\n { eventType, frameId },\n () => this._addEvent(eventType, payload, frameId)\n );\n }\n\n private _addEvent(\n eventType: Event['event_type'],\n payload: Record<string, any>,\n frameId?: string\n ): string {\n const targetFrameId = frameId || this.frameStack.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame for event',\n ErrorCode.FRAME_INVALID_STATE,\n {\n eventType,\n operation: 'addEvent',\n }\n );\n }\n\n const eventId = uuidv4();\n const sequence = this.frameDb.getNextEventSequence(targetFrameId);\n\n const event: Omit<Event, 'ts'> = {\n event_id: eventId,\n frame_id: targetFrameId,\n run_id: this.currentRunId,\n seq: sequence,\n event_type: eventType,\n payload,\n };\n\n const createdEvent = this.frameDb.insertEvent(event);\n\n logger.debug('Added event', {\n eventId,\n frameId: targetFrameId,\n eventType,\n sequence,\n });\n\n return eventId;\n }\n\n /**\n * Add an anchor (important fact) to current frame\n */\n addAnchor(\n type: Anchor['type'],\n text: string,\n priority: number = 5,\n metadata: Record<string, any> = {},\n frameId?: string\n ): string {\n return trace.traceSync(\n 'function',\n 'FrameManager.addAnchor',\n { type, frameId },\n () => this._addAnchor(type, text, priority, metadata, frameId)\n );\n }\n\n private _addAnchor(\n type: Anchor['type'],\n text: string,\n priority: number,\n metadata: Record<string, any>,\n frameId?: string\n ): string {\n const targetFrameId = frameId || this.frameStack.getCurrentFrameId();\n if (!targetFrameId) {\n throw new FrameError(\n 'No active frame for anchor',\n ErrorCode.FRAME_INVALID_STATE,\n {\n anchorType: type,\n operation: 'addAnchor',\n }\n );\n }\n\n const anchorId = uuidv4();\n const anchor: Omit<Anchor, 'created_at'> = {\n anchor_id: anchorId,\n frame_id: targetFrameId,\n type,\n text,\n priority,\n metadata,\n };\n\n const createdAnchor = this.frameDb.insertAnchor(anchor);\n\n logger.debug('Added anchor', {\n anchorId,\n frameId: targetFrameId,\n type,\n priority,\n });\n\n return anchorId;\n }\n\n /**\n * Get hot stack context\n */\n getHotStackContext(maxEvents: number = 20): FrameContext[] {\n return this.frameStack.getHotStackContext(maxEvents);\n }\n\n /**\n * Get active frame path (root to current)\n */\n getActiveFramePath(): Frame[] {\n return this.frameStack.getStackFrames();\n }\n\n /**\n * Get current frame ID\n */\n getCurrentFrameId(): string | undefined {\n return this.frameStack.getCurrentFrameId();\n }\n\n /**\n * Get stack depth\n */\n getStackDepth(): number {\n return this.frameStack.getDepth();\n }\n\n /**\n * Get frame by ID\n */\n getFrame(frameId: string): Frame | undefined {\n return this.frameDb.getFrame(frameId);\n }\n\n /**\n * Get frame events\n */\n getFrameEvents(frameId: string, limit?: number): Event[] {\n return this.frameDb.getFrameEvents(frameId, limit);\n }\n\n /**\n * Get frame anchors\n */\n getFrameAnchors(frameId: string): Anchor[] {\n return this.frameDb.getFrameAnchors(frameId);\n }\n\n /**\n * Generate digest for a frame\n */\n generateDigest(frameId: string): DigestResult {\n return this.digestGenerator.generateDigest(frameId);\n }\n\n /**\n * Validate stack consistency\n */\n validateStack(): { isValid: boolean; errors: string[] } {\n return this.frameStack.validateStack();\n }\n\n /**\n * Get database statistics\n */\n getStatistics(): Record<string, number> {\n return this.frameDb.getStatistics();\n }\n\n /**\n * Get the last recovery report from initialization\n */\n getRecoveryReport(): RecoveryReport | null {\n return this.lastRecoveryReport;\n }\n\n /**\n * Manually trigger recovery (e.g., after detecting issues)\n */\n async runRecovery(): Promise<RecoveryReport> {\n this.lastRecoveryReport = await this.frameRecovery.recoverOnStartup();\n return this.lastRecoveryReport;\n }\n\n /**\n * Validate project data integrity\n */\n validateProjectIntegrity(): { valid: boolean; issues: string[] } {\n return this.frameRecovery.validateProjectIntegrity(this.projectId);\n }\n\n /**\n * Close all child frames recursively with depth limit to prevent stack overflow\n */\n private closeChildFrames(parentFrameId: string, depth: number = 0): void {\n // Prevent stack overflow with depth limit\n if (depth > this.maxFrameDepth) {\n logger.warn('closeChildFrames depth limit exceeded', {\n parentFrameId,\n depth,\n maxDepth: this.maxFrameDepth,\n });\n return;\n }\n\n try {\n const activeFrames = this.frameDb.getFramesByProject(\n this.projectId,\n 'active'\n );\n const childFrames = activeFrames.filter(\n (f) => f.parent_frame_id === parentFrameId\n );\n\n for (const childFrame of childFrames) {\n if (this.frameStack.isFrameActive(childFrame.frame_id)) {\n // Close child's children first (depth-first)\n this.closeChildFrames(childFrame.frame_id, depth + 1);\n // Then close the child frame directly without recursing through closeFrame\n this.closeFrameDirectly(childFrame.frame_id);\n }\n }\n } catch (error: unknown) {\n logger.warn('Failed to close child frames', { parentFrameId, error });\n }\n }\n\n /**\n * Close a frame directly without triggering child frame closure\n * Used by closeChildFrames to avoid double recursion\n */\n private closeFrameDirectly(frameId: string): void {\n const frame = this.frameDb.getFrame(frameId);\n if (!frame || frame.state === 'closed') return;\n\n const digest = this.digestGenerator.generateDigest(frameId);\n\n this.frameDb.updateFrame(frameId, {\n state: 'closed',\n outputs: digest.structured,\n digest_text: digest.text,\n digest_json: digest.structured,\n closed_at: Math.floor(Date.now() / 1000),\n });\n\n this.frameStack.popFrame(frameId);\n\n logger.debug('Closed child frame directly', { frameId });\n }\n\n /**\n * Extract active artifacts from frame events\n */\n getActiveArtifacts(frameId: string): string[] {\n const events = this.frameDb.getFrameEvents(frameId);\n const artifacts: string[] = [];\n\n for (const event of events) {\n if (event.event_type === 'artifact' && event.payload.path) {\n artifacts.push(event.payload.path);\n }\n }\n\n return [...new Set(artifacts)];\n }\n\n /**\n * Extract constraints from frame inputs\n */\n extractConstraints(inputs: Record<string, unknown>): string[] {\n const constraints: string[] = [];\n\n if (inputs.constraints && Array.isArray(inputs.constraints)) {\n constraints.push(...(inputs.constraints as string[]));\n }\n\n if (inputs.requirements && Array.isArray(inputs.requirements)) {\n constraints.push(...(inputs.requirements as string[]));\n }\n\n if (inputs.limitations && Array.isArray(inputs.limitations)) {\n constraints.push(...(inputs.limitations as string[]));\n }\n\n return constraints;\n }\n\n /**\n * Detect if setting a parent frame would create a cycle in the frame hierarchy.\n * Returns the cycle path if detected, or null if no cycle.\n * @param childFrameId - The frame that would be the child\n * @param parentFrameId - The proposed parent frame\n * @returns Array of frame IDs forming the cycle, or null if no cycle\n */\n private detectCycle(\n childFrameId: string,\n parentFrameId: string\n ): string[] | null {\n const visited = new Set<string>();\n const path: string[] = [];\n\n // Start from the proposed parent and traverse up the hierarchy\n let currentId: string | undefined = parentFrameId;\n\n while (currentId) {\n // If we've seen this frame before, we have a cycle\n if (visited.has(currentId)) {\n // Build the cycle path\n const cycleStart = path.indexOf(currentId);\n return path.slice(cycleStart).concat(currentId);\n }\n\n // If the current frame is the child we're trying to add, it's a cycle\n if (currentId === childFrameId) {\n return path.concat([currentId, childFrameId]);\n }\n\n visited.add(currentId);\n path.push(currentId);\n\n // Move to the parent of current frame\n const frame = this.frameDb.getFrame(currentId);\n if (!frame) {\n // Frame not found, no cycle possible through this path\n break;\n }\n currentId = frame.parent_frame_id;\n\n // Safety check: if we've traversed too many levels, something is wrong\n if (path.length > this.maxFrameDepth) {\n throw new FrameError(\n `Frame hierarchy traversal exceeded maximum depth during cycle detection`,\n ErrorCode.FRAME_STACK_OVERFLOW,\n {\n depth: path.length,\n maxDepth: this.maxFrameDepth,\n path,\n }\n );\n }\n }\n\n return null; // No cycle detected\n }\n\n /**\n * Update parent frame of an existing frame (with cycle detection)\n * @param frameId - The frame to update\n * @param newParentFrameId - The new parent frame ID (null to make it a root frame)\n */\n public updateParentFrame(\n frameId: string,\n newParentFrameId: string | null\n ): void {\n // Check if frame exists\n const frame = this.frameDb.getFrame(frameId);\n if (!frame) {\n throw new FrameError(\n `Frame not found: ${frameId}`,\n ErrorCode.FRAME_NOT_FOUND,\n { frameId }\n );\n }\n\n // If setting a parent, validate and check for cycles\n if (newParentFrameId) {\n // Verify the new parent exists\n const newParentFrame = this.frameDb.getFrame(newParentFrameId);\n if (!newParentFrame) {\n throw new FrameError(\n `Parent frame not found: ${newParentFrameId}`,\n ErrorCode.FRAME_NOT_FOUND,\n { frameId, newParentFrameId }\n );\n }\n\n const cycle = this.detectCycle(frameId, newParentFrameId);\n if (cycle) {\n throw new FrameError(\n `Cannot set parent: would create circular reference`,\n ErrorCode.FRAME_CYCLE_DETECTED,\n {\n frameId,\n newParentFrameId,\n cycle,\n currentParentId: frame.parent_frame_id,\n }\n );\n }\n\n // Check depth after parent change\n const newDepth = newParentFrame.depth + 1;\n if (newDepth > this.maxFrameDepth) {\n throw new FrameError(\n `Cannot set parent: would exceed maximum frame depth`,\n ErrorCode.FRAME_STACK_OVERFLOW,\n {\n frameId,\n newParentFrameId,\n newDepth,\n maxDepth: this.maxFrameDepth,\n }\n );\n }\n }\n\n // Calculate new depth based on parent\n let newDepth = 0;\n if (newParentFrameId) {\n const newParentFrame = this.frameDb.getFrame(newParentFrameId);\n if (newParentFrame) {\n newDepth = newParentFrame.depth + 1;\n }\n }\n\n // Update the frame's parent and depth\n this.frameDb.updateFrame(frameId, {\n parent_frame_id: newParentFrameId,\n depth: newDepth,\n });\n\n logger.info('Updated parent frame', {\n frameId,\n oldParentId: frame.parent_frame_id,\n newParentId: newParentFrameId,\n });\n }\n\n /**\n * Validate the entire frame hierarchy for cycles and depth violations\n * @returns Validation result with any detected issues\n */\n public validateFrameHierarchy(): {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n } {\n const errors: string[] = [];\n const warnings: string[] = [];\n const allFrames = this.frameDb.getFramesByProject(this.projectId);\n\n // Check each frame for depth violations\n for (const frame of allFrames) {\n if (frame.depth > this.maxFrameDepth) {\n errors.push(\n `Frame ${frame.frame_id} exceeds max depth: ${frame.depth} > ${this.maxFrameDepth}`\n );\n }\n\n // Warn about deep frames approaching the limit\n if (frame.depth > this.maxFrameDepth * 0.8) {\n warnings.push(\n `Frame ${frame.frame_id} is deep in hierarchy: ${frame.depth}/${this.maxFrameDepth}`\n );\n }\n }\n\n // Check for cycles by traversing from each root\n const rootFrames = allFrames.filter((f) => !f.parent_frame_id);\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const checkForCycle = (frameId: string): boolean => {\n if (visiting.has(frameId)) {\n errors.push(`Cycle detected involving frame ${frameId}`);\n return true;\n }\n\n if (visited.has(frameId)) {\n return false;\n }\n\n visiting.add(frameId);\n\n // Check all children\n const children = allFrames.filter((f) => f.parent_frame_id === frameId);\n for (const child of children) {\n if (checkForCycle(child.frame_id)) {\n return true;\n }\n }\n\n visiting.delete(frameId);\n visited.add(frameId);\n return false;\n };\n\n // Check from each root\n for (const root of rootFrames) {\n checkForCycle(root.frame_id);\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Set query mode for frame retrieval\n */\n setQueryMode(mode: FrameQueryMode): void {\n this.queryMode = mode;\n // Reinitialize stack with new query mode\n this.frameStack.setQueryMode(mode);\n }\n\n /**\n * Get recent frames for context sharing\n */\n async getRecentFrames(limit: number = 100): Promise<Frame[]> {\n try {\n const frames = this.frameDb.getFramesByProject(this.projectId);\n\n // Sort by created_at descending and limit\n return frames\n .sort((a, b) => (b.created_at || 0) - (a.created_at || 0))\n .slice(0, limit)\n .map((frame) => ({\n ...frame,\n // Add compatibility fields\n frameId: frame.frame_id,\n runId: frame.run_id,\n projectId: frame.project_id,\n parentFrameId: frame.parent_frame_id,\n title: frame.name,\n timestamp: frame.created_at,\n metadata: {\n tags: this.extractTagsFromFrame(frame),\n importance: this.calculateFrameImportance(frame),\n },\n data: {\n inputs: frame.inputs,\n outputs: frame.outputs,\n digest: frame.digest_json,\n },\n }));\n } catch (error: unknown) {\n logger.error('Failed to get recent frames', error as Error);\n return [];\n }\n }\n\n /**\n * Add context metadata to the current frame\n */\n async addContext(key: string, value: any): Promise<void> {\n const currentFrameId = this.frameStack.getCurrentFrameId();\n if (!currentFrameId) return;\n\n try {\n const frame = this.frameDb.getFrame(currentFrameId);\n if (!frame) return;\n\n const metadata = frame.outputs || {};\n metadata[key] = value;\n\n this.frameDb.updateFrame(currentFrameId, {\n outputs: metadata,\n });\n } catch (error: unknown) {\n logger.warn('Failed to add context to frame', { error, key });\n }\n }\n\n /**\n * Delete a frame completely from the database (used in handoffs)\n */\n deleteFrame(frameId: string): void {\n try {\n // Remove from active stack if present\n this.frameStack.removeFrame(frameId);\n\n // Delete the frame and related data (cascades via FrameDatabase)\n this.frameDb.deleteFrame(frameId);\n\n logger.debug('Deleted frame completely', { frameId });\n } catch (error: unknown) {\n logger.error('Failed to delete frame', { frameId, error });\n throw error;\n }\n }\n\n /**\n * Extract tags from frame for categorization\n */\n private extractTagsFromFrame(frame: Frame): string[] {\n const tags: string[] = [];\n\n if (frame.type) tags.push(frame.type);\n\n if (frame.name) {\n const nameLower = frame.name.toLowerCase();\n if (nameLower.includes('error')) tags.push('error');\n if (nameLower.includes('fix')) tags.push('resolution');\n if (nameLower.includes('decision')) tags.push('decision');\n if (nameLower.includes('milestone')) tags.push('milestone');\n }\n\n try {\n if (frame.digest_json && typeof frame.digest_json === 'object') {\n const digest = frame.digest_json as Record<string, unknown>;\n if (Array.isArray(digest.tags)) {\n tags.push(...(digest.tags as string[]));\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Calculate frame importance for prioritization\n */\n private calculateFrameImportance(frame: Frame): 'high' | 'medium' | 'low' {\n if (frame.type === 'milestone' || frame.name?.includes('decision')) {\n return 'high';\n }\n\n if (frame.type === 'error' || frame.type === 'resolution') {\n return 'medium';\n }\n\n if (frame.closed_at && frame.created_at) {\n const duration = frame.closed_at - frame.created_at;\n if (duration > 300) return 'medium';\n }\n\n return 'low';\n }\n}\n\n// Re-export types for compatibility (type-only, no runtime value)\nexport type {\n Frame,\n FrameContext,\n Anchor,\n Event,\n FrameType,\n FrameState,\n FrameCreationOptions,\n FrameManagerConfig,\n DigestResult,\n} from './frame-types.js';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["newDepth"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/context/shared-context-layer.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Shared Context Layer for Cross-Session Reference\n *\n * This layer maintains a lightweight shared context across sessions while\n * preserving run_id isolation for write operations. It enables:\n * - Read access to frames from other sessions\n * - Automatic context inheritance\n * - Efficient caching and indexing\n * - Safe concurrent access\n *\n * Also includes ContextBridge for automatic synchronization between sessions\n * and shared context.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { sessionManager } from '../session/session-manager.js';\nimport type { Frame } from './frame-types.js';\nimport type { FrameManager } from './index.js';\nimport { logger } from '../monitoring/logger.js';\n\n// Type-safe environment variable access\n\nexport interface SharedContext {\n projectId: string;\n branch?: string;\n lastUpdated: number;\n sessions: SharedSessionContext[];\n globalPatterns: ContextPattern[];\n decisionLog: Decision[];\n referenceIndex: ReferenceIndex;\n}\n\nexport interface SharedSessionContext {\n sessionId: string;\n runId: string;\n summary: string;\n keyFrames: FrameSummary[];\n createdAt: number;\n lastActiveAt: number;\n metadata: Record<string, any>;\n}\n\nexport interface FrameSummary {\n frameId: string;\n title: string;\n type: string;\n score: number;\n tags: string[];\n summary?: string;\n createdAt: number;\n}\n\nexport interface ContextPattern {\n pattern: string;\n type: 'error' | 'success' | 'decision' | 'learning';\n frequency: number;\n lastSeen: number;\n resolution?: string;\n}\n\nexport interface Decision {\n id: string;\n decision: string;\n reasoning: string;\n timestamp: number;\n sessionId: string;\n outcome?: 'success' | 'failure' | 'pending';\n}\n\nexport interface ReferenceIndex {\n byTag: Map<string, string[]>;\n byType: Map<string, string[]>;\n byScore: string[];\n recentlyAccessed: string[];\n}\n\nexport class SharedContextLayer {\n private static instance: SharedContextLayer;\n private contextDir: string;\n private cache: Map<string, SharedContext> = new Map();\n private readonly MAX_CACHE_SIZE = 100;\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private lastCacheClean = Date.now();\n\n private constructor() {\n const homeDir = process.env['HOME'] || process.env['USERPROFILE'] || '';\n this.contextDir = path.join(homeDir, '.stackmemory', 'shared-context');\n }\n\n static getInstance(): SharedContextLayer {\n if (!SharedContextLayer.instance) {\n SharedContextLayer.instance = new SharedContextLayer();\n }\n return SharedContextLayer.instance;\n }\n\n async initialize(): Promise<void> {\n await fs.mkdir(this.contextDir, { recursive: true });\n await fs.mkdir(path.join(this.contextDir, 'projects'), { recursive: true });\n await fs.mkdir(path.join(this.contextDir, 'patterns'), { recursive: true });\n await fs.mkdir(path.join(this.contextDir, 'decisions'), {\n recursive: true,\n });\n }\n\n /**\n * Get or create shared context for current project/branch\n */\n async getSharedContext(options?: {\n projectId?: string;\n branch?: string;\n includeOtherBranches?: boolean;\n }): Promise<SharedContext> {\n const session = sessionManager.getCurrentSession();\n const projectId = options?.projectId || session?.projectId || 'global';\n const branch = options?.branch || session?.branch;\n\n const cacheKey = `${projectId}:${branch || 'main'}`;\n\n // Check cache first\n if (this.cache.has(cacheKey)) {\n const cached = this.cache.get(cacheKey)!;\n if (Date.now() - cached.lastUpdated < this.CACHE_TTL) {\n return cached;\n }\n }\n\n // Load from disk\n const context = await this.loadProjectContext(projectId, branch);\n\n // Include other branches if requested\n if (options?.includeOtherBranches) {\n const otherBranches = await this.loadOtherBranchContexts(\n projectId,\n branch\n );\n context.sessions.push(...otherBranches);\n }\n\n // Update cache\n this.cache.set(cacheKey, context);\n this.cleanCache();\n\n return context;\n }\n\n /**\n * Add current session's important frames to shared context\n */\n async addToSharedContext(\n frames: Frame[],\n options?: {\n minScore?: number;\n tags?: string[];\n }\n ): Promise<void> {\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n const context = await this.getSharedContext();\n const minScore = options?.minScore || 0.7;\n\n // Filter important frames\n const importantFrames = frames.filter((f) => {\n const score = this.calculateFrameScore(f);\n return score >= minScore;\n });\n\n // Create session context\n const sessionContext: SharedSessionContext = {\n sessionId: session.sessionId,\n runId: session.runId,\n summary: this.generateSessionSummary(importantFrames),\n keyFrames: importantFrames.map((f) => this.summarizeFrame(f)),\n createdAt: session.startedAt,\n lastActiveAt: Date.now(),\n metadata: session.metadata,\n };\n\n // Update or add session context\n const existingIndex = context.sessions.findIndex(\n (s) => s.sessionId === session.sessionId\n );\n if (existingIndex >= 0) {\n context.sessions[existingIndex] = sessionContext;\n } else {\n context.sessions.push(sessionContext);\n }\n\n // Update patterns\n this.updatePatterns(context, importantFrames);\n\n // Update reference index\n this.updateReferenceIndex(context, importantFrames);\n\n // Save context\n await this.saveProjectContext(context);\n }\n\n /**\n * Query shared context for relevant frames\n */\n async querySharedContext(query: {\n tags?: string[];\n type?: string;\n minScore?: number;\n sessionId?: string;\n limit?: number;\n }): Promise<FrameSummary[]> {\n const context = await this.getSharedContext({ includeOtherBranches: true });\n let results: FrameSummary[] = [];\n\n // Collect all frames from all sessions\n for (const session of context.sessions) {\n if (query.sessionId && session.sessionId !== query.sessionId) continue;\n\n // Skip sessions without keyFrames\n if (!session.keyFrames || !Array.isArray(session.keyFrames)) continue;\n\n const filtered = session.keyFrames.filter((f) => {\n if (query.tags && !query.tags.some((tag) => f.tags.includes(tag)))\n return false;\n if (query.type && f.type !== query.type) return false;\n if (query.minScore && f.score < query.minScore) return false;\n return true;\n });\n\n results.push(...filtered);\n }\n\n // Sort by score and recency\n results.sort((a, b) => {\n const scoreWeight = 0.7;\n const recencyWeight = 0.3;\n\n const aScore =\n a.score * scoreWeight +\n (1 - (Date.now() - a.createdAt) / (30 * 24 * 60 * 60 * 1000)) *\n recencyWeight;\n const bScore =\n b.score * scoreWeight +\n (1 - (Date.now() - b.createdAt) / (30 * 24 * 60 * 60 * 1000)) *\n recencyWeight;\n\n return bScore - aScore;\n });\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n // Update recently accessed\n const index = context.referenceIndex;\n if (!index.recentlyAccessed) {\n index.recentlyAccessed = [];\n }\n\n // Add frameIds to recently accessed, removing duplicates\n if (results.length > 0) {\n const frameIds = results.map((r) => r.frameId);\n index.recentlyAccessed = [\n ...frameIds,\n ...index.recentlyAccessed.filter((id: any) => !frameIds.includes(id)),\n ].slice(0, 100);\n\n // Save the updated context with recently accessed frames\n await this.saveProjectContext(context);\n }\n\n return results;\n }\n\n /**\n * Get relevant patterns from shared context\n */\n async getPatterns(type?: ContextPattern['type']): Promise<ContextPattern[]> {\n const context = await this.getSharedContext();\n\n if (type) {\n return context.globalPatterns.filter((p) => p.type === type);\n }\n\n return context.globalPatterns;\n }\n\n /**\n * Add a decision to the shared context\n */\n async addDecision(\n decision: Omit<Decision, 'id' | 'timestamp' | 'sessionId'>\n ): Promise<void> {\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n const context = await this.getSharedContext();\n\n const newDecision: Decision = {\n id: uuidv4(),\n timestamp: Date.now(),\n sessionId: session.sessionId,\n outcome: 'pending',\n ...decision,\n };\n\n context.decisionLog.push(newDecision);\n\n // Keep only last 100 decisions\n if (context.decisionLog.length > 100) {\n context.decisionLog = context.decisionLog.slice(-100);\n }\n\n await this.saveProjectContext(context);\n }\n\n /**\n * Get recent decisions from shared context\n */\n async getDecisions(limit: number = 10): Promise<Decision[]> {\n const context = await this.getSharedContext();\n return context.decisionLog.slice(-limit);\n }\n\n /**\n * Automatic context discovery on CLI startup\n */\n async autoDiscoverContext(): Promise<{\n hasSharedContext: boolean;\n sessionCount: number;\n recentPatterns: ContextPattern[];\n lastDecisions: Decision[];\n suggestedFrames: FrameSummary[];\n }> {\n const context = await this.getSharedContext({\n includeOtherBranches: false,\n });\n\n // Get recent patterns (last 7 days)\n const recentPatterns = context.globalPatterns\n .filter((p) => Date.now() - p.lastSeen < 7 * 24 * 60 * 60 * 1000)\n .sort((a, b) => b.frequency - a.frequency)\n .slice(0, 5);\n\n // Get last 5 decisions\n const lastDecisions = context.decisionLog.slice(-5);\n\n // Get suggested frames based on recent access and score\n const suggestedFrames = await this.querySharedContext({\n minScore: 0.8,\n limit: 5,\n });\n\n return {\n hasSharedContext: context.sessions.length > 0,\n sessionCount: context.sessions.length,\n recentPatterns,\n lastDecisions,\n suggestedFrames,\n };\n }\n\n private async loadProjectContext(\n projectId: string,\n branch?: string\n ): Promise<SharedContext> {\n const contextFile = path.join(\n this.contextDir,\n 'projects',\n `${projectId}_${branch || 'main'}.json`\n );\n\n try {\n const data = await fs.readFile(contextFile, 'utf-8');\n const context = JSON.parse(data);\n\n // Reconstruct Maps\n context.referenceIndex.byTag = new Map(\n Object.entries(context.referenceIndex.byTag || {})\n );\n context.referenceIndex.byType = new Map(\n Object.entries(context.referenceIndex.byType || {})\n );\n\n return context;\n } catch {\n // Return empty context if file doesn't exist\n return {\n projectId,\n branch,\n lastUpdated: Date.now(),\n sessions: [],\n globalPatterns: [],\n decisionLog: [],\n referenceIndex: {\n byTag: new Map(),\n byType: new Map(),\n byScore: [],\n recentlyAccessed: [],\n },\n };\n }\n }\n\n private async saveProjectContext(context: SharedContext): Promise<void> {\n const contextFile = path.join(\n this.contextDir,\n 'projects',\n `${context.projectId}_${context.branch || 'main'}.json`\n );\n\n // Convert Maps to objects for JSON serialization\n const serializable = {\n ...context,\n lastUpdated: Date.now(),\n referenceIndex: {\n ...context.referenceIndex,\n byTag: Object.fromEntries(context.referenceIndex.byTag),\n byType: Object.fromEntries(context.referenceIndex.byType),\n },\n };\n\n await fs.writeFile(contextFile, JSON.stringify(serializable, null, 2));\n }\n\n private async loadOtherBranchContexts(\n projectId: string,\n currentBranch?: string\n ): Promise<SharedSessionContext[]> {\n const projectsDir = path.join(this.contextDir, 'projects');\n const files = await fs.readdir(projectsDir);\n const sessions: SharedSessionContext[] = [];\n\n for (const file of files) {\n if (\n file.startsWith(`${projectId}_`) &&\n !file.includes(currentBranch || 'main')\n ) {\n try {\n const data = await fs.readFile(path.join(projectsDir, file), 'utf-8');\n const context = JSON.parse(data);\n sessions.push(...context.sessions);\n } catch {\n // Skip invalid files\n }\n }\n }\n\n return sessions;\n }\n\n private calculateFrameScore(frame: Frame): number {\n // Simple scoring algorithm\n let score = 0.5;\n\n // Boost for certain types\n if (frame.type === 'task' || frame.type === 'review') score += 0.2;\n if (frame.type === 'debug' || frame.type === 'write') score += 0.15;\n if (frame.type === 'error') score += 0.15; // Error frames are important for pattern extraction\n\n // Check for data property (used in tests)\n const frameWithData = frame as any;\n if (frameWithData.data) score += 0.2;\n\n // Boost for having outputs (indicates completion/results)\n if (frame.outputs && Object.keys(frame.outputs).length > 0) score += 0.2;\n if (\n frame.digest_text ||\n (frame.digest_json && Object.keys(frame.digest_json).length > 0)\n )\n score += 0.1;\n\n // Time decay (reduce score for older frames) - but handle missing created_at\n if (frame.created_at) {\n const age = Date.now() - frame.created_at;\n const daysSinceCreation = age / (24 * 60 * 60 * 1000);\n score *= Math.max(0.3, 1 - daysSinceCreation / 30);\n }\n\n return Math.min(1, score);\n }\n\n private summarizeFrame(frame: Frame): FrameSummary {\n return {\n frameId: frame.frame_id,\n title: frame.name,\n type: frame.type,\n score: this.calculateFrameScore(frame),\n tags: [],\n summary: this.generateFrameSummary(frame),\n createdAt: frame.created_at,\n };\n }\n\n private generateFrameSummary(frame: Frame): string {\n // Generate a brief summary of the frame\n const parts = [];\n const frameWithData = frame as any;\n\n if (frame.type) parts.push(`[${frame.type}]`);\n if (frame.name) parts.push(frame.name);\n if (frameWithData.title) parts.push(frameWithData.title);\n if (frameWithData.data?.error)\n parts.push(`Error: ${frameWithData.data.error}`);\n if (frameWithData.data?.resolution)\n parts.push(`Resolution: ${frameWithData.data.resolution}`);\n\n return parts.join(' - ').slice(0, 200);\n }\n\n private generateSessionSummary(frames: Frame[]): string {\n const types = [...new Set(frames.map((f) => f.type))];\n return `Session with ${frames.length} key frames: ${types.join(', ')}`;\n }\n\n private updatePatterns(context: SharedContext, frames: Frame[]): void {\n for (const frame of frames) {\n // Extract patterns from frame data\n // Handle frames with a data property (used in tests)\n const frameWithData = frame as any;\n if (frameWithData.data?.error) {\n this.addPattern(\n context,\n frameWithData.data.error,\n 'error',\n frameWithData.data?.resolution\n );\n } else if (frame.type === 'error' && frame.name) {\n // Only extract from name/outputs if no data.error property\n const errorText = frame.outputs?.error || frame.name;\n const resolution = frame.outputs?.resolution;\n if (errorText) {\n this.addPattern(context, errorText, 'error', resolution);\n }\n }\n\n if (frame.type === 'decision' && frameWithData.data?.decision) {\n this.addPattern(context, frameWithData.data.decision, 'decision');\n } else if (frame.digest_json?.decision) {\n // Only extract from digest_json if no data.decision\n this.addPattern(context, frame.digest_json.decision, 'decision');\n }\n }\n }\n\n private addPattern(\n context: SharedContext,\n pattern: string,\n type: ContextPattern['type'],\n resolution?: string\n ): void {\n const existing = context.globalPatterns.find(\n (p) => p.pattern === pattern && p.type === type\n );\n\n if (existing) {\n existing.frequency++;\n existing.lastSeen = Date.now();\n if (resolution) existing.resolution = resolution;\n } else {\n context.globalPatterns.push({\n pattern,\n type,\n frequency: 1,\n lastSeen: Date.now(),\n resolution,\n });\n }\n\n // Keep only top 100 patterns\n if (context.globalPatterns.length > 100) {\n context.globalPatterns.sort((a, b) => b.frequency - a.frequency);\n context.globalPatterns = context.globalPatterns.slice(0, 100);\n }\n }\n\n private updateReferenceIndex(context: SharedContext, frames: Frame[]): void {\n for (const frame of frames) {\n const summary = this.summarizeFrame(frame);\n\n // Index by tags\n for (const tag of summary.tags) {\n if (!context.referenceIndex.byTag.has(tag)) {\n context.referenceIndex.byTag.set(tag, []);\n }\n context.referenceIndex.byTag.get(tag)!.push(frame.frameId);\n }\n\n // Index by type\n if (!context.referenceIndex.byType.has(frame.type)) {\n context.referenceIndex.byType.set(frame.type, []);\n }\n context.referenceIndex.byType.get(frame.type)!.push(frame.frameId);\n\n // Update score index\n const scoreIndex = context.referenceIndex.byScore;\n const insertIndex = scoreIndex.findIndex((id) => {\n const otherFrame = context.sessions\n .flatMap((s) => s.keyFrames)\n .find((f) => f.frameId === id);\n return otherFrame && otherFrame.score < summary.score;\n });\n\n if (insertIndex >= 0) {\n scoreIndex.splice(insertIndex, 0, frame.frameId);\n } else {\n scoreIndex.push(frame.frameId);\n }\n\n // Keep only top 1000 by score\n context.referenceIndex.byScore = scoreIndex.slice(0, 1000);\n }\n }\n\n private cleanCache(): void {\n if (Date.now() - this.lastCacheClean < 60000) return; // Clean every minute\n\n if (this.cache.size > this.MAX_CACHE_SIZE) {\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => b[1].lastUpdated - a[1].lastUpdated\n );\n\n this.cache = new Map(entries.slice(0, this.MAX_CACHE_SIZE / 2));\n }\n\n this.lastCacheClean = Date.now();\n }\n}\n\nexport const sharedContextLayer = SharedContextLayer.getInstance();\n\n// ============================================================================\n// Context Bridge - Automatic synchronization between sessions and shared context\n// ============================================================================\n\nexport interface BridgeOptions {\n autoSync: boolean;\n syncInterval: number;\n minFrameScore: number;\n importantTags: string[];\n}\n\nexport class ContextBridge {\n private static instance: ContextBridge;\n private frameManager: FrameManager | null = null;\n private syncTimer: NodeJS.Timeout | null = null;\n private lastSyncTime: number = 0;\n private options: BridgeOptions = {\n autoSync: true,\n syncInterval: 60000, // 1 minute\n minFrameScore: 0.5, // Include frames with score above 0.5\n importantTags: ['decision', 'error', 'milestone', 'learning'],\n };\n\n private constructor() {}\n\n static getInstance(): ContextBridge {\n if (!ContextBridge.instance) {\n ContextBridge.instance = new ContextBridge();\n }\n return ContextBridge.instance;\n }\n\n /**\n * Initialize the bridge with a frame manager\n */\n async initialize(\n frameManager: FrameManager,\n options?: Partial<BridgeOptions>\n ): Promise<void> {\n this.frameManager = frameManager;\n this.options = { ...this.options, ...options };\n\n // Load shared context on initialization\n await this.loadSharedContext();\n\n // Start auto-sync if enabled\n if (this.options.autoSync) {\n this.startAutoSync();\n }\n\n logger.info('Context bridge initialized', {\n autoSync: this.options.autoSync,\n syncInterval: this.options.syncInterval,\n });\n }\n\n /**\n * Load relevant shared context into current session\n */\n async loadSharedContext(): Promise<void> {\n try {\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n // Get context discovery\n const discovery = await sharedContextLayer.autoDiscoverContext();\n\n if (!discovery.hasSharedContext) {\n logger.info('No shared context available to load');\n return;\n }\n\n // Load recent patterns as metadata\n if (discovery.recentPatterns.length > 0) {\n logger.info('Loaded recent patterns from shared context', {\n patternCount: discovery.recentPatterns.length,\n });\n }\n\n // Load last decisions for reference\n if (discovery.lastDecisions.length > 0) {\n logger.info('Loaded recent decisions from shared context', {\n decisionCount: discovery.lastDecisions.length,\n });\n }\n\n // Store suggested frames in metadata for quick reference\n if (discovery.suggestedFrames.length > 0) {\n const metadata = {\n suggestedFrames: discovery.suggestedFrames,\n loadedAt: Date.now(),\n };\n\n // Store in frame manager's context\n if (this.frameManager) {\n await this.frameManager.addContext(\n 'shared-context-suggestions',\n metadata\n );\n }\n\n logger.info('Loaded suggested frames from shared context', {\n frameCount: discovery.suggestedFrames.length,\n });\n }\n } catch (error: unknown) {\n logger.error('Failed to load shared context', error as Error);\n }\n }\n\n /**\n * Sync current session's important frames to shared context\n */\n async syncToSharedContext(): Promise<void> {\n try {\n if (!this.frameManager) return;\n\n const session = sessionManager.getCurrentSession();\n if (!session) return;\n\n // Get all active frames (filter out any nulls from missing frames)\n const activeFrames = this.frameManager\n .getActiveFramePath()\n .filter(Boolean);\n\n // Get recent closed frames (last 100)\n const recentFrames = await this.frameManager.getRecentFrames(100);\n\n // Combine and filter important frames\n const allFrames = [...activeFrames, ...recentFrames].filter(Boolean);\n const importantFrames = this.filterImportantFrames(allFrames);\n\n if (importantFrames.length === 0) {\n logger.debug('No important frames to sync');\n return;\n }\n\n // Add to shared context\n await sharedContextLayer.addToSharedContext(importantFrames, {\n minScore: this.options.minFrameScore,\n tags: this.options.importantTags,\n });\n\n this.lastSyncTime = Date.now();\n\n logger.info('Synced frames to shared context', {\n frameCount: importantFrames.length,\n sessionId: session.sessionId,\n });\n } catch (error: unknown) {\n logger.error('Failed to sync to shared context', error as Error);\n }\n }\n\n /**\n * Query shared context for relevant frames\n */\n async querySharedFrames(query: {\n tags?: string[];\n type?: string;\n limit?: number;\n }): Promise<FrameSummary[]> {\n try {\n const results = await sharedContextLayer.querySharedContext({\n ...query,\n minScore: this.options.minFrameScore,\n });\n\n logger.info('Queried shared context', {\n query,\n resultCount: results.length,\n });\n\n return results;\n } catch (error: unknown) {\n logger.error('Failed to query shared context', error as Error);\n return [];\n }\n }\n\n /**\n * Add a decision to shared context\n */\n async addDecision(decision: string, reasoning: string): Promise<void> {\n try {\n await sharedContextLayer.addDecision({\n decision,\n reasoning,\n outcome: 'pending',\n });\n\n logger.info('Added decision to shared context', { decision });\n } catch (error: unknown) {\n logger.error('Failed to add decision', error as Error);\n }\n }\n\n /**\n * Start automatic synchronization\n */\n private startAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n }\n\n this.syncTimer = setInterval(() => {\n this.syncToSharedContext().catch((error) => {\n logger.error('Auto-sync failed', error as Error);\n });\n }, this.options.syncInterval);\n\n // Also sync on important events\n this.setupEventListeners();\n }\n\n /**\n * Stop automatic synchronization\n */\n stopAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = null;\n }\n }\n\n /**\n * Filter frames that are important enough to share\n */\n private filterImportantFrames(frames: Frame[]): Frame[] {\n return frames.filter((frame) => {\n // Check if frame has important tags\n const hasImportantTag = this.options.importantTags.some((tag) =>\n frame.metadata?.tags?.includes(tag)\n );\n\n // Check frame type importance\n const isImportantType = [\n 'task',\n 'milestone',\n 'error',\n 'resolution',\n 'decision',\n ].includes(frame.type);\n\n // Check metadata importance flag\n const markedImportant = frame.metadata?.importance === 'high';\n\n return hasImportantTag || isImportantType || markedImportant;\n });\n }\n\n /**\n * Setup event listeners for automatic syncing\n */\n private setupEventListeners(): void {\n if (!this.frameManager) return;\n\n // Sync when a frame is closed\n const originalClose = this.frameManager.closeFrame.bind(this.frameManager);\n this.frameManager.closeFrame = async (frameId: string, metadata?: any) => {\n const result = await originalClose(frameId, metadata);\n\n // Sync if it was an important frame\n const frame = await this.frameManager!.getFrame(frameId);\n if (frame && this.filterImportantFrames([frame]).length > 0) {\n await this.syncToSharedContext();\n }\n\n return result;\n };\n\n // Sync when a milestone is reached\n const originalMilestone = this.frameManager.createFrame.bind(\n this.frameManager\n );\n this.frameManager.createFrame = async (params: any) => {\n const result = await originalMilestone(params);\n\n if (params.type === 'milestone') {\n await this.syncToSharedContext();\n }\n\n return result;\n };\n }\n\n /**\n * Get sync statistics\n */\n getSyncStats(): {\n lastSyncTime: number;\n autoSyncEnabled: boolean;\n syncInterval: number;\n } {\n return {\n lastSyncTime: this.lastSyncTime,\n autoSyncEnabled: this.options.autoSync,\n syncInterval: this.options.syncInterval,\n };\n }\n\n /**\n * Manual trigger for immediate sync\n */\n async forceSyncNow(): Promise<void> {\n logger.info('Force sync triggered');\n await this.syncToSharedContext();\n }\n}\n\nexport const contextBridge = ContextBridge.getInstance();\n\n// Export for testing\nexport {\n SharedContext,\n SharedSessionContext,\n FrameSummary,\n ContextPattern,\n Decision,\n ReferenceIndex,\n BridgeOptions,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/context/stack-merge-resolver.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Stack Merge Conflict Resolution - STA-101\n * Advanced conflict resolution for frame merging between individual and shared stacks\n */\n\nimport type { Frame, Anchor } from './frame-types.js';\nimport {\n DualStackManager,\n type StackSyncResult,\n} from './dual-stack-manager.js';\nimport { logger } from '../monitoring/logger.js';\nimport { ValidationError, DatabaseError, ErrorCode } from '../errors/index.js';\nimport {\n validateInput,\n StartMergeSessionSchema,\n CreateMergePolicySchema,\n ConflictResolutionSchema,\n} from './validation.js';\n\nexport interface MergeConflict {\n frameId: string;\n conflictType:\n | 'content'\n | 'metadata'\n | 'sequence'\n | 'dependency'\n | 'permission';\n sourceFrame: Frame;\n targetFrame: Frame;\n conflictDetails: {\n field: string;\n sourceValue: any;\n targetValue: any;\n lastModified: {\n source: Date;\n target: Date;\n };\n }[];\n severity: 'low' | 'medium' | 'high' | 'critical';\n autoResolvable: boolean;\n}\n\nexport interface MergeResolution {\n conflictId: string;\n strategy: 'source_wins' | 'target_wins' | 'merge_both' | 'manual' | 'skip';\n resolutionData?: Record<string, any>;\n resolvedBy: string;\n resolvedAt: Date;\n notes?: string;\n}\n\nexport interface MergePolicy {\n name: string;\n description: string;\n rules: Array<{\n condition: string; // JSONPath expression\n action: 'source_wins' | 'target_wins' | 'merge_both' | 'require_manual';\n priority: number;\n }>;\n autoApplyThreshold: 'low' | 'medium' | 'high' | 'never';\n}\n\nexport interface MergeSession {\n sessionId: string;\n sourceStackId: string;\n targetStackId: string;\n conflicts: MergeConflict[];\n resolutions: MergeResolution[];\n policy: MergePolicy;\n status: 'analyzing' | 'resolving' | 'completed' | 'failed' | 'manual_review';\n startedAt: Date;\n completedAt?: Date;\n metadata: {\n totalFrames: number;\n conflictFrames: number;\n autoResolvedConflicts: number;\n manualResolvedConflicts: number;\n };\n}\n\nexport class StackMergeResolver {\n private dualStackManager: DualStackManager;\n private activeSessions: Map<string, MergeSession> = new Map();\n private mergePolicies: Map<string, MergePolicy> = new Map();\n\n constructor(dualStackManager: DualStackManager) {\n this.dualStackManager = dualStackManager;\n this.initializeDefaultPolicies();\n logger.debug('StackMergeResolver initialized', {\n policies: Array.from(this.mergePolicies.keys()),\n });\n }\n\n /**\n * Start a merge session with conflict analysis\n */\n async startMergeSession(\n sourceStackId: string,\n targetStackId: string,\n frameIds?: string[],\n policyName: string = 'default'\n ): Promise<string> {\n // Validate input parameters\n const input = validateInput(StartMergeSessionSchema, {\n sourceStackId,\n targetStackId,\n frameIds,\n policyName,\n });\n const sessionId = `merge-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n logger.debug('Looking for merge policy', {\n policyName: input.policyName,\n availablePolicies: Array.from(this.mergePolicies.keys()),\n });\n const policy = this.mergePolicies.get(input.policyName);\n if (!policy) {\n logger.error('Merge policy not found', {\n requested: input.policyName,\n available: Array.from(this.mergePolicies.keys()),\n });\n throw new ValidationError(\n `Merge policy not found: ${input.policyName}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n // Check merge permissions on both stacks\n const currentUserId =\n this.dualStackManager.getCurrentContext().ownerId || 'unknown';\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.sourceStackId)\n );\n\n await this.dualStackManager\n .getPermissionManager()\n .enforcePermission(\n this.dualStackManager\n .getPermissionManager()\n .createContext(currentUserId, 'merge', 'stack', input.targetStackId)\n );\n\n // Create merge session\n const session: MergeSession = {\n sessionId,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n conflicts: [],\n resolutions: [],\n policy,\n status: 'analyzing',\n startedAt: new Date(),\n metadata: {\n totalFrames: 0,\n conflictFrames: 0,\n autoResolvedConflicts: 0,\n manualResolvedConflicts: 0,\n },\n };\n\n this.activeSessions.set(sessionId, session);\n\n // Analyze conflicts\n await this.analyzeConflicts(sessionId, frameIds);\n\n // Auto-resolve conflicts where possible\n await this.autoResolveConflicts(sessionId);\n\n logger.info(`Merge session started: ${sessionId}`, {\n sourceStack: sourceStackId,\n targetStack: targetStackId,\n conflicts: session.conflicts.length,\n policy: policyName,\n });\n\n return sessionId;\n } catch (error: unknown) {\n logger.error('Failed to start merge session', {\n error: error instanceof Error ? error.message : error,\n sourceStackId: input.sourceStackId,\n targetStackId: input.targetStackId,\n policyName: input.policyName,\n });\n throw new DatabaseError(\n 'Failed to start merge session',\n ErrorCode.OPERATION_FAILED,\n { sourceStackId, targetStackId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Analyze conflicts between source and target stacks\n */\n private async analyzeConflicts(\n sessionId: string,\n frameIds?: string[]\n ): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n try {\n const sourceStack = this.getStackManager(session.sourceStackId);\n const targetStack = this.getStackManager(session.targetStackId);\n\n // Get frames to analyze\n const framesToAnalyze =\n frameIds ||\n (await sourceStack.getActiveFrames()).map((f) => f.frame_id);\n\n session.metadata.totalFrames = framesToAnalyze.length;\n\n for (const frameId of framesToAnalyze) {\n const sourceFrame = await sourceStack.getFrame(frameId);\n if (!sourceFrame) continue;\n\n const targetFrame = await targetStack.getFrame(frameId);\n if (!targetFrame) continue; // No conflict if target doesn't exist\n\n // Analyze frame-level conflicts\n const conflicts = await this.analyzeFrameConflicts(\n sourceFrame,\n targetFrame\n );\n session.conflicts.push(...conflicts);\n }\n\n session.metadata.conflictFrames = new Set(\n session.conflicts.map((c) => c.frameId)\n ).size;\n session.status = 'resolving';\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict analysis completed: ${sessionId}`, {\n totalConflicts: session.conflicts.length,\n conflictFrames: session.metadata.conflictFrames,\n });\n } catch (error: unknown) {\n session.status = 'failed';\n this.activeSessions.set(sessionId, session);\n throw error;\n }\n }\n\n /**\n * Analyze conflicts within a single frame\n */\n private async analyzeFrameConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n // Content conflicts\n if (sourceFrame.name !== targetFrame.name) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'name',\n sourceValue: sourceFrame.name,\n targetValue: targetFrame.name,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // State conflicts\n if (sourceFrame.state !== targetFrame.state) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'metadata',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'state',\n sourceValue: sourceFrame.state,\n targetValue: targetFrame.state,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can auto-resolve based on timestamps\n });\n }\n\n // Input/Output conflicts\n if (\n JSON.stringify(sourceFrame.inputs) !== JSON.stringify(targetFrame.inputs)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'inputs',\n sourceValue: sourceFrame.inputs,\n targetValue: targetFrame.inputs,\n lastModified: {\n source: new Date(sourceFrame.created_at * 1000),\n target: new Date(targetFrame.created_at * 1000),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n\n // Analyze event conflicts\n const eventConflicts = await this.analyzeEventConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...eventConflicts);\n\n // Analyze anchor conflicts\n const anchorConflicts = await this.analyzeAnchorConflicts(\n sourceFrame,\n targetFrame\n );\n conflicts.push(...anchorConflicts);\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame events\n */\n private async analyzeEventConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceEvents = await sourceStack.getFrameEvents(\n sourceFrame.frame_id\n );\n const targetEvents = await targetStack.getFrameEvents(\n targetFrame.frame_id\n );\n\n // Check for sequence conflicts\n if (sourceEvents.length !== targetEvents.length) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'sequence',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: 'event_count',\n sourceValue: sourceEvents.length,\n targetValue: targetEvents.length,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'high',\n autoResolvable: true, // Can merge events\n });\n }\n\n // Check for content conflicts in matching events\n const minLength = Math.min(sourceEvents.length, targetEvents.length);\n for (let i = 0; i < minLength; i++) {\n const sourceEvent = sourceEvents[i];\n const targetEvent = targetEvents[i];\n\n if (\n sourceEvent.text !== targetEvent.text ||\n JSON.stringify(sourceEvent.metadata) !==\n JSON.stringify(targetEvent.metadata)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `event_${i}`,\n sourceValue: {\n text: sourceEvent.text,\n metadata: sourceEvent.metadata,\n },\n targetValue: {\n text: targetEvent.text,\n metadata: targetEvent.metadata,\n },\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'medium',\n autoResolvable: false,\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze event conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Analyze conflicts in frame anchors\n */\n private async analyzeAnchorConflicts(\n sourceFrame: Frame,\n targetFrame: Frame\n ): Promise<MergeConflict[]> {\n const conflicts: MergeConflict[] = [];\n\n try {\n const sourceStack = this.getStackManager(sourceFrame.project_id);\n const targetStack = this.getStackManager(targetFrame.project_id);\n\n const sourceAnchors = await sourceStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n const targetAnchors = await targetStack.getFrameAnchors(\n targetFrame.frame_id\n );\n\n // Group anchors by type for comparison\n const sourceAnchorsByType = this.groupAnchorsByType(sourceAnchors);\n const targetAnchorsByType = this.groupAnchorsByType(targetAnchors);\n\n const allTypes = new Set([\n ...Object.keys(sourceAnchorsByType),\n ...Object.keys(targetAnchorsByType),\n ]);\n\n for (const type of allTypes) {\n const sourceTypeAnchors = sourceAnchorsByType[type] || [];\n const targetTypeAnchors = targetAnchorsByType[type] || [];\n\n if (\n sourceTypeAnchors.length !== targetTypeAnchors.length ||\n !this.anchorsEqual(sourceTypeAnchors, targetTypeAnchors)\n ) {\n conflicts.push({\n frameId: sourceFrame.frame_id,\n conflictType: 'content',\n sourceFrame,\n targetFrame,\n conflictDetails: [\n {\n field: `anchors_${type}`,\n sourceValue: sourceTypeAnchors,\n targetValue: targetTypeAnchors,\n lastModified: {\n source: new Date(),\n target: new Date(),\n },\n },\n ],\n severity: 'low',\n autoResolvable: true, // Can merge anchors\n });\n }\n }\n } catch (error: unknown) {\n logger.warn(\n `Failed to analyze anchor conflicts for frame: ${sourceFrame.frame_id}`,\n error\n );\n }\n\n return conflicts;\n }\n\n /**\n * Auto-resolve conflicts based on merge policy\n */\n private async autoResolveConflicts(sessionId: string): Promise<void> {\n const session = this.activeSessions.get(sessionId);\n if (!session) return;\n\n const autoResolvableConflicts = session.conflicts.filter(\n (c) => c.autoResolvable\n );\n\n for (const conflict of autoResolvableConflicts) {\n const resolution = await this.applyMergePolicy(conflict, session.policy);\n if (resolution) {\n session.resolutions.push(resolution);\n session.metadata.autoResolvedConflicts++;\n\n logger.debug(`Auto-resolved conflict: ${conflict.frameId}`, {\n type: conflict.conflictType,\n strategy: resolution.strategy,\n });\n }\n }\n\n // Update session status\n const remainingConflicts = session.conflicts.filter(\n (c) => !session.resolutions.find((r) => r.conflictId === c.frameId)\n );\n\n if (remainingConflicts.length === 0) {\n session.status = 'completed';\n session.completedAt = new Date();\n } else if (remainingConflicts.every((c) => !c.autoResolvable)) {\n session.status = 'manual_review';\n }\n\n this.activeSessions.set(sessionId, session);\n }\n\n /**\n * Apply merge policy to resolve conflicts automatically\n */\n private async applyMergePolicy(\n conflict: MergeConflict,\n policy: MergePolicy\n ): Promise<MergeResolution | null> {\n // Sort rules by priority\n const sortedRules = policy.rules.sort((a, b) => b.priority - a.priority);\n\n for (const rule of sortedRules) {\n if (this.evaluateRuleCondition(conflict, rule.condition)) {\n return {\n conflictId: conflict.frameId,\n strategy:\n rule.action === 'require_manual' ? 'manual' : (rule.action as any),\n resolvedBy: 'system',\n resolvedAt: new Date(),\n notes: `Auto-resolved by policy: ${policy.name}`,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Manually resolve a specific conflict\n */\n async resolveConflict(\n sessionId: string,\n conflictId: string,\n resolution: Omit<MergeResolution, 'conflictId' | 'resolvedAt'>\n ): Promise<void> {\n // Validate input parameters\n const input = validateInput(ConflictResolutionSchema, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n notes: resolution.notes,\n });\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new ValidationError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.MERGE_SESSION_INVALID\n );\n }\n\n const conflict = session.conflicts.find((c) => c.frameId === conflictId);\n if (!conflict) {\n throw new ValidationError(\n `Conflict not found: ${conflictId}`,\n ErrorCode.MERGE_CONFLICT_UNRESOLVABLE\n );\n }\n\n const fullResolution: MergeResolution = {\n ...input,\n conflictId,\n resolvedAt: new Date(),\n };\n\n session.resolutions.push(fullResolution);\n session.metadata.manualResolvedConflicts++;\n\n // Check if all conflicts are resolved\n const resolvedConflictIds = new Set(\n session.resolutions.map((r) => r.conflictId)\n );\n const allResolved = session.conflicts.every((c) =>\n resolvedConflictIds.has(c.frameId)\n );\n\n if (allResolved) {\n session.status = 'completed';\n session.completedAt = new Date();\n }\n\n this.activeSessions.set(sessionId, session);\n\n logger.info(`Conflict manually resolved: ${conflictId}`, {\n strategy: resolution.strategy,\n resolvedBy: resolution.resolvedBy,\n });\n }\n\n /**\n * Execute merge with resolved conflicts\n */\n async executeMerge(sessionId: string): Promise<StackSyncResult> {\n const session = this.activeSessions.get(sessionId);\n if (!session) {\n throw new DatabaseError(\n `Merge session not found: ${sessionId}`,\n ErrorCode.RESOURCE_NOT_FOUND\n );\n }\n\n if (session.status !== 'completed') {\n throw new DatabaseError(\n `Merge session not ready for execution: ${session.status}`,\n ErrorCode.INVALID_STATE\n );\n }\n\n try {\n const resolutionMap = new Map(\n session.resolutions.map((r) => [r.conflictId, r])\n );\n\n const result: StackSyncResult = {\n success: true,\n conflictFrames: [],\n mergedFrames: [],\n errors: [],\n };\n\n const sourceStack = this.getStackManager(session.sourceStackId);\n const targetStack = this.getStackManager(session.targetStackId);\n\n // Group conflicts by frameId\n const conflictsByFrame = new Map<string, MergeConflict[]>();\n for (const conflict of session.conflicts) {\n const existing = conflictsByFrame.get(conflict.frameId) || [];\n existing.push(conflict);\n conflictsByFrame.set(conflict.frameId, existing);\n }\n\n // Process each frame according to its resolution\n for (const [frameId] of conflictsByFrame) {\n try {\n const resolution = resolutionMap.get(frameId);\n if (!resolution) {\n result.errors.push({\n frameId,\n error: 'No resolution found',\n resolution: 'skipped',\n });\n result.conflictFrames.push(frameId);\n continue;\n }\n\n const sourceFrame = await sourceStack.getFrame(frameId);\n const targetFrame = await targetStack.getFrame(frameId);\n\n if (!sourceFrame) {\n result.errors.push({\n frameId,\n error: 'Source frame not found',\n resolution: 'skipped',\n });\n continue;\n }\n\n switch (resolution.strategy) {\n case 'source_wins':\n if (targetFrame) await targetStack.deleteFrame(frameId);\n await this.copyFrameToStack(\n sourceFrame,\n sourceStack,\n targetStack\n );\n result.mergedFrames.push(frameId);\n break;\n\n case 'target_wins':\n result.mergedFrames.push(frameId);\n break;\n\n case 'merge_both':\n if (targetFrame) {\n await this.mergeFrameContents(\n sourceFrame,\n targetFrame,\n sourceStack,\n targetStack\n );\n } else {\n await this.copyFrameToStack(\n sourceFrame,\n sourceStack,\n targetStack\n );\n }\n result.mergedFrames.push(frameId);\n break;\n\n case 'skip':\n result.conflictFrames.push(frameId);\n break;\n\n case 'manual':\n result.errors.push({\n frameId,\n error: 'Manual resolution not applied',\n resolution: 'skipped',\n });\n result.conflictFrames.push(frameId);\n break;\n }\n } catch (error: unknown) {\n result.errors.push({\n frameId,\n error: error instanceof Error ? error.message : String(error),\n resolution: 'skipped',\n });\n result.success = false;\n }\n }\n\n logger.info(`Merge executed: ${sessionId}`, {\n mergedFrames: result.mergedFrames.length,\n conflicts: result.conflictFrames.length,\n errors: result.errors.length,\n });\n\n return result;\n } catch (error: unknown) {\n throw new DatabaseError(\n 'Failed to execute merge',\n ErrorCode.OPERATION_FAILED,\n { sessionId },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private async copyFrameToStack(\n frame: Frame,\n sourceStack: any,\n targetStack: any\n ): Promise<void> {\n await targetStack.createFrame({\n frame_id: frame.frame_id,\n name: frame.name,\n type: frame.type,\n parent_frame_id: frame.parent_frame_id,\n inputs: frame.inputs,\n outputs: frame.outputs,\n });\n\n const events = await sourceStack.getFrameEvents(frame.frame_id);\n for (const event of events) {\n await targetStack.addEvent(frame.frame_id, {\n type: event.type,\n text: event.text,\n metadata: event.metadata,\n });\n }\n\n const anchors = await sourceStack.getFrameAnchors(frame.frame_id);\n for (const anchor of anchors) {\n await targetStack.addAnchor(frame.frame_id, {\n type: anchor.type,\n text: anchor.text,\n priority: anchor.priority,\n metadata: anchor.metadata,\n });\n }\n }\n\n private async mergeFrameContents(\n sourceFrame: Frame,\n targetFrame: Frame,\n sourceStack: any,\n targetStack: any\n ): Promise<void> {\n // Merge events with deduplication\n const sourceEvents = await sourceStack.getFrameEvents(sourceFrame.frame_id);\n const targetEvents = await targetStack.getFrameEvents(targetFrame.frame_id);\n\n const existingSignatures = new Set(\n targetEvents.map((e: any) => `${e.type}:${e.text}`)\n );\n\n for (const event of sourceEvents) {\n const sig = `${event.type}:${event.text}`;\n if (!existingSignatures.has(sig)) {\n await targetStack.addEvent(targetFrame.frame_id, {\n type: event.type,\n text: event.text,\n metadata: { ...event.metadata, merged: true },\n });\n existingSignatures.add(sig);\n }\n }\n\n // Merge anchors with deduplication\n const sourceAnchors = await sourceStack.getFrameAnchors(\n sourceFrame.frame_id\n );\n const targetAnchors = await targetStack.getFrameAnchors(\n targetFrame.frame_id\n );\n\n const existingAnchorSigs = new Set(\n targetAnchors.map((a: any) => `${a.type}:${a.text}:${a.priority}`)\n );\n\n for (const anchor of sourceAnchors) {\n const sig = `${anchor.type}:${anchor.text}:${anchor.priority}`;\n if (!existingAnchorSigs.has(sig)) {\n await targetStack.addAnchor(targetFrame.frame_id, {\n type: anchor.type,\n text: anchor.text,\n priority: anchor.priority,\n metadata: { ...anchor.metadata, merged: true },\n });\n existingAnchorSigs.add(sig);\n }\n }\n\n logger.debug(`Merged frame contents: ${sourceFrame.frame_id}`);\n }\n\n /**\n * Get merge session details\n */\n async getMergeSession(sessionId: string): Promise<MergeSession | null> {\n return this.activeSessions.get(sessionId) || null;\n }\n\n /**\n * Create custom merge policy\n */\n async createMergePolicy(policy: MergePolicy): Promise<void> {\n // Validate input parameters\n const input = validateInput(CreateMergePolicySchema, policy);\n\n this.mergePolicies.set(input.name, input);\n logger.info(`Created merge policy: ${input.name}`, {\n rules: input.rules.length,\n autoApplyThreshold: input.autoApplyThreshold,\n });\n }\n\n /**\n * Initialize default merge policies\n */\n private initializeDefaultPolicies(): void {\n // Conservative policy - prefer manual resolution\n this.mergePolicies.set('conservative', {\n name: 'conservative',\n description: 'Prefer manual resolution for most conflicts',\n rules: [\n {\n condition: '$.conflictType == \"metadata\" && $.severity == \"low\"',\n action: 'target_wins',\n priority: 1,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'never',\n });\n\n // Aggressive policy - auto-resolve when possible\n this.mergePolicies.set('aggressive', {\n name: 'aggressive',\n description: 'Auto-resolve conflicts when safe',\n rules: [\n {\n condition: '$.conflictType == \"sequence\"',\n action: 'merge_both',\n priority: 5,\n },\n {\n condition: '$.severity == \"low\"',\n action: 'source_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"medium\" && $.autoResolvable',\n action: 'merge_both',\n priority: 4,\n },\n ],\n autoApplyThreshold: 'medium',\n });\n\n // Default policy - balanced approach\n this.mergePolicies.set('default', {\n name: 'default',\n description: 'Balanced conflict resolution',\n rules: [\n {\n condition: '$.conflictType == \"sequence\" && $.severity == \"low\"',\n action: 'merge_both',\n priority: 3,\n },\n {\n condition: '$.conflictType == \"metadata\" && $.autoResolvable',\n action: 'target_wins',\n priority: 2,\n },\n {\n condition: '$.severity == \"critical\"',\n action: 'require_manual',\n priority: 10,\n },\n ],\n autoApplyThreshold: 'low',\n });\n }\n\n // Helper methods\n private getStackManager(stackId: string): any {\n // Use DualStackManager's getStackManager method to get the right stack\n return this.dualStackManager.getStackManager(stackId);\n }\n\n private groupAnchorsByType(anchors: Anchor[]): Record<string, Anchor[]> {\n return anchors.reduce(\n (groups, anchor) => {\n if (!groups[anchor.type]) groups[anchor.type] = [];\n groups[anchor.type].push(anchor);\n return groups;\n },\n {} as Record<string, Anchor[]>\n );\n }\n\n private anchorsEqual(anchors1: Anchor[], anchors2: Anchor[]): boolean {\n if (anchors1.length !== anchors2.length) return false;\n\n // Sort by text for comparison\n const sorted1 = [...anchors1].sort((a, b) => a.text.localeCompare(b.text));\n const sorted2 = [...anchors2].sort((a, b) => a.text.localeCompare(b.text));\n\n return sorted1.every(\n (anchor, i) =>\n anchor.text === sorted2[i].text &&\n anchor.priority === sorted2[i].priority\n );\n }\n\n private evaluateRuleCondition(\n conflict: MergeConflict,\n condition: string\n ): boolean {\n // Simple condition evaluation - in real implementation would use JSONPath\n return (\n condition.includes(conflict.conflictType) ||\n condition.includes(conflict.severity)\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/context/validation.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Input validation schemas for collaboration layer\n */\n\nimport { z } from 'zod';\nimport { ValidationError, ErrorCode } from '../errors/index.js';\n\n// Permission validation\nexport const StackPermissionsSchema = z.object({\n canRead: z.boolean(),\n canWrite: z.boolean(),\n canHandoff: z.boolean(),\n canMerge: z.boolean(),\n canAdminister: z.boolean(),\n});\n\n// Common string validations\nconst stackIdSchema = z.string().min(1).max(200);\nconst userIdSchema = z.string().min(1).max(100);\nconst frameIdSchema = z.string().min(1).max(100);\nconst teamIdSchema = z.string().min(1).max(100);\n\n// Dual Stack Manager validation\nexport const CreateSharedStackSchema = z.object({\n teamId: teamIdSchema,\n name: z.string().min(1).max(200),\n ownerId: userIdSchema,\n permissions: StackPermissionsSchema.optional(),\n});\n\nexport const SwitchStackSchema = z.object({\n stackId: stackIdSchema,\n});\n\n// Frame Handoff validation\nexport const FrameContextSchema = z.object({\n totalFrames: z.number().min(1).max(10000),\n frameTypes: z.array(z.string()).min(1).max(50),\n estimatedSize: z.number().min(0).max(1000000), // Max 1MB\n dependencies: z.array(z.string()).max(100),\n});\n\nexport const BusinessContextSchema = z.object({\n milestone: z.string().max(100).optional(),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional(),\n deadline: z.date().optional(),\n stakeholders: z.array(userIdSchema).max(20).optional(),\n});\n\nexport const HandoffRequestSchema = z.object({\n initiatedAt: z.date(),\n initiatorId: userIdSchema,\n frameContext: FrameContextSchema,\n businessContext: BusinessContextSchema.optional(),\n});\n\nexport const InitiateHandoffSchema = z.object({\n targetStackId: stackIdSchema,\n frameIds: z.array(frameIdSchema).min(1).max(1000),\n handoffRequest: HandoffRequestSchema,\n reviewerId: userIdSchema.optional(),\n description: z.string().max(1000).optional(),\n});\n\nexport const HandoffApprovalSchema = z.object({\n reviewerId: userIdSchema,\n decision: z.enum(['approved', 'rejected', 'needs_changes']),\n feedback: z.string().max(2000).optional(),\n suggestedChanges: z\n .array(\n z.object({\n frameId: frameIdSchema,\n suggestion: z.string().max(500),\n reason: z.string().max(300).optional(),\n })\n )\n .max(50)\n .optional(),\n});\n\n// Merge Resolution validation\nexport const ConflictResolutionSchema = z.object({\n strategy: z.enum(['source_wins', 'target_wins', 'merge_both', 'manual']),\n resolvedBy: userIdSchema,\n notes: z.string().max(1000).optional(),\n});\n\nexport const MergePolicyRuleSchema = z.object({\n condition: z.string().min(1).max(500),\n action: z.enum(['source_wins', 'target_wins', 'merge_both', 'manual_review']),\n priority: z.number().min(1).max(10),\n});\n\nexport const CreateMergePolicySchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n rules: z.array(MergePolicyRuleSchema).min(1).max(20),\n autoApplyThreshold: z.enum(['low', 'medium', 'high']),\n});\n\nexport const StartMergeSessionSchema = z.object({\n sourceStackId: stackIdSchema,\n targetStackId: stackIdSchema,\n frameIds: z.array(frameIdSchema).max(1000).optional(),\n policyName: z.string().max(100).optional(),\n});\n\n// Type exports for use in implementation\nexport type StackPermissions = z.infer<typeof StackPermissionsSchema>;\nexport type CreateSharedStackInput = z.infer<typeof CreateSharedStackSchema>;\nexport type SwitchStackInput = z.infer<typeof SwitchStackSchema>;\nexport type FrameContext = z.infer<typeof FrameContextSchema>;\nexport type BusinessContext = z.infer<typeof BusinessContextSchema>;\nexport type HandoffRequest = z.infer<typeof HandoffRequestSchema>;\nexport type InitiateHandoffInput = z.infer<typeof InitiateHandoffSchema>;\nexport type HandoffApprovalInput = z.infer<typeof HandoffApprovalSchema>;\nexport type ConflictResolutionInput = z.infer<typeof ConflictResolutionSchema>;\nexport type MergePolicyRule = z.infer<typeof MergePolicyRuleSchema>;\nexport type CreateMergePolicyInput = z.infer<typeof CreateMergePolicySchema>;\nexport type StartMergeSessionInput = z.infer<typeof StartMergeSessionSchema>;\n\n// Validation helper functions\nexport function validateInput<T>(schema: z.ZodSchema<T>, input: unknown): T {\n try {\n return schema.parse(input);\n } catch (error: unknown) {\n if (error instanceof z.ZodError) {\n const details = error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n throw new ValidationError(\n `Validation failed: ${details}`,\n ErrorCode.VALIDATION_FAILED,\n { errors: error.errors }\n );\n }\n throw error;\n }\n}\n\nexport function validateInputSafe<T>(\n schema: z.ZodSchema<T>,\n input: unknown\n): { success: true; data: T } | { success: false; error: string } {\n try {\n const data = schema.parse(input);\n return { success: true, data };\n } catch (error: unknown) {\n if (error instanceof z.ZodError) {\n const details = error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join(', ');\n return { success: false, error: `Validation failed: ${details}` };\n }\n return { success: false, error: 'Unknown validation error' };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/database/batch-operations.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Batch Database Operations\n * High-performance bulk operations with transaction management\n */\n\nimport Database from 'better-sqlite3';\n// Connection pool imported when needed: getConnectionPool\nimport { logger } from '../monitoring/logger.js';\nimport { trace } from '../trace/index.js';\nimport { ErrorCode, wrapError } from '../errors/index.js';\n\nexport interface BatchOperation {\n table: string;\n operation: 'insert' | 'update' | 'delete';\n data: Record<string, any>[];\n onConflict?: 'ignore' | 'replace' | 'update';\n}\n\nexport interface BulkInsertOptions {\n batchSize?: number;\n onConflict?: 'ignore' | 'replace' | 'update';\n enableTransactions?: boolean;\n parallelTables?: boolean;\n}\n\nexport interface BatchStats {\n totalRecords: number;\n batchesProcessed: number;\n successfulInserts: number;\n failedInserts: number;\n totalTimeMs: number;\n avgBatchTimeMs: number;\n}\n\n/**\n * High-performance batch operations manager\n */\nexport class BatchOperationsManager {\n private db: Database.Database;\n private preparedStatements = new Map<string, Database.Statement>();\n private batchQueue: BatchOperation[] = [];\n private isProcessing = false;\n\n constructor(db?: Database.Database) {\n if (db) {\n this.db = db;\n this.initializePreparedStatements();\n } else {\n // Will be initialized when used with getConnectionPool().withConnection()\n this.db = undefined as any;\n }\n }\n\n /**\n * Add events in bulk with optimized batching\n */\n async bulkInsertEvents(\n events: Array<{\n frame_id: string;\n run_id: string;\n seq: number;\n event_type: string;\n payload: any;\n ts: number;\n }>,\n options: BulkInsertOptions = {}\n ): Promise<BatchStats> {\n const {\n batchSize = 100,\n onConflict = 'ignore',\n enableTransactions = true,\n } = options;\n\n return this.performBulkInsert('events', events, {\n batchSize,\n onConflict,\n enableTransactions,\n preprocessor: (event) => ({\n ...event,\n event_id: `evt_${event.frame_id}_${event.seq}_${Date.now()}`,\n payload: JSON.stringify(event.payload),\n }),\n });\n }\n\n /**\n * Add anchors in bulk\n */\n async bulkInsertAnchors(\n anchors: Array<{\n frame_id: string;\n type: string;\n text: string;\n priority: number;\n metadata: any;\n }>,\n options: BulkInsertOptions = {}\n ): Promise<BatchStats> {\n return this.performBulkInsert('anchors', anchors, {\n ...options,\n preprocessor: (anchor) => ({\n ...anchor,\n anchor_id: `anc_${anchor.frame_id}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n metadata: JSON.stringify(anchor.metadata),\n created_at: Date.now(),\n }),\n });\n }\n\n /**\n * Bulk update frame digests\n */\n async bulkUpdateFrameDigests(\n updates: Array<{\n frame_id: string;\n digest_text: string;\n digest_json: any;\n closed_at?: number;\n }>,\n options: BulkInsertOptions = {}\n ): Promise<BatchStats> {\n const { batchSize = 50, enableTransactions = true } = options;\n\n return trace.traceAsync(\n 'function',\n 'bulkUpdateFrameDigests',\n { count: updates.length },\n async () => {\n const startTime = performance.now();\n const stats: BatchStats = {\n totalRecords: updates.length,\n batchesProcessed: 0,\n successfulInserts: 0,\n failedInserts: 0,\n totalTimeMs: 0,\n avgBatchTimeMs: 0,\n };\n\n if (updates.length === 0) return stats;\n\n const stmt = this.db.prepare(`\n UPDATE frames \n SET digest_text = ?, \n digest_json = ?, \n closed_at = COALESCE(?, closed_at),\n state = CASE WHEN ? IS NOT NULL THEN 'closed' ELSE state END\n WHERE frame_id = ?\n `);\n\n const updateFn = (batch: typeof updates) => {\n for (const update of batch) {\n try {\n const result = stmt.run(\n update.digest_text,\n JSON.stringify(update.digest_json),\n update.closed_at,\n update.closed_at,\n update.frame_id\n );\n stats.successfulInserts += result.changes;\n } catch (error: unknown) {\n stats.failedInserts++;\n const wrappedError = wrapError(\n error,\n 'Failed to update frame digest',\n ErrorCode.DB_UPDATE_FAILED,\n { frameId: update.frame_id }\n );\n logger.warn('Failed to update frame digest', {\n frameId: update.frame_id,\n error: wrappedError.message,\n });\n }\n }\n };\n\n if (enableTransactions) {\n const transaction = this.db.transaction(updateFn);\n await this.processBatches(updates, batchSize, transaction, stats);\n } else {\n await this.processBatches(updates, batchSize, updateFn, stats);\n }\n\n stats.totalTimeMs = performance.now() - startTime;\n stats.avgBatchTimeMs =\n stats.batchesProcessed > 0\n ? stats.totalTimeMs / stats.batchesProcessed\n : 0;\n\n logger.info(\n 'Bulk frame digest update completed',\n stats as unknown as Record<string, unknown>\n );\n return stats;\n }\n );\n }\n\n /**\n * Generic bulk insert with preprocessing\n */\n private async performBulkInsert<T extends Record<string, any>>(\n table: string,\n records: T[],\n options: BulkInsertOptions & {\n preprocessor?: (record: T) => Record<string, any>;\n } = {}\n ): Promise<BatchStats> {\n const {\n batchSize = 100,\n onConflict = 'ignore',\n enableTransactions = true,\n preprocessor,\n } = options;\n\n return trace.traceAsync(\n 'function',\n `bulkInsert${table}`,\n { count: records.length },\n async () => {\n const startTime = performance.now();\n const stats: BatchStats = {\n totalRecords: records.length,\n batchesProcessed: 0,\n successfulInserts: 0,\n failedInserts: 0,\n totalTimeMs: 0,\n avgBatchTimeMs: 0,\n };\n\n if (records.length === 0) return stats;\n\n // Preprocess records if needed\n const processedRecords = preprocessor\n ? records.map(preprocessor)\n : records;\n\n // Build dynamic insert statement\n const firstRecord = processedRecords[0];\n const columns = Object.keys(firstRecord);\n const placeholders = columns.map(() => '?').join(', ');\n const conflictClause = this.getConflictClause(onConflict);\n\n const insertSql = `INSERT ${conflictClause} INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`;\n const stmt = this.db.prepare(insertSql);\n\n const insertFn = (batch: typeof processedRecords) => {\n for (const record of batch) {\n try {\n const values = columns.map((col: any) => record[col]);\n const result = stmt.run(...values);\n stats.successfulInserts += result.changes;\n } catch (error: unknown) {\n stats.failedInserts++;\n const wrappedError = wrapError(\n error,\n `Failed to insert ${table} record`,\n ErrorCode.DB_INSERT_FAILED,\n { table, record }\n );\n logger.warn(`Failed to insert ${table} record`, {\n record,\n error: wrappedError.message,\n });\n }\n }\n };\n\n if (enableTransactions) {\n const transaction = this.db.transaction(insertFn);\n await this.processBatches(\n processedRecords,\n batchSize,\n transaction,\n stats\n );\n } else {\n await this.processBatches(\n processedRecords,\n batchSize,\n insertFn,\n stats\n );\n }\n\n stats.totalTimeMs = performance.now() - startTime;\n stats.avgBatchTimeMs =\n stats.batchesProcessed > 0\n ? stats.totalTimeMs / stats.batchesProcessed\n : 0;\n\n logger.info(\n `Bulk ${table} insert completed`,\n stats as unknown as Record<string, unknown>\n );\n return stats;\n }\n );\n }\n\n /**\n * Process records in batches\n */\n private async processBatches<T>(\n records: T[],\n batchSize: number,\n processFn: (batch: T[]) => void,\n stats: BatchStats\n ): Promise<void> {\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n const batchStart = performance.now();\n\n try {\n processFn(batch);\n stats.batchesProcessed++;\n\n const batchTime = performance.now() - batchStart;\n logger.debug('Batch processed', {\n batchNumber: stats.batchesProcessed,\n records: batch.length,\n timeMs: batchTime.toFixed(2),\n });\n\n // Yield control to prevent blocking\n if (stats.batchesProcessed % 10 === 0) {\n await new Promise((resolve) => setImmediate(resolve));\n }\n } catch (error: unknown) {\n stats.failedInserts += batch.length;\n const wrappedError = wrapError(\n error,\n 'Batch processing failed',\n ErrorCode.DB_TRANSACTION_FAILED,\n { batchNumber: stats.batchesProcessed + 1, batchSize: batch.length }\n );\n logger.error('Batch processing failed', wrappedError, {\n batchNumber: stats.batchesProcessed + 1,\n batchSize: batch.length,\n });\n }\n }\n }\n\n /**\n * Queue batch operation for later processing\n */\n queueBatchOperation(operation: BatchOperation): void {\n this.batchQueue.push(operation);\n\n if (this.batchQueue.length >= 10 && !this.isProcessing) {\n setImmediate(() => this.processBatchQueue());\n }\n }\n\n /**\n * Process queued batch operations\n */\n async processBatchQueue(): Promise<void> {\n if (this.isProcessing || this.batchQueue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n const operations = [...this.batchQueue];\n this.batchQueue = [];\n\n try {\n const groupedOps = this.groupOperationsByTable(operations);\n\n for (const [table, tableOps] of groupedOps) {\n await this.processTableOperations(table, tableOps);\n }\n\n logger.info('Batch queue processed', {\n operations: operations.length,\n tables: groupedOps.size,\n });\n } catch (error: unknown) {\n const wrappedError = wrapError(\n error,\n 'Batch queue processing failed',\n ErrorCode.DB_TRANSACTION_FAILED,\n { operationsCount: operations.length }\n );\n logger.error('Batch queue processing failed', wrappedError);\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Flush any remaining queued operations\n */\n async flush(): Promise<void> {\n if (this.batchQueue.length > 0) {\n await this.processBatchQueue();\n }\n }\n\n /**\n * Get SQL conflict clause\n */\n private getConflictClause(onConflict: string): string {\n switch (onConflict) {\n case 'ignore':\n return 'OR IGNORE';\n case 'replace':\n return 'OR REPLACE';\n case 'update':\n return 'ON CONFLICT DO UPDATE SET';\n default:\n return '';\n }\n }\n\n /**\n * Group operations by table for efficient processing\n */\n private groupOperationsByTable(\n operations: BatchOperation[]\n ): Map<string, BatchOperation[]> {\n const grouped = new Map<string, BatchOperation[]>();\n\n for (const op of operations) {\n if (!grouped.has(op.table)) {\n grouped.set(op.table, []);\n }\n grouped.get(op.table)!.push(op);\n }\n\n return grouped;\n }\n\n /**\n * Process all operations for a specific table\n */\n private async processTableOperations(\n table: string,\n operations: BatchOperation[]\n ): Promise<void> {\n for (const op of operations) {\n switch (op.operation) {\n case 'insert':\n await this.performBulkInsert(table, op.data, {\n onConflict: op.onConflict,\n });\n break;\n // Add update and delete operations as needed\n default:\n logger.warn('Unsupported batch operation', {\n table,\n operation: op.operation,\n });\n }\n }\n }\n\n /**\n * Initialize commonly used prepared statements\n */\n private initializePreparedStatements(): void {\n // Event insertion\n this.preparedStatements.set(\n 'insert_event',\n this.db.prepare(`\n INSERT OR IGNORE INTO events \n (event_id, frame_id, run_id, seq, event_type, payload, ts) \n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n );\n\n // Anchor insertion\n this.preparedStatements.set(\n 'insert_anchor',\n this.db.prepare(`\n INSERT OR IGNORE INTO anchors \n (anchor_id, frame_id, type, text, priority, metadata, created_at) \n VALUES (?, ?, ?, ?, ?, ?, ?)\n `)\n );\n\n logger.info('Batch operations prepared statements initialized');\n }\n\n /**\n * Cleanup resources\n */\n cleanup(): void {\n // Modern better-sqlite3 automatically handles cleanup\n this.preparedStatements.clear();\n }\n}\n\n// Global batch operations manager\nlet globalBatchManager: BatchOperationsManager | null = null;\n\n/**\n * Get or create global batch operations manager\n */\nexport function getBatchManager(\n db?: Database.Database\n): BatchOperationsManager {\n if (!globalBatchManager) {\n globalBatchManager = new BatchOperationsManager(db);\n }\n return globalBatchManager;\n}\n\n/**\n * Convenience function for bulk event insertion\n */\nexport async function bulkInsertEvents(\n events: any[],\n options?: BulkInsertOptions\n): Promise<BatchStats> {\n const manager = getBatchManager();\n return manager.bulkInsertEvents(events, options);\n}\n\n/**\n * Convenience function for bulk anchor insertion\n */\nexport async function bulkInsertAnchors(\n anchors: any[],\n options?: BulkInsertOptions\n): Promise<BatchStats> {\n const manager = getBatchManager();\n return manager.bulkInsertAnchors(anchors, options);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/database/connection-pool.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Connection Pool Manager for ParadeDB\n * Manages PostgreSQL connection pooling with health checks and monitoring\n */\n\nimport { Pool, PoolClient, PoolConfig } from 'pg';\nimport { EventEmitter } from 'events';\nimport { logger } from '../monitoring/logger.js';\nimport { DatabaseError, ErrorCode } from '../errors/index.js';\n\nexport interface ConnectionPoolConfig extends PoolConfig {\n // Basic pool settings\n min?: number; // Minimum pool size (default: 2)\n max?: number; // Maximum pool size (default: 10)\n idleTimeoutMillis?: number; // Close idle connections after ms (default: 30000)\n connectionTimeoutMillis?: number; // Connection acquire timeout (default: 5000)\n\n // Health check settings\n healthCheckInterval?: number; // Health check frequency in ms (default: 30000)\n healthCheckQuery?: string; // Query to test connection health (default: 'SELECT 1')\n retryOnFailure?: boolean; // Retry failed connections (default: true)\n maxRetries?: number; // Max retry attempts (default: 3)\n retryDelayMs?: number; // Delay between retries (default: 1000)\n\n // Monitoring settings\n enableMetrics?: boolean; // Enable connection metrics (default: true)\n metricsInterval?: number; // Metrics collection interval (default: 60000)\n}\n\nexport interface ConnectionMetrics {\n totalConnections: number;\n idleConnections: number;\n activeConnections: number;\n waitingRequests: number;\n totalAcquired: number;\n totalReleased: number;\n totalErrors: number;\n averageAcquireTime: number;\n peakConnections: number;\n uptime: number;\n}\n\nexport interface ConnectionHealth {\n isHealthy: boolean;\n lastCheck: Date;\n consecutiveFailures: number;\n totalChecks: number;\n totalFailures: number;\n averageResponseTime: number;\n}\n\nexport class ConnectionPool extends EventEmitter {\n private pool: Pool;\n private config: Required<ConnectionPoolConfig>;\n private metrics: ConnectionMetrics;\n private health: ConnectionHealth;\n private healthCheckTimer?: NodeJS.Timeout;\n private metricsTimer?: NodeJS.Timeout;\n private startTime: Date;\n private badConnections = new Set<PoolClient>();\n private acquireTimes: number[] = [];\n\n constructor(config: ConnectionPoolConfig) {\n super();\n\n this.config = this.normalizeConfig(config);\n this.startTime = new Date();\n\n // Initialize metrics\n this.metrics = {\n totalConnections: 0,\n idleConnections: 0,\n activeConnections: 0,\n waitingRequests: 0,\n totalAcquired: 0,\n totalReleased: 0,\n totalErrors: 0,\n averageAcquireTime: 0,\n peakConnections: 0,\n uptime: 0,\n };\n\n // Initialize health\n this.health = {\n isHealthy: false,\n lastCheck: new Date(),\n consecutiveFailures: 0,\n totalChecks: 0,\n totalFailures: 0,\n averageResponseTime: 0,\n };\n\n // Create pool\n this.pool = new Pool(this.config);\n this.setupPoolEvents();\n\n // Start monitoring if enabled\n if (this.config.enableMetrics) {\n this.startMonitoring();\n }\n }\n\n private normalizeConfig(\n config: ConnectionPoolConfig\n ): Required<ConnectionPoolConfig> {\n return {\n ...config,\n min: config.min ?? 2,\n max: config.max ?? 10,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: config.connectionTimeoutMillis ?? 5000,\n healthCheckInterval: config.healthCheckInterval ?? 30000,\n healthCheckQuery: config.healthCheckQuery ?? 'SELECT 1',\n retryOnFailure: config.retryOnFailure ?? true,\n maxRetries: config.maxRetries ?? 3,\n retryDelayMs: config.retryDelayMs ?? 1000,\n enableMetrics: config.enableMetrics ?? true,\n metricsInterval: config.metricsInterval ?? 60000,\n };\n }\n\n private setupPoolEvents(): void {\n this.pool.on('connect', (client) => {\n logger.debug('New database connection established');\n this.metrics.totalConnections++;\n this.updatePeakConnections();\n this.emit('connect', client);\n });\n\n this.pool.on('acquire', (client) => {\n this.metrics.totalAcquired++;\n this.emit('acquire', client);\n });\n\n this.pool.on('release', (client) => {\n this.metrics.totalReleased++;\n this.emit('release', client);\n });\n\n this.pool.on('remove', (client) => {\n logger.debug('Database connection removed from pool');\n this.metrics.totalConnections--;\n this.emit('remove', client);\n });\n\n this.pool.on('error', (error) => {\n logger.error('Database pool error:', error);\n this.metrics.totalErrors++;\n this.emit('error', error);\n });\n }\n\n private updatePeakConnections(): void {\n const current = this.pool.totalCount;\n if (current > this.metrics.peakConnections) {\n this.metrics.peakConnections = current;\n }\n }\n\n private startMonitoring(): void {\n // Health checks\n if (this.config.healthCheckInterval > 0) {\n this.healthCheckTimer = setInterval(() => {\n this.performHealthCheck().catch((error) => {\n logger.error('Health check failed:', error);\n });\n }, this.config.healthCheckInterval);\n }\n\n // Metrics collection\n if (this.config.metricsInterval > 0) {\n this.metricsTimer = setInterval(() => {\n this.updateMetrics();\n this.emit('metrics', this.getMetrics());\n }, this.config.metricsInterval);\n }\n\n // Initial health check\n this.performHealthCheck().catch((error) => {\n logger.warn('Initial health check failed:', error);\n });\n }\n\n private async performHealthCheck(): Promise<void> {\n const startTime = Date.now();\n let client: PoolClient | undefined;\n\n try {\n this.health.totalChecks++;\n\n client = await this.pool.connect();\n await client.query(this.config.healthCheckQuery);\n\n const responseTime = Date.now() - startTime;\n this.updateHealthMetrics(true, responseTime);\n\n logger.debug(`Health check passed in ${responseTime}ms`);\n } catch (error: unknown) {\n const responseTime = Date.now() - startTime;\n this.updateHealthMetrics(false, responseTime);\n\n logger.warn(`Health check failed after ${responseTime}ms:`, error);\n\n if (\n this.config.retryOnFailure &&\n this.health.consecutiveFailures < this.config.maxRetries\n ) {\n setTimeout(() => {\n this.performHealthCheck().catch(() => {\n // Ignore retry failures\n });\n }, this.config.retryDelayMs);\n }\n } finally {\n if (client) {\n client.release();\n }\n }\n }\n\n private updateHealthMetrics(success: boolean, responseTime: number): void {\n this.health.lastCheck = new Date();\n\n if (success) {\n this.health.isHealthy = true;\n this.health.consecutiveFailures = 0;\n } else {\n this.health.isHealthy = false;\n this.health.consecutiveFailures++;\n this.health.totalFailures++;\n }\n\n // Update average response time (simple moving average of last 10 checks)\n const weight = Math.min(this.health.totalChecks, 10);\n this.health.averageResponseTime =\n (this.health.averageResponseTime * (weight - 1) + responseTime) / weight;\n }\n\n private updateMetrics(): void {\n this.metrics.idleConnections = this.pool.idleCount;\n this.metrics.activeConnections = this.pool.totalCount - this.pool.idleCount;\n this.metrics.waitingRequests = this.pool.waitingCount;\n this.metrics.uptime = Date.now() - this.startTime.getTime();\n\n // Update average acquire time\n if (this.acquireTimes.length > 0) {\n this.metrics.averageAcquireTime =\n this.acquireTimes.reduce((sum, time) => sum + time, 0) /\n this.acquireTimes.length;\n\n // Keep only recent acquire times (last 100)\n if (this.acquireTimes.length > 100) {\n this.acquireTimes = this.acquireTimes.slice(-100);\n }\n }\n }\n\n /**\n * Acquire a connection from the pool\n */\n async acquire(): Promise<PoolClient> {\n const startTime = Date.now();\n\n try {\n const client = await this.pool.connect();\n\n // Track acquire time\n const acquireTime = Date.now() - startTime;\n this.acquireTimes.push(acquireTime);\n\n // Check if connection is marked as bad\n if (this.badConnections.has(client)) {\n this.badConnections.delete(client);\n client.release(true); // Force removal\n return this.acquire(); // Try again\n }\n\n return client;\n } catch (error: unknown) {\n this.metrics.totalErrors++;\n logger.error('Failed to acquire connection:', error);\n throw new DatabaseError(\n 'Failed to acquire database connection',\n ErrorCode.DB_CONNECTION_FAILED,\n { pool: 'paradedb' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Release a connection back to the pool\n */\n release(client: PoolClient, error?: Error | boolean): void {\n if (error) {\n // Release with error - connection will be removed from pool\n client.release(true);\n } else {\n client.release();\n }\n }\n\n /**\n * Mark a connection as bad (will be removed on next acquire)\n */\n markConnectionAsBad(client: PoolClient): void {\n this.badConnections.add(client);\n logger.warn('Connection marked as bad and will be removed');\n }\n\n /**\n * Get current connection metrics\n */\n getMetrics(): ConnectionMetrics {\n this.updateMetrics();\n return { ...this.metrics };\n }\n\n /**\n * Get current health status\n */\n getHealth(): ConnectionHealth {\n return { ...this.health };\n }\n\n /**\n * Test connection to database\n */\n async ping(): Promise<boolean> {\n try {\n const client = await this.acquire();\n await client.query('SELECT 1');\n this.release(client);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get pool status information\n */\n getStatus() {\n return {\n totalCount: this.pool.totalCount,\n idleCount: this.pool.idleCount,\n waitingCount: this.pool.waitingCount,\n config: {\n min: this.config.min,\n max: this.config.max,\n idleTimeoutMillis: this.config.idleTimeoutMillis,\n connectionTimeoutMillis: this.config.connectionTimeoutMillis,\n },\n health: this.getHealth(),\n metrics: this.getMetrics(),\n };\n }\n\n /**\n * Close all connections and clean up\n */\n async close(): Promise<void> {\n logger.info('Closing connection pool');\n\n // Clear timers\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n }\n if (this.metricsTimer) {\n clearInterval(this.metricsTimer);\n }\n\n // Close pool\n await this.pool.end();\n\n // Clear bad connections set\n this.badConnections.clear();\n\n this.emit('close');\n logger.info('Connection pool closed');\n }\n\n /**\n * Drain pool gracefully (wait for active connections to finish)\n */\n async drain(timeoutMs = 30000): Promise<void> {\n logger.info('Draining connection pool');\n\n const startTime = Date.now();\n\n while (this.pool.totalCount - this.pool.idleCount > 0) {\n if (Date.now() - startTime > timeoutMs) {\n logger.warn('Pool drain timeout reached, forcing close');\n break;\n }\n\n // Wait a bit before checking again\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n await this.close();\n }\n\n /**\n * Execute a query using a pooled connection\n */\n async query<T = any>(\n text: string,\n params?: any[]\n ): Promise<{ rows: T[]; rowCount: number }> {\n const client = await this.acquire();\n\n try {\n const result = await client.query(text, params);\n return {\n rows: result.rows,\n rowCount: result.rowCount || 0,\n };\n } finally {\n this.release(client);\n }\n }\n\n /**\n * Execute multiple queries in a transaction\n */\n async transaction<T>(\n callback: (client: PoolClient) => Promise<T>\n ): Promise<T> {\n const client = await this.acquire();\n\n try {\n await client.query('BEGIN');\n const result = await callback(client);\n await client.query('COMMIT');\n return result;\n } catch (error: unknown) {\n try {\n await client.query('ROLLBACK');\n } catch (rollbackError: unknown) {\n logger.error('Transaction rollback failed:', rollbackError);\n this.markConnectionAsBad(client);\n }\n throw new DatabaseError(\n 'Transaction failed',\n ErrorCode.DB_TRANSACTION_FAILED,\n { operation: 'transaction' },\n error instanceof Error ? error : undefined\n );\n } finally {\n this.release(client);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/database/database-adapter.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Database Adapter Interface\n * Provides abstraction layer for different database implementations\n * Supports SQLite (current) and ParadeDB (new) with seamless migration\n */\n\nimport type { Frame, Event, Anchor } from '../context/index.js';\n\nexport interface QueryOptions {\n limit?: number;\n offset?: number;\n orderBy?: string;\n orderDirection?: 'ASC' | 'DESC';\n timeout?: number;\n}\n\nexport interface SearchOptions extends QueryOptions {\n query: string;\n searchType?: 'text' | 'vector' | 'hybrid';\n scoreThreshold?: number;\n fields?: string[];\n boost?: Record<string, number>;\n}\n\nexport interface AggregationOptions {\n groupBy: string[];\n metrics: Array<{\n field: string;\n operation: 'count' | 'sum' | 'avg' | 'min' | 'max';\n alias?: string;\n }>;\n having?: Record<string, any>;\n}\n\nexport interface BulkOperation {\n type: 'insert' | 'update' | 'delete';\n table: string;\n data?: any;\n where?: Record<string, any>;\n}\n\nexport interface DatabaseStats {\n totalFrames: number;\n activeFrames: number;\n totalEvents: number;\n totalAnchors: number;\n diskUsage: number;\n lastVacuum?: Date;\n}\n\n// Database result type interfaces\nexport interface CountResult {\n count: number;\n}\n\nexport interface VersionResult {\n version: number;\n}\n\nexport interface FrameRow {\n frame_id: string;\n parent_frame_id?: string;\n project_id: string;\n run_id: string;\n type: string;\n name: string;\n state: string;\n depth: number;\n inputs: string;\n outputs: string;\n digest_text: string;\n digest_json: string;\n created_at: number;\n closed_at?: number;\n score?: number;\n}\n\nexport interface EventRow {\n event_id: string;\n frame_id: string;\n seq: number;\n type: string;\n text: string;\n metadata: string;\n}\n\nexport interface AnchorRow {\n anchor_id: string;\n frame_id: string;\n type: string;\n text: string;\n priority: number;\n created_at: number;\n metadata: string;\n}\n\nexport abstract class DatabaseAdapter {\n protected readonly projectId: string;\n protected readonly config: any;\n\n constructor(projectId: string, config?: any) {\n this.projectId = projectId;\n this.config = config || {};\n }\n\n // Lifecycle methods\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n abstract isConnected(): boolean;\n abstract ping(): Promise<boolean>;\n\n // Schema management\n abstract initializeSchema(): Promise<void>;\n abstract migrateSchema(targetVersion: number): Promise<void>;\n abstract getSchemaVersion(): Promise<number>;\n\n // Frame operations\n abstract createFrame(frame: Partial<Frame>): Promise<string>;\n abstract getFrame(frameId: string): Promise<Frame | null>;\n abstract updateFrame(frameId: string, updates: Partial<Frame>): Promise<void>;\n abstract deleteFrame(frameId: string): Promise<void>;\n abstract getActiveFrames(runId?: string): Promise<Frame[]>;\n abstract closeFrame(frameId: string, outputs?: any): Promise<void>;\n\n // Event operations\n abstract createEvent(event: Partial<Event>): Promise<string>;\n abstract getFrameEvents(\n frameId: string,\n options?: QueryOptions\n ): Promise<Event[]>;\n abstract deleteFrameEvents(frameId: string): Promise<void>;\n\n // Anchor operations\n abstract createAnchor(anchor: Partial<Anchor>): Promise<string>;\n abstract getFrameAnchors(frameId: string): Promise<Anchor[]>;\n abstract deleteFrameAnchors(frameId: string): Promise<void>;\n\n // Search operations (enhanced for ParadeDB)\n abstract search(\n options: SearchOptions\n ): Promise<Array<Frame & { score: number }>>;\n abstract searchByVector(\n embedding: number[],\n options?: QueryOptions\n ): Promise<Array<Frame & { similarity: number }>>;\n abstract searchHybrid(\n textQuery: string,\n embedding: number[],\n weights?: { text: number; vector: number }\n ): Promise<Array<Frame & { score: number }>>;\n\n // Aggregation operations\n abstract aggregate(\n table: string,\n options: AggregationOptions\n ): Promise<Record<string, any>[]>;\n\n // Pattern detection\n abstract detectPatterns(timeRange?: { start: Date; end: Date }): Promise<\n Array<{\n pattern: string;\n type: string;\n frequency: number;\n lastSeen: Date;\n }>\n >;\n\n // Bulk operations\n abstract executeBulk(operations: BulkOperation[]): Promise<void>;\n abstract vacuum(): Promise<void>;\n abstract analyze(): Promise<void>;\n\n // Statistics\n abstract getStats(): Promise<DatabaseStats>;\n abstract getQueryStats(): Promise<\n Array<{\n query: string;\n calls: number;\n meanTime: number;\n totalTime: number;\n }>\n >;\n\n // Transaction support\n abstract beginTransaction(): Promise<void>;\n abstract commitTransaction(): Promise<void>;\n abstract rollbackTransaction(): Promise<void>;\n abstract inTransaction(\n callback: (adapter: DatabaseAdapter) => Promise<void>\n ): Promise<void>;\n\n // Export/Import for migration\n abstract exportData(\n tables: string[],\n format: 'json' | 'parquet' | 'csv'\n ): Promise<Buffer>;\n abstract importData(\n data: Buffer,\n format: 'json' | 'parquet' | 'csv',\n options?: { truncate?: boolean; upsert?: boolean }\n ): Promise<void>;\n\n // Utility methods\n protected generateId(): string {\n return crypto.randomUUID();\n }\n\n protected sanitizeQuery(query: string): string {\n // DEPRECATED: Use parameterized queries instead\n // This method is kept for legacy compatibility but should not be used\n console.warn(\n 'sanitizeQuery() is deprecated and unsafe - use parameterized queries'\n );\n return query.replace(/[;'\"\\\\]/g, '');\n }\n\n protected buildWhereClause(conditions: Record<string, any>): string {\n const clauses = Object.entries(conditions).map(([key, value]) => {\n if (value === null) {\n return `${key} IS NULL`;\n } else if (Array.isArray(value)) {\n return `${key} IN (${value.map(() => '?').join(',')})`;\n } else {\n return `${key} = ?`;\n }\n });\n return clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n }\n\n protected buildOrderByClause(\n orderBy?: string,\n direction?: 'ASC' | 'DESC'\n ): string {\n if (!orderBy) return '';\n // Whitelist validation: allow letters, numbers, underscore, dot (for table aliasing)\n const isSafe = /^[a-zA-Z0-9_.]+$/.test(orderBy);\n if (!isSafe) {\n // Drop ORDER BY if unsafe to prevent injection via column name\n return '';\n }\n const dir = direction === 'DESC' ? 'DESC' : 'ASC';\n return ` ORDER BY ${orderBy} ${dir}`;\n }\n\n protected buildLimitClause(limit?: number, offset?: number): string {\n if (!limit) return '';\n let clause = ` LIMIT ${limit}`;\n if (offset) clause += ` OFFSET ${offset}`;\n return clause;\n }\n}\n\n// Feature flags for gradual migration\nexport interface DatabaseFeatures {\n supportsFullTextSearch: boolean;\n supportsVectorSearch: boolean;\n supportsPartitioning: boolean;\n supportsAnalytics: boolean;\n supportsCompression: boolean;\n supportsMaterializedViews: boolean;\n supportsParallelQueries: boolean;\n}\n\nexport abstract class FeatureAwareDatabaseAdapter extends DatabaseAdapter {\n abstract getFeatures(): DatabaseFeatures;\n\n async canUseFeature(feature: keyof DatabaseFeatures): Promise<boolean> {\n const features = this.getFeatures();\n return features[feature] || false;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAgGO,MAAe,gBAAgB;AAAA,EACjB;AAAA,EACA;AAAA,EAEnB,YAAY,WAAmB,QAAc;AAC3C,SAAK,YAAY;AACjB,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AAAA;AAAA,EAoGU,aAAqB;AAC7B,WAAO,OAAO,WAAW;AAAA,EAC3B;AAAA,EAEU,cAAc,OAAuB;AAG7C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO,MAAM,QAAQ,YAAY,EAAE;AAAA,EACrC;AAAA,EAEU,iBAAiB,YAAyC;AAClE,UAAM,UAAU,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/D,UAAI,UAAU,MAAM;AAClB,eAAO,GAAG,GAAG;AAAA,MACf,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,eAAO,GAAG,GAAG,QAAQ,MAAM,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA,MACrD,OAAO;AACL,eAAO,GAAG,GAAG;AAAA,MACf;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,SAAS,IAAI,SAAS,QAAQ,KAAK,OAAO,CAAC,KAAK;AAAA,EACjE;AAAA,EAEU,mBACR,SACA,WACQ;AACR,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,QAAI,CAAC,QAAQ;AAEX,aAAO;AAAA,IACT;AACA,UAAM,MAAM,cAAc,SAAS,SAAS;AAC5C,WAAO,aAAa,OAAO,IAAI,GAAG;AAAA,EACpC;AAAA,EAEU,iBAAiB,OAAgB,QAAyB;AAClE,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,SAAS,UAAU,KAAK;AAC5B,QAAI,OAAQ,WAAU,WAAW,MAAM;AACvC,WAAO;AAAA,EACT;AACF;AAaO,MAAe,oCAAoC,gBAAgB;AAAA,EAGxE,MAAM,cAAc,SAAmD;AACrE,UAAM,WAAW,KAAK,YAAY;AAClC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|