@stackmemoryai/stackmemory 0.5.58 → 0.5.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/search.js +20 -3
- package/dist/cli/commands/search.js.map +2 -2
- package/dist/core/database/sqlite-adapter.js +13 -3
- package/dist/core/database/sqlite-adapter.js.map +2 -2
- package/dist/core/errors/error-utils.js +208 -0
- package/dist/core/errors/error-utils.js.map +7 -0
- package/dist/core/errors/index.js +13 -4
- package/dist/core/errors/index.js.map +2 -2
- package/dist/core/merge/unified-merge-resolver.js +303 -0
- package/dist/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/core/monitoring/logger.js +61 -9
- package/dist/core/monitoring/logger.js.map +2 -2
- package/dist/core/security/index.js +35 -0
- package/dist/core/security/index.js.map +7 -0
- package/dist/core/security/input-sanitizer.js +321 -0
- package/dist/core/security/input-sanitizer.js.map +7 -0
- package/dist/integrations/linear/client.js +5 -1
- package/dist/integrations/linear/client.js.map +2 -2
- package/dist/integrations/mcp/remote-server.js +27 -36
- package/dist/integrations/mcp/remote-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +44 -29
- package/dist/integrations/mcp/server.js.map +3 -3
- package/dist/scripts/benchmark-performance.js +48 -0
- package/dist/scripts/benchmark-performance.js.map +7 -0
- package/dist/scripts/check-redis.js +42 -0
- package/dist/scripts/check-redis.js.map +7 -0
- package/dist/scripts/initialize.js +116 -0
- package/dist/scripts/initialize.js.map +7 -0
- package/dist/scripts/list-linear-tasks.js +124 -0
- package/dist/scripts/list-linear-tasks.js.map +7 -0
- package/dist/scripts/measure-handoff-impact.js +340 -0
- package/dist/scripts/measure-handoff-impact.js.map +7 -0
- package/dist/scripts/query-chromadb.js +160 -0
- package/dist/scripts/query-chromadb.js.map +7 -0
- package/dist/scripts/show-linear-summary.js +119 -0
- package/dist/scripts/show-linear-summary.js.map +7 -0
- package/dist/scripts/simple-swarm-demo.js +90 -0
- package/dist/scripts/simple-swarm-demo.js.map +7 -0
- package/dist/scripts/status.js +155 -0
- package/dist/scripts/status.js.map +7 -0
- package/dist/scripts/test-chromadb-sync.js +192 -0
- package/dist/scripts/test-chromadb-sync.js.map +7 -0
- package/dist/scripts/test-ralph-iteration-fix.js +86 -0
- package/dist/scripts/test-ralph-iteration-fix.js.map +7 -0
- package/dist/scripts/test-ralph-iterations.js +121 -0
- package/dist/scripts/test-ralph-iterations.js.map +7 -0
- package/dist/scripts/test-redis-storage.js +389 -0
- package/dist/scripts/test-redis-storage.js.map +7 -0
- package/dist/scripts/test-simple-ralph-state-sync.js +115 -0
- package/dist/scripts/test-simple-ralph-state-sync.js.map +7 -0
- package/dist/scripts/test-swarm-fixes.js +125 -0
- package/dist/scripts/test-swarm-fixes.js.map +7 -0
- package/dist/scripts/test-swarm-tui.js +23 -0
- package/dist/scripts/test-swarm-tui.js.map +7 -0
- package/dist/scripts/test-tui-shortcuts.js +52 -0
- package/dist/scripts/test-tui-shortcuts.js.map +7 -0
- package/dist/scripts/validate-tui-shortcuts.js +60 -0
- package/dist/scripts/validate-tui-shortcuts.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.js +527 -0
- package/dist/src/agents/core/agent-task-manager.js.map +7 -0
- package/dist/src/agents/verifiers/base-verifier.js +133 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +130 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/src/agents/verifiers/llm-judge.js +252 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/src/cli/auto-detect.js +321 -0
- package/dist/src/cli/auto-detect.js.map +7 -0
- package/dist/src/cli/claude-sm-danger.js +21 -0
- package/dist/src/cli/claude-sm-danger.js.map +7 -0
- package/dist/src/cli/claude-sm.js +1156 -0
- package/dist/src/cli/claude-sm.js.map +7 -0
- package/dist/src/cli/codex-sm-danger.js +21 -0
- package/dist/src/cli/codex-sm-danger.js.map +7 -0
- package/dist/src/cli/codex-sm.js +349 -0
- package/dist/src/cli/codex-sm.js.map +7 -0
- package/dist/src/cli/commands/api.js +232 -0
- package/dist/src/cli/commands/api.js.map +7 -0
- package/dist/src/cli/commands/auto-background.js +180 -0
- package/dist/src/cli/commands/auto-background.js.map +7 -0
- package/dist/src/cli/commands/cleanup-processes.js +68 -0
- package/dist/src/cli/commands/cleanup-processes.js.map +7 -0
- package/dist/src/cli/commands/clear.js +202 -0
- package/dist/src/cli/commands/clear.js.map +7 -0
- package/dist/src/cli/commands/config.js +445 -0
- package/dist/src/cli/commands/config.js.map +7 -0
- package/dist/src/cli/commands/context-rehydrate.js +751 -0
- package/dist/src/cli/commands/context-rehydrate.js.map +7 -0
- package/dist/src/cli/commands/context.js +343 -0
- package/dist/src/cli/commands/context.js.map +7 -0
- package/dist/src/cli/commands/daemon.js +392 -0
- package/dist/src/cli/commands/daemon.js.map +7 -0
- package/dist/src/cli/commands/dashboard.js +210 -0
- package/dist/src/cli/commands/dashboard.js.map +7 -0
- package/dist/src/cli/commands/db.js +147 -0
- package/dist/src/cli/commands/db.js.map +7 -0
- package/dist/src/cli/commands/decision.js +266 -0
- package/dist/src/cli/commands/decision.js.map +7 -0
- package/dist/src/cli/commands/discovery.js +279 -0
- package/dist/src/cli/commands/discovery.js.map +7 -0
- package/dist/src/cli/commands/handoff.js +624 -0
- package/dist/src/cli/commands/handoff.js.map +7 -0
- package/dist/src/cli/commands/hooks.js +298 -0
- package/dist/src/cli/commands/hooks.js.map +7 -0
- package/dist/src/cli/commands/linear.js +529 -0
- package/dist/src/cli/commands/linear.js.map +7 -0
- package/dist/src/cli/commands/log.js +169 -0
- package/dist/src/cli/commands/log.js.map +7 -0
- package/dist/src/cli/commands/login.js +172 -0
- package/dist/src/cli/commands/login.js.map +7 -0
- package/dist/src/cli/commands/migrate.js +240 -0
- package/dist/src/cli/commands/migrate.js.map +7 -0
- package/dist/src/cli/commands/model.js +533 -0
- package/dist/src/cli/commands/model.js.map +7 -0
- package/dist/src/cli/commands/onboard.js +536 -0
- package/dist/src/cli/commands/onboard.js.map +7 -0
- package/dist/src/cli/commands/projects.js +199 -0
- package/dist/src/cli/commands/projects.js.map +7 -0
- package/dist/src/cli/commands/ralph.js +909 -0
- package/dist/src/cli/commands/ralph.js.map +7 -0
- package/dist/src/cli/commands/retrieval.js +248 -0
- package/dist/src/cli/commands/retrieval.js.map +7 -0
- package/dist/src/cli/commands/search.js +173 -0
- package/dist/src/cli/commands/search.js.map +7 -0
- package/dist/src/cli/commands/service.js +749 -0
- package/dist/src/cli/commands/service.js.map +7 -0
- package/dist/src/cli/commands/session.js +200 -0
- package/dist/src/cli/commands/session.js.map +7 -0
- package/dist/src/cli/commands/settings.js +306 -0
- package/dist/src/cli/commands/settings.js.map +7 -0
- package/dist/src/cli/commands/setup.js +701 -0
- package/dist/src/cli/commands/setup.js.map +7 -0
- package/dist/src/cli/commands/shell.js +249 -0
- package/dist/src/cli/commands/shell.js.map +7 -0
- package/dist/src/cli/commands/signup.js +50 -0
- package/dist/src/cli/commands/signup.js.map +7 -0
- package/dist/src/cli/commands/skills.js +470 -0
- package/dist/src/cli/commands/skills.js.map +7 -0
- package/dist/src/cli/commands/sms-notify.js +795 -0
- package/dist/src/cli/commands/sms-notify.js.map +7 -0
- package/dist/src/cli/commands/storage-tier.js +183 -0
- package/dist/src/cli/commands/storage-tier.js.map +7 -0
- package/dist/src/cli/commands/sweep.js +249 -0
- package/dist/src/cli/commands/sweep.js.map +7 -0
- package/dist/src/cli/commands/tasks.js +213 -0
- package/dist/src/cli/commands/tasks.js.map +7 -0
- package/dist/src/cli/commands/worktree.js +319 -0
- package/dist/src/cli/commands/worktree.js.map +7 -0
- package/dist/src/cli/index.js +594 -0
- package/dist/src/cli/index.js.map +7 -0
- package/dist/src/cli/opencode-sm.js +448 -0
- package/dist/src/cli/opencode-sm.js.map +7 -0
- package/dist/src/cli/utils/viewer.js +96 -0
- package/dist/src/cli/utils/viewer.js.map +7 -0
- package/dist/src/core/config/config-manager.js +398 -0
- package/dist/src/core/config/config-manager.js.map +7 -0
- package/dist/src/core/config/feature-flags.js +76 -0
- package/dist/src/core/config/feature-flags.js.map +7 -0
- package/dist/src/core/config/storage-config.js +115 -0
- package/dist/src/core/config/storage-config.js.map +7 -0
- package/dist/src/core/config/types.js +144 -0
- package/dist/src/core/config/types.js.map +7 -0
- package/dist/src/core/context/auto-context.js +80 -0
- package/dist/src/core/context/auto-context.js.map +7 -0
- package/dist/src/core/context/dual-stack-manager.js +870 -0
- package/dist/src/core/context/dual-stack-manager.js.map +7 -0
- package/dist/src/core/context/enhanced-rehydration.js +994 -0
- package/dist/src/core/context/enhanced-rehydration.js.map +7 -0
- package/dist/src/core/context/frame-database.js +479 -0
- package/dist/src/core/context/frame-database.js.map +7 -0
- package/dist/src/core/context/frame-digest.js +250 -0
- package/dist/src/core/context/frame-digest.js.map +7 -0
- package/dist/src/core/context/frame-handoff-manager.js +778 -0
- package/dist/src/core/context/frame-handoff-manager.js.map +7 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js +119 -0
- package/dist/src/core/context/frame-lifecycle-hooks.js.map +7 -0
- package/dist/src/core/context/frame-recovery.js +302 -0
- package/dist/src/core/context/frame-recovery.js.map +7 -0
- package/dist/src/core/context/frame-stack.js +314 -0
- package/dist/src/core/context/frame-stack.js.map +7 -0
- package/dist/src/core/context/frame-types.js +5 -0
- package/dist/src/core/context/frame-types.js.map +7 -0
- package/dist/src/core/context/index.js +25 -0
- package/dist/src/core/context/index.js.map +7 -0
- package/dist/src/core/context/permission-manager.js +185 -0
- package/dist/src/core/context/permission-manager.js.map +7 -0
- package/dist/src/core/context/recursive-context-manager.js +592 -0
- package/dist/src/core/context/recursive-context-manager.js.map +7 -0
- package/dist/src/core/context/refactored-frame-manager.js +754 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/src/core/context/shared-context-layer.js +621 -0
- package/dist/src/core/context/shared-context-layer.js.map +7 -0
- package/dist/src/core/context/stack-merge-resolver.js +749 -0
- package/dist/src/core/context/stack-merge-resolver.js.map +7 -0
- package/dist/src/core/context/validation.js +130 -0
- package/dist/src/core/context/validation.js.map +7 -0
- package/dist/src/core/database/batch-operations.js +384 -0
- package/dist/src/core/database/batch-operations.js.map +7 -0
- package/dist/src/core/database/connection-pool.js +330 -0
- package/dist/src/core/database/connection-pool.js.map +7 -0
- package/dist/src/core/database/database-adapter.js +60 -0
- package/dist/src/core/database/database-adapter.js.map +7 -0
- package/dist/src/core/database/migration-manager.js +614 -0
- package/dist/src/core/database/migration-manager.js.map +7 -0
- package/dist/src/core/database/query-cache.js +298 -0
- package/dist/src/core/database/query-cache.js.map +7 -0
- package/dist/src/core/database/query-router.js +430 -0
- package/dist/src/core/database/query-router.js.map +7 -0
- package/dist/src/core/database/sqlite-adapter.js +738 -0
- package/dist/src/core/database/sqlite-adapter.js.map +7 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +277 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/src/core/digest/frame-digest-integration.js +176 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +553 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +7 -0
- package/dist/src/core/digest/types.js +25 -0
- package/dist/src/core/digest/types.js.map +7 -0
- package/dist/src/core/errors/error-utils.js +208 -0
- package/dist/src/core/errors/error-utils.js.map +7 -0
- package/dist/src/core/errors/index.js +521 -0
- package/dist/src/core/errors/index.js.map +7 -0
- package/dist/src/core/errors/recovery.js +269 -0
- package/dist/src/core/errors/recovery.js.map +7 -0
- package/dist/src/core/execution/parallel-executor.js +258 -0
- package/dist/src/core/execution/parallel-executor.js.map +7 -0
- package/dist/src/core/frame/workflow-templates.js +319 -0
- package/dist/src/core/frame/workflow-templates.js.map +7 -0
- package/dist/src/core/merge/conflict-detector.js +431 -0
- package/dist/src/core/merge/conflict-detector.js.map +7 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +7 -0
- package/dist/src/core/merge/resolution-engine.js +558 -0
- package/dist/src/core/merge/resolution-engine.js.map +7 -0
- package/dist/src/core/merge/stack-diff.js +532 -0
- package/dist/src/core/merge/stack-diff.js.map +7 -0
- package/dist/src/core/merge/types.js +5 -0
- package/dist/src/core/merge/types.js.map +7 -0
- package/dist/src/core/merge/unified-merge-resolver.js +303 -0
- package/dist/src/core/merge/unified-merge-resolver.js.map +7 -0
- package/dist/src/core/models/fallback-monitor.js +232 -0
- package/dist/src/core/models/fallback-monitor.js.map +7 -0
- package/dist/src/core/models/model-router.js +340 -0
- package/dist/src/core/models/model-router.js.map +7 -0
- package/dist/src/core/monitoring/error-handler.js +49 -0
- package/dist/src/core/monitoring/error-handler.js.map +7 -0
- package/dist/src/core/monitoring/logger.js +202 -0
- package/dist/src/core/monitoring/logger.js.map +7 -0
- package/dist/src/core/monitoring/metrics.js +172 -0
- package/dist/src/core/monitoring/metrics.js.map +7 -0
- package/dist/src/core/monitoring/progress-tracker.js +189 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/src/core/monitoring/session-monitor.js +300 -0
- package/dist/src/core/monitoring/session-monitor.js.map +7 -0
- package/dist/src/core/performance/context-cache.js +273 -0
- package/dist/src/core/performance/context-cache.js.map +7 -0
- package/dist/src/core/performance/index.js +11 -0
- package/dist/src/core/performance/index.js.map +7 -0
- package/dist/src/core/performance/lazy-context-loader.js +327 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/src/core/performance/monitor.js +221 -0
- package/dist/src/core/performance/monitor.js.map +7 -0
- package/dist/src/core/performance/optimized-frame-context.js +345 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/src/core/performance/performance-benchmark.js +277 -0
- package/dist/src/core/performance/performance-benchmark.js.map +7 -0
- package/dist/src/core/performance/performance-profiler.js +370 -0
- package/dist/src/core/performance/performance-profiler.js.map +7 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +195 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/src/core/persistence/postgres-adapter.js +349 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/src/core/projects/project-isolation.js +201 -0
- package/dist/src/core/projects/project-isolation.js.map +7 -0
- package/dist/src/core/projects/project-manager.js +697 -0
- package/dist/src/core/projects/project-manager.js.map +7 -0
- package/dist/src/core/query/query-parser.js +370 -0
- package/dist/src/core/query/query-parser.js.map +7 -0
- package/dist/src/core/query/query-templates.js +321 -0
- package/dist/src/core/query/query-templates.js.map +7 -0
- package/dist/src/core/retrieval/context-retriever.js +479 -0
- package/dist/src/core/retrieval/context-retriever.js.map +7 -0
- package/dist/src/core/retrieval/index.js +8 -0
- package/dist/src/core/retrieval/index.js.map +7 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +613 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/src/core/retrieval/llm-provider.js +151 -0
- package/dist/src/core/retrieval/llm-provider.js.map +7 -0
- package/dist/src/core/retrieval/retrieval-audit.js +236 -0
- package/dist/src/core/retrieval/retrieval-audit.js.map +7 -0
- package/dist/src/core/retrieval/summary-generator.js +589 -0
- package/dist/src/core/retrieval/summary-generator.js.map +7 -0
- package/dist/src/core/retrieval/types.js +21 -0
- package/dist/src/core/retrieval/types.js.map +7 -0
- package/dist/src/core/security/index.js +35 -0
- package/dist/src/core/security/index.js.map +7 -0
- package/dist/src/core/security/input-sanitizer.js +321 -0
- package/dist/src/core/security/input-sanitizer.js.map +7 -0
- package/dist/src/core/session/clear-survival.js +465 -0
- package/dist/src/core/session/clear-survival.js.map +7 -0
- package/dist/src/core/session/enhanced-handoff.js +792 -0
- package/dist/src/core/session/enhanced-handoff.js.map +7 -0
- package/dist/src/core/session/handoff-generator.js +343 -0
- package/dist/src/core/session/handoff-generator.js.map +7 -0
- package/dist/src/core/session/index.js +15 -0
- package/dist/src/core/session/index.js.map +7 -0
- package/dist/src/core/session/session-manager.js +347 -0
- package/dist/src/core/session/session-manager.js.map +7 -0
- package/dist/src/core/skills/index.js +7 -0
- package/dist/src/core/skills/index.js.map +7 -0
- package/dist/src/core/skills/skill-storage.js +764 -0
- package/dist/src/core/skills/skill-storage.js.map +7 -0
- package/dist/src/core/skills/types.js +193 -0
- package/dist/src/core/skills/types.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +354 -0
- package/dist/src/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/src/core/storage/infinite-storage.js +510 -0
- package/dist/src/core/storage/infinite-storage.js.map +7 -0
- package/dist/src/core/storage/remote-storage.js +489 -0
- package/dist/src/core/storage/remote-storage.js.map +7 -0
- package/dist/src/core/storage/two-tier-storage.js +766 -0
- package/dist/src/core/storage/two-tier-storage.js.map +7 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +132 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/db-trace-wrapper.js +247 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/src/core/trace/debug-trace.js +417 -0
- package/dist/src/core/trace/debug-trace.js.map +7 -0
- package/dist/src/core/trace/index.js +109 -0
- package/dist/src/core/trace/index.js.map +7 -0
- package/dist/src/core/trace/linear-api-wrapper.js +178 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/src/core/trace/trace-detector.js +528 -0
- package/dist/src/core/trace/trace-detector.js.map +7 -0
- package/dist/src/core/trace/trace-store.js +345 -0
- package/dist/src/core/trace/trace-store.js.map +7 -0
- package/dist/src/core/trace/types.js +77 -0
- package/dist/src/core/trace/types.js.map +7 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +7 -0
- package/dist/src/core/utils/async-mutex.js +114 -0
- package/dist/src/core/utils/async-mutex.js.map +7 -0
- package/dist/src/core/utils/compression.js +83 -0
- package/dist/src/core/utils/compression.js.map +7 -0
- package/dist/src/core/utils/update-checker.js +218 -0
- package/dist/src/core/utils/update-checker.js.map +7 -0
- package/dist/src/core/worktree/worktree-manager.js +465 -0
- package/dist/src/core/worktree/worktree-manager.js.map +7 -0
- package/dist/src/daemon/daemon-config.js +149 -0
- package/dist/src/daemon/daemon-config.js.map +7 -0
- package/dist/src/daemon/services/context-service.js +122 -0
- package/dist/src/daemon/services/context-service.js.map +7 -0
- package/dist/src/daemon/services/linear-service.js +136 -0
- package/dist/src/daemon/services/linear-service.js.map +7 -0
- package/dist/src/daemon/session-daemon.js +312 -0
- package/dist/src/daemon/session-daemon.js.map +7 -0
- package/dist/src/daemon/unified-daemon.js +276 -0
- package/dist/src/daemon/unified-daemon.js.map +7 -0
- package/dist/src/features/analytics/api/analytics-api.js +287 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/src/features/analytics/core/analytics-service.js +282 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/src/features/analytics/index.js +18 -0
- package/dist/src/features/analytics/index.js.map +7 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +277 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/src/features/analytics/types/metrics.js +5 -0
- package/dist/src/features/analytics/types/metrics.js.map +7 -0
- package/dist/src/features/browser/browser-mcp.js +492 -0
- package/dist/src/features/browser/browser-mcp.js.map +7 -0
- package/dist/src/features/sweep/index.js +20 -0
- package/dist/src/features/sweep/index.js.map +7 -0
- package/dist/src/features/sweep/prediction-client.js +155 -0
- package/dist/src/features/sweep/prediction-client.js.map +7 -0
- package/dist/src/features/sweep/prompt-builder.js +85 -0
- package/dist/src/features/sweep/prompt-builder.js.map +7 -0
- package/dist/src/features/sweep/pty-wrapper.js +171 -0
- package/dist/src/features/sweep/pty-wrapper.js.map +7 -0
- package/dist/src/features/sweep/state-watcher.js +87 -0
- package/dist/src/features/sweep/state-watcher.js.map +7 -0
- package/dist/src/features/sweep/status-bar.js +88 -0
- package/dist/src/features/sweep/status-bar.js.map +7 -0
- package/dist/src/features/sweep/sweep-server-manager.js +226 -0
- package/dist/src/features/sweep/sweep-server-manager.js.map +7 -0
- package/dist/src/features/sweep/tab-interceptor.js +38 -0
- package/dist/src/features/sweep/tab-interceptor.js.map +7 -0
- package/dist/src/features/sweep/types.js +18 -0
- package/dist/src/features/sweep/types.js.map +7 -0
- package/dist/src/features/tasks/linear-task-manager.js +487 -0
- package/dist/src/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/src/features/tasks/task-aware-context.js +410 -0
- package/dist/src/features/tasks/task-aware-context.js.map +7 -0
- package/dist/src/features/tui/simple-monitor.js +116 -0
- package/dist/src/features/tui/simple-monitor.js.map +7 -0
- package/dist/src/features/tui/swarm-monitor.js +648 -0
- package/dist/src/features/tui/swarm-monitor.js.map +7 -0
- package/dist/src/features/web/client/stores/task-store.js +26 -0
- package/dist/src/features/web/client/stores/task-store.js.map +7 -0
- package/dist/src/features/web/server/index.js +194 -0
- package/dist/src/features/web/server/index.js.map +7 -0
- package/dist/src/hooks/auto-background.js +151 -0
- package/dist/src/hooks/auto-background.js.map +7 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/src/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/src/hooks/config.js +150 -0
- package/dist/src/hooks/config.js.map +7 -0
- package/dist/src/hooks/daemon.js +364 -0
- package/dist/src/hooks/daemon.js.map +7 -0
- package/dist/src/hooks/events.js +58 -0
- package/dist/src/hooks/events.js.map +7 -0
- package/dist/src/hooks/index.js +12 -0
- package/dist/src/hooks/index.js.map +7 -0
- package/dist/src/hooks/linear-task-picker.js +186 -0
- package/dist/src/hooks/linear-task-picker.js.map +7 -0
- package/dist/src/hooks/schemas.js +197 -0
- package/dist/src/hooks/schemas.js.map +7 -0
- package/dist/src/hooks/secure-fs.js +49 -0
- package/dist/src/hooks/secure-fs.js.map +7 -0
- package/dist/src/hooks/security-logger.js +155 -0
- package/dist/src/hooks/security-logger.js.map +7 -0
- package/dist/src/hooks/session-summary.js +222 -0
- package/dist/src/hooks/session-summary.js.map +7 -0
- package/dist/src/hooks/sms-action-runner.js +371 -0
- package/dist/src/hooks/sms-action-runner.js.map +7 -0
- package/dist/src/hooks/sms-notify.js +506 -0
- package/dist/src/hooks/sms-notify.js.map +7 -0
- package/dist/src/hooks/sms-watcher.js +93 -0
- package/dist/src/hooks/sms-watcher.js.map +7 -0
- package/dist/src/hooks/sms-webhook.js +555 -0
- package/dist/src/hooks/sms-webhook.js.map +7 -0
- package/dist/src/hooks/whatsapp-commands.js +479 -0
- package/dist/src/hooks/whatsapp-commands.js.map +7 -0
- package/dist/src/hooks/whatsapp-scheduler.js +317 -0
- package/dist/src/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/src/hooks/whatsapp-sync.js +409 -0
- package/dist/src/hooks/whatsapp-sync.js.map +7 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/integrations/anthropic/client.js +263 -0
- package/dist/src/integrations/anthropic/client.js.map +7 -0
- package/dist/src/integrations/claude-code/agent-bridge.js +768 -0
- package/dist/src/integrations/claude-code/agent-bridge.js.map +7 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +459 -0
- package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js +254 -0
- package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js +545 -0
- package/dist/src/integrations/claude-code/post-task-hooks.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js +20 -0
- package/dist/src/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/src/integrations/claude-code/subagent-client.js +511 -0
- package/dist/src/integrations/claude-code/subagent-client.js.map +7 -0
- package/dist/src/integrations/claude-code/task-coordinator.js +360 -0
- package/dist/src/integrations/claude-code/task-coordinator.js.map +7 -0
- package/dist/src/integrations/linear/auth.js +337 -0
- package/dist/src/integrations/linear/auth.js.map +7 -0
- package/dist/src/integrations/linear/auto-sync.js +258 -0
- package/dist/src/integrations/linear/auto-sync.js.map +7 -0
- package/dist/src/integrations/linear/client.js +634 -0
- package/dist/src/integrations/linear/client.js.map +7 -0
- package/dist/src/integrations/linear/config.js +130 -0
- package/dist/src/integrations/linear/config.js.map +7 -0
- package/dist/src/integrations/linear/migration.js +361 -0
- package/dist/src/integrations/linear/migration.js.map +7 -0
- package/dist/src/integrations/linear/oauth-server.js +454 -0
- package/dist/src/integrations/linear/oauth-server.js.map +7 -0
- package/dist/src/integrations/linear/rest-client.js +213 -0
- package/dist/src/integrations/linear/rest-client.js.map +7 -0
- package/dist/src/integrations/linear/sync-manager.js +236 -0
- package/dist/src/integrations/linear/sync-manager.js.map +7 -0
- package/dist/src/integrations/linear/sync-service.js +231 -0
- package/dist/src/integrations/linear/sync-service.js.map +7 -0
- package/dist/src/integrations/linear/sync.js +782 -0
- package/dist/src/integrations/linear/sync.js.map +7 -0
- package/dist/src/integrations/linear/types.js +5 -0
- package/dist/src/integrations/linear/types.js.map +7 -0
- package/dist/src/integrations/linear/unified-sync.js +589 -0
- package/dist/src/integrations/linear/unified-sync.js.map +7 -0
- package/dist/src/integrations/linear/webhook-handler.js +219 -0
- package/dist/src/integrations/linear/webhook-handler.js.map +7 -0
- package/dist/src/integrations/linear/webhook-server.js +218 -0
- package/dist/src/integrations/linear/webhook-server.js.map +7 -0
- package/dist/src/integrations/linear/webhook.js +291 -0
- package/dist/src/integrations/linear/webhook.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +257 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/index.js +166 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +247 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js +529 -0
- package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +239 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +308 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/index.js +23 -0
- package/dist/src/integrations/mcp/index.js.map +7 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js +356 -0
- package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +7 -0
- package/dist/src/integrations/mcp/refactored-server.js +374 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/src/integrations/mcp/remote-server.js +682 -0
- package/dist/src/integrations/mcp/remote-server.js.map +7 -0
- package/dist/src/integrations/mcp/schemas.js +147 -0
- package/dist/src/integrations/mcp/schemas.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +1975 -0
- package/dist/src/integrations/mcp/server.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js +125 -0
- package/dist/src/integrations/mcp/tool-definitions-code.js.map +7 -0
- package/dist/src/integrations/mcp/tool-definitions.js +702 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +860 -0
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js +301 -0
- package/dist/src/integrations/ralph/context/context-budget-manager.js.map +7 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +360 -0
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +410 -0
- package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +7 -0
- package/dist/src/integrations/ralph/index.js +18 -0
- package/dist/src/integrations/ralph/index.js.map +7 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js +401 -0
- package/dist/src/integrations/ralph/learning/pattern-learner.js.map +7 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +448 -0
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +294 -0
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +7 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +108 -0
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +7 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +463 -0
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +400 -0
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +473 -0
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +388 -0
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +358 -0
- package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +7 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +462 -0
- package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +7 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js +404 -0
- package/dist/src/integrations/ralph/state/state-reconciler.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +428 -0
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +7 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +996 -0
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
- package/dist/src/integrations/ralph/types.js +5 -0
- package/dist/src/integrations/ralph/types.js.map +7 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +585 -0
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +554 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/src/middleware/exponential-rate-limiter.js +289 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/src/models/user.model.js +358 -0
- package/dist/src/models/user.model.js.map +7 -0
- package/dist/src/servers/production/auth-middleware.js +528 -0
- package/dist/src/servers/production/auth-middleware.js.map +7 -0
- package/dist/src/services/config-service.js +65 -0
- package/dist/src/services/config-service.js.map +7 -0
- package/dist/src/services/context-service.js +194 -0
- package/dist/src/services/context-service.js.map +7 -0
- package/dist/src/skills/api-discovery.js +354 -0
- package/dist/src/skills/api-discovery.js.map +7 -0
- package/dist/src/skills/api-skill.js +475 -0
- package/dist/src/skills/api-skill.js.map +7 -0
- package/dist/src/skills/claude-skills.js +1061 -0
- package/dist/src/skills/claude-skills.js.map +7 -0
- package/dist/src/skills/dashboard-launcher.js +216 -0
- package/dist/src/skills/dashboard-launcher.js.map +7 -0
- package/dist/src/skills/recursive-agent-orchestrator.js +575 -0
- package/dist/src/skills/recursive-agent-orchestrator.js.map +7 -0
- package/dist/src/skills/repo-ingestion-skill.js +609 -0
- package/dist/src/skills/repo-ingestion-skill.js.map +7 -0
- package/dist/src/skills/unified-rlm-orchestrator.js +404 -0
- package/dist/src/skills/unified-rlm-orchestrator.js.map +7 -0
- package/dist/src/types/task.js +5 -0
- package/dist/src/types/task.js.map +7 -0
- package/dist/src/utils/env.js +50 -0
- package/dist/src/utils/env.js.map +7 -0
- package/dist/src/utils/formatting.js +62 -0
- package/dist/src/utils/formatting.js.map +7 -0
- package/dist/src/utils/process-cleanup.js +136 -0
- package/dist/src/utils/process-cleanup.js.map +7 -0
- package/package.json +3 -3
- package/scripts/initialize.ts +16 -7
- package/scripts/install.sh +14 -62
- package/scripts/status.ts +111 -46
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
5
|
+
import { getQueryCache, createCacheKey } from "../database/query-cache.js";
|
|
6
|
+
import { logger } from "../monitoring/logger.js";
|
|
7
|
+
class OptimizedContextAssembler {
|
|
8
|
+
db;
|
|
9
|
+
cache = getQueryCache();
|
|
10
|
+
preparedStatements = /* @__PURE__ */ new Map();
|
|
11
|
+
constructor(db) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
this.initializePreparedStatements();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get hot stack context with optimizations
|
|
17
|
+
*/
|
|
18
|
+
async getHotStackContext(activeStack, options = {}) {
|
|
19
|
+
const startTime = performance.now();
|
|
20
|
+
const stats = {
|
|
21
|
+
cacheHits: 0,
|
|
22
|
+
dbQueries: 0,
|
|
23
|
+
totalRows: 0
|
|
24
|
+
};
|
|
25
|
+
const {
|
|
26
|
+
maxEvents = 20,
|
|
27
|
+
includeClosed = false,
|
|
28
|
+
enableCaching = true,
|
|
29
|
+
batchSize = 10
|
|
30
|
+
} = options;
|
|
31
|
+
try {
|
|
32
|
+
const contexts = [];
|
|
33
|
+
for (let i = 0; i < activeStack.length; i += batchSize) {
|
|
34
|
+
const batch = activeStack.slice(i, i + batchSize);
|
|
35
|
+
const batchContexts = await this.processBatch(
|
|
36
|
+
batch,
|
|
37
|
+
maxEvents,
|
|
38
|
+
includeClosed,
|
|
39
|
+
enableCaching,
|
|
40
|
+
stats
|
|
41
|
+
);
|
|
42
|
+
contexts.push(...batchContexts);
|
|
43
|
+
}
|
|
44
|
+
const assemblyTimeMs = performance.now() - startTime;
|
|
45
|
+
return contexts.map((context) => ({
|
|
46
|
+
...context,
|
|
47
|
+
performance: {
|
|
48
|
+
assemblyTimeMs: assemblyTimeMs / contexts.length,
|
|
49
|
+
...stats
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
} catch (error) {
|
|
53
|
+
logger.error("Failed to assemble hot stack context", error, {
|
|
54
|
+
activeStack,
|
|
55
|
+
options
|
|
56
|
+
});
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get single frame context with full optimization
|
|
62
|
+
*/
|
|
63
|
+
async getFrameContext(frameId, options = {}) {
|
|
64
|
+
const startTime = performance.now();
|
|
65
|
+
const stats = { cacheHits: 0, dbQueries: 0, totalRows: 0 };
|
|
66
|
+
const { maxEvents = 50, enableCaching = true } = options;
|
|
67
|
+
const cacheKey = createCacheKey("frame_context", [frameId, maxEvents]);
|
|
68
|
+
if (enableCaching) {
|
|
69
|
+
const cached = this.cache.getFrameContext(cacheKey);
|
|
70
|
+
if (cached) {
|
|
71
|
+
stats.cacheHits++;
|
|
72
|
+
return {
|
|
73
|
+
...cached,
|
|
74
|
+
performance: {
|
|
75
|
+
assemblyTimeMs: performance.now() - startTime,
|
|
76
|
+
...stats
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const context = await this.assembleFrameContext(
|
|
83
|
+
frameId,
|
|
84
|
+
maxEvents,
|
|
85
|
+
stats
|
|
86
|
+
);
|
|
87
|
+
if (!context) return null;
|
|
88
|
+
if (enableCaching) {
|
|
89
|
+
this.cache.cacheFrameContext(cacheKey, context);
|
|
90
|
+
}
|
|
91
|
+
const result = {
|
|
92
|
+
...context,
|
|
93
|
+
performance: {
|
|
94
|
+
assemblyTimeMs: performance.now() - startTime,
|
|
95
|
+
...stats
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
return result;
|
|
99
|
+
} catch (error) {
|
|
100
|
+
logger.error("Failed to get frame context", error, { frameId });
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Process a batch of frames efficiently
|
|
106
|
+
*/
|
|
107
|
+
async processBatch(frameIds, maxEvents, includeClosed, enableCaching, stats) {
|
|
108
|
+
const contexts = [];
|
|
109
|
+
const uncachedIds = [];
|
|
110
|
+
for (const frameId of frameIds) {
|
|
111
|
+
const cacheKey = createCacheKey("frame_context", [frameId, maxEvents]);
|
|
112
|
+
if (enableCaching) {
|
|
113
|
+
const cached = this.cache.getFrameContext(cacheKey);
|
|
114
|
+
if (cached) {
|
|
115
|
+
stats.cacheHits++;
|
|
116
|
+
contexts.push(cached);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
uncachedIds.push(frameId);
|
|
121
|
+
}
|
|
122
|
+
if (uncachedIds.length === 0) {
|
|
123
|
+
return contexts;
|
|
124
|
+
}
|
|
125
|
+
const frames = await this.batchGetFrames(uncachedIds, stats);
|
|
126
|
+
const allEvents = await this.batchGetEvents(uncachedIds, maxEvents, stats);
|
|
127
|
+
const allAnchors = await this.batchGetAnchors(uncachedIds, stats);
|
|
128
|
+
const allArtifacts = await this.batchGetArtifacts(uncachedIds, stats);
|
|
129
|
+
for (const frameId of uncachedIds) {
|
|
130
|
+
const frame = frames.get(frameId);
|
|
131
|
+
if (!frame || !includeClosed && frame.state === "closed") {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const context = {
|
|
135
|
+
frameId,
|
|
136
|
+
header: {
|
|
137
|
+
goal: frame.name,
|
|
138
|
+
constraints: this.extractConstraints(frame.inputs),
|
|
139
|
+
definitions: frame.inputs.definitions
|
|
140
|
+
},
|
|
141
|
+
anchors: allAnchors.get(frameId) || [],
|
|
142
|
+
recentEvents: allEvents.get(frameId) || [],
|
|
143
|
+
activeArtifacts: allArtifacts.get(frameId) || []
|
|
144
|
+
};
|
|
145
|
+
if (enableCaching) {
|
|
146
|
+
const cacheKey = createCacheKey("frame_context", [frameId, maxEvents]);
|
|
147
|
+
this.cache.cacheFrameContext(cacheKey, context);
|
|
148
|
+
}
|
|
149
|
+
contexts.push(context);
|
|
150
|
+
}
|
|
151
|
+
return contexts;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Batch get frames with single query
|
|
155
|
+
*/
|
|
156
|
+
async batchGetFrames(frameIds, stats) {
|
|
157
|
+
if (frameIds.length === 0) return /* @__PURE__ */ new Map();
|
|
158
|
+
const stmt = this.preparedStatements.get("batch_frames");
|
|
159
|
+
if (!stmt) throw new Error("Prepared statement not found: batch_frames");
|
|
160
|
+
const placeholders = frameIds.map(() => "?").join(",");
|
|
161
|
+
const query = `SELECT * FROM frames WHERE frame_id IN (${placeholders})`;
|
|
162
|
+
stats.dbQueries++;
|
|
163
|
+
const rows = this.db.prepare(query).all(...frameIds);
|
|
164
|
+
stats.totalRows += rows.length;
|
|
165
|
+
const frameMap = /* @__PURE__ */ new Map();
|
|
166
|
+
for (const row of rows) {
|
|
167
|
+
frameMap.set(row.frame_id, {
|
|
168
|
+
...row,
|
|
169
|
+
inputs: JSON.parse(row.inputs || "{}"),
|
|
170
|
+
outputs: JSON.parse(row.outputs || "{}"),
|
|
171
|
+
digest_json: JSON.parse(row.digest_json || "{}")
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return frameMap;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Batch get events for multiple frames
|
|
178
|
+
*/
|
|
179
|
+
async batchGetEvents(frameIds, maxEvents, stats) {
|
|
180
|
+
if (frameIds.length === 0) return /* @__PURE__ */ new Map();
|
|
181
|
+
const placeholders = frameIds.map(() => "?").join(",");
|
|
182
|
+
const query = `
|
|
183
|
+
SELECT *, ROW_NUMBER() OVER (PARTITION BY frame_id ORDER BY seq DESC) as rn
|
|
184
|
+
FROM events
|
|
185
|
+
WHERE frame_id IN (${placeholders})
|
|
186
|
+
AND rn <= ${maxEvents}
|
|
187
|
+
ORDER BY frame_id, seq DESC
|
|
188
|
+
`;
|
|
189
|
+
stats.dbQueries++;
|
|
190
|
+
const rows = this.db.prepare(query).all(...frameIds);
|
|
191
|
+
stats.totalRows += rows.length;
|
|
192
|
+
const eventMap = /* @__PURE__ */ new Map();
|
|
193
|
+
for (const row of rows) {
|
|
194
|
+
if (!eventMap.has(row.frame_id)) {
|
|
195
|
+
eventMap.set(row.frame_id, []);
|
|
196
|
+
}
|
|
197
|
+
eventMap.get(row.frame_id).push({
|
|
198
|
+
...row,
|
|
199
|
+
payload: JSON.parse(row.payload)
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return eventMap;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Batch get anchors for multiple frames
|
|
206
|
+
*/
|
|
207
|
+
async batchGetAnchors(frameIds, stats) {
|
|
208
|
+
if (frameIds.length === 0) return /* @__PURE__ */ new Map();
|
|
209
|
+
const placeholders = frameIds.map(() => "?").join(",");
|
|
210
|
+
const query = `
|
|
211
|
+
SELECT * FROM anchors
|
|
212
|
+
WHERE frame_id IN (${placeholders})
|
|
213
|
+
ORDER BY frame_id, priority DESC, created_at ASC
|
|
214
|
+
`;
|
|
215
|
+
stats.dbQueries++;
|
|
216
|
+
const rows = this.db.prepare(query).all(...frameIds);
|
|
217
|
+
stats.totalRows += rows.length;
|
|
218
|
+
const anchorMap = /* @__PURE__ */ new Map();
|
|
219
|
+
for (const row of rows) {
|
|
220
|
+
if (!anchorMap.has(row.frame_id)) {
|
|
221
|
+
anchorMap.set(row.frame_id, []);
|
|
222
|
+
}
|
|
223
|
+
anchorMap.get(row.frame_id).push({
|
|
224
|
+
...row,
|
|
225
|
+
metadata: JSON.parse(row.metadata || "{}")
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return anchorMap;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Batch get active artifacts for multiple frames
|
|
232
|
+
*/
|
|
233
|
+
async batchGetArtifacts(frameIds, stats) {
|
|
234
|
+
if (frameIds.length === 0) return /* @__PURE__ */ new Map();
|
|
235
|
+
const placeholders = frameIds.map(() => "?").join(",");
|
|
236
|
+
const query = `
|
|
237
|
+
SELECT frame_id, payload
|
|
238
|
+
FROM events
|
|
239
|
+
WHERE frame_id IN (${placeholders})
|
|
240
|
+
AND event_type = 'artifact'
|
|
241
|
+
ORDER BY frame_id, ts DESC
|
|
242
|
+
`;
|
|
243
|
+
stats.dbQueries++;
|
|
244
|
+
const rows = this.db.prepare(query).all(...frameIds);
|
|
245
|
+
stats.totalRows += rows.length;
|
|
246
|
+
const artifactMap = /* @__PURE__ */ new Map();
|
|
247
|
+
for (const row of rows) {
|
|
248
|
+
const payload = JSON.parse(row.payload);
|
|
249
|
+
if (!artifactMap.has(row.frame_id)) {
|
|
250
|
+
artifactMap.set(row.frame_id, []);
|
|
251
|
+
}
|
|
252
|
+
if (payload.path) {
|
|
253
|
+
artifactMap.get(row.frame_id).push(payload.path);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return artifactMap;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Assemble single frame context
|
|
260
|
+
*/
|
|
261
|
+
async assembleFrameContext(frameId, maxEvents, stats) {
|
|
262
|
+
const frame = await this.batchGetFrames([frameId], stats).then(
|
|
263
|
+
(map) => map.get(frameId)
|
|
264
|
+
);
|
|
265
|
+
if (!frame) return null;
|
|
266
|
+
const [events, anchors, artifacts] = await Promise.all([
|
|
267
|
+
this.batchGetEvents([frameId], maxEvents, stats).then(
|
|
268
|
+
(map) => map.get(frameId) || []
|
|
269
|
+
),
|
|
270
|
+
this.batchGetAnchors([frameId], stats).then(
|
|
271
|
+
(map) => map.get(frameId) || []
|
|
272
|
+
),
|
|
273
|
+
this.batchGetArtifacts([frameId], stats).then(
|
|
274
|
+
(map) => map.get(frameId) || []
|
|
275
|
+
)
|
|
276
|
+
]);
|
|
277
|
+
return {
|
|
278
|
+
frameId,
|
|
279
|
+
header: {
|
|
280
|
+
goal: frame.name,
|
|
281
|
+
constraints: this.extractConstraints(frame.inputs),
|
|
282
|
+
definitions: frame.inputs.definitions
|
|
283
|
+
},
|
|
284
|
+
anchors,
|
|
285
|
+
recentEvents: events,
|
|
286
|
+
activeArtifacts: artifacts
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Extract constraints from frame inputs
|
|
291
|
+
*/
|
|
292
|
+
extractConstraints(inputs) {
|
|
293
|
+
const constraints = [];
|
|
294
|
+
if (inputs.constraints && Array.isArray(inputs.constraints)) {
|
|
295
|
+
constraints.push(...inputs.constraints);
|
|
296
|
+
}
|
|
297
|
+
if (inputs.requirements && Array.isArray(inputs.requirements)) {
|
|
298
|
+
constraints.push(...inputs.requirements);
|
|
299
|
+
}
|
|
300
|
+
if (inputs.limitations && Array.isArray(inputs.limitations)) {
|
|
301
|
+
constraints.push(...inputs.limitations);
|
|
302
|
+
}
|
|
303
|
+
return constraints;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Initialize prepared statements for common queries
|
|
307
|
+
*/
|
|
308
|
+
initializePreparedStatements() {
|
|
309
|
+
try {
|
|
310
|
+
this.preparedStatements.set(
|
|
311
|
+
"single_frame",
|
|
312
|
+
this.db.prepare("SELECT * FROM frames WHERE frame_id = ?")
|
|
313
|
+
);
|
|
314
|
+
this.preparedStatements.set(
|
|
315
|
+
"frame_events",
|
|
316
|
+
this.db.prepare(
|
|
317
|
+
"SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?"
|
|
318
|
+
)
|
|
319
|
+
);
|
|
320
|
+
this.preparedStatements.set(
|
|
321
|
+
"frame_anchors",
|
|
322
|
+
this.db.prepare(
|
|
323
|
+
"SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC"
|
|
324
|
+
)
|
|
325
|
+
);
|
|
326
|
+
logger.info(
|
|
327
|
+
"Prepared statements initialized for optimized context assembly"
|
|
328
|
+
);
|
|
329
|
+
} catch (error) {
|
|
330
|
+
logger.error("Failed to initialize prepared statements", error);
|
|
331
|
+
throw error;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Clear cache and reset prepared statements
|
|
336
|
+
*/
|
|
337
|
+
cleanup() {
|
|
338
|
+
this.cache.clear();
|
|
339
|
+
this.preparedStatements.clear();
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
export {
|
|
343
|
+
OptimizedContextAssembler
|
|
344
|
+
};
|
|
345
|
+
//# sourceMappingURL=optimized-frame-context.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/performance/optimized-frame-context.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Optimized Frame Context Assembly\n * High-performance context retrieval with caching and batching\n */\n\nimport Database from 'better-sqlite3';\nimport { getQueryCache, createCacheKey } from '../database/query-cache.js';\nimport { logger } from '../monitoring/logger.js';\nimport {\n Frame,\n FrameContext,\n Anchor,\n Event,\n} from '../context/index.js';\n\nexport interface ContextAssemblyOptions {\n maxEvents?: number;\n includeClosed?: boolean;\n enableCaching?: boolean;\n batchSize?: number;\n}\n\nexport interface OptimizedFrameContext extends FrameContext {\n performance: {\n assemblyTimeMs: number;\n cacheHits: number;\n dbQueries: number;\n totalRows: number;\n };\n}\n\n/**\n * Optimized context assembly with caching and batching\n */\nexport class OptimizedContextAssembler {\n private db: Database.Database;\n private cache = getQueryCache();\n private preparedStatements = new Map<string, Database.Statement>();\n\n constructor(db: Database.Database) {\n this.db = db;\n this.initializePreparedStatements();\n }\n\n /**\n * Get hot stack context with optimizations\n */\n async getHotStackContext(\n activeStack: string[],\n options: ContextAssemblyOptions = {}\n ): Promise<OptimizedFrameContext[]> {\n const startTime = performance.now();\n const stats = {\n cacheHits: 0,\n dbQueries: 0,\n totalRows: 0,\n };\n\n const {\n maxEvents = 20,\n includeClosed = false,\n enableCaching = true,\n batchSize = 10,\n } = options;\n\n try {\n // Batch process frames for better performance\n const contexts: OptimizedFrameContext[] = [];\n\n for (let i = 0; i < activeStack.length; i += batchSize) {\n const batch = activeStack.slice(i, i + batchSize);\n const batchContexts = await this.processBatch(\n batch,\n maxEvents,\n includeClosed,\n enableCaching,\n stats\n );\n contexts.push(...batchContexts);\n }\n\n const assemblyTimeMs = performance.now() - startTime;\n\n // Add performance stats to each context\n return contexts.map((context: any) => ({\n ...context,\n performance: {\n assemblyTimeMs: assemblyTimeMs / contexts.length,\n ...stats,\n },\n }));\n } catch (error: unknown) {\n logger.error('Failed to assemble hot stack context', error as Error, {\n activeStack,\n options,\n });\n throw error;\n }\n }\n\n /**\n * Get single frame context with full optimization\n */\n async getFrameContext(\n frameId: string,\n options: ContextAssemblyOptions = {}\n ): Promise<OptimizedFrameContext | null> {\n const startTime = performance.now();\n const stats = { cacheHits: 0, dbQueries: 0, totalRows: 0 };\n\n const { maxEvents = 50, enableCaching = true } = options;\n\n // Check cache first\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n if (enableCaching) {\n const cached = this.cache.getFrameContext(cacheKey);\n if (cached) {\n stats.cacheHits++;\n return {\n ...cached,\n performance: {\n assemblyTimeMs: performance.now() - startTime,\n ...stats,\n },\n };\n }\n }\n\n try {\n const context = await this.assembleFrameContext(\n frameId,\n maxEvents,\n stats\n );\n\n if (!context) return null;\n\n // Cache the result\n if (enableCaching) {\n this.cache.cacheFrameContext(cacheKey, context);\n }\n\n const result: OptimizedFrameContext = {\n ...context,\n performance: {\n assemblyTimeMs: performance.now() - startTime,\n ...stats,\n },\n };\n\n return result;\n } catch (error: unknown) {\n logger.error('Failed to get frame context', error as Error, { frameId });\n throw error;\n }\n }\n\n /**\n * Process a batch of frames efficiently\n */\n private async processBatch(\n frameIds: string[],\n maxEvents: number,\n includeClosed: boolean,\n enableCaching: boolean,\n stats: { cacheHits: number; dbQueries: number; totalRows: number }\n ): Promise<OptimizedFrameContext[]> {\n const contexts: OptimizedFrameContext[] = [];\n\n // Get cached contexts first\n const uncachedIds = [];\n for (const frameId of frameIds) {\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n if (enableCaching) {\n const cached = this.cache.getFrameContext(cacheKey);\n if (cached) {\n stats.cacheHits++;\n contexts.push(cached);\n continue;\n }\n }\n uncachedIds.push(frameId);\n }\n\n if (uncachedIds.length === 0) {\n return contexts;\n }\n\n // Batch fetch uncached frames\n const frames = await this.batchGetFrames(uncachedIds, stats);\n const allEvents = await this.batchGetEvents(uncachedIds, maxEvents, stats);\n const allAnchors = await this.batchGetAnchors(uncachedIds, stats);\n const allArtifacts = await this.batchGetArtifacts(uncachedIds, stats);\n\n // Assemble contexts from batched data\n for (const frameId of uncachedIds) {\n const frame = frames.get(frameId);\n if (!frame || (!includeClosed && frame.state === 'closed')) {\n continue;\n }\n\n const context: FrameContext = {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors: allAnchors.get(frameId) || [],\n recentEvents: allEvents.get(frameId) || [],\n activeArtifacts: allArtifacts.get(frameId) || [],\n };\n\n // Cache the context\n if (enableCaching) {\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n this.cache.cacheFrameContext(cacheKey, context);\n }\n\n contexts.push(context as OptimizedFrameContext);\n }\n\n return contexts;\n }\n\n /**\n * Batch get frames with single query\n */\n private async batchGetFrames(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Frame>> {\n if (frameIds.length === 0) return new Map();\n\n const stmt = this.preparedStatements.get('batch_frames');\n if (!stmt) throw new Error('Prepared statement not found: batch_frames');\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `SELECT * FROM frames WHERE frame_id IN (${placeholders})`;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const frameMap = new Map<string, Frame>();\n for (const row of rows) {\n frameMap.set(row.frame_id, {\n ...row,\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n });\n }\n\n return frameMap;\n }\n\n /**\n * Batch get events for multiple frames\n */\n private async batchGetEvents(\n frameIds: string[],\n maxEvents: number,\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Event[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT *, ROW_NUMBER() OVER (PARTITION BY frame_id ORDER BY seq DESC) as rn\n FROM events \n WHERE frame_id IN (${placeholders}) \n AND rn <= ${maxEvents}\n ORDER BY frame_id, seq DESC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const eventMap = new Map<string, Event[]>();\n for (const row of rows) {\n if (!eventMap.has(row.frame_id)) {\n eventMap.set(row.frame_id, []);\n }\n eventMap.get(row.frame_id)!.push({\n ...row,\n payload: JSON.parse(row.payload),\n });\n }\n\n return eventMap;\n }\n\n /**\n * Batch get anchors for multiple frames\n */\n private async batchGetAnchors(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Anchor[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT * FROM anchors \n WHERE frame_id IN (${placeholders}) \n ORDER BY frame_id, priority DESC, created_at ASC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const anchorMap = new Map<string, Anchor[]>();\n for (const row of rows) {\n if (!anchorMap.has(row.frame_id)) {\n anchorMap.set(row.frame_id, []);\n }\n anchorMap.get(row.frame_id)!.push({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n });\n }\n\n return anchorMap;\n }\n\n /**\n * Batch get active artifacts for multiple frames\n */\n private async batchGetArtifacts(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, string[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT frame_id, payload\n FROM events \n WHERE frame_id IN (${placeholders}) \n AND event_type = 'artifact'\n ORDER BY frame_id, ts DESC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const artifactMap = new Map<string, string[]>();\n for (const row of rows) {\n const payload = JSON.parse(row.payload);\n if (!artifactMap.has(row.frame_id)) {\n artifactMap.set(row.frame_id, []);\n }\n if (payload.path) {\n artifactMap.get(row.frame_id)!.push(payload.path);\n }\n }\n\n return artifactMap;\n }\n\n /**\n * Assemble single frame context\n */\n private async assembleFrameContext(\n frameId: string,\n maxEvents: number,\n stats: { dbQueries: number; totalRows: number }\n ): Promise<FrameContext | null> {\n // Single frame operations - these could be further optimized with prepared statements\n const frame = await this.batchGetFrames([frameId], stats).then((map) =>\n map.get(frameId)\n );\n if (!frame) return null;\n\n const [events, anchors, artifacts] = await Promise.all([\n this.batchGetEvents([frameId], maxEvents, stats).then(\n (map) => map.get(frameId) || []\n ),\n this.batchGetAnchors([frameId], stats).then(\n (map) => map.get(frameId) || []\n ),\n this.batchGetArtifacts([frameId], stats).then(\n (map) => map.get(frameId) || []\n ),\n ]);\n\n return {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors,\n recentEvents: events,\n activeArtifacts: artifacts,\n };\n }\n\n /**\n * Extract constraints from frame inputs\n */\n private extractConstraints(inputs: Record<string, any>): string[] {\n const constraints: string[] = [];\n\n if (inputs.constraints && Array.isArray(inputs.constraints)) {\n constraints.push(...inputs.constraints);\n }\n\n if (inputs.requirements && Array.isArray(inputs.requirements)) {\n constraints.push(...inputs.requirements);\n }\n\n if (inputs.limitations && Array.isArray(inputs.limitations)) {\n constraints.push(...inputs.limitations);\n }\n\n return constraints;\n }\n\n /**\n * Initialize prepared statements for common queries\n */\n private initializePreparedStatements(): void {\n try {\n // Single frame query\n this.preparedStatements.set(\n 'single_frame',\n this.db.prepare('SELECT * FROM frames WHERE frame_id = ?')\n );\n\n // Frame events with limit\n this.preparedStatements.set(\n 'frame_events',\n this.db.prepare(\n 'SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?'\n )\n );\n\n // Frame anchors\n this.preparedStatements.set(\n 'frame_anchors',\n this.db.prepare(\n 'SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC'\n )\n );\n\n logger.info(\n 'Prepared statements initialized for optimized context assembly'\n );\n } catch (error: unknown) {\n logger.error('Failed to initialize prepared statements', error as Error);\n throw error;\n }\n }\n\n /**\n * Clear cache and reset prepared statements\n */\n cleanup(): void {\n this.cache.clear();\n // Modern better-sqlite3 automatically handles cleanup\n this.preparedStatements.clear();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
5
|
+
import { performance } from "perf_hooks";
|
|
6
|
+
import { logger } from "../monitoring/logger.js";
|
|
7
|
+
import { StreamingJSONLParser } from "./streaming-jsonl-parser.js";
|
|
8
|
+
import { ContextCache } from "./context-cache.js";
|
|
9
|
+
import { LazyContextLoader } from "./lazy-context-loader.js";
|
|
10
|
+
import { readFileSync } from "fs";
|
|
11
|
+
import { join } from "path";
|
|
12
|
+
class PerformanceBenchmark {
|
|
13
|
+
results = [];
|
|
14
|
+
/**
|
|
15
|
+
* Benchmark JSONL parsing performance
|
|
16
|
+
*/
|
|
17
|
+
async benchmarkJSONLParsing(filePath, iterations = 3) {
|
|
18
|
+
const parser = new StreamingJSONLParser();
|
|
19
|
+
const baselineStart = performance.now();
|
|
20
|
+
const baselineMemStart = process.memoryUsage().heapUsed;
|
|
21
|
+
let baselineCount = 0;
|
|
22
|
+
for (let i = 0; i < iterations; i++) {
|
|
23
|
+
const content = readFileSync(filePath, "utf8");
|
|
24
|
+
const lines = content.split("\n").filter((l) => l.trim());
|
|
25
|
+
for (const line of lines) {
|
|
26
|
+
try {
|
|
27
|
+
JSON.parse(line);
|
|
28
|
+
baselineCount++;
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const baselineDuration = performance.now() - baselineStart;
|
|
34
|
+
const baselineMemUsed = process.memoryUsage().heapUsed - baselineMemStart;
|
|
35
|
+
const optimizedStart = performance.now();
|
|
36
|
+
const optimizedMemStart = process.memoryUsage().heapUsed;
|
|
37
|
+
let optimizedCount = 0;
|
|
38
|
+
for (let i = 0; i < iterations; i++) {
|
|
39
|
+
for await (const batch of parser.parseStream(filePath)) {
|
|
40
|
+
optimizedCount += batch.length;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const optimizedDuration = performance.now() - optimizedStart;
|
|
44
|
+
const optimizedMemUsed = process.memoryUsage().heapUsed - optimizedMemStart;
|
|
45
|
+
const improvement = (baselineDuration - optimizedDuration) / baselineDuration * 100;
|
|
46
|
+
const memImprovement = (baselineMemUsed - optimizedMemUsed) / baselineMemUsed * 100;
|
|
47
|
+
const result = {
|
|
48
|
+
name: "JSONL Parsing",
|
|
49
|
+
duration: optimizedDuration / iterations,
|
|
50
|
+
memoryUsed: optimizedMemUsed,
|
|
51
|
+
itemsProcessed: optimizedCount / iterations,
|
|
52
|
+
throughput: optimizedCount / iterations / (optimizedDuration / 1e3 / iterations),
|
|
53
|
+
improvement
|
|
54
|
+
};
|
|
55
|
+
logger.info("JSONL Parsing Benchmark", {
|
|
56
|
+
baseline: {
|
|
57
|
+
duration: baselineDuration / iterations,
|
|
58
|
+
memory: baselineMemUsed,
|
|
59
|
+
throughput: baselineCount / iterations / (baselineDuration / 1e3 / iterations)
|
|
60
|
+
},
|
|
61
|
+
optimized: result,
|
|
62
|
+
improvements: {
|
|
63
|
+
speed: `${improvement.toFixed(1)}%`,
|
|
64
|
+
memory: `${memImprovement.toFixed(1)}%`
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
this.results.push(result);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Benchmark context caching performance
|
|
72
|
+
*/
|
|
73
|
+
async benchmarkContextCache(itemCount = 1e3, accessPatterns = 1e4) {
|
|
74
|
+
const cache = new ContextCache({
|
|
75
|
+
maxSize: 50 * 1024 * 1024,
|
|
76
|
+
maxItems: itemCount
|
|
77
|
+
});
|
|
78
|
+
const testData = Array.from({ length: itemCount }, (_, i) => ({
|
|
79
|
+
key: `item-${i}`,
|
|
80
|
+
value: {
|
|
81
|
+
id: i,
|
|
82
|
+
data: "x".repeat(Math.floor(Math.random() * 1e3)),
|
|
83
|
+
timestamp: Date.now()
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
86
|
+
const populateStart = performance.now();
|
|
87
|
+
for (const item of testData) {
|
|
88
|
+
cache.set(item.key, item.value);
|
|
89
|
+
}
|
|
90
|
+
const populateDuration = performance.now() - populateStart;
|
|
91
|
+
const accessStart = performance.now();
|
|
92
|
+
let hits = 0;
|
|
93
|
+
let misses = 0;
|
|
94
|
+
for (let i = 0; i < accessPatterns; i++) {
|
|
95
|
+
const index = Math.floor(Math.random() * itemCount * 1.2);
|
|
96
|
+
const key = `item-${index}`;
|
|
97
|
+
const result2 = cache.get(key);
|
|
98
|
+
if (result2) hits++;
|
|
99
|
+
else misses++;
|
|
100
|
+
}
|
|
101
|
+
const accessDuration = performance.now() - accessStart;
|
|
102
|
+
const stats = cache.getStats();
|
|
103
|
+
const result = {
|
|
104
|
+
name: "Context Cache",
|
|
105
|
+
duration: accessDuration,
|
|
106
|
+
memoryUsed: cache.getSize().bytes,
|
|
107
|
+
itemsProcessed: accessPatterns,
|
|
108
|
+
throughput: accessPatterns / (accessDuration / 1e3),
|
|
109
|
+
improvement: stats.hitRate * 100
|
|
110
|
+
};
|
|
111
|
+
logger.info("Context Cache Benchmark", {
|
|
112
|
+
populate: {
|
|
113
|
+
duration: populateDuration,
|
|
114
|
+
items: itemCount
|
|
115
|
+
},
|
|
116
|
+
access: {
|
|
117
|
+
duration: accessDuration,
|
|
118
|
+
patterns: accessPatterns,
|
|
119
|
+
hitRate: `${(stats.hitRate * 100).toFixed(1)}%`
|
|
120
|
+
},
|
|
121
|
+
performance: {
|
|
122
|
+
throughput: `${result.throughput.toFixed(0)} ops/sec`,
|
|
123
|
+
avgAccessTime: `${stats.avgAccessTime.toFixed(2)}ms`
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
this.results.push(result);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Benchmark lazy loading performance
|
|
131
|
+
*/
|
|
132
|
+
async benchmarkLazyLoading(db, projectId, frameCount = 100) {
|
|
133
|
+
const loader = new LazyContextLoader(db, projectId);
|
|
134
|
+
let frames = [];
|
|
135
|
+
try {
|
|
136
|
+
frames = db.prepare("SELECT id FROM frames ORDER BY updated_at DESC LIMIT ?").all(frameCount);
|
|
137
|
+
} catch (error) {
|
|
138
|
+
logger.warn("Frames table not found, using mock data for benchmark");
|
|
139
|
+
frames = Array.from({ length: Math.min(frameCount, 10) }, (_, i) => ({
|
|
140
|
+
id: `frame-${i}`
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
const frameIds = frames.map((f) => f.id);
|
|
144
|
+
const eagerStart = performance.now();
|
|
145
|
+
const eagerMemStart = process.memoryUsage().heapUsed;
|
|
146
|
+
const eagerData = [];
|
|
147
|
+
for (const id of frameIds) {
|
|
148
|
+
try {
|
|
149
|
+
const frame = db.prepare("SELECT * FROM frames WHERE id = ?").get(id);
|
|
150
|
+
const anchors = db.prepare("SELECT * FROM anchors WHERE frame_id = ?").all(id);
|
|
151
|
+
const events = db.prepare("SELECT * FROM events WHERE frame_id = ? LIMIT 10").all(id);
|
|
152
|
+
eagerData.push({ frame, anchors, events });
|
|
153
|
+
} catch {
|
|
154
|
+
eagerData.push({
|
|
155
|
+
frame: { id, type: "mock", name: `Mock ${id}` },
|
|
156
|
+
anchors: [],
|
|
157
|
+
events: []
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const eagerDuration = performance.now() - eagerStart;
|
|
162
|
+
const eagerMemUsed = process.memoryUsage().heapUsed - eagerMemStart;
|
|
163
|
+
const lazyStart = performance.now();
|
|
164
|
+
const lazyMemStart = process.memoryUsage().heapUsed;
|
|
165
|
+
await loader.preloadContext(frameIds, { parallel: true, depth: 2 });
|
|
166
|
+
let accessedCount = 0;
|
|
167
|
+
for (const id of frameIds.slice(0, frameCount / 2)) {
|
|
168
|
+
const frame = await loader.lazyFrame(id).get();
|
|
169
|
+
if (frame) accessedCount++;
|
|
170
|
+
}
|
|
171
|
+
const lazyDuration = performance.now() - lazyStart;
|
|
172
|
+
const lazyMemUsed = process.memoryUsage().heapUsed - lazyMemStart;
|
|
173
|
+
const improvement = (eagerDuration - lazyDuration) / eagerDuration * 100;
|
|
174
|
+
const memImprovement = (eagerMemUsed - lazyMemUsed) / eagerMemUsed * 100;
|
|
175
|
+
const result = {
|
|
176
|
+
name: "Lazy Loading",
|
|
177
|
+
duration: lazyDuration,
|
|
178
|
+
memoryUsed: lazyMemUsed,
|
|
179
|
+
itemsProcessed: frameCount,
|
|
180
|
+
throughput: frameCount / (lazyDuration / 1e3),
|
|
181
|
+
improvement
|
|
182
|
+
};
|
|
183
|
+
logger.info("Lazy Loading Benchmark", {
|
|
184
|
+
eager: {
|
|
185
|
+
duration: eagerDuration,
|
|
186
|
+
memory: eagerMemUsed
|
|
187
|
+
},
|
|
188
|
+
lazy: {
|
|
189
|
+
duration: lazyDuration,
|
|
190
|
+
memory: lazyMemUsed,
|
|
191
|
+
accessed: accessedCount
|
|
192
|
+
},
|
|
193
|
+
improvements: {
|
|
194
|
+
speed: `${improvement.toFixed(1)}%`,
|
|
195
|
+
memory: `${memImprovement.toFixed(1)}%`
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
this.results.push(result);
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Run full benchmark suite
|
|
203
|
+
*/
|
|
204
|
+
async runFullSuite(projectRoot, db, projectId) {
|
|
205
|
+
const suiteStart = performance.now();
|
|
206
|
+
logger.info("Starting Performance Benchmark Suite");
|
|
207
|
+
const tasksFile = join(projectRoot, ".stackmemory", "tasks.jsonl");
|
|
208
|
+
const jsonlResult = await this.benchmarkJSONLParsing(tasksFile);
|
|
209
|
+
const cacheResult = await this.benchmarkContextCache();
|
|
210
|
+
const lazyResult = await this.benchmarkLazyLoading(db, projectId);
|
|
211
|
+
const totalDuration = performance.now() - suiteStart;
|
|
212
|
+
const averageImprovement = this.results.filter((r) => r.improvement !== void 0).reduce((sum, r) => sum + (r.improvement || 0), 0) / this.results.filter((r) => r.improvement !== void 0).length;
|
|
213
|
+
const suite = {
|
|
214
|
+
name: "Performance Optimization Suite",
|
|
215
|
+
results: this.results,
|
|
216
|
+
totalDuration,
|
|
217
|
+
averageImprovement
|
|
218
|
+
};
|
|
219
|
+
this.generateReport(suite);
|
|
220
|
+
return suite;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Generate performance report
|
|
224
|
+
*/
|
|
225
|
+
generateReport(suite) {
|
|
226
|
+
console.log("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557");
|
|
227
|
+
console.log("\u2551 Performance Benchmark Results \u2551");
|
|
228
|
+
console.log("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n");
|
|
229
|
+
for (const result of suite.results) {
|
|
230
|
+
console.log(`\u{1F4CA} ${result.name}`);
|
|
231
|
+
console.log(` Duration: ${result.duration.toFixed(2)}ms`);
|
|
232
|
+
console.log(
|
|
233
|
+
` Memory: ${(result.memoryUsed / 1024 / 1024).toFixed(2)}MB`
|
|
234
|
+
);
|
|
235
|
+
console.log(` Throughput: ${result.throughput.toFixed(0)} items/sec`);
|
|
236
|
+
if (result.improvement !== void 0) {
|
|
237
|
+
const icon = result.improvement > 0 ? "\u{1F680}" : "\u26A0\uFE0F";
|
|
238
|
+
console.log(
|
|
239
|
+
` ${icon} Improvement: ${result.improvement.toFixed(1)}%`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
console.log("");
|
|
243
|
+
}
|
|
244
|
+
console.log("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550");
|
|
245
|
+
console.log(`\u23F1\uFE0F Total Duration: ${suite.totalDuration.toFixed(2)}ms`);
|
|
246
|
+
console.log(
|
|
247
|
+
`\u{1F4C8} Average Improvement: ${suite.averageImprovement.toFixed(1)}%`
|
|
248
|
+
);
|
|
249
|
+
console.log("");
|
|
250
|
+
logger.info("Performance Benchmark Complete", {
|
|
251
|
+
suite: suite.name,
|
|
252
|
+
duration: suite.totalDuration,
|
|
253
|
+
avgImprovement: suite.averageImprovement,
|
|
254
|
+
results: suite.results.map((r) => ({
|
|
255
|
+
name: r.name,
|
|
256
|
+
improvement: r.improvement,
|
|
257
|
+
throughput: r.throughput
|
|
258
|
+
}))
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get benchmark results
|
|
263
|
+
*/
|
|
264
|
+
getResults() {
|
|
265
|
+
return this.results;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Clear results
|
|
269
|
+
*/
|
|
270
|
+
clearResults() {
|
|
271
|
+
this.results = [];
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
export {
|
|
275
|
+
PerformanceBenchmark
|
|
276
|
+
};
|
|
277
|
+
//# sourceMappingURL=performance-benchmark.js.map
|