pi-harness-runtime 0.10.11 → 0.10.12
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/cli.ts +111 -0
- package/footer-status.ts +204 -0
- package/harness/agent-handoff.ts +189 -0
- package/harness/auto-compact.ts +309 -0
- package/harness/auto-quota-resume.ts +132 -0
- package/harness/autonomous-review.ts +88 -0
- package/harness/blackboard.ts +291 -0
- package/harness/context-compact-orchestrator.ts +551 -0
- package/harness/context-window-manager.ts +464 -0
- package/harness/continue-prompt.ts +242 -0
- package/harness/e2e/index.ts +44 -0
- package/harness/e2e/minimax-quota-parser.ts +88 -0
- package/harness/e2e/minimax-quota-scraper.ts +609 -0
- package/harness/e2e/openai-quota-scraper.ts +447 -0
- package/harness/e2e/playwright-runner.ts +204 -0
- package/harness/e2e/quota-status.ts +194 -0
- package/harness/e2e/test-engine.ts +398 -0
- package/harness/forked-summarizer.ts +304 -0
- package/harness/herdr-agents.ts +91 -0
- package/harness/index.ts +232 -0
- package/harness/job-state-machine.ts +363 -0
- package/harness/loop-code-agent.ts +284 -0
- package/harness/loop-controller.ts +201 -0
- package/harness/loop-review-agent.ts +295 -0
- package/harness/loop-runtime.ts +760 -0
- package/harness/loop-types.ts +118 -0
- package/harness/master-planner.ts +327 -0
- package/harness/notification-events.ts +299 -0
- package/harness/output-limit-handler.ts +316 -0
- package/harness/partial-recovery.ts +531 -0
- package/harness/project-detector/detector.ts +328 -0
- package/harness/repair-engine.ts +340 -0
- package/harness/session-memory.ts +401 -0
- package/harness/task-graph.d.ts +51 -0
- package/harness/task-graph.ts +143 -0
- package/mirror.ts +278 -0
- package/package.json +8 -12
- package/packages/a2a-adapter/src/agent.ts +139 -0
- package/packages/a2a-adapter/src/client.ts +107 -0
- package/packages/a2a-adapter/src/discovery.ts +106 -0
- package/packages/a2a-adapter/src/index.ts +38 -0
- package/packages/a2a-adapter/src/protocol.ts +46 -0
- package/packages/a2a-adapter/src/transport.ts +142 -0
- package/packages/a2a-adapter/src/types.ts +117 -0
- package/packages/auth/src/minimax-browser-auth.ts +1109 -0
- package/packages/auth/src/run-minimax-auth.ts +150 -0
- package/packages/autonomous-refactor/src/detector.ts +219 -0
- package/packages/autonomous-refactor/src/index.ts +16 -0
- package/packages/autonomous-refactor/src/planner.ts +99 -0
- package/packages/autonomous-refactor/src/types.ts +57 -0
- package/packages/autonomous-runtime/src/inbox.ts +266 -0
- package/packages/autonomous-runtime/src/index.ts +22 -0
- package/packages/autonomous-runtime/src/lease.ts +318 -0
- package/packages/autonomous-runtime/src/types.ts +257 -0
- package/packages/cache-strategy/src/cache.ts +213 -0
- package/packages/cache-strategy/src/index.ts +6 -0
- package/packages/cache-strategy/src/types.ts +40 -0
- package/packages/capability-registry/src/defaults.ts +247 -0
- package/packages/capability-registry/src/index.ts +43 -0
- package/packages/capability-registry/src/query.ts +99 -0
- package/packages/capability-registry/src/registry.ts +222 -0
- package/packages/capability-registry/src/types.d.ts +47 -0
- package/packages/capability-registry/src/types.js +10 -0
- package/packages/capability-registry/src/types.ts +83 -0
- package/packages/checkpoint/src/checkpoint-manager.ts +33 -0
- package/packages/checkpoint/src/differ.ts +281 -0
- package/packages/checkpoint/src/engine.ts +532 -0
- package/packages/checkpoint/src/index.ts +48 -0
- package/packages/checkpoint/src/storage.ts +439 -0
- package/packages/checkpoint/src/types.ts +348 -0
- package/packages/cli-plugin-sdk/src/index.ts +169 -0
- package/packages/cli-plugin-sdk/src/plugin-fs.ts +91 -0
- package/packages/cli-plugin-sdk/src/registry.ts +55 -0
- package/packages/cli-plugin-sdk/src/types.ts +32 -0
- package/packages/clipboard/dist/src/clipboard.d.ts +11 -0
- package/packages/clipboard/dist/src/clipboard.js +51 -0
- package/packages/clipboard/dist/src/copy-sync.d.ts +27 -0
- package/packages/clipboard/dist/src/copy-sync.js +170 -0
- package/packages/clipboard/dist/src/gist-relay.d.ts +48 -0
- package/packages/clipboard/dist/src/gist-relay.js +186 -0
- package/packages/clipboard/dist/src/github-login.d.ts +16 -0
- package/packages/clipboard/dist/src/github-login.js +69 -0
- package/packages/clipboard/dist/src/index.d.ts +4 -0
- package/packages/clipboard/dist/src/index.js +3 -0
- package/packages/clipboard/dist/src/types.d.ts +13 -0
- package/packages/clipboard/dist/src/types.js +5 -0
- package/packages/clipboard/src/clipboard.ts +59 -0
- package/packages/clipboard/src/copy-sync.ts +201 -0
- package/packages/clipboard/src/gist-relay.ts +240 -0
- package/packages/clipboard/src/github-login.ts +107 -0
- package/packages/clipboard/src/index.ts +3 -0
- package/packages/clipboard/src/types.ts +14 -0
- package/packages/code-generation/src/faker.ts +461 -0
- package/packages/code-generation/src/generator.ts +421 -0
- package/packages/code-generation/src/index.ts +56 -0
- package/packages/code-generation/src/templates/ejs-renderer.ts +142 -0
- package/packages/code-generation/src/templates/registry.ts +174 -0
- package/packages/code-generation/src/types.ts +373 -0
- package/packages/code-review/src/engine.ts +408 -0
- package/packages/code-review/src/index.ts +46 -0
- package/packages/code-review/src/reports/html.ts +143 -0
- package/packages/code-review/src/reports/markdown.ts +197 -0
- package/packages/code-review/src/reports/text.ts +171 -0
- package/packages/code-review/src/types.ts +324 -0
- package/packages/codex-adapter/src/executor.ts +83 -0
- package/packages/codex-adapter/src/index.ts +16 -0
- package/packages/codex-adapter/src/provider.ts +213 -0
- package/packages/codex-adapter/src/types.ts +118 -0
- package/packages/config-capture/src/index.ts +357 -0
- package/packages/context-compiler/src/budget.ts +122 -0
- package/packages/context-compiler/src/cache.ts +134 -0
- package/packages/context-compiler/src/compiler.ts +314 -0
- package/packages/context-compiler/src/deduplicate.ts +171 -0
- package/packages/context-compiler/src/filter.ts +135 -0
- package/packages/context-compiler/src/index.ts +61 -0
- package/packages/context-compiler/src/okf-loader.ts +86 -0
- package/packages/context-compiler/src/score.ts +130 -0
- package/packages/context-compiler/src/types.ts +246 -0
- package/packages/context-discovery/dist/src/discover.d.ts +3 -0
- package/packages/context-discovery/dist/src/discover.js +42 -0
- package/packages/context-discovery/dist/src/discovery.d.ts +28 -0
- package/packages/context-discovery/dist/src/discovery.js +21 -0
- package/packages/context-discovery/dist/src/index.d.ts +3 -0
- package/packages/context-discovery/dist/src/index.js +2 -0
- package/packages/context-discovery/dist/src/types.d.ts +16 -0
- package/packages/context-discovery/dist/src/types.js +2 -0
- package/packages/context-discovery/src/discover.ts +42 -0
- package/packages/context-discovery/src/discovery.ts +44 -0
- package/packages/context-discovery/src/index.ts +2 -0
- package/packages/context-discovery/src/types.ts +15 -0
- package/packages/context-manager/src/compaction.ts +139 -0
- package/packages/context-manager/src/core.ts +85 -0
- package/packages/context-manager/src/index.ts +22 -0
- package/packages/context-manager/src/types.ts +44 -0
- package/packages/cookie-sanitizer/src/atomic-write.ts +79 -0
- package/packages/cookie-sanitizer/src/detect-format.ts +102 -0
- package/packages/cookie-sanitizer/src/index.ts +89 -0
- package/packages/cookie-sanitizer/src/infer-provider.ts +103 -0
- package/packages/cookie-sanitizer/src/normalize.ts +92 -0
- package/packages/cookie-sanitizer/src/parse-json.ts +122 -0
- package/packages/cookie-sanitizer/src/parse-netscape.ts +118 -0
- package/packages/cookie-sanitizer/src/sync.ts +312 -0
- package/packages/cookie-sanitizer/src/types.ts +101 -0
- package/packages/cookie-sanitizer/src/watcher.ts +180 -0
- package/packages/cost-optimizer/src/budget.ts +138 -0
- package/packages/cost-optimizer/src/config.ts +34 -0
- package/packages/cost-optimizer/src/forecast.ts +59 -0
- package/packages/cost-optimizer/src/index.ts +74 -0
- package/packages/cost-optimizer/src/optimizer.ts +277 -0
- package/packages/cost-optimizer/src/selection.ts +264 -0
- package/packages/cost-optimizer/src/tracker.ts +122 -0
- package/packages/cost-optimizer/src/types.ts +134 -0
- package/packages/dependency-analyzer/dist/src/analyzer.d.ts +17 -0
- package/packages/dependency-analyzer/dist/src/analyzer.js +119 -0
- package/packages/dependency-analyzer/dist/src/imports.d.ts +12 -0
- package/packages/dependency-analyzer/dist/src/imports.js +73 -0
- package/packages/dependency-analyzer/dist/src/index.d.ts +4 -0
- package/packages/dependency-analyzer/dist/src/index.js +3 -0
- package/packages/dependency-analyzer/dist/src/types.d.ts +28 -0
- package/packages/dependency-analyzer/dist/src/types.js +5 -0
- package/packages/dependency-analyzer/src/analyzer.ts +140 -0
- package/packages/dependency-analyzer/src/imports.ts +93 -0
- package/packages/dependency-analyzer/src/index.ts +9 -0
- package/packages/dependency-analyzer/src/types.ts +38 -0
- package/packages/django-plugin/src/analyzer.ts +284 -0
- package/packages/django-plugin/src/index.ts +39 -0
- package/packages/django-plugin/src/types.ts +35 -0
- package/packages/doc-generator/src/detector.ts +113 -0
- package/packages/doc-generator/src/docs.ts +158 -0
- package/packages/doc-generator/src/index.ts +7 -0
- package/packages/doc-generator/src/types.ts +58 -0
- package/packages/evaluation-engine/src/engine.ts +488 -0
- package/packages/evaluation-engine/src/index.ts +23 -0
- package/packages/evaluation-engine/src/types.ts +136 -0
- package/packages/evaluation-runner/src/index.ts +6 -0
- package/packages/evaluation-runner/src/runner.ts +182 -0
- package/packages/evaluation-runner/src/types.ts +51 -0
- package/packages/event-bus/dist/src/bus.d.ts +15 -0
- package/packages/event-bus/dist/src/bus.js +98 -0
- package/packages/event-bus/dist/src/herdr-bus.d.ts +121 -0
- package/packages/event-bus/dist/src/herdr-bus.js +322 -0
- package/packages/event-bus/dist/src/index.d.ts +6 -0
- package/packages/event-bus/dist/src/index.js +4 -0
- package/packages/event-bus/dist/src/types.d.ts +27 -0
- package/packages/event-bus/dist/src/types.js +10 -0
- package/packages/event-bus/src/bus.ts +111 -0
- package/packages/event-bus/src/herdr-bus.ts +525 -0
- package/packages/event-bus/src/index.ts +38 -0
- package/packages/event-bus/src/types.ts +59 -0
- package/packages/event-store/dist/src/index.d.ts +3 -0
- package/packages/event-store/dist/src/index.js +2 -0
- package/packages/event-store/dist/src/store.d.ts +15 -0
- package/packages/event-store/dist/src/store.js +139 -0
- package/packages/event-store/dist/src/types.d.ts +48 -0
- package/packages/event-store/dist/src/types.js +5 -0
- package/packages/event-store/src/index.ts +11 -0
- package/packages/event-store/src/store.ts +168 -0
- package/packages/event-store/src/types.d.ts +48 -0
- package/packages/event-store/src/types.js +5 -0
- package/packages/event-store/src/types.ts +65 -0
- package/packages/experience-replay/src/index.ts +19 -0
- package/packages/experience-replay/src/replay.ts +348 -0
- package/packages/experience-replay/src/types.ts +128 -0
- package/packages/feedback-collector/src/collector.ts +160 -0
- package/packages/feedback-collector/src/index.ts +6 -0
- package/packages/feedback-collector/src/types.ts +51 -0
- package/packages/framework-detector/src/detector.ts +586 -0
- package/packages/framework-detector/src/index.ts +46 -0
- package/packages/framework-detector/src/signatures/registry.ts +648 -0
- package/packages/framework-detector/src/types.ts +299 -0
- package/packages/framework-plugin-sdk/src/index.ts +45 -0
- package/packages/framework-plugin-sdk/src/manager.ts +525 -0
- package/packages/framework-plugin-sdk/src/types.ts +449 -0
- package/packages/frappe-plugin/src/analyzer.ts +454 -0
- package/packages/frappe-plugin/src/index.ts +72 -0
- package/packages/frappe-plugin/src/types.ts +135 -0
- package/packages/generic-web-plugin/src/analyzer.ts +347 -0
- package/packages/generic-web-plugin/src/index.ts +61 -0
- package/packages/generic-web-plugin/src/types.ts +41 -0
- package/packages/health-monitor/src/index.ts +16 -0
- package/packages/health-monitor/src/monitor.ts +216 -0
- package/packages/health-monitor/src/types.ts +45 -0
- package/packages/intent-analyzer/dist/src/analyzer.d.ts +13 -0
- package/packages/intent-analyzer/dist/src/analyzer.js +239 -0
- package/packages/intent-analyzer/dist/src/index.d.ts +3 -0
- package/packages/intent-analyzer/dist/src/index.js +2 -0
- package/packages/intent-analyzer/dist/src/types.d.ts +26 -0
- package/packages/intent-analyzer/dist/src/types.js +7 -0
- package/packages/intent-analyzer/src/analyzer.ts +259 -0
- package/packages/intent-analyzer/src/index.ts +8 -0
- package/packages/intent-analyzer/src/types.ts +44 -0
- package/packages/knowledge-retrieval/src/index.ts +18 -0
- package/packages/knowledge-retrieval/src/mcp-client.ts +212 -0
- package/packages/knowledge-retrieval/src/types.ts +112 -0
- package/packages/laravel-plugin/src/analyzer.ts +323 -0
- package/packages/laravel-plugin/src/index.ts +40 -0
- package/packages/laravel-plugin/src/types.ts +24 -0
- package/packages/learning-engine/src/engine.ts +391 -0
- package/packages/learning-engine/src/index.ts +26 -0
- package/packages/learning-engine/src/types.ts +201 -0
- package/packages/mcp-adapter/src/index.ts +20 -0
- package/packages/mcp-adapter/src/server.ts +273 -0
- package/packages/mcp-adapter/src/tools.ts +220 -0
- package/packages/mcp-adapter/src/types.ts +79 -0
- package/packages/memory-engine/src/engine.ts +615 -0
- package/packages/memory-engine/src/index.ts +20 -0
- package/packages/memory-engine/src/types.ts +159 -0
- package/packages/model-registry/src/cost.ts +80 -0
- package/packages/model-registry/src/defaults.ts +178 -0
- package/packages/model-registry/src/index.ts +57 -0
- package/packages/model-registry/src/query.ts +85 -0
- package/packages/model-registry/src/registry.ts +188 -0
- package/packages/model-registry/src/types.d.ts +63 -0
- package/packages/model-registry/src/types.js +5 -0
- package/packages/model-registry/src/types.ts +69 -0
- package/packages/nextjs-plugin/src/analyzer.ts +247 -0
- package/packages/nextjs-plugin/src/index.ts +41 -0
- package/packages/nextjs-plugin/src/types.ts +36 -0
- package/packages/notification/src/adapters/email-adapter.ts +126 -0
- package/packages/notification/src/adapters/ntfy-adapter.ts +100 -0
- package/packages/notification/src/adapters/telegram-adapter.ts +107 -0
- package/packages/notification/src/adapters/webhook-adapter.ts +75 -0
- package/packages/notification/src/base-adapter.ts +75 -0
- package/packages/notification/src/index.ts +9 -0
- package/packages/notification/src/notification-center.ts +286 -0
- package/packages/notification/src/types.ts +89 -0
- package/packages/observability/src/alerts.ts +355 -0
- package/packages/observability/src/health.ts +325 -0
- package/packages/observability/src/index.ts +79 -0
- package/packages/observability/src/logger.ts +373 -0
- package/packages/observability/src/metrics.ts +475 -0
- package/packages/observability/src/tracer.ts +336 -0
- package/packages/observability/src/types.ts +391 -0
- package/packages/okf-indexer/src/cli.ts +25 -0
- package/packages/okf-indexer/src/indexer.ts +186 -0
- package/packages/performance-optimizer/src/index.ts +20 -0
- package/packages/performance-optimizer/src/optimizer.ts +428 -0
- package/packages/performance-optimizer/src/types.ts +112 -0
- package/packages/privilege-broker/src/approval.ts +70 -0
- package/packages/privilege-broker/src/audit.ts +142 -0
- package/packages/privilege-broker/src/executor.ts +110 -0
- package/packages/privilege-broker/src/index.ts +46 -0
- package/packages/privilege-broker/src/registry.ts +98 -0
- package/packages/privilege-broker/src/types.ts +105 -0
- package/packages/project-analyzer/src/analyzer.ts +683 -0
- package/packages/project-analyzer/src/cache.ts +329 -0
- package/packages/project-analyzer/src/command-discovery.ts +239 -0
- package/packages/project-analyzer/src/index.ts +123 -0
- package/packages/project-analyzer/src/plugins/index.ts +16 -0
- package/packages/project-analyzer/src/rule-discovery.ts +282 -0
- package/packages/project-analyzer/src/signals.ts +355 -0
- package/packages/project-analyzer/src/types.ts +412 -0
- package/packages/project-analyzer/src/walker.ts +366 -0
- package/packages/projection-engine/dist/src/engine.d.ts +61 -0
- package/packages/projection-engine/dist/src/engine.js +87 -0
- package/packages/projection-engine/dist/src/index.d.ts +2 -0
- package/packages/projection-engine/dist/src/index.js +2 -0
- package/packages/projection-engine/dist/src/project.d.ts +3 -0
- package/packages/projection-engine/dist/src/project.js +24 -0
- package/packages/projection-engine/dist/src/types.d.ts +55 -0
- package/packages/projection-engine/dist/src/types.js +5 -0
- package/packages/projection-engine/src/engine.ts +134 -0
- package/packages/projection-engine/src/index.ts +8 -0
- package/packages/projection-engine/src/project.ts +24 -0
- package/packages/projection-engine/src/types.d.ts +55 -0
- package/packages/projection-engine/src/types.js +5 -0
- package/packages/projection-engine/src/types.ts +60 -0
- package/packages/prompt-compiler/src/budget.ts +170 -0
- package/packages/prompt-compiler/src/compiler.ts +188 -0
- package/packages/prompt-compiler/src/deduplicate.ts +84 -0
- package/packages/prompt-compiler/src/index.ts +50 -0
- package/packages/prompt-compiler/src/normalize.ts +140 -0
- package/packages/prompt-compiler/src/render.ts +105 -0
- package/packages/prompt-compiler/src/section-builder.ts +279 -0
- package/packages/prompt-compiler/src/types.ts +263 -0
- package/packages/prompt-compiler/src/validate.ts +157 -0
- package/packages/prompt-versioning/src/index.ts +6 -0
- package/packages/prompt-versioning/src/types.ts +41 -0
- package/packages/prompt-versioning/src/versioning.ts +149 -0
- package/packages/provider-adapter-sdk/dist/src/builder.d.ts +140 -0
- package/packages/provider-adapter-sdk/dist/src/builder.js +332 -0
- package/packages/provider-adapter-sdk/dist/src/errors.d.ts +71 -0
- package/packages/provider-adapter-sdk/dist/src/errors.js +111 -0
- package/packages/provider-adapter-sdk/dist/src/index.d.ts +15 -0
- package/packages/provider-adapter-sdk/dist/src/index.js +19 -0
- package/packages/provider-adapter-sdk/dist/src/registry.d.ts +108 -0
- package/packages/provider-adapter-sdk/dist/src/registry.js +301 -0
- package/packages/provider-adapter-sdk/dist/src/tester.d.ts +71 -0
- package/packages/provider-adapter-sdk/dist/src/tester.js +392 -0
- package/packages/provider-adapter-sdk/dist/src/types.d.ts +182 -0
- package/packages/provider-adapter-sdk/dist/src/types.js +11 -0
- package/packages/provider-adapter-sdk/src/builder.ts +442 -0
- package/packages/provider-adapter-sdk/src/errors.ts +153 -0
- package/packages/provider-adapter-sdk/src/index.ts +84 -0
- package/packages/provider-adapter-sdk/src/registry.ts +486 -0
- package/packages/provider-adapter-sdk/src/tester.ts +483 -0
- package/packages/provider-adapter-sdk/src/types.ts +293 -0
- package/packages/provider-router/dist/capability-registry/src/types.d.ts +47 -0
- package/packages/provider-router/dist/capability-registry/src/types.js +10 -0
- package/packages/provider-router/dist/provider-router/src/index.d.ts +23 -0
- package/packages/provider-router/dist/provider-router/src/index.js +25 -0
- package/packages/provider-router/dist/provider-router/src/policy.d.ts +10 -0
- package/packages/provider-router/dist/provider-router/src/policy.js +45 -0
- package/packages/provider-router/dist/provider-router/src/provider-router.d.ts +56 -0
- package/packages/provider-router/dist/provider-router/src/provider-router.js +222 -0
- package/packages/provider-router/dist/provider-router/src/strategies.d.ts +19 -0
- package/packages/provider-router/dist/provider-router/src/strategies.js +110 -0
- package/packages/provider-router/dist/provider-router/src/types.d.ts +91 -0
- package/packages/provider-router/dist/provider-router/src/types.js +10 -0
- package/packages/provider-router/dist/src/index.d.ts +23 -0
- package/packages/provider-router/dist/src/index.js +25 -0
- package/packages/provider-router/dist/src/policy.d.ts +10 -0
- package/packages/provider-router/dist/src/policy.js +45 -0
- package/packages/provider-router/dist/src/provider-router.d.ts +56 -0
- package/packages/provider-router/dist/src/provider-router.js +222 -0
- package/packages/provider-router/dist/src/strategies.d.ts +19 -0
- package/packages/provider-router/dist/src/strategies.js +110 -0
- package/packages/provider-router/dist/src/types.d.ts +91 -0
- package/packages/provider-router/dist/src/types.js +10 -0
- package/packages/provider-router/dist/types/src/runtime-types.d.ts +412 -0
- package/packages/provider-router/dist/types/src/runtime-types.js +2 -0
- package/packages/provider-router/src/index.ts +49 -0
- package/packages/provider-router/src/policy.ts +50 -0
- package/packages/provider-router/src/provider-router.ts +315 -0
- package/packages/provider-router/src/strategies.ts +158 -0
- package/packages/provider-router/src/types.ts +130 -0
- package/packages/provider-selector/src/index.ts +13 -0
- package/packages/provider-selector/src/selector.ts +120 -0
- package/packages/provider-selector/src/types.ts +33 -0
- package/packages/providers/dist/src/adapters.d.ts +133 -0
- package/packages/providers/dist/src/adapters.js +236 -0
- package/packages/providers/dist/src/deepagents-adapter.d.ts +78 -0
- package/packages/providers/dist/src/deepagents-adapter.js +323 -0
- package/packages/providers/dist/src/glm-usage.d.ts +102 -0
- package/packages/providers/dist/src/glm-usage.js +197 -0
- package/packages/providers/dist/src/index.d.ts +11 -0
- package/packages/providers/dist/src/index.js +11 -0
- package/packages/providers/dist/src/openai-usage.d.ts +103 -0
- package/packages/providers/dist/src/openai-usage.js +208 -0
- package/packages/providers/dist/src/provider-id.d.ts +46 -0
- package/packages/providers/dist/src/provider-id.js +113 -0
- package/packages/providers/src/adapters.ts +362 -0
- package/packages/providers/src/deepagents-adapter.ts +458 -0
- package/packages/providers/src/glm-usage.ts +248 -0
- package/packages/providers/src/index.ts +11 -0
- package/packages/providers/src/openai-usage.ts +263 -0
- package/packages/providers/src/provider-id.ts +129 -0
- package/packages/quota-manager/dist/src/examples/tui-usage-integration.d.ts +35 -0
- package/packages/quota-manager/dist/src/examples/tui-usage-integration.js +73 -0
- package/packages/quota-manager/dist/src/index.d.ts +8 -0
- package/packages/quota-manager/dist/src/index.js +8 -0
- package/packages/quota-manager/dist/src/quota-manager.d.ts +70 -0
- package/packages/quota-manager/dist/src/quota-manager.js +260 -0
- package/packages/quota-manager/dist/src/tui-usage-monitor.d.ts +96 -0
- package/packages/quota-manager/dist/src/tui-usage-monitor.js +268 -0
- package/packages/quota-manager/src/examples/tui-usage-integration.ts +72 -0
- package/packages/quota-manager/src/index.ts +8 -0
- package/packages/quota-manager/src/quota-manager.ts +336 -0
- package/packages/quota-manager/src/tui-usage-monitor.ts +355 -0
- package/packages/rate-limiter/src/index.ts +6 -0
- package/packages/rate-limiter/src/limiter.ts +122 -0
- package/packages/rate-limiter/src/types.ts +41 -0
- package/packages/react-vite-plugin/src/analyzer.ts +226 -0
- package/packages/react-vite-plugin/src/index.ts +39 -0
- package/packages/react-vite-plugin/src/types.ts +28 -0
- package/packages/release-manager/src/changelog.ts +148 -0
- package/packages/release-manager/src/index.ts +21 -0
- package/packages/release-manager/src/types.ts +50 -0
- package/packages/release-manager/src/version.ts +52 -0
- package/packages/requirement-compiler/src/ambiguity-detector.ts +302 -0
- package/packages/requirement-compiler/src/classifier.ts +145 -0
- package/packages/requirement-compiler/src/compiler.ts +328 -0
- package/packages/requirement-compiler/src/extractor.ts +155 -0
- package/packages/requirement-compiler/src/index.ts +36 -0
- package/packages/requirement-compiler/src/normalizer.ts +161 -0
- package/packages/requirement-compiler/src/risk-detector.ts +58 -0
- package/packages/requirement-compiler/src/types.ts +596 -0
- package/packages/runtime/dist/src/command-executor.d.ts +129 -0
- package/packages/runtime/dist/src/command-executor.js +383 -0
- package/packages/runtime/dist/src/index.d.ts +11 -0
- package/packages/runtime/dist/src/index.js +11 -0
- package/packages/runtime/dist/src/local-runtime-agent.d.ts +111 -0
- package/packages/runtime/dist/src/local-runtime-agent.js +356 -0
- package/packages/runtime/dist/src/policy-engine.d.ts +203 -0
- package/packages/runtime/dist/src/policy-engine.js +592 -0
- package/packages/runtime/dist/src/runtime-api.d.ts +137 -0
- package/packages/runtime/dist/src/runtime-api.js +454 -0
- package/packages/runtime/dist/src/workspace-manager.d.ts +162 -0
- package/packages/runtime/dist/src/workspace-manager.js +451 -0
- package/packages/runtime/src/command-executor.ts +523 -0
- package/packages/runtime/src/index.ts +11 -0
- package/packages/runtime/src/local-runtime-agent.ts +480 -0
- package/packages/runtime/src/policy-engine.ts +813 -0
- package/packages/runtime/src/runtime-api.ts +665 -0
- package/packages/runtime/src/workspace-manager.ts +591 -0
- package/packages/scheduler/src/scheduler.ts +50 -0
- package/packages/scheduler-adapter/src/cron.ts +123 -0
- package/packages/scheduler-adapter/src/index.ts +9 -0
- package/packages/scheduler-adapter/src/interface.ts +61 -0
- package/packages/scheduler-adapter/src/internal.ts +99 -0
- package/packages/scheduler-adapter/src/systemd.ts +221 -0
- package/packages/session/src/history.ts +353 -0
- package/packages/session/src/index.ts +53 -0
- package/packages/session/src/manager.ts +481 -0
- package/packages/session/src/policy.ts +363 -0
- package/packages/session/src/store.ts +348 -0
- package/packages/session/src/types.ts +275 -0
- package/packages/session-api/dist/src/api.d.ts +83 -0
- package/packages/session-api/dist/src/api.js +49 -0
- package/packages/session-api/dist/src/index.d.ts +2 -0
- package/packages/session-api/dist/src/index.js +2 -0
- package/packages/session-api/dist/src/types.d.ts +22 -0
- package/packages/session-api/dist/src/types.js +5 -0
- package/packages/session-api/src/api.ts +117 -0
- package/packages/session-api/src/index.ts +1 -0
- package/packages/session-api/src/types.ts +23 -0
- package/packages/session-export/dist/src/exporter.d.ts +28 -0
- package/packages/session-export/dist/src/exporter.js +42 -0
- package/packages/session-export/dist/src/index.d.ts +2 -0
- package/packages/session-export/dist/src/index.js +2 -0
- package/packages/session-export/dist/src/types.d.ts +20 -0
- package/packages/session-export/dist/src/types.js +5 -0
- package/packages/session-export/src/exporter.ts +81 -0
- package/packages/session-export/src/index.ts +1 -0
- package/packages/session-export/src/types.ts +22 -0
- package/packages/shared-context/src/index.ts +7 -0
- package/packages/shared-context/src/shared-context.ts +42 -0
- package/packages/skill-registry/src/defaults.ts +146 -0
- package/packages/skill-registry/src/index.ts +48 -0
- package/packages/skill-registry/src/matching.ts +118 -0
- package/packages/skill-registry/src/registry.ts +211 -0
- package/packages/skill-registry/src/types.ts +97 -0
- package/packages/sprint-planner/src/decomposer.ts +57 -0
- package/packages/sprint-planner/src/index.ts +16 -0
- package/packages/sprint-planner/src/planner.ts +150 -0
- package/packages/sprint-planner/src/types.ts +59 -0
- package/packages/subscription-engine/dist/src/engine.d.ts +13 -0
- package/packages/subscription-engine/dist/src/engine.js +40 -0
- package/packages/subscription-engine/dist/src/index.d.ts +2 -0
- package/packages/subscription-engine/dist/src/index.js +2 -0
- package/packages/subscription-engine/dist/src/subscriptions.d.ts +19 -0
- package/packages/subscription-engine/dist/src/subscriptions.js +39 -0
- package/packages/subscription-engine/dist/src/types.d.ts +24 -0
- package/packages/subscription-engine/dist/src/types.js +5 -0
- package/packages/subscription-engine/src/engine.ts +55 -0
- package/packages/subscription-engine/src/index.ts +6 -0
- package/packages/subscription-engine/src/subscriptions.ts +55 -0
- package/packages/subscription-engine/src/types.ts +27 -0
- package/packages/task-compiler/src/command-policy.ts +193 -0
- package/packages/task-compiler/src/compiler.ts +114 -0
- package/packages/task-compiler/src/decompose.ts +265 -0
- package/packages/task-compiler/src/file-scope.ts +240 -0
- package/packages/task-compiler/src/graph.ts +144 -0
- package/packages/task-compiler/src/index.ts +38 -0
- package/packages/task-compiler/src/types.ts +225 -0
- package/packages/task-compiler/src/validate.ts +218 -0
- package/packages/task-compiler/src/verification.ts +248 -0
- package/packages/tencentdb-memory/src/client.ts +130 -0
- package/packages/tencentdb-memory/src/index.ts +32 -0
- package/packages/tencentdb-memory/src/loader.ts +150 -0
- package/packages/tencentdb-memory/src/mcp-tools.ts +213 -0
- package/packages/tencentdb-memory/src/types.ts +101 -0
- package/packages/tencentdb-sync/src/cli.ts +363 -0
- package/packages/tencentdb-sync/src/client.ts +268 -0
- package/packages/tencentdb-sync/src/config.ts +139 -0
- package/packages/tencentdb-sync/src/index.ts +15 -0
- package/packages/test-data-generator/src/faker-adapter.ts +657 -0
- package/packages/test-data-generator/src/generator.ts +461 -0
- package/packages/test-data-generator/src/index.ts +48 -0
- package/packages/test-data-generator/src/types.ts +421 -0
- package/packages/test-generator/src/generator.ts +144 -0
- package/packages/test-generator/src/index.ts +11 -0
- package/packages/test-generator/src/types.ts +39 -0
- package/packages/todo-bd-sync/src/detector.ts +171 -0
- package/packages/todo-bd-sync/src/extension.ts +129 -0
- package/packages/todo-bd-sync/src/index.ts +401 -0
- package/packages/todo-bd-sync/src/sync.ts +322 -0
- package/packages/todo-bd-sync/src/task-analyzer.ts +314 -0
- package/packages/todo-bd-sync/src/todo-reminder.ts +418 -0
- package/packages/todo-bd-sync/src/types.ts +137 -0
- package/packages/token-estimation/src/index.ts +192 -0
- package/packages/token-optimizer/src/index.ts +15 -0
- package/packages/token-optimizer/src/optimizer.ts +150 -0
- package/packages/token-optimizer/src/types.ts +47 -0
- package/packages/types/src/agent-worker-types.d.ts +206 -0
- package/packages/types/src/agent-worker-types.js +41 -0
- package/packages/types/src/agent-worker-types.ts +264 -0
- package/packages/types/src/ai-providers.d.ts +36 -0
- package/packages/types/src/ai-providers.js +66 -0
- package/packages/types/src/ai-providers.ts +73 -0
- package/packages/types/src/runtime-types.d.ts +418 -0
- package/packages/types/src/runtime-types.js +3 -0
- package/packages/types/src/runtime-types.ts +588 -0
- package/packages/workflow-events/dist/src/events.d.ts +38 -0
- package/packages/workflow-events/dist/src/events.js +55 -0
- package/packages/workflow-events/dist/src/index.d.ts +2 -0
- package/packages/workflow-events/dist/src/index.js +2 -0
- package/packages/workflow-events/dist/src/pipeline.d.ts +21 -0
- package/packages/workflow-events/dist/src/pipeline.js +36 -0
- package/packages/workflow-events/dist/src/types.d.ts +110 -0
- package/packages/workflow-events/dist/src/types.js +5 -0
- package/packages/workflow-events/src/events.ts +86 -0
- package/packages/workflow-events/src/index.ts +19 -0
- package/packages/workflow-events/src/pipeline.ts +41 -0
- package/packages/workflow-events/src/types.d.ts +110 -0
- package/packages/workflow-events/src/types.js +5 -0
- package/packages/workflow-events/src/types.ts +139 -0
- package/packages/workspace-scanner/dist/src/detect.d.ts +3 -0
- package/packages/workspace-scanner/dist/src/detect.js +60 -0
- package/packages/workspace-scanner/dist/src/git.d.ts +7 -0
- package/packages/workspace-scanner/dist/src/git.js +75 -0
- package/packages/workspace-scanner/dist/src/index.d.ts +5 -0
- package/packages/workspace-scanner/dist/src/index.js +4 -0
- package/packages/workspace-scanner/dist/src/scanner.d.ts +11 -0
- package/packages/workspace-scanner/dist/src/scanner.js +59 -0
- package/packages/workspace-scanner/dist/src/types.d.ts +35 -0
- package/packages/workspace-scanner/dist/src/types.js +5 -0
- package/packages/workspace-scanner/src/detect.ts +77 -0
- package/packages/workspace-scanner/src/git.ts +83 -0
- package/packages/workspace-scanner/src/index.ts +9 -0
- package/packages/workspace-scanner/src/scanner.ts +73 -0
- package/packages/workspace-scanner/src/types.ts +48 -0
- package/packages/worktree/dist/src/index.d.ts +7 -0
- package/packages/worktree/dist/src/index.js +7 -0
- package/packages/worktree/dist/src/worktree.d.ts +88 -0
- package/packages/worktree/dist/src/worktree.js +239 -0
- package/packages/worktree/src/index.ts +7 -0
- package/packages/worktree/src/worktree.ts +290 -0
- package/packages/write-review/src/blackboard.ts +249 -0
- package/packages/write-review/src/gate.ts +169 -0
- package/packages/write-review/src/index.ts +18 -0
- package/packages/write-review/src/injection.ts +170 -0
- package/packages/write-review/src/review.ts +206 -0
- package/packages/write-review/src/trigger.ts +133 -0
- package/packages/write-review/src/types.ts +90 -0
- package/proactive-compact.ts +90 -0
- package/prompts/tencentdb-connect.md +35 -0
- package/prompts/tencentdb-setup.md +101 -0
- package/prompts/tencentdb.md +88 -0
- package/renderer.ts +205 -0
- package/skills/harness-runtime/SKILL.md +237 -0
- package/status-parsers.ts +84 -0
- package/tracker.ts +72 -0
- package/windows.ts +121 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Manager — RFC-0010
|
|
3
|
+
*
|
|
4
|
+
* Manages context window usage across providers.
|
|
5
|
+
* Tracks utilization and suggests strategies when approaching limits.
|
|
6
|
+
*
|
|
7
|
+
* Enhanced with:
|
|
8
|
+
* - Compact thresholds (proactive at 85%, blocking at 97%)
|
|
9
|
+
* - Circuit breaker for consecutive compact failures
|
|
10
|
+
* - Buffer-aware token estimation
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
ContextWindowUpdate,
|
|
15
|
+
ContextWindowStats,
|
|
16
|
+
ContextWindowConfig,
|
|
17
|
+
ProviderMessage,
|
|
18
|
+
CompactableMessage,
|
|
19
|
+
} from "../packages/types/src/runtime-types.ts";
|
|
20
|
+
import {
|
|
21
|
+
roughTokenCount,
|
|
22
|
+
roughMessagesTokens,
|
|
23
|
+
} from "../packages/token-estimation/src/index.ts";
|
|
24
|
+
|
|
25
|
+
// --- Constants ----------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
/** Proactive compact triggers at this many tokens before limit */
|
|
28
|
+
export const AUTOCOMPACT_BUFFER_TOKENS = 13_000;
|
|
29
|
+
|
|
30
|
+
/** Warning threshold buffer */
|
|
31
|
+
export const WARNING_THRESHOLD_BUFFER_TOKENS = 20_000;
|
|
32
|
+
|
|
33
|
+
/** Blocking threshold buffer */
|
|
34
|
+
export const BLOCKING_THRESHOLD_BUFFER_TOKENS = 20_000;
|
|
35
|
+
|
|
36
|
+
/** Maximum consecutive compact failures before circuit breaker */
|
|
37
|
+
export const MAX_CONSECUTIVE_COMPACT_FAILURES = 3;
|
|
38
|
+
|
|
39
|
+
// --- Types ------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
export interface CompactThresholds {
|
|
42
|
+
/** Trigger proactive compact at this utilization (0.85) */
|
|
43
|
+
autoCompactAt: number;
|
|
44
|
+
/** Show warning at this utilization (0.80) */
|
|
45
|
+
warningAt: number;
|
|
46
|
+
/** Block API calls at this utilization (0.97) */
|
|
47
|
+
blockingAt: number;
|
|
48
|
+
/** Max compact retry attempts */
|
|
49
|
+
maxRetries: number;
|
|
50
|
+
/** Reserved tokens for output during compact */
|
|
51
|
+
reservedOutputTokens: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface TokenEstimate {
|
|
55
|
+
total: number;
|
|
56
|
+
bufferRemaining: number;
|
|
57
|
+
utilizationPct: number;
|
|
58
|
+
atRisk: boolean;
|
|
59
|
+
shouldCompact: boolean;
|
|
60
|
+
shouldBlock: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// --- Context Window Manager -------------------------------------------------
|
|
64
|
+
|
|
65
|
+
export class ContextWindowManager {
|
|
66
|
+
private stats: Map<string, ContextWindowStats> = new Map();
|
|
67
|
+
private configs: Map<string, ContextWindowConfig> = new Map();
|
|
68
|
+
private consecutiveFailures = 0;
|
|
69
|
+
private lastCompactTimestamp = 0;
|
|
70
|
+
private modelContextWindows: Map<string, number> = new Map();
|
|
71
|
+
|
|
72
|
+
constructor(defaultConfigs?: Record<string, ContextWindowConfig>) {
|
|
73
|
+
// Initialize with defaults
|
|
74
|
+
const defaults: Record<string, ContextWindowConfig> = {
|
|
75
|
+
minimax: {
|
|
76
|
+
warningThreshold: 0.8,
|
|
77
|
+
criticalThreshold: 0.95,
|
|
78
|
+
strategy: "truncate",
|
|
79
|
+
},
|
|
80
|
+
anthropic: {
|
|
81
|
+
warningThreshold: 0.85,
|
|
82
|
+
criticalThreshold: 0.97,
|
|
83
|
+
strategy: "truncate",
|
|
84
|
+
},
|
|
85
|
+
openai: {
|
|
86
|
+
warningThreshold: 0.8,
|
|
87
|
+
criticalThreshold: 0.95,
|
|
88
|
+
strategy: "truncate",
|
|
89
|
+
},
|
|
90
|
+
...defaultConfigs,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
for (const [provider, config] of Object.entries(defaults)) {
|
|
94
|
+
this.configs.set(provider, config);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// --- Public API -----------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Update context window stats after a request
|
|
102
|
+
*/
|
|
103
|
+
updateStats(update: ContextWindowUpdate): ContextWindowStats {
|
|
104
|
+
const { provider, model, maxTokens, usedTokens } = update;
|
|
105
|
+
const stats: ContextWindowStats = {
|
|
106
|
+
provider,
|
|
107
|
+
model,
|
|
108
|
+
maxTokens,
|
|
109
|
+
usedTokens,
|
|
110
|
+
availableTokens: maxTokens - usedTokens,
|
|
111
|
+
utilizationPct: usedTokens / maxTokens,
|
|
112
|
+
};
|
|
113
|
+
this.stats.set(`${provider}:${model}`, stats);
|
|
114
|
+
return stats;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get stats for a provider/model
|
|
119
|
+
*/
|
|
120
|
+
getStats(provider: string, model: string): ContextWindowStats | null {
|
|
121
|
+
return this.stats.get(`${provider}:${model}`) ?? null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get all stats
|
|
126
|
+
*/
|
|
127
|
+
getAllStats(): ContextWindowStats[] {
|
|
128
|
+
return Array.from(this.stats.values());
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Check utilization status
|
|
133
|
+
*/
|
|
134
|
+
getUtilizationStatus(
|
|
135
|
+
provider: string,
|
|
136
|
+
model: string,
|
|
137
|
+
): "ok" | "warning" | "critical" | "unknown" {
|
|
138
|
+
const stats = this.getStats(provider, model);
|
|
139
|
+
if (!stats) return "unknown";
|
|
140
|
+
|
|
141
|
+
const config = this.configs.get(provider);
|
|
142
|
+
if (!config) return "ok";
|
|
143
|
+
|
|
144
|
+
const pct = stats.utilizationPct;
|
|
145
|
+
if (pct >= config.criticalThreshold) return "critical";
|
|
146
|
+
if (pct >= config.warningThreshold) return "warning";
|
|
147
|
+
return "ok";
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Get compact thresholds for a provider
|
|
152
|
+
*/
|
|
153
|
+
getCompactThresholds(provider: string): CompactThresholds {
|
|
154
|
+
const config = this.configs.get(provider);
|
|
155
|
+
return {
|
|
156
|
+
autoCompactAt: 0.85,
|
|
157
|
+
warningAt: config?.warningThreshold ?? 0.8,
|
|
158
|
+
blockingAt: config?.criticalThreshold ?? 0.97,
|
|
159
|
+
maxRetries: MAX_CONSECUTIVE_COMPACT_FAILURES,
|
|
160
|
+
reservedOutputTokens: 20_000,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Get effective context window size (minus reserved output tokens)
|
|
166
|
+
*/
|
|
167
|
+
getEffectiveContextWindow(provider: string, model: string): number {
|
|
168
|
+
const key = `${provider}:${model}`;
|
|
169
|
+
const base = this.modelContextWindows.get(key) ?? 200_000;
|
|
170
|
+
const thresholds = this.getCompactThresholds(provider);
|
|
171
|
+
return base - thresholds.reservedOutputTokens;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Set the context window size for a model
|
|
176
|
+
*/
|
|
177
|
+
setContextWindow(provider: string, model: string, maxTokens: number): void {
|
|
178
|
+
this.modelContextWindows.set(`${provider}:${model}`, maxTokens);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Estimate remaining capacity
|
|
183
|
+
*/
|
|
184
|
+
estimateRemainingRequests(
|
|
185
|
+
provider: string,
|
|
186
|
+
model: string,
|
|
187
|
+
avgTokensPerRequest: number,
|
|
188
|
+
): number | null {
|
|
189
|
+
const stats = this.getStats(provider, model);
|
|
190
|
+
if (!stats) return null;
|
|
191
|
+
return Math.floor(stats.availableTokens / avgTokensPerRequest);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Estimate tokens with buffer awareness for compact decisions
|
|
196
|
+
*/
|
|
197
|
+
estimateTokensWithBuffer(opts: {
|
|
198
|
+
messages: CompactableMessage[];
|
|
199
|
+
tools?: Array<{
|
|
200
|
+
name: string;
|
|
201
|
+
description?: string;
|
|
202
|
+
input_schema?: Record<string, unknown>;
|
|
203
|
+
}>;
|
|
204
|
+
systemPrompt?: string;
|
|
205
|
+
provider: string;
|
|
206
|
+
model: string;
|
|
207
|
+
}): TokenEstimate {
|
|
208
|
+
const { messages, tools, systemPrompt, provider, model } = opts;
|
|
209
|
+
|
|
210
|
+
// Calculate message tokens
|
|
211
|
+
const messageTokens = roughMessagesTokens(
|
|
212
|
+
messages.map((m) => ({
|
|
213
|
+
role: m.role,
|
|
214
|
+
content: m.content,
|
|
215
|
+
})),
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
// Calculate tool tokens
|
|
219
|
+
const toolTokens = (tools ?? []).reduce(
|
|
220
|
+
(sum, tool) =>
|
|
221
|
+
sum +
|
|
222
|
+
roughTokenCount(tool.name) +
|
|
223
|
+
roughTokenCount(tool.description ?? "") +
|
|
224
|
+
roughTokenCount(JSON.stringify(tool.input_schema ?? {})),
|
|
225
|
+
0,
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
// Calculate system prompt tokens
|
|
229
|
+
const systemTokens = systemPrompt ? roughTokenCount(systemPrompt) : 0;
|
|
230
|
+
|
|
231
|
+
const total = messageTokens + toolTokens + systemTokens;
|
|
232
|
+
const effectiveWindow = this.getEffectiveContextWindow(provider, model);
|
|
233
|
+
const bufferRemaining = effectiveWindow - total;
|
|
234
|
+
|
|
235
|
+
// Determine if we should compact or block
|
|
236
|
+
const autoCompactTokens = effectiveWindow - AUTOCOMPACT_BUFFER_TOKENS;
|
|
237
|
+
const blockingTokens = effectiveWindow - BLOCKING_THRESHOLD_BUFFER_TOKENS;
|
|
238
|
+
|
|
239
|
+
const shouldCompact = total >= autoCompactTokens;
|
|
240
|
+
const shouldBlock = total >= blockingTokens;
|
|
241
|
+
|
|
242
|
+
return {
|
|
243
|
+
total,
|
|
244
|
+
bufferRemaining,
|
|
245
|
+
utilizationPct: total / effectiveWindow,
|
|
246
|
+
atRisk: bufferRemaining < AUTOCOMPACT_BUFFER_TOKENS,
|
|
247
|
+
shouldCompact,
|
|
248
|
+
shouldBlock,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Check if we should trigger proactive compact
|
|
254
|
+
*/
|
|
255
|
+
shouldProactiveCompact(estimate: TokenEstimate): boolean {
|
|
256
|
+
return estimate.shouldCompact && !this.shouldCircuitBreak();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Check if we should block (must compact before API call)
|
|
261
|
+
*/
|
|
262
|
+
shouldBlockApiCall(estimate: TokenEstimate): boolean {
|
|
263
|
+
return estimate.shouldBlock;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Record a compact failure (for circuit breaker)
|
|
268
|
+
*/
|
|
269
|
+
recordCompactFailure(): number {
|
|
270
|
+
this.consecutiveFailures++;
|
|
271
|
+
return this.consecutiveFailures;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Record a compact success (reset circuit breaker)
|
|
276
|
+
*/
|
|
277
|
+
recordCompactSuccess(): void {
|
|
278
|
+
this.consecutiveFailures = 0;
|
|
279
|
+
this.lastCompactTimestamp = Date.now();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Check if circuit breaker should activate
|
|
284
|
+
*/
|
|
285
|
+
shouldCircuitBreak(): boolean {
|
|
286
|
+
return this.consecutiveFailures >= MAX_CONSECUTIVE_COMPACT_FAILURES;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Get consecutive failure count
|
|
291
|
+
*/
|
|
292
|
+
getConsecutiveFailures(): number {
|
|
293
|
+
return this.consecutiveFailures;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Reset circuit breaker
|
|
298
|
+
*/
|
|
299
|
+
resetCircuitBreaker(): void {
|
|
300
|
+
this.consecutiveFailures = 0;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Get time since last compact (ms)
|
|
305
|
+
*/
|
|
306
|
+
getTimeSinceLastCompact(): number {
|
|
307
|
+
return Date.now() - this.lastCompactTimestamp;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Prepare messages for a request (truncation/summarization strategy)
|
|
312
|
+
*/
|
|
313
|
+
prepareMessages(
|
|
314
|
+
messages: ProviderMessage[],
|
|
315
|
+
maxTokens: number,
|
|
316
|
+
strategy: "truncate" | "summarize" | "split" = "truncate",
|
|
317
|
+
): ProviderMessage[] {
|
|
318
|
+
const estimateTokens = (text: string) => Math.ceil(text.length / 4);
|
|
319
|
+
let totalTokens = messages.reduce(
|
|
320
|
+
(sum, m) => sum + estimateTokens(m.content),
|
|
321
|
+
0,
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
if (totalTokens <= maxTokens) {
|
|
325
|
+
return messages;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (strategy === "truncate") {
|
|
329
|
+
// Remove oldest messages first
|
|
330
|
+
const truncated = [...messages];
|
|
331
|
+
while (totalTokens > maxTokens && truncated.length > 1) {
|
|
332
|
+
const removed = truncated.shift();
|
|
333
|
+
if (removed) {
|
|
334
|
+
totalTokens -= estimateTokens(removed.content);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return truncated;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// summarize and split both fall back to truncate for now
|
|
341
|
+
// In a real implementation, split would return multiple message batches
|
|
342
|
+
return this.prepareMessages(messages, maxTokens, "truncate");
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Set config for a provider
|
|
347
|
+
*/
|
|
348
|
+
setConfig(provider: string, config: ContextWindowConfig): void {
|
|
349
|
+
this.configs.set(provider, config);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Get config for a provider
|
|
354
|
+
*/
|
|
355
|
+
getConfig(provider: string): ContextWindowConfig | undefined {
|
|
356
|
+
return this.configs.get(provider);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Generate utilization report
|
|
361
|
+
*/
|
|
362
|
+
generateReport(): string {
|
|
363
|
+
const lines = ["Context Window Utilization Report", "=".repeat(40), ""];
|
|
364
|
+
|
|
365
|
+
for (const [, stats] of this.stats.entries()) {
|
|
366
|
+
const config = this.configs.get(stats.provider);
|
|
367
|
+
const bar = this.renderBar(stats.utilizationPct);
|
|
368
|
+
const status = this.getUtilizationStatus(stats.provider, stats.model);
|
|
369
|
+
|
|
370
|
+
lines.push(`${stats.provider}/${stats.model}`);
|
|
371
|
+
lines.push(` ${bar} ${(stats.utilizationPct * 100).toFixed(1)}%`);
|
|
372
|
+
lines.push(
|
|
373
|
+
` Used: ${stats.usedTokens.toLocaleString()} / ${stats.maxTokens.toLocaleString()} tokens`,
|
|
374
|
+
);
|
|
375
|
+
lines.push(
|
|
376
|
+
` Available: ${stats.availableTokens.toLocaleString()} tokens`,
|
|
377
|
+
);
|
|
378
|
+
lines.push(` Status: ${status.toUpperCase()}`);
|
|
379
|
+
if (config) {
|
|
380
|
+
lines.push(
|
|
381
|
+
` Thresholds: warning=${(config.warningThreshold * 100).toFixed(0)}%, critical=${(config.criticalThreshold * 100).toFixed(0)}%`,
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
lines.push("");
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Add circuit breaker status
|
|
388
|
+
lines.push("Circuit Breaker Status", "-".repeat(20));
|
|
389
|
+
lines.push(`Consecutive failures: ${this.consecutiveFailures}`);
|
|
390
|
+
lines.push(`Circuit broken: ${this.shouldCircuitBreak() ? "YES ⚠️" : "No"}`);
|
|
391
|
+
|
|
392
|
+
return lines.join("\n");
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
private renderBar(pct: number, width: number = 20): string {
|
|
396
|
+
const filled = Math.round(pct * width);
|
|
397
|
+
const empty = width - filled;
|
|
398
|
+
return "[" + "█".repeat(filled) + "░".repeat(empty) + "]";
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// --- Microcompact Helpers ---------------------------------------------------
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Microcompact: prune old tool results based on time gap.
|
|
406
|
+
* Returns the number of tokens freed.
|
|
407
|
+
*/
|
|
408
|
+
export function microcompactToolResults(
|
|
409
|
+
messages: CompactableMessage[],
|
|
410
|
+
options: {
|
|
411
|
+
maxAgeMs?: number;
|
|
412
|
+
keepRecent?: number;
|
|
413
|
+
} = {},
|
|
414
|
+
): number {
|
|
415
|
+
const maxAgeMs = options.maxAgeMs ?? 30 * 60 * 1000; // 30 minutes
|
|
416
|
+
const keepRecent = options.keepRecent ?? 2;
|
|
417
|
+
|
|
418
|
+
const now = Date.now();
|
|
419
|
+
let freedTokens = 0;
|
|
420
|
+
|
|
421
|
+
for (const msg of messages) {
|
|
422
|
+
if (msg.role !== "assistant" || !msg.toolResults) continue;
|
|
423
|
+
|
|
424
|
+
// Sort by timestamp, newest first
|
|
425
|
+
const sorted = [...msg.toolResults].sort(
|
|
426
|
+
(a, b) => b.timestamp - a.timestamp,
|
|
427
|
+
);
|
|
428
|
+
|
|
429
|
+
// Keep IDs of recent tool results
|
|
430
|
+
const keepIds = new Set(sorted.slice(0, keepRecent).map((r) => r.id));
|
|
431
|
+
|
|
432
|
+
// Prune old ones
|
|
433
|
+
for (const tr of msg.toolResults) {
|
|
434
|
+
if (!keepIds.has(tr.id) && now - tr.timestamp > maxAgeMs) {
|
|
435
|
+
freedTokens += tr.tokens;
|
|
436
|
+
// Truncate content but keep marker
|
|
437
|
+
tr.content = "[Old tool result cleared]";
|
|
438
|
+
tr.tokens = 0;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return freedTokens;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Parse token gap from a prompt-too-long error message.
|
|
448
|
+
* Returns the gap (excess tokens) or undefined if unparseable.
|
|
449
|
+
*/
|
|
450
|
+
export function parseTokenGapFromError(
|
|
451
|
+
errorMessage: string,
|
|
452
|
+
): number | undefined {
|
|
453
|
+
// Match patterns like: "137500 tokens > 135000 maximum"
|
|
454
|
+
const match = errorMessage.match(
|
|
455
|
+
/prompt is too long[^0-9]*(\d+)\s*tokens?\s*>\s*(\d+)/i,
|
|
456
|
+
);
|
|
457
|
+
if (match) {
|
|
458
|
+
const actual = parseInt(match[1], 10);
|
|
459
|
+
const limit = parseInt(match[2], 10);
|
|
460
|
+
const gap = actual - limit;
|
|
461
|
+
return gap > 0 ? gap : undefined;
|
|
462
|
+
}
|
|
463
|
+
return undefined;
|
|
464
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continue Prompt Generator — RFC-0029
|
|
3
|
+
*
|
|
4
|
+
* Generates context-aware continue prompts after compaction.
|
|
5
|
+
* Based on the reference implementation's buildContinuePrompt() pattern.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { CompactableMessage } from "../packages/types/src/runtime-types.js";
|
|
9
|
+
|
|
10
|
+
// --- Types ------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
export interface ContinueContext {
|
|
13
|
+
/** Task identifier */
|
|
14
|
+
taskId: string;
|
|
15
|
+
/** Original task requirement */
|
|
16
|
+
requirement: string;
|
|
17
|
+
/** What was already completed */
|
|
18
|
+
whatWasCompleted: string[];
|
|
19
|
+
/** What still needs to be done */
|
|
20
|
+
whatNeedsToBeDone: string[];
|
|
21
|
+
/** Files that may have partial content */
|
|
22
|
+
partialFiles: string[];
|
|
23
|
+
/** Key decisions made */
|
|
24
|
+
decisions: string[];
|
|
25
|
+
/** Suggested next step */
|
|
26
|
+
nextStep?: string;
|
|
27
|
+
/** Current working directory */
|
|
28
|
+
workingDir?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface MinimalContinueContext {
|
|
32
|
+
/** LLM-generated summary */
|
|
33
|
+
summary: string;
|
|
34
|
+
/** Recent messages to preserve */
|
|
35
|
+
recentMessages: CompactableMessage[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// --- Continue Prompt Generator -----------------------------------------------
|
|
39
|
+
|
|
40
|
+
export class ContinuePromptGenerator {
|
|
41
|
+
/**
|
|
42
|
+
* Generate a comprehensive continue prompt for post-compact resume
|
|
43
|
+
*/
|
|
44
|
+
generate(context: ContinueContext): string {
|
|
45
|
+
const parts: string[] = [
|
|
46
|
+
"# Continue Previous Task",
|
|
47
|
+
"",
|
|
48
|
+
"## Task",
|
|
49
|
+
context.requirement,
|
|
50
|
+
"",
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
if (context.whatWasCompleted.length > 0) {
|
|
54
|
+
parts.push("## What Was Completed");
|
|
55
|
+
for (const item of context.whatWasCompleted) {
|
|
56
|
+
parts.push(`- ${item}`);
|
|
57
|
+
}
|
|
58
|
+
parts.push("");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (context.partialFiles.length > 0) {
|
|
62
|
+
parts.push("## Partial Files Created");
|
|
63
|
+
parts.push("Review these files — they may contain incomplete work:");
|
|
64
|
+
for (const file of context.partialFiles) {
|
|
65
|
+
parts.push(`- ${file}`);
|
|
66
|
+
}
|
|
67
|
+
parts.push("");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (context.decisions.length > 0) {
|
|
71
|
+
parts.push("## Key Decisions");
|
|
72
|
+
for (const decision of context.decisions) {
|
|
73
|
+
parts.push(`- ${decision}`);
|
|
74
|
+
}
|
|
75
|
+
parts.push("");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (context.whatNeedsToBeDone.length > 0) {
|
|
79
|
+
parts.push("## What Needs To Be Done");
|
|
80
|
+
for (const item of context.whatNeedsToBeDone) {
|
|
81
|
+
parts.push(`- ${item}`);
|
|
82
|
+
}
|
|
83
|
+
parts.push("");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
parts.push(
|
|
87
|
+
"## Instructions",
|
|
88
|
+
"",
|
|
89
|
+
"1. Review any partial files created above",
|
|
90
|
+
"2. Continue from where the previous session ended",
|
|
91
|
+
"3. Complete the remaining work listed in 'What Needs To Be Done'",
|
|
92
|
+
"4. Ensure all tests pass before marking complete",
|
|
93
|
+
"",
|
|
94
|
+
"**Do not repeat work that was already completed.**",
|
|
95
|
+
"",
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
if (context.nextStep) {
|
|
99
|
+
parts.push("## Suggested Next Step");
|
|
100
|
+
parts.push(context.nextStep);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (context.workingDir) {
|
|
104
|
+
parts.push("", `Working directory: \`${context.workingDir}\``);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return parts.join("\n");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Generate a minimal continue message for quick resume
|
|
112
|
+
*/
|
|
113
|
+
generateMinimal(context: MinimalContinueContext): string {
|
|
114
|
+
const recent = context.recentMessages
|
|
115
|
+
.slice(-5)
|
|
116
|
+
.map((m) => `[${m.role}]\n${this.truncateContent(m.content, 500)}`)
|
|
117
|
+
.join("\n\n");
|
|
118
|
+
|
|
119
|
+
return [
|
|
120
|
+
"Continue from where you left off.",
|
|
121
|
+
"",
|
|
122
|
+
"## Summary of Earlier Work",
|
|
123
|
+
context.summary,
|
|
124
|
+
"",
|
|
125
|
+
"## Recent Context",
|
|
126
|
+
recent,
|
|
127
|
+
"",
|
|
128
|
+
"**Do not repeat work already done.** Focus on completing the remaining work.",
|
|
129
|
+
].join("\n");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Generate a compact boundary message for message history
|
|
134
|
+
*/
|
|
135
|
+
generateBoundary(options: {
|
|
136
|
+
summary: string;
|
|
137
|
+
reason: string;
|
|
138
|
+
messagesCompacted: number;
|
|
139
|
+
}): string {
|
|
140
|
+
return [
|
|
141
|
+
"## Earlier Conversation Summarized",
|
|
142
|
+
"",
|
|
143
|
+
`[Compacted due to: ${options.reason}]`,
|
|
144
|
+
`[${options.messagesCompacted} messages summarized]`,
|
|
145
|
+
"",
|
|
146
|
+
options.summary,
|
|
147
|
+
"",
|
|
148
|
+
"## Resume Point",
|
|
149
|
+
"Continue from the messages below.",
|
|
150
|
+
].join("\n");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Extract continue context from compact result
|
|
155
|
+
*/
|
|
156
|
+
static fromCompactResult(
|
|
157
|
+
result: {
|
|
158
|
+
summary?: string;
|
|
159
|
+
messagesCompacted: number;
|
|
160
|
+
trigger: string;
|
|
161
|
+
},
|
|
162
|
+
task: {
|
|
163
|
+
id: string;
|
|
164
|
+
requirement: string;
|
|
165
|
+
},
|
|
166
|
+
): ContinueContext {
|
|
167
|
+
return {
|
|
168
|
+
taskId: task.id,
|
|
169
|
+
requirement: task.requirement,
|
|
170
|
+
whatWasCompleted: result.summary
|
|
171
|
+
? ContinuePromptGenerator.extractCompletedWork(result.summary)
|
|
172
|
+
: [],
|
|
173
|
+
whatNeedsToBeDone: ["Continue from where the conversation was compacted"],
|
|
174
|
+
partialFiles: [],
|
|
175
|
+
decisions: result.summary
|
|
176
|
+
? ContinuePromptGenerator.extractDecisions(result.summary)
|
|
177
|
+
: [],
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Extract completed work items from summary text
|
|
183
|
+
*/
|
|
184
|
+
private static extractCompletedWork(summary: string): string[] {
|
|
185
|
+
const completed: string[] = [];
|
|
186
|
+
|
|
187
|
+
// Look for patterns indicating completed work
|
|
188
|
+
const patterns = [
|
|
189
|
+
/completed?:?\s*([^\n.]+)/gi,
|
|
190
|
+
/created?:?\s*([^\n.]+)/gi,
|
|
191
|
+
/implemented?:?\s*([^\n.]+)/gi,
|
|
192
|
+
/fixed?:?\s*([^\n.]+)/gi,
|
|
193
|
+
/passed?:?\s*([^\n.]+)/gi,
|
|
194
|
+
];
|
|
195
|
+
|
|
196
|
+
for (const pattern of patterns) {
|
|
197
|
+
for (const match of summary.matchAll(pattern)) {
|
|
198
|
+
if (match[1]) {
|
|
199
|
+
completed.push(match[1].trim());
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return completed.slice(0, 5);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Extract decisions from summary text
|
|
209
|
+
*/
|
|
210
|
+
private static extractDecisions(summary: string): string[] {
|
|
211
|
+
const decisions: string[] = [];
|
|
212
|
+
|
|
213
|
+
const patterns = [
|
|
214
|
+
/decided?:?\s*([^\n.]+)/gi,
|
|
215
|
+
/chose?:?\s*([^\n.]+)/gi,
|
|
216
|
+
/approach?:?\s*([^\n.]+)/gi,
|
|
217
|
+
/using?:?\s*([^\n.]+)/gi,
|
|
218
|
+
];
|
|
219
|
+
|
|
220
|
+
for (const pattern of patterns) {
|
|
221
|
+
for (const match of summary.matchAll(pattern)) {
|
|
222
|
+
if (match[1]) {
|
|
223
|
+
decisions.push(match[1].trim());
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return decisions.slice(0, 5);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Truncate content to max length
|
|
233
|
+
*/
|
|
234
|
+
private truncateContent(content: string, maxLength: number): string {
|
|
235
|
+
if (content.length <= maxLength) return content;
|
|
236
|
+
return content.substring(0, maxLength) + "... [truncated]";
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// --- Singleton Instance ------------------------------------------------------
|
|
241
|
+
|
|
242
|
+
export const continuePromptGenerator = new ContinuePromptGenerator();
|