@codexhost/cli-win32-arm64 0.8.0 → 0.9.1-test.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_NOTICES.txt +12 -0
- package/app/codexhost-distribution.json +1 -1
- package/app/desktop-controller.mjs +66 -26
- package/app/host-runtime.mjs +3760 -6598
- package/app/plugins/antigravity/plugin.mjs +46 -92
- package/app/plugins/claude-code/plugin.mjs +464 -238
- package/app/plugins/codebuddy/plugin.mjs +78 -100
- package/app/plugins/cursor-cli/plugin.mjs +45 -81
- package/app/plugins/deepseek-harness/plugin.mjs +57 -84
- package/app/plugins/enabled.json +3 -1
- package/app/plugins/grok/plugin.mjs +45 -78
- package/app/plugins/hermes/plugin.mjs +42 -80
- package/app/plugins/kiro-cli/plugin.mjs +52 -80
- package/app/plugins/omp/plugin.mjs +55 -83
- package/app/plugins/opencode/plugin.mjs +94 -123
- package/app/plugins/pi/plugin.mjs +55 -83
- package/app/plugins/qoder/assets/icon.svg +1 -0
- package/app/plugins/qoder/manifest.json +12 -0
- package/app/plugins/qoder/plugin.mjs +52260 -0
- package/app/plugins/qoder-cn/assets/icon.svg +1 -0
- package/app/plugins/qoder-cn/manifest.json +12 -0
- package/app/plugins/qoder-cn/plugin.mjs +52258 -0
- package/app/renderer-extension.js +2893 -914
- 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/licenses/Qoder-Agent-SDK-LICENSE.txt +7 -0
- package/licenses/QoderCN-Agent-SDK-LICENSE.txt +7 -0
- package/licenses/tailwindcss-LICENSE.txt +21 -0
- package/package.json +1 -1
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
"kiro-cli",
|
|
20
20
|
"codebuddy",
|
|
21
21
|
"cursor-cli",
|
|
22
|
-
"hermes"
|
|
22
|
+
"hermes",
|
|
23
|
+
"qoder",
|
|
24
|
+
"qoder-cn"
|
|
23
25
|
];
|
|
24
26
|
var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
|
|
25
27
|
function defaultIdFactory(sequence) {
|
|
@@ -148,6 +150,10 @@
|
|
|
148
150
|
else if (agent === "cursor-cli") delete state.cursorCliModel;
|
|
149
151
|
if (agent === "hermes" && model) state.hermesModel = model;
|
|
150
152
|
else if (agent === "hermes") delete state.hermesModel;
|
|
153
|
+
if (agent === "qoder" && model) state.qoderModel = model;
|
|
154
|
+
else if (agent === "qoder") delete state.qoderModel;
|
|
155
|
+
if (agent === "qoder-cn" && model) state.qoderCnModel = model;
|
|
156
|
+
else if (agent === "qoder-cn") delete state.qoderCnModel;
|
|
151
157
|
if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
|
|
152
158
|
else if (agent === "pi") delete state.piThinkingOptionId;
|
|
153
159
|
if (agent === "claude-code" && thinkingOptionId) {
|
|
@@ -169,6 +175,12 @@
|
|
|
169
175
|
if (agent === "codebuddy" && thinkingOptionId) {
|
|
170
176
|
state.codeBuddyThinkingOptionId = thinkingOptionId;
|
|
171
177
|
} else if (agent === "codebuddy") delete state.codeBuddyThinkingOptionId;
|
|
178
|
+
if (agent === "qoder" && thinkingOptionId) {
|
|
179
|
+
state.qoderThinkingOptionId = thinkingOptionId;
|
|
180
|
+
} else if (agent === "qoder") delete state.qoderThinkingOptionId;
|
|
181
|
+
if (agent === "qoder-cn" && thinkingOptionId) {
|
|
182
|
+
state.qoderCnThinkingOptionId = thinkingOptionId;
|
|
183
|
+
} else if (agent === "qoder-cn") delete state.qoderCnThinkingOptionId;
|
|
172
184
|
if (agent !== "codex") {
|
|
173
185
|
const permissionModeByAgent = {};
|
|
174
186
|
for (const candidate of [
|
|
@@ -182,7 +194,9 @@
|
|
|
182
194
|
"kiro-cli",
|
|
183
195
|
"codebuddy",
|
|
184
196
|
"cursor-cli",
|
|
185
|
-
"hermes"
|
|
197
|
+
"hermes",
|
|
198
|
+
"qoder",
|
|
199
|
+
"qoder-cn"
|
|
186
200
|
]) {
|
|
187
201
|
const current = state.permissionModeByAgent?.[candidate];
|
|
188
202
|
if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
|
|
@@ -209,6 +223,8 @@
|
|
|
209
223
|
if (agent === "codebuddy") return state.codeBuddyModel;
|
|
210
224
|
if (agent === "cursor-cli") return state.cursorCliModel;
|
|
211
225
|
if (agent === "hermes") return state.hermesModel;
|
|
226
|
+
if (agent === "qoder") return state.qoderModel;
|
|
227
|
+
if (agent === "qoder-cn") return state.qoderCnModel;
|
|
212
228
|
return void 0;
|
|
213
229
|
}
|
|
214
230
|
thinkingOptionForAgent(composer, agent) {
|
|
@@ -221,6 +237,8 @@
|
|
|
221
237
|
if (agent === "antigravity") return state.antigravityThinkingOptionId;
|
|
222
238
|
if (agent === "kiro-cli") return state.kiroCliThinkingOptionId;
|
|
223
239
|
if (agent === "codebuddy") return state.codeBuddyThinkingOptionId;
|
|
240
|
+
if (agent === "qoder") return state.qoderThinkingOptionId;
|
|
241
|
+
if (agent === "qoder-cn") return state.qoderCnThinkingOptionId;
|
|
224
242
|
return void 0;
|
|
225
243
|
}
|
|
226
244
|
permissionModeForAgent(composer, agent) {
|
|
@@ -247,6 +265,8 @@
|
|
|
247
265
|
else if (agent === "codebuddy") state.codeBuddyModel = model;
|
|
248
266
|
else if (agent === "cursor-cli") state.cursorCliModel = model;
|
|
249
267
|
else if (agent === "hermes") state.hermesModel = model;
|
|
268
|
+
else if (agent === "qoder") state.qoderModel = model;
|
|
269
|
+
else if (agent === "qoder-cn") state.qoderCnModel = model;
|
|
250
270
|
else state.antigravityModel = model;
|
|
251
271
|
return state;
|
|
252
272
|
}
|
|
@@ -292,6 +312,14 @@
|
|
|
292
312
|
state.codeBuddyThinkingOptionId = thinkingOptionId;
|
|
293
313
|
} else if (agent === "codebuddy") {
|
|
294
314
|
delete state.codeBuddyThinkingOptionId;
|
|
315
|
+
} else if (agent === "qoder" && thinkingOptionId) {
|
|
316
|
+
state.qoderThinkingOptionId = thinkingOptionId;
|
|
317
|
+
} else if (agent === "qoder") {
|
|
318
|
+
delete state.qoderThinkingOptionId;
|
|
319
|
+
} else if (agent === "qoder-cn" && thinkingOptionId) {
|
|
320
|
+
state.qoderCnThinkingOptionId = thinkingOptionId;
|
|
321
|
+
} else if (agent === "qoder-cn") {
|
|
322
|
+
delete state.qoderCnThinkingOptionId;
|
|
295
323
|
}
|
|
296
324
|
return state;
|
|
297
325
|
}
|
|
@@ -14897,6 +14925,48 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14897
14925
|
// ../shared-contracts/dist/version.js
|
|
14898
14926
|
var WORKSPACE_CONTRACT_VERSION = 1;
|
|
14899
14927
|
|
|
14928
|
+
// ../shared-contracts/dist/idle-release.js
|
|
14929
|
+
var IDLE_RELEASE_SETTINGS_METHOD = "codexhost/settings/idle-release/set";
|
|
14930
|
+
var IDLE_RELEASE_TIMEOUT_MINUTES_MIN = 5;
|
|
14931
|
+
var IDLE_RELEASE_TIMEOUT_MINUTES_MAX = 1440;
|
|
14932
|
+
var idleReleaseSettingsSchema = external_exports.strictObject({
|
|
14933
|
+
enabled: external_exports.boolean(),
|
|
14934
|
+
timeoutMinutes: external_exports.number().int().min(IDLE_RELEASE_TIMEOUT_MINUTES_MIN).max(IDLE_RELEASE_TIMEOUT_MINUTES_MAX)
|
|
14935
|
+
});
|
|
14936
|
+
var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
|
|
14937
|
+
enabled: false,
|
|
14938
|
+
timeoutMinutes: 30
|
|
14939
|
+
});
|
|
14940
|
+
|
|
14941
|
+
// ../shared-contracts/dist/loaded-sessions.js
|
|
14942
|
+
var LOADED_SESSIONS_METHOD = "codexhost/sessions/loaded/list";
|
|
14943
|
+
var loadedSessionStateSchema = external_exports.enum([
|
|
14944
|
+
"idle",
|
|
14945
|
+
"running",
|
|
14946
|
+
"busy",
|
|
14947
|
+
"closing",
|
|
14948
|
+
"failed",
|
|
14949
|
+
"blocked"
|
|
14950
|
+
]);
|
|
14951
|
+
var loadedSessionReasonSchema = external_exports.enum([
|
|
14952
|
+
"none",
|
|
14953
|
+
"disabled",
|
|
14954
|
+
"timeout",
|
|
14955
|
+
"operation",
|
|
14956
|
+
"background",
|
|
14957
|
+
"identity",
|
|
14958
|
+
"persistence",
|
|
14959
|
+
"closeFailed"
|
|
14960
|
+
]);
|
|
14961
|
+
var loadedSessionsSchema = external_exports.array(external_exports.strictObject({
|
|
14962
|
+
threadId: external_exports.string(),
|
|
14963
|
+
title: external_exports.string(),
|
|
14964
|
+
harnessId: external_exports.string(),
|
|
14965
|
+
state: loadedSessionStateSchema,
|
|
14966
|
+
reason: loadedSessionReasonSchema,
|
|
14967
|
+
inactiveMs: external_exports.number().nonnegative()
|
|
14968
|
+
}));
|
|
14969
|
+
|
|
14900
14970
|
// ../shared-contracts/dist/ids.js
|
|
14901
14971
|
var opaqueIdSchema = external_exports.string().refine((value) => value.trim().length > 0, {
|
|
14902
14972
|
message: "Identifier must not be empty or whitespace"
|
|
@@ -15475,77 +15545,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15475
15545
|
email: external_exports.string().email().max(320).optional(),
|
|
15476
15546
|
planType: codexAccountPlanTypeSchema.optional()
|
|
15477
15547
|
}).strict();
|
|
15478
|
-
var codexAccountPhaseSchema = external_exports.enum(["ready", "
|
|
15479
|
-
var codexAccountPendingOperationSchema = external_exports.object({
|
|
15480
|
-
operationId: nonBlankTextSchema3.max(1024),
|
|
15481
|
-
kind: external_exports.enum(["login", "switch", "logout", "recovery"])
|
|
15482
|
-
}).strict();
|
|
15483
|
-
var codexAccountCapabilitiesSchema = external_exports.object({
|
|
15484
|
-
manage: external_exports.boolean(),
|
|
15485
|
-
switch: external_exports.boolean(),
|
|
15486
|
-
login: external_exports.boolean(),
|
|
15487
|
-
delete: external_exports.boolean(),
|
|
15488
|
-
recover: external_exports.boolean().optional(),
|
|
15489
|
-
logout: external_exports.boolean().optional(),
|
|
15490
|
-
reason: external_exports.enum([
|
|
15491
|
-
"ssh-single-account",
|
|
15492
|
-
"unsupported-storage",
|
|
15493
|
-
"unsupported-version",
|
|
15494
|
-
"recovery-required",
|
|
15495
|
-
"keyring-unavailable",
|
|
15496
|
-
"migration-required"
|
|
15497
|
-
]).optional()
|
|
15498
|
-
}).strict();
|
|
15548
|
+
var codexAccountPhaseSchema = external_exports.enum(["ready", "unavailable"]);
|
|
15499
15549
|
var codexAccountListResultSchema = external_exports.object({
|
|
15500
15550
|
version: external_exports.literal(2),
|
|
15501
15551
|
currentAccountId: accountIdSchema.nullable(),
|
|
15502
15552
|
phase: codexAccountPhaseSchema,
|
|
15503
15553
|
revision: external_exports.number().int().nonnegative(),
|
|
15504
15554
|
instanceId: nonBlankTextSchema3.max(1024).optional(),
|
|
15505
|
-
|
|
15506
|
-
/** Credentials were adopted; other native homes/history remain unmerged. */
|
|
15507
|
-
legacyHistoryPreserved: external_exports.boolean().optional(),
|
|
15508
|
-
pendingOperation: codexAccountPendingOperationSchema.optional(),
|
|
15509
|
-
capabilities: codexAccountCapabilitiesSchema,
|
|
15510
|
-
accounts: external_exports.array(codexAccountSchema).max(128)
|
|
15511
|
-
}).strict();
|
|
15512
|
-
var codexAccountActivateParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
|
|
15513
|
-
var codexAccountSwitchParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
|
|
15514
|
-
var codexAccountReadyMutationResultShape = {
|
|
15515
|
-
phase: external_exports.literal("ready"),
|
|
15516
|
-
revision: external_exports.number().int().nonnegative()
|
|
15517
|
-
};
|
|
15518
|
-
var codexAccountSwitchResultSchema = external_exports.object({
|
|
15519
|
-
currentAccountId: accountIdSchema,
|
|
15520
|
-
...codexAccountReadyMutationResultShape
|
|
15555
|
+
accounts: external_exports.array(codexAccountSchema).max(1)
|
|
15521
15556
|
}).strict();
|
|
15522
15557
|
var codexAccountChangedSchema = codexAccountListResultSchema;
|
|
15523
|
-
var codexAccountDeleteParamsSchema = external_exports.object({ accountId: accountIdSchema }).strict();
|
|
15524
|
-
var codexAccountDeleteResultSchema = external_exports.object({ deletedAccountId: accountIdSchema }).strict();
|
|
15525
|
-
var codexAccountLoginStartParamsSchema = external_exports.object({ accountId: accountIdSchema.optional() }).strict();
|
|
15526
|
-
var codexAccountLoginStartResultSchema = external_exports.object({
|
|
15527
|
-
accountId: accountIdSchema,
|
|
15528
|
-
loginId: nonBlankTextSchema3.max(1024),
|
|
15529
|
-
verificationUrl: external_exports.string().url().max(16384),
|
|
15530
|
-
userCode: nonBlankTextSchema3.max(1024)
|
|
15531
|
-
}).strict();
|
|
15532
|
-
var codexAccountLoginCancelParamsSchema = external_exports.object({ loginId: nonBlankTextSchema3.max(1024) }).strict();
|
|
15533
|
-
var codexAccountLoginCancelResultSchema = external_exports.object({ cancelled: external_exports.boolean() }).strict();
|
|
15534
|
-
var codexAccountLoginCompletedSchema = external_exports.object({
|
|
15535
|
-
accountId: accountIdSchema,
|
|
15536
|
-
loginId: nonBlankTextSchema3.max(1024),
|
|
15537
|
-
success: external_exports.boolean(),
|
|
15538
|
-
error: external_exports.string().max(4096).nullable(),
|
|
15539
|
-
saved: external_exports.boolean().optional(),
|
|
15540
|
-
cleanupRequired: external_exports.boolean().optional()
|
|
15541
|
-
}).strict();
|
|
15542
|
-
var codexAccountLogoutParamsSchema = external_exports.object({}).strict();
|
|
15543
|
-
var codexAccountLogoutResultSchema = external_exports.object({
|
|
15544
|
-
currentAccountId: external_exports.null(),
|
|
15545
|
-
...codexAccountReadyMutationResultShape
|
|
15546
|
-
}).strict();
|
|
15547
|
-
var codexAccountRecoverParamsSchema = external_exports.object({}).strict();
|
|
15548
|
-
var codexAccountRecoverResultSchema = codexAccountListResultSchema;
|
|
15549
15558
|
var codexAccountUsageParamsSchema = external_exports.object({ accountId: accountIdSchema, refresh: external_exports.boolean().optional() }).strict();
|
|
15550
15559
|
var codexAccountUsageResultSchema = external_exports.object({
|
|
15551
15560
|
accountId: accountIdSchema,
|
|
@@ -15554,21 +15563,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15554
15563
|
freshness: external_exports.enum(["live", "cached"]),
|
|
15555
15564
|
observedAt: external_exports.string().datetime().nullable()
|
|
15556
15565
|
}).strict();
|
|
15557
|
-
var codexAccountResetCreditConsumeParamsSchema = external_exports.object({
|
|
15558
|
-
accountId: accountIdSchema,
|
|
15559
|
-
idempotencyKey: external_exports.string().uuid().optional()
|
|
15560
|
-
}).strict();
|
|
15561
|
-
var codexAccountResetCreditConsumeOutcomeSchema = external_exports.enum([
|
|
15562
|
-
"reset",
|
|
15563
|
-
"nothingToReset",
|
|
15564
|
-
"noCredit",
|
|
15565
|
-
"alreadyRedeemed"
|
|
15566
|
-
]);
|
|
15567
|
-
var codexAccountResetCreditConsumeResultSchema = external_exports.object({
|
|
15568
|
-
accountId: accountIdSchema,
|
|
15569
|
-
outcome: codexAccountResetCreditConsumeOutcomeSchema,
|
|
15570
|
-
accountCredits: accountCreditsSnapshotSchema.optional()
|
|
15571
|
-
}).strict();
|
|
15572
15566
|
|
|
15573
15567
|
// ../shared-contracts/dist/reasoning-transcript.js
|
|
15574
15568
|
var REASONING_TRANSCRIPT_COMMAND = "thinking";
|
|
@@ -15942,6 +15936,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15942
15936
|
// src/assets/opencode-agent.png
|
|
15943
15937
|
var opencode_agent_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAYAAAA9zQYyAAAFuklEQVR4AezUzY0bRxRF4YZWnp0w3k4a1sZKYaAkbMUiW9EYSmEUl0WBAEFS/Guyurree9+ATbCbxap3zz3Su9/fv//fhUEWB95N/hBIRIDQicoUZZoIzYJUBAidqk5hCF3GgRpBCV2j5zIpCV2m6hpBCV2j5zIpCV2m6hpBCV2j5zIpCT1NU5m2CwQldIGSK0UkdKW2C2QldIGSK0UkdKW2C2QldIGSK0W8InQlFLJmIEDoDC3KsCNA6B0KHzIQIHSGFmXYESD0DoUPGQgQOkOLLTIk2YPQSYoUY0uA0FsO3pMQIHSSIsXYEiD0loP3JAQInaRIMbYECL3lcOndd4EIEDpQWUa9ToDQ1xlZEYgAoQOVZdTrBAh9nZEVgQiEFPrPjx8n1/IMAnm8G/UxoXfb9P3w37dvk2t5Bn1bbXNaSKHbRLdLRgKEzthq4UyELlx+xuiEzthq4UyELlz+nOhR1hI6SlPmvIkAoW/CZFEUAoSO0pQ5byJA6JswWRSFAKGjNGXOmwgQ+iZMlxb5biQChB6pDbM8TIDQDyO0wUgECD1SG2Z5mAChH0Zog5EIEHqkNszyMIFFhX54OhsgMJMAoWcCs3xsAoQeux/TzSRA6JnALB+bAKHH7sd0MwkQeg/Yv1++TJ9eX0NdP2fei7DWx2HOJfRRFd/f3qZI19H45W8JXV6BXAAInavP8mkIXV6BXAAInavP8mkIvbQC9u9KgNBdcTtsaQKEXpqw/bsSIHRX3A5bmgChlyZs/64ECN0Vt8OWJrCm0Etns39BAoQuWHrmyITO3G7BbIQuWHrmyITO3G7BbIQuWHr/yP1OJHQ/1k7qQIDQHSA7oh8BQvdj7aQOBAjdAbIj+hEg9B7rp6en6fn5OdT1c+bJ344AoXcopum3jdB/fPgw9bwePYvQewVuPhJ6A8ErDwFC5+lSkg0BQm8geOUhQOg8XUqyIUDoDQSvPAQGFjoPZEn6ESB0P9ZO6kCA0B0gO6IfAUL3Y+2kDgQI3QGyI/oRIHQ/1k46R6Dhc0I3hGmr9QkQev0OTNCQAKEbwrTV+gQIvX4HJmhIgNANYdpqfQKEXr+DSxP4biYBQs8EZvnYBAg9dj+mm0mA0DOBWT42AUKP3Y/pZhIg9Exglo9NIK7QY3M13UoECL0SeMcuQ4DQy3C160oECL0SeMcuQ4DQy3C160oECL0SeMfeTmDOSkLPoWXt8AQIPXxFBpxDgNBzaFk7PAFCD1+RAecQIPQcWtYOT4DQw1d0aUDfHRMg9DER96EJEDp0fYY/JkDoYyLuQxMgdOj6DH9MgNDHRNyHJpBW6NCtGP5uAoS+G50fjkiA0CO2Yqa7CRD6bnR+OCIBQh+18vLyMkW6jsYvf0voPQX+/vx5+ufr11DXX5uZ9yJU/HiQmdAHONxEJ0Do6A2a/4AAoQ9wuIlOgNDRGzT/AQFCH+BwE50AoaM3eGn+gt8RumDpmSMTOnO7BbMRumDpmSMTOnO7BbMRumDpmSNXFTpzp6WzEbp0/fnCEzpfp6UTEbp0/fnCEzpfp6UTEbp0/fnC/yp0vowSFSJA6EJlV4hK6AotF8pI6EJlV4gaUuhPr6+Ta3kGEf8BhBT6+9vb5HqcwTWGhI5IwMypCIT8HzpVA8I0JUDopjhttjYBQq/dgPObEiB0U5w2W5sAoU824GFUAoSO2py5TxIg9EksHkYlQOiozZn7JAFCn8TiYVQChI7anLlPEpgt9MldPERgEAKEHqQIY7QhQOg2HO0yCAFCD1KEMdoQIHQbjnYZhAChByliwDFCjkTokLUZ+hwBQp8j43lIAoQOWZuhzxEg9DkynockQOiQtRn6HAFCnyNz6bnvhiVA6GGrMdg9BAh9DzW/GZYAoYetxmD3ECD0PdT8ZlgChB62GoPdQ6C10PfM4DcINCNA6GYobTQCAUKP0IIZmhEgdDOUNhqBwA8AAAD//xJjf0UAAAAGSURBVAMA8iYCzXEuU58AAAAASUVORK5CYII=";
|
|
15944
15938
|
|
|
15939
|
+
// src/assets/qoder-agent.svg
|
|
15940
|
+
var qoder_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="206" height="206" fill="none" viewBox="0 0 206 206"><rect width="206" height="206" fill="%23f3f3f3" rx="52"/><path fill="%230f0d0c" fill-rule="evenodd" d="M104.003 35.836q.178.08.305.145.4.2.629.321l49.944 26.33.019.01q.139.073.273.155 8.37 4.521 12.99 13.05 4.587 8.466 4.587 19.301v22.489q0 .238-.022.474v40.14q0 7.99-6.72 12.312-6.719 4.323-13.987 1.01l-8.542-3.891-.03.017-.17.097-.12.071q-.849.502-1.319.758-.077.043-.308.165l-.106.056-.252.133q-.622.337-1.213.631l-.619.301-.15.071a79 79 0 0 1-1.167.542l-.773.336q-.387.17-1.115.46l-.135.054-.11.046-.167.068a13 13 0 0 1-.588.228q-.398.146-1.256.444l-.002.001-.164.058q-.249.091-.55.188-.89.294-2.014.605l-3.505.961q-.975.27-1.813.459l-.396.083-.398.081q-.564.12-.9.186a11 11 0 0 1-.52.092l-.509.082-.066.011q-.472.08-.74.118-.189.029-.577.074l-.396.05-.657.076q-.221.025-.494.045l-.114.011-.051.004a42 42 0 0 1-1.407.098l.037-.004q-.223.02-.447.02h-.061q-.6.028-1.016.028h-.666l-.111-.001-.222-.003a24 24 0 0 1-1.27-.049l-.028-.002-.17-.006-.381-.019q-.092-.005-.185-.013l-.7-.062q-.66-.063-1.264-.142l-.199-.024q-.065-.007-.129-.017a50 50 0 0 1-1.393-.228l-.502-.094-.03-.006a12 12 0 0 1-.601-.123l-.046-.011-.066-.015-.121-.028a31 31 0 0 1-1.381-.343l-.027-.007a10 10 0 0 1-.428-.113h-.001a31 31 0 0 1-1.737-.547 5 5 0 0 1-.459-.168l-.12-.046a39 39 0 0 1-1.209-.472 11 11 0 0 1-.333-.144l-.087-.038-.171-.074a29 29 0 0 1-1.098-.502l-.08-.038-.015-.007a6 6 0 0 1-.251-.12q-.104-.052-.209-.107l-.062-.032a5 5 0 0 1-.357-.17l-.003-.001-49.452-26.07a5 5 0 0 1-.972-.517 31 31 0 0 1-6.12-4.384l-.003-.003-.011-.011-.045-.04a32 32 0 0 1-2.374-2.438l-.022-.026-.005-.006a36 36 0 0 1-1.448-1.788q-7.307-9.666-7.307-23.449V90.495q0-.996.043-2.303a20 20 0 0 1 .06-.904q.05-.84.119-1.563a19 19 0 0 1 .11-.975l.035-.301q.083-.72.14-1.117a57 57 0 0 1 .167-1.031l.038-.234q.115-.71.192-1.108v-.005l-.003.017q.023-.15.044-.258a49 49 0 0 1 .389-1.818q.18-.803.45-1.817.051-.2.132-.493l.023-.08a75 75 0 0 1 .604-2.032q.047-.15.12-.356l.012-.032q.359-1.105.677-1.972a35 35 0 0 1 .313-.821l.08-.21q.333-.864.526-1.323l-.004.007q.056-.147.107-.266a16 16 0 0 1 .31-.713q.327-.75.5-1.132a55 55 0 0 1 .668-1.404q.244-.502.382-.772l.032-.065q.075-.157.136-.278a15 15 0 0 1 .36-.676l.137-.257a58 58 0 0 1 .995-1.79 30 30 0 0 1 .642-1.095l-.004.005.007-.011-.007.011q.078-.137.131-.227.155-.257.429-.682.27-.44.588-.93.231-.356.671-1.004l.314-.456.297-.43.063-.09v-.002q.12-.18.211-.306.09-.128.296-.403l.13-.174q.471-.645.726-.979l.357-.456.331-.424a36 36 0 0 1 .837-1.05 17 17 0 0 1 .63-.75l.327-.378q.358-.417.556-.64l.696-.767a74 74 0 0 1 1.015-1.086l.011-.015a11 11 0 0 1 .54-.555l.104-.102a78 78 0 0 1 1.898-1.84 50 50 0 0 1 1.59-1.424l-.011.008q.148-.137.256-.232a5 5 0 0 1 .275-.223l.027-.02.017-.014a77 77 0 0 1 1.496-1.217q.303-.24.475-.37a83 83 0 0 1 1.224-.92q.126-.088.424-.306.585-.423 1.403-.976l-.002.001.045-.032a13 13 0 0 1 .466-.315q.992-.647 1.703-1.075.141-.088.456-.268l.103-.061a47 47 0 0 1 1.32-.758l.632-.337.033-.017q.623-.336 1.213-.631.273-.136.774-.374.509-.243 1.163-.539l.415-.182.358-.155q.448-.193 1.248-.514l.225-.088q.365-.143.565-.218a88 88 0 0 1 1.515-.536q.339-.12.556-.19.924-.302 1.993-.6l3.509-.96a37 37 0 0 1 1.807-.46q.248-.057.627-.133.482-.11 1.1-.228a17 17 0 0 1 .743-.126l.298-.05a33 33 0 0 1 .862-.135l.33-.04.331-.04.248-.032q.424-.054.664-.08.165-.016.33-.023l.324-.024q.695-.06 1.128-.081.21-.013.655-.026h.016l.336-.01a23 23 0 0 1 1.147-.017l.185.001.314.005a26 26 0 0 1 1.376.048l.23.013.344.018q.18.01.524.046l.306.027q.609.058 1.245.14l.014.002h.001q.165.018.29.036.642.086 1.428.228.098.018.194.04l.003-.001.303.059q.336.06.554.11.115.024.294.073l.072.016q.328.073.682.162.293.073.6.157l-.004-.002.033.008q.165.04.304.078l.045.013q.09.024.168.049l.012.003a31 31 0 0 1 1.731.553q.2.067.444.166.697.252 1.267.491l.148.064.459.2q.515.23 1.045.485zm-2.971-1.263h-.002q.004 0 .008.002zm3.871 127.988.763.402q.077.042.269.139l.09.046q.1.045.12.057l.136.064q.41.198.771.353l.011.005q.127.053.317.138l.072.032q.341.141.956.372l.05.02.183.068.014.006q.599.21 1.264.398l-.084-.018q.104.023.206.05l.208.054q.52.14 1.057.261l.073.017.072.016.113.026.108.019.031.006.436.082q.536.095 1.052.173l.2.025q.44.057.878.098l.611.055.186.01.376.016.028.002q.261.017.429.023.098.004.368.008l.239.003h.615q.208 0 .643-.021a4 4 0 0 1 .251-.007h.022l.137-.007-.018.003.178-.013q.25-.012.835-.061l.156-.014.154-.012.07-.006.539-.061.504-.064q.204-.024.312-.04a20 20 0 0 0 .618-.099l.402-.066.199-.032-.009.004q.057-.013.116-.024.252-.048.838-.172l.33-.067.255-.053q.608-.138 1.377-.35l3.477-.953a37 37 0 0 0 1.655-.499l.104-.034.127-.047.239-.084h.002q.78-.27 1.191-.421l.146-.059.135-.055.22-.091.141-.056q.579-.231.832-.342l.639-.278q.57-.257.997-.461l.089-.042.509-.247q.458-.228 1.02-.532l.158-.083.218-.116q.096-.049.178-.095.317-.174 1.018-.587l.207-.122.128-.074h.001q.124-.073.226-.13a39 39 0 0 0 1.26-.793l.358-.245a4.95 4.95 0 0 1 4.843-.416l10.977 5.001q2.352 1.073 4.527-.327t2.176-3.986v-40.637q0-.237.022-.474V95.148q0-17.112-12.596-23.755l-.295-.156-.163-.079-.176-.086a19 19 0 0 0-.767-.354q-.265-.12-.385-.168-.35-.148-.871-.337l-.182-.067-.102-.04q-.56-.194-1.217-.383l-.097-.026-.222-.058a38 38 0 0 0-1.026-.253l-.122-.026a31 31 0 0 0-.681-.144l-.118-.023a25 25 0 0 0-1.016-.163 6 6 0 0 1-.225-.027 29 29 0 0 0-.873-.1h-.006l-.327-.03a37 37 0 0 0-1.369-.078q-.12-.008-.523-.008h-.509a44 44 0 0 0-1.116.038l-.18.007q-.256.013-.859.063l-.046.004-.204.014-.135.01a20 20 0 0 0-.454.053 35 35 0 0 1-.636.075l-.206.025q-.145.022-.496.082l-.612.1q-.197.03-.279.046-.171.032-.602.125l-.237.051a22 22 0 0 1-.524.112q-.735.168-1.382.346l-3.476.953a36 36 0 0 0-1.54.46l-.291.102-.355.122a27 27 0 0 0-1.659.61q-.613.242-.941.383l-.648.284-.42.193V91.28q0 1.152-.056 2.307-.01.223-.037.576l-.001.004-.019.28-.001.026a43 43 0 0 1-.113 1.478 25 25 0 0 1-.076.68l-.052.433-.03.249a32 32 0 0 1-.234 1.677l-.056.354v.002q-.138.833-.221 1.265-.19.999-.399 1.935l-.027.11a45 45 0 0 1-.46 1.83l-.141.512a62 62 0 0 1-.542 1.831l-.151.467a54 54 0 0 1-.663 1.928 19 19 0 0 1-.2.526l-.017.042.004-.01-.112.295-.073.188q-.326.841-.495 1.251a27 27 0 0 1-.354.834l-.063.152q-.269.631-.492 1.106-.124.28-.359.772l-.135.283-.098.204a46 46 0 0 1-.971 1.916l-.314.587-.216.397q-.188.339-.563.993l-.076.132a32 32 0 0 1-.507.856q-.284.475-.6.969l-.084.133a42 42 0 0 1-.965 1.488l-.22.327-.021.032-.58.845-.066.092-.58.805a53 53 0 0 1-1.41 1.856l-.212.268q-.316.401-.48.601-.234.29-.674.806l-.04.046-.005.005q-.386.461-.854.988-.237.266-.69.767a46.143 46.143 0 0 1-1.393 1.477l-.219.223a55 55 0 0 1-1.216 1.193l-.18.174-.202.193-.258.247q-.778.722-1.567 1.402l-.099.086-.08.071-.08.072q-.067.06-.137.117l-.198.165a76 76 0 0 1-1.308 1.071l-.006.005q-.134.11-.339.266l-.147.113-.083.063a58 58 0 0 1-1.375 1.031q-.198.147-.307.225-.66.473-1.278.885l-.32.222-.103.07q-.884.584-1.833 1.157l-.009.005q.348 15.759 11.753 22.249zM85.109 152.14q-1.87-5.93-1.874-12.803v-22.492q0-1.2.056-2.394a20 20 0 0 1 .058-.825l.023-.336q.054-.795.098-1.255.019-.19.059-.524.029-.237.047-.42l.036-.309q.084-.721.145-1.146.06-.399.16-.987l.025-.153q.126-.756.202-1.176a50 50 0 0 1 .435-2.086l.011-.046a61 61 0 0 1 .594-2.337q.275-.996.552-1.867l.01-.028q.022-.074.045-.144.054-.17.132-.387l.006-.016q.387-1.18.662-1.928a36 36 0 0 1 .307-.805 52 52 0 0 1 1.037-2.544q.32-.736.5-1.132.162-.36.48-1.016l.003-.01q.271-.57.547-1.11.136-.273.4-.78l.138-.267a54 54 0 0 1 1.136-2.052l.267-.46.298-.51q.215-.36.604-.977.152-.248.443-.703l.177-.278q.228-.352.645-.965.386-.578.667-.969.323-.46.674-.931.465-.637.71-.958.275-.36.721-.922l.345-.434.39-.49q.232-.281.686-.819l.023-.028.204-.239a51 51 0 0 1 1.37-1.552q.31-.343.926-.994.368-.388.717-.737.525-.533 1.23-1.206.44-.428.662-.63a61 61 0 0 1 1.657-1.483l.013-.012.011-.01-.011.01a8 8 0 0 1 .61-.519q.738-.615 1.302-1.06.203-.159.561-.432.655-.507 1.155-.872l.542-.397q.627-.453 1.35-.938l.049-.034q.216-.15.395-.265a59 59 0 0 1 1.883-1.19q.193-.11.295-.171a50 50 0 0 1 1.797-1.02l.208-.11.148-.076a44 44 0 0 1 1.986-1.005q.645-.307 1.169-.545l.754-.331q.534-.23 1.292-.529.481-.192.76-.297.6-.228 1.397-.494l.247-.086.292-.1a49 49 0 0 1 2.128-.645l3.508-.961q.325-.09.667-.178L100.3 45.05a21 21 0 0 0-.393-.201l-.006-.003.007.004a10 10 0 0 1-.29-.137 28 28 0 0 0-1.186-.536l-.002-.001a16 16 0 0 0-.783-.3 7 7 0 0 1-.282-.107l-.036-.013a24 24 0 0 0-1.27-.405l-.086-.023q-.12-.03-.197-.05a19 19 0 0 0-.981-.242 6 6 0 0 1-.354-.085l-.111-.021-.36-.07h-.003l-.182-.035a23 23 0 0 0-.95-.152 9 9 0 0 1-.291-.035q-.405-.052-.83-.093l-.354-.032-.067-.007h-.004l-.103-.01-.207-.011-.344-.019a18 18 0 0 0-.918-.031l-.311-.005h-.146a8 8 0 0 0-.357 0q-.087 0-.354.01-.25.009-.403.012-.29.009-.396.015-.315.017-.895.066l-.284.021-.23.017-.033.003a39 39 0 0 0-.608.077l-.34.04-.262.032-.46.075a64 64 0 0 1-.811.134q-.489.094-.942.196-.327.066-.456.096-.654.149-1.381.351l-3.516.964q-.838.233-1.604.483-.09.03-.25.086l-.276.097q-.762.265-1.128.399l-.385.15-.207.08a44 44 0 0 0-.952.391l-.33.144-.358.156a58 58 0 0 0-.93.432l-.005.002q-.41.195-.594.287-.456.228-.983.512l-.034.018-.595.317a39 39 0 0 0-1.145.664q-.223.128-.268.156a50 50 0 0 0-1.574.997l-.056.04-.174.12a47 47 0 0 0-2.596 1.874q-.14.106-.374.291-.059.046-.088.07-.623.495-1.143.93-.09.079-.264.216a9 9 0 0 1-.21.188 43 43 0 0 0-1.92 1.752q-.45.432-1.045 1.027a22 22 0 0 1-.308.302l-.011.014a12 12 0 0 1-.269.287q-.51.543-.75.806l-.666.734q-.11.125-.411.474l-.466.54a13 13 0 0 0-.433.522q-.323.395-.572.72l-.357.457-.332.424q-.156.204-.557.754l-.206.277-.162.22-.03.045q-.094.14-.169.246l-.275.4-.297.43q-.362.534-.532.796a41 41 0 0 0-.556.88q-.205.317-.282.444l-.02.037q-.117.205-.217.365-.232.385-.415.714a55 55 0 0 0-.87 1.564l-.133.248a19 19 0 0 1-.221.408l-.068.134-.004.01q-.098.205-.173.349-.07.138-.276.563l-.17.348q-.266.552-.384.811a91 91 0 0 0-.435.988q-.044.103-.131.295a8 8 0 0 0-.142.329l-.002.006.008-.018q-.05.13-.087.219-.147.352-.425 1.075l-.086.222-.068.175q-.13.337-.184.482a46 46 0 0 0-.57 1.663l-.07.209a5 5 0 0 1-.098.3q-.155.493-.44 1.494l-.016.053a9 9 0 0 0-.095.36 38 38 0 0 0-.407 1.643l-.008.036q-.135.582-.274 1.29v.005l.003-.018q-.023.15-.044.257-.054.277-.145.844l-.047.283q-.09.54-.138.847-.032.225-.099.802l-.07.586a12 12 0 0 0-.047.422q-.06.62-.101 1.342l-.026.35q-.019.23-.023.307-.034 1.072-.034 1.906v22.489q0 10.089 4.938 16.98.183.257.372.507.45.599 1.037 1.278a22 22 0 0 0 1.648 1.689l.04.037a21.4 21.4 0 0 0 4.484 3.147l.03.015.051.027zm8.026-23.904q.47-.383.73-.601l.197-.164.014-.012.08-.071.173-.153q.705-.608 1.35-1.206l.146-.142.203-.193.15-.146a48 48 0 0 0 1.62-1.612 59 59 0 0 0 1.356-1.483 37 37 0 0 0 .788-.91l.019-.022a29 29 0 0 0 .899-1.097l.232-.293a40 40 0 0 0 1.143-1.505l.562-.78.022-.031.49-.716.002-.003.188-.28q.254-.377.359-.542.16-.245.432-.677l.088-.141a26 26 0 0 0 .564-.911q.104-.166.347-.589l.082-.143q.33-.574.485-.853l.171-.315.279-.523a41 41 0 0 0 .786-1.549l.104-.217.113-.238a37.223 37.223 0 0 0 .679-1.496l.016-.042.149-.347q.131-.303.181-.426.154-.374.439-1.112l.076-.194.081-.217.07-.178.082-.21q.297-.815.567-1.649l.156-.479q.189-.607.426-1.45l.122-.445q.199-.726.36-1.428l.053-.221q.135-.61.296-1.46.064-.33.177-1.021l.001-.002.046-.294.016-.1q.049-.3.065-.418a30 30 0 0 0 .134-1.055l.05-.421q.037-.296.049-.425.04-.385.089-1.179l.002-.027.024-.358.007-.092.015-.195q.047-.981.047-1.896V79.333l-.311.259-.116.094-.117.094-.003.003.012-.009a8 8 0 0 1-.256.227q-.683.59-1.382 1.24-.145.133-.507.483a50 50 0 0 0-3.576 3.782l-.197.231q-.412.488-.551.655l-.345.435-.341.428a53 53 0 0 0-.596.762q-.19.248-.608.82a43 43 0 0 0-1.103 1.563q-.38.56-.525.783l-.164.258q-.247.388-.385.61-.358.57-.484.778l-.267.46-.264.453a47 47 0 0 0-1.392 2.579q-.235.463-.466.947v.002q-.272.565-.387.817a85 85 0 0 0-.799 1.835q-.228.55-.508 1.289l-.066.171q-.13.338-.19.5-.225.614-.6 1.755l-.048.134-.003.001-.035.112-.05.159a40 40 0 0 0-.547 1.889 51 51 0 0 0-.407 1.643l-.004.014a39 39 0 0 0-.314 1.518q-.059.325-.173 1.015l-.028.171q-.088.512-.13.791-.036.254-.103.831l-.03.251q-.018.192-.059.525l-.035.301q-.028.303-.073.97l-.026.366-.022.287q-.018.23-.022.308-.046.959-.046 1.923z" clip-rule="evenodd"/><path stroke="%230f0d0c" stroke-width="3.5" d="m41.782 61.323.004-.005-.07.114q-.34.561-.572.98a55 55 0 0 0-1.133 2.048l-.075.138a15 15 0 0 0-.42.816l-.032.065q-.139.27-.382.772l-.178.365q-.32.665-.49 1.039a100 100 0 0 0-.57 1.289 16 16 0 0 0-.347.822l.004-.008a50 50 0 0 0-.606 1.534l-.06.156q-.17.435-.253.665a54 54 0 0 0-.677 1.972l-.012.032a10 10 0 0 0-.177.536 75 75 0 0 0-.547 1.851l-.023.08q-.081.293-.131.494a47 47 0 0 0-.492 1.99 49 49 0 0 0-.348 1.645q-.02.108-.044.258l.003-.017v.005q-.077.397-.192 1.108l-.038.234a57 57 0 0 0-.167 1.03 42 42 0 0 0-.175 1.419l-.024.19q-.066.536-.086.785a43 43 0 0 0-.118 1.563l-.016.2q-.03.392-.045.704a72 72 0 0 0-.043 2.303v22.488q0 13.783 7.307 23.449l.277.363a36 36 0 0 0 1.176 1.431l.022.026q1.169 1.332 2.374 2.438l.045.04.011.011.004.003a31 31 0 0 0 6.119 4.384q.458.313.972.517l49.452 26.07.003.001q.177.093.357.17l.062.032q.105.055.209.107.112.057.251.12l.015.007.08.038q.606.29 1.098.502l.171.074.087.038q.19.085.333.144.49.203 1.209.472l.12.046q.225.096.459.168a31 31 0 0 0 1.737.547h.001q.235.067.428.113l.027.007q.74.2 1.381.343l.121.028.066.015.046.011q.239.057.601.123l.03.006.502.094q.708.126 1.393.228.065.01.129.017l.199.024q.604.08 1.264.142l.7.062q.093.008.185.013l.381.019.17.006.028.002q.42.026.609.032a24 24 0 0 0 .994.021h.666q.416 0 1.016-.028h.061q.224 0 .447-.02l-.037.004q.163-.007.295-.017a42 42 0 0 0 1.112-.081l.051-.004.114-.011q.273-.02.494-.045l.657-.076.396-.05q.388-.045.577-.074a35 35 0 0 0 .806-.129l.509-.082.062-.01q.26-.042.458-.082.336-.066.9-.186l.398-.081.396-.083a39 39 0 0 0 1.813-.459l3.505-.961q1.123-.31 2.014-.605.301-.097.55-.188l.164-.058.002-.001q.858-.298 1.256-.444.236-.083.588-.228l.167-.068.11-.046.135-.054q.728-.29 1.115-.46l.773-.336a79 79 0 0 0 1.167-.542l.15-.071.619-.301q.59-.294 1.213-.631l.252-.133.106-.056q.231-.121.308-.165.47-.256 1.319-.758l.12-.071.17-.097.03-.017 8.542 3.891q7.268 3.313 13.987-1.01 6.72-4.322 6.72-12.312v-40.14q.022-.236.022-.474V95.148q0-10.834-4.587-19.302-4.62-8.528-12.99-13.049a5 5 0 0 0-.273-.155l-.019-.01-49.944-26.33a30 30 0 0 0-.629-.322 9 9 0 0 0-.305-.144l-.04-.02a39 39 0 0 0-1.504-.684l-.148-.064q-.57-.24-1.267-.491a8 8 0 0 0-.522-.192 31 31 0 0 0-1.653-.527l-.012-.003-.168-.05-.045-.012-.304-.078-.033-.008.005.002a32 32 0 0 0-1.283-.319l-.072-.016a5 5 0 0 0-.294-.073 14 14 0 0 0-.645-.127l-.212-.042h-.003l-.194-.039q-.786-.142-1.427-.228a9 9 0 0 0-.29-.036h-.002l-.014-.002a37 37 0 0 0-1.245-.14l-.306-.027q-.344-.036-.524-.046l-.344-.018-.23-.013a26 26 0 0 0-1.376-.048l-.314-.005-.185-.001a23.248 23.248 0 0 0-1.147.016q-.2.007-.336.01h-.016q-.445.014-.655.027-.433.023-1.128.081l-.325.024a5 5 0 0 0-.33.024 28 28 0 0 0-.911.111l-.33.04-.33.04-.12.016a33 33 0 0 0-.743.12l-.46.075q-.36.057-.58.1-.62.12-1.102.228-.378.075-.626.133a37 37 0 0 0-1.807.46l-3.509.96q-1.069.299-1.993.6-.217.07-.556.19l-.176.062a88 88 0 0 0-1.339.474q-.2.075-.565.218l-.225.089q-.8.32-1.248.513l-.358.155-.415.182a68 68 0 0 0-1.937.913q-.59.295-1.213.63l-.033.018-.632.337a47 47 0 0 0-1.423.82q-.315.18-.456.267a58 58 0 0 0-1.842 1.167q-.137.09-.327.223l-.044.032.001-.001a55 55 0 0 0-1.949 1.37 83 83 0 0 0-1.686 1.288q-.735.585-1.387 1.13l-.017.014-.027.021-.08.063a5 5 0 0 0-.195.16q-.108.094-.256.232l.01-.008-.002.002a50 50 0 0 0-2.254 2.056 78 78 0 0 0-1.335 1.308q-.128.123-.203.2-.144.142-.337.355l-.01.015-.101.103q-.603.639-.915.983l-.696.767q-.198.223-.556.64l-.438.507a22 22 0 0 0-.601.722q-.435.53-.755.949l-.331.424-.357.456q-.255.334-.727.979l-.129.174a18 18 0 0 0-.507.71l-.063.09-.297.43-.314.457q-.44.648-.67 1.004-.318.49-.589.93-.274.424-.429.682-.054.09-.13.227Zm0 0 .007-.011zm62.786 11.145-.013.012q-.87.75-1.657 1.483-.222.203-.662.63a58 58 0 0 0-4.243 4.49l-.203.238-.024.028q-.454.537-.686.819l-.39.49-.345.434q-.446.56-.72.922-.247.322-.711.958a51 51 0 0 0-1.341 1.9q-.417.613-.645.965l-.177.278q-.291.456-.443.703-.389.618-.604.976l-.298.51-.267.46a57 57 0 0 0-1.674 3.1q-.276.54-.547 1.11l-.004.01q-.315.656-.48 1.016a101 101 0 0 0-.937 2.157 52 52 0 0 0-.647 1.64q-.17.438-.259.684a59 59 0 0 0-.662 1.928l-.006.016a13 13 0 0 0-.178.531l-.009.028a49 49 0 0 0-.67 2.306 61 61 0 0 0-.476 1.898l-.01.046q-.025.099-.044.188a50 50 0 0 0-.392 1.898q-.075.42-.202 1.176l-.025.153q-.1.588-.16.987a41 41 0 0 0-.18 1.455l-.048.42a30 30 0 0 0-.06.524 51 51 0 0 0-.12 1.591l-.015.196q-.031.391-.043.629a50 50 0 0 0-.057 2.394v20.581l.001.095v1.816q.003 6.873 1.874 12.803l-29.357-15.476-.052-.027-.03-.015-.047-.025q-.74-.391-1.444-.837a21.4 21.4 0 0 1-2.992-2.285l-.041-.037-.01-.009a21.6 21.6 0 0 1-2.675-2.958q-.189-.25-.372-.507-4.938-6.891-4.938-16.98V90.495q0-.834.034-1.906.004-.077.023-.308l.026-.349q.042-.722.1-1.342.009-.104.049-.422l.07-.586q.066-.578.098-.801.046-.309.138-.848l.047-.283q.091-.567.145-.844.02-.107.044-.257l-.004.018.001-.006q.14-.706.274-1.289l.008-.036.046-.196a38 38 0 0 1 .392-1.567l.064-.24.015-.053a67 67 0 0 1 .457-1.544q.045-.124.082-.25.037-.105.07-.209.312-.96.57-1.663.054-.146.184-.482l.068-.175.086-.222q.278-.723.425-1.075.037-.09.087-.22l-.008.02.002-.007.06-.145.082-.184q.087-.192.131-.295.294-.675.435-.988a45 45 0 0 1 .554-1.16q.206-.424.276-.562.075-.144.173-.348l.004-.011q.035-.066.067-.134l.083-.152.14-.256.132-.248a46 46 0 0 1 .87-1.564q.183-.33.415-.714.1-.16.216-.365l.021-.037a19 19 0 0 1 .342-.539q.225-.365.496-.785.17-.262.532-.796l.297-.43.275-.4q.075-.106.168-.246l.03-.045.163-.22q.136-.18.206-.277.401-.55.557-.754l.332-.424.357-.456q.25-.327.572-.72a17 17 0 0 0 .244-.302 13 13 0 0 1 .309-.36l.346-.4q.3-.35.41-.475l.666-.733q.24-.264.752-.807a12 12 0 0 0 .268-.287l.011-.014.104-.102.204-.2a66 66 0 0 1 1.63-1.582q.553-.52 1.336-1.197.09-.079.209-.188.174-.137.264-.215.52-.435 1.143-.932l.088-.069q.233-.185.374-.29.305-.237.946-.716.202-.142.505-.365.43-.31 1.145-.793l.174-.121.056-.04q.06-.038.12-.08a50 50 0 0 1 1.454-.917q.046-.03.267-.156l.168-.1q.699-.413.978-.564l.596-.317.033-.018q.527-.285.983-.512.184-.092.594-.287l.005-.002q.427-.204.93-.432l.357-.156.331-.144a44 44 0 0 1 1.544-.621 80 80 0 0 1 1.404-.496q.16-.056.25-.086.765-.25 1.604-.483l3.516-.964q.727-.203 1.381-.35.129-.03.456-.097.453-.102.942-.196.05-.01.235-.038a28 28 0 0 0 .577-.096q.304-.052.46-.075l.262-.032.339-.04a45 45 0 0 0 .608-.078l.033-.002.23-.017.284-.021q.58-.05.895-.066.106-.006.396-.015.153-.003.403-.012a13 13 0 0 1 .711-.01h.146l.31.005a20 20 0 0 1 .919.031 22 22 0 0 0 .55.03l.104.01h.004l.067.007.355.032q.423.04.828.093.126.017.293.035a23 23 0 0 1 1.13.187h.004l.133.028.338.063q.207.056.354.085.387.082.981.243l.197.05.086.022q.596.171 1.27.405l.036.013a7 7 0 0 0 .282.108 22 22 0 0 1 .783.299l.002.001.098.042a33 33 0 0 1 1.377.63l-.006-.003.006.003q.264.132.393.2l28.763 15.164q-.342.088-.667.178l-3.508.961q-1.07.297-2.128.644l-.292.101-.247.086a36 36 0 0 0-2.157.791q-.758.299-1.292.529l-.754.331q-.524.238-1.169.545a44.262 44.262 0 0 0-2.134 1.082l-.208.109q-.06.03-.12.062-.148.08-.28.155-.435.236-1.397.803-.102.06-.295.171-.065.037-.129.077a59 59 0 0 0-2.149 1.378l-.049.034q-.723.485-1.35.938l-.542.397q-.5.365-1.155.872-.359.272-.561.432-.564.445-1.302 1.06-.202.16-.341.279a8 8 0 0 0-.269.24Zm0 0 .011-.01zm-3.536-37.895h-.002q.004 0 .008.002zm3.871 127.988.763.402q.077.042.269.139l.09.046q.1.045.12.057l.136.064q.41.198.771.353l.011.005q.127.053.317.138l.072.032q.341.141.956.372l.05.02.183.068.014.006q.599.21 1.264.398l-.084-.018q.104.023.206.05l.208.054q.52.14 1.057.261l.073.017.072.016.113.026.108.019.031.006.436.082q.536.095 1.052.173l.2.025q.44.057.878.098l.611.055.186.01.376.016.028.002q.261.017.429.023.098.004.368.008l.239.003h.615q.208 0 .643-.021a4 4 0 0 1 .251-.007h.022l.137-.007-.018.003.178-.013q.25-.012.835-.061l.156-.014.154-.012.07-.006.539-.061.504-.064q.204-.024.312-.04a20 20 0 0 0 .618-.099l.402-.066.199-.032-.009.004q.057-.013.116-.024.252-.048.838-.172l.33-.067.255-.053q.608-.138 1.377-.35l3.477-.953a37 37 0 0 0 1.655-.499l.104-.034.127-.047.239-.084h.002q.78-.27 1.191-.421l.146-.059.135-.055.22-.091.141-.056q.579-.231.832-.342l.639-.278q.57-.257.997-.461l.089-.042.509-.247q.458-.228 1.02-.532l.158-.083.218-.116q.096-.049.178-.095.317-.174 1.018-.587l.207-.122.128-.074h.001q.124-.073.226-.13a39 39 0 0 0 1.26-.793l.358-.245a4.95 4.95 0 0 1 4.843-.416l10.977 5.001q2.352 1.073 4.527-.327t2.176-3.986v-40.637q0-.237.022-.474V95.148q0-17.112-12.596-23.755l-.295-.156-.163-.079-.176-.086a19 19 0 0 0-.767-.354q-.265-.12-.385-.168-.35-.148-.871-.337l-.182-.067-.102-.04q-.56-.194-1.217-.383l-.097-.026-.222-.058a38 38 0 0 0-1.026-.253l-.122-.026a31 31 0 0 0-.681-.144l-.118-.023a25 25 0 0 0-1.016-.163 6 6 0 0 1-.225-.027 29 29 0 0 0-.873-.1h-.006l-.327-.03a37 37 0 0 0-1.369-.078q-.12-.008-.523-.008h-.509a44 44 0 0 0-1.116.038l-.18.007q-.256.013-.859.063l-.046.004-.204.014-.135.01a20 20 0 0 0-.454.053 35 35 0 0 1-.636.075l-.206.025q-.145.022-.496.082l-.612.1q-.197.03-.279.046-.171.032-.602.125l-.237.051a22 22 0 0 1-.524.112q-.735.168-1.382.346l-3.476.953a36 36 0 0 0-1.54.46l-.291.102-.355.122a27 27 0 0 0-1.659.61q-.613.242-.941.383l-.648.284-.42.193V91.28q0 1.152-.056 2.307-.01.223-.037.576l-.001.004-.019.28-.001.026a43 43 0 0 1-.113 1.478 25 25 0 0 1-.076.68l-.052.433-.03.249a32 32 0 0 1-.234 1.677l-.056.354v.002q-.138.833-.221 1.265-.19.999-.399 1.935l-.027.11a45 45 0 0 1-.46 1.83l-.141.512a62 62 0 0 1-.542 1.831l-.151.467a54 54 0 0 1-.663 1.928 19 19 0 0 1-.2.526l-.017.042.004-.01-.112.295-.073.188q-.326.841-.495 1.251a27 27 0 0 1-.354.834l-.063.152q-.269.631-.492 1.106-.124.28-.359.772l-.135.283-.098.204a46 46 0 0 1-.971 1.916l-.314.587-.216.397q-.188.339-.563.993l-.076.132a32 32 0 0 1-.507.856q-.284.475-.6.969l-.084.133a42 42 0 0 1-.965 1.488l-.22.327-.021.032-.58.845-.066.092-.58.805a53 53 0 0 1-1.41 1.856l-.212.268q-.316.401-.48.601-.234.29-.674.806l-.04.046-.005.005q-.386.461-.854.988-.237.266-.69.767a46.143 46.143 0 0 1-1.393 1.477l-.219.223a55 55 0 0 1-1.216 1.193l-.18.174-.202.193-.258.247q-.778.722-1.567 1.402l-.099.086-.08.071-.08.072q-.067.06-.137.117l-.198.165a76 76 0 0 1-1.308 1.071l-.006.005q-.134.11-.339.266l-.147.113-.083.063a58 58 0 0 1-1.375 1.031q-.198.147-.307.225-.66.473-1.278.885l-.32.222-.103.07q-.884.584-1.833 1.157l-.009.005q.348 15.759 11.753 22.249zm-11.768-34.325q.47-.383.73-.601l.197-.164.014-.012.08-.071.173-.153q.705-.608 1.35-1.206l.146-.142.203-.193.15-.146a48 48 0 0 0 1.62-1.612 59 59 0 0 0 1.356-1.483 37 37 0 0 0 .788-.91l.019-.022a29 29 0 0 0 .899-1.097l.232-.293a40 40 0 0 0 1.143-1.505l.562-.78.022-.031.49-.716.002-.003.188-.28q.254-.377.359-.542.16-.245.432-.677l.088-.141a26 26 0 0 0 .564-.911q.104-.166.347-.589l.082-.143q.33-.574.485-.853l.171-.315.279-.523a41 41 0 0 0 .786-1.549l.104-.217.113-.238a37.223 37.223 0 0 0 .679-1.496l.016-.042.149-.347q.131-.303.181-.426.154-.374.439-1.112l.076-.194.081-.217.07-.178.082-.21q.297-.815.567-1.649l.156-.479q.189-.607.426-1.45l.122-.445q.199-.726.36-1.428l.053-.221q.135-.61.296-1.46.064-.33.177-1.021l.001-.002.046-.294.016-.1q.049-.3.065-.418a30 30 0 0 0 .134-1.055l.05-.421q.037-.296.049-.425.04-.385.089-1.179l.002-.027.024-.358.007-.092.015-.195q.047-.981.047-1.896V79.333l-.311.259-.116.094-.117.094-.003.003.012-.009a8 8 0 0 1-.256.227q-.683.59-1.382 1.24-.145.133-.507.483a50 50 0 0 0-3.576 3.782l-.197.231q-.412.488-.551.655l-.345.435-.341.428a53 53 0 0 0-.596.762q-.19.248-.608.82a43 43 0 0 0-1.103 1.563q-.38.56-.525.783l-.164.258q-.247.388-.385.61-.358.57-.484.778l-.267.46-.264.453a47 47 0 0 0-1.392 2.579q-.235.463-.466.947v.002q-.272.565-.387.817a85 85 0 0 0-.799 1.835 45 45 0 0 0-.508 1.289l-.066.171q-.13.338-.19.5-.225.614-.6 1.755l-.048.134-.003.001-.035.112-.05.159a40 40 0 0 0-.547 1.889 51 51 0 0 0-.407 1.643l-.004.014a39 39 0 0 0-.314 1.518q-.059.325-.173 1.015l-.028.171q-.088.512-.13.791-.036.254-.103.831l-.03.251q-.018.192-.059.525l-.035.301q-.028.303-.073.97l-.026.366-.022.287q-.018.23-.022.308-.046.959-.046 1.923z"/></svg>';
|
|
15941
|
+
|
|
15945
15942
|
// src/renderer-agent-icon.ts
|
|
15946
15943
|
var RENDERER_AGENT_LABELS = {
|
|
15947
15944
|
codex: "Codex",
|
|
@@ -15955,7 +15952,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15955
15952
|
"kiro-cli": "Kiro CLI",
|
|
15956
15953
|
codebuddy: "CodeBuddy",
|
|
15957
15954
|
"cursor-cli": "Cursor CLI (Experimental)",
|
|
15958
|
-
hermes: "Hermes"
|
|
15955
|
+
hermes: "Hermes",
|
|
15956
|
+
qoder: "Qoder",
|
|
15957
|
+
"qoder-cn": "Qoder CN"
|
|
15959
15958
|
};
|
|
15960
15959
|
var PI_PATHS = [
|
|
15961
15960
|
{
|
|
@@ -16057,6 +16056,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16057
16056
|
image.style.flex = "none";
|
|
16058
16057
|
return image;
|
|
16059
16058
|
}
|
|
16059
|
+
if (agent === "qoder" || agent === "qoder-cn") {
|
|
16060
|
+
const image = ownerDocument.createElement("img");
|
|
16061
|
+
image.src = qoder_agent_default;
|
|
16062
|
+
image.alt = "";
|
|
16063
|
+
image.draggable = false;
|
|
16064
|
+
image.style.width = `${size}px`;
|
|
16065
|
+
image.style.height = `${size}px`;
|
|
16066
|
+
image.style.objectFit = "contain";
|
|
16067
|
+
image.style.flex = "none";
|
|
16068
|
+
return image;
|
|
16069
|
+
}
|
|
16060
16070
|
const mark = ownerDocument.createElement("img");
|
|
16061
16071
|
mark.src = grok_agent_default;
|
|
16062
16072
|
mark.alt = "";
|
|
@@ -16488,7 +16498,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16488
16498
|
"kiro-cli": "https://kiro.dev/docs/cli/",
|
|
16489
16499
|
codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
|
|
16490
16500
|
"cursor-cli": "https://cursor.com/docs/cli/installation",
|
|
16491
|
-
hermes: "https://hermes-agent.nousresearch.com/docs"
|
|
16501
|
+
hermes: "https://hermes-agent.nousresearch.com/docs",
|
|
16502
|
+
qoder: "https://docs.qoder.com/",
|
|
16503
|
+
"qoder-cn": "https://docs.qoder.cn/"
|
|
16492
16504
|
});
|
|
16493
16505
|
function connectionStatusLabel(availability, messages, hasError = false) {
|
|
16494
16506
|
if (hasError && availability !== "notInstalled") return messages.connectionStatusError;
|
|
@@ -17266,9 +17278,53 @@ ${error51.stderrTail}`] : []
|
|
|
17266
17278
|
sectionsLabel: "Settings sections",
|
|
17267
17279
|
generalSection: "General",
|
|
17268
17280
|
otherSection: "Other",
|
|
17269
|
-
appearanceDescription: "
|
|
17281
|
+
appearanceDescription: "Conversation display and local resource management.",
|
|
17282
|
+
appearanceGroup: "Appearance",
|
|
17283
|
+
loadedSessions: {
|
|
17284
|
+
title: "Loaded sessions",
|
|
17285
|
+
description: "Local external Harnesses only. Refreshes every 10 seconds without waking sessions or resetting activity. Released sessions disappear from this list.",
|
|
17286
|
+
columns: ["Session", "Harness", "State", "Since last activity", "Release constraint"],
|
|
17287
|
+
empty: "No loaded external sessions.",
|
|
17288
|
+
failed: "Could not load session status.",
|
|
17289
|
+
unavailable: "Local Host does not support session status or is unavailable.",
|
|
17290
|
+
loading: "Loading session status\u2026",
|
|
17291
|
+
minutes: "{minutes} min",
|
|
17292
|
+
states: {
|
|
17293
|
+
idle: "Idle",
|
|
17294
|
+
running: "Running",
|
|
17295
|
+
busy: "Busy",
|
|
17296
|
+
closing: "Releasing",
|
|
17297
|
+
failed: "Release failed",
|
|
17298
|
+
blocked: "Blocked"
|
|
17299
|
+
},
|
|
17300
|
+
reasons: {
|
|
17301
|
+
none: "\u2014",
|
|
17302
|
+
disabled: "Automatic release is off",
|
|
17303
|
+
timeout: "Timeout not reached",
|
|
17304
|
+
operation: "Turn or Host operation in progress",
|
|
17305
|
+
background: "Subagent, steering, command or interaction pending",
|
|
17306
|
+
identity: "Session identity unavailable or snapshot-only session",
|
|
17307
|
+
persistence: "Persistence or output error",
|
|
17308
|
+
closeFailed: "Restart Desktop before retrying"
|
|
17309
|
+
}
|
|
17310
|
+
},
|
|
17311
|
+
idleReleaseSection: "Resource management",
|
|
17312
|
+
idleReleaseTitle: "Release idle sessions",
|
|
17313
|
+
idleReleaseDescription: "Close background instances after the idle timeout; they resume on next use.",
|
|
17314
|
+
idleReleaseHelpLabel: "About releasing idle sessions",
|
|
17315
|
+
idleReleaseHelp: Object.freeze([
|
|
17316
|
+
"After an Agent finishes replying, its background process may continue running and using memory. Keeping more sessions open may increase resource usage.",
|
|
17317
|
+
"When enabled, codexhost periodically checks sessions and closes background instances once the idle timeout is reached and no tasks or interactions are pending, reducing resource usage. Chat history is not deleted. Opening the session again or sending a message restarts the process."
|
|
17318
|
+
]),
|
|
17319
|
+
idleReleaseTimeout: "Idle timeout",
|
|
17320
|
+
idleReleaseTimeoutDescription: "5\u20131440 minutes.",
|
|
17321
|
+
idleReleaseMinutes: "min",
|
|
17322
|
+
idleReleaseInvalid: "Enter a whole number from 5 to 1440.",
|
|
17323
|
+
idleReleasePending: "Syncing\u2026",
|
|
17324
|
+
idleReleaseUnavailable: "Not supported by this Host",
|
|
17325
|
+
idleReleaseFailed: "Sync failed, try again",
|
|
17270
17326
|
reasoningSoftWrapTitle: "Wrap thinking text",
|
|
17271
|
-
reasoningSoftWrapDescription: "Wrap long
|
|
17327
|
+
reasoningSoftWrapDescription: "Wrap long lines in thinking blocks. Shell output is unaffected.",
|
|
17272
17328
|
pageUnavailable: "Page unavailable",
|
|
17273
17329
|
inDevelopment: "In development",
|
|
17274
17330
|
notAvailable: "Not available",
|
|
@@ -17293,7 +17349,6 @@ ${error51.stderrTail}`] : []
|
|
|
17293
17349
|
sessionImportUpdatedAt: "Updated",
|
|
17294
17350
|
sessionImportSessionId: "Session ID",
|
|
17295
17351
|
sessionImportRunning: "Running",
|
|
17296
|
-
sessionImportRunningUnknown: "Activity unknown",
|
|
17297
17352
|
sessionImportRunningHint: "Close this session in its native client before importing, then refresh.",
|
|
17298
17353
|
sessionImportAction: "Import and open",
|
|
17299
17354
|
sessionImportImporting: "Importing...",
|
|
@@ -17307,15 +17362,13 @@ ${error51.stderrTail}`] : []
|
|
|
17307
17362
|
connectionsDescription: "View runtime status by Host. Select an item to inspect details or complete its setup.",
|
|
17308
17363
|
accountConnected: "Accounts",
|
|
17309
17364
|
accountDefaultBadge: "Current",
|
|
17310
|
-
accountAdd: "Add Codex account",
|
|
17311
17365
|
accountColumnAccount: "Account",
|
|
17312
17366
|
accountColumnActions: "Manage",
|
|
17313
17367
|
accountSearch: "Search accounts or Agents\u2026",
|
|
17314
|
-
accountEmpty: "No
|
|
17368
|
+
accountEmpty: "No current identities found. Sign in through Codex Desktop or your Harness's native client.",
|
|
17315
17369
|
accountNoMatches: "No matching accounts.",
|
|
17316
17370
|
accountNativeManaged: "Native management",
|
|
17317
17371
|
accountNativeManagementHint: "This account comes from {harness}'s native authentication. This page only displays identity and limits; manage sign-in, sign-out and switching in the native client.",
|
|
17318
|
-
accountMore: "Codex account actions",
|
|
17319
17372
|
accountDetailsClose: "Close account details",
|
|
17320
17373
|
accountDefaultHint: "This is the current identity for all Codex Threads.",
|
|
17321
17374
|
accountCreditsRemaining: "Remaining",
|
|
@@ -17324,34 +17377,6 @@ ${error51.stderrTail}`] : []
|
|
|
17324
17377
|
accountCreditsFailed: "Could not load limits",
|
|
17325
17378
|
accountCreditsRetry: "Retry",
|
|
17326
17379
|
accountCreditsRefresh: "Refresh limits",
|
|
17327
|
-
accountDelete: "Delete",
|
|
17328
|
-
accountDeleteConfirm: "Delete this Account and its local data? This cannot be undone.",
|
|
17329
|
-
accountDeleting: "Deleting Account...",
|
|
17330
|
-
accountDeleteFailed: "Could not delete the Account.",
|
|
17331
|
-
accountUse: "Switch",
|
|
17332
|
-
accountLogout: "Sign out",
|
|
17333
|
-
accountLogoutConfirm: "Sign out the current Codex identity? Saved Accounts are retained.",
|
|
17334
|
-
accountLoggingOut: "Signing out...",
|
|
17335
|
-
accountLoggedOut: "Signed out. Saved Accounts are retained.",
|
|
17336
|
-
accountLogoutFailed: "Could not sign out the current Codex identity.",
|
|
17337
|
-
accountRecover: "Recover",
|
|
17338
|
-
accountRecovering: "Recovering Codex...",
|
|
17339
|
-
accountRecoveryRequired: "Codex Account recovery is required before work can continue.",
|
|
17340
|
-
accountLegacyCompatibility: "Native compatibility mode: Codex uses the existing official home. Account management is disabled. Other account homes and their history have not been merged; use the previous version to access them. No source data was migrated or deleted.",
|
|
17341
|
-
accountMigrationRequired: "Legacy Codex data requires migration before this layout can be used. Your data is preserved; use the previous version to access it. This is not a sign-in request.",
|
|
17342
|
-
accountCleanupRequired: "Account saved. Temporary file cleanup is incomplete.",
|
|
17343
|
-
accountSavedUnavailable: "Account saved. Codex is not ready yet.",
|
|
17344
|
-
accountRetryCleanup: "Retry cleanup",
|
|
17345
|
-
accountCleaningUp: "Retrying cleanup...",
|
|
17346
|
-
accountSignIn: "Sign in",
|
|
17347
|
-
accountSigningIn: "Starting device sign-in...",
|
|
17348
|
-
accountVerificationDescription: "Open the verification page and enter this one-time code:",
|
|
17349
|
-
accountCopyCode: "Copy code",
|
|
17350
|
-
accountCopied: "Copied",
|
|
17351
|
-
accountLoginCancel: "Cancel sign-in",
|
|
17352
|
-
accountLoginSucceeded: "Sign-in completed.",
|
|
17353
|
-
accountLoginResultUnconfirmed: "Sign-in finished, but its result was not received. Inspect the saved Account state.",
|
|
17354
|
-
accountLoginFailed: "Sign-in failed.",
|
|
17355
17380
|
accountLoadFailed: "Could not load Codex Accounts.",
|
|
17356
17381
|
accountCreditsUsed: "Used",
|
|
17357
17382
|
accountCreditsResetAt: "Quota resets: {time}",
|
|
@@ -17365,14 +17390,6 @@ ${error51.stderrTail}`] : []
|
|
|
17365
17390
|
accountCreditsPeriodUnknown: "Limit",
|
|
17366
17391
|
accountCreditsBuild: "Build",
|
|
17367
17392
|
accountResetCredits: "Reset cards",
|
|
17368
|
-
accountResetCreditsUse: "Use reset",
|
|
17369
|
-
accountResetCreditsConfirm: "This uses 1 reset card and resets both the 5-hour and 7-day limits. This cannot be undone.",
|
|
17370
|
-
accountResetCreditsUsing: "Using reset card...",
|
|
17371
|
-
accountResetCreditsFailed: "Could not use the reset card.",
|
|
17372
|
-
accountResetCreditsNothingToReset: "Usage does not need a reset right now.",
|
|
17373
|
-
accountResetCreditsNoCredit: "No reset cards are available.",
|
|
17374
|
-
accountResetCreditsAlreadyRedeemed: "That reset card was already used.",
|
|
17375
|
-
accountResetCreditsSucceeded: "Limits were reset.",
|
|
17376
17393
|
accountResetCreditsDetails: "Reset card details",
|
|
17377
17394
|
accountResetCreditsCardExpiry: "Card {index} \xB7 expires {time}",
|
|
17378
17395
|
connectionAdapter: "Renderer adapter",
|
|
@@ -17473,7 +17490,7 @@ ${error51.stderrTail}`] : []
|
|
|
17473
17490
|
aboutRepository: "Open-source repository",
|
|
17474
17491
|
pageLabels: Object.freeze({
|
|
17475
17492
|
connections: "Connections",
|
|
17476
|
-
appearance: "
|
|
17493
|
+
appearance: "General",
|
|
17477
17494
|
accounts: "Accounts",
|
|
17478
17495
|
"session-import": "Session Import",
|
|
17479
17496
|
updates: "Updates",
|
|
@@ -17488,9 +17505,53 @@ ${error51.stderrTail}`] : []
|
|
|
17488
17505
|
sectionsLabel: "\u8BBE\u7F6E\u5206\u7C7B",
|
|
17489
17506
|
generalSection: "\u901A\u7528",
|
|
17490
17507
|
otherSection: "\u5176\u4ED6",
|
|
17491
|
-
appearanceDescription: "\
|
|
17508
|
+
appearanceDescription: "\u4F1A\u8BDD\u663E\u793A\u4E0E\u672C\u5730\u8D44\u6E90\u7BA1\u7406\u3002",
|
|
17509
|
+
appearanceGroup: "\u5916\u89C2",
|
|
17510
|
+
loadedSessions: {
|
|
17511
|
+
title: "\u5DF2\u52A0\u8F7D\u4F1A\u8BDD",
|
|
17512
|
+
description: "\u4EC5\u663E\u793A\u672C\u5730\u5916\u90E8 Harness\u3002\u6BCF 10 \u79D2\u5237\u65B0\uFF0C\u4E0D\u5524\u9192\u4F1A\u8BDD\u3001\u4E0D\u91CD\u7F6E\u6D3B\u52A8\u65F6\u95F4\u3002\u91CA\u653E\u540E\u7684\u4F1A\u8BDD\u4ECE\u5217\u8868\u79FB\u9664\u3002",
|
|
17513
|
+
columns: ["\u4F1A\u8BDD", "Harness", "\u72B6\u6001", "\u8DDD\u6700\u540E\u6D3B\u52A8", "\u6682\u4E0D\u80FD\u91CA\u653E\u7684\u539F\u56E0"],
|
|
17514
|
+
empty: "\u6682\u65E0\u5DF2\u52A0\u8F7D\u7684\u5916\u90E8\u4F1A\u8BDD\u3002",
|
|
17515
|
+
failed: "\u65E0\u6CD5\u52A0\u8F7D\u4F1A\u8BDD\u72B6\u6001\u3002",
|
|
17516
|
+
unavailable: "\u672C\u5730 Host \u4E0D\u652F\u6301\u4F1A\u8BDD\u72B6\u6001\u67E5\u8BE2\u6216\u5F53\u524D\u4E0D\u53EF\u7528\u3002",
|
|
17517
|
+
loading: "\u6B63\u5728\u52A0\u8F7D\u4F1A\u8BDD\u72B6\u6001\u2026",
|
|
17518
|
+
minutes: "{minutes} \u5206\u949F",
|
|
17519
|
+
states: {
|
|
17520
|
+
idle: "\u7A7A\u95F2",
|
|
17521
|
+
running: "\u6267\u884C\u4E2D",
|
|
17522
|
+
busy: "\u5FD9\u788C",
|
|
17523
|
+
closing: "\u91CA\u653E\u4E2D",
|
|
17524
|
+
failed: "\u91CA\u653E\u5931\u8D25",
|
|
17525
|
+
blocked: "\u4E0D\u53EF\u91CA\u653E"
|
|
17526
|
+
},
|
|
17527
|
+
reasons: {
|
|
17528
|
+
none: "\u2014",
|
|
17529
|
+
disabled: "\u81EA\u52A8\u91CA\u653E\u5DF2\u5173\u95ED",
|
|
17530
|
+
timeout: "\u5C1A\u672A\u8FBE\u5230\u8D85\u65F6",
|
|
17531
|
+
operation: "\u4EFB\u52A1\u6216 Host \u64CD\u4F5C\u5C1A\u672A\u7ED3\u675F",
|
|
17532
|
+
background: "\u5B58\u5728\u5B50\u4EFB\u52A1\u3001\u8F6C\u5411\u3001\u547D\u4EE4\u6216\u5F85\u5904\u7406\u4EA4\u4E92",
|
|
17533
|
+
identity: "\u7F3A\u5C11\u53EF\u6062\u590D\u8EAB\u4EFD\u6216\u4EC5\u6709\u5FEB\u7167",
|
|
17534
|
+
persistence: "\u6301\u4E45\u5316\u6216\u8F93\u51FA\u5F02\u5E38",
|
|
17535
|
+
closeFailed: "\u9700\u91CD\u542F Desktop \u540E\u91CD\u8BD5"
|
|
17536
|
+
}
|
|
17537
|
+
},
|
|
17538
|
+
idleReleaseSection: "\u8D44\u6E90\u7BA1\u7406",
|
|
17539
|
+
idleReleaseTitle: "\u81EA\u52A8\u91CA\u653E\u7A7A\u95F2\u4F1A\u8BDD",
|
|
17540
|
+
idleReleaseDescription: "\u7A7A\u95F2\u8D85\u65F6\u540E\u5173\u95ED\u540E\u53F0\u5B9E\u4F8B\uFF0C\u518D\u6B21\u4F7F\u7528\u65F6\u81EA\u52A8\u6062\u590D\u3002",
|
|
17541
|
+
idleReleaseHelpLabel: "\u81EA\u52A8\u91CA\u653E\u7A7A\u95F2\u4F1A\u8BDD\u8BF4\u660E",
|
|
17542
|
+
idleReleaseHelp: Object.freeze([
|
|
17543
|
+
"Agent \u56DE\u590D\u7ED3\u675F\u540E\uFF0C\u540E\u53F0\u8FDB\u7A0B\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\u5E76\u5360\u7528\u5185\u5B58\u3002\u6253\u5F00\u7684\u4F1A\u8BDD\u8D8A\u591A\uFF0C\u8D44\u6E90\u5360\u7528\u53EF\u80FD\u8D8A\u5927\u3002",
|
|
17544
|
+
"\u5F00\u542F\u540E\uFF0Ccodexhost \u4F1A\u5B9A\u671F\u68C0\u67E5\uFF0C\u5728\u4F1A\u8BDD\u7A7A\u95F2\u8FBE\u5230\u8BBE\u5B9A\u65F6\u95F4\u3001\u4E14\u6CA1\u6709\u4EFB\u52A1\u6216\u5F85\u5904\u7406\u4EA4\u4E92\u65F6\uFF0C\u81EA\u52A8\u5173\u95ED\u540E\u53F0\u5B9E\u4F8B\uFF0C\u51CF\u5C11\u8D44\u6E90\u5360\u7528\u3002\u804A\u5929\u8BB0\u5F55\u4E0D\u4F1A\u5220\u9664\uFF0C\u518D\u6B21\u6253\u5F00\u6216\u53D1\u9001\u6D88\u606F\u65F6\u4F1A\u91CD\u65B0\u542F\u52A8\u8BE5\u8FDB\u7A0B\u3002"
|
|
17545
|
+
]),
|
|
17546
|
+
idleReleaseTimeout: "\u7A7A\u95F2\u8D85\u65F6",
|
|
17547
|
+
idleReleaseTimeoutDescription: "5\uFF5E1440 \u5206\u949F\u3002",
|
|
17548
|
+
idleReleaseMinutes: "\u5206\u949F",
|
|
17549
|
+
idleReleaseInvalid: "\u8BF7\u8F93\u5165 5\uFF5E1440 \u4E4B\u95F4\u7684\u6574\u6570\u3002",
|
|
17550
|
+
idleReleasePending: "\u540C\u6B65\u4E2D\u2026",
|
|
17551
|
+
idleReleaseUnavailable: "\u5F53\u524D Host \u4E0D\u652F\u6301",
|
|
17552
|
+
idleReleaseFailed: "\u540C\u6B65\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",
|
|
17492
17553
|
reasoningSoftWrapTitle: "\u6362\u884C\u663E\u793A\u601D\u8003\u6587\u672C",
|
|
17493
|
-
reasoningSoftWrapDescription: "\
|
|
17554
|
+
reasoningSoftWrapDescription: "\u601D\u8003\u5757\u4E2D\u7684\u957F\u884C\u81EA\u52A8\u6362\u884C\uFF0C\u4E0D\u5F71\u54CD Shell \u8F93\u51FA\u3002",
|
|
17494
17555
|
pageUnavailable: "\u9875\u9762\u4E0D\u53EF\u7528",
|
|
17495
17556
|
inDevelopment: "\u5F00\u53D1\u4E2D",
|
|
17496
17557
|
notAvailable: "\u6682\u4E0D\u53EF\u7528",
|
|
@@ -17515,7 +17576,6 @@ ${error51.stderrTail}`] : []
|
|
|
17515
17576
|
sessionImportUpdatedAt: "\u66F4\u65B0\u65F6\u95F4",
|
|
17516
17577
|
sessionImportSessionId: "\u4F1A\u8BDD ID",
|
|
17517
17578
|
sessionImportRunning: "\u8FD0\u884C\u4E2D",
|
|
17518
|
-
sessionImportRunningUnknown: "\u8FD0\u884C\u72B6\u6001\u672A\u77E5",
|
|
17519
17579
|
sessionImportRunningHint: "\u8BF7\u5148\u5728\u539F\u751F\u5BA2\u6237\u7AEF\u5173\u95ED\u8BE5\u4F1A\u8BDD\uFF0C\u518D\u5237\u65B0\u5E76\u5BFC\u5165\u3002",
|
|
17520
17580
|
sessionImportAction: "\u5BFC\u5165\u5E76\u6253\u5F00",
|
|
17521
17581
|
sessionImportImporting: "\u6B63\u5728\u5BFC\u5165\u2026\u2026",
|
|
@@ -17529,15 +17589,13 @@ ${error51.stderrTail}`] : []
|
|
|
17529
17589
|
connectionsDescription: "\u6309 Host \u67E5\u770B\u8FD0\u884C\u65F6\u72B6\u6001\u3002\u9009\u62E9\u4E00\u9879\uFF0C\u5728\u53F3\u4FA7\u68C0\u67E5\u8BE6\u60C5\u6216\u5B8C\u6210\u914D\u7F6E\u3002",
|
|
17530
17590
|
accountConnected: "\u8D26\u53F7",
|
|
17531
17591
|
accountDefaultBadge: "\u5F53\u524D",
|
|
17532
|
-
accountAdd: "\u6DFB\u52A0 Codex \u8D26\u53F7",
|
|
17533
17592
|
accountColumnAccount: "\u8D26\u53F7",
|
|
17534
17593
|
accountColumnActions: "\u7BA1\u7406",
|
|
17535
17594
|
accountSearch: "\u641C\u7D22\u8D26\u53F7\u6216 Agent\u2026",
|
|
17536
|
-
accountEmpty: "\
|
|
17595
|
+
accountEmpty: "\u5C1A\u672A\u8BC6\u522B\u5230\u5F53\u524D\u8EAB\u4EFD\uFF0C\u8BF7\u5728 Codex Desktop \u6216\u5BF9\u5E94 Harness \u7684\u539F\u751F\u5BA2\u6237\u7AEF\u767B\u5F55\u3002",
|
|
17537
17596
|
accountNoMatches: "\u6CA1\u6709\u5339\u914D\u7684\u8D26\u53F7\u3002",
|
|
17538
17597
|
accountNativeManaged: "\u539F\u751F\u7BA1\u7406",
|
|
17539
17598
|
accountNativeManagementHint: "\u6B64\u8D26\u53F7\u6765\u81EA {harness} \u7684\u539F\u751F\u767B\u5F55\u3002\u8FD9\u91CC\u53EA\u8BFB\u5C55\u793A\u8EAB\u4EFD\u4E0E\u989D\u5EA6\uFF1B\u767B\u5F55\u3001\u9000\u51FA\u548C\u5207\u6362\u8BF7\u5728\u5176\u539F\u751F\u5BA2\u6237\u7AEF\u4E2D\u5B8C\u6210\u3002",
|
|
17540
|
-
accountMore: "Codex \u8D26\u53F7\u64CD\u4F5C",
|
|
17541
17599
|
accountDetailsClose: "\u5173\u95ED\u8D26\u53F7\u8BE6\u60C5",
|
|
17542
17600
|
accountDefaultHint: "\u6240\u6709 Codex \u4F1A\u8BDD\u5F53\u524D\u4F7F\u7528\u6B64\u8EAB\u4EFD\u3002",
|
|
17543
17601
|
accountCreditsRemaining: "\u5269\u4F59",
|
|
@@ -17546,34 +17604,6 @@ ${error51.stderrTail}`] : []
|
|
|
17546
17604
|
accountCreditsFailed: "\u989D\u5EA6\u8BFB\u53D6\u5931\u8D25",
|
|
17547
17605
|
accountCreditsRetry: "\u91CD\u8BD5",
|
|
17548
17606
|
accountCreditsRefresh: "\u5237\u65B0\u989D\u5EA6",
|
|
17549
|
-
accountDelete: "\u5220\u9664",
|
|
17550
|
-
accountDeleteConfirm: "\u5220\u9664\u6B64\u8D26\u53F7\u53CA\u5176\u672C\u5730\u6570\u636E\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
|
|
17551
|
-
accountDeleting: "\u6B63\u5728\u5220\u9664\u8D26\u53F7...",
|
|
17552
|
-
accountDeleteFailed: "\u5220\u9664\u8D26\u53F7\u5931\u8D25\u3002",
|
|
17553
|
-
accountUse: "\u5207\u6362",
|
|
17554
|
-
accountLogout: "\u9000\u51FA\u767B\u5F55",
|
|
17555
|
-
accountLogoutConfirm: "\u9000\u51FA\u5F53\u524D Codex \u8EAB\u4EFD\uFF1F\u5DF2\u4FDD\u5B58\u7684\u8D26\u53F7\u4F1A\u4FDD\u7559\u3002",
|
|
17556
|
-
accountLoggingOut: "\u6B63\u5728\u9000\u51FA\u767B\u5F55...",
|
|
17557
|
-
accountLoggedOut: "\u5DF2\u9000\u51FA\u767B\u5F55\uFF0C\u4FDD\u5B58\u7684\u8D26\u53F7\u4ECD\u4F1A\u4FDD\u7559\u3002",
|
|
17558
|
-
accountLogoutFailed: "\u65E0\u6CD5\u9000\u51FA\u5F53\u524D Codex \u8EAB\u4EFD\u3002",
|
|
17559
|
-
accountRecover: "\u6062\u590D",
|
|
17560
|
-
accountRecovering: "\u6B63\u5728\u6062\u590D Codex...",
|
|
17561
|
-
accountRecoveryRequired: "\u7EE7\u7EED\u5DE5\u4F5C\u524D\u9700\u8981\u6062\u590D Codex \u8D26\u53F7\u72B6\u6001\u3002",
|
|
17562
|
-
accountLegacyCompatibility: "\u539F\u751F\u517C\u5BB9\u6A21\u5F0F\uFF1A\u7EE7\u7EED\u4F7F\u7528\u539F\u6709\u5B98\u65B9\u76EE\u5F55\uFF0C\u8D26\u53F7\u7BA1\u7406\u6682\u4E0D\u53EF\u7528\u3002\u5176\u4ED6\u8D26\u53F7\u76EE\u5F55\u53CA\u5176\u5386\u53F2\u5C1A\u672A\u5408\u5E76\uFF0C\u8BF7\u4F7F\u7528\u65E7\u7248\u8BBF\u95EE\uFF1B\u6CA1\u6709\u8FC1\u79FB\u6216\u5220\u9664\u539F\u6570\u636E\u3002",
|
|
17563
|
-
accountMigrationRequired: "\u65E7 Codex \u6570\u636E\u5E03\u5C40\u9700\u8981\u8FC1\u79FB\u540E\u624D\u80FD\u4F7F\u7528\u3002\u539F\u6570\u636E\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u4F7F\u7528\u65E7\u7248\u8BBF\u95EE\uFF1B\u8FD9\u4E0D\u662F\u8981\u6C42\u91CD\u65B0\u767B\u5F55\u3002",
|
|
17564
|
-
accountCleanupRequired: "\u8D26\u53F7\u5DF2\u4FDD\u5B58\uFF0C\u4E34\u65F6\u6587\u4EF6\u6E05\u7406\u672A\u5B8C\u6210\u3002",
|
|
17565
|
-
accountSavedUnavailable: "\u8D26\u53F7\u5DF2\u4FDD\u5B58\uFF0CCodex \u5C1A\u672A\u5C31\u7EEA\u3002",
|
|
17566
|
-
accountRetryCleanup: "\u91CD\u8BD5\u6E05\u7406",
|
|
17567
|
-
accountCleaningUp: "\u6B63\u5728\u91CD\u8BD5\u6E05\u7406...",
|
|
17568
|
-
accountSignIn: "\u767B\u5F55",
|
|
17569
|
-
accountSigningIn: "\u6B63\u5728\u542F\u52A8\u8BBE\u5907\u767B\u5F55...",
|
|
17570
|
-
accountVerificationDescription: "\u6253\u5F00\u9A8C\u8BC1\u9875\u9762\u5E76\u8F93\u5165\u4EE5\u4E0B\u4E00\u6B21\u6027\u4EE3\u7801\uFF1A",
|
|
17571
|
-
accountCopyCode: "\u590D\u5236\u4EE3\u7801",
|
|
17572
|
-
accountCopied: "\u5DF2\u590D\u5236",
|
|
17573
|
-
accountLoginCancel: "\u53D6\u6D88\u767B\u5F55",
|
|
17574
|
-
accountLoginSucceeded: "\u767B\u5F55\u6210\u529F\u3002",
|
|
17575
|
-
accountLoginResultUnconfirmed: "\u767B\u5F55\u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u6536\u5230\u7ED3\u679C\u3002\u8BF7\u68C0\u67E5\u5DF2\u4FDD\u5B58\u7684\u8D26\u53F7\u72B6\u6001\u3002",
|
|
17576
|
-
accountLoginFailed: "\u767B\u5F55\u5931\u8D25\u3002",
|
|
17577
17607
|
accountLoadFailed: "\u65E0\u6CD5\u52A0\u8F7D Codex \u8D26\u53F7\u3002",
|
|
17578
17608
|
accountCreditsUsed: "\u5DF2\u7528",
|
|
17579
17609
|
accountCreditsResetAt: "\u989D\u5EA6\u91CD\u7F6E\u65F6\u95F4\uFF1A{time}",
|
|
@@ -17587,14 +17617,6 @@ ${error51.stderrTail}`] : []
|
|
|
17587
17617
|
accountCreditsPeriodUnknown: "\u989D\u5EA6",
|
|
17588
17618
|
accountCreditsBuild: "Build",
|
|
17589
17619
|
accountResetCredits: "\u91CD\u7F6E\u5361",
|
|
17590
|
-
accountResetCreditsUse: "\u4F7F\u7528\u91CD\u7F6E",
|
|
17591
|
-
accountResetCreditsConfirm: "\u5C06\u6D88\u8017 1 \u5F20\u91CD\u7F6E\u5361\uFF0C\u540C\u65F6\u91CD\u7F6E 5 \u5C0F\u65F6\u548C 7 \u5929\u989D\u5EA6\u3002\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
|
|
17592
|
-
accountResetCreditsUsing: "\u6B63\u5728\u4F7F\u7528\u91CD\u7F6E\u5361...",
|
|
17593
|
-
accountResetCreditsFailed: "\u4F7F\u7528\u91CD\u7F6E\u5361\u5931\u8D25\u3002",
|
|
17594
|
-
accountResetCreditsNothingToReset: "\u5F53\u524D\u989D\u5EA6\u4E0D\u9700\u8981\u91CD\u7F6E\u3002",
|
|
17595
|
-
accountResetCreditsNoCredit: "\u6CA1\u6709\u53EF\u7528\u7684\u91CD\u7F6E\u5361\u3002",
|
|
17596
|
-
accountResetCreditsAlreadyRedeemed: "\u8FD9\u5F20\u91CD\u7F6E\u5361\u5DF2\u7ECF\u4F7F\u7528\u8FC7\u3002",
|
|
17597
|
-
accountResetCreditsSucceeded: "\u989D\u5EA6\u5DF2\u91CD\u7F6E\u3002",
|
|
17598
17620
|
accountResetCreditsDetails: "\u91CD\u7F6E\u5361\u8BE6\u60C5",
|
|
17599
17621
|
accountResetCreditsCardExpiry: "\u7B2C {index} \u5F20 \xB7 {time}\u5230\u671F",
|
|
17600
17622
|
connectionAdapter: "Renderer \u9002\u914D\u5668",
|
|
@@ -17695,7 +17717,7 @@ ${error51.stderrTail}`] : []
|
|
|
17695
17717
|
aboutRepository: "\u5F00\u6E90\u4ED3\u5E93",
|
|
17696
17718
|
pageLabels: Object.freeze({
|
|
17697
17719
|
connections: "\u8FDE\u63A5",
|
|
17698
|
-
appearance: "\
|
|
17720
|
+
appearance: "\u901A\u7528",
|
|
17699
17721
|
accounts: "\u8D26\u53F7",
|
|
17700
17722
|
"session-import": "\u4F1A\u8BDD\u5BFC\u5165",
|
|
17701
17723
|
updates: "\u66F4\u65B0",
|
|
@@ -17749,7 +17771,9 @@ ${error51.stderrTail}`] : []
|
|
|
17749
17771
|
"kiro-cli": "https://kiro.dev/docs/cli/",
|
|
17750
17772
|
codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
|
|
17751
17773
|
"cursor-cli": "https://cursor.com/docs/cli/installation",
|
|
17752
|
-
hermes: "https://hermes-agent.nousresearch.com/docs"
|
|
17774
|
+
hermes: "https://hermes-agent.nousresearch.com/docs",
|
|
17775
|
+
qoder: "https://docs.qoder.com/",
|
|
17776
|
+
"qoder-cn": "https://docs.qoder.cn/"
|
|
17753
17777
|
};
|
|
17754
17778
|
var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
|
|
17755
17779
|
var AGENT_MENU_WIDTH = 224;
|
|
@@ -18101,6 +18125,7 @@ ${error51.stderrTail}`] : []
|
|
|
18101
18125
|
cta.style.background = "transparent";
|
|
18102
18126
|
});
|
|
18103
18127
|
cta.addEventListener("click", () => openConnectionsSettings(trigger));
|
|
18128
|
+
let notInstalled = /* @__PURE__ */ new Set();
|
|
18104
18129
|
let mainAgents = [...enabledAgents];
|
|
18105
18130
|
let moreAgents = [];
|
|
18106
18131
|
const regroup = () => {
|
|
@@ -18123,8 +18148,9 @@ ${error51.stderrTail}`] : []
|
|
|
18123
18148
|
seen.add(agent);
|
|
18124
18149
|
nextMain.push(agent);
|
|
18125
18150
|
}
|
|
18126
|
-
|
|
18127
|
-
|
|
18151
|
+
const installationOrder = (a, b) => Number(notInstalled.has(a)) - Number(notInstalled.has(b));
|
|
18152
|
+
mainAgents = nextMain.sort(installationOrder);
|
|
18153
|
+
moreAgents = nextMore.sort(installationOrder);
|
|
18128
18154
|
const mainChildren = [];
|
|
18129
18155
|
for (const agent of mainAgents) {
|
|
18130
18156
|
const row = rowsByAgent.get(agent);
|
|
@@ -18200,6 +18226,18 @@ ${error51.stderrTail}`] : []
|
|
|
18200
18226
|
menu,
|
|
18201
18227
|
agents: [...enabledAgents],
|
|
18202
18228
|
options,
|
|
18229
|
+
updateAvailability(availability) {
|
|
18230
|
+
const next = new Set(
|
|
18231
|
+
enabledAgents.filter(
|
|
18232
|
+
(agent) => agent !== "codex" && availability[agent] === "notInstalled"
|
|
18233
|
+
)
|
|
18234
|
+
);
|
|
18235
|
+
if (next.size === notInstalled.size && [...next].every((agent) => notInstalled.has(agent))) {
|
|
18236
|
+
return;
|
|
18237
|
+
}
|
|
18238
|
+
notInstalled = next;
|
|
18239
|
+
regroup();
|
|
18240
|
+
},
|
|
18203
18241
|
close,
|
|
18204
18242
|
dispose() {
|
|
18205
18243
|
close();
|
|
@@ -18223,6 +18261,7 @@ ${error51.stderrTail}`] : []
|
|
|
18223
18261
|
control.agents,
|
|
18224
18262
|
availability
|
|
18225
18263
|
);
|
|
18264
|
+
control.updateAvailability(availability);
|
|
18226
18265
|
if (control.iconSlot.dataset.agent !== state.agent) {
|
|
18227
18266
|
control.iconSlot.replaceChildren(createRendererAgentIcon(state.agent));
|
|
18228
18267
|
control.iconSlot.dataset.agent = state.agent;
|
|
@@ -18398,6 +18437,103 @@ ${error51.stderrTail}`] : []
|
|
|
18398
18437
|
(ownerDocument.head ?? ownerDocument.documentElement).append(style);
|
|
18399
18438
|
}
|
|
18400
18439
|
|
|
18440
|
+
// src/renderer-model-favorites.ts
|
|
18441
|
+
var STORAGE_KEY = "codexhost.model-favorites.v1";
|
|
18442
|
+
function rendererStorage() {
|
|
18443
|
+
try {
|
|
18444
|
+
return window.localStorage;
|
|
18445
|
+
} catch {
|
|
18446
|
+
return null;
|
|
18447
|
+
}
|
|
18448
|
+
}
|
|
18449
|
+
function readModelFavorites(harnessId, storage = rendererStorage()) {
|
|
18450
|
+
try {
|
|
18451
|
+
const value = JSON.parse(storage?.getItem(`${STORAGE_KEY}:${harnessId}`) ?? "[]");
|
|
18452
|
+
return new Set(
|
|
18453
|
+
Array.isArray(value) ? value.filter((id) => typeof id === "string" && id.length > 0) : []
|
|
18454
|
+
);
|
|
18455
|
+
} catch {
|
|
18456
|
+
return /* @__PURE__ */ new Set();
|
|
18457
|
+
}
|
|
18458
|
+
}
|
|
18459
|
+
function writeModelFavorites(harnessId, favorites, storage = rendererStorage()) {
|
|
18460
|
+
try {
|
|
18461
|
+
storage?.setItem(`${STORAGE_KEY}:${harnessId}`, JSON.stringify([...favorites]));
|
|
18462
|
+
} catch {
|
|
18463
|
+
}
|
|
18464
|
+
}
|
|
18465
|
+
|
|
18466
|
+
// src/renderer-model-option-style.ts
|
|
18467
|
+
var STYLE_ATTRIBUTE2 = "data-codexhost-model-option-style";
|
|
18468
|
+
function ensureModelOptionStyle(ownerDocument) {
|
|
18469
|
+
if (ownerDocument.querySelector(`style[${STYLE_ATTRIBUTE2}]`)) return;
|
|
18470
|
+
const style = ownerDocument.createElement("style");
|
|
18471
|
+
style.setAttribute(STYLE_ATTRIBUTE2, "true");
|
|
18472
|
+
style.textContent = `
|
|
18473
|
+
[data-codexhost-model-row] {
|
|
18474
|
+
display: flex;
|
|
18475
|
+
align-items: center;
|
|
18476
|
+
border-radius: 8px;
|
|
18477
|
+
padding: 0 4px;
|
|
18478
|
+
}
|
|
18479
|
+
[data-codexhost-model-row]:hover,
|
|
18480
|
+
[data-codexhost-model-row]:focus-within {
|
|
18481
|
+
background: var(--color-token-list-hover-background, rgba(127, 127, 127, .07));
|
|
18482
|
+
}
|
|
18483
|
+
[data-codexhost-model-row] > button[data-model-id] {
|
|
18484
|
+
background: transparent;
|
|
18485
|
+
min-height: 36px;
|
|
18486
|
+
}
|
|
18487
|
+
[data-codexhost-model-row] > button[data-favorite-model-id] {
|
|
18488
|
+
display: inline-flex;
|
|
18489
|
+
align-items: center;
|
|
18490
|
+
justify-content: center;
|
|
18491
|
+
flex: none;
|
|
18492
|
+
width: 24px;
|
|
18493
|
+
height: 24px;
|
|
18494
|
+
padding: 4px;
|
|
18495
|
+
border: 0;
|
|
18496
|
+
border-radius: 999px;
|
|
18497
|
+
background: transparent;
|
|
18498
|
+
color: var(--color-token-border, #dcdce2);
|
|
18499
|
+
cursor: pointer;
|
|
18500
|
+
}
|
|
18501
|
+
[data-codexhost-model-row] > button[data-favorite-model-id]:hover {
|
|
18502
|
+
background: var(--color-token-list-hover-background, rgba(127, 127, 127, .09));
|
|
18503
|
+
color: var(--color-token-text-secondary, #85858f);
|
|
18504
|
+
}
|
|
18505
|
+
[data-codexhost-model-row] > button[data-favorite-model-id][aria-pressed="true"] {
|
|
18506
|
+
color: #f59e0b;
|
|
18507
|
+
}
|
|
18508
|
+
[data-codexhost-model-row] button:focus-visible {
|
|
18509
|
+
outline: 2px solid var(--color-token-text-secondary, #85858f);
|
|
18510
|
+
outline-offset: -2px;
|
|
18511
|
+
}
|
|
18512
|
+
[data-favorite-model-id] > svg {
|
|
18513
|
+
width: 16px;
|
|
18514
|
+
height: 16px;
|
|
18515
|
+
fill: none;
|
|
18516
|
+
stroke: currentColor;
|
|
18517
|
+
stroke-width: 2;
|
|
18518
|
+
stroke-linejoin: round;
|
|
18519
|
+
}
|
|
18520
|
+
[data-favorite-model-id][aria-pressed="true"] > svg {
|
|
18521
|
+
fill: currentColor;
|
|
18522
|
+
}
|
|
18523
|
+
`;
|
|
18524
|
+
(ownerDocument.head ?? ownerDocument.documentElement).append(style);
|
|
18525
|
+
}
|
|
18526
|
+
function createModelFavoriteIcon(ownerDocument) {
|
|
18527
|
+
return ownerDocument.adoptNode(
|
|
18528
|
+
createElement(Star, {
|
|
18529
|
+
width: 16,
|
|
18530
|
+
height: 16,
|
|
18531
|
+
"aria-hidden": "true",
|
|
18532
|
+
focusable: "false"
|
|
18533
|
+
})
|
|
18534
|
+
);
|
|
18535
|
+
}
|
|
18536
|
+
|
|
18401
18537
|
// src/renderer-model-picker.ts
|
|
18402
18538
|
var MENU_CLASSES = "fixed z-50 overflow-hidden rounded-xl bg-token-dropdown-background/90 text-token-foreground shadow-lg backdrop-blur-xl";
|
|
18403
18539
|
var SEARCH_INPUT_CLASSES = "mb-1 w-full shrink-0 rounded-lg border border-token-border bg-token-dropdown-background/95 px-2 py-1.5 text-sm text-token-foreground outline-none placeholder:text-token-text-tertiary disabled:cursor-not-allowed disabled:opacity-40";
|
|
@@ -18547,13 +18683,30 @@ ${error51.stderrTail}`] : []
|
|
|
18547
18683
|
let visibleCount = 0;
|
|
18548
18684
|
for (const option of control.options.values()) {
|
|
18549
18685
|
const matches = query.length === 0 || option.searchText.includes(query);
|
|
18550
|
-
option.
|
|
18686
|
+
option.row.hidden = !matches;
|
|
18687
|
+
option.row.style.display = matches ? "flex" : "none";
|
|
18551
18688
|
if (matches) visibleCount += 1;
|
|
18552
18689
|
}
|
|
18553
18690
|
control.searchEmpty.hidden = query.length === 0 || visibleCount > 0;
|
|
18554
18691
|
}
|
|
18692
|
+
function syncFavorite(option, favorite) {
|
|
18693
|
+
option.favorite.setAttribute("aria-pressed", String(favorite));
|
|
18694
|
+
const label = `${favorite ? "Unfavorite" : "Favorite"} ${option.label}`;
|
|
18695
|
+
option.favorite.setAttribute("aria-label", label);
|
|
18696
|
+
option.favorite.title = label;
|
|
18697
|
+
}
|
|
18698
|
+
function orderModelFavorites(control) {
|
|
18699
|
+
for (const favorite of [true, false]) {
|
|
18700
|
+
for (const [id, option] of control.options) {
|
|
18701
|
+
const isFavorite = control.favorites.has(id);
|
|
18702
|
+
syncFavorite(option, isFavorite);
|
|
18703
|
+
if (isFavorite === favorite) control.modelMenu.append(option.row);
|
|
18704
|
+
}
|
|
18705
|
+
}
|
|
18706
|
+
}
|
|
18555
18707
|
function mountRendererModelPicker(composerId, onSelectModel, onSelectThinking) {
|
|
18556
18708
|
ensureRendererTriggerChipStyle(document);
|
|
18709
|
+
ensureModelOptionStyle(document);
|
|
18557
18710
|
const root = document.createElement("div");
|
|
18558
18711
|
root.setAttribute("data-codexhost-model-control", composerId);
|
|
18559
18712
|
root.className = "relative min-w-0";
|
|
@@ -18664,7 +18817,8 @@ ${error51.stderrTail}`] : []
|
|
|
18664
18817
|
const movedToComposer = active === document.body || active instanceof Element && (active.matches('textarea, [contenteditable="true"], [role="textbox"]') || active.closest('textarea, [contenteditable="true"], [role="textbox"]') !== null);
|
|
18665
18818
|
if (!movedToComposer) return;
|
|
18666
18819
|
requestAnimationFrame(() => {
|
|
18667
|
-
if (popoverOpen2(modelMenu) && searchInput.isConnected
|
|
18820
|
+
if (popoverOpen2(modelMenu) && searchInput.isConnected && !modelMenu.contains(document.activeElement))
|
|
18821
|
+
searchInput.focus();
|
|
18668
18822
|
});
|
|
18669
18823
|
};
|
|
18670
18824
|
searchInput.addEventListener("blur", onSearchBlur);
|
|
@@ -18683,6 +18837,9 @@ ${error51.stderrTail}`] : []
|
|
|
18683
18837
|
};
|
|
18684
18838
|
const openModelMenu = (standalone = false) => {
|
|
18685
18839
|
if (!standalone && !popoverOpen2(menu) || popoverOpen2(modelMenu)) return;
|
|
18840
|
+
control.favorites = readModelFavorites(control.harnessId);
|
|
18841
|
+
orderModelFavorites(control);
|
|
18842
|
+
modelMenu.scrollTop = 0;
|
|
18686
18843
|
modelMenu.showPopover();
|
|
18687
18844
|
positionModelMenu(control, standalone);
|
|
18688
18845
|
modelButton.setAttribute("aria-expanded", "true");
|
|
@@ -18726,6 +18883,22 @@ ${error51.stderrTail}`] : []
|
|
|
18726
18883
|
}
|
|
18727
18884
|
};
|
|
18728
18885
|
const onModelMenuClick = (event) => {
|
|
18886
|
+
const favoriteButton = event.target instanceof Element ? event.target.closest("button[data-favorite-model-id]") : null;
|
|
18887
|
+
const favoriteId = favoriteButton?.dataset.favoriteModelId;
|
|
18888
|
+
if (favoriteId) {
|
|
18889
|
+
event.stopPropagation();
|
|
18890
|
+
control.favorites = readModelFavorites(control.harnessId);
|
|
18891
|
+
if (control.favorites.has(favoriteId)) control.favorites.delete(favoriteId);
|
|
18892
|
+
else control.favorites.add(favoriteId);
|
|
18893
|
+
writeModelFavorites(control.harnessId, control.favorites);
|
|
18894
|
+
const focused = document.activeElement;
|
|
18895
|
+
orderModelFavorites(control);
|
|
18896
|
+
if (focused instanceof HTMLElement && modelMenu.contains(focused)) {
|
|
18897
|
+
focused.focus({ preventScroll: true });
|
|
18898
|
+
}
|
|
18899
|
+
modelMenu.scrollTop = 0;
|
|
18900
|
+
return;
|
|
18901
|
+
}
|
|
18729
18902
|
const target = event.target instanceof Element ? event.target.closest("button[data-model-id]") : null;
|
|
18730
18903
|
if (!target?.dataset.modelId) return;
|
|
18731
18904
|
close();
|
|
@@ -18777,6 +18950,8 @@ ${error51.stderrTail}`] : []
|
|
|
18777
18950
|
searchInput,
|
|
18778
18951
|
searchHeader,
|
|
18779
18952
|
searchEmpty,
|
|
18953
|
+
harnessId: "",
|
|
18954
|
+
favorites: /* @__PURE__ */ new Set(),
|
|
18780
18955
|
options,
|
|
18781
18956
|
thinkingOptions,
|
|
18782
18957
|
close,
|
|
@@ -18858,17 +19033,37 @@ ${error51.stderrTail}`] : []
|
|
|
18858
19033
|
text.title = model.label;
|
|
18859
19034
|
const check2 = createCheck();
|
|
18860
19035
|
button.append(text, check2);
|
|
19036
|
+
const row = document.createElement("div");
|
|
19037
|
+
row.setAttribute("role", "presentation");
|
|
19038
|
+
row.dataset.codexhostModelRow = "true";
|
|
19039
|
+
button.style.minWidth = "0";
|
|
19040
|
+
button.style.flex = "1";
|
|
19041
|
+
const favorite = document.createElement("button");
|
|
19042
|
+
favorite.type = "button";
|
|
19043
|
+
favorite.dataset.favoriteModelId = model.ref.id;
|
|
19044
|
+
favorite.append(createModelFavoriteIcon(document));
|
|
19045
|
+
row.append(button, favorite);
|
|
18861
19046
|
control.options.set(model.ref.id, {
|
|
19047
|
+
row,
|
|
19048
|
+
favorite,
|
|
19049
|
+
label: model.label,
|
|
18862
19050
|
button,
|
|
18863
19051
|
check: check2,
|
|
18864
19052
|
searchText: `${model.label} ${model.ref.id}`.toLowerCase()
|
|
18865
19053
|
});
|
|
18866
|
-
control.modelMenu.append(
|
|
19054
|
+
control.modelMenu.append(row);
|
|
18867
19055
|
}
|
|
19056
|
+
orderModelFavorites(control);
|
|
18868
19057
|
applyModelSearchFilter(control);
|
|
18869
19058
|
if (popoverOpen2(control.modelMenu)) control.searchInput.focus();
|
|
18870
19059
|
}
|
|
18871
|
-
function renderRendererModelPicker(control, view, visible) {
|
|
19060
|
+
function renderRendererModelPicker(control, view, visible, harnessId = "") {
|
|
19061
|
+
if (control.harnessId !== harnessId) {
|
|
19062
|
+
control.close();
|
|
19063
|
+
control.harnessId = harnessId;
|
|
19064
|
+
control.favorites = readModelFavorites(harnessId);
|
|
19065
|
+
delete control.root.dataset.catalogSignature;
|
|
19066
|
+
}
|
|
18872
19067
|
control.root.style.display = visible ? "inline-flex" : "none";
|
|
18873
19068
|
control.root.style.alignItems = "center";
|
|
18874
19069
|
control.root.style.alignSelf = "center";
|
|
@@ -20954,7 +21149,7 @@ ${error51.stderrTail}`] : []
|
|
|
20954
21149
|
pickerView.nativeModelHidden,
|
|
20955
21150
|
switching || state.agent !== "codex"
|
|
20956
21151
|
);
|
|
20957
|
-
renderRendererModelPicker(control.modelPicker, modelView, state.agent !== "codex");
|
|
21152
|
+
renderRendererModelPicker(control.modelPicker, modelView, state.agent !== "codex", state.agent);
|
|
20958
21153
|
const permissionModeVisible = state.agent !== "codex" && permissionModeView.status !== "idle" && permissionModeView.status !== "loading" && permissionModeView.status !== "unsupported" && control.nativePermissionModeControlVerified;
|
|
20959
21154
|
renderRendererPermissionModePicker(
|
|
20960
21155
|
control.permissionModePicker,
|
|
@@ -21066,15 +21261,6 @@ ${error51.stderrTail}`] : []
|
|
|
21066
21261
|
phase = "unavailable";
|
|
21067
21262
|
revision = 0;
|
|
21068
21263
|
instanceId;
|
|
21069
|
-
cleanupRequired = false;
|
|
21070
|
-
pendingOperation;
|
|
21071
|
-
capabilities = {
|
|
21072
|
-
manage: false,
|
|
21073
|
-
switch: false,
|
|
21074
|
-
login: false,
|
|
21075
|
-
delete: false
|
|
21076
|
-
};
|
|
21077
|
-
switching = false;
|
|
21078
21264
|
#hasSnapshot = false;
|
|
21079
21265
|
#request = null;
|
|
21080
21266
|
#unsubscribe;
|
|
@@ -21110,10 +21296,6 @@ ${error51.stderrTail}`] : []
|
|
|
21110
21296
|
this.phase = result.phase;
|
|
21111
21297
|
this.revision = result.revision;
|
|
21112
21298
|
this.instanceId = result.instanceId;
|
|
21113
|
-
this.cleanupRequired = result.cleanupRequired ?? false;
|
|
21114
|
-
this.pendingOperation = result.pendingOperation;
|
|
21115
|
-
this.capabilities = result.capabilities;
|
|
21116
|
-
this.switching = result.phase === "changing";
|
|
21117
21299
|
return true;
|
|
21118
21300
|
}
|
|
21119
21301
|
};
|
|
@@ -21197,6 +21379,98 @@ ${error51.stderrTail}`] : []
|
|
|
21197
21379
|
};
|
|
21198
21380
|
}
|
|
21199
21381
|
|
|
21382
|
+
// src/renderer-idle-release-preference.ts
|
|
21383
|
+
var IDLE_RELEASE_STORAGE_KEY = "codexhost.idle-release.v1";
|
|
21384
|
+
var IDLE_RELEASE_CHANGE_EVENT = "codexhost:idle-release-changed";
|
|
21385
|
+
var IDLE_RELEASE_STATUS_EVENT = "codexhost:idle-release-status";
|
|
21386
|
+
function readIdleReleasePreference(owner) {
|
|
21387
|
+
try {
|
|
21388
|
+
const raw = owner.localStorage.getItem(IDLE_RELEASE_STORAGE_KEY);
|
|
21389
|
+
const parsed = idleReleaseSettingsSchema.safeParse(raw ? JSON.parse(raw) : null);
|
|
21390
|
+
if (parsed.success) return parsed.data;
|
|
21391
|
+
} catch {
|
|
21392
|
+
}
|
|
21393
|
+
return { ...DEFAULT_IDLE_RELEASE_SETTINGS };
|
|
21394
|
+
}
|
|
21395
|
+
function writeIdleReleasePreference(owner, value) {
|
|
21396
|
+
const parsed = idleReleaseSettingsSchema.safeParse(value);
|
|
21397
|
+
if (!parsed.success) return false;
|
|
21398
|
+
try {
|
|
21399
|
+
owner.localStorage.setItem(IDLE_RELEASE_STORAGE_KEY, JSON.stringify(parsed.data));
|
|
21400
|
+
} catch {
|
|
21401
|
+
return false;
|
|
21402
|
+
}
|
|
21403
|
+
owner.dispatchEvent(new Event(IDLE_RELEASE_CHANGE_EVENT));
|
|
21404
|
+
return true;
|
|
21405
|
+
}
|
|
21406
|
+
function installIdleReleasePreferenceSync(owner) {
|
|
21407
|
+
let client = null;
|
|
21408
|
+
let disposed = false;
|
|
21409
|
+
let generation = 0;
|
|
21410
|
+
let work = { pending: false, dirty: false };
|
|
21411
|
+
const publish = (value) => {
|
|
21412
|
+
owner.dispatchEvent(new CustomEvent(IDLE_RELEASE_STATUS_EVENT, { detail: value }));
|
|
21413
|
+
};
|
|
21414
|
+
const sync = async () => {
|
|
21415
|
+
const currentWork = work;
|
|
21416
|
+
const version2 = generation;
|
|
21417
|
+
currentWork.dirty = true;
|
|
21418
|
+
if (currentWork.pending || disposed) return;
|
|
21419
|
+
currentWork.pending = true;
|
|
21420
|
+
try {
|
|
21421
|
+
while (currentWork.dirty && !disposed && version2 === generation) {
|
|
21422
|
+
currentWork.dirty = false;
|
|
21423
|
+
const target = client;
|
|
21424
|
+
if (!target) {
|
|
21425
|
+
publish("pending");
|
|
21426
|
+
continue;
|
|
21427
|
+
}
|
|
21428
|
+
if (!target.setIdleReleaseSettings) {
|
|
21429
|
+
publish("unavailable");
|
|
21430
|
+
continue;
|
|
21431
|
+
}
|
|
21432
|
+
const settings = readIdleReleasePreference(owner);
|
|
21433
|
+
publish("pending");
|
|
21434
|
+
try {
|
|
21435
|
+
await target.setIdleReleaseSettings(settings);
|
|
21436
|
+
if (!disposed && version2 === generation && !currentWork.dirty) publish("applied");
|
|
21437
|
+
} catch (error51) {
|
|
21438
|
+
if (!disposed && version2 === generation) {
|
|
21439
|
+
publish(error51 instanceof RendererMethodUnavailableError ? "unavailable" : "failed");
|
|
21440
|
+
}
|
|
21441
|
+
}
|
|
21442
|
+
}
|
|
21443
|
+
} finally {
|
|
21444
|
+
currentWork.pending = false;
|
|
21445
|
+
}
|
|
21446
|
+
};
|
|
21447
|
+
const changed = () => {
|
|
21448
|
+
void sync();
|
|
21449
|
+
};
|
|
21450
|
+
const storage = (event) => {
|
|
21451
|
+
if (event.key === IDLE_RELEASE_STORAGE_KEY || event.key === null) changed();
|
|
21452
|
+
};
|
|
21453
|
+
owner.addEventListener(IDLE_RELEASE_CHANGE_EVENT, changed);
|
|
21454
|
+
owner.addEventListener("storage", storage);
|
|
21455
|
+
return {
|
|
21456
|
+
connect(next) {
|
|
21457
|
+
if (disposed) return;
|
|
21458
|
+
if (next === client) return;
|
|
21459
|
+
client = next;
|
|
21460
|
+
generation += 1;
|
|
21461
|
+
work = { pending: false, dirty: false };
|
|
21462
|
+
void sync();
|
|
21463
|
+
},
|
|
21464
|
+
dispose() {
|
|
21465
|
+
disposed = true;
|
|
21466
|
+
generation += 1;
|
|
21467
|
+
client = null;
|
|
21468
|
+
owner.removeEventListener(IDLE_RELEASE_CHANGE_EVENT, changed);
|
|
21469
|
+
owner.removeEventListener("storage", storage);
|
|
21470
|
+
}
|
|
21471
|
+
};
|
|
21472
|
+
}
|
|
21473
|
+
|
|
21200
21474
|
// src/renderer-sidebar-agent-icons.ts
|
|
21201
21475
|
var SIDEBAR_THREAD_ROW_ATTRIBUTE = "data-app-action-sidebar-thread-row";
|
|
21202
21476
|
var SIDEBAR_THREAD_ROW_SELECTOR = `[${SIDEBAR_THREAD_ROW_ATTRIBUTE}]`;
|
|
@@ -21260,6 +21534,8 @@ ${error51.stderrTail}`] : []
|
|
|
21260
21534
|
if (ownership.harnessId === "codebuddy") return "codebuddy";
|
|
21261
21535
|
if (ownership.harnessId === "cursor-cli") return "cursor-cli";
|
|
21262
21536
|
if (ownership.harnessId === "hermes") return "hermes";
|
|
21537
|
+
if (ownership.harnessId === "qoder") return "qoder";
|
|
21538
|
+
if (ownership.harnessId === "qoder-cn") return "qoder-cn";
|
|
21263
21539
|
return null;
|
|
21264
21540
|
}
|
|
21265
21541
|
var BrowserSidebarAgentIconRow = class {
|
|
@@ -22035,25 +22311,23 @@ ${error51.stderrTail}`] : []
|
|
|
22035
22311
|
var THREAD_USAGE_INSPECT_METHOD = "codexhost/thread/usage/inspect";
|
|
22036
22312
|
var THREAD_USAGE_UPDATED_METHOD = "codexhost/thread/usage/updated";
|
|
22037
22313
|
var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
|
|
22314
|
+
var TURN_COMPLETED_METHOD = "turn/completed";
|
|
22315
|
+
var THREAD_USAGE_REFRESH_METHODS = [
|
|
22316
|
+
THREAD_TOKEN_USAGE_UPDATED_METHOD,
|
|
22317
|
+
THREAD_USAGE_UPDATED_METHOD,
|
|
22318
|
+
TURN_COMPLETED_METHOD
|
|
22319
|
+
];
|
|
22038
22320
|
var UPDATE_CHECK_METHOD = "codexhost/update/check";
|
|
22039
22321
|
var UPDATE_START_METHOD = "codexhost/update/start";
|
|
22040
22322
|
var UPDATE_STATUS_METHOD = "codexhost/update/status";
|
|
22041
22323
|
var CODEX_ACCOUNT_LIST_METHOD = "codexhost/account/list";
|
|
22042
22324
|
var CODEX_ACCOUNT_REFRESH_METHOD = "codexhost/account/refresh";
|
|
22043
|
-
var CODEX_ACCOUNT_DELETE_METHOD = "codexhost/account/delete";
|
|
22044
|
-
var CODEX_ACCOUNT_SWITCH_METHOD = "codexhost/account/switch";
|
|
22045
22325
|
var CODEX_ACCOUNT_CHANGED_METHOD = "codexhost/account/changed";
|
|
22046
|
-
var CODEX_ACCOUNT_LOGIN_START_METHOD = "codexhost/account/login/start";
|
|
22047
|
-
var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "codexhost/account/login/cancel";
|
|
22048
|
-
var CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "codexhost/account/login/completed";
|
|
22049
|
-
var CODEX_ACCOUNT_LOGOUT_METHOD = "codexhost/account/logout";
|
|
22050
|
-
var CODEX_ACCOUNT_RECOVER_METHOD = "codexhost/account/recover";
|
|
22051
|
-
var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "codexhost/account/rate-limit-reset/consume";
|
|
22052
22326
|
function isRecord6(value) {
|
|
22053
22327
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
22054
22328
|
}
|
|
22055
22329
|
function notifiedThreadId(notification) {
|
|
22056
|
-
if (!isRecord6(notification) ||
|
|
22330
|
+
if (!isRecord6(notification) || !THREAD_USAGE_REFRESH_METHODS.includes(notification.method)) {
|
|
22057
22331
|
return null;
|
|
22058
22332
|
}
|
|
22059
22333
|
const params = notification.params;
|
|
@@ -22069,15 +22343,28 @@ ${error51.stderrTail}`] : []
|
|
|
22069
22343
|
function createThreadUsageSubscriptionRelay() {
|
|
22070
22344
|
const listeners = /* @__PURE__ */ new Set();
|
|
22071
22345
|
let removeNotificationCallback = null;
|
|
22346
|
+
let connectedClient = null;
|
|
22347
|
+
let generation = 0;
|
|
22348
|
+
const disconnect = () => {
|
|
22349
|
+
generation += 1;
|
|
22350
|
+
removeNotificationCallback?.();
|
|
22351
|
+
removeNotificationCallback = null;
|
|
22352
|
+
connectedClient = null;
|
|
22353
|
+
};
|
|
22072
22354
|
return {
|
|
22073
22355
|
connect(client) {
|
|
22074
|
-
if (
|
|
22356
|
+
if (client === connectedClient && removeNotificationCallback) return;
|
|
22357
|
+
disconnect();
|
|
22358
|
+
if (!client || listeners.size === 0) return;
|
|
22359
|
+
connectedClient = client;
|
|
22360
|
+
const subscriptionGeneration = generation;
|
|
22075
22361
|
try {
|
|
22076
22362
|
removeNotificationCallback = client.subscribeThreadUsage?.((update) => {
|
|
22363
|
+
if (subscriptionGeneration !== generation) return;
|
|
22077
22364
|
for (const listener of listeners) listener(update);
|
|
22078
22365
|
}) ?? null;
|
|
22079
22366
|
} catch {
|
|
22080
|
-
|
|
22367
|
+
disconnect();
|
|
22081
22368
|
}
|
|
22082
22369
|
},
|
|
22083
22370
|
subscribe(listener) {
|
|
@@ -22085,13 +22372,11 @@ ${error51.stderrTail}`] : []
|
|
|
22085
22372
|
return () => {
|
|
22086
22373
|
listeners.delete(listener);
|
|
22087
22374
|
if (listeners.size > 0) return;
|
|
22088
|
-
|
|
22089
|
-
removeNotificationCallback = null;
|
|
22375
|
+
disconnect();
|
|
22090
22376
|
};
|
|
22091
22377
|
},
|
|
22092
22378
|
dispose() {
|
|
22093
|
-
|
|
22094
|
-
removeNotificationCallback = null;
|
|
22379
|
+
disconnect();
|
|
22095
22380
|
listeners.clear();
|
|
22096
22381
|
}
|
|
22097
22382
|
};
|
|
@@ -22148,6 +22433,15 @@ ${error51.stderrTail}`] : []
|
|
|
22148
22433
|
return harnessConfigurationStateSchema.parse(result);
|
|
22149
22434
|
};
|
|
22150
22435
|
return Object.freeze({
|
|
22436
|
+
async listLoadedSessions() {
|
|
22437
|
+
return loadedSessionsSchema.parse(await manager.sendRequest(LOADED_SESSIONS_METHOD, {}));
|
|
22438
|
+
},
|
|
22439
|
+
async setIdleReleaseSettings(settings) {
|
|
22440
|
+
const params = idleReleaseSettingsSchema.parse(settings);
|
|
22441
|
+
return idleReleaseSettingsSchema.parse(
|
|
22442
|
+
await manager.sendRequest(IDLE_RELEASE_SETTINGS_METHOD, params)
|
|
22443
|
+
);
|
|
22444
|
+
},
|
|
22151
22445
|
...createRendererSessionImportClient(
|
|
22152
22446
|
async (method, params) => manager.sendRequest(method, params)
|
|
22153
22447
|
),
|
|
@@ -22207,7 +22501,7 @@ ${error51.stderrTail}`] : []
|
|
|
22207
22501
|
let disposed = false;
|
|
22208
22502
|
const generations = /* @__PURE__ */ new Map();
|
|
22209
22503
|
const removeNotificationCallback = notifications.addNotificationCallback(
|
|
22210
|
-
|
|
22504
|
+
THREAD_USAGE_REFRESH_METHODS,
|
|
22211
22505
|
(notification) => {
|
|
22212
22506
|
const threadId = notifiedThreadId(notification);
|
|
22213
22507
|
if (!threadId) return;
|
|
@@ -22256,13 +22550,6 @@ ${error51.stderrTail}`] : []
|
|
|
22256
22550
|
);
|
|
22257
22551
|
return codexAccountUsageResultSchema.parse(result);
|
|
22258
22552
|
},
|
|
22259
|
-
async consumeCodexAccountResetCredit(input) {
|
|
22260
|
-
const result = await manager.sendRequest(
|
|
22261
|
-
CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD,
|
|
22262
|
-
codexAccountResetCreditConsumeParamsSchema.parse(input)
|
|
22263
|
-
);
|
|
22264
|
-
return codexAccountResetCreditConsumeResultSchema.parse(result);
|
|
22265
|
-
},
|
|
22266
22553
|
async listHarnessAccountSources() {
|
|
22267
22554
|
return harnessAccountSourceListResultSchema.parse(
|
|
22268
22555
|
await manager.sendRequest(HARNESS_ACCOUNT_SOURCES_METHOD, {})
|
|
@@ -22292,34 +22579,6 @@ ${error51.stderrTail}`] : []
|
|
|
22292
22579
|
const result = await manager.sendRequest(CODEX_ACCOUNT_REFRESH_METHOD, {});
|
|
22293
22580
|
return codexAccountListResultSchema.parse(result);
|
|
22294
22581
|
},
|
|
22295
|
-
async deleteCodexAccount(input) {
|
|
22296
|
-
const result = await manager.sendRequest(
|
|
22297
|
-
CODEX_ACCOUNT_DELETE_METHOD,
|
|
22298
|
-
codexAccountDeleteParamsSchema.parse(input)
|
|
22299
|
-
);
|
|
22300
|
-
return codexAccountDeleteResultSchema.parse(result);
|
|
22301
|
-
},
|
|
22302
|
-
async switchCodexAccount(input) {
|
|
22303
|
-
const result = await manager.sendRequest(
|
|
22304
|
-
CODEX_ACCOUNT_SWITCH_METHOD,
|
|
22305
|
-
codexAccountSwitchParamsSchema.parse(input)
|
|
22306
|
-
);
|
|
22307
|
-
return codexAccountSwitchResultSchema.parse(result);
|
|
22308
|
-
},
|
|
22309
|
-
async logoutCodexAccount(input = {}) {
|
|
22310
|
-
const result = await manager.sendRequest(
|
|
22311
|
-
CODEX_ACCOUNT_LOGOUT_METHOD,
|
|
22312
|
-
codexAccountLogoutParamsSchema.parse(input)
|
|
22313
|
-
);
|
|
22314
|
-
return codexAccountLogoutResultSchema.parse(result);
|
|
22315
|
-
},
|
|
22316
|
-
async recoverCodexAccounts(input = {}) {
|
|
22317
|
-
const result = await manager.sendRequest(
|
|
22318
|
-
CODEX_ACCOUNT_RECOVER_METHOD,
|
|
22319
|
-
codexAccountRecoverParamsSchema.parse(input)
|
|
22320
|
-
);
|
|
22321
|
-
return codexAccountRecoverResultSchema.parse(result);
|
|
22322
|
-
},
|
|
22323
22582
|
subscribeCodexAccounts(listener) {
|
|
22324
22583
|
const notifications = notificationTarget(source);
|
|
22325
22584
|
if (!notifications?.addNotificationCallback) {
|
|
@@ -22330,36 +22589,6 @@ ${error51.stderrTail}`] : []
|
|
|
22330
22589
|
const state = codexAccountChangedSchema.safeParse(notification.params);
|
|
22331
22590
|
if (state.success) listener(state.data);
|
|
22332
22591
|
});
|
|
22333
|
-
},
|
|
22334
|
-
async startCodexAccountLogin(input) {
|
|
22335
|
-
const result = await manager.sendRequest(
|
|
22336
|
-
CODEX_ACCOUNT_LOGIN_START_METHOD,
|
|
22337
|
-
codexAccountLoginStartParamsSchema.parse(input)
|
|
22338
|
-
);
|
|
22339
|
-
return codexAccountLoginStartResultSchema.parse(result);
|
|
22340
|
-
},
|
|
22341
|
-
async cancelCodexAccountLogin(input) {
|
|
22342
|
-
const result = await manager.sendRequest(
|
|
22343
|
-
CODEX_ACCOUNT_LOGIN_CANCEL_METHOD,
|
|
22344
|
-
codexAccountLoginCancelParamsSchema.parse(input)
|
|
22345
|
-
);
|
|
22346
|
-
return codexAccountLoginCancelResultSchema.parse(result);
|
|
22347
|
-
},
|
|
22348
|
-
subscribeCodexAccountLogin(listener) {
|
|
22349
|
-
const notifications = notificationTarget(source);
|
|
22350
|
-
if (!notifications?.addNotificationCallback) {
|
|
22351
|
-
throw new Error("Renderer Account login notification callback is unavailable");
|
|
22352
|
-
}
|
|
22353
|
-
return notifications.addNotificationCallback(
|
|
22354
|
-
CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD,
|
|
22355
|
-
(notification) => {
|
|
22356
|
-
if (!isRecord6(notification) || notification.method !== CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD) {
|
|
22357
|
-
return;
|
|
22358
|
-
}
|
|
22359
|
-
const result = codexAccountLoginCompletedSchema.safeParse(notification.params);
|
|
22360
|
-
if (result.success) listener(result.data);
|
|
22361
|
-
}
|
|
22362
|
-
);
|
|
22363
22592
|
}
|
|
22364
22593
|
});
|
|
22365
22594
|
}
|
|
@@ -22410,6 +22639,9 @@ ${error51.stderrTail}`] : []
|
|
|
22410
22639
|
if (agent === "kiro-cli") return encodeHarnessPluginRoute({ harnessId: KIRO_CLI_HARNESS_ID });
|
|
22411
22640
|
if (agent === "codebuddy" || agent === "cursor-cli")
|
|
22412
22641
|
return encodeHarnessPluginRoute({ harnessId: harnessIdSchema.parse(agent) });
|
|
22642
|
+
if (agent === "qoder" || agent === "qoder-cn") {
|
|
22643
|
+
return encodeHarnessPluginRoute({ harnessId: harnessIdSchema.parse(agent) });
|
|
22644
|
+
}
|
|
22413
22645
|
return null;
|
|
22414
22646
|
}
|
|
22415
22647
|
function isRecord7(value) {
|
|
@@ -22871,7 +23103,12 @@ ${error51.stderrTail}`] : []
|
|
|
22871
23103
|
...model ? { model } : {},
|
|
22872
23104
|
...thinkingOptionId && agent !== "cursor-cli" ? { thinkingOptionId } : {},
|
|
22873
23105
|
...permissionModeId ? { permissionModeId } : {}
|
|
22874
|
-
}) : agent === "hermes" ? hermesTransportModelId(model, permissionModeId) :
|
|
23106
|
+
}) : agent === "hermes" ? hermesTransportModelId(model, permissionModeId) : agent === "qoder" || agent === "qoder-cn" ? encodeHarnessPluginRoute({
|
|
23107
|
+
harnessId: harnessIdSchema.parse(agent),
|
|
23108
|
+
...model ? { model } : {},
|
|
23109
|
+
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
23110
|
+
...permissionModeId ? { permissionModeId } : {}
|
|
23111
|
+
}) : transportModelIdForAgent(agent);
|
|
22875
23112
|
return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
|
|
22876
23113
|
}
|
|
22877
23114
|
function installCurrentRendererAdapter() {
|
|
@@ -22890,6 +23127,7 @@ ${error51.stderrTail}`] : []
|
|
|
22890
23127
|
});
|
|
22891
23128
|
};
|
|
22892
23129
|
const usageSubscription = createThreadUsageSubscriptionRelay();
|
|
23130
|
+
const idleReleaseSync = installIdleReleasePreferenceSync(window);
|
|
22893
23131
|
const requestRouteResolver = createRendererRequestRouteResolver(
|
|
22894
23132
|
() => window.__codexhostDraftPrewarmPolicyV1,
|
|
22895
23133
|
() => findActivePrewarmTargets(document)
|
|
@@ -22900,7 +23138,7 @@ ${error51.stderrTail}`] : []
|
|
|
22900
23138
|
const target = targets[0];
|
|
22901
23139
|
if (targets.length !== 1 || !target) return null;
|
|
22902
23140
|
const cached2 = clientsByTarget.get(target);
|
|
22903
|
-
if (cached2
|
|
23141
|
+
if (cached2 && (policy === null || cached2.policy === policy) && cached2.requestClient === target.requestClient)
|
|
22904
23142
|
return cached2.client;
|
|
22905
23143
|
const client = createRendererModelClient([target]);
|
|
22906
23144
|
if (client) {
|
|
@@ -22919,6 +23157,11 @@ ${error51.stderrTail}`] : []
|
|
|
22919
23157
|
const syncActiveRoute = (route) => {
|
|
22920
23158
|
const policy = route?.policy ?? null;
|
|
22921
23159
|
const client = route ? modelClientForTargets(route.targets, route.policy) : null;
|
|
23160
|
+
usageSubscription.connect(client);
|
|
23161
|
+
const localClient = policy?.hostId === "local" ? client : modelClientForTargets(
|
|
23162
|
+
rendererRequestTargetsForHost(findActivePrewarmTargets(document), "local") ?? []
|
|
23163
|
+
);
|
|
23164
|
+
idleReleaseSync.connect(localClient);
|
|
22922
23165
|
if (activeRoutePolicy === policy && activeRouteClient === client) return client;
|
|
22923
23166
|
activeRoutePolicy = policy;
|
|
22924
23167
|
activeRouteClient = client;
|
|
@@ -22932,7 +23175,6 @@ ${error51.stderrTail}`] : []
|
|
|
22932
23175
|
const currentModelClient = () => {
|
|
22933
23176
|
const client = currentRequestRoute() ? activeRouteClient : null;
|
|
22934
23177
|
if (!client) throw new Error("Renderer Model request manager is unavailable");
|
|
22935
|
-
usageSubscription.connect(client);
|
|
22936
23178
|
return client;
|
|
22937
23179
|
};
|
|
22938
23180
|
const modelControl = Object.freeze({
|
|
@@ -22971,13 +23213,6 @@ ${error51.stderrTail}`] : []
|
|
|
22971
23213
|
if (!client.inspectCodexAccountUsage) throw new Error("Codex Account Usage is unavailable");
|
|
22972
23214
|
return client.inspectCodexAccountUsage(input);
|
|
22973
23215
|
},
|
|
22974
|
-
consumeCodexAccountResetCredit: (input) => {
|
|
22975
|
-
const client = currentModelClient();
|
|
22976
|
-
if (!client.consumeCodexAccountResetCredit) {
|
|
22977
|
-
throw new Error("Codex Account reset-credit consume is unavailable");
|
|
22978
|
-
}
|
|
22979
|
-
return client.consumeCodexAccountResetCredit(input);
|
|
22980
|
-
},
|
|
22981
23216
|
listHarnessAccountSources: () => {
|
|
22982
23217
|
const client = currentModelClient();
|
|
22983
23218
|
if (!client.listHarnessAccountSources) {
|
|
@@ -23002,18 +23237,11 @@ ${error51.stderrTail}`] : []
|
|
|
23002
23237
|
const client = currentModelClient();
|
|
23003
23238
|
return client.refreshCodexAccounts?.() ?? client.listCodexAccounts();
|
|
23004
23239
|
},
|
|
23005
|
-
deleteCodexAccount: (input) => currentModelClient().deleteCodexAccount(input),
|
|
23006
|
-
switchCodexAccount: (input) => currentModelClient().switchCodexAccount(input),
|
|
23007
|
-
logoutCodexAccount: (input) => currentModelClient().logoutCodexAccount(input),
|
|
23008
|
-
recoverCodexAccounts: (input) => currentModelClient().recoverCodexAccounts(input),
|
|
23009
23240
|
subscribeCodexAccounts: (listener) => {
|
|
23010
23241
|
const client = currentModelClient();
|
|
23011
23242
|
if (!client.subscribeCodexAccounts) throw new Error("Codex Account updates are unavailable");
|
|
23012
23243
|
return client.subscribeCodexAccounts(listener);
|
|
23013
|
-
}
|
|
23014
|
-
startCodexAccountLogin: (input) => currentModelClient().startCodexAccountLogin(input),
|
|
23015
|
-
cancelCodexAccountLogin: (input) => currentModelClient().cancelCodexAccountLogin(input),
|
|
23016
|
-
subscribeCodexAccountLogin: (listener) => currentModelClient().subscribeCodexAccountLogin(listener)
|
|
23244
|
+
}
|
|
23017
23245
|
});
|
|
23018
23246
|
const forkControl = installRendererForkControl({
|
|
23019
23247
|
getClient: () => modelControl,
|
|
@@ -23148,7 +23376,8 @@ ${error51.stderrTail}`] : []
|
|
|
23148
23376
|
() => syncActiveRoute(null),
|
|
23149
23377
|
() => forkControl.dispose(),
|
|
23150
23378
|
...turnControlCleanups,
|
|
23151
|
-
() => usageSubscription.dispose()
|
|
23379
|
+
() => usageSubscription.dispose(),
|
|
23380
|
+
() => idleReleaseSync.dispose()
|
|
23152
23381
|
];
|
|
23153
23382
|
for (const cleanup of cleanups) {
|
|
23154
23383
|
try {
|
|
@@ -23162,14 +23391,14 @@ ${error51.stderrTail}`] : []
|
|
|
23162
23391
|
|
|
23163
23392
|
// src/renderer-permission-mode-preference.ts
|
|
23164
23393
|
var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "codexhost.claude-code.permission-mode.v1";
|
|
23165
|
-
function
|
|
23394
|
+
function rendererStorage2() {
|
|
23166
23395
|
try {
|
|
23167
23396
|
return window.localStorage;
|
|
23168
23397
|
} catch {
|
|
23169
23398
|
return null;
|
|
23170
23399
|
}
|
|
23171
23400
|
}
|
|
23172
|
-
function readClaudePermissionModePreference(catalog, storage =
|
|
23401
|
+
function readClaudePermissionModePreference(catalog, storage = rendererStorage2()) {
|
|
23173
23402
|
if (!storage) return void 0;
|
|
23174
23403
|
try {
|
|
23175
23404
|
const parsed = harnessPermissionModeIdSchema.safeParse(
|
|
@@ -23180,7 +23409,7 @@ ${error51.stderrTail}`] : []
|
|
|
23180
23409
|
return void 0;
|
|
23181
23410
|
}
|
|
23182
23411
|
}
|
|
23183
|
-
function writeClaudePermissionModePreference(permissionModeId, storage =
|
|
23412
|
+
function writeClaudePermissionModePreference(permissionModeId, storage = rendererStorage2()) {
|
|
23184
23413
|
if (!storage) return;
|
|
23185
23414
|
try {
|
|
23186
23415
|
storage.setItem(CLAUDE_PERMISSION_MODE_PREFERENCE_KEY, permissionModeId);
|
|
@@ -23190,7 +23419,7 @@ ${error51.stderrTail}`] : []
|
|
|
23190
23419
|
|
|
23191
23420
|
// src/renderer-new-thread-preference.ts
|
|
23192
23421
|
var RENDERER_NEW_THREAD_PREFERENCE_KEY = "codexhost.new-thread-preference.v1";
|
|
23193
|
-
function
|
|
23422
|
+
function rendererStorage3() {
|
|
23194
23423
|
try {
|
|
23195
23424
|
return window.localStorage;
|
|
23196
23425
|
} catch {
|
|
@@ -23245,11 +23474,11 @@ ${error51.stderrTail}`] : []
|
|
|
23245
23474
|
} catch {
|
|
23246
23475
|
}
|
|
23247
23476
|
}
|
|
23248
|
-
function readNewThreadAgentPreference(enabledAgents, storage =
|
|
23477
|
+
function readNewThreadAgentPreference(enabledAgents, storage = rendererStorage3()) {
|
|
23249
23478
|
const agent = readPreference(storage)?.lastAgent;
|
|
23250
23479
|
return agent && enabledAgents.has(agent) ? agent : void 0;
|
|
23251
23480
|
}
|
|
23252
|
-
function readNewThreadExternalConfigurationPreference(agent, catalog, permissionModes, storage =
|
|
23481
|
+
function readNewThreadExternalConfigurationPreference(agent, catalog, permissionModes, storage = rendererStorage3()) {
|
|
23253
23482
|
const preference = readPreference(storage)?.externalByAgent[agent];
|
|
23254
23483
|
if (!preference) return void 0;
|
|
23255
23484
|
const catalogModel = catalog.models.find(({ ref }) => ref.id === preference.model.id);
|
|
@@ -23262,7 +23491,7 @@ ${error51.stderrTail}`] : []
|
|
|
23262
23491
|
...permissionModeId ? { permissionModeId } : {}
|
|
23263
23492
|
};
|
|
23264
23493
|
}
|
|
23265
|
-
function writeNewThreadAgentPreference(agent, storage =
|
|
23494
|
+
function writeNewThreadAgentPreference(agent, storage = rendererStorage3()) {
|
|
23266
23495
|
const current = readPreference(storage);
|
|
23267
23496
|
writePreference(
|
|
23268
23497
|
{
|
|
@@ -23273,7 +23502,7 @@ ${error51.stderrTail}`] : []
|
|
|
23273
23502
|
storage
|
|
23274
23503
|
);
|
|
23275
23504
|
}
|
|
23276
|
-
function writeNewThreadExternalConfigurationPreference(agent, model, thinkingOptionId, permissionModeId, storage =
|
|
23505
|
+
function writeNewThreadExternalConfigurationPreference(agent, model, thinkingOptionId, permissionModeId, storage = rendererStorage3()) {
|
|
23277
23506
|
const current = readPreference(storage);
|
|
23278
23507
|
writePreference(
|
|
23279
23508
|
{
|
|
@@ -23959,10 +24188,10 @@ ${error51.stderrTail}`] : []
|
|
|
23959
24188
|
);
|
|
23960
24189
|
const actionArea = document2.createElement("div");
|
|
23961
24190
|
actionArea.className = "settings-session-import-row__action";
|
|
23962
|
-
if (candidate.running
|
|
24191
|
+
if (candidate.running === true) {
|
|
23963
24192
|
const running = document2.createElement("span");
|
|
23964
24193
|
running.className = "settings-session-import-running";
|
|
23965
|
-
running.textContent =
|
|
24194
|
+
running.textContent = messages.sessionImportRunning;
|
|
23966
24195
|
running.title = messages.sessionImportRunningHint;
|
|
23967
24196
|
running.setAttribute("aria-hidden", "true");
|
|
23968
24197
|
actionArea.append(
|
|
@@ -24085,8 +24314,319 @@ ${error51.stderrTail}`] : []
|
|
|
24085
24314
|
});
|
|
24086
24315
|
}
|
|
24087
24316
|
|
|
24317
|
+
// src/settings/loaded-sessions-table.ts
|
|
24318
|
+
function mountLoadedSessionsTable(context, messages, getClient) {
|
|
24319
|
+
const document2 = context.content.ownerDocument;
|
|
24320
|
+
const owner = document2.defaultView;
|
|
24321
|
+
if (!owner) return () => void 0;
|
|
24322
|
+
const text = messages.loadedSessions;
|
|
24323
|
+
const container = document2.createElement("div");
|
|
24324
|
+
container.className = "border-t border-settings-border";
|
|
24325
|
+
const header = document2.createElement("div");
|
|
24326
|
+
header.className = "px-4 pt-4";
|
|
24327
|
+
const title = document2.createElement("p");
|
|
24328
|
+
title.className = "m-0 text-sm font-medium";
|
|
24329
|
+
title.textContent = text.title;
|
|
24330
|
+
const description = document2.createElement("p");
|
|
24331
|
+
description.className = "text-xs text-settings-muted";
|
|
24332
|
+
description.textContent = text.description;
|
|
24333
|
+
const status = document2.createElement("p");
|
|
24334
|
+
status.className = "p-4 text-sm text-settings-muted";
|
|
24335
|
+
status.setAttribute("role", "status");
|
|
24336
|
+
status.textContent = text.loading;
|
|
24337
|
+
const scroll = document2.createElement("div");
|
|
24338
|
+
scroll.className = "overflow-x-auto";
|
|
24339
|
+
const table = document2.createElement("table");
|
|
24340
|
+
table.className = "w-full text-left text-sm";
|
|
24341
|
+
table.setAttribute("aria-label", text.title);
|
|
24342
|
+
const head = table.createTHead().insertRow();
|
|
24343
|
+
for (const label of text.columns) {
|
|
24344
|
+
const cell = document2.createElement("th");
|
|
24345
|
+
cell.scope = "col";
|
|
24346
|
+
cell.className = "px-4 py-3 font-medium text-settings-muted";
|
|
24347
|
+
cell.textContent = label;
|
|
24348
|
+
head.append(cell);
|
|
24349
|
+
}
|
|
24350
|
+
const body = table.createTBody();
|
|
24351
|
+
scroll.append(table);
|
|
24352
|
+
scroll.hidden = true;
|
|
24353
|
+
header.append(title, description);
|
|
24354
|
+
container.append(header, status, scroll);
|
|
24355
|
+
context.content.append(container);
|
|
24356
|
+
let disposed = false;
|
|
24357
|
+
let timer;
|
|
24358
|
+
let requestTimer;
|
|
24359
|
+
const refresh = async () => {
|
|
24360
|
+
try {
|
|
24361
|
+
const client = getClient();
|
|
24362
|
+
if (!client?.listLoadedSessions) {
|
|
24363
|
+
status.textContent = text.unavailable;
|
|
24364
|
+
status.hidden = false;
|
|
24365
|
+
scroll.hidden = true;
|
|
24366
|
+
return;
|
|
24367
|
+
}
|
|
24368
|
+
const rows = await Promise.race([
|
|
24369
|
+
client.listLoadedSessions(),
|
|
24370
|
+
new Promise((_, reject) => {
|
|
24371
|
+
requestTimer = owner.setTimeout(
|
|
24372
|
+
() => reject(new Error("Session status timed out")),
|
|
24373
|
+
1e4
|
|
24374
|
+
);
|
|
24375
|
+
})
|
|
24376
|
+
]);
|
|
24377
|
+
if (disposed || context.signal.aborted) return;
|
|
24378
|
+
body.replaceChildren();
|
|
24379
|
+
for (const row of rows.toSorted(
|
|
24380
|
+
(a, b) => b.inactiveMs - a.inactiveMs || a.harnessId.localeCompare(b.harnessId) || a.threadId.localeCompare(b.threadId)
|
|
24381
|
+
)) {
|
|
24382
|
+
const tr = body.insertRow();
|
|
24383
|
+
const values = [
|
|
24384
|
+
row.title,
|
|
24385
|
+
row.harnessId,
|
|
24386
|
+
text.states[row.state],
|
|
24387
|
+
text.minutes.replace("{minutes}", String(Math.floor(row.inactiveMs / 6e4))),
|
|
24388
|
+
text.reasons[row.reason]
|
|
24389
|
+
];
|
|
24390
|
+
for (const value of values) {
|
|
24391
|
+
const cell = tr.insertCell();
|
|
24392
|
+
cell.className = "max-w-64 break-words px-4 py-3 align-top";
|
|
24393
|
+
cell.textContent = value;
|
|
24394
|
+
}
|
|
24395
|
+
tr.title = row.threadId;
|
|
24396
|
+
}
|
|
24397
|
+
status.textContent = rows.length ? "" : text.empty;
|
|
24398
|
+
status.hidden = rows.length > 0;
|
|
24399
|
+
scroll.hidden = rows.length === 0;
|
|
24400
|
+
} catch (error51) {
|
|
24401
|
+
if (disposed || context.signal.aborted) return;
|
|
24402
|
+
status.textContent = error51 instanceof RendererMethodUnavailableError ? text.unavailable : text.failed;
|
|
24403
|
+
status.hidden = false;
|
|
24404
|
+
scroll.hidden = true;
|
|
24405
|
+
} finally {
|
|
24406
|
+
owner.clearTimeout(requestTimer);
|
|
24407
|
+
if (!disposed && !context.signal.aborted)
|
|
24408
|
+
timer = owner.setTimeout(() => void refresh(), 1e4);
|
|
24409
|
+
}
|
|
24410
|
+
};
|
|
24411
|
+
void refresh();
|
|
24412
|
+
return () => {
|
|
24413
|
+
disposed = true;
|
|
24414
|
+
owner.clearTimeout(timer);
|
|
24415
|
+
owner.clearTimeout(requestTimer);
|
|
24416
|
+
};
|
|
24417
|
+
}
|
|
24418
|
+
|
|
24419
|
+
// src/settings/preference-ui.ts
|
|
24420
|
+
var nextPreferenceId = 0;
|
|
24421
|
+
function preferenceId(prefix) {
|
|
24422
|
+
nextPreferenceId += 1;
|
|
24423
|
+
return `codexhost-${prefix}-${nextPreferenceId}`;
|
|
24424
|
+
}
|
|
24425
|
+
function createPreferenceGroup(document2, title) {
|
|
24426
|
+
const group = document2.createElement("section");
|
|
24427
|
+
group.className = "mt-7 first-of-type:mt-0";
|
|
24428
|
+
const header = document2.createElement("div");
|
|
24429
|
+
header.className = "mb-2 flex min-h-6 items-center gap-2 px-1";
|
|
24430
|
+
const heading = document2.createElement("h3");
|
|
24431
|
+
heading.id = preferenceId("preference-group");
|
|
24432
|
+
heading.className = "m-0 text-[13px] leading-5 font-semibold text-settings-text";
|
|
24433
|
+
heading.textContent = title;
|
|
24434
|
+
header.append(heading);
|
|
24435
|
+
const card = document2.createElement("div");
|
|
24436
|
+
card.className = "rounded-[10px] border border-settings-border bg-settings-panel";
|
|
24437
|
+
group.setAttribute("aria-labelledby", heading.id);
|
|
24438
|
+
group.append(header, card);
|
|
24439
|
+
return { group, header, card };
|
|
24440
|
+
}
|
|
24441
|
+
function createPreferenceItem(document2, input) {
|
|
24442
|
+
const item = document2.createElement("div");
|
|
24443
|
+
item.className = "flex min-h-[60px] items-center justify-between gap-6 border-t border-settings-divider px-4 py-3 first:border-t-0";
|
|
24444
|
+
const copy = document2.createElement("div");
|
|
24445
|
+
copy.className = "flex min-w-0 flex-col gap-0.5";
|
|
24446
|
+
const heading = document2.createElement("div");
|
|
24447
|
+
heading.className = "flex items-center gap-1.5";
|
|
24448
|
+
const title = document2.createElement("label");
|
|
24449
|
+
title.htmlFor = input.controlId;
|
|
24450
|
+
title.className = "cursor-pointer text-[13px] leading-5 font-medium text-settings-text";
|
|
24451
|
+
title.textContent = input.title;
|
|
24452
|
+
heading.append(title);
|
|
24453
|
+
if (input.help) heading.append(createHelpTooltip(document2, input.help.label, input.help.lines));
|
|
24454
|
+
const description = document2.createElement("div");
|
|
24455
|
+
description.id = preferenceId("preference-description");
|
|
24456
|
+
description.className = "text-xs leading-[18px] text-settings-muted data-[invalid=true]:text-settings-danger";
|
|
24457
|
+
description.textContent = input.description;
|
|
24458
|
+
copy.append(heading, description);
|
|
24459
|
+
item.append(copy);
|
|
24460
|
+
return { item, description };
|
|
24461
|
+
}
|
|
24462
|
+
function createHelpTooltip(document2, label, lines) {
|
|
24463
|
+
const wrapper = document2.createElement("span");
|
|
24464
|
+
wrapper.className = "group relative inline-flex";
|
|
24465
|
+
const button = document2.createElement("button");
|
|
24466
|
+
button.type = "button";
|
|
24467
|
+
button.className = "inline-flex size-4 cursor-help items-center justify-center rounded-full border-0 bg-transparent p-0 text-settings-subtle transition-colors hover:text-settings-text focus-visible:text-settings-text focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-settings-focus";
|
|
24468
|
+
button.setAttribute("aria-label", label);
|
|
24469
|
+
button.append(createRendererSettingsIcon("help", 14));
|
|
24470
|
+
const tooltip = document2.createElement("div");
|
|
24471
|
+
tooltip.id = preferenceId("preference-tooltip");
|
|
24472
|
+
tooltip.setAttribute("role", "tooltip");
|
|
24473
|
+
tooltip.className = "pointer-events-none invisible absolute top-full left-0 z-20 mt-2 w-80 rounded-lg border border-settings-border bg-settings-panel px-3 py-2.5 text-xs leading-[18px] font-normal text-settings-text opacity-0 shadow-[0_10px_30px_rgb(0_0_0/0.22)] transition-opacity duration-150 group-hover:visible group-hover:opacity-100 group-focus-within:visible group-focus-within:opacity-100";
|
|
24474
|
+
const list = document2.createElement("ul");
|
|
24475
|
+
list.className = "m-0 grid list-disc gap-1 pl-4 marker:text-settings-subtle";
|
|
24476
|
+
for (const line of lines) {
|
|
24477
|
+
const item = document2.createElement("li");
|
|
24478
|
+
item.textContent = line;
|
|
24479
|
+
list.append(item);
|
|
24480
|
+
}
|
|
24481
|
+
tooltip.append(list);
|
|
24482
|
+
button.setAttribute("aria-describedby", tooltip.id);
|
|
24483
|
+
button.addEventListener("keydown", (event) => {
|
|
24484
|
+
if (event.key === "Escape") button.blur();
|
|
24485
|
+
});
|
|
24486
|
+
wrapper.append(button, tooltip);
|
|
24487
|
+
return wrapper;
|
|
24488
|
+
}
|
|
24489
|
+
function createPreferenceSwitch(document2, id, describedBy) {
|
|
24490
|
+
const input = document2.createElement("input");
|
|
24491
|
+
input.type = "checkbox";
|
|
24492
|
+
input.id = id;
|
|
24493
|
+
input.setAttribute("role", "switch");
|
|
24494
|
+
input.setAttribute("aria-describedby", describedBy);
|
|
24495
|
+
input.className = "relative m-0 h-5 w-9 shrink-0 cursor-pointer appearance-none rounded-full bg-settings-surface-hover ring-1 ring-settings-border transition-colors ring-inset before:absolute before:top-0.5 before:left-0.5 before:size-4 before:rounded-full before:bg-white before:shadow-[0_1px_2px_rgb(0_0_0/0.3)] before:transition-transform checked:bg-settings-focus checked:ring-transparent checked:before:translate-x-4 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-settings-focus";
|
|
24496
|
+
return input;
|
|
24497
|
+
}
|
|
24498
|
+
function createNumberField(document2, input) {
|
|
24499
|
+
const field = document2.createElement("div");
|
|
24500
|
+
field.className = "flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-settings-border bg-settings-surface px-2.5 transition-colors focus-within:border-settings-focus data-[invalid=true]:border-settings-danger";
|
|
24501
|
+
const control = document2.createElement("input");
|
|
24502
|
+
control.type = "number";
|
|
24503
|
+
control.id = input.id;
|
|
24504
|
+
control.min = String(input.min);
|
|
24505
|
+
control.max = String(input.max);
|
|
24506
|
+
control.step = "1";
|
|
24507
|
+
control.setAttribute("aria-describedby", input.describedBy);
|
|
24508
|
+
control.className = "w-14 border-0 bg-transparent p-0 text-right text-[13px] leading-5 text-settings-text tabular-nums outline-none";
|
|
24509
|
+
const unit = document2.createElement("span");
|
|
24510
|
+
unit.className = "text-xs text-settings-muted";
|
|
24511
|
+
unit.setAttribute("aria-hidden", "true");
|
|
24512
|
+
unit.textContent = input.unit;
|
|
24513
|
+
field.append(control, unit);
|
|
24514
|
+
return { field, control };
|
|
24515
|
+
}
|
|
24516
|
+
|
|
24517
|
+
// src/settings/idle-release-controls.ts
|
|
24518
|
+
function mountIdleReleaseControls(context, messages, getLoadedSessionsClient) {
|
|
24519
|
+
const { content } = context;
|
|
24520
|
+
const document2 = content.ownerDocument;
|
|
24521
|
+
const owner = document2.defaultView;
|
|
24522
|
+
if (!owner) return () => void 0;
|
|
24523
|
+
const { group, header, card } = createPreferenceGroup(document2, messages.idleReleaseSection);
|
|
24524
|
+
const status = document2.createElement("div");
|
|
24525
|
+
status.className = "group/status ml-auto inline-flex items-center gap-1.5 text-xs leading-[18px] text-settings-muted data-[state=failed]:text-settings-danger data-[state=unavailable]:text-settings-warning";
|
|
24526
|
+
const statusDot = document2.createElement("span");
|
|
24527
|
+
statusDot.setAttribute("aria-hidden", "true");
|
|
24528
|
+
statusDot.className = "size-1.5 shrink-0 rounded-full bg-settings-subtle group-data-[state=failed]/status:bg-settings-danger group-data-[state=unavailable]/status:bg-settings-warning";
|
|
24529
|
+
const statusText = document2.createElement("span");
|
|
24530
|
+
statusText.setAttribute("role", "status");
|
|
24531
|
+
status.append(statusDot, statusText);
|
|
24532
|
+
header.append(status);
|
|
24533
|
+
const enabledId = preferenceId("idle-release-enabled");
|
|
24534
|
+
const toggle = createPreferenceItem(document2, {
|
|
24535
|
+
title: messages.idleReleaseTitle,
|
|
24536
|
+
description: messages.idleReleaseDescription,
|
|
24537
|
+
controlId: enabledId,
|
|
24538
|
+
help: { label: messages.idleReleaseHelpLabel, lines: messages.idleReleaseHelp }
|
|
24539
|
+
});
|
|
24540
|
+
const enabled = createPreferenceSwitch(document2, enabledId, toggle.description.id);
|
|
24541
|
+
toggle.item.append(enabled);
|
|
24542
|
+
const minutesId = preferenceId("idle-release-minutes");
|
|
24543
|
+
const timeout = createPreferenceItem(document2, {
|
|
24544
|
+
title: messages.idleReleaseTimeout,
|
|
24545
|
+
description: messages.idleReleaseTimeoutDescription,
|
|
24546
|
+
controlId: minutesId
|
|
24547
|
+
});
|
|
24548
|
+
const { field, control: minutes } = createNumberField(document2, {
|
|
24549
|
+
id: minutesId,
|
|
24550
|
+
describedBy: timeout.description.id,
|
|
24551
|
+
unit: messages.idleReleaseMinutes,
|
|
24552
|
+
min: IDLE_RELEASE_TIMEOUT_MINUTES_MIN,
|
|
24553
|
+
max: IDLE_RELEASE_TIMEOUT_MINUTES_MAX
|
|
24554
|
+
});
|
|
24555
|
+
timeout.item.append(field);
|
|
24556
|
+
timeout.item.id = preferenceId("idle-release-timeout");
|
|
24557
|
+
enabled.setAttribute("aria-controls", timeout.item.id);
|
|
24558
|
+
card.append(toggle.item, timeout.item);
|
|
24559
|
+
content.append(group);
|
|
24560
|
+
const disposeTable = mountLoadedSessionsTable(
|
|
24561
|
+
{ ...context, content: card },
|
|
24562
|
+
messages,
|
|
24563
|
+
getLoadedSessionsClient
|
|
24564
|
+
);
|
|
24565
|
+
const statusMessages = {
|
|
24566
|
+
pending: messages.idleReleasePending,
|
|
24567
|
+
unavailable: messages.idleReleaseUnavailable,
|
|
24568
|
+
failed: messages.idleReleaseFailed
|
|
24569
|
+
};
|
|
24570
|
+
const showStatus = (value) => {
|
|
24571
|
+
status.dataset.state = value;
|
|
24572
|
+
status.hidden = value === "applied";
|
|
24573
|
+
statusText.textContent = value === "applied" ? "" : statusMessages[value];
|
|
24574
|
+
};
|
|
24575
|
+
const setInvalid = (invalid) => {
|
|
24576
|
+
field.dataset.invalid = String(invalid);
|
|
24577
|
+
timeout.description.dataset.invalid = String(invalid);
|
|
24578
|
+
timeout.description.textContent = invalid ? messages.idleReleaseInvalid : messages.idleReleaseTimeoutDescription;
|
|
24579
|
+
minutes.setAttribute("aria-invalid", String(invalid));
|
|
24580
|
+
minutes.setCustomValidity(invalid ? messages.idleReleaseInvalid : "");
|
|
24581
|
+
};
|
|
24582
|
+
const sync = () => {
|
|
24583
|
+
const settings = readIdleReleasePreference(owner);
|
|
24584
|
+
enabled.checked = settings.enabled;
|
|
24585
|
+
timeout.item.hidden = !settings.enabled;
|
|
24586
|
+
if (!settings.enabled && minutes.getAttribute("aria-invalid") === "true") setInvalid(false);
|
|
24587
|
+
if (minutes.getAttribute("aria-invalid") !== "true") {
|
|
24588
|
+
minutes.value = String(settings.timeoutMinutes);
|
|
24589
|
+
}
|
|
24590
|
+
};
|
|
24591
|
+
const save = (settings) => {
|
|
24592
|
+
if (writeIdleReleasePreference(owner, settings)) return;
|
|
24593
|
+
sync();
|
|
24594
|
+
showStatus("failed");
|
|
24595
|
+
};
|
|
24596
|
+
enabled.addEventListener("change", () => {
|
|
24597
|
+
save({ ...readIdleReleasePreference(owner), enabled: enabled.checked });
|
|
24598
|
+
});
|
|
24599
|
+
minutes.addEventListener("change", () => {
|
|
24600
|
+
const parsed = idleReleaseSettingsSchema.safeParse({
|
|
24601
|
+
enabled: readIdleReleasePreference(owner).enabled,
|
|
24602
|
+
timeoutMinutes: minutes.valueAsNumber
|
|
24603
|
+
});
|
|
24604
|
+
setInvalid(!parsed.success);
|
|
24605
|
+
if (parsed.success) save(parsed.data);
|
|
24606
|
+
});
|
|
24607
|
+
minutes.addEventListener("input", () => {
|
|
24608
|
+
if (minutes.getAttribute("aria-invalid") === "true") setInvalid(false);
|
|
24609
|
+
});
|
|
24610
|
+
const storage = (event) => {
|
|
24611
|
+
if (event.key === IDLE_RELEASE_STORAGE_KEY || event.key === null) sync();
|
|
24612
|
+
};
|
|
24613
|
+
const onStatus = (event) => showStatus(event.detail);
|
|
24614
|
+
owner.addEventListener(IDLE_RELEASE_CHANGE_EVENT, sync);
|
|
24615
|
+
owner.addEventListener(IDLE_RELEASE_STATUS_EVENT, onStatus);
|
|
24616
|
+
owner.addEventListener("storage", storage);
|
|
24617
|
+
sync();
|
|
24618
|
+
showStatus("pending");
|
|
24619
|
+
owner.dispatchEvent(new Event(IDLE_RELEASE_CHANGE_EVENT));
|
|
24620
|
+
return () => {
|
|
24621
|
+
disposeTable();
|
|
24622
|
+
owner.removeEventListener(IDLE_RELEASE_CHANGE_EVENT, sync);
|
|
24623
|
+
owner.removeEventListener(IDLE_RELEASE_STATUS_EVENT, onStatus);
|
|
24624
|
+
owner.removeEventListener("storage", storage);
|
|
24625
|
+
};
|
|
24626
|
+
}
|
|
24627
|
+
|
|
24088
24628
|
// src/settings/appearance-page.ts
|
|
24089
|
-
function createAppearanceSettingsPage(messages) {
|
|
24629
|
+
function createAppearanceSettingsPage(messages, getLoadedSessionsClient = () => null) {
|
|
24090
24630
|
return Object.freeze({
|
|
24091
24631
|
id: "appearance",
|
|
24092
24632
|
label: messages.pageLabels.appearance,
|
|
@@ -24101,30 +24641,34 @@ ${error51.stderrTail}`] : []
|
|
|
24101
24641
|
const description = document2.createElement("p");
|
|
24102
24642
|
description.className = "settings-page-description";
|
|
24103
24643
|
description.textContent = messages.appearanceDescription;
|
|
24104
|
-
const
|
|
24105
|
-
|
|
24106
|
-
const
|
|
24107
|
-
|
|
24108
|
-
|
|
24109
|
-
|
|
24110
|
-
|
|
24111
|
-
|
|
24112
|
-
|
|
24113
|
-
|
|
24114
|
-
|
|
24115
|
-
checkbox.className = "settings-preference-checkbox";
|
|
24116
|
-
checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
|
|
24117
|
-
checkbox.setAttribute("aria-label", messages.reasoningSoftWrapTitle);
|
|
24118
|
-
checkbox.addEventListener("change", () => {
|
|
24119
|
-
setReasoningTranscriptSoftWrap(ownerWindow, checkbox.checked);
|
|
24644
|
+
const { group, card } = createPreferenceGroup(document2, messages.appearanceGroup);
|
|
24645
|
+
const softWrapId = preferenceId("reasoning-soft-wrap");
|
|
24646
|
+
const row = createPreferenceItem(document2, {
|
|
24647
|
+
title: messages.reasoningSoftWrapTitle,
|
|
24648
|
+
description: messages.reasoningSoftWrapDescription,
|
|
24649
|
+
controlId: softWrapId
|
|
24650
|
+
});
|
|
24651
|
+
const toggle = createPreferenceSwitch(document2, softWrapId, row.description.id);
|
|
24652
|
+
toggle.checked = readReasoningTranscriptSoftWrap(ownerWindow);
|
|
24653
|
+
toggle.addEventListener("change", () => {
|
|
24654
|
+
setReasoningTranscriptSoftWrap(ownerWindow, toggle.checked);
|
|
24120
24655
|
});
|
|
24121
24656
|
const sync = () => {
|
|
24122
|
-
|
|
24657
|
+
toggle.checked = readReasoningTranscriptSoftWrap(ownerWindow);
|
|
24123
24658
|
};
|
|
24124
24659
|
ownerWindow.addEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
24125
|
-
row.append(
|
|
24126
|
-
|
|
24127
|
-
|
|
24660
|
+
row.item.append(toggle);
|
|
24661
|
+
card.append(row.item);
|
|
24662
|
+
context.content.append(heading, description, group);
|
|
24663
|
+
const disposeIdleRelease = mountIdleReleaseControls(
|
|
24664
|
+
context,
|
|
24665
|
+
messages,
|
|
24666
|
+
getLoadedSessionsClient
|
|
24667
|
+
);
|
|
24668
|
+
return () => {
|
|
24669
|
+
ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
24670
|
+
disposeIdleRelease();
|
|
24671
|
+
};
|
|
24128
24672
|
}
|
|
24129
24673
|
});
|
|
24130
24674
|
}
|
|
@@ -24326,7 +24870,6 @@ ${error51.stderrTail}`] : []
|
|
|
24326
24870
|
trigger.type = "button";
|
|
24327
24871
|
trigger.className = "settings-icon-button";
|
|
24328
24872
|
trigger.title = input.triggerLabel ?? input.label;
|
|
24329
|
-
trigger.disabled = input.disabled ?? false;
|
|
24330
24873
|
trigger.dataset.accountFocus = input.focusKey;
|
|
24331
24874
|
trigger.setAttribute("aria-label", trigger.title);
|
|
24332
24875
|
trigger.setAttribute("aria-haspopup", "dialog");
|
|
@@ -24352,20 +24895,7 @@ ${error51.stderrTail}`] : []
|
|
|
24352
24895
|
dialog.addEventListener("close", () => {
|
|
24353
24896
|
if (trigger.isConnected && !trigger.disabled) trigger.focus({ preventScroll: true });
|
|
24354
24897
|
});
|
|
24355
|
-
dialog.
|
|
24356
|
-
"click",
|
|
24357
|
-
(event) => {
|
|
24358
|
-
if (input.actions.some((action) => action.contains(event.target))) {
|
|
24359
|
-
trigger.focus({ preventScroll: true });
|
|
24360
|
-
dialog.close();
|
|
24361
|
-
}
|
|
24362
|
-
},
|
|
24363
|
-
{ capture: true }
|
|
24364
|
-
);
|
|
24365
|
-
const actions = document2.createElement("div");
|
|
24366
|
-
actions.className = "settings-account-dialog__actions";
|
|
24367
|
-
actions.append(...input.actions);
|
|
24368
|
-
dialog.append(close, heading, description, actions);
|
|
24898
|
+
dialog.append(close, heading, description);
|
|
24369
24899
|
trigger.addEventListener("click", () => dialog.showModal());
|
|
24370
24900
|
root.append(trigger, dialog);
|
|
24371
24901
|
return root;
|
|
@@ -24650,7 +25180,7 @@ ${error51.stderrTail}`] : []
|
|
|
24650
25180
|
extra.append(renderUsageWindow(document2, window2, messages, display));
|
|
24651
25181
|
return { cells, continuationCells, additional: extra };
|
|
24652
25182
|
}
|
|
24653
|
-
function renderAccountResetCredits(document2, credits, messages
|
|
25183
|
+
function renderAccountResetCredits(document2, credits, messages) {
|
|
24654
25184
|
const resetCredits = credits.resetCredits;
|
|
24655
25185
|
if (!resetCredits) return null;
|
|
24656
25186
|
const summary = document2.createElement("button");
|
|
@@ -24696,15 +25226,6 @@ ${error51.stderrTail}`] : []
|
|
|
24696
25226
|
copy.append(list);
|
|
24697
25227
|
}
|
|
24698
25228
|
details.append(copy);
|
|
24699
|
-
if (options.onUseReset) {
|
|
24700
|
-
const use = document2.createElement("button");
|
|
24701
|
-
use.type = "button";
|
|
24702
|
-
use.className = "settings-command-button settings-command-button--secondary";
|
|
24703
|
-
use.textContent = options.usingReset ? messages.accountResetCreditsUsing : messages.accountResetCreditsUse;
|
|
24704
|
-
use.disabled = options.resetDisabled;
|
|
24705
|
-
use.addEventListener("click", options.onUseReset);
|
|
24706
|
-
details.append(use);
|
|
24707
|
-
}
|
|
24708
25229
|
return { summary, details };
|
|
24709
25230
|
}
|
|
24710
25231
|
|
|
@@ -24852,72 +25373,16 @@ ${error51.stderrTail}`] : []
|
|
|
24852
25373
|
actionsCell.className = "settings-account-management-cell";
|
|
24853
25374
|
const management = document2.createElement("div");
|
|
24854
25375
|
management.className = "settings-account-management";
|
|
24855
|
-
const actions = document2.createElement("div");
|
|
24856
|
-
actions.className = "settings-account-actions";
|
|
24857
|
-
const more = [];
|
|
24858
|
-
if (!input.current) {
|
|
24859
|
-
const activate = document2.createElement("button");
|
|
24860
|
-
activate.type = "button";
|
|
24861
|
-
activate.className = "settings-account-action";
|
|
24862
|
-
activate.textContent = messages.accountUse;
|
|
24863
|
-
activate.title = messages.accountDefaultHint;
|
|
24864
|
-
activate.dataset.accountFocus = `${account.accountId}:activate`;
|
|
24865
|
-
activate.disabled = input.actionsDisabled || input.switchDisabled;
|
|
24866
|
-
activate.addEventListener("click", input.onActivate);
|
|
24867
|
-
actions.append(activate);
|
|
24868
|
-
}
|
|
24869
|
-
const signIn = document2.createElement("button");
|
|
24870
|
-
signIn.type = "button";
|
|
24871
|
-
signIn.className = "settings-account-action";
|
|
24872
|
-
signIn.textContent = messages.accountSignIn;
|
|
24873
|
-
signIn.dataset.accountFocus = `${account.accountId}:login`;
|
|
24874
|
-
signIn.disabled = input.actionsDisabled || input.loginDisabled;
|
|
24875
|
-
signIn.addEventListener("click", input.onSignIn);
|
|
24876
|
-
if (account.email) more.push(signIn);
|
|
24877
|
-
else actions.append(signIn);
|
|
24878
25376
|
if (input.usage) {
|
|
24879
25377
|
const refresh = document2.createElement("button");
|
|
24880
25378
|
refresh.type = "button";
|
|
24881
25379
|
refresh.className = "settings-account-action";
|
|
24882
25380
|
refresh.textContent = messages.accountCreditsRefresh;
|
|
24883
25381
|
refresh.dataset.accountFocus = `${account.accountId}:refresh`;
|
|
24884
|
-
refresh.disabled = input.
|
|
25382
|
+
refresh.disabled = input.usage.status === "loading";
|
|
24885
25383
|
refresh.addEventListener("click", input.onRetry);
|
|
24886
|
-
|
|
24887
|
-
}
|
|
24888
|
-
if (input.current) {
|
|
24889
|
-
const logout = document2.createElement("button");
|
|
24890
|
-
logout.type = "button";
|
|
24891
|
-
logout.className = "settings-account-action";
|
|
24892
|
-
logout.textContent = messages.accountLogout;
|
|
24893
|
-
logout.dataset.accountFocus = `${account.accountId}:logout`;
|
|
24894
|
-
logout.disabled = input.actionsDisabled || input.logoutDisabled;
|
|
24895
|
-
logout.addEventListener("click", input.onLogout);
|
|
24896
|
-
more.push(logout);
|
|
24897
|
-
} else {
|
|
24898
|
-
const remove = document2.createElement("button");
|
|
24899
|
-
remove.type = "button";
|
|
24900
|
-
remove.className = "settings-account-action settings-account-delete";
|
|
24901
|
-
remove.textContent = messages.accountDelete;
|
|
24902
|
-
remove.dataset.accountFocus = `${account.accountId}:delete`;
|
|
24903
|
-
remove.setAttribute("aria-label", `${messages.accountDelete}: ${name.full}`);
|
|
24904
|
-
remove.disabled = input.actionsDisabled || input.deleteDisabled;
|
|
24905
|
-
remove.addEventListener("click", input.onDelete);
|
|
24906
|
-
more.push(remove);
|
|
24907
|
-
}
|
|
24908
|
-
if (more.length)
|
|
24909
|
-
actions.append(
|
|
24910
|
-
createAccountDetails(document2, messages, {
|
|
24911
|
-
label: messages.accountMore,
|
|
24912
|
-
triggerLabel: `${name.full} \xB7 ${messages.accountMore}`,
|
|
24913
|
-
description: name.full,
|
|
24914
|
-
focusKey: `${account.accountId}:more`,
|
|
24915
|
-
icon: "ellipsis",
|
|
24916
|
-
disabled: input.actionsDisabled,
|
|
24917
|
-
actions: more
|
|
24918
|
-
})
|
|
24919
|
-
);
|
|
24920
|
-
management.append(actions);
|
|
25384
|
+
management.append(refresh);
|
|
25385
|
+
}
|
|
24921
25386
|
actionsCell.append(management);
|
|
24922
25387
|
const continuationRows = usage.continuationCells.map((cells) => {
|
|
24923
25388
|
const continuation = document2.createElement("tr");
|
|
@@ -24933,7 +25398,7 @@ ${error51.stderrTail}`] : []
|
|
|
24933
25398
|
actionsCell.className += " settings-account-spanning-cell";
|
|
24934
25399
|
}
|
|
24935
25400
|
row.append(personCell, ...usage.cells, actionsCell);
|
|
24936
|
-
const reset = input.usage?.status === "ready" ? renderAccountResetCredits(document2, input.usage.credits, messages
|
|
25401
|
+
const reset = input.usage?.status === "ready" ? renderAccountResetCredits(document2, input.usage.credits, messages) : null;
|
|
24937
25402
|
if (!reset) return [row, ...continuationRows];
|
|
24938
25403
|
const detailsRow = document2.createElement("tr");
|
|
24939
25404
|
detailsRow.className = "settings-account-details-row";
|
|
@@ -24995,8 +25460,7 @@ ${error51.stderrTail}`] : []
|
|
|
24995
25460
|
label: `${account.harnessName} \xB7 ${messages.accountNativeManaged}`,
|
|
24996
25461
|
description: messages.accountNativeManagementHint.replace("{harness}", account.harnessName),
|
|
24997
25462
|
focusKey: `harness:${account.harnessId}:info`,
|
|
24998
|
-
icon: "info"
|
|
24999
|
-
actions: []
|
|
25463
|
+
icon: "info"
|
|
25000
25464
|
});
|
|
25001
25465
|
management.append(label, info);
|
|
25002
25466
|
managementCell.append(management);
|
|
@@ -25119,11 +25583,7 @@ ${error51.stderrTail}`] : []
|
|
|
25119
25583
|
heading.className = "settings-section-label";
|
|
25120
25584
|
heading.textContent = messages.pageLabels.accounts;
|
|
25121
25585
|
copy.append(heading);
|
|
25122
|
-
|
|
25123
|
-
add.type = "button";
|
|
25124
|
-
add.className = "settings-command-button";
|
|
25125
|
-
add.append(createRendererSettingsIcon("add", 16), messages.accountAdd);
|
|
25126
|
-
header.append(copy, add);
|
|
25586
|
+
header.append(copy);
|
|
25127
25587
|
const status = document2.createElement("p");
|
|
25128
25588
|
status.className = "settings-account-status";
|
|
25129
25589
|
status.setAttribute("aria-live", "polite");
|
|
@@ -25184,86 +25644,21 @@ ${error51.stderrTail}`] : []
|
|
|
25184
25644
|
let accountRevision = 0;
|
|
25185
25645
|
let accountInstanceId;
|
|
25186
25646
|
let hasAccountSnapshot = false;
|
|
25187
|
-
let
|
|
25188
|
-
let capabilities = {
|
|
25189
|
-
manage: false,
|
|
25190
|
-
switch: false,
|
|
25191
|
-
login: false,
|
|
25192
|
-
delete: false
|
|
25193
|
-
};
|
|
25194
|
-
let accountCreating = false;
|
|
25195
|
-
let accountActivating = false;
|
|
25196
|
-
let accountRecovering = false;
|
|
25197
|
-
let accountLoggingOut = false;
|
|
25198
|
-
let deletingAccountId = null;
|
|
25199
|
-
let login = null;
|
|
25200
|
-
let loginStartingAccountId = null;
|
|
25201
|
-
let loginMessage = null;
|
|
25202
|
-
let loginRefreshTimer;
|
|
25203
|
-
let loginStartSnapshot;
|
|
25204
|
-
const earlyLoginCompletions = /* @__PURE__ */ new Map();
|
|
25647
|
+
let loadMessage = null;
|
|
25205
25648
|
const usageByAccountId = /* @__PURE__ */ new Map();
|
|
25206
|
-
let usingResetAccountId = null;
|
|
25207
25649
|
let usageDisplay = "remaining";
|
|
25208
25650
|
const expandedResetAccounts = /* @__PURE__ */ new Set();
|
|
25209
|
-
const accountBusy = () => accountCreating || accountActivating || accountRecovering || accountLoggingOut || accountPhase === "changing" || deletingAccountId !== null || login !== null || loginStartingAccountId !== null || usingResetAccountId !== null;
|
|
25210
|
-
const clearLoginRefresh = () => {
|
|
25211
|
-
if (loginRefreshTimer === void 0) return;
|
|
25212
|
-
document2.defaultView?.clearTimeout(loginRefreshTimer);
|
|
25213
|
-
loginRefreshTimer = void 0;
|
|
25214
|
-
};
|
|
25215
|
-
const scheduleLoginRefresh = () => {
|
|
25216
|
-
clearLoginRefresh();
|
|
25217
|
-
if (!login || context.signal.aborted) return;
|
|
25218
|
-
loginRefreshTimer = document2.defaultView?.setTimeout(() => {
|
|
25219
|
-
loginRefreshTimer = void 0;
|
|
25220
|
-
if (!login || context.signal.aborted) return;
|
|
25221
|
-
void context.runLatest(
|
|
25222
|
-
() => client().refreshCodexAccounts?.() ?? client().listCodexAccounts(),
|
|
25223
|
-
{
|
|
25224
|
-
success(result) {
|
|
25225
|
-
const refreshedLogin = login;
|
|
25226
|
-
const snapshotAdvanced = loginStartSnapshot && (result.instanceId !== void 0 && result.instanceId !== loginStartSnapshot.instanceId || result.instanceId === loginStartSnapshot.instanceId && result.revision > loginStartSnapshot.revision);
|
|
25227
|
-
setAccounts(result);
|
|
25228
|
-
if (refreshedLogin && snapshotAdvanced && result.phase !== "changing" && !(result.pendingOperation?.kind === "login" && result.pendingOperation.operationId === refreshedLogin.loginId)) {
|
|
25229
|
-
login = null;
|
|
25230
|
-
loginStartSnapshot = void 0;
|
|
25231
|
-
loginMessage = messages.accountLoginResultUnconfirmed;
|
|
25232
|
-
render();
|
|
25233
|
-
return;
|
|
25234
|
-
}
|
|
25235
|
-
scheduleLoginRefresh();
|
|
25236
|
-
},
|
|
25237
|
-
failure() {
|
|
25238
|
-
scheduleLoginRefresh();
|
|
25239
|
-
}
|
|
25240
|
-
}
|
|
25241
|
-
);
|
|
25242
|
-
}, 750);
|
|
25243
|
-
};
|
|
25244
25651
|
const render = () => {
|
|
25245
25652
|
const restoreFocus = accountListFocusRestorer(list, search);
|
|
25246
25653
|
body.replaceChildren();
|
|
25247
25654
|
status.replaceChildren();
|
|
25248
|
-
|
|
25249
|
-
const accountStatus = cleanupRequired ? cleanupOnly ? messages.accountCleanupRequired : messages.accountSavedUnavailable : accountPhase === "unavailable" && capabilities.reason === "recovery-required" ? messages.accountRecoveryRequired : capabilities.reason === "migration-required" ? accountPhase === "ready" && currentAccountId !== null ? messages.accountLegacyCompatibility : messages.accountMigrationRequired : loginMessage;
|
|
25250
|
-
if (accountStatus) status.append(accountStatus);
|
|
25251
|
-
if ((cleanupRequired || capabilities.reason === "recovery-required") && capabilities.recover) {
|
|
25252
|
-
const recover = document2.createElement("button");
|
|
25253
|
-
recover.type = "button";
|
|
25254
|
-
recover.className = "settings-command-button settings-command-button--secondary";
|
|
25255
|
-
recover.textContent = cleanupOnly ? accountRecovering ? messages.accountCleaningUp : messages.accountRetryCleanup : accountRecovering ? messages.accountRecovering : messages.accountRecover;
|
|
25256
|
-
recover.disabled = accountBusy();
|
|
25257
|
-
recover.addEventListener("click", recoverAccounts);
|
|
25258
|
-
status.append(" ", recover);
|
|
25259
|
-
}
|
|
25655
|
+
if (loadMessage) status.append(loadMessage);
|
|
25260
25656
|
connectedCount.textContent = String(accounts.length + harnessAccounts.accounts.length);
|
|
25261
25657
|
updateDisplay(usageDisplay);
|
|
25262
|
-
search.disabled = login !== null || loginStartingAccountId !== null;
|
|
25263
25658
|
for (const [display, button] of displayButtons) {
|
|
25264
25659
|
button.setAttribute("aria-pressed", String(display === usageDisplay));
|
|
25265
25660
|
}
|
|
25266
|
-
refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage || accounts.length === 0) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading")
|
|
25661
|
+
refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage || accounts.length === 0) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading");
|
|
25267
25662
|
const query = search.value.trim().toLocaleLowerCase();
|
|
25268
25663
|
const visibleAccounts = accounts.filter(
|
|
25269
25664
|
(account) => `Codex ${account.email ?? ""} ${account.label} ${accountPlanLabel(account.planType) ?? ""}`.toLocaleLowerCase().includes(query)
|
|
@@ -25280,25 +25675,13 @@ ${error51.stderrTail}`] : []
|
|
|
25280
25675
|
emptyRow.append(emptyCell);
|
|
25281
25676
|
body.append(emptyRow);
|
|
25282
25677
|
}
|
|
25283
|
-
add.disabled = accountBusy() || !capabilities.login;
|
|
25284
25678
|
for (const account of visibleAccounts) {
|
|
25285
25679
|
body.append(
|
|
25286
25680
|
...renderAccountRows(document2, account, messages, {
|
|
25287
25681
|
current: accountPhase === "ready" && account.accountId === currentAccountId,
|
|
25288
25682
|
usage: usageByAccountId.get(account.accountId),
|
|
25289
25683
|
display: usageDisplay,
|
|
25290
|
-
actionsDisabled: accountBusy(),
|
|
25291
|
-
switchDisabled: !capabilities.switch,
|
|
25292
|
-
loginDisabled: !capabilities.login,
|
|
25293
|
-
deleteDisabled: !capabilities.delete,
|
|
25294
|
-
logoutDisabled: !capabilities.logout,
|
|
25295
|
-
usingReset: usingResetAccountId === account.accountId,
|
|
25296
|
-
resetDisabled: accountBusy(),
|
|
25297
25684
|
resetExpanded: expandedResetAccounts.has(account.accountId),
|
|
25298
|
-
onActivate: () => switchAccount(account.accountId),
|
|
25299
|
-
onSignIn: () => startLogin(account.accountId),
|
|
25300
|
-
onDelete: () => deleteAccount(account.accountId),
|
|
25301
|
-
onLogout: logoutAccount,
|
|
25302
25685
|
onRetry: () => {
|
|
25303
25686
|
usageByAccountId.delete(account.accountId);
|
|
25304
25687
|
loadUsage(accounts);
|
|
@@ -25306,96 +25689,9 @@ ${error51.stderrTail}`] : []
|
|
|
25306
25689
|
onResetExpanded: (open) => {
|
|
25307
25690
|
if (open) expandedResetAccounts.add(account.accountId);
|
|
25308
25691
|
else expandedResetAccounts.delete(account.accountId);
|
|
25309
|
-
}
|
|
25310
|
-
...account.accountId === currentAccountId && accountPhase === "ready" && getClient()?.consumeCodexAccountResetCredit ? { onUseReset: () => useReset(account.accountId) } : {}
|
|
25692
|
+
}
|
|
25311
25693
|
})
|
|
25312
25694
|
);
|
|
25313
|
-
if (login?.accountId === account.accountId) {
|
|
25314
|
-
const verification = document2.createElement("div");
|
|
25315
|
-
verification.className = "settings-account-verification";
|
|
25316
|
-
const prompt = document2.createElement("span");
|
|
25317
|
-
prompt.textContent = messages.accountVerificationDescription;
|
|
25318
|
-
const link = document2.createElement("a");
|
|
25319
|
-
link.href = login.verificationUrl;
|
|
25320
|
-
link.target = "_blank";
|
|
25321
|
-
link.rel = "noopener noreferrer";
|
|
25322
|
-
link.textContent = login.verificationUrl;
|
|
25323
|
-
link.addEventListener("click", (event) => {
|
|
25324
|
-
const bridge = document2.defaultView?.electronBridge;
|
|
25325
|
-
if (typeof bridge?.sendMessageFromView !== "function") return;
|
|
25326
|
-
event.preventDefault();
|
|
25327
|
-
void Promise.resolve(
|
|
25328
|
-
bridge.sendMessageFromView({
|
|
25329
|
-
type: "open-in-browser",
|
|
25330
|
-
url: login?.verificationUrl ?? link.href,
|
|
25331
|
-
initiator: "open_in_browser_bridge",
|
|
25332
|
-
openTarget: "external-browser",
|
|
25333
|
-
source: "manual"
|
|
25334
|
-
})
|
|
25335
|
-
).catch(() => void 0);
|
|
25336
|
-
});
|
|
25337
|
-
const code = document2.createElement("code");
|
|
25338
|
-
code.textContent = login.userCode;
|
|
25339
|
-
const copyCode = document2.createElement("button");
|
|
25340
|
-
copyCode.type = "button";
|
|
25341
|
-
copyCode.className = "settings-command-button settings-command-button--secondary";
|
|
25342
|
-
copyCode.textContent = messages.accountCopyCode;
|
|
25343
|
-
copyCode.addEventListener("click", () => {
|
|
25344
|
-
void document2.defaultView?.navigator.clipboard?.writeText(login?.userCode ?? "").then(() => {
|
|
25345
|
-
copyCode.textContent = messages.accountCopied;
|
|
25346
|
-
});
|
|
25347
|
-
});
|
|
25348
|
-
const cancel = document2.createElement("button");
|
|
25349
|
-
cancel.type = "button";
|
|
25350
|
-
cancel.className = "settings-command-button settings-command-button--secondary";
|
|
25351
|
-
cancel.textContent = messages.accountLoginCancel;
|
|
25352
|
-
cancel.addEventListener(
|
|
25353
|
-
"click",
|
|
25354
|
-
() => cancelLogin(login?.accountId ?? "", login?.loginId ?? "")
|
|
25355
|
-
);
|
|
25356
|
-
verification.append(prompt, link, code, copyCode, cancel);
|
|
25357
|
-
const verificationRow = document2.createElement("tr");
|
|
25358
|
-
const verificationCell = document2.createElement("td");
|
|
25359
|
-
verificationCell.colSpan = 4;
|
|
25360
|
-
verificationCell.append(verification);
|
|
25361
|
-
verificationRow.append(verificationCell);
|
|
25362
|
-
body.append(verificationRow);
|
|
25363
|
-
}
|
|
25364
|
-
}
|
|
25365
|
-
if (login && !accounts.some((account) => account.accountId === login?.accountId)) {
|
|
25366
|
-
const verification = document2.createElement("div");
|
|
25367
|
-
verification.className = "settings-account-verification";
|
|
25368
|
-
const prompt = document2.createElement("span");
|
|
25369
|
-
prompt.textContent = messages.accountVerificationDescription;
|
|
25370
|
-
const link = document2.createElement("a");
|
|
25371
|
-
link.href = login.verificationUrl;
|
|
25372
|
-
link.target = "_blank";
|
|
25373
|
-
link.rel = "noopener noreferrer";
|
|
25374
|
-
link.textContent = login.verificationUrl;
|
|
25375
|
-
const code = document2.createElement("code");
|
|
25376
|
-
code.textContent = login.userCode;
|
|
25377
|
-
const copyCode = document2.createElement("button");
|
|
25378
|
-
copyCode.type = "button";
|
|
25379
|
-
copyCode.className = "settings-command-button settings-command-button--secondary";
|
|
25380
|
-
copyCode.textContent = messages.accountCopyCode;
|
|
25381
|
-
copyCode.addEventListener("click", () => {
|
|
25382
|
-
void document2.defaultView?.navigator.clipboard?.writeText(login?.userCode ?? "");
|
|
25383
|
-
});
|
|
25384
|
-
const cancel = document2.createElement("button");
|
|
25385
|
-
cancel.type = "button";
|
|
25386
|
-
cancel.className = "settings-command-button settings-command-button--secondary";
|
|
25387
|
-
cancel.textContent = messages.accountLoginCancel;
|
|
25388
|
-
cancel.addEventListener(
|
|
25389
|
-
"click",
|
|
25390
|
-
() => cancelLogin(login?.accountId ?? "", login?.loginId ?? "")
|
|
25391
|
-
);
|
|
25392
|
-
verification.append(prompt, link, code, copyCode, cancel);
|
|
25393
|
-
const verificationRow = document2.createElement("tr");
|
|
25394
|
-
const verificationCell = document2.createElement("td");
|
|
25395
|
-
verificationCell.colSpan = 4;
|
|
25396
|
-
verificationCell.append(verification);
|
|
25397
|
-
verificationRow.append(verificationCell);
|
|
25398
|
-
body.append(verificationRow);
|
|
25399
25695
|
}
|
|
25400
25696
|
for (const account of visibleHarnessAccounts) {
|
|
25401
25697
|
body.append(...renderHarnessAccountRows(document2, account, messages, usageDisplay));
|
|
@@ -25462,8 +25758,6 @@ ${error51.stderrTail}`] : []
|
|
|
25462
25758
|
accountPhase = result.phase;
|
|
25463
25759
|
accountRevision = result.revision;
|
|
25464
25760
|
accountInstanceId = result.instanceId;
|
|
25465
|
-
cleanupRequired = result.cleanupRequired ?? false;
|
|
25466
|
-
capabilities = result.capabilities;
|
|
25467
25761
|
for (const accountId of expandedResetAccounts) {
|
|
25468
25762
|
if (!accounts.some((account) => account.accountId === accountId))
|
|
25469
25763
|
expandedResetAccounts.delete(accountId);
|
|
@@ -25483,238 +25777,25 @@ ${error51.stderrTail}`] : []
|
|
|
25483
25777
|
}
|
|
25484
25778
|
);
|
|
25485
25779
|
};
|
|
25486
|
-
const load = (
|
|
25780
|
+
const load = () => {
|
|
25487
25781
|
void context.runLatest(() => client().listCodexAccounts(), {
|
|
25488
25782
|
success(result) {
|
|
25489
|
-
|
|
25783
|
+
loadMessage = null;
|
|
25490
25784
|
setAccounts(result);
|
|
25491
25785
|
refreshInBackground();
|
|
25492
25786
|
},
|
|
25493
25787
|
failure(error51) {
|
|
25494
|
-
|
|
25495
|
-
render();
|
|
25496
|
-
}
|
|
25497
|
-
});
|
|
25498
|
-
};
|
|
25499
|
-
const completeLogin = (result) => {
|
|
25500
|
-
if (context.signal.aborted || result.loginId !== login?.loginId) return;
|
|
25501
|
-
clearLoginRefresh();
|
|
25502
|
-
login = null;
|
|
25503
|
-
loginStartSnapshot = void 0;
|
|
25504
|
-
cleanupRequired = result.cleanupRequired ?? cleanupRequired;
|
|
25505
|
-
loginMessage = result.saved || result.success ? messages.accountLoginSucceeded : result.error ?? messages.accountLoginFailed;
|
|
25506
|
-
render();
|
|
25507
|
-
if (result.saved || result.success) load(true);
|
|
25508
|
-
};
|
|
25509
|
-
const reconcileLoginStart = (result) => {
|
|
25510
|
-
login = result;
|
|
25511
|
-
const completed = earlyLoginCompletions.get(result.loginId);
|
|
25512
|
-
earlyLoginCompletions.clear();
|
|
25513
|
-
if (completed) {
|
|
25514
|
-
completeLogin(completed);
|
|
25515
|
-
return;
|
|
25516
|
-
}
|
|
25517
|
-
render();
|
|
25518
|
-
scheduleLoginRefresh();
|
|
25519
|
-
};
|
|
25520
|
-
const switchAccount = (accountId) => {
|
|
25521
|
-
if (accountBusy() || !capabilities.switch || accountId === currentAccountId) return;
|
|
25522
|
-
accountActivating = true;
|
|
25523
|
-
loginMessage = null;
|
|
25524
|
-
render();
|
|
25525
|
-
void context.runLatest(() => client().switchCodexAccount({ accountId }), {
|
|
25526
|
-
success() {
|
|
25527
|
-
accountActivating = false;
|
|
25528
|
-
loginMessage = null;
|
|
25529
|
-
usageByAccountId.delete(accountId);
|
|
25530
|
-
load();
|
|
25531
|
-
},
|
|
25532
|
-
failure(error51) {
|
|
25533
|
-
accountActivating = false;
|
|
25534
|
-
loginMessage = errorMessage(error51, messages.accountLoadFailed);
|
|
25535
|
-
render();
|
|
25536
|
-
}
|
|
25537
|
-
});
|
|
25538
|
-
};
|
|
25539
|
-
const startLogin = (accountId) => {
|
|
25540
|
-
if (accountBusy() || !capabilities.login) return;
|
|
25541
|
-
loginStartingAccountId = accountId ?? "new";
|
|
25542
|
-
loginStartSnapshot = { instanceId: accountInstanceId, revision: accountRevision };
|
|
25543
|
-
loginMessage = messages.accountSigningIn;
|
|
25544
|
-
render();
|
|
25545
|
-
void context.runLatest(
|
|
25546
|
-
() => client().startCodexAccountLogin(accountId ? { accountId } : {}),
|
|
25547
|
-
{
|
|
25548
|
-
success(result) {
|
|
25549
|
-
loginStartingAccountId = null;
|
|
25550
|
-
loginMessage = null;
|
|
25551
|
-
reconcileLoginStart(result);
|
|
25552
|
-
},
|
|
25553
|
-
failure(error51) {
|
|
25554
|
-
loginStartingAccountId = null;
|
|
25555
|
-
loginStartSnapshot = void 0;
|
|
25556
|
-
earlyLoginCompletions.clear();
|
|
25557
|
-
loginMessage = errorMessage(error51, messages.accountLoginFailed);
|
|
25558
|
-
render();
|
|
25559
|
-
}
|
|
25560
|
-
}
|
|
25561
|
-
);
|
|
25562
|
-
};
|
|
25563
|
-
const createAndLogin = () => {
|
|
25564
|
-
if (accountBusy() || !capabilities.login) return;
|
|
25565
|
-
accountCreating = true;
|
|
25566
|
-
loginStartSnapshot = { instanceId: accountInstanceId, revision: accountRevision };
|
|
25567
|
-
loginMessage = messages.accountSigningIn;
|
|
25568
|
-
render();
|
|
25569
|
-
void context.runLatest(() => client().startCodexAccountLogin({}), {
|
|
25570
|
-
success(result) {
|
|
25571
|
-
accountCreating = false;
|
|
25572
|
-
loginMessage = null;
|
|
25573
|
-
search.value = "";
|
|
25574
|
-
reconcileLoginStart(result);
|
|
25575
|
-
},
|
|
25576
|
-
failure(error51) {
|
|
25577
|
-
accountCreating = false;
|
|
25578
|
-
loginStartSnapshot = void 0;
|
|
25579
|
-
earlyLoginCompletions.clear();
|
|
25580
|
-
loginMessage = errorMessage(error51, messages.accountLoginFailed);
|
|
25581
|
-
render();
|
|
25582
|
-
}
|
|
25583
|
-
});
|
|
25584
|
-
};
|
|
25585
|
-
const resetOutcomeMessage = (outcome) => {
|
|
25586
|
-
if (outcome === "reset") return messages.accountResetCreditsSucceeded;
|
|
25587
|
-
if (outcome === "nothingToReset") return messages.accountResetCreditsNothingToReset;
|
|
25588
|
-
if (outcome === "noCredit") return messages.accountResetCreditsNoCredit;
|
|
25589
|
-
return messages.accountResetCreditsAlreadyRedeemed;
|
|
25590
|
-
};
|
|
25591
|
-
const useReset = (accountId) => {
|
|
25592
|
-
const consume = getClient()?.consumeCodexAccountResetCredit;
|
|
25593
|
-
if (!consume || accountBusy()) return;
|
|
25594
|
-
if (document2.defaultView?.confirm?.(messages.accountResetCreditsConfirm) === false) return;
|
|
25595
|
-
usingResetAccountId = accountId;
|
|
25596
|
-
loginMessage = messages.accountResetCreditsUsing;
|
|
25597
|
-
render();
|
|
25598
|
-
void context.runLatest(() => consume({ accountId, idempotencyKey: crypto.randomUUID() }), {
|
|
25599
|
-
success(result) {
|
|
25600
|
-
usingResetAccountId = null;
|
|
25601
|
-
loginMessage = resetOutcomeMessage(result.outcome);
|
|
25602
|
-
if (result.accountCredits) {
|
|
25603
|
-
usageByAccountId.set(accountId, {
|
|
25604
|
-
status: "ready",
|
|
25605
|
-
credits: result.accountCredits,
|
|
25606
|
-
freshness: "live",
|
|
25607
|
-
observedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
25608
|
-
});
|
|
25609
|
-
} else if (result.outcome === "reset") {
|
|
25610
|
-
usageByAccountId.delete(accountId);
|
|
25611
|
-
loadUsage(accounts);
|
|
25612
|
-
}
|
|
25613
|
-
render();
|
|
25614
|
-
},
|
|
25615
|
-
failure(error51) {
|
|
25616
|
-
usingResetAccountId = null;
|
|
25617
|
-
loginMessage = errorMessage(error51, messages.accountResetCreditsFailed);
|
|
25618
|
-
render();
|
|
25619
|
-
}
|
|
25620
|
-
});
|
|
25621
|
-
};
|
|
25622
|
-
const deleteAccount = (accountId) => {
|
|
25623
|
-
const account = accounts.find((candidate) => candidate.accountId === accountId);
|
|
25624
|
-
if (!account || account.accountId === currentAccountId || !capabilities.delete || accountBusy())
|
|
25625
|
-
return;
|
|
25626
|
-
if (document2.defaultView?.confirm?.(messages.accountDeleteConfirm) === false) return;
|
|
25627
|
-
deletingAccountId = accountId;
|
|
25628
|
-
loginMessage = messages.accountDeleting;
|
|
25629
|
-
render();
|
|
25630
|
-
void context.runLatest(() => client().deleteCodexAccount({ accountId }), {
|
|
25631
|
-
success() {
|
|
25632
|
-
deletingAccountId = null;
|
|
25633
|
-
loginMessage = null;
|
|
25634
|
-
load();
|
|
25635
|
-
},
|
|
25636
|
-
failure(error51) {
|
|
25637
|
-
deletingAccountId = null;
|
|
25638
|
-
loginMessage = errorMessage(error51, messages.accountDeleteFailed);
|
|
25639
|
-
render();
|
|
25640
|
-
}
|
|
25641
|
-
});
|
|
25642
|
-
};
|
|
25643
|
-
const logoutAccount = () => {
|
|
25644
|
-
if (accountBusy() || !capabilities.logout || currentAccountId === null) return;
|
|
25645
|
-
if (document2.defaultView?.confirm?.(messages.accountLogoutConfirm) === false) return;
|
|
25646
|
-
accountLoggingOut = true;
|
|
25647
|
-
loginMessage = messages.accountLoggingOut;
|
|
25648
|
-
render();
|
|
25649
|
-
void context.runLatest(() => client().logoutCodexAccount({}), {
|
|
25650
|
-
success() {
|
|
25651
|
-
accountLoggingOut = false;
|
|
25652
|
-
loginMessage = messages.accountLoggedOut;
|
|
25653
|
-
load();
|
|
25654
|
-
},
|
|
25655
|
-
failure(error51) {
|
|
25656
|
-
accountLoggingOut = false;
|
|
25657
|
-
loginMessage = errorMessage(error51, messages.accountLogoutFailed);
|
|
25658
|
-
render();
|
|
25659
|
-
}
|
|
25660
|
-
});
|
|
25661
|
-
};
|
|
25662
|
-
const recoverAccounts = () => {
|
|
25663
|
-
if (accountBusy() || !capabilities.recover) return;
|
|
25664
|
-
accountRecovering = true;
|
|
25665
|
-
loginMessage = cleanupRequired && accountPhase === "ready" ? messages.accountCleaningUp : messages.accountRecovering;
|
|
25666
|
-
render();
|
|
25667
|
-
void context.runLatest(() => client().recoverCodexAccounts({}), {
|
|
25668
|
-
success(result) {
|
|
25669
|
-
accountRecovering = false;
|
|
25670
|
-
loginMessage = null;
|
|
25671
|
-
setAccounts(result);
|
|
25672
|
-
render();
|
|
25673
|
-
},
|
|
25674
|
-
failure(error51) {
|
|
25675
|
-
accountRecovering = false;
|
|
25676
|
-
loginMessage = errorMessage(error51, messages.accountRecoveryRequired);
|
|
25788
|
+
loadMessage = errorMessage(error51, messages.accountLoadFailed);
|
|
25677
25789
|
render();
|
|
25678
25790
|
}
|
|
25679
25791
|
});
|
|
25680
25792
|
};
|
|
25681
|
-
const cancelLogin = (_accountId, loginId) => {
|
|
25682
|
-
void context.runLatest(() => client().cancelCodexAccountLogin({ loginId }), {
|
|
25683
|
-
success() {
|
|
25684
|
-
clearLoginRefresh();
|
|
25685
|
-
earlyLoginCompletions.clear();
|
|
25686
|
-
login = null;
|
|
25687
|
-
loginStartSnapshot = void 0;
|
|
25688
|
-
loginMessage = null;
|
|
25689
|
-
render();
|
|
25690
|
-
},
|
|
25691
|
-
failure(error51) {
|
|
25692
|
-
loginMessage = errorMessage(error51, messages.accountLoginFailed);
|
|
25693
|
-
render();
|
|
25694
|
-
}
|
|
25695
|
-
});
|
|
25696
|
-
};
|
|
25697
|
-
add.addEventListener("click", createAndLogin);
|
|
25698
|
-
let unsubscribe;
|
|
25699
25793
|
let unsubscribeAccounts;
|
|
25700
25794
|
try {
|
|
25701
25795
|
unsubscribeAccounts = getClient()?.subscribeCodexAccounts?.((result) => {
|
|
25702
25796
|
setAccounts(result);
|
|
25703
25797
|
render();
|
|
25704
25798
|
});
|
|
25705
|
-
unsubscribe = getClient()?.subscribeCodexAccountLogin?.((result) => {
|
|
25706
|
-
if (context.signal.aborted) return;
|
|
25707
|
-
if (result.loginId === login?.loginId) {
|
|
25708
|
-
completeLogin(result);
|
|
25709
|
-
return;
|
|
25710
|
-
}
|
|
25711
|
-
if (login || loginStartingAccountId === null && !accountCreating) return;
|
|
25712
|
-
earlyLoginCompletions.set(result.loginId, result);
|
|
25713
|
-
if (earlyLoginCompletions.size > 4) {
|
|
25714
|
-
const oldestLoginId = earlyLoginCompletions.keys().next().value;
|
|
25715
|
-
if (oldestLoginId) earlyLoginCompletions.delete(oldestLoginId);
|
|
25716
|
-
}
|
|
25717
|
-
});
|
|
25718
25799
|
} catch {
|
|
25719
25800
|
}
|
|
25720
25801
|
const harnessAccounts = createHarnessAccounts(context.signal, getClient, render);
|
|
@@ -25722,9 +25803,6 @@ ${error51.stderrTail}`] : []
|
|
|
25722
25803
|
load();
|
|
25723
25804
|
return () => {
|
|
25724
25805
|
stopCountdowns();
|
|
25725
|
-
clearLoginRefresh();
|
|
25726
|
-
earlyLoginCompletions.clear();
|
|
25727
|
-
unsubscribe?.();
|
|
25728
25806
|
unsubscribeAccounts?.();
|
|
25729
25807
|
};
|
|
25730
25808
|
}
|
|
@@ -26210,12 +26288,12 @@ ${error51.stderrTail}`] : []
|
|
|
26210
26288
|
}
|
|
26211
26289
|
});
|
|
26212
26290
|
}
|
|
26213
|
-
function createDefaultRendererSettingsPages(messages = DEFAULT_RENDERER_SETTINGS_MESSAGES, getUpdateClient = () => null, getDiagnostics = () => null, getAccountClient = () => null, getSessionImportClient = () => null, openImportedThread = () => Promise.reject(new Error("Imported Thread navigation is unavailable"))) {
|
|
26291
|
+
function createDefaultRendererSettingsPages(messages = DEFAULT_RENDERER_SETTINGS_MESSAGES, getUpdateClient = () => null, getDiagnostics = () => null, getAccountClient = () => null, getSessionImportClient = () => null, openImportedThread = () => Promise.reject(new Error("Imported Thread navigation is unavailable")), getLoadedSessionsClient = () => null) {
|
|
26214
26292
|
return Object.freeze([
|
|
26215
26293
|
createConnectionsSettingsPage(messages, getDiagnostics),
|
|
26216
26294
|
createAccountsSettingsPage(messages, getAccountClient),
|
|
26217
26295
|
createSessionImportSettingsPage(messages, getSessionImportClient, openImportedThread),
|
|
26218
|
-
createAppearanceSettingsPage(messages),
|
|
26296
|
+
createAppearanceSettingsPage(messages, getLoadedSessionsClient),
|
|
26219
26297
|
updatesPage(messages, getUpdateClient),
|
|
26220
26298
|
aboutPage(messages)
|
|
26221
26299
|
]);
|
|
@@ -26234,10 +26312,1966 @@ ${error51.stderrTail}`] : []
|
|
|
26234
26312
|
}
|
|
26235
26313
|
|
|
26236
26314
|
// src/settings/shell.css
|
|
26237
|
-
var shell_default = ':host {\n --settings-bg: light-dark(#ffffff, #202020);\n --settings-sidebar: light-dark(#f7f7f8, #191919);\n --settings-panel: light-dark(#ffffff, #232323);\n --settings-surface: light-dark(#f6f6f6, #292929);\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-inset: light-dark(#f3f3f3, #161616);\n --settings-text: light-dark(#0d0d0d, #ececec);\n --settings-muted: light-dark(#676767, #a3a3a3);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\n --settings-focus: light-dark(#0b75d1, #66aaf9);\n --settings-primary: light-dark(#171717, #f4f4f4);\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\n --settings-primary-text: light-dark(#ffffff, #171717);\n --settings-warning: light-dark(#8a5500, #f5c96a);\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\n --settings-danger: light-dark(#b42318, #f87171);\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\n --settings-success: light-dark(#16784a, #4ade80);\n color: var(--settings-text);\n color-scheme: inherit;\n font:\n 13px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 14px;\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\n}\n\n.codexhost-settings-dialog::backdrop {\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\n backdrop-filter: blur(1px);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 184px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 14px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 48px;\n flex: none;\n padding: 0 12px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-header-actions {\n display: flex;\n align-items: center;\n flex: none;\n gap: 12px;\n margin-left: auto;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 24px;\n height: 24px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 8px;\n padding-left: 8px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 2px;\n padding: 0 7px 10px;\n overflow-y: auto;\n}\n\n.settings-nav-section-label {\n min-height: 24px;\n padding: 4px 9px 2px;\n color: var(--settings-subtle);\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-nav-section-label:not(:first-child) {\n margin-top: 8px;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 34px;\n flex: none;\n gap: 9px;\n padding: 6px 9px;\n color: var(--settings-text);\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 16px;\n height: 16px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-nav-star-link {\n margin-top: 0;\n color: var(--settings-text);\n text-decoration: none;\n}\n\n.settings-nav-star-link .codexhost-settings-icon {\n color: var(--settings-warning);\n}\n\n.settings-nav-star-link:hover {\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 28px 0 36px;\n}\n\n.settings-section-label {\n min-height: auto;\n margin: 0;\n padding: 0 0 18px;\n color: var(--settings-text);\n font-size: 18px;\n font-weight: 600;\n line-height: 26px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 72px;\n gap: 20px;\n padding: 12px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 10px;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 3px 8px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-page-description {\n max-width: 760px;\n margin: -10px 0 20px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 24px;\n}\n\n.settings-session-import-header .settings-section-label {\n min-width: 0;\n}\n\n.settings-session-import-harness {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n margin: -12px 0 16px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-session-import-harness > span {\n flex: none;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n align-items: center;\n min-width: 0;\n flex: 1;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.settings-session-import-harness__options::-webkit-scrollbar {\n display: none;\n}\n\n.settings-session-import-harness__option {\n min-height: 32px;\n flex: none;\n padding: 6px 10px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n white-space: nowrap;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-session-import-harness__option[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n border-color: rgb(51 156 255 / 50%);\n}\n\n.settings-session-import-harness__option:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.settings-session-import-harness__option:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-harness + .settings-page-description {\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.settings-session-import-availability-note {\n margin-top: 0;\n}\n\n.settings-session-import-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin: 16px 0;\n}\n\n.settings-session-import-search input {\n flex: 1;\n min-width: 160px;\n}\n\n.settings-session-import-search input,\n.settings-session-import-pagination select {\n min-height: 36px;\n padding: 6px 10px;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-search input:focus-visible,\n.settings-session-import-pagination select:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-pagination {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-session-import-pagination label {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-session-import-pagination > span {\n flex: 1;\n min-width: 130px;\n}\n\n.settings-session-import-pagination__navigation {\n display: flex;\n gap: 8px;\n margin-left: auto;\n}\n\n.settings-session-import-content,\n.settings-session-import-list {\n display: grid;\n gap: 10px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 64px;\n gap: 12px;\n padding: 16px;\n color: var(--settings-muted);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-status.is-error {\n color: #ef4444;\n}\n\n.settings-session-import-recovery {\n display: grid;\n justify-items: start;\n gap: 14px;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-recovery:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 4px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 14px;\n}\n\n.settings-session-import-recovery__copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-session-import-recovery__path {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n padding: 8px 10px;\n overflow-x: auto;\n color: var(--settings-text);\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery__path .settings-command-button {\n min-height: 0;\n flex: none;\n border-width: 0 0 0 1px;\n border-radius: 0;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-width: 0;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-row__copy {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-session-import-row__copy strong {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__cwd {\n display: block;\n min-width: 0;\n background: transparent;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-preference-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 32px;\n min-height: 88px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-divider);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-preference-row__copy {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n gap: 5px;\n}\n\n.settings-preference-row__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-preference-row__copy span {\n max-width: 680px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-preference-switch {\n display: inline-flex;\n align-items: center;\n width: 42px;\n height: 24px;\n flex: none;\n padding: 2px;\n border: 0;\n border-radius: 999px;\n background: var(--settings-surface-hover);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.settings-preference-switch[aria-checked="true"] {\n justify-content: flex-end;\n background: var(--settings-focus);\n}\n\n.settings-preference-switch:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-preference-switch__thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--settings-primary-text);\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\n}\n\n.settings-preference-checkbox {\n width: 18px;\n height: 18px;\n flex: none;\n margin: 0;\n accent-color: var(--settings-focus);\n cursor: pointer;\n}\n\n.settings-preference-checkbox:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-connection-page-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 18px;\n margin-bottom: 18px;\n}\n\n.settings-connection-page-header .settings-section-label {\n padding-bottom: 0;\n}\n\n.settings-connection-page-header .settings-page-description {\n margin: 5px 0 0;\n}\n\n.settings-connections-content,\n.settings-connections-layout,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-layout {\n display: grid;\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\n align-items: start;\n gap: 18px;\n}\n\n.settings-connection-list,\n.settings-connection-inspector {\n overflow: hidden;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-host-strip {\n display: grid;\n grid-template-columns: 30px minmax(0, 1fr) 30px;\n align-items: center;\n min-width: 0;\n gap: 5px;\n padding: 9px 10px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-host-scroll {\n display: none;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 34px;\n padding: 0;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-connection-host-strip[data-connection-host-overflow="true"]\n .settings-connection-host-scroll {\n display: inline-flex;\n}\n\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.settings-connection-host-scroll:hover:not(:disabled) {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-scroll:disabled {\n cursor: default;\n opacity: 0.35;\n}\n\n.settings-connection-host-scroll:focus-visible,\n.settings-connection-host-tab:focus-visible,\n.settings-connection-row:focus-visible,\n.settings-connection-install-link:focus-visible,\n.settings-connection-view-error:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-connection-host-tabs {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n scroll-behavior: smooth;\n scroll-snap-type: x proximity;\n touch-action: pan-x;\n}\n\n.settings-connection-host-tabs::-webkit-scrollbar {\n display: none;\n}\n\n.settings-connection-host-tab {\n display: inline-flex;\n align-items: center;\n height: 30px;\n min-width: max-content;\n flex: none;\n padding: 0 9px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n cursor: pointer;\n scroll-snap-align: start;\n}\n\n.settings-connection-host-tab:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-tab[aria-selected="true"] {\n color: var(--settings-text);\n font-weight: 600;\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-table-header,\n.settings-connection-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\n align-items: center;\n min-width: 0;\n gap: 10px;\n}\n\n.settings-connection-table-header {\n min-height: 30px;\n padding: 0 10px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: transparent;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row:hover {\n background: var(--settings-hover);\n}\n\n.settings-connection-row[data-connection-selected="true"] {\n background: var(--settings-surface);\n}\n\n.settings-connection-row__identity,\n.settings-connection-inspector__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n color: var(--settings-text);\n}\n\n.settings-connection-row__identity strong,\n.settings-connection-inspector__identity strong {\n min-width: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n flex: none;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface);\n border-radius: 6px;\n}\n\n.settings-connection-row__mark--logo {\n color: var(--settings-text);\n background: transparent;\n}\n\n.settings-connection-row__mark--logo > img,\n.settings-connection-row__mark--logo > svg {\n display: block;\n max-width: 18px;\n max-height: 18px;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n gap: 5px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__status::before {\n width: 6px;\n height: 6px;\n flex: none;\n content: "";\n background: currentColor;\n border-radius: 50%;\n}\n\n.settings-connection-row__status[data-connection-tone="ready"] {\n color: var(--settings-success);\n}\n\n.settings-connection-row__status[data-connection-tone="checking"] {\n color: var(--settings-warning);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"] {\n color: var(--settings-muted);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"]::before {\n background: transparent;\n border: 1.5px solid currentColor;\n}\n\n.settings-connection-row__status[data-connection-tone="failed"] {\n color: var(--settings-danger);\n}\n\n.settings-connection-row__action {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-connection-row__handle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n color: var(--settings-muted);\n cursor: grab;\n opacity: 0.6;\n}\n\n.settings-connection-row__handle:hover {\n opacity: 1;\n}\n\n.settings-connection-row[draggable="true"] {\n cursor: grab;\n}\n\n.settings-connection-row[data-connection-dragging="true"] {\n opacity: 0.4;\n}\n\n.settings-connection-row[data-connection-drop-indicator="before"] {\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row[data-connection-drop-indicator="after"] {\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row__group-toggle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-row__group-toggle:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-group-divider {\n padding: 10px 12px 6px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n /* No border-top here: the row immediately above already carries its own\n border-bottom (it is no longer :last-child once this divider follows\n it), so adding one here would double the separator line. */\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] {\n background: rgb(51 156 255 / 8%);\n}\n\n.settings-connection-group-hint {\n display: grid;\n gap: 3px;\n margin: 0 12px 12px;\n padding: 14px 16px;\n text-align: center;\n border: 1.5px dashed var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\n border-color: var(--settings-focus);\n}\n\n.settings-connection-group-hint strong {\n color: var(--settings-text);\n font-size: 12.5px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-group-hint span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 17px;\n}\n\n.settings-connection-group-reset {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 6px;\n padding: 10px 12px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n text-align: left;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n cursor: pointer;\n}\n\n.settings-connection-group-reset:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-install-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-focus);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-row:hover .settings-connection-install-link,\n.settings-connection-install-link:focus-visible {\n opacity: 1;\n}\n\n.settings-connection-install-link:hover {\n color: var(--settings-focus);\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-view-error {\n padding: 4px 7px;\n color: var(--settings-danger);\n font: inherit;\n font-size: 11px;\n line-height: 18px;\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-view-error:hover {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n\n.settings-connection-inspector {\n position: sticky;\n top: 18px;\n}\n\n.settings-connection-inspector__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n min-width: 0;\n gap: 10px;\n padding: 12px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-inspector__body {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 12px;\n}\n\n.settings-connection-install-callout {\n display: grid;\n grid-template-columns: 28px minmax(0, 1fr);\n gap: 9px;\n padding: 11px;\n background: var(--settings-surface);\n border: 0;\n border-radius: 8px;\n}\n\n.settings-connection-install-callout__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: var(--settings-focus);\n background: var(--settings-active);\n border-radius: 7px;\n}\n\n.settings-connection-install-callout strong,\n.settings-connection-error-summary strong,\n.settings-connection-state-summary strong {\n display: block;\n margin: 0 0 4px;\n color: var(--settings-text);\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-install-callout p,\n.settings-connection-error-summary p,\n.settings-connection-state-summary p,\n.settings-connection-issue-note {\n margin: 0;\n color: var(--settings-muted);\n font-size: 11px;\n line-height: 16px;\n}\n\n.settings-connection-install-button {\n width: fit-content;\n}\n\n.settings-connection-error-summary {\n padding: 13px 14px;\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.settings-connection-error-metadata {\n display: grid;\n gap: 7px;\n padding: 12px;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-detail-line {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n line-height: 16px;\n}\n\n.settings-connection-detail-line code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n white-space: pre-wrap;\n}\n\n.settings-connection-error-log-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.settings-connection-error-log-header strong {\n color: var(--settings-text);\n font-size: 11px;\n font-weight: 600;\n}\n\n.settings-connection-error-log-header .settings-command-button {\n min-height: 30px;\n padding: 5px 9px;\n font-size: 11px;\n}\n\n.settings-connection-stderr {\n max-height: 220px;\n min-width: 0;\n margin: 0;\n padding: 11px;\n overflow: auto;\n color: var(--settings-text);\n font:\n 10px/16px ui-monospace,\n "SFMono-Regular",\n Consolas,\n "Liberation Mono",\n monospace;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-error-actions {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n}\n\n.settings-connection-error-actions .settings-command-button {\n width: 100%;\n}\n\n.settings-connection-issue-note {\n margin-top: -4px;\n}\n\n.settings-connection-state-summary {\n padding: 14px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-about-panel {\n display: grid;\n max-width: 720px;\n gap: 18px;\n padding: 24px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-about-product {\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 700;\n line-height: 32px;\n}\n\n.settings-about-tagline {\n color: var(--settings-text);\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.settings-about-copy {\n display: grid;\n max-width: 660px;\n gap: 12px;\n}\n\n.settings-about-copy p,\n.settings-about-repository p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-star-callout {\n margin: 2px 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository {\n display: grid;\n gap: 10px;\n padding-top: 18px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-about-repository-link {\n display: flex;\n align-items: center;\n width: fit-content;\n min-width: 0;\n max-width: 100%;\n gap: 8px;\n color: var(--settings-focus);\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-repository-link code {\n min-width: 0;\n overflow: hidden;\n color: var(--settings-muted);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 11px;\n font-weight: 400;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n/* The only emphasis on this screen: a latest version newer than the installed one. */\n.settings-update-metadata__value--newer {\n color: var(--settings-focus);\n}\n\n.settings-update-panel {\n display: grid;\n gap: 12px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel__head {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-panel__head .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel__title {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: var(--settings-danger);\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: var(--settings-focus);\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\n.settings-update-notes-section {\n min-width: 0;\n margin-top: 24px;\n padding-top: 24px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes-section:empty {\n display: none;\n}\n\n.settings-update-notes {\n display: grid;\n min-width: 0;\n gap: 12px;\n color: var(--settings-muted);\n font-size: 14px;\n line-height: 22px;\n overflow-wrap: anywhere;\n}\n\n.settings-update-notes > :first-child {\n margin-top: 0;\n}\n\n.settings-update-notes > :last-child {\n margin-bottom: 0;\n}\n\n.settings-update-notes h1,\n.settings-update-notes h2,\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n margin: 6px 0 0;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes h1 {\n font-size: 18px;\n line-height: 26px;\n}\n\n.settings-update-notes h2 {\n font-size: 17px;\n line-height: 24px;\n}\n\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n font-size: 14px;\n line-height: 22px;\n}\n\n.settings-update-notes p,\n.settings-update-notes ul,\n.settings-update-notes ol,\n.settings-update-notes pre,\n.settings-update-notes blockquote {\n margin: 0;\n}\n\n.settings-update-notes ul,\n.settings-update-notes ol {\n padding-left: 24px;\n}\n\n.settings-update-notes li {\n padding-left: 4px;\n}\n\n.settings-update-notes li::marker {\n color: var(--settings-muted);\n font-size: 0.85em;\n}\n\n.settings-update-notes li + li {\n margin-top: 14px;\n}\n\n.settings-update-notes .release-note-translation {\n display: block;\n margin-top: 3px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-notes blockquote {\n padding: 8px 12px;\n color: var(--settings-muted);\n border-left: 3px solid var(--settings-focus);\n background: var(--settings-surface);\n}\n\n.settings-update-notes hr {\n width: 100%;\n margin: 2px 0;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes strong {\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes a {\n color: var(--settings-focus);\n text-decoration: none;\n}\n\n.settings-update-notes a:hover {\n text-decoration: underline;\n}\n\n.settings-update-notes code {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n}\n\n.settings-update-notes :not(pre) > code {\n padding: 1px 5px;\n background: var(--settings-surface);\n border-radius: 4px;\n}\n\n.settings-update-notes pre {\n min-width: 0;\n max-width: 100%;\n padding: 10px 12px;\n overflow-x: auto;\n overflow-y: hidden;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n/* Manual update sits directly under the status panel, not behind a disclosure:\n automatic updates can fail for machine-local reasons and this is the way out. */\n.settings-update-controls {\n display: grid;\n min-width: 0;\n gap: 10px;\n margin-top: 24px;\n}\n\n.settings-update-manual-title {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual-description {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual-description.is-fallback {\n color: var(--settings-danger);\n}\n\n.settings-update-command {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-update-command code {\n min-width: 0;\n flex: 1;\n padding: 9px 12px;\n overflow-x: auto;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-update-command__copy {\n display: inline-flex;\n align-items: center;\n flex: none;\n gap: 6px;\n padding: 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-left: 1px solid var(--settings-border);\n cursor: pointer;\n}\n\n.settings-update-command__copy:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-update-command__copy:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-update-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: max-content;\n max-width: 100%;\n min-height: 30px;\n gap: 6px;\n padding: 5px 10px;\n white-space: nowrap;\n color: var(--settings-primary-text);\n font: inherit;\n font-size: 12px;\n text-decoration: none;\n background: var(--settings-primary);\n border: 1px solid var(--settings-primary);\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: var(--settings-panel);\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover:not(:disabled) {\n background: var(--settings-primary-hover);\n border-color: var(--settings-primary-hover);\n}\n\n.settings-command-button--secondary:hover:not(:disabled),\n.settings-update-link:hover {\n background: var(--settings-hover);\n border-color: var(--settings-border);\n}\n\n.settings-command-button--danger {\n color: #f87171;\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: rgb(127 29 29 / 24%);\n border-color: rgb(248 113 113 / 45%);\n}\n\n.settings-command-button:disabled {\n cursor: default;\n opacity: 0.45;\n}\n\n.settings-command-button:disabled,\n.settings-command-button[aria-disabled="true"] {\n opacity: 0.55;\n cursor: not-allowed;\n filter: none;\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n align-items: flex-start;\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-section-label {\n display: none;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-nav-star-link {\n margin-top: 0;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-update-metadata {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-account-header,\n .settings-connection-page-header {\n flex-direction: column;\n }\n\n .settings-account-header > .settings-command-button,\n .settings-connection-page-header > .settings-command-button {\n width: 100%;\n }\n\n .settings-connections-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-connection-inspector {\n position: static;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-surface: Canvas;\n --settings-surface-hover: Highlight;\n --settings-inset: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-subtle: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n --settings-primary: ButtonFace;\n --settings-primary-hover: Highlight;\n --settings-primary-text: ButtonText;\n --settings-warning: CanvasText;\n --settings-warning-bg: Canvas;\n --settings-warning-border: ButtonBorder;\n --settings-danger: CanvasText;\n --settings-danger-bg: Canvas;\n --settings-danger-border: ButtonBorder;\n --settings-success: CanvasText;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n transition-duration: 0s !important;\n }\n}\n';
|
|
26315
|
+
var shell_default = `:host {
|
|
26316
|
+
--settings-titlebar-height: env(titlebar-area-height, 0px);
|
|
26317
|
+
--settings-bg: light-dark(#ffffff, #202020);
|
|
26318
|
+
--settings-sidebar: light-dark(#f7f7f8, #191919);
|
|
26319
|
+
--settings-panel: light-dark(#ffffff, #232323);
|
|
26320
|
+
--settings-surface: light-dark(#f6f6f6, #292929);
|
|
26321
|
+
--settings-surface-hover: light-dark(#eeeeee, #303030);
|
|
26322
|
+
--settings-inset: light-dark(#f3f3f3, #161616);
|
|
26323
|
+
--settings-text: light-dark(#0d0d0d, #ececec);
|
|
26324
|
+
--settings-muted: light-dark(#676767, #a3a3a3);
|
|
26325
|
+
--settings-subtle: light-dark(#8a8a8a, #777777);
|
|
26326
|
+
--settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));
|
|
26327
|
+
--settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));
|
|
26328
|
+
--settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));
|
|
26329
|
+
--settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));
|
|
26330
|
+
--settings-focus: light-dark(#0b75d1, #66aaf9);
|
|
26331
|
+
--settings-primary: light-dark(#171717, #f4f4f4);
|
|
26332
|
+
--settings-primary-hover: light-dark(#2f2f2f, #ffffff);
|
|
26333
|
+
--settings-primary-text: light-dark(#ffffff, #171717);
|
|
26334
|
+
--settings-warning: light-dark(#8a5500, #f5c96a);
|
|
26335
|
+
--settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));
|
|
26336
|
+
--settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));
|
|
26337
|
+
--settings-danger: light-dark(#b42318, #f87171);
|
|
26338
|
+
--settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));
|
|
26339
|
+
--settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));
|
|
26340
|
+
--settings-success: light-dark(#16784a, #4ade80);
|
|
26341
|
+
color: var(--settings-text);
|
|
26342
|
+
color-scheme: inherit;
|
|
26343
|
+
font:
|
|
26344
|
+
13px/1.5 system-ui,
|
|
26345
|
+
-apple-system,
|
|
26346
|
+
BlinkMacSystemFont,
|
|
26347
|
+
"Segoe UI",
|
|
26348
|
+
sans-serif;
|
|
26349
|
+
letter-spacing: 0;
|
|
26350
|
+
}
|
|
26351
|
+
|
|
26352
|
+
/* Element defaults stay below Tailwind utilities; unlayered component classes still override them. */
|
|
26353
|
+
@layer base {
|
|
26354
|
+
*,
|
|
26355
|
+
*::before,
|
|
26356
|
+
*::after {
|
|
26357
|
+
box-sizing: border-box;
|
|
26358
|
+
letter-spacing: 0;
|
|
26359
|
+
}
|
|
26360
|
+
|
|
26361
|
+
button,
|
|
26362
|
+
input,
|
|
26363
|
+
select {
|
|
26364
|
+
font: inherit;
|
|
26365
|
+
}
|
|
26366
|
+
|
|
26367
|
+
button {
|
|
26368
|
+
color: inherit;
|
|
26369
|
+
}
|
|
26370
|
+
}
|
|
26371
|
+
|
|
26372
|
+
[hidden] {
|
|
26373
|
+
display: none !important;
|
|
26374
|
+
}
|
|
26375
|
+
|
|
26376
|
+
.settings-visually-hidden {
|
|
26377
|
+
position: absolute;
|
|
26378
|
+
width: 1px;
|
|
26379
|
+
height: 1px;
|
|
26380
|
+
padding: 0;
|
|
26381
|
+
margin: -1px;
|
|
26382
|
+
overflow: hidden;
|
|
26383
|
+
clip-path: inset(50%);
|
|
26384
|
+
white-space: nowrap;
|
|
26385
|
+
border: 0;
|
|
26386
|
+
}
|
|
26387
|
+
|
|
26388
|
+
.codexhost-settings-dialog {
|
|
26389
|
+
/* Native window controls sit above the DOM top layer. Center below them. */
|
|
26390
|
+
inset: var(--settings-titlebar-height) 0 0;
|
|
26391
|
+
width: min(1120px, calc(100vw - 32px));
|
|
26392
|
+
height: min(780px, calc(100vh - var(--settings-titlebar-height) - 32px));
|
|
26393
|
+
-webkit-app-region: no-drag;
|
|
26394
|
+
max-width: none;
|
|
26395
|
+
max-height: none;
|
|
26396
|
+
margin: auto;
|
|
26397
|
+
padding: 0;
|
|
26398
|
+
overflow: hidden;
|
|
26399
|
+
color: var(--settings-text);
|
|
26400
|
+
background: var(--settings-bg);
|
|
26401
|
+
border: 1px solid var(--settings-border);
|
|
26402
|
+
border-radius: 14px;
|
|
26403
|
+
box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));
|
|
26404
|
+
}
|
|
26405
|
+
|
|
26406
|
+
.codexhost-settings-dialog::backdrop {
|
|
26407
|
+
/* Backdrops do not inherit the shell's custom properties. */
|
|
26408
|
+
top: env(titlebar-area-height, 0px);
|
|
26409
|
+
-webkit-app-region: no-drag;
|
|
26410
|
+
background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));
|
|
26411
|
+
backdrop-filter: blur(1px);
|
|
26412
|
+
}
|
|
26413
|
+
|
|
26414
|
+
.settings-frame,
|
|
26415
|
+
.settings-layout {
|
|
26416
|
+
width: 100%;
|
|
26417
|
+
height: 100%;
|
|
26418
|
+
min-width: 0;
|
|
26419
|
+
min-height: 0;
|
|
26420
|
+
}
|
|
26421
|
+
|
|
26422
|
+
.settings-frame {
|
|
26423
|
+
display: flex;
|
|
26424
|
+
flex-direction: column;
|
|
26425
|
+
}
|
|
26426
|
+
|
|
26427
|
+
.settings-layout {
|
|
26428
|
+
flex: 1;
|
|
26429
|
+
display: grid;
|
|
26430
|
+
grid-template-columns: 184px minmax(0, 1fr);
|
|
26431
|
+
background: var(--settings-bg);
|
|
26432
|
+
}
|
|
26433
|
+
|
|
26434
|
+
.settings-sidebar {
|
|
26435
|
+
display: flex;
|
|
26436
|
+
min-width: 0;
|
|
26437
|
+
min-height: 0;
|
|
26438
|
+
flex-direction: column;
|
|
26439
|
+
overflow: hidden;
|
|
26440
|
+
background: var(--settings-sidebar);
|
|
26441
|
+
border-right: 1px solid var(--settings-border);
|
|
26442
|
+
padding-top: 14px;
|
|
26443
|
+
}
|
|
26444
|
+
|
|
26445
|
+
.settings-header {
|
|
26446
|
+
display: flex;
|
|
26447
|
+
align-items: center;
|
|
26448
|
+
min-width: 0;
|
|
26449
|
+
height: 48px;
|
|
26450
|
+
flex: none;
|
|
26451
|
+
padding: 0 12px;
|
|
26452
|
+
border-bottom: 1px solid var(--settings-border);
|
|
26453
|
+
}
|
|
26454
|
+
|
|
26455
|
+
.settings-header-actions {
|
|
26456
|
+
display: flex;
|
|
26457
|
+
align-items: center;
|
|
26458
|
+
flex: none;
|
|
26459
|
+
gap: 12px;
|
|
26460
|
+
margin-left: auto;
|
|
26461
|
+
}
|
|
26462
|
+
|
|
26463
|
+
.settings-brand {
|
|
26464
|
+
display: flex;
|
|
26465
|
+
align-items: center;
|
|
26466
|
+
min-width: 0;
|
|
26467
|
+
gap: 7px;
|
|
26468
|
+
}
|
|
26469
|
+
|
|
26470
|
+
.settings-brand__mark {
|
|
26471
|
+
display: inline-flex;
|
|
26472
|
+
align-items: center;
|
|
26473
|
+
justify-content: center;
|
|
26474
|
+
width: 26px;
|
|
26475
|
+
height: 26px;
|
|
26476
|
+
flex: none;
|
|
26477
|
+
color: var(--settings-text);
|
|
26478
|
+
}
|
|
26479
|
+
|
|
26480
|
+
.settings-brand__mark .codexhost-settings-icon {
|
|
26481
|
+
width: 24px;
|
|
26482
|
+
height: 24px;
|
|
26483
|
+
object-fit: contain;
|
|
26484
|
+
}
|
|
26485
|
+
|
|
26486
|
+
.settings-brand__copy {
|
|
26487
|
+
display: flex;
|
|
26488
|
+
min-width: 0;
|
|
26489
|
+
align-items: baseline;
|
|
26490
|
+
gap: 0;
|
|
26491
|
+
line-height: 20px;
|
|
26492
|
+
}
|
|
26493
|
+
|
|
26494
|
+
.settings-brand__name {
|
|
26495
|
+
overflow: hidden;
|
|
26496
|
+
color: var(--settings-text);
|
|
26497
|
+
font-size: 13px;
|
|
26498
|
+
font-weight: 600;
|
|
26499
|
+
text-overflow: ellipsis;
|
|
26500
|
+
white-space: nowrap;
|
|
26501
|
+
}
|
|
26502
|
+
|
|
26503
|
+
.settings-brand__title {
|
|
26504
|
+
margin-left: 8px;
|
|
26505
|
+
padding-left: 8px;
|
|
26506
|
+
color: var(--settings-muted);
|
|
26507
|
+
font-size: 13px;
|
|
26508
|
+
font-weight: 400;
|
|
26509
|
+
border-left: 1px solid var(--settings-border);
|
|
26510
|
+
}
|
|
26511
|
+
|
|
26512
|
+
.settings-nav {
|
|
26513
|
+
display: flex;
|
|
26514
|
+
min-width: 0;
|
|
26515
|
+
min-height: 0;
|
|
26516
|
+
flex: 1;
|
|
26517
|
+
flex-direction: column;
|
|
26518
|
+
gap: 2px;
|
|
26519
|
+
padding: 0 7px 10px;
|
|
26520
|
+
overflow-y: auto;
|
|
26521
|
+
}
|
|
26522
|
+
|
|
26523
|
+
.settings-nav-section-label {
|
|
26524
|
+
min-height: 24px;
|
|
26525
|
+
padding: 4px 9px 2px;
|
|
26526
|
+
color: var(--settings-subtle);
|
|
26527
|
+
font-size: 11px;
|
|
26528
|
+
font-weight: 600;
|
|
26529
|
+
line-height: 18px;
|
|
26530
|
+
}
|
|
26531
|
+
|
|
26532
|
+
.settings-nav-section-label:not(:first-child) {
|
|
26533
|
+
margin-top: 8px;
|
|
26534
|
+
}
|
|
26535
|
+
|
|
26536
|
+
.settings-nav-button {
|
|
26537
|
+
display: grid;
|
|
26538
|
+
grid-template-columns: 16px minmax(0, 1fr);
|
|
26539
|
+
align-items: center;
|
|
26540
|
+
width: 100%;
|
|
26541
|
+
position: relative;
|
|
26542
|
+
min-height: 34px;
|
|
26543
|
+
flex: none;
|
|
26544
|
+
gap: 9px;
|
|
26545
|
+
padding: 6px 9px;
|
|
26546
|
+
color: var(--settings-text);
|
|
26547
|
+
font-size: 13px;
|
|
26548
|
+
line-height: 20px;
|
|
26549
|
+
text-align: left;
|
|
26550
|
+
background: transparent;
|
|
26551
|
+
border: 0;
|
|
26552
|
+
border-radius: 8px;
|
|
26553
|
+
cursor: pointer;
|
|
26554
|
+
}
|
|
26555
|
+
|
|
26556
|
+
.settings-nav-button .codexhost-settings-icon {
|
|
26557
|
+
width: 16px;
|
|
26558
|
+
height: 16px;
|
|
26559
|
+
opacity: 0.9;
|
|
26560
|
+
}
|
|
26561
|
+
|
|
26562
|
+
.settings-nav-button:hover {
|
|
26563
|
+
background: var(--settings-hover);
|
|
26564
|
+
}
|
|
26565
|
+
|
|
26566
|
+
.settings-nav-button[aria-current="page"] {
|
|
26567
|
+
background: var(--settings-active);
|
|
26568
|
+
color: var(--settings-text);
|
|
26569
|
+
font-weight: 500;
|
|
26570
|
+
}
|
|
26571
|
+
|
|
26572
|
+
.settings-nav-button span {
|
|
26573
|
+
min-width: 0;
|
|
26574
|
+
overflow: hidden;
|
|
26575
|
+
text-overflow: ellipsis;
|
|
26576
|
+
white-space: nowrap;
|
|
26577
|
+
}
|
|
26578
|
+
|
|
26579
|
+
.settings-nav-star-link {
|
|
26580
|
+
margin-top: 0;
|
|
26581
|
+
color: var(--settings-text);
|
|
26582
|
+
text-decoration: none;
|
|
26583
|
+
}
|
|
26584
|
+
|
|
26585
|
+
.settings-nav-star-link .codexhost-settings-icon {
|
|
26586
|
+
color: var(--settings-warning);
|
|
26587
|
+
}
|
|
26588
|
+
|
|
26589
|
+
.settings-nav-star-link:hover {
|
|
26590
|
+
color: var(--settings-warning);
|
|
26591
|
+
background: var(--settings-warning-bg);
|
|
26592
|
+
}
|
|
26593
|
+
|
|
26594
|
+
.settings-icon-button {
|
|
26595
|
+
display: inline-flex;
|
|
26596
|
+
align-items: center;
|
|
26597
|
+
justify-content: center;
|
|
26598
|
+
width: 28px;
|
|
26599
|
+
height: 28px;
|
|
26600
|
+
flex: none;
|
|
26601
|
+
padding: 0;
|
|
26602
|
+
color: var(--settings-muted);
|
|
26603
|
+
background: transparent;
|
|
26604
|
+
border: 0;
|
|
26605
|
+
border-radius: 8px;
|
|
26606
|
+
cursor: pointer;
|
|
26607
|
+
}
|
|
26608
|
+
|
|
26609
|
+
.settings-icon-button:hover {
|
|
26610
|
+
color: var(--settings-text);
|
|
26611
|
+
background: var(--settings-hover);
|
|
26612
|
+
}
|
|
26613
|
+
|
|
26614
|
+
.settings-icon-button:focus-visible,
|
|
26615
|
+
.settings-nav-button:focus-visible {
|
|
26616
|
+
outline: 2px solid var(--settings-focus);
|
|
26617
|
+
outline-offset: 1px;
|
|
26618
|
+
}
|
|
26619
|
+
|
|
26620
|
+
.settings-page {
|
|
26621
|
+
display: block;
|
|
26622
|
+
position: relative;
|
|
26623
|
+
min-width: 0;
|
|
26624
|
+
min-height: 0;
|
|
26625
|
+
overflow-y: auto;
|
|
26626
|
+
background: var(--settings-bg);
|
|
26627
|
+
scrollbar-gutter: stable;
|
|
26628
|
+
}
|
|
26629
|
+
|
|
26630
|
+
.settings-page__content {
|
|
26631
|
+
width: min(930px, calc(100% - 80px));
|
|
26632
|
+
margin-inline: auto;
|
|
26633
|
+
}
|
|
26634
|
+
|
|
26635
|
+
.settings-page__content {
|
|
26636
|
+
min-width: 0;
|
|
26637
|
+
padding: 28px 0 36px;
|
|
26638
|
+
}
|
|
26639
|
+
|
|
26640
|
+
.settings-section-label {
|
|
26641
|
+
min-height: auto;
|
|
26642
|
+
margin: 0;
|
|
26643
|
+
padding: 0 0 18px;
|
|
26644
|
+
color: var(--settings-text);
|
|
26645
|
+
font-size: 18px;
|
|
26646
|
+
font-weight: 600;
|
|
26647
|
+
line-height: 26px;
|
|
26648
|
+
}
|
|
26649
|
+
|
|
26650
|
+
.settings-status-list,
|
|
26651
|
+
.settings-empty {
|
|
26652
|
+
overflow: hidden;
|
|
26653
|
+
background: var(--settings-panel);
|
|
26654
|
+
}
|
|
26655
|
+
|
|
26656
|
+
.settings-status-row {
|
|
26657
|
+
display: grid;
|
|
26658
|
+
grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);
|
|
26659
|
+
position: relative;
|
|
26660
|
+
align-items: center;
|
|
26661
|
+
min-height: 72px;
|
|
26662
|
+
gap: 20px;
|
|
26663
|
+
padding: 12px 0;
|
|
26664
|
+
}
|
|
26665
|
+
|
|
26666
|
+
.settings-status-row:not(:last-child)::after {
|
|
26667
|
+
content: "";
|
|
26668
|
+
position: absolute;
|
|
26669
|
+
right: 0;
|
|
26670
|
+
bottom: 0;
|
|
26671
|
+
left: 0;
|
|
26672
|
+
height: 1px;
|
|
26673
|
+
background: var(--settings-divider);
|
|
26674
|
+
}
|
|
26675
|
+
|
|
26676
|
+
.settings-status-row__identity {
|
|
26677
|
+
display: inline-flex;
|
|
26678
|
+
align-items: center;
|
|
26679
|
+
min-width: 0;
|
|
26680
|
+
color: var(--settings-text);
|
|
26681
|
+
gap: 10px;
|
|
26682
|
+
font-size: 14px;
|
|
26683
|
+
font-weight: 500;
|
|
26684
|
+
line-height: 22px;
|
|
26685
|
+
}
|
|
26686
|
+
|
|
26687
|
+
.settings-status-row__icon {
|
|
26688
|
+
display: inline-flex;
|
|
26689
|
+
align-items: center;
|
|
26690
|
+
justify-content: center;
|
|
26691
|
+
width: 36px;
|
|
26692
|
+
height: 36px;
|
|
26693
|
+
flex: none;
|
|
26694
|
+
color: var(--settings-muted);
|
|
26695
|
+
background: var(--settings-surface);
|
|
26696
|
+
border-radius: 50%;
|
|
26697
|
+
}
|
|
26698
|
+
|
|
26699
|
+
.settings-status-badge {
|
|
26700
|
+
flex: none;
|
|
26701
|
+
padding: 3px 8px;
|
|
26702
|
+
color: var(--settings-muted);
|
|
26703
|
+
font-size: 11px;
|
|
26704
|
+
font-weight: 500;
|
|
26705
|
+
line-height: 18px;
|
|
26706
|
+
background: var(--settings-surface);
|
|
26707
|
+
border: 1px solid var(--settings-border);
|
|
26708
|
+
border-radius: 6px;
|
|
26709
|
+
}
|
|
26710
|
+
|
|
26711
|
+
.settings-status-row__detail {
|
|
26712
|
+
min-width: 0;
|
|
26713
|
+
color: var(--settings-muted);
|
|
26714
|
+
font-size: 13px;
|
|
26715
|
+
line-height: 20px;
|
|
26716
|
+
}
|
|
26717
|
+
|
|
26718
|
+
.settings-page-description {
|
|
26719
|
+
max-width: 760px;
|
|
26720
|
+
margin: -10px 0 20px;
|
|
26721
|
+
color: var(--settings-muted);
|
|
26722
|
+
font-size: 12px;
|
|
26723
|
+
line-height: 18px;
|
|
26724
|
+
}
|
|
26725
|
+
|
|
26726
|
+
.settings-session-import-header {
|
|
26727
|
+
display: flex;
|
|
26728
|
+
align-items: flex-start;
|
|
26729
|
+
justify-content: space-between;
|
|
26730
|
+
gap: 24px;
|
|
26731
|
+
}
|
|
26732
|
+
|
|
26733
|
+
.settings-session-import-header .settings-section-label {
|
|
26734
|
+
min-width: 0;
|
|
26735
|
+
}
|
|
26736
|
+
|
|
26737
|
+
.settings-session-import-harness {
|
|
26738
|
+
display: flex;
|
|
26739
|
+
align-items: center;
|
|
26740
|
+
min-width: 0;
|
|
26741
|
+
gap: 12px;
|
|
26742
|
+
margin: -12px 0 16px;
|
|
26743
|
+
color: var(--settings-muted);
|
|
26744
|
+
font-size: 13px;
|
|
26745
|
+
}
|
|
26746
|
+
|
|
26747
|
+
.settings-session-import-harness > span {
|
|
26748
|
+
flex: none;
|
|
26749
|
+
}
|
|
26750
|
+
|
|
26751
|
+
.settings-session-import-harness__options {
|
|
26752
|
+
display: flex;
|
|
26753
|
+
align-items: center;
|
|
26754
|
+
min-width: 0;
|
|
26755
|
+
flex: 1;
|
|
26756
|
+
gap: 6px;
|
|
26757
|
+
overflow-x: auto;
|
|
26758
|
+
overflow-y: hidden;
|
|
26759
|
+
scrollbar-width: none;
|
|
26760
|
+
}
|
|
26761
|
+
|
|
26762
|
+
.settings-session-import-harness__options::-webkit-scrollbar {
|
|
26763
|
+
display: none;
|
|
26764
|
+
}
|
|
26765
|
+
|
|
26766
|
+
.settings-session-import-harness__option {
|
|
26767
|
+
min-height: 32px;
|
|
26768
|
+
flex: none;
|
|
26769
|
+
padding: 6px 10px;
|
|
26770
|
+
color: var(--settings-muted);
|
|
26771
|
+
font: inherit;
|
|
26772
|
+
font-size: 12px;
|
|
26773
|
+
white-space: nowrap;
|
|
26774
|
+
background: rgb(255 255 255 / 4%);
|
|
26775
|
+
border: 1px solid var(--settings-border);
|
|
26776
|
+
border-radius: 6px;
|
|
26777
|
+
cursor: pointer;
|
|
26778
|
+
}
|
|
26779
|
+
|
|
26780
|
+
.settings-session-import-harness__option[aria-pressed="true"] {
|
|
26781
|
+
color: var(--settings-text);
|
|
26782
|
+
background: var(--settings-active);
|
|
26783
|
+
border-color: rgb(51 156 255 / 50%);
|
|
26784
|
+
}
|
|
26785
|
+
|
|
26786
|
+
.settings-session-import-harness__option:disabled {
|
|
26787
|
+
opacity: 0.38;
|
|
26788
|
+
cursor: not-allowed;
|
|
26789
|
+
}
|
|
26790
|
+
|
|
26791
|
+
.settings-session-import-harness__option:focus-visible {
|
|
26792
|
+
outline: 2px solid var(--settings-focus);
|
|
26793
|
+
outline-offset: 2px;
|
|
26794
|
+
}
|
|
26795
|
+
|
|
26796
|
+
.settings-session-import-harness + .settings-page-description {
|
|
26797
|
+
margin-top: 0;
|
|
26798
|
+
margin-bottom: 4px;
|
|
26799
|
+
}
|
|
26800
|
+
|
|
26801
|
+
.settings-session-import-availability-note {
|
|
26802
|
+
margin-top: 0;
|
|
26803
|
+
}
|
|
26804
|
+
|
|
26805
|
+
.settings-session-import-search,
|
|
26806
|
+
.settings-session-import-pagination {
|
|
26807
|
+
display: flex;
|
|
26808
|
+
flex-wrap: wrap;
|
|
26809
|
+
align-items: center;
|
|
26810
|
+
gap: 10px;
|
|
26811
|
+
margin: 16px 0;
|
|
26812
|
+
}
|
|
26813
|
+
|
|
26814
|
+
.settings-session-import-search input {
|
|
26815
|
+
flex: 1;
|
|
26816
|
+
min-width: 160px;
|
|
26817
|
+
}
|
|
26818
|
+
|
|
26819
|
+
.settings-session-import-search input,
|
|
26820
|
+
.settings-session-import-pagination select {
|
|
26821
|
+
min-height: 36px;
|
|
26822
|
+
padding: 6px 10px;
|
|
26823
|
+
color: var(--settings-text);
|
|
26824
|
+
background: var(--settings-bg);
|
|
26825
|
+
border: 1px solid var(--settings-border);
|
|
26826
|
+
border-radius: 6px;
|
|
26827
|
+
}
|
|
26828
|
+
|
|
26829
|
+
.settings-session-import-search input:focus-visible,
|
|
26830
|
+
.settings-session-import-pagination select:focus-visible {
|
|
26831
|
+
outline: 2px solid var(--settings-focus);
|
|
26832
|
+
outline-offset: 2px;
|
|
26833
|
+
}
|
|
26834
|
+
|
|
26835
|
+
.settings-session-import-pagination {
|
|
26836
|
+
color: var(--settings-muted);
|
|
26837
|
+
font-size: 12px;
|
|
26838
|
+
}
|
|
26839
|
+
|
|
26840
|
+
.settings-session-import-pagination label {
|
|
26841
|
+
display: flex;
|
|
26842
|
+
align-items: center;
|
|
26843
|
+
gap: 8px;
|
|
26844
|
+
}
|
|
26845
|
+
|
|
26846
|
+
.settings-session-import-pagination > span {
|
|
26847
|
+
flex: 1;
|
|
26848
|
+
min-width: 130px;
|
|
26849
|
+
}
|
|
26850
|
+
|
|
26851
|
+
.settings-session-import-pagination__navigation {
|
|
26852
|
+
display: flex;
|
|
26853
|
+
gap: 8px;
|
|
26854
|
+
margin-left: auto;
|
|
26855
|
+
}
|
|
26856
|
+
|
|
26857
|
+
.settings-session-import-content,
|
|
26858
|
+
.settings-session-import-list {
|
|
26859
|
+
display: grid;
|
|
26860
|
+
gap: 10px;
|
|
26861
|
+
}
|
|
26862
|
+
|
|
26863
|
+
.settings-session-import-status {
|
|
26864
|
+
display: flex;
|
|
26865
|
+
align-items: center;
|
|
26866
|
+
min-height: 64px;
|
|
26867
|
+
gap: 12px;
|
|
26868
|
+
padding: 16px;
|
|
26869
|
+
color: var(--settings-muted);
|
|
26870
|
+
background: var(--settings-panel);
|
|
26871
|
+
border: 1px solid var(--settings-border);
|
|
26872
|
+
border-radius: 8px;
|
|
26873
|
+
}
|
|
26874
|
+
|
|
26875
|
+
.settings-session-import-status.is-error {
|
|
26876
|
+
color: #ef4444;
|
|
26877
|
+
}
|
|
26878
|
+
|
|
26879
|
+
.settings-session-import-recovery {
|
|
26880
|
+
display: grid;
|
|
26881
|
+
justify-items: start;
|
|
26882
|
+
gap: 14px;
|
|
26883
|
+
padding: 16px;
|
|
26884
|
+
background: var(--settings-panel);
|
|
26885
|
+
border: 1px solid var(--settings-border);
|
|
26886
|
+
border-radius: 8px;
|
|
26887
|
+
}
|
|
26888
|
+
|
|
26889
|
+
.settings-session-import-recovery:focus-visible {
|
|
26890
|
+
outline: 2px solid var(--settings-focus);
|
|
26891
|
+
outline-offset: 2px;
|
|
26892
|
+
}
|
|
26893
|
+
|
|
26894
|
+
.settings-session-import-recovery__copy {
|
|
26895
|
+
display: grid;
|
|
26896
|
+
gap: 4px;
|
|
26897
|
+
}
|
|
26898
|
+
|
|
26899
|
+
.settings-session-import-recovery__copy strong {
|
|
26900
|
+
color: var(--settings-text);
|
|
26901
|
+
font-size: 14px;
|
|
26902
|
+
}
|
|
26903
|
+
|
|
26904
|
+
.settings-session-import-recovery__copy p {
|
|
26905
|
+
margin: 0;
|
|
26906
|
+
color: var(--settings-muted);
|
|
26907
|
+
font-size: 13px;
|
|
26908
|
+
line-height: 20px;
|
|
26909
|
+
}
|
|
26910
|
+
|
|
26911
|
+
.settings-session-import-recovery__path {
|
|
26912
|
+
display: flex;
|
|
26913
|
+
align-items: stretch;
|
|
26914
|
+
width: 100%;
|
|
26915
|
+
min-width: 0;
|
|
26916
|
+
overflow: hidden;
|
|
26917
|
+
border: 1px solid var(--settings-border);
|
|
26918
|
+
border-radius: 6px;
|
|
26919
|
+
}
|
|
26920
|
+
|
|
26921
|
+
.settings-session-import-recovery__path code {
|
|
26922
|
+
min-width: 0;
|
|
26923
|
+
flex: 1;
|
|
26924
|
+
padding: 8px 10px;
|
|
26925
|
+
overflow-x: auto;
|
|
26926
|
+
color: var(--settings-text);
|
|
26927
|
+
font-size: 12px;
|
|
26928
|
+
line-height: 20px;
|
|
26929
|
+
white-space: nowrap;
|
|
26930
|
+
}
|
|
26931
|
+
|
|
26932
|
+
.settings-session-import-recovery__path .settings-command-button {
|
|
26933
|
+
min-height: 0;
|
|
26934
|
+
flex: none;
|
|
26935
|
+
border-width: 0 0 0 1px;
|
|
26936
|
+
border-radius: 0;
|
|
26937
|
+
}
|
|
26938
|
+
|
|
26939
|
+
.settings-session-import-row {
|
|
26940
|
+
display: grid;
|
|
26941
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
26942
|
+
align-items: center;
|
|
26943
|
+
gap: 20px;
|
|
26944
|
+
min-width: 0;
|
|
26945
|
+
padding: 16px;
|
|
26946
|
+
background: var(--settings-panel);
|
|
26947
|
+
border: 1px solid var(--settings-border);
|
|
26948
|
+
border-radius: 8px;
|
|
26949
|
+
}
|
|
26950
|
+
|
|
26951
|
+
.settings-session-import-row__copy {
|
|
26952
|
+
display: grid;
|
|
26953
|
+
min-width: 0;
|
|
26954
|
+
gap: 4px;
|
|
26955
|
+
}
|
|
26956
|
+
|
|
26957
|
+
.settings-session-import-row__copy strong {
|
|
26958
|
+
overflow: hidden;
|
|
26959
|
+
color: var(--settings-text);
|
|
26960
|
+
font-size: 14px;
|
|
26961
|
+
text-overflow: ellipsis;
|
|
26962
|
+
white-space: nowrap;
|
|
26963
|
+
}
|
|
26964
|
+
|
|
26965
|
+
.settings-session-import-row__copy span,
|
|
26966
|
+
.settings-session-import-row__cwd {
|
|
26967
|
+
overflow: hidden;
|
|
26968
|
+
color: var(--settings-muted);
|
|
26969
|
+
font-size: 12px;
|
|
26970
|
+
line-height: 18px;
|
|
26971
|
+
text-overflow: ellipsis;
|
|
26972
|
+
white-space: nowrap;
|
|
26973
|
+
}
|
|
26974
|
+
|
|
26975
|
+
.settings-session-import-row__cwd {
|
|
26976
|
+
display: block;
|
|
26977
|
+
min-width: 0;
|
|
26978
|
+
background: transparent;
|
|
26979
|
+
}
|
|
26980
|
+
|
|
26981
|
+
.settings-session-import-row__action {
|
|
26982
|
+
display: flex;
|
|
26983
|
+
align-items: flex-end;
|
|
26984
|
+
flex-direction: column;
|
|
26985
|
+
gap: 8px;
|
|
26986
|
+
}
|
|
26987
|
+
|
|
26988
|
+
.settings-session-import-running {
|
|
26989
|
+
color: var(--settings-muted);
|
|
26990
|
+
font-size: 12px;
|
|
26991
|
+
}
|
|
26992
|
+
|
|
26993
|
+
.settings-connection-page-header {
|
|
26994
|
+
display: flex;
|
|
26995
|
+
align-items: flex-start;
|
|
26996
|
+
justify-content: space-between;
|
|
26997
|
+
gap: 18px;
|
|
26998
|
+
margin-bottom: 18px;
|
|
26999
|
+
}
|
|
27000
|
+
|
|
27001
|
+
.settings-connection-page-header .settings-section-label {
|
|
27002
|
+
padding-bottom: 0;
|
|
27003
|
+
}
|
|
27004
|
+
|
|
27005
|
+
.settings-connection-page-header .settings-page-description {
|
|
27006
|
+
margin: 5px 0 0;
|
|
27007
|
+
}
|
|
27008
|
+
|
|
27009
|
+
.settings-connections-content,
|
|
27010
|
+
.settings-connections-layout,
|
|
27011
|
+
.settings-connection-list,
|
|
27012
|
+
.settings-connection-rows {
|
|
27013
|
+
min-width: 0;
|
|
27014
|
+
}
|
|
27015
|
+
|
|
27016
|
+
.settings-connections-layout {
|
|
27017
|
+
display: grid;
|
|
27018
|
+
grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);
|
|
27019
|
+
align-items: start;
|
|
27020
|
+
gap: 18px;
|
|
27021
|
+
}
|
|
27022
|
+
|
|
27023
|
+
.settings-connection-list,
|
|
27024
|
+
.settings-connection-inspector {
|
|
27025
|
+
overflow: hidden;
|
|
27026
|
+
background: var(--settings-panel);
|
|
27027
|
+
border: 1px solid var(--settings-border);
|
|
27028
|
+
border-radius: 10px;
|
|
27029
|
+
}
|
|
27030
|
+
|
|
27031
|
+
.settings-connection-host-strip {
|
|
27032
|
+
display: grid;
|
|
27033
|
+
grid-template-columns: 30px minmax(0, 1fr) 30px;
|
|
27034
|
+
align-items: center;
|
|
27035
|
+
min-width: 0;
|
|
27036
|
+
gap: 5px;
|
|
27037
|
+
padding: 9px 10px;
|
|
27038
|
+
border-bottom: 1px solid var(--settings-divider);
|
|
27039
|
+
}
|
|
27040
|
+
|
|
27041
|
+
.settings-connection-host-scroll {
|
|
27042
|
+
display: none;
|
|
27043
|
+
align-items: center;
|
|
27044
|
+
justify-content: center;
|
|
27045
|
+
width: 30px;
|
|
27046
|
+
height: 34px;
|
|
27047
|
+
padding: 0;
|
|
27048
|
+
color: var(--settings-muted);
|
|
27049
|
+
background: var(--settings-inset);
|
|
27050
|
+
border: 1px solid var(--settings-border);
|
|
27051
|
+
border-radius: 8px;
|
|
27052
|
+
cursor: pointer;
|
|
27053
|
+
}
|
|
27054
|
+
|
|
27055
|
+
.settings-connection-host-strip[data-connection-host-overflow="true"]
|
|
27056
|
+
.settings-connection-host-scroll {
|
|
27057
|
+
display: inline-flex;
|
|
27058
|
+
}
|
|
27059
|
+
|
|
27060
|
+
.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {
|
|
27061
|
+
grid-template-columns: minmax(0, 1fr);
|
|
27062
|
+
}
|
|
27063
|
+
|
|
27064
|
+
.settings-connection-host-scroll:hover:not(:disabled) {
|
|
27065
|
+
color: var(--settings-text);
|
|
27066
|
+
background: var(--settings-hover);
|
|
27067
|
+
}
|
|
27068
|
+
|
|
27069
|
+
.settings-connection-host-scroll:disabled {
|
|
27070
|
+
cursor: default;
|
|
27071
|
+
opacity: 0.35;
|
|
27072
|
+
}
|
|
27073
|
+
|
|
27074
|
+
.settings-connection-host-scroll:focus-visible,
|
|
27075
|
+
.settings-connection-host-tab:focus-visible,
|
|
27076
|
+
.settings-connection-row:focus-visible,
|
|
27077
|
+
.settings-connection-install-link:focus-visible,
|
|
27078
|
+
.settings-connection-view-error:focus-visible {
|
|
27079
|
+
outline: 2px solid var(--settings-focus);
|
|
27080
|
+
outline-offset: 1px;
|
|
27081
|
+
}
|
|
27082
|
+
|
|
27083
|
+
.settings-connection-host-tabs {
|
|
27084
|
+
display: flex;
|
|
27085
|
+
align-items: center;
|
|
27086
|
+
min-width: 0;
|
|
27087
|
+
gap: 6px;
|
|
27088
|
+
overflow-x: auto;
|
|
27089
|
+
overflow-y: hidden;
|
|
27090
|
+
overscroll-behavior-x: contain;
|
|
27091
|
+
scrollbar-width: none;
|
|
27092
|
+
scroll-behavior: smooth;
|
|
27093
|
+
scroll-snap-type: x proximity;
|
|
27094
|
+
touch-action: pan-x;
|
|
27095
|
+
}
|
|
27096
|
+
|
|
27097
|
+
.settings-connection-host-tabs::-webkit-scrollbar {
|
|
27098
|
+
display: none;
|
|
27099
|
+
}
|
|
27100
|
+
|
|
27101
|
+
.settings-connection-host-tab {
|
|
27102
|
+
display: inline-flex;
|
|
27103
|
+
align-items: center;
|
|
27104
|
+
height: 30px;
|
|
27105
|
+
min-width: max-content;
|
|
27106
|
+
flex: none;
|
|
27107
|
+
padding: 0 9px;
|
|
27108
|
+
color: var(--settings-muted);
|
|
27109
|
+
font: inherit;
|
|
27110
|
+
font-size: 12px;
|
|
27111
|
+
line-height: 18px;
|
|
27112
|
+
white-space: nowrap;
|
|
27113
|
+
background: var(--settings-inset);
|
|
27114
|
+
border: 1px solid var(--settings-border);
|
|
27115
|
+
border-radius: 7px;
|
|
27116
|
+
cursor: pointer;
|
|
27117
|
+
scroll-snap-align: start;
|
|
27118
|
+
}
|
|
27119
|
+
|
|
27120
|
+
.settings-connection-host-tab:hover {
|
|
27121
|
+
color: var(--settings-text);
|
|
27122
|
+
background: var(--settings-hover);
|
|
27123
|
+
}
|
|
27124
|
+
|
|
27125
|
+
.settings-connection-host-tab[aria-selected="true"] {
|
|
27126
|
+
color: var(--settings-text);
|
|
27127
|
+
font-weight: 600;
|
|
27128
|
+
background: var(--settings-active);
|
|
27129
|
+
border-color: var(--settings-border);
|
|
27130
|
+
}
|
|
27131
|
+
|
|
27132
|
+
.settings-connection-table-header,
|
|
27133
|
+
.settings-connection-row {
|
|
27134
|
+
display: grid;
|
|
27135
|
+
grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;
|
|
27136
|
+
align-items: center;
|
|
27137
|
+
min-width: 0;
|
|
27138
|
+
gap: 10px;
|
|
27139
|
+
}
|
|
27140
|
+
|
|
27141
|
+
.settings-connection-table-header {
|
|
27142
|
+
min-height: 30px;
|
|
27143
|
+
padding: 0 10px;
|
|
27144
|
+
color: var(--settings-muted);
|
|
27145
|
+
font-size: 10px;
|
|
27146
|
+
font-weight: 600;
|
|
27147
|
+
line-height: 16px;
|
|
27148
|
+
text-transform: uppercase;
|
|
27149
|
+
letter-spacing: 0.06em;
|
|
27150
|
+
background: transparent;
|
|
27151
|
+
border-bottom: 1px solid var(--settings-divider);
|
|
27152
|
+
}
|
|
27153
|
+
|
|
27154
|
+
.settings-connection-row {
|
|
27155
|
+
min-height: 52px;
|
|
27156
|
+
padding: 8px 10px;
|
|
27157
|
+
cursor: pointer;
|
|
27158
|
+
border-bottom: 1px solid var(--settings-divider);
|
|
27159
|
+
}
|
|
27160
|
+
|
|
27161
|
+
.settings-connection-row:last-child {
|
|
27162
|
+
border-bottom: 0;
|
|
27163
|
+
}
|
|
27164
|
+
|
|
27165
|
+
.settings-connection-row:hover {
|
|
27166
|
+
background: var(--settings-hover);
|
|
27167
|
+
}
|
|
27168
|
+
|
|
27169
|
+
.settings-connection-row[data-connection-selected="true"] {
|
|
27170
|
+
background: var(--settings-surface);
|
|
27171
|
+
}
|
|
27172
|
+
|
|
27173
|
+
.settings-connection-row__identity,
|
|
27174
|
+
.settings-connection-inspector__identity {
|
|
27175
|
+
display: inline-flex;
|
|
27176
|
+
align-items: center;
|
|
27177
|
+
min-width: 0;
|
|
27178
|
+
gap: 8px;
|
|
27179
|
+
color: var(--settings-text);
|
|
27180
|
+
}
|
|
27181
|
+
|
|
27182
|
+
.settings-connection-row__identity strong,
|
|
27183
|
+
.settings-connection-inspector__identity strong {
|
|
27184
|
+
min-width: 0;
|
|
27185
|
+
overflow-wrap: anywhere;
|
|
27186
|
+
font-size: 12px;
|
|
27187
|
+
font-weight: 500;
|
|
27188
|
+
line-height: 18px;
|
|
27189
|
+
}
|
|
27190
|
+
|
|
27191
|
+
.settings-connection-row__mark {
|
|
27192
|
+
display: inline-flex;
|
|
27193
|
+
align-items: center;
|
|
27194
|
+
justify-content: center;
|
|
27195
|
+
width: 24px;
|
|
27196
|
+
height: 24px;
|
|
27197
|
+
flex: none;
|
|
27198
|
+
color: var(--settings-muted);
|
|
27199
|
+
font-size: 10px;
|
|
27200
|
+
font-weight: 700;
|
|
27201
|
+
background: var(--settings-surface);
|
|
27202
|
+
border-radius: 6px;
|
|
27203
|
+
}
|
|
27204
|
+
|
|
27205
|
+
.settings-connection-row__mark--logo {
|
|
27206
|
+
color: var(--settings-text);
|
|
27207
|
+
background: transparent;
|
|
27208
|
+
}
|
|
27209
|
+
|
|
27210
|
+
.settings-connection-row__mark--logo > img,
|
|
27211
|
+
.settings-connection-row__mark--logo > svg {
|
|
27212
|
+
display: block;
|
|
27213
|
+
max-width: 18px;
|
|
27214
|
+
max-height: 18px;
|
|
27215
|
+
}
|
|
27216
|
+
|
|
27217
|
+
.settings-connection-row__status {
|
|
27218
|
+
display: inline-flex;
|
|
27219
|
+
align-items: center;
|
|
27220
|
+
width: fit-content;
|
|
27221
|
+
gap: 5px;
|
|
27222
|
+
color: var(--settings-muted);
|
|
27223
|
+
font-size: 11px;
|
|
27224
|
+
font-weight: 500;
|
|
27225
|
+
line-height: 18px;
|
|
27226
|
+
}
|
|
27227
|
+
|
|
27228
|
+
.settings-connection-row__status::before {
|
|
27229
|
+
width: 6px;
|
|
27230
|
+
height: 6px;
|
|
27231
|
+
flex: none;
|
|
27232
|
+
content: "";
|
|
27233
|
+
background: currentColor;
|
|
27234
|
+
border-radius: 50%;
|
|
27235
|
+
}
|
|
27236
|
+
|
|
27237
|
+
.settings-connection-row__status[data-connection-tone="ready"] {
|
|
27238
|
+
color: var(--settings-success);
|
|
27239
|
+
}
|
|
27240
|
+
|
|
27241
|
+
.settings-connection-row__status[data-connection-tone="checking"] {
|
|
27242
|
+
color: var(--settings-warning);
|
|
27243
|
+
}
|
|
27244
|
+
|
|
27245
|
+
.settings-connection-row__status[data-connection-tone="setup"] {
|
|
27246
|
+
color: var(--settings-muted);
|
|
27247
|
+
}
|
|
27248
|
+
|
|
27249
|
+
.settings-connection-row__status[data-connection-tone="setup"]::before {
|
|
27250
|
+
background: transparent;
|
|
27251
|
+
border: 1.5px solid currentColor;
|
|
27252
|
+
}
|
|
27253
|
+
|
|
27254
|
+
.settings-connection-row__status[data-connection-tone="failed"] {
|
|
27255
|
+
color: var(--settings-danger);
|
|
27256
|
+
}
|
|
27257
|
+
|
|
27258
|
+
.settings-connection-row__action {
|
|
27259
|
+
display: flex;
|
|
27260
|
+
align-items: center;
|
|
27261
|
+
justify-content: flex-end;
|
|
27262
|
+
min-width: 0;
|
|
27263
|
+
gap: 4px;
|
|
27264
|
+
}
|
|
27265
|
+
|
|
27266
|
+
.settings-connection-row__handle {
|
|
27267
|
+
display: inline-flex;
|
|
27268
|
+
flex: none;
|
|
27269
|
+
align-items: center;
|
|
27270
|
+
justify-content: center;
|
|
27271
|
+
width: 16px;
|
|
27272
|
+
color: var(--settings-muted);
|
|
27273
|
+
cursor: grab;
|
|
27274
|
+
opacity: 0.6;
|
|
27275
|
+
}
|
|
27276
|
+
|
|
27277
|
+
.settings-connection-row__handle:hover {
|
|
27278
|
+
opacity: 1;
|
|
27279
|
+
}
|
|
27280
|
+
|
|
27281
|
+
.settings-connection-row[draggable="true"] {
|
|
27282
|
+
cursor: grab;
|
|
27283
|
+
}
|
|
27284
|
+
|
|
27285
|
+
.settings-connection-row[data-connection-dragging="true"] {
|
|
27286
|
+
opacity: 0.4;
|
|
27287
|
+
}
|
|
27288
|
+
|
|
27289
|
+
.settings-connection-row[data-connection-drop-indicator="before"] {
|
|
27290
|
+
box-shadow: inset 0 2px 0 0 var(--settings-focus);
|
|
27291
|
+
}
|
|
27292
|
+
|
|
27293
|
+
.settings-connection-row[data-connection-drop-indicator="after"] {
|
|
27294
|
+
box-shadow: inset 0 -2px 0 0 var(--settings-focus);
|
|
27295
|
+
}
|
|
27296
|
+
|
|
27297
|
+
.settings-connection-row__group-toggle {
|
|
27298
|
+
display: inline-flex;
|
|
27299
|
+
flex: none;
|
|
27300
|
+
align-items: center;
|
|
27301
|
+
justify-content: center;
|
|
27302
|
+
width: 26px;
|
|
27303
|
+
height: 26px;
|
|
27304
|
+
color: var(--settings-muted);
|
|
27305
|
+
background: transparent;
|
|
27306
|
+
border: 0;
|
|
27307
|
+
border-radius: 6px;
|
|
27308
|
+
cursor: pointer;
|
|
27309
|
+
}
|
|
27310
|
+
|
|
27311
|
+
.settings-connection-row__group-toggle:hover {
|
|
27312
|
+
color: var(--settings-text);
|
|
27313
|
+
background: var(--settings-hover);
|
|
27314
|
+
}
|
|
27315
|
+
|
|
27316
|
+
.settings-connection-group-divider {
|
|
27317
|
+
padding: 10px 12px 6px;
|
|
27318
|
+
color: var(--settings-muted);
|
|
27319
|
+
font-size: 10px;
|
|
27320
|
+
font-weight: 600;
|
|
27321
|
+
line-height: 16px;
|
|
27322
|
+
text-transform: uppercase;
|
|
27323
|
+
letter-spacing: 0.06em;
|
|
27324
|
+
/* No border-top here: the row immediately above already carries its own
|
|
27325
|
+
border-bottom (it is no longer :last-child once this divider follows
|
|
27326
|
+
it), so adding one here would double the separator line. */
|
|
27327
|
+
}
|
|
27328
|
+
|
|
27329
|
+
.settings-connection-group-more[data-connection-drag-over="true"] {
|
|
27330
|
+
background: rgb(51 156 255 / 8%);
|
|
27331
|
+
}
|
|
27332
|
+
|
|
27333
|
+
.settings-connection-group-hint {
|
|
27334
|
+
display: grid;
|
|
27335
|
+
gap: 3px;
|
|
27336
|
+
margin: 0 12px 12px;
|
|
27337
|
+
padding: 14px 16px;
|
|
27338
|
+
text-align: center;
|
|
27339
|
+
border: 1.5px dashed var(--settings-border);
|
|
27340
|
+
border-radius: 10px;
|
|
27341
|
+
}
|
|
27342
|
+
|
|
27343
|
+
.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {
|
|
27344
|
+
border-color: var(--settings-focus);
|
|
27345
|
+
}
|
|
27346
|
+
|
|
27347
|
+
.settings-connection-group-hint strong {
|
|
27348
|
+
color: var(--settings-text);
|
|
27349
|
+
font-size: 12.5px;
|
|
27350
|
+
font-weight: 500;
|
|
27351
|
+
line-height: 18px;
|
|
27352
|
+
}
|
|
27353
|
+
|
|
27354
|
+
.settings-connection-group-hint span {
|
|
27355
|
+
color: var(--settings-muted);
|
|
27356
|
+
font-size: 12px;
|
|
27357
|
+
line-height: 17px;
|
|
27358
|
+
}
|
|
27359
|
+
|
|
27360
|
+
.settings-connection-group-reset {
|
|
27361
|
+
display: flex;
|
|
27362
|
+
width: 100%;
|
|
27363
|
+
align-items: center;
|
|
27364
|
+
gap: 6px;
|
|
27365
|
+
padding: 10px 12px;
|
|
27366
|
+
color: var(--settings-muted);
|
|
27367
|
+
font: inherit;
|
|
27368
|
+
font-size: 12px;
|
|
27369
|
+
text-align: left;
|
|
27370
|
+
background: transparent;
|
|
27371
|
+
border: 0;
|
|
27372
|
+
border-top: 1px solid var(--settings-divider);
|
|
27373
|
+
cursor: pointer;
|
|
27374
|
+
}
|
|
27375
|
+
|
|
27376
|
+
.settings-connection-group-reset:hover {
|
|
27377
|
+
color: var(--settings-text);
|
|
27378
|
+
background: var(--settings-hover);
|
|
27379
|
+
}
|
|
27380
|
+
|
|
27381
|
+
.settings-connection-install-link {
|
|
27382
|
+
display: inline-flex;
|
|
27383
|
+
align-items: center;
|
|
27384
|
+
justify-content: center;
|
|
27385
|
+
width: 26px;
|
|
27386
|
+
height: 26px;
|
|
27387
|
+
color: var(--settings-focus);
|
|
27388
|
+
text-decoration: none;
|
|
27389
|
+
background: transparent;
|
|
27390
|
+
border: 1px solid transparent;
|
|
27391
|
+
border-radius: 7px;
|
|
27392
|
+
opacity: 0;
|
|
27393
|
+
transition: opacity 120ms ease;
|
|
27394
|
+
}
|
|
27395
|
+
|
|
27396
|
+
.settings-connection-row:hover .settings-connection-install-link,
|
|
27397
|
+
.settings-connection-install-link:focus-visible {
|
|
27398
|
+
opacity: 1;
|
|
27399
|
+
}
|
|
27400
|
+
|
|
27401
|
+
.settings-connection-install-link:hover {
|
|
27402
|
+
color: var(--settings-focus);
|
|
27403
|
+
background: var(--settings-active);
|
|
27404
|
+
border-color: var(--settings-border);
|
|
27405
|
+
}
|
|
27406
|
+
|
|
27407
|
+
.settings-connection-view-error {
|
|
27408
|
+
padding: 4px 7px;
|
|
27409
|
+
color: var(--settings-danger);
|
|
27410
|
+
font: inherit;
|
|
27411
|
+
font-size: 11px;
|
|
27412
|
+
line-height: 18px;
|
|
27413
|
+
background: transparent;
|
|
27414
|
+
border: 0;
|
|
27415
|
+
border-radius: 6px;
|
|
27416
|
+
cursor: pointer;
|
|
27417
|
+
}
|
|
27418
|
+
|
|
27419
|
+
.settings-connection-view-error:hover {
|
|
27420
|
+
color: var(--settings-danger);
|
|
27421
|
+
background: var(--settings-danger-bg);
|
|
27422
|
+
}
|
|
27423
|
+
|
|
27424
|
+
.settings-connection-inspector {
|
|
27425
|
+
position: sticky;
|
|
27426
|
+
top: 18px;
|
|
27427
|
+
}
|
|
27428
|
+
|
|
27429
|
+
.settings-connection-inspector__header {
|
|
27430
|
+
display: flex;
|
|
27431
|
+
align-items: flex-start;
|
|
27432
|
+
justify-content: space-between;
|
|
27433
|
+
min-width: 0;
|
|
27434
|
+
gap: 10px;
|
|
27435
|
+
padding: 12px;
|
|
27436
|
+
border-bottom: 1px solid var(--settings-divider);
|
|
27437
|
+
}
|
|
27438
|
+
|
|
27439
|
+
.settings-connection-inspector__body {
|
|
27440
|
+
display: grid;
|
|
27441
|
+
min-width: 0;
|
|
27442
|
+
gap: 12px;
|
|
27443
|
+
padding: 12px;
|
|
27444
|
+
}
|
|
27445
|
+
|
|
27446
|
+
.settings-connection-install-callout {
|
|
27447
|
+
display: grid;
|
|
27448
|
+
grid-template-columns: 28px minmax(0, 1fr);
|
|
27449
|
+
gap: 9px;
|
|
27450
|
+
padding: 11px;
|
|
27451
|
+
background: var(--settings-surface);
|
|
27452
|
+
border: 0;
|
|
27453
|
+
border-radius: 8px;
|
|
27454
|
+
}
|
|
27455
|
+
|
|
27456
|
+
.settings-connection-install-callout__icon {
|
|
27457
|
+
display: inline-flex;
|
|
27458
|
+
align-items: center;
|
|
27459
|
+
justify-content: center;
|
|
27460
|
+
width: 28px;
|
|
27461
|
+
height: 28px;
|
|
27462
|
+
color: var(--settings-focus);
|
|
27463
|
+
background: var(--settings-active);
|
|
27464
|
+
border-radius: 7px;
|
|
27465
|
+
}
|
|
27466
|
+
|
|
27467
|
+
.settings-connection-install-callout strong,
|
|
27468
|
+
.settings-connection-error-summary strong,
|
|
27469
|
+
.settings-connection-state-summary strong {
|
|
27470
|
+
display: block;
|
|
27471
|
+
margin: 0 0 4px;
|
|
27472
|
+
color: var(--settings-text);
|
|
27473
|
+
font-size: 12px;
|
|
27474
|
+
font-weight: 500;
|
|
27475
|
+
line-height: 18px;
|
|
27476
|
+
}
|
|
27477
|
+
|
|
27478
|
+
.settings-connection-install-callout p,
|
|
27479
|
+
.settings-connection-error-summary p,
|
|
27480
|
+
.settings-connection-state-summary p,
|
|
27481
|
+
.settings-connection-issue-note {
|
|
27482
|
+
margin: 0;
|
|
27483
|
+
color: var(--settings-muted);
|
|
27484
|
+
font-size: 11px;
|
|
27485
|
+
line-height: 16px;
|
|
27486
|
+
}
|
|
27487
|
+
|
|
27488
|
+
.settings-connection-install-button {
|
|
27489
|
+
width: fit-content;
|
|
27490
|
+
}
|
|
27491
|
+
|
|
27492
|
+
.settings-connection-error-summary {
|
|
27493
|
+
padding: 13px 14px;
|
|
27494
|
+
color: var(--settings-danger);
|
|
27495
|
+
background: var(--settings-danger-bg);
|
|
27496
|
+
border: 1px solid var(--settings-danger-border);
|
|
27497
|
+
border-radius: 10px;
|
|
27498
|
+
}
|
|
27499
|
+
|
|
27500
|
+
.settings-connection-error-metadata {
|
|
27501
|
+
display: grid;
|
|
27502
|
+
gap: 7px;
|
|
27503
|
+
padding: 12px;
|
|
27504
|
+
background: var(--settings-inset);
|
|
27505
|
+
border: 1px solid var(--settings-border);
|
|
27506
|
+
border-radius: 9px;
|
|
27507
|
+
}
|
|
27508
|
+
|
|
27509
|
+
.settings-connection-detail-line {
|
|
27510
|
+
display: grid;
|
|
27511
|
+
grid-template-columns: 92px minmax(0, 1fr);
|
|
27512
|
+
gap: 10px;
|
|
27513
|
+
min-width: 0;
|
|
27514
|
+
color: var(--settings-muted);
|
|
27515
|
+
font-size: 10px;
|
|
27516
|
+
line-height: 16px;
|
|
27517
|
+
}
|
|
27518
|
+
|
|
27519
|
+
.settings-connection-detail-line code {
|
|
27520
|
+
min-width: 0;
|
|
27521
|
+
overflow-wrap: anywhere;
|
|
27522
|
+
color: var(--settings-text);
|
|
27523
|
+
font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
27524
|
+
white-space: pre-wrap;
|
|
27525
|
+
}
|
|
27526
|
+
|
|
27527
|
+
.settings-connection-error-log-header {
|
|
27528
|
+
display: flex;
|
|
27529
|
+
align-items: center;
|
|
27530
|
+
justify-content: space-between;
|
|
27531
|
+
gap: 10px;
|
|
27532
|
+
}
|
|
27533
|
+
|
|
27534
|
+
.settings-connection-error-log-header strong {
|
|
27535
|
+
color: var(--settings-text);
|
|
27536
|
+
font-size: 11px;
|
|
27537
|
+
font-weight: 600;
|
|
27538
|
+
}
|
|
27539
|
+
|
|
27540
|
+
.settings-connection-error-log-header .settings-command-button {
|
|
27541
|
+
min-height: 30px;
|
|
27542
|
+
padding: 5px 9px;
|
|
27543
|
+
font-size: 11px;
|
|
27544
|
+
}
|
|
27545
|
+
|
|
27546
|
+
.settings-connection-stderr {
|
|
27547
|
+
max-height: 220px;
|
|
27548
|
+
min-width: 0;
|
|
27549
|
+
margin: 0;
|
|
27550
|
+
padding: 11px;
|
|
27551
|
+
overflow: auto;
|
|
27552
|
+
color: var(--settings-text);
|
|
27553
|
+
font:
|
|
27554
|
+
10px/16px ui-monospace,
|
|
27555
|
+
"SFMono-Regular",
|
|
27556
|
+
Consolas,
|
|
27557
|
+
"Liberation Mono",
|
|
27558
|
+
monospace;
|
|
27559
|
+
white-space: pre-wrap;
|
|
27560
|
+
overflow-wrap: anywhere;
|
|
27561
|
+
background: var(--settings-inset);
|
|
27562
|
+
border: 1px solid var(--settings-border);
|
|
27563
|
+
border-radius: 9px;
|
|
27564
|
+
}
|
|
27565
|
+
|
|
27566
|
+
.settings-connection-error-actions {
|
|
27567
|
+
display: grid;
|
|
27568
|
+
grid-template-columns: minmax(0, 1fr);
|
|
27569
|
+
gap: 8px;
|
|
27570
|
+
}
|
|
27571
|
+
|
|
27572
|
+
.settings-connection-error-actions .settings-command-button {
|
|
27573
|
+
width: 100%;
|
|
27574
|
+
}
|
|
27575
|
+
|
|
27576
|
+
.settings-connection-issue-note {
|
|
27577
|
+
margin-top: -4px;
|
|
27578
|
+
}
|
|
27579
|
+
|
|
27580
|
+
.settings-connection-state-summary {
|
|
27581
|
+
padding: 14px;
|
|
27582
|
+
background: var(--settings-surface);
|
|
27583
|
+
border: 1px solid var(--settings-border);
|
|
27584
|
+
border-radius: 10px;
|
|
27585
|
+
}
|
|
27586
|
+
|
|
27587
|
+
.settings-empty {
|
|
27588
|
+
display: flex;
|
|
27589
|
+
align-items: center;
|
|
27590
|
+
min-height: 72px;
|
|
27591
|
+
padding: 12px 16px;
|
|
27592
|
+
}
|
|
27593
|
+
|
|
27594
|
+
.settings-empty > div {
|
|
27595
|
+
display: grid;
|
|
27596
|
+
min-width: 0;
|
|
27597
|
+
gap: 2px;
|
|
27598
|
+
}
|
|
27599
|
+
|
|
27600
|
+
.settings-empty strong {
|
|
27601
|
+
color: var(--settings-text);
|
|
27602
|
+
font-size: 13px;
|
|
27603
|
+
font-weight: 500;
|
|
27604
|
+
line-height: 19px;
|
|
27605
|
+
}
|
|
27606
|
+
|
|
27607
|
+
.settings-empty span {
|
|
27608
|
+
color: var(--settings-muted);
|
|
27609
|
+
font-size: 13px;
|
|
27610
|
+
line-height: 19px;
|
|
27611
|
+
}
|
|
27612
|
+
|
|
27613
|
+
.settings-about-panel {
|
|
27614
|
+
display: grid;
|
|
27615
|
+
max-width: 720px;
|
|
27616
|
+
gap: 18px;
|
|
27617
|
+
padding: 24px;
|
|
27618
|
+
background: var(--settings-panel);
|
|
27619
|
+
border: 1px solid var(--settings-border);
|
|
27620
|
+
border-radius: 12px;
|
|
27621
|
+
}
|
|
27622
|
+
|
|
27623
|
+
.settings-about-product {
|
|
27624
|
+
color: var(--settings-text);
|
|
27625
|
+
font-size: 24px;
|
|
27626
|
+
font-weight: 700;
|
|
27627
|
+
line-height: 32px;
|
|
27628
|
+
}
|
|
27629
|
+
|
|
27630
|
+
.settings-about-tagline {
|
|
27631
|
+
color: var(--settings-text);
|
|
27632
|
+
font-size: 16px;
|
|
27633
|
+
font-weight: 600;
|
|
27634
|
+
line-height: 24px;
|
|
27635
|
+
}
|
|
27636
|
+
|
|
27637
|
+
.settings-about-copy {
|
|
27638
|
+
display: grid;
|
|
27639
|
+
max-width: 660px;
|
|
27640
|
+
gap: 12px;
|
|
27641
|
+
}
|
|
27642
|
+
|
|
27643
|
+
.settings-about-copy p,
|
|
27644
|
+
.settings-about-repository p {
|
|
27645
|
+
margin: 0;
|
|
27646
|
+
color: var(--settings-muted);
|
|
27647
|
+
font-size: 13px;
|
|
27648
|
+
line-height: 21px;
|
|
27649
|
+
}
|
|
27650
|
+
|
|
27651
|
+
.settings-about-star-callout {
|
|
27652
|
+
margin: 2px 0;
|
|
27653
|
+
color: var(--settings-warning);
|
|
27654
|
+
font-size: 14px;
|
|
27655
|
+
font-weight: 600;
|
|
27656
|
+
line-height: 22px;
|
|
27657
|
+
}
|
|
27658
|
+
|
|
27659
|
+
.settings-about-repository {
|
|
27660
|
+
display: grid;
|
|
27661
|
+
gap: 10px;
|
|
27662
|
+
padding-top: 18px;
|
|
27663
|
+
border-top: 1px solid var(--settings-divider);
|
|
27664
|
+
}
|
|
27665
|
+
|
|
27666
|
+
.settings-about-repository-link {
|
|
27667
|
+
display: flex;
|
|
27668
|
+
align-items: center;
|
|
27669
|
+
width: fit-content;
|
|
27670
|
+
min-width: 0;
|
|
27671
|
+
max-width: 100%;
|
|
27672
|
+
gap: 8px;
|
|
27673
|
+
color: var(--settings-focus);
|
|
27674
|
+
font-size: 13px;
|
|
27675
|
+
font-weight: 600;
|
|
27676
|
+
text-decoration: none;
|
|
27677
|
+
}
|
|
27678
|
+
|
|
27679
|
+
.settings-about-repository-link:hover {
|
|
27680
|
+
text-decoration: underline;
|
|
27681
|
+
}
|
|
27682
|
+
|
|
27683
|
+
.settings-about-repository-link code {
|
|
27684
|
+
min-width: 0;
|
|
27685
|
+
overflow: hidden;
|
|
27686
|
+
color: var(--settings-muted);
|
|
27687
|
+
font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
27688
|
+
font-size: 11px;
|
|
27689
|
+
font-weight: 400;
|
|
27690
|
+
text-overflow: ellipsis;
|
|
27691
|
+
white-space: nowrap;
|
|
27692
|
+
}
|
|
27693
|
+
|
|
27694
|
+
.settings-page-error {
|
|
27695
|
+
padding: 16px;
|
|
27696
|
+
color: var(--settings-text);
|
|
27697
|
+
font-size: 13px;
|
|
27698
|
+
background: var(--settings-panel);
|
|
27699
|
+
border: 1px solid var(--settings-border);
|
|
27700
|
+
border-radius: 20px;
|
|
27701
|
+
}
|
|
27702
|
+
|
|
27703
|
+
.settings-update-metadata {
|
|
27704
|
+
display: grid;
|
|
27705
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
27706
|
+
gap: 24px;
|
|
27707
|
+
margin-bottom: 24px;
|
|
27708
|
+
padding: 0 4px 20px;
|
|
27709
|
+
border-bottom: 1px solid var(--settings-divider);
|
|
27710
|
+
}
|
|
27711
|
+
|
|
27712
|
+
.settings-update-metadata__item {
|
|
27713
|
+
display: grid;
|
|
27714
|
+
min-width: 0;
|
|
27715
|
+
gap: 4px;
|
|
27716
|
+
}
|
|
27717
|
+
|
|
27718
|
+
.settings-update-metadata__item span {
|
|
27719
|
+
color: var(--settings-muted);
|
|
27720
|
+
font-size: 12px;
|
|
27721
|
+
line-height: 18px;
|
|
27722
|
+
}
|
|
27723
|
+
|
|
27724
|
+
.settings-update-metadata__item strong {
|
|
27725
|
+
min-width: 0;
|
|
27726
|
+
overflow-wrap: anywhere;
|
|
27727
|
+
color: var(--settings-text);
|
|
27728
|
+
font-size: 15px;
|
|
27729
|
+
font-weight: 500;
|
|
27730
|
+
line-height: 22px;
|
|
27731
|
+
}
|
|
27732
|
+
|
|
27733
|
+
/* The only emphasis on this screen: a latest version newer than the installed one. */
|
|
27734
|
+
.settings-update-metadata__value--newer {
|
|
27735
|
+
color: var(--settings-focus);
|
|
27736
|
+
}
|
|
27737
|
+
|
|
27738
|
+
.settings-update-panel {
|
|
27739
|
+
display: grid;
|
|
27740
|
+
gap: 12px;
|
|
27741
|
+
padding: 20px;
|
|
27742
|
+
color: var(--settings-text);
|
|
27743
|
+
background: var(--settings-panel);
|
|
27744
|
+
border: 1px solid var(--settings-border);
|
|
27745
|
+
border-radius: 8px;
|
|
27746
|
+
}
|
|
27747
|
+
|
|
27748
|
+
.settings-update-panel__head {
|
|
27749
|
+
display: flex;
|
|
27750
|
+
align-items: center;
|
|
27751
|
+
min-width: 0;
|
|
27752
|
+
gap: 8px;
|
|
27753
|
+
}
|
|
27754
|
+
|
|
27755
|
+
.settings-update-panel__head .codexhost-settings-icon {
|
|
27756
|
+
color: var(--settings-muted);
|
|
27757
|
+
}
|
|
27758
|
+
|
|
27759
|
+
.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,
|
|
27760
|
+
.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,
|
|
27761
|
+
.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,
|
|
27762
|
+
.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {
|
|
27763
|
+
color: var(--settings-focus);
|
|
27764
|
+
}
|
|
27765
|
+
|
|
27766
|
+
.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {
|
|
27767
|
+
color: var(--settings-success);
|
|
27768
|
+
}
|
|
27769
|
+
|
|
27770
|
+
.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,
|
|
27771
|
+
.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {
|
|
27772
|
+
color: var(--settings-danger);
|
|
27773
|
+
}
|
|
27774
|
+
|
|
27775
|
+
.settings-update-panel__title {
|
|
27776
|
+
min-width: 0;
|
|
27777
|
+
overflow-wrap: anywhere;
|
|
27778
|
+
color: var(--settings-text);
|
|
27779
|
+
font-size: 14px;
|
|
27780
|
+
font-weight: 600;
|
|
27781
|
+
line-height: 22px;
|
|
27782
|
+
}
|
|
27783
|
+
|
|
27784
|
+
.settings-update-summary,
|
|
27785
|
+
.settings-update-error {
|
|
27786
|
+
margin: 0;
|
|
27787
|
+
overflow-wrap: anywhere;
|
|
27788
|
+
font-size: 13px;
|
|
27789
|
+
line-height: 20px;
|
|
27790
|
+
}
|
|
27791
|
+
|
|
27792
|
+
.settings-update-summary {
|
|
27793
|
+
color: var(--settings-muted);
|
|
27794
|
+
}
|
|
27795
|
+
|
|
27796
|
+
.settings-update-error {
|
|
27797
|
+
color: var(--settings-danger);
|
|
27798
|
+
}
|
|
27799
|
+
|
|
27800
|
+
.settings-update-progress {
|
|
27801
|
+
width: 100%;
|
|
27802
|
+
height: 8px;
|
|
27803
|
+
accent-color: var(--settings-focus);
|
|
27804
|
+
}
|
|
27805
|
+
|
|
27806
|
+
.settings-update-progress-detail {
|
|
27807
|
+
color: var(--settings-muted);
|
|
27808
|
+
font-size: 12px;
|
|
27809
|
+
line-height: 18px;
|
|
27810
|
+
}
|
|
27811
|
+
|
|
27812
|
+
/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */
|
|
27813
|
+
.settings-update-notes-section {
|
|
27814
|
+
min-width: 0;
|
|
27815
|
+
margin-top: 24px;
|
|
27816
|
+
padding-top: 24px;
|
|
27817
|
+
border-top: 1px solid var(--settings-divider);
|
|
27818
|
+
}
|
|
27819
|
+
|
|
27820
|
+
.settings-update-notes-section:empty {
|
|
27821
|
+
display: none;
|
|
27822
|
+
}
|
|
27823
|
+
|
|
27824
|
+
.settings-update-notes {
|
|
27825
|
+
display: grid;
|
|
27826
|
+
min-width: 0;
|
|
27827
|
+
gap: 12px;
|
|
27828
|
+
color: var(--settings-muted);
|
|
27829
|
+
font-size: 14px;
|
|
27830
|
+
line-height: 22px;
|
|
27831
|
+
overflow-wrap: anywhere;
|
|
27832
|
+
}
|
|
27833
|
+
|
|
27834
|
+
.settings-update-notes > :first-child {
|
|
27835
|
+
margin-top: 0;
|
|
27836
|
+
}
|
|
27837
|
+
|
|
27838
|
+
.settings-update-notes > :last-child {
|
|
27839
|
+
margin-bottom: 0;
|
|
27840
|
+
}
|
|
27841
|
+
|
|
27842
|
+
.settings-update-notes h1,
|
|
27843
|
+
.settings-update-notes h2,
|
|
27844
|
+
.settings-update-notes h3,
|
|
27845
|
+
.settings-update-notes h4,
|
|
27846
|
+
.settings-update-notes h5,
|
|
27847
|
+
.settings-update-notes h6 {
|
|
27848
|
+
margin: 6px 0 0;
|
|
27849
|
+
color: var(--settings-text);
|
|
27850
|
+
font-weight: 600;
|
|
27851
|
+
}
|
|
27852
|
+
|
|
27853
|
+
.settings-update-notes h1 {
|
|
27854
|
+
font-size: 18px;
|
|
27855
|
+
line-height: 26px;
|
|
27856
|
+
}
|
|
27857
|
+
|
|
27858
|
+
.settings-update-notes h2 {
|
|
27859
|
+
font-size: 17px;
|
|
27860
|
+
line-height: 24px;
|
|
27861
|
+
}
|
|
27862
|
+
|
|
27863
|
+
.settings-update-notes h3,
|
|
27864
|
+
.settings-update-notes h4,
|
|
27865
|
+
.settings-update-notes h5,
|
|
27866
|
+
.settings-update-notes h6 {
|
|
27867
|
+
font-size: 14px;
|
|
27868
|
+
line-height: 22px;
|
|
27869
|
+
}
|
|
27870
|
+
|
|
27871
|
+
.settings-update-notes p,
|
|
27872
|
+
.settings-update-notes ul,
|
|
27873
|
+
.settings-update-notes ol,
|
|
27874
|
+
.settings-update-notes pre,
|
|
27875
|
+
.settings-update-notes blockquote {
|
|
27876
|
+
margin: 0;
|
|
27877
|
+
}
|
|
27878
|
+
|
|
27879
|
+
.settings-update-notes ul,
|
|
27880
|
+
.settings-update-notes ol {
|
|
27881
|
+
padding-left: 24px;
|
|
27882
|
+
}
|
|
27883
|
+
|
|
27884
|
+
.settings-update-notes li {
|
|
27885
|
+
padding-left: 4px;
|
|
27886
|
+
}
|
|
27887
|
+
|
|
27888
|
+
.settings-update-notes li::marker {
|
|
27889
|
+
color: var(--settings-muted);
|
|
27890
|
+
font-size: 0.85em;
|
|
27891
|
+
}
|
|
27892
|
+
|
|
27893
|
+
.settings-update-notes li + li {
|
|
27894
|
+
margin-top: 14px;
|
|
27895
|
+
}
|
|
27896
|
+
|
|
27897
|
+
.settings-update-notes .release-note-translation {
|
|
27898
|
+
display: block;
|
|
27899
|
+
margin-top: 3px;
|
|
27900
|
+
color: var(--settings-muted);
|
|
27901
|
+
font-size: 13px;
|
|
27902
|
+
line-height: 20px;
|
|
27903
|
+
}
|
|
27904
|
+
|
|
27905
|
+
.settings-update-notes blockquote {
|
|
27906
|
+
padding: 8px 12px;
|
|
27907
|
+
color: var(--settings-muted);
|
|
27908
|
+
border-left: 3px solid var(--settings-focus);
|
|
27909
|
+
background: var(--settings-surface);
|
|
27910
|
+
}
|
|
27911
|
+
|
|
27912
|
+
.settings-update-notes hr {
|
|
27913
|
+
width: 100%;
|
|
27914
|
+
margin: 2px 0;
|
|
27915
|
+
border: 0;
|
|
27916
|
+
border-top: 1px solid var(--settings-divider);
|
|
27917
|
+
}
|
|
27918
|
+
|
|
27919
|
+
.settings-update-notes strong {
|
|
27920
|
+
color: var(--settings-text);
|
|
27921
|
+
font-weight: 600;
|
|
27922
|
+
}
|
|
27923
|
+
|
|
27924
|
+
.settings-update-notes a {
|
|
27925
|
+
color: var(--settings-focus);
|
|
27926
|
+
text-decoration: none;
|
|
27927
|
+
}
|
|
27928
|
+
|
|
27929
|
+
.settings-update-notes a:hover {
|
|
27930
|
+
text-decoration: underline;
|
|
27931
|
+
}
|
|
27932
|
+
|
|
27933
|
+
.settings-update-notes code {
|
|
27934
|
+
font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
27935
|
+
font-size: 12px;
|
|
27936
|
+
}
|
|
27937
|
+
|
|
27938
|
+
.settings-update-notes :not(pre) > code {
|
|
27939
|
+
padding: 1px 5px;
|
|
27940
|
+
background: var(--settings-surface);
|
|
27941
|
+
border-radius: 4px;
|
|
27942
|
+
}
|
|
27943
|
+
|
|
27944
|
+
.settings-update-notes pre {
|
|
27945
|
+
min-width: 0;
|
|
27946
|
+
max-width: 100%;
|
|
27947
|
+
padding: 10px 12px;
|
|
27948
|
+
overflow-x: auto;
|
|
27949
|
+
overflow-y: hidden;
|
|
27950
|
+
background: var(--settings-inset);
|
|
27951
|
+
border-radius: 6px;
|
|
27952
|
+
}
|
|
27953
|
+
|
|
27954
|
+
.settings-update-notes pre code {
|
|
27955
|
+
line-height: 18px;
|
|
27956
|
+
white-space: pre-wrap;
|
|
27957
|
+
}
|
|
27958
|
+
|
|
27959
|
+
/* Manual update sits directly under the status panel, not behind a disclosure:
|
|
27960
|
+
automatic updates can fail for machine-local reasons and this is the way out. */
|
|
27961
|
+
.settings-update-controls {
|
|
27962
|
+
display: grid;
|
|
27963
|
+
min-width: 0;
|
|
27964
|
+
gap: 10px;
|
|
27965
|
+
margin-top: 24px;
|
|
27966
|
+
}
|
|
27967
|
+
|
|
27968
|
+
.settings-update-manual-title {
|
|
27969
|
+
color: var(--settings-text);
|
|
27970
|
+
font-size: 15px;
|
|
27971
|
+
font-weight: 600;
|
|
27972
|
+
line-height: 22px;
|
|
27973
|
+
}
|
|
27974
|
+
|
|
27975
|
+
.settings-update-manual {
|
|
27976
|
+
display: grid;
|
|
27977
|
+
min-width: 0;
|
|
27978
|
+
gap: 8px;
|
|
27979
|
+
}
|
|
27980
|
+
|
|
27981
|
+
.settings-update-manual[hidden] {
|
|
27982
|
+
display: none;
|
|
27983
|
+
}
|
|
27984
|
+
|
|
27985
|
+
.settings-update-manual-description {
|
|
27986
|
+
margin: 0;
|
|
27987
|
+
color: var(--settings-muted);
|
|
27988
|
+
font-size: 12px;
|
|
27989
|
+
line-height: 18px;
|
|
27990
|
+
}
|
|
27991
|
+
|
|
27992
|
+
.settings-update-manual-description.is-fallback {
|
|
27993
|
+
color: var(--settings-danger);
|
|
27994
|
+
}
|
|
27995
|
+
|
|
27996
|
+
.settings-update-command {
|
|
27997
|
+
display: flex;
|
|
27998
|
+
align-items: stretch;
|
|
27999
|
+
min-width: 0;
|
|
28000
|
+
overflow: hidden;
|
|
28001
|
+
border: 1px solid var(--settings-border);
|
|
28002
|
+
border-radius: 6px;
|
|
28003
|
+
}
|
|
28004
|
+
|
|
28005
|
+
.settings-update-command code {
|
|
28006
|
+
min-width: 0;
|
|
28007
|
+
flex: 1;
|
|
28008
|
+
padding: 9px 12px;
|
|
28009
|
+
overflow-x: auto;
|
|
28010
|
+
color: var(--settings-text);
|
|
28011
|
+
font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
28012
|
+
font-size: 12px;
|
|
28013
|
+
line-height: 20px;
|
|
28014
|
+
white-space: nowrap;
|
|
28015
|
+
}
|
|
28016
|
+
|
|
28017
|
+
.settings-update-command__copy {
|
|
28018
|
+
display: inline-flex;
|
|
28019
|
+
align-items: center;
|
|
28020
|
+
flex: none;
|
|
28021
|
+
gap: 6px;
|
|
28022
|
+
padding: 0 12px;
|
|
28023
|
+
color: var(--settings-muted);
|
|
28024
|
+
font-size: 12px;
|
|
28025
|
+
background: transparent;
|
|
28026
|
+
border: 0;
|
|
28027
|
+
border-left: 1px solid var(--settings-border);
|
|
28028
|
+
cursor: pointer;
|
|
28029
|
+
}
|
|
28030
|
+
|
|
28031
|
+
.settings-update-command__copy:hover {
|
|
28032
|
+
color: var(--settings-text);
|
|
28033
|
+
background: var(--settings-hover);
|
|
28034
|
+
}
|
|
28035
|
+
|
|
28036
|
+
.settings-update-command__copy:focus-visible {
|
|
28037
|
+
outline: 2px solid var(--settings-focus);
|
|
28038
|
+
outline-offset: -2px;
|
|
28039
|
+
}
|
|
28040
|
+
|
|
28041
|
+
.settings-update-actions {
|
|
28042
|
+
display: flex;
|
|
28043
|
+
align-items: center;
|
|
28044
|
+
min-width: 0;
|
|
28045
|
+
gap: 12px;
|
|
28046
|
+
flex-wrap: wrap;
|
|
28047
|
+
}
|
|
28048
|
+
|
|
28049
|
+
.settings-command-button,
|
|
28050
|
+
.settings-update-link {
|
|
28051
|
+
display: inline-flex;
|
|
28052
|
+
align-items: center;
|
|
28053
|
+
justify-content: center;
|
|
28054
|
+
flex: none;
|
|
28055
|
+
width: max-content;
|
|
28056
|
+
max-width: 100%;
|
|
28057
|
+
min-height: 30px;
|
|
28058
|
+
gap: 6px;
|
|
28059
|
+
padding: 5px 10px;
|
|
28060
|
+
white-space: nowrap;
|
|
28061
|
+
color: var(--settings-primary-text);
|
|
28062
|
+
font: inherit;
|
|
28063
|
+
font-size: 12px;
|
|
28064
|
+
text-decoration: none;
|
|
28065
|
+
background: var(--settings-primary);
|
|
28066
|
+
border: 1px solid var(--settings-primary);
|
|
28067
|
+
border-radius: 7px;
|
|
28068
|
+
cursor: pointer;
|
|
28069
|
+
}
|
|
28070
|
+
|
|
28071
|
+
.settings-command-button--secondary,
|
|
28072
|
+
.settings-update-link {
|
|
28073
|
+
color: var(--settings-text);
|
|
28074
|
+
background: var(--settings-panel);
|
|
28075
|
+
border-color: var(--settings-border);
|
|
28076
|
+
}
|
|
28077
|
+
|
|
28078
|
+
.settings-command-button:hover:not(:disabled) {
|
|
28079
|
+
background: var(--settings-primary-hover);
|
|
28080
|
+
border-color: var(--settings-primary-hover);
|
|
28081
|
+
}
|
|
28082
|
+
|
|
28083
|
+
.settings-command-button--secondary:hover:not(:disabled),
|
|
28084
|
+
.settings-update-link:hover {
|
|
28085
|
+
background: var(--settings-hover);
|
|
28086
|
+
border-color: var(--settings-border);
|
|
28087
|
+
}
|
|
28088
|
+
|
|
28089
|
+
.settings-command-button--danger {
|
|
28090
|
+
color: #f87171;
|
|
28091
|
+
}
|
|
28092
|
+
|
|
28093
|
+
.settings-command-button--danger:hover:not(:disabled) {
|
|
28094
|
+
color: #fecaca;
|
|
28095
|
+
background: rgb(127 29 29 / 24%);
|
|
28096
|
+
border-color: rgb(248 113 113 / 45%);
|
|
28097
|
+
}
|
|
28098
|
+
|
|
28099
|
+
.settings-command-button:disabled {
|
|
28100
|
+
cursor: default;
|
|
28101
|
+
opacity: 0.45;
|
|
28102
|
+
}
|
|
28103
|
+
|
|
28104
|
+
.settings-command-button:disabled,
|
|
28105
|
+
.settings-command-button[aria-disabled="true"] {
|
|
28106
|
+
opacity: 0.55;
|
|
28107
|
+
cursor: not-allowed;
|
|
28108
|
+
filter: none;
|
|
28109
|
+
}
|
|
28110
|
+
|
|
28111
|
+
.settings-command-button:focus-visible,
|
|
28112
|
+
.settings-update-link:focus-visible {
|
|
28113
|
+
outline: 2px solid var(--settings-focus);
|
|
28114
|
+
outline-offset: 2px;
|
|
28115
|
+
}
|
|
28116
|
+
|
|
28117
|
+
.codexhost-settings-icon {
|
|
28118
|
+
display: block;
|
|
28119
|
+
flex: none;
|
|
28120
|
+
stroke: currentColor;
|
|
28121
|
+
}
|
|
28122
|
+
|
|
28123
|
+
@media (max-width: 720px) {
|
|
28124
|
+
.codexhost-settings-dialog {
|
|
28125
|
+
width: calc(100vw - 16px);
|
|
28126
|
+
height: calc(100vh - var(--settings-titlebar-height) - 16px);
|
|
28127
|
+
border-radius: 10px;
|
|
28128
|
+
}
|
|
28129
|
+
|
|
28130
|
+
.settings-layout {
|
|
28131
|
+
grid-template-columns: minmax(0, 1fr);
|
|
28132
|
+
grid-template-rows: auto minmax(0, 1fr);
|
|
28133
|
+
}
|
|
28134
|
+
|
|
28135
|
+
.settings-session-import-row {
|
|
28136
|
+
grid-template-columns: minmax(0, 1fr);
|
|
28137
|
+
}
|
|
28138
|
+
|
|
28139
|
+
.settings-session-import-row__action {
|
|
28140
|
+
align-items: flex-start;
|
|
28141
|
+
}
|
|
28142
|
+
|
|
28143
|
+
.settings-sidebar {
|
|
28144
|
+
border-right: 0;
|
|
28145
|
+
border-bottom: 1px solid var(--settings-border);
|
|
28146
|
+
}
|
|
28147
|
+
|
|
28148
|
+
.settings-header {
|
|
28149
|
+
height: 56px;
|
|
28150
|
+
padding-inline: 14px;
|
|
28151
|
+
}
|
|
28152
|
+
|
|
28153
|
+
.settings-sidebar {
|
|
28154
|
+
padding-top: 20px;
|
|
28155
|
+
}
|
|
28156
|
+
|
|
28157
|
+
.settings-nav {
|
|
28158
|
+
flex: none;
|
|
28159
|
+
flex-direction: row;
|
|
28160
|
+
gap: 4px;
|
|
28161
|
+
padding: 7px 8px 8px;
|
|
28162
|
+
overflow-x: auto;
|
|
28163
|
+
overflow-y: hidden;
|
|
28164
|
+
}
|
|
28165
|
+
|
|
28166
|
+
.settings-nav-section-label {
|
|
28167
|
+
display: none;
|
|
28168
|
+
}
|
|
28169
|
+
|
|
28170
|
+
.settings-nav-button {
|
|
28171
|
+
width: auto;
|
|
28172
|
+
min-width: max-content;
|
|
28173
|
+
min-height: 34px;
|
|
28174
|
+
grid-template-columns: 16px auto;
|
|
28175
|
+
border-radius: 10px;
|
|
28176
|
+
}
|
|
28177
|
+
|
|
28178
|
+
.settings-nav-star-link {
|
|
28179
|
+
margin-top: 0;
|
|
28180
|
+
}
|
|
28181
|
+
|
|
28182
|
+
.settings-page__content {
|
|
28183
|
+
width: calc(100% - 40px);
|
|
28184
|
+
}
|
|
28185
|
+
|
|
28186
|
+
.settings-page__content {
|
|
28187
|
+
padding-top: 32px;
|
|
28188
|
+
padding-bottom: 32px;
|
|
28189
|
+
}
|
|
28190
|
+
|
|
28191
|
+
.settings-section-label {
|
|
28192
|
+
padding-bottom: 20px;
|
|
28193
|
+
font-size: 20px;
|
|
28194
|
+
line-height: 26px;
|
|
28195
|
+
}
|
|
28196
|
+
|
|
28197
|
+
.settings-update-metadata {
|
|
28198
|
+
grid-template-columns: minmax(0, 1fr);
|
|
28199
|
+
gap: 16px;
|
|
28200
|
+
}
|
|
28201
|
+
|
|
28202
|
+
.settings-status-row {
|
|
28203
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
28204
|
+
gap: 16px;
|
|
28205
|
+
}
|
|
28206
|
+
|
|
28207
|
+
.settings-account-header,
|
|
28208
|
+
.settings-connection-page-header {
|
|
28209
|
+
flex-direction: column;
|
|
28210
|
+
}
|
|
28211
|
+
|
|
28212
|
+
.settings-account-header > .settings-command-button,
|
|
28213
|
+
.settings-connection-page-header > .settings-command-button {
|
|
28214
|
+
width: 100%;
|
|
28215
|
+
}
|
|
28216
|
+
|
|
28217
|
+
.settings-connections-layout {
|
|
28218
|
+
grid-template-columns: minmax(0, 1fr);
|
|
28219
|
+
}
|
|
28220
|
+
|
|
28221
|
+
.settings-connection-inspector {
|
|
28222
|
+
position: static;
|
|
28223
|
+
}
|
|
28224
|
+
|
|
28225
|
+
.settings-status-row__detail {
|
|
28226
|
+
grid-column: 1 / -1;
|
|
28227
|
+
margin: -8px 0 0 58px;
|
|
28228
|
+
}
|
|
28229
|
+
}
|
|
28230
|
+
|
|
28231
|
+
@media (forced-colors: active) {
|
|
28232
|
+
:host {
|
|
28233
|
+
--settings-bg: Canvas;
|
|
28234
|
+
--settings-sidebar: Canvas;
|
|
28235
|
+
--settings-panel: Canvas;
|
|
28236
|
+
--settings-surface: Canvas;
|
|
28237
|
+
--settings-surface-hover: Highlight;
|
|
28238
|
+
--settings-inset: Canvas;
|
|
28239
|
+
--settings-text: CanvasText;
|
|
28240
|
+
--settings-muted: GrayText;
|
|
28241
|
+
--settings-subtle: GrayText;
|
|
28242
|
+
--settings-border: ButtonBorder;
|
|
28243
|
+
--settings-divider: ButtonBorder;
|
|
28244
|
+
--settings-hover: Highlight;
|
|
28245
|
+
--settings-active: Highlight;
|
|
28246
|
+
--settings-focus: Highlight;
|
|
28247
|
+
--settings-primary: ButtonFace;
|
|
28248
|
+
--settings-primary-hover: Highlight;
|
|
28249
|
+
--settings-primary-text: ButtonText;
|
|
28250
|
+
--settings-warning: CanvasText;
|
|
28251
|
+
--settings-warning-bg: Canvas;
|
|
28252
|
+
--settings-warning-border: ButtonBorder;
|
|
28253
|
+
--settings-danger: CanvasText;
|
|
28254
|
+
--settings-danger-bg: Canvas;
|
|
28255
|
+
--settings-danger-border: ButtonBorder;
|
|
28256
|
+
--settings-success: CanvasText;
|
|
28257
|
+
}
|
|
28258
|
+
}
|
|
28259
|
+
|
|
28260
|
+
@media (prefers-reduced-motion: reduce) {
|
|
28261
|
+
*,
|
|
28262
|
+
*::before,
|
|
28263
|
+
*::after {
|
|
28264
|
+
scroll-behavior: auto !important;
|
|
28265
|
+
transition-duration: 0s !important;
|
|
28266
|
+
}
|
|
28267
|
+
}
|
|
28268
|
+
`;
|
|
26238
28269
|
|
|
26239
28270
|
// src/settings/accounts.css
|
|
26240
|
-
var accounts_default = '.settings-harness-account__logo {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 0;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 210px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 12px 16px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2),\n.settings-account-table th:nth-child(3) {\n width: 24%;\n}\n.settings-account-table th:nth-child(4) {\n width: 20%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 17px 16px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-email {\n display: block;\n min-width: 0;\n overflow: hidden;\n font-size: 12px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 5px;\n margin-top: 4px;\n color: var(--settings-muted);\n flex-wrap: wrap;\n font-size: 11px;\n overflow-wrap: anywhere;\n}\n.settings-account-plan {\n flex: none;\n padding: 0 4px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 10px;\n max-width: 100%;\n overflow-wrap: anywhere;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n color: light-dark(#66548e, #c8bfff);\n font-size: 10px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 10px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: 20px 4px 17px;\n align-items: center;\n gap: 6px 0;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n.settings-account-usage__title {\n display: none;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-extra-usage {\n display: grid;\n gap: 12px;\n margin-top: 14px;\n}\n.settings-account-extra-usage .settings-account-usage__meter,\n.settings-account-usage__meter--scoped {\n grid-template-rows: auto 20px 4px 17px;\n}\n.settings-account-extra-usage .settings-account-usage__title,\n.settings-account-usage__meter--scoped .settings-account-usage__title {\n display: block;\n grid-column: 1 / -1;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__percent {\n grid-column: 1 / -1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 7px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__countdown {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.settings-account-usage__percent > :last-child {\n flex: none;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n grid-column: 1 / -1;\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 1 / -1;\n color: var(--account-muted);\n font-size: 10px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n}\n.settings-account-usage__message {\n color: var(--settings-muted);\n}\n.settings-account-usage__missing {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-content: center;\n gap: 6px;\n min-height: 53px;\n color: var(--settings-muted);\n}\n.settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 1 / -1;\n font-size: 14px;\n}\n.settings-account-table .settings-account-spanning-cell {\n vertical-align: top;\n}\n.settings-account-quota-continuation-row > .settings-account-usage-cell {\n background: inherit;\n}\n.settings-account-management {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n.settings-account-native {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 3px;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-native .settings-icon-button {\n width: 25px;\n height: 28px;\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 4px 5px;\n min-height: 30px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-delete {\n color: var(--settings-danger);\n}\n.settings-account-delete:hover,\n.settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 24px;\n padding: 3px 0;\n font-size: 10px;\n white-space: nowrap;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-account-dialog {\n position: fixed;\n width: min(360px, calc(100vw - 40px));\n max-height: calc(100vh - 40px);\n overflow: auto;\n padding: 22px;\n color: var(--settings-text);\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: #0005;\n}\n.settings-account-dialog h2 {\n margin: 0 28px 12px 0;\n font-size: 15px;\n}\n.settings-account-dialog p {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.6;\n overflow-wrap: anywhere;\n}\n.settings-account-dialog__close {\n position: absolute;\n top: 12px;\n right: 12px;\n}\n.settings-account-dialog__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n@container (max-width: 680px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n padding: 18px;\n gap: 18px 22px;\n border-top: 1px solid var(--settings-divider);\n }\n .settings-account-row:first-child {\n border-top: 0;\n }\n .settings-account-table .settings-account-row > td {\n display: block;\n min-width: 0;\n padding: 0;\n border: 0;\n }\n .settings-account-person-cell,\n .settings-account-management-cell,\n .settings-account-usage-cell--message {\n grid-column: 1 / -1;\n }\n .settings-account-table .settings-account-management-cell {\n border-top: 1px solid var(--settings-divider);\n padding-top: 8px;\n }\n .settings-account-email {\n font-size: 13px;\n }\n .settings-account-usage__title {\n display: block;\n grid-column: 1;\n }\n .settings-account-usage__percent,\n .settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 2;\n text-align: right;\n }\n .settings-account-extra-usage .settings-account-usage__percent {\n grid-column: 1 / -1;\n }\n .settings-account-management {\n flex-direction: row;\n justify-content: space-between;\n }\n .settings-account-actions {\n order: 1;\n margin-left: auto;\n }\n .settings-account-native {\n justify-content: flex-start;\n }\n .settings-account-table tr:not(.settings-account-row, [hidden]),\n .settings-account-table tr:not(.settings-account-row, [hidden]) > td {\n display: block;\n }\n}\n\n@container (max-width: 360px) {\n .settings-account-row {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n padding: 16px;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
28271
|
+
var accounts_default = '.settings-harness-account__logo {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 0;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 210px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 12px 16px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2),\n.settings-account-table th:nth-child(3) {\n width: 24%;\n}\n.settings-account-table th:nth-child(4) {\n width: 20%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 17px 16px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-email {\n display: block;\n min-width: 0;\n overflow: hidden;\n font-size: 12px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 5px;\n margin-top: 4px;\n color: var(--settings-muted);\n flex-wrap: wrap;\n font-size: 11px;\n overflow-wrap: anywhere;\n}\n.settings-account-plan {\n flex: none;\n padding: 0 4px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 10px;\n max-width: 100%;\n overflow-wrap: anywhere;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n color: light-dark(#66548e, #c8bfff);\n font-size: 10px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 10px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: 20px 4px 17px;\n align-items: center;\n gap: 6px 0;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n.settings-account-usage__title {\n display: none;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-extra-usage {\n display: grid;\n gap: 12px;\n margin-top: 14px;\n}\n.settings-account-extra-usage .settings-account-usage__meter,\n.settings-account-usage__meter--scoped {\n grid-template-rows: auto 20px 4px 17px;\n}\n.settings-account-extra-usage .settings-account-usage__title,\n.settings-account-usage__meter--scoped .settings-account-usage__title {\n display: block;\n grid-column: 1 / -1;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__percent {\n grid-column: 1 / -1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 7px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__countdown {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.settings-account-usage__percent > :last-child {\n flex: none;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n grid-column: 1 / -1;\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 1 / -1;\n color: var(--account-muted);\n font-size: 10px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n}\n.settings-account-usage__message {\n color: var(--settings-muted);\n}\n.settings-account-usage__missing {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-content: center;\n gap: 6px;\n min-height: 53px;\n color: var(--settings-muted);\n}\n.settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 1 / -1;\n font-size: 14px;\n}\n.settings-account-table .settings-account-spanning-cell {\n vertical-align: top;\n}\n.settings-account-quota-continuation-row > .settings-account-usage-cell {\n background: inherit;\n}\n.settings-account-management {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n.settings-account-native {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 3px;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-native .settings-icon-button {\n width: 25px;\n height: 28px;\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-action {\n padding: 4px 5px;\n min-height: 30px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 24px;\n padding: 3px 0;\n font-size: 10px;\n white-space: nowrap;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-account-dialog {\n position: fixed;\n width: min(360px, calc(100vw - 40px));\n max-height: calc(100vh - 40px);\n overflow: auto;\n padding: 22px;\n color: var(--settings-text);\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: #0005;\n}\n.settings-account-dialog h2 {\n margin: 0 28px 12px 0;\n font-size: 15px;\n}\n.settings-account-dialog p {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.6;\n overflow-wrap: anywhere;\n}\n.settings-account-dialog__close {\n position: absolute;\n top: 12px;\n right: 12px;\n}\n\n@container (max-width: 680px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n padding: 18px;\n gap: 18px 22px;\n border-top: 1px solid var(--settings-divider);\n }\n .settings-account-row:first-child {\n border-top: 0;\n }\n .settings-account-table .settings-account-row > td {\n display: block;\n min-width: 0;\n padding: 0;\n border: 0;\n }\n .settings-account-person-cell,\n .settings-account-management-cell,\n .settings-account-usage-cell--message {\n grid-column: 1 / -1;\n }\n .settings-account-table .settings-account-management-cell {\n border-top: 1px solid var(--settings-divider);\n padding-top: 8px;\n }\n .settings-account-email {\n font-size: 13px;\n }\n .settings-account-usage__title {\n display: block;\n grid-column: 1;\n }\n .settings-account-usage__percent,\n .settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 2;\n text-align: right;\n }\n .settings-account-extra-usage .settings-account-usage__percent {\n grid-column: 1 / -1;\n }\n .settings-account-management {\n flex-direction: row;\n justify-content: space-between;\n }\n .settings-account-native {\n justify-content: flex-start;\n }\n .settings-account-table tr:not(.settings-account-row, [hidden]),\n .settings-account-table tr:not(.settings-account-row, [hidden]) > td {\n display: block;\n }\n}\n\n@container (max-width: 360px) {\n .settings-account-row {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n padding: 16px;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
28272
|
+
|
|
28273
|
+
// src/settings/tailwind.css
|
|
28274
|
+
var tailwind_default = '@layer properties, theme, base, components, utilities;\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:"";--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.relative{position:relative}.top-full{top:100%}.left-0{left:0}.z-20{z-index:20}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-\\[45px\\]{margin-left:45px}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-\\[60px\\]{min-height:60px}.w-9{width:calc(var(--spacing) * 9)}.w-14{width:calc(var(--spacing) * 14)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-px{width:1px}.max-w-64{max-width:calc(var(--spacing) * 64)}.min-w-0{min-width:0}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.overflow-x-auto{overflow-x:auto}.rounded-\\[10px\\]{border-radius:10px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-settings-border{border-color:var(--settings-border)}.border-settings-divider{border-color:var(--settings-divider)}.bg-settings-panel{background-color:var(--settings-panel)}.bg-settings-subtle{background-color:var(--settings-subtle)}.bg-settings-surface{background-color:var(--settings-surface)}.bg-settings-surface-hover{background-color:var(--settings-surface-hover)}.bg-transparent{background-color:#0000}.p-0{padding:0}.p-4{padding:calc(var(--spacing) * 4)}.\\!px-0{padding-inline:0!important}.px-1{padding-inline:var(--spacing)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.\\!text-right{text-align:right!important}.text-left{text-align:left}.text-right{text-align:right}.align-top{vertical-align:top}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[11px\\]{font-size:11px}.text-\\[13px\\]{font-size:13px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-settings-muted{color:var(--settings-muted)}.text-settings-subtle{color:var(--settings-subtle)}.text-settings-text{color:var(--settings-text)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_10px_30px_rgb\\(0_0_0\\/0\\.22\\)\\]{--tw-shadow:0 10px 30px var(--tw-shadow-color,#00000038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-settings-border{--tw-ring-color:var(--settings-border)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.ring-inset{--tw-ring-inset:inset}.group-focus-within\\:visible:is(:where(.group):focus-within *){visibility:visible}.group-focus-within\\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media (hover:hover){.group-hover\\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\\[state\\=failed\\]\\/status\\:bg-settings-danger:is(:where(.group\\/status)[data-state=failed] *){background-color:var(--settings-danger)}.group-data-\\[state\\=unavailable\\]\\/status\\:bg-settings-warning:is(:where(.group\\/status)[data-state=unavailable] *){background-color:var(--settings-warning)}.marker\\:text-settings-subtle ::marker{color:var(--settings-subtle)}.marker\\:text-settings-subtle::marker{color:var(--settings-subtle)}.marker\\:text-settings-subtle ::-webkit-details-marker{color:var(--settings-subtle)}.marker\\:text-settings-subtle::-webkit-details-marker{color:var(--settings-subtle)}.before\\:absolute:before{content:var(--tw-content);position:absolute}.before\\:top-0\\.5:before{content:var(--tw-content);top:calc(var(--spacing) * .5)}.before\\:left-0\\.5:before{content:var(--tw-content);left:calc(var(--spacing) * .5)}.before\\:size-4:before{content:var(--tw-content);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.before\\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\\:bg-white:before{content:var(--tw-content);background-color:#fff}.before\\:shadow-\\[0_1px_2px_rgb\\(0_0_0\\/0\\.3\\)\\]:before{content:var(--tw-content);--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.before\\:transition-transform:before{content:var(--tw-content);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.first\\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first-of-type\\:mt-0:first-of-type{margin-top:0}.checked\\:bg-settings-focus:checked{background-color:var(--settings-focus)}.checked\\:ring-transparent:checked{--tw-ring-color:transparent}.checked\\:before\\:translate-x-4:checked:before{content:var(--tw-content);--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.focus-within\\:border-settings-focus:focus-within{border-color:var(--settings-focus)}@media (hover:hover){.hover\\:text-settings-text:hover{color:var(--settings-text)}}.focus-visible\\:text-settings-text:focus-visible{color:var(--settings-text)}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\\:outline-settings-focus:focus-visible{outline-color:var(--settings-focus)}.data-\\[invalid\\=true\\]\\:border-settings-danger[data-invalid=true]{border-color:var(--settings-danger)}.data-\\[invalid\\=true\\]\\:text-settings-danger[data-invalid=true],.data-\\[state\\=failed\\]\\:text-settings-danger[data-state=failed]{color:var(--settings-danger)}.data-\\[state\\=unavailable\\]\\:text-settings-warning[data-state=unavailable]{color:var(--settings-warning)}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@layer properties{\n *, ::before, ::after, ::backdrop{--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-alpha:100%;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-offset-width:0;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-drop-shadow-alpha:100%;--tw-content:"";--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}\n';
|
|
26241
28275
|
|
|
26242
28276
|
// src/settings/shell.ts
|
|
26243
28277
|
var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
|
|
@@ -26263,7 +28297,8 @@ ${error51.stderrTail}`] : []
|
|
|
26263
28297
|
root.style.colorScheme = RENDERER_SETTINGS_COLOR_SCHEME;
|
|
26264
28298
|
const shadow = root.attachShadow({ mode: "open" });
|
|
26265
28299
|
const style = ownerDocument.createElement("style");
|
|
26266
|
-
style.textContent = `${
|
|
28300
|
+
style.textContent = `${tailwind_default}
|
|
28301
|
+
${shell_default}
|
|
26267
28302
|
${accounts_default}`;
|
|
26268
28303
|
const dialog = ownerDocument.createElement("dialog");
|
|
26269
28304
|
dialog.className = "codexhost-settings-dialog";
|
|
@@ -26492,8 +28527,10 @@ ${accounts_default}`;
|
|
|
26492
28527
|
|
|
26493
28528
|
// src/settings/trigger.ts
|
|
26494
28529
|
var SETTINGS_TRIGGER_ATTRIBUTE = "data-codexhost-settings-trigger";
|
|
28530
|
+
var SETTINGS_HEADER_SURFACE_SELECTOR = '[data-testid="app-shell-header-context-menu-surface"]';
|
|
26495
28531
|
var SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
|
|
26496
28532
|
var SETTINGS_HEADER_SLOT_SELECTOR = ':scope > [data-test-id="header-shell-slot"]';
|
|
28533
|
+
var SETTINGS_HEADER_NATIVE_ACTION_GROUP_SELECTOR = ':scope > [data-app-shell-header-obstacle="true"]';
|
|
26497
28534
|
function measuredBounds(element) {
|
|
26498
28535
|
const bounds = element.getBoundingClientRect();
|
|
26499
28536
|
return {
|
|
@@ -26505,11 +28542,23 @@ ${accounts_default}`;
|
|
|
26505
28542
|
height: bounds.height
|
|
26506
28543
|
};
|
|
26507
28544
|
}
|
|
28545
|
+
function findNativeHeaderActionGroup(header) {
|
|
28546
|
+
const surface = header.querySelector(SETTINGS_HEADER_SURFACE_SELECTOR);
|
|
28547
|
+
if (!surface) return null;
|
|
28548
|
+
const groups = [
|
|
28549
|
+
...surface.querySelectorAll(SETTINGS_HEADER_NATIVE_ACTION_GROUP_SELECTOR)
|
|
28550
|
+
];
|
|
28551
|
+
return groups.at(-1) ?? null;
|
|
28552
|
+
}
|
|
26508
28553
|
function findRendererSettingsHeaderInsertionPoint(ownerDocument) {
|
|
26509
28554
|
const header = ownerDocument.querySelector(SETTINGS_APPLICATION_HEADER_SELECTOR);
|
|
26510
28555
|
if (!header) return null;
|
|
26511
28556
|
const headerBounds = measuredBounds(header);
|
|
26512
28557
|
if (headerBounds.width <= 0 || headerBounds.height <= 0) return null;
|
|
28558
|
+
const nativeActionGroup = findNativeHeaderActionGroup(header);
|
|
28559
|
+
if (nativeActionGroup?.parentElement) {
|
|
28560
|
+
return { parent: nativeActionGroup.parentElement, before: nativeActionGroup };
|
|
28561
|
+
}
|
|
26513
28562
|
const endSlot = [...header.querySelectorAll(SETTINGS_HEADER_SLOT_SELECTOR)].filter((slot) => {
|
|
26514
28563
|
const bounds = measuredBounds(slot);
|
|
26515
28564
|
return bounds.width > 0 && bounds.height > 0;
|
|
@@ -26715,7 +28764,8 @@ ${accounts_default}`;
|
|
|
26715
28764
|
}
|
|
26716
28765
|
await options.openImportedThread(threadId, signal);
|
|
26717
28766
|
if (!disposed && !signal.aborted) shell?.close();
|
|
26718
|
-
}
|
|
28767
|
+
},
|
|
28768
|
+
options.getLoadedSessionsClient ?? (() => null)
|
|
26719
28769
|
);
|
|
26720
28770
|
const nextShell = installRendererSettingsShell(definitions, messages, ownerWindow.document);
|
|
26721
28771
|
const nextTrigger = installRendererSettingsHeaderTrigger({
|
|
@@ -26860,82 +28910,6 @@ ${accounts_default}`;
|
|
|
26860
28910
|
};
|
|
26861
28911
|
}
|
|
26862
28912
|
|
|
26863
|
-
// src/renderer-account-navigation.ts
|
|
26864
|
-
function createRendererAccountNavigation(currentThread) {
|
|
26865
|
-
let cancel = () => {
|
|
26866
|
-
};
|
|
26867
|
-
return {
|
|
26868
|
-
async switchAccount(operation) {
|
|
26869
|
-
cancel();
|
|
26870
|
-
const view = currentThread();
|
|
26871
|
-
if (!view) return operation();
|
|
26872
|
-
const controller = new AbortController();
|
|
26873
|
-
let deadline = 0;
|
|
26874
|
-
let timer;
|
|
26875
|
-
let committed = false;
|
|
26876
|
-
let opening = false;
|
|
26877
|
-
let done = false;
|
|
26878
|
-
const finish = () => {
|
|
26879
|
-
if (done) return;
|
|
26880
|
-
done = true;
|
|
26881
|
-
observer.disconnect();
|
|
26882
|
-
if (timer !== void 0) window.clearTimeout(timer);
|
|
26883
|
-
document.removeEventListener("pointerdown", onInput, true);
|
|
26884
|
-
document.removeEventListener("keydown", onInput, true);
|
|
26885
|
-
controller.abort();
|
|
26886
|
-
};
|
|
26887
|
-
const onInput = (event) => {
|
|
26888
|
-
if (!event.composedPath().some(
|
|
26889
|
-
(node) => node instanceof Element && node.hasAttribute("data-codexhost-settings-shell")
|
|
26890
|
-
))
|
|
26891
|
-
finish();
|
|
26892
|
-
};
|
|
26893
|
-
const restore = () => {
|
|
26894
|
-
if (done || !committed || opening || view.composer.isConnected) return;
|
|
26895
|
-
if (Date.now() >= deadline) {
|
|
26896
|
-
finish();
|
|
26897
|
-
return;
|
|
26898
|
-
}
|
|
26899
|
-
const composer = document.querySelector(CODEX_COMPOSER_SELECTOR);
|
|
26900
|
-
if (!composer) return;
|
|
26901
|
-
const selected = composer.querySelector(":scope > [data-above-composer-portal]")?.getAttribute("data-above-composer-conversation-id");
|
|
26902
|
-
if (selected) {
|
|
26903
|
-
finish();
|
|
26904
|
-
return;
|
|
26905
|
-
}
|
|
26906
|
-
opening = true;
|
|
26907
|
-
void openRendererThread(view.threadId, { hostId: "local", signal: controller.signal }).catch(() => {
|
|
26908
|
-
if (!controller.signal.aborted)
|
|
26909
|
-
console.warn(
|
|
26910
|
-
"codexhost: Could not restore the selected Thread after Account switching"
|
|
26911
|
-
);
|
|
26912
|
-
}).finally(finish);
|
|
26913
|
-
};
|
|
26914
|
-
const observer = new MutationObserver(restore);
|
|
26915
|
-
cancel = finish;
|
|
26916
|
-
observer.observe(document.documentElement, { childList: true, subtree: true });
|
|
26917
|
-
document.addEventListener("pointerdown", onInput, true);
|
|
26918
|
-
document.addEventListener("keydown", onInput, true);
|
|
26919
|
-
try {
|
|
26920
|
-
const result = await operation();
|
|
26921
|
-
committed = true;
|
|
26922
|
-
if (!done) {
|
|
26923
|
-
deadline = Date.now() + 3e4;
|
|
26924
|
-
timer = window.setTimeout(finish, 3e4);
|
|
26925
|
-
restore();
|
|
26926
|
-
}
|
|
26927
|
-
return result;
|
|
26928
|
-
} catch (error51) {
|
|
26929
|
-
finish();
|
|
26930
|
-
throw error51;
|
|
26931
|
-
}
|
|
26932
|
-
},
|
|
26933
|
-
dispose() {
|
|
26934
|
-
cancel();
|
|
26935
|
-
}
|
|
26936
|
-
};
|
|
26937
|
-
}
|
|
26938
|
-
|
|
26939
28913
|
// src/renderer-binding-probe.ts
|
|
26940
28914
|
var externalHarnessIds = {
|
|
26941
28915
|
pi: harnessIdSchema.parse("pi"),
|
|
@@ -26948,7 +28922,9 @@ ${accounts_default}`;
|
|
|
26948
28922
|
"kiro-cli": harnessIdSchema.parse("kiro-cli"),
|
|
26949
28923
|
codebuddy: harnessIdSchema.parse("codebuddy"),
|
|
26950
28924
|
"cursor-cli": harnessIdSchema.parse("cursor-cli"),
|
|
26951
|
-
hermes: harnessIdSchema.parse("hermes")
|
|
28925
|
+
hermes: harnessIdSchema.parse("hermes"),
|
|
28926
|
+
qoder: harnessIdSchema.parse("qoder"),
|
|
28927
|
+
"qoder-cn": harnessIdSchema.parse("qoder-cn")
|
|
26952
28928
|
};
|
|
26953
28929
|
var externalAgents = [
|
|
26954
28930
|
"pi",
|
|
@@ -26961,7 +28937,9 @@ ${accounts_default}`;
|
|
|
26961
28937
|
"kiro-cli",
|
|
26962
28938
|
"codebuddy",
|
|
26963
28939
|
"cursor-cli",
|
|
26964
|
-
"hermes"
|
|
28940
|
+
"hermes",
|
|
28941
|
+
"qoder",
|
|
28942
|
+
"qoder-cn"
|
|
26965
28943
|
];
|
|
26966
28944
|
function isRetryableHarnessAvailability(availability, error51) {
|
|
26967
28945
|
return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
|
|
@@ -27153,6 +29131,21 @@ ${accounts_default}`;
|
|
|
27153
29131
|
...inspection.effectivePermissionModeId ? { permissionModeId: inspection.effectivePermissionModeId } : {}
|
|
27154
29132
|
};
|
|
27155
29133
|
}
|
|
29134
|
+
if (inspection.harnessId === "qoder" || inspection.harnessId === "qoder-cn") {
|
|
29135
|
+
const route = decodeHarnessPluginRoute(inspection.transportModelId);
|
|
29136
|
+
if (!route || route.harnessId !== inspection.harnessId) {
|
|
29137
|
+
throw new Error("Qoder Thread reported an incompatible transport Model");
|
|
29138
|
+
}
|
|
29139
|
+
const model = inspection.effectiveModel ?? route.model;
|
|
29140
|
+
const thinkingOptionId = inspection.availableThinkingOptions !== void 0 ? selectableThinkingOptionId(inspection) : inspection.effectiveThinkingOptionId ?? route.thinkingOptionId;
|
|
29141
|
+
const permissionModeId = inspection.effectivePermissionModeId ?? route.permissionModeId;
|
|
29142
|
+
return {
|
|
29143
|
+
agent: inspection.harnessId,
|
|
29144
|
+
...model ? { model } : {},
|
|
29145
|
+
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
29146
|
+
...permissionModeId ? { permissionModeId } : {}
|
|
29147
|
+
};
|
|
29148
|
+
}
|
|
27156
29149
|
throw new Error("Thread owner is not a Renderer Agent");
|
|
27157
29150
|
}
|
|
27158
29151
|
function isOwnershipSubmissionBlocked(status) {
|
|
@@ -27239,16 +29232,14 @@ ${accounts_default}`;
|
|
|
27239
29232
|
const controllerTarget = (target, hostId) => scopedComposerTarget(target, hostId);
|
|
27240
29233
|
let usageNotificationDispose = null;
|
|
27241
29234
|
const localAgentForSidebarThread = (input) => {
|
|
27242
|
-
const mountedHostId = modelControl?.currentHostId?.() ?? "local";
|
|
27243
|
-
if (input.hostId !== mountedHostId) return null;
|
|
27244
29235
|
for (const mounted of mountedByComposer.values()) {
|
|
27245
29236
|
const target = mounted.modelTarget;
|
|
27246
|
-
|
|
27247
|
-
|
|
27248
|
-
|
|
27249
|
-
|
|
27250
|
-
|
|
27251
|
-
|
|
29237
|
+
const matchesDraft = target?.[0] === "default" && input.draftId !== null && target[1] === input.draftId;
|
|
29238
|
+
const matchesConversation = target?.[0] === "conversation" && input.threadId !== null && target[1] === input.threadId && mounted.ownershipStatus === "ready";
|
|
29239
|
+
if (!matchesDraft && !matchesConversation) continue;
|
|
29240
|
+
const mountedHostId = modelControl?.currentHostId?.() ?? "local";
|
|
29241
|
+
if (input.hostId !== mountedHostId) return null;
|
|
29242
|
+
return controller.get(mounted.composer).agent;
|
|
27252
29243
|
}
|
|
27253
29244
|
return null;
|
|
27254
29245
|
};
|
|
@@ -27257,24 +29248,11 @@ ${accounts_default}`;
|
|
|
27257
29248
|
getLocalAgent: localAgentForSidebarThread
|
|
27258
29249
|
});
|
|
27259
29250
|
let connectionDiagnostics = null;
|
|
27260
|
-
const accountNavigation = createRendererAccountNavigation(() => {
|
|
27261
|
-
const views = [...mountedByComposer.values()].filter(
|
|
27262
|
-
(mounted) => mounted.composer.isConnected && mounted.hostId === "local" && mounted.ownershipStatus === "ready" && controller.get(mounted.composer).agent === "codex"
|
|
27263
|
-
);
|
|
27264
|
-
const view = views.length === 1 ? views[0] : void 0;
|
|
27265
|
-
const threadId = view && threadIdFromComposerModelTarget(view.modelTarget);
|
|
27266
|
-
return view && threadId ? { composer: view.composer, threadId } : null;
|
|
27267
|
-
});
|
|
27268
29251
|
const settingsLifecycle = installRendererSettingsLifecycle(window, {
|
|
27269
29252
|
getUpdateClient: () => modelControl,
|
|
27270
|
-
getAccountClient: () =>
|
|
27271
|
-
const client = modelControl;
|
|
27272
|
-
return client && {
|
|
27273
|
-
...client,
|
|
27274
|
-
switchCodexAccount: (input) => accountNavigation.switchAccount(() => client.switchCodexAccount(input))
|
|
27275
|
-
};
|
|
27276
|
-
},
|
|
29253
|
+
getAccountClient: () => modelControl,
|
|
27277
29254
|
getConnectionDiagnostics: () => connectionDiagnostics,
|
|
29255
|
+
getLoadedSessionsClient: () => modelClientForHost("local"),
|
|
27278
29256
|
getSessionImportClient: () => {
|
|
27279
29257
|
const client = modelClientForHost("local");
|
|
27280
29258
|
const sources = client?.listSessionImportSources;
|
|
@@ -27314,7 +29292,9 @@ ${accounts_default}`;
|
|
|
27314
29292
|
"kiro-cli": void 0,
|
|
27315
29293
|
codebuddy: void 0,
|
|
27316
29294
|
"cursor-cli": void 0,
|
|
27317
|
-
hermes: void 0
|
|
29295
|
+
hermes: void 0,
|
|
29296
|
+
qoder: void 0,
|
|
29297
|
+
"qoder-cn": void 0
|
|
27318
29298
|
},
|
|
27319
29299
|
webUi: Object.fromEntries(
|
|
27320
29300
|
externalAgents.map((agent) => [agent, false])
|
|
@@ -27400,7 +29380,7 @@ ${accounts_default}`;
|
|
|
27400
29380
|
mounted.control,
|
|
27401
29381
|
controller.get(mounted.composer),
|
|
27402
29382
|
adapterStatus.state,
|
|
27403
|
-
|
|
29383
|
+
controller.isSwitching(mounted.composer) || mounted.ownershipStatus === "loading",
|
|
27404
29384
|
activeHarnessAvailabilityState().availability,
|
|
27405
29385
|
mounted.modelView,
|
|
27406
29386
|
mounted.permissionModeView,
|
|
@@ -27487,7 +29467,7 @@ ${accounts_default}`;
|
|
|
27487
29467
|
mounted.usage = null;
|
|
27488
29468
|
mounted.accountCredits = null;
|
|
27489
29469
|
renderMounted(mounted);
|
|
27490
|
-
if (
|
|
29470
|
+
if (!accountId || !client?.inspectCodexAccountUsage) return;
|
|
27491
29471
|
try {
|
|
27492
29472
|
const result = await client.inspectCodexAccountUsage({ accountId });
|
|
27493
29473
|
if (disposed || mounted.hostId !== hostId || composerCodexAccounts(mounted.composer) !== accounts || !mounted.composer.isConnected || mountedByComposer.get(mounted.composer) !== mounted || mounted.usageRequestGeneration !== generation || controller.get(mounted.composer).agent !== "codex" || controller.get(mounted.composer).phase !== "draft" || controller.isSubmissionPending(mounted.composer) || threadIdFromComposerModelTarget(mounted.modelTarget) || accounts.readyAccountId !== accountId || result.accountId !== accountId)
|
|
@@ -28777,7 +30757,7 @@ ${accounts_default}`;
|
|
|
28777
30757
|
const mounted = mountedByComposer.get(composer);
|
|
28778
30758
|
if (!mounted) return null;
|
|
28779
30759
|
const current = controller.get(composer);
|
|
28780
|
-
if (
|
|
30760
|
+
if (controller.isSwitching(composer) || isOwnershipSubmissionBlocked(mounted.ownershipStatus)) {
|
|
28781
30761
|
return false;
|
|
28782
30762
|
}
|
|
28783
30763
|
if (!isExternalConfigurationReady(mounted)) return false;
|
|
@@ -28817,7 +30797,7 @@ ${accounts_default}`;
|
|
|
28817
30797
|
const onKeyDown = (event) => {
|
|
28818
30798
|
const composer = isComposerInputIntent(event) ? composerForTarget(event.target) : null;
|
|
28819
30799
|
const mounted = composer ? mountedByComposer.get(composer) : void 0;
|
|
28820
|
-
if (composer &&
|
|
30800
|
+
if (composer && controller.isSwitching(composer)) {
|
|
28821
30801
|
blockEvent(event);
|
|
28822
30802
|
return;
|
|
28823
30803
|
}
|
|
@@ -29017,7 +30997,6 @@ ${accounts_default}`;
|
|
|
29017
30997
|
mutationObserver.disconnect();
|
|
29018
30998
|
disposeReasoningSoftWrap();
|
|
29019
30999
|
sidebarAgentIcons.dispose();
|
|
29020
|
-
accountNavigation.dispose();
|
|
29021
31000
|
settingsLifecycle.dispose();
|
|
29022
31001
|
document.removeEventListener("beforeinput", onBeforeInput, true);
|
|
29023
31002
|
document.removeEventListener("submit", onSubmit, true);
|