@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/digest/__tests__/enhanced-hybrid-digest.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';\nimport Database from 'better-sqlite3';\nimport {\n EnhancedHybridDigestGenerator,\n EnhancedAIDigest,\n} from '../enhanced-hybrid-digest';\nimport { DigestInput, DigestLLMProvider, Frame, Event, Anchor } from '../types';\n\ndescribe('EnhancedHybridDigestGenerator', () => {\n let db: Database.Database;\n let generator: EnhancedHybridDigestGenerator;\n let mockLLMProvider: DigestLLMProvider;\n\n beforeEach(() => {\n // Create in-memory database\n db = new Database(':memory:');\n\n // Create mock LLM provider\n mockLLMProvider = {\n generateSummary: vi.fn().mockResolvedValue({\n summary: 'Test summary',\n insight: 'Test insight',\n flaggedIssue: 'Test issue',\n generatedAt: Date.now(),\n modelUsed: 'test-model',\n tokensUsed: 150,\n }),\n };\n\n // Initialize generator\n generator = new EnhancedHybridDigestGenerator(\n db,\n { enableAIGeneration: true, maxTokens: 200 },\n mockLLMProvider,\n { checkInterval: 100 } // Fast interval for testing\n );\n });\n\n afterEach(() => {\n generator.shutdown();\n db.close();\n });\n\n describe('Idle Detection', () => {\n it('should detect idle state after no tool calls', async () => {\n // Initially not idle\n let status = generator.getIdleStatus();\n expect(status.isIdle).toBe(false);\n\n // Record activity\n generator.recordToolCall();\n\n // Still not idle immediately after\n status = generator.getIdleStatus();\n expect(status.isIdle).toBe(false);\n\n // Wait for idle threshold\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n // Check if idle detection would trigger (in real scenario with longer threshold)\n status = generator.getIdleStatus();\n expect(status.timeSinceLastToolCall).toBeGreaterThan(0);\n });\n\n it('should track user input activity', () => {\n generator.recordUserInput();\n\n const status = generator.getIdleStatus();\n expect(status.timeSinceLastInput).toBeLessThan(100);\n });\n\n it('should track active frames', () => {\n generator.onFrameOpened('frame-1');\n generator.onFrameOpened('frame-2');\n\n let status = generator.getIdleStatus();\n expect(status.activeFrames).toBe(2);\n\n generator.onFrameClosed('frame-1');\n status = generator.getIdleStatus();\n expect(status.activeFrames).toBe(1);\n });\n\n it('should handle interruption gracefully', () => {\n generator.handleInterruption();\n\n const status = generator.getIdleStatus();\n expect(status.isIdle).toBe(false);\n });\n });\n\n describe('Digest Generation', () => {\n const mockFrame: Frame = {\n frame_id: 'test-frame-1',\n name: 'Test Frame',\n type: 'task',\n state: 'active',\n created_at: Math.floor(Date.now() / 1000),\n closed_at: null,\n inputs: {},\n outputs: {},\n digest_text: '',\n digest_json: {},\n metadata: {},\n };\n\n const mockEvents: Event[] = [\n {\n event_id: 'evt-1',\n frame_id: 'test-frame-1',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: {\n tool_name: 'write_file',\n file_path: '/src/test.ts',\n },\n },\n {\n event_id: 'evt-2',\n frame_id: 'test-frame-1',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_result',\n payload: {\n success: true,\n output: '10 tests passed',\n },\n },\n ];\n\n const mockAnchors: Anchor[] = [\n {\n anchor_id: 'anc-1',\n frame_id: 'test-frame-1',\n type: 'DECISION',\n text: 'Use TypeScript for type safety',\n metadata: {},\n created_at: Math.floor(Date.now() / 1000),\n },\n ];\n\n const mockInput: DigestInput = {\n frame: mockFrame,\n events: mockEvents,\n anchors: mockAnchors,\n };\n\n it('should generate deterministic digest immediately', () => {\n const digest = generator.generateDigest(mockInput);\n\n expect(digest).toBeDefined();\n expect(digest.frameId).toBe('test-frame-1');\n expect(digest.frameName).toBe('Test Frame');\n expect(digest.deterministic).toBeDefined();\n expect(digest.status).toBe('ai_pending'); // AI generation queued\n });\n\n it('should extract files modified correctly', () => {\n const digest = generator.generateDigest(mockInput);\n\n expect(digest.deterministic.filesModified).toHaveLength(1);\n expect(digest.deterministic.filesModified[0]).toEqual({\n path: '/src/test.ts',\n operation: 'modify',\n linesChanged: undefined,\n });\n });\n\n it('should extract test results', () => {\n const digest = generator.generateDigest(mockInput);\n\n expect(digest.deterministic.testsRun).toHaveLength(1);\n expect(digest.deterministic.testsRun[0]).toEqual({\n name: '10 tests',\n status: 'passed',\n duration: undefined,\n });\n });\n\n it('should extract decisions from anchors', () => {\n const digest = generator.generateDigest(mockInput);\n\n expect(digest.deterministic.decisions).toContain(\n 'Use TypeScript for type safety'\n );\n });\n\n it('should generate text summary', () => {\n const digest = generator.generateDigest(mockInput);\n\n expect(digest.text).toBeDefined();\n expect(digest.text).toContain('Test Frame');\n expect(digest.text).toContain('Status: success');\n });\n });\n\n describe('AI Generation Queue', () => {\n it('should queue frames for AI generation', async () => {\n const mockInput: DigestInput = {\n frame: {\n frame_id: 'test-ai-1',\n name: 'AI Test Frame',\n type: 'feature',\n state: 'closed', // Frame should be closed for AI generation\n created_at: Math.floor(Date.now() / 1000),\n closed_at: Math.floor(Date.now() / 1000) + 100,\n inputs: {},\n outputs: {},\n digest_text: '',\n digest_json: {},\n metadata: {},\n },\n events: [],\n anchors: [],\n };\n\n const digest = generator.generateDigest(mockInput);\n expect(digest.status).toBe('ai_pending');\n\n // Force process queue\n await generator.forceProcessQueue();\n\n // Verify LLM provider was called if the frame was queued\n // The base class may have additional conditions for AI generation\n const wasCalled = mockLLMProvider.generateSummary.mock.calls.length > 0;\n if (!wasCalled) {\n // Verify at least that the digest was marked as pending\n expect(digest.status).toBe('ai_pending');\n }\n });\n\n it('should prioritize frame on close', () => {\n generator.onFrameOpened('frame-close-test');\n generator.onFrameClosed('frame-close-test');\n\n // In a real scenario, this would trigger immediate processing\n const status = generator.getIdleStatus();\n expect(status.activeFrames).toBe(0);\n });\n });\n\n describe('Pattern Detection', () => {\n it('should detect test-driven development pattern', () => {\n const input: DigestInput = {\n frame: {\n frame_id: 'tdd-frame',\n name: 'TDD Frame',\n type: 'feature',\n state: 'closed',\n created_at: Math.floor(Date.now() / 1000),\n closed_at: Math.floor(Date.now() / 1000) + 300,\n inputs: {},\n outputs: {},\n digest_text: '',\n digest_json: {},\n metadata: {},\n },\n events: [\n {\n event_id: 'evt-test',\n frame_id: 'tdd-frame',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: {\n tool_name: 'run_test',\n command: 'npm test',\n output: '5 tests passed',\n },\n },\n {\n event_id: 'evt-code',\n frame_id: 'tdd-frame',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: {\n tool_name: 'edit_file',\n file_path: '/src/feature.ts',\n },\n },\n ],\n anchors: [],\n };\n\n const digest = generator.generateDigest(input);\n\n // Pattern detection would be in AI processing\n // Multiple test results may be extracted from the output\n expect(digest.deterministic.testsRun.length).toBeGreaterThan(0);\n expect(digest.deterministic.filesModified).toHaveLength(1);\n });\n\n it('should identify technical debt', () => {\n const input: DigestInput = {\n frame: {\n frame_id: 'debt-frame',\n name: 'Tech Debt Frame',\n type: 'feature',\n state: 'closed',\n created_at: Math.floor(Date.now() / 1000),\n closed_at: Math.floor(Date.now() / 1000) + 300,\n inputs: {},\n outputs: {},\n digest_text: '',\n digest_json: {},\n metadata: {},\n },\n events: [\n {\n event_id: 'evt-1',\n frame_id: 'debt-frame',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: {\n tool_name: 'write_file',\n file_path: '/src/file1.ts',\n },\n },\n {\n event_id: 'evt-2',\n frame_id: 'debt-frame',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: {\n tool_name: 'write_file',\n file_path: '/src/file2.ts',\n },\n },\n {\n event_id: 'evt-3',\n frame_id: 'debt-frame',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: {\n tool_name: 'write_file',\n file_path: '/src/file3.ts',\n },\n },\n {\n event_id: 'evt-4',\n frame_id: 'debt-frame',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: {\n tool_name: 'write_file',\n file_path: '/src/file4.ts',\n },\n },\n ],\n anchors: [\n {\n anchor_id: 'anc-todo',\n frame_id: 'debt-frame',\n type: 'DECISION',\n text: 'TODO: Refactor this later',\n metadata: {},\n created_at: Math.floor(Date.now() / 1000),\n },\n ],\n };\n\n const digest = generator.generateDigest(input);\n\n // Many files modified without tests\n expect(digest.deterministic.filesModified.length).toBeGreaterThan(3);\n expect(digest.deterministic.testsRun).toHaveLength(0);\n\n // TODO in decisions\n expect(\n digest.deterministic.decisions.some((d) =>\n d.toLowerCase().includes('todo')\n )\n ).toBe(true);\n });\n });\n\n describe('60/40 Split Validation', () => {\n it('should maintain 60% deterministic content', () => {\n const input: DigestInput = {\n frame: {\n frame_id: 'split-test',\n name: 'Split Test Frame',\n type: 'task',\n state: 'active',\n created_at: Math.floor(Date.now() / 1000),\n closed_at: null,\n inputs: {},\n outputs: {},\n digest_text: '',\n digest_json: {},\n metadata: {},\n },\n events: Array(10)\n .fill(null)\n .map((_, i) => ({\n event_id: `evt-${i}`,\n frame_id: 'split-test',\n ts: Math.floor(Date.now() / 1000),\n event_type: 'tool_call',\n payload: { tool_name: `tool_${i}` },\n })),\n anchors: Array(5)\n .fill(null)\n .map((_, i) => ({\n anchor_id: `anc-${i}`,\n frame_id: 'split-test',\n type: 'DECISION',\n text: `Decision ${i}`,\n metadata: {},\n created_at: Math.floor(Date.now() / 1000),\n })),\n };\n\n const digest = generator.generateDigest(input);\n\n // Deterministic fields should be populated (60%)\n expect(digest.deterministic).toBeDefined();\n expect(digest.deterministic.toolCallCount).toBe(10);\n expect(digest.deterministic.decisions).toHaveLength(5);\n\n // AI should be pending (40%)\n expect(digest.aiGenerated).toBeUndefined();\n expect(digest.status).toBe('ai_pending');\n });\n\n it('should keep AI summaries under 200 tokens', async () => {\n const input: DigestInput = {\n frame: {\n frame_id: 'token-test',\n name: 'Token Test',\n type: 'task',\n state: 'closed',\n created_at: Math.floor(Date.now() / 1000),\n closed_at: Math.floor(Date.now() / 1000) + 100,\n inputs: {},\n outputs: {},\n digest_text: '',\n digest_json: {},\n metadata: {},\n },\n events: [],\n anchors: [],\n };\n\n generator.generateDigest(input);\n await generator.forceProcessQueue();\n\n // Verify token limit was respected if LLM was actually called\n const mockCalls = vi.mocked(mockLLMProvider.generateSummary).mock.calls;\n if (mockCalls.length > 0) {\n expect(mockCalls[0][2]).toBe(200); // maxTokens parameter\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi, afterEach } from "vitest";
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
import { FrameManager } from "../../context/frame-manager.js";
|
|
4
|
+
import {
|
|
5
|
+
enhanceFrameManagerWithDigest
|
|
6
|
+
} from "../frame-digest-integration.js";
|
|
7
|
+
describe("FrameDigestIntegration", () => {
|
|
8
|
+
let db;
|
|
9
|
+
let frameManager;
|
|
10
|
+
let integration;
|
|
11
|
+
let mockLLMProvider;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
db = new Database(":memory:");
|
|
14
|
+
frameManager = new FrameManager(db, "test-project", "test-run");
|
|
15
|
+
mockLLMProvider = {
|
|
16
|
+
generateSummary: vi.fn().mockResolvedValue({
|
|
17
|
+
summary: "Test AI summary",
|
|
18
|
+
insight: "Test insight",
|
|
19
|
+
flaggedIssue: null,
|
|
20
|
+
generatedAt: Date.now(),
|
|
21
|
+
modelUsed: "test-model",
|
|
22
|
+
tokensUsed: 100
|
|
23
|
+
})
|
|
24
|
+
};
|
|
25
|
+
integration = enhanceFrameManagerWithDigest(
|
|
26
|
+
frameManager,
|
|
27
|
+
db,
|
|
28
|
+
mockLLMProvider
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
integration.shutdown();
|
|
33
|
+
db.close();
|
|
34
|
+
});
|
|
35
|
+
describe("Frame Lifecycle Integration", () => {
|
|
36
|
+
it("should track frame creation", () => {
|
|
37
|
+
const frameId = frameManager.createFrame({
|
|
38
|
+
type: "task",
|
|
39
|
+
name: "Test Task",
|
|
40
|
+
inputs: { test: true }
|
|
41
|
+
});
|
|
42
|
+
expect(frameId).toBeDefined();
|
|
43
|
+
const status = integration.getIdleStatus();
|
|
44
|
+
expect(status.activeFrames).toBe(1);
|
|
45
|
+
});
|
|
46
|
+
it("should track tool calls for idle detection", () => {
|
|
47
|
+
const frameId = frameManager.createFrame({
|
|
48
|
+
type: "task",
|
|
49
|
+
name: "Test Task"
|
|
50
|
+
});
|
|
51
|
+
frameManager.addEvent("tool_call", {
|
|
52
|
+
tool_name: "test_tool",
|
|
53
|
+
args: {}
|
|
54
|
+
});
|
|
55
|
+
const status = integration.getIdleStatus();
|
|
56
|
+
expect(status.timeSinceLastToolCall).toBeLessThan(100);
|
|
57
|
+
});
|
|
58
|
+
it("should track user input", () => {
|
|
59
|
+
frameManager.createFrame({
|
|
60
|
+
type: "task",
|
|
61
|
+
name: "Test Task"
|
|
62
|
+
});
|
|
63
|
+
frameManager.addEvent("user_message", {
|
|
64
|
+
content: "Test message"
|
|
65
|
+
});
|
|
66
|
+
const status = integration.getIdleStatus();
|
|
67
|
+
expect(status.timeSinceLastInput).toBeLessThan(100);
|
|
68
|
+
});
|
|
69
|
+
it("should generate digest on frame close", () => {
|
|
70
|
+
const frameId = frameManager.createFrame({
|
|
71
|
+
type: "task",
|
|
72
|
+
name: "Test Task"
|
|
73
|
+
});
|
|
74
|
+
frameManager.addEvent("tool_call", {
|
|
75
|
+
tool_name: "write_file",
|
|
76
|
+
file_path: "/src/test.ts"
|
|
77
|
+
});
|
|
78
|
+
frameManager.addAnchor("DECISION", "Use TypeScript");
|
|
79
|
+
frameManager.closeFrame(frameId, { result: "success" });
|
|
80
|
+
const frame = frameManager.getFrame(frameId);
|
|
81
|
+
expect(frame).toBeDefined();
|
|
82
|
+
expect(frame?.state).toBe("closed");
|
|
83
|
+
expect(frame?.outputs).toBeDefined();
|
|
84
|
+
expect(frame?.outputs.digestText).toBeDefined();
|
|
85
|
+
});
|
|
86
|
+
it("should trigger digest processing on frame close", () => {
|
|
87
|
+
const frameId = frameManager.createFrame({
|
|
88
|
+
type: "feature",
|
|
89
|
+
name: "Feature Implementation"
|
|
90
|
+
});
|
|
91
|
+
frameManager.addEvent("tool_call", {
|
|
92
|
+
tool_name: "write_file",
|
|
93
|
+
file_path: "/src/feature.ts"
|
|
94
|
+
});
|
|
95
|
+
frameManager.addEvent("tool_result", {
|
|
96
|
+
success: true,
|
|
97
|
+
output: "File written successfully"
|
|
98
|
+
});
|
|
99
|
+
let status = integration.getIdleStatus();
|
|
100
|
+
expect(status.activeFrames).toBe(1);
|
|
101
|
+
frameManager.closeFrame(frameId);
|
|
102
|
+
status = integration.getIdleStatus();
|
|
103
|
+
expect(status.activeFrames).toBe(0);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("Idle Detection", () => {
|
|
107
|
+
it("should detect idle state after inactivity", async () => {
|
|
108
|
+
frameManager.createFrame({
|
|
109
|
+
type: "task",
|
|
110
|
+
name: "Test Task"
|
|
111
|
+
});
|
|
112
|
+
let status = integration.getIdleStatus();
|
|
113
|
+
expect(status.isIdle).toBe(false);
|
|
114
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
115
|
+
await integration.forceProcessQueue();
|
|
116
|
+
});
|
|
117
|
+
it("should handle user interruption", () => {
|
|
118
|
+
frameManager.createFrame({
|
|
119
|
+
type: "task",
|
|
120
|
+
name: "Test Task"
|
|
121
|
+
});
|
|
122
|
+
integration.handleUserInterruption();
|
|
123
|
+
const status = integration.getIdleStatus();
|
|
124
|
+
expect(status.isIdle).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe("Digest Content Generation", () => {
|
|
128
|
+
it("should generate both deterministic and AI content", async () => {
|
|
129
|
+
const frameId = frameManager.createFrame({
|
|
130
|
+
type: "feature",
|
|
131
|
+
name: "Complex Feature"
|
|
132
|
+
});
|
|
133
|
+
frameManager.addEvent("tool_call", {
|
|
134
|
+
tool_name: "write_file",
|
|
135
|
+
file_path: "/src/feature.ts"
|
|
136
|
+
});
|
|
137
|
+
frameManager.addEvent("tool_call", {
|
|
138
|
+
tool_name: "run_test",
|
|
139
|
+
command: "npm test"
|
|
140
|
+
});
|
|
141
|
+
frameManager.addEvent("tool_result", {
|
|
142
|
+
success: true,
|
|
143
|
+
output: "10 tests passed"
|
|
144
|
+
});
|
|
145
|
+
frameManager.addAnchor(
|
|
146
|
+
"DECISION",
|
|
147
|
+
"Implement using event-driven architecture"
|
|
148
|
+
);
|
|
149
|
+
frameManager.addAnchor(
|
|
150
|
+
"RISK",
|
|
151
|
+
"Performance may degrade with high event volume"
|
|
152
|
+
);
|
|
153
|
+
frameManager.closeFrame(frameId);
|
|
154
|
+
const frame = frameManager.getFrame(frameId);
|
|
155
|
+
expect(frame?.outputs.digest).toBeDefined();
|
|
156
|
+
expect(frame?.outputs.digest.deterministic).toBeDefined();
|
|
157
|
+
expect(frame?.outputs.digest.status).toBeDefined();
|
|
158
|
+
});
|
|
159
|
+
it("should calculate importance scores", () => {
|
|
160
|
+
const debugFrame = frameManager.createFrame({
|
|
161
|
+
type: "debug",
|
|
162
|
+
name: "Debug Critical Issue"
|
|
163
|
+
});
|
|
164
|
+
const toolFrame = frameManager.createFrame({
|
|
165
|
+
type: "tool_scope",
|
|
166
|
+
name: "Tool Execution"
|
|
167
|
+
});
|
|
168
|
+
frameManager.closeFrame(toolFrame);
|
|
169
|
+
frameManager.closeFrame(debugFrame);
|
|
170
|
+
const debugFrameData = frameManager.getFrame(debugFrame);
|
|
171
|
+
const toolFrameData = frameManager.getFrame(toolFrame);
|
|
172
|
+
expect(debugFrameData?.outputs.digest).toBeDefined();
|
|
173
|
+
expect(toolFrameData?.outputs.digest).toBeDefined();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe("Multiple Frames", () => {
|
|
177
|
+
it("should handle nested frames correctly", () => {
|
|
178
|
+
const parentFrame = frameManager.createFrame({
|
|
179
|
+
type: "task",
|
|
180
|
+
name: "Parent Task"
|
|
181
|
+
});
|
|
182
|
+
const childFrame = frameManager.createFrame({
|
|
183
|
+
type: "subtask",
|
|
184
|
+
name: "Child Task",
|
|
185
|
+
parentFrameId: parentFrame
|
|
186
|
+
});
|
|
187
|
+
let status = integration.getIdleStatus();
|
|
188
|
+
expect(status.activeFrames).toBe(2);
|
|
189
|
+
frameManager.closeFrame(childFrame);
|
|
190
|
+
status = integration.getIdleStatus();
|
|
191
|
+
expect(status.activeFrames).toBe(1);
|
|
192
|
+
frameManager.closeFrame(parentFrame);
|
|
193
|
+
status = integration.getIdleStatus();
|
|
194
|
+
expect(status.activeFrames).toBe(0);
|
|
195
|
+
});
|
|
196
|
+
it("should process frames independently", async () => {
|
|
197
|
+
const frame1 = frameManager.createFrame({
|
|
198
|
+
type: "task",
|
|
199
|
+
name: "Task 1"
|
|
200
|
+
});
|
|
201
|
+
frameManager.addEvent("tool_call", { tool_name: "tool1" }, frame1);
|
|
202
|
+
frameManager.closeFrame(frame1);
|
|
203
|
+
const frame2 = frameManager.createFrame({
|
|
204
|
+
type: "task",
|
|
205
|
+
name: "Task 2"
|
|
206
|
+
});
|
|
207
|
+
frameManager.addEvent("tool_call", { tool_name: "tool2" }, frame2);
|
|
208
|
+
frameManager.closeFrame(frame2);
|
|
209
|
+
const frame1Data = frameManager.getFrame(frame1);
|
|
210
|
+
const frame2Data = frameManager.getFrame(frame2);
|
|
211
|
+
expect(frame1Data?.outputs.digestText).toBeDefined();
|
|
212
|
+
expect(frame2Data?.outputs.digestText).toBeDefined();
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
describe("Queue Processing", () => {
|
|
216
|
+
it("should allow forced queue processing", async () => {
|
|
217
|
+
const frameId = frameManager.createFrame({
|
|
218
|
+
type: "feature",
|
|
219
|
+
name: "Feature for AI Processing"
|
|
220
|
+
});
|
|
221
|
+
frameManager.addEvent("tool_call", {
|
|
222
|
+
tool_name: "complex_operation"
|
|
223
|
+
});
|
|
224
|
+
frameManager.closeFrame(frameId);
|
|
225
|
+
await integration.forceProcessQueue();
|
|
226
|
+
expect(mockLLMProvider.generateSummary).toHaveBeenCalled();
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=frame-digest-integration.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/digest/__tests__/frame-digest-integration.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';\nimport Database from 'better-sqlite3';\nimport { FrameManager } from '../../context/frame-manager.js';\nimport {\n enhanceFrameManagerWithDigest,\n FrameDigestIntegration,\n} from '../frame-digest-integration.js';\nimport { DigestLLMProvider } from '../types.js';\n\ndescribe('FrameDigestIntegration', () => {\n let db: Database.Database;\n let frameManager: FrameManager;\n let integration: FrameDigestIntegration;\n let mockLLMProvider: DigestLLMProvider;\n\n beforeEach(() => {\n // Create in-memory database\n db = new Database(':memory:');\n\n // Create frame manager\n frameManager = new FrameManager(db, 'test-project', 'test-run');\n\n // Create mock LLM provider\n mockLLMProvider = {\n generateSummary: vi.fn().mockResolvedValue({\n summary: 'Test AI summary',\n insight: 'Test insight',\n flaggedIssue: null,\n generatedAt: Date.now(),\n modelUsed: 'test-model',\n tokensUsed: 100,\n }),\n };\n\n // Enhance frame manager with digest integration\n integration = enhanceFrameManagerWithDigest(\n frameManager,\n db,\n mockLLMProvider\n );\n });\n\n afterEach(() => {\n integration.shutdown();\n db.close();\n });\n\n describe('Frame Lifecycle Integration', () => {\n it('should track frame creation', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Test Task',\n inputs: { test: true },\n });\n\n expect(frameId).toBeDefined();\n\n // Check idle status shows active frame\n const status = integration.getIdleStatus();\n expect(status.activeFrames).toBe(1);\n });\n\n it('should track tool calls for idle detection', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Test Task',\n });\n\n // Add tool call event\n frameManager.addEvent('tool_call', {\n tool_name: 'test_tool',\n args: {},\n });\n\n // Should reset idle timer\n const status = integration.getIdleStatus();\n expect(status.timeSinceLastToolCall).toBeLessThan(100);\n });\n\n it('should track user input', () => {\n frameManager.createFrame({\n type: 'task',\n name: 'Test Task',\n });\n\n // Add user message event\n frameManager.addEvent('user_message', {\n content: 'Test message',\n });\n\n // Should reset input timer\n const status = integration.getIdleStatus();\n expect(status.timeSinceLastInput).toBeLessThan(100);\n });\n\n it('should generate digest on frame close', () => {\n const frameId = frameManager.createFrame({\n type: 'task',\n name: 'Test Task',\n });\n\n // Add some events\n frameManager.addEvent('tool_call', {\n tool_name: 'write_file',\n file_path: '/src/test.ts',\n });\n\n frameManager.addAnchor('DECISION', 'Use TypeScript');\n\n // Close frame\n frameManager.closeFrame(frameId, { result: 'success' });\n\n // Get frame to check digest\n const frame = frameManager.getFrame(frameId);\n expect(frame).toBeDefined();\n expect(frame?.state).toBe('closed');\n expect(frame?.outputs).toBeDefined();\n expect(frame?.outputs.digestText).toBeDefined();\n });\n\n it('should trigger digest processing on frame close', () => {\n const frameId = frameManager.createFrame({\n type: 'feature',\n name: 'Feature Implementation',\n });\n\n // Add events to make it interesting\n frameManager.addEvent('tool_call', {\n tool_name: 'write_file',\n file_path: '/src/feature.ts',\n });\n\n frameManager.addEvent('tool_result', {\n success: true,\n output: 'File written successfully',\n });\n\n // Before close, frame is active\n let status = integration.getIdleStatus();\n expect(status.activeFrames).toBe(1);\n\n // Close frame\n frameManager.closeFrame(frameId);\n\n // After close, frame is not active\n status = integration.getIdleStatus();\n expect(status.activeFrames).toBe(0);\n });\n });\n\n describe('Idle Detection', () => {\n it('should detect idle state after inactivity', async () => {\n frameManager.createFrame({\n type: 'task',\n name: 'Test Task',\n });\n\n // Initially not idle\n let status = integration.getIdleStatus();\n expect(status.isIdle).toBe(false);\n\n // Simulate passage of time by manipulating internal state\n // This would normally happen with actual time passing\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n // Force check of idle state\n await integration.forceProcessQueue();\n\n // Verify LLM was potentially called (if frames were queued)\n // Note: Actual idle detection would require more time to pass\n });\n\n it('should handle user interruption', () => {\n frameManager.createFrame({\n type: 'task',\n name: 'Test Task',\n });\n\n // Simulate user interruption\n integration.handleUserInterruption();\n\n // Should reset idle timers\n const status = integration.getIdleStatus();\n expect(status.isIdle).toBe(false);\n });\n });\n\n describe('Digest Content Generation', () => {\n it('should generate both deterministic and AI content', async () => {\n const frameId = frameManager.createFrame({\n type: 'feature',\n name: 'Complex Feature',\n });\n\n // Add various events\n frameManager.addEvent('tool_call', {\n tool_name: 'write_file',\n file_path: '/src/feature.ts',\n });\n\n frameManager.addEvent('tool_call', {\n tool_name: 'run_test',\n command: 'npm test',\n });\n\n frameManager.addEvent('tool_result', {\n success: true,\n output: '10 tests passed',\n });\n\n frameManager.addAnchor(\n 'DECISION',\n 'Implement using event-driven architecture'\n );\n frameManager.addAnchor(\n 'RISK',\n 'Performance may degrade with high event volume'\n );\n\n // Close frame to trigger digest\n frameManager.closeFrame(frameId);\n\n const frame = frameManager.getFrame(frameId);\n expect(frame?.outputs.digest).toBeDefined();\n expect(frame?.outputs.digest.deterministic).toBeDefined();\n expect(frame?.outputs.digest.status).toBeDefined();\n });\n\n it('should calculate importance scores', () => {\n // Create different types of frames\n const debugFrame = frameManager.createFrame({\n type: 'debug',\n name: 'Debug Critical Issue',\n });\n\n const toolFrame = frameManager.createFrame({\n type: 'tool_scope',\n name: 'Tool Execution',\n });\n\n // Close both\n frameManager.closeFrame(toolFrame);\n frameManager.closeFrame(debugFrame);\n\n // Debug frame should have higher importance\n const debugFrameData = frameManager.getFrame(debugFrame);\n const toolFrameData = frameManager.getFrame(toolFrame);\n\n // Both should have digests\n expect(debugFrameData?.outputs.digest).toBeDefined();\n expect(toolFrameData?.outputs.digest).toBeDefined();\n });\n });\n\n describe('Multiple Frames', () => {\n it('should handle nested frames correctly', () => {\n const parentFrame = frameManager.createFrame({\n type: 'task',\n name: 'Parent Task',\n });\n\n const childFrame = frameManager.createFrame({\n type: 'subtask',\n name: 'Child Task',\n parentFrameId: parentFrame,\n });\n\n // Track both frames\n let status = integration.getIdleStatus();\n expect(status.activeFrames).toBe(2);\n\n // Close child\n frameManager.closeFrame(childFrame);\n status = integration.getIdleStatus();\n expect(status.activeFrames).toBe(1);\n\n // Close parent\n frameManager.closeFrame(parentFrame);\n status = integration.getIdleStatus();\n expect(status.activeFrames).toBe(0);\n });\n\n it('should process frames independently', async () => {\n // Create multiple frames\n const frame1 = frameManager.createFrame({\n type: 'task',\n name: 'Task 1',\n });\n\n frameManager.addEvent('tool_call', { tool_name: 'tool1' }, frame1);\n frameManager.closeFrame(frame1);\n\n const frame2 = frameManager.createFrame({\n type: 'task',\n name: 'Task 2',\n });\n\n frameManager.addEvent('tool_call', { tool_name: 'tool2' }, frame2);\n frameManager.closeFrame(frame2);\n\n // Both should have digests\n const frame1Data = frameManager.getFrame(frame1);\n const frame2Data = frameManager.getFrame(frame2);\n\n expect(frame1Data?.outputs.digestText).toBeDefined();\n expect(frame2Data?.outputs.digestText).toBeDefined();\n });\n });\n\n describe('Queue Processing', () => {\n it('should allow forced queue processing', async () => {\n const frameId = frameManager.createFrame({\n type: 'feature',\n name: 'Feature for AI Processing',\n });\n\n // Add events\n frameManager.addEvent('tool_call', {\n tool_name: 'complex_operation',\n });\n\n // Close to queue for AI processing\n frameManager.closeFrame(frameId);\n\n // Force process queue\n await integration.forceProcessQueue();\n\n // Verify AI provider was called\n expect(mockLLMProvider.generateSummary).toHaveBeenCalled();\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,UAAU,IAAI,QAAQ,YAAY,IAAI,iBAAiB;AAChE,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,OAEK;AAGP,SAAS,0BAA0B,MAAM;AACvC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,aAAW,MAAM;AAEf,SAAK,IAAI,SAAS,UAAU;AAG5B,mBAAe,IAAI,aAAa,IAAI,gBAAgB,UAAU;AAG9D,sBAAkB;AAAA,MAChB,iBAAiB,GAAG,GAAG,EAAE,kBAAkB;AAAA,QACzC,SAAS;AAAA,QACT,SAAS;AAAA,QACT,cAAc;AAAA,QACd,aAAa,KAAK,IAAI;AAAA,QACtB,WAAW;AAAA,QACX,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAGA,kBAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,gBAAY,SAAS;AACrB,OAAG,MAAM;AAAA,EACX,CAAC;AAED,WAAS,+BAA+B,MAAM;AAC5C,OAAG,+BAA+B,MAAM;AACtC,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,KAAK;AAAA,MACvB,CAAC;AAED,aAAO,OAAO,EAAE,YAAY;AAG5B,YAAM,SAAS,YAAY,cAAc;AACzC,aAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,IACpC,CAAC;AAED,OAAG,8CAA8C,MAAM;AACrD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,aAAa;AAAA,QACjC,WAAW;AAAA,QACX,MAAM,CAAC;AAAA,MACT,CAAC;AAGD,YAAM,SAAS,YAAY,cAAc;AACzC,aAAO,OAAO,qBAAqB,EAAE,aAAa,GAAG;AAAA,IACvD,CAAC;AAED,OAAG,2BAA2B,MAAM;AAClC,mBAAa,YAAY;AAAA,QACvB,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,gBAAgB;AAAA,QACpC,SAAS;AAAA,MACX,CAAC;AAGD,YAAM,SAAS,YAAY,cAAc;AACzC,aAAO,OAAO,kBAAkB,EAAE,aAAa,GAAG;AAAA,IACpD,CAAC;AAED,OAAG,yCAAyC,MAAM;AAChD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,aAAa;AAAA,QACjC,WAAW;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AAED,mBAAa,UAAU,YAAY,gBAAgB;AAGnD,mBAAa,WAAW,SAAS,EAAE,QAAQ,UAAU,CAAC;AAGtD,YAAM,QAAQ,aAAa,SAAS,OAAO;AAC3C,aAAO,KAAK,EAAE,YAAY;AAC1B,aAAO,OAAO,KAAK,EAAE,KAAK,QAAQ;AAClC,aAAO,OAAO,OAAO,EAAE,YAAY;AACnC,aAAO,OAAO,QAAQ,UAAU,EAAE,YAAY;AAAA,IAChD,CAAC;AAED,OAAG,mDAAmD,MAAM;AAC1D,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,aAAa;AAAA,QACjC,WAAW;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AAED,mBAAa,SAAS,eAAe;AAAA,QACnC,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAGD,UAAI,SAAS,YAAY,cAAc;AACvC,aAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAGlC,mBAAa,WAAW,OAAO;AAG/B,eAAS,YAAY,cAAc;AACnC,aAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,kBAAkB,MAAM;AAC/B,OAAG,6CAA6C,YAAY;AAC1D,mBAAa,YAAY;AAAA,QACvB,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,UAAI,SAAS,YAAY,cAAc;AACvC,aAAO,OAAO,MAAM,EAAE,KAAK,KAAK;AAIhC,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAGvD,YAAM,YAAY,kBAAkB;AAAA,IAItC,CAAC;AAED,OAAG,mCAAmC,MAAM;AAC1C,mBAAa,YAAY;AAAA,QACvB,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,kBAAY,uBAAuB;AAGnC,YAAM,SAAS,YAAY,cAAc;AACzC,aAAO,OAAO,MAAM,EAAE,KAAK,KAAK;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,6BAA6B,MAAM;AAC1C,OAAG,qDAAqD,YAAY;AAClE,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,aAAa;AAAA,QACjC,WAAW;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AAED,mBAAa,SAAS,aAAa;AAAA,QACjC,WAAW;AAAA,QACX,SAAS;AAAA,MACX,CAAC;AAED,mBAAa,SAAS,eAAe;AAAA,QACnC,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAED,mBAAa;AAAA,QACX;AAAA,QACA;AAAA,MACF;AACA,mBAAa;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAGA,mBAAa,WAAW,OAAO;AAE/B,YAAM,QAAQ,aAAa,SAAS,OAAO;AAC3C,aAAO,OAAO,QAAQ,MAAM,EAAE,YAAY;AAC1C,aAAO,OAAO,QAAQ,OAAO,aAAa,EAAE,YAAY;AACxD,aAAO,OAAO,QAAQ,OAAO,MAAM,EAAE,YAAY;AAAA,IACnD,CAAC;AAED,OAAG,sCAAsC,MAAM;AAE7C,YAAM,aAAa,aAAa,YAAY;AAAA,QAC1C,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,YAAY,aAAa,YAAY;AAAA,QACzC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,WAAW,SAAS;AACjC,mBAAa,WAAW,UAAU;AAGlC,YAAM,iBAAiB,aAAa,SAAS,UAAU;AACvD,YAAM,gBAAgB,aAAa,SAAS,SAAS;AAGrD,aAAO,gBAAgB,QAAQ,MAAM,EAAE,YAAY;AACnD,aAAO,eAAe,QAAQ,MAAM,EAAE,YAAY;AAAA,IACpD,CAAC;AAAA,EACH,CAAC;AAED,WAAS,mBAAmB,MAAM;AAChC,OAAG,yCAAyC,MAAM;AAChD,YAAM,cAAc,aAAa,YAAY;AAAA,QAC3C,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,YAAM,aAAa,aAAa,YAAY;AAAA,QAC1C,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe;AAAA,MACjB,CAAC;AAGD,UAAI,SAAS,YAAY,cAAc;AACvC,aAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAGlC,mBAAa,WAAW,UAAU;AAClC,eAAS,YAAY,cAAc;AACnC,aAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAGlC,mBAAa,WAAW,WAAW;AACnC,eAAS,YAAY,cAAc;AACnC,aAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,IACpC,CAAC;AAED,OAAG,uCAAuC,YAAY;AAEpD,YAAM,SAAS,aAAa,YAAY;AAAA,QACtC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,SAAS,aAAa,EAAE,WAAW,QAAQ,GAAG,MAAM;AACjE,mBAAa,WAAW,MAAM;AAE9B,YAAM,SAAS,aAAa,YAAY;AAAA,QACtC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,mBAAa,SAAS,aAAa,EAAE,WAAW,QAAQ,GAAG,MAAM;AACjE,mBAAa,WAAW,MAAM;AAG9B,YAAM,aAAa,aAAa,SAAS,MAAM;AAC/C,YAAM,aAAa,aAAa,SAAS,MAAM;AAE/C,aAAO,YAAY,QAAQ,UAAU,EAAE,YAAY;AACnD,aAAO,YAAY,QAAQ,UAAU,EAAE,YAAY;AAAA,IACrD,CAAC;AAAA,EACH,CAAC;AAED,WAAS,oBAAoB,MAAM;AACjC,OAAG,wCAAwC,YAAY;AACrD,YAAM,UAAU,aAAa,YAAY;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAGD,mBAAa,SAAS,aAAa;AAAA,QACjC,WAAW;AAAA,MACb,CAAC;AAGD,mBAAa,WAAW,OAAO;AAG/B,YAAM,YAAY,kBAAkB;AAGpC,aAAO,gBAAgB,eAAe,EAAE,iBAAiB;AAAA,IAC3D,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { HybridDigestGenerator } from "./hybrid-digest-generator.js";
|
|
2
|
+
import { logger } from "../monitoring/logger.js";
|
|
3
|
+
const DEFAULT_IDLE_CONFIG = {
|
|
4
|
+
noToolCallThreshold: 3e4,
|
|
5
|
+
// 30 seconds
|
|
6
|
+
noInputThreshold: 6e4,
|
|
7
|
+
// 60 seconds
|
|
8
|
+
processOnFrameClose: true,
|
|
9
|
+
checkInterval: 1e4
|
|
10
|
+
// Check every 10 seconds
|
|
11
|
+
};
|
|
12
|
+
class EnhancedHybridDigestGenerator extends HybridDigestGenerator {
|
|
13
|
+
idleConfig;
|
|
14
|
+
lastToolCallTime = Date.now();
|
|
15
|
+
lastInputTime = Date.now();
|
|
16
|
+
idleCheckInterval;
|
|
17
|
+
activeFrames = /* @__PURE__ */ new Set();
|
|
18
|
+
constructor(db, config = {}, llmProvider, idleConfig = {}) {
|
|
19
|
+
const enhancedConfig = {
|
|
20
|
+
...config,
|
|
21
|
+
maxTokens: config.maxTokens || 200,
|
|
22
|
+
// Keep under 200 tokens as per requirement
|
|
23
|
+
enableAIGeneration: config.enableAIGeneration ?? true
|
|
24
|
+
};
|
|
25
|
+
super(db, enhancedConfig, llmProvider);
|
|
26
|
+
this.idleConfig = { ...DEFAULT_IDLE_CONFIG, ...idleConfig };
|
|
27
|
+
this.startIdleDetection();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start idle detection monitoring
|
|
31
|
+
*/
|
|
32
|
+
startIdleDetection() {
|
|
33
|
+
this.idleCheckInterval = setInterval(() => {
|
|
34
|
+
this.checkIdleState();
|
|
35
|
+
}, this.idleConfig.checkInterval);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if system is idle and trigger processing
|
|
39
|
+
*/
|
|
40
|
+
checkIdleState() {
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
const toolCallIdle = now - this.lastToolCallTime > this.idleConfig.noToolCallThreshold;
|
|
43
|
+
const inputIdle = now - this.lastInputTime > this.idleConfig.noInputThreshold;
|
|
44
|
+
if (toolCallIdle || inputIdle) {
|
|
45
|
+
logger.debug("Idle state detected, triggering digest processing", {
|
|
46
|
+
toolCallIdle,
|
|
47
|
+
inputIdle,
|
|
48
|
+
timeSinceLastToolCall: now - this.lastToolCallTime,
|
|
49
|
+
timeSinceLastInput: now - this.lastInputTime
|
|
50
|
+
});
|
|
51
|
+
this.processQueue().catch((error) => {
|
|
52
|
+
logger.error("Error processing digest queue during idle", error instanceof Error ? error : new Error(String(error)));
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Record tool call activity
|
|
58
|
+
*/
|
|
59
|
+
recordToolCall() {
|
|
60
|
+
this.lastToolCallTime = Date.now();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Record user input activity
|
|
64
|
+
*/
|
|
65
|
+
recordUserInput() {
|
|
66
|
+
this.lastInputTime = Date.now();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Handle frame closure - immediately trigger digest if configured
|
|
70
|
+
*/
|
|
71
|
+
onFrameClosed(frameId) {
|
|
72
|
+
this.activeFrames.delete(frameId);
|
|
73
|
+
if (this.idleConfig.processOnFrameClose) {
|
|
74
|
+
logger.info("Frame closed, triggering immediate digest processing", {
|
|
75
|
+
frameId
|
|
76
|
+
});
|
|
77
|
+
this.prioritizeFrame(frameId);
|
|
78
|
+
this.processQueue().catch((error) => {
|
|
79
|
+
logger.error("Error processing digest on frame close", error instanceof Error ? error : new Error(String(error)));
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Handle frame opened
|
|
85
|
+
*/
|
|
86
|
+
onFrameOpened(frameId) {
|
|
87
|
+
this.activeFrames.add(frameId);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Prioritize a specific frame for processing
|
|
91
|
+
*/
|
|
92
|
+
prioritizeFrame(frameId) {
|
|
93
|
+
try {
|
|
94
|
+
this.db.prepare(
|
|
95
|
+
`
|
|
96
|
+
UPDATE digest_queue
|
|
97
|
+
SET priority = 'high', updated_at = unixepoch()
|
|
98
|
+
WHERE frame_id = ? AND status = 'pending'
|
|
99
|
+
`
|
|
100
|
+
).run(frameId);
|
|
101
|
+
} catch (error) {
|
|
102
|
+
logger.error("Failed to prioritize frame", error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Enhanced AI generation with 40% content
|
|
107
|
+
*/
|
|
108
|
+
async generateEnhancedAI(input, deterministic) {
|
|
109
|
+
if (!this.llmProvider) {
|
|
110
|
+
throw new Error("No LLM provider configured");
|
|
111
|
+
}
|
|
112
|
+
const prompt = this.buildEnhancedPrompt(input, deterministic);
|
|
113
|
+
const response = await this.llmProvider.generateSummary(
|
|
114
|
+
input,
|
|
115
|
+
deterministic,
|
|
116
|
+
this.config.maxTokens
|
|
117
|
+
);
|
|
118
|
+
const enhanced = {
|
|
119
|
+
...response,
|
|
120
|
+
keyDecisions: this.extractKeyDecisions(response),
|
|
121
|
+
insights: this.extractInsights(response),
|
|
122
|
+
nextSteps: this.extractNextSteps(response),
|
|
123
|
+
patterns: this.detectPatterns(input, deterministic),
|
|
124
|
+
technicalDebt: this.identifyTechnicalDebt(input, deterministic)
|
|
125
|
+
};
|
|
126
|
+
return enhanced;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Build enhanced prompt for AI generation
|
|
130
|
+
*/
|
|
131
|
+
buildEnhancedPrompt(input, deterministic) {
|
|
132
|
+
const parts = [
|
|
133
|
+
`Analyze this development frame and provide insights (max ${this.config.maxTokens} tokens):`,
|
|
134
|
+
"",
|
|
135
|
+
`Frame: ${input.frame.name} (${input.frame.type})`,
|
|
136
|
+
`Duration: ${deterministic.durationSeconds}s`,
|
|
137
|
+
`Files Modified: ${deterministic.filesModified.length}`,
|
|
138
|
+
`Tool Calls: ${deterministic.toolCallCount}`,
|
|
139
|
+
`Errors: ${deterministic.errorsEncountered.length}`,
|
|
140
|
+
"",
|
|
141
|
+
"Provide:",
|
|
142
|
+
"1. Key decisions made and why (2-3 items)",
|
|
143
|
+
"2. Important insights or learnings (1-2 items)",
|
|
144
|
+
"3. Suggested next steps (2-3 items)",
|
|
145
|
+
"4. Any patterns or anti-patterns observed",
|
|
146
|
+
"5. Technical debt or improvements needed",
|
|
147
|
+
"",
|
|
148
|
+
"Be concise and actionable. Focus on value, not description."
|
|
149
|
+
];
|
|
150
|
+
return parts.join("\n");
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Extract key decisions from AI response
|
|
154
|
+
*/
|
|
155
|
+
extractKeyDecisions(response) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Extract insights from AI response
|
|
160
|
+
*/
|
|
161
|
+
extractInsights(response) {
|
|
162
|
+
const insights = [];
|
|
163
|
+
if (response.insight) {
|
|
164
|
+
insights.push(response.insight);
|
|
165
|
+
}
|
|
166
|
+
return insights;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Extract next steps from AI response
|
|
170
|
+
*/
|
|
171
|
+
extractNextSteps(response) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Detect patterns in the frame activity
|
|
176
|
+
*/
|
|
177
|
+
detectPatterns(input, deterministic) {
|
|
178
|
+
const patterns = [];
|
|
179
|
+
if (deterministic.errorsEncountered.some((e) => e.count > 2)) {
|
|
180
|
+
patterns.push("Multiple retry attempts detected");
|
|
181
|
+
}
|
|
182
|
+
const hasTests = deterministic.testsRun.length > 0;
|
|
183
|
+
const hasCodeChanges = deterministic.filesModified.some(
|
|
184
|
+
(f) => f.operation === "modify" && !f.path.includes("test")
|
|
185
|
+
);
|
|
186
|
+
if (hasTests && hasCodeChanges) {
|
|
187
|
+
patterns.push("Test-driven development pattern observed");
|
|
188
|
+
}
|
|
189
|
+
const manyFileChanges = deterministic.filesModified.length > 5;
|
|
190
|
+
const noNewFiles = !deterministic.filesModified.some(
|
|
191
|
+
(f) => f.operation === "create"
|
|
192
|
+
);
|
|
193
|
+
if (manyFileChanges && noNewFiles) {
|
|
194
|
+
patterns.push("Refactoring pattern detected");
|
|
195
|
+
}
|
|
196
|
+
return patterns;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Identify technical debt
|
|
200
|
+
*/
|
|
201
|
+
identifyTechnicalDebt(input, deterministic) {
|
|
202
|
+
const debt = [];
|
|
203
|
+
if (deterministic.filesModified.length > 3 && deterministic.testsRun.length === 0) {
|
|
204
|
+
debt.push("Code changes without corresponding tests");
|
|
205
|
+
}
|
|
206
|
+
const unresolvedErrors = deterministic.errorsEncountered.filter(
|
|
207
|
+
(e) => !e.resolved
|
|
208
|
+
);
|
|
209
|
+
if (unresolvedErrors.length > 0) {
|
|
210
|
+
debt.push(`${unresolvedErrors.length} unresolved errors remain`);
|
|
211
|
+
}
|
|
212
|
+
if (deterministic.decisions.some((d) => d.toLowerCase().includes("todo"))) {
|
|
213
|
+
debt.push("TODOs added to codebase");
|
|
214
|
+
}
|
|
215
|
+
return debt;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Generate digest with 60/40 split
|
|
219
|
+
*/
|
|
220
|
+
generateDigest(input) {
|
|
221
|
+
this.recordToolCall();
|
|
222
|
+
const digest = super.generateDigest(input);
|
|
223
|
+
if (this.config.enableAIGeneration && this.llmProvider) {
|
|
224
|
+
digest.status = "ai_pending";
|
|
225
|
+
}
|
|
226
|
+
return digest;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Handle interruption gracefully
|
|
230
|
+
*/
|
|
231
|
+
handleInterruption() {
|
|
232
|
+
logger.info("User activity detected, pausing digest processing");
|
|
233
|
+
this.recordUserInput();
|
|
234
|
+
this.recordToolCall();
|
|
235
|
+
this.db.prepare(
|
|
236
|
+
`
|
|
237
|
+
UPDATE digest_queue
|
|
238
|
+
SET priority = 'low'
|
|
239
|
+
WHERE status = 'processing'
|
|
240
|
+
`
|
|
241
|
+
).run();
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get idle status
|
|
245
|
+
*/
|
|
246
|
+
getIdleStatus() {
|
|
247
|
+
const now = Date.now();
|
|
248
|
+
return {
|
|
249
|
+
isIdle: now - this.lastToolCallTime > this.idleConfig.noToolCallThreshold || now - this.lastInputTime > this.idleConfig.noInputThreshold,
|
|
250
|
+
timeSinceLastToolCall: now - this.lastToolCallTime,
|
|
251
|
+
timeSinceLastInput: now - this.lastInputTime,
|
|
252
|
+
activeFrames: this.activeFrames.size
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Cleanup on shutdown
|
|
257
|
+
*/
|
|
258
|
+
shutdown() {
|
|
259
|
+
if (this.idleCheckInterval) {
|
|
260
|
+
clearInterval(this.idleCheckInterval);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
export {
|
|
265
|
+
EnhancedHybridDigestGenerator
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=enhanced-hybrid-digest.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/digest/enhanced-hybrid-digest.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Enhanced Hybrid Digest Generator for STA-96\n * Implements 60/40 split: deterministic extraction + AI-generated insights\n */\n\nimport Database from 'better-sqlite3';\nimport {\n HybridDigest,\n DeterministicDigest,\n AIGeneratedDigest,\n DigestConfig,\n DigestInput,\n DigestGenerationRequest,\n DigestQueueStats,\n DigestLLMProvider,\n DigestStatus,\n DEFAULT_DIGEST_CONFIG,\n} from './types.js';\nimport { HybridDigestGenerator } from './hybrid-digest-generator.js';\nimport { logger } from '../monitoring/logger.js';\n\n/**\n * Enhanced AI digest with 40% content\n */\nexport interface EnhancedAIDigest extends AIGeneratedDigest {\n /** Key decisions made and their reasoning */\n keyDecisions?: string[];\n /** Important insights discovered */\n insights?: string[];\n /** Suggested next steps */\n nextSteps?: string[];\n /** Patterns detected */\n patterns?: string[];\n /** Technical debt or improvements identified */\n technicalDebt?: string[];\n}\n\n/**\n * Idle detection configuration\n */\nexport interface IdleDetectionConfig {\n /** No tool calls threshold (ms) */\n noToolCallThreshold: number;\n /** No user input threshold (ms) */\n noInputThreshold: number;\n /** Frame closed immediately triggers processing */\n processOnFrameClose: boolean;\n /** Check interval (ms) */\n checkInterval: number;\n}\n\nconst DEFAULT_IDLE_CONFIG: IdleDetectionConfig = {\n noToolCallThreshold: 30000, // 30 seconds\n noInputThreshold: 60000, // 60 seconds\n processOnFrameClose: true,\n checkInterval: 10000, // Check every 10 seconds\n};\n\n/**\n * Enhanced Hybrid Digest Generator\n * Implements 60% deterministic + 40% AI insights\n */\nexport class EnhancedHybridDigestGenerator extends HybridDigestGenerator {\n private idleConfig: IdleDetectionConfig;\n private lastToolCallTime: number = Date.now();\n private lastInputTime: number = Date.now();\n private idleCheckInterval?: NodeJS.Timeout;\n private activeFrames = new Set<string>();\n\n constructor(\n db: Database.Database,\n config: Partial<DigestConfig> = {},\n llmProvider?: DigestLLMProvider,\n idleConfig: Partial<IdleDetectionConfig> = {}\n ) {\n // Update config to reflect 60/40 split\n const enhancedConfig = {\n ...config,\n maxTokens: config.maxTokens || 200, // Keep under 200 tokens as per requirement\n enableAIGeneration: config.enableAIGeneration ?? true,\n };\n\n super(db, enhancedConfig, llmProvider);\n this.idleConfig = { ...DEFAULT_IDLE_CONFIG, ...idleConfig };\n this.startIdleDetection();\n }\n\n /**\n * Start idle detection monitoring\n */\n private startIdleDetection(): void {\n this.idleCheckInterval = setInterval(() => {\n this.checkIdleState();\n }, this.idleConfig.checkInterval);\n }\n\n /**\n * Check if system is idle and trigger processing\n */\n private checkIdleState(): void {\n const now = Date.now();\n\n // Check for idle based on tool calls\n const toolCallIdle =\n now - this.lastToolCallTime > this.idleConfig.noToolCallThreshold;\n\n // Check for idle based on user input\n const inputIdle =\n now - this.lastInputTime > this.idleConfig.noInputThreshold;\n\n if (toolCallIdle || inputIdle) {\n logger.debug('Idle state detected, triggering digest processing', {\n toolCallIdle,\n inputIdle,\n timeSinceLastToolCall: now - this.lastToolCallTime,\n timeSinceLastInput: now - this.lastInputTime,\n });\n\n this.processQueue().catch((error) => {\n logger.error('Error processing digest queue during idle', error instanceof Error ? error : new Error(String(error)));\n });\n }\n }\n\n /**\n * Record tool call activity\n */\n public recordToolCall(): void {\n this.lastToolCallTime = Date.now();\n }\n\n /**\n * Record user input activity\n */\n public recordUserInput(): void {\n this.lastInputTime = Date.now();\n }\n\n /**\n * Handle frame closure - immediately trigger digest if configured\n */\n public onFrameClosed(frameId: string): void {\n this.activeFrames.delete(frameId);\n\n if (this.idleConfig.processOnFrameClose) {\n logger.info('Frame closed, triggering immediate digest processing', {\n frameId,\n });\n\n // Process this specific frame with high priority\n this.prioritizeFrame(frameId);\n this.processQueue().catch((error) => {\n logger.error('Error processing digest on frame close', error instanceof Error ? error : new Error(String(error)));\n });\n }\n }\n\n /**\n * Handle frame opened\n */\n public onFrameOpened(frameId: string): void {\n this.activeFrames.add(frameId);\n }\n\n /**\n * Prioritize a specific frame for processing\n */\n private prioritizeFrame(frameId: string): void {\n try {\n this.db\n .prepare(\n `\n UPDATE digest_queue \n SET priority = 'high', updated_at = unixepoch()\n WHERE frame_id = ? AND status = 'pending'\n `\n )\n .run(frameId);\n } catch (error) {\n logger.error('Failed to prioritize frame', error as Error);\n }\n }\n\n /**\n * Enhanced AI generation with 40% content\n */\n protected async generateEnhancedAI(\n input: DigestInput,\n deterministic: DeterministicDigest\n ): Promise<EnhancedAIDigest> {\n if (!this.llmProvider) {\n throw new Error('No LLM provider configured');\n }\n\n // Build enhanced prompt for 40% AI content\n const prompt = this.buildEnhancedPrompt(input, deterministic);\n\n // Generate with LLM\n const response = await this.llmProvider.generateSummary(\n input,\n deterministic,\n this.config.maxTokens\n );\n\n // Parse and structure the enhanced response\n const enhanced: EnhancedAIDigest = {\n ...response,\n keyDecisions: this.extractKeyDecisions(response),\n insights: this.extractInsights(response),\n nextSteps: this.extractNextSteps(response),\n patterns: this.detectPatterns(input, deterministic),\n technicalDebt: this.identifyTechnicalDebt(input, deterministic),\n };\n\n return enhanced;\n }\n\n /**\n * Build enhanced prompt for AI generation\n */\n private buildEnhancedPrompt(\n input: DigestInput,\n deterministic: DeterministicDigest\n ): string {\n const parts: string[] = [\n `Analyze this development frame and provide insights (max ${this.config.maxTokens} tokens):`,\n '',\n `Frame: ${input.frame.name} (${input.frame.type})`,\n `Duration: ${deterministic.durationSeconds}s`,\n `Files Modified: ${deterministic.filesModified.length}`,\n `Tool Calls: ${deterministic.toolCallCount}`,\n `Errors: ${deterministic.errorsEncountered.length}`,\n '',\n 'Provide:',\n '1. Key decisions made and why (2-3 items)',\n '2. Important insights or learnings (1-2 items)',\n '3. Suggested next steps (2-3 items)',\n '4. Any patterns or anti-patterns observed',\n '5. Technical debt or improvements needed',\n '',\n 'Be concise and actionable. Focus on value, not description.',\n ];\n\n return parts.join('\\n');\n }\n\n /**\n * Extract key decisions from AI response\n */\n private extractKeyDecisions(response: AIGeneratedDigest): string[] {\n // This would parse the AI response for decision patterns\n // For now, return placeholder\n return [];\n }\n\n /**\n * Extract insights from AI response\n */\n private extractInsights(response: AIGeneratedDigest): string[] {\n const insights: string[] = [];\n if (response.insight) {\n insights.push(response.insight);\n }\n return insights;\n }\n\n /**\n * Extract next steps from AI response\n */\n private extractNextSteps(response: AIGeneratedDigest): string[] {\n // Parse AI response for next steps\n return [];\n }\n\n /**\n * Detect patterns in the frame activity\n */\n private detectPatterns(\n input: DigestInput,\n deterministic: DeterministicDigest\n ): string[] {\n const patterns: string[] = [];\n\n // Detect retry patterns\n if (deterministic.errorsEncountered.some((e) => e.count > 2)) {\n patterns.push('Multiple retry attempts detected');\n }\n\n // Detect test-driven development\n const hasTests = deterministic.testsRun.length > 0;\n const hasCodeChanges = deterministic.filesModified.some(\n (f) => f.operation === 'modify' && !f.path.includes('test')\n );\n if (hasTests && hasCodeChanges) {\n patterns.push('Test-driven development pattern observed');\n }\n\n // Detect refactoring patterns\n const manyFileChanges = deterministic.filesModified.length > 5;\n const noNewFiles = !deterministic.filesModified.some(\n (f) => f.operation === 'create'\n );\n if (manyFileChanges && noNewFiles) {\n patterns.push('Refactoring pattern detected');\n }\n\n return patterns;\n }\n\n /**\n * Identify technical debt\n */\n private identifyTechnicalDebt(\n input: DigestInput,\n deterministic: DeterministicDigest\n ): string[] {\n const debt: string[] = [];\n\n // Check for missing tests\n if (\n deterministic.filesModified.length > 3 &&\n deterministic.testsRun.length === 0\n ) {\n debt.push('Code changes without corresponding tests');\n }\n\n // Check for unresolved errors\n const unresolvedErrors = deterministic.errorsEncountered.filter(\n (e) => !e.resolved\n );\n if (unresolvedErrors.length > 0) {\n debt.push(`${unresolvedErrors.length} unresolved errors remain`);\n }\n\n // Check for TODOs in decisions\n if (deterministic.decisions.some((d) => d.toLowerCase().includes('todo'))) {\n debt.push('TODOs added to codebase');\n }\n\n return debt;\n }\n\n /**\n * Generate digest with 60/40 split\n */\n public generateDigest(input: DigestInput): HybridDigest {\n // Record activity\n this.recordToolCall();\n\n // Generate base digest (60% deterministic)\n const digest = super.generateDigest(input);\n\n // Ensure AI generation is queued for 40% content\n if (this.config.enableAIGeneration && this.llmProvider) {\n digest.status = 'ai_pending';\n }\n\n return digest;\n }\n\n /**\n * Handle interruption gracefully\n */\n public handleInterruption(): void {\n logger.info('User activity detected, pausing digest processing');\n\n // Update timestamps\n this.recordUserInput();\n this.recordToolCall();\n\n // Don't stop processing entirely, just deprioritize\n this.db\n .prepare(\n `\n UPDATE digest_queue \n SET priority = 'low'\n WHERE status = 'processing'\n `\n )\n .run();\n }\n\n /**\n * Get idle status\n */\n public getIdleStatus(): {\n isIdle: boolean;\n timeSinceLastToolCall: number;\n timeSinceLastInput: number;\n activeFrames: number;\n } {\n const now = Date.now();\n return {\n isIdle:\n now - this.lastToolCallTime > this.idleConfig.noToolCallThreshold ||\n now - this.lastInputTime > this.idleConfig.noInputThreshold,\n timeSinceLastToolCall: now - this.lastToolCallTime,\n timeSinceLastInput: now - this.lastInputTime,\n activeFrames: this.activeFrames.size,\n };\n }\n\n /**\n * Cleanup on shutdown\n */\n public shutdown(): void {\n if (this.idleCheckInterval) {\n clearInterval(this.idleCheckInterval);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|