@slkiser/opencode-quota 2.17.0 → 3.0.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.
Files changed (125) hide show
  1. package/README.md +150 -50
  2. package/dist/bin/opencode-quota.d.ts +4 -0
  3. package/dist/bin/opencode-quota.d.ts.map +1 -0
  4. package/dist/bin/opencode-quota.js +52 -0
  5. package/dist/bin/opencode-quota.js.map +1 -0
  6. package/dist/lib/config-file-utils.d.ts +18 -0
  7. package/dist/lib/config-file-utils.d.ts.map +1 -0
  8. package/dist/lib/config-file-utils.js +88 -0
  9. package/dist/lib/config-file-utils.js.map +1 -0
  10. package/dist/lib/config.d.ts +10 -7
  11. package/dist/lib/config.d.ts.map +1 -1
  12. package/dist/lib/config.js +111 -31
  13. package/dist/lib/config.js.map +1 -1
  14. package/dist/lib/display-sanitize.d.ts +7 -0
  15. package/dist/lib/display-sanitize.d.ts.map +1 -1
  16. package/dist/lib/display-sanitize.js +49 -0
  17. package/dist/lib/display-sanitize.js.map +1 -1
  18. package/dist/lib/entries.d.ts +1 -1
  19. package/dist/lib/entries.d.ts.map +1 -1
  20. package/dist/lib/format.js +1 -1
  21. package/dist/lib/format.js.map +1 -1
  22. package/dist/lib/google-antigravity-companion.d.ts +29 -0
  23. package/dist/lib/google-antigravity-companion.d.ts.map +1 -0
  24. package/dist/lib/google-antigravity-companion.js +122 -0
  25. package/dist/lib/google-antigravity-companion.js.map +1 -0
  26. package/dist/lib/google.d.ts +1 -0
  27. package/dist/lib/google.d.ts.map +1 -1
  28. package/dist/lib/google.js +54 -16
  29. package/dist/lib/google.js.map +1 -1
  30. package/dist/lib/grouped-entry-normalization.d.ts.map +1 -1
  31. package/dist/lib/grouped-entry-normalization.js +83 -23
  32. package/dist/lib/grouped-entry-normalization.js.map +1 -1
  33. package/dist/lib/init-installer.d.ts +101 -0
  34. package/dist/lib/init-installer.d.ts.map +1 -0
  35. package/dist/lib/init-installer.js +507 -0
  36. package/dist/lib/init-installer.js.map +1 -0
  37. package/dist/lib/provider-metadata.d.ts +1 -0
  38. package/dist/lib/provider-metadata.d.ts.map +1 -1
  39. package/dist/lib/provider-metadata.js +5 -0
  40. package/dist/lib/provider-metadata.js.map +1 -1
  41. package/dist/lib/quota-render-data.d.ts +72 -0
  42. package/dist/lib/quota-render-data.d.ts.map +1 -0
  43. package/dist/lib/quota-render-data.js +315 -0
  44. package/dist/lib/quota-render-data.js.map +1 -0
  45. package/dist/lib/quota-status.d.ts +9 -0
  46. package/dist/lib/quota-status.d.ts.map +1 -1
  47. package/dist/lib/quota-status.js +37 -0
  48. package/dist/lib/quota-status.js.map +1 -1
  49. package/dist/lib/session-tokens-format.d.ts +16 -3
  50. package/dist/lib/session-tokens-format.d.ts.map +1 -1
  51. package/dist/lib/session-tokens-format.js +65 -11
  52. package/dist/lib/session-tokens-format.js.map +1 -1
  53. package/dist/lib/toast-format-grouped.js +1 -1
  54. package/dist/lib/toast-format-grouped.js.map +1 -1
  55. package/dist/lib/tui-config-diagnostics.d.ts +12 -0
  56. package/dist/lib/tui-config-diagnostics.d.ts.map +1 -0
  57. package/dist/lib/tui-config-diagnostics.js +49 -0
  58. package/dist/lib/tui-config-diagnostics.js.map +1 -0
  59. package/dist/lib/tui-line-style.d.ts +3 -0
  60. package/dist/lib/tui-line-style.d.ts.map +1 -0
  61. package/dist/lib/tui-line-style.js +7 -0
  62. package/dist/lib/tui-line-style.js.map +1 -0
  63. package/dist/lib/tui-panel-state.d.ts +7 -0
  64. package/dist/lib/tui-panel-state.d.ts.map +1 -0
  65. package/dist/lib/tui-panel-state.js +13 -0
  66. package/dist/lib/tui-panel-state.js.map +1 -0
  67. package/dist/lib/tui-runtime.d.ts +11 -0
  68. package/dist/lib/tui-runtime.d.ts.map +1 -0
  69. package/dist/lib/tui-runtime.js +107 -0
  70. package/dist/lib/tui-runtime.js.map +1 -0
  71. package/dist/lib/tui-sidebar-format.d.ts +13 -0
  72. package/dist/lib/tui-sidebar-format.d.ts.map +1 -0
  73. package/dist/lib/tui-sidebar-format.js +29 -0
  74. package/dist/lib/tui-sidebar-format.js.map +1 -0
  75. package/dist/lib/types.d.ts +8 -5
  76. package/dist/lib/types.d.ts.map +1 -1
  77. package/dist/lib/types.js +2 -2
  78. package/dist/lib/types.js.map +1 -1
  79. package/dist/plugin.d.ts.map +1 -1
  80. package/dist/plugin.js +66 -320
  81. package/dist/plugin.js.map +1 -1
  82. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  83. package/dist/providers/alibaba-coding-plan.js +12 -19
  84. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  85. package/dist/providers/anthropic.d.ts.map +1 -1
  86. package/dist/providers/anthropic.js +12 -19
  87. package/dist/providers/anthropic.js.map +1 -1
  88. package/dist/providers/chutes.d.ts.map +1 -1
  89. package/dist/providers/chutes.js +10 -17
  90. package/dist/providers/chutes.js.map +1 -1
  91. package/dist/providers/copilot.js +1 -1
  92. package/dist/providers/copilot.js.map +1 -1
  93. package/dist/providers/cursor.js +1 -1
  94. package/dist/providers/cursor.js.map +1 -1
  95. package/dist/providers/firmware.d.ts.map +1 -1
  96. package/dist/providers/firmware.js +11 -18
  97. package/dist/providers/firmware.js.map +1 -1
  98. package/dist/providers/google-antigravity.js +4 -4
  99. package/dist/providers/google-antigravity.js.map +1 -1
  100. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  101. package/dist/providers/minimax-coding-plan.js +14 -29
  102. package/dist/providers/minimax-coding-plan.js.map +1 -1
  103. package/dist/providers/nanogpt.d.ts.map +1 -1
  104. package/dist/providers/nanogpt.js +5 -12
  105. package/dist/providers/nanogpt.js.map +1 -1
  106. package/dist/providers/openai.d.ts.map +1 -1
  107. package/dist/providers/openai.js +13 -28
  108. package/dist/providers/openai.js.map +1 -1
  109. package/dist/providers/opencode-go.d.ts.map +1 -1
  110. package/dist/providers/opencode-go.js +15 -40
  111. package/dist/providers/opencode-go.js.map +1 -1
  112. package/dist/providers/qwen-code.d.ts.map +1 -1
  113. package/dist/providers/qwen-code.js +16 -19
  114. package/dist/providers/qwen-code.js.map +1 -1
  115. package/dist/providers/result-helpers.d.ts +5 -0
  116. package/dist/providers/result-helpers.d.ts.map +1 -0
  117. package/dist/providers/result-helpers.js +10 -0
  118. package/dist/providers/result-helpers.js.map +1 -0
  119. package/dist/providers/zai.d.ts.map +1 -1
  120. package/dist/providers/zai.js +13 -28
  121. package/dist/providers/zai.js.map +1 -1
  122. package/dist/tui.d.ts +7 -0
  123. package/dist/tui.d.ts.map +1 -0
  124. package/dist/tui.tsx +155 -0
  125. package/package.json +27 -9
