@slkiser/opencode-quota 5.0.3 → 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 +30 -44
- 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/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 +33 -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 -560
- 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 -6
- package/dist/lib/ollama-cloud.d.ts.map +1 -1
- package/dist/lib/ollama-cloud.js +26 -37
- package/dist/lib/ollama-cloud.js.map +1 -1
- package/dist/lib/openai.d.ts +18 -29
- package/dist/lib/openai.d.ts.map +1 -1
- package/dist/lib/openai.js +108 -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 +15 -12
- package/dist/lib/opencode-zen.d.ts.map +1 -1
- package/dist/lib/opencode-zen.js +139 -147
- 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 -773
- 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 +25 -333
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +2 -70
- 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 +38 -88
- 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 +0 -1
- package/dist/providers/google-agy.d.ts.map +1 -1
- package/dist/providers/google-agy.js +41 -192
- 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 -6
- package/dist/providers/ollama-cloud.d.ts.map +1 -1
- package/dist/providers/ollama-cloud.js +86 -112
- package/dist/providers/ollama-cloud.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +144 -166
- 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 +100 -150
- 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 -1092
- 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 -21
- package/dist/lib/quota-surface-data.d.ts.map +0 -1
- package/dist/lib/quota-surface-data.js +0 -362
- 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,642 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The lines of every quota surface, built from the visible groups (`select.ts`). The TUI
|
|
3
|
+
* draws each segment in its color role; the Web and terminal `/quota` text print the plain
|
|
4
|
+
* text.
|
|
5
|
+
*/
|
|
6
|
+
import { describeError } from "../core/errors.js";
|
|
7
|
+
import { paceOf, paceText } from "../core/pace.js";
|
|
8
|
+
import { WINDOWS } from "../core/windows.js";
|
|
9
|
+
import { columnsOf } from "./columns.js";
|
|
10
|
+
import { barParts, cacheHit, evenUseCell, fit, LOW_CACHE_MARK, percentText, percentWord, resetText, rowValueText, sessionTokensText, } from "./format.js";
|
|
11
|
+
import { pickRow, windowFor } from "./select.js";
|
|
12
|
+
export function lineText(line) {
|
|
13
|
+
return line.segments.map((segment) => segment.text).join("");
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The start of a row without a bar: its name, cut to `most` columns, then spaces up to the bar
|
|
17
|
+
* column, or 2 after a name that reaches it.
|
|
18
|
+
*/
|
|
19
|
+
function valueRowStart(indent, name, most, barColumn) {
|
|
20
|
+
const text = `${" ".repeat(indent)}${columnsOf(name) > most ? fit(name, most) : name}`;
|
|
21
|
+
const gap = barColumn - columnsOf(text);
|
|
22
|
+
return `${text}${" ".repeat(gap >= 1 ? gap : 2)}`;
|
|
23
|
+
}
|
|
24
|
+
/** Where even use would be, the ┃ mark in a bar. */
|
|
25
|
+
const EVEN_USE_MARK = "┃";
|
|
26
|
+
/** A bar's cells at the least for the even-use mark; a shorter bar has none. */
|
|
27
|
+
const EVEN_USE_MIN_CELLS = 3;
|
|
28
|
+
/**
|
|
29
|
+
* A bar in two parts: the part left in its level color, then the used part. With `evenLeft`, the
|
|
30
|
+
* percent even use would leave now (`core/pace.ts`), the ┃ mark takes the place of the cell where
|
|
31
|
+
* even use would be, in the row labels' color; a bar under 3 cells gets no mark.
|
|
32
|
+
*/
|
|
33
|
+
export function barSegments(shape, percent, width, evenLeft) {
|
|
34
|
+
const [filled, empty] = barParts(shape, percent, width);
|
|
35
|
+
const bar = [
|
|
36
|
+
{ text: filled, role: "bar", percent },
|
|
37
|
+
{ text: empty, role: "empty", percent },
|
|
38
|
+
];
|
|
39
|
+
if (evenLeft === undefined || shape === "none" || width < EVEN_USE_MIN_CELLS)
|
|
40
|
+
return bar;
|
|
41
|
+
const mark = evenUseCell(evenLeft, width);
|
|
42
|
+
const marked = [];
|
|
43
|
+
let start = 0;
|
|
44
|
+
for (const segment of bar) {
|
|
45
|
+
const cells = [...segment.text];
|
|
46
|
+
const at = mark - start;
|
|
47
|
+
start += cells.length;
|
|
48
|
+
if (at < 0 || at >= cells.length) {
|
|
49
|
+
marked.push(segment);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
marked.push({ ...segment, text: cells.slice(0, at).join("") }, { text: EVEN_USE_MARK, role: "label" }, { ...segment, text: cells.slice(at + 1).join("") });
|
|
53
|
+
}
|
|
54
|
+
return marked.filter((segment) => segment.text !== "");
|
|
55
|
+
}
|
|
56
|
+
/** Where even use would be for a row's bar, when the place draws the mark and the row has a pace. */
|
|
57
|
+
function evenLeftOf(on, row, nowMs) {
|
|
58
|
+
return on ? paceOf(row, nowMs)?.evenLeft : undefined;
|
|
59
|
+
}
|
|
60
|
+
/** The words for a group's last error ("Sign in again"); undefined when its last check worked. */
|
|
61
|
+
function errorWords(group, nowMs) {
|
|
62
|
+
return group.error
|
|
63
|
+
? { text: describeError(group.error, group.name, nowMs), role: "error" }
|
|
64
|
+
: undefined;
|
|
65
|
+
}
|
|
66
|
+
/** The words after a group's title: its error, or "not checked yet" before the first check. */
|
|
67
|
+
function groupState(group, nowMs) {
|
|
68
|
+
if (group.error)
|
|
69
|
+
return errorWords(group, nowMs);
|
|
70
|
+
if (group.unchecked)
|
|
71
|
+
return { text: "not checked yet", role: "value" };
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* "runs out in 1h 5m" when the surface shows it (`on`) and the row, used at its pace so far,
|
|
76
|
+
* runs out before it resets.
|
|
77
|
+
*/
|
|
78
|
+
function runsOutText(on, row, nowMs, words) {
|
|
79
|
+
const pace = on ? paceOf(row, nowMs) : undefined;
|
|
80
|
+
return pace?.runsOutInMs === undefined ? undefined : paceText(pace, words);
|
|
81
|
+
}
|
|
82
|
+
/** Marks rows kept from an earlier check when there is no room for the error's words. */
|
|
83
|
+
const ERROR_MARK = "⚠";
|
|
84
|
+
/** Cuts the segments so their text fits in `width` terminal columns. */
|
|
85
|
+
function cut(segments, width) {
|
|
86
|
+
const clipped = [];
|
|
87
|
+
let room = width;
|
|
88
|
+
for (const segment of segments) {
|
|
89
|
+
if (room <= 0)
|
|
90
|
+
break;
|
|
91
|
+
const text = columnsOf(segment.text) > room ? fit(segment.text, room) : segment.text;
|
|
92
|
+
clipped.push({ ...segment, text });
|
|
93
|
+
room -= columnsOf(text);
|
|
94
|
+
}
|
|
95
|
+
return clipped;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Cuts the segments so their text fits in `width` terminal columns. An error never goes
|
|
99
|
+
* away: when not even the start of its words fits, the line ends in " ⚠" instead.
|
|
100
|
+
*/
|
|
101
|
+
function clip(segments, width) {
|
|
102
|
+
const clipped = cut(segments, width);
|
|
103
|
+
const error = segments.find((segment) => segment.role === "error");
|
|
104
|
+
if (!error)
|
|
105
|
+
return clipped;
|
|
106
|
+
const kept = clipped.find((segment) => segment.role === "error");
|
|
107
|
+
const mark = ` ${ERROR_MARK}`;
|
|
108
|
+
if ((kept && /[\p{L}\p{N}]|⚠/u.test(kept.text)) || width < columnsOf(mark))
|
|
109
|
+
return clipped;
|
|
110
|
+
const rest = segments.filter((segment) => segment !== error);
|
|
111
|
+
return [...cut(rest, width - columnsOf(mark)), { ...error, text: mark }];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* A row's name on the sidebar, the collapsed panel, the status line and a toast: your name for
|
|
115
|
+
* it; else, with `words.rowNames` "short", its window's short name ("5h", "7d") when no other
|
|
116
|
+
* row of its group has the same one; else its label.
|
|
117
|
+
*/
|
|
118
|
+
export function rowName(item, group, words) {
|
|
119
|
+
if (words.rowNames === "full" || item.named || !item.row.window) {
|
|
120
|
+
return item.label;
|
|
121
|
+
}
|
|
122
|
+
const short = WINDOWS[item.row.window].short;
|
|
123
|
+
const shared = group.rows.some((other) => other !== item && other.row.window && WINDOWS[other.row.window].short === short);
|
|
124
|
+
return shared ? item.label : short;
|
|
125
|
+
}
|
|
126
|
+
/** §4.1: the expanded panel's title, with the percent's word its rows leave out: "▼ Quota left". */
|
|
127
|
+
export function sidebarTitle(words) {
|
|
128
|
+
const word = percentWord(words);
|
|
129
|
+
return word ? `▼ Quota ${word}` : "▼ Quota";
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A group's title line: the provider's name in bold and its account, then (`withState`) its
|
|
133
|
+
* error or "not checked yet" after two spaces. Cut to `width` columns.
|
|
134
|
+
*/
|
|
135
|
+
function groupLine(group, nowMs, width, withState) {
|
|
136
|
+
const state = withState ? groupState(group, nowMs) : undefined;
|
|
137
|
+
return {
|
|
138
|
+
id: group.providerId,
|
|
139
|
+
segments: clip([
|
|
140
|
+
{ text: group.name, role: "provider", bold: true },
|
|
141
|
+
...(group.account ? [{ text: ` (${group.account})`, role: "account" }] : []),
|
|
142
|
+
...(state ? [{ ...state, text: ` ${state.text}` }] : []),
|
|
143
|
+
], width),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** "Session 12.3K in · 2.10K out", cut to `width` columns. */
|
|
147
|
+
function sessionLine(tokens, width) {
|
|
148
|
+
return {
|
|
149
|
+
id: "session",
|
|
150
|
+
segments: clip([
|
|
151
|
+
{ text: "Session", role: "label", bold: true },
|
|
152
|
+
{ text: ` ${sessionTokensText(tokens)}`, role: "value" },
|
|
153
|
+
], width),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* "⚠ low cache: 35% (claude-sonnet-5)" for the model with the lowest cache hit among those
|
|
158
|
+
* whose cache hit is low (`cacheHit`), its name cut to fit `width`; undefined when none is.
|
|
159
|
+
*/
|
|
160
|
+
function lowCacheLine(models, width) {
|
|
161
|
+
let worst;
|
|
162
|
+
for (const model of models) {
|
|
163
|
+
const hit = cacheHit(model);
|
|
164
|
+
if (!hit?.low)
|
|
165
|
+
continue;
|
|
166
|
+
if (!worst || hit.share < worst.hit.share)
|
|
167
|
+
worst = { modelID: model.modelID, hit };
|
|
168
|
+
}
|
|
169
|
+
if (!worst)
|
|
170
|
+
return undefined;
|
|
171
|
+
const start = `${LOW_CACHE_MARK} low cache: ${worst.hit.text}`;
|
|
172
|
+
const nameRoom = width - columnsOf(start) - " ()".length;
|
|
173
|
+
const name = worst.modelID;
|
|
174
|
+
const text = nameRoom >= 2
|
|
175
|
+
? `${start} (${fit(name, Math.min(columnsOf(name), nameRoom)).trimEnd()})`
|
|
176
|
+
: start;
|
|
177
|
+
return { id: "session", segments: clip([{ text, role: "warning" }], width) };
|
|
178
|
+
}
|
|
179
|
+
/** The most cells a "fill" bar takes on the sidebar. */
|
|
180
|
+
const SIDEBAR_BAR_MOST = 20;
|
|
181
|
+
/**
|
|
182
|
+
* §4.1: the expanded Quota panel, below its title line (`sidebarTitle`). The name column fits
|
|
183
|
+
* the longest name next to a bar; a row without a bar (a balance) starts its value there, or 2
|
|
184
|
+
* columns after a longer name.
|
|
185
|
+
*/
|
|
186
|
+
export function sidebarLines(input) {
|
|
187
|
+
const { layout, words, nowMs, width } = input;
|
|
188
|
+
const percentRows = input.groups.flatMap((group) => group.rows
|
|
189
|
+
.filter((item) => item.row.percentRemaining !== undefined)
|
|
190
|
+
.map((item) => ({ ...item, name: rowName(item, group, words) })));
|
|
191
|
+
const resetWidth = 1 + Math.max(0, ...percentRows.map((item) => resetText(item.row, nowMs, words).length));
|
|
192
|
+
const nameWidth = Math.min(layout.labelWidth, Math.max(0, ...percentRows.map((item) => columnsOf(item.name))));
|
|
193
|
+
const barColumn = layout.indent + nameWidth + 1;
|
|
194
|
+
const fixed = barColumn + 5 + resetWidth;
|
|
195
|
+
const wanted = layout.barWidth === "fill" ? SIDEBAR_BAR_MOST : layout.barWidth;
|
|
196
|
+
const barWidth = layout.bar === "none" ? 0 : Math.max(0, Math.min(wanted, width - fixed));
|
|
197
|
+
const rowLine = (item, group) => {
|
|
198
|
+
const { row } = item;
|
|
199
|
+
const percent = row.percentRemaining;
|
|
200
|
+
const name = rowName(item, group, words);
|
|
201
|
+
if (percent === undefined) {
|
|
202
|
+
const start = valueRowStart(layout.indent, name, layout.labelWidth, barColumn);
|
|
203
|
+
return {
|
|
204
|
+
id: row.id,
|
|
205
|
+
segments: clip([
|
|
206
|
+
{ text: start, role: "label" },
|
|
207
|
+
{ text: rowValueText(row), role: "value" },
|
|
208
|
+
], width),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const labelText = `${" ".repeat(layout.indent)}${fit(name, nameWidth)} `;
|
|
212
|
+
return {
|
|
213
|
+
id: row.id,
|
|
214
|
+
segments: [
|
|
215
|
+
{ text: labelText, role: "label", percent },
|
|
216
|
+
...barSegments(layout.bar, percent, barWidth, evenLeftOf(layout.evenUse, row, nowMs)),
|
|
217
|
+
{ text: percentText(words, percent, false).padStart(5), role: "percent", percent },
|
|
218
|
+
{ text: resetText(row, nowMs, words).padStart(resetWidth), role: "reset", percent },
|
|
219
|
+
],
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
const lines = [];
|
|
223
|
+
input.groups.forEach((group, index) => {
|
|
224
|
+
if (index > 0) {
|
|
225
|
+
for (let gap = 0; gap < layout.providerGap; gap++)
|
|
226
|
+
lines.push({ id: "", segments: [] });
|
|
227
|
+
}
|
|
228
|
+
lines.push(groupLine(group, nowMs, width, true));
|
|
229
|
+
for (const item of group.rows) {
|
|
230
|
+
lines.push(rowLine(item, group));
|
|
231
|
+
const runsOut = runsOutText(input.runsOut, item.row, nowMs, words);
|
|
232
|
+
if (!runsOut)
|
|
233
|
+
continue;
|
|
234
|
+
const text = `${" ".repeat(barColumn)}${runsOut}`;
|
|
235
|
+
lines.push({ id: item.row.id, segments: clip([{ text, role: "warning" }], width) });
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
if (input.sessionTokens) {
|
|
239
|
+
for (let gap = 0; gap < layout.providerGap; gap++)
|
|
240
|
+
lines.push({ id: "", segments: [] });
|
|
241
|
+
lines.push(sessionLine(input.sessionTokens, width));
|
|
242
|
+
const lowCache = lowCacheLine(input.sessionTokens.models ?? [], width);
|
|
243
|
+
if (lowCache)
|
|
244
|
+
lines.push(lowCache);
|
|
245
|
+
}
|
|
246
|
+
return lines;
|
|
247
|
+
}
|
|
248
|
+
/** §4.2: the collapsed panel's title. A provider with several accounts counts once. */
|
|
249
|
+
export function collapsedTitle(groups) {
|
|
250
|
+
const count = new Set(groups.map((group) => group.providerId)).size;
|
|
251
|
+
const errors = new Set(groups.filter((group) => group.error).map((group) => group.providerId))
|
|
252
|
+
.size;
|
|
253
|
+
const providers = `${count} ${count === 1 ? "provider" : "providers"}`;
|
|
254
|
+
return `▶ Quota (${providers}${errors ? `, ${errors} ${errors === 1 ? "error" : "errors"}` : ""})`;
|
|
255
|
+
}
|
|
256
|
+
/** A collapsed line's provider (10) and row name (5) columns. */
|
|
257
|
+
const COLLAPSED_NAMES = 15;
|
|
258
|
+
/** The most cells a collapsed bar takes. */
|
|
259
|
+
const COLLAPSED_BAR_MOST = 10;
|
|
260
|
+
/**
|
|
261
|
+
* §4.2: one line per provider with its preferred window. When the last check failed, the
|
|
262
|
+
* error's words take the place of the reset time next to the rows kept from before. The bar
|
|
263
|
+
* takes the room the names, the percent and the longest reset time leave, at most 10 cells.
|
|
264
|
+
*/
|
|
265
|
+
export function collapsedLines(input) {
|
|
266
|
+
const { layout, words, nowMs } = input;
|
|
267
|
+
const picks = input.groups.map((group) => ({
|
|
268
|
+
group,
|
|
269
|
+
picked: pickRow(group, windowFor(input.window, group.providerId)),
|
|
270
|
+
}));
|
|
271
|
+
const withWord = words.percent === "used";
|
|
272
|
+
// The percent after a space: " 100%", or " 100% used" with its word.
|
|
273
|
+
const percentWidth = withWord ? 10 : 5;
|
|
274
|
+
// The reset as wide as the longest, at least "11h 59m".
|
|
275
|
+
const resetWidth = Math.max(7, ...picks.map(({ picked }) => picked?.row.percentRemaining === undefined
|
|
276
|
+
? 0
|
|
277
|
+
: columnsOf(resetText(picked.row, nowMs, words))));
|
|
278
|
+
const room = input.width - COLLAPSED_NAMES - percentWidth - 1 - resetWidth;
|
|
279
|
+
const wanted = layout.barWidth === "fill" ? COLLAPSED_BAR_MOST : layout.barWidth;
|
|
280
|
+
const barWidth = layout.bar === "none" ? 0 : Math.max(0, Math.min(wanted, COLLAPSED_BAR_MOST, room));
|
|
281
|
+
const providerLine = (group, picked) => {
|
|
282
|
+
const percent = picked?.row.percentRemaining;
|
|
283
|
+
const name = { text: `${fit(group.title, 9)} `, role: "provider", percent };
|
|
284
|
+
const state = groupState(group, nowMs);
|
|
285
|
+
if (!picked || percent === undefined) {
|
|
286
|
+
const value = state ?? {
|
|
287
|
+
text: picked ? rowValueText(picked.row) : "",
|
|
288
|
+
role: "value",
|
|
289
|
+
};
|
|
290
|
+
return { id: group.providerId, segments: clip([name, value], input.width) };
|
|
291
|
+
}
|
|
292
|
+
const error = errorWords(group, nowMs);
|
|
293
|
+
return {
|
|
294
|
+
id: group.providerId,
|
|
295
|
+
segments: clip([
|
|
296
|
+
name,
|
|
297
|
+
{ text: `${fit(rowName(picked, group, words), 4)} `, role: "label", percent },
|
|
298
|
+
...barSegments(layout.bar, percent, barWidth, evenLeftOf(layout.evenUse, picked.row, nowMs)),
|
|
299
|
+
{
|
|
300
|
+
text: percentText(words, percent, withWord).padStart(percentWidth),
|
|
301
|
+
role: "percent",
|
|
302
|
+
percent,
|
|
303
|
+
},
|
|
304
|
+
error
|
|
305
|
+
? { ...error, text: ` ${error.text}` }
|
|
306
|
+
: {
|
|
307
|
+
text: ` ${resetText(picked.row, nowMs, words).padStart(resetWidth)}`,
|
|
308
|
+
role: "reset",
|
|
309
|
+
percent,
|
|
310
|
+
},
|
|
311
|
+
], input.width),
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
return picks.flatMap(({ group, picked }) => {
|
|
315
|
+
const line = providerLine(group, picked);
|
|
316
|
+
const runsOut = picked && runsOutText(input.runsOut, picked.row, nowMs, words);
|
|
317
|
+
if (!runsOut)
|
|
318
|
+
return [line];
|
|
319
|
+
const text = `${" ".repeat(10)}${runsOut}`;
|
|
320
|
+
return [
|
|
321
|
+
line,
|
|
322
|
+
{ id: group.providerId, segments: clip([{ text, role: "warning" }], input.width) },
|
|
323
|
+
];
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
const STATUS_LEVELS = ["full", "bar", "reset", "numbers"];
|
|
327
|
+
/** The status line's little bar. */
|
|
328
|
+
const STATUS_BAR_WIDTH = 5;
|
|
329
|
+
/** A provider's name on the status line: with its account only when it shows several. */
|
|
330
|
+
function statusName(input, group) {
|
|
331
|
+
const accounts = input.groups.filter((other) => other.providerId === group.providerId).length;
|
|
332
|
+
return accounts > 1 ? group.title : group.name;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* One provider's status line segment at a level of detail (without the separator). When the
|
|
336
|
+
* last check failed, the error's words take the place of the reset time next to the rows kept
|
|
337
|
+
* from before, or "⚠" where the level shows no reset time.
|
|
338
|
+
*/
|
|
339
|
+
function statusSegment(input, group, level) {
|
|
340
|
+
const { layout, words, nowMs } = input;
|
|
341
|
+
const picked = pickRow(group, windowFor(input.window, group.providerId));
|
|
342
|
+
const percent = picked?.row.percentRemaining;
|
|
343
|
+
const name = { text: statusName(input, group), role: "statusName", percent };
|
|
344
|
+
if (!picked || percent === undefined) {
|
|
345
|
+
const state = groupState(group, nowMs);
|
|
346
|
+
const value = state ?? { text: picked ? rowValueText(picked.row) : "", role: "value" };
|
|
347
|
+
return { id: group.providerId, segments: [name, { ...value, text: ` ${value.text}` }] };
|
|
348
|
+
}
|
|
349
|
+
const withBar = layout.bar !== "none" && (level === "full" || level === "bar");
|
|
350
|
+
const withReset = level === "full" || level === "reset";
|
|
351
|
+
const error = errorWords(group, nowMs);
|
|
352
|
+
const reset = withReset ? resetText(picked.row, nowMs, words) : "";
|
|
353
|
+
const after = error
|
|
354
|
+
? { ...error, text: ` ${withReset ? error.text : ERROR_MARK}` }
|
|
355
|
+
: reset
|
|
356
|
+
? { text: ` ${reset}`, role: "reset", percent }
|
|
357
|
+
: undefined;
|
|
358
|
+
const runsOut = runsOutText(input.runsOut, picked.row, nowMs, words);
|
|
359
|
+
return {
|
|
360
|
+
id: group.providerId,
|
|
361
|
+
segments: [
|
|
362
|
+
name,
|
|
363
|
+
...(withBar
|
|
364
|
+
? [
|
|
365
|
+
{ text: " ", role: "separator" },
|
|
366
|
+
...barSegments(layout.bar, percent, STATUS_BAR_WIDTH, evenLeftOf(layout.evenUse, picked.row, nowMs)),
|
|
367
|
+
]
|
|
368
|
+
: []),
|
|
369
|
+
{
|
|
370
|
+
text: ` ${percentText(words, percent, words.percent === "used")}`,
|
|
371
|
+
role: "percent",
|
|
372
|
+
percent,
|
|
373
|
+
},
|
|
374
|
+
...(after ? [after] : []),
|
|
375
|
+
...(runsOut ? [{ text: ` (${runsOut})`, role: "warning" }] : []),
|
|
376
|
+
],
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
/** Cuts the name (the first segment) so the rest still fits in `width`; else cuts the end. */
|
|
380
|
+
function shortenName(segments, width) {
|
|
381
|
+
const [name, ...rest] = segments;
|
|
382
|
+
const nameWidth = width - columnsOf(rest.map((segment) => segment.text).join(""));
|
|
383
|
+
if (!name || nameWidth < 2)
|
|
384
|
+
return clip(segments, width);
|
|
385
|
+
return [{ ...name, text: fit(name.text, nameWidth) }, ...rest];
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* §4.3 "all" mode: the most detail that fits every group in `room` columns ("% only" when
|
|
389
|
+
* nothing else fits), then the groups that fit from `start`, keeping room for the "‹ " and
|
|
390
|
+
* " +N ›" markers. When not even the first of them fits, its name is cut short, so the
|
|
391
|
+
* markers stay. `level` fixes the detail instead of "auto".
|
|
392
|
+
*/
|
|
393
|
+
export function statusLayout(input, room, start, level) {
|
|
394
|
+
const { groups } = input;
|
|
395
|
+
const separator = input.layout.separator;
|
|
396
|
+
const widthAt = (candidate) => groups.reduce((sum, group) => sum + columnsOf(lineText(statusSegment(input, group, candidate))), 0) +
|
|
397
|
+
Math.max(0, groups.length - 1) * columnsOf(separator);
|
|
398
|
+
const chosen = level !== "auto"
|
|
399
|
+
? level
|
|
400
|
+
: (STATUS_LEVELS.find((candidate) => widthAt(candidate) <= room) ?? "numbers");
|
|
401
|
+
const first = Math.max(0, Math.min(start, groups.length - 1));
|
|
402
|
+
const shown = [];
|
|
403
|
+
let used = first > 0 ? 2 : 0;
|
|
404
|
+
const markerWidth = (index) => index < groups.length - 1 ? columnsOf(` +${groups.length - index} ›`) : 0;
|
|
405
|
+
for (let index = first; index < groups.length; index++) {
|
|
406
|
+
const segment = statusSegment(input, groups[index], chosen);
|
|
407
|
+
const width = columnsOf(lineText(segment)) + (shown.length > 0 ? columnsOf(separator) : 0);
|
|
408
|
+
if (used + width + markerWidth(index) > room)
|
|
409
|
+
break;
|
|
410
|
+
shown.push(segment);
|
|
411
|
+
used += width;
|
|
412
|
+
}
|
|
413
|
+
const firstGroup = groups[first];
|
|
414
|
+
const left = room - used - markerWidth(first);
|
|
415
|
+
if (shown.length === 0 && firstGroup && left > 0) {
|
|
416
|
+
const segment = statusSegment(input, firstGroup, chosen);
|
|
417
|
+
shown.push({ ...segment, segments: shortenName(segment.segments, left) });
|
|
418
|
+
}
|
|
419
|
+
return { level: chosen, start: first, shown, hiddenAfter: groups.length - first - shown.length };
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* §4.3 "one provider, big bar" (v5's prompt bar): the first group with a 10-cell bar. The
|
|
423
|
+
* error's words take the place of the reset time; without a percent row the line shows the
|
|
424
|
+
* group's error or value instead of a bar. Cut to `width` columns when given, keeping " ⚠"
|
|
425
|
+
* when the error's words don't fit.
|
|
426
|
+
*/
|
|
427
|
+
export function bigStatusLine(input, width) {
|
|
428
|
+
const group = input.groups[0];
|
|
429
|
+
if (!group)
|
|
430
|
+
return undefined;
|
|
431
|
+
const picked = pickRow(group, windowFor(input.window, group.providerId));
|
|
432
|
+
const percent = picked?.row.percentRemaining;
|
|
433
|
+
if (!picked || percent === undefined) {
|
|
434
|
+
const line = statusSegment(input, group, "full");
|
|
435
|
+
return width === undefined ? line : { ...line, segments: clip(line.segments, width) };
|
|
436
|
+
}
|
|
437
|
+
const error = errorWords(group, input.nowMs);
|
|
438
|
+
const reset = resetText(picked.row, input.nowMs, input.words);
|
|
439
|
+
const after = error
|
|
440
|
+
? { ...error, text: ` · ${error.text}` }
|
|
441
|
+
: reset
|
|
442
|
+
? { text: ` · ${reset}`, role: "reset", percent }
|
|
443
|
+
: undefined;
|
|
444
|
+
const runsOut = runsOutText(input.runsOut, picked.row, input.nowMs, input.words);
|
|
445
|
+
const segments = [
|
|
446
|
+
{
|
|
447
|
+
text: `${statusName(input, group)} ${rowName(picked, group, input.words)} `,
|
|
448
|
+
role: "statusName",
|
|
449
|
+
percent,
|
|
450
|
+
},
|
|
451
|
+
...barSegments(input.layout.bar, percent, 10, evenLeftOf(input.layout.evenUse, picked.row, input.nowMs)),
|
|
452
|
+
{ text: ` ${percentText(input.words, percent, true)}`, role: "percent", percent },
|
|
453
|
+
...(after ? [after] : []),
|
|
454
|
+
...(runsOut ? [{ text: ` · ${runsOut}`, role: "warning" }] : []),
|
|
455
|
+
];
|
|
456
|
+
return { id: group.providerId, segments: width === undefined ? segments : clip(segments, width) };
|
|
457
|
+
}
|
|
458
|
+
/** The name column of plain lines: the provider and the row's label. */
|
|
459
|
+
const PLAIN_NAME_WIDTH = 19;
|
|
460
|
+
/**
|
|
461
|
+
* §4.4: plain text, one line per visible row, then a line per provider error. The Web and
|
|
462
|
+
* terminal `/quota` text print these.
|
|
463
|
+
*/
|
|
464
|
+
export function plainLines(params) {
|
|
465
|
+
const { words, nowMs } = params;
|
|
466
|
+
const lines = params.groups.flatMap((group) => {
|
|
467
|
+
const rows = group.rows.map(({ row, label }) => {
|
|
468
|
+
const name = fit(`${group.title} ${label}`, PLAIN_NAME_WIDTH);
|
|
469
|
+
if (row.percentRemaining === undefined)
|
|
470
|
+
return `${name} ${rowValueText(row)}`.trimEnd();
|
|
471
|
+
const percent = percentText(words, row.percentRemaining, true).padEnd(13);
|
|
472
|
+
const line = `${name} ${percent} ${resetText(row, nowMs, words)}`.trimEnd();
|
|
473
|
+
const runsOut = runsOutText(params.runsOut, row, nowMs, words);
|
|
474
|
+
return runsOut ? `${line} ${runsOut}` : line;
|
|
475
|
+
});
|
|
476
|
+
const state = groupState(group, nowMs);
|
|
477
|
+
return state ? [...rows, `${fit(group.title, PLAIN_NAME_WIDTH)} ${state.text}`] : rows;
|
|
478
|
+
});
|
|
479
|
+
return params.sessionTokens
|
|
480
|
+
? [...lines, `Session ${sessionTokensText(params.sessionTokens)}`]
|
|
481
|
+
: lines;
|
|
482
|
+
}
|
|
483
|
+
/** A toast bar's cells at the least; with less room the row has no bar. */
|
|
484
|
+
const TOAST_BAR_MIN = 3;
|
|
485
|
+
/** A grouped toast's row indent, its name column and its bar at the most. */
|
|
486
|
+
const GROUPED_INDENT = 2;
|
|
487
|
+
const GROUPED_NAME_MAX = 9;
|
|
488
|
+
const GROUPED_BAR_MAX = 20;
|
|
489
|
+
/** The segments without the spaces at the end of their line. */
|
|
490
|
+
function trimEnd(segments) {
|
|
491
|
+
const trimmed = [...segments];
|
|
492
|
+
while (trimmed.length > 0) {
|
|
493
|
+
const last = trimmed[trimmed.length - 1];
|
|
494
|
+
const text = last.text.trimEnd();
|
|
495
|
+
if (text) {
|
|
496
|
+
trimmed[trimmed.length - 1] = { ...last, text };
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
trimmed.pop();
|
|
500
|
+
}
|
|
501
|
+
return trimmed;
|
|
502
|
+
}
|
|
503
|
+
/** "runs out in 2h" at `column`, or further left so it ends inside `room`. */
|
|
504
|
+
function runsOutLine(id, runsOut, column, room) {
|
|
505
|
+
const indent = Math.max(0, Math.min(column, room - columnsOf(runsOut)));
|
|
506
|
+
return {
|
|
507
|
+
id,
|
|
508
|
+
segments: clip([{ text: `${" ".repeat(indent)}${runsOut}`, role: "warning" }], room),
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* The grouped toast: a line per provider account with its error, then its rows indented 2:
|
|
513
|
+
* the name, a bar in the room the other columns leave (at most 20 cells), the percent and the
|
|
514
|
+
* reset time. "runs out in" goes under the row at the bar's column. The name column fits the
|
|
515
|
+
* longest name next to a bar; a row without a bar starts its value there, or 2 columns after a
|
|
516
|
+
* longer name.
|
|
517
|
+
*/
|
|
518
|
+
function groupedToastLines(input) {
|
|
519
|
+
const { words, nowMs, room } = input;
|
|
520
|
+
const word = percentWord(words);
|
|
521
|
+
// "100% left": the number right-aligned, then its word.
|
|
522
|
+
const percentWidth = 4 + (word ? word.length + 1 : 0);
|
|
523
|
+
const named = input.groups.map((group) => ({
|
|
524
|
+
group,
|
|
525
|
+
rows: group.rows.map((item) => ({ ...item, name: rowName(item, group, words) })),
|
|
526
|
+
}));
|
|
527
|
+
const items = named.flatMap(({ rows }) => rows);
|
|
528
|
+
const resetWidth = Math.max(0, ...items.map(({ row }) => row.percentRemaining === undefined ? 0 : columnsOf(resetText(row, nowMs, words))));
|
|
529
|
+
const nameWidth = Math.min(GROUPED_NAME_MAX, Math.max(0, ...items
|
|
530
|
+
.filter(({ row }) => row.percentRemaining !== undefined)
|
|
531
|
+
.map(({ name }) => columnsOf(name))));
|
|
532
|
+
const barColumn = GROUPED_INDENT + nameWidth + 1;
|
|
533
|
+
const fixed = barColumn + 1 + percentWidth + (resetWidth > 0 ? 2 + resetWidth : 0);
|
|
534
|
+
const barWidth = input.bar === "none" ? 0 : Math.min(GROUPED_BAR_MAX, room - fixed);
|
|
535
|
+
const withBar = barWidth >= TOAST_BAR_MIN;
|
|
536
|
+
const rowLines = (item) => {
|
|
537
|
+
const { row } = item;
|
|
538
|
+
const percent = row.percentRemaining;
|
|
539
|
+
if (percent === undefined) {
|
|
540
|
+
const start = valueRowStart(GROUPED_INDENT, item.name, GROUPED_NAME_MAX, barColumn);
|
|
541
|
+
const value = { text: rowValueText(row), role: "value" };
|
|
542
|
+
return [{ id: row.id, segments: clip([{ text: start, role: "label" }, value], room) }];
|
|
543
|
+
}
|
|
544
|
+
const name = `${" ".repeat(GROUPED_INDENT)}${fit(item.name, nameWidth)} `;
|
|
545
|
+
const number = percentText(words, percent, false).padStart(4);
|
|
546
|
+
const reset = resetText(row, nowMs, words);
|
|
547
|
+
const segments = [
|
|
548
|
+
{ text: name, role: "label", percent },
|
|
549
|
+
...(withBar
|
|
550
|
+
? barSegments(input.bar, percent, barWidth, evenLeftOf(input.evenUse, row, nowMs))
|
|
551
|
+
: []),
|
|
552
|
+
{
|
|
553
|
+
text: `${withBar ? " " : ""}${word ? `${number} ${word}` : number}`,
|
|
554
|
+
role: "percent",
|
|
555
|
+
percent,
|
|
556
|
+
},
|
|
557
|
+
...(reset ? [{ text: ` ${reset}`, role: "reset", percent }] : []),
|
|
558
|
+
];
|
|
559
|
+
const line = { id: row.id, segments: clip(segments, room) };
|
|
560
|
+
const runsOut = runsOutText(input.runsOut, row, nowMs, words);
|
|
561
|
+
return runsOut ? [line, runsOutLine(row.id, runsOut, barColumn, room)] : [line];
|
|
562
|
+
};
|
|
563
|
+
const lines = named.flatMap(({ group, rows }) => [
|
|
564
|
+
groupLine(group, nowMs, room, true),
|
|
565
|
+
...rows.flatMap(rowLines),
|
|
566
|
+
]);
|
|
567
|
+
return input.sessionTokens ? [...lines, sessionLine(input.sessionTokens, room)] : lines;
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* `left` at the start of a line `room` columns wide and `right` at its end; `left` is cut with
|
|
571
|
+
* "…" when both don't fit.
|
|
572
|
+
*/
|
|
573
|
+
function spread(left, right, room) {
|
|
574
|
+
const leftRoom = room - columnsOf(right.text) - 1;
|
|
575
|
+
if (leftRoom < 1)
|
|
576
|
+
return clip([left, { ...right, text: ` ${right.text}` }], room);
|
|
577
|
+
const leftText = columnsOf(left.text) > leftRoom ? fit(left.text, leftRoom) : left.text;
|
|
578
|
+
const gap = " ".repeat(room - columnsOf(leftText) - columnsOf(right.text));
|
|
579
|
+
return [
|
|
580
|
+
{ ...left, text: leftText },
|
|
581
|
+
{ ...right, text: `${gap}${right.text}` },
|
|
582
|
+
];
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* The detailed toast (v5's look): an empty line between providers, the provider's name, its
|
|
586
|
+
* error under it, then per row its name with the reset time at the right, and a bar as wide
|
|
587
|
+
* as the toast with the percent at the right. "runs out in" goes under the bar.
|
|
588
|
+
*/
|
|
589
|
+
function detailedToastLines(input) {
|
|
590
|
+
const { words, nowMs, room } = input;
|
|
591
|
+
const percents = input.groups.flatMap((group) => group.rows.flatMap(({ row }) => row.percentRemaining === undefined ? [] : [percentText(words, row.percentRemaining, true)]));
|
|
592
|
+
const percentWidth = Math.max(0, ...percents.map(columnsOf));
|
|
593
|
+
const barWidth = input.bar === "none" ? 0 : room - 2 - percentWidth;
|
|
594
|
+
const rowLines = (item, group) => {
|
|
595
|
+
const { row } = item;
|
|
596
|
+
const percent = row.percentRemaining;
|
|
597
|
+
const name = { text: rowName(item, group, words), role: "label", percent };
|
|
598
|
+
if (percent === undefined) {
|
|
599
|
+
const value = { text: rowValueText(row), role: "value" };
|
|
600
|
+
return [{ id: row.id, segments: spread(name, value, room) }];
|
|
601
|
+
}
|
|
602
|
+
const reset = resetText(row, nowMs, words);
|
|
603
|
+
const percentWords = percentText(words, percent, true).padStart(percentWidth);
|
|
604
|
+
const bar = barWidth >= TOAST_BAR_MIN
|
|
605
|
+
? [
|
|
606
|
+
...barSegments(input.bar, percent, barWidth, evenLeftOf(input.evenUse, row, nowMs)),
|
|
607
|
+
{ text: ` ${percentWords}`, role: "percent", percent },
|
|
608
|
+
]
|
|
609
|
+
: [{ text: percentWords.padStart(room), role: "percent", percent }];
|
|
610
|
+
const runsOut = runsOutText(input.runsOut, row, nowMs, words);
|
|
611
|
+
return [
|
|
612
|
+
{
|
|
613
|
+
id: row.id,
|
|
614
|
+
segments: reset
|
|
615
|
+
? spread(name, { text: reset, role: "reset", percent }, room)
|
|
616
|
+
: clip([name], room),
|
|
617
|
+
},
|
|
618
|
+
{ id: row.id, segments: clip(bar, room) },
|
|
619
|
+
...(runsOut ? [runsOutLine(row.id, runsOut, 0, room)] : []),
|
|
620
|
+
];
|
|
621
|
+
};
|
|
622
|
+
const blank = { id: "", segments: [] };
|
|
623
|
+
const lines = input.groups.flatMap((group, index) => {
|
|
624
|
+
const state = groupState(group, nowMs);
|
|
625
|
+
return [
|
|
626
|
+
...(index > 0 ? [blank] : []),
|
|
627
|
+
groupLine(group, nowMs, room, false),
|
|
628
|
+
...(state ? [{ id: group.providerId, segments: clip([state], room) }] : []),
|
|
629
|
+
...group.rows.flatMap((item) => rowLines(item, group)),
|
|
630
|
+
];
|
|
631
|
+
});
|
|
632
|
+
if (!input.sessionTokens)
|
|
633
|
+
return lines;
|
|
634
|
+
const session = spread({ text: "Session", role: "label", bold: true }, { text: sessionTokensText(input.sessionTokens), role: "value" }, room);
|
|
635
|
+
return [...lines, ...(lines.length > 0 ? [blank] : []), { id: "session", segments: session }];
|
|
636
|
+
}
|
|
637
|
+
/** §4.4: a quota toast's lines in its layout, none wider than `room` columns. */
|
|
638
|
+
export function toastLines(input) {
|
|
639
|
+
const lines = input.layout === "detailed" ? detailedToastLines(input) : groupedToastLines(input);
|
|
640
|
+
return lines.map((line) => ({ ...line, segments: trimEnd(line.segments) }));
|
|
641
|
+
}
|
|
642
|
+
//# sourceMappingURL=text.js.map
|