@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
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/storage/remote-storage.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Remote Storage Interface for Two-Tier Storage System\n * Implements infinite retention with TimeSeries DB + S3\n */\n\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n} from '@aws-sdk/client-s3';\nimport { Storage } from '@google-cloud/storage';\nimport { logger } from '../monitoring/logger.js';\nimport { Trace, CompressedTrace } from '../trace/types.js';\nimport Database from 'better-sqlite3';\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 enum StorageTier {\n HOT = 'hot', // < 7 days - Railway Buckets or GCS Standard\n NEARLINE = 'nearline', // 7-30 days - GCS Nearline ($0.01/GB)\n COLDLINE = 'coldline', // 30-90 days - GCS Coldline ($0.004/GB)\n ARCHIVE = 'archive', // > 90 days - GCS Archive ($0.0012/GB)\n}\n\nexport interface RemoteStorageConfig {\n provider: 'gcs' | 's3' | 'railway';\n gcs?: {\n bucketName: string;\n projectId: string;\n keyFilename?: string; // Path to service account key\n };\n s3?: {\n bucket: string;\n region: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n endpoint?: string; // For Railway buckets or MinIO\n };\n timeseries: {\n type: 'clickhouse' | 'timescale' | 'influxdb' | 'sqlite'; // SQLite for dev\n host: string;\n port: number;\n database: string;\n username?: string;\n password?: string;\n };\n migration: {\n batchSize: number;\n hotAgeHours: number; // < 7 days\n nearlineAgeHours: number; // 7-30 days\n coldlineAgeHours: number; // 30-90 days\n archiveAgeHours: number; // > 90 days\n scoreThreshold: number; // Score threshold for early migration\n };\n}\n\nexport const DEFAULT_REMOTE_CONFIG: RemoteStorageConfig = {\n provider: 'gcs', // Default to GCS for better pricing\n gcs: {\n bucketName: 'stackmemory-traces',\n projectId: process.env['GCP_PROJECT_ID'] || 'stackmemory',\n },\n timeseries: {\n type: 'sqlite', // Use SQLite for development\n host: 'localhost',\n port: 0,\n database: 'stackmemory_timeseries',\n },\n migration: {\n batchSize: 100,\n hotAgeHours: 168, // 7 days\n nearlineAgeHours: 720, // 30 days\n coldlineAgeHours: 2160, // 90 days\n archiveAgeHours: 8760, // 365 days\n scoreThreshold: 0.4,\n },\n};\n\nexport interface MigrationCandidate {\n traceId: string;\n age: number;\n score: number;\n size: number;\n tier: StorageTier;\n shouldMigrate: boolean;\n compressionLevel: 'none' | 'light' | 'medium' | 'heavy';\n}\n\n/**\n * Remote storage manager for infinite trace retention\n */\nexport class RemoteStorageManager {\n private storageClient?: S3Client | Storage;\n private config: RemoteStorageConfig;\n private localDb: Database.Database;\n private migrationInProgress = false;\n\n constructor(\n localDb: Database.Database,\n config?: Partial<RemoteStorageConfig>\n ) {\n this.localDb = localDb;\n this.config = { ...DEFAULT_REMOTE_CONFIG, ...config };\n\n this.initializeStorageClient();\n this.initializeSchema();\n }\n\n /**\n * Initialize storage client based on provider\n */\n private initializeStorageClient(): void {\n switch (this.config.provider) {\n case 'gcs':\n if (this.config.gcs) {\n this.storageClient = new Storage({\n projectId: this.config.gcs.projectId,\n keyFilename: this.config.gcs.keyFilename,\n });\n }\n break;\n\n case 's3':\n case 'railway':\n if (this.config.s3?.accessKeyId && this.config.s3?.secretAccessKey) {\n this.storageClient = new S3Client({\n region: this.config.s3.region,\n credentials: {\n accessKeyId: this.config.s3.accessKeyId,\n secretAccessKey: this.config.s3.secretAccessKey,\n },\n endpoint: this.config.s3.endpoint, // Railway buckets endpoint\n });\n }\n break;\n }\n }\n\n /**\n * Initialize migration tracking schema\n */\n private initializeSchema(): void {\n this.localDb.exec(`\n CREATE TABLE IF NOT EXISTS remote_migrations (\n trace_id TEXT PRIMARY KEY,\n migrated_at INTEGER NOT NULL,\n storage_tier TEXT NOT NULL,\n s3_key TEXT,\n timeseries_id TEXT,\n compression_level TEXT,\n original_size INTEGER,\n compressed_size INTEGER,\n retrieval_count INTEGER DEFAULT 0,\n last_retrieved INTEGER,\n FOREIGN KEY (trace_id) REFERENCES traces(id) ON DELETE CASCADE\n )\n `);\n\n this.localDb.exec(`\n CREATE INDEX IF NOT EXISTS idx_migrations_tier ON remote_migrations(storage_tier);\n CREATE INDEX IF NOT EXISTS idx_migrations_migrated ON remote_migrations(migrated_at);\n `);\n }\n\n /**\n * Identify traces for migration based on age and importance\n */\n async identifyMigrationCandidates(): Promise<MigrationCandidate[]> {\n const now = Date.now();\n\n // Query all traces with their metadata\n const traces = this.localDb\n .prepare(\n `\n SELECT \n t.id,\n t.score,\n t.start_time,\n LENGTH(t.compressed_data) + \n COALESCE((SELECT SUM(LENGTH(tc.arguments) + LENGTH(tc.result)) \n FROM tool_calls tc WHERE tc.trace_id = t.id), 0) as size,\n rm.trace_id as already_migrated\n FROM traces t\n LEFT JOIN remote_migrations rm ON t.id = rm.trace_id\n WHERE rm.trace_id IS NULL -- Not already migrated\n ORDER BY t.start_time ASC\n `\n )\n .all() as any[];\n\n const candidates: MigrationCandidate[] = [];\n\n for (const trace of traces) {\n const ageHours = (now - trace.start_time) / (1000 * 60 * 60);\n const candidate = this.evaluateTrace(\n trace.id,\n ageHours,\n trace.score,\n trace.size || 0\n );\n\n candidates.push(candidate);\n }\n\n return candidates;\n }\n\n /**\n * Evaluate a trace for migration based on GCS storage classes\n */\n private evaluateTrace(\n traceId: string,\n ageHours: number,\n score: number,\n size: number\n ): MigrationCandidate {\n let tier = StorageTier.HOT;\n let shouldMigrate = false;\n let compressionLevel: 'none' | 'light' | 'medium' | 'heavy' = 'none';\n\n // Determine storage tier based on age and GCS storage classes\n if (ageHours > this.config.migration.archiveAgeHours) {\n // GCS Archive: $0.0012/GB - accessed < once per year\n tier = StorageTier.ARCHIVE;\n shouldMigrate = true;\n compressionLevel = 'heavy';\n } else if (ageHours > this.config.migration.coldlineAgeHours) {\n // GCS Coldline: $0.004/GB - accessed < once per quarter\n tier = StorageTier.COLDLINE;\n shouldMigrate = true;\n compressionLevel = 'heavy';\n } else if (ageHours > this.config.migration.nearlineAgeHours) {\n // GCS Nearline: $0.01/GB - accessed < once per month\n tier = StorageTier.NEARLINE;\n shouldMigrate = true;\n compressionLevel = 'medium';\n } else if (ageHours > this.config.migration.hotAgeHours) {\n // Still hot but consider migration if low importance\n tier = StorageTier.HOT;\n if (score < this.config.migration.scoreThreshold) {\n shouldMigrate = true;\n compressionLevel = 'light';\n }\n }\n\n // Force migration for size pressure\n const localSizeLimit = 2 * 1024 * 1024 * 1024; // 2GB\n const currentLocalSize = this.getLocalStorageSize();\n\n if (currentLocalSize > localSizeLimit * 0.75) {\n // Start migrating when 75% full\n shouldMigrate = true;\n if (compressionLevel === 'none') {\n compressionLevel = 'light';\n }\n }\n\n return {\n traceId,\n age: ageHours,\n score,\n size,\n tier,\n shouldMigrate,\n compressionLevel,\n };\n }\n\n /**\n * Migrate traces to remote storage\n */\n async migrateTraces(\n candidates: MigrationCandidate[],\n dryRun: boolean = false\n ): Promise<{\n migrated: number;\n failed: number;\n totalSize: number;\n errors: string[];\n }> {\n if (this.migrationInProgress) {\n return {\n migrated: 0,\n failed: 0,\n totalSize: 0,\n errors: ['Migration already in progress'],\n };\n }\n\n this.migrationInProgress = true;\n const results = {\n migrated: 0,\n failed: 0,\n totalSize: 0,\n errors: [] as string[],\n };\n\n try {\n // Process in batches\n const toMigrate = candidates.filter((c: any) => c.shouldMigrate);\n const batches = this.createBatches(\n toMigrate,\n this.config.migration.batchSize\n );\n\n for (const batch of batches) {\n if (dryRun) {\n logger.info('Dry run - would migrate batch', {\n count: batch.length,\n totalSize: batch.reduce((sum, c) => sum + c.size, 0),\n });\n results.migrated += batch.length;\n continue;\n }\n\n const batchResults = await this.migrateBatch(batch);\n results.migrated += batchResults.success;\n results.failed += batchResults.failed;\n results.totalSize += batchResults.totalSize;\n results.errors.push(...batchResults.errors);\n\n // Small delay between batches\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n } finally {\n this.migrationInProgress = false;\n }\n\n logger.info('Migration completed', results);\n return results;\n }\n\n /**\n * Migrate a batch of traces\n */\n private async migrateBatch(batch: MigrationCandidate[]): Promise<{\n success: number;\n failed: number;\n totalSize: number;\n errors: string[];\n }> {\n const results = {\n success: 0,\n failed: 0,\n totalSize: 0,\n errors: [] as string[],\n };\n\n for (const candidate of batch) {\n try {\n // Get full trace data\n const trace = this.getTraceData(candidate.traceId);\n if (!trace) {\n throw new Error(`Trace ${candidate.traceId} not found`);\n }\n\n // Compress based on level\n const compressed = this.compressTrace(\n trace,\n candidate.compressionLevel\n );\n\n // Upload to S3\n if (this.s3Client) {\n const s3Key = this.generateS3Key(candidate);\n await this.uploadToS3(s3Key, compressed);\n\n // Record migration\n this.recordMigration(candidate, s3Key, trace, compressed);\n } else {\n // Local simulation for testing\n this.recordMigration(candidate, 'simulated', trace, compressed);\n }\n\n // Optionally remove from local after successful migration\n if (\n candidate.tier === StorageTier.COLD ||\n candidate.tier === StorageTier.ARCHIVE\n ) {\n this.removeLocalTrace(candidate.traceId);\n }\n\n results.success++;\n results.totalSize += candidate.size;\n } catch (error: unknown) {\n results.failed++;\n results.errors.push(`Failed to migrate ${candidate.traceId}: ${error}`);\n logger.error('Migration failed for trace', {\n traceId: candidate.traceId,\n error,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get full trace data for migration\n */\n private getTraceData(traceId: string): any {\n const traceRow = this.localDb\n .prepare('SELECT * FROM traces WHERE id = ?')\n .get(traceId);\n\n if (!traceRow) return null;\n\n const toolCalls = this.localDb\n .prepare(\n 'SELECT * FROM tool_calls WHERE trace_id = ? ORDER BY sequence_number'\n )\n .all(traceId);\n\n return {\n trace: traceRow,\n toolCalls,\n };\n }\n\n /**\n * Compress trace based on compression level\n */\n private compressTrace(\n data: any,\n level: 'none' | 'light' | 'medium' | 'heavy'\n ): Buffer {\n const jsonData = JSON.stringify(data);\n\n // Apply different compression based on level\n switch (level) {\n case 'none':\n return Buffer.from(jsonData);\n\n case 'light':\n // Remove formatting, keep all data\n return Buffer.from(JSON.stringify(JSON.parse(jsonData)));\n\n case 'medium':\n // Remove null fields and compress\n const cleaned = JSON.parse(jsonData, (key, value) =>\n value === null || value === undefined ? undefined : value\n );\n return Buffer.from(JSON.stringify(cleaned));\n\n case 'heavy':\n // Remove tool results and arguments, keep only essential\n const minimal = {\n id: data.trace.id,\n type: data.trace.type,\n score: data.trace.score,\n summary: data.trace.summary,\n timestamps: {\n start: data.trace.start_time,\n end: data.trace.end_time,\n },\n toolCount: data.toolCalls.length,\n toolTypes: [...new Set(data.toolCalls.map((t: any) => t.tool))],\n };\n return Buffer.from(JSON.stringify(minimal));\n\n default:\n return Buffer.from(jsonData);\n }\n }\n\n /**\n * Generate S3 key for trace\n */\n private generateS3Key(candidate: MigrationCandidate): string {\n const date = new Date(Date.now() - candidate.age * 60 * 60 * 1000);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `traces/${year}/${month}/${day}/${candidate.tier}/${candidate.traceId}.json`;\n }\n\n /**\n * Upload to S3\n */\n private async uploadToS3(key: string, data: Buffer): Promise<void> {\n if (!this.s3Client) {\n throw new Error('S3 client not configured');\n }\n\n const command = new PutObjectCommand({\n Bucket: this.config.s3.bucket,\n Key: key,\n Body: data,\n ContentType: 'application/json',\n Metadata: {\n 'trace-version': '1.0',\n compression: 'true',\n },\n });\n\n await this.s3Client.send(command);\n }\n\n /**\n * Record migration in local database\n */\n private recordMigration(\n candidate: MigrationCandidate,\n s3Key: string,\n originalData: any,\n compressedData: Buffer\n ): void {\n const stmt = this.localDb.prepare(`\n INSERT INTO remote_migrations (\n trace_id, migrated_at, storage_tier, s3_key,\n compression_level, original_size, compressed_size\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n candidate.traceId,\n Date.now(),\n candidate.tier,\n s3Key,\n candidate.compressionLevel,\n JSON.stringify(originalData).length,\n compressedData.length\n );\n }\n\n /**\n * Remove local trace after migration\n */\n private removeLocalTrace(traceId: string): void {\n this.localDb\n .prepare('DELETE FROM tool_calls WHERE trace_id = ?')\n .run(traceId);\n this.localDb.prepare('DELETE FROM traces WHERE id = ?').run(traceId);\n }\n\n /**\n * Get current local storage size\n */\n private getLocalStorageSize(): number {\n const result = this.localDb\n .prepare(\n `\n SELECT \n SUM(LENGTH(compressed_data)) +\n COALESCE((SELECT SUM(LENGTH(arguments) + LENGTH(result)) \n FROM tool_calls), 0) as total_size\n FROM traces\n `\n )\n .get() as any;\n\n return result?.total_size || 0;\n }\n\n /**\n * Create batches from candidates\n */\n private createBatches<T>(items: T[], batchSize: number): T[][] {\n const batches: T[][] = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push(items.slice(i, i + batchSize));\n }\n return batches;\n }\n\n /**\n * Retrieve trace from remote storage\n */\n async retrieveTrace(traceId: string): Promise<any> {\n const migration = this.localDb\n .prepare(\n `\n SELECT * FROM remote_migrations WHERE trace_id = ?\n `\n )\n .get(traceId) as any;\n\n if (!migration) {\n throw new Error(`Trace ${traceId} not found in remote storage`);\n }\n\n // Update retrieval count\n this.localDb\n .prepare(\n `\n UPDATE remote_migrations \n SET retrieval_count = retrieval_count + 1, last_retrieved = ?\n WHERE trace_id = ?\n `\n )\n .run(Date.now(), traceId);\n\n if (!this.s3Client) {\n throw new Error('S3 client not configured');\n }\n\n // Retrieve from S3\n const command = new GetObjectCommand({\n Bucket: this.config.s3.bucket,\n Key: migration.s3_key,\n });\n\n const response = await this.s3Client.send(command);\n const data = await response.Body?.transformToString();\n\n if (!data) {\n throw new Error('No data retrieved from S3');\n }\n\n return JSON.parse(data);\n }\n\n /**\n * Get migration statistics\n */\n getMigrationStats(): any {\n const stats = this.localDb\n .prepare(\n `\n SELECT \n storage_tier,\n COUNT(*) as count,\n SUM(original_size) as original_size,\n SUM(compressed_size) as compressed_size,\n AVG(retrieval_count) as avg_retrievals\n FROM remote_migrations\n GROUP BY storage_tier\n `\n )\n .all();\n\n const total = this.localDb\n .prepare(\n `\n SELECT \n COUNT(*) as total_migrated,\n SUM(original_size) as total_original,\n SUM(compressed_size) as total_compressed\n FROM remote_migrations\n `\n )\n .get();\n\n return {\n byTier: stats,\n total,\n compressionRatio: total\n ? (\n 1 -\n (total as any).total_compressed / (total as any).total_original\n ).toFixed(2)\n : 0,\n localSize: this.getLocalStorageSize(),\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["StorageTier"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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": ";;;;AAMA,SAAS,aAAa;AACtB,SAAS,cAAc;AAEvB,SAAS,OAAO,KAAa,cAA+B;AAC1D,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,UAAU,QAAW;AACvB,QAAI,iBAAiB,OAAW,QAAO;AACvC,UAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,QAAQ,IAAI,GAAG;AACxB;AAEO,SAAS,YAAY,SAA2B;AACrD,QAAM,iBAAiB,QAAQ,OAAO,KAAK,OAAO;AAElD,UAAQ,OAAO,kBAAmB,MAA4B;AAE5D,UAAM,cAAc,eAAe,OAAO;AAC1C,UAAM,UAAU,KAAK,KAAK,SAAS,CAAC;AACpC,UAAM,cAAc,KAAK,MAAM,GAAG,EAAE;AAGpC,UAAM,UAAU;AAAA,MACd,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,MAClD,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK;AAAA,QACH,UAAU,QAAQ,IAAI,UAAU;AAAA,QAChC,aAAa,QAAQ,IAAI,aAAa;AAAA,QACtC,gBAAgB,QAAQ,IAAI,gBAAgB,IAAI,UAAU;AAAA,MAC5D;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAGA,WAAO,KAAK,gBAAgB,WAAW,IAAI,OAAO;AAGlD,UAAM,MAAM,QAAQ,aAAa,SAAS,YAAY;AACpD,UAAI;AAEF,cAAM,SAAS,MAAM,eAAe,MAAM,MAAM,IAAW;AAG3D,eAAO,KAAK,0BAA0B,WAAW,IAAI;AAAA,UACnD,UAAU,MACP,aAAa,EACb,KAAK,CAAC,MAAW,EAAE,SAAS,WAAW,GAAG;AAAA,QAC/C,CAAC;AAGD,YAAI,QAAQ,IAAI,aAAa,MAAM,QAAQ;AACzC,kBAAQ,IAAI,MAAM,oBAAoB,CAAC;AAAA,QACzC;AAAA,MACF,SAAS,OAAgB;AAEvB,eAAO;AAAA,UACL,uBAAuB,WAAW;AAAA,UAClC;AAAA,UACA;AAAA,QACF;AAGA,cAAM,YAAY,MAAM,aAAa;AACrC,YAAI,WAAW;AACb,kBAAQ,MAAM,gCAAyB;AACvC,kBAAQ,MAAM,MAAM,UAAU,IAAI,EAAE;AACpC,cAAI,UAAU,QAAQ;AACpB,oBAAQ;AAAA,cACN;AAAA,cACA,KAAK,UAAU,UAAU,QAAQ,MAAM,CAAC;AAAA,YAC1C;AAAA,UACF;AACA,kBAAQ,MAAM,qBAAqB,UAAU,KAAK;AAAA,QACpD;AAGA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAGD,UAAQ,SAAS,QAAQ,CAAC,eAAe;AACvC,gBAAY,UAAU;AAAA,EACxB,CAAC;AAED,SAAO;AACT;AAEA,SAAS,eAAe,SAA0B;AAChD,QAAM,QAAkB,CAAC;AACzB,MAAI,UAA0B;AAE9B,SAAO,SAAS;AACd,QAAI,QAAQ,KAAK,GAAG;AAClB,YAAM,QAAQ,QAAQ,KAAK,CAAC;AAAA,IAC9B;AACA,cAAU,QAAQ;AAAA,EACpB;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAKO,SAAS,YAAY,SAA2B;AAErD,UAAQ,aAAa,CAAC,QAAQ;AAC5B,QAAI,IAAI,SAAS,oBAAoB,IAAI,SAAS,qBAAqB;AAErE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,WAAO,MAAM,aAAa,KAAK;AAAA,MAC7B,MAAM,IAAI;AAAA,MACV,UAAU,IAAI;AAAA,MACd,SAAS,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,IACzC,CAAC;AAGD,QAAI,QAAQ,IAAI,aAAa,MAAM,QAAQ;AACzC,cAAQ,MAAM,OAAO,MAAM,oBAAoB,CAAC;AAAA,IAClD;AAEA,YAAQ,KAAK,IAAI,YAAY,CAAC;AAAA,EAChC,CAAC;AAGD,UAAQ,KAAK,aAAa,CAAC,gBAAgB;AAEzC,UAAM,MAAM;AAGZ,UAAM,cAAc,eAAe,WAAW;AAC9C,WAAO,MAAM,yBAAyB,WAAW,IAAI;AAAA,MACnD,MAAM,YAAY;AAAA,MAClB,MAAM,YAAY,KAAK;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AAGD,UAAQ,KAAK,cAAc,CAAC,gBAAgB;AAE1C,UAAM,cAAc,eAAe,WAAW;AAC9C,WAAO,MAAM,wBAAwB,WAAW,EAAE;AAAA,EACpD,CAAC;AAGD,UAAQ,SAAS,QAAQ,CAAC,YAAY;AACpC,gBAAY,OAAO;AAAA,EACrB,CAAC;AAED,SAAO;AACT;AAKO,SAAS,UAAa,MAAc,IAAkC;AAC3E,SAAO,MAAM,KAAK,MAAM,EAAE;AAC5B;AAKO,SAAS,WAAc,KAAa,QAAa,IAAgB;AACtE,SAAO,MAAM,UAAU,SAAS,IAAI,UAAU,GAAG,GAAG,GAAG,QAAQ,EAAE;AACnE;AAKO,SAAS,SACd,QACA,KACA,MACA,IACY;AACZ,SAAO,MAAM,IAAI,QAAQ,KAAK,MAAM,EAAE;AACxC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
3
|
-
import { dirname as __pathDirname } from 'path';
|
|
4
|
-
const __filename = __fileURLToPath(import.meta.url);
|
|
5
|
-
const __dirname = __pathDirname(__filename);
|
|
6
|
-
import {
|
|
7
|
-
trace,
|
|
8
|
-
enableVerboseTracing,
|
|
9
|
-
createTracedDatabase,
|
|
10
|
-
traceStep
|
|
11
|
-
} from "./index.js";
|
|
12
|
-
function getEnv(key, defaultValue) {
|
|
13
|
-
const value = process.env[key];
|
|
14
|
-
if (value === void 0) {
|
|
15
|
-
if (defaultValue !== void 0) return defaultValue;
|
|
16
|
-
throw new Error(`Environment variable ${key} is required`);
|
|
17
|
-
}
|
|
18
|
-
return value;
|
|
19
|
-
}
|
|
20
|
-
function getOptionalEnv(key) {
|
|
21
|
-
return process.env[key];
|
|
22
|
-
}
|
|
23
|
-
class ExampleService {
|
|
24
|
-
data = /* @__PURE__ */ new Map();
|
|
25
|
-
async fetchData(id) {
|
|
26
|
-
await this.delay(50);
|
|
27
|
-
if (id === "error") {
|
|
28
|
-
throw new Error("Simulated API error");
|
|
29
|
-
}
|
|
30
|
-
return { id, value: Math.random() };
|
|
31
|
-
}
|
|
32
|
-
async processData(data) {
|
|
33
|
-
return traceStep("Data validation", async () => {
|
|
34
|
-
await this.delay(20);
|
|
35
|
-
if (!data.id) {
|
|
36
|
-
throw new Error("Invalid data: missing ID");
|
|
37
|
-
}
|
|
38
|
-
return traceStep("Data transformation", async () => {
|
|
39
|
-
await this.delay(30);
|
|
40
|
-
return {
|
|
41
|
-
...data,
|
|
42
|
-
processed: true,
|
|
43
|
-
timestamp: Date.now()
|
|
44
|
-
};
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
cacheData(key, value) {
|
|
49
|
-
trace.traceSync("function", "cacheData", { key, value }, () => {
|
|
50
|
-
this.data.set(key, value);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
delay(ms) {
|
|
54
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async function databaseExample() {
|
|
58
|
-
return trace.step("Database operations example", async () => {
|
|
59
|
-
const db = createTracedDatabase(":memory:");
|
|
60
|
-
db.exec(`
|
|
61
|
-
CREATE TABLE users (
|
|
62
|
-
id INTEGER PRIMARY KEY,
|
|
63
|
-
name TEXT NOT NULL,
|
|
64
|
-
email TEXT UNIQUE,
|
|
65
|
-
created_at INTEGER DEFAULT (strftime('%s', 'now'))
|
|
66
|
-
)
|
|
67
|
-
`);
|
|
68
|
-
const insert = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)");
|
|
69
|
-
insert.run("Alice", "alice@example.com");
|
|
70
|
-
insert.run("Bob", "bob@example.com");
|
|
71
|
-
const select = db.prepare("SELECT * FROM users WHERE name = ?");
|
|
72
|
-
const user = select.get("Alice");
|
|
73
|
-
const complex = db.prepare(`
|
|
74
|
-
SELECT
|
|
75
|
-
name,
|
|
76
|
-
COUNT(*) as count,
|
|
77
|
-
MAX(created_at) as latest
|
|
78
|
-
FROM users
|
|
79
|
-
GROUP BY name
|
|
80
|
-
HAVING COUNT(*) > 0
|
|
81
|
-
`);
|
|
82
|
-
const results = complex.all();
|
|
83
|
-
db.close();
|
|
84
|
-
return { user, results };
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
async function runDemo() {
|
|
88
|
-
console.log("\n" + "=".repeat(80));
|
|
89
|
-
console.log("STACKMEMORY DEBUG TRACE DEMO");
|
|
90
|
-
console.log("=".repeat(80) + "\n");
|
|
91
|
-
if (process.env["DEBUG_TRACE"] !== "true") {
|
|
92
|
-
console.log("Enabling verbose tracing for this demo...\n");
|
|
93
|
-
enableVerboseTracing();
|
|
94
|
-
}
|
|
95
|
-
try {
|
|
96
|
-
await trace.command("demo:service", { example: "service" }, async () => {
|
|
97
|
-
const service = new ExampleService();
|
|
98
|
-
console.log("\n--- Example 1: Service Operations ---\n");
|
|
99
|
-
const data = await service.fetchData("test-1");
|
|
100
|
-
const processed = await service.processData(data);
|
|
101
|
-
service.cacheData("test-1", processed);
|
|
102
|
-
console.log("Service operation completed\n");
|
|
103
|
-
});
|
|
104
|
-
await trace.command("demo:database", { example: "database" }, async () => {
|
|
105
|
-
console.log("\n--- Example 2: Database Operations ---\n");
|
|
106
|
-
const results = await databaseExample();
|
|
107
|
-
console.log("Database operations completed");
|
|
108
|
-
console.log(" Found user:", results.user);
|
|
109
|
-
console.log(" Query results:", results.results);
|
|
110
|
-
});
|
|
111
|
-
await trace.command("demo:errors", { example: "errors" }, async () => {
|
|
112
|
-
console.log("\n--- Example 3: Error Handling ---\n");
|
|
113
|
-
const service = new ExampleService();
|
|
114
|
-
try {
|
|
115
|
-
await service.fetchData("error");
|
|
116
|
-
} catch (error) {
|
|
117
|
-
console.log("Error properly traced and handled\n");
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
await trace.command(
|
|
121
|
-
"demo:performance",
|
|
122
|
-
{ example: "performance" },
|
|
123
|
-
async () => {
|
|
124
|
-
console.log("\n--- Example 4: Performance Tracking ---\n");
|
|
125
|
-
await trace.step("Slow operation", async () => {
|
|
126
|
-
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
127
|
-
});
|
|
128
|
-
for (let i = 0; i < 3; i++) {
|
|
129
|
-
await trace.step(`Fast operation ${i + 1}`, async () => {
|
|
130
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
console.log("Performance tracking completed\n");
|
|
134
|
-
}
|
|
135
|
-
);
|
|
136
|
-
} catch (error) {
|
|
137
|
-
console.error("Demo failed:", error);
|
|
138
|
-
}
|
|
139
|
-
console.log("\n" + trace.getExecutionSummary());
|
|
140
|
-
const traces = trace.exportTraces();
|
|
141
|
-
console.log(`
|
|
142
|
-
Total traces collected: ${traces.length}`);
|
|
143
|
-
if (traces.length > 0) {
|
|
144
|
-
console.log("\nExample trace entry:");
|
|
145
|
-
console.log(JSON.stringify(traces[0], null, 2));
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
149
|
-
runDemo().catch(console.error);
|
|
150
|
-
}
|
|
151
|
-
export {
|
|
152
|
-
runDemo
|
|
153
|
-
};
|
|
154
|
-
//# sourceMappingURL=trace-demo.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/core/trace/trace-demo.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Trace Demo - Shows how the debug tracing works\n * Run with: DEBUG_TRACE=true npx tsx src/core/trace/trace-demo.ts\n */\n\nimport {\n trace,\n Trace,\n TraceClass,\n enableVerboseTracing,\n createTracedDatabase,\n traceStep,\n} from './index.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\n// Example class with tracing\n// @TraceClass() - decorators not enabled in tsconfig\nclass ExampleService {\n private data: Map<string, any> = new Map();\n\n async fetchData(id: string): Promise<any> {\n // Simulate API call\n await this.delay(50);\n\n if (id === 'error') {\n throw new Error('Simulated API error');\n }\n\n return { id, value: Math.random() };\n }\n\n async processData(data: any): Promise<any> {\n return traceStep('Data validation', async () => {\n await this.delay(20);\n\n if (!data.id) {\n throw new Error('Invalid data: missing ID');\n }\n\n return traceStep('Data transformation', async () => {\n await this.delay(30);\n return {\n ...data,\n processed: true,\n timestamp: Date.now(),\n };\n });\n });\n }\n\n cacheData(key: string, value: any): void {\n trace.traceSync('function', 'cacheData', { key, value }, () => {\n this.data.set(key, value);\n });\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n// Example with database operations\nasync function databaseExample() {\n return trace.step('Database operations example', async () => {\n const db = createTracedDatabase(':memory:');\n\n // Create table\n db.exec(`\n CREATE TABLE users (\n id INTEGER PRIMARY KEY,\n name TEXT NOT NULL,\n email TEXT UNIQUE,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n\n // Insert data\n const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');\n insert.run('Alice', 'alice@example.com');\n insert.run('Bob', 'bob@example.com');\n\n // Query data\n const select = db.prepare('SELECT * FROM users WHERE name = ?');\n const user = select.get('Alice');\n\n // Complex query (will trigger slow query warning if threshold is low)\n const complex = db.prepare(`\n SELECT \n name,\n COUNT(*) as count,\n MAX(created_at) as latest\n FROM users\n GROUP BY name\n HAVING COUNT(*) > 0\n `);\n const results = complex.all();\n\n db.close();\n\n return { user, results };\n });\n}\n\n// Main demo function\nasync function runDemo() {\n console.log('\\n' + '='.repeat(80));\n console.log('STACKMEMORY DEBUG TRACE DEMO');\n console.log('='.repeat(80) + '\\n');\n\n // Enable verbose tracing for the demo\n if (process.env['DEBUG_TRACE'] !== 'true') {\n console.log('Enabling verbose tracing for this demo...\\n');\n enableVerboseTracing();\n }\n\n try {\n // Example 1: Service operations\n await trace.command('demo:service', { example: 'service' }, async () => {\n const service = new ExampleService();\n\n console.log('\\n--- Example 1: Service Operations ---\\n');\n\n // Successful operation\n const data = await service.fetchData('test-1');\n const processed = await service.processData(data);\n service.cacheData('test-1', processed);\n\n console.log('Service operation completed\\n');\n });\n\n // Example 2: Database operations\n await trace.command('demo:database', { example: 'database' }, async () => {\n console.log('\\n--- Example 2: Database Operations ---\\n');\n\n const results = await databaseExample();\n\n console.log('Database operations completed');\n console.log(' Found user:', results.user);\n console.log(' Query results:', results.results);\n });\n\n // Example 3: Error handling\n await trace.command('demo:errors', { example: 'errors' }, async () => {\n console.log('\\n--- Example 3: Error Handling ---\\n');\n\n const service = new ExampleService();\n\n try {\n await service.fetchData('error');\n } catch (error: unknown) {\n console.log('Error properly traced and handled\\n');\n }\n });\n\n // Example 4: Performance tracking\n await trace.command(\n 'demo:performance',\n { example: 'performance' },\n async () => {\n console.log('\\n--- Example 4: Performance Tracking ---\\n');\n\n // Simulate slow operation\n await trace.step('Slow operation', async () => {\n await new Promise((resolve) => setTimeout(resolve, 150));\n });\n\n // Simulate fast operations\n for (let i = 0; i < 3; i++) {\n await trace.step(`Fast operation ${i + 1}`, async () => {\n await new Promise((resolve) => setTimeout(resolve, 10));\n });\n }\n\n console.log('Performance tracking completed\\n');\n }\n );\n } catch (error: unknown) {\n console.error('Demo failed:', error);\n }\n\n // Show execution summary\n console.log('\\n' + trace.getExecutionSummary());\n\n // Export traces for analysis\n const traces = trace.exportTraces();\n console.log(`\\nTotal traces collected: ${traces.length}`);\n\n // Show example trace entry\n if (traces.length > 0) {\n console.log('\\nExample trace entry:');\n console.log(JSON.stringify(traces[0], null, 2));\n }\n}\n\n// Run the demo\nif (import.meta.url === `file://${process.argv[1]}`) {\n runDemo().catch(console.error);\n}\n\nexport { runDemo };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|