@slkiser/opencode-quota 5.0.2 → 6.0.0-beta.1
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/README.md +32 -46
- package/dist/agent-tools.d.ts +24 -0
- package/dist/agent-tools.d.ts.map +1 -0
- package/dist/agent-tools.js +578 -0
- package/dist/agent-tools.js.map +1 -0
- package/dist/bin/opencode-quota.d.ts.map +1 -1
- package/dist/bin/opencode-quota.js +1 -32
- package/dist/bin/opencode-quota.js.map +1 -1
- package/dist/core/errors.d.ts +12 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +141 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/pace.d.ts +13 -0
- package/dist/core/pace.d.ts.map +1 -0
- package/dist/core/pace.js +52 -0
- package/dist/core/pace.js.map +1 -0
- package/dist/core/persist.d.ts +44 -0
- package/dist/core/persist.d.ts.map +1 -0
- package/dist/core/persist.js +210 -0
- package/dist/core/persist.js.map +1 -0
- package/dist/core/provider-source.d.ts +40 -0
- package/dist/core/provider-source.d.ts.map +1 -0
- package/dist/core/provider-source.js +210 -0
- package/dist/core/provider-source.js.map +1 -0
- package/dist/core/redact.d.ts +17 -0
- package/dist/core/redact.d.ts.map +1 -0
- package/dist/core/redact.js +217 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/rows.d.ts +20 -0
- package/dist/core/rows.d.ts.map +1 -0
- package/dist/core/rows.js +142 -0
- package/dist/core/rows.js.map +1 -0
- package/dist/core/selection.d.ts +15 -0
- package/dist/core/selection.d.ts.map +1 -0
- package/dist/core/selection.js +43 -0
- package/dist/core/selection.js.map +1 -0
- package/dist/core/snapshot-publisher.d.ts +15 -0
- package/dist/core/snapshot-publisher.d.ts.map +1 -0
- package/dist/core/snapshot-publisher.js +57 -0
- package/dist/core/snapshot-publisher.js.map +1 -0
- package/dist/core/store.d.ts +93 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +563 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +186 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/usage-ranges.d.ts +46 -0
- package/dist/core/usage-ranges.d.ts.map +1 -0
- package/dist/core/usage-ranges.js +72 -0
- package/dist/core/usage-ranges.js.map +1 -0
- package/dist/core/usage.d.ts +100 -0
- package/dist/core/usage.d.ts.map +1 -0
- package/dist/core/usage.js +373 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/core/validate.d.ts +8 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +167 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/core/windows.d.ts +24 -0
- package/dist/core/windows.d.ts.map +1 -0
- package/dist/core/windows.js +43 -0
- package/dist/core/windows.js.map +1 -0
- package/dist/data/modelsdev-pricing.min.json +248 -22
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/accounting-format.d.ts +2 -52
- package/dist/lib/accounting-format.d.ts.map +1 -1
- package/dist/lib/accounting-format.js +6 -255
- package/dist/lib/accounting-format.js.map +1 -1
- package/dist/lib/alibaba-auth.d.ts +14 -21
- package/dist/lib/alibaba-auth.d.ts.map +1 -1
- package/dist/lib/alibaba-auth.js +36 -149
- package/dist/lib/alibaba-auth.js.map +1 -1
- package/dist/lib/alibaba-coding-plan-local-quota.d.ts +1 -6
- package/dist/lib/alibaba-coding-plan-local-quota.d.ts.map +1 -1
- package/dist/lib/alibaba-coding-plan-local-quota.js +1 -1
- package/dist/lib/alibaba-coding-plan-local-quota.js.map +1 -1
- package/dist/lib/alibaba-token-plan.d.ts +18 -27
- package/dist/lib/alibaba-token-plan.d.ts.map +1 -1
- package/dist/lib/alibaba-token-plan.js +121 -285
- package/dist/lib/alibaba-token-plan.js.map +1 -1
- package/dist/lib/anthropic-auth.d.ts +3 -5
- package/dist/lib/anthropic-auth.d.ts.map +1 -1
- package/dist/lib/anthropic-auth.js +6 -9
- package/dist/lib/anthropic-auth.js.map +1 -1
- package/dist/lib/anthropic.d.ts +12 -37
- package/dist/lib/anthropic.d.ts.map +1 -1
- package/dist/lib/anthropic.js +348 -698
- package/dist/lib/anthropic.js.map +1 -1
- package/dist/lib/api-key-resolver.d.ts +165 -192
- package/dist/lib/api-key-resolver.d.ts.map +1 -1
- package/dist/lib/api-key-resolver.js +208 -234
- package/dist/lib/api-key-resolver.js.map +1 -1
- package/dist/lib/atomic-json.d.ts +4 -1
- package/dist/lib/atomic-json.d.ts.map +1 -1
- package/dist/lib/atomic-json.js +2 -3
- package/dist/lib/atomic-json.js.map +1 -1
- package/dist/lib/calendar-date.d.ts +15 -0
- package/dist/lib/calendar-date.d.ts.map +1 -0
- package/dist/lib/calendar-date.js +21 -0
- package/dist/lib/calendar-date.js.map +1 -0
- package/dist/lib/chutes.d.ts +0 -1
- package/dist/lib/chutes.d.ts.map +1 -1
- package/dist/lib/chutes.js +2 -4
- package/dist/lib/chutes.js.map +1 -1
- package/dist/lib/cli-reports.d.ts +15 -11
- package/dist/lib/cli-reports.d.ts.map +1 -1
- package/dist/lib/cli-reports.js +34 -107
- package/dist/lib/cli-reports.js.map +1 -1
- package/dist/lib/cli-show.d.ts +9 -22
- package/dist/lib/cli-show.d.ts.map +1 -1
- package/dist/lib/cli-show.js +104 -75
- package/dist/lib/cli-show.js.map +1 -1
- package/dist/lib/config-file-utils.d.ts +3 -15
- package/dist/lib/config-file-utils.d.ts.map +1 -1
- package/dist/lib/config-file-utils.js +4 -63
- package/dist/lib/config-file-utils.js.map +1 -1
- package/dist/lib/config-write-target.d.ts +4 -7
- package/dist/lib/config-write-target.d.ts.map +1 -1
- package/dist/lib/config-write-target.js +4 -18
- package/dist/lib/config-write-target.js.map +1 -1
- package/dist/lib/copilot.d.ts +29 -20
- package/dist/lib/copilot.d.ts.map +1 -1
- package/dist/lib/copilot.js +392 -649
- package/dist/lib/copilot.js.map +1 -1
- package/dist/lib/cursor-detection.d.ts +3 -3
- package/dist/lib/cursor-detection.d.ts.map +1 -1
- package/dist/lib/cursor-detection.js +44 -88
- package/dist/lib/cursor-detection.js.map +1 -1
- package/dist/lib/cursor-pricing.d.ts +71 -8
- package/dist/lib/cursor-pricing.d.ts.map +1 -1
- package/dist/lib/cursor-pricing.js +34 -125
- package/dist/lib/cursor-pricing.js.map +1 -1
- package/dist/lib/cursor-usage.d.ts +6 -4
- package/dist/lib/cursor-usage.d.ts.map +1 -1
- package/dist/lib/cursor-usage.js +27 -40
- package/dist/lib/cursor-usage.js.map +1 -1
- package/dist/lib/deepseek.d.ts +9 -17
- package/dist/lib/deepseek.d.ts.map +1 -1
- package/dist/lib/deepseek.js +24 -54
- package/dist/lib/deepseek.js.map +1 -1
- package/dist/lib/display-sanitize.d.ts +0 -8
- package/dist/lib/display-sanitize.d.ts.map +1 -1
- package/dist/lib/display-sanitize.js +0 -139
- package/dist/lib/display-sanitize.js.map +1 -1
- package/dist/lib/entries.d.ts +13 -239
- package/dist/lib/entries.d.ts.map +1 -1
- package/dist/lib/entries.js +1 -46
- package/dist/lib/entries.js.map +1 -1
- package/dist/lib/file-lock.d.ts +23 -0
- package/dist/lib/file-lock.d.ts.map +1 -0
- package/dist/lib/file-lock.js +122 -0
- package/dist/lib/file-lock.js.map +1 -0
- package/dist/lib/format-utils.d.ts +2 -82
- package/dist/lib/format-utils.d.ts.map +1 -1
- package/dist/lib/format-utils.js +2 -191
- package/dist/lib/format-utils.js.map +1 -1
- package/dist/lib/glm-coding-plan.d.ts +6 -5
- package/dist/lib/glm-coding-plan.d.ts.map +1 -1
- package/dist/lib/glm-coding-plan.js +19 -1
- package/dist/lib/glm-coding-plan.js.map +1 -1
- package/dist/lib/google-agy.d.ts +8 -40
- package/dist/lib/google-agy.d.ts.map +1 -1
- package/dist/lib/google-agy.js +88 -519
- package/dist/lib/google-agy.js.map +1 -1
- package/dist/lib/google-companion-credentials.d.ts +9 -40
- package/dist/lib/google-companion-credentials.d.ts.map +1 -1
- package/dist/lib/google-companion-credentials.js +167 -224
- package/dist/lib/google-companion-credentials.js.map +1 -1
- package/dist/lib/google-gemini-cli.d.ts +5 -38
- package/dist/lib/google-gemini-cli.d.ts.map +1 -1
- package/dist/lib/google-gemini-cli.js +71 -442
- package/dist/lib/google-gemini-cli.js.map +1 -1
- package/dist/lib/google-oauth-quota.d.ts +76 -0
- package/dist/lib/google-oauth-quota.d.ts.map +1 -0
- package/dist/lib/google-oauth-quota.js +297 -0
- package/dist/lib/google-oauth-quota.js.map +1 -0
- package/dist/lib/google-token-cache.d.ts +3 -5
- package/dist/lib/google-token-cache.d.ts.map +1 -1
- package/dist/lib/google-token-cache.js +2 -14
- package/dist/lib/google-token-cache.js.map +1 -1
- package/dist/lib/home-dir-display.d.ts.map +1 -1
- package/dist/lib/home-dir-display.js +21 -39
- package/dist/lib/home-dir-display.js.map +1 -1
- package/dist/lib/http.d.ts +4 -1
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +2 -1
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/json-guards.d.ts +11 -0
- package/dist/lib/json-guards.d.ts.map +1 -0
- package/dist/lib/json-guards.js +25 -0
- package/dist/lib/json-guards.js.map +1 -0
- package/dist/lib/kilo.d.ts +0 -2
- package/dist/lib/kilo.d.ts.map +1 -1
- package/dist/lib/kilo.js +33 -116
- package/dist/lib/kilo.js.map +1 -1
- package/dist/lib/kimi-endpoints.d.ts +2 -2
- package/dist/lib/kimi-endpoints.d.ts.map +1 -1
- package/dist/lib/kimi-endpoints.js +1 -1
- package/dist/lib/kimi-endpoints.js.map +1 -1
- package/dist/lib/kimi.d.ts.map +1 -1
- package/dist/lib/kimi.js +40 -86
- package/dist/lib/kimi.js.map +1 -1
- package/dist/lib/maintainer-announcements.d.ts +4 -17
- package/dist/lib/maintainer-announcements.d.ts.map +1 -1
- package/dist/lib/maintainer-announcements.js +7 -44
- package/dist/lib/maintainer-announcements.js.map +1 -1
- package/dist/lib/maintainer-home-notice.d.ts +19 -0
- package/dist/lib/maintainer-home-notice.d.ts.map +1 -0
- package/dist/lib/maintainer-home-notice.js +92 -0
- package/dist/lib/maintainer-home-notice.js.map +1 -0
- package/dist/lib/mimo-config.d.ts +6 -9
- package/dist/lib/mimo-config.d.ts.map +1 -1
- package/dist/lib/mimo-config.js +43 -74
- package/dist/lib/mimo-config.js.map +1 -1
- package/dist/lib/mimo.d.ts +2 -5
- package/dist/lib/mimo.d.ts.map +1 -1
- package/dist/lib/mimo.js +57 -109
- package/dist/lib/mimo.js.map +1 -1
- package/dist/lib/minimax-endpoints.d.ts +2 -2
- package/dist/lib/minimax-endpoints.d.ts.map +1 -1
- package/dist/lib/minimax-endpoints.js +1 -1
- package/dist/lib/minimax-endpoints.js.map +1 -1
- package/dist/lib/modelsdev-pricing.d.ts +22 -16
- package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
- package/dist/lib/modelsdev-pricing.js +279 -510
- package/dist/lib/modelsdev-pricing.js.map +1 -1
- package/dist/lib/nanogpt.d.ts +6 -6
- package/dist/lib/nanogpt.d.ts.map +1 -1
- package/dist/lib/nanogpt.js +19 -72
- package/dist/lib/nanogpt.js.map +1 -1
- package/dist/lib/ollama-cloud.d.ts +3 -5
- package/dist/lib/ollama-cloud.d.ts.map +1 -1
- package/dist/lib/ollama-cloud.js +77 -46
- package/dist/lib/ollama-cloud.js.map +1 -1
- package/dist/lib/openai.d.ts +19 -29
- package/dist/lib/openai.d.ts.map +1 -1
- package/dist/lib/openai.js +134 -182
- package/dist/lib/openai.js.map +1 -1
- package/dist/lib/opencode-auth-sqlite.d.ts.map +1 -1
- package/dist/lib/opencode-auth-sqlite.js +22 -23
- package/dist/lib/opencode-auth-sqlite.js.map +1 -1
- package/dist/lib/opencode-auth.d.ts +17 -11
- package/dist/lib/opencode-auth.d.ts.map +1 -1
- package/dist/lib/opencode-auth.js +39 -46
- package/dist/lib/opencode-auth.js.map +1 -1
- package/dist/lib/opencode-config-editor.d.ts +3 -34
- package/dist/lib/opencode-config-editor.d.ts.map +1 -1
- package/dist/lib/opencode-config-editor.js +23 -142
- package/dist/lib/opencode-config-editor.js.map +1 -1
- package/dist/lib/opencode-config-providers.d.ts +4 -3
- package/dist/lib/opencode-config-providers.d.ts.map +1 -1
- package/dist/lib/opencode-config-providers.js +7 -11
- package/dist/lib/opencode-config-providers.js.map +1 -1
- package/dist/lib/opencode-config-read.d.ts +2 -1
- package/dist/lib/opencode-config-read.d.ts.map +1 -1
- package/dist/lib/opencode-config-read.js +3 -2
- package/dist/lib/opencode-config-read.js.map +1 -1
- package/dist/lib/opencode-console-auth.d.ts +2 -3
- package/dist/lib/opencode-console-auth.d.ts.map +1 -1
- package/dist/lib/opencode-console-auth.js +2 -2
- package/dist/lib/opencode-console-auth.js.map +1 -1
- package/dist/lib/opencode-go.d.ts.map +1 -1
- package/dist/lib/opencode-go.js +51 -79
- package/dist/lib/opencode-go.js.map +1 -1
- package/dist/lib/opencode-storage.d.ts +18 -3
- package/dist/lib/opencode-storage.d.ts.map +1 -1
- package/dist/lib/opencode-storage.js +134 -2
- package/dist/lib/opencode-storage.js.map +1 -1
- package/dist/lib/opencode-zen.d.ts +23 -7
- package/dist/lib/opencode-zen.d.ts.map +1 -1
- package/dist/lib/opencode-zen.js +175 -62
- package/dist/lib/opencode-zen.js.map +1 -1
- package/dist/lib/openrouter.d.ts.map +1 -1
- package/dist/lib/openrouter.js +1 -13
- package/dist/lib/openrouter.js.map +1 -1
- package/dist/lib/pricing-key.d.ts +48 -0
- package/dist/lib/pricing-key.d.ts.map +1 -0
- package/dist/lib/pricing-key.js +371 -0
- package/dist/lib/pricing-key.js.map +1 -0
- package/dist/lib/provider-metadata.d.ts +16 -20
- package/dist/lib/provider-metadata.d.ts.map +1 -1
- package/dist/lib/provider-metadata.js +69 -69
- package/dist/lib/provider-metadata.js.map +1 -1
- package/dist/lib/provider-model-matching.d.ts +2 -1
- package/dist/lib/provider-model-matching.d.ts.map +1 -1
- package/dist/lib/provider-registration.d.ts +1 -177
- package/dist/lib/provider-registration.d.ts.map +1 -1
- package/dist/lib/provider-registration.js +1 -163
- package/dist/lib/provider-registration.js.map +1 -1
- package/dist/lib/quota-dialog-commands.d.ts +87 -53
- package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
- package/dist/lib/quota-dialog-commands.js +259 -519
- package/dist/lib/quota-dialog-commands.js.map +1 -1
- package/dist/lib/quota-export-types.d.ts +29 -23
- package/dist/lib/quota-export-types.d.ts.map +1 -1
- package/dist/lib/quota-export.d.ts +16 -26
- package/dist/lib/quota-export.d.ts.map +1 -1
- package/dist/lib/quota-export.js +105 -147
- package/dist/lib/quota-export.js.map +1 -1
- package/dist/lib/quota-providers-local.d.ts +12 -8
- package/dist/lib/quota-providers-local.d.ts.map +1 -1
- package/dist/lib/quota-providers-local.js +150 -223
- package/dist/lib/quota-providers-local.js.map +1 -1
- package/dist/lib/quota-providers-remote.d.ts +3 -8
- package/dist/lib/quota-providers-remote.d.ts.map +1 -1
- package/dist/lib/quota-providers-remote.js +309 -449
- package/dist/lib/quota-providers-remote.js.map +1 -1
- package/dist/lib/quota-providers.d.ts +57 -15
- package/dist/lib/quota-providers.d.ts.map +1 -1
- package/dist/lib/quota-providers.js +157 -64
- package/dist/lib/quota-providers.js.map +1 -1
- package/dist/lib/quota-report-message.d.ts +23 -10
- package/dist/lib/quota-report-message.d.ts.map +1 -1
- package/dist/lib/quota-report-message.js +37 -13
- package/dist/lib/quota-report-message.js.map +1 -1
- package/dist/lib/quota-retry-wait.d.ts +14 -6
- package/dist/lib/quota-retry-wait.d.ts.map +1 -1
- package/dist/lib/quota-retry-wait.js +37 -39
- package/dist/lib/quota-retry-wait.js.map +1 -1
- package/dist/lib/quota-status.d.ts +50 -33
- package/dist/lib/quota-status.d.ts.map +1 -1
- package/dist/lib/quota-status.js +1113 -772
- package/dist/lib/quota-status.js.map +1 -1
- package/dist/lib/quota-telemetry.d.ts +7 -14
- package/dist/lib/quota-telemetry.d.ts.map +1 -1
- package/dist/lib/quota-telemetry.js +46 -97
- package/dist/lib/quota-telemetry.js.map +1 -1
- package/dist/lib/report-document.d.ts +5 -65
- package/dist/lib/report-document.d.ts.map +1 -1
- package/dist/lib/report-document.js +14 -167
- package/dist/lib/report-document.js.map +1 -1
- package/dist/lib/resolved-auth-identity.d.ts +1 -2
- package/dist/lib/resolved-auth-identity.d.ts.map +1 -1
- package/dist/lib/resolved-auth-identity.js +0 -4
- package/dist/lib/resolved-auth-identity.js.map +1 -1
- package/dist/lib/session-tokens.d.ts +19 -19
- package/dist/lib/session-tokens.d.ts.map +1 -1
- package/dist/lib/session-tokens.js +58 -44
- package/dist/lib/session-tokens.js.map +1 -1
- package/dist/lib/synthetic.d.ts +0 -1
- package/dist/lib/synthetic.d.ts.map +1 -1
- package/dist/lib/synthetic.js +43 -94
- package/dist/lib/synthetic.js.map +1 -1
- package/dist/lib/token-buckets.d.ts +0 -1
- package/dist/lib/token-buckets.d.ts.map +1 -1
- package/dist/lib/token-buckets.js +0 -3
- package/dist/lib/token-buckets.js.map +1 -1
- package/dist/lib/token-cost.d.ts +2 -1
- package/dist/lib/token-cost.d.ts.map +1 -1
- package/dist/lib/types.d.ts +46 -340
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +2 -69
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/xai.d.ts +6 -6
- package/dist/lib/xai.d.ts.map +1 -1
- package/dist/lib/xai.js +51 -90
- package/dist/lib/xai.js.map +1 -1
- package/dist/plugin.d.ts +6 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +315 -90
- package/dist/plugin.js.map +1 -1
- package/dist/providers/alibaba-coding-plan.d.ts +4 -0
- package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
- package/dist/providers/alibaba-coding-plan.js +47 -77
- package/dist/providers/alibaba-coding-plan.js.map +1 -1
- package/dist/providers/alibaba-token-plan.d.ts.map +1 -1
- package/dist/providers/alibaba-token-plan.js +34 -46
- package/dist/providers/alibaba-token-plan.js.map +1 -1
- package/dist/providers/anthropic.d.ts +2 -4
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +80 -162
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/cache-policies.d.ts +0 -2
- package/dist/providers/cache-policies.d.ts.map +1 -1
- package/dist/providers/cache-policies.js +45 -91
- package/dist/providers/cache-policies.js.map +1 -1
- package/dist/providers/chutes.d.ts +0 -3
- package/dist/providers/chutes.d.ts.map +1 -1
- package/dist/providers/chutes.js +16 -28
- package/dist/providers/chutes.js.map +1 -1
- package/dist/providers/contract.d.ts +128 -0
- package/dist/providers/contract.d.ts.map +1 -0
- package/dist/providers/contract.js +101 -0
- package/dist/providers/contract.js.map +1 -0
- package/dist/providers/copilot.d.ts.map +1 -1
- package/dist/providers/copilot.js +171 -175
- package/dist/providers/copilot.js.map +1 -1
- package/dist/providers/cursor.d.ts.map +1 -1
- package/dist/providers/cursor.js +56 -109
- package/dist/providers/cursor.js.map +1 -1
- package/dist/providers/deepseek.d.ts +1 -6
- package/dist/providers/deepseek.d.ts.map +1 -1
- package/dist/providers/deepseek.js +46 -81
- package/dist/providers/deepseek.js.map +1 -1
- package/dist/providers/glm-coding-plan.d.ts +8 -0
- package/dist/providers/glm-coding-plan.d.ts.map +1 -0
- package/dist/providers/glm-coding-plan.js +106 -0
- package/dist/providers/glm-coding-plan.js.map +1 -0
- package/dist/providers/google-agy.d.ts.map +1 -1
- package/dist/providers/google-agy.js +41 -179
- package/dist/providers/google-agy.js.map +1 -1
- package/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/dist/providers/google-gemini-cli.js +51 -151
- package/dist/providers/google-gemini-cli.js.map +1 -1
- package/dist/providers/google-oauth-provider.d.ts +39 -0
- package/dist/providers/google-oauth-provider.d.ts.map +1 -0
- package/dist/providers/google-oauth-provider.js +161 -0
- package/dist/providers/google-oauth-provider.js.map +1 -0
- package/dist/providers/kilo.d.ts +0 -3
- package/dist/providers/kilo.d.ts.map +1 -1
- package/dist/providers/kilo.js +69 -123
- package/dist/providers/kilo.js.map +1 -1
- package/dist/providers/kimi-code.d.ts +5 -0
- package/dist/providers/kimi-code.d.ts.map +1 -1
- package/dist/providers/kimi-code.js +91 -136
- package/dist/providers/kimi-code.js.map +1 -1
- package/dist/providers/mimo.d.ts.map +1 -1
- package/dist/providers/mimo.js +55 -94
- package/dist/providers/mimo.js.map +1 -1
- package/dist/providers/minimax-coding-plan.d.ts +2 -23
- package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
- package/dist/providers/minimax-coding-plan.js +161 -277
- package/dist/providers/minimax-coding-plan.js.map +1 -1
- package/dist/providers/nanogpt.d.ts +0 -3
- package/dist/providers/nanogpt.d.ts.map +1 -1
- package/dist/providers/nanogpt.js +61 -95
- package/dist/providers/nanogpt.js.map +1 -1
- package/dist/providers/ollama-cloud.d.ts +0 -5
- package/dist/providers/ollama-cloud.d.ts.map +1 -1
- package/dist/providers/ollama-cloud.js +86 -87
- package/dist/providers/ollama-cloud.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +157 -150
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/opencode-go.d.ts.map +1 -1
- package/dist/providers/opencode-go.js +157 -199
- package/dist/providers/opencode-go.js.map +1 -1
- package/dist/providers/opencode-zen.d.ts.map +1 -1
- package/dist/providers/opencode-zen.js +104 -141
- package/dist/providers/opencode-zen.js.map +1 -1
- package/dist/providers/openrouter.d.ts +0 -3
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +26 -13
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/quota-providers.d.ts +7 -3
- package/dist/providers/quota-providers.d.ts.map +1 -1
- package/dist/providers/quota-providers.js +111 -217
- package/dist/providers/quota-providers.js.map +1 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +1 -2
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/result-helpers.d.ts +10 -37
- package/dist/providers/result-helpers.d.ts.map +1 -1
- package/dist/providers/result-helpers.js +23 -56
- package/dist/providers/result-helpers.js.map +1 -1
- package/dist/providers/synthetic.d.ts +0 -3
- package/dist/providers/synthetic.d.ts.map +1 -1
- package/dist/providers/synthetic.js +16 -58
- package/dist/providers/synthetic.js.map +1 -1
- package/dist/providers/xai.d.ts +2 -1
- package/dist/providers/xai.d.ts.map +1 -1
- package/dist/providers/xai.js +49 -71
- package/dist/providers/xai.js.map +1 -1
- package/dist/rpc.d.ts +110 -38
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +125 -37
- package/dist/rpc.js.map +1 -1
- package/dist/settings/convert.d.ts +60 -0
- package/dist/settings/convert.d.ts.map +1 -0
- package/dist/settings/convert.js +473 -0
- package/dist/settings/convert.js.map +1 -0
- package/dist/settings/file.d.ts +89 -0
- package/dist/settings/file.d.ts.map +1 -0
- package/dist/settings/file.js +452 -0
- package/dist/settings/file.js.map +1 -0
- package/dist/settings/index.d.ts +10 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +3 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/schema.d.ts +607 -0
- package/dist/settings/schema.d.ts.map +1 -0
- package/dist/settings/schema.js +479 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/tui/client.d.ts +86 -0
- package/dist/tui/client.d.ts.map +1 -0
- package/dist/tui/client.js +229 -0
- package/dist/tui/client.js.map +1 -0
- package/dist/tui/display.d.ts +127 -0
- package/dist/tui/display.d.ts.map +1 -0
- package/dist/tui/display.js +474 -0
- package/dist/tui/display.js.map +1 -0
- package/dist/tui/index.d.ts +21 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +305 -0
- package/dist/tui/server-settings.d.ts +43 -0
- package/dist/tui/server-settings.d.ts.map +1 -0
- package/dist/tui/server-settings.js +233 -0
- package/dist/tui/server-settings.js.map +1 -0
- package/dist/tui/sidebar.d.ts +41 -0
- package/dist/tui/sidebar.d.ts.map +1 -0
- package/dist/tui/sidebar.js +148 -0
- package/dist/tui/status-line.d.ts +14 -0
- package/dist/tui/status-line.d.ts.map +1 -0
- package/dist/tui/status-line.js +225 -0
- package/dist/tui/theme.d.ts +41 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +52 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/toast-colors.d.ts +37 -0
- package/dist/tui/toast-colors.d.ts.map +1 -0
- package/dist/tui/toast-colors.js +77 -0
- package/dist/tui/toasts.d.ts +59 -0
- package/dist/tui/toasts.d.ts.map +1 -0
- package/dist/tui/toasts.js +148 -0
- package/dist/tui/toasts.js.map +1 -0
- package/dist/tui/window/drag.d.ts +26 -0
- package/dist/tui/window/drag.d.ts.map +1 -0
- package/dist/tui/window/drag.js +80 -0
- package/dist/tui/window/drag.js.map +1 -0
- package/dist/tui/window/limits.d.ts +15 -0
- package/dist/tui/window/limits.d.ts.map +1 -0
- package/dist/tui/window/limits.js +227 -0
- package/dist/tui/window/limits.js.map +1 -0
- package/dist/tui/window/rail.d.ts +21 -0
- package/dist/tui/window/rail.d.ts.map +1 -0
- package/dist/tui/window/rail.js +81 -0
- package/dist/tui/window/settings.d.ts +164 -0
- package/dist/tui/window/settings.d.ts.map +1 -0
- package/dist/tui/window/settings.js +1679 -0
- package/dist/tui/window/shell.d.ts +108 -0
- package/dist/tui/window/shell.d.ts.map +1 -0
- package/dist/tui/window/shell.js +1003 -0
- package/dist/tui/window/usage.d.ts +75 -0
- package/dist/tui/window/usage.d.ts.map +1 -0
- package/dist/tui/window/usage.js +928 -0
- package/dist/tui/window/views.d.ts +61 -0
- package/dist/tui/window/views.d.ts.map +1 -0
- package/dist/tui/window/views.js +242 -0
- package/dist/tui.d.ts +1 -5
- package/dist/tui.js +1 -894
- package/dist/view/columns.d.ts +15 -0
- package/dist/view/columns.d.ts.map +1 -0
- package/dist/view/columns.js +48 -0
- package/dist/view/columns.js.map +1 -0
- package/dist/view/format.d.ts +82 -0
- package/dist/view/format.d.ts.map +1 -0
- package/dist/view/format.js +201 -0
- package/dist/view/format.js.map +1 -0
- package/dist/view/quick-look.d.ts +28 -0
- package/dist/view/quick-look.d.ts.map +1 -0
- package/dist/view/quick-look.js +150 -0
- package/dist/view/quick-look.js.map +1 -0
- package/dist/view/select.d.ts +67 -0
- package/dist/view/select.d.ts.map +1 -0
- package/dist/view/select.js +87 -0
- package/dist/view/select.js.map +1 -0
- package/dist/view/text.d.ts +153 -0
- package/dist/view/text.d.ts.map +1 -0
- package/dist/view/text.js +642 -0
- package/dist/view/text.js.map +1 -0
- package/dist/view/usage.d.ts +86 -0
- package/dist/view/usage.d.ts.map +1 -0
- package/dist/view/usage.js +724 -0
- package/dist/view/usage.js.map +1 -0
- package/package.json +4 -6
- package/dist/lib/chutes-config.d.ts +0 -15
- package/dist/lib/chutes-config.d.ts.map +0 -1
- package/dist/lib/chutes-config.js +0 -28
- package/dist/lib/chutes-config.js.map +0 -1
- package/dist/lib/cli-status.d.ts +0 -8
- package/dist/lib/cli-status.d.ts.map +0 -1
- package/dist/lib/cli-status.js +0 -98
- package/dist/lib/cli-status.js.map +0 -1
- package/dist/lib/command-parsing.d.ts +0 -43
- package/dist/lib/command-parsing.d.ts.map +0 -1
- package/dist/lib/command-parsing.js +0 -103
- package/dist/lib/command-parsing.js.map +0 -1
- package/dist/lib/config.d.ts +0 -63
- package/dist/lib/config.d.ts.map +0 -1
- package/dist/lib/config.js +0 -1083
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/deepseek-auth.d.ts +0 -15
- package/dist/lib/deepseek-auth.d.ts.map +0 -1
- package/dist/lib/deepseek-auth.js +0 -28
- package/dist/lib/deepseek-auth.js.map +0 -1
- package/dist/lib/format.d.ts +0 -25
- package/dist/lib/format.d.ts.map +0 -1
- package/dist/lib/format.js +0 -300
- package/dist/lib/format.js.map +0 -1
- package/dist/lib/google-agy-companion.d.ts +0 -8
- package/dist/lib/google-agy-companion.d.ts.map +0 -1
- package/dist/lib/google-agy-companion.js +0 -64
- package/dist/lib/google-agy-companion.js.map +0 -1
- package/dist/lib/google-gemini-cli-companion.d.ts +0 -8
- package/dist/lib/google-gemini-cli-companion.d.ts.map +0 -1
- package/dist/lib/google-gemini-cli-companion.js +0 -64
- package/dist/lib/google-gemini-cli-companion.js.map +0 -1
- package/dist/lib/grouped-entry-normalization.d.ts +0 -12
- package/dist/lib/grouped-entry-normalization.d.ts.map +0 -1
- package/dist/lib/grouped-entry-normalization.js +0 -124
- package/dist/lib/grouped-entry-normalization.js.map +0 -1
- package/dist/lib/grouped-header-format.d.ts +0 -5
- package/dist/lib/grouped-header-format.d.ts.map +0 -1
- package/dist/lib/grouped-header-format.js +0 -16
- package/dist/lib/grouped-header-format.js.map +0 -1
- package/dist/lib/init-installer.d.ts +0 -123
- package/dist/lib/init-installer.d.ts.map +0 -1
- package/dist/lib/init-installer.js +0 -1111
- package/dist/lib/init-installer.js.map +0 -1
- package/dist/lib/jsonc.d.ts +0 -17
- package/dist/lib/jsonc.d.ts.map +0 -1
- package/dist/lib/jsonc.js +0 -23
- package/dist/lib/jsonc.js.map +0 -1
- package/dist/lib/kilo-config.d.ts +0 -15
- package/dist/lib/kilo-config.d.ts.map +0 -1
- package/dist/lib/kilo-config.js +0 -27
- package/dist/lib/kilo-config.js.map +0 -1
- package/dist/lib/kimi-auth.d.ts +0 -49
- package/dist/lib/kimi-auth.d.ts.map +0 -1
- package/dist/lib/kimi-auth.js +0 -82
- package/dist/lib/kimi-auth.js.map +0 -1
- package/dist/lib/markdown-table.d.ts +0 -51
- package/dist/lib/markdown-table.d.ts.map +0 -1
- package/dist/lib/markdown-table.js +0 -179
- package/dist/lib/markdown-table.js.map +0 -1
- package/dist/lib/minimax-auth.d.ts +0 -62
- package/dist/lib/minimax-auth.d.ts.map +0 -1
- package/dist/lib/minimax-auth.js +0 -206
- package/dist/lib/minimax-auth.js.map +0 -1
- package/dist/lib/nanogpt-config.d.ts +0 -15
- package/dist/lib/nanogpt-config.d.ts.map +0 -1
- package/dist/lib/nanogpt-config.js +0 -31
- package/dist/lib/nanogpt-config.js.map +0 -1
- package/dist/lib/ollama-cloud-config.d.ts +0 -15
- package/dist/lib/ollama-cloud-config.d.ts.map +0 -1
- package/dist/lib/ollama-cloud-config.js +0 -27
- package/dist/lib/ollama-cloud-config.js.map +0 -1
- package/dist/lib/opencode-go-auth.d.ts +0 -16
- package/dist/lib/opencode-go-auth.d.ts.map +0 -1
- package/dist/lib/opencode-go-auth.js +0 -42
- package/dist/lib/opencode-go-auth.js.map +0 -1
- package/dist/lib/opencode-version.d.ts +0 -6
- package/dist/lib/opencode-version.d.ts.map +0 -1
- package/dist/lib/opencode-version.js +0 -26
- package/dist/lib/opencode-version.js.map +0 -1
- package/dist/lib/provider-add-command.d.ts +0 -35
- package/dist/lib/provider-add-command.d.ts.map +0 -1
- package/dist/lib/provider-add-command.js +0 -204
- package/dist/lib/provider-add-command.js.map +0 -1
- package/dist/lib/provider-add-json-v1-questionnaire.d.ts +0 -32
- package/dist/lib/provider-add-json-v1-questionnaire.d.ts.map +0 -1
- package/dist/lib/provider-add-json-v1-questionnaire.js +0 -336
- package/dist/lib/provider-add-json-v1-questionnaire.js.map +0 -1
- package/dist/lib/provider-add.d.ts +0 -21
- package/dist/lib/provider-add.d.ts.map +0 -1
- package/dist/lib/provider-add.js +0 -219
- package/dist/lib/provider-add.js.map +0 -1
- package/dist/lib/quota-accounting-projection.d.ts +0 -9
- package/dist/lib/quota-accounting-projection.d.ts.map +0 -1
- package/dist/lib/quota-accounting-projection.js +0 -254
- package/dist/lib/quota-accounting-projection.js.map +0 -1
- package/dist/lib/quota-columns.d.ts +0 -38
- package/dist/lib/quota-columns.d.ts.map +0 -1
- package/dist/lib/quota-columns.js +0 -129
- package/dist/lib/quota-columns.js.map +0 -1
- package/dist/lib/quota-command-format.d.ts +0 -34
- package/dist/lib/quota-command-format.d.ts.map +0 -1
- package/dist/lib/quota-command-format.js +0 -240
- package/dist/lib/quota-command-format.js.map +0 -1
- package/dist/lib/quota-dialog-command-specs.d.ts +0 -63
- package/dist/lib/quota-dialog-command-specs.d.ts.map +0 -1
- package/dist/lib/quota-dialog-command-specs.js +0 -145
- package/dist/lib/quota-dialog-command-specs.js.map +0 -1
- package/dist/lib/quota-entry-display.d.ts +0 -7
- package/dist/lib/quota-entry-display.d.ts.map +0 -1
- package/dist/lib/quota-entry-display.js +0 -59
- package/dist/lib/quota-entry-display.js.map +0 -1
- package/dist/lib/quota-exhaustion-projection.d.ts +0 -11
- package/dist/lib/quota-exhaustion-projection.d.ts.map +0 -1
- package/dist/lib/quota-exhaustion-projection.js +0 -105
- package/dist/lib/quota-exhaustion-projection.js.map +0 -1
- package/dist/lib/quota-format-style.d.ts +0 -21
- package/dist/lib/quota-format-style.d.ts.map +0 -1
- package/dist/lib/quota-format-style.js +0 -38
- package/dist/lib/quota-format-style.js.map +0 -1
- package/dist/lib/quota-render-data.d.ts +0 -102
- package/dist/lib/quota-render-data.d.ts.map +0 -1
- package/dist/lib/quota-render-data.js +0 -419
- package/dist/lib/quota-render-data.js.map +0 -1
- package/dist/lib/quota-reset-notifications.d.ts +0 -20
- package/dist/lib/quota-reset-notifications.d.ts.map +0 -1
- package/dist/lib/quota-reset-notifications.js +0 -331
- package/dist/lib/quota-reset-notifications.js.map +0 -1
- package/dist/lib/quota-runtime-context.d.ts +0 -54
- package/dist/lib/quota-runtime-context.d.ts.map +0 -1
- package/dist/lib/quota-runtime-context.js +0 -110
- package/dist/lib/quota-runtime-context.js.map +0 -1
- package/dist/lib/quota-state-codec.d.ts +0 -16
- package/dist/lib/quota-state-codec.d.ts.map +0 -1
- package/dist/lib/quota-state-codec.js +0 -412
- package/dist/lib/quota-state-codec.js.map +0 -1
- package/dist/lib/quota-state.d.ts +0 -28
- package/dist/lib/quota-state.d.ts.map +0 -1
- package/dist/lib/quota-state.js +0 -473
- package/dist/lib/quota-state.js.map +0 -1
- package/dist/lib/quota-stats-format.d.ts +0 -29
- package/dist/lib/quota-stats-format.d.ts.map +0 -1
- package/dist/lib/quota-stats-format.js +0 -459
- package/dist/lib/quota-stats-format.js.map +0 -1
- package/dist/lib/quota-stats.d.ts +0 -126
- package/dist/lib/quota-stats.d.ts.map +0 -1
- package/dist/lib/quota-stats.js +0 -695
- package/dist/lib/quota-stats.js.map +0 -1
- package/dist/lib/quota-surface-data.d.ts +0 -26
- package/dist/lib/quota-surface-data.d.ts.map +0 -1
- package/dist/lib/quota-surface-data.js +0 -299
- package/dist/lib/quota-surface-data.js.map +0 -1
- package/dist/lib/scoped-update-migration.d.ts +0 -103
- package/dist/lib/scoped-update-migration.d.ts.map +0 -1
- package/dist/lib/scoped-update-migration.js +0 -344
- package/dist/lib/scoped-update-migration.js.map +0 -1
- package/dist/lib/scoped-update.d.ts +0 -77
- package/dist/lib/scoped-update.d.ts.map +0 -1
- package/dist/lib/scoped-update.js +0 -590
- package/dist/lib/scoped-update.js.map +0 -1
- package/dist/lib/session-tokens-format.d.ts +0 -36
- package/dist/lib/session-tokens-format.d.ts.map +0 -1
- package/dist/lib/session-tokens-format.js +0 -111
- package/dist/lib/session-tokens-format.js.map +0 -1
- package/dist/lib/synthetic-config.d.ts +0 -15
- package/dist/lib/synthetic-config.d.ts.map +0 -1
- package/dist/lib/synthetic-config.js +0 -28
- package/dist/lib/synthetic-config.js.map +0 -1
- package/dist/lib/toast-format-grouped.d.ts +0 -25
- package/dist/lib/toast-format-grouped.d.ts.map +0 -1
- package/dist/lib/toast-format-grouped.js +0 -296
- package/dist/lib/toast-format-grouped.js.map +0 -1
- package/dist/lib/tui-compact-format.d.ts +0 -10
- package/dist/lib/tui-compact-format.d.ts.map +0 -1
- package/dist/lib/tui-compact-format.js +0 -460
- package/dist/lib/tui-compact-format.js.map +0 -1
- package/dist/lib/tui-panel-state.d.ts +0 -15
- package/dist/lib/tui-panel-state.d.ts.map +0 -1
- package/dist/lib/tui-panel-state.js +0 -2
- package/dist/lib/tui-panel-state.js.map +0 -1
- package/dist/lib/tui-prompt-bar-format.d.ts +0 -25
- package/dist/lib/tui-prompt-bar-format.d.ts.map +0 -1
- package/dist/lib/tui-prompt-bar-format.js +0 -206
- package/dist/lib/tui-prompt-bar-format.js.map +0 -1
- package/dist/lib/tui-sidebar-format.d.ts +0 -13
- package/dist/lib/tui-sidebar-format.d.ts.map +0 -1
- package/dist/lib/tui-sidebar-format.js +0 -34
- package/dist/lib/tui-sidebar-format.js.map +0 -1
- package/dist/lib/zai-auth.d.ts +0 -15
- package/dist/lib/zai-auth.d.ts.map +0 -1
- package/dist/lib/zai-auth.js +0 -37
- package/dist/lib/zai-auth.js.map +0 -1
- package/dist/lib/zai.d.ts +0 -5
- package/dist/lib/zai.d.ts.map +0 -1
- package/dist/lib/zai.js +0 -14
- package/dist/lib/zai.js.map +0 -1
- package/dist/lib/zhipu-auth.d.ts +0 -15
- package/dist/lib/zhipu-auth.d.ts.map +0 -1
- package/dist/lib/zhipu-auth.js +0 -42
- package/dist/lib/zhipu-auth.js.map +0 -1
- package/dist/lib/zhipu.d.ts +0 -5
- package/dist/lib/zhipu.d.ts.map +0 -1
- package/dist/lib/zhipu.js +0 -13
- package/dist/lib/zhipu.js.map +0 -1
- package/dist/providers/glm-coding-plan-provider.d.ts +0 -56
- package/dist/providers/glm-coding-plan-provider.d.ts.map +0 -1
- package/dist/providers/glm-coding-plan-provider.js +0 -115
- package/dist/providers/glm-coding-plan-provider.js.map +0 -1
- package/dist/providers/google-account-format.d.ts +0 -7
- package/dist/providers/google-account-format.d.ts.map +0 -1
- package/dist/providers/google-account-format.js +0 -52
- package/dist/providers/google-account-format.js.map +0 -1
- package/dist/providers/zai.d.ts +0 -2
- package/dist/providers/zai.d.ts.map +0 -1
- package/dist/providers/zai.js +0 -24
- package/dist/providers/zai.js.map +0 -1
- package/dist/providers/zhipu.d.ts +0 -2
- package/dist/providers/zhipu.d.ts.map +0 -1
- package/dist/providers/zhipu.js +0 -21
- package/dist/providers/zhipu.js.map +0 -1
- package/dist/tui-v2.d.ts +0 -5
- package/dist/tui-v2.d.ts.map +0 -1
- package/dist/tui-v2.jsx +0 -624
- package/dist/tui-v2.jsx.map +0 -1
- package/dist/tui.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-source.d.ts","sourceRoot":"","sources":["../../src/core/provider-source.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAc3B,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,sBAAsB,CAAC;AAGrE,OAAO,KAAK,EAAmD,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,mEAAmE;IACnE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvC,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,cAAc,CAAC;CAChC,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,cAAc,GAAG;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,mBAAmB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,EAAE,CAAC;IACvD,wFAAwF;IACxF,2BAA2B,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,EAAE,CAAC;IAC/D,mEAAmE;IACnE,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AASF,4EAA4E;AAC5E,wBAAgB,eAAe,CAC7B,IAAI,EAAE,kBAAkB,EACxB,MAAM,GAAE,cAAgC,GACvC,oBAAoB,CAoBtB;AA8ED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAuCD,sFAAsF;AACtF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4CvF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAa1F"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The providers as the store needs them: which ones the server settings turn on and which of
|
|
3
|
+
* those are available, how to ask each one, and who it is signed in as. Every read takes the
|
|
4
|
+
* settings the host holds now, so a settings change applies to the next snapshot or refresh.
|
|
5
|
+
*/
|
|
6
|
+
import { createHmac, randomBytes } from "node:crypto";
|
|
7
|
+
import { getQuotaProviderDisplayLabel, isLiveLocalUsageProviderId, } from "../lib/provider-metadata.js";
|
|
8
|
+
import { exportProviderFromCheck } from "../lib/quota-export.js";
|
|
9
|
+
import { cloneQuotaProviders, QUOTA_PROVIDERS_AGGREGATE_ID, selectEligibleQuotaProviderDefinitions, } from "../lib/quota-providers.js";
|
|
10
|
+
import { deriveResolvedAuthIdentity } from "../lib/resolved-auth-identity.js";
|
|
11
|
+
import { createRuntimeProviderIdResolver } from "../lib/runtime-provider-ids.js";
|
|
12
|
+
import { getProviders } from "../providers/registry.js";
|
|
13
|
+
import { rowsFromProviderResult } from "./rows.js";
|
|
14
|
+
import { matchesQuotaProviderCurrentSelection } from "./selection.js";
|
|
15
|
+
/** All registered providers except the ids switched off, with custom mapped to its registry id. */
|
|
16
|
+
function registryProviderIds(off) {
|
|
17
|
+
return getProviders()
|
|
18
|
+
.map((provider) => provider.id)
|
|
19
|
+
.filter((id) => !off.includes(id === QUOTA_PROVIDERS_AGGREGATE_ID ? "custom" : id));
|
|
20
|
+
}
|
|
21
|
+
/** What every provider reads from the settings when it checks its quota. */
|
|
22
|
+
export function providerContext(host, loaded = host.settings()) {
|
|
23
|
+
const { settings, fromFile } = loaded;
|
|
24
|
+
const { anthropic, cursor, opencode } = settings.providers;
|
|
25
|
+
return {
|
|
26
|
+
client: host.client,
|
|
27
|
+
resolveRuntimeProviderIds: createRuntimeProviderIdResolver(host.client),
|
|
28
|
+
workspaceRoot: host.workspaceRoot,
|
|
29
|
+
config: {
|
|
30
|
+
anthropicBinaryPath: anthropic.binaryPath,
|
|
31
|
+
cursorPlan: cursor.plan,
|
|
32
|
+
cursorIncludedApiUsd: cursor.includedApiUsd ?? undefined,
|
|
33
|
+
cursorBillingCycleStartDay: cursor.billingCycleStartDay ?? undefined,
|
|
34
|
+
opencodeMonthlyLimit: opencode.monthlyLimitUsd ?? undefined,
|
|
35
|
+
requestTimeoutMs: settings.providers.checking.requestTimeoutMs,
|
|
36
|
+
requestTimeoutMsConfigured: fromFile.includes("providers.checking.requestTimeoutMs"),
|
|
37
|
+
enabledProviders: registryProviderIds(settings.providers.off),
|
|
38
|
+
automaticDiscovery: true,
|
|
39
|
+
quotaProviders: cloneQuotaProviders(settings.providers.custom),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** The registered providers that serve `model`, by the settings in `ctx`. */
|
|
44
|
+
function providerIdsForModel(ctx, model) {
|
|
45
|
+
return getProviders()
|
|
46
|
+
.filter((provider) => matchesQuotaProviderCurrentSelection({
|
|
47
|
+
provider,
|
|
48
|
+
currentModel: model.id,
|
|
49
|
+
currentProviderID: model.providerID,
|
|
50
|
+
enabledProviders: ctx.config.enabledProviders,
|
|
51
|
+
automaticDiscovery: ctx.config.automaticDiscovery,
|
|
52
|
+
quotaProviders: ctx.config.quotaProviders,
|
|
53
|
+
}))
|
|
54
|
+
.map((provider) => provider.id);
|
|
55
|
+
}
|
|
56
|
+
/** OpenCode's provider ids; none when its list can't be read. */
|
|
57
|
+
async function openCodeProviderIds(ctx) {
|
|
58
|
+
try {
|
|
59
|
+
return await ctx.resolveRuntimeProviderIds();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return new Set();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The custom definitions (rows `quota-providers.custom.<id>.*`) that serve `model`; without
|
|
67
|
+
* OpenCode's provider list none can be matched to a model.
|
|
68
|
+
*/
|
|
69
|
+
function customDefinitionIdsForModel(ctx, availableProviderIds, model) {
|
|
70
|
+
return selectEligibleQuotaProviderDefinitions({
|
|
71
|
+
definitions: ctx.config.quotaProviders ?? [],
|
|
72
|
+
availableProviderIds,
|
|
73
|
+
onlyCurrentModel: true,
|
|
74
|
+
currentModel: model.id,
|
|
75
|
+
currentProviderID: model.providerID,
|
|
76
|
+
}).map((definition) => definition.id);
|
|
77
|
+
}
|
|
78
|
+
/** The quota-providers aggregate needs the custom definitions OpenCode can serve right now. */
|
|
79
|
+
async function cacheContextFor(provider, ctx) {
|
|
80
|
+
if (provider.id !== QUOTA_PROVIDERS_AGGREGATE_ID)
|
|
81
|
+
return {};
|
|
82
|
+
return {
|
|
83
|
+
runtimeEligibleQuotaProviders: selectEligibleQuotaProviderDefinitions({
|
|
84
|
+
definitions: ctx.config.quotaProviders ?? [],
|
|
85
|
+
availableProviderIds: await ctx.resolveRuntimeProviderIds(),
|
|
86
|
+
}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** The signed-in account per the provider's cache policy; null when it can't be told safely. */
|
|
90
|
+
async function accountIdentity(provider, ctx, cacheContext) {
|
|
91
|
+
const policy = provider.cachePolicy;
|
|
92
|
+
if (!policy || policy.kind === "uncached")
|
|
93
|
+
return null;
|
|
94
|
+
if (policy.kind === "account-neutral")
|
|
95
|
+
return "account-neutral";
|
|
96
|
+
try {
|
|
97
|
+
return await policy.resolveIdentity(ctx, cacheContext);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Keys logins while the install's protected key can't be read; no account is saved then. */
|
|
104
|
+
const processLoginKey = randomBytes(32);
|
|
105
|
+
/**
|
|
106
|
+
* Each login (a source id: an account number, a credential id, often an email) as an opaque id
|
|
107
|
+
* keyed with the install's protected key, so the snapshot file and notice ids can't be matched
|
|
108
|
+
* against guessed emails. Without that key no account identity exists either, so the store
|
|
109
|
+
* keeps such rows in memory only, and a key of this process is enough.
|
|
110
|
+
*/
|
|
111
|
+
export async function keyedLogins(providerId, logins) {
|
|
112
|
+
return Promise.all(logins.map(async (login) => {
|
|
113
|
+
if (!login)
|
|
114
|
+
return "";
|
|
115
|
+
const keyed = await deriveResolvedAuthIdentity({
|
|
116
|
+
providerId,
|
|
117
|
+
principal: { kind: "stable-id", value: login },
|
|
118
|
+
qualifiers: ["v6-row-login"],
|
|
119
|
+
});
|
|
120
|
+
return (keyed ??
|
|
121
|
+
createHmac("sha256", processLoginKey)
|
|
122
|
+
.update(JSON.stringify([providerId, login]))
|
|
123
|
+
.digest("base64url"));
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
function storeProvider(provider, ctx, settingsKey) {
|
|
127
|
+
return {
|
|
128
|
+
id: provider.id,
|
|
129
|
+
label: getQuotaProviderDisplayLabel(provider.id),
|
|
130
|
+
// Cursor and Alibaba Coding Plan count OpenCode's own history: cheap, and stale at once.
|
|
131
|
+
...(isLiveLocalUsageProviderId(provider.id) ? { minIntervalMs: 0 } : {}),
|
|
132
|
+
async identity() {
|
|
133
|
+
const account = await accountIdentity(provider, ctx, await cacheContextFor(provider, ctx));
|
|
134
|
+
return account === null
|
|
135
|
+
? { key: settingsKey, persist: false }
|
|
136
|
+
: { key: `${account}\u001f${settingsKey}`, persist: true };
|
|
137
|
+
},
|
|
138
|
+
async fetch() {
|
|
139
|
+
const result = await provider.fetch(ctx, await cacheContextFor(provider, ctx));
|
|
140
|
+
const fetched = rowsFromProviderResult(provider.id, result);
|
|
141
|
+
const buildExportPart = (check) => exportProviderFromCheck({
|
|
142
|
+
...check,
|
|
143
|
+
providerId: provider.id,
|
|
144
|
+
label: getQuotaProviderDisplayLabel(provider.id),
|
|
145
|
+
customDefinitions: ctx.config.quotaProviders ?? [],
|
|
146
|
+
accounts: result.accounts,
|
|
147
|
+
});
|
|
148
|
+
if (!fetched.rowLogins)
|
|
149
|
+
return { ...fetched, buildExportPart };
|
|
150
|
+
return {
|
|
151
|
+
...fetched,
|
|
152
|
+
rowLogins: await keyedLogins(provider.id, fetched.rowLogins),
|
|
153
|
+
buildExportPart,
|
|
154
|
+
};
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** The store's source: the enabled and available providers, with the settings now. */
|
|
159
|
+
export async function loadProviderSource(host) {
|
|
160
|
+
const loaded = host.settings();
|
|
161
|
+
const ctx = providerContext(host, loaded);
|
|
162
|
+
const { enabledProviders } = ctx.config;
|
|
163
|
+
const enabled = getProviders().filter((provider) => enabledProviders === "auto" || enabledProviders.includes(provider.id));
|
|
164
|
+
const available = await Promise.all(enabled.map(async (provider) => {
|
|
165
|
+
try {
|
|
166
|
+
return await provider.isAvailable(ctx);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}));
|
|
172
|
+
// A settings change that alters what a provider reports also changes its identity.
|
|
173
|
+
const { config } = ctx;
|
|
174
|
+
const settingsKey = JSON.stringify([
|
|
175
|
+
config.anthropicBinaryPath ?? null,
|
|
176
|
+
config.cursorPlan,
|
|
177
|
+
config.cursorIncludedApiUsd ?? null,
|
|
178
|
+
config.cursorBillingCycleStartDay ?? null,
|
|
179
|
+
config.opencodeMonthlyLimit ?? null,
|
|
180
|
+
config.quotaProviders ?? [],
|
|
181
|
+
]);
|
|
182
|
+
const availableProviderIds = config.quotaProviders?.length
|
|
183
|
+
? await openCodeProviderIds(ctx)
|
|
184
|
+
: new Set();
|
|
185
|
+
return {
|
|
186
|
+
providers: enabled
|
|
187
|
+
.filter((_, index) => available[index])
|
|
188
|
+
.map((provider) => storeProvider(provider, ctx, settingsKey)),
|
|
189
|
+
minIntervalMs: loaded.settings.providers.checking.minIntervalMs,
|
|
190
|
+
providerIdsForModel: (model) => providerIdsForModel(ctx, model),
|
|
191
|
+
// A custom definition's rows serve only the models the definition serves.
|
|
192
|
+
rowPrefixesForModel: (model) => ({
|
|
193
|
+
[QUOTA_PROVIDERS_AGGREGATE_ID]: customDefinitionIdsForModel(ctx, availableProviderIds, model).map((id) => `${QUOTA_PROVIDERS_AGGREGATE_ID}.custom.${id}.`),
|
|
194
|
+
}),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
export async function loadServerSettings(host) {
|
|
198
|
+
const loaded = host.settings();
|
|
199
|
+
const { settings } = loaded;
|
|
200
|
+
const ctx = providerContext(host, loaded);
|
|
201
|
+
const availableProviderIds = await openCodeProviderIds(ctx);
|
|
202
|
+
return {
|
|
203
|
+
waitForQuotaReset: settings.providers.checking.waitForQuotaReset,
|
|
204
|
+
providerIdsForModel: (model) => providerIdsForModel(ctx, model),
|
|
205
|
+
customDefinitionIdsForModel: (model) => customDefinitionIdsForModel(ctx, availableProviderIds, model),
|
|
206
|
+
export: { enabled: settings.system.exportFile, path: settings.system.exportPath },
|
|
207
|
+
telemetry: settings.system.telemetry,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=provider-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-source.js","sourceRoot":"","sources":["../../src/core/provider-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** One safe line: control characters removed, credentials redacted, then cut to `maxLength`. */
|
|
2
|
+
export declare function safeDetail(text: string, maxLength: number): string;
|
|
3
|
+
/**
|
|
4
|
+
* A debug detail's value made safe: fully redacted when its key holds a secret; any other
|
|
5
|
+
* value still has the secrets inside it redacted.
|
|
6
|
+
*/
|
|
7
|
+
export declare function safeDebugValue(key: string, value: string, maxLength: number): string;
|
|
8
|
+
/**
|
|
9
|
+
* Text a public issue may show: control characters removed first, then the home dir as "~"
|
|
10
|
+
* (found before spaces are joined), then one line with credentials as "[redacted]", email
|
|
11
|
+
* addresses as "[email]", and account, team, org, user and session ids as "[id]". It is cut to
|
|
12
|
+
* `maxLength` last, so a cut never leaves part of a hidden value.
|
|
13
|
+
*/
|
|
14
|
+
export declare function publicDetail(text: string, maxLength: number, homeDir?: string): string;
|
|
15
|
+
/** A detail's value as `publicDetail` shows it; all hidden when its key holds a secret or an id. */
|
|
16
|
+
export declare function publicDebugValue(key: string, value: string, maxLength: number, homeDir?: string): string;
|
|
17
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/core/redact.ts"],"names":[],"mappings":"AA4KA,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElE;AAYD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpF;AA2BD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,SAAY,GAAG,MAAM,CAMzF;AAED,oGAAoG;AACpG,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,SAAY,GAClB,MAAM,CAIR"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential redaction for any provider text the store keeps or sends: error details, debug
|
|
3
|
+
* details and logs. Provider errors can echo a request (an Authorization header, a key in the
|
|
4
|
+
* query string, a token in a JSON body), so every such text passes here before it is cut to
|
|
5
|
+
* length, saved or shown. `publicDetail` also hides the home dir, email addresses and account
|
|
6
|
+
* ids, for the error and debug details the store keeps. /quota_status shows only structured
|
|
7
|
+
* values and passes them through `publicDetail` as a second filter.
|
|
8
|
+
*/
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { sanitizeDisplayText, sanitizeSingleLineDisplayText } from "../lib/display-sanitize.js";
|
|
11
|
+
import { replaceHomeDirWithTilde } from "../lib/home-dir-display.js";
|
|
12
|
+
const REDACTED = "[redacted]";
|
|
13
|
+
const PRIVATE_ID = "[id]";
|
|
14
|
+
const EMAIL_ADDRESS = "[email]";
|
|
15
|
+
/** Words that make a field name secret wherever they stand in it: "session_id", "x-api-key". */
|
|
16
|
+
const SECRET_WORDS = new Set([
|
|
17
|
+
"token",
|
|
18
|
+
"key",
|
|
19
|
+
"apikey",
|
|
20
|
+
"secret",
|
|
21
|
+
"password",
|
|
22
|
+
"passwd",
|
|
23
|
+
"pwd",
|
|
24
|
+
"cookie",
|
|
25
|
+
"cookies",
|
|
26
|
+
"session",
|
|
27
|
+
"sessionid",
|
|
28
|
+
"authorization",
|
|
29
|
+
"credential",
|
|
30
|
+
"credentials",
|
|
31
|
+
"signature",
|
|
32
|
+
"sig",
|
|
33
|
+
"jwt",
|
|
34
|
+
"bearer",
|
|
35
|
+
]);
|
|
36
|
+
/** Last words of a debug key that make it a fact about a secret: "api_key_source". */
|
|
37
|
+
const FACT_WORDS = new Set([
|
|
38
|
+
"source",
|
|
39
|
+
"env",
|
|
40
|
+
"present",
|
|
41
|
+
"configured",
|
|
42
|
+
"set",
|
|
43
|
+
"kind",
|
|
44
|
+
"type",
|
|
45
|
+
"status",
|
|
46
|
+
"expires",
|
|
47
|
+
"expiry",
|
|
48
|
+
"age",
|
|
49
|
+
"state",
|
|
50
|
+
"path",
|
|
51
|
+
"paths",
|
|
52
|
+
"file",
|
|
53
|
+
"name",
|
|
54
|
+
"count",
|
|
55
|
+
"diagnostics",
|
|
56
|
+
]);
|
|
57
|
+
/** A field name's words, split on anything but letters and digits and on camelCase. */
|
|
58
|
+
function nameWords(name) {
|
|
59
|
+
return name
|
|
60
|
+
.replace(/([a-z0-9])([A-Z])/gu, "$1 $2")
|
|
61
|
+
.replace(/([A-Z]+)([A-Z][a-z])/gu, "$1 $2")
|
|
62
|
+
.toLowerCase()
|
|
63
|
+
.split(/[^a-z0-9]+/u)
|
|
64
|
+
.filter(Boolean);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* True when a word of a field name is a secret word: "access_token", "apiKey", "XSRFToken",
|
|
68
|
+
* "Set-Cookie", "session_id".
|
|
69
|
+
*/
|
|
70
|
+
function namesSecret(name) {
|
|
71
|
+
return nameWords(name).some((word) => SECRET_WORDS.has(word));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A field value: a JSON array (a "]" inside its strings included), quoted to its closing quote
|
|
75
|
+
* (escaped quotes and spaces included; also with escaped quotes around it, as in JSON inside
|
|
76
|
+
* JSON), or one unquoted word.
|
|
77
|
+
*/
|
|
78
|
+
const VALUE = String.raw `(?:\[(?:"(?:[^"\\]|\\.)*"?|'(?:[^'\\]|\\.)*'?|[^\]"'])*\]?|\\"(?:[^\\]|\\(?!"))*(?:\\")?|"(?:[^"\\]|\\.)*"?|'(?:[^'\\]|\\.)*'?|[^\s"'&,;}]+)`;
|
|
79
|
+
/** Between a name and its value: `=`, `: `, JSON's `":` and escaped JSON's `\":`. */
|
|
80
|
+
const SEPARATOR = String.raw `(\\?["']?\s*[:=]\s*)`;
|
|
81
|
+
/** `name: value`, `name=value`, `"name":"value"` (also `\"name\":\"value\"`). */
|
|
82
|
+
const NAMED_VALUE = String.raw `\b([A-Za-z_][\w-]{0,63})${SEPARATOR}${VALUE}`;
|
|
83
|
+
/** The value of every pair whose name holds a secret; other values are searched as well. */
|
|
84
|
+
function redactNamedValues(text) {
|
|
85
|
+
const pattern = new RegExp(NAMED_VALUE, "gu");
|
|
86
|
+
let result = "";
|
|
87
|
+
let copied = 0;
|
|
88
|
+
for (let match = pattern.exec(text); match; match = pattern.exec(text)) {
|
|
89
|
+
const [whole, name = "", separator = ""] = match;
|
|
90
|
+
const valueAt = match.index + name.length + separator.length;
|
|
91
|
+
if (holdsSecret(name)) {
|
|
92
|
+
result += `${text.slice(copied, valueAt)}${REDACTED}`;
|
|
93
|
+
copied = match.index + whole.length;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// The value may hold pairs of its own: {"error":"bad api_key=abc"}.
|
|
97
|
+
pattern.lastIndex = valueAt;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return result + text.slice(copied);
|
|
101
|
+
}
|
|
102
|
+
/** Checked in order, before named values; each replaces what it matches. */
|
|
103
|
+
const SECRET_PATTERNS = [
|
|
104
|
+
// Cookie, Set-Cookie and Authorization headers: the whole value, to the end of the line or
|
|
105
|
+
// the next " | " joiner. The JSON forms ("cookie": "a=1") are named values.
|
|
106
|
+
[
|
|
107
|
+
/\b((?:set-)?cookie|(?:proxy-)?authorization)(\s*[:=]\s*)(?:(?! \| )[^\r\n])*/giu,
|
|
108
|
+
`$1$2${REDACTED}`,
|
|
109
|
+
],
|
|
110
|
+
// Bearer abc, Basic abc (outside a header too)
|
|
111
|
+
[/\b(bearer|basic)\s+[A-Za-z0-9._~+/=-]{6,}/giu, `$1 ${REDACTED}`],
|
|
112
|
+
];
|
|
113
|
+
/** Well-known key shapes and JWT-shaped strings; after named values. */
|
|
114
|
+
const SHAPE_PATTERNS = [
|
|
115
|
+
/\b(?:sk|pk|rk)[-_][A-Za-z0-9_-]{8,}/gu,
|
|
116
|
+
/\b(?:gh[pousr]_|github_pat_)[A-Za-z0-9_]{10,}/gu,
|
|
117
|
+
/\bAIza[0-9A-Za-z_-]{20,}/gu,
|
|
118
|
+
/\bxai-[A-Za-z0-9]{10,}/gu,
|
|
119
|
+
/eyJ[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]+)*/gu,
|
|
120
|
+
];
|
|
121
|
+
/**
|
|
122
|
+
* One part of a name or model id: a word, also capitalised, camel-cased or with a number after
|
|
123
|
+
* it ("Coder", "DeepSeek", "Qwen3", "FP8"), a number, or up to 4 letters and digits ("A35B").
|
|
124
|
+
*/
|
|
125
|
+
const NAME_PART = /^(?:[a-z]{1,20}|[A-Z]{1,20}\d{0,4}|(?:[A-Z]{1,6}|[A-Z]?[a-z]{2,20}){1,3}\d{0,4}|\d{1,14}|[A-Za-z0-9]{1,4})$/u;
|
|
126
|
+
/**
|
|
127
|
+
* A long run of letters, digits, `_` and `-` is a token or session id, unless it is words and
|
|
128
|
+
* numbers joined by separators: a model id ("Qwen3-Coder-480B-A35B-Instruct-FP8") or a name
|
|
129
|
+
* ("custom_production-gateway-us_check").
|
|
130
|
+
*/
|
|
131
|
+
function hideOpaqueRun(run) {
|
|
132
|
+
const parts = run.split(/[-_]+/u).filter(Boolean);
|
|
133
|
+
const wordsOnly = parts.length >= 2 && parts.every((part) => NAME_PART.test(part));
|
|
134
|
+
return wordsOnly ? run : REDACTED;
|
|
135
|
+
}
|
|
136
|
+
/** `text` with credential-looking parts replaced by "[redacted]". */
|
|
137
|
+
function redactSecrets(text) {
|
|
138
|
+
let result = text;
|
|
139
|
+
for (const [pattern, replacement] of SECRET_PATTERNS) {
|
|
140
|
+
result = result.replace(pattern, replacement);
|
|
141
|
+
}
|
|
142
|
+
result = redactNamedValues(result);
|
|
143
|
+
for (const pattern of SHAPE_PATTERNS)
|
|
144
|
+
result = result.replace(pattern, REDACTED);
|
|
145
|
+
return result.replace(/[A-Za-z0-9_-]{32,}/gu, hideOpaqueRun);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* The text as a screen shows it, before any pattern looks at it: JSON's `\u0049` escapes
|
|
149
|
+
* decoded and control characters removed (an escape inside a name or home dir would hide it
|
|
150
|
+
* from the patterns). Line breaks stay.
|
|
151
|
+
*/
|
|
152
|
+
function visibleText(text) {
|
|
153
|
+
const decoded = text.replace(/(?<!\\)\\u([0-9A-Fa-f]{4})/gu, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
|
|
154
|
+
return sanitizeDisplayText(decoded);
|
|
155
|
+
}
|
|
156
|
+
/** One safe line: control characters removed, credentials redacted, then cut to `maxLength`. */
|
|
157
|
+
export function safeDetail(text, maxLength) {
|
|
158
|
+
return redactSecrets(sanitizeSingleLineDisplayText(visibleText(text))).slice(0, maxLength);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* True when a debug key's value is a secret: the key names one, and its last word does not
|
|
162
|
+
* name a fact about it ("api_key_source", "token_expires_at", "apiKeyEnv").
|
|
163
|
+
*/
|
|
164
|
+
function holdsSecret(key) {
|
|
165
|
+
const words = nameWords(key);
|
|
166
|
+
const last = words.at(-1) === "at" ? words.at(-2) : words.at(-1);
|
|
167
|
+
return namesSecret(key) && !FACT_WORDS.has(last ?? "");
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* A debug detail's value made safe: fully redacted when its key holds a secret; any other
|
|
171
|
+
* value still has the secrets inside it redacted.
|
|
172
|
+
*/
|
|
173
|
+
export function safeDebugValue(key, value, maxLength) {
|
|
174
|
+
return holdsSecret(key) ? REDACTED : safeDetail(value, maxLength);
|
|
175
|
+
}
|
|
176
|
+
/** Whose data a field is about: a "<word> id" field holds a private identity. */
|
|
177
|
+
const PRIVATE_ID_WORDS = ["account", "team", "org", "organization", "user", "session"];
|
|
178
|
+
/** Checked in order; each replaces what it matches. */
|
|
179
|
+
const PRIVATE_ID_PATTERNS = [
|
|
180
|
+
// account_id=abc, "teamId": "t_1", "user_ids": ["a", "b"], \"org_id\":\"o_1\"
|
|
181
|
+
[
|
|
182
|
+
new RegExp(`\\b((?:[A-Za-z0-9]+[_-])*(?:${PRIVATE_ID_WORDS.join("|")})[_-]?ids?)${SEPARATOR}${VALUE}`, "giu"),
|
|
183
|
+
`$1$2${PRIVATE_ID}`,
|
|
184
|
+
],
|
|
185
|
+
// alice@example.com, alice%40example.com
|
|
186
|
+
[/[\w.%+-]+(?:@|%40)[\w-]+(?:\.[\w-]+)*\.[A-Za-z]{2,}\b/giu, EMAIL_ADDRESS],
|
|
187
|
+
];
|
|
188
|
+
/** True when a field name ends in an account, team, org, user or session id: "teamId". */
|
|
189
|
+
function namesPrivateId(name) {
|
|
190
|
+
const words = nameWords(name);
|
|
191
|
+
const last = words.at(-1) ?? "";
|
|
192
|
+
if (last === "id" || last === "ids")
|
|
193
|
+
return PRIVATE_ID_WORDS.includes(words.at(-2) ?? "");
|
|
194
|
+
return PRIVATE_ID_WORDS.some((word) => last === `${word}id` || last === `${word}ids`);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Text a public issue may show: control characters removed first, then the home dir as "~"
|
|
198
|
+
* (found before spaces are joined), then one line with credentials as "[redacted]", email
|
|
199
|
+
* addresses as "[email]", and account, team, org, user and session ids as "[id]". It is cut to
|
|
200
|
+
* `maxLength` last, so a cut never leaves part of a hidden value.
|
|
201
|
+
*/
|
|
202
|
+
export function publicDetail(text, maxLength, homeDir = homedir()) {
|
|
203
|
+
let result = sanitizeSingleLineDisplayText(replaceHomeDirWithTilde(visibleText(text), homeDir));
|
|
204
|
+
for (const [pattern, replacement] of PRIVATE_ID_PATTERNS) {
|
|
205
|
+
result = result.replace(pattern, replacement);
|
|
206
|
+
}
|
|
207
|
+
return redactSecrets(result).slice(0, maxLength);
|
|
208
|
+
}
|
|
209
|
+
/** A detail's value as `publicDetail` shows it; all hidden when its key holds a secret or an id. */
|
|
210
|
+
export function publicDebugValue(key, value, maxLength, homeDir = homedir()) {
|
|
211
|
+
if (namesPrivateId(key))
|
|
212
|
+
return PRIVATE_ID;
|
|
213
|
+
if (holdsSecret(key))
|
|
214
|
+
return REDACTED;
|
|
215
|
+
return publicDetail(value, maxLength, homeDir);
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/core/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider results as v6 rows. Every provider returns the row contract (`ProviderFetchResult`,
|
|
3
|
+
* see `providers/contract.ts`); each row gets its id (`${providerId}.${key}`), its provider and
|
|
4
|
+
* its account's account text.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProviderFetchResult } from "../providers/contract.js";
|
|
7
|
+
import type { ProviderFetch } from "./store.js";
|
|
8
|
+
/**
|
|
9
|
+
* The account or plan in a legacy group: "OpenAI (Pro)" → "Pro", "[Claude Work] (active)" →
|
|
10
|
+
* "Work", "[OpenAI Work] (Business)" → "Work (Business)". "(active)" is dropped: it moves
|
|
11
|
+
* when the user switches logins, and the account must stay the same.
|
|
12
|
+
*/
|
|
13
|
+
export declare function accountFromGroup(providerId: string, group: string | undefined): string | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* A provider result as v6 rows, the error to show and the debug details. Each row is checked on
|
|
16
|
+
* its own, so it keeps its login. `rowLogins` holds the logins as the provider gave them; the
|
|
17
|
+
* provider source keys them before the store gets them.
|
|
18
|
+
*/
|
|
19
|
+
export declare function rowsFromProviderResult(providerId: string, result: ProviderFetchResult, nowMs?: number): ProviderFetch;
|
|
20
|
+
//# sourceMappingURL=rows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../src/core/rows.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAmDhD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,GAAG,SAAS,CASpB;AAkCD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,GAAE,MAAmB,GACzB,aAAa,CA0Cf"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider results as v6 rows. Every provider returns the row contract (`ProviderFetchResult`,
|
|
3
|
+
* see `providers/contract.ts`); each row gets its id (`${providerId}.${key}`), its provider and
|
|
4
|
+
* its account's account text.
|
|
5
|
+
*/
|
|
6
|
+
import { sanitizeSingleLineDisplaySnippet } from "../lib/display-sanitize.js";
|
|
7
|
+
import { QUOTA_PROVIDERS_AGGREGATE_ID } from "../lib/quota-providers.js";
|
|
8
|
+
import { classifyError, errorKind } from "./errors.js";
|
|
9
|
+
import { publicDebugValue } from "./redact.js";
|
|
10
|
+
import { validateRows } from "./validate.js";
|
|
11
|
+
const DEBUG_VALUE_MAX_LENGTH = 300;
|
|
12
|
+
/** Brand words at the start of a provider's groups; what follows names the account or plan. */
|
|
13
|
+
const GROUP_BRANDS = {
|
|
14
|
+
anthropic: ["Claude"],
|
|
15
|
+
copilot: ["Copilot"],
|
|
16
|
+
openai: ["OpenAI"],
|
|
17
|
+
openrouter: ["OpenRouter"],
|
|
18
|
+
kilo: ["Kilo Gateway"],
|
|
19
|
+
cursor: ["Cursor"],
|
|
20
|
+
"alibaba-coding-plan": ["Alibaba Coding Plan"],
|
|
21
|
+
"alibaba-token-plan": ["Alibaba Personal Token Plan"],
|
|
22
|
+
synthetic: ["Synthetic"],
|
|
23
|
+
chutes: ["Chutes"],
|
|
24
|
+
"google-gemini-cli": ["Gemini CLI"],
|
|
25
|
+
"google-agy": ["Google AGY", "AGY"],
|
|
26
|
+
zai: ["Z.ai"],
|
|
27
|
+
zhipu: ["Zhipu"],
|
|
28
|
+
nanogpt: ["NanoGPT"],
|
|
29
|
+
"minimax-coding-plan": ["MiniMax Token Plan"],
|
|
30
|
+
"minimax-china-coding-plan": ["MiniMax Token Plan (CN)", "MiniMax Token Plan"],
|
|
31
|
+
"kimi-code-plan-global": ["Kimi Code"],
|
|
32
|
+
"kimi-code-plan-cn": ["Kimi Code (CN)", "Kimi Code"],
|
|
33
|
+
deepseek: ["DeepSeek"],
|
|
34
|
+
xai: ["xAI"],
|
|
35
|
+
xiaomi: ["Xiaomi MiMo"],
|
|
36
|
+
"opencode-go": ["OpenCode Go"],
|
|
37
|
+
opencode: ["OpenCode Zen"],
|
|
38
|
+
"ollama-cloud": ["Ollama Cloud"],
|
|
39
|
+
};
|
|
40
|
+
/** "(Pro)" → "Pro", ": Standard [code]" → "Standard". */
|
|
41
|
+
function unwrap(text) {
|
|
42
|
+
let result = text.trim().replace(/^:\s*/u, "");
|
|
43
|
+
const parens = /^\((.*)\)$/u.exec(result);
|
|
44
|
+
if (parens)
|
|
45
|
+
result = parens[1] ?? "";
|
|
46
|
+
const withoutCode = result.replace(/\s*\[[^\]]*\]$/u, "").trim();
|
|
47
|
+
return withoutCode || result.trim();
|
|
48
|
+
}
|
|
49
|
+
function stripBrand(providerId, text) {
|
|
50
|
+
const brand = (GROUP_BRANDS[providerId] ?? []).find((name) => text === name || text.startsWith(`${name} `) || text.startsWith(`${name}:`));
|
|
51
|
+
return brand ? text.slice(brand.length) : text;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The account or plan in a legacy group: "OpenAI (Pro)" → "Pro", "[Claude Work] (active)" →
|
|
55
|
+
* "Work", "[OpenAI Work] (Business)" → "Work (Business)". "(active)" is dropped: it moves
|
|
56
|
+
* when the user switches logins, and the account must stay the same.
|
|
57
|
+
*/
|
|
58
|
+
export function accountFromGroup(providerId, group) {
|
|
59
|
+
if (!group)
|
|
60
|
+
return undefined;
|
|
61
|
+
const text = group.replace(/\s*\(active\)/gu, "").trim();
|
|
62
|
+
if (providerId === QUOTA_PROVIDERS_AGGREGATE_ID)
|
|
63
|
+
return text || undefined;
|
|
64
|
+
const bracket = /^\[([^\]]*)\]\s*(.*)$/u.exec(text);
|
|
65
|
+
const alias = unwrap(stripBrand(providerId, bracket ? (bracket[1] ?? "") : text));
|
|
66
|
+
const category = bracket ? (bracket[2] ?? "").trim() : "";
|
|
67
|
+
const account = alias && category ? `${alias} ${category}` : alias || unwrap(category);
|
|
68
|
+
return account || undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Drops a row repeated for one login (same id and account). Logins that share an account text
|
|
72
|
+
* keep it here; the store tells them apart, as it also sees logins that failed this time.
|
|
73
|
+
*/
|
|
74
|
+
function dropRepeatedRows(candidates, debug) {
|
|
75
|
+
const seen = new Set();
|
|
76
|
+
return candidates.filter(({ row, login }) => {
|
|
77
|
+
const slot = `${String(row.id)}\u001f${String(row.account ?? "")}\u001f${login}`;
|
|
78
|
+
if (!seen.has(slot)) {
|
|
79
|
+
seen.add(slot);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
debug.push({ key: "dropped_row", value: `${String(row.id)}: repeated row` });
|
|
83
|
+
return false;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Debug details are kept for /quota_status, as a public issue may show them (see
|
|
88
|
+
* `publicDetail`): hidden before they are cut, so a cut never leaves part of a hidden value.
|
|
89
|
+
* A key is a name the adapter or this file chose, so it is only cleaned and shortened.
|
|
90
|
+
*/
|
|
91
|
+
function detail(key, value) {
|
|
92
|
+
return {
|
|
93
|
+
key: sanitizeSingleLineDisplaySnippet(key, 64),
|
|
94
|
+
value: publicDebugValue(key, value, DEBUG_VALUE_MAX_LENGTH),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A provider result as v6 rows, the error to show and the debug details. Each row is checked on
|
|
99
|
+
* its own, so it keeps its login. `rowLogins` holds the logins as the provider gave them; the
|
|
100
|
+
* provider source keys them before the store gets them.
|
|
101
|
+
*/
|
|
102
|
+
export function rowsFromProviderResult(providerId, result, nowMs = Date.now()) {
|
|
103
|
+
const debug = result.debug.map((item) => detail(item.key, item.value));
|
|
104
|
+
const candidates = result.accounts.flatMap((account) => {
|
|
105
|
+
const accountText = accountFromGroup(providerId, account.name);
|
|
106
|
+
return account.rows.map(({ key, ...fields }) => ({
|
|
107
|
+
row: {
|
|
108
|
+
...fields,
|
|
109
|
+
id: `${providerId}.${key}`,
|
|
110
|
+
providerId,
|
|
111
|
+
...(accountText ? { account: accountText } : {}),
|
|
112
|
+
},
|
|
113
|
+
login: account.login ?? "",
|
|
114
|
+
}));
|
|
115
|
+
});
|
|
116
|
+
const rows = [];
|
|
117
|
+
const rowLogins = [];
|
|
118
|
+
for (const { row, login } of dropRepeatedRows(candidates, debug)) {
|
|
119
|
+
const checked = validateRows(providerId, [row]);
|
|
120
|
+
debug.push(...checked.dropped);
|
|
121
|
+
for (const clean of checked.rows) {
|
|
122
|
+
rows.push(clean);
|
|
123
|
+
rowLogins.push(login);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const logins = rowLogins.some(Boolean) ? { rowLogins } : {};
|
|
127
|
+
const errors = result.accounts.flatMap((account) => account.errors.map((error) => ({ account: account.name, message: error.message })));
|
|
128
|
+
for (const error of errors) {
|
|
129
|
+
debug.push(detail("error", `${error.account}: ${error.message}`));
|
|
130
|
+
// Read from the message alone, so a number or word in the account name is never its kind.
|
|
131
|
+
debug.push(detail("error_kind", errorKind(classifyError(error.message, nowMs))));
|
|
132
|
+
}
|
|
133
|
+
const [firstError] = errors;
|
|
134
|
+
if (firstError) {
|
|
135
|
+
return { rows, ...logins, error: classifyError(firstError.message, nowMs), debug };
|
|
136
|
+
}
|
|
137
|
+
if (!result.attempted && rows.length === 0) {
|
|
138
|
+
return { rows: [], error: { code: "not_configured" }, debug };
|
|
139
|
+
}
|
|
140
|
+
return { rows, ...logins, debug };
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=rows.js.map
|