@stackmemoryai/stackmemory 0.2.8 → 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/compaction-handler.d.ts.map +1 -1
- package/dist/src/core/context/compaction-handler.js +1 -1
- package/dist/src/core/context/compaction-handler.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 +76 -0
- package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -0
- package/dist/src/core/digest/hybrid-digest-generator.js +629 -0
- package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -0
- package/dist/src/core/digest/index.d.ts +9 -0
- package/dist/src/core/digest/index.d.ts.map +1 -0
- package/dist/src/core/digest/index.js +9 -0
- package/dist/src/core/digest/index.js.map +1 -0
- package/dist/src/core/digest/types.d.ts +154 -0
- package/dist/src/core/digest/types.d.ts.map +1 -0
- package/dist/src/core/digest/types.js +18 -0
- package/dist/src/core/digest/types.js.map +1 -0
- 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/monitoring/logger.d.ts +2 -2
- package/dist/src/core/monitoring/logger.d.ts.map +1 -1
- package/dist/src/core/monitoring/logger.js +10 -5
- package/dist/src/core/monitoring/logger.js.map +1 -1
- package/dist/src/core/monitoring/metrics.d.ts +3 -0
- package/dist/src/core/monitoring/metrics.d.ts.map +1 -1
- package/dist/src/core/monitoring/metrics.js +142 -3
- package/dist/src/core/monitoring/metrics.js.map +1 -1
- 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 +31 -0
- package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -0
- package/dist/src/core/persistence/postgres-adapter.js +330 -0
- package/dist/src/core/persistence/postgres-adapter.js.map +1 -0
- 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 +6 -6
- 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/core/types.d.ts +35 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/types.js.map +1 -0
- 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/server.js +2 -2
- package/dist/src/integrations/mcp/server.js.map +1 -1
- 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/embedding-provider.d.ts +48 -0
- package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +1 -0
- package/dist/src/integrations/pg-aiguide/embedding-provider.js +190 -0
- package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +1 -0
- package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +34 -0
- package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -0
- package/dist/src/integrations/pg-aiguide/semantic-search.js +176 -0
- package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -0
- package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +44 -0
- package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +1 -0
- package/dist/src/integrations/pg-aiguide/timescale-analytics.js +215 -0
- package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +1 -0
- 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 +62 -0
- package/dist/src/models/user.model.d.ts.map +1 -0
- package/dist/src/models/user.model.js +311 -0
- package/dist/src/models/user.model.js.map +1 -0
- package/dist/src/servers/production/auth-middleware.d.ts +12 -2
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
- package/dist/src/servers/production/auth-middleware.js +240 -28
- package/dist/src/servers/production/auth-middleware.js.map +1 -1
- package/dist/src/servers/railway/index.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 +12 -3
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { logger } from "../monitoring/logger.js";
|
|
2
|
+
import { DatabaseError, ErrorCode } from "../errors/index.js";
|
|
3
|
+
class FrameDatabase {
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Initialize database schema
|
|
9
|
+
*/
|
|
10
|
+
initSchema() {
|
|
11
|
+
try {
|
|
12
|
+
this.db.pragma("journal_mode = WAL");
|
|
13
|
+
this.db.pragma("synchronous = NORMAL");
|
|
14
|
+
this.db.exec(`
|
|
15
|
+
CREATE TABLE IF NOT EXISTS frames (
|
|
16
|
+
frame_id TEXT PRIMARY KEY,
|
|
17
|
+
run_id TEXT NOT NULL,
|
|
18
|
+
project_id TEXT NOT NULL,
|
|
19
|
+
parent_frame_id TEXT,
|
|
20
|
+
depth INTEGER NOT NULL DEFAULT 0,
|
|
21
|
+
type TEXT NOT NULL,
|
|
22
|
+
name TEXT NOT NULL,
|
|
23
|
+
state TEXT NOT NULL DEFAULT 'active',
|
|
24
|
+
inputs TEXT DEFAULT '{}',
|
|
25
|
+
outputs TEXT DEFAULT '{}',
|
|
26
|
+
digest_text TEXT,
|
|
27
|
+
digest_json TEXT DEFAULT '{}',
|
|
28
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
29
|
+
closed_at INTEGER,
|
|
30
|
+
FOREIGN KEY (parent_frame_id) REFERENCES frames(frame_id)
|
|
31
|
+
);
|
|
32
|
+
`);
|
|
33
|
+
this.db.exec(`
|
|
34
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
35
|
+
event_id TEXT PRIMARY KEY,
|
|
36
|
+
frame_id TEXT NOT NULL,
|
|
37
|
+
run_id TEXT NOT NULL,
|
|
38
|
+
seq INTEGER NOT NULL,
|
|
39
|
+
event_type TEXT NOT NULL,
|
|
40
|
+
payload TEXT NOT NULL DEFAULT '{}',
|
|
41
|
+
ts INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
42
|
+
FOREIGN KEY (frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE
|
|
43
|
+
);
|
|
44
|
+
`);
|
|
45
|
+
this.db.exec(`
|
|
46
|
+
CREATE TABLE IF NOT EXISTS anchors (
|
|
47
|
+
anchor_id TEXT PRIMARY KEY,
|
|
48
|
+
frame_id TEXT NOT NULL,
|
|
49
|
+
type TEXT NOT NULL,
|
|
50
|
+
text TEXT NOT NULL,
|
|
51
|
+
priority INTEGER NOT NULL DEFAULT 5,
|
|
52
|
+
metadata TEXT DEFAULT '{}',
|
|
53
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
54
|
+
FOREIGN KEY (frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE
|
|
55
|
+
);
|
|
56
|
+
`);
|
|
57
|
+
this.db.exec(`
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_frames_project_state ON frames(project_id, state);
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_events_frame_seq ON events(frame_id, seq);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_anchors_frame_priority ON anchors(frame_id, priority DESC);
|
|
62
|
+
`);
|
|
63
|
+
logger.info("Frame database schema initialized");
|
|
64
|
+
} catch (error) {
|
|
65
|
+
throw new DatabaseError(
|
|
66
|
+
"Failed to initialize frame database schema",
|
|
67
|
+
ErrorCode.DB_SCHEMA_ERROR,
|
|
68
|
+
{ operation: "initSchema" },
|
|
69
|
+
error instanceof Error ? error : void 0
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Insert new frame
|
|
75
|
+
*/
|
|
76
|
+
insertFrame(frame) {
|
|
77
|
+
try {
|
|
78
|
+
const stmt = this.db.prepare(`
|
|
79
|
+
INSERT INTO frames (frame_id, run_id, project_id, parent_frame_id, depth, type, name, state, inputs, outputs, digest_json)
|
|
80
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
81
|
+
`);
|
|
82
|
+
const result = stmt.run(
|
|
83
|
+
frame.frame_id,
|
|
84
|
+
frame.run_id,
|
|
85
|
+
frame.project_id,
|
|
86
|
+
frame.parent_frame_id || null,
|
|
87
|
+
frame.depth,
|
|
88
|
+
frame.type,
|
|
89
|
+
frame.name,
|
|
90
|
+
frame.state,
|
|
91
|
+
JSON.stringify(frame.inputs),
|
|
92
|
+
JSON.stringify(frame.outputs),
|
|
93
|
+
JSON.stringify(frame.digest_json)
|
|
94
|
+
);
|
|
95
|
+
if (result.changes === 0) {
|
|
96
|
+
throw new Error("Frame insertion failed - no rows affected");
|
|
97
|
+
}
|
|
98
|
+
const createdFrame = this.getFrame(frame.frame_id);
|
|
99
|
+
if (!createdFrame) {
|
|
100
|
+
throw new Error("Failed to retrieve created frame");
|
|
101
|
+
}
|
|
102
|
+
return createdFrame;
|
|
103
|
+
} catch (error) {
|
|
104
|
+
throw new DatabaseError(
|
|
105
|
+
`Failed to insert frame: ${frame.frame_id}`,
|
|
106
|
+
ErrorCode.DB_INSERT_FAILED,
|
|
107
|
+
{
|
|
108
|
+
frameId: frame.frame_id,
|
|
109
|
+
frameName: frame.name,
|
|
110
|
+
operation: "insertFrame"
|
|
111
|
+
},
|
|
112
|
+
error instanceof Error ? error : void 0
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get frame by ID
|
|
118
|
+
*/
|
|
119
|
+
getFrame(frameId) {
|
|
120
|
+
try {
|
|
121
|
+
const row = this.db.prepare("SELECT * FROM frames WHERE frame_id = ?").get(frameId);
|
|
122
|
+
if (!row) return void 0;
|
|
123
|
+
return {
|
|
124
|
+
...row,
|
|
125
|
+
inputs: JSON.parse(row.inputs || "{}"),
|
|
126
|
+
outputs: JSON.parse(row.outputs || "{}"),
|
|
127
|
+
digest_json: JSON.parse(row.digest_json || "{}")
|
|
128
|
+
};
|
|
129
|
+
} catch (error) {
|
|
130
|
+
throw new DatabaseError(
|
|
131
|
+
`Failed to get frame: ${frameId}`,
|
|
132
|
+
ErrorCode.DB_QUERY_FAILED,
|
|
133
|
+
{ frameId, operation: "getFrame" },
|
|
134
|
+
error instanceof Error ? error : void 0
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Update frame state and outputs
|
|
140
|
+
*/
|
|
141
|
+
updateFrame(frameId, updates) {
|
|
142
|
+
try {
|
|
143
|
+
const setClauses = [];
|
|
144
|
+
const values = [];
|
|
145
|
+
if (updates.state !== void 0) {
|
|
146
|
+
setClauses.push("state = ?");
|
|
147
|
+
values.push(updates.state);
|
|
148
|
+
}
|
|
149
|
+
if (updates.outputs !== void 0) {
|
|
150
|
+
setClauses.push("outputs = ?");
|
|
151
|
+
values.push(JSON.stringify(updates.outputs));
|
|
152
|
+
}
|
|
153
|
+
if (updates.digest_text !== void 0) {
|
|
154
|
+
setClauses.push("digest_text = ?");
|
|
155
|
+
values.push(updates.digest_text);
|
|
156
|
+
}
|
|
157
|
+
if (updates.digest_json !== void 0) {
|
|
158
|
+
setClauses.push("digest_json = ?");
|
|
159
|
+
values.push(JSON.stringify(updates.digest_json));
|
|
160
|
+
}
|
|
161
|
+
if (updates.closed_at !== void 0) {
|
|
162
|
+
setClauses.push("closed_at = ?");
|
|
163
|
+
values.push(updates.closed_at);
|
|
164
|
+
}
|
|
165
|
+
if (setClauses.length === 0) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
values.push(frameId);
|
|
169
|
+
const stmt = this.db.prepare(`
|
|
170
|
+
UPDATE frames SET ${setClauses.join(", ")} WHERE frame_id = ?
|
|
171
|
+
`);
|
|
172
|
+
const result = stmt.run(...values);
|
|
173
|
+
if (result.changes === 0) {
|
|
174
|
+
throw new Error(`Frame not found: ${frameId}`);
|
|
175
|
+
}
|
|
176
|
+
} catch (error) {
|
|
177
|
+
throw new DatabaseError(
|
|
178
|
+
`Failed to update frame: ${frameId}`,
|
|
179
|
+
ErrorCode.DB_UPDATE_FAILED,
|
|
180
|
+
{ frameId, updates, operation: "updateFrame" },
|
|
181
|
+
error instanceof Error ? error : void 0
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get frames by project and state
|
|
187
|
+
*/
|
|
188
|
+
getFramesByProject(projectId, state) {
|
|
189
|
+
try {
|
|
190
|
+
const query = state ? "SELECT * FROM frames WHERE project_id = ? AND state = ? ORDER BY created_at" : "SELECT * FROM frames WHERE project_id = ? ORDER BY created_at";
|
|
191
|
+
const params = state ? [projectId, state] : [projectId];
|
|
192
|
+
const rows = this.db.prepare(query).all(...params);
|
|
193
|
+
return rows.map((row) => ({
|
|
194
|
+
...row,
|
|
195
|
+
inputs: JSON.parse(row.inputs || "{}"),
|
|
196
|
+
outputs: JSON.parse(row.outputs || "{}"),
|
|
197
|
+
digest_json: JSON.parse(row.digest_json || "{}")
|
|
198
|
+
}));
|
|
199
|
+
} catch (error) {
|
|
200
|
+
throw new DatabaseError(
|
|
201
|
+
`Failed to get frames for project: ${projectId}`,
|
|
202
|
+
ErrorCode.DB_QUERY_FAILED,
|
|
203
|
+
{ projectId, state, operation: "getFramesByProject" },
|
|
204
|
+
error instanceof Error ? error : void 0
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Insert event
|
|
210
|
+
*/
|
|
211
|
+
insertEvent(event) {
|
|
212
|
+
try {
|
|
213
|
+
const stmt = this.db.prepare(`
|
|
214
|
+
INSERT INTO events (event_id, frame_id, run_id, seq, event_type, payload)
|
|
215
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
216
|
+
`);
|
|
217
|
+
const result = stmt.run(
|
|
218
|
+
event.event_id,
|
|
219
|
+
event.frame_id,
|
|
220
|
+
event.run_id,
|
|
221
|
+
event.seq,
|
|
222
|
+
event.event_type,
|
|
223
|
+
JSON.stringify(event.payload)
|
|
224
|
+
);
|
|
225
|
+
if (result.changes === 0) {
|
|
226
|
+
throw new Error("Event insertion failed");
|
|
227
|
+
}
|
|
228
|
+
const createdEvent = this.db.prepare("SELECT * FROM events WHERE event_id = ?").get(event.event_id);
|
|
229
|
+
return {
|
|
230
|
+
...createdEvent,
|
|
231
|
+
payload: JSON.parse(createdEvent.payload)
|
|
232
|
+
};
|
|
233
|
+
} catch (error) {
|
|
234
|
+
throw new DatabaseError(
|
|
235
|
+
`Failed to insert event: ${event.event_id}`,
|
|
236
|
+
ErrorCode.DB_INSERT_FAILED,
|
|
237
|
+
{ eventId: event.event_id, frameId: event.frame_id, operation: "insertEvent" },
|
|
238
|
+
error instanceof Error ? error : void 0
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get events for a frame
|
|
244
|
+
*/
|
|
245
|
+
getFrameEvents(frameId, limit) {
|
|
246
|
+
try {
|
|
247
|
+
const query = limit ? "SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?" : "SELECT * FROM events WHERE frame_id = ? ORDER BY seq ASC";
|
|
248
|
+
const params = limit ? [frameId, limit] : [frameId];
|
|
249
|
+
const rows = this.db.prepare(query).all(...params);
|
|
250
|
+
return rows.map((row) => ({
|
|
251
|
+
...row,
|
|
252
|
+
payload: JSON.parse(row.payload)
|
|
253
|
+
}));
|
|
254
|
+
} catch (error) {
|
|
255
|
+
throw new DatabaseError(
|
|
256
|
+
`Failed to get events for frame: ${frameId}`,
|
|
257
|
+
ErrorCode.DB_QUERY_FAILED,
|
|
258
|
+
{ frameId, limit, operation: "getFrameEvents" },
|
|
259
|
+
error instanceof Error ? error : void 0
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get next event sequence number
|
|
265
|
+
*/
|
|
266
|
+
getNextEventSequence(frameId) {
|
|
267
|
+
try {
|
|
268
|
+
const result = this.db.prepare("SELECT MAX(seq) as max_seq FROM events WHERE frame_id = ?").get(frameId);
|
|
269
|
+
return (result.max_seq || 0) + 1;
|
|
270
|
+
} catch (error) {
|
|
271
|
+
throw new DatabaseError(
|
|
272
|
+
`Failed to get next event sequence for frame: ${frameId}`,
|
|
273
|
+
ErrorCode.DB_QUERY_FAILED,
|
|
274
|
+
{ frameId, operation: "getNextEventSequence" },
|
|
275
|
+
error instanceof Error ? error : void 0
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Insert anchor
|
|
281
|
+
*/
|
|
282
|
+
insertAnchor(anchor) {
|
|
283
|
+
try {
|
|
284
|
+
const stmt = this.db.prepare(`
|
|
285
|
+
INSERT INTO anchors (anchor_id, frame_id, type, text, priority, metadata)
|
|
286
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
287
|
+
`);
|
|
288
|
+
const result = stmt.run(
|
|
289
|
+
anchor.anchor_id,
|
|
290
|
+
anchor.frame_id,
|
|
291
|
+
anchor.type,
|
|
292
|
+
anchor.text,
|
|
293
|
+
anchor.priority,
|
|
294
|
+
JSON.stringify(anchor.metadata)
|
|
295
|
+
);
|
|
296
|
+
if (result.changes === 0) {
|
|
297
|
+
throw new Error("Anchor insertion failed");
|
|
298
|
+
}
|
|
299
|
+
const createdAnchor = this.db.prepare("SELECT * FROM anchors WHERE anchor_id = ?").get(anchor.anchor_id);
|
|
300
|
+
return {
|
|
301
|
+
...createdAnchor,
|
|
302
|
+
metadata: JSON.parse(createdAnchor.metadata || "{}")
|
|
303
|
+
};
|
|
304
|
+
} catch (error) {
|
|
305
|
+
throw new DatabaseError(
|
|
306
|
+
`Failed to insert anchor: ${anchor.anchor_id}`,
|
|
307
|
+
ErrorCode.DB_INSERT_FAILED,
|
|
308
|
+
{ anchorId: anchor.anchor_id, frameId: anchor.frame_id, operation: "insertAnchor" },
|
|
309
|
+
error instanceof Error ? error : void 0
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get anchors for a frame
|
|
315
|
+
*/
|
|
316
|
+
getFrameAnchors(frameId) {
|
|
317
|
+
try {
|
|
318
|
+
const rows = this.db.prepare("SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC").all(frameId);
|
|
319
|
+
return rows.map((row) => ({
|
|
320
|
+
...row,
|
|
321
|
+
metadata: JSON.parse(row.metadata || "{}")
|
|
322
|
+
}));
|
|
323
|
+
} catch (error) {
|
|
324
|
+
throw new DatabaseError(
|
|
325
|
+
`Failed to get anchors for frame: ${frameId}`,
|
|
326
|
+
ErrorCode.DB_QUERY_FAILED,
|
|
327
|
+
{ frameId, operation: "getFrameAnchors" },
|
|
328
|
+
error instanceof Error ? error : void 0
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Delete frame and all related data
|
|
334
|
+
*/
|
|
335
|
+
deleteFrame(frameId) {
|
|
336
|
+
try {
|
|
337
|
+
this.db.prepare("DELETE FROM anchors WHERE frame_id = ?").run(frameId);
|
|
338
|
+
this.db.prepare("DELETE FROM events WHERE frame_id = ?").run(frameId);
|
|
339
|
+
this.db.prepare("DELETE FROM frames WHERE frame_id = ?").run(frameId);
|
|
340
|
+
logger.info("Frame deleted", { frameId });
|
|
341
|
+
} catch (error) {
|
|
342
|
+
throw new DatabaseError(
|
|
343
|
+
`Failed to delete frame: ${frameId}`,
|
|
344
|
+
ErrorCode.DB_DELETE_FAILED,
|
|
345
|
+
{ frameId, operation: "deleteFrame" },
|
|
346
|
+
error instanceof Error ? error : void 0
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get database statistics
|
|
352
|
+
*/
|
|
353
|
+
getStatistics() {
|
|
354
|
+
try {
|
|
355
|
+
const frameCount = this.db.prepare("SELECT COUNT(*) as count FROM frames").get();
|
|
356
|
+
const eventCount = this.db.prepare("SELECT COUNT(*) as count FROM events").get();
|
|
357
|
+
const anchorCount = this.db.prepare("SELECT COUNT(*) as count FROM anchors").get();
|
|
358
|
+
const activeFrames = this.db.prepare("SELECT COUNT(*) as count FROM frames WHERE state = 'active'").get();
|
|
359
|
+
return {
|
|
360
|
+
totalFrames: frameCount.count,
|
|
361
|
+
totalEvents: eventCount.count,
|
|
362
|
+
totalAnchors: anchorCount.count,
|
|
363
|
+
activeFrames: activeFrames.count
|
|
364
|
+
};
|
|
365
|
+
} catch (error) {
|
|
366
|
+
logger.warn("Failed to get database statistics", {
|
|
367
|
+
error: error instanceof Error ? error.message : String(error)
|
|
368
|
+
});
|
|
369
|
+
return {};
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
export {
|
|
374
|
+
FrameDatabase
|
|
375
|
+
};
|
|
376
|
+
//# sourceMappingURL=frame-database.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/context/frame-database.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Frame Database Operations\n * Handles all database interactions for frames, events, and anchors\n */\n\nimport Database from 'better-sqlite3';\nimport { Frame, Event, Anchor } from './frame-types.js';\nimport { logger } from '../monitoring/logger.js';\nimport { DatabaseError, ErrorCode } from '../errors/index.js';\n\nexport class FrameDatabase {\n constructor(private db: Database.Database) {}\n\n /**\n * Initialize database schema\n */\n initSchema(): void {\n try {\n // Enable WAL mode for better concurrency\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('synchronous = NORMAL');\n\n // Create frames table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS frames (\n frame_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n parent_frame_id TEXT,\n depth INTEGER NOT NULL DEFAULT 0,\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n state TEXT NOT NULL DEFAULT 'active',\n inputs TEXT DEFAULT '{}',\n outputs TEXT DEFAULT '{}',\n digest_text TEXT,\n digest_json TEXT DEFAULT '{}',\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n closed_at INTEGER,\n FOREIGN KEY (parent_frame_id) REFERENCES frames(frame_id)\n );\n `);\n\n // Create events table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n event_type TEXT NOT NULL,\n payload TEXT NOT NULL DEFAULT '{}',\n ts INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n FOREIGN KEY (frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE\n );\n `);\n\n // Create anchors table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS anchors (\n anchor_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n priority INTEGER NOT NULL DEFAULT 5,\n metadata TEXT DEFAULT '{}',\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n FOREIGN KEY (frame_id) REFERENCES frames(frame_id) ON DELETE CASCADE\n );\n `);\n\n // Create indexes for performance\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_frames_project_state ON frames(project_id, state);\n CREATE INDEX IF NOT EXISTS idx_frames_parent ON frames(parent_frame_id);\n CREATE INDEX IF NOT EXISTS idx_events_frame_seq ON events(frame_id, seq);\n CREATE INDEX IF NOT EXISTS idx_anchors_frame_priority ON anchors(frame_id, priority DESC);\n `);\n\n logger.info('Frame database schema initialized');\n } catch (error) {\n throw new DatabaseError(\n 'Failed to initialize frame database schema',\n ErrorCode.DB_SCHEMA_ERROR,\n { operation: 'initSchema' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Insert new frame\n */\n insertFrame(frame: Omit<Frame, 'created_at' | 'closed_at'>): Frame {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO frames (frame_id, run_id, project_id, parent_frame_id, depth, type, name, state, inputs, outputs, digest_json)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const result = stmt.run(\n frame.frame_id,\n frame.run_id,\n frame.project_id,\n frame.parent_frame_id || null,\n frame.depth,\n frame.type,\n frame.name,\n frame.state,\n JSON.stringify(frame.inputs),\n JSON.stringify(frame.outputs),\n JSON.stringify(frame.digest_json)\n );\n\n if (result.changes === 0) {\n throw new Error('Frame insertion failed - no rows affected');\n }\n\n // Return the created frame with timestamp\n const createdFrame = this.getFrame(frame.frame_id);\n if (!createdFrame) {\n throw new Error('Failed to retrieve created frame');\n }\n\n return createdFrame;\n } catch (error) {\n throw new DatabaseError(\n `Failed to insert frame: ${frame.frame_id}`,\n ErrorCode.DB_INSERT_FAILED,\n {\n frameId: frame.frame_id,\n frameName: frame.name,\n operation: 'insertFrame',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get frame by ID\n */\n getFrame(frameId: string): Frame | undefined {\n try {\n const row = this.db\n .prepare('SELECT * FROM frames WHERE frame_id = ?')\n .get(frameId) as any;\n\n if (!row) return undefined;\n\n return {\n ...row,\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n };\n } catch (error) {\n throw new DatabaseError(\n `Failed to get frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n { frameId, operation: 'getFrame' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Update frame state and outputs\n */\n updateFrame(frameId: string, updates: Partial<Frame>): void {\n try {\n const setClauses: string[] = [];\n const values: any[] = [];\n\n if (updates.state !== undefined) {\n setClauses.push('state = ?');\n values.push(updates.state);\n }\n\n if (updates.outputs !== undefined) {\n setClauses.push('outputs = ?');\n values.push(JSON.stringify(updates.outputs));\n }\n\n if (updates.digest_text !== undefined) {\n setClauses.push('digest_text = ?');\n values.push(updates.digest_text);\n }\n\n if (updates.digest_json !== undefined) {\n setClauses.push('digest_json = ?');\n values.push(JSON.stringify(updates.digest_json));\n }\n\n if (updates.closed_at !== undefined) {\n setClauses.push('closed_at = ?');\n values.push(updates.closed_at);\n }\n\n if (setClauses.length === 0) {\n return; // No updates to apply\n }\n\n values.push(frameId);\n\n const stmt = this.db.prepare(`\n UPDATE frames SET ${setClauses.join(', ')} WHERE frame_id = ?\n `);\n\n const result = stmt.run(...values);\n\n if (result.changes === 0) {\n throw new Error(`Frame not found: ${frameId}`);\n }\n } catch (error) {\n throw new DatabaseError(\n `Failed to update frame: ${frameId}`,\n ErrorCode.DB_UPDATE_FAILED,\n { frameId, updates, operation: 'updateFrame' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get frames by project and state\n */\n getFramesByProject(projectId: string, state?: 'active' | 'closed'): Frame[] {\n try {\n const query = state \n ? 'SELECT * FROM frames WHERE project_id = ? AND state = ? ORDER BY created_at'\n : 'SELECT * FROM frames WHERE project_id = ? ORDER BY created_at';\n \n const params = state ? [projectId, state] : [projectId];\n const rows = this.db.prepare(query).all(...params) as any[];\n\n return rows.map(row => ({\n ...row,\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n }));\n } catch (error) {\n throw new DatabaseError(\n `Failed to get frames for project: ${projectId}`,\n ErrorCode.DB_QUERY_FAILED,\n { projectId, state, operation: 'getFramesByProject' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Insert event\n */\n insertEvent(event: Omit<Event, 'ts'>): Event {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO events (event_id, frame_id, run_id, seq, event_type, payload)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const result = stmt.run(\n event.event_id,\n event.frame_id,\n event.run_id,\n event.seq,\n event.event_type,\n JSON.stringify(event.payload)\n );\n\n if (result.changes === 0) {\n throw new Error('Event insertion failed');\n }\n\n // Return the created event with timestamp\n const createdEvent = this.db\n .prepare('SELECT * FROM events WHERE event_id = ?')\n .get(event.event_id) as any;\n\n return {\n ...createdEvent,\n payload: JSON.parse(createdEvent.payload),\n };\n } catch (error) {\n throw new DatabaseError(\n `Failed to insert event: ${event.event_id}`,\n ErrorCode.DB_INSERT_FAILED,\n { eventId: event.event_id, frameId: event.frame_id, operation: 'insertEvent' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get events for a frame\n */\n getFrameEvents(frameId: string, limit?: number): Event[] {\n try {\n const query = limit\n ? 'SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?'\n : 'SELECT * FROM events WHERE frame_id = ? ORDER BY seq ASC';\n\n const params = limit ? [frameId, limit] : [frameId];\n const rows = this.db.prepare(query).all(...params) as any[];\n\n return rows.map(row => ({\n ...row,\n payload: JSON.parse(row.payload),\n }));\n } catch (error) {\n throw new DatabaseError(\n `Failed to get events for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n { frameId, limit, operation: 'getFrameEvents' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get next event sequence number\n */\n getNextEventSequence(frameId: string): number {\n try {\n const result = this.db\n .prepare('SELECT MAX(seq) as max_seq FROM events WHERE frame_id = ?')\n .get(frameId) as { max_seq: number | null };\n\n return (result.max_seq || 0) + 1;\n } catch (error) {\n throw new DatabaseError(\n `Failed to get next event sequence for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n { frameId, operation: 'getNextEventSequence' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Insert anchor\n */\n insertAnchor(anchor: Omit<Anchor, 'created_at'>): Anchor {\n try {\n const stmt = this.db.prepare(`\n INSERT INTO anchors (anchor_id, frame_id, type, text, priority, metadata)\n VALUES (?, ?, ?, ?, ?, ?)\n `);\n\n const result = stmt.run(\n anchor.anchor_id,\n anchor.frame_id,\n anchor.type,\n anchor.text,\n anchor.priority,\n JSON.stringify(anchor.metadata)\n );\n\n if (result.changes === 0) {\n throw new Error('Anchor insertion failed');\n }\n\n // Return the created anchor with timestamp\n const createdAnchor = this.db\n .prepare('SELECT * FROM anchors WHERE anchor_id = ?')\n .get(anchor.anchor_id) as any;\n\n return {\n ...createdAnchor,\n metadata: JSON.parse(createdAnchor.metadata || '{}'),\n };\n } catch (error) {\n throw new DatabaseError(\n `Failed to insert anchor: ${anchor.anchor_id}`,\n ErrorCode.DB_INSERT_FAILED,\n { anchorId: anchor.anchor_id, frameId: anchor.frame_id, operation: 'insertAnchor' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get anchors for a frame\n */\n getFrameAnchors(frameId: string): Anchor[] {\n try {\n const rows = this.db\n .prepare('SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC')\n .all(frameId) as any[];\n\n return rows.map(row => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n } catch (error) {\n throw new DatabaseError(\n `Failed to get anchors for frame: ${frameId}`,\n ErrorCode.DB_QUERY_FAILED,\n { frameId, operation: 'getFrameAnchors' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Delete frame and all related data\n */\n deleteFrame(frameId: string): void {\n try {\n // Delete in order due to foreign keys\n this.db.prepare('DELETE FROM anchors WHERE frame_id = ?').run(frameId);\n this.db.prepare('DELETE FROM events WHERE frame_id = ?').run(frameId);\n this.db.prepare('DELETE FROM frames WHERE frame_id = ?').run(frameId);\n\n logger.info('Frame deleted', { frameId });\n } catch (error) {\n throw new DatabaseError(\n `Failed to delete frame: ${frameId}`,\n ErrorCode.DB_DELETE_FAILED,\n { frameId, operation: 'deleteFrame' },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get database statistics\n */\n getStatistics(): Record<string, number> {\n try {\n const frameCount = this.db.prepare('SELECT COUNT(*) as count FROM frames').get() as { count: number };\n const eventCount = this.db.prepare('SELECT COUNT(*) as count FROM events').get() as { count: number };\n const anchorCount = this.db.prepare('SELECT COUNT(*) as count FROM anchors').get() as { count: number };\n const activeFrames = this.db.prepare(\"SELECT COUNT(*) as count FROM frames WHERE state = 'active'\").get() as { count: number };\n\n return {\n totalFrames: frameCount.count,\n totalEvents: eventCount.count,\n totalAnchors: anchorCount.count,\n activeFrames: activeFrames.count,\n };\n } catch (error) {\n logger.warn('Failed to get database statistics', {\n error: error instanceof Error ? error.message : String(error)\n });\n return {};\n }\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { logger } from "../monitoring/logger.js";
|
|
2
|
+
class FrameDigestGenerator {
|
|
3
|
+
constructor(frameDb) {
|
|
4
|
+
this.frameDb = frameDb;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Generate digest for a frame
|
|
8
|
+
*/
|
|
9
|
+
generateDigest(frameId) {
|
|
10
|
+
try {
|
|
11
|
+
const frame = this.frameDb.getFrame(frameId);
|
|
12
|
+
if (!frame) {
|
|
13
|
+
throw new Error(`Frame not found: ${frameId}`);
|
|
14
|
+
}
|
|
15
|
+
const events = this.frameDb.getFrameEvents(frameId);
|
|
16
|
+
const anchors = this.frameDb.getFrameAnchors(frameId);
|
|
17
|
+
const text = this.generateTextDigest(frame, events, anchors);
|
|
18
|
+
const structured = this.generateStructuredDigest(frame, events, anchors);
|
|
19
|
+
return { text, structured };
|
|
20
|
+
} catch (error) {
|
|
21
|
+
logger.error("Failed to generate frame digest", { frameId, error });
|
|
22
|
+
return {
|
|
23
|
+
text: `Error generating digest for frame ${frameId}`,
|
|
24
|
+
structured: { error: error.message }
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate text summary of frame
|
|
30
|
+
*/
|
|
31
|
+
generateTextDigest(frame, events, anchors) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
lines.push(`Frame: ${frame.name} (${frame.type})`);
|
|
34
|
+
lines.push(`Duration: ${this.formatDuration(frame.created_at, frame.closed_at)}`);
|
|
35
|
+
lines.push("");
|
|
36
|
+
if (frame.inputs.goals) {
|
|
37
|
+
lines.push(`Goals: ${frame.inputs.goals}`);
|
|
38
|
+
}
|
|
39
|
+
if (frame.inputs.constraints && frame.inputs.constraints.length > 0) {
|
|
40
|
+
lines.push(`Constraints: ${frame.inputs.constraints.join(", ")}`);
|
|
41
|
+
}
|
|
42
|
+
const importantAnchors = anchors.filter((a) => a.priority >= 7).sort((a, b) => b.priority - a.priority);
|
|
43
|
+
if (importantAnchors.length > 0) {
|
|
44
|
+
lines.push("");
|
|
45
|
+
lines.push("Key Decisions & Facts:");
|
|
46
|
+
importantAnchors.forEach((anchor) => {
|
|
47
|
+
lines.push(`- ${anchor.type}: ${anchor.text}`);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const eventSummary = this.summarizeEvents(events);
|
|
51
|
+
if (eventSummary.length > 0) {
|
|
52
|
+
lines.push("");
|
|
53
|
+
lines.push("Activity Summary:");
|
|
54
|
+
eventSummary.forEach((summary) => {
|
|
55
|
+
lines.push(`- ${summary}`);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (frame.outputs && Object.keys(frame.outputs).length > 0) {
|
|
59
|
+
lines.push("");
|
|
60
|
+
lines.push("Outputs:");
|
|
61
|
+
Object.entries(frame.outputs).forEach(([key, value]) => {
|
|
62
|
+
lines.push(`- ${key}: ${this.formatValue(value)}`);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Generate structured digest data
|
|
69
|
+
*/
|
|
70
|
+
generateStructuredDigest(frame, events, anchors) {
|
|
71
|
+
const eventsByType = this.groupEventsByType(events);
|
|
72
|
+
const anchorsByType = this.groupAnchorsByType(anchors);
|
|
73
|
+
return {
|
|
74
|
+
frameId: frame.frame_id,
|
|
75
|
+
frameName: frame.name,
|
|
76
|
+
frameType: frame.type,
|
|
77
|
+
duration: {
|
|
78
|
+
startTime: frame.created_at,
|
|
79
|
+
endTime: frame.closed_at,
|
|
80
|
+
durationMs: frame.closed_at ? (frame.closed_at - frame.created_at) * 1e3 : null
|
|
81
|
+
},
|
|
82
|
+
activity: {
|
|
83
|
+
totalEvents: events.length,
|
|
84
|
+
eventsByType,
|
|
85
|
+
eventTimeline: events.slice(-10).map((e) => ({
|
|
86
|
+
type: e.event_type,
|
|
87
|
+
timestamp: e.ts,
|
|
88
|
+
summary: this.summarizeEvent(e)
|
|
89
|
+
}))
|
|
90
|
+
},
|
|
91
|
+
knowledge: {
|
|
92
|
+
totalAnchors: anchors.length,
|
|
93
|
+
anchorsByType,
|
|
94
|
+
keyDecisions: anchors.filter((a) => a.type === "DECISION" && a.priority >= 7).map((a) => a.text),
|
|
95
|
+
constraints: anchors.filter((a) => a.type === "CONSTRAINT").map((a) => a.text),
|
|
96
|
+
risks: anchors.filter((a) => a.type === "RISK").map((a) => a.text)
|
|
97
|
+
},
|
|
98
|
+
outcomes: {
|
|
99
|
+
outputs: frame.outputs,
|
|
100
|
+
success: frame.state === "closed" && !this.hasErrorEvents(events),
|
|
101
|
+
artifacts: this.extractArtifacts(events)
|
|
102
|
+
},
|
|
103
|
+
metadata: {
|
|
104
|
+
projectId: frame.project_id,
|
|
105
|
+
runId: frame.run_id,
|
|
106
|
+
parentFrameId: frame.parent_frame_id,
|
|
107
|
+
depth: frame.depth
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Summarize events into readable format
|
|
113
|
+
*/
|
|
114
|
+
summarizeEvents(events) {
|
|
115
|
+
const summaries = [];
|
|
116
|
+
const eventsByType = this.groupEventsByType(events);
|
|
117
|
+
if (eventsByType.tool_call && eventsByType.tool_call.length > 0) {
|
|
118
|
+
const toolCounts = this.countTools(eventsByType.tool_call);
|
|
119
|
+
const toolSummary = Object.entries(toolCounts).map(([tool, count]) => `${tool} (${count})`).join(", ");
|
|
120
|
+
summaries.push(`Tool calls: ${toolSummary}`);
|
|
121
|
+
}
|
|
122
|
+
if (eventsByType.decision && eventsByType.decision.length > 0) {
|
|
123
|
+
summaries.push(`Made ${eventsByType.decision.length} decisions`);
|
|
124
|
+
}
|
|
125
|
+
if (eventsByType.observation && eventsByType.observation.length > 0) {
|
|
126
|
+
summaries.push(`Recorded ${eventsByType.observation.length} observations`);
|
|
127
|
+
}
|
|
128
|
+
const errorEvents = events.filter(
|
|
129
|
+
(e) => e.payload.error || e.payload.status === "error"
|
|
130
|
+
);
|
|
131
|
+
if (errorEvents.length > 0) {
|
|
132
|
+
summaries.push(`Encountered ${errorEvents.length} errors`);
|
|
133
|
+
}
|
|
134
|
+
return summaries;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Group events by type
|
|
138
|
+
*/
|
|
139
|
+
groupEventsByType(events) {
|
|
140
|
+
const groups = {};
|
|
141
|
+
for (const event of events) {
|
|
142
|
+
if (!groups[event.event_type]) {
|
|
143
|
+
groups[event.event_type] = [];
|
|
144
|
+
}
|
|
145
|
+
groups[event.event_type].push(event);
|
|
146
|
+
}
|
|
147
|
+
return groups;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Group anchors by type
|
|
151
|
+
*/
|
|
152
|
+
groupAnchorsByType(anchors) {
|
|
153
|
+
const groups = {};
|
|
154
|
+
for (const anchor of anchors) {
|
|
155
|
+
groups[anchor.type] = (groups[anchor.type] || 0) + 1;
|
|
156
|
+
}
|
|
157
|
+
return groups;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Count tool usage
|
|
161
|
+
*/
|
|
162
|
+
countTools(toolEvents) {
|
|
163
|
+
const counts = {};
|
|
164
|
+
for (const event of toolEvents) {
|
|
165
|
+
const toolName = event.payload.tool_name || "unknown";
|
|
166
|
+
counts[toolName] = (counts[toolName] || 0) + 1;
|
|
167
|
+
}
|
|
168
|
+
return counts;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Check if events contain errors
|
|
172
|
+
*/
|
|
173
|
+
hasErrorEvents(events) {
|
|
174
|
+
return events.some(
|
|
175
|
+
(e) => e.payload.error || e.payload.status === "error"
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Extract artifacts from events
|
|
180
|
+
*/
|
|
181
|
+
extractArtifacts(events) {
|
|
182
|
+
const artifacts = [];
|
|
183
|
+
for (const event of events) {
|
|
184
|
+
if (event.event_type === "artifact" && event.payload.path) {
|
|
185
|
+
artifacts.push(event.payload.path);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return [...new Set(artifacts)];
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Summarize a single event
|
|
192
|
+
*/
|
|
193
|
+
summarizeEvent(event) {
|
|
194
|
+
switch (event.event_type) {
|
|
195
|
+
case "tool_call":
|
|
196
|
+
return `${event.payload.tool_name || "tool"}`;
|
|
197
|
+
case "decision":
|
|
198
|
+
return `${event.payload.type}: ${event.payload.content?.substring(0, 50)}...`;
|
|
199
|
+
case "observation":
|
|
200
|
+
return `${event.payload.content?.substring(0, 50)}...`;
|
|
201
|
+
case "artifact":
|
|
202
|
+
return `Created ${event.payload.path}`;
|
|
203
|
+
default:
|
|
204
|
+
return event.event_type;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Format duration
|
|
209
|
+
*/
|
|
210
|
+
formatDuration(startTime, endTime) {
|
|
211
|
+
if (!endTime) {
|
|
212
|
+
return "ongoing";
|
|
213
|
+
}
|
|
214
|
+
const durationMs = (endTime - startTime) * 1e3;
|
|
215
|
+
if (durationMs < 1e3) {
|
|
216
|
+
return `${durationMs.toFixed(0)}ms`;
|
|
217
|
+
} else if (durationMs < 6e4) {
|
|
218
|
+
return `${(durationMs / 1e3).toFixed(1)}s`;
|
|
219
|
+
} else {
|
|
220
|
+
return `${(durationMs / 6e4).toFixed(1)}m`;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Format value for display
|
|
225
|
+
*/
|
|
226
|
+
formatValue(value) {
|
|
227
|
+
if (typeof value === "string") {
|
|
228
|
+
return value.length > 100 ? `${value.substring(0, 100)}...` : value;
|
|
229
|
+
} else if (typeof value === "object") {
|
|
230
|
+
return JSON.stringify(value).substring(0, 100) + "...";
|
|
231
|
+
} else {
|
|
232
|
+
return String(value);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export {
|
|
237
|
+
FrameDigestGenerator
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=frame-digest.js.map
|