@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/features/tasks/pebbles-task-store.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Pebbles Task Storage\n * Git-native JSONL storage with SQLite cache for tasks\n */\n\nimport Database from 'better-sqlite3';\nimport { EventEmitter } from 'events';\nimport { createHash } from 'crypto';\nimport { appendFile, existsSync, mkdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { logger } from '../../core/monitoring/logger.js';\nimport {\n DatabaseError,\n TaskError,\n SystemError,\n ErrorCode,\n wrapError,\n createErrorHandler,\n} from '../../core/errors/index.js';\nimport { retry, withTimeout } from '../../core/errors/recovery.js';\nimport { StreamingJSONLParser } from '../../core/performance/streaming-jsonl-parser.js';\nimport { ContextCache } from '../../core/performance/context-cache.js';\n\nexport type TaskStatus =\n | 'pending'\n | 'in_progress'\n | 'completed'\n | 'blocked'\n | 'cancelled';\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';\n\nexport interface PebblesTask {\n id: string; // Content-hash based (merge-friendly)\n type: 'task_create' | 'task_update' | 'task_complete' | 'task_block';\n timestamp: number;\n parent_id?: string; // For subtasks\n frame_id: string; // Associated call stack frame\n\n // Task data\n title: string;\n description?: string;\n status: TaskStatus;\n priority: TaskPriority;\n assignee?: string;\n\n // Tracking\n created_at: number;\n started_at?: number;\n completed_at?: number;\n estimated_effort?: number; // Minutes\n actual_effort?: number;\n\n // Relationships\n depends_on: string[]; // Task IDs\n blocks: string[]; // Task IDs this blocks\n tags: string[]; // For filtering\n\n // Integration hooks (for Linear phase)\n external_refs?: {\n linear?: { id: string; url: string };\n github?: { issue: number; url: string };\n };\n\n // Context relevance\n context_score?: number; // For intelligent assembly\n last_accessed?: number;\n}\n\nexport interface TaskMetrics {\n total_tasks: number;\n by_status: Record<TaskStatus, number>;\n by_priority: Record<TaskPriority, number>;\n completion_rate: number;\n avg_effort_accuracy: number;\n blocked_tasks: number;\n overdue_tasks: number;\n}\n\nexport class PebblesTaskStore extends EventEmitter {\n private db: Database.Database;\n private projectRoot: string;\n private tasksFile: string;\n private cacheFile: string;\n private jsonlParser: StreamingJSONLParser;\n private taskCache: ContextCache<PebblesTask>;\n\n constructor(projectRoot: string, db: Database.Database) {\n super();\n this.projectRoot = projectRoot;\n this.db = db;\n\n // Ensure .stackmemory directory exists\n const stackmemoryDir = join(projectRoot, '.stackmemory');\n if (!existsSync(stackmemoryDir)) {\n mkdirSync(stackmemoryDir, { recursive: true });\n }\n\n this.tasksFile = join(stackmemoryDir, 'tasks.jsonl');\n this.cacheFile = join(stackmemoryDir, 'cache.db');\n\n // Initialize performance optimizations\n this.jsonlParser = new StreamingJSONLParser();\n this.taskCache = new ContextCache<PebblesTask>({\n maxSize: 10 * 1024 * 1024, // 10MB for tasks\n maxItems: 1000,\n defaultTTL: 3600000, // 1 hour\n });\n\n this.initializeCache();\n // Load existing tasks from JSONL synchronously\n this.loadFromJSONLSync();\n }\n\n private initializeCache() {\n const errorHandler = createErrorHandler({\n operation: 'initializeCache',\n projectRoot: this.projectRoot,\n });\n\n try {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS task_cache (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n parent_id TEXT,\n frame_id TEXT NOT NULL,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL,\n priority TEXT NOT NULL,\n assignee TEXT,\n created_at INTEGER NOT NULL,\n started_at INTEGER,\n completed_at INTEGER,\n estimated_effort INTEGER,\n actual_effort INTEGER,\n depends_on TEXT DEFAULT '[]',\n blocks TEXT DEFAULT '[]',\n tags TEXT DEFAULT '[]',\n external_refs TEXT DEFAULT '{}',\n context_score REAL DEFAULT 0.5,\n last_accessed INTEGER\n );\n \n CREATE INDEX IF NOT EXISTS idx_task_status ON task_cache(status);\n CREATE INDEX IF NOT EXISTS idx_task_priority ON task_cache(priority);\n CREATE INDEX IF NOT EXISTS idx_task_frame ON task_cache(frame_id);\n CREATE INDEX IF NOT EXISTS idx_task_timestamp ON task_cache(timestamp);\n CREATE INDEX IF NOT EXISTS idx_task_parent ON task_cache(parent_id);\n `);\n } catch (error) {\n const dbError = errorHandler(error, {\n operation: 'initializeCache',\n schema: 'task_cache',\n });\n\n throw new DatabaseError(\n 'Failed to initialize task cache schema',\n ErrorCode.DB_MIGRATION_FAILED,\n {\n projectRoot: this.projectRoot,\n cacheFile: this.cacheFile,\n operation: 'initializeCache',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Load existing tasks from JSONL into SQLite cache (optimized)\n */\n private async loadFromJSONL() {\n if (!existsSync(this.tasksFile)) return;\n\n const errorHandler = createErrorHandler({\n operation: 'loadFromJSONL',\n tasksFile: this.tasksFile,\n });\n\n try {\n let loaded = 0;\n let errors = 0;\n\n // Use streaming parser for memory efficiency\n for await (const batch of this.jsonlParser.parseStream<PebblesTask>(\n this.tasksFile,\n {\n batchSize: 100,\n filter: (obj) => obj.type && obj.id && obj.title, // Basic validation\n onProgress: (count) => {\n if (count % 500 === 0) {\n logger.debug('Loading tasks progress', { loaded: count });\n }\n },\n }\n )) {\n for (const task of batch) {\n try {\n this.upsertToCache(task);\n // Add to in-memory cache for fast access\n this.taskCache.set(task.id, task, {\n ttl: 3600000, // 1 hour cache\n });\n loaded++;\n } catch (error) {\n errors++;\n logger.warn('Failed to cache task', {\n taskId: task.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n\n logger.info('Loaded tasks from JSONL', {\n loaded,\n errors,\n file: this.tasksFile,\n cacheStats: this.taskCache.getStats(),\n });\n } catch (error) {\n const systemError = errorHandler(error, {\n operation: 'loadFromJSONL',\n file: this.tasksFile,\n });\n\n throw new SystemError(\n 'Failed to load tasks from JSONL file',\n ErrorCode.INTERNAL_ERROR,\n {\n tasksFile: this.tasksFile,\n operation: 'loadFromJSONL',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Load existing tasks from JSONL synchronously (for constructor)\n */\n private loadFromJSONLSync() {\n if (!existsSync(this.tasksFile)) return;\n\n try {\n const content = readFileSync(this.tasksFile, 'utf-8');\n const lines = content.split('\\n').filter((line) => line.trim());\n\n let loaded = 0;\n let errors = 0;\n\n for (const line of lines) {\n try {\n const task = JSON.parse(line) as PebblesTask;\n\n // Basic validation\n if (task.type && task.id && task.title) {\n this.upsertToCache(task);\n // Add to in-memory cache for fast access\n this.taskCache.set(task.id, task, {\n ttl: 3600000, // 1 hour cache\n });\n loaded++;\n }\n } catch (error) {\n errors++;\n logger.warn('Failed to parse JSONL line', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n logger.info('Loaded tasks from JSONL', {\n loaded,\n errors,\n file: this.tasksFile,\n });\n } catch (error) {\n logger.error('Failed to load tasks from JSONL', error as Error);\n }\n }\n\n /**\n * Create a new task with content-hash ID\n */\n public createTask(options: {\n title: string;\n description?: string;\n priority?: TaskPriority;\n frameId: string;\n parentId?: string;\n dependsOn?: string[];\n tags?: string[];\n estimatedEffort?: number;\n assignee?: string;\n }): string {\n const now = Math.floor(Date.now() / 1000);\n\n // Create content for hash (ensures deterministic ID)\n const content = `${options.title}:${options.frameId}:${now}:${Math.random()}`;\n const id = this.generateTaskId(content);\n\n const task: PebblesTask = {\n id,\n type: 'task_create',\n timestamp: now,\n parent_id: options.parentId,\n frame_id: options.frameId,\n title: options.title,\n description: options.description,\n status: 'pending',\n priority: options.priority || 'medium',\n assignee: options.assignee,\n created_at: now,\n estimated_effort: options.estimatedEffort,\n depends_on: options.dependsOn || [],\n blocks: [],\n tags: options.tags || [],\n context_score: 0.5,\n };\n\n this.appendTask(task);\n this.emit('task:created', task);\n this.emit('sync:needed', 'task:created');\n return id;\n }\n\n /**\n * Update task status with new event\n */\n public updateTaskStatus(\n taskId: string,\n newStatus: TaskStatus,\n _reason?: string\n ): void {\n const existing = this.getTask(taskId);\n if (!existing) {\n throw new TaskError(\n `Task not found: ${taskId}`,\n ErrorCode.TASK_NOT_FOUND,\n {\n taskId,\n newStatus,\n operation: 'updateTaskStatus',\n }\n );\n }\n\n // Validate status transition\n if (existing.status === 'completed' && newStatus !== 'cancelled') {\n throw new TaskError(\n `Cannot change completed task status from ${existing.status} to ${newStatus}`,\n ErrorCode.TASK_INVALID_STATE,\n {\n taskId,\n currentStatus: existing.status,\n newStatus,\n operation: 'updateTaskStatus',\n }\n );\n }\n\n const now = Math.floor(Date.now() / 1000);\n const updates: Partial<PebblesTask> = {\n status: newStatus,\n timestamp: now,\n };\n\n // Automatic time tracking\n if (newStatus === 'in_progress' && existing.status === 'pending') {\n updates.started_at = now;\n updates.type = 'task_update';\n } else if (newStatus === 'completed' && existing.status === 'in_progress') {\n updates.completed_at = now;\n updates.type = 'task_complete';\n if (existing.started_at) {\n updates.actual_effort = Math.floor((now - existing.started_at) / 60); // Minutes\n }\n } else if (newStatus === 'blocked') {\n updates.type = 'task_block';\n }\n\n const updatedTask: PebblesTask = { ...existing, ...updates };\n this.appendTask(updatedTask);\n \n if (newStatus === 'completed') {\n this.emit('task:completed', updatedTask);\n }\n this.emit('sync:needed', 'task:updated');\n }\n\n /**\n * Add dependency relationship\n */\n public addDependency(taskId: string, dependsOnId: string): void {\n const task = this.getTask(taskId);\n const dependsOnTask = this.getTask(dependsOnId);\n\n if (!task) {\n throw new TaskError(\n `Task not found: ${taskId}`,\n ErrorCode.TASK_NOT_FOUND,\n {\n taskId,\n operation: 'addDependency',\n }\n );\n }\n\n if (!dependsOnTask) {\n throw new TaskError(\n `Dependency task not found: ${dependsOnId}`,\n ErrorCode.TASK_NOT_FOUND,\n {\n dependsOnId,\n taskId,\n operation: 'addDependency',\n }\n );\n }\n\n // Check for circular dependency\n if (this.wouldCreateCircularDependency(taskId, dependsOnId)) {\n throw new TaskError(\n `Adding dependency would create circular dependency: ${taskId} -> ${dependsOnId}`,\n ErrorCode.TASK_CIRCULAR_DEPENDENCY,\n {\n taskId,\n dependsOnId,\n operation: 'addDependency',\n }\n );\n }\n\n // Update task dependencies\n const updatedTask: PebblesTask = {\n ...task,\n depends_on: [...new Set([...task.depends_on, dependsOnId])],\n timestamp: Math.floor(Date.now() / 1000),\n type: 'task_update',\n };\n\n // Update blocking task\n const updatedBlockingTask: PebblesTask = {\n ...dependsOnTask,\n blocks: [...new Set([...dependsOnTask.blocks, taskId])],\n timestamp: Math.floor(Date.now() / 1000),\n type: 'task_update',\n };\n\n this.appendTask(updatedTask);\n this.appendTask(updatedBlockingTask);\n }\n\n /**\n * Get current active tasks\n */\n public getActiveTasks(frameId?: string): PebblesTask[] {\n try {\n let query = `\n SELECT * FROM task_cache \n WHERE status IN ('pending', 'in_progress')\n `;\n const params: any[] = [];\n\n if (frameId) {\n query += ` AND frame_id = ?`;\n params.push(frameId);\n }\n\n query += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows = this.db.prepare(query).all(...params) as any[];\n return this.hydrateTasks(rows);\n } catch (error) {\n throw new DatabaseError(\n 'Failed to get active tasks',\n ErrorCode.DB_QUERY_FAILED,\n {\n frameId,\n operation: 'getActiveTasks',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get task by ID (latest version)\n */\n public getTask(taskId: string): PebblesTask | undefined {\n try {\n const row = this.db\n .prepare(\n `\n SELECT * FROM task_cache WHERE id = ?\n `\n )\n .get(taskId) as any;\n\n return row ? this.hydrateTask(row) : undefined;\n } catch (error) {\n throw new DatabaseError(\n `Failed to get task: ${taskId}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n taskId,\n operation: 'getTask',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get tasks that are blocking other tasks\n */\n public getBlockingTasks(): PebblesTask[] {\n try {\n const rows = this.db\n .prepare(\n `\n SELECT * FROM task_cache \n WHERE JSON_ARRAY_LENGTH(blocks) > 0 \n AND status NOT IN ('completed', 'cancelled')\n ORDER BY priority DESC\n `\n )\n .all() as any[];\n\n return this.hydrateTasks(rows);\n } catch (error) {\n throw new DatabaseError(\n 'Failed to get blocking tasks',\n ErrorCode.DB_QUERY_FAILED,\n {\n operation: 'getBlockingTasks',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get metrics for current project\n */\n public getMetrics(): TaskMetrics {\n try {\n const statusCounts = this.db\n .prepare(\n `\n SELECT status, COUNT(*) as count \n FROM task_cache \n GROUP BY status\n `\n )\n .all() as { status: TaskStatus; count: number }[];\n\n const priorityCounts = this.db\n .prepare(\n `\n SELECT priority, COUNT(*) as count \n FROM task_cache \n GROUP BY priority \n `\n )\n .all() as { priority: TaskPriority; count: number }[];\n\n const totalTasks = statusCounts.reduce((sum, s) => sum + s.count, 0);\n const completedTasks =\n statusCounts.find((s) => s.status === 'completed')?.count || 0;\n const blockedTasks =\n statusCounts.find((s) => s.status === 'blocked')?.count || 0;\n\n // Calculate effort accuracy\n const effortRows = this.db\n .prepare(\n `\n SELECT estimated_effort, actual_effort \n FROM task_cache \n WHERE estimated_effort IS NOT NULL \n AND actual_effort IS NOT NULL\n `\n )\n .all() as { estimated_effort: number; actual_effort: number }[];\n\n let avgEffortAccuracy = 0;\n if (effortRows.length > 0) {\n const accuracies = effortRows.map(\n (r) =>\n 1 -\n Math.abs(r.estimated_effort - r.actual_effort) /\n Math.max(r.estimated_effort, 1)\n );\n avgEffortAccuracy =\n accuracies.reduce((sum, acc) => sum + acc, 0) / accuracies.length;\n }\n\n return {\n total_tasks: totalTasks,\n by_status: Object.fromEntries(\n statusCounts.map((s) => [s.status, s.count])\n ) as any,\n by_priority: Object.fromEntries(\n priorityCounts.map((p) => [p.priority, p.count])\n ) as any,\n completion_rate: totalTasks > 0 ? completedTasks / totalTasks : 0,\n avg_effort_accuracy: avgEffortAccuracy,\n blocked_tasks: blockedTasks,\n overdue_tasks: 0, // TODO: implement due dates\n };\n } catch (error) {\n throw new DatabaseError(\n 'Failed to get task metrics',\n ErrorCode.DB_QUERY_FAILED,\n {\n operation: 'getMetrics',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Export tasks for Linear integration (Phase 2)\n */\n public exportForLinear(): Array<{\n title: string;\n description?: string;\n priority: number;\n status: string;\n estimate?: number;\n dependencies: string[];\n }> {\n const tasks = this.db\n .prepare(\n `\n SELECT * FROM task_cache \n WHERE external_refs IS NULL OR JSON_EXTRACT(external_refs, '$.linear') IS NULL\n ORDER BY created_at ASC\n `\n )\n .all() as any[];\n\n return tasks.map((task) => ({\n title: task.title,\n description: task.description,\n priority: this.mapPriorityToLinear(task.priority),\n status: this.mapStatusToLinear(task.status),\n estimate: task.estimated_effort,\n dependencies: JSON.parse(task.depends_on || '[]'),\n }));\n }\n\n // Private methods\n private appendTask(task: PebblesTask) {\n try {\n // Append to JSONL file (git-tracked source of truth)\n const jsonLine = JSON.stringify(task) + '\\n';\n appendFile(this.tasksFile, jsonLine, (err) => {\n if (err) {\n logger.error(\n `Failed to append task ${task.id} to JSONL: ${err.message}`,\n err,\n {\n taskId: task.id,\n tasksFile: this.tasksFile,\n }\n );\n }\n });\n\n // Update SQLite cache (for fast queries) with retry logic\n retry(() => Promise.resolve(this.upsertToCache(task)), {\n maxAttempts: 3,\n initialDelay: 100,\n onRetry: (attempt, error) => {\n logger.warn(`Retrying task cache upsert (attempt ${attempt})`, {\n taskId: task.id,\n errorMessage:\n error instanceof Error ? error.message : String(error),\n });\n },\n }).catch((error) => {\n logger.error(\n 'Failed to upsert task to cache after retries',\n error instanceof Error ? error : new Error(String(error)),\n {\n taskId: task.id,\n }\n );\n throw error;\n });\n\n logger.info('Appended task', {\n id: task.id,\n type: task.type,\n title: task.title,\n status: task.status,\n });\n } catch (error) {\n throw new SystemError(\n `Failed to append task: ${task.id}`,\n ErrorCode.INTERNAL_ERROR,\n {\n taskId: task.id,\n operation: 'appendTask',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private upsertToCache(task: PebblesTask) {\n try {\n this.db\n .prepare(\n `\n INSERT OR REPLACE INTO task_cache (\n id, type, timestamp, parent_id, frame_id, title, description,\n status, priority, assignee, created_at, started_at, completed_at,\n estimated_effort, actual_effort, depends_on, blocks, tags,\n external_refs, context_score, last_accessed\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n task.id,\n task.type,\n task.timestamp,\n task.parent_id,\n task.frame_id,\n task.title,\n task.description,\n task.status,\n task.priority,\n task.assignee,\n task.created_at,\n task.started_at,\n task.completed_at,\n task.estimated_effort,\n task.actual_effort,\n JSON.stringify(task.depends_on),\n JSON.stringify(task.blocks),\n JSON.stringify(task.tags),\n JSON.stringify(task.external_refs || {}),\n task.context_score,\n task.last_accessed\n );\n } catch (error) {\n throw new DatabaseError(\n `Failed to upsert task to cache: ${task.id}`,\n ErrorCode.DB_QUERY_FAILED,\n {\n taskId: task.id,\n taskTitle: task.title,\n operation: 'upsertToCache',\n },\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private generateTaskId(content: string): string {\n const hash = createHash('sha256').update(content).digest('hex');\n return `tsk-${hash.substring(0, 8)}`;\n }\n\n private hydrateTask = (row: any): PebblesTask => ({\n ...row,\n depends_on: JSON.parse(row.depends_on || '[]'),\n blocks: JSON.parse(row.blocks || '[]'),\n tags: JSON.parse(row.tags || '[]'),\n external_refs: JSON.parse(row.external_refs || '{}'),\n });\n\n private hydrateTasks(rows: any[]): PebblesTask[] {\n return rows.map(this.hydrateTask);\n }\n\n private mapPriorityToLinear(priority: TaskPriority): number {\n const map = { low: 1, medium: 2, high: 3, urgent: 4 };\n return map[priority] || 2;\n }\n\n private mapStatusToLinear(status: TaskStatus): string {\n const map = {\n pending: 'Backlog',\n in_progress: 'In Progress',\n completed: 'Done',\n blocked: 'Blocked',\n cancelled: 'Cancelled',\n };\n return map[status] || 'Backlog';\n }\n\n /**\n * Check if adding a dependency would create a circular dependency\n */\n private wouldCreateCircularDependency(\n taskId: string,\n dependsOnId: string\n ): boolean {\n const visited = new Set<string>();\n const stack = [dependsOnId];\n\n while (stack.length > 0) {\n const currentId = stack.pop()!;\n\n if (currentId === taskId) {\n return true; // Found circular dependency\n }\n\n if (visited.has(currentId)) {\n continue;\n }\n\n visited.add(currentId);\n\n // Get dependencies of current task\n const currentTask = this.getTask(currentId);\n if (currentTask) {\n stack.push(...currentTask.depends_on);\n }\n }\n\n return false;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { logger } from "../../core/monitoring/logger.js";
|
|
2
|
+
class TaskAwareContextManager {
|
|
3
|
+
db;
|
|
4
|
+
frameManager;
|
|
5
|
+
projectId;
|
|
6
|
+
constructor(db, frameManager, projectId) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
this.frameManager = frameManager;
|
|
9
|
+
this.projectId = projectId;
|
|
10
|
+
this.initializeTaskSchema();
|
|
11
|
+
}
|
|
12
|
+
initializeTaskSchema() {
|
|
13
|
+
this.db.exec(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
15
|
+
task_id TEXT PRIMARY KEY,
|
|
16
|
+
frame_id TEXT NOT NULL,
|
|
17
|
+
anchor_id TEXT,
|
|
18
|
+
name TEXT NOT NULL,
|
|
19
|
+
description TEXT,
|
|
20
|
+
status TEXT DEFAULT 'pending',
|
|
21
|
+
priority TEXT DEFAULT 'medium',
|
|
22
|
+
parent_task_id TEXT,
|
|
23
|
+
depends_on TEXT DEFAULT '[]',
|
|
24
|
+
assigned_to TEXT,
|
|
25
|
+
estimated_effort INTEGER,
|
|
26
|
+
actual_effort INTEGER,
|
|
27
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
28
|
+
started_at INTEGER,
|
|
29
|
+
completed_at INTEGER,
|
|
30
|
+
blocked_reason TEXT,
|
|
31
|
+
context_tags TEXT DEFAULT '[]',
|
|
32
|
+
metadata TEXT DEFAULT '{}',
|
|
33
|
+
FOREIGN KEY(frame_id) REFERENCES frames(frame_id),
|
|
34
|
+
FOREIGN KEY(anchor_id) REFERENCES anchors(anchor_id),
|
|
35
|
+
FOREIGN KEY(parent_task_id) REFERENCES tasks(task_id)
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS task_dependencies (
|
|
39
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
40
|
+
task_id TEXT NOT NULL,
|
|
41
|
+
depends_on_task_id TEXT NOT NULL,
|
|
42
|
+
dependency_type TEXT DEFAULT 'blocks',
|
|
43
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
44
|
+
FOREIGN KEY(task_id) REFERENCES tasks(task_id),
|
|
45
|
+
FOREIGN KEY(depends_on_task_id) REFERENCES tasks(task_id)
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS context_access_log (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
request_id TEXT NOT NULL,
|
|
51
|
+
task_ids TEXT, -- JSON array of relevant task IDs
|
|
52
|
+
context_items TEXT, -- JSON array of included context items
|
|
53
|
+
relevance_scores TEXT, -- JSON object of item -> score mappings
|
|
54
|
+
total_tokens INTEGER,
|
|
55
|
+
query_hash TEXT,
|
|
56
|
+
timestamp INTEGER DEFAULT (unixepoch())
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_frame ON tasks(frame_id);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_task_deps ON task_dependencies(task_id);
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create task from TODO anchor or standalone
|
|
67
|
+
*/
|
|
68
|
+
createTask(options) {
|
|
69
|
+
const taskId = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
70
|
+
const frameId = options.frameId || this.frameManager.getCurrentFrameId();
|
|
71
|
+
if (!frameId) {
|
|
72
|
+
throw new Error("No active frame for task creation");
|
|
73
|
+
}
|
|
74
|
+
const task = {
|
|
75
|
+
task_id: taskId,
|
|
76
|
+
frame_id: frameId,
|
|
77
|
+
anchor_id: options.anchorId,
|
|
78
|
+
name: options.name,
|
|
79
|
+
description: options.description,
|
|
80
|
+
status: "pending",
|
|
81
|
+
priority: options.priority || "medium",
|
|
82
|
+
parent_task_id: options.parentTaskId,
|
|
83
|
+
depends_on: options.dependsOn || [],
|
|
84
|
+
estimated_effort: options.estimatedEffort,
|
|
85
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
86
|
+
context_tags: options.contextTags || [],
|
|
87
|
+
metadata: options.metadata || {}
|
|
88
|
+
};
|
|
89
|
+
this.db.prepare(
|
|
90
|
+
`
|
|
91
|
+
INSERT INTO tasks (
|
|
92
|
+
task_id, frame_id, anchor_id, name, description, status, priority,
|
|
93
|
+
parent_task_id, depends_on, estimated_effort, created_at, context_tags, metadata
|
|
94
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
95
|
+
`
|
|
96
|
+
).run(
|
|
97
|
+
task.task_id,
|
|
98
|
+
task.frame_id,
|
|
99
|
+
task.anchor_id,
|
|
100
|
+
task.name,
|
|
101
|
+
task.description,
|
|
102
|
+
task.status,
|
|
103
|
+
task.priority,
|
|
104
|
+
task.parent_task_id,
|
|
105
|
+
JSON.stringify(task.depends_on),
|
|
106
|
+
task.estimated_effort,
|
|
107
|
+
task.created_at,
|
|
108
|
+
JSON.stringify(task.context_tags),
|
|
109
|
+
JSON.stringify(task.metadata)
|
|
110
|
+
);
|
|
111
|
+
if (task.depends_on.length > 0) {
|
|
112
|
+
const dependencyStmt = this.db.prepare(`
|
|
113
|
+
INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (?, ?)
|
|
114
|
+
`);
|
|
115
|
+
task.depends_on.forEach((depTaskId) => {
|
|
116
|
+
dependencyStmt.run(taskId, depTaskId);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
this.frameManager.addEvent("decision", {
|
|
120
|
+
action: "create_task",
|
|
121
|
+
task_id: taskId,
|
|
122
|
+
name: task.name,
|
|
123
|
+
priority: task.priority
|
|
124
|
+
});
|
|
125
|
+
logger.info("Created task", { taskId, name: task.name, frameId });
|
|
126
|
+
return taskId;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Update task status with automatic time tracking
|
|
130
|
+
*/
|
|
131
|
+
updateTaskStatus(taskId, newStatus, reason) {
|
|
132
|
+
const task = this.getTask(taskId);
|
|
133
|
+
if (!task) throw new Error(`Task not found: ${taskId}`);
|
|
134
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
135
|
+
const updates = { status: newStatus };
|
|
136
|
+
if (newStatus === "in_progress" && task.status === "pending") {
|
|
137
|
+
updates.started_at = now;
|
|
138
|
+
} else if (newStatus === "completed" && task.status === "in_progress") {
|
|
139
|
+
updates.completed_at = now;
|
|
140
|
+
if (task.started_at) {
|
|
141
|
+
updates.actual_effort = now - task.started_at;
|
|
142
|
+
}
|
|
143
|
+
} else if (newStatus === "blocked") {
|
|
144
|
+
updates.blocked_reason = reason || "No reason provided";
|
|
145
|
+
}
|
|
146
|
+
const setClause = Object.keys(updates).map((key) => `${key} = ?`).join(", ");
|
|
147
|
+
const values = Object.values(updates);
|
|
148
|
+
this.db.prepare(`UPDATE tasks SET ${setClause} WHERE task_id = ?`).run(...values, taskId);
|
|
149
|
+
this.frameManager.addEvent("observation", {
|
|
150
|
+
action: "task_status_change",
|
|
151
|
+
task_id: taskId,
|
|
152
|
+
old_status: task.status,
|
|
153
|
+
new_status: newStatus,
|
|
154
|
+
reason
|
|
155
|
+
});
|
|
156
|
+
logger.info("Updated task status", {
|
|
157
|
+
taskId,
|
|
158
|
+
oldStatus: task.status,
|
|
159
|
+
newStatus
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Assemble context optimized for active tasks and query
|
|
164
|
+
*/
|
|
165
|
+
assembleTaskAwareContext(request) {
|
|
166
|
+
const startTime = Date.now();
|
|
167
|
+
const activeTasks = this.getActiveTasks(request.taskFocus);
|
|
168
|
+
const blockedTasks = this.getBlockedTasks();
|
|
169
|
+
const contextItems = this.selectRelevantContext(activeTasks, request);
|
|
170
|
+
const { context, totalTokens, relevanceScores } = this.buildContextString(
|
|
171
|
+
contextItems,
|
|
172
|
+
activeTasks,
|
|
173
|
+
request.maxTokens || 4e3
|
|
174
|
+
);
|
|
175
|
+
this.logContextAccess({
|
|
176
|
+
taskIds: activeTasks.map((t) => t.task_id),
|
|
177
|
+
contextItems: contextItems.map((item) => item.id),
|
|
178
|
+
relevanceScores,
|
|
179
|
+
totalTokens,
|
|
180
|
+
query: request.query || ""
|
|
181
|
+
});
|
|
182
|
+
const metadata = {
|
|
183
|
+
includedTasks: activeTasks,
|
|
184
|
+
contextSources: contextItems.map((item) => `${item.type}:${item.id}`),
|
|
185
|
+
totalTokens,
|
|
186
|
+
relevanceScores
|
|
187
|
+
};
|
|
188
|
+
logger.info("Assembled task-aware context", {
|
|
189
|
+
activeTasks: activeTasks.length,
|
|
190
|
+
blockedTasks: blockedTasks.length,
|
|
191
|
+
contextItems: contextItems.length,
|
|
192
|
+
totalTokens,
|
|
193
|
+
assemblyTimeMs: Date.now() - startTime
|
|
194
|
+
});
|
|
195
|
+
return { context, metadata };
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get tasks that are currently active or should be in context
|
|
199
|
+
*/
|
|
200
|
+
getActiveTasks(taskFocus) {
|
|
201
|
+
let query = `
|
|
202
|
+
SELECT * FROM tasks
|
|
203
|
+
WHERE status IN ('in_progress', 'pending')
|
|
204
|
+
`;
|
|
205
|
+
let params = [];
|
|
206
|
+
if (taskFocus && taskFocus.length > 0) {
|
|
207
|
+
query += ` AND task_id IN (${taskFocus.map(() => "?").join(",")})`;
|
|
208
|
+
params = taskFocus;
|
|
209
|
+
}
|
|
210
|
+
query += ` ORDER BY priority DESC, created_at ASC`;
|
|
211
|
+
const rows = this.db.prepare(query).all(...params);
|
|
212
|
+
return this.hydrateTasks(rows);
|
|
213
|
+
}
|
|
214
|
+
getBlockedTasks() {
|
|
215
|
+
const rows = this.db.prepare(
|
|
216
|
+
`
|
|
217
|
+
SELECT * FROM tasks WHERE status = 'blocked' ORDER BY priority DESC
|
|
218
|
+
`
|
|
219
|
+
).all();
|
|
220
|
+
return this.hydrateTasks(rows);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Select context items relevant to active tasks
|
|
224
|
+
*/
|
|
225
|
+
selectRelevantContext(activeTasks, request) {
|
|
226
|
+
const contextItems = [];
|
|
227
|
+
const frameIds = [...new Set(activeTasks.map((t) => t.frame_id))];
|
|
228
|
+
frameIds.forEach((frameId) => {
|
|
229
|
+
const frame = this.frameManager.getFrame(frameId);
|
|
230
|
+
if (frame) {
|
|
231
|
+
const score = this.calculateFrameRelevance(
|
|
232
|
+
frame,
|
|
233
|
+
activeTasks,
|
|
234
|
+
request.query
|
|
235
|
+
);
|
|
236
|
+
contextItems.push({
|
|
237
|
+
id: frameId,
|
|
238
|
+
type: "frame",
|
|
239
|
+
content: `Frame: ${frame.name} (${frame.type})`,
|
|
240
|
+
relevanceScore: score,
|
|
241
|
+
tokenEstimate: frame.name.length + 20
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
const anchors = this.getRelevantAnchors(frameIds, request);
|
|
246
|
+
anchors.forEach((anchor) => {
|
|
247
|
+
const score = this.calculateAnchorRelevance(
|
|
248
|
+
anchor,
|
|
249
|
+
activeTasks,
|
|
250
|
+
request.query
|
|
251
|
+
);
|
|
252
|
+
contextItems.push({
|
|
253
|
+
id: anchor.anchor_id,
|
|
254
|
+
type: "anchor",
|
|
255
|
+
content: `${anchor.type}: ${anchor.text}`,
|
|
256
|
+
relevanceScore: score,
|
|
257
|
+
tokenEstimate: anchor.text.length + 10
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
if (request.includeHistory) {
|
|
261
|
+
frameIds.forEach((frameId) => {
|
|
262
|
+
const events = this.frameManager.getFrameEvents(frameId, 5);
|
|
263
|
+
events.forEach((event) => {
|
|
264
|
+
const score = this.calculateEventRelevance(
|
|
265
|
+
event,
|
|
266
|
+
activeTasks,
|
|
267
|
+
request.query
|
|
268
|
+
);
|
|
269
|
+
if (score > 0.3) {
|
|
270
|
+
contextItems.push({
|
|
271
|
+
id: event.event_id,
|
|
272
|
+
type: "event",
|
|
273
|
+
content: `Event: ${event.event_type}`,
|
|
274
|
+
relevanceScore: score,
|
|
275
|
+
tokenEstimate: 30
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
return contextItems.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
282
|
+
}
|
|
283
|
+
buildContextString(contextItems, activeTasks, maxTokens) {
|
|
284
|
+
let context = "# Active Task Context\n\n";
|
|
285
|
+
let totalTokens = 20;
|
|
286
|
+
const relevanceScores = {};
|
|
287
|
+
context += "## Current Tasks\n";
|
|
288
|
+
activeTasks.forEach((task) => {
|
|
289
|
+
const line = `- [${task.status.toUpperCase()}] ${task.name} (${task.priority})
|
|
290
|
+
`;
|
|
291
|
+
context += line;
|
|
292
|
+
totalTokens += line.length / 4;
|
|
293
|
+
relevanceScores[task.task_id] = 1;
|
|
294
|
+
});
|
|
295
|
+
context += "\n";
|
|
296
|
+
context += "## Relevant Context\n";
|
|
297
|
+
for (const item of contextItems) {
|
|
298
|
+
if (totalTokens + item.tokenEstimate > maxTokens) break;
|
|
299
|
+
context += `${item.content}
|
|
300
|
+
`;
|
|
301
|
+
totalTokens += item.tokenEstimate;
|
|
302
|
+
relevanceScores[item.id] = item.relevanceScore;
|
|
303
|
+
}
|
|
304
|
+
return { context, totalTokens, relevanceScores };
|
|
305
|
+
}
|
|
306
|
+
// Relevance scoring methods
|
|
307
|
+
calculateFrameRelevance(frame, activeTasks, query) {
|
|
308
|
+
let score = 0.5;
|
|
309
|
+
if (activeTasks.some((t) => t.frame_id === frame.frame_id)) {
|
|
310
|
+
score += 0.4;
|
|
311
|
+
}
|
|
312
|
+
if (query) {
|
|
313
|
+
const queryLower = query.toLowerCase();
|
|
314
|
+
if (frame.name.toLowerCase().includes(queryLower)) {
|
|
315
|
+
score += 0.3;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const ageHours = (Date.now() / 1e3 - frame.created_at) / 3600;
|
|
319
|
+
if (ageHours < 24) score += 0.2;
|
|
320
|
+
return Math.min(score, 1);
|
|
321
|
+
}
|
|
322
|
+
calculateAnchorRelevance(anchor, activeTasks, query) {
|
|
323
|
+
let score = 0.3;
|
|
324
|
+
if (anchor.type === "TODO") score += 0.4;
|
|
325
|
+
if (anchor.type === "DECISION") score += 0.3;
|
|
326
|
+
if (anchor.type === "CONSTRAINT") score += 0.2;
|
|
327
|
+
score += anchor.priority / 10 * 0.2;
|
|
328
|
+
if (query) {
|
|
329
|
+
const queryLower = query.toLowerCase();
|
|
330
|
+
if (anchor.text.toLowerCase().includes(queryLower)) {
|
|
331
|
+
score += 0.3;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return Math.min(score, 1);
|
|
335
|
+
}
|
|
336
|
+
calculateEventRelevance(event, _activeTasks, _query) {
|
|
337
|
+
let score = 0.1;
|
|
338
|
+
if (event.event_type === "decision") score += 0.4;
|
|
339
|
+
if (event.event_type === "tool_call") score += 0.3;
|
|
340
|
+
if (event.event_type === "observation") score += 0.2;
|
|
341
|
+
const ageHours = (Date.now() / 1e3 - event.ts) / 3600;
|
|
342
|
+
if (ageHours < 1) score += 0.3;
|
|
343
|
+
else if (ageHours < 6) score += 0.2;
|
|
344
|
+
return Math.min(score, 1);
|
|
345
|
+
}
|
|
346
|
+
// Helper methods
|
|
347
|
+
getTask(taskId) {
|
|
348
|
+
const row = this.db.prepare(`SELECT * FROM tasks WHERE task_id = ?`).get(taskId);
|
|
349
|
+
return row ? this.hydrateTask(row) : void 0;
|
|
350
|
+
}
|
|
351
|
+
getRelevantAnchors(frameIds, _request) {
|
|
352
|
+
if (frameIds.length === 0) return [];
|
|
353
|
+
const placeholders = frameIds.map(() => "?").join(",");
|
|
354
|
+
const rows = this.db.prepare(
|
|
355
|
+
`
|
|
356
|
+
SELECT * FROM anchors
|
|
357
|
+
WHERE frame_id IN (${placeholders})
|
|
358
|
+
ORDER BY priority DESC, created_at DESC
|
|
359
|
+
LIMIT 20
|
|
360
|
+
`
|
|
361
|
+
).all(...frameIds);
|
|
362
|
+
return rows.map((row) => ({
|
|
363
|
+
...row,
|
|
364
|
+
metadata: JSON.parse(row.metadata || "{}")
|
|
365
|
+
}));
|
|
366
|
+
}
|
|
367
|
+
hydrateTasks(rows) {
|
|
368
|
+
return rows.map(this.hydrateTask);
|
|
369
|
+
}
|
|
370
|
+
hydrateTask = (row) => ({
|
|
371
|
+
...row,
|
|
372
|
+
depends_on: JSON.parse(row.depends_on || "[]"),
|
|
373
|
+
context_tags: JSON.parse(row.context_tags || "[]"),
|
|
374
|
+
metadata: JSON.parse(row.metadata || "{}")
|
|
375
|
+
});
|
|
376
|
+
logContextAccess(data) {
|
|
377
|
+
const requestId = `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;
|
|
378
|
+
this.db.prepare(
|
|
379
|
+
`
|
|
380
|
+
INSERT INTO context_access_log (
|
|
381
|
+
request_id, task_ids, context_items, relevance_scores, total_tokens, query_hash
|
|
382
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
383
|
+
`
|
|
384
|
+
).run(
|
|
385
|
+
requestId,
|
|
386
|
+
JSON.stringify(data.taskIds),
|
|
387
|
+
JSON.stringify(data.contextItems),
|
|
388
|
+
JSON.stringify(data.relevanceScores),
|
|
389
|
+
data.totalTokens,
|
|
390
|
+
this.hashString(data.query)
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
hashString(str) {
|
|
394
|
+
let hash = 0;
|
|
395
|
+
for (let i = 0; i < str.length; i++) {
|
|
396
|
+
const char = str.charCodeAt(i);
|
|
397
|
+
hash = (hash << 5) - hash + char;
|
|
398
|
+
hash = hash & hash;
|
|
399
|
+
}
|
|
400
|
+
return hash.toString(16);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
export {
|
|
404
|
+
TaskAwareContextManager
|
|
405
|
+
};
|
|
406
|
+
//# sourceMappingURL=task-aware-context.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/features/tasks/task-aware-context.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Task-Aware Context Assembly\n * Intelligently selects context based on active tasks and their relationships\n */\n\nimport Database from 'better-sqlite3';\nimport {\n Frame,\n Anchor,\n Event,\n FrameManager,\n} from '../../core/context/frame-manager.js';\nimport { logger } from '../../core/monitoring/logger.js';\n\nexport type TaskStatus =\n | 'pending'\n | 'in_progress'\n | 'completed'\n | 'blocked'\n | 'cancelled';\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';\n\nexport interface Task {\n task_id: string;\n frame_id: string;\n anchor_id?: string; // Reference to TODO anchor if exists\n name: string;\n description?: string;\n status: TaskStatus;\n priority: TaskPriority;\n parent_task_id?: string;\n depends_on: string[]; // Task IDs this depends on\n assigned_to?: string; // For team contexts\n estimated_effort?: number; // In minutes\n actual_effort?: number;\n created_at: number;\n started_at?: number;\n completed_at?: number;\n blocked_reason?: string;\n context_tags: string[]; // For context relevance scoring\n metadata: Record<string, any>;\n}\n\nexport interface TaskContext {\n activeTasks: Task[];\n blockedTasks: Task[];\n relatedContext: {\n frames: Frame[];\n anchors: Anchor[];\n recentEvents: Event[];\n };\n contextScore: number; // Relevance score for current work\n}\n\nexport interface ContextRequest {\n query?: string;\n maxTokens?: number;\n taskFocus?: string[]; // Specific task IDs to focus on\n includeHistory?: boolean;\n priorityFilter?: TaskPriority[];\n}\n\nexport class TaskAwareContextManager {\n private db: Database.Database;\n private frameManager: FrameManager;\n private projectId: string;\n\n constructor(\n db: Database.Database,\n frameManager: FrameManager,\n projectId: string\n ) {\n this.db = db;\n this.frameManager = frameManager;\n this.projectId = projectId;\n this.initializeTaskSchema();\n }\n\n private initializeTaskSchema() {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS tasks (\n task_id TEXT PRIMARY KEY,\n frame_id TEXT NOT NULL,\n anchor_id TEXT,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT DEFAULT 'pending',\n priority TEXT DEFAULT 'medium',\n parent_task_id TEXT,\n depends_on TEXT DEFAULT '[]',\n assigned_to TEXT,\n estimated_effort INTEGER,\n actual_effort INTEGER,\n created_at INTEGER DEFAULT (unixepoch()),\n started_at INTEGER,\n completed_at INTEGER,\n blocked_reason TEXT,\n context_tags TEXT DEFAULT '[]',\n metadata TEXT DEFAULT '{}',\n FOREIGN KEY(frame_id) REFERENCES frames(frame_id),\n FOREIGN KEY(anchor_id) REFERENCES anchors(anchor_id),\n FOREIGN KEY(parent_task_id) REFERENCES tasks(task_id)\n );\n\n CREATE TABLE IF NOT EXISTS task_dependencies (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL,\n depends_on_task_id TEXT NOT NULL,\n dependency_type TEXT DEFAULT 'blocks',\n created_at INTEGER DEFAULT (unixepoch()),\n FOREIGN KEY(task_id) REFERENCES tasks(task_id),\n FOREIGN KEY(depends_on_task_id) REFERENCES tasks(task_id)\n );\n\n CREATE TABLE IF NOT EXISTS context_access_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n request_id TEXT NOT NULL,\n task_ids TEXT, -- JSON array of relevant task IDs\n context_items TEXT, -- JSON array of included context items\n relevance_scores TEXT, -- JSON object of item -> score mappings\n total_tokens INTEGER,\n query_hash TEXT,\n timestamp INTEGER DEFAULT (unixepoch())\n );\n\n CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\n CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);\n CREATE INDEX IF NOT EXISTS idx_tasks_frame ON tasks(frame_id);\n CREATE INDEX IF NOT EXISTS idx_task_deps ON task_dependencies(task_id);\n `);\n }\n\n /**\n * Create task from TODO anchor or standalone\n */\n public createTask(options: {\n name: string;\n description?: string;\n priority?: TaskPriority;\n frameId?: string;\n anchorId?: string;\n parentTaskId?: string;\n dependsOn?: string[];\n contextTags?: string[];\n estimatedEffort?: number;\n metadata?: Record<string, any>;\n }): string {\n const taskId = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const frameId = options.frameId || this.frameManager.getCurrentFrameId();\n\n if (!frameId) {\n throw new Error('No active frame for task creation');\n }\n\n const task: Omit<\n Task,\n 'started_at' | 'completed_at' | 'blocked_reason' | 'actual_effort'\n > = {\n task_id: taskId,\n frame_id: frameId,\n anchor_id: options.anchorId,\n name: options.name,\n description: options.description,\n status: 'pending',\n priority: options.priority || 'medium',\n parent_task_id: options.parentTaskId,\n depends_on: options.dependsOn || [],\n estimated_effort: options.estimatedEffort,\n created_at: Math.floor(Date.now() / 1000),\n context_tags: options.contextTags || [],\n metadata: options.metadata || {},\n };\n\n // Insert task\n this.db\n .prepare(\n `\n INSERT INTO tasks (\n task_id, frame_id, anchor_id, name, description, status, priority,\n parent_task_id, depends_on, estimated_effort, created_at, context_tags, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n task.task_id,\n task.frame_id,\n task.anchor_id,\n task.name,\n task.description,\n task.status,\n task.priority,\n task.parent_task_id,\n JSON.stringify(task.depends_on),\n task.estimated_effort,\n task.created_at,\n JSON.stringify(task.context_tags),\n JSON.stringify(task.metadata)\n );\n\n // Create dependency relationships\n if (task.depends_on.length > 0) {\n const dependencyStmt = this.db.prepare(`\n INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (?, ?)\n `);\n\n task.depends_on.forEach((depTaskId) => {\n dependencyStmt.run(taskId, depTaskId);\n });\n }\n\n // Log event\n this.frameManager.addEvent('decision', {\n action: 'create_task',\n task_id: taskId,\n name: task.name,\n priority: task.priority,\n });\n\n logger.info('Created task', { taskId, name: task.name, frameId });\n return taskId;\n }\n\n /**\n * Update task status with automatic time tracking\n */\n public updateTaskStatus(\n taskId: string,\n newStatus: TaskStatus,\n reason?: string\n ): void {\n const task = this.getTask(taskId);\n if (!task) throw new Error(`Task not found: ${taskId}`);\n\n const now = Math.floor(Date.now() / 1000);\n const updates: Record<string, any> = { status: newStatus };\n\n // Automatic time tracking\n if (newStatus === 'in_progress' && task.status === 'pending') {\n updates.started_at = now;\n } else if (newStatus === 'completed' && task.status === 'in_progress') {\n updates.completed_at = now;\n if (task.started_at) {\n updates.actual_effort = now - task.started_at;\n }\n } else if (newStatus === 'blocked') {\n updates.blocked_reason = reason || 'No reason provided';\n }\n\n // Build dynamic update query\n const setClause = Object.keys(updates)\n .map((key) => `${key} = ?`)\n .join(', ');\n const values = Object.values(updates);\n\n this.db\n .prepare(`UPDATE tasks SET ${setClause} WHERE task_id = ?`)\n .run(...values, taskId);\n\n // Log status change\n this.frameManager.addEvent('observation', {\n action: 'task_status_change',\n task_id: taskId,\n old_status: task.status,\n new_status: newStatus,\n reason,\n });\n\n logger.info('Updated task status', {\n taskId,\n oldStatus: task.status,\n newStatus,\n });\n }\n\n /**\n * Assemble context optimized for active tasks and query\n */\n public assembleTaskAwareContext(request: ContextRequest): {\n context: string;\n metadata: {\n includedTasks: Task[];\n contextSources: string[];\n totalTokens: number;\n relevanceScores: Record<string, number>;\n };\n } {\n const startTime = Date.now();\n\n // 1. Get active and relevant tasks\n const activeTasks = this.getActiveTasks(request.taskFocus);\n const blockedTasks = this.getBlockedTasks();\n\n // 2. Score and select relevant context\n const contextItems = this.selectRelevantContext(activeTasks, request);\n\n // 3. Assemble final context with smart ordering\n const { context, totalTokens, relevanceScores } = this.buildContextString(\n contextItems,\n activeTasks,\n request.maxTokens || 4000\n );\n\n // 4. Log context access for learning\n this.logContextAccess({\n taskIds: activeTasks.map((t) => t.task_id),\n contextItems: contextItems.map((item) => item.id),\n relevanceScores,\n totalTokens,\n query: request.query || '',\n });\n\n const metadata = {\n includedTasks: activeTasks,\n contextSources: contextItems.map((item) => `${item.type}:${item.id}`),\n totalTokens,\n relevanceScores,\n };\n\n logger.info('Assembled task-aware context', {\n activeTasks: activeTasks.length,\n blockedTasks: blockedTasks.length,\n contextItems: contextItems.length,\n totalTokens,\n assemblyTimeMs: Date.now() - startTime,\n });\n\n return { context, metadata };\n }\n\n /**\n * Get tasks that are currently active or should be in context\n */\n private getActiveTasks(taskFocus?: string[]): Task[] {\n let query = `\n SELECT * FROM tasks \n WHERE status IN ('in_progress', 'pending') \n `;\n let params: any[] = [];\n\n if (taskFocus && taskFocus.length > 0) {\n query += ` AND task_id IN (${taskFocus.map(() => '?').join(',')})`;\n params = taskFocus;\n }\n\n query += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows = this.db.prepare(query).all(...params) as any[];\n return this.hydrateTasks(rows);\n }\n\n private getBlockedTasks(): Task[] {\n const rows = this.db\n .prepare(\n `\n SELECT * FROM tasks WHERE status = 'blocked' ORDER BY priority DESC\n `\n )\n .all() as any[];\n return this.hydrateTasks(rows);\n }\n\n /**\n * Select context items relevant to active tasks\n */\n private selectRelevantContext(activeTasks: Task[], request: ContextRequest) {\n const contextItems: Array<{\n id: string;\n type: 'frame' | 'anchor' | 'event';\n content: string;\n relevanceScore: number;\n tokenEstimate: number;\n }> = [];\n\n // Get frames for active tasks\n const frameIds = [...new Set(activeTasks.map((t) => t.frame_id))];\n frameIds.forEach((frameId) => {\n const frame = this.frameManager.getFrame(frameId);\n if (frame) {\n const score = this.calculateFrameRelevance(\n frame,\n activeTasks,\n request.query\n );\n contextItems.push({\n id: frameId,\n type: 'frame',\n content: `Frame: ${frame.name} (${frame.type})`,\n relevanceScore: score,\n tokenEstimate: frame.name.length + 20,\n });\n }\n });\n\n // Get relevant anchors\n const anchors = this.getRelevantAnchors(frameIds, request);\n anchors.forEach((anchor) => {\n const score = this.calculateAnchorRelevance(\n anchor,\n activeTasks,\n request.query\n );\n contextItems.push({\n id: anchor.anchor_id,\n type: 'anchor',\n content: `${anchor.type}: ${anchor.text}`,\n relevanceScore: score,\n tokenEstimate: anchor.text.length + 10,\n });\n });\n\n // Get recent events from active frames\n if (request.includeHistory) {\n frameIds.forEach((frameId) => {\n const events = this.frameManager.getFrameEvents(frameId, 5);\n events.forEach((event) => {\n const score = this.calculateEventRelevance(\n event,\n activeTasks,\n request.query\n );\n if (score > 0.3) {\n contextItems.push({\n id: event.event_id,\n type: 'event',\n content: `Event: ${event.event_type}`,\n relevanceScore: score,\n tokenEstimate: 30,\n });\n }\n });\n });\n }\n\n // Sort by relevance score\n return contextItems.sort((a, b) => b.relevanceScore - a.relevanceScore);\n }\n\n private buildContextString(\n contextItems: any[],\n activeTasks: Task[],\n maxTokens: number\n ): {\n context: string;\n totalTokens: number;\n relevanceScores: Record<string, number>;\n } {\n let context = '# Active Task Context\\n\\n';\n let totalTokens = 20; // Header estimate\n const relevanceScores: Record<string, number> = {};\n\n // Always include active tasks summary\n context += '## Current Tasks\\n';\n activeTasks.forEach((task) => {\n const line = `- [${task.status.toUpperCase()}] ${task.name} (${task.priority})\\n`;\n context += line;\n totalTokens += line.length / 4; // Rough token estimate\n relevanceScores[task.task_id] = 1.0;\n });\n context += '\\n';\n\n // Add context items within token budget\n context += '## Relevant Context\\n';\n for (const item of contextItems) {\n if (totalTokens + item.tokenEstimate > maxTokens) break;\n\n context += `${item.content}\\n`;\n totalTokens += item.tokenEstimate;\n relevanceScores[item.id] = item.relevanceScore;\n }\n\n return { context, totalTokens, relevanceScores };\n }\n\n // Relevance scoring methods\n private calculateFrameRelevance(\n frame: Frame,\n activeTasks: Task[],\n query?: string\n ): number {\n let score = 0.5; // Base relevance\n\n // Higher score if frame contains active tasks\n if (activeTasks.some((t) => t.frame_id === frame.frame_id)) {\n score += 0.4;\n }\n\n // Query matching\n if (query) {\n const queryLower = query.toLowerCase();\n if (frame.name.toLowerCase().includes(queryLower)) {\n score += 0.3;\n }\n }\n\n // Recent frames get boost\n const ageHours = (Date.now() / 1000 - frame.created_at) / 3600;\n if (ageHours < 24) score += 0.2;\n\n return Math.min(score, 1.0);\n }\n\n private calculateAnchorRelevance(\n anchor: Anchor,\n activeTasks: Task[],\n query?: string\n ): number {\n let score = 0.3; // Base relevance\n\n // Task-related anchors get priority\n if (anchor.type === 'TODO') score += 0.4;\n if (anchor.type === 'DECISION') score += 0.3;\n if (anchor.type === 'CONSTRAINT') score += 0.2;\n\n // Priority-based boost\n score += (anchor.priority / 10) * 0.2;\n\n // Query matching\n if (query) {\n const queryLower = query.toLowerCase();\n if (anchor.text.toLowerCase().includes(queryLower)) {\n score += 0.3;\n }\n }\n\n return Math.min(score, 1.0);\n }\n\n private calculateEventRelevance(\n event: Event,\n _activeTasks: Task[],\n _query?: string\n ): number {\n let score = 0.1; // Base relevance\n\n // Event type relevance\n if (event.event_type === 'decision') score += 0.4;\n if (event.event_type === 'tool_call') score += 0.3;\n if (event.event_type === 'observation') score += 0.2;\n\n // Recent events get boost\n const ageHours = (Date.now() / 1000 - event.ts) / 3600;\n if (ageHours < 1) score += 0.3;\n else if (ageHours < 6) score += 0.2;\n\n return Math.min(score, 1.0);\n }\n\n // Helper methods\n private getTask(taskId: string): Task | undefined {\n const row = this.db\n .prepare(`SELECT * FROM tasks WHERE task_id = ?`)\n .get(taskId) as any;\n return row ? this.hydrateTask(row) : undefined;\n }\n\n private getRelevantAnchors(\n frameIds: string[],\n _request: ContextRequest\n ): Anchor[] {\n if (frameIds.length === 0) return [];\n\n const placeholders = frameIds.map(() => '?').join(',');\n const rows = this.db\n .prepare(\n `\n SELECT * FROM anchors \n WHERE frame_id IN (${placeholders})\n ORDER BY priority DESC, created_at DESC\n LIMIT 20\n `\n )\n .all(...frameIds) as any[];\n\n return rows.map((row) => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n }\n\n private hydrateTasks(rows: any[]): Task[] {\n return rows.map(this.hydrateTask);\n }\n\n private hydrateTask = (row: any): Task => ({\n ...row,\n depends_on: JSON.parse(row.depends_on || '[]'),\n context_tags: JSON.parse(row.context_tags || '[]'),\n metadata: JSON.parse(row.metadata || '{}'),\n });\n\n private logContextAccess(data: {\n taskIds: string[];\n contextItems: string[];\n relevanceScores: Record<string, number>;\n totalTokens: number;\n query: string;\n }) {\n const requestId = `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n\n this.db\n .prepare(\n `\n INSERT INTO context_access_log (\n request_id, task_ids, context_items, relevance_scores, total_tokens, query_hash\n ) VALUES (?, ?, ?, ?, ?, ?)\n `\n )\n .run(\n requestId,\n JSON.stringify(data.taskIds),\n JSON.stringify(data.contextItems),\n JSON.stringify(data.relevanceScores),\n data.totalTokens,\n this.hashString(data.query)\n );\n }\n\n private hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(16);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FrameManager
|
|
3
|
+
} from "./core/context/frame-manager.js";
|
|
4
|
+
import { logger, Logger, LogLevel } from "./core/monitoring/logger.js";
|
|
5
|
+
import {
|
|
6
|
+
StackMemoryError,
|
|
7
|
+
ErrorCode,
|
|
8
|
+
ErrorHandler
|
|
9
|
+
} from "./core/monitoring/error-handler.js";
|
|
10
|
+
import { default as default2 } from "./integrations/mcp/server.js";
|
|
11
|
+
export {
|
|
12
|
+
ErrorCode,
|
|
13
|
+
ErrorHandler,
|
|
14
|
+
FrameManager,
|
|
15
|
+
default2 as LocalStackMemoryMCP,
|
|
16
|
+
LogLevel,
|
|
17
|
+
Logger,
|
|
18
|
+
StackMemoryError,
|
|
19
|
+
logger
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory - Lossless memory runtime for AI coding tools\n * Main entry point for the StackMemory package\n */\n\nexport {\n FrameManager,\n type FrameType,\n type FrameState,\n} from './core/context/frame-manager.js';\nexport { logger, Logger, LogLevel } from './core/monitoring/logger.js';\nexport {\n StackMemoryError,\n ErrorCode,\n ErrorHandler,\n} from './core/monitoring/error-handler.js';\nexport { default as LocalStackMemoryMCP } from './integrations/mcp/server.js';\n\n// Re-export key types\nexport interface StackMemoryConfig {\n projectRoot?: string;\n dbPath?: string;\n logLevel?: 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';\n}\n\nexport interface ContextItem {\n id: string;\n type: string;\n content: string;\n importance: number;\n timestamp: number;\n}\n"],
|
|
5
|
+
"mappings": "AAKA;AAAA,EACE;AAAA,OAGK;AACP,SAAS,QAAQ,QAAQ,gBAAgB;AACzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAoB,WAAXA,gBAAsC;",
|
|
6
|
+
"names": ["default"]
|
|
7
|
+
}
|