@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/storage/two-tier-storage.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Two-Tier Storage System for StackMemory\n * Implements STA-414: Local and Remote Storage with Migration\n *\n * Local Tiers:\n * - Young: < 1 day (complete retention in RAM)\n * - Mature: 1-7 days (selective retention with LZ4)\n * - Old: 7-30 days (critical only with ZSTD)\n *\n * Remote Tier:\n * - Infinite retention with TimeSeries DB + S3\n * - Monthly partitioning\n * - Cost-aware migration\n */\n\nimport Database from 'better-sqlite3';\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n} from '@aws-sdk/client-s3';\nimport type { RedisClientType } from 'redis';\nimport { createClient as createRedisClient } from 'redis';\nimport { Pool } from 'pg';\nimport * as zlib from 'zlib';\nimport { promisify } from 'util';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Logger } from '../monitoring/logger.js';\nimport type { Frame, Event, Anchor } from '../context/index.js';\n\n// LZ4 would be installed separately: npm install lz4\n// For now we'll use a placeholder\nconst lz4 = {\n encode: (data: Buffer) => data, // Placeholder\n decode: (data: Buffer) => data, // Placeholder\n};\n\nconst gzip = promisify(zlib.gzip);\nconst gunzip = promisify(zlib.gunzip);\n\nexport enum StorageTier {\n YOUNG = 'young', // < 1 day, in RAM\n MATURE = 'mature', // 1-7 days, LZ4\n OLD = 'old', // 7-30 days, ZSTD\n REMOTE = 'remote', // > 30 days, S3\n}\n\nexport interface TierConfig {\n name: StorageTier;\n maxAgeHours: number;\n compressionType: 'none' | 'lz4' | 'zstd' | 'gzip';\n retentionPolicy: 'complete' | 'selective' | 'critical';\n maxSizeMB: number;\n}\n\nexport interface MigrationTrigger {\n type: 'age' | 'size' | 'importance';\n threshold: number;\n action: 'migrate' | 'compress' | 'delete';\n}\n\nexport interface OfflineQueueItem {\n id: string;\n data: any;\n priority: 'high' | 'normal';\n timestamp: number;\n}\n\nexport interface TwoTierConfig {\n local: {\n dbPath: string;\n maxSizeGB: number;\n tiers: TierConfig[];\n };\n remote: {\n redis?: {\n url: string;\n ttlSeconds: number;\n };\n timeseries?: {\n connectionString: string;\n };\n s3: {\n bucket: string;\n region: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n };\n };\n migration: {\n triggers: MigrationTrigger[];\n batchSize: number;\n intervalMs: number;\n offlineQueuePath?: string;\n };\n}\n\nexport interface StorageStats {\n localUsageMB: number;\n remoteUsageMB: number;\n tierDistribution: Record<StorageTier, number>;\n compressionRatio: number;\n migrationsPending: number;\n lastMigration: Date | null;\n}\n\nexport class TwoTierStorageSystem {\n private db: Database.Database;\n private redisClient?: RedisClientType;\n private timeseriesPool?: Pool;\n private s3Client: S3Client;\n private logger: Logger;\n private config: TwoTierConfig;\n private migrationTimer?: NodeJS.Timeout;\n private offlineQueue: OfflineQueueItem[] = [];\n private stats: StorageStats;\n\n constructor(config: TwoTierConfig) {\n this.config = config;\n this.logger = new Logger('TwoTierStorage');\n\n // Initialize local SQLite\n this.db = new Database(config.local.dbPath);\n this.initializeLocalStorage();\n\n // Initialize S3 client\n this.s3Client = new S3Client({\n region: config.remote.s3.region,\n credentials:\n config.remote.s3.accessKeyId && config.remote.s3.secretAccessKey\n ? {\n accessKeyId: config.remote.s3.accessKeyId,\n secretAccessKey: config.remote.s3.secretAccessKey,\n }\n : undefined,\n });\n\n // Initialize stats\n this.stats = {\n localUsageMB: 0,\n remoteUsageMB: 0,\n tierDistribution: {\n [StorageTier.YOUNG]: 0,\n [StorageTier.MATURE]: 0,\n [StorageTier.OLD]: 0,\n [StorageTier.REMOTE]: 0,\n },\n compressionRatio: 1.0,\n migrationsPending: 0,\n lastMigration: null,\n };\n }\n\n private initializeLocalStorage(): void {\n // Enable WAL mode for better concurrency\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('synchronous = NORMAL');\n\n // Create storage tables with tier information\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS storage_items (\n id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n tier TEXT NOT NULL,\n data BLOB NOT NULL,\n metadata TEXT,\n size_bytes INTEGER,\n importance_score REAL DEFAULT 0.5,\n access_count INTEGER DEFAULT 0,\n last_accessed DATETIME DEFAULT CURRENT_TIMESTAMP,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n compressed BOOLEAN DEFAULT FALSE,\n compression_type TEXT\n );\n \n CREATE INDEX IF NOT EXISTS idx_tier_age ON storage_items (tier, created_at);\n CREATE INDEX IF NOT EXISTS idx_frame ON storage_items (frame_id);\n CREATE INDEX IF NOT EXISTS idx_importance ON storage_items (importance_score DESC);\n \n CREATE TABLE IF NOT EXISTS migration_queue (\n id TEXT PRIMARY KEY,\n item_id TEXT NOT NULL,\n source_tier TEXT NOT NULL,\n target_tier TEXT NOT NULL,\n priority INTEGER DEFAULT 5,\n attempts INTEGER DEFAULT 0,\n status TEXT DEFAULT 'pending',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n );\n \n CREATE INDEX IF NOT EXISTS idx_status_priority ON migration_queue (status, priority DESC);\n \n CREATE TABLE IF NOT EXISTS storage_metrics (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n tier TEXT NOT NULL,\n item_count INTEGER,\n total_size_mb REAL,\n avg_compression_ratio REAL,\n measured_at DATETIME DEFAULT CURRENT_TIMESTAMP\n );\n `);\n }\n\n async initialize(): Promise<void> {\n try {\n // Initialize Redis for hot cache\n if (this.config.remote.redis?.url) {\n this.redisClient = createRedisClient({\n url: this.config.remote.redis.url,\n });\n await this.redisClient.connect();\n this.logger.info('Redis connected for hot cache');\n }\n\n // Initialize TimeSeries DB\n if (this.config.remote.timeseries?.connectionString) {\n this.timeseriesPool = new Pool({\n connectionString: this.config.remote.timeseries.connectionString,\n max: 5,\n });\n await this.initializeTimeseriesSchema();\n this.logger.info('TimeSeries DB connected');\n }\n\n // Start migration worker\n this.startMigrationWorker();\n\n // Load offline queue if exists\n await this.loadOfflineQueue();\n\n // Calculate initial stats\n await this.updateStats();\n\n this.logger.info('Two-tier storage system initialized');\n } catch (error) {\n this.logger.error('Failed to initialize storage', { error });\n throw error;\n }\n }\n\n private async initializeTimeseriesSchema(): Promise<void> {\n if (!this.timeseriesPool) return;\n\n const client = await this.timeseriesPool.connect();\n try {\n await client.query(`\n CREATE TABLE IF NOT EXISTS frame_timeseries (\n time TIMESTAMPTZ NOT NULL,\n frame_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n data JSONB,\n metrics JSONB,\n importance_score REAL\n );\n \n SELECT create_hypertable('frame_timeseries', 'time', \n chunk_time_interval => INTERVAL '1 month',\n if_not_exists => TRUE\n );\n \n CREATE INDEX IF NOT EXISTS idx_frame_time \n ON frame_timeseries (frame_id, time DESC);\n `);\n } finally {\n client.release();\n }\n }\n\n /**\n * Store a frame with automatic tier selection\n */\n async storeFrame(\n frame: Frame,\n events: Event[],\n anchors: Anchor[]\n ): Promise<string> {\n const storageId = uuidv4();\n const data = { frame, events, anchors };\n const tier = this.selectTier(frame);\n\n // Calculate importance score\n const importanceScore = this.calculateImportance(frame, events, anchors);\n\n // Compress based on tier\n const compressed = await this.compressData(data, tier);\n\n // Store locally first\n const stmt = this.db.prepare(`\n INSERT INTO storage_items (\n id, frame_id, tier, data, metadata, size_bytes, \n importance_score, compressed, compression_type\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n storageId,\n frame.frame_id,\n tier,\n compressed.data,\n JSON.stringify({\n originalSize: compressed.originalSize,\n compressedSize: compressed.compressedSize,\n }),\n compressed.compressedSize,\n importanceScore,\n compressed.compressed ? 1 : 0,\n compressed.compressionType\n );\n\n // Also store in Redis if young and available\n if (tier === StorageTier.YOUNG && this.redisClient) {\n await this.redisClient.setex(\n `frame:${frame.frame_id}`,\n this.config.remote.redis?.ttlSeconds || 300,\n JSON.stringify(data)\n );\n }\n\n // Queue for remote upload if important\n if (importanceScore > 0.7) {\n await this.queueRemoteUpload(storageId, data, 'high');\n }\n\n return storageId;\n }\n\n /**\n * Retrieve a frame from any tier\n */\n async retrieveFrame(frameId: string): Promise<any> {\n // Check Redis first\n if (this.redisClient) {\n try {\n const cached = await this.redisClient.get(`frame:${frameId}`);\n if (cached) {\n this.updateAccessCount(frameId);\n return JSON.parse(cached);\n }\n } catch (error) {\n this.logger.warn('Redis retrieval failed', { frameId, error });\n }\n }\n\n // Check local storage\n const local = this.db\n .prepare(\n `\n SELECT data, compressed, compression_type \n FROM storage_items \n WHERE frame_id = ?\n ORDER BY created_at DESC\n LIMIT 1\n `\n )\n .get(frameId);\n\n if (local) {\n this.updateAccessCount(frameId);\n const data = local.compressed\n ? await this.decompressData(local.data, local.compression_type)\n : JSON.parse(local.data);\n\n // Promote to Redis if frequently accessed\n if (this.redisClient) {\n await this.redisClient.setex(\n `frame:${frameId}`,\n 300, // 5 minute cache\n JSON.stringify(data)\n );\n }\n\n return data;\n }\n\n // Check remote storage\n return this.retrieveFromRemote(frameId);\n }\n\n /**\n * Select appropriate tier based on frame age and characteristics\n */\n private selectTier(frame: Frame): StorageTier {\n if (!frame.created_at || isNaN(frame.created_at)) {\n this.logger.warn('Invalid frame timestamp, defaulting to YOUNG tier');\n return StorageTier.YOUNG;\n }\n\n const ageHours = (Date.now() - frame.created_at) / (1000 * 60 * 60);\n\n if (ageHours < 24) return StorageTier.YOUNG;\n if (ageHours < 168) return StorageTier.MATURE; // 7 days\n if (ageHours < 720) return StorageTier.OLD; // 30 days\n return StorageTier.REMOTE;\n }\n\n /**\n * Calculate importance score for migration decisions\n */\n private calculateImportance(\n frame: Frame,\n events: Event[],\n anchors: Anchor[]\n ): number {\n let score = 0.5; // Base score\n\n // Increase for frames with decisions\n const decisions = anchors.filter((a) => a.type === 'DECISION');\n score += decisions.length * 0.1;\n\n // Increase for frames with many events\n score += Math.min(events.length * 0.01, 0.2);\n\n // Increase for recent frames\n const ageHours = (Date.now() - frame.created_at) / (1000 * 60 * 60);\n if (ageHours < 24) score += 0.2;\n else if (ageHours < 168) score += 0.1;\n\n // Increase for frames with errors\n const errors = events.filter((e) => e.event_type === 'error');\n if (errors.length > 0) score += 0.2;\n\n return Math.min(score, 1.0);\n }\n\n /**\n * Compress data based on tier configuration\n */\n private async compressData(data: any, tier: StorageTier): Promise<any> {\n const json = JSON.stringify(data);\n const originalSize = Buffer.byteLength(json);\n\n const tierConfig = this.config.local.tiers.find((t) => t.name === tier);\n if (!tierConfig || tierConfig.compressionType === 'none') {\n return {\n data: Buffer.from(json),\n originalSize,\n compressedSize: originalSize,\n compressed: false,\n compressionType: 'none',\n };\n }\n\n let compressed: Buffer;\n switch (tierConfig.compressionType) {\n case 'lz4':\n compressed = lz4.encode(Buffer.from(json));\n break;\n case 'zstd':\n // For ZSTD, we'll use gzip as a placeholder (install zstd-codec for real impl)\n compressed = await gzip(json, { level: 9 });\n break;\n case 'gzip':\n compressed = await gzip(json);\n break;\n default:\n compressed = Buffer.from(json);\n }\n\n return {\n data: compressed,\n originalSize,\n compressedSize: compressed.length,\n compressed: true,\n compressionType: tierConfig.compressionType,\n };\n }\n\n /**\n * Decompress data\n */\n private async decompressData(\n data: Buffer,\n compressionType: string\n ): Promise<any> {\n let decompressed: Buffer;\n\n switch (compressionType) {\n case 'lz4':\n decompressed = lz4.decode(data);\n break;\n case 'zstd':\n case 'gzip':\n decompressed = await gunzip(data);\n break;\n default:\n decompressed = data;\n }\n\n return JSON.parse(decompressed.toString());\n }\n\n /**\n * Start background migration worker\n */\n private startMigrationWorker(): void {\n this.migrationTimer = setInterval(async () => {\n try {\n await this.processMigrations();\n await this.checkMigrationTriggers();\n await this.processOfflineQueue();\n } catch (error) {\n this.logger.error('Migration worker error', { error });\n }\n }, this.config.migration.intervalMs);\n\n this.logger.info('Migration worker started');\n }\n\n /**\n * Process pending migrations\n */\n private async processMigrations(): Promise<void> {\n const pending = this.db\n .prepare(\n `\n SELECT * FROM migration_queue \n WHERE status = 'pending' \n ORDER BY priority DESC, created_at ASC \n LIMIT ?\n `\n )\n .all(this.config.migration.batchSize);\n\n for (const migration of pending) {\n try {\n await this.executeMigration(migration);\n\n // Mark as completed\n this.db\n .prepare(\n `\n UPDATE migration_queue \n SET status = 'completed' \n WHERE id = ?\n `\n )\n .run(migration.id);\n } catch (error) {\n this.logger.error('Migration failed', { migration, error });\n\n // Update attempts\n this.db\n .prepare(\n `\n UPDATE migration_queue \n SET attempts = attempts + 1,\n status = CASE WHEN attempts >= 3 THEN 'failed' ELSE 'pending' END\n WHERE id = ?\n `\n )\n .run(migration.id);\n }\n }\n\n this.stats.lastMigration = new Date();\n }\n\n /**\n * Check and trigger migrations based on rules\n */\n private async checkMigrationTriggers(): Promise<void> {\n // Check age-based triggers\n for (const trigger of this.config.migration.triggers) {\n if (trigger.type === 'age') {\n const items = this.db\n .prepare(\n `\n SELECT id, frame_id, tier \n FROM storage_items \n WHERE julianday('now') - julianday(created_at) > ?\n AND tier != ?\n LIMIT 100\n `\n )\n .all(trigger.threshold / 24, StorageTier.REMOTE);\n\n for (const item of items) {\n this.queueMigration(item.id, item.tier, StorageTier.REMOTE);\n }\n }\n\n // Check size-based triggers\n if (trigger.type === 'size') {\n const stats = this.db\n .prepare(\n `\n SELECT SUM(size_bytes) as total_size \n FROM storage_items \n WHERE tier IN ('young', 'mature')\n `\n )\n .get();\n\n if (stats.total_size > trigger.threshold * 1024 * 1024) {\n // Migrate oldest items\n const items = this.db\n .prepare(\n `\n SELECT id, tier FROM storage_items \n WHERE tier IN ('young', 'mature')\n ORDER BY created_at ASC \n LIMIT 50\n `\n )\n .all();\n\n for (const item of items) {\n const targetTier =\n item.tier === StorageTier.YOUNG\n ? StorageTier.MATURE\n : StorageTier.OLD;\n this.queueMigration(item.id, item.tier, targetTier);\n }\n }\n }\n }\n }\n\n /**\n * Queue a migration\n */\n private queueMigration(\n itemId: string,\n sourceTier: string,\n targetTier: string,\n priority: number = 5\n ): void {\n const id = uuidv4();\n this.db\n .prepare(\n `\n INSERT INTO migration_queue (id, item_id, source_tier, target_tier, priority)\n VALUES (?, ?, ?, ?, ?)\n `\n )\n .run(id, itemId, sourceTier, targetTier, priority);\n\n this.stats.migrationsPending++;\n }\n\n /**\n * Execute a single migration\n */\n private async executeMigration(migration: any): Promise<void> {\n // Get item data\n const item = this.db\n .prepare(\n `\n SELECT * FROM storage_items WHERE id = ?\n `\n )\n .get(migration.item_id);\n\n if (!item) {\n throw new Error(`Item not found: ${migration.item_id}`);\n }\n\n // Decompress if needed\n const data = item.compressed\n ? await this.decompressData(item.data, item.compression_type)\n : JSON.parse(item.data);\n\n // Upload to remote\n if (migration.target_tier === StorageTier.REMOTE) {\n await this.uploadToS3(item.frame_id, data);\n\n // Delete from local after successful upload\n this.db\n .prepare(\n `\n DELETE FROM storage_items WHERE id = ?\n `\n )\n .run(migration.item_id);\n } else {\n // Re-compress for new tier\n const compressed = await this.compressData(data, migration.target_tier);\n\n // Update local storage\n this.db\n .prepare(\n `\n UPDATE storage_items \n SET tier = ?, data = ?, size_bytes = ?, \n compressed = ?, compression_type = ?\n WHERE id = ?\n `\n )\n .run(\n migration.target_tier,\n compressed.data,\n compressed.compressedSize,\n compressed.compressed ? 1 : 0,\n compressed.compressionType,\n migration.item_id\n );\n }\n\n this.logger.info('Migration completed', {\n itemId: migration.item_id,\n from: migration.source_tier,\n to: migration.target_tier,\n });\n }\n\n /**\n * Upload data to S3\n */\n private async uploadToS3(frameId: string, data: any): Promise<void> {\n const date = new Date();\n const partition = `${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}`;\n const key = `frames/${partition}/${frameId}.json.gz`;\n\n const compressed = await gzip(JSON.stringify(data));\n\n const command = new PutObjectCommand({\n Bucket: this.config.remote.s3.bucket,\n Key: key,\n Body: compressed,\n ContentType: 'application/json',\n ContentEncoding: 'gzip',\n Metadata: {\n frameId,\n uploadedAt: date.toISOString(),\n },\n });\n\n await this.s3Client.send(command);\n }\n\n /**\n * Retrieve from remote storage\n */\n private async retrieveFromRemote(frameId: string): Promise<any> {\n // Try TimeSeries DB first\n if (this.timeseriesPool) {\n const client = await this.timeseriesPool.connect();\n try {\n const result = await client.query(\n `\n SELECT data FROM frame_timeseries \n WHERE frame_id = $1 \n ORDER BY time DESC \n LIMIT 1\n `,\n [frameId]\n );\n\n if (result.rows.length > 0) {\n return result.rows[0].data;\n }\n } finally {\n client.release();\n }\n }\n\n // Try S3\n // Would need to search multiple partitions - simplified for now\n const date = new Date();\n for (let i = 0; i < 3; i++) {\n const checkDate = new Date(date);\n checkDate.setMonth(checkDate.getMonth() - i);\n const partition = `${checkDate.getFullYear()}/${String(checkDate.getMonth() + 1).padStart(2, '0')}`;\n const key = `frames/${partition}/${frameId}.json.gz`;\n\n try {\n const command = new GetObjectCommand({\n Bucket: this.config.remote.s3.bucket,\n Key: key,\n });\n\n const response = await this.s3Client.send(command);\n if (!response.Body) continue;\n const body = await response.Body.transformToByteArray();\n const decompressed = await gunzip(Buffer.from(body));\n return JSON.parse(decompressed.toString());\n } catch {\n // Continue searching - frame not in this partition\n }\n }\n\n return null;\n }\n\n /**\n * Queue for offline upload\n */\n private async queueRemoteUpload(\n id: string,\n data: any,\n priority: 'high' | 'normal'\n ): Promise<void> {\n this.offlineQueue.push({ \n id, \n data, \n priority, \n timestamp: Date.now() \n });\n\n // Persist queue if configured\n if (this.config.migration.offlineQueuePath) {\n await this.saveOfflineQueue();\n }\n }\n\n /**\n * Process offline upload queue\n */\n private async processOfflineQueue(): Promise<void> {\n if (this.offlineQueue.length === 0) return;\n\n // Check if online\n const isOnline = await this.checkConnectivity();\n if (!isOnline) return;\n\n // Process high priority first\n this.offlineQueue.sort((a, b) => {\n if (a.priority !== b.priority) {\n return a.priority === 'high' ? -1 : 1;\n }\n return a.timestamp - b.timestamp;\n });\n\n const batch = this.offlineQueue.splice(0, 10);\n for (const item of batch) {\n try {\n await this.uploadToS3(item.id, item.data);\n } catch {\n // Re-queue on failure\n this.offlineQueue.push(item);\n }\n }\n\n await this.saveOfflineQueue();\n }\n\n /**\n * Check connectivity to remote services\n */\n private async checkConnectivity(): Promise<boolean> {\n try {\n // Simple S3 head bucket check\n const response = await fetch('https://s3.amazonaws.com');\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Update access count for cache promotion\n */\n private updateAccessCount(frameId: string): void {\n this.db\n .prepare(\n `\n UPDATE storage_items \n SET access_count = access_count + 1,\n last_accessed = CURRENT_TIMESTAMP\n WHERE frame_id = ?\n `\n )\n .run(frameId);\n }\n\n /**\n * Save offline queue to disk\n */\n private async saveOfflineQueue(): Promise<void> {\n if (!this.config.migration.offlineQueuePath) return;\n\n const fs = await import('fs/promises');\n await fs.writeFile(\n this.config.migration.offlineQueuePath,\n JSON.stringify(this.offlineQueue),\n 'utf-8'\n );\n }\n\n /**\n * Load offline queue from disk\n */\n private async loadOfflineQueue(): Promise<void> {\n if (!this.config.migration.offlineQueuePath) return;\n\n const fs = await import('fs/promises');\n try {\n const data = await fs.readFile(\n this.config.migration.offlineQueuePath,\n 'utf-8'\n );\n this.offlineQueue = JSON.parse(data);\n this.logger.info(\n `Loaded ${this.offlineQueue.length} items from offline queue`\n );\n } catch {\n // Queue file doesn't exist yet - this is normal on first run\n }\n }\n\n /**\n * Update storage statistics\n */\n private async updateStats(): Promise<void> {\n // Calculate local usage\n const localStats = this.db\n .prepare(\n `\n SELECT \n tier,\n COUNT(*) as count,\n SUM(size_bytes) / 1048576.0 as size_mb\n FROM storage_items\n GROUP BY tier\n `\n )\n .all();\n\n this.stats.localUsageMB = 0;\n for (const stat of localStats) {\n this.stats.tierDistribution[stat.tier as StorageTier] = stat.count;\n this.stats.localUsageMB += stat.size_mb;\n }\n\n // Calculate compression ratio\n const compressionStats = this.db\n .prepare(\n `\n SELECT \n AVG(CAST(json_extract(metadata, '$.originalSize') AS REAL) / \n CAST(json_extract(metadata, '$.compressedSize') AS REAL)) as ratio\n FROM storage_items\n WHERE compressed = 1\n `\n )\n .get();\n\n this.stats.compressionRatio = compressionStats?.ratio || 1.0;\n\n // Count pending migrations\n const pending = this.db\n .prepare(\n `\n SELECT COUNT(*) as count \n FROM migration_queue \n WHERE status = 'pending'\n `\n )\n .get();\n\n this.stats.migrationsPending = pending.count;\n\n // Save metrics\n this.db\n .prepare(\n `\n INSERT INTO storage_metrics (tier, item_count, total_size_mb, avg_compression_ratio)\n VALUES ('all', ?, ?, ?)\n `\n )\n .run(\n Object.values(this.stats.tierDistribution).reduce((a, b) => a + b, 0),\n this.stats.localUsageMB,\n this.stats.compressionRatio\n );\n }\n\n /**\n * Get current storage statistics\n */\n async getStats(): Promise<StorageStats> {\n await this.updateStats();\n return { ...this.stats };\n }\n\n /**\n * Cleanup and shutdown\n */\n async shutdown(): Promise<void> {\n if (this.migrationTimer) {\n clearInterval(this.migrationTimer);\n }\n\n await this.saveOfflineQueue();\n\n if (this.redisClient) {\n await this.redisClient.quit();\n }\n\n if (this.timeseriesPool) {\n await this.timeseriesPool.end();\n }\n\n this.db.close();\n\n this.logger.info('Two-tier storage system shut down');\n }\n}\n\n// Export default configuration\nexport const defaultTwoTierConfig: TwoTierConfig = {\n local: {\n dbPath: '~/.stackmemory/two-tier.db',\n maxSizeGB: 2,\n tiers: [\n {\n name: StorageTier.YOUNG,\n maxAgeHours: 24,\n compressionType: 'none',\n retentionPolicy: 'complete',\n maxSizeMB: 500,\n },\n {\n name: StorageTier.MATURE,\n maxAgeHours: 168,\n compressionType: 'lz4',\n retentionPolicy: 'selective',\n maxSizeMB: 1000,\n },\n {\n name: StorageTier.OLD,\n maxAgeHours: 720,\n compressionType: 'zstd',\n retentionPolicy: 'critical',\n maxSizeMB: 500,\n },\n ],\n },\n remote: {\n s3: {\n bucket: process.env.S3_BUCKET || 'stackmemory-storage',\n region: process.env.AWS_REGION || 'us-east-1',\n },\n },\n migration: {\n triggers: [\n { type: 'age', threshold: 720, action: 'migrate' }, // 30 days\n { type: 'size', threshold: 1500, action: 'migrate' }, // 1.5GB\n { type: 'importance', threshold: 0.3, action: 'delete' }, // Low importance\n ],\n batchSize: 50,\n intervalMs: 60000, // 1 minute\n offlineQueuePath: '~/.stackmemory/offline-queue.json',\n },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["StorageTier"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/trace/cli-trace-wrapper.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * CLI Command Trace Wrapper\n * Automatically wraps Commander.js commands with comprehensive tracing\n */\n\nimport { Command } from 'commander';\nimport { trace } from './debug-trace.js';\nimport { logger } from '../monitoring/logger.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport function wrapCommand(command: Command): Command {\n const originalAction = command.action.bind(command);\n\n command.action(async function (...args: any[]): Promise<void> {\n // Extract command path and options\n const commandPath = getCommandPath(command);\n const options = args[args.length - 1];\n const commandArgs = args.slice(0, -1);\n\n // Build comprehensive context\n const context = {\n command: commandPath,\n args: commandArgs,\n options: typeof options === 'object' ? options : {},\n cwd: process.cwd(),\n env: {\n NODE_ENV: process.env['NODE_ENV'],\n DEBUG_TRACE: process.env['DEBUG_TRACE'],\n LINEAR_API_KEY: process.env['LINEAR_API_KEY'] ? '[SET]' : '[NOT SET]',\n },\n timestamp: new Date().toISOString(),\n };\n\n // Log command start\n logger.info(`CLI Command: ${commandPath}`, context);\n\n // Wrap the actual action with tracing\n await trace.command(commandPath, context, async () => {\n try {\n // Call the original action with wrapped handler\n const result = await originalAction.apply(null, args as any);\n\n // Log successful completion\n logger.info(`CLI Command Completed: ${commandPath}`, {\n duration: trace\n .exportTraces()\n .find((t: any) => t.name === commandPath)?.duration,\n });\n\n // Show execution summary if verbose\n if (process.env['DEBUG_TRACE'] === 'true') {\n console.log(trace.getExecutionSummary());\n }\n } catch (error: unknown) {\n // Enhanced error logging for CLI commands\n logger.error(\n `CLI Command Failed: ${commandPath}`,\n error as Error,\n context\n );\n\n // Get the last error trace for debugging\n const lastError = trace.getLastError();\n if (lastError) {\n console.error('\\n\uD83D\uDCCD Error occurred at:');\n console.error(` ${lastError.name}`);\n if (lastError.params) {\n console.error(\n ' With params:',\n JSON.stringify(lastError.params, null, 2)\n );\n }\n console.error(' Error details:', lastError.error);\n }\n\n // Re-throw to maintain original error handling\n throw error;\n }\n });\n });\n\n // Recursively wrap subcommands\n command.commands.forEach((subcommand) => {\n wrapCommand(subcommand);\n });\n\n return command;\n}\n\nfunction getCommandPath(command: Command): string {\n const parts: string[] = [];\n let current: Command | null = command;\n\n while (current) {\n if (current.name()) {\n parts.unshift(current.name());\n }\n current = current.parent as Command | null;\n }\n\n return parts.join(' ');\n}\n\n/**\n * Wrap the main program with comprehensive tracing\n */\nexport function wrapProgram(program: Command): Command {\n // Add global error handler with tracing\n program.exitOverride((err) => {\n if (err.code === 'commander.help' || err.code === 'commander.version') {\n // Normal help/version display, not an error\n process.exit(0);\n }\n\n // Log the error with full context\n logger.error('CLI Error', err, {\n code: err.code,\n exitCode: err.exitCode,\n command: process.argv.slice(2).join(' '),\n });\n\n // Show trace summary on error\n if (process.env['DEBUG_TRACE'] === 'true') {\n console.error('\\n' + trace.getExecutionSummary());\n }\n\n process.exit(err.exitCode || 1);\n });\n\n // Add pre-action hook for setup\n program.hook('preAction', (thisCommand) => {\n // Initialize trace context for this command\n trace.reset();\n\n // Log command invocation\n const commandPath = getCommandPath(thisCommand);\n logger.debug(`Preparing to execute: ${commandPath}`, {\n args: thisCommand.args,\n opts: thisCommand.opts(),\n });\n });\n\n // Add post-action hook for cleanup\n program.hook('postAction', (thisCommand) => {\n // Log completion\n const commandPath = getCommandPath(thisCommand);\n logger.debug(`Completed execution: ${commandPath}`);\n });\n\n // Wrap all existing commands\n program.commands.forEach((command) => {\n wrapCommand(command);\n });\n\n return program;\n}\n\n/**\n * Helper to wrap async functions with step tracing\n */\nexport function traceStep<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return trace.step(name, fn);\n}\n\n/**\n * Helper to wrap database queries\n */\nexport function traceQuery<T>(sql: string, params: any, fn: () => T): T {\n return trace.traceSync('query', sql.substring(0, 100), params, fn);\n}\n\n/**\n * Helper to wrap API calls\n */\nexport function traceAPI<T>(\n method: string,\n url: string,\n body: any,\n fn: () => Promise<T>\n): Promise<T> {\n return trace.api(method, url, body, fn);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/trace/db-trace-wrapper.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Database Operations Trace Wrapper\n * Wraps SQLite operations with comprehensive tracing for debugging\n */\n\nimport Database from 'better-sqlite3';\nimport { trace } from './debug-trace.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface TracedDatabaseOptions extends Database.Options {\n traceEnabled?: boolean;\n slowQueryThreshold?: number;\n}\n\n/**\n * Create a traced database instance\n */\nexport function createTracedDatabase(\n filename: string,\n options?: TracedDatabaseOptions\n): Database.Database {\n const db = new Database(filename, options);\n\n if (options?.traceEnabled !== false) {\n return wrapDatabase(db, options?.slowQueryThreshold);\n }\n\n return db;\n}\n\n/**\n * Wrap an existing database with tracing\n */\nexport function wrapDatabase(\n db: Database.Database,\n slowQueryThreshold = 100\n): Database.Database {\n // Wrap prepare method to trace all queries\n const originalPrepare = db.prepare.bind(db);\n\n db.prepare = function (source: string) {\n const statement = originalPrepare(source);\n return wrapStatement(statement, source, slowQueryThreshold);\n } as typeof db.prepare;\n\n // Wrap exec for direct SQL execution\n const originalExec = db.exec.bind(db);\n\n db.exec = function (source: string): Database.Database {\n return trace.traceSync(\n 'query',\n `EXEC: ${source.substring(0, 50)}...`,\n {},\n () => {\n const startTime = performance.now();\n const result = originalExec(source);\n const duration = performance.now() - startTime;\n\n if (duration > slowQueryThreshold) {\n logger.warn(`Slow query detected: ${duration.toFixed(0)}ms`, {\n query: source.substring(0, 200),\n duration,\n });\n }\n\n return result;\n }\n );\n };\n\n // Wrap transaction for transaction tracking\n const originalTransaction = db.transaction.bind(db);\n\n db.transaction = function (fn: any) {\n return originalTransaction(function (this: any, ...args: any[]) {\n return trace.traceSync(\n 'query',\n 'TRANSACTION',\n { args: args.length },\n () => {\n return fn.apply(this, args);\n }\n );\n });\n } as typeof db.transaction;\n\n // Add query statistics tracking\n (db as any).__queryStats = {\n totalQueries: 0,\n slowQueries: 0,\n totalDuration: 0,\n queryTypes: {} as Record<string, number>,\n };\n\n return db;\n}\n\n/**\n * Wrap a statement with tracing\n */\nfunction wrapStatement<T extends any[] = any[]>(\n statement: Database.Statement<T>,\n source: string,\n slowQueryThreshold: number\n): Database.Statement<T> {\n const queryType = source.trim().split(/\\s+/)[0].toUpperCase();\n const shortQuery = source.substring(0, 100).replace(/\\s+/g, ' ');\n\n // Wrap run method\n const originalRun = statement.run.bind(statement);\n statement.run = function (...params: T): Database.RunResult {\n return trace.traceSync(\n 'query',\n `${queryType}: ${shortQuery}`,\n params,\n () => {\n const startTime = performance.now();\n const result = originalRun(...params);\n const duration = performance.now() - startTime;\n\n // Track statistics\n updateQueryStats(statement, queryType, duration, slowQueryThreshold);\n\n // Log slow queries\n if (duration > slowQueryThreshold) {\n logger.warn(`Slow ${queryType} query: ${duration.toFixed(0)}ms`, {\n query: shortQuery,\n params,\n duration,\n changes: result.changes,\n });\n }\n\n return result;\n }\n );\n };\n\n // Wrap get method\n const originalGet = statement.get.bind(statement);\n statement.get = function (...params: T): any {\n return trace.traceSync(\n 'query',\n `${queryType} (get): ${shortQuery}`,\n params,\n () => {\n const startTime = performance.now();\n const result = originalGet(...params);\n const duration = performance.now() - startTime;\n\n updateQueryStats(statement, queryType, duration, slowQueryThreshold);\n\n if (duration > slowQueryThreshold) {\n logger.warn(`Slow ${queryType} query: ${duration.toFixed(0)}ms`, {\n query: shortQuery,\n params,\n duration,\n found: result != null,\n });\n }\n\n return result;\n }\n );\n };\n\n // Wrap all method\n const originalAll = statement.all.bind(statement);\n statement.all = function (...params: T): any[] {\n return trace.traceSync(\n 'query',\n `${queryType} (all): ${shortQuery}`,\n params,\n () => {\n const startTime = performance.now();\n const result = originalAll(...params);\n const duration = performance.now() - startTime;\n\n updateQueryStats(statement, queryType, duration, slowQueryThreshold);\n\n if (duration > slowQueryThreshold) {\n logger.warn(`Slow ${queryType} query: ${duration.toFixed(0)}ms`, {\n query: shortQuery,\n params,\n duration,\n rows: result.length,\n });\n }\n\n // Warn about potential N+1 queries\n if (result.length > 100 && queryType === 'SELECT') {\n logger.warn(`Large result set: ${result.length} rows`, {\n query: shortQuery,\n suggestion: 'Consider pagination or more specific queries',\n });\n }\n\n return result;\n }\n );\n };\n\n // Wrap iterate method for cursor operations\n const originalIterate = statement.iterate.bind(statement);\n statement.iterate = function (...params: T): IterableIterator<any> {\n const startTime = performance.now();\n let rowCount = 0;\n\n const iterator = originalIterate(...params);\n const wrappedIterator: IterableIterator<any> = {\n [Symbol.iterator]() {\n return this;\n },\n next() {\n const result = iterator.next();\n if (!result.done) {\n rowCount++;\n } else {\n const duration = performance.now() - startTime;\n updateQueryStats(statement, queryType, duration, slowQueryThreshold);\n\n if (duration > slowQueryThreshold) {\n logger.warn(\n `Slow ${queryType} iteration: ${duration.toFixed(0)}ms`,\n {\n query: shortQuery,\n params,\n duration,\n rows: rowCount,\n }\n );\n }\n }\n return result;\n },\n };\n\n return wrappedIterator;\n };\n\n return statement;\n}\n\n/**\n * Update query statistics\n */\nfunction updateQueryStats(\n statement: Database.Statement,\n queryType: string,\n duration: number,\n slowQueryThreshold: number\n): void {\n const db = statement.database as any;\n if (db.__queryStats) {\n db.__queryStats.totalQueries++;\n db.__queryStats.totalDuration += duration;\n\n if (duration > slowQueryThreshold) {\n db.__queryStats.slowQueries++;\n }\n\n if (!db.__queryStats.queryTypes[queryType]) {\n db.__queryStats.queryTypes[queryType] = 0;\n }\n db.__queryStats.queryTypes[queryType]++;\n }\n}\n\n/**\n * Get query statistics from a traced database\n */\nexport function getQueryStatistics(db: Database.Database): {\n totalQueries: number;\n slowQueries: number;\n averageDuration: number;\n totalDuration: number;\n queryTypes: Record<string, number>;\n} | null {\n const stats = (db as any).__queryStats;\n if (!stats) return null;\n\n return {\n ...stats,\n averageDuration:\n stats.totalQueries > 0 ? stats.totalDuration / stats.totalQueries : 0,\n };\n}\n\n/**\n * Helper to trace a specific query with context\n */\nexport async function traceQuery<T>(\n db: Database.Database,\n queryName: string,\n query: string,\n params: any[],\n fn: () => T\n): Promise<T> {\n return trace.traceAsync('query', queryName, { query, params }, async () => {\n try {\n const result = fn();\n\n // Log successful complex queries for debugging\n if (query.includes('JOIN') || query.includes('GROUP BY')) {\n logger.debug(`Complex query executed: ${queryName}`, {\n query: query.substring(0, 200),\n params,\n });\n }\n\n return result;\n } catch (error: unknown) {\n // Enhanced error logging for database errors\n logger.error(`Database query failed: ${queryName}`, error as Error, {\n query,\n params,\n errorCode: (error as any).code,\n });\n throw error;\n }\n });\n}\n\n/**\n * Create a traced transaction with automatic rollback on error\n */\nexport function createTracedTransaction<T>(\n db: Database.Database,\n name: string,\n fn: (tx: Database.Transaction<(args: any) => T>) => T\n): T {\n return trace.traceSync('query', `TRANSACTION: ${name}`, {}, () => {\n const startTime = performance.now();\n\n try {\n const tx = db.transaction(fn);\n const result = (tx as any).deferred();\n\n const duration = performance.now() - startTime;\n logger.info(`Transaction completed: ${name}`, {\n duration,\n success: true,\n });\n\n return result;\n } catch (error: unknown) {\n const duration = performance.now() - startTime;\n logger.error(`Transaction failed: ${name}`, error as Error, {\n duration,\n success: false,\n });\n throw error;\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/trace/debug-trace.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Debug Trace Module - Comprehensive execution tracing for LLM debugging\n *\n * This module provides detailed execution tracing to help LLMs understand\n * exactly what happened during code execution, making debugging much easier.\n */\n\nimport { performance } from 'perf_hooks';\nimport { logger } from '../monitoring/logger.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { v4 as uuidv4 } from 'uuid';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport interface TraceConfig {\n enabled: boolean;\n verbosity: 'full' | 'errors' | 'summary';\n output: 'console' | 'file' | 'both';\n includeParams: boolean;\n includeResults: boolean;\n maskSensitive: boolean;\n performanceThreshold: number; // ms\n maxDepth: number;\n captureMemory: boolean;\n}\n\ninterface TraceEntry {\n id: string;\n parentId?: string;\n type: 'command' | 'function' | 'step' | 'query' | 'api' | 'error';\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n depth: number;\n params?: any;\n result?: any;\n error?: any;\n memory?: {\n before: NodeJS.MemoryUsage;\n after?: NodeJS.MemoryUsage;\n delta?: {\n rss: number;\n heapUsed: number;\n };\n };\n metadata?: Record<string, any>;\n children: TraceEntry[];\n}\n\nexport class TraceContext {\n private static instance: TraceContext;\n private config: TraceConfig;\n private currentTrace: TraceEntry | null = null;\n private traceStack: TraceEntry[] = [];\n private allTraces: TraceEntry[] = [];\n private outputFile?: string;\n private startTime: number = Date.now();\n private sensitivePatterns: RegExp[] = [\n /api[_-]?key/i,\n /token/i,\n /secret/i,\n /password/i,\n /bearer/i,\n /authorization/i,\n /client[_-]?id/i,\n /client[_-]?secret/i,\n ];\n\n private constructor() {\n this.config = this.loadConfig();\n if (this.config.output === 'file' || this.config.output === 'both') {\n this.initializeOutputFile();\n }\n }\n\n static getInstance(): TraceContext {\n if (!TraceContext.instance) {\n TraceContext.instance = new TraceContext();\n }\n return TraceContext.instance;\n }\n\n private loadConfig(): TraceConfig {\n return {\n enabled:\n process.env['DEBUG_TRACE'] === 'true' ||\n process.env['STACKMEMORY_DEBUG'] === 'true',\n verbosity: (process.env['TRACE_VERBOSITY'] as any) || 'full',\n output: (process.env['TRACE_OUTPUT'] as any) || 'console',\n includeParams: process.env['TRACE_PARAMS'] !== 'false',\n includeResults: process.env['TRACE_RESULTS'] !== 'false',\n maskSensitive: process.env['TRACE_MASK_SENSITIVE'] !== 'false',\n performanceThreshold: parseInt(\n process.env['TRACE_PERF_THRESHOLD'] || '100'\n ),\n maxDepth: parseInt(process.env['TRACE_MAX_DEPTH'] || '20'),\n captureMemory: process.env['TRACE_MEMORY'] === 'true',\n };\n }\n\n private initializeOutputFile(): void {\n const traceDir = path.join(\n process.env['HOME'] || '.',\n '.stackmemory',\n 'traces'\n );\n if (!fs.existsSync(traceDir)) {\n fs.mkdirSync(traceDir, { recursive: true });\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n this.outputFile = path.join(traceDir, `trace-${timestamp}.jsonl`);\n }\n\n private maskSensitiveData(obj: any): any {\n if (!this.config.maskSensitive) return obj;\n if (typeof obj !== 'object' || obj === null) return obj;\n\n const masked = Array.isArray(obj) ? [...obj] : { ...obj };\n\n for (const key in masked) {\n if (typeof key === 'string') {\n // Check if key matches sensitive patterns\n const isSensitive = this.sensitivePatterns.some((pattern) =>\n pattern.test(key)\n );\n if (isSensitive) {\n masked[key] = '[MASKED]';\n } else if (typeof masked[key] === 'object') {\n masked[key] = this.maskSensitiveData(masked[key]);\n } else if (typeof masked[key] === 'string' && masked[key].length > 20) {\n // Check if value looks like a token/key\n if (/^[a-zA-Z0-9_-]{20,}$/.test(masked[key])) {\n masked[key] = masked[key].substring(0, 8) + '...[MASKED]';\n }\n }\n }\n }\n\n return masked;\n }\n\n private captureMemory(): NodeJS.MemoryUsage | undefined {\n if (!this.config.captureMemory) return undefined;\n return process.memoryUsage();\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\n return `${(ms / 60000).toFixed(2)}m`;\n }\n\n private formatMemory(bytes: number): string {\n const mb = bytes / 1024 / 1024;\n return `${mb.toFixed(2)}MB`;\n }\n\n private getIndent(depth: number): string {\n return ' '.repeat(depth);\n }\n\n private formatTraceEntry(entry: TraceEntry, includeChildren = true): string {\n const indent = this.getIndent(entry.depth);\n const duration = entry.duration\n ? ` [${this.formatDuration(entry.duration)}]`\n : '';\n const memory = entry.memory?.delta\n ? ` (\u0394mem: ${this.formatMemory(entry.memory.delta.heapUsed)})`\n : '';\n\n let output = `${indent}\u2192 [${entry.type.toUpperCase()}:${entry.id.substring(0, 8)}] ${entry.name}${duration}${memory}`;\n\n if (entry.error) {\n output += `\\n${indent} \u2717 ERROR: ${entry.error.message || entry.error}`;\n if (entry.error.stack && this.config.verbosity === 'full') {\n output += `\\n${indent} Stack: ${entry.error.stack.split('\\n')[1]?.trim()}`;\n }\n }\n\n if (\n this.config.includeParams &&\n entry.params &&\n Object.keys(entry.params).length > 0\n ) {\n const maskedParams = this.maskSensitiveData(entry.params);\n output += `\\n${indent} \u25B8 Params: ${JSON.stringify(maskedParams, null, 2).replace(/\\n/g, '\\n' + indent + ' ')}`;\n }\n\n if (\n this.config.includeResults &&\n entry.result !== undefined &&\n !entry.error\n ) {\n const maskedResult = this.maskSensitiveData(entry.result);\n const resultStr = JSON.stringify(maskedResult, null, 2);\n if (resultStr.length < 200) {\n output += `\\n${indent} \u25C2 Result: ${resultStr.replace(/\\n/g, '\\n' + indent + ' ')}`;\n } else {\n output += `\\n${indent} \u25C2 Result: [${typeof maskedResult}] ${resultStr.substring(0, 100)}...`;\n }\n }\n\n if (entry.duration && entry.duration > this.config.performanceThreshold) {\n output += `\\n${indent} WARNING: Exceeded ${this.config.performanceThreshold}ms threshold`;\n }\n\n if (includeChildren && entry.children.length > 0) {\n for (const child of entry.children) {\n output += '\\n' + this.formatTraceEntry(child, true);\n }\n }\n\n if (entry.endTime && entry.depth > 0) {\n output += `\\n${indent}\u2190 [${entry.type.toUpperCase()}:${entry.id.substring(0, 8)}] completed`;\n }\n\n return output;\n }\n\n private outputTrace(entry: TraceEntry): void {\n if (!this.config.enabled) return;\n\n const formatted = this.formatTraceEntry(entry, false);\n\n if (this.config.output === 'console' || this.config.output === 'both') {\n console.log(formatted);\n }\n\n if (\n (this.config.output === 'file' || this.config.output === 'both') &&\n this.outputFile\n ) {\n const jsonLine =\n JSON.stringify({\n ...entry,\n formatted,\n timestamp: new Date().toISOString(),\n }) + '\\n';\n fs.appendFileSync(this.outputFile, jsonLine);\n }\n }\n\n startTrace(\n type: TraceEntry['type'],\n name: string,\n params?: any,\n metadata?: Record<string, any>\n ): string {\n if (!this.config.enabled) return '';\n\n const id = uuidv4();\n const parentId = this.currentTrace?.id;\n const depth = this.traceStack.length;\n\n if (depth > this.config.maxDepth) {\n return id; // Prevent infinite recursion\n }\n\n const entry: TraceEntry = {\n id,\n parentId,\n type,\n name,\n startTime: performance.now(),\n depth,\n params: this.config.includeParams ? params : undefined,\n metadata,\n children: [],\n memory: this.captureMemory()\n ? { before: this.captureMemory()! }\n : undefined,\n };\n\n if (this.currentTrace) {\n this.currentTrace.children.push(entry);\n } else {\n this.allTraces.push(entry);\n }\n\n this.traceStack.push(entry);\n this.currentTrace = entry;\n\n this.outputTrace(entry);\n\n return id;\n }\n\n endTrace(id: string, result?: any, error?: any): void {\n if (!this.config.enabled) return;\n\n const index = this.traceStack.findIndex((t) => t.id === id);\n if (index === -1) return;\n\n const entry = this.traceStack[index];\n entry.endTime = performance.now();\n entry.duration = entry.endTime - entry.startTime;\n entry.result = this.config.includeResults && !error ? result : undefined;\n entry.error = error;\n\n if (entry.memory?.before) {\n entry.memory.after = this.captureMemory();\n if (entry.memory.after) {\n entry.memory.delta = {\n rss: entry.memory.after.rss - entry.memory.before.rss,\n heapUsed: entry.memory.after.heapUsed - entry.memory.before.heapUsed,\n };\n }\n }\n\n this.outputTrace(entry);\n\n // Remove from stack and update current\n this.traceStack.splice(index);\n this.currentTrace = this.traceStack[this.traceStack.length - 1] || null;\n }\n\n async traceAsync<T>(\n type: TraceEntry['type'],\n name: string,\n params: any,\n fn: () => Promise<T>\n ): Promise<T> {\n const id = this.startTrace(type, name, params);\n try {\n const result = await fn();\n this.endTrace(id, result);\n return result;\n } catch (error: unknown) {\n this.endTrace(id, undefined, error);\n throw error;\n }\n }\n\n traceSync<T>(\n type: TraceEntry['type'],\n name: string,\n params: any,\n fn: () => T\n ): T {\n const id = this.startTrace(type, name, params);\n try {\n const result = fn();\n this.endTrace(id, result);\n return result;\n } catch (error: unknown) {\n this.endTrace(id, undefined, error);\n throw error;\n }\n }\n\n async command<T>(\n name: string,\n options: any,\n fn: () => Promise<T>\n ): Promise<T> {\n return this.traceAsync('command', name, options, fn);\n }\n\n async step<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('step', name, undefined, fn);\n }\n\n async query<T>(sql: string, params: any, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('query', sql.substring(0, 50), params, fn);\n }\n\n async api<T>(\n method: string,\n url: string,\n body: any,\n fn: () => Promise<T>\n ): Promise<T> {\n return this.traceAsync('api', `${method} ${url}`, { body }, fn);\n }\n\n getExecutionSummary(): string {\n if (!this.config.enabled) return 'Tracing disabled';\n\n const totalDuration = Date.now() - this.startTime;\n const errorCount = this.countErrors(this.allTraces);\n const slowCount = this.countSlowOperations(this.allTraces);\n\n let summary = `\\n${'='.repeat(80)}\\n`;\n summary += `EXECUTION SUMMARY\\n`;\n summary += `${'='.repeat(80)}\\n`;\n summary += `Total Duration: ${this.formatDuration(totalDuration)}\\n`;\n summary += `Total Operations: ${this.countOperations(this.allTraces)}\\n`;\n summary += `Errors: ${errorCount}\\n`;\n summary += `Slow Operations (>${this.config.performanceThreshold}ms): ${slowCount}\\n`;\n\n if (this.config.captureMemory) {\n const memUsage = process.memoryUsage();\n summary += `Final Memory: RSS=${this.formatMemory(memUsage.rss)}, Heap=${this.formatMemory(memUsage.heapUsed)}\\n`;\n }\n\n if (this.outputFile) {\n summary += `Trace Log: ${this.outputFile}\\n`;\n }\n\n summary += `${'='.repeat(80)}`;\n\n return summary;\n }\n\n private countOperations(traces: TraceEntry[]): number {\n let count = traces.length;\n for (const trace of traces) {\n count += this.countOperations(trace.children);\n }\n return count;\n }\n\n private countErrors(traces: TraceEntry[]): number {\n let count = 0;\n for (const trace of traces) {\n if (trace.error) count++;\n count += this.countErrors(trace.children);\n }\n return count;\n }\n\n private countSlowOperations(traces: TraceEntry[]): number {\n let count = 0;\n for (const trace of traces) {\n if (trace.duration && trace.duration > this.config.performanceThreshold)\n count++;\n count += this.countSlowOperations(trace.children);\n }\n return count;\n }\n\n getLastError(): TraceEntry | null {\n const findLastError = (traces: TraceEntry[]): TraceEntry | null => {\n for (let i = traces.length - 1; i >= 0; i--) {\n const trace = traces[i];\n if (trace.error) return trace;\n const childError = findLastError(trace.children);\n if (childError) return childError;\n }\n return null;\n };\n return findLastError(this.allTraces);\n }\n\n exportTraces(): TraceEntry[] {\n return this.allTraces;\n }\n\n reset(): void {\n this.currentTrace = null;\n this.traceStack = [];\n this.allTraces = [];\n this.startTime = Date.now();\n }\n}\n\n// Singleton instance\nexport const trace = TraceContext.getInstance();\n\n// Decorator for tracing class methods\nexport function Trace(type: TraceEntry['type'] = 'function') {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n const isAsync = originalMethod.constructor.name === 'AsyncFunction';\n\n if (isAsync) {\n descriptor.value = async function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n return trace.traceAsync(type, methodName, args, async () => {\n return originalMethod.apply(this, args);\n });\n };\n } else {\n descriptor.value = function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n return trace.traceSync(type, methodName, args, () => {\n return originalMethod.apply(this, args);\n });\n };\n }\n\n return descriptor;\n };\n}\n\n// Decorator for tracing entire classes\nexport function TraceClass(type: TraceEntry['type'] = 'function') {\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\n const prototype = constructor.prototype;\n const propertyNames = Object.getOwnPropertyNames(prototype);\n\n for (const propertyName of propertyNames) {\n if (propertyName === 'constructor') continue;\n\n const descriptor = Object.getOwnPropertyDescriptor(\n prototype,\n propertyName\n );\n if (!descriptor || typeof descriptor.value !== 'function') continue;\n\n Trace(type)(prototype, propertyName, descriptor);\n Object.defineProperty(prototype, propertyName, descriptor);\n }\n\n return constructor;\n };\n}\n\n// Helper for critical operations\nexport function TraceCritical(\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey} [CRITICAL]`;\n\n // Store context before execution\n const contextBefore = {\n memory: process.memoryUsage(),\n timestamp: new Date().toISOString(),\n args: trace['maskSensitiveData'](args),\n };\n\n try {\n return await trace.traceAsync(\n 'function',\n methodName,\n contextBefore,\n async () => {\n return originalMethod.apply(this, args);\n }\n );\n } catch (error: any) {\n // Enhanced error logging for critical operations\n logger.error(`Critical operation failed: ${methodName}`, error, {\n context: contextBefore,\n stack: error.stack,\n });\n throw error;\n }\n };\n\n return descriptor;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["trace"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/trace/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Trace Module Export\n * Central export for all tracing functionality\n */\n\nimport type { TraceConfig } from './debug-trace.js';\n\nexport {\n trace,\n TraceContext,\n Trace,\n TraceClass,\n TraceCritical,\n type TraceConfig,\n} from './debug-trace.js';\n\nexport {\n wrapCommand,\n wrapProgram,\n traceStep,\n traceQuery,\n traceAPI,\n} from './cli-trace-wrapper.js';\n\nexport {\n createTracedDatabase,\n wrapDatabase,\n getQueryStatistics,\n createTracedTransaction,\n} from './db-trace-wrapper.js';\n\nexport {\n TraceLinearAPI,\n createTracedFetch,\n wrapGraphQLClient,\n} from './linear-api-wrapper.js';\n\n/**\n * Initialize tracing based on environment configuration\n * Configuration is read directly from env vars by trace decorators\n */\nexport function initializeTracing(): void {\n // No-op - trace config is read from env vars on demand\n}\n\n/**\n * Helper to enable tracing for a specific scope\n */\nexport function withTracing<T>(fn: () => T, options?: Partial<TraceConfig>): T {\n const originalEnv = process.env['DEBUG_TRACE'];\n\n try {\n // Temporarily enable tracing\n process.env['DEBUG_TRACE'] = 'true';\n\n // Apply custom options if provided\n if (options) {\n if (options.output) process.env['TRACE_OUTPUT'] = options.output;\n if (options.verbosity) process.env['TRACE_VERBOSITY'] = options.verbosity;\n if (options.includeParams !== undefined) {\n process.env['TRACE_PARAMS'] = String(options.includeParams);\n }\n if (options.includeResults !== undefined) {\n process.env['TRACE_RESULTS'] = String(options.includeResults);\n }\n if (options.performanceThreshold !== undefined) {\n process.env['TRACE_PERF_THRESHOLD'] = String(\n options.performanceThreshold\n );\n }\n }\n\n return fn();\n } finally {\n // Restore original environment\n if (originalEnv === undefined) {\n delete process.env['DEBUG_TRACE'];\n } else {\n process.env['DEBUG_TRACE'] = originalEnv;\n }\n }\n}\n\n/**\n * Quick enable/disable functions for debugging\n */\nexport const enableTracing = () => {\n process.env['DEBUG_TRACE'] = 'true';\n console.log('Tracing enabled');\n};\n\nexport const disableTracing = () => {\n delete process.env['DEBUG_TRACE'];\n console.log('Tracing disabled');\n};\n\nexport const enableVerboseTracing = () => {\n process.env['DEBUG_TRACE'] = 'true';\n process.env['TRACE_VERBOSITY'] = 'full';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'true';\n process.env['TRACE_MEMORY'] = 'true';\n console.log('Verbose tracing enabled');\n};\n\nexport const enableMinimalTracing = () => {\n process.env['DEBUG_TRACE'] = 'true';\n process.env['TRACE_VERBOSITY'] = 'summary';\n process.env['TRACE_PARAMS'] = 'false';\n process.env['TRACE_RESULTS'] = 'false';\n process.env['TRACE_MEMORY'] = 'false';\n console.log('\u2705 Minimal tracing enabled');\n};\n"],
|
|
5
|
+
"mappings": ";;;;AAOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMA,SAAS,oBAA0B;AAE1C;AAKO,SAAS,YAAe,IAAa,SAAmC;AAC7E,QAAM,cAAc,QAAQ,IAAI,aAAa;AAE7C,MAAI;AAEF,YAAQ,IAAI,aAAa,IAAI;AAG7B,QAAI,SAAS;AACX,UAAI,QAAQ,OAAQ,SAAQ,IAAI,cAAc,IAAI,QAAQ;AAC1D,UAAI,QAAQ,UAAW,SAAQ,IAAI,iBAAiB,IAAI,QAAQ;AAChE,UAAI,QAAQ,kBAAkB,QAAW;AACvC,gBAAQ,IAAI,cAAc,IAAI,OAAO,QAAQ,aAAa;AAAA,MAC5D;AACA,UAAI,QAAQ,mBAAmB,QAAW;AACxC,gBAAQ,IAAI,eAAe,IAAI,OAAO,QAAQ,cAAc;AAAA,MAC9D;AACA,UAAI,QAAQ,yBAAyB,QAAW;AAC9C,gBAAQ,IAAI,sBAAsB,IAAI;AAAA,UACpC,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,WAAO,GAAG;AAAA,EACZ,UAAE;AAEA,QAAI,gBAAgB,QAAW;AAC7B,aAAO,QAAQ,IAAI,aAAa;AAAA,IAClC,OAAO;AACL,cAAQ,IAAI,aAAa,IAAI;AAAA,IAC/B;AAAA,EACF;AACF;AAKO,MAAM,gBAAgB,MAAM;AACjC,UAAQ,IAAI,aAAa,IAAI;AAC7B,UAAQ,IAAI,iBAAiB;AAC/B;AAEO,MAAM,iBAAiB,MAAM;AAClC,SAAO,QAAQ,IAAI,aAAa;AAChC,UAAQ,IAAI,kBAAkB;AAChC;AAEO,MAAM,uBAAuB,MAAM;AACxC,UAAQ,IAAI,aAAa,IAAI;AAC7B,UAAQ,IAAI,iBAAiB,IAAI;AACjC,UAAQ,IAAI,cAAc,IAAI;AAC9B,UAAQ,IAAI,eAAe,IAAI;AAC/B,UAAQ,IAAI,cAAc,IAAI;AAC9B,UAAQ,IAAI,yBAAyB;AACvC;AAEO,MAAM,uBAAuB,MAAM;AACxC,UAAQ,IAAI,aAAa,IAAI;AAC7B,UAAQ,IAAI,iBAAiB,IAAI;AACjC,UAAQ,IAAI,cAAc,IAAI;AAC9B,UAAQ,IAAI,eAAe,IAAI;AAC/B,UAAQ,IAAI,cAAc,IAAI;AAC9B,UAAQ,IAAI,gCAA2B;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/trace/linear-api-wrapper.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Linear API Trace Wrapper\n * Wraps Linear API client with comprehensive tracing for debugging\n */\n\nimport { trace, Trace } from './debug-trace.js';\nimport { logger } from '../monitoring/logger.js';\n\n/**\n * Decorator to trace Linear API GraphQL calls\n */\nexport function TraceLinearAPI(\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n) {\n const originalMethod = descriptor.value;\n const isAsync = originalMethod.constructor.name === 'AsyncFunction';\n\n if (isAsync) {\n descriptor.value = async function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n\n // Extract meaningful context from arguments\n const context = extractAPIContext(propertyKey, args);\n\n return trace.traceAsync('api', methodName, context, async () => {\n const startTime = Date.now();\n\n try {\n // Log API call start\n logger.debug(`Linear API Call: ${methodName}`, context);\n\n const result = await originalMethod.apply(this, args);\n\n const duration = Date.now() - startTime;\n\n // Log successful completion with timing\n logger.info(`Linear API Success: ${methodName}`, {\n duration,\n resultType: Array.isArray(result)\n ? `array[${result.length}]`\n : typeof result,\n hasData: result != null,\n });\n\n // Warn about slow API calls\n if (duration > 1000) {\n logger.warn(\n `Slow Linear API call: ${methodName} took ${duration}ms`,\n {\n ...context,\n duration,\n }\n );\n }\n\n return result;\n } catch (error: any) {\n const duration = Date.now() - startTime;\n\n // Enhanced error logging for API failures\n logger.error(`Linear API Failed: ${methodName}`, error, {\n ...context,\n duration,\n errorCode: error.code,\n statusCode: error.statusCode,\n graphQLErrors: error.errors,\n });\n\n // Add debugging hints based on error type\n if (error.message?.includes('rate limit')) {\n logger.warn('Rate limit hit - consider implementing backoff', {\n method: methodName,\n suggestion: 'Implement exponential backoff or request queuing',\n });\n } else if (error.message?.includes('network')) {\n logger.warn('Network error - check connectivity', {\n method: methodName,\n suggestion: 'Verify API endpoint and network connectivity',\n });\n } else if (error.message?.includes('unauthorized')) {\n logger.warn('Authorization error - check API key', {\n method: methodName,\n suggestion: 'Verify LINEAR_API_KEY is set and valid',\n });\n }\n\n throw error;\n }\n });\n };\n } else {\n descriptor.value = function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n const context = extractAPIContext(propertyKey, args);\n\n return trace.traceSync('api', methodName, context, () => {\n return originalMethod.apply(this, args);\n });\n };\n }\n\n return descriptor;\n}\n\n/**\n * Extract meaningful context from API method arguments\n */\nfunction extractAPIContext(\n methodName: string,\n args: any[]\n): Record<string, any> {\n const context: Record<string, any> = {};\n\n // Handle different Linear API methods\n if (methodName === 'createIssue' && args[0]) {\n context.title = args[0].title;\n context.teamId = args[0].teamId;\n context.priority = args[0].priority;\n } else if (methodName === 'updateIssue' && args[0]) {\n context.issueId = args[0];\n context.updates = Object.keys(args[1] || {});\n } else if (methodName === 'getIssue') {\n context.issueId = args[0];\n } else if (methodName === 'getIssues' && args[0]) {\n context.filter = args[0];\n } else if (methodName === 'graphql') {\n // For raw GraphQL queries\n const query = args[0];\n if (query) {\n // Extract operation name from query\n const match = query.match(/(?:query|mutation)\\s+(\\w+)/);\n context.operation = match ? match[1] : 'unknown';\n context.queryLength = query.length;\n context.variables = args[1] ? Object.keys(args[1]) : [];\n }\n }\n\n return context;\n}\n\n/**\n * Wrap fetch with tracing for HTTP-level debugging\n */\nexport function createTracedFetch(baseFetch = fetch): typeof fetch {\n return async function tracedFetch(\n input: string | URL | Request,\n init?: RequestInit\n ): Promise<Response> {\n const url = typeof input === 'string' ? input : input.toString();\n const method = init?.method || 'GET';\n\n // Mask sensitive headers\n const headers: any = init?.headers ? { ...init.headers } : {};\n if (headers.Authorization) {\n headers.Authorization =\n headers.Authorization.substring(0, 20) + '...[MASKED]';\n }\n\n const context = {\n method,\n url: url.length > 100 ? url.substring(0, 100) + '...' : url,\n headers: Object.keys(headers),\n bodySize: init?.body ? JSON.stringify(init.body).length : 0,\n };\n\n return trace.api(method, url, context, async () => {\n const startTime = Date.now();\n\n try {\n const response = await baseFetch(input, init);\n const duration = Date.now() - startTime;\n\n // Log response details\n logger.debug(`HTTP ${method} ${response.status}`, {\n url: url.substring(0, 100),\n status: response.status,\n duration,\n headers: {\n 'content-type': response.headers.get('content-type'),\n 'x-ratelimit-remaining': response.headers.get(\n 'x-ratelimit-remaining'\n ),\n 'x-ratelimit-reset': response.headers.get('x-ratelimit-reset'),\n },\n });\n\n // Warn about rate limiting\n const remaining = response.headers.get('x-ratelimit-remaining');\n if (remaining && parseInt(remaining) < 10) {\n logger.warn(`Low rate limit remaining: ${remaining}`, {\n url: url.substring(0, 100),\n resetAt: response.headers.get('x-ratelimit-reset'),\n });\n }\n\n // Warn about slow responses\n if (duration > 2000) {\n logger.warn(`Slow HTTP response: ${duration}ms`, {\n method,\n url: url.substring(0, 100),\n status: response.status,\n });\n }\n\n return response;\n } catch (error: any) {\n const duration = Date.now() - startTime;\n\n logger.error(`HTTP ${method} failed`, error, {\n url: url.substring(0, 100),\n duration,\n errorType: error.constructor.name,\n errno: error.errno,\n code: error.code,\n });\n\n throw error;\n }\n });\n };\n}\n\n/**\n * Create a traced GraphQL client wrapper\n */\nexport function wrapGraphQLClient<T>(client: T): T {\n const prototype = Object.getPrototypeOf(client);\n const propertyNames = Object.getOwnPropertyNames(prototype);\n\n for (const propertyName of propertyNames) {\n if (propertyName === 'constructor') continue;\n\n const descriptor = Object.getOwnPropertyDescriptor(prototype, propertyName);\n if (!descriptor || typeof descriptor.value !== 'function') continue;\n\n // Apply tracing to all methods\n TraceLinearAPI(prototype, propertyName, descriptor);\n Object.defineProperty(prototype, propertyName, descriptor);\n }\n\n return client;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/trace/trace-detector.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Trace Detection and Bundling System\n * Identifies chains of related tool calls and bundles them as single traces\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ToolCall,\n Trace,\n TraceType,\n TraceBoundaryConfig,\n DEFAULT_TRACE_CONFIG,\n TRACE_PATTERNS,\n TraceMetadata,\n TraceScoringFactors,\n CompressedTrace,\n CompressionStrategy,\n} from './types.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { TraceStore } from './trace-store.js';\nimport Database from 'better-sqlite3';\n\nexport class TraceDetector {\n private config: TraceBoundaryConfig;\n private activeTrace: ToolCall[] = [];\n private lastToolTime: number = 0;\n private traces: Trace[] = [];\n private configManager: ConfigManager;\n private traceStore?: TraceStore;\n\n constructor(\n config: Partial<TraceBoundaryConfig> = {},\n configManager?: ConfigManager,\n db?: Database.Database\n ) {\n this.config = { ...DEFAULT_TRACE_CONFIG, ...config };\n this.configManager = configManager || new ConfigManager();\n\n if (db) {\n this.traceStore = new TraceStore(db);\n // Load existing traces from database\n this.loadTracesFromStore();\n }\n }\n\n /**\n * Load traces from the database\n */\n private loadTracesFromStore(): void {\n if (!this.traceStore) return;\n\n try {\n // Load recent traces (last 24 hours)\n const recentTraces = this.traceStore.getAllTraces();\n const cutoff = Date.now() - 24 * 60 * 60 * 1000;\n\n this.traces = recentTraces.filter((t) => t.metadata.startTime >= cutoff);\n } catch (error: unknown) {\n // If loading fails, start with empty traces\n console.error('Failed to load traces from store:', error);\n this.traces = [];\n }\n }\n\n /**\n * Add a tool call and check if it belongs to current trace\n */\n addToolCall(tool: ToolCall): void {\n const now = Date.now();\n\n // Check if this tool belongs to the current trace\n if (this.shouldStartNewTrace(tool)) {\n // Finalize current trace if it exists\n if (this.activeTrace.length > 0) {\n this.finalizeTrace();\n }\n // Start new trace\n this.activeTrace = [tool];\n } else {\n // Add to current trace\n this.activeTrace.push(tool);\n }\n\n this.lastToolTime = tool.timestamp;\n\n // Check if trace is getting too large\n if (this.activeTrace.length >= this.config.maxTraceSize) {\n this.finalizeTrace();\n }\n }\n\n /**\n * Determine if a tool call should start a new trace\n */\n private shouldStartNewTrace(tool: ToolCall): boolean {\n // First tool always starts a new trace\n if (this.activeTrace.length === 0) {\n return false;\n }\n\n const lastTool = this.activeTrace[this.activeTrace.length - 1];\n\n // Time proximity check\n const timeDiff = tool.timestamp - lastTool.timestamp;\n if (timeDiff > this.config.timeProximityMs) {\n return true;\n }\n\n // Directory check if enabled\n if (this.config.sameDirThreshold) {\n const lastFiles = lastTool.filesAffected || [];\n const currentFiles = tool.filesAffected || [];\n\n if (lastFiles.length > 0 && currentFiles.length > 0) {\n const lastDirs = lastFiles.map((f) => this.getDirectory(f));\n const currentDirs = currentFiles.map((f) => this.getDirectory(f));\n\n const hasCommonDir = lastDirs.some((d) => currentDirs.includes(d));\n if (!hasCommonDir) {\n return true;\n }\n }\n }\n\n // Causal relationship check\n if (this.config.causalRelationship) {\n // If last tool had an error and current tool is not a fix attempt, start new trace\n if (lastTool.error && !this.isFixAttempt(tool, lastTool)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if a tool is attempting to fix an error from previous tool\n */\n private isFixAttempt(current: ToolCall, previous: ToolCall): boolean {\n // Edit after error is likely a fix\n if (\n previous.error &&\n (current.tool === 'edit' || current.tool === 'write')\n ) {\n return true;\n }\n\n // Test after fix is validation\n if (current.tool === 'test' || current.tool === 'bash') {\n return true;\n }\n\n return false;\n }\n\n /**\n * Finalize current trace and add to traces list\n */\n private finalizeTrace(): void {\n if (this.activeTrace.length === 0) return;\n\n const trace = this.createTrace(this.activeTrace);\n this.traces.push(trace);\n\n // Persist to database if store is available\n if (this.traceStore) {\n try {\n this.traceStore.saveTrace(trace);\n } catch (error: unknown) {\n console.error('Failed to persist trace:', error);\n }\n }\n\n this.activeTrace = [];\n }\n\n /**\n * Create a trace from a sequence of tool calls\n */\n private createTrace(tools: ToolCall[]): Trace {\n const id = uuidv4();\n const type = this.detectTraceType(tools);\n const metadata = this.extractMetadata(tools);\n const score = this.calculateTraceScore(tools, metadata);\n const summary = this.generateSummary(tools, type, metadata);\n\n const trace: Trace = {\n id,\n type,\n tools,\n score,\n summary,\n metadata,\n };\n\n // Check if trace should be compressed\n const ageHours = (Date.now() - metadata.startTime) / (1000 * 60 * 60);\n if (ageHours > this.config.compressionThreshold) {\n trace.compressed = this.compressTrace(trace);\n }\n\n return trace;\n }\n\n /**\n * Detect the type of trace based on tool patterns\n */\n private detectTraceType(tools: ToolCall[]): TraceType {\n const toolSequence = tools.map((t) => t.tool);\n\n // Check against known patterns\n for (const pattern of TRACE_PATTERNS) {\n if (this.matchesPattern(toolSequence, pattern.pattern)) {\n return pattern.type;\n }\n }\n\n // Heuristic detection\n if (toolSequence.includes('search') || toolSequence.includes('grep')) {\n if (toolSequence.includes('edit')) {\n return TraceType.SEARCH_DRIVEN;\n }\n return TraceType.EXPLORATION;\n }\n\n if (tools.some((t) => t.error)) {\n return TraceType.ERROR_RECOVERY;\n }\n\n if (toolSequence.includes('test')) {\n return TraceType.TESTING;\n }\n\n if (toolSequence.includes('write')) {\n return TraceType.FEATURE_IMPLEMENTATION;\n }\n\n return TraceType.UNKNOWN;\n }\n\n /**\n * Check if tool sequence matches a pattern\n */\n private matchesPattern(\n sequence: string[],\n pattern: RegExp | string[]\n ): boolean {\n if (pattern instanceof RegExp) {\n return pattern.test(sequence.join('\u2192'));\n }\n\n if (Array.isArray(pattern)) {\n // Check if pattern is a subsequence\n let patternIndex = 0;\n for (const tool of sequence) {\n if (tool === pattern[patternIndex]) {\n patternIndex++;\n if (patternIndex >= pattern.length) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Extract metadata from tool calls\n */\n private extractMetadata(tools: ToolCall[]): TraceMetadata {\n const startTime = tools[0].timestamp;\n const endTime = tools[tools.length - 1].timestamp;\n\n const filesModified = new Set<string>();\n const errorsEncountered: string[] = [];\n const decisionsRecorded: string[] = [];\n\n let hasCausalChain = false;\n\n for (let i = 0; i < tools.length; i++) {\n const tool = tools[i];\n\n // Collect files\n if (tool.filesAffected) {\n tool.filesAffected.forEach((f) => filesModified.add(f));\n }\n\n // Collect errors\n if (tool.error) {\n errorsEncountered.push(tool.error);\n // Check if next tool is a fix attempt\n if (i < tools.length - 1) {\n const nextTool = tools[i + 1];\n if (this.isFixAttempt(nextTool, tool)) {\n hasCausalChain = true;\n }\n }\n }\n\n // Collect decisions (if tool is decision_recording)\n if (tool.tool === 'decision_recording' && tool.arguments?.decision) {\n decisionsRecorded.push(tool.arguments.decision);\n }\n }\n\n return {\n startTime,\n endTime,\n filesModified: Array.from(filesModified),\n errorsEncountered,\n decisionsRecorded,\n causalChain: hasCausalChain,\n };\n }\n\n /**\n * Calculate importance score for a trace\n */\n private calculateTraceScore(\n tools: ToolCall[],\n metadata: TraceMetadata\n ): number {\n // Get individual tool scores\n const toolScores = tools.map((t) =>\n this.configManager.calculateScore(t.tool, {\n filesAffected: t.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(t),\n referenceCount: 0, // Would need to track references\n })\n );\n\n // Use MAX strategy for trace scoring (highest tool determines trace importance)\n const maxScore = Math.max(...toolScores);\n\n // Apply bonuses\n let score = maxScore;\n\n // Bonus for causal chains (error\u2192fix\u2192verify)\n if (metadata.causalChain) {\n score = Math.min(score + 0.1, 1.0);\n }\n\n // Bonus for decisions\n if (metadata.decisionsRecorded.length > 0) {\n score = Math.min(score + 0.05 * metadata.decisionsRecorded.length, 1.0);\n }\n\n // Penalty for errors without fixes\n if (metadata.errorsEncountered.length > 0 && !metadata.causalChain) {\n score = Math.max(score - 0.1, 0);\n }\n\n return score;\n }\n\n /**\n * Check if a tool call represents a permanent change\n */\n private isPermanentChange(tool: ToolCall): boolean {\n const permanentTools = ['write', 'edit', 'decision_recording'];\n return permanentTools.includes(tool.tool);\n }\n\n /**\n * Generate a summary for the trace\n */\n private generateSummary(\n tools: ToolCall[],\n type: TraceType,\n metadata: TraceMetadata\n ): string {\n const toolChain = tools.map((t) => t.tool).join('\u2192');\n\n switch (type) {\n case TraceType.SEARCH_DRIVEN:\n return `Search-driven modification: ${toolChain}`;\n\n case TraceType.ERROR_RECOVERY:\n const error = metadata.errorsEncountered[0] || 'unknown error';\n return `Error recovery: ${error} via ${toolChain}`;\n\n case TraceType.FEATURE_IMPLEMENTATION:\n const files = metadata.filesModified.length;\n return `Feature implementation: ${files} files via ${toolChain}`;\n\n case TraceType.REFACTORING:\n return `Code refactoring: ${toolChain}`;\n\n case TraceType.TESTING:\n return `Test execution: ${toolChain}`;\n\n case TraceType.EXPLORATION:\n return `Codebase exploration: ${toolChain}`;\n\n case TraceType.DEBUGGING:\n return `Debugging session: ${toolChain}`;\n\n case TraceType.BUILD_DEPLOY:\n return `Build and deploy: ${toolChain}`;\n\n default:\n return `Tool sequence: ${toolChain}`;\n }\n }\n\n /**\n * Compress a trace for long-term storage using strategy\n */\n private compressTrace(\n trace: Trace,\n strategy: CompressionStrategy = CompressionStrategy.PATTERN_BASED\n ): CompressedTrace {\n switch (strategy) {\n case CompressionStrategy.SUMMARY_ONLY:\n return this.compressSummaryOnly(trace);\n\n case CompressionStrategy.PATTERN_BASED:\n return this.compressPatternBased(trace);\n\n case CompressionStrategy.SELECTIVE:\n return this.compressSelective(trace);\n\n case CompressionStrategy.FULL_COMPRESSION:\n return this.compressMaximal(trace);\n\n default:\n return this.compressPatternBased(trace);\n }\n }\n\n /**\n * Summary-only compression - minimal data retention\n */\n private compressSummaryOnly(trace: Trace): CompressedTrace {\n return {\n pattern: '', // No pattern stored\n summary: trace.summary.substring(0, 100), // Limit summary\n score: trace.score,\n toolCount: trace.tools.length,\n duration: trace.metadata.endTime - trace.metadata.startTime,\n timestamp: trace.metadata.startTime,\n };\n }\n\n /**\n * Pattern-based compression - keep tool sequence\n */\n private compressPatternBased(trace: Trace): CompressedTrace {\n const pattern = trace.tools.map((t) => t.tool).join('\u2192');\n const duration = trace.metadata.endTime - trace.metadata.startTime;\n\n return {\n pattern,\n summary: trace.summary,\n score: trace.score,\n toolCount: trace.tools.length,\n duration,\n timestamp: trace.metadata.startTime,\n };\n }\n\n /**\n * Selective compression - keep high-score tools only\n */\n private compressSelective(\n trace: Trace,\n threshold: number = 0.5\n ): CompressedTrace {\n // Calculate individual tool scores\n const significantTools = trace.tools.filter((tool: any) => {\n const score = this.configManager.calculateScore(tool.tool, {\n filesAffected: tool.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(tool),\n referenceCount: 0,\n });\n return score >= threshold;\n });\n\n const pattern =\n significantTools.length > 0\n ? significantTools.map((t: any) => t.tool).join('\u2192')\n : trace.tools.map((t: any) => t.tool).join('\u2192');\n\n return {\n pattern,\n summary: `${trace.summary} [${significantTools.length}/${trace.tools.length} significant]`,\n score: trace.score,\n toolCount: significantTools.length,\n duration: trace.metadata.endTime - trace.metadata.startTime,\n timestamp: trace.metadata.startTime,\n };\n }\n\n /**\n * Maximal compression - absolute minimum data\n */\n private compressMaximal(trace: Trace): CompressedTrace {\n // Compress pattern to type abbreviation\n const typeAbbrev = this.getTraceTypeAbbreviation(trace.type);\n const pattern = `${typeAbbrev}:${trace.tools.length}`;\n\n return {\n pattern,\n summary: trace.type, // Just the type\n score: Math.round(trace.score * 10) / 10, // Round to 1 decimal\n toolCount: trace.tools.length,\n duration:\n Math.round((trace.metadata.endTime - trace.metadata.startTime) / 1000) *\n 1000, // Round to seconds\n timestamp: trace.metadata.startTime,\n };\n }\n\n /**\n * Get abbreviated trace type\n */\n private getTraceTypeAbbreviation(type: TraceType): string {\n const abbreviations: Record<TraceType, string> = {\n [TraceType.SEARCH_DRIVEN]: 'SD',\n [TraceType.ERROR_RECOVERY]: 'ER',\n [TraceType.FEATURE_IMPLEMENTATION]: 'FI',\n [TraceType.REFACTORING]: 'RF',\n [TraceType.TESTING]: 'TS',\n [TraceType.EXPLORATION]: 'EX',\n [TraceType.DEBUGGING]: 'DB',\n [TraceType.DOCUMENTATION]: 'DC',\n [TraceType.BUILD_DEPLOY]: 'BD',\n [TraceType.UNKNOWN]: 'UN',\n };\n return abbreviations[type] || 'UN';\n }\n\n /**\n * Choose compression strategy based on trace age and importance\n */\n private selectCompressionStrategy(trace: Trace): CompressionStrategy {\n const ageHours = (Date.now() - trace.metadata.startTime) / (1000 * 60 * 60);\n const score = trace.score;\n\n // Recent and important: pattern-based\n if (ageHours < 24 && score > 0.7) {\n return CompressionStrategy.PATTERN_BASED;\n }\n\n // Recent but less important: selective\n if (ageHours < 24) {\n return CompressionStrategy.SELECTIVE;\n }\n\n // Old and important: selective\n if (ageHours < 168 && score > 0.5) {\n // 1 week\n return CompressionStrategy.SELECTIVE;\n }\n\n // Old and less important: summary only\n if (ageHours < 720) {\n // 30 days\n return CompressionStrategy.SUMMARY_ONLY;\n }\n\n // Very old: maximal compression\n return CompressionStrategy.FULL_COMPRESSION;\n }\n\n /**\n * Get directory from file path\n */\n private getDirectory(filePath: string): string {\n const parts = filePath.split('/');\n parts.pop(); // Remove filename\n return parts.join('/');\n }\n\n /**\n * Flush any pending trace\n */\n flush(): void {\n if (this.activeTrace.length > 0) {\n this.finalizeTrace();\n }\n }\n\n /**\n * Get all detected traces\n */\n getTraces(): Trace[] {\n return this.traces;\n }\n\n /**\n * Get traces by type\n */\n getTracesByType(type: TraceType): Trace[] {\n return this.traces.filter((t) => t.type === type);\n }\n\n /**\n * Get high-importance traces\n */\n getHighImportanceTraces(threshold: number = 0.7): Trace[] {\n return this.traces.filter((t) => t.score >= threshold);\n }\n\n /**\n * Compress old traces with intelligent strategy selection\n */\n compressOldTraces(ageHours: number = 24): number {\n let compressed = 0;\n const now = Date.now();\n\n for (const trace of this.traces) {\n const age = (now - trace.metadata.startTime) / (1000 * 60 * 60);\n if (age > ageHours && !trace.compressed) {\n // Select compression strategy based on age and importance\n const strategy = this.selectCompressionStrategy(trace);\n trace.compressed = this.compressTrace(trace, strategy);\n\n // Remove full tool data for older traces to save memory\n if (\n strategy === CompressionStrategy.FULL_COMPRESSION ||\n strategy === CompressionStrategy.SUMMARY_ONLY\n ) {\n trace.tools = []; // Clear tool data for maximum compression\n } else if (strategy === CompressionStrategy.SELECTIVE) {\n // Keep only high-score tools\n trace.tools = trace.tools.filter((tool: any) => {\n const score = this.configManager.calculateScore(tool.tool, {\n filesAffected: tool.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(tool),\n referenceCount: 0,\n });\n return score >= 0.5;\n });\n }\n\n compressed++;\n\n // Update database if available\n if (this.traceStore) {\n try {\n this.traceStore.updateCompression(\n trace.id,\n trace.compressed,\n strategy\n );\n } catch (error: unknown) {\n console.error(\n 'Failed to update trace compression in store:',\n error\n );\n }\n }\n }\n }\n\n return compressed;\n }\n\n /**\n * Export traces for analysis\n */\n exportTraces(): string {\n return JSON.stringify(this.traces, null, 2);\n }\n\n /**\n * Get statistics about traces\n */\n getStatistics() {\n const stats = {\n totalTraces: this.traces.length,\n tracesByType: {} as Record<string, number>,\n averageScore: 0,\n averageLength: 0,\n compressedCount: 0,\n highImportanceCount: 0,\n };\n\n if (this.traces.length === 0) return stats;\n\n let totalScore = 0;\n let totalLength = 0;\n\n for (const trace of this.traces) {\n // Type distribution\n stats.tracesByType[trace.type] =\n (stats.tracesByType[trace.type] || 0) + 1;\n\n // Scores\n totalScore += trace.score;\n\n // Length\n totalLength += trace.tools.length;\n\n // Compressed\n if (trace.compressed) {\n stats.compressedCount++;\n }\n\n // High importance\n if (trace.score >= 0.7) {\n stats.highImportanceCount++;\n }\n }\n\n stats.averageScore = totalScore / this.traces.length;\n stats.averageLength = totalLength / this.traces.length;\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/trace/trace-store.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Trace Store - Database persistence for traces\n */\n\nimport Database from 'better-sqlite3';\nimport {\n Trace,\n ToolCall,\n TraceType,\n TraceMetadata,\n CompressedTrace,\n CompressionStrategy,\n} from './types.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport class TraceStore {\n private db: Database.Database;\n\n constructor(db: Database.Database) {\n this.db = db;\n this.initializeSchema();\n }\n\n /**\n * Initialize database schema for traces\n */\n private initializeSchema(): void {\n // Check if frames table exists (it may not in all contexts)\n const hasFramesTable = this.db\n .prepare(\n `\n SELECT name FROM sqlite_master \n WHERE type='table' AND name='frames'\n `\n )\n .get();\n\n // Create traces table with optional foreign key\n if (hasFramesTable) {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS traces (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n score REAL NOT NULL,\n summary TEXT NOT NULL,\n start_time INTEGER NOT NULL,\n end_time INTEGER NOT NULL,\n frame_id TEXT,\n user_id TEXT,\n files_modified TEXT,\n errors_encountered TEXT,\n decisions_recorded TEXT,\n causal_chain INTEGER,\n compressed_data TEXT,\n created_at INTEGER DEFAULT (unixepoch()),\n FOREIGN KEY (frame_id) REFERENCES frames(frame_id) ON DELETE SET NULL\n )\n `);\n } else {\n // Create without foreign key constraint\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS traces (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n score REAL NOT NULL,\n summary TEXT NOT NULL,\n start_time INTEGER NOT NULL,\n end_time INTEGER NOT NULL,\n frame_id TEXT,\n user_id TEXT,\n files_modified TEXT,\n errors_encountered TEXT,\n decisions_recorded TEXT,\n causal_chain INTEGER,\n compressed_data TEXT,\n created_at INTEGER DEFAULT (unixepoch())\n )\n `);\n }\n\n // Create tool_calls table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS tool_calls (\n id TEXT PRIMARY KEY,\n trace_id TEXT NOT NULL,\n tool TEXT NOT NULL,\n arguments TEXT,\n timestamp INTEGER NOT NULL,\n result TEXT,\n error TEXT,\n files_affected TEXT,\n duration INTEGER,\n sequence_number INTEGER NOT NULL,\n FOREIGN KEY (trace_id) REFERENCES traces(id) ON DELETE CASCADE\n )\n `);\n\n // Create indexes\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_traces_type ON traces(type);\n CREATE INDEX IF NOT EXISTS idx_traces_frame_id ON traces(frame_id);\n CREATE INDEX IF NOT EXISTS idx_traces_start_time ON traces(start_time);\n CREATE INDEX IF NOT EXISTS idx_traces_score ON traces(score);\n CREATE INDEX IF NOT EXISTS idx_tool_calls_trace_id ON tool_calls(trace_id);\n CREATE INDEX IF NOT EXISTS idx_tool_calls_timestamp ON tool_calls(timestamp);\n `);\n }\n\n /**\n * Save a trace to the database\n */\n saveTrace(trace: Trace): void {\n const traceStmt = this.db.prepare(`\n INSERT OR REPLACE INTO traces (\n id, type, score, summary, start_time, end_time,\n frame_id, user_id, files_modified, errors_encountered,\n decisions_recorded, causal_chain, compressed_data\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const toolCallStmt = this.db.prepare(`\n INSERT OR REPLACE INTO tool_calls (\n id, trace_id, tool, arguments, timestamp, result,\n error, files_affected, duration, sequence_number\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n try {\n this.db.transaction(() => {\n // Save trace\n traceStmt.run(\n trace.id,\n trace.type,\n trace.score,\n trace.summary,\n trace.metadata.startTime,\n trace.metadata.endTime,\n trace.metadata.frameId || null,\n trace.metadata.userId || null,\n JSON.stringify(trace.metadata.filesModified),\n JSON.stringify(trace.metadata.errorsEncountered),\n JSON.stringify(trace.metadata.decisionsRecorded),\n trace.metadata.causalChain ? 1 : 0,\n trace.compressed ? JSON.stringify(trace.compressed) : null\n );\n\n // Save tool calls\n trace.tools.forEach((tool, index) => {\n toolCallStmt.run(\n tool.id,\n trace.id,\n tool.tool,\n tool.arguments ? JSON.stringify(tool.arguments) : null,\n tool.timestamp,\n tool.result ? JSON.stringify(tool.result) : null,\n tool.error || null,\n tool.filesAffected ? JSON.stringify(tool.filesAffected) : null,\n tool.duration || null,\n index\n );\n });\n })();\n\n logger.debug(\n `Saved trace ${trace.id} with ${trace.tools.length} tool calls`\n );\n } catch (error: unknown) {\n logger.error(`Failed to save trace ${trace.id}:`, error as Error);\n throw error;\n }\n }\n\n /**\n * Load a trace by ID\n */\n getTrace(id: string): Trace | null {\n const traceRow = this.db\n .prepare(\n `\n SELECT * FROM traces WHERE id = ?\n `\n )\n .get(id) as any;\n\n if (!traceRow) {\n return null;\n }\n\n const toolRows = this.db\n .prepare(\n `\n SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number\n `\n )\n .all(id) as any[];\n\n return this.rowsToTrace(traceRow, toolRows);\n }\n\n /**\n * Load all traces\n */\n getAllTraces(): Trace[] {\n const traceRows = this.db\n .prepare(\n `\n SELECT * FROM traces ORDER BY start_time DESC\n `\n )\n .all() as any[];\n\n return traceRows.map((traceRow) => {\n const toolRows = this.db\n .prepare(\n `\n SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number\n `\n )\n .all(traceRow.id) as any[];\n\n return this.rowsToTrace(traceRow, toolRows);\n });\n }\n\n /**\n * Load traces by type\n */\n getTracesByType(type: TraceType): Trace[] {\n const traceRows = this.db\n .prepare(\n `\n SELECT * FROM traces WHERE type = ? ORDER BY start_time DESC\n `\n )\n .all(type) as any[];\n\n return traceRows.map((traceRow) => {\n const toolRows = this.db\n .prepare(\n `\n SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number\n `\n )\n .all(traceRow.id) as any[];\n\n return this.rowsToTrace(traceRow, toolRows);\n });\n }\n\n /**\n * Load traces by frame\n */\n getTracesByFrame(frameId: string): Trace[] {\n const traceRows = this.db\n .prepare(\n `\n SELECT * FROM traces WHERE frame_id = ? ORDER BY start_time DESC\n `\n )\n .all(frameId) as any[];\n\n return traceRows.map((traceRow) => {\n const toolRows = this.db\n .prepare(\n `\n SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number\n `\n )\n .all(traceRow.id) as any[];\n\n return this.rowsToTrace(traceRow, toolRows);\n });\n }\n\n /**\n * Load high-importance traces\n */\n getHighImportanceTraces(minScore: number = 0.7): Trace[] {\n const traceRows = this.db\n .prepare(\n `\n SELECT * FROM traces WHERE score >= ? ORDER BY score DESC, start_time DESC\n `\n )\n .all(minScore) as any[];\n\n return traceRows.map((traceRow) => {\n const toolRows = this.db\n .prepare(\n `\n SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number\n `\n )\n .all(traceRow.id) as any[];\n\n return this.rowsToTrace(traceRow, toolRows);\n });\n }\n\n /**\n * Load error traces\n */\n getErrorTraces(): Trace[] {\n const traceRows = this.db\n .prepare(\n `\n SELECT * FROM traces \n WHERE type = ? OR errors_encountered != '[]'\n ORDER BY start_time DESC\n `\n )\n .all(TraceType.ERROR_RECOVERY) as any[];\n\n return traceRows.map((traceRow) => {\n const toolRows = this.db\n .prepare(\n `\n SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number\n `\n )\n .all(traceRow.id) as any[];\n\n return this.rowsToTrace(traceRow, toolRows);\n });\n }\n\n /**\n * Get trace statistics\n */\n getStatistics(): {\n totalTraces: number;\n tracesByType: Record<string, number>;\n averageScore: number;\n averageLength: number;\n errorRate: number;\n } {\n const stats = this.db\n .prepare(\n `\n SELECT \n COUNT(*) as total,\n AVG(score) as avg_score,\n AVG((\n SELECT COUNT(*) FROM tool_calls WHERE trace_id = traces.id\n )) as avg_length,\n SUM(CASE WHEN type = ? OR errors_encountered != '[]' THEN 1 ELSE 0 END) * 100.0 / COUNT(*) as error_rate\n FROM traces\n `\n )\n .get(TraceType.ERROR_RECOVERY) as any;\n\n const typeStats = this.db\n .prepare(\n `\n SELECT type, COUNT(*) as count\n FROM traces\n GROUP BY type\n `\n )\n .all() as any[];\n\n const tracesByType: Record<string, number> = {};\n typeStats.forEach((row) => {\n tracesByType[row.type] = row.count;\n });\n\n return {\n totalTraces: stats.total || 0,\n tracesByType,\n averageScore: stats.avg_score || 0,\n averageLength: stats.avg_length || 0,\n errorRate: stats.error_rate || 0,\n };\n }\n\n /**\n * Delete old traces\n */\n deleteOldTraces(olderThanMs: number): number {\n const cutoff = Date.now() - olderThanMs;\n const result = this.db\n .prepare(\n `\n DELETE FROM traces WHERE start_time < ?\n `\n )\n .run(cutoff);\n\n return result.changes;\n }\n\n /**\n * Convert database rows to Trace object\n */\n private rowsToTrace(traceRow: any, toolRows: any[]): Trace {\n const tools: ToolCall[] = toolRows.map((row) => ({\n id: row.id,\n tool: row.tool,\n arguments: row.arguments ? JSON.parse(row.arguments) : undefined,\n timestamp: row.timestamp,\n result: row.result ? JSON.parse(row.result) : undefined,\n error: row.error || undefined,\n filesAffected: row.files_affected\n ? JSON.parse(row.files_affected)\n : undefined,\n duration: row.duration || undefined,\n }));\n\n const metadata: TraceMetadata = {\n startTime: traceRow.start_time,\n endTime: traceRow.end_time,\n frameId: traceRow.frame_id || undefined,\n userId: traceRow.user_id || undefined,\n filesModified: JSON.parse(traceRow.files_modified || '[]'),\n errorsEncountered: JSON.parse(traceRow.errors_encountered || '[]'),\n decisionsRecorded: JSON.parse(traceRow.decisions_recorded || '[]'),\n causalChain: traceRow.causal_chain === 1,\n };\n\n const trace: Trace = {\n id: traceRow.id,\n type: traceRow.type as TraceType,\n tools,\n score: traceRow.score,\n summary: traceRow.summary,\n metadata,\n };\n\n if (traceRow.compressed_data) {\n trace.compressed = JSON.parse(traceRow.compressed_data);\n }\n\n return trace;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/trace/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Types for Trace Detection and Bundling System\n */\n\nexport interface ToolCall {\n id: string;\n tool: string;\n arguments?: Record<string, any>;\n timestamp: number;\n result?: any;\n error?: string;\n filesAffected?: string[];\n duration?: number;\n}\n\nexport interface Trace {\n id: string;\n type: TraceType;\n tools: ToolCall[];\n score: number;\n summary: string;\n compressed?: CompressedTrace;\n metadata: TraceMetadata;\n}\n\nexport interface CompressedTrace {\n pattern: string; // e.g., \"search\u2192read\u2192edit\u2192test\"\n summary: string; // e.g., \"Fixed auth bug via search-driven refactor\"\n score: number;\n toolCount: number;\n duration: number;\n timestamp: number;\n}\n\nexport interface TraceMetadata {\n startTime: number;\n endTime: number;\n frameId?: string;\n userId?: string;\n filesModified: string[];\n errorsEncountered: string[];\n decisionsRecorded: string[];\n causalChain: boolean; // Was this an error\u2192fix\u2192verify chain?\n}\n\nexport enum TraceType {\n SEARCH_DRIVEN = 'search_driven',\n ERROR_RECOVERY = 'error_recovery',\n FEATURE_IMPLEMENTATION = 'feature_implementation',\n REFACTORING = 'refactoring',\n TESTING = 'testing',\n EXPLORATION = 'exploration',\n DEBUGGING = 'debugging',\n DOCUMENTATION = 'documentation',\n BUILD_DEPLOY = 'build_deploy',\n UNKNOWN = 'unknown',\n}\n\nexport interface TraceBoundaryConfig {\n timeProximityMs: number; // Max time between tools to be in same trace\n sameDirThreshold: boolean; // Must operate on same directory?\n causalRelationship: boolean; // Look for error\u2192fix patterns?\n maxTraceSize: number; // Max number of tools in one trace\n compressionThreshold: number; // Compress traces older than X hours\n}\n\nexport const DEFAULT_TRACE_CONFIG: TraceBoundaryConfig = {\n timeProximityMs: 30000, // 30 seconds\n sameDirThreshold: true,\n causalRelationship: true,\n maxTraceSize: 50,\n compressionThreshold: 24, // Compress after 24 hours\n};\n\nexport interface TracePattern {\n pattern: RegExp | string[];\n type: TraceType;\n description: string;\n}\n\n// Common patterns for trace type detection\nexport const TRACE_PATTERNS: TracePattern[] = [\n {\n pattern: ['search', 'grep', 'read', 'edit'],\n type: TraceType.SEARCH_DRIVEN,\n description: 'Search-driven code modification',\n },\n {\n pattern: ['bash', 'error', 'edit', 'bash'],\n type: TraceType.ERROR_RECOVERY,\n description: 'Error recovery sequence',\n },\n {\n pattern: ['write', 'edit', 'test'],\n type: TraceType.FEATURE_IMPLEMENTATION,\n description: 'New feature implementation',\n },\n {\n pattern: ['read', 'edit', 'edit', 'test'],\n type: TraceType.REFACTORING,\n description: 'Code refactoring',\n },\n {\n pattern: ['test', 'bash', 'test'],\n type: TraceType.TESTING,\n description: 'Test execution and validation',\n },\n {\n pattern: ['grep', 'search', 'read'],\n type: TraceType.EXPLORATION,\n description: 'Codebase exploration',\n },\n {\n pattern: ['bash', 'build', 'deploy'],\n type: TraceType.BUILD_DEPLOY,\n description: 'Build and deployment',\n },\n];\n\nexport interface TraceScoringFactors {\n toolScores: number[]; // Individual tool scores\n hasDecisions: boolean;\n hasErrors: boolean;\n filesModifiedCount: number;\n isPermanent: boolean;\n referenceCount: number;\n}\n\n// Trace compression strategies\nexport enum CompressionStrategy {\n SUMMARY_ONLY = 'summary_only', // Keep only summary and score\n PATTERN_BASED = 'pattern_based', // Keep pattern and outcome\n SELECTIVE = 'selective', // Keep high-score tools only\n FULL_COMPRESSION = 'full_compression', // Maximum compression\n}\n"],
|
|
5
|
+
"mappings": ";;;;AA6CO,IAAK,YAAL,kBAAKA,eAAL;AACL,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,4BAAyB;AACzB,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,aAAU;AACV,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,aAAU;AAVA,SAAAA;AAAA,GAAA;AAqBL,MAAM,uBAA4C;AAAA,EACvD,iBAAiB;AAAA;AAAA,EACjB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,sBAAsB;AAAA;AACxB;AASO,MAAM,iBAAiC;AAAA,EAC5C;AAAA,IACE,SAAS,CAAC,UAAU,QAAQ,QAAQ,MAAM;AAAA,IAC1C,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS,CAAC,QAAQ,SAAS,QAAQ,MAAM;AAAA,IACzC,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS,CAAC,SAAS,QAAQ,MAAM;AAAA,IACjC,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS,CAAC,QAAQ,QAAQ,QAAQ,MAAM;AAAA,IACxC,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS,CAAC,QAAQ,UAAU,MAAM;AAAA,IAClC,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS,CAAC,QAAQ,SAAS,QAAQ;AAAA,IACnC,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAYO,IAAK,sBAAL,kBAAKC,yBAAL;AACL,EAAAA,qBAAA,kBAAe;AACf,EAAAA,qBAAA,mBAAgB;AAChB,EAAAA,qBAAA,eAAY;AACZ,EAAAA,qBAAA,sBAAmB;AAJT,SAAAA;AAAA,GAAA;",
|
|
6
|
+
"names": ["TraceType", "CompressionStrategy"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/utils/async-mutex.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Simple async mutex implementation for thread-safe operations\n * Prevents race conditions when multiple async operations compete for the same resource\n */\n\nexport class AsyncMutex {\n private locked = false;\n private waiting: Array<() => void> = [];\n private lockHolder: string | null = null;\n private lockAcquiredAt: number = 0;\n private readonly lockTimeout: number;\n\n constructor(lockTimeoutMs: number = 300000) {\n // Default 5 minute timeout\n this.lockTimeout = lockTimeoutMs;\n }\n\n /**\n * Acquire the lock. Waits if already locked.\n * Returns a release function that MUST be called when done.\n */\n async acquire(holder?: string): Promise<() => void> {\n // Check for stale lock (lock timeout)\n if (this.locked && this.lockAcquiredAt > 0) {\n const elapsed = Date.now() - this.lockAcquiredAt;\n if (elapsed > this.lockTimeout) {\n console.warn(\n `[AsyncMutex] Stale lock detected (held by ${this.lockHolder} for ${elapsed}ms), forcing release`\n );\n this.forceRelease();\n }\n }\n\n if (!this.locked) {\n this.locked = true;\n this.lockHolder = holder || 'unknown';\n this.lockAcquiredAt = Date.now();\n return () => this.release();\n }\n\n // Wait for lock to be released\n return new Promise((resolve) => {\n this.waiting.push(() => {\n this.locked = true;\n this.lockHolder = holder || 'unknown';\n this.lockAcquiredAt = Date.now();\n resolve(() => this.release());\n });\n });\n }\n\n /**\n * Try to acquire the lock without waiting\n * Returns release function if acquired, null if already locked\n */\n tryAcquire(holder?: string): (() => void) | null {\n // Check for stale lock\n if (this.locked && this.lockAcquiredAt > 0) {\n const elapsed = Date.now() - this.lockAcquiredAt;\n if (elapsed > this.lockTimeout) {\n console.warn(\n `[AsyncMutex] Stale lock detected (held by ${this.lockHolder} for ${elapsed}ms), forcing release`\n );\n this.forceRelease();\n }\n }\n\n if (!this.locked) {\n this.locked = true;\n this.lockHolder = holder || 'unknown';\n this.lockAcquiredAt = Date.now();\n return () => this.release();\n }\n return null;\n }\n\n private release(): void {\n const next = this.waiting.shift();\n if (next) {\n next();\n } else {\n this.locked = false;\n this.lockHolder = null;\n this.lockAcquiredAt = 0;\n }\n }\n\n private forceRelease(): void {\n this.locked = false;\n this.lockHolder = null;\n this.lockAcquiredAt = 0;\n }\n\n /**\n * Execute a function while holding the lock\n */\n async withLock<T>(fn: () => Promise<T>, holder?: string): Promise<T> {\n const release = await this.acquire(holder);\n try {\n return await fn();\n } finally {\n release();\n }\n }\n\n /**\n * Check if currently locked\n */\n isLocked(): boolean {\n return this.locked;\n }\n\n /**\n * Get current lock status\n */\n getStatus(): {\n locked: boolean;\n holder: string | null;\n acquiredAt: number;\n waitingCount: number;\n } {\n return {\n locked: this.locked,\n holder: this.lockHolder,\n acquiredAt: this.lockAcquiredAt,\n waitingCount: this.waiting.length,\n };\n }\n}\n\n// Singleton instance for sync operations\nexport const syncMutex = new AsyncMutex(300000); // 5 minute timeout\n"],
|
|
5
|
+
"mappings": ";;;;AAKO,MAAM,WAAW;AAAA,EACd,SAAS;AAAA,EACT,UAA6B,CAAC;AAAA,EAC9B,aAA4B;AAAA,EAC5B,iBAAyB;AAAA,EAChB;AAAA,EAEjB,YAAY,gBAAwB,KAAQ;AAE1C,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,QAAsC;AAElD,QAAI,KAAK,UAAU,KAAK,iBAAiB,GAAG;AAC1C,YAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,UAAI,UAAU,KAAK,aAAa;AAC9B,gBAAQ;AAAA,UACN,6CAA6C,KAAK,UAAU,QAAQ,OAAO;AAAA,QAC7E;AACA,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS;AACd,WAAK,aAAa,UAAU;AAC5B,WAAK,iBAAiB,KAAK,IAAI;AAC/B,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B;AAGA,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,QAAQ,KAAK,MAAM;AACtB,aAAK,SAAS;AACd,aAAK,aAAa,UAAU;AAC5B,aAAK,iBAAiB,KAAK,IAAI;AAC/B,gBAAQ,MAAM,KAAK,QAAQ,CAAC;AAAA,MAC9B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,QAAsC;AAE/C,QAAI,KAAK,UAAU,KAAK,iBAAiB,GAAG;AAC1C,YAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,UAAI,UAAU,KAAK,aAAa;AAC9B,gBAAQ;AAAA,UACN,6CAA6C,KAAK,UAAU,QAAQ,OAAO;AAAA,QAC7E;AACA,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS;AACd,WAAK,aAAa,UAAU;AAC5B,WAAK,iBAAiB,KAAK,IAAI;AAC/B,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAgB;AACtB,UAAM,OAAO,KAAK,QAAQ,MAAM;AAChC,QAAI,MAAM;AACR,WAAK;AAAA,IACP,OAAO;AACL,WAAK,SAAS;AACd,WAAK,aAAa;AAClB,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,eAAqB;AAC3B,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAY,IAAsB,QAA6B;AACnE,UAAM,UAAU,MAAM,KAAK,QAAQ,MAAM;AACzC,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAKE;AACA,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;AAGO,MAAM,YAAY,IAAI,WAAW,GAAM;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/utils/compression.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Compression utilities for storage optimization\n */\n\nimport zlib from 'zlib';\nimport { promisify } from 'util';\n\nconst gzipAsync = promisify(zlib.gzip);\nconst gunzipAsync = promisify(zlib.gunzip);\nconst brotliCompressAsync = promisify(zlib.brotliCompress);\nconst brotliDecompressAsync = promisify(zlib.brotliDecompress);\n\nexport enum CompressionType {\n NONE = 'none',\n GZIP = 'gzip',\n BROTLI = 'brotli',\n}\n\nexport interface CompressionOptions {\n type?: CompressionType;\n level?: number;\n}\n\n/**\n * Compress data using specified algorithm\n */\nexport async function compress(\n data: string | Buffer,\n options: CompressionOptions = {}\n): Promise<Buffer> {\n const { type = CompressionType.GZIP, level = 6 } = options;\n\n const input = typeof data === 'string' ? Buffer.from(data, 'utf8') : data;\n\n switch (type) {\n case CompressionType.NONE:\n return input;\n\n case CompressionType.GZIP:\n return gzipAsync(input, { level });\n\n case CompressionType.BROTLI:\n return brotliCompressAsync(input, {\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: level,\n },\n });\n\n default:\n throw new Error(`Unknown compression type: ${type}`);\n }\n}\n\n/**\n * Decompress data\n */\nexport async function decompress(\n data: Buffer,\n type: CompressionType = CompressionType.GZIP\n): Promise<string> {\n let decompressed: Buffer;\n\n switch (type) {\n case CompressionType.NONE:\n decompressed = data;\n break;\n\n case CompressionType.GZIP:\n decompressed = await gunzipAsync(data);\n break;\n\n case CompressionType.BROTLI:\n decompressed = await brotliDecompressAsync(data);\n break;\n\n default:\n throw new Error(`Unknown compression type: ${type}`);\n }\n\n return decompressed.toString('utf8');\n}\n\n/**\n * Calculate compression ratio\n */\nexport function compressionRatio(original: number, compressed: number): number {\n if (original === 0) return 0;\n return (1 - compressed / original) * 100;\n}\n\n/**\n * Auto-detect compression type from buffer\n */\nexport function detectCompressionType(data: Buffer): CompressionType {\n // Check for gzip magic number\n if (data.length >= 2 && data[0] === 0x1f && data[1] === 0x8b) {\n return CompressionType.GZIP;\n }\n\n // Check for brotli\n // Brotli doesn't have a consistent magic number, but we can try to decompress\n // This is a heuristic approach\n if (data.length >= 4 && data[0] === 0xce && data[1] === 0xb2) {\n return CompressionType.BROTLI;\n }\n\n return CompressionType.NONE;\n}\n\n/**\n * Choose optimal compression based on data characteristics\n */\nexport function chooseOptimalCompression(\n data: string | Buffer,\n speedPriority: boolean = false\n): CompressionType {\n const size = typeof data === 'string' ? Buffer.byteLength(data) : data.length;\n\n // Don't compress small data\n if (size < 1024) {\n return CompressionType.NONE;\n }\n\n // Use gzip for speed priority or medium data\n if (speedPriority || size < 100 * 1024) {\n return CompressionType.GZIP;\n }\n\n // Use brotli for large data and better compression\n return CompressionType.BROTLI;\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAIA,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAE1B,MAAM,YAAY,UAAU,KAAK,IAAI;AACrC,MAAM,cAAc,UAAU,KAAK,MAAM;AACzC,MAAM,sBAAsB,UAAU,KAAK,cAAc;AACzD,MAAM,wBAAwB,UAAU,KAAK,gBAAgB;AAEtD,IAAK,kBAAL,kBAAKA,qBAAL;AACL,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,YAAS;AAHC,SAAAA;AAAA,GAAA;AAcZ,eAAsB,SACpB,MACA,UAA8B,CAAC,GACd;AACjB,QAAM,EAAE,OAAO,mBAAsB,QAAQ,EAAE,IAAI;AAEnD,QAAM,QAAQ,OAAO,SAAS,WAAW,OAAO,KAAK,MAAM,MAAM,IAAI;AAErE,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IAET,KAAK;AACH,aAAO,UAAU,OAAO,EAAE,MAAM,CAAC;AAAA,IAEnC,KAAK;AACH,aAAO,oBAAoB,OAAO;AAAA,QAChC,QAAQ;AAAA,UACN,CAAC,KAAK,UAAU,oBAAoB,GAAG;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IAEH;AACE,YAAM,IAAI,MAAM,6BAA6B,IAAI,EAAE;AAAA,EACvD;AACF;AAKA,eAAsB,WACpB,MACA,OAAwB,mBACP;AACjB,MAAI;AAEJ,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,qBAAe;AACf;AAAA,IAEF,KAAK;AACH,qBAAe,MAAM,YAAY,IAAI;AACrC;AAAA,IAEF,KAAK;AACH,qBAAe,MAAM,sBAAsB,IAAI;AAC/C;AAAA,IAEF;AACE,YAAM,IAAI,MAAM,6BAA6B,IAAI,EAAE;AAAA,EACvD;AAEA,SAAO,aAAa,SAAS,MAAM;AACrC;AAKO,SAAS,iBAAiB,UAAkB,YAA4B;AAC7E,MAAI,aAAa,EAAG,QAAO;AAC3B,UAAQ,IAAI,aAAa,YAAY;AACvC;AAKO,SAAS,sBAAsB,MAA+B;AAEnE,MAAI,KAAK,UAAU,KAAK,KAAK,CAAC,MAAM,MAAQ,KAAK,CAAC,MAAM,KAAM;AAC5D,WAAO;AAAA,EACT;AAKA,MAAI,KAAK,UAAU,KAAK,KAAK,CAAC,MAAM,OAAQ,KAAK,CAAC,MAAM,KAAM;AAC5D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,SAAS,yBACd,MACA,gBAAyB,OACR;AACjB,QAAM,OAAO,OAAO,SAAS,WAAW,OAAO,WAAW,IAAI,IAAI,KAAK;AAGvE,MAAI,OAAO,MAAM;AACf,WAAO;AAAA,EACT;AAGA,MAAI,iBAAiB,OAAO,MAAM,MAAM;AACtC,WAAO;AAAA,EACT;AAGA,SAAO;AACT;",
|
|
6
|
+
"names": ["CompressionType"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/utils/update-checker.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Update checker for StackMemory\n * Checks npm registry for newer versions\n */\n\nimport { execSync, execFileSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { logger } from '../monitoring/logger.js';\nimport {\n SystemError,\n ErrorCode,\n getErrorMessage,\n wrapError,\n} from '../errors/index.js';\nimport { withTimeout, gracefulDegrade } from '../errors/recovery.js';\n\ninterface UpdateCache {\n lastChecked: number;\n latestVersion: string;\n currentVersion: string;\n}\n\nexport class UpdateChecker {\n private static CACHE_FILE = join(\n homedir(),\n '.stackmemory',\n 'update-check.json'\n );\n private static CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours\n private static PACKAGE_NAME = '@stackmemoryai/stackmemory';\n\n /**\n * Check for updates and display notification if needed\n */\n static async checkForUpdates(\n currentVersion: string,\n silent = false\n ): Promise<void> {\n try {\n // Check cache first\n const cache = this.loadCache();\n const now = Date.now();\n\n // Skip check if we checked recently\n if (cache && now - cache.lastChecked < this.CHECK_INTERVAL) {\n if (\n !silent &&\n cache.latestVersion &&\n cache.latestVersion !== currentVersion\n ) {\n this.displayUpdateNotification(currentVersion, cache.latestVersion);\n }\n return;\n }\n\n // Fetch latest version from npm\n const latestVersion = await this.fetchLatestVersion();\n\n // Update cache\n this.saveCache({\n lastChecked: now,\n latestVersion,\n currentVersion,\n });\n\n // Display notification if update available\n if (\n !silent &&\n latestVersion &&\n this.isNewerVersion(currentVersion, latestVersion)\n ) {\n this.displayUpdateNotification(currentVersion, latestVersion);\n }\n } catch (error: unknown) {\n // Log the error with proper context but don't interrupt user workflow\n const wrappedError = wrapError(\n error,\n 'Update check failed',\n ErrorCode.INTERNAL_ERROR,\n { currentVersion, silent }\n );\n logger.debug('Update check failed:', {\n error: getErrorMessage(error),\n context: wrappedError.context,\n });\n }\n }\n\n /**\n * Fetch latest version from npm registry\n */\n private static async fetchLatestVersion(): Promise<string> {\n try {\n // Use timeout to prevent hanging on slow network\n const fetchVersion = async () => {\n const output = execFileSync('npm', ['view', this.PACKAGE_NAME, 'version'], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore'],\n timeout: 5000, // 5 second timeout\n }).trim();\n return output;\n };\n\n // Wrap with timeout and graceful degradation\n return await gracefulDegrade(\n () => withTimeout(fetchVersion, 5000, 'npm registry timeout'),\n '',\n { operation: 'fetchLatestVersion', package: this.PACKAGE_NAME }\n );\n } catch (error: unknown) {\n const wrappedError = wrapError(\n error,\n 'Failed to fetch latest version from npm',\n ErrorCode.SERVICE_UNAVAILABLE,\n { package: this.PACKAGE_NAME }\n );\n logger.debug('Failed to fetch latest version:', {\n error: getErrorMessage(error),\n context: wrappedError.context,\n });\n return '';\n }\n }\n\n /**\n * Compare version strings\n */\n private static isNewerVersion(current: string, latest: string): boolean {\n try {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n\n // Handle malformed version strings\n if (currentParts.some(isNaN) || latestParts.some(isNaN)) {\n logger.debug('Invalid version format:', { current, latest });\n return false;\n }\n\n for (let i = 0; i < 3; i++) {\n const latestPart = latestParts[i] ?? 0;\n const currentPart = currentParts[i] ?? 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n return false;\n } catch (error: unknown) {\n logger.debug('Version comparison failed:', {\n error: getErrorMessage(error),\n current,\n latest,\n });\n return false;\n }\n }\n\n /**\n * Display update notification\n */\n private static displayUpdateNotification(\n current: string,\n latest: string\n ): void {\n console.log('\\n' + '\u2500'.repeat(60));\n console.log('\uD83D\uDCE6 StackMemory Update Available!');\n console.log(` Current: v${current}`);\n console.log(` Latest: v${latest}`);\n console.log('\\n Update with:');\n console.log(' npm install -g @stackmemoryai/stackmemory@latest');\n console.log('\u2500'.repeat(60) + '\\n');\n }\n\n /**\n * Load update cache\n */\n private static loadCache(): UpdateCache | null {\n try {\n if (!existsSync(this.CACHE_FILE)) {\n return null;\n }\n\n const data = readFileSync(this.CACHE_FILE, 'utf-8');\n const cache = JSON.parse(data) as UpdateCache;\n\n // Validate cache structure\n if (\n typeof cache.lastChecked !== 'number' ||\n typeof cache.latestVersion !== 'string' ||\n typeof cache.currentVersion !== 'string'\n ) {\n logger.debug('Invalid cache format, ignoring');\n return null;\n }\n\n return cache;\n } catch (error: unknown) {\n // Cache errors should not interrupt operation\n const wrappedError = wrapError(\n error,\n 'Failed to load update cache',\n ErrorCode.INTERNAL_ERROR,\n { cacheFile: this.CACHE_FILE }\n );\n logger.debug('Failed to load update cache:', {\n error: getErrorMessage(error),\n context: wrappedError.context,\n });\n return null;\n }\n }\n\n /**\n * Save update cache\n */\n private static saveCache(cache: UpdateCache): void {\n try {\n const dir = join(homedir(), '.stackmemory');\n\n // Create directory if it doesn't exist (safer than execSync)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o755 });\n }\n\n // Write cache with atomic operation (write to temp, then rename)\n const tempFile = `${this.CACHE_FILE}.tmp`;\n writeFileSync(tempFile, JSON.stringify(cache, null, 2), {\n mode: 0o644,\n });\n\n // Atomic rename\n if (existsSync(this.CACHE_FILE)) {\n writeFileSync(this.CACHE_FILE, JSON.stringify(cache, null, 2));\n } else {\n writeFileSync(this.CACHE_FILE, JSON.stringify(cache, null, 2));\n }\n } catch (error: unknown) {\n // Cache save errors should not interrupt operation\n const wrappedError = wrapError(\n error,\n 'Failed to save update cache',\n ErrorCode.INTERNAL_ERROR,\n { cacheFile: this.CACHE_FILE, cache }\n );\n logger.debug('Failed to save update cache:', {\n error: getErrorMessage(error),\n context: wrappedError.context,\n });\n }\n }\n\n /**\n * Force check for updates (ignores cache)\n */\n static async forceCheck(currentVersion: string): Promise<void> {\n try {\n const latestVersion = await this.fetchLatestVersion();\n\n // Update cache\n this.saveCache({\n lastChecked: Date.now(),\n latestVersion,\n currentVersion,\n });\n\n if (latestVersion) {\n if (this.isNewerVersion(currentVersion, latestVersion)) {\n this.displayUpdateNotification(currentVersion, latestVersion);\n } else {\n console.log(`\u2705 StackMemory is up to date (v${currentVersion})`);\n }\n }\n } catch (error: unknown) {\n console.error('\u274C Update check failed:', (error as Error).message);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|