@codexhost/cli-darwin-x64 0.6.0 → 0.6.2
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 +1 -1
- package/app/codexhost-distribution.json +1 -1
- package/app/desktop-controller.mjs +2 -1
- package/app/host-runtime.mjs +628 -260
- package/app/plugins/antigravity/plugin.mjs +15 -8
- package/app/plugins/claude-code/plugin.mjs +661 -219
- package/app/plugins/deepseek-harness/plugin.mjs +7277 -10029
- package/app/plugins/enabled.json +2 -1
- package/app/plugins/grok/plugin.mjs +932 -75
- package/app/plugins/kiro-cli/assets/icon.svg +5 -0
- package/app/plugins/kiro-cli/manifest.json +12 -0
- package/app/plugins/kiro-cli/plugin.mjs +23339 -0
- package/app/plugins/omp/plugin.mjs +11 -1
- package/app/plugins/opencode/plugin.mjs +297 -143
- package/app/plugins/pi/plugin.mjs +1489 -1300
- package/app/renderer-extension.js +715 -377
- package/bin/codexhost +0 -0
- package/libexec/codexhost-shim +0 -0
- package/libexec/codexhost-updater +0 -0
- package/package.json +1 -1
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"opencode",
|
|
16
16
|
"grok",
|
|
17
17
|
"omp",
|
|
18
|
-
"antigravity"
|
|
18
|
+
"antigravity",
|
|
19
|
+
"kiro-cli"
|
|
19
20
|
];
|
|
20
21
|
var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
|
|
21
22
|
function defaultIdFactory(sequence) {
|
|
@@ -131,6 +132,7 @@
|
|
|
131
132
|
if (agent === "grok" && model) state.grokModel = model;
|
|
132
133
|
if (agent === "omp" && model) state.ompModel = model;
|
|
133
134
|
if (agent === "antigravity" && model) state.antigravityModel = model;
|
|
135
|
+
if (agent === "kiro-cli" && model) state.kiroCliModel = model;
|
|
134
136
|
if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
|
|
135
137
|
else if (agent === "pi") delete state.piThinkingOptionId;
|
|
136
138
|
if (agent === "claude-code" && thinkingOptionId) {
|
|
@@ -146,6 +148,9 @@
|
|
|
146
148
|
if (agent === "antigravity" && thinkingOptionId) {
|
|
147
149
|
state.antigravityThinkingOptionId = thinkingOptionId;
|
|
148
150
|
} else if (agent === "antigravity") delete state.antigravityThinkingOptionId;
|
|
151
|
+
if (agent === "kiro-cli" && thinkingOptionId) {
|
|
152
|
+
state.kiroCliThinkingOptionId = thinkingOptionId;
|
|
153
|
+
} else if (agent === "kiro-cli") delete state.kiroCliThinkingOptionId;
|
|
149
154
|
if (agent !== "codex") {
|
|
150
155
|
const permissionModeByAgent = {};
|
|
151
156
|
for (const candidate of [
|
|
@@ -155,7 +160,8 @@
|
|
|
155
160
|
"opencode",
|
|
156
161
|
"grok",
|
|
157
162
|
"omp",
|
|
158
|
-
"antigravity"
|
|
163
|
+
"antigravity",
|
|
164
|
+
"kiro-cli"
|
|
159
165
|
]) {
|
|
160
166
|
const current = state.permissionModeByAgent?.[candidate];
|
|
161
167
|
if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
|
|
@@ -177,7 +183,9 @@
|
|
|
177
183
|
if (agent === "opencode") return state.openCodeModel;
|
|
178
184
|
if (agent === "grok") return state.grokModel;
|
|
179
185
|
if (agent === "omp") return state.ompModel;
|
|
180
|
-
return state.antigravityModel;
|
|
186
|
+
if (agent === "antigravity") return state.antigravityModel;
|
|
187
|
+
if (agent === "kiro-cli") return state.kiroCliModel;
|
|
188
|
+
return void 0;
|
|
181
189
|
}
|
|
182
190
|
thinkingOptionForAgent(composer, agent) {
|
|
183
191
|
const state = this.#state(composer);
|
|
@@ -186,7 +194,9 @@
|
|
|
186
194
|
if (agent === "grok") return state.grokThinkingOptionId;
|
|
187
195
|
if (agent === "opencode") return state.openCodeThinkingOptionId;
|
|
188
196
|
if (agent === "omp") return state.ompThinkingOptionId;
|
|
189
|
-
|
|
197
|
+
if (agent === "antigravity") return state.antigravityThinkingOptionId;
|
|
198
|
+
if (agent === "kiro-cli") return state.kiroCliThinkingOptionId;
|
|
199
|
+
return void 0;
|
|
190
200
|
}
|
|
191
201
|
permissionModeForAgent(composer, agent) {
|
|
192
202
|
return this.#state(composer).permissionModeByAgent?.[agent];
|
|
@@ -207,7 +217,8 @@
|
|
|
207
217
|
else if (agent === "opencode") state.openCodeModel = model;
|
|
208
218
|
else if (agent === "grok") state.grokModel = model;
|
|
209
219
|
else if (agent === "omp") state.ompModel = model;
|
|
210
|
-
else state.antigravityModel = model;
|
|
220
|
+
else if (agent === "antigravity") state.antigravityModel = model;
|
|
221
|
+
else if (agent === "kiro-cli") state.kiroCliModel = model;
|
|
211
222
|
return state;
|
|
212
223
|
}
|
|
213
224
|
setPiConfiguration(composer, model, thinkingOptionId) {
|
|
@@ -244,6 +255,10 @@
|
|
|
244
255
|
state.antigravityThinkingOptionId = thinkingOptionId;
|
|
245
256
|
} else if (agent === "antigravity") {
|
|
246
257
|
delete state.antigravityThinkingOptionId;
|
|
258
|
+
} else if (agent === "kiro-cli" && thinkingOptionId) {
|
|
259
|
+
state.kiroCliThinkingOptionId = thinkingOptionId;
|
|
260
|
+
} else if (agent === "kiro-cli") {
|
|
261
|
+
delete state.kiroCliThinkingOptionId;
|
|
247
262
|
}
|
|
248
263
|
return state;
|
|
249
264
|
}
|
|
@@ -14876,6 +14891,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14876
14891
|
reasoningOutputTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
14877
14892
|
totalTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
14878
14893
|
totalCostUsd: finiteNonNegativeNumberSchema.optional(),
|
|
14894
|
+
totalCredits: finiteNonNegativeNumberSchema.optional(),
|
|
14895
|
+
contextUsagePercent: finiteNonNegativeNumberSchema.optional(),
|
|
14879
14896
|
cacheHitRatePercent: cacheHitRatePercentSchema.optional(),
|
|
14880
14897
|
contextWindowTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
14881
14898
|
contextUsedTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
@@ -15362,12 +15379,36 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15362
15379
|
});
|
|
15363
15380
|
|
|
15364
15381
|
// ../shared-contracts/dist/harness-route.js
|
|
15382
|
+
var HARNESS_PLUGIN_ROUTE_PREFIX = "codexhost/plugin-v1@";
|
|
15383
|
+
var MAX_ROUTE_LENGTH = 4096;
|
|
15365
15384
|
var harnessPluginRouteSchema = external_exports.object({
|
|
15366
15385
|
harnessId: harnessPluginIdSchema,
|
|
15367
15386
|
model: harnessModelRefSchema.optional(),
|
|
15368
15387
|
thinkingOptionId: harnessThinkingOptionIdSchema.optional(),
|
|
15369
15388
|
permissionModeId: harnessPermissionModeIdSchema.optional()
|
|
15370
15389
|
}).strict();
|
|
15390
|
+
function encodeHarnessPluginRoute(route) {
|
|
15391
|
+
const parsed = harnessPluginRouteSchema.parse(route);
|
|
15392
|
+
const payload = [...JSON.stringify(parsed)].map((character) => character.charCodeAt(0).toString(16).padStart(2, "0")).join("");
|
|
15393
|
+
return `${HARNESS_PLUGIN_ROUTE_PREFIX}${payload}`;
|
|
15394
|
+
}
|
|
15395
|
+
function decodeHarnessPluginRoute(value) {
|
|
15396
|
+
if (typeof value !== "string" || !value.startsWith(HARNESS_PLUGIN_ROUTE_PREFIX))
|
|
15397
|
+
return null;
|
|
15398
|
+
const payload = value.slice(HARNESS_PLUGIN_ROUTE_PREFIX.length);
|
|
15399
|
+
if (value.length > MAX_ROUTE_LENGTH || !/^(?:[a-f0-9]{2})+$/u.test(payload)) {
|
|
15400
|
+
throw new Error("Invalid Harness plugin route");
|
|
15401
|
+
}
|
|
15402
|
+
try {
|
|
15403
|
+
const json2 = payload.replace(/[a-f0-9]{2}/gu, (byte) => String.fromCharCode(Number.parseInt(byte, 16)));
|
|
15404
|
+
const decoded = harnessPluginRouteSchema.parse(JSON.parse(json2));
|
|
15405
|
+
if (encodeHarnessPluginRoute(decoded) !== value)
|
|
15406
|
+
throw new Error("Noncanonical Harness plugin route");
|
|
15407
|
+
return decoded;
|
|
15408
|
+
} catch {
|
|
15409
|
+
throw new Error("Invalid Harness plugin route");
|
|
15410
|
+
}
|
|
15411
|
+
}
|
|
15371
15412
|
|
|
15372
15413
|
// ../shared-contracts/dist/codex-accounts.js
|
|
15373
15414
|
var accountIdSchema = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._~-]+$/u);
|
|
@@ -15443,6 +15484,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15443
15484
|
accountCredits: accountCreditsSnapshotSchema.optional()
|
|
15444
15485
|
}).strict();
|
|
15445
15486
|
|
|
15487
|
+
// ../shared-contracts/dist/reasoning-transcript.js
|
|
15488
|
+
var REASONING_TRANSCRIPT_COMMAND = "thinking";
|
|
15489
|
+
|
|
15446
15490
|
// ../shared-contracts/dist/harness-session-import.js
|
|
15447
15491
|
var HARNESS_SESSION_IMPORT_ID_MAX_LENGTH = 1024;
|
|
15448
15492
|
var HARNESS_SESSION_IMPORT_CWD_MAX_LENGTH = 16384;
|
|
@@ -15794,6 +15838,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15794
15838
|
// src/assets/antigravity-agent.svg
|
|
15795
15839
|
var antigravity_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -1 28 28"><path d="M21.751 22.607c1.34 1.005 3.35.335 1.508-1.508C17.73 15.74 18.904 1 12.037 1 5.17 1 6.342 15.74.815 21.1c-2.01 2.009.167 2.511 1.507 1.506 5.192-3.517 4.857-9.714 9.715-9.714 4.857 0 4.522 6.197 9.714 9.715z" fill="url(%23ag)"/><defs><linearGradient id="ag" x1="2" y1="12" x2="22" y2="12" gradientUnits="userSpaceOnUse"><stop stop-color="%234285F4"/><stop offset=".33" stop-color="%23EA4335"/><stop offset=".66" stop-color="%23FBBC04"/><stop offset="1" stop-color="%2334A853"/></linearGradient></defs></svg>%0A';
|
|
15796
15840
|
|
|
15841
|
+
// src/assets/kiro-agent.svg
|
|
15842
|
+
var kiro_agent_default = 'data:image/svg+xml,<svg width="1200" height="1200" viewBox="0 0 1200 1200" fill="none" xmlns="http://www.w3.org/2000/svg">%0A<rect width="1200" height="1200" rx="260" fill="%239046FF"/>%0A<mask id="mask0_1106_4856" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="272" y="202" width="655" height="796">%0A<path d="M926.578 202.793H272.637V997.857H926.578V202.793Z" fill="white"/>%0A</mask>%0A<g mask="url(%23mask0_1106_4856)">%0A<path d="M398.554 818.914C316.315 1001.03 491.477 1046.74 620.672 940.156C658.687 1059.66 801.052 970.473 852.234 877.795C964.787 673.567 919.318 465.357 907.64 422.374C827.637 129.443 427.623 128.946 358.8 423.865C342.651 475.544 342.402 534.18 333.458 595.051C328.986 625.86 325.507 645.488 313.83 677.785C306.873 696.424 297.68 712.819 282.773 740.645C259.915 783.881 269.604 867.113 387.87 823.883L399.051 818.914H398.554Z" fill="white"/>%0A<path d="M636.123 549.353C603.328 549.353 598.359 510.097 598.359 486.742C598.359 465.623 602.086 448.977 609.293 438.293C615.504 428.852 624.697 424.131 636.123 424.131C647.555 424.131 657.492 428.852 664.447 438.541C672.398 449.474 676.623 466.12 676.623 486.742C676.623 525.998 661.471 549.353 636.375 549.353H636.123Z" fill="black"/>%0A<path d="M771.24 549.353C738.445 549.353 733.477 510.097 733.477 486.742C733.477 465.623 737.203 448.977 744.41 438.293C750.621 428.852 759.814 424.131 771.24 424.131C782.672 424.131 792.609 428.852 799.564 438.541C807.516 449.474 811.74 466.12 811.74 486.742C811.74 525.998 796.588 549.353 771.492 549.353H771.24Z" fill="black"/>%0A</g>%0A</svg>%0A';
|
|
15843
|
+
|
|
15797
15844
|
// src/assets/omp-agent.svg
|
|
15798
15845
|
var omp_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">%0A <defs>%0A <linearGradient id="omp-gradient" x1="0" y1="0" x2="1" y2="1">%0A <stop offset="0" stop-color="%23ed4abf" />%0A <stop offset=".5" stop-color="%239b4dff" />%0A <stop offset="1" stop-color="%235ad8e6" />%0A </linearGradient>%0A </defs>%0A <path%0A fill="url(%23omp-gradient)"%0A transform="translate(-14.4 -20.2) scale(1.45)"%0A d="M14 16h36v8H40v32h-8V24h-6v22h-8V24h-4z"%0A />%0A</svg>%0A';
|
|
15799
15846
|
|
|
@@ -15809,7 +15856,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15809
15856
|
opencode: "OpenCode",
|
|
15810
15857
|
grok: "Grok",
|
|
15811
15858
|
omp: "Oh My Pi",
|
|
15812
|
-
antigravity: "Antigravity CLI"
|
|
15859
|
+
antigravity: "Antigravity CLI",
|
|
15860
|
+
"kiro-cli": "Kiro CLI"
|
|
15813
15861
|
};
|
|
15814
15862
|
var PI_PATHS = [
|
|
15815
15863
|
{
|
|
@@ -15832,6 +15880,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15832
15880
|
const path = ownerDocument.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
15833
15881
|
path.setAttribute("d", definition.d);
|
|
15834
15882
|
if (definition.fillRule) path.setAttribute("fill-rule", definition.fillRule);
|
|
15883
|
+
if (definition.fill) path.setAttribute("fill", definition.fill);
|
|
15835
15884
|
svg.append(path);
|
|
15836
15885
|
}
|
|
15837
15886
|
return svg;
|
|
@@ -15884,9 +15933,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15884
15933
|
image.style.flex = "none";
|
|
15885
15934
|
return image;
|
|
15886
15935
|
}
|
|
15887
|
-
if (agent === "antigravity") {
|
|
15936
|
+
if (agent === "antigravity" || agent === "kiro-cli") {
|
|
15888
15937
|
const image = ownerDocument.createElement("img");
|
|
15889
|
-
image.src = antigravity_agent_default;
|
|
15938
|
+
image.src = agent === "kiro-cli" ? kiro_agent_default : antigravity_agent_default;
|
|
15890
15939
|
image.alt = "";
|
|
15891
15940
|
image.draggable = false;
|
|
15892
15941
|
image.style.width = `${size}px`;
|
|
@@ -16245,6 +16294,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16245
16294
|
["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }]
|
|
16246
16295
|
];
|
|
16247
16296
|
|
|
16297
|
+
// ../../node_modules/lucide/dist/esm/icons/ellipsis.mjs
|
|
16298
|
+
var Ellipsis = [
|
|
16299
|
+
["circle", { cx: "12", cy: "12", r: "1" }],
|
|
16300
|
+
["circle", { cx: "19", cy: "12", r: "1" }],
|
|
16301
|
+
["circle", { cx: "5", cy: "12", r: "1" }]
|
|
16302
|
+
];
|
|
16303
|
+
|
|
16248
16304
|
// ../../node_modules/lucide/dist/esm/icons/folder-input.mjs
|
|
16249
16305
|
var FolderInput = [
|
|
16250
16306
|
[
|
|
@@ -16458,7 +16514,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16458
16514
|
"trash",
|
|
16459
16515
|
"terminal",
|
|
16460
16516
|
"search",
|
|
16461
|
-
"help"
|
|
16517
|
+
"help",
|
|
16518
|
+
"ellipsis"
|
|
16462
16519
|
];
|
|
16463
16520
|
var iconNodes = {
|
|
16464
16521
|
settings: Settings,
|
|
@@ -16493,7 +16550,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16493
16550
|
trash: Trash2,
|
|
16494
16551
|
terminal: Terminal,
|
|
16495
16552
|
search: Search,
|
|
16496
|
-
help: CircleQuestionMark
|
|
16553
|
+
help: CircleQuestionMark,
|
|
16554
|
+
ellipsis: Ellipsis
|
|
16497
16555
|
};
|
|
16498
16556
|
function isRendererSettingsIconName(value) {
|
|
16499
16557
|
return RENDERER_SETTINGS_ICON_NAMES.includes(value);
|
|
@@ -16532,7 +16590,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16532
16590
|
opencode: "https://opencode.ai/docs/",
|
|
16533
16591
|
grok: "https://grok.com/",
|
|
16534
16592
|
omp: "https://github.com/can1357/oh-my-pi",
|
|
16535
|
-
antigravity: "https://antigravity.google/product/antigravity-cli"
|
|
16593
|
+
antigravity: "https://antigravity.google/product/antigravity-cli",
|
|
16594
|
+
"kiro-cli": "https://kiro.dev/docs/cli/"
|
|
16536
16595
|
});
|
|
16537
16596
|
function connectionStatusLabel(availability, messages, hasError = false) {
|
|
16538
16597
|
if (hasError && availability !== "notInstalled") return messages.connectionStatusError;
|
|
@@ -17310,6 +17369,9 @@ ${error51.stderrTail}`] : []
|
|
|
17310
17369
|
sectionsLabel: "Settings sections",
|
|
17311
17370
|
generalSection: "General",
|
|
17312
17371
|
otherSection: "Other",
|
|
17372
|
+
appearanceDescription: "Adjust how thinking text is displayed in the conversation.",
|
|
17373
|
+
reasoningSoftWrapTitle: "Wrap thinking text",
|
|
17374
|
+
reasoningSoftWrapDescription: "Wrap long thinking lines in the transcript. Ordinary shell output is unaffected. Off by default.",
|
|
17313
17375
|
pageUnavailable: "Page unavailable",
|
|
17314
17376
|
inDevelopment: "In development",
|
|
17315
17377
|
notAvailable: "Not available",
|
|
@@ -17346,26 +17408,26 @@ ${error51.stderrTail}`] : []
|
|
|
17346
17408
|
sessionImportRetryOpen: "Try opening again",
|
|
17347
17409
|
sessionImportRetrying: "Opening...",
|
|
17348
17410
|
connectionsDescription: "View runtime status by Host. Select an item to inspect details or complete its setup.",
|
|
17349
|
-
accountsDescription: "
|
|
17350
|
-
|
|
17351
|
-
|
|
17352
|
-
|
|
17353
|
-
accountAdd: "Add Account",
|
|
17411
|
+
accountsDescription: "View accounts and limits across Agents, and manage your Codex default account.",
|
|
17412
|
+
accountConnected: "Accounts",
|
|
17413
|
+
accountDefaultBadge: "Codex default",
|
|
17414
|
+
accountAdd: "Add Codex account",
|
|
17354
17415
|
accountColumnAccount: "Account",
|
|
17355
|
-
|
|
17356
|
-
|
|
17357
|
-
|
|
17358
|
-
accountEmpty: "No accounts yet. Add an account to get started.",
|
|
17416
|
+
accountColumnActions: "Manage",
|
|
17417
|
+
accountSearch: "Search accounts or Agents\u2026",
|
|
17418
|
+
accountEmpty: "No accounts yet. Add a Codex account or sign in to an Agent in its native client.",
|
|
17359
17419
|
accountNoMatches: "No matching accounts.",
|
|
17360
|
-
|
|
17361
|
-
|
|
17420
|
+
accountNativeManaged: "Native management",
|
|
17421
|
+
accountNativeManagementHint: "This account comes from {harness}'s native authentication. This page only displays identity and limits; manage sign-in, sign-out and switching in the native client.",
|
|
17422
|
+
accountMore: "Codex account actions",
|
|
17423
|
+
accountDetailsClose: "Close account details",
|
|
17424
|
+
accountDefaultHint: "Use as the default for new Codex tasks only",
|
|
17362
17425
|
accountCreditsRemaining: "Remaining",
|
|
17363
17426
|
accountCreditsLoading: "Loading limits\u2026",
|
|
17364
17427
|
accountCreditsEmpty: "No limit data available",
|
|
17365
17428
|
accountCreditsFailed: "Could not load limits",
|
|
17366
17429
|
accountCreditsRetry: "Retry",
|
|
17367
17430
|
accountCreditsRefresh: "Refresh limits",
|
|
17368
|
-
accountResetCreditsUnknown: "No reset card data available",
|
|
17369
17431
|
accountCreateFailed: "Could not add the Account.",
|
|
17370
17432
|
accountDelete: "Delete",
|
|
17371
17433
|
accountDeleteConfirm: "Delete this Account and its local data? This cannot be undone.",
|
|
@@ -17375,7 +17437,6 @@ ${error51.stderrTail}`] : []
|
|
|
17375
17437
|
accountUse: "Set as default",
|
|
17376
17438
|
accountSignIn: "Sign in",
|
|
17377
17439
|
accountSigningIn: "Starting device sign-in...",
|
|
17378
|
-
accountDeviceCodePrerequisite: "Before signing in, enable \u201CEnable device code authorization for Codex\u201D in Web Settings \u2192 Account security & sign-in.",
|
|
17379
17440
|
accountVerificationDescription: "Open the verification page and enter this one-time code:",
|
|
17380
17441
|
accountCopyCode: "Copy code",
|
|
17381
17442
|
accountCopied: "Copied",
|
|
@@ -17384,7 +17445,10 @@ ${error51.stderrTail}`] : []
|
|
|
17384
17445
|
accountLoginFailed: "Sign-in failed.",
|
|
17385
17446
|
accountLoadFailed: "Could not load Codex Accounts.",
|
|
17386
17447
|
accountCreditsUsed: "Used",
|
|
17387
|
-
|
|
17448
|
+
accountCreditsResetAt: "Quota resets: {time}",
|
|
17449
|
+
accountCreditsResetIn: "Quota resets in {time}",
|
|
17450
|
+
accountCreditsResetPending: "Awaiting refresh",
|
|
17451
|
+
accountCreditsResetPendingHint: "The reset time has passed; refresh to check the actual quota.",
|
|
17388
17452
|
accountCreditsPeriodWeekly: "Weekly limit",
|
|
17389
17453
|
accountCreditsPeriodMonthly: "Monthly limit",
|
|
17390
17454
|
accountCreditsPeriodFiveHour: "5-hour",
|
|
@@ -17500,6 +17564,7 @@ ${error51.stderrTail}`] : []
|
|
|
17500
17564
|
aboutRepository: "Open-source repository",
|
|
17501
17565
|
pageLabels: Object.freeze({
|
|
17502
17566
|
connections: "Connections",
|
|
17567
|
+
appearance: "Appearance",
|
|
17503
17568
|
accounts: "Accounts",
|
|
17504
17569
|
"session-import": "Session Import",
|
|
17505
17570
|
updates: "Updates",
|
|
@@ -17514,6 +17579,9 @@ ${error51.stderrTail}`] : []
|
|
|
17514
17579
|
sectionsLabel: "\u8BBE\u7F6E\u5206\u7C7B",
|
|
17515
17580
|
generalSection: "\u901A\u7528",
|
|
17516
17581
|
otherSection: "\u5176\u4ED6",
|
|
17582
|
+
appearanceDescription: "\u8C03\u6574\u4F1A\u8BDD\u4E2D\u601D\u8003\u6587\u672C\u7684\u663E\u793A\u65B9\u5F0F\u3002",
|
|
17583
|
+
reasoningSoftWrapTitle: "\u6362\u884C\u663E\u793A\u601D\u8003\u6587\u672C",
|
|
17584
|
+
reasoningSoftWrapDescription: "\u8BA9\u601D\u8003\u5757\u4E2D\u7684\u957F\u884C\u81EA\u52A8\u6362\u884C\u3002\u666E\u901A Shell \u8F93\u51FA\u4E0D\u53D7\u5F71\u54CD\u3002\u9ED8\u8BA4\u5173\u95ED\u3002",
|
|
17517
17585
|
pageUnavailable: "\u9875\u9762\u4E0D\u53EF\u7528",
|
|
17518
17586
|
inDevelopment: "\u5F00\u53D1\u4E2D",
|
|
17519
17587
|
notAvailable: "\u6682\u4E0D\u53EF\u7528",
|
|
@@ -17550,26 +17618,26 @@ ${error51.stderrTail}`] : []
|
|
|
17550
17618
|
sessionImportRetryOpen: "\u91CD\u8BD5\u6253\u5F00",
|
|
17551
17619
|
sessionImportRetrying: "\u6B63\u5728\u6253\u5F00\u2026\u2026",
|
|
17552
17620
|
connectionsDescription: "\u6309 Host \u67E5\u770B\u8FD0\u884C\u65F6\u72B6\u6001\u3002\u9009\u62E9\u4E00\u9879\uFF0C\u5728\u53F3\u4FA7\u68C0\u67E5\u8BE6\u60C5\u6216\u5B8C\u6210\u914D\u7F6E\u3002",
|
|
17553
|
-
accountsDescription: "\
|
|
17554
|
-
|
|
17555
|
-
|
|
17556
|
-
|
|
17557
|
-
accountAdd: "\u6DFB\u52A0\u8D26\u53F7",
|
|
17621
|
+
accountsDescription: "\u67E5\u770B\u5404 Agent \u7684\u8D26\u53F7\u4E0E\u989D\u5EA6\uFF0C\u7BA1\u7406 Codex \u9ED8\u8BA4\u8D26\u53F7\u3002",
|
|
17622
|
+
accountConnected: "\u8D26\u53F7",
|
|
17623
|
+
accountDefaultBadge: "Codex \u9ED8\u8BA4",
|
|
17624
|
+
accountAdd: "\u6DFB\u52A0 Codex \u8D26\u53F7",
|
|
17558
17625
|
accountColumnAccount: "\u8D26\u53F7",
|
|
17559
|
-
|
|
17560
|
-
|
|
17561
|
-
|
|
17562
|
-
accountEmpty: "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF0C\u6DFB\u52A0\u4E00\u4E2A\u8D26\u53F7\u5373\u53EF\u5F00\u59CB\u3002",
|
|
17626
|
+
accountColumnActions: "\u7BA1\u7406",
|
|
17627
|
+
accountSearch: "\u641C\u7D22\u8D26\u53F7\u6216 Agent\u2026",
|
|
17628
|
+
accountEmpty: "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF0C\u53EF\u6DFB\u52A0 Codex \u8D26\u53F7\u6216\u5728\u5176\u4ED6 Agent \u7684\u539F\u751F\u5BA2\u6237\u7AEF\u767B\u5F55\u3002",
|
|
17563
17629
|
accountNoMatches: "\u6CA1\u6709\u5339\u914D\u7684\u8D26\u53F7\u3002",
|
|
17564
|
-
|
|
17565
|
-
|
|
17630
|
+
accountNativeManaged: "\u539F\u751F\u7BA1\u7406",
|
|
17631
|
+
accountNativeManagementHint: "\u6B64\u8D26\u53F7\u6765\u81EA {harness} \u7684\u539F\u751F\u767B\u5F55\u3002\u8FD9\u91CC\u53EA\u8BFB\u5C55\u793A\u8EAB\u4EFD\u4E0E\u989D\u5EA6\uFF1B\u767B\u5F55\u3001\u9000\u51FA\u548C\u5207\u6362\u8BF7\u5728\u5176\u539F\u751F\u5BA2\u6237\u7AEF\u4E2D\u5B8C\u6210\u3002",
|
|
17632
|
+
accountMore: "Codex \u8D26\u53F7\u64CD\u4F5C",
|
|
17633
|
+
accountDetailsClose: "\u5173\u95ED\u8D26\u53F7\u8BE6\u60C5",
|
|
17634
|
+
accountDefaultHint: "\u4EC5\u8BBE\u4E3A\u65B0 Codex \u4EFB\u52A1\u7684\u9ED8\u8BA4\u8D26\u53F7",
|
|
17566
17635
|
accountCreditsRemaining: "\u5269\u4F59",
|
|
17567
17636
|
accountCreditsLoading: "\u6B63\u5728\u8BFB\u53D6\u989D\u5EA6\u2026",
|
|
17568
17637
|
accountCreditsEmpty: "\u6682\u65E0\u989D\u5EA6\u6570\u636E",
|
|
17569
17638
|
accountCreditsFailed: "\u989D\u5EA6\u8BFB\u53D6\u5931\u8D25",
|
|
17570
17639
|
accountCreditsRetry: "\u91CD\u8BD5",
|
|
17571
17640
|
accountCreditsRefresh: "\u5237\u65B0\u989D\u5EA6",
|
|
17572
|
-
accountResetCreditsUnknown: "\u6682\u65E0\u91CD\u7F6E\u5361\u6570\u636E",
|
|
17573
17641
|
accountCreateFailed: "\u6DFB\u52A0\u8D26\u53F7\u5931\u8D25\u3002",
|
|
17574
17642
|
accountDelete: "\u5220\u9664",
|
|
17575
17643
|
accountDeleteConfirm: "\u5220\u9664\u6B64\u8D26\u53F7\u53CA\u5176\u672C\u5730\u6570\u636E\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
|
|
@@ -17579,7 +17647,6 @@ ${error51.stderrTail}`] : []
|
|
|
17579
17647
|
accountUse: "\u8BBE\u4E3A\u9ED8\u8BA4",
|
|
17580
17648
|
accountSignIn: "\u767B\u5F55",
|
|
17581
17649
|
accountSigningIn: "\u6B63\u5728\u542F\u52A8\u8BBE\u5907\u767B\u5F55...",
|
|
17582
|
-
accountDeviceCodePrerequisite: "\u767B\u5F55\u524D\uFF0C\u8BF7\u5148\u5728 Web \u7AEF\u7684\u201C\u8BBE\u7F6E \u2192 \u8D26\u53F7\u5B89\u5168\u4E0E\u767B\u5F55\u201D\u4E2D\u5F00\u542F\u201C\u4E3A Codex \u542F\u7528\u8BBE\u5907\u4EE3\u7801\u6388\u6743\u201D\u3002",
|
|
17583
17650
|
accountVerificationDescription: "\u6253\u5F00\u9A8C\u8BC1\u9875\u9762\u5E76\u8F93\u5165\u4EE5\u4E0B\u4E00\u6B21\u6027\u4EE3\u7801\uFF1A",
|
|
17584
17651
|
accountCopyCode: "\u590D\u5236\u4EE3\u7801",
|
|
17585
17652
|
accountCopied: "\u5DF2\u590D\u5236",
|
|
@@ -17588,7 +17655,10 @@ ${error51.stderrTail}`] : []
|
|
|
17588
17655
|
accountLoginFailed: "\u767B\u5F55\u5931\u8D25\u3002",
|
|
17589
17656
|
accountLoadFailed: "\u65E0\u6CD5\u52A0\u8F7D Codex \u8D26\u53F7\u3002",
|
|
17590
17657
|
accountCreditsUsed: "\u5DF2\u7528",
|
|
17591
|
-
|
|
17658
|
+
accountCreditsResetAt: "\u989D\u5EA6\u91CD\u7F6E\u65F6\u95F4\uFF1A{time}",
|
|
17659
|
+
accountCreditsResetIn: "\u8DDD\u91CD\u7F6E\u8FD8\u6709 {time}",
|
|
17660
|
+
accountCreditsResetPending: "\u5F85\u5237\u65B0",
|
|
17661
|
+
accountCreditsResetPendingHint: "\u91CD\u7F6E\u65F6\u95F4\u5DF2\u5230\uFF0C\u8BF7\u5237\u65B0\u4EE5\u786E\u8BA4\u5B9E\u9645\u989D\u5EA6\u3002",
|
|
17592
17662
|
accountCreditsPeriodWeekly: "\u5468\u989D\u5EA6",
|
|
17593
17663
|
accountCreditsPeriodMonthly: "\u6708\u989D\u5EA6",
|
|
17594
17664
|
accountCreditsPeriodFiveHour: "5 \u5C0F\u65F6",
|
|
@@ -17704,6 +17774,7 @@ ${error51.stderrTail}`] : []
|
|
|
17704
17774
|
aboutRepository: "\u5F00\u6E90\u4ED3\u5E93",
|
|
17705
17775
|
pageLabels: Object.freeze({
|
|
17706
17776
|
connections: "\u8FDE\u63A5",
|
|
17777
|
+
appearance: "\u5916\u89C2",
|
|
17707
17778
|
accounts: "\u8D26\u53F7",
|
|
17708
17779
|
"session-import": "\u4F1A\u8BDD\u5BFC\u5165",
|
|
17709
17780
|
updates: "\u66F4\u65B0",
|
|
@@ -17755,7 +17826,8 @@ ${error51.stderrTail}`] : []
|
|
|
17755
17826
|
opencode: "https://opencode.ai/docs/",
|
|
17756
17827
|
grok: "https://grok.com/",
|
|
17757
17828
|
omp: "https://github.com/can1357/oh-my-pi",
|
|
17758
|
-
antigravity: "https://antigravity.google/product/antigravity-cli"
|
|
17829
|
+
antigravity: "https://antigravity.google/product/antigravity-cli",
|
|
17830
|
+
"kiro-cli": "https://kiro.dev/docs/cli/"
|
|
17759
17831
|
};
|
|
17760
17832
|
var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
|
|
17761
17833
|
var AGENT_MENU_WIDTH = 224;
|
|
@@ -19393,7 +19465,9 @@ ${error51.stderrTail}`] : []
|
|
|
19393
19465
|
// src/renderer-usage-control.ts
|
|
19394
19466
|
var ENGLISH_USAGE_MESSAGES = Object.freeze({
|
|
19395
19467
|
usage: "Usage",
|
|
19468
|
+
account: "Account",
|
|
19396
19469
|
context: "Context",
|
|
19470
|
+
recordedCredits: "Recorded usage",
|
|
19397
19471
|
latestCacheHit: "Latest cache hit",
|
|
19398
19472
|
outputSpeed: "Output speed",
|
|
19399
19473
|
cacheRead: "Cache read",
|
|
@@ -19401,19 +19475,17 @@ ${error51.stderrTail}`] : []
|
|
|
19401
19475
|
reasoning: "Reasoning",
|
|
19402
19476
|
totalTokens: "Total tokens",
|
|
19403
19477
|
inputOutput: "Input / output",
|
|
19404
|
-
fiveHourLimit: "5-hour limit",
|
|
19405
|
-
sevenDayLimit: "7-day limit",
|
|
19406
19478
|
sessionCostEstimate: "Session cost estimate",
|
|
19407
19479
|
threadUsage: "Thread Usage",
|
|
19408
19480
|
threadUsageDetails: "Thread Usage details",
|
|
19409
19481
|
tokensSummary: "tokens",
|
|
19410
|
-
tokensPerSecond: "tok/s"
|
|
19411
|
-
fiveHourSummary: "5h",
|
|
19412
|
-
sevenDaySummary: "7d"
|
|
19482
|
+
tokensPerSecond: "tok/s"
|
|
19413
19483
|
});
|
|
19414
19484
|
var CHINESE_USAGE_MESSAGES = Object.freeze({
|
|
19415
19485
|
usage: "\u7528\u91CF",
|
|
19486
|
+
account: "\u8D26\u53F7",
|
|
19416
19487
|
context: "\u4E0A\u4E0B\u6587",
|
|
19488
|
+
recordedCredits: "\u5DF2\u8BB0\u5F55\u6D88\u8017",
|
|
19417
19489
|
latestCacheHit: "\u6700\u8FD1\u7F13\u5B58\u547D\u4E2D\u7387",
|
|
19418
19490
|
outputSpeed: "\u8F93\u51FA\u901F\u5EA6",
|
|
19419
19491
|
cacheRead: "\u7F13\u5B58\u8BFB\u53D6",
|
|
@@ -19421,15 +19493,11 @@ ${error51.stderrTail}`] : []
|
|
|
19421
19493
|
reasoning: "\u63A8\u7406",
|
|
19422
19494
|
totalTokens: "Token \u603B\u6570",
|
|
19423
19495
|
inputOutput: "\u8F93\u5165 / \u8F93\u51FA",
|
|
19424
|
-
fiveHourLimit: "5 \u5C0F\u65F6\u9650\u989D",
|
|
19425
|
-
sevenDayLimit: "7 \u5929\u9650\u989D",
|
|
19426
19496
|
sessionCostEstimate: "\u4F1A\u8BDD\u8D39\u7528\u4F30\u7B97",
|
|
19427
19497
|
threadUsage: "\u5BF9\u8BDD\u7528\u91CF",
|
|
19428
19498
|
threadUsageDetails: "\u5BF9\u8BDD\u7528\u91CF\u8BE6\u60C5",
|
|
19429
19499
|
tokensSummary: "Token",
|
|
19430
|
-
tokensPerSecond: "Token/\u79D2"
|
|
19431
|
-
fiveHourSummary: "5 \u5C0F\u65F6",
|
|
19432
|
-
sevenDaySummary: "7 \u5929"
|
|
19500
|
+
tokensPerSecond: "Token/\u79D2"
|
|
19433
19501
|
});
|
|
19434
19502
|
function rendererUsageMessages(locale) {
|
|
19435
19503
|
return locale === "zh-CN" ? CHINESE_USAGE_MESSAGES : ENGLISH_USAGE_MESSAGES;
|
|
@@ -19443,6 +19511,9 @@ ${error51.stderrTail}`] : []
|
|
|
19443
19511
|
function formatRendererCost(value) {
|
|
19444
19512
|
return `$${value.toFixed(3)}`;
|
|
19445
19513
|
}
|
|
19514
|
+
function formatRendererCredits(value) {
|
|
19515
|
+
return `${value > 0 && value < 1e-3 ? "<0.001" : decimal(value, 3)} credits`;
|
|
19516
|
+
}
|
|
19446
19517
|
function formatRendererTokenRate(value, locale = "en") {
|
|
19447
19518
|
return `${decimal(value, 1)} ${rendererUsageMessages(locale).tokensPerSecond}`;
|
|
19448
19519
|
}
|
|
@@ -19497,27 +19568,11 @@ ${error51.stderrTail}`] : []
|
|
|
19497
19568
|
svg.append(track, fill);
|
|
19498
19569
|
return svg;
|
|
19499
19570
|
}
|
|
19500
|
-
function formatRendererPlanReset(unixSeconds, locale) {
|
|
19501
|
-
const date5 = new Date(unixSeconds * 1e3);
|
|
19502
|
-
if (Number.isNaN(date5.getTime())) return "";
|
|
19503
|
-
return date5.toLocaleString(locale === "zh-CN" ? "zh-CN" : void 0, {
|
|
19504
|
-
month: "long",
|
|
19505
|
-
day: "numeric",
|
|
19506
|
-
hour: "numeric",
|
|
19507
|
-
minute: "2-digit"
|
|
19508
|
-
});
|
|
19509
|
-
}
|
|
19510
|
-
function formatRendererPlanWindow(usedPercent, resetsAtUnix, locale) {
|
|
19511
|
-
const percent = formatRendererCreditsPercent(usedPercent);
|
|
19512
|
-
if (resetsAtUnix === void 0) return percent;
|
|
19513
|
-
const reset = formatRendererPlanReset(resetsAtUnix, locale);
|
|
19514
|
-
return reset.length > 0 ? `${percent} \xB7 ${reset}` : percent;
|
|
19515
|
-
}
|
|
19516
19571
|
function rendererUsageTriggerMaxWidth() {
|
|
19517
19572
|
return "min(180px, 30vw)";
|
|
19518
19573
|
}
|
|
19519
19574
|
function rendererUsageHasDisplayData(usage) {
|
|
19520
|
-
return usage?.cacheHitRatePercent !== void 0 || usage?.outputTokensPerSecond !== void 0 || usage?.totalCostUsd !== void 0 || usage?.
|
|
19575
|
+
return usage?.cacheHitRatePercent !== void 0 || usage?.outputTokensPerSecond !== void 0 || usage?.totalCostUsd !== void 0 || usage?.totalCredits !== void 0 || usage?.contextUsagePercent !== void 0 || usage?.contextUsedTokens !== void 0 && usage.contextWindowTokens !== void 0 || usage?.totalTokens !== void 0 || usage?.inputTokens !== void 0 || usage?.cachedInputTokens !== void 0 || usage?.cacheWriteInputTokens !== void 0 || usage?.outputTokens !== void 0 || usage?.reasoningOutputTokens !== void 0;
|
|
19521
19576
|
}
|
|
19522
19577
|
function applyRendererPopoverChrome(popover) {
|
|
19523
19578
|
popover.style.border = "1px solid light-dark(rgba(15, 23, 42, 0.10), color-mix(in srgb, CanvasText 16%, transparent))";
|
|
@@ -19526,10 +19581,10 @@ ${error51.stderrTail}`] : []
|
|
|
19526
19581
|
popover.style.color = "CanvasText";
|
|
19527
19582
|
popover.style.boxShadow = "light-dark(0 10px 24px rgba(15, 23, 42, 0.12), 0 20px 45px rgba(0, 0, 0, 0.42)), 0 2px 8px light-dark(rgba(15, 23, 42, 0.06), rgba(0, 0, 0, 0.28))";
|
|
19528
19583
|
}
|
|
19529
|
-
function addDetailRow(parent, label, value) {
|
|
19584
|
+
function addDetailRow(parent, label, value, wrap = false) {
|
|
19530
19585
|
const row = document.createElement("div");
|
|
19531
19586
|
row.style.display = "grid";
|
|
19532
|
-
row.style.gridTemplateColumns = "minmax(0, 1fr) auto";
|
|
19587
|
+
row.style.gridTemplateColumns = wrap ? "auto minmax(0, 1fr)" : "minmax(0, 1fr) auto";
|
|
19533
19588
|
row.style.gap = "20px";
|
|
19534
19589
|
row.style.padding = "4px 0";
|
|
19535
19590
|
const labelElement = document.createElement("span");
|
|
@@ -19539,17 +19594,24 @@ ${error51.stderrTail}`] : []
|
|
|
19539
19594
|
valueElement.textContent = value;
|
|
19540
19595
|
valueElement.style.fontVariantNumeric = "tabular-nums";
|
|
19541
19596
|
valueElement.style.textAlign = "right";
|
|
19597
|
+
if (wrap) {
|
|
19598
|
+
valueElement.style.overflowWrap = "anywhere";
|
|
19599
|
+
valueElement.title = value;
|
|
19600
|
+
}
|
|
19542
19601
|
row.append(labelElement, valueElement);
|
|
19543
19602
|
parent.append(row);
|
|
19544
19603
|
}
|
|
19545
|
-
function renderDetails(popover, usage, messages, locale) {
|
|
19604
|
+
function renderDetails(popover, usage, messages, locale, accountName) {
|
|
19546
19605
|
popover.replaceChildren();
|
|
19547
19606
|
const heading = document.createElement("div");
|
|
19548
19607
|
heading.textContent = messages.usage;
|
|
19549
19608
|
heading.style.fontWeight = "600";
|
|
19550
19609
|
heading.style.marginBottom = "6px";
|
|
19551
19610
|
popover.append(heading);
|
|
19552
|
-
if (
|
|
19611
|
+
if (accountName) addDetailRow(popover, messages.account, accountName, true);
|
|
19612
|
+
if (usage?.contextUsagePercent !== void 0) {
|
|
19613
|
+
addDetailRow(popover, messages.context, `${decimal(usage.contextUsagePercent, 1)}%`);
|
|
19614
|
+
} else if (usage?.contextUsedTokens !== void 0 && usage.contextWindowTokens !== void 0) {
|
|
19553
19615
|
const contextPercent = usage.contextWindowTokens > 0 ? usage.contextUsedTokens / usage.contextWindowTokens * 100 : null;
|
|
19554
19616
|
addDetailRow(
|
|
19555
19617
|
popover,
|
|
@@ -19595,34 +19657,15 @@ ${error51.stderrTail}`] : []
|
|
|
19595
19657
|
addDetailRow(
|
|
19596
19658
|
popover,
|
|
19597
19659
|
messages.inputOutput,
|
|
19598
|
-
`${
|
|
19599
|
-
);
|
|
19600
|
-
}
|
|
19601
|
-
if (usage?.planFiveHourUsedPercent !== void 0) {
|
|
19602
|
-
addDetailRow(
|
|
19603
|
-
popover,
|
|
19604
|
-
messages.fiveHourLimit,
|
|
19605
|
-
formatRendererPlanWindow(
|
|
19606
|
-
usage.planFiveHourUsedPercent,
|
|
19607
|
-
usage.planFiveHourResetsAtUnix,
|
|
19608
|
-
locale
|
|
19609
|
-
)
|
|
19610
|
-
);
|
|
19611
|
-
}
|
|
19612
|
-
if (usage?.planSevenDayUsedPercent !== void 0) {
|
|
19613
|
-
addDetailRow(
|
|
19614
|
-
popover,
|
|
19615
|
-
messages.sevenDayLimit,
|
|
19616
|
-
formatRendererPlanWindow(
|
|
19617
|
-
usage.planSevenDayUsedPercent,
|
|
19618
|
-
usage.planSevenDayResetsAtUnix,
|
|
19619
|
-
locale
|
|
19620
|
-
)
|
|
19660
|
+
`${usage.inputTokens === void 0 ? "-" : formatRendererTokenCount(usage.inputTokens)} / ${usage.outputTokens === void 0 ? "-" : formatRendererTokenCount(usage.outputTokens)}`
|
|
19621
19661
|
);
|
|
19622
19662
|
}
|
|
19623
19663
|
if (usage?.totalCostUsd !== void 0) {
|
|
19624
19664
|
addDetailRow(popover, messages.sessionCostEstimate, formatRendererCost(usage.totalCostUsd));
|
|
19625
19665
|
}
|
|
19666
|
+
if (usage?.totalCredits !== void 0) {
|
|
19667
|
+
addDetailRow(popover, messages.recordedCredits, formatRendererCredits(usage.totalCredits));
|
|
19668
|
+
}
|
|
19626
19669
|
}
|
|
19627
19670
|
function popoverIsOpen(popover) {
|
|
19628
19671
|
try {
|
|
@@ -19706,6 +19749,8 @@ ${error51.stderrTail}`] : []
|
|
|
19706
19749
|
popover.setAttribute("popover", "auto");
|
|
19707
19750
|
popover.hidden = typeof popover.showPopover !== "function";
|
|
19708
19751
|
popover.style.position = "fixed";
|
|
19752
|
+
popover.style.boxSizing = "border-box";
|
|
19753
|
+
popover.style.margin = "0";
|
|
19709
19754
|
popover.style.inset = "auto";
|
|
19710
19755
|
popover.style.width = "260px";
|
|
19711
19756
|
popover.style.maxWidth = "min(320px, calc(100vw - 24px))";
|
|
@@ -19777,7 +19822,7 @@ ${error51.stderrTail}`] : []
|
|
|
19777
19822
|
document.body.append(popover);
|
|
19778
19823
|
return control;
|
|
19779
19824
|
}
|
|
19780
|
-
function renderRendererUsageControl(control, usage, locale = control.locale) {
|
|
19825
|
+
function renderRendererUsageControl(control, usage, locale = control.locale, accountName = null) {
|
|
19781
19826
|
control.locale = locale;
|
|
19782
19827
|
const messages = rendererUsageMessages(locale);
|
|
19783
19828
|
control.popover.setAttribute("aria-label", messages.threadUsageDetails);
|
|
@@ -19786,18 +19831,20 @@ ${error51.stderrTail}`] : []
|
|
|
19786
19831
|
const totalCostUsd = usage?.totalCostUsd;
|
|
19787
19832
|
const hasContext = usage?.contextUsedTokens !== void 0 && usage.contextWindowTokens !== void 0;
|
|
19788
19833
|
const hasTokenUsage = usage?.totalTokens !== void 0 || usage?.inputTokens !== void 0 || usage?.cachedInputTokens !== void 0 || usage?.cacheWriteInputTokens !== void 0 || usage?.outputTokens !== void 0 || usage?.reasoningOutputTokens !== void 0;
|
|
19789
|
-
const
|
|
19790
|
-
const visible = rendererUsageHasDisplayData(usage);
|
|
19834
|
+
const visible = rendererUsageHasDisplayData(usage) || Boolean(accountName);
|
|
19791
19835
|
control.root.style.display = visible ? "inline-flex" : "none";
|
|
19792
19836
|
if (!visible) {
|
|
19793
19837
|
closePopover(control);
|
|
19794
19838
|
return false;
|
|
19795
19839
|
}
|
|
19796
19840
|
const summary = [
|
|
19841
|
+
usage?.totalCredits !== void 0 ? formatRendererCredits(usage.totalCredits) : null,
|
|
19797
19842
|
cacheHitRatePercent !== void 0 ? formatRendererCacheHitRate(cacheHitRatePercent) : null,
|
|
19798
19843
|
outputTokensPerSecond !== void 0 ? formatRendererTokenRate(outputTokensPerSecond, locale) : null,
|
|
19799
19844
|
totalCostUsd !== void 0 ? formatRendererCost(totalCostUsd) : null
|
|
19800
19845
|
].filter((value) => value !== null);
|
|
19846
|
+
const contextPercent = usage?.contextUsagePercent;
|
|
19847
|
+
if (contextPercent !== void 0 && summary.length === 0) summary.push(messages.usage);
|
|
19801
19848
|
if (summary.length === 0 && hasContext && usage?.contextWindowTokens !== void 0 && usage.contextWindowTokens > 0) {
|
|
19802
19849
|
summary.push(
|
|
19803
19850
|
formatRendererContextSummary(usage.contextUsedTokens ?? 0, usage.contextWindowTokens)
|
|
@@ -19811,18 +19858,13 @@ ${error51.stderrTail}`] : []
|
|
|
19811
19858
|
`${formatRendererTokenCount((usage?.inputTokens ?? 0) + (usage?.outputTokens ?? 0))} ${messages.tokensSummary}`
|
|
19812
19859
|
);
|
|
19813
19860
|
}
|
|
19814
|
-
|
|
19815
|
-
|
|
19816
|
-
usage?.planFiveHourUsedPercent !== void 0 ? `${messages.fiveHourSummary} ${formatRendererCreditsPercent(usage.planFiveHourUsedPercent)}` : `${messages.sevenDaySummary} ${formatRendererCreditsPercent(usage?.planSevenDayUsedPercent ?? 0)}`
|
|
19817
|
-
);
|
|
19818
|
-
}
|
|
19819
|
-
const compactSummary = summary.join(" \xB7 ");
|
|
19820
|
-
const accessibleSummary = `${messages.threadUsage}: ${compactSummary}`;
|
|
19861
|
+
const compactSummary = summary.join(" \xB7 ") || messages.usage;
|
|
19862
|
+
const accessibleSummary = `${messages.threadUsage}: ${compactSummary}${contextPercent !== void 0 ? `; ${messages.context} ${decimal(contextPercent, 1)}%` : ""}`;
|
|
19821
19863
|
control.trigger.style.maxWidth = rendererUsageTriggerMaxWidth();
|
|
19822
19864
|
control.trigger.setAttribute("aria-label", accessibleSummary);
|
|
19823
19865
|
control.trigger.title = accessibleSummary;
|
|
19824
19866
|
control.label.textContent = compactSummary;
|
|
19825
|
-
renderDetails(control.popover, usage, messages, locale);
|
|
19867
|
+
renderDetails(control.popover, usage, messages, locale, accountName);
|
|
19826
19868
|
return true;
|
|
19827
19869
|
}
|
|
19828
19870
|
|
|
@@ -20986,7 +21028,15 @@ ${error51.stderrTail}`] : []
|
|
|
20986
21028
|
permissionModeVisible,
|
|
20987
21029
|
locale
|
|
20988
21030
|
);
|
|
20989
|
-
|
|
21031
|
+
const selectedCodexAccount = state.agent === "codex" && !ownershipError ? codexAccounts.find((account) => account.active) : void 0;
|
|
21032
|
+
if (control.usage) {
|
|
21033
|
+
renderRendererUsageControl(
|
|
21034
|
+
control.usage,
|
|
21035
|
+
usage,
|
|
21036
|
+
locale,
|
|
21037
|
+
selectedCodexAccount?.email ?? selectedCodexAccount?.label ?? null
|
|
21038
|
+
);
|
|
21039
|
+
}
|
|
20990
21040
|
control.harnessCommands.setLocale(locale);
|
|
20991
21041
|
control.harnessCommands.root.hidden = state.agent === "codex";
|
|
20992
21042
|
control.harnessCommands.root.style.display = state.agent === "codex" ? "none" : "inline-flex";
|
|
@@ -21009,6 +21059,51 @@ ${error51.stderrTail}`] : []
|
|
|
21009
21059
|
control.picker.dispose();
|
|
21010
21060
|
}
|
|
21011
21061
|
|
|
21062
|
+
// src/renderer-transcript-dom.ts
|
|
21063
|
+
var TRANSCRIPT_TEXT_BODY_SELECTOR = '[data-testid="exec-shell-body"]';
|
|
21064
|
+
var REASONING_SOFT_WRAP_STORAGE_KEY = "codexhost.reasoning-soft-wrap.v1";
|
|
21065
|
+
var REASONING_SOFT_WRAP_CHANGE_EVENT = "codexhost:reasoning-soft-wrap-changed";
|
|
21066
|
+
function readReasoningTranscriptSoftWrap(ownerWindow) {
|
|
21067
|
+
return ownerWindow.localStorage.getItem(REASONING_SOFT_WRAP_STORAGE_KEY) === "true";
|
|
21068
|
+
}
|
|
21069
|
+
function setReasoningTranscriptSoftWrap(ownerWindow, enabled) {
|
|
21070
|
+
ownerWindow.localStorage.setItem(REASONING_SOFT_WRAP_STORAGE_KEY, String(enabled));
|
|
21071
|
+
ownerWindow.dispatchEvent(new Event(REASONING_SOFT_WRAP_CHANGE_EVENT));
|
|
21072
|
+
}
|
|
21073
|
+
function installReasoningTranscriptSoftWrap(ownerDocument) {
|
|
21074
|
+
const ownerWindow = ownerDocument.defaultView;
|
|
21075
|
+
if (!ownerWindow) return () => {
|
|
21076
|
+
};
|
|
21077
|
+
const style = ownerDocument.createElement("style");
|
|
21078
|
+
style.setAttribute("data-codexhost-reasoning-soft-wrap", "true");
|
|
21079
|
+
const body = `${TRANSCRIPT_TEXT_BODY_SELECTOR}:has([aria-label="$ ${REASONING_TRANSCRIPT_COMMAND}"])`;
|
|
21080
|
+
style.textContent = `
|
|
21081
|
+
${body} .whitespace-pre {
|
|
21082
|
+
white-space: pre-wrap;
|
|
21083
|
+
overflow-wrap: anywhere;
|
|
21084
|
+
}
|
|
21085
|
+
${body} .whitespace-pre > .w-max {
|
|
21086
|
+
width: 100%;
|
|
21087
|
+
min-width: 0;
|
|
21088
|
+
}
|
|
21089
|
+
`;
|
|
21090
|
+
ownerDocument.head.append(style);
|
|
21091
|
+
const refresh = () => {
|
|
21092
|
+
style.disabled = !readReasoningTranscriptSoftWrap(ownerWindow);
|
|
21093
|
+
};
|
|
21094
|
+
const onStorage = (event) => {
|
|
21095
|
+
if (event.key === REASONING_SOFT_WRAP_STORAGE_KEY || event.key === null) refresh();
|
|
21096
|
+
};
|
|
21097
|
+
refresh();
|
|
21098
|
+
ownerWindow.addEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, refresh);
|
|
21099
|
+
ownerWindow.addEventListener("storage", onStorage);
|
|
21100
|
+
return () => {
|
|
21101
|
+
ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, refresh);
|
|
21102
|
+
ownerWindow.removeEventListener("storage", onStorage);
|
|
21103
|
+
style.remove();
|
|
21104
|
+
};
|
|
21105
|
+
}
|
|
21106
|
+
|
|
21012
21107
|
// src/renderer-codex-account-state.ts
|
|
21013
21108
|
function resolveCodexAccountSelection(accounts, overrideAccountId) {
|
|
21014
21109
|
const activeAccountId = accounts.find((account) => account.active)?.accountId ?? null;
|
|
@@ -21135,6 +21230,7 @@ ${error51.stderrTail}`] : []
|
|
|
21135
21230
|
if (ownership.harnessId === "grok") return "grok";
|
|
21136
21231
|
if (ownership.harnessId === "omp") return "omp";
|
|
21137
21232
|
if (ownership.harnessId === "antigravity") return "antigravity";
|
|
21233
|
+
if (ownership.harnessId === "kiro-cli") return "kiro-cli";
|
|
21138
21234
|
return null;
|
|
21139
21235
|
}
|
|
21140
21236
|
var BrowserSidebarAgentIconRow = class {
|
|
@@ -22195,6 +22291,7 @@ ${error51.stderrTail}`] : []
|
|
|
22195
22291
|
}
|
|
22196
22292
|
var DRAFT_PREWARM_POLICY_WAIT_TIMEOUT_MS = 1e4;
|
|
22197
22293
|
var DRAFT_PREWARM_POLICY_POLL_INTERVAL_MS = 25;
|
|
22294
|
+
var KIRO_CLI_HARNESS_ID = harnessIdSchema.parse("kiro-cli");
|
|
22198
22295
|
function transportModelIdForAgent(agent) {
|
|
22199
22296
|
if (agent === "pi") return PI_TRANSPORT_MODEL_ID;
|
|
22200
22297
|
if (agent === "claude-code") return CLAUDE_CODE_TRANSPORT_MODEL_ID;
|
|
@@ -22203,6 +22300,7 @@ ${error51.stderrTail}`] : []
|
|
|
22203
22300
|
if (agent === "grok") return GROK_TRANSPORT_MODEL_ID;
|
|
22204
22301
|
if (agent === "omp") return OMP_TRANSPORT_MODEL_ID;
|
|
22205
22302
|
if (agent === "antigravity") return ANTIGRAVITY_TRANSPORT_MODEL_ID;
|
|
22303
|
+
if (agent === "kiro-cli") return encodeHarnessPluginRoute({ harnessId: KIRO_CLI_HARNESS_ID });
|
|
22206
22304
|
return null;
|
|
22207
22305
|
}
|
|
22208
22306
|
function isRecord6(value) {
|
|
@@ -22645,7 +22743,12 @@ ${error51.stderrTail}`] : []
|
|
|
22645
22743
|
}
|
|
22646
22744
|
}
|
|
22647
22745
|
function modelSelectionForAgent(officialSelection, reasoningEffort, agent, model, thinkingOptionId, permissionModeId) {
|
|
22648
|
-
const transportModelId = agent === "pi" ? piTransportModelId(model, thinkingOptionId) : agent === "claude-code" ? claudeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "deepseek-harness" ? deepSeekHarnessTransportModelId(model, permissionModeId) : agent === "opencode" ? openCodeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "grok" ? grokTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "omp" ? ompTransportModelId(model, thinkingOptionId, permissionModeId) : agent === "antigravity" ? antigravityTransportModelId(model, permissionModeId, thinkingOptionId) :
|
|
22746
|
+
const transportModelId = agent === "pi" ? piTransportModelId(model, thinkingOptionId) : agent === "claude-code" ? claudeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "deepseek-harness" ? deepSeekHarnessTransportModelId(model, permissionModeId) : agent === "opencode" ? openCodeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "grok" ? grokTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "omp" ? ompTransportModelId(model, thinkingOptionId, permissionModeId) : agent === "antigravity" ? antigravityTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "kiro-cli" ? encodeHarnessPluginRoute({
|
|
22747
|
+
harnessId: KIRO_CLI_HARNESS_ID,
|
|
22748
|
+
...model ? { model } : {},
|
|
22749
|
+
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
22750
|
+
...permissionModeId ? { permissionModeId } : {}
|
|
22751
|
+
}) : transportModelIdForAgent(agent);
|
|
22649
22752
|
return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
|
|
22650
22753
|
}
|
|
22651
22754
|
function installCurrentRendererAdapter() {
|
|
@@ -23837,6 +23940,50 @@ ${error51.stderrTail}`] : []
|
|
|
23837
23940
|
});
|
|
23838
23941
|
}
|
|
23839
23942
|
|
|
23943
|
+
// src/settings/appearance-page.ts
|
|
23944
|
+
function createAppearanceSettingsPage(messages) {
|
|
23945
|
+
return Object.freeze({
|
|
23946
|
+
id: "appearance",
|
|
23947
|
+
label: messages.pageLabels.appearance,
|
|
23948
|
+
icon: "settings",
|
|
23949
|
+
mount(context) {
|
|
23950
|
+
const document2 = context.content.ownerDocument;
|
|
23951
|
+
const ownerWindow = document2.defaultView;
|
|
23952
|
+
if (!ownerWindow) return;
|
|
23953
|
+
const heading = document2.createElement("div");
|
|
23954
|
+
heading.className = "settings-section-label";
|
|
23955
|
+
heading.textContent = messages.pageLabels.appearance;
|
|
23956
|
+
const description = document2.createElement("p");
|
|
23957
|
+
description.className = "settings-page-description";
|
|
23958
|
+
description.textContent = messages.appearanceDescription;
|
|
23959
|
+
const row = document2.createElement("label");
|
|
23960
|
+
row.className = "settings-preference-row";
|
|
23961
|
+
const copy = document2.createElement("span");
|
|
23962
|
+
copy.className = "settings-preference-row__copy";
|
|
23963
|
+
const title = document2.createElement("strong");
|
|
23964
|
+
title.textContent = messages.reasoningSoftWrapTitle;
|
|
23965
|
+
const detail = document2.createElement("span");
|
|
23966
|
+
detail.textContent = messages.reasoningSoftWrapDescription;
|
|
23967
|
+
copy.append(title, detail);
|
|
23968
|
+
const checkbox = document2.createElement("input");
|
|
23969
|
+
checkbox.type = "checkbox";
|
|
23970
|
+
checkbox.className = "settings-preference-checkbox";
|
|
23971
|
+
checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
|
|
23972
|
+
checkbox.setAttribute("aria-label", messages.reasoningSoftWrapTitle);
|
|
23973
|
+
checkbox.addEventListener("change", () => {
|
|
23974
|
+
setReasoningTranscriptSoftWrap(ownerWindow, checkbox.checked);
|
|
23975
|
+
});
|
|
23976
|
+
const sync = () => {
|
|
23977
|
+
checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
|
|
23978
|
+
};
|
|
23979
|
+
ownerWindow.addEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
23980
|
+
row.append(copy, checkbox);
|
|
23981
|
+
context.content.append(heading, description, row);
|
|
23982
|
+
return () => ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
23983
|
+
}
|
|
23984
|
+
});
|
|
23985
|
+
}
|
|
23986
|
+
|
|
23840
23987
|
// src/settings/release-notes.ts
|
|
23841
23988
|
var HEADING_PATTERN = /^(#{1,6})[ \t]+(.+?)\s*$/u;
|
|
23842
23989
|
var BLOCKQUOTE_PATTERN = /^>[ \t]?(.*?)\s*$/u;
|
|
@@ -24012,6 +24159,140 @@ ${error51.stderrTail}`] : []
|
|
|
24012
24159
|
}
|
|
24013
24160
|
}
|
|
24014
24161
|
|
|
24162
|
+
// src/settings/accounts-details.ts
|
|
24163
|
+
function createAccountDetails(document2, messages, input) {
|
|
24164
|
+
const root = document2.createElement("div");
|
|
24165
|
+
root.className = "settings-account-details";
|
|
24166
|
+
const trigger = document2.createElement("button");
|
|
24167
|
+
trigger.type = "button";
|
|
24168
|
+
trigger.className = "settings-icon-button";
|
|
24169
|
+
trigger.title = input.triggerLabel ?? input.label;
|
|
24170
|
+
trigger.disabled = input.disabled ?? false;
|
|
24171
|
+
trigger.dataset.accountFocus = input.focusKey;
|
|
24172
|
+
trigger.setAttribute("aria-label", trigger.title);
|
|
24173
|
+
trigger.setAttribute("aria-haspopup", "dialog");
|
|
24174
|
+
trigger.append(createRendererSettingsIcon(input.icon, 16));
|
|
24175
|
+
const dialog = document2.createElement("dialog");
|
|
24176
|
+
dialog.className = "settings-account-dialog";
|
|
24177
|
+
dialog.id = `settings-account-${input.focusKey}-dialog`;
|
|
24178
|
+
dialog.setAttribute("aria-label", input.label);
|
|
24179
|
+
trigger.setAttribute("aria-controls", dialog.id);
|
|
24180
|
+
const heading = document2.createElement("h2");
|
|
24181
|
+
heading.textContent = input.label;
|
|
24182
|
+
const description = document2.createElement("p");
|
|
24183
|
+
description.textContent = input.description;
|
|
24184
|
+
description.id = `${dialog.id}-description`;
|
|
24185
|
+
dialog.setAttribute("aria-describedby", description.id);
|
|
24186
|
+
const close = document2.createElement("button");
|
|
24187
|
+
close.type = "button";
|
|
24188
|
+
close.className = "settings-icon-button settings-account-dialog__close";
|
|
24189
|
+
close.dataset.accountFocus = `${input.focusKey}:close`;
|
|
24190
|
+
close.setAttribute("aria-label", messages.accountDetailsClose);
|
|
24191
|
+
close.append(createRendererSettingsIcon("close", 16));
|
|
24192
|
+
close.addEventListener("click", () => dialog.close());
|
|
24193
|
+
dialog.addEventListener("close", () => {
|
|
24194
|
+
if (trigger.isConnected && !trigger.disabled) trigger.focus({ preventScroll: true });
|
|
24195
|
+
});
|
|
24196
|
+
dialog.addEventListener(
|
|
24197
|
+
"click",
|
|
24198
|
+
(event) => {
|
|
24199
|
+
if (input.actions.some((action) => action.contains(event.target))) {
|
|
24200
|
+
trigger.focus({ preventScroll: true });
|
|
24201
|
+
dialog.close();
|
|
24202
|
+
}
|
|
24203
|
+
},
|
|
24204
|
+
{ capture: true }
|
|
24205
|
+
);
|
|
24206
|
+
const actions = document2.createElement("div");
|
|
24207
|
+
actions.className = "settings-account-dialog__actions";
|
|
24208
|
+
actions.append(...input.actions);
|
|
24209
|
+
dialog.append(close, heading, description, actions);
|
|
24210
|
+
trigger.addEventListener("click", () => dialog.showModal());
|
|
24211
|
+
root.append(trigger, dialog);
|
|
24212
|
+
return root;
|
|
24213
|
+
}
|
|
24214
|
+
|
|
24215
|
+
// src/settings/accounts-reset-time.ts
|
|
24216
|
+
function formatAccountResetCountdown(value, messages, now = Date.now()) {
|
|
24217
|
+
const timestamp = Date.parse(value);
|
|
24218
|
+
if (!Number.isFinite(timestamp)) return null;
|
|
24219
|
+
const minutes = Math.max(0, Math.ceil((timestamp - now) / 6e4));
|
|
24220
|
+
if (minutes === 0) {
|
|
24221
|
+
return {
|
|
24222
|
+
text: messages.accountCreditsResetPending,
|
|
24223
|
+
description: messages.accountCreditsResetPendingHint
|
|
24224
|
+
};
|
|
24225
|
+
}
|
|
24226
|
+
const chinese = messages.locale === "zh-CN";
|
|
24227
|
+
const parts = [
|
|
24228
|
+
{ value: Math.floor(minutes / 1440), unit: "d", label: chinese ? "\u5929" : " days" },
|
|
24229
|
+
{ value: Math.floor(minutes % 1440 / 60), unit: "h", label: chinese ? "\u5C0F\u65F6" : " hours" },
|
|
24230
|
+
{ value: minutes % 60, unit: "m", label: chinese ? "\u5206\u949F" : " minutes" }
|
|
24231
|
+
].filter((part, index) => part.value > 0 && (minutes < 1440 || index < 2));
|
|
24232
|
+
return {
|
|
24233
|
+
text: parts.map((part) => `${part.value}${part.unit}`).join(""),
|
|
24234
|
+
description: messages.accountCreditsResetIn.replace(
|
|
24235
|
+
"{time}",
|
|
24236
|
+
parts.map(
|
|
24237
|
+
(part) => `${part.value}${!chinese && part.value === 1 ? part.label.slice(0, -1) : part.label}`
|
|
24238
|
+
).join(chinese ? "" : " ")
|
|
24239
|
+
)
|
|
24240
|
+
};
|
|
24241
|
+
}
|
|
24242
|
+
function updateCountdown(element, messages) {
|
|
24243
|
+
const value = formatAccountResetCountdown(element.dataset.resetsAt ?? "", messages);
|
|
24244
|
+
if (!value) return;
|
|
24245
|
+
element.textContent = value.text;
|
|
24246
|
+
element.title = value.description;
|
|
24247
|
+
element.setAttribute("aria-label", value.description);
|
|
24248
|
+
}
|
|
24249
|
+
function renderAccountResetTime(document2, value, messages) {
|
|
24250
|
+
const date5 = new Date(value);
|
|
24251
|
+
if (!Number.isFinite(date5.getTime())) return null;
|
|
24252
|
+
const countdown = document2.createElement("span");
|
|
24253
|
+
countdown.className = "settings-account-usage__countdown";
|
|
24254
|
+
countdown.dataset.resetsAt = date5.toISOString();
|
|
24255
|
+
updateCountdown(countdown, messages);
|
|
24256
|
+
const timestamp = document2.createElement("time");
|
|
24257
|
+
timestamp.className = "settings-account-usage__sub";
|
|
24258
|
+
timestamp.dateTime = date5.toISOString();
|
|
24259
|
+
const pad = (number4) => String(number4).padStart(2, "0");
|
|
24260
|
+
timestamp.textContent = `${pad(date5.getMonth() + 1)}/${pad(date5.getDate())} ${pad(date5.getHours())}:${pad(date5.getMinutes())}`;
|
|
24261
|
+
timestamp.title = messages.accountCreditsResetAt.replace(
|
|
24262
|
+
"{time}",
|
|
24263
|
+
date5.toLocaleString(messages.locale, {
|
|
24264
|
+
year: "numeric",
|
|
24265
|
+
month: "long",
|
|
24266
|
+
day: "numeric",
|
|
24267
|
+
hour: "2-digit",
|
|
24268
|
+
minute: "2-digit",
|
|
24269
|
+
hour12: false,
|
|
24270
|
+
timeZoneName: "short"
|
|
24271
|
+
})
|
|
24272
|
+
);
|
|
24273
|
+
timestamp.setAttribute("aria-label", timestamp.title);
|
|
24274
|
+
return { countdown, timestamp };
|
|
24275
|
+
}
|
|
24276
|
+
function mountAccountResetCountdowns(list, messages, signal) {
|
|
24277
|
+
const window2 = list.ownerDocument.defaultView;
|
|
24278
|
+
if (!window2 || signal.aborted) return () => void 0;
|
|
24279
|
+
const refresh = () => {
|
|
24280
|
+
if (signal.aborted) return;
|
|
24281
|
+
for (const element of list.querySelectorAll("[data-resets-at]")) {
|
|
24282
|
+
updateCountdown(element, messages);
|
|
24283
|
+
}
|
|
24284
|
+
};
|
|
24285
|
+
const timer = window2.setInterval(refresh, 6e4);
|
|
24286
|
+
window2.addEventListener("focus", refresh);
|
|
24287
|
+
const stop = () => {
|
|
24288
|
+
window2.clearInterval(timer);
|
|
24289
|
+
window2.removeEventListener("focus", refresh);
|
|
24290
|
+
signal.removeEventListener("abort", stop);
|
|
24291
|
+
};
|
|
24292
|
+
signal.addEventListener("abort", stop, { once: true });
|
|
24293
|
+
return stop;
|
|
24294
|
+
}
|
|
24295
|
+
|
|
24015
24296
|
// src/settings/accounts-usage.ts
|
|
24016
24297
|
function creditsPeriodLabel2(periodType, messages) {
|
|
24017
24298
|
if (periodType === "weekly") return messages.accountCreditsPeriodWeekly;
|
|
@@ -24046,17 +24327,80 @@ ${error51.stderrTail}`] : []
|
|
|
24046
24327
|
function resetCreditDetailLine(index, expiresAt, messages, now = /* @__PURE__ */ new Date()) {
|
|
24047
24328
|
return messages.accountResetCreditsCardExpiry.replace("{index}", String(index)).replace("{time}", formatAccountCreditsReset(expiresAt, messages.locale, now));
|
|
24048
24329
|
}
|
|
24330
|
+
function accountUsageColumnLabel(period, display, messages) {
|
|
24331
|
+
const mode = display === "remaining" ? messages.accountCreditsRemaining : messages.accountCreditsUsed;
|
|
24332
|
+
return `${creditsPeriodLabel2(period, messages)}${messages.locale === "zh-CN" ? "" : " "}${mode}`;
|
|
24333
|
+
}
|
|
24334
|
+
function splitUsageWindows(credits, messages) {
|
|
24335
|
+
const columns = {};
|
|
24336
|
+
const additional = [];
|
|
24337
|
+
const primary = {
|
|
24338
|
+
label: credits.label ?? creditsPeriodLabel2(credits.periodType, messages),
|
|
24339
|
+
usedPercent: credits.usedPercent,
|
|
24340
|
+
resetsAt: credits.resetsAt
|
|
24341
|
+
};
|
|
24342
|
+
if (!credits.label && credits.periodType === "five_hour") columns.five_hour = primary;
|
|
24343
|
+
else if (!credits.label && ["seven_day", "weekly"].includes(credits.periodType))
|
|
24344
|
+
columns.seven_day = { ...primary, label: messages.accountCreditsPeriodSevenDay };
|
|
24345
|
+
else additional.push(primary);
|
|
24346
|
+
for (const product of credits.productUsage ?? []) {
|
|
24347
|
+
const window2 = {
|
|
24348
|
+
label: creditsProductLabel(product.product, messages),
|
|
24349
|
+
usedPercent: product.usagePercent,
|
|
24350
|
+
resetsAt: product.resetsAt
|
|
24351
|
+
};
|
|
24352
|
+
const period = product.product === "7-day window" ? "seven_day" : product.product === "5-hour window" ? "five_hour" : null;
|
|
24353
|
+
if (period && !columns[period])
|
|
24354
|
+
columns[period] = { ...window2, label: creditsPeriodLabel2(period, messages) };
|
|
24355
|
+
else additional.push(window2);
|
|
24356
|
+
}
|
|
24357
|
+
return { columns, additional };
|
|
24358
|
+
}
|
|
24359
|
+
function renderUsageWindow(document2, window2, messages, display) {
|
|
24360
|
+
const meter = document2.createElement("div");
|
|
24361
|
+
meter.className = "settings-account-usage__meter";
|
|
24362
|
+
const label = document2.createElement("span");
|
|
24363
|
+
label.className = "settings-account-usage__title";
|
|
24364
|
+
label.textContent = window2.label;
|
|
24365
|
+
label.title = window2.label;
|
|
24366
|
+
const value = display === "remaining" ? 100 - window2.usedPercent : window2.usedPercent;
|
|
24367
|
+
const valueLabel = display === "remaining" ? messages.accountCreditsRemaining : messages.accountCreditsUsed;
|
|
24368
|
+
const tone = rendererCreditsTone(window2.usedPercent);
|
|
24369
|
+
const percent = document2.createElement("div");
|
|
24370
|
+
percent.className = `settings-account-usage__percent settings-account-usage__percent--${tone}`;
|
|
24371
|
+
const number4 = document2.createElement("span");
|
|
24372
|
+
number4.textContent = formatRendererCreditsPercent(value);
|
|
24373
|
+
const reset = window2.resetsAt ? renderAccountResetTime(document2, window2.resetsAt, messages) : null;
|
|
24374
|
+
if (reset) percent.append(reset.countdown);
|
|
24375
|
+
percent.append(number4);
|
|
24376
|
+
const bar = document2.createElement("div");
|
|
24377
|
+
bar.className = `settings-account-usage__bar settings-account-usage__bar--${tone}`;
|
|
24378
|
+
bar.setAttribute("role", "meter");
|
|
24379
|
+
bar.setAttribute("aria-label", `${window2.label} \xB7 ${valueLabel}`);
|
|
24380
|
+
bar.setAttribute("aria-valuemin", "0");
|
|
24381
|
+
bar.setAttribute("aria-valuemax", "100");
|
|
24382
|
+
bar.setAttribute("aria-valuenow", String(value));
|
|
24383
|
+
const fill = document2.createElement("span");
|
|
24384
|
+
fill.style.width = `${Math.min(100, Math.max(0, value))}%`;
|
|
24385
|
+
bar.append(fill);
|
|
24386
|
+
meter.append(label, percent, bar);
|
|
24387
|
+
if (reset) meter.append(reset.timestamp);
|
|
24388
|
+
return meter;
|
|
24389
|
+
}
|
|
24049
24390
|
function renderAccountUsage(document2, state, messages, display, onRetry) {
|
|
24050
|
-
if (
|
|
24051
|
-
|
|
24052
|
-
|
|
24053
|
-
|
|
24391
|
+
if (state?.status !== "ready") {
|
|
24392
|
+
const cell = document2.createElement("td");
|
|
24393
|
+
cell.colSpan = 2;
|
|
24394
|
+
cell.className = "settings-account-usage-cell settings-account-usage-cell--message";
|
|
24395
|
+
const usage = document2.createElement("div");
|
|
24396
|
+
usage.className = "settings-account-usage";
|
|
24054
24397
|
const message = document2.createElement("span");
|
|
24055
24398
|
message.className = "settings-account-usage__message";
|
|
24056
|
-
message.textContent = state.status === "loading" ? messages.accountCreditsLoading : state.status === "error" ? messages.accountCreditsFailed : messages.accountCreditsEmpty;
|
|
24399
|
+
message.textContent = !state ? "\u2014" : state.status === "loading" ? messages.accountCreditsLoading : state.status === "error" ? messages.accountCreditsFailed : messages.accountCreditsEmpty;
|
|
24400
|
+
if (!state) message.title = messages.accountCreditsEmpty;
|
|
24057
24401
|
usage.append(message);
|
|
24058
|
-
if (state
|
|
24059
|
-
if (state
|
|
24402
|
+
if (state?.status === "loading") usage.setAttribute("aria-busy", "true");
|
|
24403
|
+
if (state?.status === "error") {
|
|
24060
24404
|
const retry = document2.createElement("button");
|
|
24061
24405
|
retry.type = "button";
|
|
24062
24406
|
retry.className = "settings-command-button settings-command-button--secondary";
|
|
@@ -24064,59 +24408,35 @@ ${error51.stderrTail}`] : []
|
|
|
24064
24408
|
retry.addEventListener("click", onRetry);
|
|
24065
24409
|
usage.append(retry);
|
|
24066
24410
|
}
|
|
24067
|
-
|
|
24411
|
+
cell.append(usage);
|
|
24412
|
+
return { cells: [cell], additional: null };
|
|
24068
24413
|
}
|
|
24069
|
-
const
|
|
24070
|
-
const
|
|
24071
|
-
|
|
24072
|
-
|
|
24073
|
-
|
|
24074
|
-
|
|
24075
|
-
|
|
24076
|
-
|
|
24077
|
-
|
|
24078
|
-
|
|
24079
|
-
|
|
24080
|
-
|
|
24081
|
-
|
|
24082
|
-
|
|
24083
|
-
|
|
24084
|
-
|
|
24085
|
-
|
|
24086
|
-
|
|
24087
|
-
|
|
24088
|
-
|
|
24089
|
-
|
|
24090
|
-
|
|
24091
|
-
|
|
24092
|
-
|
|
24093
|
-
|
|
24094
|
-
|
|
24095
|
-
bar.setAttribute("aria-label", `${window2.label} \xB7 ${valueLabel}`);
|
|
24096
|
-
bar.setAttribute("aria-valuemin", "0");
|
|
24097
|
-
bar.setAttribute("aria-valuemax", "100");
|
|
24098
|
-
bar.setAttribute("aria-valuenow", String(value));
|
|
24099
|
-
const fill = document2.createElement("span");
|
|
24100
|
-
fill.style.width = `${Math.min(100, Math.max(0, value))}%`;
|
|
24101
|
-
bar.append(fill);
|
|
24102
|
-
const percent = document2.createElement("span");
|
|
24103
|
-
percent.className = `settings-account-usage__percent settings-account-usage__percent--${tone}`;
|
|
24104
|
-
const prefix = document2.createElement("span");
|
|
24105
|
-
prefix.textContent = valueLabel;
|
|
24106
|
-
prefix.className = "settings-account-usage__value-label";
|
|
24107
|
-
const number4 = document2.createElement("span");
|
|
24108
|
-
number4.textContent = formatRendererCreditsPercent(value);
|
|
24109
|
-
percent.append(prefix, number4);
|
|
24110
|
-
meter.append(label, bar, percent);
|
|
24111
|
-
if (window2.resetsAt) {
|
|
24112
|
-
const reset = document2.createElement("span");
|
|
24113
|
-
reset.className = "settings-account-usage__sub";
|
|
24114
|
-
reset.textContent = `${formatAccountCreditsReset(window2.resetsAt, messages.locale)} ${messages.accountCreditsReset}`;
|
|
24115
|
-
meter.append(reset);
|
|
24116
|
-
}
|
|
24117
|
-
usage.append(meter);
|
|
24118
|
-
}
|
|
24119
|
-
return usage;
|
|
24414
|
+
const { columns, additional } = splitUsageWindows(state.credits, messages);
|
|
24415
|
+
const cells = ["five_hour", "seven_day"].map((period) => {
|
|
24416
|
+
const cell = document2.createElement("td");
|
|
24417
|
+
cell.className = "settings-account-usage-cell";
|
|
24418
|
+
const window2 = columns[period];
|
|
24419
|
+
if (window2) cell.append(renderUsageWindow(document2, window2, messages, display));
|
|
24420
|
+
else {
|
|
24421
|
+
const missing = document2.createElement("div");
|
|
24422
|
+
missing.className = "settings-account-usage__missing";
|
|
24423
|
+
const label = document2.createElement("span");
|
|
24424
|
+
label.className = "settings-account-usage__title";
|
|
24425
|
+
label.textContent = creditsPeriodLabel2(period, messages);
|
|
24426
|
+
const dash = document2.createElement("span");
|
|
24427
|
+
dash.textContent = "\u2014";
|
|
24428
|
+
dash.setAttribute("aria-hidden", "true");
|
|
24429
|
+
missing.append(label, dash);
|
|
24430
|
+
cell.append(missing);
|
|
24431
|
+
}
|
|
24432
|
+
return cell;
|
|
24433
|
+
});
|
|
24434
|
+
if (!additional.length) return { cells, additional: null };
|
|
24435
|
+
const extra = document2.createElement("div");
|
|
24436
|
+
extra.className = "settings-account-extra-usage";
|
|
24437
|
+
for (const window2 of additional)
|
|
24438
|
+
extra.append(renderUsageWindow(document2, window2, messages, display));
|
|
24439
|
+
return { cells, additional: extra };
|
|
24120
24440
|
}
|
|
24121
24441
|
function renderAccountResetCredits(document2, credits, messages, options) {
|
|
24122
24442
|
const resetCredits = credits.resetCredits;
|
|
@@ -24128,8 +24448,11 @@ ${error51.stderrTail}`] : []
|
|
|
24128
24448
|
summary.title = messages.accountResetCreditsDetails;
|
|
24129
24449
|
const count = document2.createElement("span");
|
|
24130
24450
|
count.textContent = messages.locale === "zh-CN" ? `${resetCredits.availableCount} \u5F20` : String(resetCredits.availableCount);
|
|
24451
|
+
const label = document2.createElement("span");
|
|
24452
|
+
label.textContent = messages.accountResetCredits;
|
|
24131
24453
|
summary.append(
|
|
24132
24454
|
createRendererSettingsIcon("ticket", 16),
|
|
24455
|
+
label,
|
|
24133
24456
|
count,
|
|
24134
24457
|
createRendererSettingsIcon("chevron-right", 14)
|
|
24135
24458
|
);
|
|
@@ -24199,6 +24522,8 @@ ${error51.stderrTail}`] : []
|
|
|
24199
24522
|
return () => {
|
|
24200
24523
|
const target = key ? list.querySelector(`[data-account-focus="${CSS.escape(key)}"]`) : null;
|
|
24201
24524
|
if (target && !target.matches(":disabled")) {
|
|
24525
|
+
const dialog = target.closest("dialog");
|
|
24526
|
+
if (dialog && !dialog.open) dialog.showModal();
|
|
24202
24527
|
target.focus({ preventScroll: true });
|
|
24203
24528
|
return;
|
|
24204
24529
|
}
|
|
@@ -24214,87 +24539,100 @@ ${error51.stderrTail}`] : []
|
|
|
24214
24539
|
table.setAttribute("aria-label", messages.pageLabels.accounts);
|
|
24215
24540
|
const head = document2.createElement("thead");
|
|
24216
24541
|
const row = document2.createElement("tr");
|
|
24217
|
-
|
|
24218
|
-
messages.accountColumnAccount,
|
|
24219
|
-
messages.accountColumnUsage,
|
|
24220
|
-
messages.accountResetCredits,
|
|
24221
|
-
messages.accountColumnActions
|
|
24222
|
-
]) {
|
|
24542
|
+
const headers = Array.from({ length: 4 }, () => {
|
|
24223
24543
|
const cell = document2.createElement("th");
|
|
24224
24544
|
cell.scope = "col";
|
|
24225
|
-
cell.textContent = label;
|
|
24226
24545
|
row.append(cell);
|
|
24227
|
-
|
|
24546
|
+
return cell;
|
|
24547
|
+
});
|
|
24548
|
+
const updateDisplay = (display) => {
|
|
24549
|
+
const labels = [
|
|
24550
|
+
messages.accountColumnAccount,
|
|
24551
|
+
accountUsageColumnLabel("five_hour", display, messages),
|
|
24552
|
+
accountUsageColumnLabel("seven_day", display, messages),
|
|
24553
|
+
messages.accountColumnActions
|
|
24554
|
+
];
|
|
24555
|
+
headers.forEach((cell, index) => {
|
|
24556
|
+
cell.textContent = labels[index] ?? "";
|
|
24557
|
+
});
|
|
24558
|
+
};
|
|
24559
|
+
updateDisplay("remaining");
|
|
24228
24560
|
head.append(row);
|
|
24229
24561
|
const body = document2.createElement("tbody");
|
|
24230
24562
|
table.append(head, body);
|
|
24231
|
-
return { table, body };
|
|
24563
|
+
return { table, body, updateDisplay };
|
|
24232
24564
|
}
|
|
24233
|
-
function
|
|
24234
|
-
const row = document2.createElement("tr");
|
|
24235
|
-
row.className = "settings-account-row";
|
|
24236
|
-
row.dataset.accountId = account.accountId;
|
|
24237
|
-
row.dataset.accountFocus = `${account.accountId}:row`;
|
|
24238
|
-
row.tabIndex = -1;
|
|
24239
|
-
const name = codexAccountDisplayName(account);
|
|
24240
|
-
row.setAttribute("aria-label", name.full);
|
|
24241
|
-
const personCell = document2.createElement("td");
|
|
24565
|
+
function createAccountPerson(document2, messages, input) {
|
|
24242
24566
|
const person = document2.createElement("div");
|
|
24243
24567
|
person.className = "settings-account-row__person";
|
|
24244
|
-
const mark = document2.createElement("div");
|
|
24245
|
-
mark.className = "settings-account-row__mark";
|
|
24246
|
-
mark.setAttribute("aria-hidden", "true");
|
|
24247
|
-
mark.append(createRendererSettingsIcon("terminal", 17));
|
|
24248
24568
|
const identity = document2.createElement("div");
|
|
24249
24569
|
identity.className = "settings-account-row__identity";
|
|
24250
|
-
const title = document2.createElement("
|
|
24251
|
-
title.className = "settings-account-
|
|
24252
|
-
|
|
24253
|
-
|
|
24254
|
-
|
|
24255
|
-
local.title = name.full;
|
|
24256
|
-
title.append(local);
|
|
24257
|
-
if (account.active) {
|
|
24258
|
-
const badge = document2.createElement("span");
|
|
24259
|
-
badge.className = "settings-account-active";
|
|
24260
|
-
badge.textContent = messages.accountDefaultBadge;
|
|
24261
|
-
title.append(badge);
|
|
24262
|
-
}
|
|
24263
|
-
identity.append(title);
|
|
24570
|
+
const title = document2.createElement("strong");
|
|
24571
|
+
title.className = "settings-account-email";
|
|
24572
|
+
title.textContent = input.name;
|
|
24573
|
+
title.title = input.name;
|
|
24574
|
+
title.translate = false;
|
|
24264
24575
|
const metadata = document2.createElement("div");
|
|
24265
24576
|
metadata.className = "settings-account-metadata";
|
|
24266
|
-
|
|
24267
|
-
|
|
24268
|
-
|
|
24269
|
-
|
|
24270
|
-
|
|
24271
|
-
|
|
24272
|
-
const planLabel = accountPlanLabel(account.planType);
|
|
24273
|
-
if (planLabel) {
|
|
24274
|
-
if (name.domain) {
|
|
24577
|
+
const agent = document2.createElement("span");
|
|
24578
|
+
agent.textContent = input.agent;
|
|
24579
|
+
agent.translate = false;
|
|
24580
|
+
if (input.name !== input.agent) metadata.append(agent);
|
|
24581
|
+
if (input.plan) {
|
|
24582
|
+
if (metadata.childElementCount) {
|
|
24275
24583
|
const separator = document2.createElement("span");
|
|
24276
|
-
separator.className = "settings-account-plan-separator";
|
|
24277
24584
|
separator.textContent = "\xB7";
|
|
24278
24585
|
separator.setAttribute("aria-hidden", "true");
|
|
24279
24586
|
metadata.append(separator);
|
|
24280
24587
|
}
|
|
24281
24588
|
const plan = document2.createElement("span");
|
|
24282
|
-
plan.className =
|
|
24283
|
-
plan.textContent =
|
|
24589
|
+
plan.className = input.highlighted ? "settings-account-plan settings-account-plan--highlighted" : "settings-account-plan";
|
|
24590
|
+
plan.textContent = input.plan;
|
|
24591
|
+
plan.translate = false;
|
|
24284
24592
|
metadata.append(plan);
|
|
24285
24593
|
}
|
|
24286
|
-
if (
|
|
24287
|
-
|
|
24288
|
-
|
|
24289
|
-
|
|
24594
|
+
if (input.active) {
|
|
24595
|
+
const badge = document2.createElement("span");
|
|
24596
|
+
badge.className = "settings-account-active";
|
|
24597
|
+
badge.textContent = messages.accountDefaultBadge;
|
|
24598
|
+
badge.title = messages.accountDefaultHint;
|
|
24599
|
+
metadata.append(badge);
|
|
24600
|
+
}
|
|
24601
|
+
identity.append(title);
|
|
24602
|
+
if (metadata.childElementCount) identity.append(metadata);
|
|
24603
|
+
person.append(input.mark, identity);
|
|
24604
|
+
return person;
|
|
24605
|
+
}
|
|
24606
|
+
function renderAccountRows(document2, account, messages, input) {
|
|
24607
|
+
const row = document2.createElement("tr");
|
|
24608
|
+
row.className = "settings-account-row";
|
|
24609
|
+
row.dataset.accountId = account.accountId;
|
|
24610
|
+
row.dataset.accountFocus = `${account.accountId}:row`;
|
|
24611
|
+
row.tabIndex = -1;
|
|
24612
|
+
const name = codexAccountDisplayName(account);
|
|
24613
|
+
row.setAttribute("aria-label", name.full);
|
|
24614
|
+
const personCell = document2.createElement("td");
|
|
24615
|
+
personCell.className = "settings-account-person-cell";
|
|
24616
|
+
const mark = document2.createElement("div");
|
|
24617
|
+
mark.className = "settings-account-row__mark";
|
|
24618
|
+
mark.setAttribute("aria-hidden", "true");
|
|
24619
|
+
mark.append(createRendererSettingsIcon("terminal", 17));
|
|
24620
|
+
personCell.append(
|
|
24621
|
+
createAccountPerson(document2, messages, {
|
|
24622
|
+
name: name.full,
|
|
24623
|
+
agent: "Codex",
|
|
24624
|
+
plan: accountPlanLabel(account.planType),
|
|
24625
|
+
highlighted: account.planType === "pro" || account.planType === "prolite",
|
|
24626
|
+
active: account.active,
|
|
24627
|
+
mark
|
|
24628
|
+
})
|
|
24629
|
+
);
|
|
24290
24630
|
const usage = renderAccountUsage(document2, input.usage, messages, input.display, input.onRetry);
|
|
24291
|
-
if (usage)
|
|
24292
|
-
const resetCell = document2.createElement("td");
|
|
24293
|
-
const resetLabel2 = document2.createElement("span");
|
|
24294
|
-
resetLabel2.className = "settings-account-mobile-label";
|
|
24295
|
-
resetLabel2.textContent = messages.accountResetCredits;
|
|
24296
|
-
resetCell.append(resetLabel2);
|
|
24631
|
+
if (usage.additional) personCell.append(usage.additional);
|
|
24297
24632
|
const actionsCell = document2.createElement("td");
|
|
24633
|
+
actionsCell.className = "settings-account-management-cell";
|
|
24634
|
+
const management = document2.createElement("div");
|
|
24635
|
+
management.className = "settings-account-management";
|
|
24298
24636
|
const actions = document2.createElement("div");
|
|
24299
24637
|
actions.className = "settings-account-actions";
|
|
24300
24638
|
if (!account.active) {
|
|
@@ -24302,6 +24640,7 @@ ${error51.stderrTail}`] : []
|
|
|
24302
24640
|
activate.type = "button";
|
|
24303
24641
|
activate.className = "settings-account-action";
|
|
24304
24642
|
activate.textContent = messages.accountUse;
|
|
24643
|
+
activate.title = messages.accountDefaultHint;
|
|
24305
24644
|
activate.dataset.accountFocus = `${account.accountId}:activate`;
|
|
24306
24645
|
activate.disabled = input.actionsDisabled;
|
|
24307
24646
|
activate.addEventListener("click", input.onActivate);
|
|
@@ -24317,30 +24656,45 @@ ${error51.stderrTail}`] : []
|
|
|
24317
24656
|
signIn.addEventListener("click", input.onSignIn);
|
|
24318
24657
|
actions.append(signIn);
|
|
24319
24658
|
}
|
|
24659
|
+
const more = [];
|
|
24660
|
+
if (account.email && input.usage) {
|
|
24661
|
+
const refresh = document2.createElement("button");
|
|
24662
|
+
refresh.type = "button";
|
|
24663
|
+
refresh.className = "settings-account-action";
|
|
24664
|
+
refresh.textContent = messages.accountCreditsRefresh;
|
|
24665
|
+
refresh.dataset.accountFocus = `${account.accountId}:refresh`;
|
|
24666
|
+
refresh.disabled = input.actionsDisabled || input.usage.status === "loading";
|
|
24667
|
+
refresh.addEventListener("click", input.onRetry);
|
|
24668
|
+
more.push(refresh);
|
|
24669
|
+
}
|
|
24320
24670
|
if (!account.isDefault) {
|
|
24321
24671
|
const remove = document2.createElement("button");
|
|
24322
24672
|
remove.type = "button";
|
|
24323
|
-
remove.className = "settings-
|
|
24324
|
-
remove.
|
|
24673
|
+
remove.className = "settings-account-action settings-account-delete";
|
|
24674
|
+
remove.textContent = messages.accountDelete;
|
|
24325
24675
|
remove.dataset.accountFocus = `${account.accountId}:delete`;
|
|
24326
24676
|
remove.setAttribute("aria-label", `${messages.accountDelete}: ${name.full}`);
|
|
24327
24677
|
remove.disabled = input.actionsDisabled;
|
|
24328
|
-
remove.append(createRendererSettingsIcon("trash", 16));
|
|
24329
24678
|
remove.addEventListener("click", input.onDelete);
|
|
24330
|
-
|
|
24331
|
-
}
|
|
24332
|
-
|
|
24333
|
-
|
|
24679
|
+
more.push(remove);
|
|
24680
|
+
}
|
|
24681
|
+
if (more.length)
|
|
24682
|
+
actions.append(
|
|
24683
|
+
createAccountDetails(document2, messages, {
|
|
24684
|
+
label: messages.accountMore,
|
|
24685
|
+
triggerLabel: `${name.full} \xB7 ${messages.accountMore}`,
|
|
24686
|
+
description: name.full,
|
|
24687
|
+
focusKey: `${account.accountId}:more`,
|
|
24688
|
+
icon: "ellipsis",
|
|
24689
|
+
disabled: input.actionsDisabled,
|
|
24690
|
+
actions: more
|
|
24691
|
+
})
|
|
24692
|
+
);
|
|
24693
|
+
management.append(actions);
|
|
24694
|
+
actionsCell.append(management);
|
|
24695
|
+
row.append(personCell, ...usage.cells, actionsCell);
|
|
24334
24696
|
const reset = input.usage?.status === "ready" ? renderAccountResetCredits(document2, input.usage.credits, messages, input) : null;
|
|
24335
|
-
if (!reset)
|
|
24336
|
-
const unknown2 = document2.createElement("span");
|
|
24337
|
-
unknown2.className = "settings-account-unknown";
|
|
24338
|
-
unknown2.textContent = "\u2014";
|
|
24339
|
-
unknown2.title = messages.accountResetCreditsUnknown;
|
|
24340
|
-
unknown2.setAttribute("aria-label", messages.accountResetCreditsUnknown);
|
|
24341
|
-
resetCell.append(unknown2);
|
|
24342
|
-
return [row];
|
|
24343
|
-
}
|
|
24697
|
+
if (!reset) return [row];
|
|
24344
24698
|
const detailsRow = document2.createElement("tr");
|
|
24345
24699
|
detailsRow.className = "settings-account-details-row";
|
|
24346
24700
|
detailsRow.id = `settings-account-reset-${++resetDetailsSequence}`;
|
|
@@ -24357,120 +24711,84 @@ ${error51.stderrTail}`] : []
|
|
|
24357
24711
|
reset.summary.setAttribute("aria-expanded", String(!detailsRow.hidden));
|
|
24358
24712
|
input.onResetExpanded(!detailsRow.hidden);
|
|
24359
24713
|
});
|
|
24360
|
-
|
|
24714
|
+
management.append(reset.summary);
|
|
24361
24715
|
return [row, detailsRow];
|
|
24362
24716
|
}
|
|
24717
|
+
function renderHarnessAccountRow(document2, account, messages, display) {
|
|
24718
|
+
const row = document2.createElement("tr");
|
|
24719
|
+
row.className = "settings-account-row";
|
|
24720
|
+
row.dataset.harnessId = account.harnessId;
|
|
24721
|
+
row.tabIndex = -1;
|
|
24722
|
+
const name = account.email ?? account.label ?? account.harnessName;
|
|
24723
|
+
row.setAttribute("aria-label", name);
|
|
24724
|
+
const personCell = document2.createElement("td");
|
|
24725
|
+
personCell.className = "settings-account-person-cell";
|
|
24726
|
+
const logo = document2.createElement("div");
|
|
24727
|
+
logo.className = "settings-harness-account__logo";
|
|
24728
|
+
logo.setAttribute("aria-hidden", "true");
|
|
24729
|
+
const agent = KNOWN_RENDERER_AGENTS.find((agent2) => agent2 === account.harnessId);
|
|
24730
|
+
if (agent) logo.append(createRendererAgentIcon(agent, 26, document2));
|
|
24731
|
+
personCell.append(
|
|
24732
|
+
createAccountPerson(document2, messages, {
|
|
24733
|
+
name,
|
|
24734
|
+
agent: account.harnessName,
|
|
24735
|
+
plan: account.plan ?? null,
|
|
24736
|
+
mark: logo
|
|
24737
|
+
})
|
|
24738
|
+
);
|
|
24739
|
+
const usage = renderAccountUsage(
|
|
24740
|
+
document2,
|
|
24741
|
+
{ status: "ready", credits: account.credits },
|
|
24742
|
+
messages,
|
|
24743
|
+
display,
|
|
24744
|
+
() => void 0
|
|
24745
|
+
);
|
|
24746
|
+
if (usage.additional) personCell.append(usage.additional);
|
|
24747
|
+
const managementCell = document2.createElement("td");
|
|
24748
|
+
managementCell.className = "settings-account-management-cell";
|
|
24749
|
+
const management = document2.createElement("div");
|
|
24750
|
+
management.className = "settings-account-native";
|
|
24751
|
+
const label = document2.createElement("span");
|
|
24752
|
+
label.textContent = messages.accountNativeManaged;
|
|
24753
|
+
const info = createAccountDetails(document2, messages, {
|
|
24754
|
+
label: `${account.harnessName} \xB7 ${messages.accountNativeManaged}`,
|
|
24755
|
+
description: messages.accountNativeManagementHint.replace("{harness}", account.harnessName),
|
|
24756
|
+
focusKey: `harness:${account.harnessId}:info`,
|
|
24757
|
+
icon: "info",
|
|
24758
|
+
actions: []
|
|
24759
|
+
});
|
|
24760
|
+
management.append(label, info);
|
|
24761
|
+
managementCell.append(management);
|
|
24762
|
+
row.append(personCell, ...usage.cells, managementCell);
|
|
24763
|
+
return row;
|
|
24764
|
+
}
|
|
24363
24765
|
|
|
24364
24766
|
// src/settings/harness-accounts.ts
|
|
24365
|
-
function
|
|
24366
|
-
const document2 = context.content.ownerDocument;
|
|
24367
|
-
const section = document2.createElement("section");
|
|
24368
|
-
section.className = "settings-harness-accounts";
|
|
24369
|
-
section.hidden = true;
|
|
24370
|
-
const heading = document2.createElement("h2");
|
|
24371
|
-
heading.className = "settings-harness-accounts__title";
|
|
24372
|
-
heading.textContent = messages.harnessAccountsTitle;
|
|
24373
|
-
const list = document2.createElement("div");
|
|
24374
|
-
list.className = "settings-account-list";
|
|
24375
|
-
section.append(heading, list);
|
|
24376
|
-
context.content.append(section);
|
|
24767
|
+
function createHarnessAccounts(signal, getClient, onChange) {
|
|
24377
24768
|
let accounts = [];
|
|
24378
24769
|
let refreshing = false;
|
|
24379
|
-
let query = "";
|
|
24380
|
-
let display = "remaining";
|
|
24381
|
-
const render = () => {
|
|
24382
|
-
section.hidden = accounts.length === 0;
|
|
24383
|
-
list.replaceChildren();
|
|
24384
|
-
const visible = accounts.filter(
|
|
24385
|
-
(account) => `${account.harnessName} ${account.email ?? ""} ${account.label ?? ""} ${account.plan ?? ""}`.toLocaleLowerCase().includes(query)
|
|
24386
|
-
);
|
|
24387
|
-
for (const account of visible) {
|
|
24388
|
-
const row = document2.createElement("article");
|
|
24389
|
-
row.className = "settings-harness-account";
|
|
24390
|
-
row.dataset.harnessId = account.harnessId;
|
|
24391
|
-
const identity = document2.createElement("div");
|
|
24392
|
-
identity.className = "settings-harness-account__identity";
|
|
24393
|
-
const name = document2.createElement("strong");
|
|
24394
|
-
name.className = "settings-account-email";
|
|
24395
|
-
const accountName = account.email ?? account.label;
|
|
24396
|
-
name.textContent = accountName ?? account.harnessName;
|
|
24397
|
-
name.title = name.textContent;
|
|
24398
|
-
identity.append(name);
|
|
24399
|
-
const metadata = document2.createElement("div");
|
|
24400
|
-
metadata.className = "settings-account-metadata";
|
|
24401
|
-
if (accountName) {
|
|
24402
|
-
const harness = document2.createElement("span");
|
|
24403
|
-
harness.textContent = account.harnessName;
|
|
24404
|
-
metadata.append(harness);
|
|
24405
|
-
}
|
|
24406
|
-
if (account.plan) {
|
|
24407
|
-
if (accountName) {
|
|
24408
|
-
const separator = document2.createElement("span");
|
|
24409
|
-
separator.textContent = "\xB7";
|
|
24410
|
-
separator.setAttribute("aria-hidden", "true");
|
|
24411
|
-
metadata.append(separator);
|
|
24412
|
-
}
|
|
24413
|
-
const plan = document2.createElement("span");
|
|
24414
|
-
plan.className = "settings-account-plan";
|
|
24415
|
-
plan.textContent = account.plan;
|
|
24416
|
-
metadata.append(plan);
|
|
24417
|
-
}
|
|
24418
|
-
if (metadata.childElementCount) identity.append(metadata);
|
|
24419
|
-
const usage = renderAccountUsage(
|
|
24420
|
-
document2,
|
|
24421
|
-
{ status: "ready", credits: account.credits },
|
|
24422
|
-
messages,
|
|
24423
|
-
display,
|
|
24424
|
-
() => void 0
|
|
24425
|
-
);
|
|
24426
|
-
const person = document2.createElement("div");
|
|
24427
|
-
person.className = "settings-account-row__person";
|
|
24428
|
-
const agent = KNOWN_RENDERER_AGENTS.find((agent2) => agent2 === account.harnessId);
|
|
24429
|
-
if (agent) {
|
|
24430
|
-
const logo = document2.createElement("div");
|
|
24431
|
-
logo.className = "settings-harness-account__logo";
|
|
24432
|
-
logo.setAttribute("aria-hidden", "true");
|
|
24433
|
-
logo.append(createRendererAgentIcon(agent, 28, document2));
|
|
24434
|
-
person.append(logo);
|
|
24435
|
-
}
|
|
24436
|
-
person.append(identity);
|
|
24437
|
-
row.append(person);
|
|
24438
|
-
if (usage) row.append(usage);
|
|
24439
|
-
list.append(row);
|
|
24440
|
-
}
|
|
24441
|
-
if (accounts.length && !visible.length) {
|
|
24442
|
-
const empty = document2.createElement("p");
|
|
24443
|
-
empty.className = "settings-account-empty";
|
|
24444
|
-
empty.textContent = messages.accountNoMatches;
|
|
24445
|
-
list.append(empty);
|
|
24446
|
-
}
|
|
24447
|
-
};
|
|
24448
24770
|
return {
|
|
24771
|
+
get accounts() {
|
|
24772
|
+
return accounts;
|
|
24773
|
+
},
|
|
24449
24774
|
get refreshing() {
|
|
24450
24775
|
return refreshing;
|
|
24451
24776
|
},
|
|
24452
|
-
update(nextQuery, nextDisplay) {
|
|
24453
|
-
query = nextQuery;
|
|
24454
|
-
display = nextDisplay;
|
|
24455
|
-
render();
|
|
24456
|
-
},
|
|
24457
24777
|
async refresh() {
|
|
24458
|
-
if (refreshing ||
|
|
24778
|
+
if (refreshing || signal.aborted) return;
|
|
24459
24779
|
const client = getClient();
|
|
24460
24780
|
if (!client?.listHarnessAccounts) return;
|
|
24461
24781
|
refreshing = true;
|
|
24462
24782
|
onChange();
|
|
24463
24783
|
try {
|
|
24464
24784
|
const result = await client.listHarnessAccounts();
|
|
24465
|
-
if (!
|
|
24785
|
+
if (!signal.aborted)
|
|
24786
|
+
accounts = [...result.accounts].sort((a, b) => a.harnessId.localeCompare(b.harnessId));
|
|
24466
24787
|
} catch {
|
|
24467
|
-
if (!
|
|
24788
|
+
if (!signal.aborted) accounts = [];
|
|
24468
24789
|
} finally {
|
|
24469
24790
|
refreshing = false;
|
|
24470
|
-
if (!
|
|
24471
|
-
render();
|
|
24472
|
-
onChange();
|
|
24473
|
-
}
|
|
24791
|
+
if (!signal.aborted) onChange();
|
|
24474
24792
|
}
|
|
24475
24793
|
}
|
|
24476
24794
|
};
|
|
@@ -24490,16 +24808,13 @@ ${error51.stderrTail}`] : []
|
|
|
24490
24808
|
const header = document2.createElement("div");
|
|
24491
24809
|
header.className = "settings-account-header";
|
|
24492
24810
|
const copy = document2.createElement("div");
|
|
24493
|
-
const eyebrow = document2.createElement("p");
|
|
24494
|
-
eyebrow.className = "settings-account-eyebrow";
|
|
24495
|
-
eyebrow.textContent = "ACCOUNT MANAGEMENT";
|
|
24496
24811
|
const heading = document2.createElement("h1");
|
|
24497
24812
|
heading.className = "settings-section-label";
|
|
24498
24813
|
heading.textContent = messages.pageLabels.accounts;
|
|
24499
24814
|
const description = document2.createElement("p");
|
|
24500
24815
|
description.className = "settings-page-description";
|
|
24501
24816
|
description.textContent = messages.accountsDescription;
|
|
24502
|
-
copy.append(
|
|
24817
|
+
copy.append(heading, description);
|
|
24503
24818
|
const add = document2.createElement("button");
|
|
24504
24819
|
add.type = "button";
|
|
24505
24820
|
add.className = "settings-command-button";
|
|
@@ -24508,29 +24823,6 @@ ${error51.stderrTail}`] : []
|
|
|
24508
24823
|
const status = document2.createElement("p");
|
|
24509
24824
|
status.className = "settings-account-status";
|
|
24510
24825
|
status.setAttribute("aria-live", "polite");
|
|
24511
|
-
const helpRow = document2.createElement("div");
|
|
24512
|
-
helpRow.className = "settings-account-help-row";
|
|
24513
|
-
const taskHint = document2.createElement("p");
|
|
24514
|
-
taskHint.className = "settings-account-task-hint";
|
|
24515
|
-
const taskHintText = document2.createElement("span");
|
|
24516
|
-
taskHintText.textContent = messages.accountTaskHint;
|
|
24517
|
-
taskHint.append(createRendererSettingsIcon("info", 16), taskHintText);
|
|
24518
|
-
const help = document2.createElement("button");
|
|
24519
|
-
help.type = "button";
|
|
24520
|
-
help.className = "settings-account-help-button";
|
|
24521
|
-
help.append(createRendererSettingsIcon("help", 16), messages.accountLoginHelp);
|
|
24522
|
-
help.setAttribute("aria-expanded", "false");
|
|
24523
|
-
help.setAttribute("aria-controls", "settings-account-login-help");
|
|
24524
|
-
const deviceCodeNote = document2.createElement("p");
|
|
24525
|
-
deviceCodeNote.id = "settings-account-login-help";
|
|
24526
|
-
deviceCodeNote.className = "settings-account-device-code-note";
|
|
24527
|
-
deviceCodeNote.textContent = messages.accountDeviceCodePrerequisite;
|
|
24528
|
-
deviceCodeNote.hidden = true;
|
|
24529
|
-
help.addEventListener("click", () => {
|
|
24530
|
-
deviceCodeNote.hidden = !deviceCodeNote.hidden;
|
|
24531
|
-
help.setAttribute("aria-expanded", String(!deviceCodeNote.hidden));
|
|
24532
|
-
});
|
|
24533
|
-
helpRow.append(taskHint, help);
|
|
24534
24826
|
const toolbar = document2.createElement("div");
|
|
24535
24827
|
toolbar.className = "settings-account-toolbar";
|
|
24536
24828
|
const connected = document2.createElement("div");
|
|
@@ -24578,9 +24870,10 @@ ${error51.stderrTail}`] : []
|
|
|
24578
24870
|
toolbar.append(connected, searchWrapper, displayControls, refreshUsage);
|
|
24579
24871
|
const list = document2.createElement("div");
|
|
24580
24872
|
list.className = "settings-account-list";
|
|
24581
|
-
const { table, body } = createAccountsTable(document2, messages);
|
|
24873
|
+
const { table, body, updateDisplay } = createAccountsTable(document2, messages);
|
|
24582
24874
|
list.append(table);
|
|
24583
|
-
context.content.append(header,
|
|
24875
|
+
context.content.append(header, status, toolbar, list);
|
|
24876
|
+
const stopCountdowns = mountAccountResetCountdowns(list, messages, context.signal);
|
|
24584
24877
|
let accounts = [];
|
|
24585
24878
|
let accountCreating = false;
|
|
24586
24879
|
let accountActivating = false;
|
|
@@ -24630,18 +24923,21 @@ ${error51.stderrTail}`] : []
|
|
|
24630
24923
|
const restoreFocus = accountListFocusRestorer(list, search);
|
|
24631
24924
|
body.replaceChildren();
|
|
24632
24925
|
status.textContent = loginMessage ?? "";
|
|
24633
|
-
connectedCount.textContent = String(accounts.
|
|
24926
|
+
connectedCount.textContent = String(accounts.length + harnessAccounts.accounts.length);
|
|
24927
|
+
updateDisplay(usageDisplay);
|
|
24634
24928
|
search.disabled = login !== null || loginStartingAccountId !== null;
|
|
24635
24929
|
for (const [display, button] of displayButtons) {
|
|
24636
24930
|
button.setAttribute("aria-pressed", String(display === usageDisplay));
|
|
24637
24931
|
}
|
|
24638
24932
|
refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage || !accounts.some((account) => account.email)) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading") || accountBusy();
|
|
24639
24933
|
const query = search.value.trim().toLocaleLowerCase();
|
|
24640
|
-
harnessAccounts?.update(query, usageDisplay);
|
|
24641
24934
|
const visibleAccounts = accounts.filter(
|
|
24642
|
-
(account) =>
|
|
24935
|
+
(account) => `Codex ${account.email ?? ""} ${account.label} ${accountPlanLabel(account.planType) ?? ""}`.toLocaleLowerCase().includes(query)
|
|
24643
24936
|
);
|
|
24644
|
-
|
|
24937
|
+
const visibleHarnessAccounts = harnessAccounts.accounts.filter(
|
|
24938
|
+
(account) => `${account.harnessName} ${account.email ?? ""} ${account.label ?? ""} ${account.plan ?? ""}`.toLocaleLowerCase().includes(query)
|
|
24939
|
+
);
|
|
24940
|
+
if (visibleAccounts.length + visibleHarnessAccounts.length === 0) {
|
|
24645
24941
|
const emptyRow = document2.createElement("tr");
|
|
24646
24942
|
const emptyCell = document2.createElement("td");
|
|
24647
24943
|
emptyCell.colSpan = 4;
|
|
@@ -24726,6 +25022,9 @@ ${error51.stderrTail}`] : []
|
|
|
24726
25022
|
body.append(verificationRow);
|
|
24727
25023
|
}
|
|
24728
25024
|
}
|
|
25025
|
+
for (const account of visibleHarnessAccounts) {
|
|
25026
|
+
body.append(renderHarnessAccountRow(document2, account, messages, usageDisplay));
|
|
25027
|
+
}
|
|
24729
25028
|
restoreFocus();
|
|
24730
25029
|
};
|
|
24731
25030
|
const client = () => {
|
|
@@ -24956,10 +25255,11 @@ ${error51.stderrTail}`] : []
|
|
|
24956
25255
|
});
|
|
24957
25256
|
} catch {
|
|
24958
25257
|
}
|
|
24959
|
-
const harnessAccounts =
|
|
25258
|
+
const harnessAccounts = createHarnessAccounts(context.signal, getClient, render);
|
|
24960
25259
|
void harnessAccounts.refresh();
|
|
24961
25260
|
load();
|
|
24962
25261
|
return () => {
|
|
25262
|
+
stopCountdowns();
|
|
24963
25263
|
clearLoginRefresh();
|
|
24964
25264
|
unsubscribe?.();
|
|
24965
25265
|
};
|
|
@@ -25451,6 +25751,7 @@ ${error51.stderrTail}`] : []
|
|
|
25451
25751
|
createConnectionsSettingsPage(messages, getDiagnostics),
|
|
25452
25752
|
createAccountsSettingsPage(messages, getAccountClient),
|
|
25453
25753
|
createSessionImportSettingsPage(messages, getSessionImportClient, openImportedThread),
|
|
25754
|
+
createAppearanceSettingsPage(messages),
|
|
25454
25755
|
updatesPage(messages, getUpdateClient),
|
|
25455
25756
|
aboutPage(messages)
|
|
25456
25757
|
]);
|
|
@@ -25469,10 +25770,10 @@ ${error51.stderrTail}`] : []
|
|
|
25469
25770
|
}
|
|
25470
25771
|
|
|
25471
25772
|
// src/settings/shell.css
|
|
25472
|
-
var shell_default = ':host {\n --settings-bg: light-dark(#ffffff, #202020);\n --settings-sidebar: light-dark(#f7f7f8, #191919);\n --settings-panel: light-dark(#ffffff, #232323);\n --settings-surface: light-dark(#f6f6f6, #292929);\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-inset: light-dark(#f3f3f3, #161616);\n --settings-text: light-dark(#0d0d0d, #ececec);\n --settings-muted: light-dark(#676767, #a3a3a3);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\n --settings-focus: light-dark(#0b75d1, #66aaf9);\n --settings-primary: light-dark(#171717, #f4f4f4);\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\n --settings-primary-text: light-dark(#ffffff, #171717);\n --settings-warning: light-dark(#8a5500, #f5c96a);\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\n --settings-danger: light-dark(#b42318, #f87171);\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\n --settings-success: light-dark(#16784a, #4ade80);\n color: var(--settings-text);\n color-scheme: inherit;\n font:\n 13px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 14px;\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\n}\n\n.codexhost-settings-dialog::backdrop {\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\n backdrop-filter: blur(1px);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 184px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 14px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 48px;\n flex: none;\n padding: 0 12px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-header-actions {\n display: flex;\n align-items: center;\n flex: none;\n gap: 12px;\n margin-left: auto;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 24px;\n height: 24px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 8px;\n padding-left: 8px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 2px;\n padding: 0 7px 10px;\n overflow-y: auto;\n}\n\n.settings-nav-section-label {\n min-height: 24px;\n padding: 4px 9px 2px;\n color: var(--settings-subtle);\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-nav-section-label:not(:first-child) {\n margin-top: 8px;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 34px;\n flex: none;\n gap: 9px;\n padding: 6px 9px;\n color: var(--settings-text);\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 16px;\n height: 16px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-nav-star-link {\n margin-top: 0;\n color: var(--settings-text);\n text-decoration: none;\n}\n\n.settings-nav-star-link .codexhost-settings-icon {\n color: var(--settings-warning);\n}\n\n.settings-nav-star-link:hover {\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 28px 0 36px;\n}\n\n.settings-section-label {\n min-height: auto;\n margin: 0;\n padding: 0 0 18px;\n color: var(--settings-text);\n font-size: 18px;\n font-weight: 600;\n line-height: 26px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 72px;\n gap: 20px;\n padding: 12px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 10px;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 3px 8px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-page-description {\n max-width: 760px;\n margin: -10px 0 20px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 24px;\n}\n\n.settings-session-import-header .settings-section-label {\n min-width: 0;\n}\n\n.settings-session-import-harness {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n margin: -12px 0 16px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-session-import-harness > span {\n flex: none;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n align-items: center;\n min-width: 0;\n flex: 1;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.settings-session-import-harness__options::-webkit-scrollbar {\n display: none;\n}\n\n.settings-session-import-harness__option {\n min-height: 32px;\n flex: none;\n padding: 6px 10px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n white-space: nowrap;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-session-import-harness__option[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n border-color: rgb(51 156 255 / 50%);\n}\n\n.settings-session-import-harness__option:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.settings-session-import-harness__option:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-harness + .settings-page-description {\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.settings-session-import-availability-note {\n margin-top: 0;\n}\n\n.settings-session-import-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin: 16px 0;\n}\n\n.settings-session-import-search input {\n flex: 1;\n min-width: 160px;\n}\n\n.settings-session-import-search input,\n.settings-session-import-pagination select {\n min-height: 36px;\n padding: 6px 10px;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-search input:focus-visible,\n.settings-session-import-pagination select:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-pagination {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-session-import-pagination label {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-session-import-pagination > span {\n flex: 1;\n min-width: 130px;\n}\n\n.settings-session-import-pagination__navigation {\n display: flex;\n gap: 8px;\n margin-left: auto;\n}\n\n.settings-session-import-content,\n.settings-session-import-list {\n display: grid;\n gap: 10px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 64px;\n gap: 12px;\n padding: 16px;\n color: var(--settings-muted);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-status.is-error {\n color: #ef4444;\n}\n\n.settings-session-import-recovery {\n display: grid;\n justify-items: start;\n gap: 14px;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-recovery:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 4px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 14px;\n}\n\n.settings-session-import-recovery__copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-session-import-recovery__path {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n padding: 8px 10px;\n overflow-x: auto;\n color: var(--settings-text);\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery__path .settings-command-button {\n min-height: 0;\n flex: none;\n border-width: 0 0 0 1px;\n border-radius: 0;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-width: 0;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-row__copy {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-session-import-row__copy strong {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__cwd {\n display: block;\n min-width: 0;\n background: transparent;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-preference-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 32px;\n min-height: 88px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-divider);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-preference-row__copy {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n gap: 5px;\n}\n\n.settings-preference-row__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-preference-row__copy span {\n max-width: 680px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-preference-switch {\n display: inline-flex;\n align-items: center;\n width: 42px;\n height: 24px;\n flex: none;\n padding: 2px;\n border: 0;\n border-radius: 999px;\n background: var(--settings-surface-hover);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.settings-preference-switch[aria-checked="true"] {\n justify-content: flex-end;\n background: var(--settings-focus);\n}\n\n.settings-preference-switch:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-preference-switch__thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--settings-primary-text);\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\n}\n\n.settings-connection-page-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 18px;\n margin-bottom: 18px;\n}\n\n.settings-connection-page-header .settings-section-label {\n padding-bottom: 0;\n}\n\n.settings-connection-page-header .settings-page-description {\n margin: 5px 0 0;\n}\n\n.settings-connections-content,\n.settings-connections-layout,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-layout {\n display: grid;\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\n align-items: start;\n gap: 18px;\n}\n\n.settings-connection-list,\n.settings-connection-inspector {\n overflow: hidden;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-host-strip {\n display: grid;\n grid-template-columns: 30px minmax(0, 1fr) 30px;\n align-items: center;\n min-width: 0;\n gap: 5px;\n padding: 9px 10px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-host-scroll {\n display: none;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 34px;\n padding: 0;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-connection-host-strip[data-connection-host-overflow="true"]\n .settings-connection-host-scroll {\n display: inline-flex;\n}\n\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.settings-connection-host-scroll:hover:not(:disabled) {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-scroll:disabled {\n cursor: default;\n opacity: 0.35;\n}\n\n.settings-connection-host-scroll:focus-visible,\n.settings-connection-host-tab:focus-visible,\n.settings-connection-row:focus-visible,\n.settings-connection-install-link:focus-visible,\n.settings-connection-view-error:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-connection-host-tabs {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n scroll-behavior: smooth;\n scroll-snap-type: x proximity;\n touch-action: pan-x;\n}\n\n.settings-connection-host-tabs::-webkit-scrollbar {\n display: none;\n}\n\n.settings-connection-host-tab {\n display: inline-flex;\n align-items: center;\n height: 30px;\n min-width: max-content;\n flex: none;\n padding: 0 9px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n cursor: pointer;\n scroll-snap-align: start;\n}\n\n.settings-connection-host-tab:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-tab[aria-selected="true"] {\n color: var(--settings-text);\n font-weight: 600;\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-table-header,\n.settings-connection-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\n align-items: center;\n min-width: 0;\n gap: 10px;\n}\n\n.settings-connection-table-header {\n min-height: 30px;\n padding: 0 10px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: transparent;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row:hover {\n background: var(--settings-hover);\n}\n\n.settings-connection-row[data-connection-selected="true"] {\n background: var(--settings-surface);\n}\n\n.settings-connection-row__identity,\n.settings-connection-inspector__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n color: var(--settings-text);\n}\n\n.settings-connection-row__identity strong,\n.settings-connection-inspector__identity strong {\n min-width: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n flex: none;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface);\n border-radius: 6px;\n}\n\n.settings-connection-row__mark--logo {\n color: var(--settings-text);\n background: transparent;\n}\n\n.settings-connection-row__mark--logo > img,\n.settings-connection-row__mark--logo > svg {\n display: block;\n max-width: 18px;\n max-height: 18px;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n gap: 5px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__status::before {\n width: 6px;\n height: 6px;\n flex: none;\n content: "";\n background: currentColor;\n border-radius: 50%;\n}\n\n.settings-connection-row__status[data-connection-tone="ready"] {\n color: var(--settings-success);\n}\n\n.settings-connection-row__status[data-connection-tone="checking"] {\n color: var(--settings-warning);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"] {\n color: var(--settings-muted);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"]::before {\n background: transparent;\n border: 1.5px solid currentColor;\n}\n\n.settings-connection-row__status[data-connection-tone="failed"] {\n color: var(--settings-danger);\n}\n\n.settings-connection-row__action {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-connection-row__handle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n color: var(--settings-muted);\n cursor: grab;\n opacity: 0.6;\n}\n\n.settings-connection-row__handle:hover {\n opacity: 1;\n}\n\n.settings-connection-row[draggable="true"] {\n cursor: grab;\n}\n\n.settings-connection-row[data-connection-dragging="true"] {\n opacity: 0.4;\n}\n\n.settings-connection-row[data-connection-drop-indicator="before"] {\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row[data-connection-drop-indicator="after"] {\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row__group-toggle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-row__group-toggle:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-group-divider {\n padding: 10px 12px 6px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n /* No border-top here: the row immediately above already carries its own\n border-bottom (it is no longer :last-child once this divider follows\n it), so adding one here would double the separator line. */\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] {\n background: rgb(51 156 255 / 8%);\n}\n\n.settings-connection-group-hint {\n display: grid;\n gap: 3px;\n margin: 0 12px 12px;\n padding: 14px 16px;\n text-align: center;\n border: 1.5px dashed var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\n border-color: var(--settings-focus);\n}\n\n.settings-connection-group-hint strong {\n color: var(--settings-text);\n font-size: 12.5px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-group-hint span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 17px;\n}\n\n.settings-connection-group-reset {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 6px;\n padding: 10px 12px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n text-align: left;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n cursor: pointer;\n}\n\n.settings-connection-group-reset:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-install-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-focus);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-row:hover .settings-connection-install-link,\n.settings-connection-install-link:focus-visible {\n opacity: 1;\n}\n\n.settings-connection-install-link:hover {\n color: var(--settings-focus);\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-view-error {\n padding: 4px 7px;\n color: var(--settings-danger);\n font: inherit;\n font-size: 11px;\n line-height: 18px;\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-view-error:hover {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n\n.settings-connection-inspector {\n position: sticky;\n top: 18px;\n}\n\n.settings-connection-inspector__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n min-width: 0;\n gap: 10px;\n padding: 12px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-inspector__body {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 12px;\n}\n\n.settings-connection-install-callout {\n display: grid;\n grid-template-columns: 28px minmax(0, 1fr);\n gap: 9px;\n padding: 11px;\n background: var(--settings-surface);\n border: 0;\n border-radius: 8px;\n}\n\n.settings-connection-install-callout__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: var(--settings-focus);\n background: var(--settings-active);\n border-radius: 7px;\n}\n\n.settings-connection-install-callout strong,\n.settings-connection-error-summary strong,\n.settings-connection-state-summary strong {\n display: block;\n margin: 0 0 4px;\n color: var(--settings-text);\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-install-callout p,\n.settings-connection-error-summary p,\n.settings-connection-state-summary p,\n.settings-connection-issue-note {\n margin: 0;\n color: var(--settings-muted);\n font-size: 11px;\n line-height: 16px;\n}\n\n.settings-connection-install-button {\n width: fit-content;\n}\n\n.settings-connection-error-summary {\n padding: 13px 14px;\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.settings-connection-error-metadata {\n display: grid;\n gap: 7px;\n padding: 12px;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-detail-line {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n line-height: 16px;\n}\n\n.settings-connection-detail-line code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n white-space: pre-wrap;\n}\n\n.settings-connection-error-log-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.settings-connection-error-log-header strong {\n color: var(--settings-text);\n font-size: 11px;\n font-weight: 600;\n}\n\n.settings-connection-error-log-header .settings-command-button {\n min-height: 30px;\n padding: 5px 9px;\n font-size: 11px;\n}\n\n.settings-connection-stderr {\n max-height: 220px;\n min-width: 0;\n margin: 0;\n padding: 11px;\n overflow: auto;\n color: var(--settings-text);\n font:\n 10px/16px ui-monospace,\n "SFMono-Regular",\n Consolas,\n "Liberation Mono",\n monospace;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-error-actions {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n}\n\n.settings-connection-error-actions .settings-command-button {\n width: 100%;\n}\n\n.settings-connection-issue-note {\n margin-top: -4px;\n}\n\n.settings-connection-state-summary {\n padding: 14px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-about-panel {\n display: grid;\n max-width: 720px;\n gap: 18px;\n padding: 24px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-about-product {\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 700;\n line-height: 32px;\n}\n\n.settings-about-tagline {\n color: var(--settings-text);\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.settings-about-copy {\n display: grid;\n max-width: 660px;\n gap: 12px;\n}\n\n.settings-about-copy p,\n.settings-about-repository p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-star-callout {\n margin: 2px 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository {\n display: grid;\n gap: 10px;\n padding-top: 18px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-about-repository-link {\n display: flex;\n align-items: center;\n width: fit-content;\n min-width: 0;\n max-width: 100%;\n gap: 8px;\n color: var(--settings-focus);\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-repository-link code {\n min-width: 0;\n overflow: hidden;\n color: var(--settings-muted);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 11px;\n font-weight: 400;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n/* The only emphasis on this screen: a latest version newer than the installed one. */\n.settings-update-metadata__value--newer {\n color: var(--settings-focus);\n}\n\n.settings-update-panel {\n display: grid;\n gap: 12px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel__head {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-panel__head .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel__title {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: var(--settings-danger);\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: var(--settings-focus);\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\n.settings-update-notes-section {\n min-width: 0;\n margin-top: 24px;\n padding-top: 24px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes-section:empty {\n display: none;\n}\n\n.settings-update-notes {\n display: grid;\n min-width: 0;\n gap: 12px;\n color: var(--settings-muted);\n font-size: 14px;\n line-height: 22px;\n overflow-wrap: anywhere;\n}\n\n.settings-update-notes > :first-child {\n margin-top: 0;\n}\n\n.settings-update-notes > :last-child {\n margin-bottom: 0;\n}\n\n.settings-update-notes h1,\n.settings-update-notes h2,\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n margin: 6px 0 0;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes h1 {\n font-size: 18px;\n line-height: 26px;\n}\n\n.settings-update-notes h2 {\n font-size: 17px;\n line-height: 24px;\n}\n\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n font-size: 14px;\n line-height: 22px;\n}\n\n.settings-update-notes p,\n.settings-update-notes ul,\n.settings-update-notes ol,\n.settings-update-notes pre,\n.settings-update-notes blockquote {\n margin: 0;\n}\n\n.settings-update-notes ul,\n.settings-update-notes ol {\n padding-left: 24px;\n}\n\n.settings-update-notes li {\n padding-left: 4px;\n}\n\n.settings-update-notes li::marker {\n color: var(--settings-muted);\n font-size: 0.85em;\n}\n\n.settings-update-notes li + li {\n margin-top: 14px;\n}\n\n.settings-update-notes .release-note-translation {\n display: block;\n margin-top: 3px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-notes blockquote {\n padding: 8px 12px;\n color: var(--settings-muted);\n border-left: 3px solid var(--settings-focus);\n background: var(--settings-surface);\n}\n\n.settings-update-notes hr {\n width: 100%;\n margin: 2px 0;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes strong {\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes a {\n color: var(--settings-focus);\n text-decoration: none;\n}\n\n.settings-update-notes a:hover {\n text-decoration: underline;\n}\n\n.settings-update-notes code {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n}\n\n.settings-update-notes :not(pre) > code {\n padding: 1px 5px;\n background: var(--settings-surface);\n border-radius: 4px;\n}\n\n.settings-update-notes pre {\n min-width: 0;\n max-width: 100%;\n padding: 10px 12px;\n overflow-x: auto;\n overflow-y: hidden;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n/* Manual update sits directly under the status panel, not behind a disclosure:\n automatic updates can fail for machine-local reasons and this is the way out. */\n.settings-update-controls {\n display: grid;\n min-width: 0;\n gap: 10px;\n margin-top: 24px;\n}\n\n.settings-update-manual-title {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual-description {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual-description.is-fallback {\n color: var(--settings-danger);\n}\n\n.settings-update-command {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-update-command code {\n min-width: 0;\n flex: 1;\n padding: 9px 12px;\n overflow-x: auto;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-update-command__copy {\n display: inline-flex;\n align-items: center;\n flex: none;\n gap: 6px;\n padding: 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-left: 1px solid var(--settings-border);\n cursor: pointer;\n}\n\n.settings-update-command__copy:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-update-command__copy:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-update-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: max-content;\n max-width: 100%;\n min-height: 30px;\n gap: 6px;\n padding: 5px 10px;\n white-space: nowrap;\n color: var(--settings-primary-text);\n font: inherit;\n font-size: 12px;\n text-decoration: none;\n background: var(--settings-primary);\n border: 1px solid var(--settings-primary);\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: var(--settings-panel);\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover:not(:disabled) {\n background: var(--settings-primary-hover);\n border-color: var(--settings-primary-hover);\n}\n\n.settings-command-button--secondary:hover:not(:disabled),\n.settings-update-link:hover {\n background: var(--settings-hover);\n border-color: var(--settings-border);\n}\n\n.settings-command-button--danger {\n color: #f87171;\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: rgb(127 29 29 / 24%);\n border-color: rgb(248 113 113 / 45%);\n}\n\n.settings-command-button:disabled {\n cursor: default;\n opacity: 0.45;\n}\n\n.settings-command-button:disabled,\n.settings-command-button[aria-disabled="true"] {\n opacity: 0.55;\n cursor: not-allowed;\n filter: none;\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n align-items: flex-start;\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-section-label {\n display: none;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-nav-star-link {\n margin-top: 0;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-update-metadata {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-account-header,\n .settings-connection-page-header {\n flex-direction: column;\n }\n\n .settings-account-header > .settings-command-button,\n .settings-connection-page-header > .settings-command-button {\n width: 100%;\n }\n\n .settings-connections-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-connection-inspector {\n position: static;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-surface: Canvas;\n --settings-surface-hover: Highlight;\n --settings-inset: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-subtle: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n --settings-primary: ButtonFace;\n --settings-primary-hover: Highlight;\n --settings-primary-text: ButtonText;\n --settings-warning: CanvasText;\n --settings-warning-bg: Canvas;\n --settings-warning-border: ButtonBorder;\n --settings-danger: CanvasText;\n --settings-danger-bg: Canvas;\n --settings-danger-border: ButtonBorder;\n --settings-success: CanvasText;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n transition-duration: 0s !important;\n }\n}\n';
|
|
25773
|
+
var shell_default = ':host {\n --settings-bg: light-dark(#ffffff, #202020);\n --settings-sidebar: light-dark(#f7f7f8, #191919);\n --settings-panel: light-dark(#ffffff, #232323);\n --settings-surface: light-dark(#f6f6f6, #292929);\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-inset: light-dark(#f3f3f3, #161616);\n --settings-text: light-dark(#0d0d0d, #ececec);\n --settings-muted: light-dark(#676767, #a3a3a3);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\n --settings-focus: light-dark(#0b75d1, #66aaf9);\n --settings-primary: light-dark(#171717, #f4f4f4);\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\n --settings-primary-text: light-dark(#ffffff, #171717);\n --settings-warning: light-dark(#8a5500, #f5c96a);\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\n --settings-danger: light-dark(#b42318, #f87171);\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\n --settings-success: light-dark(#16784a, #4ade80);\n color: var(--settings-text);\n color-scheme: inherit;\n font:\n 13px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 14px;\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\n}\n\n.codexhost-settings-dialog::backdrop {\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\n backdrop-filter: blur(1px);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 184px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 14px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 48px;\n flex: none;\n padding: 0 12px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-header-actions {\n display: flex;\n align-items: center;\n flex: none;\n gap: 12px;\n margin-left: auto;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 24px;\n height: 24px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 8px;\n padding-left: 8px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 2px;\n padding: 0 7px 10px;\n overflow-y: auto;\n}\n\n.settings-nav-section-label {\n min-height: 24px;\n padding: 4px 9px 2px;\n color: var(--settings-subtle);\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-nav-section-label:not(:first-child) {\n margin-top: 8px;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 34px;\n flex: none;\n gap: 9px;\n padding: 6px 9px;\n color: var(--settings-text);\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 16px;\n height: 16px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-nav-star-link {\n margin-top: 0;\n color: var(--settings-text);\n text-decoration: none;\n}\n\n.settings-nav-star-link .codexhost-settings-icon {\n color: var(--settings-warning);\n}\n\n.settings-nav-star-link:hover {\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 28px 0 36px;\n}\n\n.settings-section-label {\n min-height: auto;\n margin: 0;\n padding: 0 0 18px;\n color: var(--settings-text);\n font-size: 18px;\n font-weight: 600;\n line-height: 26px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 72px;\n gap: 20px;\n padding: 12px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 10px;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 3px 8px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-page-description {\n max-width: 760px;\n margin: -10px 0 20px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 24px;\n}\n\n.settings-session-import-header .settings-section-label {\n min-width: 0;\n}\n\n.settings-session-import-harness {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n margin: -12px 0 16px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-session-import-harness > span {\n flex: none;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n align-items: center;\n min-width: 0;\n flex: 1;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.settings-session-import-harness__options::-webkit-scrollbar {\n display: none;\n}\n\n.settings-session-import-harness__option {\n min-height: 32px;\n flex: none;\n padding: 6px 10px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n white-space: nowrap;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-session-import-harness__option[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n border-color: rgb(51 156 255 / 50%);\n}\n\n.settings-session-import-harness__option:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.settings-session-import-harness__option:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-harness + .settings-page-description {\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.settings-session-import-availability-note {\n margin-top: 0;\n}\n\n.settings-session-import-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin: 16px 0;\n}\n\n.settings-session-import-search input {\n flex: 1;\n min-width: 160px;\n}\n\n.settings-session-import-search input,\n.settings-session-import-pagination select {\n min-height: 36px;\n padding: 6px 10px;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-search input:focus-visible,\n.settings-session-import-pagination select:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-pagination {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-session-import-pagination label {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-session-import-pagination > span {\n flex: 1;\n min-width: 130px;\n}\n\n.settings-session-import-pagination__navigation {\n display: flex;\n gap: 8px;\n margin-left: auto;\n}\n\n.settings-session-import-content,\n.settings-session-import-list {\n display: grid;\n gap: 10px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 64px;\n gap: 12px;\n padding: 16px;\n color: var(--settings-muted);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-status.is-error {\n color: #ef4444;\n}\n\n.settings-session-import-recovery {\n display: grid;\n justify-items: start;\n gap: 14px;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-recovery:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 4px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 14px;\n}\n\n.settings-session-import-recovery__copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-session-import-recovery__path {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n padding: 8px 10px;\n overflow-x: auto;\n color: var(--settings-text);\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery__path .settings-command-button {\n min-height: 0;\n flex: none;\n border-width: 0 0 0 1px;\n border-radius: 0;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-width: 0;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-row__copy {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-session-import-row__copy strong {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__cwd {\n display: block;\n min-width: 0;\n background: transparent;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-preference-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 32px;\n min-height: 88px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-divider);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-preference-row__copy {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n gap: 5px;\n}\n\n.settings-preference-row__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-preference-row__copy span {\n max-width: 680px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-preference-switch {\n display: inline-flex;\n align-items: center;\n width: 42px;\n height: 24px;\n flex: none;\n padding: 2px;\n border: 0;\n border-radius: 999px;\n background: var(--settings-surface-hover);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.settings-preference-switch[aria-checked="true"] {\n justify-content: flex-end;\n background: var(--settings-focus);\n}\n\n.settings-preference-switch:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-preference-switch__thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--settings-primary-text);\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\n}\n\n.settings-preference-checkbox {\n width: 18px;\n height: 18px;\n flex: none;\n margin: 0;\n accent-color: var(--settings-focus);\n cursor: pointer;\n}\n\n.settings-preference-checkbox:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-connection-page-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 18px;\n margin-bottom: 18px;\n}\n\n.settings-connection-page-header .settings-section-label {\n padding-bottom: 0;\n}\n\n.settings-connection-page-header .settings-page-description {\n margin: 5px 0 0;\n}\n\n.settings-connections-content,\n.settings-connections-layout,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-layout {\n display: grid;\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\n align-items: start;\n gap: 18px;\n}\n\n.settings-connection-list,\n.settings-connection-inspector {\n overflow: hidden;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-host-strip {\n display: grid;\n grid-template-columns: 30px minmax(0, 1fr) 30px;\n align-items: center;\n min-width: 0;\n gap: 5px;\n padding: 9px 10px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-host-scroll {\n display: none;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 34px;\n padding: 0;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-connection-host-strip[data-connection-host-overflow="true"]\n .settings-connection-host-scroll {\n display: inline-flex;\n}\n\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.settings-connection-host-scroll:hover:not(:disabled) {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-scroll:disabled {\n cursor: default;\n opacity: 0.35;\n}\n\n.settings-connection-host-scroll:focus-visible,\n.settings-connection-host-tab:focus-visible,\n.settings-connection-row:focus-visible,\n.settings-connection-install-link:focus-visible,\n.settings-connection-view-error:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-connection-host-tabs {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n scroll-behavior: smooth;\n scroll-snap-type: x proximity;\n touch-action: pan-x;\n}\n\n.settings-connection-host-tabs::-webkit-scrollbar {\n display: none;\n}\n\n.settings-connection-host-tab {\n display: inline-flex;\n align-items: center;\n height: 30px;\n min-width: max-content;\n flex: none;\n padding: 0 9px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n cursor: pointer;\n scroll-snap-align: start;\n}\n\n.settings-connection-host-tab:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-tab[aria-selected="true"] {\n color: var(--settings-text);\n font-weight: 600;\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-table-header,\n.settings-connection-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\n align-items: center;\n min-width: 0;\n gap: 10px;\n}\n\n.settings-connection-table-header {\n min-height: 30px;\n padding: 0 10px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: transparent;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row:hover {\n background: var(--settings-hover);\n}\n\n.settings-connection-row[data-connection-selected="true"] {\n background: var(--settings-surface);\n}\n\n.settings-connection-row__identity,\n.settings-connection-inspector__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n color: var(--settings-text);\n}\n\n.settings-connection-row__identity strong,\n.settings-connection-inspector__identity strong {\n min-width: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n flex: none;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface);\n border-radius: 6px;\n}\n\n.settings-connection-row__mark--logo {\n color: var(--settings-text);\n background: transparent;\n}\n\n.settings-connection-row__mark--logo > img,\n.settings-connection-row__mark--logo > svg {\n display: block;\n max-width: 18px;\n max-height: 18px;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n gap: 5px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__status::before {\n width: 6px;\n height: 6px;\n flex: none;\n content: "";\n background: currentColor;\n border-radius: 50%;\n}\n\n.settings-connection-row__status[data-connection-tone="ready"] {\n color: var(--settings-success);\n}\n\n.settings-connection-row__status[data-connection-tone="checking"] {\n color: var(--settings-warning);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"] {\n color: var(--settings-muted);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"]::before {\n background: transparent;\n border: 1.5px solid currentColor;\n}\n\n.settings-connection-row__status[data-connection-tone="failed"] {\n color: var(--settings-danger);\n}\n\n.settings-connection-row__action {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-connection-row__handle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n color: var(--settings-muted);\n cursor: grab;\n opacity: 0.6;\n}\n\n.settings-connection-row__handle:hover {\n opacity: 1;\n}\n\n.settings-connection-row[draggable="true"] {\n cursor: grab;\n}\n\n.settings-connection-row[data-connection-dragging="true"] {\n opacity: 0.4;\n}\n\n.settings-connection-row[data-connection-drop-indicator="before"] {\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row[data-connection-drop-indicator="after"] {\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row__group-toggle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-row__group-toggle:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-group-divider {\n padding: 10px 12px 6px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n /* No border-top here: the row immediately above already carries its own\n border-bottom (it is no longer :last-child once this divider follows\n it), so adding one here would double the separator line. */\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] {\n background: rgb(51 156 255 / 8%);\n}\n\n.settings-connection-group-hint {\n display: grid;\n gap: 3px;\n margin: 0 12px 12px;\n padding: 14px 16px;\n text-align: center;\n border: 1.5px dashed var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\n border-color: var(--settings-focus);\n}\n\n.settings-connection-group-hint strong {\n color: var(--settings-text);\n font-size: 12.5px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-group-hint span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 17px;\n}\n\n.settings-connection-group-reset {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 6px;\n padding: 10px 12px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n text-align: left;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n cursor: pointer;\n}\n\n.settings-connection-group-reset:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-install-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-focus);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-row:hover .settings-connection-install-link,\n.settings-connection-install-link:focus-visible {\n opacity: 1;\n}\n\n.settings-connection-install-link:hover {\n color: var(--settings-focus);\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-view-error {\n padding: 4px 7px;\n color: var(--settings-danger);\n font: inherit;\n font-size: 11px;\n line-height: 18px;\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-view-error:hover {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n\n.settings-connection-inspector {\n position: sticky;\n top: 18px;\n}\n\n.settings-connection-inspector__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n min-width: 0;\n gap: 10px;\n padding: 12px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-inspector__body {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 12px;\n}\n\n.settings-connection-install-callout {\n display: grid;\n grid-template-columns: 28px minmax(0, 1fr);\n gap: 9px;\n padding: 11px;\n background: var(--settings-surface);\n border: 0;\n border-radius: 8px;\n}\n\n.settings-connection-install-callout__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: var(--settings-focus);\n background: var(--settings-active);\n border-radius: 7px;\n}\n\n.settings-connection-install-callout strong,\n.settings-connection-error-summary strong,\n.settings-connection-state-summary strong {\n display: block;\n margin: 0 0 4px;\n color: var(--settings-text);\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-install-callout p,\n.settings-connection-error-summary p,\n.settings-connection-state-summary p,\n.settings-connection-issue-note {\n margin: 0;\n color: var(--settings-muted);\n font-size: 11px;\n line-height: 16px;\n}\n\n.settings-connection-install-button {\n width: fit-content;\n}\n\n.settings-connection-error-summary {\n padding: 13px 14px;\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.settings-connection-error-metadata {\n display: grid;\n gap: 7px;\n padding: 12px;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-detail-line {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n line-height: 16px;\n}\n\n.settings-connection-detail-line code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n white-space: pre-wrap;\n}\n\n.settings-connection-error-log-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.settings-connection-error-log-header strong {\n color: var(--settings-text);\n font-size: 11px;\n font-weight: 600;\n}\n\n.settings-connection-error-log-header .settings-command-button {\n min-height: 30px;\n padding: 5px 9px;\n font-size: 11px;\n}\n\n.settings-connection-stderr {\n max-height: 220px;\n min-width: 0;\n margin: 0;\n padding: 11px;\n overflow: auto;\n color: var(--settings-text);\n font:\n 10px/16px ui-monospace,\n "SFMono-Regular",\n Consolas,\n "Liberation Mono",\n monospace;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-error-actions {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n}\n\n.settings-connection-error-actions .settings-command-button {\n width: 100%;\n}\n\n.settings-connection-issue-note {\n margin-top: -4px;\n}\n\n.settings-connection-state-summary {\n padding: 14px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-about-panel {\n display: grid;\n max-width: 720px;\n gap: 18px;\n padding: 24px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-about-product {\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 700;\n line-height: 32px;\n}\n\n.settings-about-tagline {\n color: var(--settings-text);\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.settings-about-copy {\n display: grid;\n max-width: 660px;\n gap: 12px;\n}\n\n.settings-about-copy p,\n.settings-about-repository p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-star-callout {\n margin: 2px 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository {\n display: grid;\n gap: 10px;\n padding-top: 18px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-about-repository-link {\n display: flex;\n align-items: center;\n width: fit-content;\n min-width: 0;\n max-width: 100%;\n gap: 8px;\n color: var(--settings-focus);\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-repository-link code {\n min-width: 0;\n overflow: hidden;\n color: var(--settings-muted);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 11px;\n font-weight: 400;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n/* The only emphasis on this screen: a latest version newer than the installed one. */\n.settings-update-metadata__value--newer {\n color: var(--settings-focus);\n}\n\n.settings-update-panel {\n display: grid;\n gap: 12px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel__head {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-panel__head .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel__title {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: var(--settings-danger);\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: var(--settings-focus);\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\n.settings-update-notes-section {\n min-width: 0;\n margin-top: 24px;\n padding-top: 24px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes-section:empty {\n display: none;\n}\n\n.settings-update-notes {\n display: grid;\n min-width: 0;\n gap: 12px;\n color: var(--settings-muted);\n font-size: 14px;\n line-height: 22px;\n overflow-wrap: anywhere;\n}\n\n.settings-update-notes > :first-child {\n margin-top: 0;\n}\n\n.settings-update-notes > :last-child {\n margin-bottom: 0;\n}\n\n.settings-update-notes h1,\n.settings-update-notes h2,\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n margin: 6px 0 0;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes h1 {\n font-size: 18px;\n line-height: 26px;\n}\n\n.settings-update-notes h2 {\n font-size: 17px;\n line-height: 24px;\n}\n\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n font-size: 14px;\n line-height: 22px;\n}\n\n.settings-update-notes p,\n.settings-update-notes ul,\n.settings-update-notes ol,\n.settings-update-notes pre,\n.settings-update-notes blockquote {\n margin: 0;\n}\n\n.settings-update-notes ul,\n.settings-update-notes ol {\n padding-left: 24px;\n}\n\n.settings-update-notes li {\n padding-left: 4px;\n}\n\n.settings-update-notes li::marker {\n color: var(--settings-muted);\n font-size: 0.85em;\n}\n\n.settings-update-notes li + li {\n margin-top: 14px;\n}\n\n.settings-update-notes .release-note-translation {\n display: block;\n margin-top: 3px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-notes blockquote {\n padding: 8px 12px;\n color: var(--settings-muted);\n border-left: 3px solid var(--settings-focus);\n background: var(--settings-surface);\n}\n\n.settings-update-notes hr {\n width: 100%;\n margin: 2px 0;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes strong {\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes a {\n color: var(--settings-focus);\n text-decoration: none;\n}\n\n.settings-update-notes a:hover {\n text-decoration: underline;\n}\n\n.settings-update-notes code {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n}\n\n.settings-update-notes :not(pre) > code {\n padding: 1px 5px;\n background: var(--settings-surface);\n border-radius: 4px;\n}\n\n.settings-update-notes pre {\n min-width: 0;\n max-width: 100%;\n padding: 10px 12px;\n overflow-x: auto;\n overflow-y: hidden;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n/* Manual update sits directly under the status panel, not behind a disclosure:\n automatic updates can fail for machine-local reasons and this is the way out. */\n.settings-update-controls {\n display: grid;\n min-width: 0;\n gap: 10px;\n margin-top: 24px;\n}\n\n.settings-update-manual-title {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual-description {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual-description.is-fallback {\n color: var(--settings-danger);\n}\n\n.settings-update-command {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-update-command code {\n min-width: 0;\n flex: 1;\n padding: 9px 12px;\n overflow-x: auto;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-update-command__copy {\n display: inline-flex;\n align-items: center;\n flex: none;\n gap: 6px;\n padding: 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-left: 1px solid var(--settings-border);\n cursor: pointer;\n}\n\n.settings-update-command__copy:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-update-command__copy:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-update-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: max-content;\n max-width: 100%;\n min-height: 30px;\n gap: 6px;\n padding: 5px 10px;\n white-space: nowrap;\n color: var(--settings-primary-text);\n font: inherit;\n font-size: 12px;\n text-decoration: none;\n background: var(--settings-primary);\n border: 1px solid var(--settings-primary);\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: var(--settings-panel);\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover:not(:disabled) {\n background: var(--settings-primary-hover);\n border-color: var(--settings-primary-hover);\n}\n\n.settings-command-button--secondary:hover:not(:disabled),\n.settings-update-link:hover {\n background: var(--settings-hover);\n border-color: var(--settings-border);\n}\n\n.settings-command-button--danger {\n color: #f87171;\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: rgb(127 29 29 / 24%);\n border-color: rgb(248 113 113 / 45%);\n}\n\n.settings-command-button:disabled {\n cursor: default;\n opacity: 0.45;\n}\n\n.settings-command-button:disabled,\n.settings-command-button[aria-disabled="true"] {\n opacity: 0.55;\n cursor: not-allowed;\n filter: none;\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n align-items: flex-start;\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-section-label {\n display: none;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-nav-star-link {\n margin-top: 0;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-update-metadata {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-account-header,\n .settings-connection-page-header {\n flex-direction: column;\n }\n\n .settings-account-header > .settings-command-button,\n .settings-connection-page-header > .settings-command-button {\n width: 100%;\n }\n\n .settings-connections-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-connection-inspector {\n position: static;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-surface: Canvas;\n --settings-surface-hover: Highlight;\n --settings-inset: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-subtle: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n --settings-primary: ButtonFace;\n --settings-primary-hover: Highlight;\n --settings-primary-text: ButtonText;\n --settings-warning: CanvasText;\n --settings-warning-bg: Canvas;\n --settings-warning-border: ButtonBorder;\n --settings-danger: CanvasText;\n --settings-danger-bg: Canvas;\n --settings-danger-border: ButtonBorder;\n --settings-success: CanvasText;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n transition-duration: 0s !important;\n }\n}\n';
|
|
25473
25774
|
|
|
25474
25775
|
// src/settings/accounts.css
|
|
25475
|
-
var accounts_default = '.settings-harness-accounts {\n margin-top: 32px;\n}\n\n.settings-harness-accounts__title {\n margin: 0 0 16px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.settings-harness-account__identity {\n min-width: 0;\n}\n\n.settings-harness-account__identity > .settings-account-email {\n display: block;\n max-width: 24ch;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-harness-account__logo {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n flex: none;\n}\n\n.settings-harness-account {\n display: grid;\n grid-template-columns: minmax(180px, 1fr) minmax(0, 2fr);\n align-items: center;\n gap: 24px;\n padding: 24px;\n}\n\n.settings-harness-account + .settings-harness-account {\n border-top: 1px solid var(--settings-border);\n}\n\n.settings-harness-account > div {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n@media (max-width: 700px) {\n .settings-harness-account {\n grid-template-columns: minmax(0, 1fr);\n padding: 16px;\n }\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-eyebrow {\n margin: 0 0 8px;\n color: var(--settings-muted);\n font-size: 11px;\n letter-spacing: 0.13em;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 20px;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-help-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-top: 20px;\n flex-wrap: wrap;\n}\n.settings-account-task-hint {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n flex: 1 1 280px;\n}\n.settings-account-task-hint svg {\n flex: none;\n margin-top: 1px;\n}\n.settings-account-help-button {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 8px 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-radius: 7px;\n cursor: pointer;\n}\n.settings-account-help-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n.settings-account-device-code-note {\n margin: 12px 0 0;\n font-size: 12px;\n padding: 10px 12px;\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n border: 1px solid var(--settings-warning-border);\n border-radius: 8px;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 150px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 13px 20px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2) {\n width: 38%;\n}\n.settings-account-table th:nth-child(3) {\n width: 12%;\n}\n.settings-account-table th:nth-child(4) {\n width: 18%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 19px 20px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-title {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.settings-account-email {\n min-width: 0;\n overflow: hidden;\n font-size: 13px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n margin-top: 4px;\n color: var(--settings-muted);\n}\n.settings-account-domain {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-plan-separator {\n flex: none;\n}\n.settings-account-plan {\n flex: none;\n padding: 1px 6px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n padding: 2px 7px;\n color: light-dark(#66548e, #bdb4ff);\n background: light-dark(#f4f0fb, #aca0ff12);\n border: 1px solid light-dark(#dfd5f1, #aca0ff24);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 14px;\n max-width: 380px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: 48px minmax(36px, 1fr) 96px;\n align-items: center;\n gap: 3px 10px;\n}\n:host([lang="zh-CN"]) .settings-account-usage__meter {\n grid-template-columns: 48px minmax(36px, 1fr) 72px;\n}\n\n.settings-account-usage__title {\n color: light-dark(#5d5d68, #c3c3cd);\n font-size: 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-usage__percent {\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__value-label {\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 400;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 2 / -1;\n color: var(--account-muted);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__message,\n.settings-account-unknown {\n color: var(--settings-muted);\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 8px 10px;\n min-height: 36px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-actions .settings-account-delete {\n color: var(--settings-muted);\n}\n.settings-account-actions .settings-account-delete:hover,\n.settings-account-actions .settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-mobile-label {\n display: none;\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 32px;\n padding: 3px 0;\n font-size: 12px;\n white-space: nowrap;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible,\n.settings-account-help-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n@container (min-width: 611px) and (max-width: 800px) {\n .settings-account-table th,\n .settings-account-table td {\n padding-left: 12px;\n padding-right: 12px;\n }\n .settings-account-table th:nth-child(1) {\n width: 30%;\n }\n .settings-account-table th:nth-child(2) {\n width: 37%;\n }\n .settings-account-table th:nth-child(4) {\n width: 21%;\n }\n}\n\n@container (max-width: 610px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n padding: 16px;\n gap: 12px;\n border-bottom: 1px solid var(--settings-divider);\n }\n .settings-account-table .settings-account-row > td {\n padding: 0;\n border: 0;\n }\n .settings-account-row > td:nth-child(1),\n .settings-account-row > td:nth-child(2) {\n grid-column: 1 / -1;\n }\n .settings-account-row > td:nth-child(3) {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .settings-account-mobile-label {\n display: inline;\n color: var(--settings-muted);\n font-size: 11px;\n }\n .settings-account-usage {\n max-width: none;\n }\n .settings-account-table tr:not(.settings-account-row),\n .settings-account-table tr:not(.settings-account-row) > td {\n display: block;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
25776
|
+
var accounts_default = '.settings-harness-account__logo {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 0;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 210px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 12px 16px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2),\n.settings-account-table th:nth-child(3) {\n width: 24%;\n}\n.settings-account-table th:nth-child(4) {\n width: 20%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 17px 16px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-email {\n display: block;\n min-width: 0;\n overflow: hidden;\n font-size: 12px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 5px;\n margin-top: 4px;\n color: var(--settings-muted);\n flex-wrap: wrap;\n font-size: 11px;\n overflow-wrap: anywhere;\n}\n.settings-account-plan {\n flex: none;\n padding: 0 4px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 10px;\n max-width: 100%;\n overflow-wrap: anywhere;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n color: light-dark(#66548e, #c8bfff);\n font-size: 10px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 10px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: 20px 4px 17px;\n align-items: center;\n gap: 6px 0;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n.settings-account-usage__title {\n display: none;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-extra-usage {\n display: grid;\n gap: 12px;\n margin-top: 14px;\n}\n.settings-account-extra-usage .settings-account-usage__meter {\n grid-template-rows: auto 20px 4px 17px;\n}\n.settings-account-extra-usage .settings-account-usage__title {\n display: block;\n grid-column: 1 / -1;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__percent {\n grid-column: 1 / -1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 7px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__countdown {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.settings-account-usage__percent > :last-child {\n flex: none;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n grid-column: 1 / -1;\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 1 / -1;\n color: var(--account-muted);\n font-size: 10px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n}\n.settings-account-usage__message {\n color: var(--settings-muted);\n}\n.settings-account-usage__missing {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-content: center;\n gap: 6px;\n min-height: 53px;\n color: var(--settings-muted);\n}\n.settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 1 / -1;\n font-size: 14px;\n}\n.settings-account-management {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n.settings-account-native {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 3px;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-native .settings-icon-button {\n width: 25px;\n height: 28px;\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 4px 5px;\n min-height: 30px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-delete {\n color: var(--settings-danger);\n}\n.settings-account-delete:hover,\n.settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 24px;\n padding: 3px 0;\n font-size: 10px;\n white-space: nowrap;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-account-dialog {\n position: fixed;\n width: min(360px, calc(100vw - 40px));\n max-height: calc(100vh - 40px);\n overflow: auto;\n padding: 22px;\n color: var(--settings-text);\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: #0005;\n}\n.settings-account-dialog h2 {\n margin: 0 28px 12px 0;\n font-size: 15px;\n}\n.settings-account-dialog p {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.6;\n overflow-wrap: anywhere;\n}\n.settings-account-dialog__close {\n position: absolute;\n top: 12px;\n right: 12px;\n}\n.settings-account-dialog__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n@container (max-width: 680px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n padding: 18px;\n gap: 18px 22px;\n border-top: 1px solid var(--settings-divider);\n }\n .settings-account-row:first-child {\n border-top: 0;\n }\n .settings-account-table .settings-account-row > td {\n display: block;\n min-width: 0;\n padding: 0;\n border: 0;\n }\n .settings-account-person-cell,\n .settings-account-management-cell,\n .settings-account-usage-cell--message {\n grid-column: 1 / -1;\n }\n .settings-account-table .settings-account-management-cell {\n border-top: 1px solid var(--settings-divider);\n padding-top: 8px;\n }\n .settings-account-email {\n font-size: 13px;\n }\n .settings-account-usage__title {\n display: block;\n grid-column: 1;\n }\n .settings-account-usage__percent,\n .settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 2;\n text-align: right;\n }\n .settings-account-extra-usage .settings-account-usage__percent {\n grid-column: 1 / -1;\n }\n .settings-account-management {\n flex-direction: row;\n justify-content: space-between;\n }\n .settings-account-actions {\n order: 1;\n margin-left: auto;\n }\n .settings-account-native {\n justify-content: flex-start;\n }\n .settings-account-table tr:not(.settings-account-row, [hidden]),\n .settings-account-table tr:not(.settings-account-row, [hidden]) > td {\n display: block;\n }\n}\n\n@container (max-width: 360px) {\n .settings-account-row {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n padding: 16px;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
25476
25777
|
|
|
25477
25778
|
// src/settings/shell.ts
|
|
25478
25779
|
var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
|
|
@@ -26103,7 +26404,8 @@ ${accounts_default}`;
|
|
|
26103
26404
|
opencode: harnessIdSchema.parse("opencode"),
|
|
26104
26405
|
grok: harnessIdSchema.parse("grok"),
|
|
26105
26406
|
omp: harnessIdSchema.parse("omp"),
|
|
26106
|
-
antigravity: harnessIdSchema.parse("antigravity")
|
|
26407
|
+
antigravity: harnessIdSchema.parse("antigravity"),
|
|
26408
|
+
"kiro-cli": harnessIdSchema.parse("kiro-cli")
|
|
26107
26409
|
};
|
|
26108
26410
|
var externalAgents = [
|
|
26109
26411
|
"pi",
|
|
@@ -26112,7 +26414,8 @@ ${accounts_default}`;
|
|
|
26112
26414
|
"opencode",
|
|
26113
26415
|
"grok",
|
|
26114
26416
|
"omp",
|
|
26115
|
-
"antigravity"
|
|
26417
|
+
"antigravity",
|
|
26418
|
+
"kiro-cli"
|
|
26116
26419
|
];
|
|
26117
26420
|
function isRetryableHarnessAvailability(availability, error51) {
|
|
26118
26421
|
return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
|
|
@@ -26148,8 +26451,8 @@ ${accounts_default}`;
|
|
|
26148
26451
|
if (usage === null) return true;
|
|
26149
26452
|
return externalAgentHasAccountCredits(agent) && accountCredits === null;
|
|
26150
26453
|
}
|
|
26151
|
-
function shouldReloadExternalCatalogAfterAvailabilityRefresh(previous, next, configurationReady) {
|
|
26152
|
-
return previous !== next || !configurationReady;
|
|
26454
|
+
function shouldReloadExternalCatalogAfterAvailabilityRefresh(previous, next, configurationReady, explicitRefresh = false) {
|
|
26455
|
+
return explicitRefresh || previous !== next || !configurationReady;
|
|
26153
26456
|
}
|
|
26154
26457
|
function isExternalConfigurationReadyView(modelView, permissionModeView) {
|
|
26155
26458
|
return modelView.status !== "selecting" && modelView.catalog?.models.some((model) => model.ref.id === modelView.selected?.id) === true && isPermissionModeControlReady(permissionModeView);
|
|
@@ -26282,6 +26585,21 @@ ${accounts_default}`;
|
|
|
26282
26585
|
...permissionModeId ? { permissionModeId } : {}
|
|
26283
26586
|
};
|
|
26284
26587
|
}
|
|
26588
|
+
if (inspection.harnessId === "kiro-cli") {
|
|
26589
|
+
const route = decodeHarnessPluginRoute(inspection.transportModelId);
|
|
26590
|
+
if (!route || route.harnessId !== "kiro-cli") {
|
|
26591
|
+
throw new Error("Kiro CLI Thread reported an incompatible transport Model");
|
|
26592
|
+
}
|
|
26593
|
+
const model = inspection.effectiveModel ?? route.model;
|
|
26594
|
+
const thinkingOptionId = inspection.availableThinkingOptions !== void 0 ? selectableThinkingOptionId(inspection) : inspection.effectiveThinkingOptionId ?? route.thinkingOptionId;
|
|
26595
|
+
const permissionModeId = inspection.effectivePermissionModeId ?? route.permissionModeId;
|
|
26596
|
+
return {
|
|
26597
|
+
agent: "kiro-cli",
|
|
26598
|
+
...model ? { model } : {},
|
|
26599
|
+
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
26600
|
+
...permissionModeId ? { permissionModeId } : {}
|
|
26601
|
+
};
|
|
26602
|
+
}
|
|
26285
26603
|
throw new Error("Thread owner is not a Renderer Agent");
|
|
26286
26604
|
}
|
|
26287
26605
|
function isOwnershipSubmissionBlocked(status) {
|
|
@@ -26355,6 +26673,7 @@ ${accounts_default}`;
|
|
|
26355
26673
|
const mountedByComposer = /* @__PURE__ */ new Map();
|
|
26356
26674
|
const pendingReplacements = /* @__PURE__ */ new Map();
|
|
26357
26675
|
let disposed = false;
|
|
26676
|
+
const disposeReasoningSoftWrap = installReasoningTranscriptSoftWrap(document);
|
|
26358
26677
|
let scanScheduled = false;
|
|
26359
26678
|
let refreshTargetsOnNextScan = false;
|
|
26360
26679
|
let adapterDispose = null;
|
|
@@ -26424,7 +26743,8 @@ ${accounts_default}`;
|
|
|
26424
26743
|
opencode: void 0,
|
|
26425
26744
|
grok: void 0,
|
|
26426
26745
|
omp: void 0,
|
|
26427
|
-
antigravity: void 0
|
|
26746
|
+
antigravity: void 0,
|
|
26747
|
+
"kiro-cli": void 0
|
|
26428
26748
|
},
|
|
26429
26749
|
webUi: Object.fromEntries(
|
|
26430
26750
|
externalAgents.map((agent) => [agent, false])
|
|
@@ -26907,7 +27227,22 @@ ${accounts_default}`;
|
|
|
26907
27227
|
return;
|
|
26908
27228
|
}
|
|
26909
27229
|
if (current.phase === "locked" && previousModel && !previousModelAvailable) {
|
|
26910
|
-
|
|
27230
|
+
mounted.modelView = {
|
|
27231
|
+
status: "error",
|
|
27232
|
+
catalog: inspection.catalog,
|
|
27233
|
+
selected: previousModel,
|
|
27234
|
+
thinkingSelectionSupported: inspection.capabilities.configuration.selectThinkingOption,
|
|
27235
|
+
error: "Existing Thread Model is absent from the current Catalog"
|
|
27236
|
+
};
|
|
27237
|
+
if (selectedPermissionModeId && mounted.permissionModeView.catalog) {
|
|
27238
|
+
mounted.permissionModeView = {
|
|
27239
|
+
status: "ready",
|
|
27240
|
+
catalog: mounted.permissionModeView.catalog,
|
|
27241
|
+
selected: selectedPermissionModeId,
|
|
27242
|
+
...permissionModeLock
|
|
27243
|
+
};
|
|
27244
|
+
}
|
|
27245
|
+
return;
|
|
26911
27246
|
}
|
|
26912
27247
|
const selected = previousModelAvailable ? previousModel : preferredConfiguration?.model ?? inspection.catalog.defaultModel;
|
|
26913
27248
|
if (!selected) throw new Error("External Harness did not report its default Model");
|
|
@@ -27550,7 +27885,8 @@ ${accounts_default}`;
|
|
|
27550
27885
|
if (composerState.agent === agent && shouldReloadExternalCatalogAfterAvailabilityRefresh(
|
|
27551
27886
|
previousStatus,
|
|
27552
27887
|
status,
|
|
27553
|
-
isExternalConfigurationStable(mounted.modelView, mounted.permissionModeView)
|
|
27888
|
+
isExternalConfigurationStable(mounted.modelView, mounted.permissionModeView),
|
|
27889
|
+
refresh && force
|
|
27554
27890
|
)) {
|
|
27555
27891
|
void loadExternalCatalog(mounted);
|
|
27556
27892
|
}
|
|
@@ -28157,6 +28493,7 @@ ${accounts_default}`;
|
|
|
28157
28493
|
applyAdapterAgent = null;
|
|
28158
28494
|
modelControl = null;
|
|
28159
28495
|
mutationObserver.disconnect();
|
|
28496
|
+
disposeReasoningSoftWrap();
|
|
28160
28497
|
sidebarAgentIcons.dispose();
|
|
28161
28498
|
settingsLifecycle.dispose();
|
|
28162
28499
|
document.removeEventListener("beforeinput", onBeforeInput, true);
|
|
@@ -28239,6 +28576,7 @@ lucide/dist/esm/icons/circle-off.mjs:
|
|
|
28239
28576
|
lucide/dist/esm/icons/copy.mjs:
|
|
28240
28577
|
lucide/dist/esm/icons/download.mjs:
|
|
28241
28578
|
lucide/dist/esm/icons/external-link.mjs:
|
|
28579
|
+
lucide/dist/esm/icons/ellipsis.mjs:
|
|
28242
28580
|
lucide/dist/esm/icons/folder-input.mjs:
|
|
28243
28581
|
lucide/dist/esm/icons/grip-vertical.mjs:
|
|
28244
28582
|
lucide/dist/esm/icons/info.mjs:
|