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,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Manager — Compaction Engine (RFC-0010)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
ContextItem,
|
|
7
|
+
CompactionResult,
|
|
8
|
+
ResumePrompt,
|
|
9
|
+
TriggerPolicy,
|
|
10
|
+
} from "./types.js";
|
|
11
|
+
import { DEFAULT_POLICY } from "./core.js";
|
|
12
|
+
import { prioritize } from "./core.js";
|
|
13
|
+
|
|
14
|
+
/** Extract decisions from messages (lines starting with DECISION markers). */
|
|
15
|
+
function extractDecisions(messages: ContextItem[]): string[] {
|
|
16
|
+
const decisions: string[] = [];
|
|
17
|
+
for (const msg of messages) {
|
|
18
|
+
for (const line of msg.content.split("\n")) {
|
|
19
|
+
const trimmed = line.trim();
|
|
20
|
+
if (
|
|
21
|
+
trimmed.startsWith("- DECISION:") ||
|
|
22
|
+
trimmed.startsWith("**DECISION**") ||
|
|
23
|
+
/^(?:decision|decided):/i.test(trimmed)
|
|
24
|
+
) {
|
|
25
|
+
decisions.push(trimmed.replace(/^[*>-]+\s*/i, "").trim());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [...new Set(decisions)];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Extract open questions (lines with ?, TODO, TBD, OPEN markers). */
|
|
33
|
+
function extractQuestions(messages: ContextItem[]): string[] {
|
|
34
|
+
const questions: string[] = [];
|
|
35
|
+
for (const msg of messages) {
|
|
36
|
+
for (const line of msg.content.split("\n")) {
|
|
37
|
+
const trimmed = line.trim();
|
|
38
|
+
if (
|
|
39
|
+
trimmed.includes("?") ||
|
|
40
|
+
/\bTODO\b/i.test(trimmed) ||
|
|
41
|
+
/\bTBD\b/i.test(trimmed)
|
|
42
|
+
) {
|
|
43
|
+
const cleaned = trimmed.replace(/^[*>-]+\s*/, "").trim();
|
|
44
|
+
if (cleaned.length > 5) questions.push(cleaned);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return [...new Set(questions)];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Extract task progress from messages. */
|
|
52
|
+
function extractTaskProgress(messages: ContextItem[]): Record<string, string> {
|
|
53
|
+
const progress: Record<string, string> = {};
|
|
54
|
+
for (const msg of messages) {
|
|
55
|
+
for (const line of msg.content.split("\n")) {
|
|
56
|
+
const match = line.match(
|
|
57
|
+
/^(?:progress|task|step)[:\s]+([^|]+)\|\s*(.+)/i,
|
|
58
|
+
);
|
|
59
|
+
if (match) progress[match[1].trim()] = match[2].trim();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return progress;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Compact context by extracting durable state and keeping high-priority items. */
|
|
66
|
+
export function compactContext(
|
|
67
|
+
messages: ContextItem[],
|
|
68
|
+
maxTokens: number,
|
|
69
|
+
policy: TriggerPolicy = DEFAULT_POLICY,
|
|
70
|
+
): CompactionResult {
|
|
71
|
+
const decisions = extractDecisions(messages);
|
|
72
|
+
const openQuestions = extractQuestions(messages);
|
|
73
|
+
const taskProgress = extractTaskProgress(messages);
|
|
74
|
+
|
|
75
|
+
const prioritized = prioritize(messages, Math.floor(messages.length * 0.6));
|
|
76
|
+
let tokenCount = 0;
|
|
77
|
+
const kept: string[] = [];
|
|
78
|
+
|
|
79
|
+
for (const msg of prioritized) {
|
|
80
|
+
if (
|
|
81
|
+
tokenCount + msg.tokens <=
|
|
82
|
+
Math.floor(maxTokens * policy.compactThreshold)
|
|
83
|
+
) {
|
|
84
|
+
kept.push(msg.content);
|
|
85
|
+
tokenCount += msg.tokens;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
decisions,
|
|
91
|
+
openQuestions,
|
|
92
|
+
taskProgress,
|
|
93
|
+
remainingTokens: tokenCount,
|
|
94
|
+
compactedContent: kept.join("\n\n"),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Generate a resume prompt from compaction result. */
|
|
99
|
+
export function generateResumePrompt(
|
|
100
|
+
result: CompactionResult,
|
|
101
|
+
nextAction?: string,
|
|
102
|
+
): ResumePrompt {
|
|
103
|
+
const summary = [
|
|
104
|
+
"## Session Summary",
|
|
105
|
+
`Decisions: ${result.decisions.length > 0 ? result.decisions.join("; ") : "none"}`,
|
|
106
|
+
`Questions: ${result.openQuestions.length > 0 ? result.openQuestions.join("; ") : "none"}`,
|
|
107
|
+
`Context size: ${result.remainingTokens} tokens`,
|
|
108
|
+
].join("\n");
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
summary,
|
|
112
|
+
decisions: result.decisions,
|
|
113
|
+
openQuestions: result.openQuestions,
|
|
114
|
+
taskProgress: result.taskProgress,
|
|
115
|
+
nextAction: nextAction ?? "Continue from last position",
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Format resume prompt as markdown string. */
|
|
120
|
+
export function formatResumeMarkdown(prompt: ResumePrompt): string {
|
|
121
|
+
const lines = [
|
|
122
|
+
"# Resume Prompt",
|
|
123
|
+
"",
|
|
124
|
+
prompt.summary,
|
|
125
|
+
"",
|
|
126
|
+
"## Decisions",
|
|
127
|
+
...prompt.decisions.map((d) => `- ${d}`),
|
|
128
|
+
"",
|
|
129
|
+
"## Open Questions",
|
|
130
|
+
...prompt.openQuestions.map((q) => `- ${q}`),
|
|
131
|
+
"",
|
|
132
|
+
"## Task Progress",
|
|
133
|
+
...Object.entries(prompt.taskProgress).map(([k, v]) => `- **${k}**: ${v}`),
|
|
134
|
+
"",
|
|
135
|
+
"## Next Action",
|
|
136
|
+
`- ${prompt.nextAction}`,
|
|
137
|
+
];
|
|
138
|
+
return lines.filter((l) => l).join("\n");
|
|
139
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Manager Core — pressure estimation, TTL, prioritization (RFC-0010)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
PressureLevel,
|
|
7
|
+
TriggerPolicy,
|
|
8
|
+
ContextItem,
|
|
9
|
+
SessionScope,
|
|
10
|
+
} from "./types.js";
|
|
11
|
+
|
|
12
|
+
export const DEFAULT_POLICY: TriggerPolicy = {
|
|
13
|
+
warningThreshold: 0.6,
|
|
14
|
+
compactThreshold: 0.7,
|
|
15
|
+
hardStopThreshold: 0.85,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** Estimate context pressure as a ratio (0-1). */
|
|
19
|
+
export function estimatePressure(
|
|
20
|
+
currentTokens: number,
|
|
21
|
+
maxTokens: number,
|
|
22
|
+
): number {
|
|
23
|
+
if (maxTokens <= 0) return 1;
|
|
24
|
+
return Math.min(currentTokens / maxTokens, 1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Determine pressure level from a ratio. */
|
|
28
|
+
export function getPressureLevel(
|
|
29
|
+
pressure: number,
|
|
30
|
+
policy: TriggerPolicy = DEFAULT_POLICY,
|
|
31
|
+
): PressureLevel {
|
|
32
|
+
if (pressure >= policy.hardStopThreshold) return "hard_stop";
|
|
33
|
+
if (pressure >= policy.compactThreshold) return "compact";
|
|
34
|
+
if (pressure >= policy.warningThreshold) return "warning";
|
|
35
|
+
return "normal";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Create a new session-scoped context bucket. */
|
|
39
|
+
export function createSessionScope(id: string): SessionScope {
|
|
40
|
+
return { id, items: [], ttlMs: 30 * 60 * 1000, createdAt: Date.now() };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Set TTL on a scope (in milliseconds). */
|
|
44
|
+
export function setTTL(scope: SessionScope, ttlMs: number): SessionScope {
|
|
45
|
+
return { ...scope, ttlMs };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Add an item to a session scope. */
|
|
49
|
+
export function addToScope(
|
|
50
|
+
scope: SessionScope,
|
|
51
|
+
item: ContextItem,
|
|
52
|
+
): SessionScope {
|
|
53
|
+
return { ...scope, items: [...scope.items, item] };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Remove expired items from a scope based on TTL. */
|
|
57
|
+
export function evictExpired(scope: SessionScope): SessionScope {
|
|
58
|
+
const now = Date.now();
|
|
59
|
+
return {
|
|
60
|
+
...scope,
|
|
61
|
+
items: scope.items.filter((item) => {
|
|
62
|
+
if (!item.expiresAt) return true;
|
|
63
|
+
return item.expiresAt > now;
|
|
64
|
+
}),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Prioritize items: lower priority number = higher importance. */
|
|
69
|
+
export function prioritize(
|
|
70
|
+
items: ContextItem[],
|
|
71
|
+
limit?: number,
|
|
72
|
+
): ContextItem[] {
|
|
73
|
+
const sorted = [...items].sort((a, b) => a.priority - b.priority);
|
|
74
|
+
return limit ? sorted.slice(0, limit) : sorted;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Count tokens using a simple word-based estimator (4 chars/token). */
|
|
78
|
+
export function estimateTokens(text: string): number {
|
|
79
|
+
return Math.ceil(text.length / 4);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Calculate total tokens in a list of items. */
|
|
83
|
+
export function calculateTotalTokens(items: ContextItem[]): number {
|
|
84
|
+
return items.reduce((sum, item) => sum + item.tokens, 0);
|
|
85
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Manager — Main Entry (RFC-0010)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
DEFAULT_POLICY,
|
|
7
|
+
estimatePressure,
|
|
8
|
+
getPressureLevel,
|
|
9
|
+
createSessionScope,
|
|
10
|
+
setTTL,
|
|
11
|
+
addToScope,
|
|
12
|
+
evictExpired,
|
|
13
|
+
prioritize,
|
|
14
|
+
estimateTokens,
|
|
15
|
+
calculateTotalTokens,
|
|
16
|
+
} from "./core.js";
|
|
17
|
+
export {
|
|
18
|
+
compactContext,
|
|
19
|
+
generateResumePrompt,
|
|
20
|
+
formatResumeMarkdown,
|
|
21
|
+
} from "./compaction.js";
|
|
22
|
+
export type * from "./types.js";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Manager Types (RFC-0010)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type PressureLevel = "normal" | "warning" | "compact" | "hard_stop";
|
|
6
|
+
|
|
7
|
+
export interface TriggerPolicy {
|
|
8
|
+
warningThreshold: number;
|
|
9
|
+
compactThreshold: number;
|
|
10
|
+
hardStopThreshold: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ContextItem {
|
|
14
|
+
id: string;
|
|
15
|
+
role: "user" | "assistant" | "system";
|
|
16
|
+
content: string;
|
|
17
|
+
tokens: number;
|
|
18
|
+
priority: number;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
expiresAt?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface CompactionResult {
|
|
24
|
+
decisions: string[];
|
|
25
|
+
openQuestions: string[];
|
|
26
|
+
taskProgress: Record<string, string>;
|
|
27
|
+
remainingTokens: number;
|
|
28
|
+
compactedContent: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface SessionScope {
|
|
32
|
+
id: string;
|
|
33
|
+
items: ContextItem[];
|
|
34
|
+
ttlMs: number;
|
|
35
|
+
createdAt: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ResumePrompt {
|
|
39
|
+
summary: string;
|
|
40
|
+
decisions: string[];
|
|
41
|
+
openQuestions: string[];
|
|
42
|
+
taskProgress: Record<string, string>;
|
|
43
|
+
nextAction: string;
|
|
44
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic file write — write to temp, fsync, then rename.
|
|
3
|
+
*
|
|
4
|
+
* POSIX `rename(2)` is atomic — on partial-write crash, the prior target
|
|
5
|
+
* file remains valid. We pair this with `fsync(tempfile)` so the temp
|
|
6
|
+
* file's data is durable on disk before the rename.
|
|
7
|
+
*
|
|
8
|
+
* Permissions: `0o600` (owner R/W only) to keep the canonical cache
|
|
9
|
+
* owner-readable.
|
|
10
|
+
*
|
|
11
|
+
* Sec-001: Cookie values go into the file content. The caller is
|
|
12
|
+
* responsible for value-handling hygiene; this module just writes
|
|
13
|
+
* bytes. We do not log the content.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
mkdirSync,
|
|
18
|
+
openSync,
|
|
19
|
+
writeSync,
|
|
20
|
+
fsyncSync,
|
|
21
|
+
closeSync,
|
|
22
|
+
renameSync,
|
|
23
|
+
chmodSync,
|
|
24
|
+
} from "node:fs";
|
|
25
|
+
import { dirname, join } from "node:path";
|
|
26
|
+
import { randomBytes } from "node:crypto";
|
|
27
|
+
import type { ProviderId } from "./types.js";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Atomically write `content` to `finalPath`.
|
|
31
|
+
*
|
|
32
|
+
* Steps:
|
|
33
|
+
* 1. mkdir -p the parent directory
|
|
34
|
+
* 2. write to <finalPath>.tmp.<rand> with mode 0o600
|
|
35
|
+
* 3. fsync the temp file
|
|
36
|
+
* 4. rename temp → final (atomic on POSIX)
|
|
37
|
+
* 5. chmod final to 0o600 (in case rename preserved looser perms)
|
|
38
|
+
*
|
|
39
|
+
* Throws if any step fails. The original `finalPath` is unchanged
|
|
40
|
+
* until step 4 succeeds.
|
|
41
|
+
*/
|
|
42
|
+
export function atomicWriteFileSync(finalPath: string, content: string): void {
|
|
43
|
+
mkdirSync(dirname(finalPath), { recursive: true });
|
|
44
|
+
|
|
45
|
+
const rand = randomBytes(6).toString("hex");
|
|
46
|
+
const tempPath = `${finalPath}.tmp.${rand}`;
|
|
47
|
+
|
|
48
|
+
let fd: number | undefined;
|
|
49
|
+
try {
|
|
50
|
+
fd = openSync(tempPath, "w", 0o600);
|
|
51
|
+
writeSync(fd, Buffer.from(content, "utf8"));
|
|
52
|
+
fsyncSync(fd);
|
|
53
|
+
} finally {
|
|
54
|
+
if (fd !== undefined) closeSync(fd);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
renameSync(tempPath, finalPath);
|
|
58
|
+
|
|
59
|
+
// Belt-and-braces in case rename preserved a looser mode from an
|
|
60
|
+
// existing file on some systems.
|
|
61
|
+
try {
|
|
62
|
+
chmodSync(finalPath, 0o600);
|
|
63
|
+
} catch {
|
|
64
|
+
// Filesystems that don't support chmod (e.g. FAT32) are not a
|
|
65
|
+
// target platform here — drop the error silently.
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Compute the default cache path for a given provider, e.g.:
|
|
71
|
+
* defaultCachePathFor("minimax") → "~/.config/minimax-cookies.txt"
|
|
72
|
+
*
|
|
73
|
+
* The home directory is read via `process.env.HOME` so tests can
|
|
74
|
+
* override it.
|
|
75
|
+
*/
|
|
76
|
+
export function defaultCachePathFor(provider: ProviderId): string {
|
|
77
|
+
const home = process.env.HOME ?? "/tmp";
|
|
78
|
+
return join(home, ".config", `${provider}-cookies.txt`);
|
|
79
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format detection — does the input look like Netscape or EditThisCookie JSON?
|
|
3
|
+
*
|
|
4
|
+
* Detection rule:
|
|
5
|
+
* - File extension `.json` AND first non-blank byte is `[` or `{` → JSON
|
|
6
|
+
* - File content has `# Netscape HTTP Cookie File` header OR
|
|
7
|
+
* ≥ 1 tab-separated 7-column row → Netscape
|
|
8
|
+
* - Otherwise → unknown
|
|
9
|
+
*
|
|
10
|
+
* Cookie VALUES are never copied into return values that get logged.
|
|
11
|
+
* Only the basename and a 64-char prefix of the first non-blank line.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { basename } from "node:path";
|
|
15
|
+
import type { CookieFileFormat, DetectedFile } from "./types.js";
|
|
16
|
+
|
|
17
|
+
const HEADER_RE = /^# Netscape HTTP Cookie File/im;
|
|
18
|
+
const MIN_TAB_COLS = 7;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Returns the basename only, never a path that could leak directory
|
|
22
|
+
* structure. Safe to log.
|
|
23
|
+
*/
|
|
24
|
+
export function safeBasename(filePath: string): string {
|
|
25
|
+
return basename(filePath);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Safely truncated preview of a file's content (for diagnostics).
|
|
30
|
+
* Strips cookie values to avoid leaking secrets.
|
|
31
|
+
*
|
|
32
|
+
* Heuristic: any line that has a tab-separated name=value pair,
|
|
33
|
+
* replace the value column with `<redacted>`.
|
|
34
|
+
*/
|
|
35
|
+
export function safePreview(text: string, maxChars = 64): string {
|
|
36
|
+
const firstLine =
|
|
37
|
+
text
|
|
38
|
+
.split("\n")
|
|
39
|
+
.map((l) => l.trim())
|
|
40
|
+
.find((l) => l.length > 0) ?? "";
|
|
41
|
+
const redacted = firstLine
|
|
42
|
+
.split("\t")
|
|
43
|
+
.map((col, i) => (i >= 5 ? "<redacted>" : col))
|
|
44
|
+
.join("\t");
|
|
45
|
+
return redacted.length > maxChars
|
|
46
|
+
? `${redacted.slice(0, maxChars)}…`
|
|
47
|
+
: redacted;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Detect the format of cookie file text.
|
|
52
|
+
*/
|
|
53
|
+
export function detectFormat(text: string): CookieFileFormat | null {
|
|
54
|
+
if (typeof text !== "string" || text.length === 0) return null;
|
|
55
|
+
|
|
56
|
+
const trimmed = text.trimStart();
|
|
57
|
+
const firstByte = trimmed[0];
|
|
58
|
+
|
|
59
|
+
// JSON heuristic — array or object at the top.
|
|
60
|
+
if (firstByte === "[" || firstByte === "{") {
|
|
61
|
+
return "edit-this-cookie-json";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Netscape heuristic — header OR a tab-separated 7-column row.
|
|
65
|
+
if (HEADER_RE.test(text)) {
|
|
66
|
+
return "netscape";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const lines = text.split(/\r?\n/);
|
|
70
|
+
for (const line of lines) {
|
|
71
|
+
if (!line || (line.startsWith("#") && !line.startsWith("#HttpOnly_"))) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const trimmedLine = line.startsWith("#HttpOnly_")
|
|
75
|
+
? line.slice("#HttpOnly_".length)
|
|
76
|
+
: line;
|
|
77
|
+
const cols = trimmedLine.split("\t");
|
|
78
|
+
if (cols.length >= MIN_TAB_COLS) {
|
|
79
|
+
return "netscape";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Build a DetectedFile from a path and its text contents.
|
|
88
|
+
* Used by sync.ts after reading the file from disk.
|
|
89
|
+
*/
|
|
90
|
+
export function buildDetectedFile(
|
|
91
|
+
filePath: string,
|
|
92
|
+
text: string,
|
|
93
|
+
): DetectedFile {
|
|
94
|
+
const format = detectFormat(text);
|
|
95
|
+
return {
|
|
96
|
+
path: filePath,
|
|
97
|
+
basename: safeBasename(filePath),
|
|
98
|
+
format,
|
|
99
|
+
text,
|
|
100
|
+
// No error if format is null — unknown format is a normal case.
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie Sanitizer — public API.
|
|
3
|
+
*
|
|
4
|
+
* Forgiving input → strict canonical cache for downstream consumers
|
|
5
|
+
* (e.g. MiniMaxQuotaScraper reads only `~/.config/minimax-cookies.txt`).
|
|
6
|
+
*
|
|
7
|
+
* The package is provider-agnostic but currently shipping with:
|
|
8
|
+
* - filename hints: minimax, anthropic, openai, glm, openrouter
|
|
9
|
+
* - domain hints : the matching provider domains
|
|
10
|
+
*
|
|
11
|
+
* Inputs accepted (auto-detected per file):
|
|
12
|
+
* - Netscape HTTP Cookie File
|
|
13
|
+
* - EditThisCookie / Chrome devtools JSON export
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { sync, hasAnyCookieSource, CookieWatcher } from "@pi-harness/cookie-sanitizer";
|
|
18
|
+
*
|
|
19
|
+
* // One-shot sync.
|
|
20
|
+
* const result = sync();
|
|
21
|
+
* console.log(result.provider, result.cachePath, result.totalCookies);
|
|
22
|
+
*
|
|
23
|
+
* // Live updates.
|
|
24
|
+
* const watcher = new CookieWatcher({
|
|
25
|
+
* dropDir: "~/.pi-harness-runtime/cookies",
|
|
26
|
+
* onEvent: (e) => console.log(e),
|
|
27
|
+
* });
|
|
28
|
+
* watcher.start();
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
sync,
|
|
34
|
+
hasAnyCookieSource,
|
|
35
|
+
inferCachePath,
|
|
36
|
+
enumerateDropFiles,
|
|
37
|
+
readInputFile,
|
|
38
|
+
DEFAULT_DROP_DIR,
|
|
39
|
+
} from "./sync.js";
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
parseNetscape,
|
|
43
|
+
serializeNetscape,
|
|
44
|
+
} from "./parse-netscape.js";
|
|
45
|
+
|
|
46
|
+
export { parseEditThisCookieJson } from "./parse-json.js";
|
|
47
|
+
|
|
48
|
+
export {
|
|
49
|
+
inferProvider,
|
|
50
|
+
inferProviderFromFilename,
|
|
51
|
+
inferProviderFromCookies,
|
|
52
|
+
knownProviders,
|
|
53
|
+
} from "./infer-provider.js";
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
normalize,
|
|
57
|
+
domainMatchesProvider,
|
|
58
|
+
isExpired,
|
|
59
|
+
} from "./normalize.js";
|
|
60
|
+
|
|
61
|
+
export {
|
|
62
|
+
detectFormat,
|
|
63
|
+
buildDetectedFile,
|
|
64
|
+
safeBasename,
|
|
65
|
+
safePreview,
|
|
66
|
+
} from "./detect-format.js";
|
|
67
|
+
|
|
68
|
+
export {
|
|
69
|
+
atomicWriteFileSync,
|
|
70
|
+
defaultCachePathFor,
|
|
71
|
+
} from "./atomic-write.js";
|
|
72
|
+
|
|
73
|
+
export {
|
|
74
|
+
CookieWatcher,
|
|
75
|
+
createWatcher,
|
|
76
|
+
defaultDropDir,
|
|
77
|
+
} from "./watcher.js";
|
|
78
|
+
|
|
79
|
+
export type {
|
|
80
|
+
CanonicalCookie,
|
|
81
|
+
CookieFileFormat,
|
|
82
|
+
DetectedFile,
|
|
83
|
+
ProviderId,
|
|
84
|
+
SyncOptions,
|
|
85
|
+
SyncResult,
|
|
86
|
+
WatcherEvent,
|
|
87
|
+
} from "./types.js";
|
|
88
|
+
|
|
89
|
+
export type { CookieWatcherConfig } from "./watcher.js";
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider inference — figure out which provider a cookie dump belongs to
|
|
3
|
+
* without the user having to organize by subfolder.
|
|
4
|
+
*
|
|
5
|
+
* Three inference passes, first hit wins:
|
|
6
|
+
* 1. Filename hint (e.g. `minimax-*.txt`, `*minimax.json` → "minimax")
|
|
7
|
+
* 2. Dominant domain (≥ 80% of cookies on `*.minimax.io` → "minimax")
|
|
8
|
+
* 3. Nothing → null (caller will surface a friendly error)
|
|
9
|
+
*
|
|
10
|
+
* Provider hint from SyncOptions overrides all of the above.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { CanonicalCookie, ProviderId } from "./types.js";
|
|
14
|
+
|
|
15
|
+
const FILENAME_HINTS: Array<{ pattern: RegExp; provider: ProviderId }> = [
|
|
16
|
+
{ pattern: /minimax/i, provider: "minimax" },
|
|
17
|
+
{ pattern: /anthropic|claude/i, provider: "anthropic" },
|
|
18
|
+
{ pattern: /openai|gpt|chatgpt/i, provider: "openai" },
|
|
19
|
+
{ pattern: /glm|z\.ai|zhipuai/i, provider: "glm" },
|
|
20
|
+
{ pattern: /openrouter/i, provider: "openrouter" },
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const DOMAIN_HINTS: Array<{ pattern: RegExp; provider: ProviderId }> = [
|
|
24
|
+
{ pattern: /\.minimax\.io$|^minimax\.io$/i, provider: "minimax" },
|
|
25
|
+
{ pattern: /\.anthropic\.com$|^anthropic\.com$/i, provider: "anthropic" },
|
|
26
|
+
{
|
|
27
|
+
pattern: /\.openai\.com$|^openai\.com$|\.chatgpt\.com$|^chatgpt\.com$/i,
|
|
28
|
+
provider: "openai",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
pattern: /\.z\.ai$|^z\.ai$|\.zhipuai\.cn$|^zhipuai\.cn$/i,
|
|
32
|
+
provider: "glm",
|
|
33
|
+
},
|
|
34
|
+
{ pattern: /\.openrouter\.ai$|^openrouter\.ai$/i, provider: "openrouter" },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
/** Returns the first provider whose filename pattern matches, or null. */
|
|
38
|
+
export function inferProviderFromFilename(filename: string): ProviderId | null {
|
|
39
|
+
if (!filename) return null;
|
|
40
|
+
for (const { pattern, provider } of FILENAME_HINTS) {
|
|
41
|
+
if (pattern.test(filename)) return provider;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Returns the provider whose domain is the dominant (≥ 80%) match. */
|
|
47
|
+
export function inferProviderFromCookies(
|
|
48
|
+
cookies: CanonicalCookie[],
|
|
49
|
+
): ProviderId | null {
|
|
50
|
+
if (!Array.isArray(cookies) || cookies.length === 0) return null;
|
|
51
|
+
|
|
52
|
+
const counts = new Map<ProviderId, number>();
|
|
53
|
+
let total = 0;
|
|
54
|
+
for (const c of cookies) {
|
|
55
|
+
if (!c.domain) continue;
|
|
56
|
+
total += 1;
|
|
57
|
+
for (const { pattern, provider } of DOMAIN_HINTS) {
|
|
58
|
+
if (pattern.test(c.domain.toLowerCase())) {
|
|
59
|
+
counts.set(provider, (counts.get(provider) ?? 0) + 1);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (total === 0) return null;
|
|
66
|
+
const threshold = Math.ceil(total * 0.8); // ≥ 80 %
|
|
67
|
+
let best: { provider: ProviderId; count: number } | null = null;
|
|
68
|
+
for (const [provider, count] of counts) {
|
|
69
|
+
if (count >= threshold && (!best || count > best.count)) {
|
|
70
|
+
best = { provider, count };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return best?.provider ?? null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Combined inference: hint → filename → dominant domain → null.
|
|
78
|
+
*
|
|
79
|
+
* If `filename` is provided it takes priority over domain inference
|
|
80
|
+
* (filename hints are explicit). Domain inference is the fallback.
|
|
81
|
+
*/
|
|
82
|
+
export function inferProvider(
|
|
83
|
+
filename: string | undefined,
|
|
84
|
+
cookies: CanonicalCookie[],
|
|
85
|
+
hint?: ProviderId,
|
|
86
|
+
): ProviderId | null {
|
|
87
|
+
if (hint) return hint;
|
|
88
|
+
if (filename) {
|
|
89
|
+
const fromName = inferProviderFromFilename(filename);
|
|
90
|
+
if (fromName) return fromName;
|
|
91
|
+
}
|
|
92
|
+
return inferProviderFromCookies(cookies);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Build a list of provider rules used by other parts of the package.
|
|
97
|
+
* Exposed for UI display (e.g. "which providers does this sanitizer know?").
|
|
98
|
+
*/
|
|
99
|
+
export function knownProviders(): ProviderId[] {
|
|
100
|
+
const set = new Set<ProviderId>();
|
|
101
|
+
for (const { provider } of FILENAME_HINTS) set.add(provider);
|
|
102
|
+
return Array.from(set);
|
|
103
|
+
}
|