@stackmemoryai/stackmemory 0.2.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/core/agent-task-manager.js +512 -0
- package/dist/agents/core/agent-task-manager.js.map +7 -0
- package/dist/agents/verifiers/base-verifier.js +129 -0
- package/dist/agents/verifiers/base-verifier.js.map +7 -0
- package/dist/agents/verifiers/formatter-verifier.js +126 -0
- package/dist/agents/verifiers/formatter-verifier.js.map +7 -0
- package/dist/agents/verifiers/llm-judge.js +248 -0
- package/dist/agents/verifiers/llm-judge.js.map +7 -0
- package/dist/cli/__tests__/index.test.js +290 -0
- package/dist/cli/__tests__/index.test.js.map +7 -0
- package/dist/cli/auto-detect.js +317 -0
- package/dist/cli/auto-detect.js.map +7 -0
- package/dist/cli/browser-test.js +29 -0
- package/dist/cli/browser-test.js.map +7 -0
- package/dist/cli/claude-sm.js +369 -0
- package/dist/cli/claude-sm.js.map +7 -0
- package/dist/cli/codex-sm.js +283 -0
- package/dist/cli/codex-sm.js.map +7 -0
- package/dist/cli/commands/agent.js +286 -0
- package/dist/cli/commands/agent.js.map +7 -0
- package/dist/cli/commands/config.js +199 -0
- package/dist/cli/commands/config.js.map +7 -0
- package/dist/cli/commands/context.js +327 -0
- package/dist/cli/commands/context.js.map +7 -0
- package/dist/cli/commands/handoff.js +191 -0
- package/dist/cli/commands/handoff.js.map +7 -0
- package/dist/cli/commands/linear-test.js +115 -0
- package/dist/cli/commands/linear-test.js.map +7 -0
- package/dist/cli/commands/linear.js +378 -0
- package/dist/cli/commands/linear.js.map +7 -0
- package/dist/cli/commands/log.js +165 -0
- package/dist/cli/commands/log.js.map +7 -0
- package/dist/cli/commands/onboard.js +349 -0
- package/dist/cli/commands/onboard.js.map +7 -0
- package/dist/cli/commands/projects.js +195 -0
- package/dist/cli/commands/projects.js.map +7 -0
- package/dist/cli/commands/search.js +152 -0
- package/dist/cli/commands/search.js.map +7 -0
- package/dist/cli/commands/session.js +179 -0
- package/dist/cli/commands/session.js.map +7 -0
- package/dist/cli/commands/tasks.js +205 -0
- package/dist/cli/commands/tasks.js.map +7 -0
- package/dist/cli/commands/webhook.js +131 -0
- package/dist/cli/commands/webhook.js.map +7 -0
- package/dist/cli/commands/worktree.js +276 -0
- package/dist/cli/commands/worktree.js.map +7 -0
- package/dist/cli/index.js +953 -0
- package/dist/cli/index.js.map +7 -0
- package/dist/cli/utils/viewer.js +92 -0
- package/dist/cli/utils/viewer.js.map +7 -0
- package/dist/core/config/__tests__/config-manager.test.js +248 -0
- package/dist/core/config/__tests__/config-manager.test.js.map +7 -0
- package/dist/core/config/config-manager.js +368 -0
- package/dist/core/config/config-manager.js.map +7 -0
- package/dist/core/config/types.js +140 -0
- package/dist/core/config/types.js.map +7 -0
- package/dist/core/context/__tests__/frame-manager.test.js +879 -0
- package/dist/core/context/__tests__/frame-manager.test.js.map +7 -0
- package/dist/core/context/auto-context.js +72 -0
- package/dist/core/context/auto-context.js.map +7 -0
- package/dist/core/context/compaction-handler.js +326 -0
- package/dist/core/context/compaction-handler.js.map +7 -0
- package/dist/core/context/frame-database.js +376 -0
- package/dist/core/context/frame-database.js.map +7 -0
- package/dist/core/context/frame-digest.js +239 -0
- package/dist/core/context/frame-digest.js.map +7 -0
- package/dist/core/context/frame-manager.js +682 -0
- package/dist/core/context/frame-manager.js.map +7 -0
- package/dist/core/context/frame-stack.js +270 -0
- package/dist/core/context/frame-stack.js.map +7 -0
- package/dist/core/context/frame-types.js +1 -0
- package/dist/core/context/frame-types.js.map +7 -0
- package/dist/core/context/index.js +33 -0
- package/dist/core/context/index.js.map +7 -0
- package/dist/core/context/model-aware-compaction.js +619 -0
- package/dist/core/context/model-aware-compaction.js.map +7 -0
- package/dist/core/context/refactored-frame-manager.js +393 -0
- package/dist/core/context/refactored-frame-manager.js.map +7 -0
- package/dist/core/database/batch-operations.js +329 -0
- package/dist/core/database/batch-operations.js.map +7 -0
- package/dist/core/database/connection-pool.js +224 -0
- package/dist/core/database/connection-pool.js.map +7 -0
- package/dist/core/database/query-cache.js +284 -0
- package/dist/core/database/query-cache.js.map +7 -0
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js +379 -0
- package/dist/core/digest/__tests__/enhanced-hybrid-digest.test.js.map +7 -0
- package/dist/core/digest/__tests__/frame-digest-integration.test.js +230 -0
- package/dist/core/digest/__tests__/frame-digest-integration.test.js.map +7 -0
- package/dist/core/digest/enhanced-hybrid-digest.js +267 -0
- package/dist/core/digest/enhanced-hybrid-digest.js.map +7 -0
- package/dist/core/digest/frame-digest-integration.js +172 -0
- package/dist/core/digest/frame-digest-integration.js.map +7 -0
- package/dist/core/digest/hybrid-digest-generator.js +549 -0
- package/dist/core/digest/hybrid-digest-generator.js.map +7 -0
- package/dist/core/digest/index.js +5 -0
- package/dist/core/digest/index.js.map +7 -0
- package/dist/core/digest/types.js +21 -0
- package/dist/core/digest/types.js.map +7 -0
- package/dist/core/errors/__tests__/error-handling.test.js +270 -0
- package/dist/core/errors/__tests__/error-handling.test.js.map +7 -0
- package/dist/core/errors/index.js +239 -0
- package/dist/core/errors/index.js.map +7 -0
- package/dist/core/errors/recovery.js +258 -0
- package/dist/core/errors/recovery.js.map +7 -0
- package/dist/core/merge/__tests__/conflict-scenarios.test.js +414 -0
- package/dist/core/merge/__tests__/conflict-scenarios.test.js.map +7 -0
- package/dist/core/merge/conflict-detector.js +424 -0
- package/dist/core/merge/conflict-detector.js.map +7 -0
- package/dist/core/merge/index.js +5 -0
- package/dist/core/merge/index.js.map +7 -0
- package/dist/core/merge/resolution-engine.js +565 -0
- package/dist/core/merge/resolution-engine.js.map +7 -0
- package/dist/core/merge/stack-diff.js +528 -0
- package/dist/core/merge/stack-diff.js.map +7 -0
- package/dist/core/merge/types.js +1 -0
- package/dist/core/merge/types.js.map +7 -0
- package/dist/core/monitoring/error-handler.js +278 -0
- package/dist/core/monitoring/error-handler.js.map +7 -0
- package/dist/core/monitoring/logger.js +115 -0
- package/dist/core/monitoring/logger.js.map +7 -0
- package/dist/core/monitoring/metrics.js +157 -0
- package/dist/core/monitoring/metrics.js.map +7 -0
- package/dist/core/monitoring/progress-tracker.js +174 -0
- package/dist/core/monitoring/progress-tracker.js.map +7 -0
- package/dist/core/performance/context-cache.js +269 -0
- package/dist/core/performance/context-cache.js.map +7 -0
- package/dist/core/performance/index.js +7 -0
- package/dist/core/performance/index.js.map +7 -0
- package/dist/core/performance/lazy-context-loader.js +319 -0
- package/dist/core/performance/lazy-context-loader.js.map +7 -0
- package/dist/core/performance/monitor.js +217 -0
- package/dist/core/performance/monitor.js.map +7 -0
- package/dist/core/performance/optimized-frame-context.js +326 -0
- package/dist/core/performance/optimized-frame-context.js.map +7 -0
- package/dist/core/performance/performance-benchmark.js +269 -0
- package/dist/core/performance/performance-benchmark.js.map +7 -0
- package/dist/core/performance/performance-profiler.js +318 -0
- package/dist/core/performance/performance-profiler.js.map +7 -0
- package/dist/core/performance/streaming-jsonl-parser.js +187 -0
- package/dist/core/performance/streaming-jsonl-parser.js.map +7 -0
- package/dist/core/persistence/postgres-adapter.js +345 -0
- package/dist/core/persistence/postgres-adapter.js.map +7 -0
- package/dist/core/projects/project-manager.js +699 -0
- package/dist/core/projects/project-manager.js.map +7 -0
- package/dist/core/query/__tests__/query-parser.test.js +301 -0
- package/dist/core/query/__tests__/query-parser.test.js.map +7 -0
- package/dist/core/query/__tests__/query-templates.test.js +210 -0
- package/dist/core/query/__tests__/query-templates.test.js.map +7 -0
- package/dist/core/query/query-parser.js +366 -0
- package/dist/core/query/query-parser.js.map +7 -0
- package/dist/core/query/query-templates.js +317 -0
- package/dist/core/query/query-templates.js.map +7 -0
- package/dist/core/retrieval/index.js +4 -0
- package/dist/core/retrieval/index.js.map +7 -0
- package/dist/core/retrieval/llm-context-retrieval.js +577 -0
- package/dist/core/retrieval/llm-context-retrieval.js.map +7 -0
- package/dist/core/retrieval/summary-generator.js +585 -0
- package/dist/core/retrieval/summary-generator.js.map +7 -0
- package/dist/core/retrieval/types.js +17 -0
- package/dist/core/retrieval/types.js.map +7 -0
- package/dist/core/session/index.js +11 -0
- package/dist/core/session/index.js.map +7 -0
- package/dist/core/session/session-manager.js +297 -0
- package/dist/core/session/session-manager.js.map +7 -0
- package/dist/core/trace/cli-trace-wrapper.js +110 -0
- package/dist/core/trace/cli-trace-wrapper.js.map +7 -0
- package/dist/core/trace/db-trace-wrapper.js +215 -0
- package/dist/core/trace/db-trace-wrapper.js.map +7 -0
- package/dist/core/trace/debug-trace.js +385 -0
- package/dist/core/trace/debug-trace.js.map +7 -0
- package/dist/core/trace/index.js +158 -0
- package/dist/core/trace/index.js.map +7 -0
- package/dist/core/trace/linear-api-wrapper.js +169 -0
- package/dist/core/trace/linear-api-wrapper.js.map +7 -0
- package/dist/core/trace/trace-demo.js +135 -0
- package/dist/core/trace/trace-demo.js.map +7 -0
- package/dist/core/trace/trace-detector.demo.js +138 -0
- package/dist/core/trace/trace-detector.demo.js.map +7 -0
- package/dist/core/trace/trace-detector.js +386 -0
- package/dist/core/trace/trace-detector.js.map +7 -0
- package/dist/core/trace/trace-detector.test.js +401 -0
- package/dist/core/trace/trace-detector.test.js.map +7 -0
- package/dist/core/trace/trace-store.js +341 -0
- package/dist/core/trace/trace-store.js.map +7 -0
- package/dist/core/trace/types.js +73 -0
- package/dist/core/trace/types.js.map +7 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +7 -0
- package/dist/core/utils/update-checker.js +214 -0
- package/dist/core/utils/update-checker.js.map +7 -0
- package/dist/core/worktree/worktree-manager.js +450 -0
- package/dist/core/worktree/worktree-manager.js.map +7 -0
- package/dist/features/analytics/api/analytics-api.js +283 -0
- package/dist/features/analytics/api/analytics-api.js.map +7 -0
- package/dist/features/analytics/core/analytics-service.js +267 -0
- package/dist/features/analytics/core/analytics-service.js.map +7 -0
- package/dist/features/analytics/index.js +14 -0
- package/dist/features/analytics/index.js.map +7 -0
- package/dist/features/analytics/queries/metrics-queries.js +273 -0
- package/dist/features/analytics/queries/metrics-queries.js.map +7 -0
- package/dist/features/analytics/types/metrics.js +1 -0
- package/dist/features/analytics/types/metrics.js.map +7 -0
- package/dist/features/browser/browser-mcp.js +488 -0
- package/dist/features/browser/browser-mcp.js.map +7 -0
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js +747 -0
- package/dist/features/tasks/__tests__/pebbles-task-store.test.js.map +7 -0
- package/dist/features/tasks/pebbles-task-store.js +647 -0
- package/dist/features/tasks/pebbles-task-store.js.map +7 -0
- package/dist/features/tasks/task-aware-context.js +406 -0
- package/dist/features/tasks/task-aware-context.js.map +7 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +7 -0
- package/dist/integrations/linear/__tests__/auth.test.js +558 -0
- package/dist/integrations/linear/__tests__/auth.test.js.map +7 -0
- package/dist/integrations/linear/__tests__/sync-service.test.js +760 -0
- package/dist/integrations/linear/__tests__/sync-service.test.js.map +7 -0
- package/dist/integrations/linear/auth.js +308 -0
- package/dist/integrations/linear/auth.js.map +7 -0
- package/dist/integrations/linear/auto-sync.js +244 -0
- package/dist/integrations/linear/auto-sync.js.map +7 -0
- package/dist/integrations/linear/client.js +448 -0
- package/dist/integrations/linear/client.js.map +7 -0
- package/dist/integrations/linear/config.js +115 -0
- package/dist/integrations/linear/config.js.map +7 -0
- package/dist/integrations/linear/sync-manager.js +233 -0
- package/dist/integrations/linear/sync-manager.js.map +7 -0
- package/dist/integrations/linear/sync-service.js +214 -0
- package/dist/integrations/linear/sync-service.js.map +7 -0
- package/dist/integrations/linear/sync.js +565 -0
- package/dist/integrations/linear/sync.js.map +7 -0
- package/dist/integrations/linear/types.js +1 -0
- package/dist/integrations/linear/types.js.map +7 -0
- package/dist/integrations/linear/webhook-server.js +204 -0
- package/dist/integrations/linear/webhook-server.js.map +7 -0
- package/dist/integrations/linear/webhook.js +269 -0
- package/dist/integrations/linear/webhook.js.map +7 -0
- package/dist/integrations/mcp/__tests__/server.test.js +798 -0
- package/dist/integrations/mcp/__tests__/server.test.js.map +7 -0
- package/dist/integrations/mcp/handlers/context-handlers.js +253 -0
- package/dist/integrations/mcp/handlers/context-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/index.js +134 -0
- package/dist/integrations/mcp/handlers/index.js.map +7 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js +243 -0
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/task-handlers.js +235 -0
- package/dist/integrations/mcp/handlers/task-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js +304 -0
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +7 -0
- package/dist/integrations/mcp/index.js +19 -0
- package/dist/integrations/mcp/index.js.map +7 -0
- package/dist/integrations/mcp/refactored-server.js +331 -0
- package/dist/integrations/mcp/refactored-server.js.map +7 -0
- package/dist/integrations/mcp/server.js +1621 -0
- package/dist/integrations/mcp/server.js.map +7 -0
- package/dist/integrations/mcp/tool-definitions.js +562 -0
- package/dist/integrations/mcp/tool-definitions.js.map +7 -0
- package/dist/integrations/mcp/trace-test.js +44 -0
- package/dist/integrations/mcp/trace-test.js.map +7 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js +174 -0
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +7 -0
- package/dist/integrations/pg-aiguide/semantic-search.js +183 -0
- package/dist/integrations/pg-aiguide/semantic-search.js.map +7 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js +220 -0
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +7 -0
- package/dist/mcp/stackmemory-mcp-server.js +550 -0
- package/dist/mcp/stackmemory-mcp-server.js.map +7 -0
- package/dist/middleware/exponential-rate-limiter.js +285 -0
- package/dist/middleware/exponential-rate-limiter.js.map +7 -0
- package/dist/models/user.model.js +351 -0
- package/dist/models/user.model.js.map +7 -0
- package/dist/scripts/benchmark-performance.d.ts +7 -0
- package/dist/scripts/benchmark-performance.d.ts.map +1 -0
- package/dist/scripts/benchmark-performance.js +44 -0
- package/dist/scripts/benchmark-performance.js.map +1 -0
- package/dist/scripts/cleanup-duplicate-tasks.d.ts +12 -0
- package/dist/scripts/cleanup-duplicate-tasks.d.ts.map +1 -0
- package/dist/scripts/cleanup-duplicate-tasks.js +215 -0
- package/dist/scripts/cleanup-duplicate-tasks.js.map +1 -0
- package/dist/servers/production/auth-middleware.js +513 -0
- package/dist/servers/production/auth-middleware.js.map +7 -0
- package/dist/servers/railway/index.js +390 -0
- package/dist/servers/railway/index.js.map +7 -0
- package/dist/services/config-service.js +62 -0
- package/dist/services/config-service.js.map +7 -0
- package/dist/services/context-service.js +191 -0
- package/dist/services/context-service.js.map +7 -0
- package/dist/src/agents/core/agent-task-manager.d.ts +154 -0
- package/dist/src/agents/core/agent-task-manager.d.ts.map +1 -0
- package/dist/src/agents/core/agent-task-manager.js +504 -0
- package/dist/src/agents/core/agent-task-manager.js.map +1 -0
- package/dist/src/agents/verifiers/base-verifier.d.ts +112 -0
- package/dist/src/agents/verifiers/base-verifier.d.ts.map +1 -0
- package/dist/src/agents/verifiers/base-verifier.js +130 -0
- package/dist/src/agents/verifiers/base-verifier.js.map +1 -0
- package/dist/src/agents/verifiers/formatter-verifier.d.ts +14 -0
- package/dist/src/agents/verifiers/formatter-verifier.d.ts.map +1 -0
- package/dist/src/agents/verifiers/formatter-verifier.js +107 -0
- package/dist/src/agents/verifiers/formatter-verifier.js.map +1 -0
- package/dist/src/agents/verifiers/llm-judge.d.ts +46 -0
- package/dist/src/agents/verifiers/llm-judge.d.ts.map +1 -0
- package/dist/src/agents/verifiers/llm-judge.js +248 -0
- package/dist/src/agents/verifiers/llm-judge.js.map +1 -0
- package/dist/src/cli/claude-sm.js +55 -0
- package/dist/src/cli/claude-sm.js.map +1 -1
- package/dist/src/cli/commands/agent.d.ts +9 -0
- package/dist/src/cli/commands/agent.d.ts.map +1 -0
- package/dist/src/cli/commands/agent.js +303 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/handoff.d.ts +6 -0
- package/dist/src/cli/commands/handoff.d.ts.map +1 -0
- package/dist/src/cli/commands/handoff.js +212 -0
- package/dist/src/cli/commands/handoff.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/context/frame-database.d.ts +59 -0
- package/dist/src/core/context/frame-database.d.ts.map +1 -0
- package/dist/src/core/context/frame-database.js +333 -0
- package/dist/src/core/context/frame-database.js.map +1 -0
- package/dist/src/core/context/frame-digest.d.ts +59 -0
- package/dist/src/core/context/frame-digest.d.ts.map +1 -0
- package/dist/src/core/context/frame-digest.js +264 -0
- package/dist/src/core/context/frame-digest.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +2 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -1
- package/dist/src/core/context/frame-manager.js +7 -0
- package/dist/src/core/context/frame-manager.js.map +1 -1
- package/dist/src/core/context/frame-stack.d.ts +85 -0
- package/dist/src/core/context/frame-stack.d.ts.map +1 -0
- package/dist/src/core/context/frame-stack.js +287 -0
- package/dist/src/core/context/frame-stack.js.map +1 -0
- package/dist/src/core/context/frame-types.d.ts +67 -0
- package/dist/src/core/context/frame-types.d.ts.map +1 -0
- package/dist/src/core/context/frame-types.js +6 -0
- package/dist/src/core/context/frame-types.js.map +1 -0
- package/dist/src/core/context/index.d.ts +11 -0
- package/dist/src/core/context/index.d.ts.map +1 -0
- package/dist/src/core/context/index.js +14 -0
- package/dist/src/core/context/index.js.map +1 -0
- package/dist/src/core/context/refactored-frame-manager.d.ts +99 -0
- package/dist/src/core/context/refactored-frame-manager.d.ts.map +1 -0
- package/dist/src/core/context/refactored-frame-manager.js +340 -0
- package/dist/src/core/context/refactored-frame-manager.js.map +1 -0
- package/dist/src/core/database/batch-operations.d.ts +118 -0
- package/dist/src/core/database/batch-operations.d.ts.map +1 -0
- package/dist/src/core/database/batch-operations.js +339 -0
- package/dist/src/core/database/batch-operations.js.map +1 -0
- package/dist/src/core/database/connection-pool.d.ts +79 -0
- package/dist/src/core/database/connection-pool.d.ts.map +1 -0
- package/dist/src/core/database/connection-pool.js +236 -0
- package/dist/src/core/database/connection-pool.js.map +1 -0
- package/dist/src/core/database/query-cache.d.ts +135 -0
- package/dist/src/core/database/query-cache.d.ts.map +1 -0
- package/dist/src/core/database/query-cache.js +294 -0
- package/dist/src/core/database/query-cache.js.map +1 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts +125 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.d.ts.map +1 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js +282 -0
- package/dist/src/core/digest/enhanced-hybrid-digest.js.map +1 -0
- package/dist/src/core/digest/frame-digest-integration.d.ts +67 -0
- package/dist/src/core/digest/frame-digest-integration.d.ts.map +1 -0
- package/dist/src/core/digest/frame-digest-integration.js +198 -0
- package/dist/src/core/digest/frame-digest-integration.js.map +1 -0
- package/dist/src/core/digest/hybrid-digest-generator.d.ts +3 -3
- package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -1
- package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -1
- package/dist/src/core/digest/index.d.ts +3 -1
- package/dist/src/core/digest/index.d.ts.map +1 -1
- package/dist/src/core/digest/index.js +3 -1
- package/dist/src/core/digest/index.js.map +1 -1
- package/dist/src/core/errors/index.d.ts +13 -5
- package/dist/src/core/errors/index.d.ts.map +1 -1
- package/dist/src/core/errors/index.js +13 -5
- package/dist/src/core/errors/index.js.map +1 -1
- package/dist/src/core/merge/conflict-detector.d.ts +122 -0
- package/dist/src/core/merge/conflict-detector.d.ts.map +1 -0
- package/dist/src/core/merge/conflict-detector.js +468 -0
- package/dist/src/core/merge/conflict-detector.js.map +1 -0
- package/dist/src/core/merge/index.d.ts +9 -0
- package/dist/src/core/merge/index.d.ts.map +1 -0
- package/dist/src/core/merge/index.js +9 -0
- package/dist/src/core/merge/index.js.map +1 -0
- package/dist/src/core/merge/resolution-engine.d.ts +120 -0
- package/dist/src/core/merge/resolution-engine.d.ts.map +1 -0
- package/dist/src/core/merge/resolution-engine.js +573 -0
- package/dist/src/core/merge/resolution-engine.js.map +1 -0
- package/dist/src/core/merge/stack-diff.d.ts +97 -0
- package/dist/src/core/merge/stack-diff.d.ts.map +1 -0
- package/dist/src/core/merge/stack-diff.js +516 -0
- package/dist/src/core/merge/stack-diff.js.map +1 -0
- package/dist/src/core/merge/types.d.ts +110 -0
- package/dist/src/core/merge/types.d.ts.map +1 -0
- package/dist/src/core/merge/types.js +6 -0
- package/dist/src/core/merge/types.js.map +1 -0
- package/dist/src/core/performance/context-cache.d.ts +109 -0
- package/dist/src/core/performance/context-cache.d.ts.map +1 -0
- package/dist/src/core/performance/context-cache.js +280 -0
- package/dist/src/core/performance/context-cache.js.map +1 -0
- package/dist/src/core/performance/index.d.ts +3 -0
- package/dist/src/core/performance/index.d.ts.map +1 -0
- package/dist/src/core/performance/index.js +3 -0
- package/dist/src/core/performance/index.js.map +1 -0
- package/dist/src/core/performance/lazy-context-loader.d.ts +93 -0
- package/dist/src/core/performance/lazy-context-loader.d.ts.map +1 -0
- package/dist/src/core/performance/lazy-context-loader.js +332 -0
- package/dist/src/core/performance/lazy-context-loader.js.map +1 -0
- package/dist/src/core/performance/monitor.d.ts +48 -0
- package/dist/src/core/performance/monitor.d.ts.map +1 -0
- package/dist/src/core/performance/monitor.js +226 -0
- package/dist/src/core/performance/monitor.js.map +1 -0
- package/dist/src/core/performance/optimized-frame-context.d.ts +74 -0
- package/dist/src/core/performance/optimized-frame-context.d.ts.map +1 -0
- package/dist/src/core/performance/optimized-frame-context.js +330 -0
- package/dist/src/core/performance/optimized-frame-context.js.map +1 -0
- package/dist/src/core/performance/performance-benchmark.d.ts +50 -0
- package/dist/src/core/performance/performance-benchmark.d.ts.map +1 -0
- package/dist/src/core/performance/performance-benchmark.js +290 -0
- package/dist/src/core/performance/performance-benchmark.js.map +1 -0
- package/dist/src/core/performance/performance-profiler.d.ts +151 -0
- package/dist/src/core/performance/performance-profiler.d.ts.map +1 -0
- package/dist/src/core/performance/performance-profiler.js +346 -0
- package/dist/src/core/performance/performance-profiler.js.map +1 -0
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts +41 -0
- package/dist/src/core/performance/streaming-jsonl-parser.d.ts.map +1 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js +193 -0
- package/dist/src/core/performance/streaming-jsonl-parser.js.map +1 -0
- package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -1
- package/dist/src/core/persistence/postgres-adapter.js +18 -4
- package/dist/src/core/persistence/postgres-adapter.js.map +1 -1
- package/dist/src/core/query/query-parser.d.ts +5 -0
- package/dist/src/core/query/query-parser.d.ts.map +1 -1
- package/dist/src/core/query/query-parser.js +86 -18
- package/dist/src/core/query/query-parser.js.map +1 -1
- package/dist/src/core/query/query-templates.d.ts +44 -0
- package/dist/src/core/query/query-templates.d.ts.map +1 -0
- package/dist/src/core/query/query-templates.js +326 -0
- package/dist/src/core/query/query-templates.js.map +1 -0
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts +5 -3
- package/dist/src/core/retrieval/llm-context-retrieval.d.ts.map +1 -1
- package/dist/src/core/retrieval/llm-context-retrieval.js +73 -21
- package/dist/src/core/retrieval/llm-context-retrieval.js.map +1 -1
- package/dist/src/core/trace/cli-trace-wrapper.d.ts +23 -0
- package/dist/src/core/trace/cli-trace-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/cli-trace-wrapper.js +141 -0
- package/dist/src/core/trace/cli-trace-wrapper.js.map +1 -0
- package/dist/src/core/trace/db-trace-wrapper.d.ts +36 -0
- package/dist/src/core/trace/db-trace-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/db-trace-wrapper.js +252 -0
- package/dist/src/core/trace/db-trace-wrapper.js.map +1 -0
- package/dist/src/core/trace/debug-trace.d.ts +84 -0
- package/dist/src/core/trace/debug-trace.d.ts.map +1 -0
- package/dist/src/core/trace/debug-trace.js +402 -0
- package/dist/src/core/trace/debug-trace.js.map +1 -0
- package/dist/src/core/trace/error-test.d.ts +6 -0
- package/dist/src/core/trace/error-test.d.ts.map +1 -0
- package/dist/src/core/trace/error-test.js +128 -0
- package/dist/src/core/trace/error-test.js.map +1 -0
- package/dist/src/core/trace/index.d.ts +25 -0
- package/dist/src/core/trace/index.d.ts.map +1 -0
- package/dist/src/core/trace/index.js +121 -0
- package/dist/src/core/trace/index.js.map +1 -0
- package/dist/src/core/trace/linear-api-wrapper.d.ts +17 -0
- package/dist/src/core/trace/linear-api-wrapper.d.ts.map +1 -0
- package/dist/src/core/trace/linear-api-wrapper.js +205 -0
- package/dist/src/core/trace/linear-api-wrapper.js.map +1 -0
- package/dist/src/core/trace/performance-test.d.ts +6 -0
- package/dist/src/core/trace/performance-test.d.ts.map +1 -0
- package/dist/src/core/trace/performance-test.js +111 -0
- package/dist/src/core/trace/performance-test.js.map +1 -0
- package/dist/src/core/trace/trace-demo.d.ts +8 -0
- package/dist/src/core/trace/trace-demo.d.ts.map +1 -0
- package/dist/src/core/trace/trace-demo.js +154 -0
- package/dist/src/core/trace/trace-demo.js.map +1 -0
- package/dist/src/core/trace/trace-detector.d.ts +2 -2
- package/dist/src/core/trace/trace-detector.d.ts.map +1 -1
- package/dist/src/core/trace/trace-detector.demo.js +1 -1
- package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
- package/dist/src/core/trace/trace-detector.js +3 -3
- package/dist/src/core/trace/trace-detector.js.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.d.ts +9 -2
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.js +97 -18
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
- package/dist/src/integrations/linear/auth.d.ts.map +1 -1
- package/dist/src/integrations/linear/auth.js.map +1 -1
- package/dist/src/integrations/linear/client.d.ts +15 -1
- package/dist/src/integrations/linear/client.d.ts.map +1 -1
- package/dist/src/integrations/linear/client.js +85 -3
- package/dist/src/integrations/linear/client.js.map +1 -1
- package/dist/src/integrations/linear/sync-manager.d.ts +2 -0
- package/dist/src/integrations/linear/sync-manager.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync-manager.js +16 -4
- package/dist/src/integrations/linear/sync-manager.js.map +1 -1
- package/dist/src/integrations/linear/sync-service.d.ts +23 -2
- package/dist/src/integrations/linear/sync-service.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync-service.js +44 -25
- package/dist/src/integrations/linear/sync-service.js.map +1 -1
- package/dist/src/integrations/linear/sync.d.ts +6 -0
- package/dist/src/integrations/linear/sync.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync.js +27 -2
- package/dist/src/integrations/linear/sync.js.map +1 -1
- package/dist/src/integrations/linear/types.d.ts +16 -1
- package/dist/src/integrations/linear/types.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook-server.js +10 -8
- package/dist/src/integrations/linear/webhook-server.js.map +1 -1
- package/dist/src/integrations/linear/webhook.d.ts +13 -0
- package/dist/src/integrations/linear/webhook.d.ts.map +1 -1
- package/dist/src/integrations/linear/webhook.js +101 -14
- package/dist/src/integrations/linear/webhook.js.map +1 -1
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts +39 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js +266 -0
- package/dist/src/integrations/mcp/handlers/context-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/index.d.ts +37 -0
- package/dist/src/integrations/mcp/handlers/index.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/index.js +134 -0
- package/dist/src/integrations/mcp/handlers/index.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts +33 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js +251 -0
- package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts +42 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js +238 -0
- package/dist/src/integrations/mcp/handlers/task-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts +41 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.d.ts.map +1 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js +298 -0
- package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +1 -0
- package/dist/src/integrations/mcp/index.d.ts +13 -0
- package/dist/src/integrations/mcp/index.d.ts.map +1 -0
- package/dist/src/integrations/mcp/index.js +17 -0
- package/dist/src/integrations/mcp/index.js.map +1 -0
- package/dist/src/integrations/mcp/refactored-server.d.ts +76 -0
- package/dist/src/integrations/mcp/refactored-server.d.ts.map +1 -0
- package/dist/src/integrations/mcp/refactored-server.js +351 -0
- package/dist/src/integrations/mcp/refactored-server.js.map +1 -0
- package/dist/src/integrations/mcp/tool-definitions.d.ts +44 -0
- package/dist/src/integrations/mcp/tool-definitions.d.ts.map +1 -0
- package/dist/src/integrations/mcp/tool-definitions.js +563 -0
- package/dist/src/integrations/mcp/tool-definitions.js.map +1 -0
- package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -1
- package/dist/src/integrations/pg-aiguide/semantic-search.js +43 -21
- package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -1
- package/dist/src/mcp/stackmemory-mcp-server.d.ts +9 -0
- package/dist/src/mcp/stackmemory-mcp-server.d.ts.map +1 -0
- package/dist/src/mcp/stackmemory-mcp-server.js +519 -0
- package/dist/src/mcp/stackmemory-mcp-server.js.map +1 -0
- package/dist/src/middleware/exponential-rate-limiter.d.ts +78 -0
- package/dist/src/middleware/exponential-rate-limiter.d.ts.map +1 -0
- package/dist/src/middleware/exponential-rate-limiter.js +293 -0
- package/dist/src/middleware/exponential-rate-limiter.js.map +1 -0
- package/dist/src/models/user.model.d.ts +8 -1
- package/dist/src/models/user.model.d.ts.map +1 -1
- package/dist/src/models/user.model.js +62 -14
- package/dist/src/models/user.model.js.map +1 -1
- package/dist/src/servers/production/auth-middleware.d.ts +5 -2
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
- package/dist/src/servers/production/auth-middleware.js +71 -34
- package/dist/src/servers/production/auth-middleware.js.map +1 -1
- package/dist/src/services/context-service.d.ts.map +1 -1
- package/dist/src/services/context-service.js +86 -1
- package/dist/src/services/context-service.js.map +1 -1
- package/dist/src/validation/schemas.d.ts +633 -0
- package/dist/src/validation/schemas.d.ts.map +1 -0
- package/dist/src/validation/schemas.js +347 -0
- package/dist/src/validation/schemas.js.map +1 -0
- package/dist/types/task.js +1 -0
- package/dist/types/task.js.map +7 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +7 -0
- package/dist/validation/schemas.js +218 -0
- package/dist/validation/schemas.js.map +7 -0
- package/package.json +7 -3
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { logger } from "../monitoring/logger.js";
|
|
2
|
+
class LRUQueryCache {
|
|
3
|
+
cache = /* @__PURE__ */ new Map();
|
|
4
|
+
maxSize;
|
|
5
|
+
ttlMs;
|
|
6
|
+
enableMetrics;
|
|
7
|
+
// Metrics
|
|
8
|
+
metrics = {
|
|
9
|
+
hits: 0,
|
|
10
|
+
misses: 0,
|
|
11
|
+
evictions: 0,
|
|
12
|
+
totalQueries: 0
|
|
13
|
+
};
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.maxSize = options.maxSize ?? 1e3;
|
|
16
|
+
this.ttlMs = options.ttlMs ?? 3e5;
|
|
17
|
+
this.enableMetrics = options.enableMetrics ?? true;
|
|
18
|
+
logger.info("Query cache initialized", {
|
|
19
|
+
maxSize: this.maxSize,
|
|
20
|
+
ttlMs: this.ttlMs,
|
|
21
|
+
enableMetrics: this.enableMetrics
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get a value from cache
|
|
26
|
+
*/
|
|
27
|
+
get(key) {
|
|
28
|
+
if (this.enableMetrics) {
|
|
29
|
+
this.metrics.totalQueries++;
|
|
30
|
+
}
|
|
31
|
+
const entry = this.cache.get(key);
|
|
32
|
+
if (!entry) {
|
|
33
|
+
if (this.enableMetrics) {
|
|
34
|
+
this.metrics.misses++;
|
|
35
|
+
}
|
|
36
|
+
return void 0;
|
|
37
|
+
}
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
if (now - entry.createdAt > this.ttlMs) {
|
|
40
|
+
this.cache.delete(key);
|
|
41
|
+
if (this.enableMetrics) {
|
|
42
|
+
this.metrics.misses++;
|
|
43
|
+
this.metrics.evictions++;
|
|
44
|
+
}
|
|
45
|
+
logger.debug("Cache entry expired", { key, age: now - entry.createdAt });
|
|
46
|
+
return void 0;
|
|
47
|
+
}
|
|
48
|
+
entry.accessCount++;
|
|
49
|
+
entry.lastAccessed = now;
|
|
50
|
+
this.cache.delete(key);
|
|
51
|
+
this.cache.set(key, entry);
|
|
52
|
+
if (this.enableMetrics) {
|
|
53
|
+
this.metrics.hits++;
|
|
54
|
+
}
|
|
55
|
+
logger.debug("Cache hit", { key, accessCount: entry.accessCount });
|
|
56
|
+
return entry.value;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Set a value in cache
|
|
60
|
+
*/
|
|
61
|
+
set(key, value) {
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
if (this.cache.has(key)) {
|
|
64
|
+
this.cache.delete(key);
|
|
65
|
+
}
|
|
66
|
+
while (this.cache.size >= this.maxSize) {
|
|
67
|
+
const firstKey = this.cache.keys().next().value;
|
|
68
|
+
if (firstKey !== void 0) {
|
|
69
|
+
this.cache.delete(firstKey);
|
|
70
|
+
if (this.enableMetrics) {
|
|
71
|
+
this.metrics.evictions++;
|
|
72
|
+
}
|
|
73
|
+
logger.debug("Evicted LRU entry", { key: firstKey });
|
|
74
|
+
} else {
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const entry = {
|
|
79
|
+
value,
|
|
80
|
+
createdAt: now,
|
|
81
|
+
accessCount: 0,
|
|
82
|
+
lastAccessed: now
|
|
83
|
+
};
|
|
84
|
+
this.cache.set(key, entry);
|
|
85
|
+
logger.debug("Cache set", { key, size: this.cache.size });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Delete a specific key
|
|
89
|
+
*/
|
|
90
|
+
delete(key) {
|
|
91
|
+
const deleted = this.cache.delete(key);
|
|
92
|
+
if (deleted) {
|
|
93
|
+
logger.debug("Cache delete", { key });
|
|
94
|
+
}
|
|
95
|
+
return deleted;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Clear all cached entries
|
|
99
|
+
*/
|
|
100
|
+
clear() {
|
|
101
|
+
const size = this.cache.size;
|
|
102
|
+
this.cache.clear();
|
|
103
|
+
logger.info("Cache cleared", { previousSize: size });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Invalidate entries matching a pattern
|
|
107
|
+
*/
|
|
108
|
+
invalidatePattern(pattern) {
|
|
109
|
+
let count = 0;
|
|
110
|
+
for (const key of this.cache.keys()) {
|
|
111
|
+
if (pattern.test(key)) {
|
|
112
|
+
this.cache.delete(key);
|
|
113
|
+
count++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
logger.info("Pattern invalidation", { pattern: pattern.source, invalidated: count });
|
|
117
|
+
return count;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get cache metrics
|
|
121
|
+
*/
|
|
122
|
+
getMetrics() {
|
|
123
|
+
return {
|
|
124
|
+
...this.metrics,
|
|
125
|
+
hitRate: this.metrics.totalQueries > 0 ? this.metrics.hits / this.metrics.totalQueries : 0,
|
|
126
|
+
size: this.cache.size,
|
|
127
|
+
maxSize: this.maxSize
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get cache contents for debugging
|
|
132
|
+
*/
|
|
133
|
+
debug() {
|
|
134
|
+
return Array.from(this.cache.entries()).map(([key, entry]) => ({ key, entry }));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Cleanup expired entries
|
|
138
|
+
*/
|
|
139
|
+
cleanup() {
|
|
140
|
+
const now = Date.now();
|
|
141
|
+
let removed = 0;
|
|
142
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
143
|
+
if (now - entry.createdAt > this.ttlMs) {
|
|
144
|
+
this.cache.delete(key);
|
|
145
|
+
removed++;
|
|
146
|
+
if (this.enableMetrics) {
|
|
147
|
+
this.metrics.evictions++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (removed > 0) {
|
|
152
|
+
logger.info("Cache cleanup completed", { removed, remaining: this.cache.size });
|
|
153
|
+
}
|
|
154
|
+
return removed;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
class StackMemoryQueryCache {
|
|
158
|
+
frameCache = new LRUQueryCache({ maxSize: 500, ttlMs: 3e5 });
|
|
159
|
+
// 5 min
|
|
160
|
+
eventCache = new LRUQueryCache({ maxSize: 1e3, ttlMs: 18e4 });
|
|
161
|
+
// 3 min
|
|
162
|
+
anchorCache = new LRUQueryCache({ maxSize: 200, ttlMs: 6e5 });
|
|
163
|
+
// 10 min
|
|
164
|
+
digestCache = new LRUQueryCache({ maxSize: 100, ttlMs: 9e5 });
|
|
165
|
+
// 15 min
|
|
166
|
+
/**
|
|
167
|
+
* Cache frame data
|
|
168
|
+
*/
|
|
169
|
+
cacheFrame(frameId, data) {
|
|
170
|
+
this.frameCache.set(`frame:${frameId}`, data);
|
|
171
|
+
}
|
|
172
|
+
getFrame(frameId) {
|
|
173
|
+
return this.frameCache.get(`frame:${frameId}`);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Cache frame context assemblies (expensive operations)
|
|
177
|
+
*/
|
|
178
|
+
cacheFrameContext(frameId, context) {
|
|
179
|
+
this.frameCache.set(`context:${frameId}`, context);
|
|
180
|
+
}
|
|
181
|
+
getFrameContext(frameId) {
|
|
182
|
+
return this.frameCache.get(`context:${frameId}`);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Cache events for a frame
|
|
186
|
+
*/
|
|
187
|
+
cacheFrameEvents(frameId, events) {
|
|
188
|
+
this.eventCache.set(`events:${frameId}`, events);
|
|
189
|
+
}
|
|
190
|
+
getFrameEvents(frameId) {
|
|
191
|
+
return this.eventCache.get(`events:${frameId}`);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Cache anchors
|
|
195
|
+
*/
|
|
196
|
+
cacheAnchors(frameId, anchors) {
|
|
197
|
+
this.anchorCache.set(`anchors:${frameId}`, anchors);
|
|
198
|
+
}
|
|
199
|
+
getAnchors(frameId) {
|
|
200
|
+
return this.anchorCache.get(`anchors:${frameId}`);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Cache digest data
|
|
204
|
+
*/
|
|
205
|
+
cacheDigest(frameId, digest) {
|
|
206
|
+
this.digestCache.set(`digest:${frameId}`, digest);
|
|
207
|
+
}
|
|
208
|
+
getDigest(frameId) {
|
|
209
|
+
return this.digestCache.get(`digest:${frameId}`);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Invalidate caches for a specific frame
|
|
213
|
+
*/
|
|
214
|
+
invalidateFrame(frameId) {
|
|
215
|
+
this.frameCache.delete(`frame:${frameId}`);
|
|
216
|
+
this.frameCache.delete(`context:${frameId}`);
|
|
217
|
+
this.eventCache.delete(`events:${frameId}`);
|
|
218
|
+
this.anchorCache.delete(`anchors:${frameId}`);
|
|
219
|
+
this.digestCache.delete(`digest:${frameId}`);
|
|
220
|
+
logger.info("Invalidated frame caches", { frameId });
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Invalidate all caches for a project
|
|
224
|
+
*/
|
|
225
|
+
invalidateProject(projectId) {
|
|
226
|
+
const pattern = new RegExp(`^(frame|context|events|anchors|digest):.+`);
|
|
227
|
+
let total = 0;
|
|
228
|
+
total += this.frameCache.invalidatePattern(pattern);
|
|
229
|
+
total += this.eventCache.invalidatePattern(pattern);
|
|
230
|
+
total += this.anchorCache.invalidatePattern(pattern);
|
|
231
|
+
total += this.digestCache.invalidatePattern(pattern);
|
|
232
|
+
logger.info("Invalidated project caches", { projectId, totalInvalidated: total });
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get comprehensive cache metrics
|
|
236
|
+
*/
|
|
237
|
+
getMetrics() {
|
|
238
|
+
return {
|
|
239
|
+
frame: this.frameCache.getMetrics(),
|
|
240
|
+
event: this.eventCache.getMetrics(),
|
|
241
|
+
anchor: this.anchorCache.getMetrics(),
|
|
242
|
+
digest: this.digestCache.getMetrics()
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Cleanup all caches
|
|
247
|
+
*/
|
|
248
|
+
cleanup() {
|
|
249
|
+
this.frameCache.cleanup();
|
|
250
|
+
this.eventCache.cleanup();
|
|
251
|
+
this.anchorCache.cleanup();
|
|
252
|
+
this.digestCache.cleanup();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Clear all caches
|
|
256
|
+
*/
|
|
257
|
+
clear() {
|
|
258
|
+
this.frameCache.clear();
|
|
259
|
+
this.eventCache.clear();
|
|
260
|
+
this.anchorCache.clear();
|
|
261
|
+
this.digestCache.clear();
|
|
262
|
+
logger.info("All StackMemory caches cleared");
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
let globalCache = null;
|
|
266
|
+
function getQueryCache() {
|
|
267
|
+
if (!globalCache) {
|
|
268
|
+
globalCache = new StackMemoryQueryCache();
|
|
269
|
+
}
|
|
270
|
+
return globalCache;
|
|
271
|
+
}
|
|
272
|
+
function createCacheKey(queryName, params) {
|
|
273
|
+
const paramsStr = params.map(
|
|
274
|
+
(p) => typeof p === "object" ? JSON.stringify(p) : String(p)
|
|
275
|
+
).join(":");
|
|
276
|
+
return `${queryName}:${paramsStr}`;
|
|
277
|
+
}
|
|
278
|
+
export {
|
|
279
|
+
LRUQueryCache,
|
|
280
|
+
StackMemoryQueryCache,
|
|
281
|
+
createCacheKey,
|
|
282
|
+
getQueryCache
|
|
283
|
+
};
|
|
284
|
+
//# sourceMappingURL=query-cache.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/database/query-cache.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Query Result Cache\n * LRU cache for frequently accessed database query results\n */\n\nimport { logger } from '../monitoring/logger.js';\n\nexport interface CacheOptions {\n maxSize?: number;\n ttlMs?: number;\n enableMetrics?: boolean;\n}\n\nexport interface CacheEntry<T> {\n value: T;\n createdAt: number;\n accessCount: number;\n lastAccessed: number;\n}\n\nexport interface CacheMetrics {\n hits: number;\n misses: number;\n evictions: number;\n totalQueries: number;\n hitRate: number;\n size: number;\n maxSize: number;\n}\n\nexport class LRUQueryCache<T = any> {\n private cache = new Map<string, CacheEntry<T>>();\n private maxSize: number;\n private ttlMs: number;\n private enableMetrics: boolean;\n \n // Metrics\n private metrics: Omit<CacheMetrics, 'hitRate' | 'size' | 'maxSize'> = {\n hits: 0,\n misses: 0,\n evictions: 0,\n totalQueries: 0,\n };\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 1000;\n this.ttlMs = options.ttlMs ?? 300000; // 5 minutes default\n this.enableMetrics = options.enableMetrics ?? true;\n\n logger.info('Query cache initialized', {\n maxSize: this.maxSize,\n ttlMs: this.ttlMs,\n enableMetrics: this.enableMetrics,\n });\n }\n\n /**\n * Get a value from cache\n */\n get(key: string): T | undefined {\n if (this.enableMetrics) {\n this.metrics.totalQueries++;\n }\n\n const entry = this.cache.get(key);\n \n if (!entry) {\n if (this.enableMetrics) {\n this.metrics.misses++;\n }\n return undefined;\n }\n\n // Check TTL\n const now = Date.now();\n if (now - entry.createdAt > this.ttlMs) {\n this.cache.delete(key);\n if (this.enableMetrics) {\n this.metrics.misses++;\n this.metrics.evictions++;\n }\n logger.debug('Cache entry expired', { key, age: now - entry.createdAt });\n return undefined;\n }\n\n // Update access stats and move to end (most recently used)\n entry.accessCount++;\n entry.lastAccessed = now;\n this.cache.delete(key);\n this.cache.set(key, entry);\n\n if (this.enableMetrics) {\n this.metrics.hits++;\n }\n\n logger.debug('Cache hit', { key, accessCount: entry.accessCount });\n return entry.value;\n }\n\n /**\n * Set a value in cache\n */\n set(key: string, value: T): void {\n const now = Date.now();\n \n // Remove existing entry if present\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n \n // Evict least recently used entries if at capacity\n while (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n if (this.enableMetrics) {\n this.metrics.evictions++;\n }\n logger.debug('Evicted LRU entry', { key: firstKey });\n } else {\n break;\n }\n }\n\n // Add new entry\n const entry: CacheEntry<T> = {\n value,\n createdAt: now,\n accessCount: 0,\n lastAccessed: now,\n };\n\n this.cache.set(key, entry);\n logger.debug('Cache set', { key, size: this.cache.size });\n }\n\n /**\n * Delete a specific key\n */\n delete(key: string): boolean {\n const deleted = this.cache.delete(key);\n if (deleted) {\n logger.debug('Cache delete', { key });\n }\n return deleted;\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n const size = this.cache.size;\n this.cache.clear();\n logger.info('Cache cleared', { previousSize: size });\n }\n\n /**\n * Invalidate entries matching a pattern\n */\n invalidatePattern(pattern: RegExp): number {\n let count = 0;\n for (const key of this.cache.keys()) {\n if (pattern.test(key)) {\n this.cache.delete(key);\n count++;\n }\n }\n logger.info('Pattern invalidation', { pattern: pattern.source, invalidated: count });\n return count;\n }\n\n /**\n * Get cache metrics\n */\n getMetrics(): CacheMetrics {\n return {\n ...this.metrics,\n hitRate: this.metrics.totalQueries > 0 \n ? this.metrics.hits / this.metrics.totalQueries \n : 0,\n size: this.cache.size,\n maxSize: this.maxSize,\n };\n }\n\n /**\n * Get cache contents for debugging\n */\n debug(): Array<{ key: string; entry: CacheEntry<T> }> {\n return Array.from(this.cache.entries()).map(([key, entry]) => ({ key, entry }));\n }\n\n /**\n * Cleanup expired entries\n */\n cleanup(): number {\n const now = Date.now();\n let removed = 0;\n\n for (const [key, entry] of this.cache.entries()) {\n if (now - entry.createdAt > this.ttlMs) {\n this.cache.delete(key);\n removed++;\n if (this.enableMetrics) {\n this.metrics.evictions++;\n }\n }\n }\n\n if (removed > 0) {\n logger.info('Cache cleanup completed', { removed, remaining: this.cache.size });\n }\n\n return removed;\n }\n}\n\n/**\n * Query cache specifically designed for StackMemory operations\n */\nexport class StackMemoryQueryCache {\n private frameCache = new LRUQueryCache<any>({ maxSize: 500, ttlMs: 300000 }); // 5 min\n private eventCache = new LRUQueryCache<any>({ maxSize: 1000, ttlMs: 180000 }); // 3 min \n private anchorCache = new LRUQueryCache<any>({ maxSize: 200, ttlMs: 600000 }); // 10 min\n private digestCache = new LRUQueryCache<any>({ maxSize: 100, ttlMs: 900000 }); // 15 min\n\n /**\n * Cache frame data\n */\n cacheFrame(frameId: string, data: any): void {\n this.frameCache.set(`frame:${frameId}`, data);\n }\n\n getFrame(frameId: string): any {\n return this.frameCache.get(`frame:${frameId}`);\n }\n\n /**\n * Cache frame context assemblies (expensive operations)\n */\n cacheFrameContext(frameId: string, context: any): void {\n this.frameCache.set(`context:${frameId}`, context);\n }\n\n getFrameContext(frameId: string): any {\n return this.frameCache.get(`context:${frameId}`);\n }\n\n /**\n * Cache events for a frame\n */\n cacheFrameEvents(frameId: string, events: any[]): void {\n this.eventCache.set(`events:${frameId}`, events);\n }\n\n getFrameEvents(frameId: string): any[] {\n return this.eventCache.get(`events:${frameId}`);\n }\n\n /**\n * Cache anchors\n */\n cacheAnchors(frameId: string, anchors: any[]): void {\n this.anchorCache.set(`anchors:${frameId}`, anchors);\n }\n\n getAnchors(frameId: string): any[] {\n return this.anchorCache.get(`anchors:${frameId}`);\n }\n\n /**\n * Cache digest data\n */\n cacheDigest(frameId: string, digest: any): void {\n this.digestCache.set(`digest:${frameId}`, digest);\n }\n\n getDigest(frameId: string): any {\n return this.digestCache.get(`digest:${frameId}`);\n }\n\n /**\n * Invalidate caches for a specific frame\n */\n invalidateFrame(frameId: string): void {\n this.frameCache.delete(`frame:${frameId}`);\n this.frameCache.delete(`context:${frameId}`);\n this.eventCache.delete(`events:${frameId}`);\n this.anchorCache.delete(`anchors:${frameId}`);\n this.digestCache.delete(`digest:${frameId}`);\n \n logger.info('Invalidated frame caches', { frameId });\n }\n\n /**\n * Invalidate all caches for a project \n */\n invalidateProject(projectId: string): void {\n const pattern = new RegExp(`^(frame|context|events|anchors|digest):.+`);\n \n let total = 0;\n total += this.frameCache.invalidatePattern(pattern);\n total += this.eventCache.invalidatePattern(pattern);\n total += this.anchorCache.invalidatePattern(pattern);\n total += this.digestCache.invalidatePattern(pattern);\n \n logger.info('Invalidated project caches', { projectId, totalInvalidated: total });\n }\n\n /**\n * Get comprehensive cache metrics\n */\n getMetrics() {\n return {\n frame: this.frameCache.getMetrics(),\n event: this.eventCache.getMetrics(),\n anchor: this.anchorCache.getMetrics(),\n digest: this.digestCache.getMetrics(),\n };\n }\n\n /**\n * Cleanup all caches\n */\n cleanup(): void {\n this.frameCache.cleanup();\n this.eventCache.cleanup();\n this.anchorCache.cleanup();\n this.digestCache.cleanup();\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this.frameCache.clear();\n this.eventCache.clear();\n this.anchorCache.clear();\n this.digestCache.clear();\n \n logger.info('All StackMemory caches cleared');\n }\n}\n\n// Global cache instance\nlet globalCache: StackMemoryQueryCache | null = null;\n\n/**\n * Get or create global query cache\n */\nexport function getQueryCache(): StackMemoryQueryCache {\n if (!globalCache) {\n globalCache = new StackMemoryQueryCache();\n }\n return globalCache;\n}\n\n/**\n * Create a cache key from query parameters\n */\nexport function createCacheKey(queryName: string, params: any[]): string {\n const paramsStr = params.map(p => \n typeof p === 'object' ? JSON.stringify(p) : String(p)\n ).join(':');\n \n return `${queryName}:${paramsStr}`;\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi, afterEach } from "vitest";
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
import {
|
|
4
|
+
EnhancedHybridDigestGenerator
|
|
5
|
+
} from "../enhanced-hybrid-digest";
|
|
6
|
+
describe("EnhancedHybridDigestGenerator", () => {
|
|
7
|
+
let db;
|
|
8
|
+
let generator;
|
|
9
|
+
let mockLLMProvider;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
db = new Database(":memory:");
|
|
12
|
+
mockLLMProvider = {
|
|
13
|
+
generateSummary: vi.fn().mockResolvedValue({
|
|
14
|
+
summary: "Test summary",
|
|
15
|
+
insight: "Test insight",
|
|
16
|
+
flaggedIssue: "Test issue",
|
|
17
|
+
generatedAt: Date.now(),
|
|
18
|
+
modelUsed: "test-model",
|
|
19
|
+
tokensUsed: 150
|
|
20
|
+
})
|
|
21
|
+
};
|
|
22
|
+
generator = new EnhancedHybridDigestGenerator(
|
|
23
|
+
db,
|
|
24
|
+
{ enableAIGeneration: true, maxTokens: 200 },
|
|
25
|
+
mockLLMProvider,
|
|
26
|
+
{ checkInterval: 100 }
|
|
27
|
+
// Fast interval for testing
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
generator.shutdown();
|
|
32
|
+
db.close();
|
|
33
|
+
});
|
|
34
|
+
describe("Idle Detection", () => {
|
|
35
|
+
it("should detect idle state after no tool calls", async () => {
|
|
36
|
+
let status = generator.getIdleStatus();
|
|
37
|
+
expect(status.isIdle).toBe(false);
|
|
38
|
+
generator.recordToolCall();
|
|
39
|
+
status = generator.getIdleStatus();
|
|
40
|
+
expect(status.isIdle).toBe(false);
|
|
41
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
42
|
+
status = generator.getIdleStatus();
|
|
43
|
+
expect(status.timeSinceLastToolCall).toBeGreaterThan(0);
|
|
44
|
+
});
|
|
45
|
+
it("should track user input activity", () => {
|
|
46
|
+
generator.recordUserInput();
|
|
47
|
+
const status = generator.getIdleStatus();
|
|
48
|
+
expect(status.timeSinceLastInput).toBeLessThan(100);
|
|
49
|
+
});
|
|
50
|
+
it("should track active frames", () => {
|
|
51
|
+
generator.onFrameOpened("frame-1");
|
|
52
|
+
generator.onFrameOpened("frame-2");
|
|
53
|
+
let status = generator.getIdleStatus();
|
|
54
|
+
expect(status.activeFrames).toBe(2);
|
|
55
|
+
generator.onFrameClosed("frame-1");
|
|
56
|
+
status = generator.getIdleStatus();
|
|
57
|
+
expect(status.activeFrames).toBe(1);
|
|
58
|
+
});
|
|
59
|
+
it("should handle interruption gracefully", () => {
|
|
60
|
+
generator.handleInterruption();
|
|
61
|
+
const status = generator.getIdleStatus();
|
|
62
|
+
expect(status.isIdle).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("Digest Generation", () => {
|
|
66
|
+
const mockFrame = {
|
|
67
|
+
frame_id: "test-frame-1",
|
|
68
|
+
name: "Test Frame",
|
|
69
|
+
type: "task",
|
|
70
|
+
state: "active",
|
|
71
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
72
|
+
closed_at: null,
|
|
73
|
+
inputs: {},
|
|
74
|
+
outputs: {},
|
|
75
|
+
digest_text: "",
|
|
76
|
+
digest_json: {},
|
|
77
|
+
metadata: {}
|
|
78
|
+
};
|
|
79
|
+
const mockEvents = [
|
|
80
|
+
{
|
|
81
|
+
event_id: "evt-1",
|
|
82
|
+
frame_id: "test-frame-1",
|
|
83
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
84
|
+
event_type: "tool_call",
|
|
85
|
+
payload: {
|
|
86
|
+
tool_name: "write_file",
|
|
87
|
+
file_path: "/src/test.ts"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
event_id: "evt-2",
|
|
92
|
+
frame_id: "test-frame-1",
|
|
93
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
94
|
+
event_type: "tool_result",
|
|
95
|
+
payload: {
|
|
96
|
+
success: true,
|
|
97
|
+
output: "10 tests passed"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
];
|
|
101
|
+
const mockAnchors = [
|
|
102
|
+
{
|
|
103
|
+
anchor_id: "anc-1",
|
|
104
|
+
frame_id: "test-frame-1",
|
|
105
|
+
type: "DECISION",
|
|
106
|
+
text: "Use TypeScript for type safety",
|
|
107
|
+
metadata: {},
|
|
108
|
+
created_at: Math.floor(Date.now() / 1e3)
|
|
109
|
+
}
|
|
110
|
+
];
|
|
111
|
+
const mockInput = {
|
|
112
|
+
frame: mockFrame,
|
|
113
|
+
events: mockEvents,
|
|
114
|
+
anchors: mockAnchors
|
|
115
|
+
};
|
|
116
|
+
it("should generate deterministic digest immediately", () => {
|
|
117
|
+
const digest = generator.generateDigest(mockInput);
|
|
118
|
+
expect(digest).toBeDefined();
|
|
119
|
+
expect(digest.frameId).toBe("test-frame-1");
|
|
120
|
+
expect(digest.frameName).toBe("Test Frame");
|
|
121
|
+
expect(digest.deterministic).toBeDefined();
|
|
122
|
+
expect(digest.status).toBe("ai_pending");
|
|
123
|
+
});
|
|
124
|
+
it("should extract files modified correctly", () => {
|
|
125
|
+
const digest = generator.generateDigest(mockInput);
|
|
126
|
+
expect(digest.deterministic.filesModified).toHaveLength(1);
|
|
127
|
+
expect(digest.deterministic.filesModified[0]).toEqual({
|
|
128
|
+
path: "/src/test.ts",
|
|
129
|
+
operation: "modify",
|
|
130
|
+
linesChanged: void 0
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
it("should extract test results", () => {
|
|
134
|
+
const digest = generator.generateDigest(mockInput);
|
|
135
|
+
expect(digest.deterministic.testsRun).toHaveLength(1);
|
|
136
|
+
expect(digest.deterministic.testsRun[0]).toEqual({
|
|
137
|
+
name: "10 tests",
|
|
138
|
+
status: "passed",
|
|
139
|
+
duration: void 0
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
it("should extract decisions from anchors", () => {
|
|
143
|
+
const digest = generator.generateDigest(mockInput);
|
|
144
|
+
expect(digest.deterministic.decisions).toContain(
|
|
145
|
+
"Use TypeScript for type safety"
|
|
146
|
+
);
|
|
147
|
+
});
|
|
148
|
+
it("should generate text summary", () => {
|
|
149
|
+
const digest = generator.generateDigest(mockInput);
|
|
150
|
+
expect(digest.text).toBeDefined();
|
|
151
|
+
expect(digest.text).toContain("Test Frame");
|
|
152
|
+
expect(digest.text).toContain("Status: success");
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe("AI Generation Queue", () => {
|
|
156
|
+
it("should queue frames for AI generation", async () => {
|
|
157
|
+
const mockInput = {
|
|
158
|
+
frame: {
|
|
159
|
+
frame_id: "test-ai-1",
|
|
160
|
+
name: "AI Test Frame",
|
|
161
|
+
type: "feature",
|
|
162
|
+
state: "closed",
|
|
163
|
+
// Frame should be closed for AI generation
|
|
164
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
165
|
+
closed_at: Math.floor(Date.now() / 1e3) + 100,
|
|
166
|
+
inputs: {},
|
|
167
|
+
outputs: {},
|
|
168
|
+
digest_text: "",
|
|
169
|
+
digest_json: {},
|
|
170
|
+
metadata: {}
|
|
171
|
+
},
|
|
172
|
+
events: [],
|
|
173
|
+
anchors: []
|
|
174
|
+
};
|
|
175
|
+
const digest = generator.generateDigest(mockInput);
|
|
176
|
+
expect(digest.status).toBe("ai_pending");
|
|
177
|
+
await generator.forceProcessQueue();
|
|
178
|
+
const wasCalled = mockLLMProvider.generateSummary.mock.calls.length > 0;
|
|
179
|
+
if (!wasCalled) {
|
|
180
|
+
expect(digest.status).toBe("ai_pending");
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
it("should prioritize frame on close", () => {
|
|
184
|
+
generator.onFrameOpened("frame-close-test");
|
|
185
|
+
generator.onFrameClosed("frame-close-test");
|
|
186
|
+
const status = generator.getIdleStatus();
|
|
187
|
+
expect(status.activeFrames).toBe(0);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe("Pattern Detection", () => {
|
|
191
|
+
it("should detect test-driven development pattern", () => {
|
|
192
|
+
const input = {
|
|
193
|
+
frame: {
|
|
194
|
+
frame_id: "tdd-frame",
|
|
195
|
+
name: "TDD Frame",
|
|
196
|
+
type: "feature",
|
|
197
|
+
state: "closed",
|
|
198
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
199
|
+
closed_at: Math.floor(Date.now() / 1e3) + 300,
|
|
200
|
+
inputs: {},
|
|
201
|
+
outputs: {},
|
|
202
|
+
digest_text: "",
|
|
203
|
+
digest_json: {},
|
|
204
|
+
metadata: {}
|
|
205
|
+
},
|
|
206
|
+
events: [
|
|
207
|
+
{
|
|
208
|
+
event_id: "evt-test",
|
|
209
|
+
frame_id: "tdd-frame",
|
|
210
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
211
|
+
event_type: "tool_call",
|
|
212
|
+
payload: {
|
|
213
|
+
tool_name: "run_test",
|
|
214
|
+
command: "npm test",
|
|
215
|
+
output: "5 tests passed"
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
event_id: "evt-code",
|
|
220
|
+
frame_id: "tdd-frame",
|
|
221
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
222
|
+
event_type: "tool_call",
|
|
223
|
+
payload: {
|
|
224
|
+
tool_name: "edit_file",
|
|
225
|
+
file_path: "/src/feature.ts"
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
],
|
|
229
|
+
anchors: []
|
|
230
|
+
};
|
|
231
|
+
const digest = generator.generateDigest(input);
|
|
232
|
+
expect(digest.deterministic.testsRun.length).toBeGreaterThan(0);
|
|
233
|
+
expect(digest.deterministic.filesModified).toHaveLength(1);
|
|
234
|
+
});
|
|
235
|
+
it("should identify technical debt", () => {
|
|
236
|
+
const input = {
|
|
237
|
+
frame: {
|
|
238
|
+
frame_id: "debt-frame",
|
|
239
|
+
name: "Tech Debt Frame",
|
|
240
|
+
type: "feature",
|
|
241
|
+
state: "closed",
|
|
242
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
243
|
+
closed_at: Math.floor(Date.now() / 1e3) + 300,
|
|
244
|
+
inputs: {},
|
|
245
|
+
outputs: {},
|
|
246
|
+
digest_text: "",
|
|
247
|
+
digest_json: {},
|
|
248
|
+
metadata: {}
|
|
249
|
+
},
|
|
250
|
+
events: [
|
|
251
|
+
{
|
|
252
|
+
event_id: "evt-1",
|
|
253
|
+
frame_id: "debt-frame",
|
|
254
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
255
|
+
event_type: "tool_call",
|
|
256
|
+
payload: {
|
|
257
|
+
tool_name: "write_file",
|
|
258
|
+
file_path: "/src/file1.ts"
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
event_id: "evt-2",
|
|
263
|
+
frame_id: "debt-frame",
|
|
264
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
265
|
+
event_type: "tool_call",
|
|
266
|
+
payload: {
|
|
267
|
+
tool_name: "write_file",
|
|
268
|
+
file_path: "/src/file2.ts"
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
event_id: "evt-3",
|
|
273
|
+
frame_id: "debt-frame",
|
|
274
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
275
|
+
event_type: "tool_call",
|
|
276
|
+
payload: {
|
|
277
|
+
tool_name: "write_file",
|
|
278
|
+
file_path: "/src/file3.ts"
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
event_id: "evt-4",
|
|
283
|
+
frame_id: "debt-frame",
|
|
284
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
285
|
+
event_type: "tool_call",
|
|
286
|
+
payload: {
|
|
287
|
+
tool_name: "write_file",
|
|
288
|
+
file_path: "/src/file4.ts"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
],
|
|
292
|
+
anchors: [
|
|
293
|
+
{
|
|
294
|
+
anchor_id: "anc-todo",
|
|
295
|
+
frame_id: "debt-frame",
|
|
296
|
+
type: "DECISION",
|
|
297
|
+
text: "TODO: Refactor this later",
|
|
298
|
+
metadata: {},
|
|
299
|
+
created_at: Math.floor(Date.now() / 1e3)
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
};
|
|
303
|
+
const digest = generator.generateDigest(input);
|
|
304
|
+
expect(digest.deterministic.filesModified.length).toBeGreaterThan(3);
|
|
305
|
+
expect(digest.deterministic.testsRun).toHaveLength(0);
|
|
306
|
+
expect(
|
|
307
|
+
digest.deterministic.decisions.some(
|
|
308
|
+
(d) => d.toLowerCase().includes("todo")
|
|
309
|
+
)
|
|
310
|
+
).toBe(true);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
describe("60/40 Split Validation", () => {
|
|
314
|
+
it("should maintain 60% deterministic content", () => {
|
|
315
|
+
const input = {
|
|
316
|
+
frame: {
|
|
317
|
+
frame_id: "split-test",
|
|
318
|
+
name: "Split Test Frame",
|
|
319
|
+
type: "task",
|
|
320
|
+
state: "active",
|
|
321
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
322
|
+
closed_at: null,
|
|
323
|
+
inputs: {},
|
|
324
|
+
outputs: {},
|
|
325
|
+
digest_text: "",
|
|
326
|
+
digest_json: {},
|
|
327
|
+
metadata: {}
|
|
328
|
+
},
|
|
329
|
+
events: Array(10).fill(null).map((_, i) => ({
|
|
330
|
+
event_id: `evt-${i}`,
|
|
331
|
+
frame_id: "split-test",
|
|
332
|
+
ts: Math.floor(Date.now() / 1e3),
|
|
333
|
+
event_type: "tool_call",
|
|
334
|
+
payload: { tool_name: `tool_${i}` }
|
|
335
|
+
})),
|
|
336
|
+
anchors: Array(5).fill(null).map((_, i) => ({
|
|
337
|
+
anchor_id: `anc-${i}`,
|
|
338
|
+
frame_id: "split-test",
|
|
339
|
+
type: "DECISION",
|
|
340
|
+
text: `Decision ${i}`,
|
|
341
|
+
metadata: {},
|
|
342
|
+
created_at: Math.floor(Date.now() / 1e3)
|
|
343
|
+
}))
|
|
344
|
+
};
|
|
345
|
+
const digest = generator.generateDigest(input);
|
|
346
|
+
expect(digest.deterministic).toBeDefined();
|
|
347
|
+
expect(digest.deterministic.toolCallCount).toBe(10);
|
|
348
|
+
expect(digest.deterministic.decisions).toHaveLength(5);
|
|
349
|
+
expect(digest.aiGenerated).toBeUndefined();
|
|
350
|
+
expect(digest.status).toBe("ai_pending");
|
|
351
|
+
});
|
|
352
|
+
it("should keep AI summaries under 200 tokens", async () => {
|
|
353
|
+
const input = {
|
|
354
|
+
frame: {
|
|
355
|
+
frame_id: "token-test",
|
|
356
|
+
name: "Token Test",
|
|
357
|
+
type: "task",
|
|
358
|
+
state: "closed",
|
|
359
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
360
|
+
closed_at: Math.floor(Date.now() / 1e3) + 100,
|
|
361
|
+
inputs: {},
|
|
362
|
+
outputs: {},
|
|
363
|
+
digest_text: "",
|
|
364
|
+
digest_json: {},
|
|
365
|
+
metadata: {}
|
|
366
|
+
},
|
|
367
|
+
events: [],
|
|
368
|
+
anchors: []
|
|
369
|
+
};
|
|
370
|
+
generator.generateDigest(input);
|
|
371
|
+
await generator.forceProcessQueue();
|
|
372
|
+
const mockCalls = vi.mocked(mockLLMProvider.generateSummary).mock.calls;
|
|
373
|
+
if (mockCalls.length > 0) {
|
|
374
|
+
expect(mockCalls[0][2]).toBe(200);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
//# sourceMappingURL=enhanced-hybrid-digest.test.js.map
|