@liberseek/boft-cli-win32-arm64 0.6.2 → 0.6.4
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 +4 -1
- package/app/host-runtime.mjs +223 -29
- package/app/plugins/antigravity/plugin.mjs +6 -1
- package/app/plugins/claude-code/plugin.mjs +528 -49
- package/app/plugins/deepseek-harness/plugin.mjs +11 -1
- package/app/plugins/enabled.json +4 -1
- package/app/plugins/grok/plugin.mjs +925 -86
- package/app/plugins/hermes/manifest.json +11 -0
- package/app/plugins/hermes/plugin.mjs +21491 -0
- 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 +23353 -0
- package/app/plugins/muse/assets/icon.svg +4 -0
- package/app/plugins/muse/manifest.json +12 -0
- package/app/plugins/muse/plugin.mjs +18151 -0
- package/app/plugins/omp/plugin.mjs +11 -1
- package/app/plugins/opencode/plugin.mjs +11 -1
- package/app/plugins/pi/plugin.mjs +11 -1
- package/app/renderer-extension.js +1130 -157
- package/bin/codexhost.exe +0 -0
- package/libexec/codexhost-node-repl.exe +0 -0
- package/libexec/codexhost-shim.exe +0 -0
- package/libexec/codexhost-updater.exe +0 -0
- package/package.json +1 -1
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
"opencode",
|
|
16
16
|
"grok",
|
|
17
17
|
"omp",
|
|
18
|
-
"antigravity"
|
|
18
|
+
"antigravity",
|
|
19
|
+
"hermes",
|
|
20
|
+
"muse",
|
|
21
|
+
"kiro-cli"
|
|
19
22
|
];
|
|
20
23
|
var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
|
|
21
24
|
function defaultIdFactory(sequence) {
|
|
@@ -131,6 +134,9 @@
|
|
|
131
134
|
if (agent === "grok" && model) state.grokModel = model;
|
|
132
135
|
if (agent === "omp" && model) state.ompModel = model;
|
|
133
136
|
if (agent === "antigravity" && model) state.antigravityModel = model;
|
|
137
|
+
if (agent === "hermes" && model) state.hermesModel = model;
|
|
138
|
+
if (agent === "muse" && model) state.museModel = model;
|
|
139
|
+
if (agent === "kiro-cli" && model) state.kiroCliModel = model;
|
|
134
140
|
if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
|
|
135
141
|
else if (agent === "pi") delete state.piThinkingOptionId;
|
|
136
142
|
if (agent === "claude-code" && thinkingOptionId) {
|
|
@@ -146,6 +152,12 @@
|
|
|
146
152
|
if (agent === "antigravity" && thinkingOptionId) {
|
|
147
153
|
state.antigravityThinkingOptionId = thinkingOptionId;
|
|
148
154
|
} else if (agent === "antigravity") delete state.antigravityThinkingOptionId;
|
|
155
|
+
if (agent === "muse" && thinkingOptionId) {
|
|
156
|
+
state.museThinkingOptionId = thinkingOptionId;
|
|
157
|
+
} else if (agent === "muse") delete state.museThinkingOptionId;
|
|
158
|
+
if (agent === "kiro-cli" && thinkingOptionId) {
|
|
159
|
+
state.kiroCliThinkingOptionId = thinkingOptionId;
|
|
160
|
+
} else if (agent === "kiro-cli") delete state.kiroCliThinkingOptionId;
|
|
149
161
|
if (agent !== "codex") {
|
|
150
162
|
const permissionModeByAgent = {};
|
|
151
163
|
for (const candidate of [
|
|
@@ -155,7 +167,10 @@
|
|
|
155
167
|
"opencode",
|
|
156
168
|
"grok",
|
|
157
169
|
"omp",
|
|
158
|
-
"antigravity"
|
|
170
|
+
"antigravity",
|
|
171
|
+
"hermes",
|
|
172
|
+
"muse",
|
|
173
|
+
"kiro-cli"
|
|
159
174
|
]) {
|
|
160
175
|
const current = state.permissionModeByAgent?.[candidate];
|
|
161
176
|
if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
|
|
@@ -177,7 +192,11 @@
|
|
|
177
192
|
if (agent === "opencode") return state.openCodeModel;
|
|
178
193
|
if (agent === "grok") return state.grokModel;
|
|
179
194
|
if (agent === "omp") return state.ompModel;
|
|
180
|
-
return state.
|
|
195
|
+
if (agent === "hermes") return state.hermesModel;
|
|
196
|
+
if (agent === "antigravity") return state.antigravityModel;
|
|
197
|
+
if (agent === "muse") return state.museModel;
|
|
198
|
+
if (agent === "kiro-cli") return state.kiroCliModel;
|
|
199
|
+
return void 0;
|
|
181
200
|
}
|
|
182
201
|
thinkingOptionForAgent(composer, agent) {
|
|
183
202
|
const state = this.#state(composer);
|
|
@@ -186,7 +205,10 @@
|
|
|
186
205
|
if (agent === "grok") return state.grokThinkingOptionId;
|
|
187
206
|
if (agent === "opencode") return state.openCodeThinkingOptionId;
|
|
188
207
|
if (agent === "omp") return state.ompThinkingOptionId;
|
|
189
|
-
|
|
208
|
+
if (agent === "antigravity") return state.antigravityThinkingOptionId;
|
|
209
|
+
if (agent === "muse") return state.museThinkingOptionId;
|
|
210
|
+
if (agent === "kiro-cli") return state.kiroCliThinkingOptionId;
|
|
211
|
+
return void 0;
|
|
190
212
|
}
|
|
191
213
|
permissionModeForAgent(composer, agent) {
|
|
192
214
|
return this.#state(composer).permissionModeByAgent?.[agent];
|
|
@@ -207,7 +229,10 @@
|
|
|
207
229
|
else if (agent === "opencode") state.openCodeModel = model;
|
|
208
230
|
else if (agent === "grok") state.grokModel = model;
|
|
209
231
|
else if (agent === "omp") state.ompModel = model;
|
|
210
|
-
else state.
|
|
232
|
+
else if (agent === "hermes") state.hermesModel = model;
|
|
233
|
+
else if (agent === "antigravity") state.antigravityModel = model;
|
|
234
|
+
else if (agent === "muse") state.museModel = model;
|
|
235
|
+
else if (agent === "kiro-cli") state.kiroCliModel = model;
|
|
211
236
|
return state;
|
|
212
237
|
}
|
|
213
238
|
setPiConfiguration(composer, model, thinkingOptionId) {
|
|
@@ -244,6 +269,14 @@
|
|
|
244
269
|
state.antigravityThinkingOptionId = thinkingOptionId;
|
|
245
270
|
} else if (agent === "antigravity") {
|
|
246
271
|
delete state.antigravityThinkingOptionId;
|
|
272
|
+
} else if (agent === "muse" && thinkingOptionId) {
|
|
273
|
+
state.museThinkingOptionId = thinkingOptionId;
|
|
274
|
+
} else if (agent === "muse") {
|
|
275
|
+
delete state.museThinkingOptionId;
|
|
276
|
+
} else if (agent === "kiro-cli" && thinkingOptionId) {
|
|
277
|
+
state.kiroCliThinkingOptionId = thinkingOptionId;
|
|
278
|
+
} else if (agent === "kiro-cli") {
|
|
279
|
+
delete state.kiroCliThinkingOptionId;
|
|
247
280
|
}
|
|
248
281
|
return state;
|
|
249
282
|
}
|
|
@@ -14876,6 +14909,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14876
14909
|
reasoningOutputTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
14877
14910
|
totalTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
14878
14911
|
totalCostUsd: finiteNonNegativeNumberSchema.optional(),
|
|
14912
|
+
totalCredits: finiteNonNegativeNumberSchema.optional(),
|
|
14913
|
+
contextUsagePercent: finiteNonNegativeNumberSchema.optional(),
|
|
14879
14914
|
cacheHitRatePercent: cacheHitRatePercentSchema.optional(),
|
|
14880
14915
|
contextWindowTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
14881
14916
|
contextUsedTokens: nonNegativeSafeIntegerSchema.optional(),
|
|
@@ -15383,12 +15418,36 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15383
15418
|
});
|
|
15384
15419
|
|
|
15385
15420
|
// ../shared-contracts/dist/harness-route.js
|
|
15421
|
+
var HARNESS_PLUGIN_ROUTE_PREFIX = "codexhost/plugin-v1@";
|
|
15422
|
+
var MAX_ROUTE_LENGTH = 4096;
|
|
15386
15423
|
var harnessPluginRouteSchema = external_exports.object({
|
|
15387
15424
|
harnessId: harnessPluginIdSchema,
|
|
15388
15425
|
model: harnessModelRefSchema.optional(),
|
|
15389
15426
|
thinkingOptionId: harnessThinkingOptionIdSchema.optional(),
|
|
15390
15427
|
permissionModeId: harnessPermissionModeIdSchema.optional()
|
|
15391
15428
|
}).strict();
|
|
15429
|
+
function encodeHarnessPluginRoute(route) {
|
|
15430
|
+
const parsed = harnessPluginRouteSchema.parse(route);
|
|
15431
|
+
const payload = [...JSON.stringify(parsed)].map((character) => character.charCodeAt(0).toString(16).padStart(2, "0")).join("");
|
|
15432
|
+
return `${HARNESS_PLUGIN_ROUTE_PREFIX}${payload}`;
|
|
15433
|
+
}
|
|
15434
|
+
function decodeHarnessPluginRoute(value) {
|
|
15435
|
+
if (typeof value !== "string" || !value.startsWith(HARNESS_PLUGIN_ROUTE_PREFIX))
|
|
15436
|
+
return null;
|
|
15437
|
+
const payload = value.slice(HARNESS_PLUGIN_ROUTE_PREFIX.length);
|
|
15438
|
+
if (value.length > MAX_ROUTE_LENGTH || !/^(?:[a-f0-9]{2})+$/u.test(payload)) {
|
|
15439
|
+
throw new Error("Invalid Harness plugin route");
|
|
15440
|
+
}
|
|
15441
|
+
try {
|
|
15442
|
+
const json2 = payload.replace(/[a-f0-9]{2}/gu, (byte) => String.fromCharCode(Number.parseInt(byte, 16)));
|
|
15443
|
+
const decoded = harnessPluginRouteSchema.parse(JSON.parse(json2));
|
|
15444
|
+
if (encodeHarnessPluginRoute(decoded) !== value)
|
|
15445
|
+
throw new Error("Noncanonical Harness plugin route");
|
|
15446
|
+
return decoded;
|
|
15447
|
+
} catch {
|
|
15448
|
+
throw new Error("Invalid Harness plugin route");
|
|
15449
|
+
}
|
|
15450
|
+
}
|
|
15392
15451
|
|
|
15393
15452
|
// ../shared-contracts/dist/codex-accounts.js
|
|
15394
15453
|
var accountIdSchema = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._~-]+$/u);
|
|
@@ -15849,6 +15908,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15849
15908
|
// src/assets/antigravity-agent.svg
|
|
15850
15909
|
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';
|
|
15851
15910
|
|
|
15911
|
+
// src/assets/hermes-agent.png
|
|
15912
|
+
var hermes_agent_default = "data:image/png;base64,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";
|
|
15913
|
+
|
|
15914
|
+
// src/assets/kiro-agent.svg
|
|
15915
|
+
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';
|
|
15916
|
+
|
|
15852
15917
|
// src/assets/omp-agent.svg
|
|
15853
15918
|
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';
|
|
15854
15919
|
|
|
@@ -15864,7 +15929,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15864
15929
|
opencode: "OpenCode",
|
|
15865
15930
|
grok: "Grok",
|
|
15866
15931
|
omp: "Oh My Pi",
|
|
15867
|
-
antigravity: "Antigravity CLI"
|
|
15932
|
+
antigravity: "Antigravity CLI",
|
|
15933
|
+
hermes: "Hermes",
|
|
15934
|
+
muse: "Meta Muse Code",
|
|
15935
|
+
"kiro-cli": "Kiro CLI"
|
|
15868
15936
|
};
|
|
15869
15937
|
var PI_PATHS = [
|
|
15870
15938
|
{
|
|
@@ -15950,6 +16018,40 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15950
16018
|
image.style.flex = "none";
|
|
15951
16019
|
return image;
|
|
15952
16020
|
}
|
|
16021
|
+
if (agent === "hermes") {
|
|
16022
|
+
const image = ownerDocument.createElement("img");
|
|
16023
|
+
image.src = hermes_agent_default;
|
|
16024
|
+
image.alt = "";
|
|
16025
|
+
image.draggable = false;
|
|
16026
|
+
image.style.width = `${size}px`;
|
|
16027
|
+
image.style.height = `${size}px`;
|
|
16028
|
+
image.style.objectFit = "contain";
|
|
16029
|
+
image.style.flex = "none";
|
|
16030
|
+
return image;
|
|
16031
|
+
}
|
|
16032
|
+
if (agent === "kiro-cli") {
|
|
16033
|
+
const image = ownerDocument.createElement("img");
|
|
16034
|
+
image.src = kiro_agent_default;
|
|
16035
|
+
image.alt = "";
|
|
16036
|
+
image.draggable = false;
|
|
16037
|
+
image.style.width = `${size}px`;
|
|
16038
|
+
image.style.height = `${size}px`;
|
|
16039
|
+
image.style.objectFit = "contain";
|
|
16040
|
+
image.style.flex = "none";
|
|
16041
|
+
return image;
|
|
16042
|
+
}
|
|
16043
|
+
if (agent === "muse") {
|
|
16044
|
+
return createSvgIcon(
|
|
16045
|
+
[
|
|
16046
|
+
{
|
|
16047
|
+
d: "M12 2.2c-1.9 3.4-4.8 6.4-8.6 8.4 3.8 2 6.7 5 8.6 8.4 1.9-3.4 4.8-6.4 8.6-8.4C16.8 8.6 13.9 5.6 12 2.2z"
|
|
16048
|
+
}
|
|
16049
|
+
],
|
|
16050
|
+
"#0668E1",
|
|
16051
|
+
size,
|
|
16052
|
+
ownerDocument
|
|
16053
|
+
);
|
|
16054
|
+
}
|
|
15953
16055
|
const mark = ownerDocument.createElement("img");
|
|
15954
16056
|
mark.src = grok_agent_default;
|
|
15955
16057
|
mark.alt = "";
|
|
@@ -16084,6 +16186,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16084
16186
|
["path", { d: "m7 10 5 5 5-5" }]
|
|
16085
16187
|
];
|
|
16086
16188
|
|
|
16189
|
+
// ../../node_modules/lucide/dist/esm/icons/hard-drive-download.mjs
|
|
16190
|
+
var HardDriveDownload = [
|
|
16191
|
+
["path", { d: "M12 2v8" }],
|
|
16192
|
+
["path", { d: "m16 6-4 4-4-4" }],
|
|
16193
|
+
["rect", { width: "20", height: "8", x: "2", y: "14", rx: "2" }],
|
|
16194
|
+
["path", { d: "M6 18h.01" }],
|
|
16195
|
+
["path", { d: "M10 18h.01" }]
|
|
16196
|
+
];
|
|
16197
|
+
|
|
16087
16198
|
// ../../node_modules/lucide/dist/esm/icons/external-link.mjs
|
|
16088
16199
|
var ExternalLink = [
|
|
16089
16200
|
["path", { d: "M15 3h6v6" }],
|
|
@@ -16296,6 +16407,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16296
16407
|
"copy",
|
|
16297
16408
|
"ellipsis",
|
|
16298
16409
|
"download",
|
|
16410
|
+
"hard-drive-download",
|
|
16299
16411
|
"chevron-left",
|
|
16300
16412
|
"chevron-right",
|
|
16301
16413
|
"chevron-down",
|
|
@@ -16333,6 +16445,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16333
16445
|
copy: Copy,
|
|
16334
16446
|
ellipsis: Ellipsis,
|
|
16335
16447
|
download: Download,
|
|
16448
|
+
"hard-drive-download": HardDriveDownload,
|
|
16336
16449
|
"chevron-left": ChevronLeft,
|
|
16337
16450
|
"chevron-right": ChevronRight,
|
|
16338
16451
|
"chevron-down": ChevronDown,
|
|
@@ -16697,17 +16810,94 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16697
16810
|
element.style.setProperty("-webkit-backdrop-filter", "none");
|
|
16698
16811
|
}
|
|
16699
16812
|
|
|
16813
|
+
// src/settings/harness-install.ts
|
|
16814
|
+
var HARNESS_INSTALL_SPECS = Object.freeze({
|
|
16815
|
+
pi: {
|
|
16816
|
+
url: "https://pi.dev/",
|
|
16817
|
+
binary: "pi",
|
|
16818
|
+
posix: "curl -fsSL https://pi.dev/install.sh | sh",
|
|
16819
|
+
windows: "npm install -g --ignore-scripts @earendil-works/pi-coding-agent"
|
|
16820
|
+
},
|
|
16821
|
+
"claude-code": {
|
|
16822
|
+
url: "https://code.claude.com/docs/en/quickstart",
|
|
16823
|
+
binary: "claude",
|
|
16824
|
+
posix: "curl -fsSL https://claude.ai/install.sh | bash",
|
|
16825
|
+
windows: "irm https://claude.ai/install.ps1 | iex"
|
|
16826
|
+
},
|
|
16827
|
+
"deepseek-harness": {
|
|
16828
|
+
url: "https://deepseek-harness.github.io/deepseek-harness/",
|
|
16829
|
+
binary: "dsh",
|
|
16830
|
+
posix: "npm install -g @deepseek-ai/dsh",
|
|
16831
|
+
windows: "npm install -g @deepseek-ai/dsh"
|
|
16832
|
+
},
|
|
16833
|
+
opencode: {
|
|
16834
|
+
url: "https://opencode.ai/docs/",
|
|
16835
|
+
binary: "opencode",
|
|
16836
|
+
posix: "curl -fsSL https://opencode.ai/install | bash",
|
|
16837
|
+
windows: "npm install -g opencode-ai"
|
|
16838
|
+
},
|
|
16839
|
+
grok: {
|
|
16840
|
+
url: "https://grok.com/",
|
|
16841
|
+
binary: "grok",
|
|
16842
|
+
posix: "curl -fsSL https://x.ai/cli/install.sh | bash",
|
|
16843
|
+
windows: "irm https://x.ai/cli/install.ps1 | iex"
|
|
16844
|
+
},
|
|
16845
|
+
omp: {
|
|
16846
|
+
url: "https://github.com/can1357/oh-my-pi",
|
|
16847
|
+
binary: "omp",
|
|
16848
|
+
posix: "curl -fsSL https://omp.sh/install | sh",
|
|
16849
|
+
windows: "irm https://omp.sh/install.ps1 | iex"
|
|
16850
|
+
},
|
|
16851
|
+
antigravity: {
|
|
16852
|
+
url: "https://antigravity.google/product/antigravity-cli",
|
|
16853
|
+
binary: "agy",
|
|
16854
|
+
posix: "curl -fsSL https://antigravity.google/cli/install.sh | bash",
|
|
16855
|
+
windows: "irm https://antigravity.google/cli/install.ps1 | iex"
|
|
16856
|
+
},
|
|
16857
|
+
hermes: {
|
|
16858
|
+
url: "https://hermes-agent.nousresearch.com/docs/getting-started/installation",
|
|
16859
|
+
binary: "hermes",
|
|
16860
|
+
posix: "curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash",
|
|
16861
|
+
windows: "iex (irm https://hermes-agent.nousresearch.com/install.ps1)"
|
|
16862
|
+
},
|
|
16863
|
+
muse: {
|
|
16864
|
+
url: "https://developer.meta.com/ai/products/muse-code/",
|
|
16865
|
+
binary: "muse",
|
|
16866
|
+
posix: "curl -fsSL https://dev.meta.ai/install.sh | bash",
|
|
16867
|
+
windows: "curl -fsSL https://dev.meta.ai/install.sh | bash"
|
|
16868
|
+
},
|
|
16869
|
+
"kiro-cli": {
|
|
16870
|
+
url: "https://kiro.dev/docs/cli/",
|
|
16871
|
+
binary: "kiro-cli",
|
|
16872
|
+
posix: "curl -fsSL https://cli.kiro.dev/install | bash",
|
|
16873
|
+
windows: "irm 'https://cli.kiro.dev/install.ps1' | iex"
|
|
16874
|
+
}
|
|
16875
|
+
});
|
|
16876
|
+
function harnessInstallPlatform(window2) {
|
|
16877
|
+
const navigator2 = window2?.navigator;
|
|
16878
|
+
if (!navigator2) return "posix";
|
|
16879
|
+
const identity = `${navigator2.platform ?? ""} ${navigator2.userAgent}`;
|
|
16880
|
+
return /windows|win32|win64/iu.test(identity) ? "windows" : "posix";
|
|
16881
|
+
}
|
|
16882
|
+
function harnessInstallGuide(agent, platform) {
|
|
16883
|
+
const spec = HARNESS_INSTALL_SPECS[agent];
|
|
16884
|
+
return {
|
|
16885
|
+
url: spec.url,
|
|
16886
|
+
binary: spec.binary,
|
|
16887
|
+
command: platform === "windows" ? spec.windows : spec.posix
|
|
16888
|
+
};
|
|
16889
|
+
}
|
|
16890
|
+
function fillHarnessInstallPrompt(template, values) {
|
|
16891
|
+
return template.replaceAll(/\{(name|binary|command|url)\}/g, (_, key) => {
|
|
16892
|
+
if (key === "name") return values.name;
|
|
16893
|
+
if (key === "binary") return values.binary;
|
|
16894
|
+
if (key === "command") return values.command;
|
|
16895
|
+
return values.url;
|
|
16896
|
+
});
|
|
16897
|
+
}
|
|
16898
|
+
|
|
16700
16899
|
// src/settings/connections-page.ts
|
|
16701
16900
|
var CODEXHOST_GITHUB_ISSUES_NEW_URL = "https://github.com/LiberSeek/BOFT-CLI/issues/new";
|
|
16702
|
-
var HARNESS_INSTALL_URLS = Object.freeze({
|
|
16703
|
-
pi: "https://pi.dev/",
|
|
16704
|
-
"claude-code": "https://code.claude.com/docs/en/quickstart",
|
|
16705
|
-
"deepseek-harness": "https://deepseek-harness.github.io/deepseek-harness/",
|
|
16706
|
-
opencode: "https://opencode.ai/docs/",
|
|
16707
|
-
grok: "https://grok.com/",
|
|
16708
|
-
omp: "https://github.com/can1357/oh-my-pi",
|
|
16709
|
-
antigravity: "https://antigravity.google/product/antigravity-cli"
|
|
16710
|
-
});
|
|
16711
16901
|
function connectionStatusLabel(availability, messages, hasError = false) {
|
|
16712
16902
|
if (hasError && availability !== "notInstalled") return messages.connectionStatusError;
|
|
16713
16903
|
if (availability === "ready") return messages.connectionStatusReady;
|
|
@@ -16754,24 +16944,24 @@ ${error51.stderrTail}`] : []
|
|
|
16754
16944
|
line.append(name, content);
|
|
16755
16945
|
return line;
|
|
16756
16946
|
}
|
|
16757
|
-
function
|
|
16758
|
-
button.replaceChildren(createRendererSettingsIcon(
|
|
16947
|
+
function setActionButtonLabel(button, icon2, label) {
|
|
16948
|
+
button.replaceChildren(createRendererSettingsIcon(icon2, 16), label);
|
|
16759
16949
|
}
|
|
16760
|
-
function showCopyButtonFeedback(button, label, restoreLabel) {
|
|
16761
|
-
|
|
16950
|
+
function showCopyButtonFeedback(button, icon2, label, restoreLabel) {
|
|
16951
|
+
setActionButtonLabel(button, icon2, label);
|
|
16762
16952
|
button.ownerDocument.defaultView?.setTimeout(() => {
|
|
16763
|
-
|
|
16953
|
+
setActionButtonLabel(button, icon2, restoreLabel);
|
|
16764
16954
|
}, 2e3);
|
|
16765
16955
|
}
|
|
16766
|
-
function
|
|
16956
|
+
function copyTextToClipboard(document2, button, report, messages, restoreLabel, icon2 = "copy") {
|
|
16767
16957
|
const clipboard = document2.defaultView?.navigator.clipboard;
|
|
16768
16958
|
if (!clipboard) {
|
|
16769
|
-
showCopyButtonFeedback(button, messages.connectionCopyFailed, restoreLabel);
|
|
16959
|
+
showCopyButtonFeedback(button, icon2, messages.connectionCopyFailed, restoreLabel);
|
|
16770
16960
|
return;
|
|
16771
16961
|
}
|
|
16772
16962
|
void clipboard.writeText(report).then(
|
|
16773
|
-
() => showCopyButtonFeedback(button, messages.connectionCopied, restoreLabel),
|
|
16774
|
-
() => showCopyButtonFeedback(button, messages.connectionCopyFailed, restoreLabel)
|
|
16963
|
+
() => showCopyButtonFeedback(button, icon2, messages.connectionCopied, restoreLabel),
|
|
16964
|
+
() => showCopyButtonFeedback(button, icon2, messages.connectionCopyFailed, restoreLabel)
|
|
16775
16965
|
);
|
|
16776
16966
|
}
|
|
16777
16967
|
function connectionHostName(hostId, messages) {
|
|
@@ -16834,6 +17024,16 @@ ${error51.stderrTail}`] : []
|
|
|
16834
17024
|
body.className = "settings-connection-inline-detail";
|
|
16835
17025
|
body.dataset.connectionDetail = item.key;
|
|
16836
17026
|
if (item.agentSnapshot?.availability === "notInstalled") {
|
|
17027
|
+
const guide = harnessInstallGuide(
|
|
17028
|
+
item.agentSnapshot.agent,
|
|
17029
|
+
harnessInstallPlatform(document2.defaultView)
|
|
17030
|
+
);
|
|
17031
|
+
const prompt = fillHarnessInstallPrompt(messages.connectionInstallPrompt, {
|
|
17032
|
+
name: item.name,
|
|
17033
|
+
binary: guide.binary,
|
|
17034
|
+
command: guide.command,
|
|
17035
|
+
url: guide.url
|
|
17036
|
+
});
|
|
16837
17037
|
const callout = document2.createElement("div");
|
|
16838
17038
|
callout.className = "settings-connection-install-callout";
|
|
16839
17039
|
const icon2 = document2.createElement("span");
|
|
@@ -16844,18 +17044,67 @@ ${error51.stderrTail}`] : []
|
|
|
16844
17044
|
title2.textContent = `${messages.connectionInstall} ${item.name}`;
|
|
16845
17045
|
const description2 = document2.createElement("p");
|
|
16846
17046
|
description2.textContent = messages.connectionInstallDescription;
|
|
16847
|
-
|
|
17047
|
+
const commandBlock = document2.createElement("div");
|
|
17048
|
+
commandBlock.className = "settings-connection-install-command";
|
|
17049
|
+
const commandLabel = document2.createElement("span");
|
|
17050
|
+
commandLabel.textContent = messages.connectionInstallCommand;
|
|
17051
|
+
const command = document2.createElement("code");
|
|
17052
|
+
command.textContent = guide.command;
|
|
17053
|
+
commandBlock.append(commandLabel, command);
|
|
17054
|
+
copy2.append(title2, description2, commandBlock);
|
|
16848
17055
|
callout.append(icon2, copy2);
|
|
16849
|
-
const
|
|
16850
|
-
|
|
16851
|
-
install2
|
|
16852
|
-
install2.
|
|
16853
|
-
install2.
|
|
16854
|
-
install2.
|
|
17056
|
+
const actions2 = document2.createElement("div");
|
|
17057
|
+
actions2.className = "settings-connection-install-actions";
|
|
17058
|
+
const install2 = document2.createElement("button");
|
|
17059
|
+
install2.type = "button";
|
|
17060
|
+
install2.className = "settings-command-button";
|
|
17061
|
+
install2.dataset.connectionAction = "install-command";
|
|
17062
|
+
setActionButtonLabel(install2, "hard-drive-download", messages.connectionInstall);
|
|
17063
|
+
install2.addEventListener("click", () => {
|
|
17064
|
+
copyTextToClipboard(
|
|
17065
|
+
document2,
|
|
17066
|
+
install2,
|
|
17067
|
+
guide.command,
|
|
17068
|
+
messages,
|
|
17069
|
+
messages.connectionInstall,
|
|
17070
|
+
"hard-drive-download"
|
|
17071
|
+
);
|
|
17072
|
+
});
|
|
17073
|
+
const copyPromptWrap = document2.createElement("div");
|
|
17074
|
+
copyPromptWrap.className = "settings-connection-copy-prompt";
|
|
17075
|
+
const copyPrompt = document2.createElement("button");
|
|
17076
|
+
copyPrompt.type = "button";
|
|
17077
|
+
copyPrompt.className = "settings-command-button settings-command-button--secondary";
|
|
17078
|
+
copyPrompt.dataset.connectionAction = "copy-prompt";
|
|
17079
|
+
copyPrompt.setAttribute("aria-describedby", `${item.key}-install-prompt-tooltip`);
|
|
17080
|
+
setActionButtonLabel(copyPrompt, "copy", messages.connectionCopyPrompt);
|
|
17081
|
+
copyPrompt.addEventListener("click", () => {
|
|
17082
|
+
copyTextToClipboard(
|
|
17083
|
+
document2,
|
|
17084
|
+
copyPrompt,
|
|
17085
|
+
prompt,
|
|
17086
|
+
messages,
|
|
17087
|
+
messages.connectionCopyPrompt
|
|
17088
|
+
);
|
|
17089
|
+
});
|
|
17090
|
+
const tooltip = document2.createElement("div");
|
|
17091
|
+
tooltip.id = `${item.key}-install-prompt-tooltip`;
|
|
17092
|
+
tooltip.className = "settings-connection-copy-prompt__tooltip";
|
|
17093
|
+
tooltip.setAttribute("role", "tooltip");
|
|
17094
|
+
tooltip.textContent = prompt;
|
|
17095
|
+
copyPromptWrap.append(copyPrompt, tooltip);
|
|
17096
|
+
const official = document2.createElement("a");
|
|
17097
|
+
official.className = "settings-command-button settings-command-button--secondary";
|
|
17098
|
+
official.dataset.connectionAction = "open-installation";
|
|
17099
|
+
official.href = guide.url;
|
|
17100
|
+
official.target = "_blank";
|
|
17101
|
+
official.rel = "noopener noreferrer";
|
|
17102
|
+
official.append(
|
|
16855
17103
|
messages.connectionOpenInstallation,
|
|
16856
17104
|
createRendererSettingsIcon("external-link", 14)
|
|
16857
17105
|
);
|
|
16858
|
-
|
|
17106
|
+
actions2.append(install2, copyPromptWrap, official);
|
|
17107
|
+
body.append(callout, actions2);
|
|
16859
17108
|
return body;
|
|
16860
17109
|
}
|
|
16861
17110
|
if (!item.error) {
|
|
@@ -16917,10 +17166,10 @@ ${error51.stderrTail}`] : []
|
|
|
16917
17166
|
const copy = document2.createElement("button");
|
|
16918
17167
|
copy.type = "button";
|
|
16919
17168
|
copy.className = "settings-command-button settings-command-button--secondary";
|
|
16920
|
-
|
|
17169
|
+
setActionButtonLabel(copy, "copy", messages.connectionCopyDetails);
|
|
16921
17170
|
const report = diagnosticText(hostId, item);
|
|
16922
17171
|
copy.addEventListener("click", () => {
|
|
16923
|
-
|
|
17172
|
+
copyTextToClipboard(document2, copy, report, messages, messages.connectionCopyDetails);
|
|
16924
17173
|
});
|
|
16925
17174
|
logHeader.append(logTitle, copy);
|
|
16926
17175
|
const log = document2.createElement("pre");
|
|
@@ -16975,14 +17224,18 @@ ${error51.stderrTail}`] : []
|
|
|
16975
17224
|
action.setAttribute("role", "cell");
|
|
16976
17225
|
const canExpand = item.error !== null || item.agentSnapshot?.availability === "notInstalled" || item.openWebUi !== void 0;
|
|
16977
17226
|
if (item.agentSnapshot?.availability === "notInstalled") {
|
|
16978
|
-
const install2 = document2.createElement("
|
|
17227
|
+
const install2 = document2.createElement("button");
|
|
17228
|
+
install2.type = "button";
|
|
16979
17229
|
install2.className = "settings-connection-install-link";
|
|
16980
|
-
install2.
|
|
16981
|
-
install2.
|
|
16982
|
-
install2.
|
|
16983
|
-
install2.
|
|
16984
|
-
install2.title = messages.connectionOpenInstallation;
|
|
17230
|
+
install2.dataset.connectionAction = "show-install";
|
|
17231
|
+
install2.setAttribute("aria-label", `${messages.connectionInstall}: ${item.name}`);
|
|
17232
|
+
install2.setAttribute("aria-expanded", String(expanded));
|
|
17233
|
+
install2.title = messages.connectionInstall;
|
|
16985
17234
|
install2.append(createRendererSettingsIcon("download", 17));
|
|
17235
|
+
install2.addEventListener("click", (event) => {
|
|
17236
|
+
event?.stopPropagation?.();
|
|
17237
|
+
toggleExpand();
|
|
17238
|
+
});
|
|
16986
17239
|
action.append(install2);
|
|
16987
17240
|
} else if (item.error) {
|
|
16988
17241
|
const viewError = document2.createElement("button");
|
|
@@ -17447,11 +17700,11 @@ ${error51.stderrTail}`] : []
|
|
|
17447
17700
|
sessionImportTitle: "Session Import",
|
|
17448
17701
|
sessionImportHarness: "Harness",
|
|
17449
17702
|
sessionImportDescription: "Sessions keep their original project path. If a folder is not in the Codex sidebar, add it as a project first. Original history remains managed by the Harness.",
|
|
17450
|
-
sessionImportAvailabilityNote: "Available Harnesses come from the
|
|
17703
|
+
sessionImportAvailabilityNote: "Available Harnesses come from the selected Host. If activity is unknown, close the session in its native client before importing to avoid concurrent writes.",
|
|
17451
17704
|
sessionImportRefresh: "Refresh",
|
|
17452
|
-
sessionImportRefreshing: "Loading
|
|
17453
|
-
sessionImportUnavailable: "Session import is unavailable for this
|
|
17454
|
-
sessionImportEmpty: "No
|
|
17705
|
+
sessionImportRefreshing: "Loading sessions from the selected Host...",
|
|
17706
|
+
sessionImportUnavailable: "Session import is unavailable for this Harness or the selected Host protocol. Update the Host/plugin or choose another Harness.",
|
|
17707
|
+
sessionImportEmpty: "No sessions are available to import on the selected Host.",
|
|
17455
17708
|
sessionImportSearch: "Search",
|
|
17456
17709
|
sessionImportSearchPlaceholder: "Search titles, session IDs or project paths",
|
|
17457
17710
|
sessionImportNoMatches: "No sessions match your search.",
|
|
@@ -17459,7 +17712,7 @@ ${error51.stderrTail}`] : []
|
|
|
17459
17712
|
sessionImportPrevious: "Previous",
|
|
17460
17713
|
sessionImportNext: "Next",
|
|
17461
17714
|
sessionImportPageSummary: "{total} records / {from}-{to}",
|
|
17462
|
-
sessionImportLoadFailed: "
|
|
17715
|
+
sessionImportLoadFailed: "Sessions could not be loaded from the selected Host. Check directory access or duplicate session IDs, then retry.",
|
|
17463
17716
|
sessionImportFailed: "The session could not be imported.",
|
|
17464
17717
|
sessionImportUntitled: "Untitled session",
|
|
17465
17718
|
sessionImportUpdatedAt: "Updated",
|
|
@@ -17573,7 +17826,10 @@ ${error51.stderrTail}`] : []
|
|
|
17573
17826
|
connectionOpenInstallation: "Open official installation page",
|
|
17574
17827
|
connectionOpenHarnessWeb: "Open DeepSeek Harness Web",
|
|
17575
17828
|
connectionInstall: "Install",
|
|
17576
|
-
connectionInstallDescription: "This Harness was not detected.
|
|
17829
|
+
connectionInstallDescription: "This Harness was not detected. Copy the official install command, copy an install prompt for another Agent, or open the official installation page. After installing, return here and run the check again.",
|
|
17830
|
+
connectionInstallCommand: "Install command",
|
|
17831
|
+
connectionCopyPrompt: "Copy prompt",
|
|
17832
|
+
connectionInstallPrompt: "Please install {name} (CLI command: {binary}) on this machine.\n\nUse the official install method and run:\n{command}\n\nOfficial installation page: {url}\n\nAfter installation, verify that `{binary}` is available in the terminal and report the result.",
|
|
17577
17833
|
connectionErrorTitle: "Connection check failed",
|
|
17578
17834
|
connectionErrorLog: "Error log",
|
|
17579
17835
|
connectionOpenIssue: "Open GitHub Issue",
|
|
@@ -17672,11 +17928,11 @@ ${error51.stderrTail}`] : []
|
|
|
17672
17928
|
sessionImportTitle: "\u4F1A\u8BDD\u5BFC\u5165",
|
|
17673
17929
|
sessionImportHarness: "Harness",
|
|
17674
17930
|
sessionImportDescription: "\u4F1A\u8BDD\u5C06\u4FDD\u7559\u539F\u59CB\u9879\u76EE\u8DEF\u5F84\uFF1B\u82E5\u8BE5\u6587\u4EF6\u5939\u5C1A\u672A\u51FA\u73B0\u5728 Codex \u4FA7\u680F\uFF0C\u8BF7\u5148\u5C06\u5176\u6DFB\u52A0\u4E3A\u9879\u76EE\u3002\u539F\u59CB\u5386\u53F2\u4ECD\u7531 Harness \u7BA1\u7406\u3002",
|
|
17675
|
-
sessionImportAvailabilityNote: "\u53EF\u9009 Harness \u6765\u81EA\
|
|
17931
|
+
sessionImportAvailabilityNote: "\u53EF\u9009 Harness \u6765\u81EA\u5F53\u524D Host\u3002\u8FD0\u884C\u72B6\u6001\u672A\u77E5\u65F6\uFF0C\u8BF7\u5148\u5728\u539F\u751F\u5BA2\u6237\u7AEF\u5173\u95ED\u8BE5\u4F1A\u8BDD\u518D\u5BFC\u5165\uFF0C\u907F\u514D\u540C\u65F6\u5199\u5165\u3002",
|
|
17676
17932
|
sessionImportRefresh: "\u5237\u65B0",
|
|
17677
|
-
sessionImportRefreshing: "\u6B63\u5728\u8BFB\u53D6\
|
|
17678
|
-
sessionImportUnavailable: "\
|
|
17679
|
-
sessionImportEmpty: "\u6CA1\u6709\u53EF\u5BFC\u5165\u7684\
|
|
17933
|
+
sessionImportRefreshing: "\u6B63\u5728\u8BFB\u53D6\u5F53\u524D Host \u4E0A\u7684\u4F1A\u8BDD\u2026\u2026",
|
|
17934
|
+
sessionImportUnavailable: "\u8BE5 Harness \u6216\u5F53\u524D Host \u534F\u8BAE\u6682\u4E0D\u652F\u6301\u4F1A\u8BDD\u5BFC\u5165\uFF0C\u8BF7\u66F4\u65B0 Host/\u63D2\u4EF6\u6216\u9009\u62E9\u5176\u4ED6 Harness\u3002",
|
|
17935
|
+
sessionImportEmpty: "\u5F53\u524D Host \u4E0A\u6CA1\u6709\u53EF\u5BFC\u5165\u7684\u4F1A\u8BDD\u3002",
|
|
17680
17936
|
sessionImportSearch: "\u641C\u7D22",
|
|
17681
17937
|
sessionImportSearchPlaceholder: "\u641C\u7D22\u6807\u9898\u3001\u4F1A\u8BDD ID \u6216\u9879\u76EE\u8DEF\u5F84",
|
|
17682
17938
|
sessionImportNoMatches: "\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD\u3002",
|
|
@@ -17684,7 +17940,7 @@ ${error51.stderrTail}`] : []
|
|
|
17684
17940
|
sessionImportPrevious: "\u4E0A\u4E00\u9875",
|
|
17685
17941
|
sessionImportNext: "\u4E0B\u4E00\u9875",
|
|
17686
17942
|
sessionImportPageSummary: "{total} \u6761\u8BB0\u5F55 / {from}-{to}",
|
|
17687
|
-
sessionImportLoadFailed: "\u65E0\u6CD5\u8BFB\u53D6\
|
|
17943
|
+
sessionImportLoadFailed: "\u65E0\u6CD5\u8BFB\u53D6\u5F53\u524D Host \u4E0A\u7684\u4F1A\u8BDD\uFF0C\u8BF7\u68C0\u67E5\u76EE\u5F55\u8BBF\u95EE\u6743\u9650\u6216\u91CD\u590D\u7684\u4F1A\u8BDD ID \u540E\u91CD\u8BD5\u3002",
|
|
17688
17944
|
sessionImportFailed: "\u65E0\u6CD5\u5BFC\u5165\u8BE5\u4F1A\u8BDD\u3002",
|
|
17689
17945
|
sessionImportUntitled: "\u672A\u547D\u540D\u4F1A\u8BDD",
|
|
17690
17946
|
sessionImportUpdatedAt: "\u66F4\u65B0\u65F6\u95F4",
|
|
@@ -17798,7 +18054,10 @@ ${error51.stderrTail}`] : []
|
|
|
17798
18054
|
connectionOpenInstallation: "\u524D\u5F80\u5B98\u65B9\u5B89\u88C5\u9875\u9762",
|
|
17799
18055
|
connectionOpenHarnessWeb: "\u6253\u5F00 DeepSeek Harness Web",
|
|
17800
18056
|
connectionInstall: "\u5B89\u88C5",
|
|
17801
|
-
connectionInstallDescription: "\u5C1A\u672A\u68C0\u6D4B\u5230\u8BE5 Harness\u3002\
|
|
18057
|
+
connectionInstallDescription: "\u5C1A\u672A\u68C0\u6D4B\u5230\u8BE5 Harness\u3002\u53EF\u4EE5\u590D\u5236\u5B98\u65B9\u5B89\u88C5\u547D\u4EE4\u3001\u590D\u5236\u5B89\u88C5 Prompt \u4EA4\u7ED9\u5176\u4ED6 Agent \u6267\u884C\uFF0C\u6216\u524D\u5F80\u5B98\u65B9\u5B89\u88C5\u9875\u9762\u3002\u5B89\u88C5\u5B8C\u6210\u540E\u8BF7\u8FD4\u56DE\u6B64\u9875\u9762\u91CD\u65B0\u68C0\u67E5\u3002",
|
|
18058
|
+
connectionInstallCommand: "\u5B89\u88C5\u547D\u4EE4",
|
|
18059
|
+
connectionCopyPrompt: "\u590D\u5236 Prompt",
|
|
18060
|
+
connectionInstallPrompt: "\u8BF7\u5E2E\u6211\u5728\u672C\u673A\u5B89\u88C5 {name}\uFF08CLI \u547D\u4EE4\uFF1A{binary}\uFF09\u3002\n\n\u8BF7\u6309\u5B98\u65B9\u5B89\u88C5\u65B9\u5F0F\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\uFF0C\u5E76\u5904\u7406 PATH\u3001\u6743\u9650\u548C\u4F9D\u8D56\u95EE\u9898\uFF1A\n{command}\n\n\u5B98\u65B9\u5B89\u88C5\u9875\u9762\uFF1A{url}\n\n\u5B89\u88C5\u5B8C\u6210\u540E\u8BF7\u9A8C\u8BC1 `{binary}` \u53EF\u4EE5\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C\uFF0C\u5E76\u544A\u8BC9\u6211\u7ED3\u679C\u3002",
|
|
17802
18061
|
connectionErrorTitle: "\u8FDE\u63A5\u68C0\u67E5\u5931\u8D25",
|
|
17803
18062
|
connectionErrorLog: "\u9519\u8BEF\u65E5\u5FD7",
|
|
17804
18063
|
connectionOpenIssue: "\u63D0\u4EA4 GitHub Issue",
|
|
@@ -17927,7 +18186,10 @@ ${error51.stderrTail}`] : []
|
|
|
17927
18186
|
opencode: "https://opencode.ai/docs/",
|
|
17928
18187
|
grok: "https://grok.com/",
|
|
17929
18188
|
omp: "https://github.com/can1357/oh-my-pi",
|
|
17930
|
-
antigravity: "https://antigravity.google/product/antigravity-cli"
|
|
18189
|
+
antigravity: "https://antigravity.google/product/antigravity-cli",
|
|
18190
|
+
hermes: "https://hermes-agent.nousresearch.com/docs",
|
|
18191
|
+
muse: "https://www.meta.ai/",
|
|
18192
|
+
"kiro-cli": "https://kiro.dev/docs/cli/"
|
|
17931
18193
|
};
|
|
17932
18194
|
var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
|
|
17933
18195
|
var AGENT_MENU_WIDTH = 224;
|
|
@@ -19274,7 +19536,10 @@ ${error51.stderrTail}`] : []
|
|
|
19274
19536
|
["Workspace write", "\u5DE5\u4F5C\u533A\u5199\u5165"],
|
|
19275
19537
|
["Full access (dangerous)", "\u5B8C\u5168\u8BBF\u95EE\uFF08\u5371\u9669\uFF09"],
|
|
19276
19538
|
["Configured permissions", "\u4F7F\u7528\u5DF2\u914D\u7F6E\u6743\u9650"],
|
|
19277
|
-
["Skip permissions", "\u8DF3\u8FC7\u6743\u9650\u68C0\u67E5"]
|
|
19539
|
+
["Skip permissions", "\u8DF3\u8FC7\u6743\u9650\u68C0\u67E5"],
|
|
19540
|
+
["On request", "\u6309\u8BF7\u6C42\u8BE2\u95EE"],
|
|
19541
|
+
["Prompt unmatched", "\u672A\u5339\u914D\u65F6\u8BE2\u95EE"],
|
|
19542
|
+
["Deny unmatched", "\u672A\u5339\u914D\u65F6\u62D2\u7EDD"]
|
|
19278
19543
|
]);
|
|
19279
19544
|
var CHINESE_PERMISSION_MODE_DESCRIPTIONS = /* @__PURE__ */ new Map([
|
|
19280
19545
|
[
|
|
@@ -19626,7 +19891,9 @@ ${error51.stderrTail}`] : []
|
|
|
19626
19891
|
// src/renderer-usage-control.ts
|
|
19627
19892
|
var ENGLISH_USAGE_MESSAGES = Object.freeze({
|
|
19628
19893
|
usage: "Usage",
|
|
19894
|
+
account: "Account",
|
|
19629
19895
|
context: "Context",
|
|
19896
|
+
recordedCredits: "Recorded usage",
|
|
19630
19897
|
latestCacheHit: "Latest cache hit",
|
|
19631
19898
|
outputSpeed: "Output speed",
|
|
19632
19899
|
cacheRead: "Cache read",
|
|
@@ -19634,19 +19901,17 @@ ${error51.stderrTail}`] : []
|
|
|
19634
19901
|
reasoning: "Reasoning",
|
|
19635
19902
|
totalTokens: "Total tokens",
|
|
19636
19903
|
inputOutput: "Input / output",
|
|
19637
|
-
fiveHourLimit: "5-hour limit",
|
|
19638
|
-
sevenDayLimit: "7-day limit",
|
|
19639
19904
|
sessionCostEstimate: "Session cost estimate",
|
|
19640
19905
|
threadUsage: "Thread Usage",
|
|
19641
19906
|
threadUsageDetails: "Thread Usage details",
|
|
19642
19907
|
tokensSummary: "tokens",
|
|
19643
|
-
tokensPerSecond: "tok/s"
|
|
19644
|
-
fiveHourSummary: "5h",
|
|
19645
|
-
sevenDaySummary: "7d"
|
|
19908
|
+
tokensPerSecond: "tok/s"
|
|
19646
19909
|
});
|
|
19647
19910
|
var CHINESE_USAGE_MESSAGES = Object.freeze({
|
|
19648
19911
|
usage: "\u7528\u91CF",
|
|
19912
|
+
account: "\u8D26\u53F7",
|
|
19649
19913
|
context: "\u4E0A\u4E0B\u6587",
|
|
19914
|
+
recordedCredits: "\u5DF2\u8BB0\u5F55\u6D88\u8017",
|
|
19650
19915
|
latestCacheHit: "\u7F13\u5B58\u547D\u4E2D\u7387",
|
|
19651
19916
|
outputSpeed: "\u8F93\u51FA\u901F\u5EA6",
|
|
19652
19917
|
cacheRead: "\u7F13\u5B58\u8BFB\u53D6",
|
|
@@ -19654,15 +19919,11 @@ ${error51.stderrTail}`] : []
|
|
|
19654
19919
|
reasoning: "\u63A8\u7406",
|
|
19655
19920
|
totalTokens: "Token \u603B\u6570",
|
|
19656
19921
|
inputOutput: "\u8F93\u5165 / \u8F93\u51FA",
|
|
19657
|
-
fiveHourLimit: "5 \u5C0F\u65F6\u9650\u989D",
|
|
19658
|
-
sevenDayLimit: "7 \u5929\u9650\u989D",
|
|
19659
19922
|
sessionCostEstimate: "\u4F1A\u8BDD\u8D39\u7528\u4F30\u7B97",
|
|
19660
19923
|
threadUsage: "\u5BF9\u8BDD\u7528\u91CF",
|
|
19661
19924
|
threadUsageDetails: "\u5BF9\u8BDD\u7528\u91CF\u8BE6\u60C5",
|
|
19662
19925
|
tokensSummary: "Token",
|
|
19663
|
-
tokensPerSecond: "Token/\u79D2"
|
|
19664
|
-
fiveHourSummary: "5 \u5C0F\u65F6",
|
|
19665
|
-
sevenDaySummary: "7 \u5929"
|
|
19926
|
+
tokensPerSecond: "Token/\u79D2"
|
|
19666
19927
|
});
|
|
19667
19928
|
function rendererUsageMessages(locale) {
|
|
19668
19929
|
return locale === "zh-CN" ? CHINESE_USAGE_MESSAGES : ENGLISH_USAGE_MESSAGES;
|
|
@@ -19676,6 +19937,9 @@ ${error51.stderrTail}`] : []
|
|
|
19676
19937
|
function formatRendererCost(value) {
|
|
19677
19938
|
return `$${value.toFixed(3)}`;
|
|
19678
19939
|
}
|
|
19940
|
+
function formatRendererCredits(value) {
|
|
19941
|
+
return `${value > 0 && value < 1e-3 ? "<0.001" : decimal(value, 3)} credits`;
|
|
19942
|
+
}
|
|
19679
19943
|
function formatRendererTokenRate(value, locale = "en") {
|
|
19680
19944
|
return `${decimal(value, 1)} ${rendererUsageMessages(locale).tokensPerSecond}`;
|
|
19681
19945
|
}
|
|
@@ -19730,27 +19994,11 @@ ${error51.stderrTail}`] : []
|
|
|
19730
19994
|
svg.append(track, fill);
|
|
19731
19995
|
return svg;
|
|
19732
19996
|
}
|
|
19733
|
-
function formatRendererPlanReset(unixSeconds, locale) {
|
|
19734
|
-
const date5 = new Date(unixSeconds * 1e3);
|
|
19735
|
-
if (Number.isNaN(date5.getTime())) return "";
|
|
19736
|
-
return date5.toLocaleString(locale === "zh-CN" ? "zh-CN" : void 0, {
|
|
19737
|
-
month: "long",
|
|
19738
|
-
day: "numeric",
|
|
19739
|
-
hour: "numeric",
|
|
19740
|
-
minute: "2-digit"
|
|
19741
|
-
});
|
|
19742
|
-
}
|
|
19743
|
-
function formatRendererPlanWindow(usedPercent, resetsAtUnix, locale) {
|
|
19744
|
-
const percent = formatRendererCreditsPercent(usedPercent);
|
|
19745
|
-
if (resetsAtUnix === void 0) return percent;
|
|
19746
|
-
const reset = formatRendererPlanReset(resetsAtUnix, locale);
|
|
19747
|
-
return reset.length > 0 ? `${percent} \xB7 ${reset}` : percent;
|
|
19748
|
-
}
|
|
19749
19997
|
function rendererUsageTriggerMaxWidth() {
|
|
19750
19998
|
return "min(180px, 30vw)";
|
|
19751
19999
|
}
|
|
19752
20000
|
function rendererUsageHasDisplayData(usage) {
|
|
19753
|
-
return usage?.cacheHitRatePercent !== void 0 || usage?.outputTokensPerSecond !== void 0 || usage?.totalCostUsd !== void 0 || usage?.
|
|
20001
|
+
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;
|
|
19754
20002
|
}
|
|
19755
20003
|
function applyRendererPopoverChrome(popover) {
|
|
19756
20004
|
popover.style.border = "1px solid light-dark(rgba(15, 23, 42, 0.10), color-mix(in srgb, CanvasText 16%, transparent))";
|
|
@@ -19759,10 +20007,10 @@ ${error51.stderrTail}`] : []
|
|
|
19759
20007
|
popover.style.color = "CanvasText";
|
|
19760
20008
|
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))";
|
|
19761
20009
|
}
|
|
19762
|
-
function addDetailRow(parent, label, value) {
|
|
20010
|
+
function addDetailRow(parent, label, value, wrap = false) {
|
|
19763
20011
|
const row = document.createElement("div");
|
|
19764
20012
|
row.style.display = "grid";
|
|
19765
|
-
row.style.gridTemplateColumns = "minmax(0, 1fr) auto";
|
|
20013
|
+
row.style.gridTemplateColumns = wrap ? "auto minmax(0, 1fr)" : "minmax(0, 1fr) auto";
|
|
19766
20014
|
row.style.gap = "20px";
|
|
19767
20015
|
row.style.padding = "4px 0";
|
|
19768
20016
|
const labelElement = document.createElement("span");
|
|
@@ -19772,17 +20020,24 @@ ${error51.stderrTail}`] : []
|
|
|
19772
20020
|
valueElement.textContent = value;
|
|
19773
20021
|
valueElement.style.fontVariantNumeric = "tabular-nums";
|
|
19774
20022
|
valueElement.style.textAlign = "right";
|
|
20023
|
+
if (wrap) {
|
|
20024
|
+
valueElement.style.overflowWrap = "anywhere";
|
|
20025
|
+
valueElement.title = value;
|
|
20026
|
+
}
|
|
19775
20027
|
row.append(labelElement, valueElement);
|
|
19776
20028
|
parent.append(row);
|
|
19777
20029
|
}
|
|
19778
|
-
function renderDetails(popover, usage, messages, locale) {
|
|
20030
|
+
function renderDetails(popover, usage, messages, locale, accountName) {
|
|
19779
20031
|
popover.replaceChildren();
|
|
19780
20032
|
const heading = document.createElement("div");
|
|
19781
20033
|
heading.textContent = messages.usage;
|
|
19782
20034
|
heading.style.fontWeight = "600";
|
|
19783
20035
|
heading.style.marginBottom = "6px";
|
|
19784
20036
|
popover.append(heading);
|
|
19785
|
-
if (
|
|
20037
|
+
if (accountName) addDetailRow(popover, messages.account, accountName, true);
|
|
20038
|
+
if (usage?.contextUsagePercent !== void 0) {
|
|
20039
|
+
addDetailRow(popover, messages.context, `${decimal(usage.contextUsagePercent, 1)}%`);
|
|
20040
|
+
} else if (usage?.contextUsedTokens !== void 0 && usage.contextWindowTokens !== void 0) {
|
|
19786
20041
|
const contextPercent = usage.contextWindowTokens > 0 ? usage.contextUsedTokens / usage.contextWindowTokens * 100 : null;
|
|
19787
20042
|
addDetailRow(
|
|
19788
20043
|
popover,
|
|
@@ -19824,34 +20079,15 @@ ${error51.stderrTail}`] : []
|
|
|
19824
20079
|
addDetailRow(
|
|
19825
20080
|
popover,
|
|
19826
20081
|
messages.inputOutput,
|
|
19827
|
-
`${
|
|
19828
|
-
);
|
|
19829
|
-
}
|
|
19830
|
-
if (usage?.planFiveHourUsedPercent !== void 0) {
|
|
19831
|
-
addDetailRow(
|
|
19832
|
-
popover,
|
|
19833
|
-
messages.fiveHourLimit,
|
|
19834
|
-
formatRendererPlanWindow(
|
|
19835
|
-
usage.planFiveHourUsedPercent,
|
|
19836
|
-
usage.planFiveHourResetsAtUnix,
|
|
19837
|
-
locale
|
|
19838
|
-
)
|
|
19839
|
-
);
|
|
19840
|
-
}
|
|
19841
|
-
if (usage?.planSevenDayUsedPercent !== void 0) {
|
|
19842
|
-
addDetailRow(
|
|
19843
|
-
popover,
|
|
19844
|
-
messages.sevenDayLimit,
|
|
19845
|
-
formatRendererPlanWindow(
|
|
19846
|
-
usage.planSevenDayUsedPercent,
|
|
19847
|
-
usage.planSevenDayResetsAtUnix,
|
|
19848
|
-
locale
|
|
19849
|
-
)
|
|
20082
|
+
`${usage.inputTokens === void 0 ? "-" : formatRendererTokenCount(usage.inputTokens)} / ${usage.outputTokens === void 0 ? "-" : formatRendererTokenCount(usage.outputTokens)}`
|
|
19850
20083
|
);
|
|
19851
20084
|
}
|
|
19852
20085
|
if (usage?.totalCostUsd !== void 0) {
|
|
19853
20086
|
addDetailRow(popover, messages.sessionCostEstimate, formatRendererCost(usage.totalCostUsd));
|
|
19854
20087
|
}
|
|
20088
|
+
if (usage?.totalCredits !== void 0) {
|
|
20089
|
+
addDetailRow(popover, messages.recordedCredits, formatRendererCredits(usage.totalCredits));
|
|
20090
|
+
}
|
|
19855
20091
|
}
|
|
19856
20092
|
function popoverIsOpen(popover) {
|
|
19857
20093
|
try {
|
|
@@ -19935,6 +20171,8 @@ ${error51.stderrTail}`] : []
|
|
|
19935
20171
|
popover.setAttribute("popover", "auto");
|
|
19936
20172
|
popover.hidden = typeof popover.showPopover !== "function";
|
|
19937
20173
|
popover.style.position = "fixed";
|
|
20174
|
+
popover.style.boxSizing = "border-box";
|
|
20175
|
+
popover.style.margin = "0";
|
|
19938
20176
|
popover.style.inset = "auto";
|
|
19939
20177
|
popover.style.width = "260px";
|
|
19940
20178
|
popover.style.maxWidth = "min(320px, calc(100vw - 24px))";
|
|
@@ -20006,7 +20244,7 @@ ${error51.stderrTail}`] : []
|
|
|
20006
20244
|
document.body.append(popover);
|
|
20007
20245
|
return control;
|
|
20008
20246
|
}
|
|
20009
|
-
function renderRendererUsageControl(control, usage, locale = control.locale) {
|
|
20247
|
+
function renderRendererUsageControl(control, usage, locale = control.locale, accountName = null) {
|
|
20010
20248
|
control.locale = locale;
|
|
20011
20249
|
const messages = rendererUsageMessages(locale);
|
|
20012
20250
|
control.popover.setAttribute("aria-label", messages.threadUsageDetails);
|
|
@@ -20015,18 +20253,20 @@ ${error51.stderrTail}`] : []
|
|
|
20015
20253
|
const totalCostUsd = usage?.totalCostUsd;
|
|
20016
20254
|
const hasContext = usage?.contextUsedTokens !== void 0 && usage.contextWindowTokens !== void 0;
|
|
20017
20255
|
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;
|
|
20018
|
-
const
|
|
20019
|
-
const visible = rendererUsageHasDisplayData(usage);
|
|
20256
|
+
const visible = rendererUsageHasDisplayData(usage) || Boolean(accountName);
|
|
20020
20257
|
control.root.style.display = visible ? "inline-flex" : "none";
|
|
20021
20258
|
if (!visible) {
|
|
20022
20259
|
closePopover(control);
|
|
20023
20260
|
return false;
|
|
20024
20261
|
}
|
|
20025
20262
|
const summary = [
|
|
20263
|
+
usage?.totalCredits !== void 0 ? formatRendererCredits(usage.totalCredits) : null,
|
|
20026
20264
|
cacheHitRatePercent !== void 0 ? formatRendererCacheHitRate(cacheHitRatePercent) : null,
|
|
20027
20265
|
outputTokensPerSecond !== void 0 ? formatRendererTokenRate(outputTokensPerSecond, locale) : null,
|
|
20028
20266
|
totalCostUsd !== void 0 ? formatRendererCost(totalCostUsd) : null
|
|
20029
20267
|
].filter((value) => value !== null);
|
|
20268
|
+
const contextPercent = usage?.contextUsagePercent;
|
|
20269
|
+
if (contextPercent !== void 0 && summary.length === 0) summary.push(messages.usage);
|
|
20030
20270
|
if (summary.length === 0 && hasContext && usage?.contextWindowTokens !== void 0 && usage.contextWindowTokens > 0) {
|
|
20031
20271
|
summary.push(
|
|
20032
20272
|
formatRendererContextSummary(usage.contextUsedTokens ?? 0, usage.contextWindowTokens)
|
|
@@ -20040,18 +20280,13 @@ ${error51.stderrTail}`] : []
|
|
|
20040
20280
|
`${formatRendererTokenCount((usage?.inputTokens ?? 0) + (usage?.outputTokens ?? 0))} ${messages.tokensSummary}`
|
|
20041
20281
|
);
|
|
20042
20282
|
}
|
|
20043
|
-
|
|
20044
|
-
|
|
20045
|
-
usage?.planFiveHourUsedPercent !== void 0 ? `${messages.fiveHourSummary} ${formatRendererCreditsPercent(usage.planFiveHourUsedPercent)}` : `${messages.sevenDaySummary} ${formatRendererCreditsPercent(usage?.planSevenDayUsedPercent ?? 0)}`
|
|
20046
|
-
);
|
|
20047
|
-
}
|
|
20048
|
-
const compactSummary = summary.join(" \xB7 ");
|
|
20049
|
-
const accessibleSummary = `${messages.threadUsage}: ${compactSummary}`;
|
|
20283
|
+
const compactSummary = summary.join(" \xB7 ") || messages.usage;
|
|
20284
|
+
const accessibleSummary = `${messages.threadUsage}: ${compactSummary}${contextPercent !== void 0 ? `; ${messages.context} ${decimal(contextPercent, 1)}%` : ""}`;
|
|
20050
20285
|
control.trigger.style.maxWidth = rendererUsageTriggerMaxWidth();
|
|
20051
20286
|
control.trigger.setAttribute("aria-label", accessibleSummary);
|
|
20052
20287
|
control.trigger.title = accessibleSummary;
|
|
20053
20288
|
control.label.textContent = compactSummary;
|
|
20054
|
-
renderDetails(control.popover, usage, messages, locale);
|
|
20289
|
+
renderDetails(control.popover, usage, messages, locale, accountName);
|
|
20055
20290
|
return true;
|
|
20056
20291
|
}
|
|
20057
20292
|
|
|
@@ -21260,7 +21495,15 @@ ${error51.stderrTail}`] : []
|
|
|
21260
21495
|
permissionModeVisible,
|
|
21261
21496
|
locale
|
|
21262
21497
|
);
|
|
21263
|
-
|
|
21498
|
+
const selectedCodexAccount = state.agent === "codex" && !ownershipError ? codexAccounts.find((account) => account.active) : void 0;
|
|
21499
|
+
if (control.usage) {
|
|
21500
|
+
renderRendererUsageControl(
|
|
21501
|
+
control.usage,
|
|
21502
|
+
usage,
|
|
21503
|
+
locale,
|
|
21504
|
+
selectedCodexAccount?.email ?? selectedCodexAccount?.label ?? null
|
|
21505
|
+
);
|
|
21506
|
+
}
|
|
21264
21507
|
control.harnessCommands.setLocale(locale);
|
|
21265
21508
|
control.harnessCommands.root.hidden = state.agent === "codex";
|
|
21266
21509
|
control.harnessCommands.root.style.display = state.agent === "codex" ? "none" : "inline-flex";
|
|
@@ -21404,14 +21647,7 @@ ${error51.stderrTail}`] : []
|
|
|
21404
21647
|
}
|
|
21405
21648
|
function rendererAgentForThreadOwnership(ownership) {
|
|
21406
21649
|
if (ownership.owner === "codex") return null;
|
|
21407
|
-
|
|
21408
|
-
if (ownership.harnessId === "claude-code") return "claude-code";
|
|
21409
|
-
if (ownership.harnessId === "deepseek-harness") return "deepseek-harness";
|
|
21410
|
-
if (ownership.harnessId === "opencode") return "opencode";
|
|
21411
|
-
if (ownership.harnessId === "grok") return "grok";
|
|
21412
|
-
if (ownership.harnessId === "omp") return "omp";
|
|
21413
|
-
if (ownership.harnessId === "antigravity") return "antigravity";
|
|
21414
|
-
return null;
|
|
21650
|
+
return KNOWN_RENDERER_AGENTS.includes(ownership.harnessId) && ownership.harnessId !== "codex" ? ownership.harnessId : null;
|
|
21415
21651
|
}
|
|
21416
21652
|
var BrowserSidebarAgentIconRow = class {
|
|
21417
21653
|
constructor(element) {
|
|
@@ -22542,6 +22778,13 @@ ${error51.stderrTail}`] : []
|
|
|
22542
22778
|
var OMP_TRANSPORT_MODEL_PREFIX = `${OMP_TRANSPORT_MODEL_ID}@`;
|
|
22543
22779
|
var ANTIGRAVITY_TRANSPORT_MODEL_ID = "codexhost/antigravity-native";
|
|
22544
22780
|
var ANTIGRAVITY_TRANSPORT_MODEL_PREFIX = `${ANTIGRAVITY_TRANSPORT_MODEL_ID}@`;
|
|
22781
|
+
function hermesTransportModelId(model, permissionModeId) {
|
|
22782
|
+
return encodeHarnessPluginRoute({
|
|
22783
|
+
harnessId: harnessIdSchema.parse("hermes"),
|
|
22784
|
+
...model ? { model: harnessModelRefSchema.parse(model) } : {},
|
|
22785
|
+
...permissionModeId ? { permissionModeId: harnessPermissionModeIdSchema.parse(permissionModeId) } : {}
|
|
22786
|
+
});
|
|
22787
|
+
}
|
|
22545
22788
|
function transitionRendererAdapterStatus(current, next, publish) {
|
|
22546
22789
|
if (current.state === next.state && current.reason === next.reason && current.hook === next.hook) {
|
|
22547
22790
|
return false;
|
|
@@ -22562,7 +22805,8 @@ ${error51.stderrTail}`] : []
|
|
|
22562
22805
|
if (agent === "grok") return GROK_TRANSPORT_MODEL_ID;
|
|
22563
22806
|
if (agent === "omp") return OMP_TRANSPORT_MODEL_ID;
|
|
22564
22807
|
if (agent === "antigravity") return ANTIGRAVITY_TRANSPORT_MODEL_ID;
|
|
22565
|
-
return null;
|
|
22808
|
+
if (agent === "codex") return null;
|
|
22809
|
+
return encodeHarnessPluginRoute({ harnessId: harnessPluginIdSchema.parse(agent) });
|
|
22566
22810
|
}
|
|
22567
22811
|
function isRecord6(value) {
|
|
22568
22812
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -23004,7 +23248,12 @@ ${error51.stderrTail}`] : []
|
|
|
23004
23248
|
}
|
|
23005
23249
|
}
|
|
23006
23250
|
function modelSelectionForAgent(officialSelection, reasoningEffort, agent, model, thinkingOptionId, permissionModeId) {
|
|
23007
|
-
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) :
|
|
23251
|
+
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 === "hermes" ? hermesTransportModelId(model, permissionModeId) : agent === "codex" ? null : model || thinkingOptionId || permissionModeId ? encodeHarnessPluginRoute({
|
|
23252
|
+
harnessId: harnessPluginIdSchema.parse(agent),
|
|
23253
|
+
...model ? { model } : {},
|
|
23254
|
+
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
23255
|
+
...permissionModeId ? { permissionModeId } : {}
|
|
23256
|
+
}) : transportModelIdForAgent(agent);
|
|
23008
23257
|
return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
|
|
23009
23258
|
}
|
|
23010
23259
|
function installCurrentRendererAdapter() {
|
|
@@ -23271,6 +23520,658 @@ ${error51.stderrTail}`] : []
|
|
|
23271
23520
|
};
|
|
23272
23521
|
}
|
|
23273
23522
|
|
|
23523
|
+
// src/renderer-approval-style.ts
|
|
23524
|
+
function installRendererApprovalStyle(ownerDocument) {
|
|
23525
|
+
if (typeof ownerDocument.createElement !== "function") return () => void 0;
|
|
23526
|
+
ownerDocument.querySelector("style[data-codexhost-approval-style]")?.remove();
|
|
23527
|
+
const style = ownerDocument.createElement("style");
|
|
23528
|
+
style.setAttribute("data-codexhost-approval-style", "true");
|
|
23529
|
+
style.textContent = `
|
|
23530
|
+
[data-codex-approval-surface] > form {
|
|
23531
|
+
justify-content: flex-end;
|
|
23532
|
+
}
|
|
23533
|
+
[data-codex-approval-surface] > form > .ms-auto {
|
|
23534
|
+
margin-inline-start: 0;
|
|
23535
|
+
}
|
|
23536
|
+
`;
|
|
23537
|
+
(ownerDocument.head ?? ownerDocument.documentElement)?.append?.(style);
|
|
23538
|
+
return () => style.remove();
|
|
23539
|
+
}
|
|
23540
|
+
|
|
23541
|
+
// src/renderer-subagent-thread-model.ts
|
|
23542
|
+
function isRecord7(value) {
|
|
23543
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23544
|
+
}
|
|
23545
|
+
function nonBlank(value) {
|
|
23546
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
23547
|
+
}
|
|
23548
|
+
function threadFromReadResult(value, expectedThreadId) {
|
|
23549
|
+
if (!isRecord7(value)) return null;
|
|
23550
|
+
const directThread = isRecord7(value.thread) ? value.thread : null;
|
|
23551
|
+
const nestedThread = isRecord7(value.result) && isRecord7(value.result.thread) ? value.result.thread : null;
|
|
23552
|
+
const thread = directThread ?? nestedThread;
|
|
23553
|
+
if (!thread) return null;
|
|
23554
|
+
if (expectedThreadId && (!nonBlank(thread.id) || thread.id.trim() !== expectedThreadId)) {
|
|
23555
|
+
return null;
|
|
23556
|
+
}
|
|
23557
|
+
return thread;
|
|
23558
|
+
}
|
|
23559
|
+
function rendererThreadRequestTarget() {
|
|
23560
|
+
if (typeof window === "undefined") return null;
|
|
23561
|
+
const policy = window.__codexhostDraftPrewarmPolicyV1;
|
|
23562
|
+
if (typeof policy?.requestTarget !== "function") return null;
|
|
23563
|
+
try {
|
|
23564
|
+
const target = policy.requestTarget();
|
|
23565
|
+
return isRecord7(target) && typeof target.sendRequest === "function" ? target : null;
|
|
23566
|
+
} catch {
|
|
23567
|
+
return null;
|
|
23568
|
+
}
|
|
23569
|
+
}
|
|
23570
|
+
function isParentComposerModelLabel(model) {
|
|
23571
|
+
const head = model.includes(" \xB7 ") ? model.split(" \xB7 ")[0]?.trim() ?? "" : model;
|
|
23572
|
+
if (!head) return false;
|
|
23573
|
+
if (/^(grok|gpt|o\d|claude|codex)/i.test(head)) return false;
|
|
23574
|
+
return model.includes(" \xB7 ");
|
|
23575
|
+
}
|
|
23576
|
+
function usableThreadModel(value) {
|
|
23577
|
+
if (!nonBlank(value) || isParentComposerModelLabel(value)) return void 0;
|
|
23578
|
+
return value.trim();
|
|
23579
|
+
}
|
|
23580
|
+
function subagentThreadModelFromReadResult(value, expectedThreadId) {
|
|
23581
|
+
const thread = threadFromReadResult(value, expectedThreadId);
|
|
23582
|
+
if (!thread) return null;
|
|
23583
|
+
const model = usableThreadModel(thread.model) ?? usableThreadModel(thread.latestModel) ?? usableThreadModel(thread.resolvedModelLabel);
|
|
23584
|
+
const reasoningEffort = usableThreadModel(thread.reasoningEffort) ?? usableThreadModel(thread.latestReasoningEffort);
|
|
23585
|
+
if (!model && !reasoningEffort) return null;
|
|
23586
|
+
return {
|
|
23587
|
+
...model ? { model } : {},
|
|
23588
|
+
...reasoningEffort ? { reasoningEffort } : {}
|
|
23589
|
+
};
|
|
23590
|
+
}
|
|
23591
|
+
async function readSubagentThreadModelFromTarget(target, threadId) {
|
|
23592
|
+
const result = await target.sendRequest("thread/read", {
|
|
23593
|
+
threadId,
|
|
23594
|
+
includeTurns: false
|
|
23595
|
+
});
|
|
23596
|
+
return subagentThreadModelFromReadResult(result, threadId);
|
|
23597
|
+
}
|
|
23598
|
+
async function readRendererSubagentThreadModel(threadId) {
|
|
23599
|
+
const target = rendererThreadRequestTarget();
|
|
23600
|
+
if (!target) return null;
|
|
23601
|
+
return readSubagentThreadModelFromTarget(target, threadId);
|
|
23602
|
+
}
|
|
23603
|
+
function subagentStatusFromReadResult(value, expectedThreadId) {
|
|
23604
|
+
const thread = threadFromReadResult(value, expectedThreadId);
|
|
23605
|
+
if (!thread) return null;
|
|
23606
|
+
const threadStatus = isRecord7(thread.status) && nonBlank(thread.status.type) ? thread.status.type : void 0;
|
|
23607
|
+
if (threadStatus === "systemError") return "failed";
|
|
23608
|
+
const turns = Array.isArray(thread.turns) ? thread.turns : [];
|
|
23609
|
+
const lastTurn = [...turns].reverse().find(isRecord7);
|
|
23610
|
+
const turnStatus = lastTurn && nonBlank(lastTurn.status) ? lastTurn.status : void 0;
|
|
23611
|
+
if (turnStatus === "completed") return "completed";
|
|
23612
|
+
if (turnStatus === "failed") return "failed";
|
|
23613
|
+
if (turnStatus === "interrupted" || turnStatus === "cancelled") return "interrupted";
|
|
23614
|
+
if (turnStatus === "inProgress" || turnStatus === "running") return "running";
|
|
23615
|
+
if (turnStatus === "pending" || turnStatus === "queued") return "waiting";
|
|
23616
|
+
if (threadStatus === "active") return "running";
|
|
23617
|
+
return null;
|
|
23618
|
+
}
|
|
23619
|
+
async function readRendererSubagentStatus(threadId) {
|
|
23620
|
+
const target = rendererThreadRequestTarget();
|
|
23621
|
+
if (!target) return null;
|
|
23622
|
+
const result = await target.sendRequest("thread/read", {
|
|
23623
|
+
threadId,
|
|
23624
|
+
includeTurns: true
|
|
23625
|
+
});
|
|
23626
|
+
return subagentStatusFromReadResult(result, threadId);
|
|
23627
|
+
}
|
|
23628
|
+
function createSubagentThreadModelResolver(options) {
|
|
23629
|
+
const models = /* @__PURE__ */ new Map();
|
|
23630
|
+
const pending = /* @__PURE__ */ new Set();
|
|
23631
|
+
const attempts = /* @__PURE__ */ new Map();
|
|
23632
|
+
const retryTimers = /* @__PURE__ */ new Map();
|
|
23633
|
+
const maxAttempts = options.maxAttempts ?? 3;
|
|
23634
|
+
const retryDelayMs = options.retryDelayMs ?? 1e3;
|
|
23635
|
+
let disposed = false;
|
|
23636
|
+
const ensure = (threadId) => {
|
|
23637
|
+
if (disposed || !threadId || models.has(threadId) || pending.has(threadId)) return;
|
|
23638
|
+
const attempt = (attempts.get(threadId) ?? 0) + 1;
|
|
23639
|
+
if (attempt > maxAttempts) return;
|
|
23640
|
+
attempts.set(threadId, attempt);
|
|
23641
|
+
pending.add(threadId);
|
|
23642
|
+
void options.read(threadId).then(
|
|
23643
|
+
(snapshot) => {
|
|
23644
|
+
if (disposed) return;
|
|
23645
|
+
if (snapshot) {
|
|
23646
|
+
models.set(threadId, snapshot);
|
|
23647
|
+
attempts.delete(threadId);
|
|
23648
|
+
options.onUpdate();
|
|
23649
|
+
return;
|
|
23650
|
+
}
|
|
23651
|
+
if (attempt >= maxAttempts || retryTimers.has(threadId)) return;
|
|
23652
|
+
retryTimers.set(
|
|
23653
|
+
threadId,
|
|
23654
|
+
setTimeout(() => {
|
|
23655
|
+
retryTimers.delete(threadId);
|
|
23656
|
+
ensure(threadId);
|
|
23657
|
+
}, retryDelayMs)
|
|
23658
|
+
);
|
|
23659
|
+
},
|
|
23660
|
+
() => {
|
|
23661
|
+
if (disposed || attempt >= maxAttempts || retryTimers.has(threadId)) return;
|
|
23662
|
+
retryTimers.set(
|
|
23663
|
+
threadId,
|
|
23664
|
+
setTimeout(() => {
|
|
23665
|
+
retryTimers.delete(threadId);
|
|
23666
|
+
ensure(threadId);
|
|
23667
|
+
}, retryDelayMs)
|
|
23668
|
+
);
|
|
23669
|
+
}
|
|
23670
|
+
).finally(() => {
|
|
23671
|
+
pending.delete(threadId);
|
|
23672
|
+
});
|
|
23673
|
+
};
|
|
23674
|
+
return {
|
|
23675
|
+
get(threadId) {
|
|
23676
|
+
return models.get(threadId);
|
|
23677
|
+
},
|
|
23678
|
+
ensure,
|
|
23679
|
+
refresh() {
|
|
23680
|
+
if (disposed) return;
|
|
23681
|
+
for (const threadId of [...attempts.keys()]) {
|
|
23682
|
+
if (pending.has(threadId) || retryTimers.has(threadId)) continue;
|
|
23683
|
+
attempts.delete(threadId);
|
|
23684
|
+
ensure(threadId);
|
|
23685
|
+
}
|
|
23686
|
+
},
|
|
23687
|
+
dispose() {
|
|
23688
|
+
if (disposed) return;
|
|
23689
|
+
disposed = true;
|
|
23690
|
+
for (const timer of retryTimers.values()) clearTimeout(timer);
|
|
23691
|
+
retryTimers.clear();
|
|
23692
|
+
pending.clear();
|
|
23693
|
+
attempts.clear();
|
|
23694
|
+
models.clear();
|
|
23695
|
+
}
|
|
23696
|
+
};
|
|
23697
|
+
}
|
|
23698
|
+
function createSubagentThreadStatusResolver(options) {
|
|
23699
|
+
const statuses = /* @__PURE__ */ new Map();
|
|
23700
|
+
const pending = /* @__PURE__ */ new Set();
|
|
23701
|
+
const attempts = /* @__PURE__ */ new Map();
|
|
23702
|
+
const maxAttempts = options.maxAttempts ?? 3;
|
|
23703
|
+
let disposed = false;
|
|
23704
|
+
const ensure = (threadId) => {
|
|
23705
|
+
const current = statuses.get(threadId);
|
|
23706
|
+
if (disposed || !threadId || pending.has(threadId) || current === "completed" || current === "failed" || current === "interrupted") {
|
|
23707
|
+
return;
|
|
23708
|
+
}
|
|
23709
|
+
const attempt = (attempts.get(threadId) ?? 0) + 1;
|
|
23710
|
+
if (attempt > maxAttempts) return;
|
|
23711
|
+
attempts.set(threadId, attempt);
|
|
23712
|
+
pending.add(threadId);
|
|
23713
|
+
void options.read(threadId).then((status) => {
|
|
23714
|
+
if (disposed || !status) return;
|
|
23715
|
+
statuses.set(threadId, status);
|
|
23716
|
+
if (status === "completed" || status === "failed" || status === "interrupted") {
|
|
23717
|
+
attempts.delete(threadId);
|
|
23718
|
+
}
|
|
23719
|
+
options.onUpdate();
|
|
23720
|
+
}).catch(() => {
|
|
23721
|
+
}).finally(() => {
|
|
23722
|
+
pending.delete(threadId);
|
|
23723
|
+
});
|
|
23724
|
+
};
|
|
23725
|
+
return {
|
|
23726
|
+
get(threadId) {
|
|
23727
|
+
return statuses.get(threadId);
|
|
23728
|
+
},
|
|
23729
|
+
ensure,
|
|
23730
|
+
refresh() {
|
|
23731
|
+
if (disposed) return;
|
|
23732
|
+
for (const threadId of /* @__PURE__ */ new Set([...statuses.keys(), ...attempts.keys()])) {
|
|
23733
|
+
const status = statuses.get(threadId);
|
|
23734
|
+
if (status === "completed" || status === "failed" || status === "interrupted") continue;
|
|
23735
|
+
attempts.delete(threadId);
|
|
23736
|
+
ensure(threadId);
|
|
23737
|
+
}
|
|
23738
|
+
},
|
|
23739
|
+
dispose() {
|
|
23740
|
+
disposed = true;
|
|
23741
|
+
statuses.clear();
|
|
23742
|
+
attempts.clear();
|
|
23743
|
+
pending.clear();
|
|
23744
|
+
}
|
|
23745
|
+
};
|
|
23746
|
+
}
|
|
23747
|
+
|
|
23748
|
+
// src/renderer-subagent-row-meta.ts
|
|
23749
|
+
var SUBAGENT_ROW_META_ATTRIBUTE = "data-codexhost-subagent-meta";
|
|
23750
|
+
var SUBAGENT_ROW_COPY_ATTRIBUTE = "data-codexhost-subagent-copy";
|
|
23751
|
+
var SUBAGENT_ITEM_BUTTON_SELECTOR = 'button[data-slot="thread-summary-panel-item-button"]';
|
|
23752
|
+
var SUBAGENT_ITEM_LABEL_SELECTOR = '[data-slot="thread-summary-panel-item-label"]';
|
|
23753
|
+
function isRecord8(value) {
|
|
23754
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23755
|
+
}
|
|
23756
|
+
function nonBlank2(value) {
|
|
23757
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
23758
|
+
}
|
|
23759
|
+
function isDomElement(value) {
|
|
23760
|
+
return typeof Element !== "undefined" && value instanceof Element;
|
|
23761
|
+
}
|
|
23762
|
+
function isHtmlElement(value) {
|
|
23763
|
+
return typeof HTMLElement !== "undefined" && value instanceof HTMLElement;
|
|
23764
|
+
}
|
|
23765
|
+
function isParentComposerModelLabel2(model) {
|
|
23766
|
+
const trimmed = model?.trim();
|
|
23767
|
+
if (!trimmed) return false;
|
|
23768
|
+
const head = trimmed.includes(" \xB7 ") ? trimmed.split(" \xB7 ")[0]?.trim() ?? "" : trimmed;
|
|
23769
|
+
if (!head) return false;
|
|
23770
|
+
if (/^(grok|gpt|o\d|claude|codex)/i.test(head)) return false;
|
|
23771
|
+
return trimmed.includes(" \xB7 ");
|
|
23772
|
+
}
|
|
23773
|
+
function usableModel(value) {
|
|
23774
|
+
if (!nonBlank2(value) || isParentComposerModelLabel2(value)) return void 0;
|
|
23775
|
+
return value.trim();
|
|
23776
|
+
}
|
|
23777
|
+
function prettySubagentStatus(status) {
|
|
23778
|
+
switch (status) {
|
|
23779
|
+
case "active":
|
|
23780
|
+
case "running":
|
|
23781
|
+
case "working":
|
|
23782
|
+
return "\u8FDB\u884C\u4E2D";
|
|
23783
|
+
case "waiting":
|
|
23784
|
+
case "pending":
|
|
23785
|
+
case "pendingInit":
|
|
23786
|
+
return "\u7B49\u5F85\u4E2D";
|
|
23787
|
+
case "done":
|
|
23788
|
+
case "completed":
|
|
23789
|
+
return "\u5DF2\u5B8C\u6210";
|
|
23790
|
+
case "failed":
|
|
23791
|
+
case "errored":
|
|
23792
|
+
return "\u5931\u8D25";
|
|
23793
|
+
case "interrupted":
|
|
23794
|
+
return "\u5DF2\u4E2D\u65AD";
|
|
23795
|
+
default:
|
|
23796
|
+
return void 0;
|
|
23797
|
+
}
|
|
23798
|
+
}
|
|
23799
|
+
function prettySubagentEffort(value) {
|
|
23800
|
+
const trimmed = value?.trim();
|
|
23801
|
+
if (!trimmed) return void 0;
|
|
23802
|
+
const lower = trimmed.toLowerCase();
|
|
23803
|
+
if (lower === "xhigh") return "xHigh";
|
|
23804
|
+
if (lower === "ultra") return "\u8D85\u9AD8";
|
|
23805
|
+
return trimmed.charAt(0).toUpperCase() + trimmed.slice(1);
|
|
23806
|
+
}
|
|
23807
|
+
function prettySubagentModel(model) {
|
|
23808
|
+
const trimmed = model.trim();
|
|
23809
|
+
if (!trimmed || isParentComposerModelLabel2(trimmed)) return "";
|
|
23810
|
+
if (trimmed.includes(" \xB7 ")) return trimmed;
|
|
23811
|
+
const slash = trimmed.lastIndexOf("/");
|
|
23812
|
+
const id = slash >= 0 ? trimmed.slice(slash + 1) : trimmed;
|
|
23813
|
+
if (id.toLowerCase().startsWith("grok")) {
|
|
23814
|
+
return id.replace(/^grok[-_]?/iu, "Grok ").replace(/\s+/gu, " ").trim();
|
|
23815
|
+
}
|
|
23816
|
+
if (!id.trimStart().toLowerCase().startsWith("gpt")) return trimmed;
|
|
23817
|
+
const joiner = /^gpt-\d/iu.test(id.trimStart()) ? " " : "-";
|
|
23818
|
+
return id.split(/(\s+)/u).map((part) => {
|
|
23819
|
+
if (part.trim().length === 0) return part;
|
|
23820
|
+
return part.split("-").map((token, index) => {
|
|
23821
|
+
if (token.toLowerCase() === "gpt") return "GPT";
|
|
23822
|
+
if (token.toLowerCase() === "oai") return "OAI";
|
|
23823
|
+
if (index > 0 && token.length > 0) {
|
|
23824
|
+
return `${token[0]?.toUpperCase() ?? ""}${token.slice(1)}`;
|
|
23825
|
+
}
|
|
23826
|
+
return token;
|
|
23827
|
+
}).join(joiner).replace(/^GPT (?=\d)/u, "GPT-");
|
|
23828
|
+
}).join("");
|
|
23829
|
+
}
|
|
23830
|
+
function includesEffort(label, effort) {
|
|
23831
|
+
return new RegExp(`(?:^|\xB7\\s*)${effort.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&")}$`, "iu").test(
|
|
23832
|
+
label
|
|
23833
|
+
);
|
|
23834
|
+
}
|
|
23835
|
+
function formatSubagentRowMeta(row) {
|
|
23836
|
+
const raw = usableModel(row.spawnModel) ?? usableModel(row.model) ?? "";
|
|
23837
|
+
const model = raw ? prettySubagentModel(raw) : "";
|
|
23838
|
+
const effort = prettySubagentEffort(row.reasoningEffort);
|
|
23839
|
+
const modelLine = model && effort && !includesEffort(model, effort) ? `${model} \xB7 ${effort}` : model || effort;
|
|
23840
|
+
const parts = [prettySubagentStatus(row.status), modelLine].filter(
|
|
23841
|
+
(value) => typeof value === "string" && value.length > 0
|
|
23842
|
+
);
|
|
23843
|
+
return parts.length > 0 ? parts.join(" \xB7 ") : void 0;
|
|
23844
|
+
}
|
|
23845
|
+
function contribute(target, source, allowUnscopedModel = false) {
|
|
23846
|
+
const sourceId = nonBlank2(source.conversationId) ? source.conversationId.trim() : Array.isArray(source.receiverThreadIds) && nonBlank2(source.receiverThreadIds[0]) ? source.receiverThreadIds[0].trim() : void 0;
|
|
23847
|
+
if (target.conversationId && sourceId && sourceId !== target.conversationId) return;
|
|
23848
|
+
if (nonBlank2(source.displayName) && !target.displayName) {
|
|
23849
|
+
target.displayName = source.displayName.trim();
|
|
23850
|
+
}
|
|
23851
|
+
if (sourceId && !target.conversationId) target.conversationId = sourceId;
|
|
23852
|
+
const childModelSource = allowUnscopedModel || source.type === "collabAgentToolCall" || target.conversationId && nonBlank2(source.id) && source.id.trim() === target.conversationId;
|
|
23853
|
+
if (childModelSource) {
|
|
23854
|
+
const spawn = usableModel(source.spawnModel);
|
|
23855
|
+
const model = usableModel(source.model) ?? usableModel(source.modelLabel) ?? usableModel(source.latestModel);
|
|
23856
|
+
if (spawn && !target.spawnModel) target.spawnModel = spawn;
|
|
23857
|
+
if (model && !usableModel(target.model)) target.model = model;
|
|
23858
|
+
if (nonBlank2(source.reasoningEffort) && !target.reasoningEffort) {
|
|
23859
|
+
target.reasoningEffort = source.reasoningEffort.trim();
|
|
23860
|
+
}
|
|
23861
|
+
if (nonBlank2(source.latestReasoningEffort) && !target.reasoningEffort) {
|
|
23862
|
+
target.reasoningEffort = source.latestReasoningEffort.trim();
|
|
23863
|
+
}
|
|
23864
|
+
}
|
|
23865
|
+
if (nonBlank2(source.agentRole) && !target.agentRole) {
|
|
23866
|
+
target.agentRole = source.agentRole.trim();
|
|
23867
|
+
}
|
|
23868
|
+
if (nonBlank2(source.status) && !target.status) {
|
|
23869
|
+
target.status = source.status.trim();
|
|
23870
|
+
}
|
|
23871
|
+
if (isRecord8(source.agentState) && nonBlank2(source.agentState.status) && !target.status) {
|
|
23872
|
+
target.status = source.agentState.status.trim();
|
|
23873
|
+
}
|
|
23874
|
+
if (isRecord8(source.agentsStates) && target.conversationId) {
|
|
23875
|
+
const state = source.agentsStates[target.conversationId];
|
|
23876
|
+
if (isRecord8(state) && nonBlank2(state.status) && !target.status) {
|
|
23877
|
+
target.status = state.status.trim();
|
|
23878
|
+
}
|
|
23879
|
+
}
|
|
23880
|
+
}
|
|
23881
|
+
function collabMatches(item, conversationId) {
|
|
23882
|
+
if (item.type !== "collabAgentToolCall" || item.tool !== "spawnAgent") return false;
|
|
23883
|
+
if (!conversationId) return true;
|
|
23884
|
+
if (Array.isArray(item.receiverThreadIds) && item.receiverThreadIds.includes(conversationId)) {
|
|
23885
|
+
return true;
|
|
23886
|
+
}
|
|
23887
|
+
return isRecord8(item.agentsStates) && conversationId in item.agentsStates;
|
|
23888
|
+
}
|
|
23889
|
+
function harvestFromValue(value, target) {
|
|
23890
|
+
if (!isRecord8(value)) return;
|
|
23891
|
+
contribute(target, value);
|
|
23892
|
+
const nested = [
|
|
23893
|
+
isRecord8(value.row) ? value.row : null,
|
|
23894
|
+
isRecord8(value.backgroundAgent) ? value.backgroundAgent : null,
|
|
23895
|
+
isRecord8(value.item) ? value.item : null,
|
|
23896
|
+
isRecord8(value.item) && isRecord8(value.item.backgroundAgent) ? value.item.backgroundAgent : null,
|
|
23897
|
+
isRecord8(value.thread) && (!target.conversationId || nonBlank2(value.thread.id) && value.thread.id.trim() === target.conversationId) ? value.thread : null,
|
|
23898
|
+
isRecord8(value.childConversation) ? value.childConversation : null
|
|
23899
|
+
];
|
|
23900
|
+
for (const source of nested) {
|
|
23901
|
+
if (source) contribute(target, source);
|
|
23902
|
+
}
|
|
23903
|
+
if (!target.conversationId) return;
|
|
23904
|
+
const items = Array.isArray(value.items) ? value.items : Array.isArray(value.turns) ? value.turns.flatMap(
|
|
23905
|
+
(turn) => isRecord8(turn) && Array.isArray(turn.items) ? turn.items : []
|
|
23906
|
+
) : [];
|
|
23907
|
+
for (const item of items) {
|
|
23908
|
+
if (!isRecord8(item)) continue;
|
|
23909
|
+
if (collabMatches(item, target.conversationId)) contribute(target, item, true);
|
|
23910
|
+
}
|
|
23911
|
+
}
|
|
23912
|
+
function finalizeRow(target) {
|
|
23913
|
+
if (!nonBlank2(target.displayName)) return null;
|
|
23914
|
+
if (!nonBlank2(target.conversationId) && !nonBlank2(target.spawnModel) && !nonBlank2(target.model) && !nonBlank2(target.status)) {
|
|
23915
|
+
return null;
|
|
23916
|
+
}
|
|
23917
|
+
const spawnModel = usableModel(target.spawnModel);
|
|
23918
|
+
const model = usableModel(target.model);
|
|
23919
|
+
return {
|
|
23920
|
+
displayName: target.displayName.trim(),
|
|
23921
|
+
...spawnModel ? { spawnModel } : {},
|
|
23922
|
+
...model ? { model } : {},
|
|
23923
|
+
...nonBlank2(target.reasoningEffort) ? { reasoningEffort: target.reasoningEffort.trim() } : {},
|
|
23924
|
+
...nonBlank2(target.agentRole) ? { agentRole: target.agentRole.trim() } : {},
|
|
23925
|
+
...nonBlank2(target.status) ? { status: target.status.trim() } : {},
|
|
23926
|
+
...nonBlank2(target.conversationId) ? { conversationId: target.conversationId.trim() } : {}
|
|
23927
|
+
};
|
|
23928
|
+
}
|
|
23929
|
+
function withResolvedThreadModel(row, thread) {
|
|
23930
|
+
const spawn = usableModel(row.spawnModel);
|
|
23931
|
+
const model = spawn ?? usableModel(row.model) ?? usableModel(thread.model);
|
|
23932
|
+
const reasoningEffort = row.reasoningEffort ?? (nonBlank2(thread.reasoningEffort) ? thread.reasoningEffort.trim() : void 0);
|
|
23933
|
+
return {
|
|
23934
|
+
displayName: row.displayName,
|
|
23935
|
+
...row.conversationId ? { conversationId: row.conversationId } : {},
|
|
23936
|
+
...row.status ? { status: row.status } : {},
|
|
23937
|
+
...row.agentRole ? { agentRole: row.agentRole } : {},
|
|
23938
|
+
...spawn ? { spawnModel: spawn } : {},
|
|
23939
|
+
...model ? { model } : {},
|
|
23940
|
+
...reasoningEffort ? { reasoningEffort } : {}
|
|
23941
|
+
};
|
|
23942
|
+
}
|
|
23943
|
+
function withResolvedThreadStatus(row, status) {
|
|
23944
|
+
return { ...row, status };
|
|
23945
|
+
}
|
|
23946
|
+
function resolveSubagentRow(row, modelResolver, statusResolver) {
|
|
23947
|
+
if (!row.conversationId) return row;
|
|
23948
|
+
const resolvedStatus = statusResolver?.get(row.conversationId);
|
|
23949
|
+
let enriched = resolvedStatus ? withResolvedThreadStatus(row, resolvedStatus) : row;
|
|
23950
|
+
const visibleStatus = prettySubagentStatus(enriched.status);
|
|
23951
|
+
if (!visibleStatus || visibleStatus === "\u8FDB\u884C\u4E2D" || visibleStatus === "\u7B49\u5F85\u4E2D") {
|
|
23952
|
+
statusResolver?.ensure(row.conversationId);
|
|
23953
|
+
}
|
|
23954
|
+
const resolvedModel = modelResolver?.get(row.conversationId);
|
|
23955
|
+
if (resolvedModel) enriched = withResolvedThreadModel(enriched, resolvedModel);
|
|
23956
|
+
const currentModel = usableModel(enriched.spawnModel) ?? usableModel(enriched.model);
|
|
23957
|
+
const modelIncludesEffort = Boolean(currentModel?.includes(" \xB7 "));
|
|
23958
|
+
if (!currentModel || !enriched.reasoningEffort && !modelIncludesEffort) {
|
|
23959
|
+
modelResolver?.ensure(row.conversationId);
|
|
23960
|
+
}
|
|
23961
|
+
return enriched;
|
|
23962
|
+
}
|
|
23963
|
+
function subagentRowMetaFromProps(value) {
|
|
23964
|
+
const target = {};
|
|
23965
|
+
harvestFromValue(value, target);
|
|
23966
|
+
return finalizeRow(target);
|
|
23967
|
+
}
|
|
23968
|
+
function fiberFromElement(element) {
|
|
23969
|
+
const names = Object.getOwnPropertyNames(element).filter(
|
|
23970
|
+
(name2) => name2.startsWith("__reactFiber$")
|
|
23971
|
+
);
|
|
23972
|
+
const name = names[0];
|
|
23973
|
+
if (!name) return null;
|
|
23974
|
+
const fiber = Object.getOwnPropertyDescriptor(element, name)?.value ?? element[name];
|
|
23975
|
+
return isRecord8(fiber) ? fiber : null;
|
|
23976
|
+
}
|
|
23977
|
+
function metaFromFiberProps(fiber) {
|
|
23978
|
+
if (!fiber) return null;
|
|
23979
|
+
return subagentRowMetaFromProps(fiber.memoizedProps) ?? subagentRowMetaFromProps(fiber.pendingProps);
|
|
23980
|
+
}
|
|
23981
|
+
function mergeRow(base, next) {
|
|
23982
|
+
if (!base) return next;
|
|
23983
|
+
if (!next) return base;
|
|
23984
|
+
if (base.conversationId && next.conversationId && base.conversationId !== next.conversationId) {
|
|
23985
|
+
return base;
|
|
23986
|
+
}
|
|
23987
|
+
const spawnModel = usableModel(base.spawnModel) ?? usableModel(next.spawnModel);
|
|
23988
|
+
const model = usableModel(base.model) ?? usableModel(next.model);
|
|
23989
|
+
const reasoningEffort = base.reasoningEffort ?? next.reasoningEffort;
|
|
23990
|
+
const agentRole = base.agentRole ?? next.agentRole;
|
|
23991
|
+
const status = base.status ?? next.status;
|
|
23992
|
+
const conversationId = base.conversationId ?? next.conversationId;
|
|
23993
|
+
return {
|
|
23994
|
+
displayName: base.displayName || next.displayName,
|
|
23995
|
+
...spawnModel ? { spawnModel } : {},
|
|
23996
|
+
...model ? { model } : {},
|
|
23997
|
+
...reasoningEffort ? { reasoningEffort } : {},
|
|
23998
|
+
...agentRole ? { agentRole } : {},
|
|
23999
|
+
...status ? { status } : {},
|
|
24000
|
+
...conversationId ? { conversationId } : {}
|
|
24001
|
+
};
|
|
24002
|
+
}
|
|
24003
|
+
function metaFromDescendants(start) {
|
|
24004
|
+
if (!start || !isRecord8(start.child)) return null;
|
|
24005
|
+
const stack = [start.child];
|
|
24006
|
+
const seen = /* @__PURE__ */ new Set();
|
|
24007
|
+
let found = null;
|
|
24008
|
+
let steps = 0;
|
|
24009
|
+
while (stack.length > 0 && steps < 40) {
|
|
24010
|
+
const fiber = stack.pop();
|
|
24011
|
+
if (!fiber || seen.has(fiber)) continue;
|
|
24012
|
+
seen.add(fiber);
|
|
24013
|
+
steps += 1;
|
|
24014
|
+
found = mergeRow(found, metaFromFiberProps(fiber));
|
|
24015
|
+
if (isRecord8(fiber.child)) stack.push(fiber.child);
|
|
24016
|
+
if (isRecord8(fiber.sibling)) stack.push(fiber.sibling);
|
|
24017
|
+
}
|
|
24018
|
+
return found;
|
|
24019
|
+
}
|
|
24020
|
+
function subagentRowMetaFromElement(element) {
|
|
24021
|
+
let fiber = fiberFromElement(element);
|
|
24022
|
+
let found = metaFromDescendants(fiber);
|
|
24023
|
+
for (let depth = 0; fiber && depth < 12; depth += 1) {
|
|
24024
|
+
found = mergeRow(found, metaFromFiberProps(fiber));
|
|
24025
|
+
fiber = isRecord8(fiber.return) ? fiber.return : null;
|
|
24026
|
+
}
|
|
24027
|
+
return found;
|
|
24028
|
+
}
|
|
24029
|
+
function findNameNode(element) {
|
|
24030
|
+
const label = element.querySelector(SUBAGENT_ITEM_LABEL_SELECTOR);
|
|
24031
|
+
return label ?? element;
|
|
24032
|
+
}
|
|
24033
|
+
function createMetaNode(ownerDocument) {
|
|
24034
|
+
const meta3 = ownerDocument.createElement("span");
|
|
24035
|
+
meta3.setAttribute(SUBAGENT_ROW_META_ATTRIBUTE, "true");
|
|
24036
|
+
meta3.style.display = "block";
|
|
24037
|
+
meta3.style.maxWidth = "100%";
|
|
24038
|
+
meta3.style.fontSize = "11px";
|
|
24039
|
+
meta3.style.lineHeight = "1.35";
|
|
24040
|
+
meta3.style.color = "var(--text-tertiary, #8a8a8a)";
|
|
24041
|
+
meta3.style.whiteSpace = "normal";
|
|
24042
|
+
return meta3;
|
|
24043
|
+
}
|
|
24044
|
+
function ensureColumnCopy(nameNode) {
|
|
24045
|
+
const parent = nameNode.parentElement;
|
|
24046
|
+
if (parent?.getAttribute(SUBAGENT_ROW_COPY_ATTRIBUTE) === "true") {
|
|
24047
|
+
const existing = parent.querySelector(`[${SUBAGENT_ROW_META_ATTRIBUTE}]`);
|
|
24048
|
+
if (existing) return { copy: parent, meta: existing };
|
|
24049
|
+
const meta4 = createMetaNode(nameNode.ownerDocument);
|
|
24050
|
+
parent.append(meta4);
|
|
24051
|
+
return { copy: parent, meta: meta4 };
|
|
24052
|
+
}
|
|
24053
|
+
const copy = nameNode.ownerDocument.createElement("span");
|
|
24054
|
+
copy.setAttribute(SUBAGENT_ROW_COPY_ATTRIBUTE, "true");
|
|
24055
|
+
copy.style.display = "flex";
|
|
24056
|
+
copy.style.flexDirection = "column";
|
|
24057
|
+
copy.style.alignItems = "flex-start";
|
|
24058
|
+
copy.style.justifyContent = "center";
|
|
24059
|
+
copy.style.minWidth = "0";
|
|
24060
|
+
copy.style.flex = "1";
|
|
24061
|
+
copy.style.overflow = "hidden";
|
|
24062
|
+
nameNode.style.maxWidth = "100%";
|
|
24063
|
+
nameNode.style.minWidth = "0";
|
|
24064
|
+
nameNode.replaceWith(copy);
|
|
24065
|
+
copy.append(nameNode);
|
|
24066
|
+
const meta3 = createMetaNode(nameNode.ownerDocument);
|
|
24067
|
+
copy.append(meta3);
|
|
24068
|
+
return { copy, meta: meta3 };
|
|
24069
|
+
}
|
|
24070
|
+
function decorateSubagentRow(element, resolver, statusResolver) {
|
|
24071
|
+
const label = element.querySelector(SUBAGENT_ITEM_LABEL_SELECTOR);
|
|
24072
|
+
const harvested = subagentRowMetaFromElement(element) ?? (label ? subagentRowMetaFromElement(label) : null);
|
|
24073
|
+
if (!harvested) return false;
|
|
24074
|
+
const row = resolveSubagentRow(harvested, resolver, statusResolver);
|
|
24075
|
+
const text = formatSubagentRowMeta(row);
|
|
24076
|
+
const nameNode = findNameNode(element);
|
|
24077
|
+
if (!nameNode || !text) {
|
|
24078
|
+
element.querySelector(`[${SUBAGENT_ROW_META_ATTRIBUTE}]`)?.remove();
|
|
24079
|
+
return false;
|
|
24080
|
+
}
|
|
24081
|
+
const { meta: meta3 } = ensureColumnCopy(nameNode);
|
|
24082
|
+
if (meta3.textContent !== text) meta3.textContent = text;
|
|
24083
|
+
return true;
|
|
24084
|
+
}
|
|
24085
|
+
function decorateSubagentRows(root, resolver, statusResolver) {
|
|
24086
|
+
if (typeof root.querySelectorAll !== "function") return 0;
|
|
24087
|
+
const buttons = root.querySelectorAll(SUBAGENT_ITEM_BUTTON_SELECTOR);
|
|
24088
|
+
let decorated = 0;
|
|
24089
|
+
for (const element of buttons) {
|
|
24090
|
+
if (!isHtmlElement(element)) continue;
|
|
24091
|
+
if (decorateSubagentRow(element, resolver, statusResolver)) decorated += 1;
|
|
24092
|
+
}
|
|
24093
|
+
return decorated;
|
|
24094
|
+
}
|
|
24095
|
+
function isOwnMetaMutation(mutations) {
|
|
24096
|
+
return mutations.every((mutation) => {
|
|
24097
|
+
const nodes = [...mutation.addedNodes, ...mutation.removedNodes, mutation.target];
|
|
24098
|
+
return nodes.every((node) => {
|
|
24099
|
+
if (!isDomElement(node)) return mutation.type === "characterData";
|
|
24100
|
+
return node.getAttribute?.(SUBAGENT_ROW_META_ATTRIBUTE) === "true" || node.getAttribute?.(SUBAGENT_ROW_COPY_ATTRIBUTE) === "true" || Boolean(node.closest?.(`[${SUBAGENT_ROW_META_ATTRIBUTE}]`)) || Boolean(node.closest?.(`[${SUBAGENT_ROW_COPY_ATTRIBUTE}]`));
|
|
24101
|
+
});
|
|
24102
|
+
});
|
|
24103
|
+
}
|
|
24104
|
+
function installRendererSubagentRowMeta(root) {
|
|
24105
|
+
const owner = root ?? (typeof document !== "undefined" && typeof Element !== "undefined" ? document : void 0);
|
|
24106
|
+
if (!owner || typeof MutationObserver === "undefined" || typeof Element === "undefined" || typeof document === "undefined") {
|
|
24107
|
+
return { refresh() {
|
|
24108
|
+
}, dispose() {
|
|
24109
|
+
} };
|
|
24110
|
+
}
|
|
24111
|
+
let disposed = false;
|
|
24112
|
+
let scanScheduled = false;
|
|
24113
|
+
let mutating = false;
|
|
24114
|
+
let debounce;
|
|
24115
|
+
const scan = () => {
|
|
24116
|
+
scanScheduled = false;
|
|
24117
|
+
if (disposed) return;
|
|
24118
|
+
mutating = true;
|
|
24119
|
+
try {
|
|
24120
|
+
decorateSubagentRows(owner, resolver, statusResolver);
|
|
24121
|
+
} finally {
|
|
24122
|
+
mutating = false;
|
|
24123
|
+
}
|
|
24124
|
+
};
|
|
24125
|
+
const schedule = () => {
|
|
24126
|
+
if (disposed || mutating || scanScheduled) return;
|
|
24127
|
+
scanScheduled = true;
|
|
24128
|
+
if (debounce !== void 0) clearTimeout(debounce);
|
|
24129
|
+
debounce = setTimeout(() => {
|
|
24130
|
+
debounce = void 0;
|
|
24131
|
+
scan();
|
|
24132
|
+
}, 250);
|
|
24133
|
+
};
|
|
24134
|
+
const resolver = createSubagentThreadModelResolver({
|
|
24135
|
+
read: readRendererSubagentThreadModel,
|
|
24136
|
+
onUpdate: schedule
|
|
24137
|
+
});
|
|
24138
|
+
const statusResolver = createSubagentThreadStatusResolver({
|
|
24139
|
+
read: readRendererSubagentStatus,
|
|
24140
|
+
onUpdate: schedule
|
|
24141
|
+
});
|
|
24142
|
+
const observer = new MutationObserver((mutations) => {
|
|
24143
|
+
if (mutating || isOwnMetaMutation(mutations)) return;
|
|
24144
|
+
schedule();
|
|
24145
|
+
});
|
|
24146
|
+
observer.observe(owner, { childList: true, subtree: true });
|
|
24147
|
+
schedule();
|
|
24148
|
+
return {
|
|
24149
|
+
refresh() {
|
|
24150
|
+
resolver.refresh();
|
|
24151
|
+
statusResolver.refresh();
|
|
24152
|
+
schedule();
|
|
24153
|
+
},
|
|
24154
|
+
dispose() {
|
|
24155
|
+
if (disposed) return;
|
|
24156
|
+
disposed = true;
|
|
24157
|
+
if (debounce !== void 0) clearTimeout(debounce);
|
|
24158
|
+
observer.disconnect();
|
|
24159
|
+
resolver.dispose();
|
|
24160
|
+
statusResolver.dispose();
|
|
24161
|
+
if (isDomElement(owner) || typeof Document !== "undefined" && owner instanceof Document) {
|
|
24162
|
+
for (const copy of owner.querySelectorAll(`[${SUBAGENT_ROW_COPY_ATTRIBUTE}]`)) {
|
|
24163
|
+
const label = copy.querySelector(SUBAGENT_ITEM_LABEL_SELECTOR);
|
|
24164
|
+
if (label && copy.parentElement) copy.replaceWith(label);
|
|
24165
|
+
else copy.remove();
|
|
24166
|
+
}
|
|
24167
|
+
for (const meta3 of owner.querySelectorAll(`[${SUBAGENT_ROW_META_ATTRIBUTE}]`)) {
|
|
24168
|
+
meta3.remove();
|
|
24169
|
+
}
|
|
24170
|
+
}
|
|
24171
|
+
}
|
|
24172
|
+
};
|
|
24173
|
+
}
|
|
24174
|
+
|
|
23274
24175
|
// src/renderer-permission-mode-preference.ts
|
|
23275
24176
|
var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "codexhost.claude-code.permission-mode.v1";
|
|
23276
24177
|
function rendererStorage() {
|
|
@@ -23308,11 +24209,11 @@ ${error51.stderrTail}`] : []
|
|
|
23308
24209
|
return null;
|
|
23309
24210
|
}
|
|
23310
24211
|
}
|
|
23311
|
-
function
|
|
24212
|
+
function isRecord9(value) {
|
|
23312
24213
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23313
24214
|
}
|
|
23314
24215
|
function parseExternalConfiguration(value) {
|
|
23315
|
-
if (!
|
|
24216
|
+
if (!isRecord9(value)) return void 0;
|
|
23316
24217
|
const model = harnessModelRefSchema.safeParse(value.model);
|
|
23317
24218
|
if (!model.success) return void 0;
|
|
23318
24219
|
const thinkingOptionId = harnessThinkingOptionIdSchema.safeParse(value.thinkingOptionId);
|
|
@@ -23329,9 +24230,9 @@ ${error51.stderrTail}`] : []
|
|
|
23329
24230
|
const raw = storage.getItem(RENDERER_NEW_THREAD_PREFERENCE_KEY);
|
|
23330
24231
|
if (!raw) return void 0;
|
|
23331
24232
|
const parsed = JSON.parse(raw);
|
|
23332
|
-
if (!
|
|
24233
|
+
if (!isRecord9(parsed) || parsed.version !== 1) return void 0;
|
|
23333
24234
|
if (!KNOWN_RENDERER_AGENTS.some((agent) => agent === parsed.lastAgent)) return void 0;
|
|
23334
|
-
const externalByAgent =
|
|
24235
|
+
const externalByAgent = isRecord9(parsed.externalByAgent) ? parsed.externalByAgent : {};
|
|
23335
24236
|
const parsedExternal = Object.fromEntries(
|
|
23336
24237
|
KNOWN_RENDERER_AGENTS.filter(
|
|
23337
24238
|
(agent) => agent !== "codex"
|
|
@@ -23407,7 +24308,7 @@ ${error51.stderrTail}`] : []
|
|
|
23407
24308
|
var GET_LOCALE_OVERRIDE_URL = "vscode://codex/get-setting";
|
|
23408
24309
|
var GET_LOCALE_INFO_URL = "vscode://codex/locale-info";
|
|
23409
24310
|
var DEFAULT_LOCALE_REQUEST_TIMEOUT_MS = 750;
|
|
23410
|
-
function
|
|
24311
|
+
function isRecord10(value) {
|
|
23411
24312
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23412
24313
|
}
|
|
23413
24314
|
function canonicalLocale(value) {
|
|
@@ -23429,7 +24330,7 @@ ${error51.stderrTail}`] : []
|
|
|
23429
24330
|
return new DOMException("The operation was aborted", "AbortError");
|
|
23430
24331
|
}
|
|
23431
24332
|
function parseLocaleOverride(value) {
|
|
23432
|
-
if (!
|
|
24333
|
+
if (!isRecord10(value) || !("value" in value)) {
|
|
23433
24334
|
throw new Error("Codex locale override response is malformed");
|
|
23434
24335
|
}
|
|
23435
24336
|
if (value.value === null) return { value: null };
|
|
@@ -23444,7 +24345,7 @@ ${error51.stderrTail}`] : []
|
|
|
23444
24345
|
return locale;
|
|
23445
24346
|
}
|
|
23446
24347
|
function parseLocaleInfo(value) {
|
|
23447
|
-
if (!
|
|
24348
|
+
if (!isRecord10(value)) throw new Error("Codex locale info response is malformed");
|
|
23448
24349
|
return {
|
|
23449
24350
|
ideLocale: optionalLocale(value.ideLocale, "IDE locale"),
|
|
23450
24351
|
systemLocale: optionalLocale(value.systemLocale, "system locale")
|
|
@@ -23473,7 +24374,7 @@ ${error51.stderrTail}`] : []
|
|
|
23473
24374
|
const onAbort = () => settle(() => reject(abortError2()));
|
|
23474
24375
|
const onMessage = (event) => {
|
|
23475
24376
|
const message2 = event.data;
|
|
23476
|
-
if (!
|
|
24377
|
+
if (!isRecord10(message2) || message2.type !== "fetch-response") return;
|
|
23477
24378
|
if (message2.requestId !== requestId) return;
|
|
23478
24379
|
if (message2.responseType !== "success" || typeof message2.status !== "number" || message2.status < 200 || message2.status >= 300 || typeof message2.bodyJsonString !== "string") {
|
|
23479
24380
|
settle(() => reject(new Error("Codex locale request failed")));
|
|
@@ -23896,6 +24797,7 @@ ${error51.stderrTail}`] : []
|
|
|
23896
24797
|
listControls.pagination
|
|
23897
24798
|
);
|
|
23898
24799
|
let candidates = [];
|
|
24800
|
+
let loadedClient = null;
|
|
23899
24801
|
let importingId = null;
|
|
23900
24802
|
let actions = [];
|
|
23901
24803
|
const updateImportActions = () => {
|
|
@@ -23944,7 +24846,7 @@ ${error51.stderrTail}`] : []
|
|
|
23944
24846
|
status.focus();
|
|
23945
24847
|
}
|
|
23946
24848
|
};
|
|
23947
|
-
const renderOpenRecovery = (candidate, threadId) => {
|
|
24849
|
+
const renderOpenRecovery = (candidate, threadId, hostId) => {
|
|
23948
24850
|
actions = [];
|
|
23949
24851
|
refresh.disabled = false;
|
|
23950
24852
|
const recovery = document2.createElement("section");
|
|
@@ -24010,12 +24912,12 @@ ${error51.stderrTail}`] : []
|
|
|
24010
24912
|
retry.addEventListener("click", () => {
|
|
24011
24913
|
if (retry.disabled) return;
|
|
24012
24914
|
setRetrying(true);
|
|
24013
|
-
void context.runLatest((signal) => openImportedThread(threadId, signal), {
|
|
24915
|
+
void context.runLatest((signal) => openImportedThread(threadId, signal, hostId), {
|
|
24014
24916
|
success() {
|
|
24015
24917
|
setRetrying(false);
|
|
24016
24918
|
},
|
|
24017
24919
|
failure() {
|
|
24018
|
-
renderOpenRecovery(candidate, threadId);
|
|
24920
|
+
renderOpenRecovery(candidate, threadId, hostId);
|
|
24019
24921
|
}
|
|
24020
24922
|
});
|
|
24021
24923
|
});
|
|
@@ -24092,7 +24994,7 @@ ${error51.stderrTail}`] : []
|
|
|
24092
24994
|
if (candidate.running === true || importingId !== null || selectedHarness === null)
|
|
24093
24995
|
return;
|
|
24094
24996
|
const harnessId = selectedHarness;
|
|
24095
|
-
const client =
|
|
24997
|
+
const client = loadedClient;
|
|
24096
24998
|
if (!client) {
|
|
24097
24999
|
renderUnavailable(true);
|
|
24098
25000
|
return;
|
|
@@ -24108,7 +25010,9 @@ ${error51.stderrTail}`] : []
|
|
|
24108
25010
|
nativeSessionId: candidate.nativeSessionId
|
|
24109
25011
|
});
|
|
24110
25012
|
committedThreadId = result.threadId;
|
|
24111
|
-
if (!signal.aborted)
|
|
25013
|
+
if (!signal.aborted) {
|
|
25014
|
+
await openImportedThread(result.threadId, signal, client.hostId);
|
|
25015
|
+
}
|
|
24112
25016
|
},
|
|
24113
25017
|
{
|
|
24114
25018
|
success() {
|
|
@@ -24121,7 +25025,7 @@ ${error51.stderrTail}`] : []
|
|
|
24121
25025
|
updateImportActions();
|
|
24122
25026
|
refresh.disabled = false;
|
|
24123
25027
|
if (committedThreadId) {
|
|
24124
|
-
renderOpenRecovery(candidate, committedThreadId);
|
|
25028
|
+
renderOpenRecovery(candidate, committedThreadId, client.hostId);
|
|
24125
25029
|
} else {
|
|
24126
25030
|
renderFailure(error51, "import");
|
|
24127
25031
|
}
|
|
@@ -24139,6 +25043,7 @@ ${error51.stderrTail}`] : []
|
|
|
24139
25043
|
};
|
|
24140
25044
|
const load = () => {
|
|
24141
25045
|
if (importingId !== null || context.signal.aborted) return;
|
|
25046
|
+
loadedClient = null;
|
|
24142
25047
|
const client = getClient();
|
|
24143
25048
|
if (!client) {
|
|
24144
25049
|
refresh.disabled = false;
|
|
@@ -24168,6 +25073,7 @@ ${error51.stderrTail}`] : []
|
|
|
24168
25073
|
},
|
|
24169
25074
|
{
|
|
24170
25075
|
success(result) {
|
|
25076
|
+
loadedClient = client;
|
|
24171
25077
|
listControls.setBusy(false);
|
|
24172
25078
|
if (listControls.setTotal(result.total)) {
|
|
24173
25079
|
load();
|
|
@@ -24180,6 +25086,7 @@ ${error51.stderrTail}`] : []
|
|
|
24180
25086
|
else renderCandidates();
|
|
24181
25087
|
},
|
|
24182
25088
|
failure(error51) {
|
|
25089
|
+
loadedClient = null;
|
|
24183
25090
|
listControls.setBusy(false);
|
|
24184
25091
|
candidates = [];
|
|
24185
25092
|
refresh.disabled = false;
|
|
@@ -25025,8 +25932,8 @@ ${error51.stderrTail}`] : []
|
|
|
25025
25932
|
copy.append(heading, description);
|
|
25026
25933
|
const add = document2.createElement("button");
|
|
25027
25934
|
add.type = "button";
|
|
25028
|
-
add.className = "settings-command-button";
|
|
25029
|
-
add.append(createRendererSettingsIcon("add",
|
|
25935
|
+
add.className = "settings-command-button settings-command-button--secondary";
|
|
25936
|
+
add.append(createRendererSettingsIcon("add", 15), messages.accountAdd);
|
|
25030
25937
|
header.append(copy, add);
|
|
25031
25938
|
const status = document2.createElement("p");
|
|
25032
25939
|
status.className = "settings-account-status";
|
|
@@ -26080,10 +26987,10 @@ ${error51.stderrTail}`] : []
|
|
|
26080
26987
|
}
|
|
26081
26988
|
|
|
26082
26989
|
// src/settings/shell.css
|
|
26083
|
-
var shell_default = ':host {\n /* Inherit Codex Desktop color-scheme; light-dark() tracks the host page. */\n --settings-bg: light-dark(#ffffff, #181818);\n --settings-sidebar: light-dark(#f4f4f5, #1c1c1c);\n --settings-panel: transparent;\n --settings-text: light-dark(#171717, #f5f5f5);\n --settings-muted: light-dark(#737373, #a1a1a1);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));\n --settings-divider: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));\n --settings-hover: light-dark(rgb(15 23 42 / 5%), rgb(255 255 255 / 6%));\n --settings-active: light-dark(rgb(51 156 255 / 14%), rgb(51 156 255 / 12%));\n --settings-focus: #339cff;\n --settings-elevated: light-dark(#ffffff, #2c2c2e);\n --settings-inset: light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 18%));\n --settings-surface: light-dark(rgb(15 23 42 / 3%), rgb(255 255 255 / 2%));\n --settings-surface-strong: light-dark(rgb(15 23 42 / 6%), rgb(255 255 255 / 6%));\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-mark: light-dark(#52525b, #d4d8de);\n --settings-dialog-shadow: light-dark(\n 0 24px 64px rgb(15 23 42 / 16%),\n 0 24px 64px rgb(0 0 0 / 38%)\n );\n --settings-backdrop: light-dark(rgb(15 23 42 / 28%), rgb(0 0 0 / 52%));\n --settings-segmented-shadow:\n 0 0 0 0.5px light-dark(rgb(15 23 42 / 6%), rgb(0 0 0 / 4%)),\n 0 3px 1px 0 light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 4%)),\n 0 3px 8px 0 light-dark(rgb(15 23 42 / 10%), rgb(0 0 0 / 12%));\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.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: 12px;\n box-shadow: var(--settings-dialog-shadow);\n}\n\n.codexhost-settings-dialog::backdrop {\n background: var(--settings-backdrop);\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: 28px;\n padding: 7px 9px 3px 4px;\n color: var(--settings-muted);\n font-size: 12px;\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: 14px;\n font-weight: 600;\n line-height: 21px;\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-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 padding: 0 0 28px;\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-strong);\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-strong);\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 min-width: 0;\n margin: 0 0 16px;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n gap: 8px;\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: transparent;\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-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n}\n\n.settings-session-import-search {\n align-items: stretch;\n margin: 16px 0 0;\n}\n\n.settings-session-import-pagination {\n margin: 16px 0 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 box-sizing: border-box;\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,\n.settings-session-import-search .settings-command-button {\n box-sizing: border-box;\n height: 36px;\n min-height: 36px;\n padding: 6px 10px;\n border-radius: 6px;\n}\n\n.settings-session-import-pagination select {\n min-height: 28px;\n padding: 2px 8px;\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 line-height: 18px;\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: none;\n min-width: 0;\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-content {\n margin-top: 16px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 0;\n gap: 12px;\n padding: 12px 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-strong);\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: 8px 0 0;\n}\n\n.settings-connection-page-header .settings-page-description + .settings-page-description {\n margin-top: 8px;\n}\n\n.settings-update-header {\n margin-bottom: 8px;\n}\n\n.settings-connections-content,\n.settings-plugins-content,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-content,\n.settings-plugins-content {\n display: grid;\n gap: 12px;\n}\n\n.settings-connection-list {\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-segmented {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n padding: 2px;\n gap: 3px;\n background: var(--settings-surface-strong);\n border-radius: 10px;\n}\n\n.settings-segmented__item {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 28px;\n padding: 4px 14px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n white-space: nowrap;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n transition:\n color 0.15s ease,\n background-color 0.15s ease,\n box-shadow 0.15s ease;\n}\n\n.settings-segmented__item:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-segmented__item--selected,\n.settings-segmented__item[aria-selected="true"],\n.settings-segmented__item[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-elevated);\n box-shadow: var(--settings-segmented-shadow);\n}\n\n.settings-segmented__item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.settings-segmented__item:disabled:hover {\n color: var(--settings-muted);\n background: transparent;\n}\n\n.settings-segmented__item: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\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 /* Component : Status : Actions = 4 : 3 : 3 */\n grid-template-columns: minmax(0, 4fr) minmax(0, 3fr) minmax(0, 3fr);\n align-items: center;\n min-width: 0;\n column-gap: 16px;\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: var(--settings-surface);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-rows > .settings-connection-row,\n.settings-connection-rows > .settings-connection-block {\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-rows > .settings-connection-row:last-child,\n.settings-connection-rows > .settings-connection-block:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\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-mark);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface-strong);\n border-radius: 7px;\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-table-header > :last-child {\n text-align: end;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n gap: 6px;\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-inline-detail {\n display: grid;\n gap: 12px;\n margin-top: 2px;\n padding: 14px 12px 16px;\n border-top: 1px solid var(--settings-divider);\n background: var(--settings-inset);\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-divider[data-connection-drag-over="true"] {\n color: var(--settings-focus);\n background: rgb(51 156 255 / 8%);\n border-radius: 6px;\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-page {\n display: flex;\n flex-direction: column;\n gap: 18px;\n box-sizing: border-box;\n min-height: min(620px, calc(100vh - 200px));\n max-width: 720px;\n}\n\n.settings-about-page > .settings-section-label {\n padding-bottom: 10px;\n}\n\n.settings-about-panel {\n display: grid;\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-lead,\n.settings-about-extension,\n.settings-about-closing p,\n.settings-about-copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-lead {\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-about-agents {\n display: grid;\n gap: 10px;\n margin: 2px 0;\n padding: 0;\n list-style: none;\n}\n\n.settings-about-agent {\n display: grid;\n gap: 4px;\n padding-left: 2px;\n}\n\n.settings-about-agent-name {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-about-agent-name::before {\n content: "\xB7 ";\n color: var(--settings-muted);\n font-weight: 600;\n}\n\n.settings-about-agent-description {\n display: block;\n padding-left: 0.85em;\n color: var(--settings-muted);\n font-size: 12px;\n font-weight: 400;\n line-height: 18px;\n}\n\n.settings-about-closing {\n display: grid;\n gap: 8px;\n}\n\n.settings-about-repository {\n gap: 10px;\n}\n\n.settings-about-open-source {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.35em;\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\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: 4px 0 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #7cb8ff;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n}\n\n.settings-about-repository-link .codexhost-settings-icon {\n display: block;\n flex: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-brand {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: auto;\n padding-top: 12px;\n color: inherit;\n opacity: 0.9;\n text-decoration: none;\n transition: opacity 160ms ease;\n}\n\n.settings-about-brand:hover {\n opacity: 1;\n}\n\n.settings-about-brand-video {\n width: 40px;\n height: 40px;\n flex: none;\n overflow: hidden;\n object-fit: cover;\n border-radius: 999px;\n box-shadow: 0 1px 2px rgb(0 0 0 / 18%);\n}\n\n.settings-about-brand-copy {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n}\n\n.settings-about-brand-name {\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 800;\n letter-spacing: 0.18em;\n line-height: 18px;\n}\n\n.settings-about-brand-tagline {\n color: var(--settings-muted);\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.18em;\n line-height: 16px;\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 0 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/* Soft status copy and the Update action should not sit in a framed card. */\n.settings-update-panel[data-update-state="unavailable"],\n.settings-update-panel[data-update-state="failed"],\n.settings-update-panel[data-update-state="error"],\n.settings-update-panel[data-update-state="available"] {\n padding: 4px 0 0;\n border: 0;\n border-radius: 0;\n}\n\n.settings-update-panel__status-row {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n min-width: 0;\n}\n\n.settings-update-panel__status-row .settings-update-actions {\n flex: none;\n}\n\n.settings-update-panel__status-row .settings-update-panel__head {\n flex: 1 1 auto;\n min-width: 0;\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"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel[data-update-state="unavailable"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-muted);\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-strong);\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-muted);\n background: transparent;\n border-color: var(--settings-border);\n}\n\n.settings-command-button--secondary .codexhost-settings-icon,\n.settings-update-link .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-command-button:hover:not(.settings-command-button--secondary) {\n filter: brightness(1.08);\n}\n\n.settings-command-button--danger {\n color: var(--settings-danger);\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: var(--settings-danger-bg);\n border-color: var(--settings-danger-border);\n}\n\n.settings-command-button--secondary:hover,\n.settings-update-link:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-command-button--secondary:hover .codexhost-settings-icon,\n.settings-update-link:hover .codexhost-settings-icon {\n color: var(--settings-text);\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.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.settings-session-import-content {\n display: grid;\n min-width: 0;\n gap: 12px;\n margin-top: 16px;\n}\n\n.settings-session-import-list {\n display: grid;\n min-width: 0;\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n min-width: 0;\n gap: 16px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-session-import-row:last-child {\n border-bottom: 0;\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 color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-row__cwd {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: center;\n flex: none;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: #f5c542;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 16px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 6px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\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: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 18px;\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-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-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-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n justify-content: flex-start;\n flex-wrap: wrap;\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 :host([data-theme="light"]),\n :host([data-theme="dark"]) {\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-elevated: Canvas;\n --settings-surface-strong: Canvas;\n --settings-mark: CanvasText;\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';
|
|
26990
|
+
var shell_default = ':host {\n /* Inherit Codex Desktop color-scheme; light-dark() tracks the host page. */\n --settings-bg: light-dark(#ffffff, #181818);\n --settings-sidebar: light-dark(#f4f4f5, #1c1c1c);\n --settings-panel: transparent;\n --settings-text: light-dark(#171717, #f5f5f5);\n --settings-muted: light-dark(#737373, #a1a1a1);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));\n --settings-divider: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));\n --settings-hover: light-dark(rgb(15 23 42 / 5%), rgb(255 255 255 / 6%));\n --settings-active: light-dark(rgb(51 156 255 / 14%), rgb(51 156 255 / 12%));\n --settings-focus: #339cff;\n --settings-elevated: light-dark(#ffffff, #2c2c2e);\n --settings-inset: light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 18%));\n --settings-surface: light-dark(rgb(15 23 42 / 3%), rgb(255 255 255 / 2%));\n --settings-surface-strong: light-dark(rgb(15 23 42 / 6%), rgb(255 255 255 / 6%));\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-mark: light-dark(#52525b, #d4d8de);\n --settings-dialog-shadow: light-dark(\n 0 24px 64px rgb(15 23 42 / 16%),\n 0 24px 64px rgb(0 0 0 / 38%)\n );\n --settings-backdrop: light-dark(rgb(15 23 42 / 28%), rgb(0 0 0 / 52%));\n --settings-segmented-shadow:\n 0 0 0 0.5px light-dark(rgb(15 23 42 / 6%), rgb(0 0 0 / 4%)),\n 0 3px 1px 0 light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 4%)),\n 0 3px 8px 0 light-dark(rgb(15 23 42 / 10%), rgb(0 0 0 / 12%));\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.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: 12px;\n box-shadow: var(--settings-dialog-shadow);\n}\n\n.codexhost-settings-dialog::backdrop {\n background: var(--settings-backdrop);\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: 28px;\n padding: 7px 9px 3px 4px;\n color: var(--settings-muted);\n font-size: 12px;\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: 14px;\n font-weight: 600;\n line-height: 21px;\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-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 padding: 0 0 28px;\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-strong);\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-strong);\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 min-width: 0;\n margin: 0 0 16px;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n gap: 8px;\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: transparent;\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-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n}\n\n.settings-session-import-search {\n align-items: stretch;\n margin: 16px 0 0;\n}\n\n.settings-session-import-pagination {\n margin: 16px 0 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 box-sizing: border-box;\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,\n.settings-session-import-search .settings-command-button {\n box-sizing: border-box;\n height: 36px;\n min-height: 36px;\n padding: 6px 10px;\n border-radius: 6px;\n}\n\n.settings-session-import-pagination select {\n min-height: 28px;\n padding: 2px 8px;\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 line-height: 18px;\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: none;\n min-width: 0;\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-content {\n margin-top: 16px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 0;\n gap: 12px;\n padding: 12px 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-strong);\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: 8px 0 0;\n}\n\n.settings-connection-page-header .settings-page-description + .settings-page-description {\n margin-top: 8px;\n}\n\n.settings-update-header {\n margin-bottom: 8px;\n}\n\n.settings-connections-content,\n.settings-plugins-content,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-content,\n.settings-plugins-content {\n display: grid;\n gap: 12px;\n}\n\n.settings-connection-list {\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-segmented {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n padding: 2px;\n gap: 3px;\n background: var(--settings-surface-strong);\n border-radius: 10px;\n}\n\n.settings-segmented__item {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 28px;\n padding: 4px 14px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n white-space: nowrap;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n transition:\n color 0.15s ease,\n background-color 0.15s ease,\n box-shadow 0.15s ease;\n}\n\n.settings-segmented__item:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-segmented__item--selected,\n.settings-segmented__item[aria-selected="true"],\n.settings-segmented__item[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-elevated);\n box-shadow: var(--settings-segmented-shadow);\n}\n\n.settings-segmented__item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.settings-segmented__item:disabled:hover {\n color: var(--settings-muted);\n background: transparent;\n}\n\n.settings-segmented__item: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\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 /* Component : Status : Actions = 4 : 3 : 3 */\n grid-template-columns: minmax(0, 4fr) minmax(0, 3fr) minmax(0, 3fr);\n align-items: center;\n min-width: 0;\n column-gap: 16px;\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: var(--settings-surface);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-rows > .settings-connection-row,\n.settings-connection-rows > .settings-connection-block {\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-rows > .settings-connection-row:last-child,\n.settings-connection-rows > .settings-connection-block:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\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-mark);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface-strong);\n border-radius: 7px;\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-table-header > :last-child {\n text-align: end;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n gap: 6px;\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-inline-detail {\n display: grid;\n gap: 12px;\n margin-top: 2px;\n padding: 14px 12px 16px;\n border-top: 1px solid var(--settings-divider);\n background: var(--settings-inset);\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-divider[data-connection-drag-over="true"] {\n color: var(--settings-focus);\n background: rgb(51 156 255 / 8%);\n border-radius: 6px;\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 padding: 0;\n color: var(--settings-focus);\n font: inherit;\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-connection-install-link:hover,\n.settings-connection-install-link:focus-visible {\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-command {\n display: grid;\n gap: 4px;\n margin-top: 8px;\n}\n\n.settings-connection-install-command span {\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 14px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n\n.settings-connection-install-command code {\n display: block;\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 font-size: 11px;\n line-height: 16px;\n white-space: pre-wrap;\n}\n\n.settings-connection-install-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n}\n\n.settings-connection-copy-prompt {\n position: relative;\n}\n\n.settings-connection-copy-prompt__tooltip {\n position: absolute;\n z-index: 4;\n bottom: calc(100% + 6px);\n left: 0;\n width: max-content;\n max-width: min(360px, 72vw);\n max-height: 180px;\n overflow: auto;\n padding: 8px 10px;\n color: var(--settings-text);\n font-size: 11px;\n line-height: 16px;\n white-space: pre-wrap;\n text-align: left;\n background: var(--settings-elevated);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n box-shadow: 0 10px 24px rgb(0 0 0 / 22%);\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-copy-prompt:hover .settings-connection-copy-prompt__tooltip,\n.settings-connection-copy-prompt:focus-within .settings-connection-copy-prompt__tooltip {\n opacity: 1;\n visibility: visible;\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-page {\n display: flex;\n flex-direction: column;\n gap: 18px;\n box-sizing: border-box;\n min-height: min(620px, calc(100vh - 200px));\n max-width: 720px;\n}\n\n.settings-about-page > .settings-section-label {\n padding-bottom: 10px;\n}\n\n.settings-about-panel {\n display: grid;\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-lead,\n.settings-about-extension,\n.settings-about-closing p,\n.settings-about-copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-lead {\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-about-agents {\n display: grid;\n gap: 10px;\n margin: 2px 0;\n padding: 0;\n list-style: none;\n}\n\n.settings-about-agent {\n display: grid;\n gap: 4px;\n padding-left: 2px;\n}\n\n.settings-about-agent-name {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-about-agent-name::before {\n content: "\xB7 ";\n color: var(--settings-muted);\n font-weight: 600;\n}\n\n.settings-about-agent-description {\n display: block;\n padding-left: 0.85em;\n color: var(--settings-muted);\n font-size: 12px;\n font-weight: 400;\n line-height: 18px;\n}\n\n.settings-about-closing {\n display: grid;\n gap: 8px;\n}\n\n.settings-about-repository {\n gap: 10px;\n}\n\n.settings-about-open-source {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.35em;\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\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: 4px 0 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #7cb8ff;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n}\n\n.settings-about-repository-link .codexhost-settings-icon {\n display: block;\n flex: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-brand {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: auto;\n padding-top: 12px;\n color: inherit;\n opacity: 0.9;\n text-decoration: none;\n transition: opacity 160ms ease;\n}\n\n.settings-about-brand:hover {\n opacity: 1;\n}\n\n.settings-about-brand-video {\n width: 40px;\n height: 40px;\n flex: none;\n overflow: hidden;\n object-fit: cover;\n border-radius: 999px;\n box-shadow: 0 1px 2px rgb(0 0 0 / 18%);\n}\n\n.settings-about-brand-copy {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n}\n\n.settings-about-brand-name {\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 800;\n letter-spacing: 0.18em;\n line-height: 18px;\n}\n\n.settings-about-brand-tagline {\n color: var(--settings-muted);\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.18em;\n line-height: 16px;\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 0 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/* Soft status copy and the Update action should not sit in a framed card. */\n.settings-update-panel[data-update-state="unavailable"],\n.settings-update-panel[data-update-state="failed"],\n.settings-update-panel[data-update-state="error"],\n.settings-update-panel[data-update-state="available"] {\n padding: 4px 0 0;\n border: 0;\n border-radius: 0;\n}\n\n.settings-update-panel__status-row {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n min-width: 0;\n}\n\n.settings-update-panel__status-row .settings-update-actions {\n flex: none;\n}\n\n.settings-update-panel__status-row .settings-update-panel__head {\n flex: 1 1 auto;\n min-width: 0;\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"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel[data-update-state="unavailable"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-muted);\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-strong);\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-muted);\n background: transparent;\n border-color: var(--settings-border);\n}\n\n.settings-command-button--secondary .codexhost-settings-icon,\n.settings-update-link .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-command-button:hover:not(.settings-command-button--secondary) {\n filter: brightness(1.08);\n}\n\n.settings-command-button--danger {\n color: var(--settings-danger);\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: var(--settings-danger-bg);\n border-color: var(--settings-danger-border);\n}\n\n.settings-command-button--secondary:hover,\n.settings-update-link:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-command-button--secondary:hover .codexhost-settings-icon,\n.settings-update-link:hover .codexhost-settings-icon {\n color: var(--settings-text);\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.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.settings-session-import-content {\n display: grid;\n min-width: 0;\n gap: 12px;\n margin-top: 16px;\n}\n\n.settings-session-import-list {\n display: grid;\n min-width: 0;\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n min-width: 0;\n gap: 16px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-session-import-row:last-child {\n border-bottom: 0;\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 color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-row__cwd {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: center;\n flex: none;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: #f5c542;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 16px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 6px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\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: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 18px;\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-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-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-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n justify-content: flex-start;\n flex-wrap: wrap;\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 :host([data-theme="light"]),\n :host([data-theme="dark"]) {\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-elevated: Canvas;\n --settings-surface-strong: Canvas;\n --settings-mark: CanvasText;\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';
|
|
26084
26991
|
|
|
26085
26992
|
// src/settings/accounts.css
|
|
26086
|
-
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-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 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.settings-account-usage__meter--balance {\n display: flex;\n grid-template-columns: none;\n justify-content: flex-start;\n gap: 6px;\n}\n.settings-account-usage__balance {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\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';
|
|
26993
|
+
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-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}\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.settings-account-usage__meter--balance {\n display: flex;\n grid-template-columns: none;\n justify-content: flex-start;\n gap: 6px;\n}\n.settings-account-usage__balance {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\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';
|
|
26087
26994
|
|
|
26088
26995
|
// src/settings/shell.ts
|
|
26089
26996
|
var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
|
|
@@ -26676,11 +27583,11 @@ ${accounts_default}`;
|
|
|
26676
27583
|
options.getConnectionDiagnostics ?? (() => null),
|
|
26677
27584
|
options.getAccountClient ?? (() => null),
|
|
26678
27585
|
options.getSessionImportClient ?? (() => null),
|
|
26679
|
-
async (threadId, signal) => {
|
|
27586
|
+
async (threadId, signal, hostId) => {
|
|
26680
27587
|
if (!options.openImportedThread) {
|
|
26681
27588
|
throw new Error("Imported Thread navigation is unavailable");
|
|
26682
27589
|
}
|
|
26683
|
-
await options.openImportedThread(threadId, signal);
|
|
27590
|
+
await options.openImportedThread(threadId, signal, hostId);
|
|
26684
27591
|
if (!disposed && !signal.aborted) shell?.close();
|
|
26685
27592
|
}
|
|
26686
27593
|
);
|
|
@@ -26835,7 +27742,10 @@ ${accounts_default}`;
|
|
|
26835
27742
|
opencode: harnessIdSchema.parse("opencode"),
|
|
26836
27743
|
grok: harnessIdSchema.parse("grok"),
|
|
26837
27744
|
omp: harnessIdSchema.parse("omp"),
|
|
26838
|
-
antigravity: harnessIdSchema.parse("antigravity")
|
|
27745
|
+
antigravity: harnessIdSchema.parse("antigravity"),
|
|
27746
|
+
hermes: harnessIdSchema.parse("hermes"),
|
|
27747
|
+
muse: harnessIdSchema.parse("muse"),
|
|
27748
|
+
"kiro-cli": harnessIdSchema.parse("kiro-cli")
|
|
26839
27749
|
};
|
|
26840
27750
|
var externalAgents = [
|
|
26841
27751
|
"pi",
|
|
@@ -26844,7 +27754,10 @@ ${accounts_default}`;
|
|
|
26844
27754
|
"opencode",
|
|
26845
27755
|
"grok",
|
|
26846
27756
|
"omp",
|
|
26847
|
-
"antigravity"
|
|
27757
|
+
"antigravity",
|
|
27758
|
+
"hermes",
|
|
27759
|
+
"muse",
|
|
27760
|
+
"kiro-cli"
|
|
26848
27761
|
];
|
|
26849
27762
|
function isRetryableHarnessAvailability(availability, error51) {
|
|
26850
27763
|
return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
|
|
@@ -27014,7 +27927,42 @@ ${accounts_default}`;
|
|
|
27014
27927
|
...permissionModeId ? { permissionModeId } : {}
|
|
27015
27928
|
};
|
|
27016
27929
|
}
|
|
27017
|
-
|
|
27930
|
+
if (inspection.harnessId === "hermes") {
|
|
27931
|
+
return {
|
|
27932
|
+
agent: "hermes",
|
|
27933
|
+
...inspection.effectiveModel ? { model: inspection.effectiveModel } : {},
|
|
27934
|
+
...inspection.effectivePermissionModeId ? { permissionModeId: inspection.effectivePermissionModeId } : {}
|
|
27935
|
+
};
|
|
27936
|
+
}
|
|
27937
|
+
return restoredPluginRouteOwnership(inspection);
|
|
27938
|
+
}
|
|
27939
|
+
function isKnownExternalRendererAgent(value) {
|
|
27940
|
+
return KNOWN_RENDERER_AGENTS.includes(value) && value !== "codex";
|
|
27941
|
+
}
|
|
27942
|
+
function restoredPluginRouteOwnership(inspection) {
|
|
27943
|
+
if (inspection.owner !== "external") {
|
|
27944
|
+
throw new Error("Thread owner is not a Renderer Agent");
|
|
27945
|
+
}
|
|
27946
|
+
const agent = inspection.harnessId;
|
|
27947
|
+
if (!isKnownExternalRendererAgent(agent)) {
|
|
27948
|
+
throw new Error("Thread owner is not a Renderer Agent");
|
|
27949
|
+
}
|
|
27950
|
+
const transportSelection = decodeHarnessPluginRoute(inspection.transportModelId);
|
|
27951
|
+
if (transportSelection && transportSelection.harnessId !== agent) {
|
|
27952
|
+
throw new Error(`${agent} Thread reported an incompatible transport Model`);
|
|
27953
|
+
}
|
|
27954
|
+
if (!transportSelection && !inspection.effectiveModel && !inspection.effectivePermissionModeId && !selectableThinkingOptionId(inspection)) {
|
|
27955
|
+
throw new Error(`${agent} Thread reported an incompatible transport Model`);
|
|
27956
|
+
}
|
|
27957
|
+
const model = inspection.effectiveModel ?? transportSelection?.model;
|
|
27958
|
+
const thinkingOptionId = selectableThinkingOptionId(inspection) ?? transportSelection?.thinkingOptionId;
|
|
27959
|
+
const permissionModeId = inspection.effectivePermissionModeId ?? transportSelection?.permissionModeId;
|
|
27960
|
+
return {
|
|
27961
|
+
agent,
|
|
27962
|
+
...model ? { model } : {},
|
|
27963
|
+
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
27964
|
+
...permissionModeId ? { permissionModeId } : {}
|
|
27965
|
+
};
|
|
27018
27966
|
}
|
|
27019
27967
|
function isOwnershipSubmissionBlocked(status) {
|
|
27020
27968
|
return status === "loading" || status === "error";
|
|
@@ -27078,6 +28026,8 @@ ${accounts_default}`;
|
|
|
27078
28026
|
function installRendererBindingProbe(options = {}) {
|
|
27079
28027
|
const existing = window.__codexhostRendererBindingProbeV1;
|
|
27080
28028
|
if (existing) return existing;
|
|
28029
|
+
const disposeApprovalStyle = installRendererApprovalStyle(document);
|
|
28030
|
+
const subagentRowMeta = installRendererSubagentRowMeta();
|
|
27081
28031
|
const enabledAgents = [...new Set(options.enabledAgents ?? DEFAULT_RENDERER_AGENTS)];
|
|
27082
28032
|
const enabledAgentSet = new Set(enabledAgents);
|
|
27083
28033
|
const controller = new DraftAgentController({
|
|
@@ -27131,18 +28081,20 @@ ${accounts_default}`;
|
|
|
27131
28081
|
getAccountClient: () => modelControl,
|
|
27132
28082
|
getConnectionDiagnostics: () => connectionDiagnostics,
|
|
27133
28083
|
getSessionImportClient: () => {
|
|
27134
|
-
const
|
|
28084
|
+
const hostId = activeModelHostId() ?? "local";
|
|
28085
|
+
const client = modelClientForHost(hostId);
|
|
27135
28086
|
const sources = client?.listSessionImportSources;
|
|
27136
28087
|
const list = client?.listHarnessSessions;
|
|
27137
28088
|
const importSession = client?.importHarnessSession;
|
|
27138
28089
|
if (!sources || !list || !importSession) return null;
|
|
27139
28090
|
return {
|
|
28091
|
+
hostId,
|
|
27140
28092
|
listSessionImportSources: () => sources(),
|
|
27141
28093
|
listHarnessSessions: (input) => list(input),
|
|
27142
28094
|
importHarnessSession: (input) => importSession(input)
|
|
27143
28095
|
};
|
|
27144
28096
|
},
|
|
27145
|
-
openImportedThread: (threadId, signal) => openRendererThread(threadId, { hostId: "local", signal }),
|
|
28097
|
+
openImportedThread: (threadId, signal, hostId) => openRendererThread(threadId, { hostId: hostId ?? "local", signal }),
|
|
27146
28098
|
onLocaleChange() {
|
|
27147
28099
|
for (const mounted of mountedByComposer.values()) renderMounted(mounted);
|
|
27148
28100
|
}
|
|
@@ -27165,7 +28117,10 @@ ${accounts_default}`;
|
|
|
27165
28117
|
opencode: void 0,
|
|
27166
28118
|
grok: void 0,
|
|
27167
28119
|
omp: void 0,
|
|
27168
|
-
antigravity: void 0
|
|
28120
|
+
antigravity: void 0,
|
|
28121
|
+
hermes: void 0,
|
|
28122
|
+
muse: void 0,
|
|
28123
|
+
"kiro-cli": void 0
|
|
27169
28124
|
},
|
|
27170
28125
|
webUi: Object.fromEntries(
|
|
27171
28126
|
externalAgents.map((agent) => [agent, false])
|
|
@@ -27648,7 +28603,22 @@ ${accounts_default}`;
|
|
|
27648
28603
|
return;
|
|
27649
28604
|
}
|
|
27650
28605
|
if (current.phase === "locked" && previousModel && !previousModelAvailable) {
|
|
27651
|
-
|
|
28606
|
+
mounted.modelView = {
|
|
28607
|
+
status: "error",
|
|
28608
|
+
catalog: inspection.catalog,
|
|
28609
|
+
selected: previousModel,
|
|
28610
|
+
thinkingSelectionSupported: inspection.capabilities.configuration.selectThinkingOption,
|
|
28611
|
+
error: "Existing Thread Model is absent from the current Catalog"
|
|
28612
|
+
};
|
|
28613
|
+
if (selectedPermissionModeId && mounted.permissionModeView.catalog) {
|
|
28614
|
+
mounted.permissionModeView = {
|
|
28615
|
+
status: "ready",
|
|
28616
|
+
catalog: mounted.permissionModeView.catalog,
|
|
28617
|
+
selected: selectedPermissionModeId,
|
|
28618
|
+
...permissionModeLock
|
|
28619
|
+
};
|
|
28620
|
+
}
|
|
28621
|
+
return;
|
|
27652
28622
|
}
|
|
27653
28623
|
const selected = previousModelAvailable ? previousModel : preferredConfiguration?.model ?? inspection.catalog.defaultModel;
|
|
27654
28624
|
if (!selected) throw new Error("External Harness did not report its default Model");
|
|
@@ -28891,6 +29861,8 @@ ${accounts_default}`;
|
|
|
28891
29861
|
dispose() {
|
|
28892
29862
|
if (disposed) return;
|
|
28893
29863
|
disposed = true;
|
|
29864
|
+
disposeApprovalStyle();
|
|
29865
|
+
subagentRowMeta.dispose();
|
|
28894
29866
|
usageNotificationDispose?.();
|
|
28895
29867
|
usageNotificationDispose = null;
|
|
28896
29868
|
adapterDispose?.();
|
|
@@ -28982,6 +29954,7 @@ lucide/dist/esm/icons/circle-off.mjs:
|
|
|
28982
29954
|
lucide/dist/esm/icons/copy.mjs:
|
|
28983
29955
|
lucide/dist/esm/icons/ellipsis.mjs:
|
|
28984
29956
|
lucide/dist/esm/icons/download.mjs:
|
|
29957
|
+
lucide/dist/esm/icons/hard-drive-download.mjs:
|
|
28985
29958
|
lucide/dist/esm/icons/external-link.mjs:
|
|
28986
29959
|
lucide/dist/esm/icons/folder-input.mjs:
|
|
28987
29960
|
lucide/dist/esm/icons/grip-vertical.mjs:
|