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,609 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiniMax Quota Scraper — RFC-0031
|
|
3
|
+
*
|
|
4
|
+
* Automatically fetches quota data from MiniMax console using Playwright.
|
|
5
|
+
* Uses cookie-based authentication to access the usage page.
|
|
6
|
+
*
|
|
7
|
+
* Based on the tactic in pi-harness-runtime/AGENTS.md:
|
|
8
|
+
* - Cookie-backed fetch returns static HTML only
|
|
9
|
+
* - Must use headless Playwright with injected cookies
|
|
10
|
+
* - Capture API responses for usage data
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import { parseMiniMaxQuotaText } from "./minimax-quota-parser.js";
|
|
17
|
+
|
|
18
|
+
export interface MiniMaxQuotaData {
|
|
19
|
+
provider: "minimax";
|
|
20
|
+
/** 5-hour window usage percentage (0-100) */
|
|
21
|
+
h5UsedPct: number;
|
|
22
|
+
/** When the 5h window resets (e.g., "in 4 hr 56 min") */
|
|
23
|
+
h5ResetsAt?: string;
|
|
24
|
+
/** Epoch ms when the 5h window resets — precise UTC timestamp. */
|
|
25
|
+
h5ResetsAtEpoch?: number;
|
|
26
|
+
/** Weekly usage percentage (0-100) */
|
|
27
|
+
weeklyUsedPct: number;
|
|
28
|
+
/** When the weekly window resets */
|
|
29
|
+
weeklyResetsAt?: string;
|
|
30
|
+
/** Epoch ms when the weekly window resets — precise UTC timestamp. */
|
|
31
|
+
weeklyResetsAtEpoch?: number;
|
|
32
|
+
/** Monthly usage percentage (0-100) */
|
|
33
|
+
monthlyUsedPct?: number;
|
|
34
|
+
/** When the monthly window resets */
|
|
35
|
+
monthlyResetsAt?: string;
|
|
36
|
+
/** Credit balance remaining */
|
|
37
|
+
creditBalance?: string;
|
|
38
|
+
/** Token usage stats */
|
|
39
|
+
tokenUsage?: {
|
|
40
|
+
currentMonth: string;
|
|
41
|
+
last7Days: string;
|
|
42
|
+
last30Days: string;
|
|
43
|
+
total: string;
|
|
44
|
+
};
|
|
45
|
+
/** Raw API responses captured */
|
|
46
|
+
apiEndpoints?: string[];
|
|
47
|
+
/** Timestamp of scrape */
|
|
48
|
+
scrapedAt: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface MiniMaxScraperConfig {
|
|
52
|
+
/** Path to Netscape-format cookie file */
|
|
53
|
+
cookieFile?: string;
|
|
54
|
+
/** MiniMax console URL */
|
|
55
|
+
url?: string;
|
|
56
|
+
/** Headless mode (default: true) */
|
|
57
|
+
headless?: boolean;
|
|
58
|
+
/** Timeout in ms (default: 90000) */
|
|
59
|
+
timeout?: number;
|
|
60
|
+
/** Chrome executable path (optional) */
|
|
61
|
+
chromePath?: string;
|
|
62
|
+
/** Suppress console output — for background/auto-fetch use */
|
|
63
|
+
quiet?: boolean;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const DEFAULT_URL = "https://platform.minimax.io/console/usage?cycle_type=1";
|
|
67
|
+
const DEFAULT_COOKIE_FILE = join(homedir(), ".config", "minimax-cookies.txt");
|
|
68
|
+
|
|
69
|
+
// API endpoints to capture
|
|
70
|
+
const API_TERMS = [
|
|
71
|
+
"api",
|
|
72
|
+
"usage",
|
|
73
|
+
"billing",
|
|
74
|
+
"quota",
|
|
75
|
+
"consumption",
|
|
76
|
+
"recharge",
|
|
77
|
+
"resource",
|
|
78
|
+
"plan",
|
|
79
|
+
"subscription",
|
|
80
|
+
"token_plan",
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Load Netscape-format cookies from file
|
|
85
|
+
*/
|
|
86
|
+
function loadNetscapeCookies(path: string): Array<{
|
|
87
|
+
name: string;
|
|
88
|
+
value: string;
|
|
89
|
+
domain: string;
|
|
90
|
+
path: string;
|
|
91
|
+
secure: boolean;
|
|
92
|
+
httpOnly: boolean;
|
|
93
|
+
expires?: number;
|
|
94
|
+
}> {
|
|
95
|
+
const cookies: Array<{
|
|
96
|
+
name: string;
|
|
97
|
+
value: string;
|
|
98
|
+
domain: string;
|
|
99
|
+
path: string;
|
|
100
|
+
secure: boolean;
|
|
101
|
+
httpOnly: boolean;
|
|
102
|
+
expires?: number;
|
|
103
|
+
}> = [];
|
|
104
|
+
|
|
105
|
+
if (!existsSync(path)) {
|
|
106
|
+
return cookies;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const lines = readFileSync(path, "utf-8").split("\n");
|
|
110
|
+
for (const line of lines) {
|
|
111
|
+
if (!line || (line.startsWith("#") && !line.startsWith("#HttpOnly_"))) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let httpOnly = false;
|
|
116
|
+
let trimmed = line;
|
|
117
|
+
if (trimmed.startsWith("#HttpOnly_")) {
|
|
118
|
+
httpOnly = true;
|
|
119
|
+
trimmed = trimmed.slice("#HttpOnly_".length);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const parts = trimmed.split("\t");
|
|
123
|
+
if (parts.length < 7) continue;
|
|
124
|
+
|
|
125
|
+
const [domain, _flag, cookiePath, secure, expires, name, value] = parts;
|
|
126
|
+
|
|
127
|
+
cookies.push({
|
|
128
|
+
name,
|
|
129
|
+
value,
|
|
130
|
+
domain,
|
|
131
|
+
path: cookiePath || "/",
|
|
132
|
+
secure: secure.toUpperCase() === "TRUE",
|
|
133
|
+
httpOnly,
|
|
134
|
+
expires: parseInt(expires, 10) || undefined,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return cookies;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Redact sensitive values from text
|
|
143
|
+
*/
|
|
144
|
+
function redact(text: string): string {
|
|
145
|
+
return text
|
|
146
|
+
.replace(
|
|
147
|
+
/eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}/g,
|
|
148
|
+
"[JWT_REDACTED]",
|
|
149
|
+
)
|
|
150
|
+
.replace(
|
|
151
|
+
/api[_ -]?key|access[_ -]?token|refresh[_ -]?token|authorization|cookie|session|secret/gi,
|
|
152
|
+
(match) => `${match}=[REDACTED]`,
|
|
153
|
+
)
|
|
154
|
+
.replace(/Bearer\s+[A-Za-z0-9._-]+/gi, "Bearer [REDACTED]");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Parse a percentage string like "50%" or "2%" into a number.
|
|
159
|
+
*/
|
|
160
|
+
function parsePctStr(value: unknown): number | undefined {
|
|
161
|
+
if (typeof value !== "string") return undefined;
|
|
162
|
+
const m = value.match(/(\d+(?:\.\d+)?)/);
|
|
163
|
+
return m ? parseFloat(m[1]) : undefined;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Format remaining time until an epoch-ms deadline (e.g. "4 hr 37 min").
|
|
168
|
+
*/
|
|
169
|
+
function formatRemainsMs(epochMs: number | undefined): string | undefined {
|
|
170
|
+
if (typeof epochMs !== "number" || epochMs <= 0) return undefined;
|
|
171
|
+
const ms = epochMs - Date.now();
|
|
172
|
+
if (ms <= 0) return "soon";
|
|
173
|
+
const totalMin = Math.floor(ms / 60000);
|
|
174
|
+
const days = Math.floor(totalMin / 1440);
|
|
175
|
+
const hr = Math.floor((totalMin % 1440) / 60);
|
|
176
|
+
const min = totalMin % 60;
|
|
177
|
+
const parts: string[] = [];
|
|
178
|
+
if (days > 0) parts.push(`${days} day${days > 1 ? "s" : ""}`);
|
|
179
|
+
if (hr > 0) parts.push(`${hr} hr`);
|
|
180
|
+
if (min > 0) parts.push(`${min} min`);
|
|
181
|
+
return parts.join(" ") || "0 min";
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* MiniMax Quota Scraper
|
|
186
|
+
*
|
|
187
|
+
* Uses headless Playwright to fetch quota data from the MiniMax console.
|
|
188
|
+
*/
|
|
189
|
+
export class MiniMaxQuotaScraper {
|
|
190
|
+
private readonly config: Required<MiniMaxScraperConfig>;
|
|
191
|
+
private capturedEndpoints: string[] = [];
|
|
192
|
+
|
|
193
|
+
constructor(config: MiniMaxScraperConfig = {}) {
|
|
194
|
+
this.config = {
|
|
195
|
+
cookieFile: config.cookieFile ?? DEFAULT_COOKIE_FILE,
|
|
196
|
+
url: config.url ?? DEFAULT_URL,
|
|
197
|
+
headless: config.headless ?? true,
|
|
198
|
+
timeout: config.timeout ?? 90000,
|
|
199
|
+
chromePath: config.chromePath ?? "",
|
|
200
|
+
quiet: config.quiet ?? false,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Set cookie file path
|
|
206
|
+
*/
|
|
207
|
+
setCookieFile(path: string): this {
|
|
208
|
+
this.config.cookieFile = path;
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Enable/disable quiet mode
|
|
214
|
+
*/
|
|
215
|
+
setQuiet(quiet: boolean): this {
|
|
216
|
+
this.config.quiet = quiet;
|
|
217
|
+
return this;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Set MiniMax console URL
|
|
222
|
+
*/
|
|
223
|
+
setUrl(url: string): this {
|
|
224
|
+
this.config.url = url;
|
|
225
|
+
return this;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Scrape quota data. Tries the direct MiniMax API first (fast, no
|
|
230
|
+
* browser — ~200ms), then falls back to a headless browser scrape.
|
|
231
|
+
*/
|
|
232
|
+
async scrape(): Promise<MiniMaxQuotaData> {
|
|
233
|
+
try {
|
|
234
|
+
const apiData = await this.scrapeViaDirectApi();
|
|
235
|
+
if (apiData) {
|
|
236
|
+
if (!this.config.quiet) {
|
|
237
|
+
// console.log("[MiniMaxQuotaScraper] direct API success");
|
|
238
|
+
}
|
|
239
|
+
return apiData;
|
|
240
|
+
}
|
|
241
|
+
if (!this.config.quiet) {
|
|
242
|
+
// console.log(
|
|
243
|
+
// "[MiniMaxQuotaScraper] direct API unavailable, falling back to browser",
|
|
244
|
+
// );
|
|
245
|
+
}
|
|
246
|
+
} catch (error) {
|
|
247
|
+
if (!this.config.quiet) {
|
|
248
|
+
console.warn(
|
|
249
|
+
"[MiniMaxQuotaScraper] direct API failed:",
|
|
250
|
+
error instanceof Error ? error.message : String(error),
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return this.scrapeViaBrowser();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Fetch quota directly from the MiniMax API using cookies (no browser).
|
|
259
|
+
* Uses the same cookie file as the browser path. Returns null when not
|
|
260
|
+
* authenticated so the caller can decide whether to fall back.
|
|
261
|
+
*/
|
|
262
|
+
private async scrapeViaDirectApi(): Promise<MiniMaxQuotaData | null> {
|
|
263
|
+
const cookies = loadNetscapeCookies(this.config.cookieFile!);
|
|
264
|
+
if (cookies.length === 0) return null;
|
|
265
|
+
|
|
266
|
+
const cookieHeader = cookies
|
|
267
|
+
.map((c) => `${c.name}=${String(c.value).trim()}`)
|
|
268
|
+
.join("; ");
|
|
269
|
+
|
|
270
|
+
const headers: Record<string, string> = {
|
|
271
|
+
Cookie: cookieHeader,
|
|
272
|
+
Accept: "application/json, text/plain, */*",
|
|
273
|
+
"User-Agent": "Mozilla/5.0",
|
|
274
|
+
Referer: "https://platform.minimax.io/console/usage",
|
|
275
|
+
};
|
|
276
|
+
const base = "https://platform.minimax.io";
|
|
277
|
+
|
|
278
|
+
// Primary: remains_percent gives 5h + weekly used % and reset times
|
|
279
|
+
let general: Record<string, unknown> | null = null;
|
|
280
|
+
try {
|
|
281
|
+
const resp = await fetch(
|
|
282
|
+
`${base}/backend/account/token_plan/remains_percent`,
|
|
283
|
+
{ headers },
|
|
284
|
+
);
|
|
285
|
+
if (resp.ok) {
|
|
286
|
+
const json = (await resp.json()) as {
|
|
287
|
+
model_remains?: Array<Record<string, unknown>>;
|
|
288
|
+
};
|
|
289
|
+
const arr = json?.model_remains;
|
|
290
|
+
if (Array.isArray(arr)) {
|
|
291
|
+
general =
|
|
292
|
+
arr.find((m) => m.model_name === "general") ?? arr[0] ?? null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
} catch {
|
|
296
|
+
/* fall through to null */
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Not authenticated (or request failed) → no data
|
|
300
|
+
if (!general) return null;
|
|
301
|
+
|
|
302
|
+
const h5UsedPct = parsePctStr(
|
|
303
|
+
general.current_interval_used_percent as unknown,
|
|
304
|
+
);
|
|
305
|
+
const weeklyUsedPct = parsePctStr(
|
|
306
|
+
general.current_weekly_used_percent as unknown,
|
|
307
|
+
);
|
|
308
|
+
const h5ResetsAtEpoch = general.end_time as number | undefined;
|
|
309
|
+
const h5ResetsAt = formatRemainsMs(h5ResetsAtEpoch);
|
|
310
|
+
const weeklyResetsAtEpoch = general.weekly_end_time as number | undefined;
|
|
311
|
+
const weeklyResetsAt = formatRemainsMs(weeklyResetsAtEpoch);
|
|
312
|
+
|
|
313
|
+
// Best-effort: token usage summary
|
|
314
|
+
let tokenUsage: MiniMaxQuotaData["tokenUsage"];
|
|
315
|
+
try {
|
|
316
|
+
const resp = await fetch(
|
|
317
|
+
`${base}/backend/account/token_plan/usage_summary`,
|
|
318
|
+
{ headers },
|
|
319
|
+
);
|
|
320
|
+
if (resp.ok) {
|
|
321
|
+
const json = (await resp.json()) as {
|
|
322
|
+
total_token_consumed?: string;
|
|
323
|
+
};
|
|
324
|
+
if (json?.total_token_consumed) {
|
|
325
|
+
tokenUsage = {
|
|
326
|
+
total: json.total_token_consumed,
|
|
327
|
+
last30Days: "",
|
|
328
|
+
last7Days: "",
|
|
329
|
+
currentMonth: "",
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
} catch {
|
|
334
|
+
/* best-effort */
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Best-effort: credit balance. NOTE: the API response includes an
|
|
338
|
+
// `api_key` field — we deliberately do NOT read or persist it.
|
|
339
|
+
let creditBalance: string | undefined;
|
|
340
|
+
try {
|
|
341
|
+
const resp = await fetch(`${base}/backend/account/token_plan_credit`, {
|
|
342
|
+
headers,
|
|
343
|
+
});
|
|
344
|
+
if (resp.ok) {
|
|
345
|
+
const json = (await resp.json()) as {
|
|
346
|
+
remaining_credits?: number;
|
|
347
|
+
total_credits?: number;
|
|
348
|
+
};
|
|
349
|
+
if (
|
|
350
|
+
typeof json?.remaining_credits === "number" &&
|
|
351
|
+
typeof json?.total_credits === "number"
|
|
352
|
+
) {
|
|
353
|
+
creditBalance = `${json.remaining_credits} / ${json.total_credits}`;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
} catch {
|
|
357
|
+
/* best-effort */
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return {
|
|
361
|
+
provider: "minimax",
|
|
362
|
+
h5UsedPct: h5UsedPct ?? 0,
|
|
363
|
+
h5ResetsAt,
|
|
364
|
+
h5ResetsAtEpoch,
|
|
365
|
+
weeklyUsedPct: weeklyUsedPct ?? 0,
|
|
366
|
+
weeklyResetsAt,
|
|
367
|
+
weeklyResetsAtEpoch,
|
|
368
|
+
creditBalance,
|
|
369
|
+
tokenUsage,
|
|
370
|
+
apiEndpoints: [
|
|
371
|
+
`${base}/backend/account/token_plan/remains_percent`,
|
|
372
|
+
`${base}/backend/account/token_plan/usage_summary`,
|
|
373
|
+
`${base}/backend/account/token_plan_credit`,
|
|
374
|
+
],
|
|
375
|
+
scrapedAt: new Date().toISOString(),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Scrape quota data from MiniMax console using a headless browser.
|
|
381
|
+
*/
|
|
382
|
+
private async scrapeViaBrowser(): Promise<MiniMaxQuotaData> {
|
|
383
|
+
// Dynamic import for Playwright
|
|
384
|
+
let playwright: typeof import("playwright") | null = null;
|
|
385
|
+
try {
|
|
386
|
+
playwright = await import("playwright");
|
|
387
|
+
} catch {
|
|
388
|
+
const msg =
|
|
389
|
+
"Playwright not installed. Install with: bun add playwright\nThen install browsers: bunx playwright install chromium";
|
|
390
|
+
if (!this.config.quiet)
|
|
391
|
+
console.error("[DEBUG MiniMaxQuotaScraper] " + msg);
|
|
392
|
+
throw new Error(msg);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Pre-load the canonical cache so that the runtime-owned file
|
|
396
|
+
// (written by packages/cookie-sanitizer) takes precedence over
|
|
397
|
+
// whatever `this.config.cookieFile` points at. Both eventually
|
|
398
|
+
// resolve to the same standard Netscape format.
|
|
399
|
+
const cookies = loadNetscapeCookies(this.config.cookieFile!);
|
|
400
|
+
|
|
401
|
+
if (cookies.length === 0) {
|
|
402
|
+
const dropHint = join(homedir(), ".pi-harness-runtime", "cookies");
|
|
403
|
+
const msg = `No cookies found.
|
|
404
|
+
Drop your platform.minimax.io cookies (Netscape or EditThisCookie JSON) into:
|
|
405
|
+
${dropHint}
|
|
406
|
+
…or run: bun packages/auth/src/run-minimax-auth.ts auth`;
|
|
407
|
+
if (!this.config.quiet) console.error(`[MiniMaxQuotaScraper] ${msg}`);
|
|
408
|
+
throw new Error(msg);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Launch browser
|
|
412
|
+
const browser = await playwright.chromium.launch({
|
|
413
|
+
executablePath: this.config.chromePath,
|
|
414
|
+
headless: this.config.headless,
|
|
415
|
+
args: ["--no-sandbox", "--disable-dev-shm-usage"],
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
const context = await browser.newContext({
|
|
419
|
+
locale: "en-US",
|
|
420
|
+
viewport: { width: 1440, height: 1000 },
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
// Inject cookies
|
|
424
|
+
await context.addCookies(cookies);
|
|
425
|
+
|
|
426
|
+
const page = await context.newPage();
|
|
427
|
+
const capturedResponses: Array<{
|
|
428
|
+
url: string;
|
|
429
|
+
body: string;
|
|
430
|
+
}> = [];
|
|
431
|
+
|
|
432
|
+
// Capture API responses
|
|
433
|
+
page.on("response", (resp) => {
|
|
434
|
+
const url = resp.url();
|
|
435
|
+
if (API_TERMS.some((term) => url.toLowerCase().includes(term))) {
|
|
436
|
+
capturedResponses.push({
|
|
437
|
+
url,
|
|
438
|
+
body: "",
|
|
439
|
+
});
|
|
440
|
+
// We capture the URL, body will be fetched later
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
try {
|
|
445
|
+
// Navigate to usage page
|
|
446
|
+
await page.goto(this.config.url!, {
|
|
447
|
+
waitUntil: "domcontentloaded",
|
|
448
|
+
timeout: this.config.timeout,
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
// Wait for content to load
|
|
452
|
+
try {
|
|
453
|
+
await page.waitForLoadState("networkidle", { timeout: 45000 });
|
|
454
|
+
} catch {
|
|
455
|
+
// Network idle might not be achievable
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Additional wait for JS rendering
|
|
459
|
+
await page.waitForTimeout(5000);
|
|
460
|
+
|
|
461
|
+
// Extract visible text
|
|
462
|
+
const visibleText = redact(
|
|
463
|
+
await page.locator("body").innerText({ timeout: 10000 }),
|
|
464
|
+
);
|
|
465
|
+
|
|
466
|
+
// Parse the visible text
|
|
467
|
+
const quotaData = parseMiniMaxQuotaText(visibleText);
|
|
468
|
+
|
|
469
|
+
// Capture API endpoint URLs
|
|
470
|
+
this.capturedEndpoints = capturedResponses.map((r) => r.url);
|
|
471
|
+
|
|
472
|
+
const result: MiniMaxQuotaData = {
|
|
473
|
+
provider: "minimax",
|
|
474
|
+
h5UsedPct: quotaData.h5UsedPct ?? 0,
|
|
475
|
+
h5ResetsAt: quotaData.h5ResetsAt,
|
|
476
|
+
weeklyUsedPct: quotaData.weeklyUsedPct ?? 0,
|
|
477
|
+
weeklyResetsAt: quotaData.weeklyResetsAt,
|
|
478
|
+
monthlyUsedPct: quotaData.monthlyUsedPct,
|
|
479
|
+
monthlyResetsAt: quotaData.monthlyResetsAt,
|
|
480
|
+
creditBalance: quotaData.creditBalance,
|
|
481
|
+
tokenUsage: quotaData.tokenUsage,
|
|
482
|
+
apiEndpoints: this.capturedEndpoints,
|
|
483
|
+
scrapedAt: new Date().toISOString(),
|
|
484
|
+
};
|
|
485
|
+
return result;
|
|
486
|
+
} finally {
|
|
487
|
+
await browser.close();
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* Check if any cookie source exists.
|
|
493
|
+
*
|
|
494
|
+
* "Source" can be either:
|
|
495
|
+
* - the canonical cache (this.config.cookieFile) — runtime-owned,
|
|
496
|
+
* populated by packages/cookie-sanitizer
|
|
497
|
+
* - the user-facing drop folder — ~/.pi-harness-runtime/cookies/
|
|
498
|
+
* — populated by humans (any name, any format)
|
|
499
|
+
*
|
|
500
|
+
* Either is enough to attempt the scrape.
|
|
501
|
+
*/
|
|
502
|
+
hasCookieFile(): boolean {
|
|
503
|
+
// Canonical cache present?
|
|
504
|
+
if (existsSync(this.config.cookieFile!)) return true;
|
|
505
|
+
|
|
506
|
+
// Drop folder has anything readable? (Sync would normalize it on the next trigger.)
|
|
507
|
+
try {
|
|
508
|
+
const dropDir = join(homedir(), ".pi-harness-runtime", "cookies");
|
|
509
|
+
if (existsSync(dropDir)) {
|
|
510
|
+
const entries = readdirSync(dropDir);
|
|
511
|
+
if (entries.length > 0) return true;
|
|
512
|
+
// One-level walk into subfolders.
|
|
513
|
+
for (const name of entries) {
|
|
514
|
+
try {
|
|
515
|
+
if (statSync(join(dropDir, name)).isDirectory()) {
|
|
516
|
+
const sub = readdirSync(join(dropDir, name));
|
|
517
|
+
if (sub.length > 0) return true;
|
|
518
|
+
}
|
|
519
|
+
} catch {
|
|
520
|
+
// ignore unreadable sub-entry
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
} catch {
|
|
525
|
+
// best-effort; treat as no
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return false;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Get instructions for setting up cookies
|
|
533
|
+
*/
|
|
534
|
+
static getSetupInstructions(): string {
|
|
535
|
+
return `
|
|
536
|
+
MiniMax Quota Scraper Setup Instructions
|
|
537
|
+
======================================
|
|
538
|
+
|
|
539
|
+
1. Install Playwright:
|
|
540
|
+
bun add playwright
|
|
541
|
+
bunx playwright install chromium
|
|
542
|
+
|
|
543
|
+
2. Export cookies from your browser:
|
|
544
|
+
- Install "EditThisCookie" Chrome extension
|
|
545
|
+
- Go to https://platform.minimax.io
|
|
546
|
+
- Click the extension icon
|
|
547
|
+
- Click "Export" → "Netscape"
|
|
548
|
+
- Save to ~/.config/minimax-cookies.txt
|
|
549
|
+
|
|
550
|
+
3. Use the scraper:
|
|
551
|
+
const scraper = new MiniMaxQuotaScraper();
|
|
552
|
+
const quota = await scraper.scrape();
|
|
553
|
+
console.log("[DEBUG MiniMaxQuotaScraper] 5h usage:", quota.h5UsedPct, "%");
|
|
554
|
+
`;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// --- Quota Manager Integration -----------------------------------------------
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Quota Manager that periodically fetches MiniMax quota data
|
|
562
|
+
*/
|
|
563
|
+
export class MiniMaxQuotaManager {
|
|
564
|
+
private scraper: MiniMaxQuotaScraper;
|
|
565
|
+
private lastQuota?: MiniMaxQuotaData;
|
|
566
|
+
private lastFetchTime = 0;
|
|
567
|
+
private readonly cacheDurationMs: number;
|
|
568
|
+
|
|
569
|
+
constructor(
|
|
570
|
+
config: MiniMaxScraperConfig & { cacheDurationMs?: number } = {},
|
|
571
|
+
) {
|
|
572
|
+
this.scraper = new MiniMaxQuotaScraper(config);
|
|
573
|
+
this.cacheDurationMs = config.cacheDurationMs ?? 5 * 60 * 1000; // 5 min default
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* Get current quota (uses cache)
|
|
578
|
+
*/
|
|
579
|
+
async getQuota(forceRefresh = false): Promise<MiniMaxQuotaData> {
|
|
580
|
+
const now = Date.now();
|
|
581
|
+
|
|
582
|
+
if (
|
|
583
|
+
!forceRefresh &&
|
|
584
|
+
this.lastQuota &&
|
|
585
|
+
now - this.lastFetchTime < this.cacheDurationMs
|
|
586
|
+
) {
|
|
587
|
+
return this.lastQuota;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
try {
|
|
591
|
+
this.lastQuota = await this.scraper.scrape();
|
|
592
|
+
this.lastFetchTime = now;
|
|
593
|
+
return this.lastQuota;
|
|
594
|
+
} catch (error) {
|
|
595
|
+
// Return cached value if available
|
|
596
|
+
if (this.lastQuota) {
|
|
597
|
+
return this.lastQuota;
|
|
598
|
+
}
|
|
599
|
+
throw error;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Check if quota is available
|
|
605
|
+
*/
|
|
606
|
+
isAvailable(): boolean {
|
|
607
|
+
return this.scraper.hasCookieFile();
|
|
608
|
+
}
|
|
609
|
+
}
|