@decibelsystems/tools 2.0.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/LICENSE +21 -0
- package/README.md +342 -0
- package/dist/agentic/compiler.d.ts +21 -0
- package/dist/agentic/compiler.d.ts.map +1 -0
- package/dist/agentic/compiler.js +267 -0
- package/dist/agentic/compiler.js.map +1 -0
- package/dist/agentic/golden.d.ts +25 -0
- package/dist/agentic/golden.d.ts.map +1 -0
- package/dist/agentic/golden.js +255 -0
- package/dist/agentic/golden.js.map +1 -0
- package/dist/agentic/index.d.ts +17 -0
- package/dist/agentic/index.d.ts.map +1 -0
- package/dist/agentic/index.js +153 -0
- package/dist/agentic/index.js.map +1 -0
- package/dist/agentic/linter.d.ts +20 -0
- package/dist/agentic/linter.d.ts.map +1 -0
- package/dist/agentic/linter.js +340 -0
- package/dist/agentic/linter.js.map +1 -0
- package/dist/agentic/renderer.d.ts +17 -0
- package/dist/agentic/renderer.d.ts.map +1 -0
- package/dist/agentic/renderer.js +277 -0
- package/dist/agentic/renderer.js.map +1 -0
- package/dist/agentic/types.d.ts +199 -0
- package/dist/agentic/types.d.ts.map +1 -0
- package/dist/agentic/types.js +8 -0
- package/dist/agentic/types.js.map +1 -0
- package/dist/architectAdrs.d.ts +32 -0
- package/dist/architectAdrs.d.ts.map +1 -0
- package/dist/architectAdrs.js +162 -0
- package/dist/architectAdrs.js.map +1 -0
- package/dist/client/facade-client.d.ts +41 -0
- package/dist/client/facade-client.d.ts.map +1 -0
- package/dist/client/facade-client.js +243 -0
- package/dist/client/facade-client.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +18 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/transports.d.ts +78 -0
- package/dist/client/transports.d.ts.map +1 -0
- package/dist/client/transports.js +258 -0
- package/dist/client/transports.js.map +1 -0
- package/dist/client/types.d.ts +49 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +8 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +77 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +374 -0
- package/dist/daemon.js.map +1 -0
- package/dist/daemonConfig.d.ts +43 -0
- package/dist/daemonConfig.d.ts.map +1 -0
- package/dist/daemonConfig.js +113 -0
- package/dist/daemonConfig.js.map +1 -0
- package/dist/dataRoot.d.ts +5 -0
- package/dist/dataRoot.d.ts.map +1 -0
- package/dist/dataRoot.js +23 -0
- package/dist/dataRoot.js.map +1 -0
- package/dist/decibelPaths.d.ts +42 -0
- package/dist/decibelPaths.d.ts.map +1 -0
- package/dist/decibelPaths.js +150 -0
- package/dist/decibelPaths.js.map +1 -0
- package/dist/facades/definitions.d.ts +6 -0
- package/dist/facades/definitions.d.ts.map +1 -0
- package/dist/facades/definitions.js +450 -0
- package/dist/facades/definitions.js.map +1 -0
- package/dist/facades/index.d.ts +27 -0
- package/dist/facades/index.d.ts.map +1 -0
- package/dist/facades/index.js +124 -0
- package/dist/facades/index.js.map +1 -0
- package/dist/facades/types.d.ts +38 -0
- package/dist/facades/types.d.ts.map +1 -0
- package/dist/facades/types.js +8 -0
- package/dist/facades/types.js.map +1 -0
- package/dist/httpServer.d.ts +66 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +1723 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/kernel.d.ts +87 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +256 -0
- package/dist/kernel.js.map +1 -0
- package/dist/lib/agent-services/assumptions.d.ts +16 -0
- package/dist/lib/agent-services/assumptions.d.ts.map +1 -0
- package/dist/lib/agent-services/assumptions.js +284 -0
- package/dist/lib/agent-services/assumptions.js.map +1 -0
- package/dist/lib/agent-services/context-pack.d.ts +6 -0
- package/dist/lib/agent-services/context-pack.d.ts.map +1 -0
- package/dist/lib/agent-services/context-pack.js +354 -0
- package/dist/lib/agent-services/context-pack.js.map +1 -0
- package/dist/lib/agent-services/drift-guard.d.ts +14 -0
- package/dist/lib/agent-services/drift-guard.d.ts.map +1 -0
- package/dist/lib/agent-services/drift-guard.js +355 -0
- package/dist/lib/agent-services/drift-guard.js.map +1 -0
- package/dist/lib/agent-services/index.d.ts +5 -0
- package/dist/lib/agent-services/index.d.ts.map +1 -0
- package/dist/lib/agent-services/index.js +10 -0
- package/dist/lib/agent-services/index.js.map +1 -0
- package/dist/lib/benchmark.d.ts +110 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +338 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/supabase.d.ts +123 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +91 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/license.d.ts +30 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +131 -0
- package/dist/license.js.map +1 -0
- package/dist/projectPaths.d.ts +27 -0
- package/dist/projectPaths.d.ts.map +1 -0
- package/dist/projectPaths.js +86 -0
- package/dist/projectPaths.js.map +1 -0
- package/dist/projectRegistry.d.ts +97 -0
- package/dist/projectRegistry.d.ts.map +1 -0
- package/dist/projectRegistry.js +374 -0
- package/dist/projectRegistry.js.map +1 -0
- package/dist/sentinelIssues.d.ts +65 -0
- package/dist/sentinelIssues.d.ts.map +1 -0
- package/dist/sentinelIssues.js +297 -0
- package/dist/sentinelIssues.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +195 -0
- package/dist/server.js.map +1 -0
- package/dist/test.d.ts +7 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +77 -0
- package/dist/test.js.map +1 -0
- package/dist/tools/agentic/index.d.ts +7 -0
- package/dist/tools/agentic/index.d.ts.map +1 -0
- package/dist/tools/agentic/index.js +203 -0
- package/dist/tools/agentic/index.js.map +1 -0
- package/dist/tools/architect/index.d.ts +11 -0
- package/dist/tools/architect/index.d.ts.map +1 -0
- package/dist/tools/architect/index.js +506 -0
- package/dist/tools/architect/index.js.map +1 -0
- package/dist/tools/architect.d.ts +19 -0
- package/dist/tools/architect.d.ts.map +1 -0
- package/dist/tools/architect.js +88 -0
- package/dist/tools/architect.js.map +1 -0
- package/dist/tools/auditor/index.d.ts +10 -0
- package/dist/tools/auditor/index.d.ts.map +1 -0
- package/dist/tools/auditor/index.js +310 -0
- package/dist/tools/auditor/index.js.map +1 -0
- package/dist/tools/auditor.d.ts +149 -0
- package/dist/tools/auditor.d.ts.map +1 -0
- package/dist/tools/auditor.js +775 -0
- package/dist/tools/auditor.js.map +1 -0
- package/dist/tools/bench/index.d.ts +3 -0
- package/dist/tools/bench/index.d.ts.map +1 -0
- package/dist/tools/bench/index.js +220 -0
- package/dist/tools/bench/index.js.map +1 -0
- package/dist/tools/bench.d.ts +89 -0
- package/dist/tools/bench.d.ts.map +1 -0
- package/dist/tools/bench.js +826 -0
- package/dist/tools/bench.js.map +1 -0
- package/dist/tools/context/index.d.ts +11 -0
- package/dist/tools/context/index.d.ts.map +1 -0
- package/dist/tools/context/index.js +482 -0
- package/dist/tools/context/index.js.map +1 -0
- package/dist/tools/context.d.ts +146 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +481 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/coordinator/coordinator.d.ts +168 -0
- package/dist/tools/coordinator/coordinator.d.ts.map +1 -0
- package/dist/tools/coordinator/coordinator.js +535 -0
- package/dist/tools/coordinator/coordinator.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +12 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -0
- package/dist/tools/coordinator/index.js +381 -0
- package/dist/tools/coordinator/index.js.map +1 -0
- package/dist/tools/corpus/index.d.ts +5 -0
- package/dist/tools/corpus/index.d.ts.map +1 -0
- package/dist/tools/corpus/index.js +105 -0
- package/dist/tools/corpus/index.js.map +1 -0
- package/dist/tools/corpus.d.ts +33 -0
- package/dist/tools/corpus.d.ts.map +1 -0
- package/dist/tools/corpus.js +180 -0
- package/dist/tools/corpus.js.map +1 -0
- package/dist/tools/crit.d.ts +63 -0
- package/dist/tools/crit.d.ts.map +1 -0
- package/dist/tools/crit.js +159 -0
- package/dist/tools/crit.js.map +1 -0
- package/dist/tools/data-inspector.d.ts +189 -0
- package/dist/tools/data-inspector.d.ts.map +1 -0
- package/dist/tools/data-inspector.js +669 -0
- package/dist/tools/data-inspector.js.map +1 -0
- package/dist/tools/deck.d.ts +11 -0
- package/dist/tools/deck.d.ts.map +1 -0
- package/dist/tools/deck.js +188 -0
- package/dist/tools/deck.js.map +1 -0
- package/dist/tools/designer/index.d.ts +11 -0
- package/dist/tools/designer/index.d.ts.map +1 -0
- package/dist/tools/designer/index.js +442 -0
- package/dist/tools/designer/index.js.map +1 -0
- package/dist/tools/designer/lateral-tools.d.ts +6 -0
- package/dist/tools/designer/lateral-tools.d.ts.map +1 -0
- package/dist/tools/designer/lateral-tools.js +190 -0
- package/dist/tools/designer/lateral-tools.js.map +1 -0
- package/dist/tools/designer.d.ts +122 -0
- package/dist/tools/designer.d.ts.map +1 -0
- package/dist/tools/designer.js +495 -0
- package/dist/tools/designer.js.map +1 -0
- package/dist/tools/dojo/index.d.ts +13 -0
- package/dist/tools/dojo/index.d.ts.map +1 -0
- package/dist/tools/dojo/index.js +613 -0
- package/dist/tools/dojo/index.js.map +1 -0
- package/dist/tools/dojo.d.ts +254 -0
- package/dist/tools/dojo.d.ts.map +1 -0
- package/dist/tools/dojo.js +933 -0
- package/dist/tools/dojo.js.map +1 -0
- package/dist/tools/dojoBench.d.ts +49 -0
- package/dist/tools/dojoBench.d.ts.map +1 -0
- package/dist/tools/dojoBench.js +205 -0
- package/dist/tools/dojoBench.js.map +1 -0
- package/dist/tools/dojoGraduated.d.ts +50 -0
- package/dist/tools/dojoGraduated.d.ts.map +1 -0
- package/dist/tools/dojoGraduated.js +174 -0
- package/dist/tools/dojoGraduated.js.map +1 -0
- package/dist/tools/dojoPolicy.d.ts +65 -0
- package/dist/tools/dojoPolicy.d.ts.map +1 -0
- package/dist/tools/dojoPolicy.js +263 -0
- package/dist/tools/dojoPolicy.js.map +1 -0
- package/dist/tools/feedback/index.d.ts +5 -0
- package/dist/tools/feedback/index.d.ts.map +1 -0
- package/dist/tools/feedback/index.js +153 -0
- package/dist/tools/feedback/index.js.map +1 -0
- package/dist/tools/feedback.d.ts +61 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +209 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/forecast/index.d.ts +8 -0
- package/dist/tools/forecast/index.d.ts.map +1 -0
- package/dist/tools/forecast/index.js +283 -0
- package/dist/tools/forecast/index.js.map +1 -0
- package/dist/tools/forecast.d.ts +147 -0
- package/dist/tools/forecast.d.ts.map +1 -0
- package/dist/tools/forecast.js +417 -0
- package/dist/tools/forecast.js.map +1 -0
- package/dist/tools/friction/index.d.ts +7 -0
- package/dist/tools/friction/index.d.ts.map +1 -0
- package/dist/tools/friction/index.js +265 -0
- package/dist/tools/friction/index.js.map +1 -0
- package/dist/tools/friction.d.ts +82 -0
- package/dist/tools/friction.d.ts.map +1 -0
- package/dist/tools/friction.js +331 -0
- package/dist/tools/friction.js.map +1 -0
- package/dist/tools/git/index.d.ts +9 -0
- package/dist/tools/git/index.d.ts.map +1 -0
- package/dist/tools/git/index.js +237 -0
- package/dist/tools/git/index.js.map +1 -0
- package/dist/tools/git-sentinel/index.d.ts +7 -0
- package/dist/tools/git-sentinel/index.d.ts.map +1 -0
- package/dist/tools/git-sentinel/index.js +178 -0
- package/dist/tools/git-sentinel/index.js.map +1 -0
- package/dist/tools/git-sentinel.d.ts +78 -0
- package/dist/tools/git-sentinel.d.ts.map +1 -0
- package/dist/tools/git-sentinel.js +391 -0
- package/dist/tools/git-sentinel.js.map +1 -0
- package/dist/tools/git.d.ts +134 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +374 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/guardian/index.d.ts +8 -0
- package/dist/tools/guardian/index.d.ts.map +1 -0
- package/dist/tools/guardian/index.js +171 -0
- package/dist/tools/guardian/index.js.map +1 -0
- package/dist/tools/guardian.d.ts +62 -0
- package/dist/tools/guardian.d.ts.map +1 -0
- package/dist/tools/guardian.js +332 -0
- package/dist/tools/guardian.js.map +1 -0
- package/dist/tools/hygiene/codebase-scanner.d.ts +38 -0
- package/dist/tools/hygiene/codebase-scanner.d.ts.map +1 -0
- package/dist/tools/hygiene/codebase-scanner.js +411 -0
- package/dist/tools/hygiene/codebase-scanner.js.map +1 -0
- package/dist/tools/hygiene/config-scanner.d.ts +33 -0
- package/dist/tools/hygiene/config-scanner.d.ts.map +1 -0
- package/dist/tools/hygiene/config-scanner.js +482 -0
- package/dist/tools/hygiene/config-scanner.js.map +1 -0
- package/dist/tools/hygiene/coverage-scanner.d.ts +41 -0
- package/dist/tools/hygiene/coverage-scanner.d.ts.map +1 -0
- package/dist/tools/hygiene/coverage-scanner.js +331 -0
- package/dist/tools/hygiene/coverage-scanner.js.map +1 -0
- package/dist/tools/hygiene/index.d.ts +7 -0
- package/dist/tools/hygiene/index.d.ts.map +1 -0
- package/dist/tools/hygiene/index.js +291 -0
- package/dist/tools/hygiene/index.js.map +1 -0
- package/dist/tools/hygiene/oracle-hygiene.d.ts +68 -0
- package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -0
- package/dist/tools/hygiene/oracle-hygiene.js +324 -0
- package/dist/tools/hygiene/oracle-hygiene.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +130 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lateral.d.ts +114 -0
- package/dist/tools/lateral.d.ts.map +1 -0
- package/dist/tools/lateral.js +536 -0
- package/dist/tools/lateral.js.map +1 -0
- package/dist/tools/learnings/index.d.ts +5 -0
- package/dist/tools/learnings/index.d.ts.map +1 -0
- package/dist/tools/learnings/index.js +138 -0
- package/dist/tools/learnings/index.js.map +1 -0
- package/dist/tools/learnings.d.ts +41 -0
- package/dist/tools/learnings.d.ts.map +1 -0
- package/dist/tools/learnings.js +149 -0
- package/dist/tools/learnings.js.map +1 -0
- package/dist/tools/oracle/index.d.ts +6 -0
- package/dist/tools/oracle/index.d.ts.map +1 -0
- package/dist/tools/oracle/index.js +217 -0
- package/dist/tools/oracle/index.js.map +1 -0
- package/dist/tools/oracle.d.ts +90 -0
- package/dist/tools/oracle.d.ts.map +1 -0
- package/dist/tools/oracle.js +529 -0
- package/dist/tools/oracle.js.map +1 -0
- package/dist/tools/policy.d.ts +119 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +406 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/provenance/index.d.ts +4 -0
- package/dist/tools/provenance/index.d.ts.map +1 -0
- package/dist/tools/provenance/index.js +63 -0
- package/dist/tools/provenance/index.js.map +1 -0
- package/dist/tools/provenance.d.ts +75 -0
- package/dist/tools/provenance.d.ts.map +1 -0
- package/dist/tools/provenance.js +224 -0
- package/dist/tools/provenance.js.map +1 -0
- package/dist/tools/rateLimiter.d.ts +45 -0
- package/dist/tools/rateLimiter.d.ts.map +1 -0
- package/dist/tools/rateLimiter.js +91 -0
- package/dist/tools/rateLimiter.js.map +1 -0
- package/dist/tools/registry/index.d.ts +10 -0
- package/dist/tools/registry/index.d.ts.map +1 -0
- package/dist/tools/registry/index.js +506 -0
- package/dist/tools/registry/index.js.map +1 -0
- package/dist/tools/registry.d.ts +3 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +189 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/roadmap/index.d.ts +11 -0
- package/dist/tools/roadmap/index.d.ts.map +1 -0
- package/dist/tools/roadmap/index.js +364 -0
- package/dist/tools/roadmap/index.js.map +1 -0
- package/dist/tools/roadmap.d.ts +103 -0
- package/dist/tools/roadmap.d.ts.map +1 -0
- package/dist/tools/roadmap.js +407 -0
- package/dist/tools/roadmap.js.map +1 -0
- package/dist/tools/senken.d.ts +11 -0
- package/dist/tools/senken.d.ts.map +1 -0
- package/dist/tools/senken.js +482 -0
- package/dist/tools/senken.js.map +1 -0
- package/dist/tools/sentinel/index.d.ts +21 -0
- package/dist/tools/sentinel/index.d.ts.map +1 -0
- package/dist/tools/sentinel/index.js +1067 -0
- package/dist/tools/sentinel/index.js.map +1 -0
- package/dist/tools/sentinel-scan-data.d.ts +90 -0
- package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
- package/dist/tools/sentinel-scan-data.js +122 -0
- package/dist/tools/sentinel-scan-data.js.map +1 -0
- package/dist/tools/sentinel.d.ts +156 -0
- package/dist/tools/sentinel.d.ts.map +1 -0
- package/dist/tools/sentinel.js +603 -0
- package/dist/tools/sentinel.js.map +1 -0
- package/dist/tools/shared/index.d.ts +5 -0
- package/dist/tools/shared/index.d.ts.map +1 -0
- package/dist/tools/shared/index.js +8 -0
- package/dist/tools/shared/index.js.map +1 -0
- package/dist/tools/shared/project.d.ts +17 -0
- package/dist/tools/shared/project.d.ts.map +1 -0
- package/dist/tools/shared/project.js +36 -0
- package/dist/tools/shared/project.js.map +1 -0
- package/dist/tools/shared/response.d.ts +15 -0
- package/dist/tools/shared/response.d.ts.map +1 -0
- package/dist/tools/shared/response.js +77 -0
- package/dist/tools/shared/response.js.map +1 -0
- package/dist/tools/shared/runTracker.d.ts +87 -0
- package/dist/tools/shared/runTracker.d.ts.map +1 -0
- package/dist/tools/shared/runTracker.js +225 -0
- package/dist/tools/shared/runTracker.js.map +1 -0
- package/dist/tools/shared/validation.d.ts +10 -0
- package/dist/tools/shared/validation.d.ts.map +1 -0
- package/dist/tools/shared/validation.js +26 -0
- package/dist/tools/shared/validation.js.map +1 -0
- package/dist/tools/studio/cloud-spine.d.ts +27 -0
- package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
- package/dist/tools/studio/cloud-spine.js +845 -0
- package/dist/tools/studio/cloud-spine.js.map +1 -0
- package/dist/tools/studio/index.d.ts +154 -0
- package/dist/tools/studio/index.d.ts.map +1 -0
- package/dist/tools/studio/index.js +541 -0
- package/dist/tools/studio/index.js.map +1 -0
- package/dist/tools/testSpec.d.ts +122 -0
- package/dist/tools/testSpec.d.ts.map +1 -0
- package/dist/tools/testSpec.js +525 -0
- package/dist/tools/testSpec.js.map +1 -0
- package/dist/tools/toolsIndex.d.ts +5 -0
- package/dist/tools/toolsIndex.d.ts.map +1 -0
- package/dist/tools/toolsIndex.js +37 -0
- package/dist/tools/toolsIndex.js.map +1 -0
- package/dist/tools/types.d.ts +47 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +7 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/vector/index.d.ts +13 -0
- package/dist/tools/vector/index.d.ts.map +1 -0
- package/dist/tools/vector/index.js +592 -0
- package/dist/tools/vector/index.js.map +1 -0
- package/dist/tools/vector.d.ts +189 -0
- package/dist/tools/vector.d.ts.map +1 -0
- package/dist/tools/vector.js +570 -0
- package/dist/tools/vector.js.map +1 -0
- package/dist/tools/velocity/index.d.ts +9 -0
- package/dist/tools/velocity/index.d.ts.map +1 -0
- package/dist/tools/velocity/index.js +306 -0
- package/dist/tools/velocity/index.js.map +1 -0
- package/dist/tools/velocity.d.ts +143 -0
- package/dist/tools/velocity.d.ts.map +1 -0
- package/dist/tools/velocity.js +628 -0
- package/dist/tools/velocity.js.map +1 -0
- package/dist/tools/voice/index.d.ts +8 -0
- package/dist/tools/voice/index.d.ts.map +1 -0
- package/dist/tools/voice/index.js +203 -0
- package/dist/tools/voice/index.js.map +1 -0
- package/dist/tools/voice.d.ts +291 -0
- package/dist/tools/voice.d.ts.map +1 -0
- package/dist/tools/voice.js +734 -0
- package/dist/tools/voice.js.map +1 -0
- package/dist/tools/workflow/index.d.ts +8 -0
- package/dist/tools/workflow/index.d.ts.map +1 -0
- package/dist/tools/workflow/index.js +199 -0
- package/dist/tools/workflow/index.js.map +1 -0
- package/dist/tools/workflow.d.ts +123 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +647 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/transports/bridge.d.ts +22 -0
- package/dist/transports/bridge.d.ts.map +1 -0
- package/dist/transports/bridge.js +177 -0
- package/dist/transports/bridge.js.map +1 -0
- package/dist/transports/http.d.ts +9 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +35 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/index.d.ts +6 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/transports/mcp.d.ts +9 -0
- package/dist/transports/mcp.d.ts.map +1 -0
- package/dist/transports/mcp.js +51 -0
- package/dist/transports/mcp.js.map +1 -0
- package/dist/transports/stdio.d.ts +9 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +26 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/transports/types.d.ts +27 -0
- package/dist/transports/types.d.ts.map +1 -0
- package/dist/transports/types.js +8 -0
- package/dist/transports/types.js.map +1 -0
- package/dist/types/agent-services.d.ts +193 -0
- package/dist/types/agent-services.d.ts.map +1 -0
- package/dist/types/agent-services.js +8 -0
- package/dist/types/agent-services.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +72 -0
- package/templates/AGENT.md +87 -0
- package/templates/com.decibel.daemon.plist +47 -0
- package/templates/sentinel/ISSUE_TEMPLATE.md +20 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Assumption Aggregation Service
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Aggregates assumptions across runs to identify patterns, high-risk categories,
|
|
5
|
+
// and things the agent should always ask about rather than assume.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { getRun, listRuns } from '../../tools/vector.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Constants
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/** Threshold for considering a category high-risk */
|
|
12
|
+
const HIGH_RISK_INVALIDATION_RATE = 0.3; // 30%+ invalidation = high risk
|
|
13
|
+
/** Minimum occurrences to consider for "always ask" */
|
|
14
|
+
const MIN_OCCURRENCES_FOR_ALWAYS_ASK = 2;
|
|
15
|
+
/** Invalidation rate threshold for "always ask" */
|
|
16
|
+
const ALWAYS_ASK_INVALIDATION_RATE = 0.5; // 50%+ invalidation = always ask
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Helpers
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Extract tracked assumptions from run events
|
|
22
|
+
*/
|
|
23
|
+
function extractAssumptions(events, run_id) {
|
|
24
|
+
const assumptions = [];
|
|
25
|
+
for (const event of events) {
|
|
26
|
+
if (event.type !== 'assumption_made')
|
|
27
|
+
continue;
|
|
28
|
+
if (!event.payload)
|
|
29
|
+
continue;
|
|
30
|
+
const payload = event.payload;
|
|
31
|
+
assumptions.push({
|
|
32
|
+
assumption: payload.assumption || payload.content || 'Unknown assumption',
|
|
33
|
+
rationale: payload.rationale,
|
|
34
|
+
alternatives: payload.alternatives,
|
|
35
|
+
ask_if_below: payload.ask_if_below,
|
|
36
|
+
category: normalizeCategory(payload.category),
|
|
37
|
+
outcome: normalizeOutcome(payload.outcome),
|
|
38
|
+
run_id,
|
|
39
|
+
timestamp: event.ts,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return assumptions;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Normalize category string to valid AssumptionCategory
|
|
46
|
+
*/
|
|
47
|
+
function normalizeCategory(category) {
|
|
48
|
+
if (!category)
|
|
49
|
+
return 'other';
|
|
50
|
+
const normalized = category.toLowerCase().replace(/[^a-z_]/g, '');
|
|
51
|
+
const validCategories = [
|
|
52
|
+
'architecture', 'api_behavior', 'auth', 'data_format',
|
|
53
|
+
'dependencies', 'environment', 'permissions', 'performance',
|
|
54
|
+
'security', 'user_intent', 'other'
|
|
55
|
+
];
|
|
56
|
+
if (validCategories.includes(normalized)) {
|
|
57
|
+
return normalized;
|
|
58
|
+
}
|
|
59
|
+
// Map common variations
|
|
60
|
+
if (normalized.includes('api'))
|
|
61
|
+
return 'api_behavior';
|
|
62
|
+
if (normalized.includes('auth') || normalized.includes('login'))
|
|
63
|
+
return 'auth';
|
|
64
|
+
if (normalized.includes('data') || normalized.includes('format'))
|
|
65
|
+
return 'data_format';
|
|
66
|
+
if (normalized.includes('dep') || normalized.includes('package'))
|
|
67
|
+
return 'dependencies';
|
|
68
|
+
if (normalized.includes('env') || normalized.includes('config'))
|
|
69
|
+
return 'environment';
|
|
70
|
+
if (normalized.includes('perm') || normalized.includes('access'))
|
|
71
|
+
return 'permissions';
|
|
72
|
+
if (normalized.includes('perf') || normalized.includes('speed'))
|
|
73
|
+
return 'performance';
|
|
74
|
+
if (normalized.includes('sec'))
|
|
75
|
+
return 'security';
|
|
76
|
+
if (normalized.includes('user') || normalized.includes('intent'))
|
|
77
|
+
return 'user_intent';
|
|
78
|
+
return 'other';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Normalize outcome string to valid AssumptionOutcome
|
|
82
|
+
*/
|
|
83
|
+
function normalizeOutcome(outcome) {
|
|
84
|
+
if (!outcome)
|
|
85
|
+
return 'unknown';
|
|
86
|
+
const normalized = outcome.toLowerCase();
|
|
87
|
+
if (normalized === 'validated' || normalized === 'valid' || normalized === 'correct') {
|
|
88
|
+
return 'validated';
|
|
89
|
+
}
|
|
90
|
+
if (normalized === 'invalidated' || normalized === 'invalid' || normalized === 'wrong' || normalized === 'incorrect') {
|
|
91
|
+
return 'invalidated';
|
|
92
|
+
}
|
|
93
|
+
return 'unknown';
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Infer outcome from subsequent events if not explicitly set
|
|
97
|
+
*/
|
|
98
|
+
function inferOutcome(assumption, allEvents, assumptionIndex) {
|
|
99
|
+
if (assumption.outcome !== 'unknown') {
|
|
100
|
+
return assumption.outcome;
|
|
101
|
+
}
|
|
102
|
+
// Look at events after this assumption
|
|
103
|
+
const subsequentEvents = allEvents.slice(assumptionIndex + 1);
|
|
104
|
+
for (const event of subsequentEvents) {
|
|
105
|
+
// Backtrack or error after assumption often means it was wrong
|
|
106
|
+
if (event.type === 'backtrack' || event.type === 'error') {
|
|
107
|
+
const payload = event.payload;
|
|
108
|
+
if (payload?.reason?.toLowerCase().includes(assumption.assumption.toLowerCase())) {
|
|
109
|
+
return 'invalidated';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// User correction specifically about this assumption
|
|
113
|
+
if (event.type === 'user_correction') {
|
|
114
|
+
const payload = event.payload;
|
|
115
|
+
if (payload?.correction?.toLowerCase().includes(assumption.assumption.toLowerCase())) {
|
|
116
|
+
return 'invalidated';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return 'unknown';
|
|
121
|
+
}
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Main Functions
|
|
124
|
+
// ============================================================================
|
|
125
|
+
/**
|
|
126
|
+
* Aggregate assumptions from multiple runs
|
|
127
|
+
*/
|
|
128
|
+
export async function aggregateAssumptions(projectId, options) {
|
|
129
|
+
const lookbackDays = options?.lookback_days || 30;
|
|
130
|
+
const maxRuns = options?.max_runs || 100;
|
|
131
|
+
// Get recent runs
|
|
132
|
+
const { runs } = await listRuns({
|
|
133
|
+
projectId,
|
|
134
|
+
limit: maxRuns,
|
|
135
|
+
});
|
|
136
|
+
// Filter by date
|
|
137
|
+
const cutoff = new Date();
|
|
138
|
+
cutoff.setDate(cutoff.getDate() - lookbackDays);
|
|
139
|
+
const cutoffStr = cutoff.toISOString();
|
|
140
|
+
const recentRuns = runs.filter(r => r.created_at >= cutoffStr);
|
|
141
|
+
// Collect all assumptions
|
|
142
|
+
const allAssumptions = [];
|
|
143
|
+
for (const run of recentRuns) {
|
|
144
|
+
try {
|
|
145
|
+
const runData = await getRun({
|
|
146
|
+
projectId,
|
|
147
|
+
run_id: run.run_id,
|
|
148
|
+
include_events: true,
|
|
149
|
+
});
|
|
150
|
+
if (!runData.events)
|
|
151
|
+
continue;
|
|
152
|
+
const assumptions = extractAssumptions(runData.events, run.run_id);
|
|
153
|
+
// Try to infer outcomes
|
|
154
|
+
for (let i = 0; i < runData.events.length; i++) {
|
|
155
|
+
const event = runData.events[i];
|
|
156
|
+
if (event.type === 'assumption_made') {
|
|
157
|
+
const assumptionIndex = assumptions.findIndex(a => a.timestamp === event.ts && a.run_id === run.run_id);
|
|
158
|
+
if (assumptionIndex >= 0) {
|
|
159
|
+
assumptions[assumptionIndex].outcome = inferOutcome(assumptions[assumptionIndex], runData.events, i);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
allAssumptions.push(...assumptions);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Skip runs we can't read
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Calculate stats
|
|
170
|
+
const stats = calculateStats(allAssumptions);
|
|
171
|
+
return {
|
|
172
|
+
...stats,
|
|
173
|
+
assumptions: allAssumptions,
|
|
174
|
+
period: {
|
|
175
|
+
start: cutoffStr,
|
|
176
|
+
end: new Date().toISOString(),
|
|
177
|
+
run_count: recentRuns.length,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Calculate statistics from assumptions
|
|
183
|
+
*/
|
|
184
|
+
function calculateStats(assumptions) {
|
|
185
|
+
const byOutcome = {
|
|
186
|
+
validated: 0,
|
|
187
|
+
invalidated: 0,
|
|
188
|
+
unknown: 0,
|
|
189
|
+
};
|
|
190
|
+
const byCategory = {
|
|
191
|
+
architecture: { valid: 0, invalid: 0, total: 0 },
|
|
192
|
+
api_behavior: { valid: 0, invalid: 0, total: 0 },
|
|
193
|
+
auth: { valid: 0, invalid: 0, total: 0 },
|
|
194
|
+
data_format: { valid: 0, invalid: 0, total: 0 },
|
|
195
|
+
dependencies: { valid: 0, invalid: 0, total: 0 },
|
|
196
|
+
environment: { valid: 0, invalid: 0, total: 0 },
|
|
197
|
+
permissions: { valid: 0, invalid: 0, total: 0 },
|
|
198
|
+
performance: { valid: 0, invalid: 0, total: 0 },
|
|
199
|
+
security: { valid: 0, invalid: 0, total: 0 },
|
|
200
|
+
user_intent: { valid: 0, invalid: 0, total: 0 },
|
|
201
|
+
other: { valid: 0, invalid: 0, total: 0 },
|
|
202
|
+
};
|
|
203
|
+
// Track specific assumptions for "always ask"
|
|
204
|
+
const assumptionOccurrences = new Map();
|
|
205
|
+
for (const a of assumptions) {
|
|
206
|
+
byOutcome[a.outcome]++;
|
|
207
|
+
const cat = byCategory[a.category];
|
|
208
|
+
cat.total++;
|
|
209
|
+
if (a.outcome === 'validated')
|
|
210
|
+
cat.valid++;
|
|
211
|
+
if (a.outcome === 'invalidated')
|
|
212
|
+
cat.invalid++;
|
|
213
|
+
// Normalize assumption text for grouping
|
|
214
|
+
const normalized = a.assumption.toLowerCase().trim();
|
|
215
|
+
const existing = assumptionOccurrences.get(normalized) || { valid: 0, invalid: 0 };
|
|
216
|
+
if (a.outcome === 'validated')
|
|
217
|
+
existing.valid++;
|
|
218
|
+
if (a.outcome === 'invalidated')
|
|
219
|
+
existing.invalid++;
|
|
220
|
+
assumptionOccurrences.set(normalized, existing);
|
|
221
|
+
}
|
|
222
|
+
// Calculate category validation rates and find high-risk ones
|
|
223
|
+
const categoryValidationRates = {};
|
|
224
|
+
const highRiskCategories = [];
|
|
225
|
+
for (const [category, stats] of Object.entries(byCategory)) {
|
|
226
|
+
const cat = category;
|
|
227
|
+
if (stats.total === 0) {
|
|
228
|
+
categoryValidationRates[cat] = 1; // No data = assume safe
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const knownOutcomes = stats.valid + stats.invalid;
|
|
232
|
+
if (knownOutcomes === 0) {
|
|
233
|
+
categoryValidationRates[cat] = 1;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
const validationRate = stats.valid / knownOutcomes;
|
|
237
|
+
categoryValidationRates[cat] = validationRate;
|
|
238
|
+
const invalidationRate = stats.invalid / knownOutcomes;
|
|
239
|
+
if (invalidationRate >= HIGH_RISK_INVALIDATION_RATE && stats.total >= MIN_OCCURRENCES_FOR_ALWAYS_ASK) {
|
|
240
|
+
highRiskCategories.push(cat);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Find specific assumptions to always ask about
|
|
244
|
+
const alwaysAsk = [];
|
|
245
|
+
for (const [assumption, counts] of assumptionOccurrences) {
|
|
246
|
+
const total = counts.valid + counts.invalid;
|
|
247
|
+
if (total < MIN_OCCURRENCES_FOR_ALWAYS_ASK)
|
|
248
|
+
continue;
|
|
249
|
+
const invalidationRate = counts.invalid / total;
|
|
250
|
+
if (invalidationRate >= ALWAYS_ASK_INVALIDATION_RATE) {
|
|
251
|
+
alwaysAsk.push(assumption);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
total_count: assumptions.length,
|
|
256
|
+
by_outcome: byOutcome,
|
|
257
|
+
high_risk_categories: highRiskCategories,
|
|
258
|
+
always_ask: alwaysAsk,
|
|
259
|
+
category_validation_rates: categoryValidationRates,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Check if a specific assumption should be asked about
|
|
264
|
+
*/
|
|
265
|
+
export async function shouldAskAbout(assumption, category, projectId) {
|
|
266
|
+
const stats = await aggregateAssumptions(projectId);
|
|
267
|
+
// Check if this specific assumption is in always_ask
|
|
268
|
+
const normalized = assumption.toLowerCase().trim();
|
|
269
|
+
if (stats.always_ask.some(a => normalized.includes(a) || a.includes(normalized))) {
|
|
270
|
+
return {
|
|
271
|
+
should_ask: true,
|
|
272
|
+
reason: 'This assumption has been invalidated frequently in the past',
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// Check if category is high-risk
|
|
276
|
+
if (stats.high_risk_categories.includes(category)) {
|
|
277
|
+
return {
|
|
278
|
+
should_ask: true,
|
|
279
|
+
reason: `Category "${category}" has a high invalidation rate (${Math.round((1 - stats.category_validation_rates[category]) * 100)}%)`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
return { should_ask: false };
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=assumptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assumptions.js","sourceRoot":"","sources":["../../../src/lib/agent-services/assumptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ContextPackRequest, ContextPackResponse } from '../../types/agent-services.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a context pack for a new task based on historical runs
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildContextPack(request: ContextPackRequest, projectId?: string): Promise<ContextPackResponse>;
|
|
6
|
+
//# sourceMappingURL=context-pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-pack.d.ts","sourceRoot":"","sources":["../../../src/lib/agent-services/context-pack.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAIpB,MAAM,+BAA+B,CAAC;AAuTvC;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CA2G9B"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Context Pack Service
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Builds a memory brief from past runs before starting a new task.
|
|
5
|
+
// Helps agents avoid repeating past mistakes and learn from history.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { getRun, listRuns } from '../../tools/vector.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Constants
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/** Default lookback period in days */
|
|
12
|
+
const DEFAULT_LOOKBACK_DAYS = 30;
|
|
13
|
+
/** Default max runs to analyze */
|
|
14
|
+
const DEFAULT_MAX_RUNS = 50;
|
|
15
|
+
/** Minimum similarity score to consider a run relevant */
|
|
16
|
+
const MIN_SIMILARITY_SCORE = 0.3;
|
|
17
|
+
/** Common error patterns to track */
|
|
18
|
+
const COMMON_ERROR_PATTERNS = [
|
|
19
|
+
{ pattern: 'type error', category: 'type_safety' },
|
|
20
|
+
{ pattern: 'undefined', category: 'null_check' },
|
|
21
|
+
{ pattern: 'not found', category: 'missing_resource' },
|
|
22
|
+
{ pattern: 'permission denied', category: 'permissions' },
|
|
23
|
+
{ pattern: 'timeout', category: 'performance' },
|
|
24
|
+
{ pattern: 'connection refused', category: 'connectivity' },
|
|
25
|
+
{ pattern: 'syntax error', category: 'syntax' },
|
|
26
|
+
{ pattern: 'import', category: 'dependencies' },
|
|
27
|
+
{ pattern: 'module not found', category: 'dependencies' },
|
|
28
|
+
];
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Helpers
|
|
31
|
+
// ============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Calculate similarity between task and a past run's prompt
|
|
34
|
+
*/
|
|
35
|
+
function calculateSimilarity(task, promptSpec, filesHint) {
|
|
36
|
+
const taskLower = task.toLowerCase();
|
|
37
|
+
const promptLower = promptSpec.raw_prompt.toLowerCase();
|
|
38
|
+
let score = 0;
|
|
39
|
+
const reasons = [];
|
|
40
|
+
// Check for shared keywords (simple word overlap)
|
|
41
|
+
const taskWords = new Set(taskLower.split(/\s+/).filter(w => w.length > 3));
|
|
42
|
+
const promptWords = new Set(promptLower.split(/\s+/).filter(w => w.length > 3));
|
|
43
|
+
let sharedWords = 0;
|
|
44
|
+
for (const word of taskWords) {
|
|
45
|
+
if (promptWords.has(word))
|
|
46
|
+
sharedWords++;
|
|
47
|
+
}
|
|
48
|
+
if (taskWords.size > 0) {
|
|
49
|
+
const wordOverlap = sharedWords / taskWords.size;
|
|
50
|
+
score += wordOverlap * 0.4; // Up to 40% from word overlap
|
|
51
|
+
if (wordOverlap > 0.3) {
|
|
52
|
+
reasons.push(`Shares ${sharedWords} keywords`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Check for intent goal similarity
|
|
56
|
+
if (promptSpec.intent?.goal) {
|
|
57
|
+
const goalLower = promptSpec.intent.goal.toLowerCase();
|
|
58
|
+
const goalWords = new Set(goalLower.split(/\s+/).filter(w => w.length > 3));
|
|
59
|
+
let goalShared = 0;
|
|
60
|
+
for (const word of taskWords) {
|
|
61
|
+
if (goalWords.has(word))
|
|
62
|
+
goalShared++;
|
|
63
|
+
}
|
|
64
|
+
if (taskWords.size > 0 && goalShared > 0) {
|
|
65
|
+
score += 0.2; // 20% boost for goal overlap
|
|
66
|
+
reasons.push('Similar goal');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Check for file hint overlap with scope
|
|
70
|
+
if (filesHint && filesHint.length > 0 && promptSpec.intent?.scope) {
|
|
71
|
+
const scopeSet = new Set(promptSpec.intent.scope.map(s => s.toLowerCase()));
|
|
72
|
+
const hintSet = new Set(filesHint.map(f => f.toLowerCase()));
|
|
73
|
+
for (const hint of hintSet) {
|
|
74
|
+
for (const scope of scopeSet) {
|
|
75
|
+
if (hint.includes(scope) || scope.includes(hint)) {
|
|
76
|
+
score += 0.2;
|
|
77
|
+
reasons.push(`File overlap: ${hint}`);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Check for common action verbs
|
|
84
|
+
const actionVerbs = ['add', 'fix', 'update', 'refactor', 'implement', 'create', 'delete', 'remove'];
|
|
85
|
+
for (const verb of actionVerbs) {
|
|
86
|
+
if (taskLower.includes(verb) && promptLower.includes(verb)) {
|
|
87
|
+
score += 0.1;
|
|
88
|
+
reasons.push(`Same action: ${verb}`);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
score: Math.min(score, 1),
|
|
94
|
+
reason: reasons.length > 0 ? reasons.join(', ') : 'Low similarity',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extract files touched from run events
|
|
99
|
+
*/
|
|
100
|
+
function extractFilesTouched(events) {
|
|
101
|
+
const files = new Set();
|
|
102
|
+
for (const event of events) {
|
|
103
|
+
if (event.type === 'file_touched' && event.payload?.file) {
|
|
104
|
+
files.add(event.payload.file);
|
|
105
|
+
}
|
|
106
|
+
if (event.type === 'command_ran' && event.payload?.files) {
|
|
107
|
+
for (const f of event.payload.files) {
|
|
108
|
+
files.add(f);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return Array.from(files);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Extract key learnings from a run
|
|
116
|
+
*/
|
|
117
|
+
function extractLearnings(events, success) {
|
|
118
|
+
const learnings = [];
|
|
119
|
+
// Look for user corrections - these are always valuable
|
|
120
|
+
for (const event of events) {
|
|
121
|
+
if (event.type === 'user_correction' && event.payload?.correction) {
|
|
122
|
+
learnings.push(`User correction: ${event.payload.correction}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Look for backtracks - what went wrong?
|
|
126
|
+
for (const event of events) {
|
|
127
|
+
if (event.type === 'backtrack' && event.payload?.reason) {
|
|
128
|
+
learnings.push(`Had to backtrack: ${event.payload.reason}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Look for errors
|
|
132
|
+
for (const event of events) {
|
|
133
|
+
if (event.type === 'error' && event.payload?.message) {
|
|
134
|
+
learnings.push(`Error encountered: ${event.payload.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// For successful runs, note what worked
|
|
138
|
+
if (success && events.length > 0) {
|
|
139
|
+
const lastEvent = events[events.length - 1];
|
|
140
|
+
if (lastEvent.type === 'run_completed' && lastEvent.payload?.summary) {
|
|
141
|
+
learnings.push(`Success: ${lastEvent.payload.summary}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return learnings.slice(0, 5); // Cap at 5 learnings
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Analyze file churn across runs
|
|
148
|
+
*/
|
|
149
|
+
function analyzeChurn(runs) {
|
|
150
|
+
const fileStats = new Map();
|
|
151
|
+
for (const run of runs) {
|
|
152
|
+
const files = extractFilesTouched(run.events);
|
|
153
|
+
for (const file of files) {
|
|
154
|
+
const existing = fileStats.get(file) || { touches: 0, failures: 0, lastTouch: '' };
|
|
155
|
+
existing.touches++;
|
|
156
|
+
if (!run.success)
|
|
157
|
+
existing.failures++;
|
|
158
|
+
if (run.created_at > existing.lastTouch)
|
|
159
|
+
existing.lastTouch = run.created_at;
|
|
160
|
+
fileStats.set(file, existing);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Convert to hotspots, sort by touch count
|
|
164
|
+
const hotspots = [];
|
|
165
|
+
for (const [file, stats] of fileStats) {
|
|
166
|
+
if (stats.touches < 2)
|
|
167
|
+
continue; // Only interested in files touched multiple times
|
|
168
|
+
hotspots.push({
|
|
169
|
+
file,
|
|
170
|
+
touch_count: stats.touches,
|
|
171
|
+
failure_rate: stats.touches > 0 ? stats.failures / stats.touches : 0,
|
|
172
|
+
last_touched: stats.lastTouch,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
// Sort by touch count * failure rate (problematic files bubble up)
|
|
176
|
+
hotspots.sort((a, b) => {
|
|
177
|
+
const scoreA = a.touch_count * (1 + a.failure_rate);
|
|
178
|
+
const scoreB = b.touch_count * (1 + b.failure_rate);
|
|
179
|
+
return scoreB - scoreA;
|
|
180
|
+
});
|
|
181
|
+
return hotspots.slice(0, 10); // Top 10 hotspots
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Analyze failure patterns across runs
|
|
185
|
+
*/
|
|
186
|
+
function analyzeFailurePatterns(runs) {
|
|
187
|
+
const patternCounts = new Map();
|
|
188
|
+
for (const run of runs) {
|
|
189
|
+
if (run.success)
|
|
190
|
+
continue; // Only look at failed runs
|
|
191
|
+
for (const event of run.events) {
|
|
192
|
+
if (event.type !== 'error')
|
|
193
|
+
continue;
|
|
194
|
+
const message = (event.payload?.message || '').toLowerCase();
|
|
195
|
+
for (const { pattern, category } of COMMON_ERROR_PATTERNS) {
|
|
196
|
+
if (message.includes(pattern)) {
|
|
197
|
+
const existing = patternCounts.get(category) || { count: 0, examples: [] };
|
|
198
|
+
existing.count++;
|
|
199
|
+
if (existing.examples.length < 3) {
|
|
200
|
+
existing.examples.push(event.payload?.message || pattern);
|
|
201
|
+
}
|
|
202
|
+
patternCounts.set(category, existing);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Convert to patterns with prevention suggestions
|
|
208
|
+
const patterns = [];
|
|
209
|
+
const preventionSuggestions = {
|
|
210
|
+
type_safety: 'Add type annotations and check for type mismatches before running',
|
|
211
|
+
null_check: 'Check for undefined/null values before accessing properties',
|
|
212
|
+
missing_resource: 'Verify files and resources exist before operations',
|
|
213
|
+
permissions: 'Check file permissions and authentication before access',
|
|
214
|
+
performance: 'Consider timeout settings and async operation handling',
|
|
215
|
+
connectivity: 'Verify network connectivity and service availability',
|
|
216
|
+
syntax: 'Validate syntax before executing commands',
|
|
217
|
+
dependencies: 'Check that all imports and dependencies are installed',
|
|
218
|
+
};
|
|
219
|
+
for (const [category, stats] of patternCounts) {
|
|
220
|
+
if (stats.count < 2)
|
|
221
|
+
continue; // Only patterns that occur multiple times
|
|
222
|
+
patterns.push({
|
|
223
|
+
pattern: category.replace('_', ' '),
|
|
224
|
+
occurrence_count: stats.count,
|
|
225
|
+
suggested_prevention: preventionSuggestions[category] || 'Review similar past errors',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
patterns.sort((a, b) => b.occurrence_count - a.occurrence_count);
|
|
229
|
+
return patterns;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Generate suggested questions based on task and history
|
|
233
|
+
*/
|
|
234
|
+
function generateQuestions(task, relevantRuns, failurePatterns) {
|
|
235
|
+
const questions = [];
|
|
236
|
+
// Questions based on past failures
|
|
237
|
+
for (const pattern of failurePatterns.slice(0, 2)) {
|
|
238
|
+
questions.push(`Past runs had ${pattern.pattern} issues - have you addressed this?`);
|
|
239
|
+
}
|
|
240
|
+
// Questions based on similar runs that failed
|
|
241
|
+
const failedRuns = relevantRuns.filter(r => r.outcome === 'failed');
|
|
242
|
+
if (failedRuns.length > 0) {
|
|
243
|
+
questions.push('Similar tasks have failed before - what makes this attempt different?');
|
|
244
|
+
}
|
|
245
|
+
// Questions based on ambiguous terms in task
|
|
246
|
+
const ambiguousTerms = ['refactor', 'improve', 'fix', 'update', 'optimize'];
|
|
247
|
+
for (const term of ambiguousTerms) {
|
|
248
|
+
if (task.toLowerCase().includes(term)) {
|
|
249
|
+
questions.push(`What specifically should be ${term}ed?`);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// General scoping question if no files mentioned
|
|
254
|
+
if (!task.match(/\.(ts|js|py|go|rs|java|tsx|jsx)/) && !task.includes('src/')) {
|
|
255
|
+
questions.push('Which specific files or modules should be modified?');
|
|
256
|
+
}
|
|
257
|
+
return questions.slice(0, 5); // Cap at 5 questions
|
|
258
|
+
}
|
|
259
|
+
// ============================================================================
|
|
260
|
+
// Main Function
|
|
261
|
+
// ============================================================================
|
|
262
|
+
/**
|
|
263
|
+
* Build a context pack for a new task based on historical runs
|
|
264
|
+
*/
|
|
265
|
+
export async function buildContextPack(request, projectId) {
|
|
266
|
+
const lookbackDays = request.lookback_days || DEFAULT_LOOKBACK_DAYS;
|
|
267
|
+
const maxRuns = request.max_runs || DEFAULT_MAX_RUNS;
|
|
268
|
+
// Get recent runs
|
|
269
|
+
const { runs } = await listRuns({
|
|
270
|
+
projectId,
|
|
271
|
+
limit: maxRuns,
|
|
272
|
+
});
|
|
273
|
+
// Filter by date
|
|
274
|
+
const cutoff = new Date();
|
|
275
|
+
cutoff.setDate(cutoff.getDate() - lookbackDays);
|
|
276
|
+
const cutoffStr = cutoff.toISOString();
|
|
277
|
+
const recentRuns = runs.filter(r => r.created_at >= cutoffStr);
|
|
278
|
+
// Load full run data
|
|
279
|
+
const fullRuns = [];
|
|
280
|
+
for (const run of recentRuns) {
|
|
281
|
+
try {
|
|
282
|
+
const runData = await getRun({
|
|
283
|
+
projectId,
|
|
284
|
+
run_id: run.run_id,
|
|
285
|
+
include_events: true,
|
|
286
|
+
});
|
|
287
|
+
fullRuns.push({
|
|
288
|
+
run_id: run.run_id,
|
|
289
|
+
prompt: runData.prompt,
|
|
290
|
+
events: runData.events || [],
|
|
291
|
+
success: run.success ?? !runData.completed, // If not completed, consider failed
|
|
292
|
+
created_at: run.created_at,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Skip runs we can't read
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Find relevant runs
|
|
300
|
+
const relevantRuns = [];
|
|
301
|
+
for (const run of fullRuns) {
|
|
302
|
+
const { score, reason } = calculateSimilarity(request.task, run.prompt, request.files_hint);
|
|
303
|
+
if (score >= MIN_SIMILARITY_SCORE) {
|
|
304
|
+
relevantRuns.push({
|
|
305
|
+
run_id: run.run_id,
|
|
306
|
+
similarity_reason: reason,
|
|
307
|
+
outcome: run.success ? 'success' : 'failed',
|
|
308
|
+
key_learnings: extractLearnings(run.events, run.success),
|
|
309
|
+
files_touched: extractFilesTouched(run.events),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Sort by similarity (implicit in the order we found them, but could enhance)
|
|
314
|
+
relevantRuns.sort((a, b) => {
|
|
315
|
+
// Failed runs are more instructive
|
|
316
|
+
if (a.outcome === 'failed' && b.outcome !== 'failed')
|
|
317
|
+
return -1;
|
|
318
|
+
if (b.outcome === 'failed' && a.outcome !== 'failed')
|
|
319
|
+
return 1;
|
|
320
|
+
return 0;
|
|
321
|
+
});
|
|
322
|
+
// Analyze churn and failure patterns
|
|
323
|
+
const churnHotspots = analyzeChurn(fullRuns);
|
|
324
|
+
const failurePatterns = analyzeFailurePatterns(fullRuns);
|
|
325
|
+
// Generate suggested questions
|
|
326
|
+
const suggestedQuestions = generateQuestions(request.task, relevantRuns, failurePatterns);
|
|
327
|
+
// Build context summary
|
|
328
|
+
let contextSummary = '';
|
|
329
|
+
if (relevantRuns.length > 0) {
|
|
330
|
+
const successCount = relevantRuns.filter(r => r.outcome === 'success').length;
|
|
331
|
+
const failCount = relevantRuns.filter(r => r.outcome === 'failed').length;
|
|
332
|
+
contextSummary += `Found ${relevantRuns.length} similar past runs (${successCount} successful, ${failCount} failed). `;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
contextSummary += 'No similar past runs found. ';
|
|
336
|
+
}
|
|
337
|
+
if (failurePatterns.length > 0) {
|
|
338
|
+
contextSummary += `Common issues: ${failurePatterns.map(p => p.pattern).join(', ')}. `;
|
|
339
|
+
}
|
|
340
|
+
if (churnHotspots.length > 0) {
|
|
341
|
+
const problematic = churnHotspots.filter(h => h.failure_rate > 0.3);
|
|
342
|
+
if (problematic.length > 0) {
|
|
343
|
+
contextSummary += `High-risk files: ${problematic.slice(0, 3).map(h => h.file).join(', ')}.`;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
relevant_runs: relevantRuns.slice(0, 10), // Top 10 relevant runs
|
|
348
|
+
churn_hotspots: churnHotspots,
|
|
349
|
+
failure_patterns: failurePatterns,
|
|
350
|
+
suggested_questions: suggestedQuestions,
|
|
351
|
+
context_summary: contextSummary.trim() || 'No historical context available.',
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=context-pack.js.map
|