@slkiser/opencode-quota 5.0.0-beta.1 → 5.0.0
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 +72 -131
- package/dist/lib/format-utils.d.ts +0 -4
- package/dist/lib/format-utils.d.ts.map +1 -1
- package/dist/lib/format-utils.js +0 -3
- package/dist/lib/format-utils.js.map +1 -1
- package/dist/lib/init-installer.js +2 -2
- package/dist/lib/init-installer.js.map +1 -1
- package/dist/lib/markdown-table.d.ts +36 -0
- package/dist/lib/markdown-table.d.ts.map +1 -1
- package/dist/lib/markdown-table.js +56 -0
- package/dist/lib/markdown-table.js.map +1 -1
- package/dist/lib/opencode-auth.d.ts.map +1 -1
- package/dist/lib/opencode-auth.js +4 -3
- package/dist/lib/opencode-auth.js.map +1 -1
- package/dist/lib/quota-columns.d.ts +38 -0
- package/dist/lib/quota-columns.d.ts.map +1 -0
- package/dist/lib/quota-columns.js +129 -0
- package/dist/lib/quota-columns.js.map +1 -0
- package/dist/lib/quota-command-format.d.ts +11 -0
- package/dist/lib/quota-command-format.d.ts.map +1 -1
- package/dist/lib/quota-command-format.js +80 -27
- package/dist/lib/quota-command-format.js.map +1 -1
- package/dist/lib/quota-dialog-command-specs.d.ts +4 -0
- package/dist/lib/quota-dialog-command-specs.d.ts.map +1 -1
- package/dist/lib/quota-dialog-command-specs.js.map +1 -1
- package/dist/lib/quota-dialog-commands.d.ts +2 -0
- package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
- package/dist/lib/quota-dialog-commands.js +114 -101
- package/dist/lib/quota-dialog-commands.js.map +1 -1
- package/dist/lib/quota-report-message.d.ts +3 -2
- package/dist/lib/quota-report-message.d.ts.map +1 -1
- package/dist/lib/quota-report-message.js +7 -11
- package/dist/lib/quota-report-message.js.map +1 -1
- package/dist/lib/quota-stats-format.d.ts +8 -3
- package/dist/lib/quota-stats-format.d.ts.map +1 -1
- package/dist/lib/quota-stats-format.js +36 -37
- package/dist/lib/quota-stats-format.js.map +1 -1
- package/dist/lib/quota-status.d.ts +5 -2
- package/dist/lib/quota-status.d.ts.map +1 -1
- package/dist/lib/quota-status.js +9 -5
- package/dist/lib/quota-status.js.map +1 -1
- package/dist/lib/report-document.d.ts +56 -2
- package/dist/lib/report-document.d.ts.map +1 -1
- package/dist/lib/report-document.js +105 -24
- package/dist/lib/report-document.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +5 -1
- package/dist/plugin.js.map +1 -1
- package/dist/tui-v2.d.ts.map +1 -1
- package/dist/tui-v2.jsx +149 -23
- package/dist/tui-v2.jsx.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +370 -98
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-document.d.ts","sourceRoot":"","sources":["../../src/lib/report-document.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"report-document.d.ts","sourceRoot":"","sources":["../../src/lib/report-document.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,yFAAyF;IACzF,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;AACpC;;;;GAIG;GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,kBAAkB,CAAC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,cAAc,EAAE,CAAC;CACxB,GACD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAA;CAAE,GACnC;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8FAA8F;IAC9F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAcF,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,EAAE,CAI5E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,aAAa,CAMhB;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAE5D;AAsED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAwBxE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAMpD;AAwCD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAmBtE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAoBrE"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { formatLocalCallTimestamp } from "./format-utils.js";
|
|
2
2
|
import { renderMarkdownTable } from "./markdown-table.js";
|
|
3
3
|
function hasBlockContent(block) {
|
|
4
4
|
switch (block.kind) {
|
|
5
5
|
case "lines":
|
|
6
|
+
case "quota":
|
|
6
7
|
return block.lines.length > 0;
|
|
7
8
|
case "kv":
|
|
8
9
|
return block.rows.length > 0;
|
|
@@ -10,10 +11,102 @@ function hasBlockContent(block) {
|
|
|
10
11
|
return block.headers.length > 0 || block.rows.length > 0;
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
/** The sections every renderer shows: empty blocks dropped, then sections left with nothing. */
|
|
15
|
+
export function renderableSections(document) {
|
|
16
|
+
return document.sections
|
|
17
|
+
.map((section) => ({ ...section, blocks: section.blocks.filter(hasBlockContent) }))
|
|
18
|
+
.filter((section) => section.title || section.blocks.length > 0);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A command report's heading: "# <title> <time>" in text, "<detail> · <time>" in the dialog.
|
|
22
|
+
* The title echoes the command, e.g. "Quota Status (opencode-quota v5.0.0) (/quota_status)";
|
|
23
|
+
* the detail repeats the facts in it that the dialog title lacks, e.g. "opencode-quota v5.0.0".
|
|
24
|
+
*/
|
|
25
|
+
export function commandHeading(params) {
|
|
26
|
+
const time = formatLocalCallTimestamp(params.generatedAtMs);
|
|
27
|
+
return {
|
|
28
|
+
line: `# ${params.title} ${time}`,
|
|
29
|
+
subtitle: params.detail ? `${params.detail} · ${time}` : time,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** A document of one plain message; it renders back to the same text. */
|
|
33
|
+
export function messageDocument(text) {
|
|
34
|
+
return { sections: [{ id: "message", blocks: [{ kind: "lines", lines: text.split("\n") }] }] };
|
|
35
|
+
}
|
|
36
|
+
function isObject(value) {
|
|
37
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
38
|
+
}
|
|
39
|
+
function isStringArray(value) {
|
|
40
|
+
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
15
41
|
}
|
|
16
|
-
function
|
|
42
|
+
function isOptional(value, type) {
|
|
43
|
+
return value === undefined || typeof value === type;
|
|
44
|
+
}
|
|
45
|
+
function isReportKvRow(value) {
|
|
46
|
+
return (isObject(value) &&
|
|
47
|
+
typeof value.key === "string" &&
|
|
48
|
+
isOptional(value.value, "string") &&
|
|
49
|
+
(value.indent === undefined || value.indent === 0 || value.indent === 1) &&
|
|
50
|
+
isOptional(value.trailingColon, "boolean"));
|
|
51
|
+
}
|
|
52
|
+
function isReportQuotaRow(value) {
|
|
53
|
+
return (isObject(value) &&
|
|
54
|
+
typeof value.label === "string" &&
|
|
55
|
+
isOptional(value.barPercent, "number") &&
|
|
56
|
+
typeof value.value === "string" &&
|
|
57
|
+
isOptional(value.usage, "string") &&
|
|
58
|
+
isOptional(value.reset, "string") &&
|
|
59
|
+
isStringArray(value.notes));
|
|
60
|
+
}
|
|
61
|
+
function isReportBlock(value) {
|
|
62
|
+
if (!isObject(value))
|
|
63
|
+
return false;
|
|
64
|
+
switch (value.kind) {
|
|
65
|
+
case "lines":
|
|
66
|
+
return isStringArray(value.lines);
|
|
67
|
+
case "quota":
|
|
68
|
+
return (typeof value.provider === "string" &&
|
|
69
|
+
(value.percentMode === "remaining" || value.percentMode === "used") &&
|
|
70
|
+
isStringArray(value.lines) &&
|
|
71
|
+
Array.isArray(value.rows) &&
|
|
72
|
+
value.rows.every(isReportQuotaRow));
|
|
73
|
+
case "kv":
|
|
74
|
+
return Array.isArray(value.rows) && value.rows.every(isReportKvRow);
|
|
75
|
+
case "table":
|
|
76
|
+
return (isStringArray(value.headers) &&
|
|
77
|
+
(value.fullHeaders === undefined ||
|
|
78
|
+
(isStringArray(value.fullHeaders) &&
|
|
79
|
+
value.fullHeaders.length === value.headers.length)) &&
|
|
80
|
+
Array.isArray(value.rows) &&
|
|
81
|
+
value.rows.every(isStringArray) &&
|
|
82
|
+
Array.isArray(value.aligns) &&
|
|
83
|
+
value.aligns.every((align) => align === "left" || align === "right") &&
|
|
84
|
+
(value.widthMode === undefined ||
|
|
85
|
+
value.widthMode === "raw" ||
|
|
86
|
+
value.widthMode === "markdown-conceal"));
|
|
87
|
+
default:
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Checks the shape of a document read back from stored message metadata. */
|
|
92
|
+
export function isReportDocument(value) {
|
|
93
|
+
if (!isObject(value))
|
|
94
|
+
return false;
|
|
95
|
+
const heading = value.heading;
|
|
96
|
+
if (heading !== undefined &&
|
|
97
|
+
!(isObject(heading) &&
|
|
98
|
+
typeof heading.line === "string" &&
|
|
99
|
+
isOptional(heading.subtitle, "string"))) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return (Array.isArray(value.sections) &&
|
|
103
|
+
value.sections.every((section) => isObject(section) &&
|
|
104
|
+
typeof section.id === "string" &&
|
|
105
|
+
isOptional(section.title, "string") &&
|
|
106
|
+
Array.isArray(section.blocks) &&
|
|
107
|
+
section.blocks.every(isReportBlock)));
|
|
108
|
+
}
|
|
109
|
+
export function renderKvRow(row) {
|
|
17
110
|
const indent = row.indent === 1 ? " " : "";
|
|
18
111
|
if (row.value !== undefined) {
|
|
19
112
|
return `${indent}- ${row.key}: ${row.value}`;
|
|
@@ -23,6 +116,7 @@ function renderKvRow(row) {
|
|
|
23
116
|
function renderPlainTextBlock(block) {
|
|
24
117
|
switch (block.kind) {
|
|
25
118
|
case "lines":
|
|
119
|
+
case "quota":
|
|
26
120
|
return block.lines;
|
|
27
121
|
case "kv":
|
|
28
122
|
return block.rows.map(renderKvRow);
|
|
@@ -40,6 +134,7 @@ function renderPlainTextBlock(block) {
|
|
|
40
134
|
function renderMarkdownBlock(block) {
|
|
41
135
|
switch (block.kind) {
|
|
42
136
|
case "lines":
|
|
137
|
+
case "quota":
|
|
43
138
|
return block.lines;
|
|
44
139
|
case "kv":
|
|
45
140
|
return block.rows.map(renderKvRow);
|
|
@@ -56,16 +151,9 @@ function renderMarkdownBlock(block) {
|
|
|
56
151
|
}
|
|
57
152
|
export function renderPlainTextReport(document) {
|
|
58
153
|
const lines = [];
|
|
59
|
-
if (document.heading)
|
|
60
|
-
lines.push(
|
|
61
|
-
|
|
62
|
-
generatedAtMs: document.heading.generatedAtMs,
|
|
63
|
-
}));
|
|
64
|
-
}
|
|
65
|
-
const sections = document.sections
|
|
66
|
-
.map((section) => ({ ...section, blocks: getRenderableBlocks(section) }))
|
|
67
|
-
.filter((section) => section.title || section.blocks.length > 0);
|
|
68
|
-
for (const section of sections) {
|
|
154
|
+
if (document.heading)
|
|
155
|
+
lines.push(document.heading.line);
|
|
156
|
+
for (const section of renderableSections(document)) {
|
|
69
157
|
if (lines.length > 0)
|
|
70
158
|
lines.push("");
|
|
71
159
|
if (section.title) {
|
|
@@ -81,16 +169,9 @@ export function renderPlainTextReport(document) {
|
|
|
81
169
|
}
|
|
82
170
|
export function renderMarkdownReport(document) {
|
|
83
171
|
const lines = [];
|
|
84
|
-
if (document.heading)
|
|
85
|
-
lines.push(
|
|
86
|
-
|
|
87
|
-
generatedAtMs: document.heading.generatedAtMs,
|
|
88
|
-
}));
|
|
89
|
-
}
|
|
90
|
-
const sections = document.sections
|
|
91
|
-
.map((section) => ({ ...section, blocks: getRenderableBlocks(section) }))
|
|
92
|
-
.filter((section) => section.title || section.blocks.length > 0);
|
|
93
|
-
for (const section of sections) {
|
|
172
|
+
if (document.heading)
|
|
173
|
+
lines.push(document.heading.line);
|
|
174
|
+
for (const section of renderableSections(document)) {
|
|
94
175
|
if (lines.length > 0)
|
|
95
176
|
lines.push("");
|
|
96
177
|
if (section.title) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-document.js","sourceRoot":"","sources":["../../src/lib/report-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"report-document.js","sourceRoot":"","sources":["../../src/lib/report-document.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AA+E1C,eAAO,MAAM,gBAAgB,eA8M3B,CAAC;eAEY,gBAAgB"}
|
package/dist/plugin.js
CHANGED
|
@@ -12,6 +12,7 @@ import { QUOTA_DIALOG_COMMANDS, } from "./lib/quota-dialog-command-specs.js";
|
|
|
12
12
|
import { buildQuotaDialogCommandOutput } from "./lib/quota-dialog-commands.js";
|
|
13
13
|
import { containsQuotaReport, formatQuotaReportMessage, QUOTA_REPORT_METADATA_KEY, removeQuotaReports, } from "./lib/quota-report-message.js";
|
|
14
14
|
import { getQuotaFooter, getQuotaMessage, writeQuotaExportIfEnabled, } from "./lib/quota-surface-data.js";
|
|
15
|
+
import { messageDocument } from "./lib/report-document.js";
|
|
15
16
|
import { QuotaRpc } from "./rpc.js";
|
|
16
17
|
function hasQuotaReportText(part) {
|
|
17
18
|
return part.type === "text" && typeof part.text === "string" && containsQuotaReport(part.text);
|
|
@@ -128,11 +129,13 @@ export const QuotaToastPlugin = Plugin.define({
|
|
|
128
129
|
catch (error) {
|
|
129
130
|
// Return the reason as output so the TUI shows it instead of OpenCode's rpc.internal.
|
|
130
131
|
const spec = QUOTA_DIALOG_COMMANDS.find((item) => item.id === input.command);
|
|
132
|
+
const output = sanitizeDisplayText(error instanceof Error ? error.message : String(error));
|
|
131
133
|
return {
|
|
132
134
|
state: "output",
|
|
133
135
|
command: input.command,
|
|
134
136
|
title: spec.title,
|
|
135
|
-
output
|
|
137
|
+
output,
|
|
138
|
+
document: messageDocument(output),
|
|
136
139
|
dialogSize: spec.dialogSize,
|
|
137
140
|
};
|
|
138
141
|
}
|
|
@@ -176,6 +179,7 @@ export const QuotaToastPlugin = Plugin.define({
|
|
|
176
179
|
command: spec.id,
|
|
177
180
|
title: result.title,
|
|
178
181
|
at: Date.now(),
|
|
182
|
+
document: result.document,
|
|
179
183
|
};
|
|
180
184
|
// The report is posted as the user's message. resume: false admits it without
|
|
181
185
|
// starting a model turn, so it waits in the session inbox, where Web, Desktop,
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/tui-v2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-v2.d.ts","sourceRoot":"","sources":["../src/tui-v2.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"tui-v2.d.ts","sourceRoot":"","sources":["../src/tui-v2.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AA8wB9C,QAAA,MAAM,MAAM,mBA+FV,CAAC;eAEY,MAAM"}
|
package/dist/tui-v2.jsx
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/** @jsxImportSource @opentui/solid */
|
|
2
2
|
import { Plugin } from "@opencode/plugin/tui";
|
|
3
|
-
import {
|
|
3
|
+
import { TextAttributes } from "@opentui/core";
|
|
4
4
|
import { useTerminalDimensions } from "@opentui/solid";
|
|
5
5
|
import { createSignal, onCleanup, Show } from "solid-js";
|
|
6
6
|
import { loadConfig } from "./lib/config.js";
|
|
7
7
|
import { resolveOpenCodeLocationRoots } from "./lib/config-file-utils.js";
|
|
8
8
|
import { sanitizeDisplayText } from "./lib/display-sanitize.js";
|
|
9
|
+
import { fitTableToWidth } from "./lib/markdown-table.js";
|
|
10
|
+
import { layoutQuotaTables } from "./lib/quota-columns.js";
|
|
9
11
|
import { parseQuotaSlashCommand, QUOTA_DIALOG_COMMANDS, } from "./lib/quota-dialog-command-specs.js";
|
|
10
|
-
import {
|
|
12
|
+
import { readQuotaReportMetadata } from "./lib/quota-report-message.js";
|
|
13
|
+
import { renderableSections, renderKvRow, } from "./lib/report-document.js";
|
|
11
14
|
import { QuotaRpc, } from "./rpc.js";
|
|
12
|
-
const terminalForeground = RGBA.defaultForeground();
|
|
13
15
|
const REFRESH_INTERVAL_MS = 60_000;
|
|
14
16
|
const RPC_TIMEOUT_MS = 60_000;
|
|
15
17
|
function getSessionID(event) {
|
|
@@ -135,7 +137,7 @@ function QuotaFooter(props) {
|
|
|
135
137
|
});
|
|
136
138
|
return (<Show when={lines().length}>
|
|
137
139
|
<box flexDirection="column">
|
|
138
|
-
{lines().map((line) => (<text fg={
|
|
140
|
+
{lines().map((line) => (<text fg={props.context.theme.text.muted}>{line}</text>))}
|
|
139
141
|
</box>
|
|
140
142
|
</Show>);
|
|
141
143
|
}
|
|
@@ -149,6 +151,117 @@ function reportFailure(error) {
|
|
|
149
151
|
: "";
|
|
150
152
|
console.warn(`[opencode-quota] failed to load quota: ${rpcErrorMessage(error)}${hint}`);
|
|
151
153
|
}
|
|
154
|
+
/** OpenCode's dialog widths (dialogWidth in its ui/dialog.tsx). */
|
|
155
|
+
const DIALOG_WIDTHS = { medium: 60, large: 88, xlarge: 116 };
|
|
156
|
+
function sanitizeQuotaRow(row) {
|
|
157
|
+
return {
|
|
158
|
+
...row,
|
|
159
|
+
label: sanitizeDisplayText(row.label),
|
|
160
|
+
value: sanitizeDisplayText(row.value),
|
|
161
|
+
usage: row.usage === undefined ? undefined : sanitizeDisplayText(row.usage),
|
|
162
|
+
reset: row.reset === undefined ? undefined : sanitizeDisplayText(row.reset),
|
|
163
|
+
notes: row.notes.map(sanitizeDisplayText),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** A report's /quota blocks, sanitized, for layoutQuotaTables. */
|
|
167
|
+
function quotaBlocks(section) {
|
|
168
|
+
return section.blocks.flatMap((block) => block.kind === "quota"
|
|
169
|
+
? [
|
|
170
|
+
{
|
|
171
|
+
...block,
|
|
172
|
+
provider: sanitizeDisplayText(block.provider),
|
|
173
|
+
rows: block.rows.map(sanitizeQuotaRow),
|
|
174
|
+
},
|
|
175
|
+
]
|
|
176
|
+
: []);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* A /quota table (see layoutQuotaTables): its title bold, like a section title, then its
|
|
180
|
+
* header bold in OpenCode's primary accent, like the token tables, and its providers bold.
|
|
181
|
+
* In the rows, labels, reset times, and notes are muted; bars, percents, and values base.
|
|
182
|
+
*/
|
|
183
|
+
function QuotaTableView(props) {
|
|
184
|
+
return (<box flexDirection="column">
|
|
185
|
+
<text attributes={TextAttributes.BOLD} fg={props.theme.text.base}>
|
|
186
|
+
{props.table.title}
|
|
187
|
+
</text>
|
|
188
|
+
{props.table.lines.map((line) => line.style === "row" ? (<text fg={props.theme.text.base} wrapMode="none">
|
|
189
|
+
{line.segments.map((segment) => (<span style={{ fg: segment.muted ? props.theme.text.muted : props.theme.text.base }}>
|
|
190
|
+
{segment.text}
|
|
191
|
+
</span>))}
|
|
192
|
+
</text>) : (<text attributes={TextAttributes.BOLD} fg={line.style === "header"
|
|
193
|
+
? props.theme.text.action.primary.selected
|
|
194
|
+
: props.theme.text.base} wrapMode={line.style === "header" ? "none" : undefined}>
|
|
195
|
+
{line.segments.map((segment) => segment.text).join("")}
|
|
196
|
+
</text>))}
|
|
197
|
+
</box>);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* One block of a report. Lines, and the chat lines of /quota rows the dialog's tables do not
|
|
201
|
+
* fit, and key-value rows wrap at words. A table keeps each row on one line and spans `width`
|
|
202
|
+
* columns when it fits (see fitTableToWidth), with the header row bold in OpenCode's primary
|
|
203
|
+
* accent (its text color for a selected tab). Like OpenCode's sidebar, labels are muted and
|
|
204
|
+
* values are base.
|
|
205
|
+
*/
|
|
206
|
+
function ReportBlockView(props) {
|
|
207
|
+
const block = props.block;
|
|
208
|
+
if (block.kind === "lines" || block.kind === "quota") {
|
|
209
|
+
return <text fg={props.theme.text.muted}>{sanitizeDisplayText(block.lines.join("\n"))}</text>;
|
|
210
|
+
}
|
|
211
|
+
if (block.kind === "kv") {
|
|
212
|
+
return (<box flexDirection="column">
|
|
213
|
+
{block.rows.map(({ value, ...key }) => value === undefined ? (<text fg={props.theme.text.muted}>{sanitizeDisplayText(renderKvRow(key))}</text>) : (<text fg={props.theme.text.muted}>
|
|
214
|
+
{sanitizeDisplayText(renderKvRow({ ...key, trailingColon: true }))}
|
|
215
|
+
<span style={{ fg: props.theme.text.base }}> {sanitizeDisplayText(value)}</span>
|
|
216
|
+
</text>))}
|
|
217
|
+
</box>);
|
|
218
|
+
}
|
|
219
|
+
// Read in the JSX, so the table is laid out again when the terminal is resized.
|
|
220
|
+
const table = () => fitTableToWidth({
|
|
221
|
+
headers: block.headers.map(sanitizeDisplayText),
|
|
222
|
+
fullHeaders: block.fullHeaders?.map(sanitizeDisplayText),
|
|
223
|
+
rows: block.rows.map((row) => row.map(sanitizeDisplayText)),
|
|
224
|
+
aligns: block.aligns,
|
|
225
|
+
width: props.width,
|
|
226
|
+
});
|
|
227
|
+
return (<box flexDirection="column">
|
|
228
|
+
<text attributes={TextAttributes.BOLD} fg={props.theme.text.action.primary.selected} wrapMode="none">
|
|
229
|
+
{table().header}
|
|
230
|
+
</text>
|
|
231
|
+
{table().rows.map((row) => (<text fg={props.theme.text.base} wrapMode="none">
|
|
232
|
+
{row}
|
|
233
|
+
</text>))}
|
|
234
|
+
</box>);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Draws a report document's sections with the same spacing as its plain text: one blank row
|
|
238
|
+
* between the sections and between the blocks of a section, and a section title directly
|
|
239
|
+
* above its first block. Section titles are bold. A /quota report's provider sections come
|
|
240
|
+
* first; when their rows fit the dialog's tables (see layoutQuotaTables), the tables take
|
|
241
|
+
* their place. The dialog shows the heading's subtitle under its own title, so the heading
|
|
242
|
+
* line is left out.
|
|
243
|
+
*/
|
|
244
|
+
function ReportDocumentView(props) {
|
|
245
|
+
const sections = renderableSections(props.document);
|
|
246
|
+
const blocks = sections.flatMap(quotaBlocks);
|
|
247
|
+
// Read in the JSX, so the tables are laid out again when the terminal is resized.
|
|
248
|
+
const tables = () => (blocks.length > 0 ? layoutQuotaTables(blocks, props.width) : undefined);
|
|
249
|
+
return (<box flexDirection="column" gap={1}>
|
|
250
|
+
{[
|
|
251
|
+
...(tables() ?? []).map((table) => <QuotaTableView table={table} theme={props.theme}/>),
|
|
252
|
+
...sections
|
|
253
|
+
.filter((section) => !tables() || !section.blocks.some((block) => block.kind === "quota"))
|
|
254
|
+
.map((section) => (<box flexDirection="column">
|
|
255
|
+
{section.title ? (<text attributes={TextAttributes.BOLD} fg={props.theme.text.base}>
|
|
256
|
+
{sanitizeDisplayText(section.title)}
|
|
257
|
+
</text>) : null}
|
|
258
|
+
<box flexDirection="column" gap={1}>
|
|
259
|
+
{section.blocks.map((block) => (<ReportBlockView block={block} theme={props.theme} width={props.width}/>))}
|
|
260
|
+
</box>
|
|
261
|
+
</box>)),
|
|
262
|
+
]}
|
|
263
|
+
</box>);
|
|
264
|
+
}
|
|
152
265
|
/**
|
|
153
266
|
* Shows command output like OpenCode's alert dialog, but inside a scrollbox so long
|
|
154
267
|
* reports (/quota_status, /tokens_*) stay reachable. The mouse wheel scrolls the box;
|
|
@@ -158,9 +271,15 @@ function reportFailure(error) {
|
|
|
158
271
|
function QuotaOutputDialog(props) {
|
|
159
272
|
const theme = () => props.context.theme.surface("dialog");
|
|
160
273
|
const dimensions = useTerminalDimensions();
|
|
274
|
+
// OpenCode's dialog is its size's width, at most the terminal width minus 2. Inside it
|
|
275
|
+
// come this box's paddings (2 + 2) and one column for the scrollbox's scrollbar, which
|
|
276
|
+
// shows when the report is taller than the box.
|
|
277
|
+
const tableWidth = () => Math.min(DIALOG_WIDTHS[props.size], dimensions().width - 2) - 4 - 1;
|
|
278
|
+
const subtitle = props.document.heading?.subtitle;
|
|
161
279
|
// The host dialog starts a quarter of the way down the terminal. The remaining
|
|
162
|
-
// 8 rows cover the title, ok button, paddings, gaps, and one spare row
|
|
163
|
-
|
|
280
|
+
// 8 rows cover the title, ok button, paddings, gaps, and one spare row; the subtitle
|
|
281
|
+
// takes one more.
|
|
282
|
+
const maxHeight = () => Math.max(1, Math.floor(dimensions().height * 0.75) - 8 - (subtitle ? 1 : 0));
|
|
164
283
|
let scroll;
|
|
165
284
|
const close = () => props.context.ui.dialog.clear();
|
|
166
285
|
props.context.keymap.layer(() => ({
|
|
@@ -191,19 +310,22 @@ function QuotaOutputDialog(props) {
|
|
|
191
310
|
],
|
|
192
311
|
}));
|
|
193
312
|
return (<box paddingLeft={2} paddingRight={2} gap={1}>
|
|
194
|
-
<box
|
|
195
|
-
<
|
|
196
|
-
{
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
313
|
+
<box>
|
|
314
|
+
<box flexDirection="row" justifyContent="space-between">
|
|
315
|
+
<text attributes={TextAttributes.BOLD} fg={theme().text.base}>
|
|
316
|
+
{props.title}
|
|
317
|
+
</text>
|
|
318
|
+
<text fg={theme().text.muted} onMouseUp={close}>
|
|
319
|
+
esc
|
|
320
|
+
</text>
|
|
321
|
+
</box>
|
|
322
|
+
{subtitle ? <text fg={theme().text.muted}>{sanitizeDisplayText(subtitle)}</text> : null}
|
|
201
323
|
</box>
|
|
202
324
|
<box paddingBottom={1}>
|
|
203
325
|
<scrollbox ref={(element) => {
|
|
204
326
|
scroll = element;
|
|
205
327
|
}} maxHeight={maxHeight()}>
|
|
206
|
-
<
|
|
328
|
+
<ReportDocumentView document={props.document} theme={theme()} width={tableWidth()}/>
|
|
207
329
|
</scrollbox>
|
|
208
330
|
</box>
|
|
209
331
|
<box flexDirection="row" justifyContent="flex-end" paddingBottom={1}>
|
|
@@ -215,7 +337,7 @@ function QuotaOutputDialog(props) {
|
|
|
215
337
|
}
|
|
216
338
|
function showQuotaOutputDialog(context, output) {
|
|
217
339
|
return new Promise((resolve) => {
|
|
218
|
-
context.ui.dialog.show(() => <QuotaOutputDialog context={context} title={output.title}
|
|
340
|
+
context.ui.dialog.show(() => (<QuotaOutputDialog context={context} title={output.title} document={output.document} size={output.dialogSize}/>), resolve);
|
|
219
341
|
context.ui.dialog.set({ size: output.dialogSize });
|
|
220
342
|
});
|
|
221
343
|
}
|
|
@@ -242,7 +364,7 @@ async function runQuotaCommand(context, command, sessionID, typed) {
|
|
|
242
364
|
return;
|
|
243
365
|
await showQuotaOutputDialog(context, {
|
|
244
366
|
title: result.title,
|
|
245
|
-
|
|
367
|
+
document: result.document,
|
|
246
368
|
dialogSize: result.dialogSize,
|
|
247
369
|
});
|
|
248
370
|
}
|
|
@@ -293,7 +415,7 @@ async function showPostedQuotaReport(context, event) {
|
|
|
293
415
|
});
|
|
294
416
|
void showQuotaOutputDialog(context, {
|
|
295
417
|
title: report.title,
|
|
296
|
-
|
|
418
|
+
document: report.document,
|
|
297
419
|
dialogSize: spec.dialogSize,
|
|
298
420
|
});
|
|
299
421
|
}
|
|
@@ -379,20 +501,24 @@ function SidebarQuotaView(props) {
|
|
|
379
501
|
return (<box flexDirection="column">
|
|
380
502
|
<box flexDirection="row" gap={1} onMouseDown={() => expandable() && setOpen((value) => !value)}>
|
|
381
503
|
<Show when={expandable()}>
|
|
382
|
-
<text fg={
|
|
504
|
+
<text fg={props.context.theme.text.base}>{open() ? "▼" : "▶"}</text>
|
|
383
505
|
</Show>
|
|
384
|
-
<text fg={
|
|
506
|
+
<text fg={props.context.theme.text.base}>
|
|
385
507
|
<b>Quota</b>
|
|
386
508
|
<Show when={expandable() && !open() && quota()?.activeProviderCount}>
|
|
387
509
|
{(count) => ` (${count()} active)`}
|
|
388
510
|
</Show>
|
|
389
511
|
</text>
|
|
390
512
|
</box>
|
|
391
|
-
<Show when={quota()} fallback={<text fg={
|
|
513
|
+
<Show when={quota()} fallback={<text fg={props.context.theme.text.muted}>No quota data available</text>}>
|
|
392
514
|
<Show when={!expandable() || open()}>
|
|
393
|
-
{lines().map((line) =>
|
|
394
|
-
|
|
395
|
-
|
|
515
|
+
{lines().map((line) =>
|
|
516
|
+
// Provider headers such as "[Copilot] (individual)" are bold, like section titles.
|
|
517
|
+
line.startsWith("[") ? (<text fg={props.context.theme.text.base} wrapMode="none">
|
|
518
|
+
<b>{line}</b>
|
|
519
|
+
</text>) : (<text fg={props.context.theme.text.muted} wrapMode="none">
|
|
520
|
+
{line || " "}
|
|
521
|
+
</text>))}
|
|
396
522
|
</Show>
|
|
397
523
|
</Show>
|
|
398
524
|
</box>);
|