@@ -0,0 +1,72 @@
1
+ import type { QuotaToastConfig } from "./types.js";
2
+ import type { QuotaProvider, QuotaProviderContext, QuotaProviderResult, QuotaToastEntry, QuotaToastError, SessionTokensData } from "./entries.js";
3
+ import type { SessionTokenError } from "./quota-status.js";
4
+ export type SessionModelMeta = {
5
+ modelID?: string;
6
+ providerID?: string;
7
+ };
8
+ export type QuotaRequestContext = {
9
+ sessionID?: string;
10
+ sessionMeta?: SessionModelMeta;
11
+ };
12
+ export type QuotaRenderData = {
13
+ entries: QuotaToastEntry[];
14
+ errors: QuotaToastError[];
15
+ sessionTokens?: SessionTokensData;
16
+ };
17
+ export type ProviderFetchCacheEntry = {
18
+ timestamp: number;
19
+ result?: QuotaProviderResult;
20
+ inFlight?: Promise<QuotaProviderResult>;
21
+ };
22
+ export type ProviderFetchCacheStore = Map<string, ProviderFetchCacheEntry>;
23
+ export type QuotaRenderSelection = {
24
+ isAutoMode: boolean;
25
+ providers: QuotaProvider[];
26
+ filtered: QuotaProvider[];
27
+ ctx: QuotaProviderContext;
28
+ currentModel?: string;
29
+ currentProviderID?: string;
30
+ filteringByCurrentSelection: boolean;
31
+ };
32
+ export type QuotaAvailability = {
33
+ provider: QuotaProvider;
34
+ ok: boolean;
35
+ };
36
+ export type CollectQuotaRenderDataResult = {
37
+ selection: QuotaRenderSelection | null;
38
+ availability: QuotaAvailability[];
39
+ active: QuotaProvider[];
40
+ attemptedAny: boolean;
41
+ hasExplicitProviderIssues: boolean;
42
+ data: QuotaRenderData | null;
43
+ sessionTokenError?: SessionTokenError;
44
+ };
45
+ type QuotaFormatStyle = NonNullable<QuotaProviderContext["config"]["formatStyle"]>;
46
+ export declare function matchesQuotaProviderCurrentSelection(params: {
47
+ provider: QuotaProvider;
48
+ currentModel?: string;
49
+ currentProviderID?: string;
50
+ }): boolean;
51
+ export declare function resolveQuotaRenderSelection(params: {
52
+ client: QuotaProviderContext["client"];
53
+ config: QuotaToastConfig;
54
+ request?: QuotaRequestContext;
55
+ formatStyle?: QuotaFormatStyle;
56
+ }): Promise<QuotaRenderSelection | null>;
57
+ export declare function fetchProviderResults(params: {
58
+ providers: QuotaProvider[];
59
+ ctx: QuotaProviderContext;
60
+ ttlMs: number;
61
+ providerFetchCache: ProviderFetchCacheStore;
62
+ }): Promise<QuotaProviderResult[]>;
63
+ export declare function collectQuotaRenderData(params: {
64
+ client: QuotaProviderContext["client"];
65
+ config: QuotaToastConfig;
66
+ request?: QuotaRequestContext;
67
+ providerFetchCache: ProviderFetchCacheStore;
68
+ surfaceExplicitProviderIssues: boolean;
69
+ formatStyle?: QuotaFormatStyle;
70
+ }): Promise<CollectQuotaRenderDataResult>;
71
+ export {};
72
+ //# sourceMappingURL=quota-render-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-render-data.d.ts","sourceRoot":"","sources":["../../src/lib/quota-render-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAU3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAE3E,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,OAAO,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,EAAE,EAAE,OAAO,CAAC;CACb,CAAC;AAmBF,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,EAAE,OAAO,CAAC;IACnC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,CAAC;AAEF,KAAK,gBAAgB,GAAG,WAAW,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AA4BnF,wBAAgB,oCAAoC,CAAC,MAAM,EAAE;IAC3D,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAQV;AAED,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA2CvC;AAkFD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,uBAAuB,CAAC;CAC7C,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiBjC;AA8BD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,6BAA6B,EAAE,OAAO,CAAC;IACvC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAiKxC"}
@@ -0,0 +1,315 @@
1
+ import { fetchSessionTokensForDisplay } from "./session-tokens.js";
2
+ import { getQuotaProviderDisplayLabel } from "./provider-metadata.js";
3
+ import { isCursorProviderId } from "./cursor-pricing.js";
4
+ import { getProviders } from "../providers/registry.js";
5
+ import { getAnthropicNoDataMessage } from "../providers/anthropic.js";
6
+ const LIVE_LOCAL_USAGE_PROVIDER_IDS = new Set(["qwen-code", "alibaba-coding-plan", "cursor"]);
7
+ async function getProviderAvailability(params) {
8
+ try {
9
+ return {
10
+ provider: params.provider,
11
+ ok: await params.provider.isAvailable(params.ctx),
12
+ };
13
+ }
14
+ catch {
15
+ return {
16
+ provider: params.provider,
17
+ ok: false,
18
+ };
19
+ }
20
+ }
21
+ function buildQuotaProviderContext(params) {
22
+ const { client, config, currentModel, currentProviderID, formatStyle } = params;
23
+ return {
24
+ client,
25
+ config: {
26
+ googleModels: config.googleModels,
27
+ anthropicBinaryPath: config.anthropicBinaryPath,
28
+ alibabaCodingPlanTier: config.alibabaCodingPlanTier,
29
+ cursorPlan: config.cursorPlan,
30
+ cursorIncludedApiUsd: config.cursorIncludedApiUsd,
31
+ cursorBillingCycleStartDay: config.cursorBillingCycleStartDay,
32
+ formatStyle: formatStyle ?? config.formatStyle,
33
+ onlyCurrentModel: config.onlyCurrentModel,
34
+ currentModel,
35
+ currentProviderID,
36
+ },
37
+ };
38
+ }
39
+ export function matchesQuotaProviderCurrentSelection(params) {
40
+ if (params.provider.id === "cursor" && isCursorProviderId(params.currentProviderID)) {
41
+ return true;
42
+ }
43
+ if (!params.currentModel)
44
+ return false;
45
+ return params.provider.matchesCurrentModel
46
+ ? params.provider.matchesCurrentModel(params.currentModel)
47
+ : true;
48
+ }
49
+ export async function resolveQuotaRenderSelection(params) {
50
+ const { client, config, request, formatStyle } = params;
51
+ if (!config.enabled)
52
+ return null;
53
+ const allProviders = getProviders();
54
+ const isAutoMode = config.enabledProviders === "auto";
55
+ const providers = isAutoMode
56
+ ? allProviders
57
+ : allProviders.filter((provider) => config.enabledProviders.includes(provider.id));
58
+ if (!isAutoMode && providers.length === 0)
59
+ return null;
60
+ let currentModel;
61
+ let currentProviderID;
62
+ if (config.onlyCurrentModel && request?.sessionMeta) {
63
+ currentModel = request.sessionMeta.modelID;
64
+ currentProviderID = request.sessionMeta.providerID;
65
+ }
66
+ const ctx = buildQuotaProviderContext({
67
+ client,
68
+ config,
69
+ currentModel,
70
+ currentProviderID,
71
+ formatStyle,
72
+ });
73
+ const filteringByCurrentSelection = config.onlyCurrentModel && Boolean(currentModel || isCursorProviderId(currentProviderID));
74
+ const filtered = filteringByCurrentSelection
75
+ ? providers.filter((provider) => matchesQuotaProviderCurrentSelection({ provider, currentModel, currentProviderID }))
76
+ : providers;
77
+ return {
78
+ isAutoMode,
79
+ providers,
80
+ filtered,
81
+ ctx,
82
+ currentModel,
83
+ currentProviderID,
84
+ filteringByCurrentSelection,
85
+ };
86
+ }
87
+ function makeProviderFetchCacheKey(providerId, ctx) {
88
+ const formatStyle = ctx.config.formatStyle ?? "classic";
89
+ const googleModels = ctx.config.googleModels.join(",");
90
+ const alibabaCodingPlanTier = ctx.config.alibabaCodingPlanTier;
91
+ const cursorPlan = ctx.config.cursorPlan;
92
+ const cursorIncludedApiUsd = ctx.config.cursorIncludedApiUsd ?? "";
93
+ const cursorBillingCycleStartDay = ctx.config.cursorBillingCycleStartDay ?? "";
94
+ const onlyCurrentModel = ctx.config.onlyCurrentModel ? "yes" : "no";
95
+ const currentModel = ctx.config.currentModel ?? "";
96
+ const currentProviderID = ctx.config.currentProviderID ?? "";
97
+ const anthropicBinaryPath = ctx.config.anthropicBinaryPath ?? "";
98
+ return `${providerId}|formatStyle=${formatStyle}|anthropicBinaryPath=${anthropicBinaryPath}|googleModels=${googleModels}|alibabaTier=${alibabaCodingPlanTier}|cursorPlan=${cursorPlan}|cursorIncludedApiUsd=${cursorIncludedApiUsd}|cursorBillingCycleStartDay=${cursorBillingCycleStartDay}|onlyCurrentModel=${onlyCurrentModel}|currentModel=${currentModel}|currentProviderID=${currentProviderID}`;
99
+ }
100
+ async function fetchProviderWithCache(params) {
101
+ const { provider, ctx, ttlMs, providerFetchCache } = params;
102
+ if (LIVE_LOCAL_USAGE_PROVIDER_IDS.has(provider.id)) {
103
+ return await provider.fetch(ctx);
104
+ }
105
+ const cacheKey = makeProviderFetchCacheKey(provider.id, ctx);
106
+ const now = Date.now();
107
+ const existing = providerFetchCache.get(cacheKey);
108
+ if (existing?.result &&
109
+ existing.timestamp > 0 &&
110
+ ttlMs > 0 &&
111
+ now - existing.timestamp < ttlMs) {
112
+ return existing.result;
113
+ }
114
+ if (existing?.inFlight) {
115
+ return existing.inFlight;
116
+ }
117
+ const promise = (async () => {
118
+ try {
119
+ const result = await provider.fetch(ctx);
120
+ if (result.attempted) {
121
+ providerFetchCache.set(cacheKey, { timestamp: Date.now(), result });
122
+ }
123
+ else {
124
+ providerFetchCache.delete(cacheKey);
125
+ }
126
+ return result;
127
+ }
128
+ catch (error) {
129
+ providerFetchCache.delete(cacheKey);
130
+ throw error;
131
+ }
132
+ })();
133
+ providerFetchCache.set(cacheKey, {
134
+ timestamp: existing?.timestamp ?? 0,
135
+ result: existing?.result,
136
+ inFlight: promise,
137
+ });
138
+ return promise;
139
+ }
140
+ function makeProviderFetchFailure(provider) {
141
+ return {
142
+ attempted: true,
143
+ entries: [],
144
+ errors: [
145
+ {
146
+ label: getQuotaProviderDisplayLabel(provider.id),
147
+ message: "Failed to read quota data",
148
+ },
149
+ ],
150
+ };
151
+ }
152
+ export async function fetchProviderResults(params) {
153
+ const settled = await Promise.allSettled(params.providers.map((provider) => fetchProviderWithCache({
154
+ provider,
155
+ ctx: params.ctx,
156
+ ttlMs: params.ttlMs,
157
+ providerFetchCache: params.providerFetchCache,
158
+ })));
159
+ return settled.map((result, index) => result.status === "fulfilled"
160
+ ? result.value
161
+ : makeProviderFetchFailure(params.providers[index]));
162
+ }
163
+ function getExplicitNoDataMessage(provider) {
164
+ if (provider.id === "cursor") {
165
+ return "No local usage yet";
166
+ }
167
+ if (provider.id === "anthropic") {
168
+ return getAnthropicNoDataMessage();
169
+ }
170
+ return "Not configured";
171
+ }
172
+ function shouldSurfaceNoDataMessage(params) {
173
+ const { provider, result, isAutoMode, activeProviderCount } = params;
174
+ if (result.attempted || result.entries.length > 0 || result.errors.length > 0) {
175
+ return false;
176
+ }
177
+ if (!isAutoMode) {
178
+ return true;
179
+ }
180
+ return activeProviderCount === 1 && (provider.id === "anthropic" || provider.id === "cursor");
181
+ }
182
+ export async function collectQuotaRenderData(params) {
183
+ const selection = await resolveQuotaRenderSelection(params);
184
+ if (!selection) {
185
+ return {
186
+ selection: null,
187
+ availability: [],
188
+ active: [],
189
+ attemptedAny: false,
190
+ hasExplicitProviderIssues: false,
191
+ data: null,
192
+ };
193
+ }
194
+ const availability = await Promise.all(selection.filtered.map((provider) => getProviderAvailability({
195
+ provider,
196
+ ctx: selection.ctx,
197
+ })));
198
+ const active = availability.filter((item) => item.ok).map((item) => item.provider);
199
+ if (active.length === 0) {
200
+ const errors = [];
201
+ let hasExplicitProviderIssues = false;
202
+ if (params.surfaceExplicitProviderIssues && !selection.isAutoMode) {
203
+ const filteredIds = new Set(selection.filtered.map((provider) => provider.id));
204
+ const availabilityById = new Map(availability.map((item) => [item.provider.id, item.ok]));
205
+ for (const provider of selection.providers) {
206
+ if (!filteredIds.has(provider.id)) {
207
+ const detail = params.config.onlyCurrentModel && selection.currentModel
208
+ ? `current model: ${selection.currentModel}`
209
+ : "filtered";
210
+ errors.push({
211
+ label: getQuotaProviderDisplayLabel(provider.id),
212
+ message: `Skipped (${detail})`,
213
+ });
214
+ hasExplicitProviderIssues = true;
215
+ continue;
216
+ }
217
+ if (availabilityById.get(provider.id) === false) {
218
+ errors.push({
219
+ label: getQuotaProviderDisplayLabel(provider.id),
220
+ message: "Unavailable (not detected)",
221
+ });
222
+ hasExplicitProviderIssues = true;
223
+ }
224
+ }
225
+ }
226
+ return {
227
+ selection,
228
+ availability,
229
+ active,
230
+ attemptedAny: false,
231
+ hasExplicitProviderIssues,
232
+ data: errors.length > 0 ? { entries: [], errors } : null,
233
+ };
234
+ }
235
+ const results = await fetchProviderResults({
236
+ providers: active,
237
+ ctx: selection.ctx,
238
+ ttlMs: params.config.minIntervalMs,
239
+ providerFetchCache: params.providerFetchCache,
240
+ });
241
+ const entries = results.flatMap((result) => result.entries);
242
+ const errors = results.flatMap((result) => result.errors);
243
+ const attemptedAny = results.some((result) => result.attempted);
244
+ let hasExplicitProviderIssues = false;
245
+ for (let index = 0; index < active.length; index++) {
246
+ const provider = active[index];
247
+ const result = results[index];
248
+ if (provider &&
249
+ result &&
250
+ shouldSurfaceNoDataMessage({
251
+ provider,
252
+ result,
253
+ isAutoMode: selection.isAutoMode,
254
+ activeProviderCount: active.length,
255
+ })) {
256
+ errors.push({
257
+ label: getQuotaProviderDisplayLabel(provider.id),
258
+ message: getExplicitNoDataMessage(provider),
259
+ });
260
+ if (!selection.isAutoMode) {
261
+ hasExplicitProviderIssues = true;
262
+ }
263
+ }
264
+ }
265
+ if (params.surfaceExplicitProviderIssues && !selection.isAutoMode) {
266
+ const filteredIds = new Set(selection.filtered.map((provider) => provider.id));
267
+ const activeIds = new Set(active.map((provider) => provider.id));
268
+ const availabilityById = new Map(availability.map((item) => [item.provider.id, item.ok]));
269
+ for (const provider of selection.providers) {
270
+ if (activeIds.has(provider.id))
271
+ continue;
272
+ if (!filteredIds.has(provider.id)) {
273
+ const detail = params.config.onlyCurrentModel && selection.currentModel
274
+ ? `current model: ${selection.currentModel}`
275
+ : "filtered";
276
+ errors.push({
277
+ label: getQuotaProviderDisplayLabel(provider.id),
278
+ message: `Skipped (${detail})`,
279
+ });
280
+ hasExplicitProviderIssues = true;
281
+ continue;
282
+ }
283
+ if (availabilityById.get(provider.id) === false) {
284
+ errors.push({
285
+ label: getQuotaProviderDisplayLabel(provider.id),
286
+ message: "Unavailable (not detected)",
287
+ });
288
+ hasExplicitProviderIssues = true;
289
+ }
290
+ }
291
+ }
292
+ let sessionTokens;
293
+ let sessionTokenError;
294
+ if (params.config.showSessionTokens && params.request?.sessionID) {
295
+ const sessionTokenResult = await fetchSessionTokensForDisplay({
296
+ enabled: params.config.showSessionTokens,
297
+ sessionID: params.request.sessionID,
298
+ });
299
+ sessionTokens = sessionTokenResult.sessionTokens;
300
+ sessionTokenError = sessionTokenResult.error;
301
+ }
302
+ const data = entries.length === 0 && errors.length === 0 && !sessionTokens
303
+ ? null
304
+ : { entries, errors, sessionTokens };
305
+ return {
306
+ selection,
307
+ availability,
308
+ active,
309
+ attemptedAny,
310
+ hasExplicitProviderIssues,
311
+ data,
312
+ sessionTokenError,
313
+ };
314
+ }
315
+ //# sourceMappingURL=quota-render-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-render-data.js","sourceRoot":"","sources":["../../src/lib/quota-render-data.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,15 @@ export interface SessionTokenError {
8
8
  export declare function buildQuotaStatusReport(params: {
9
9
  configSource: string;
10
10
  configPaths: string[];
11
+ networkSettingSources?: Record<string, string>;
12
+ tuiDiagnostics?: {
13
+ configured: boolean;
14
+ inferredSelectedPath: string | null;
15
+ presentPaths: string[];
16
+ candidatePaths: string[];
17
+ quotaPluginConfigured: boolean;
18
+ quotaPluginConfigPaths: string[];
19
+ };
11
20
  enabledProviders: string[] | "auto";
12
21
  anthropicBinaryPath?: string;
13
22
  alibabaCodingPlanTier: "lite" | "pro";
@@ -1 +1 @@
1
- {"version":3,"file":"quota-status.d.ts","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"AA8DA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAUzE,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiQD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,GAAG,KAAK,CAAC;IACtC,UAAU,EAAE,eAAe,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,kBAAkB,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,CAAC;IACvD,oBAAoB,EAAE,KAAK,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,CAAC,CAAC;IACH,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC;IACF,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8qBlB"}
1
+ {"version":3,"file":"quota-status.d.ts","sourceRoot":"","sources":["../../src/lib/quota-status.ts"],"names":[],"mappings":"AA+DA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAUzE,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAuRD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE;QACf,UAAU,EAAE,OAAO,CAAC;QACpB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,qBAAqB,EAAE,OAAO,CAAC;QAC/B,sBAAsB,EAAE,MAAM,EAAE,CAAC;KAClC,CAAC;IACF,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,GAAG,KAAK,CAAC;IACtC,UAAU,EAAE,eAAe,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,kBAAkB,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,CAAC;IACvD,oBAAoB,EAAE,KAAK,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,CAAC,CAAC;IACH,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrD,CAAC;IACF,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CAisBlB"}
@@ -2,6 +2,7 @@ import { stat } from "fs/promises";
2
2
  import { getAuthPath, getAuthPaths, readAuthFileCached } from "./opencode-auth.js";
3
3
  import { getOpencodeRuntimeDirs } from "./opencode-runtime-paths.js";
4
4
  import { getGoogleTokenCachePath } from "./google-token-cache.js";
5
+ import { inspectAntigravityCompanionPresence } from "./google-antigravity-companion.js";
5
6
  import { inspectAntigravityAccountsPresence } from "./google.js";
6
7
  import { getAnthropicDiagnostics } from "./anthropic.js";
7
8
  import { getFirmwareKeyDiagnostics } from "./firmware.js";
@@ -45,6 +46,25 @@ const STATUS_SAMPLE_LIMIT = 5;
45
46
  function joinOrNone(values) {
46
47
  return values.length > 0 ? values.join(" | ") : "(none)";
47
48
  }
49
+ function formatNetworkSettingSources(sources) {
50
+ if (!sources)
51
+ return "(none)";
52
+ const keys = [
53
+ "enabled",
54
+ "enabledProviders",
55
+ "minIntervalMs",
56
+ "pricingSnapshot.source",
57
+ "pricingSnapshot.autoRefresh",
58
+ "showOnIdle",
59
+ "showOnQuestion",
60
+ "showOnCompact",
61
+ "showOnBothFail",
62
+ ];
63
+ const parts = keys
64
+ .filter((key) => typeof sources[key] === "string" && sources[key].length > 0)
65
+ .map((key) => `${key}<=${sources[key]}`);
66
+ return parts.length > 0 ? parts.join(" | ") : "(none)";
67
+ }
48
68
  function getDefaultBasicApiKeyDiagnostics() {
49
69
  return {
50
70
  configured: false,
@@ -238,6 +258,7 @@ export async function buildQuotaStatusReport(params) {
238
258
  // === toast diagnostics ===
239
259
  lines.push("toast:");
240
260
  lines.push(`- configSource: ${params.configSource}${params.configPaths.length ? ` (${params.configPaths.join(" | ")})` : ""}`);
261
+ lines.push(`- network_setting_sources: ${formatNetworkSettingSources(params.networkSettingSources)}`);
241
262
  lines.push(`- enabledProviders: ${params.enabledProviders === "auto" ? "(auto)" : params.enabledProviders.length ? params.enabledProviders.join(",") : "(none)"}`);
242
263
  lines.push(`- onlyCurrentModel: ${params.onlyCurrentModel ? "true" : "false"}`);
243
264
  const modelDisplay = params.currentModel
@@ -248,6 +269,16 @@ export async function buildQuotaStatusReport(params) {
248
269
  ? "(no session available)"
249
270
  : "(unknown)";
250
271
  lines.push(`- currentModel: ${modelDisplay}`);
272
+ if (params.tuiDiagnostics) {
273
+ lines.push("");
274
+ lines.push("tui:");
275
+ lines.push(`- config_configured: ${params.tuiDiagnostics.configured ? "true" : "false"}`);
276
+ lines.push(`- inferred_selected_config_path: ${params.tuiDiagnostics.inferredSelectedPath ?? "(none)"}`);
277
+ lines.push(`- present_config_paths: ${joinOrNone(params.tuiDiagnostics.presentPaths)}`);
278
+ lines.push(`- candidate_config_paths: ${joinOrNone(params.tuiDiagnostics.candidatePaths)}`);
279
+ lines.push(`- quota_plugin_configured: ${params.tuiDiagnostics.quotaPluginConfigured ? "true" : "false"}`);
280
+ lines.push(`- quota_plugin_paths: ${joinOrNone(params.tuiDiagnostics.quotaPluginConfigPaths)}`);
281
+ }
251
282
  lines.push("- providers:");
252
283
  for (const p of params.providerAvailability) {
253
284
  const bits = [];
@@ -624,6 +655,7 @@ export async function buildQuotaStatusReport(params) {
624
655
  lines.push(`- override: ${copilotDiag.override}`);
625
656
  const googleTokenCachePath = getGoogleTokenCachePath();
626
657
  const googleAuthPresence = await inspectAntigravityAccountsPresence();
658
+ const googleCompanionPresence = await inspectAntigravityCompanionPresence();
627
659
  lines.push("");
628
660
  lines.push("google_antigravity:");
629
661
  lines.push(`- auth_state: ${googleAuthPresence.state}`);
@@ -632,6 +664,11 @@ export async function buildQuotaStatusReport(params) {
632
664
  lines.push(`- candidate_accounts_paths: ${joinOrNone(googleAuthPresence.candidatePaths)}`);
633
665
  lines.push(`- account_count: ${googleAuthPresence.accountCount}`);
634
666
  lines.push(`- valid_account_count: ${googleAuthPresence.validAccountCount}`);
667
+ lines.push(`- companion_package_state: ${googleCompanionPresence.state}`);
668
+ lines.push(`- companion_package_path: ${googleCompanionPresence.state === "present" || googleCompanionPresence.state === "invalid" ? googleCompanionPresence.resolvedPath ?? "(none)" : "(none)"}`);
669
+ if (googleCompanionPresence.state !== "present") {
670
+ lines.push(`- companion_error: ${sanitizeDisplayText(googleCompanionPresence.error)}`);
671
+ }
635
672
  lines.push(`- token_cache_path: ${googleTokenCachePath} exists=${(await pathExists(googleTokenCachePath)) ? "true" : "false"}`);
636
673
  if (googleAuthPresence.state === "invalid" && googleAuthPresence.error) {
637
674
  lines.push(`- auth_error: ${sanitizeDisplayText(googleAuthPresence.error)}`);