@karlorz/codexhost-cli-win32-x64 0.13.3-5 → 0.13.3-7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/app/codexhost-distribution.json +1 -1
- package/app/console-server.mjs +844 -80
- package/app/console-web.js +1329 -223
- package/app/cpa-live-voice-hook.js +864 -164
- package/app/desktop-controller.mjs +138 -35
- package/app/host-runtime.mjs +1233 -573
- package/app/plugins/antigravity/plugin.mjs +72 -1
- package/app/plugins/claude-code/plugin.mjs +130 -12
- package/app/plugins/codebuddy/plugin.mjs +79 -5
- package/app/plugins/codex-usage/plugin.mjs +178 -67
- package/app/plugins/cursor-cli/plugin.mjs +20727 -44858
- package/app/plugins/deepseek-harness/plugin.mjs +79 -5
- package/app/plugins/grok/plugin.mjs +888 -157
- package/app/plugins/hermes/plugin.mjs +79 -5
- package/app/plugins/kimi-code/plugin.mjs +72 -1
- package/app/plugins/kiro-cli/plugin.mjs +72 -1
- package/app/plugins/omp/plugin.mjs +2335 -2072
- package/app/plugins/opencode/plugin.mjs +79 -5
- package/app/plugins/pi/plugin.mjs +2432 -2276
- package/app/plugins/qoder/plugin.mjs +79 -5
- package/app/plugins/qoder-cn/plugin.mjs +79 -5
- package/app/plugins/workbuddy/plugin.mjs +79 -5
- package/app/plugins/zcode/plugin.mjs +79 -5
- package/app/renderer-extension.js +2977 -912
- package/bin/codexhost.exe +0 -0
- package/libexec/codexhost-node-repl.exe +0 -0
- package/libexec/codexhost-shim.exe +0 -0
- package/libexec/codexhost-updater.exe +0 -0
- package/package.json +1 -1
package/app/console-web.js
CHANGED
|
@@ -14930,6 +14930,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14930
14930
|
url: external_exports.string().max(2048).regex(/^http:\/\/(?:127\.0\.0\.1|localhost):\d{1,5}\/(?:\?.*)?$/u)
|
|
14931
14931
|
});
|
|
14932
14932
|
var CONSOLE_HOST_METHODS = Object.freeze([
|
|
14933
|
+
"codexhost/voice/gateway-status",
|
|
14933
14934
|
"codexhost/console/remote-connections",
|
|
14934
14935
|
"codexhost/runtime/status",
|
|
14935
14936
|
"codexhost/remote/ssh-setup",
|
|
@@ -14940,6 +14941,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14940
14941
|
"codexhost/harness/installation",
|
|
14941
14942
|
"codexhost/harness/launch-settings/get",
|
|
14942
14943
|
"codexhost/harness/launch-settings/set",
|
|
14944
|
+
"codexhost/harness/grok-computer-use/get",
|
|
14945
|
+
"codexhost/harness/grok-computer-use/set",
|
|
14943
14946
|
"codexhost/harness/web-ui/open",
|
|
14944
14947
|
"codexhost/harness/accounts/sources",
|
|
14945
14948
|
"codexhost/harness/accounts/list",
|
|
@@ -15471,7 +15474,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15471
15474
|
var harnessInspectParamsSchema = external_exports.object({
|
|
15472
15475
|
harnessId: harnessIdSchema,
|
|
15473
15476
|
cwd: nonBlankTextSchema2.max(16384).optional(),
|
|
15474
|
-
refresh: external_exports.boolean().optional()
|
|
15477
|
+
refresh: external_exports.boolean().optional(),
|
|
15478
|
+
/** `availability` asks only whether the Harness can run; see `InspectHarnessInput.purpose`. */
|
|
15479
|
+
purpose: external_exports.literal("availability").optional()
|
|
15475
15480
|
}).strict();
|
|
15476
15481
|
var harnessWebUiOpenParamsSchema = external_exports.object({
|
|
15477
15482
|
harnessId: harnessIdSchema
|
|
@@ -15647,6 +15652,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15647
15652
|
restartRequired: external_exports.boolean()
|
|
15648
15653
|
}).strict();
|
|
15649
15654
|
|
|
15655
|
+
// ../shared-contracts/dist/grok-computer-use.js
|
|
15656
|
+
var GROK_COMPUTER_USE_GET_METHOD = "codexhost/harness/grok-computer-use/get";
|
|
15657
|
+
var GROK_COMPUTER_USE_SET_METHOD = "codexhost/harness/grok-computer-use/set";
|
|
15658
|
+
var grokComputerUseGetSchema = external_exports.object({}).strict();
|
|
15659
|
+
var grokComputerUseSetSchema = external_exports.object({
|
|
15660
|
+
enabled: external_exports.boolean().optional(),
|
|
15661
|
+
browser: external_exports.boolean().optional()
|
|
15662
|
+
}).strict().refine((value) => value.enabled !== void 0 || value.browser !== void 0, {
|
|
15663
|
+
message: "Expected enabled or browser"
|
|
15664
|
+
});
|
|
15665
|
+
var grokComputerUseSettingsSchema = external_exports.object({
|
|
15666
|
+
enabled: external_exports.boolean(),
|
|
15667
|
+
available: external_exports.boolean(),
|
|
15668
|
+
unavailableReason: external_exports.string().min(1).max(500).optional(),
|
|
15669
|
+
browser: external_exports.boolean().optional(),
|
|
15670
|
+
browserFilesPresent: external_exports.boolean().optional(),
|
|
15671
|
+
browserAvailable: external_exports.boolean().optional(),
|
|
15672
|
+
browserUnavailableReason: external_exports.string().min(1).max(500).optional(),
|
|
15673
|
+
applyFailed: external_exports.boolean().optional(),
|
|
15674
|
+
applyError: external_exports.string().min(1).max(500).optional()
|
|
15675
|
+
}).strict();
|
|
15676
|
+
|
|
15650
15677
|
// ../shared-contracts/dist/harness-installation.js
|
|
15651
15678
|
var HARNESS_INSTALLATION_METHOD = "codexhost/harness/installation";
|
|
15652
15679
|
var harnessInstallationParamsSchema = external_exports.object({
|
|
@@ -16046,6 +16073,52 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16046
16073
|
external_exports.strictObject({ error: external_exports.strictObject({ code: external_exports.number().int(), message: external_exports.string() }) })
|
|
16047
16074
|
]);
|
|
16048
16075
|
|
|
16076
|
+
// ../shared-contracts/dist/voice-settings.js
|
|
16077
|
+
var voiceRoutesSchema = external_exports.strictObject({
|
|
16078
|
+
chatExperience: external_exports.enum(["chatgpt", "codex"]),
|
|
16079
|
+
chatConnection: external_exports.enum(["desktop", "gateway"]),
|
|
16080
|
+
workConnection: external_exports.enum(["desktop", "gateway"])
|
|
16081
|
+
});
|
|
16082
|
+
var DEFAULT_VOICE_ROUTES = Object.freeze({
|
|
16083
|
+
chatExperience: "chatgpt",
|
|
16084
|
+
chatConnection: "desktop",
|
|
16085
|
+
workConnection: "gateway"
|
|
16086
|
+
});
|
|
16087
|
+
var voiceSettingsSchema = voiceRoutesSchema.extend({ inject: external_exports.boolean() });
|
|
16088
|
+
var voiceSettingsRequestSchema = external_exports.discriminatedUnion("operation", [
|
|
16089
|
+
external_exports.strictObject({
|
|
16090
|
+
operation: external_exports.literal("get"),
|
|
16091
|
+
runtime: external_exports.strictObject({
|
|
16092
|
+
id: external_exports.string().uuid(),
|
|
16093
|
+
revision: external_exports.string().max(64),
|
|
16094
|
+
activeCall: external_exports.boolean()
|
|
16095
|
+
}).optional()
|
|
16096
|
+
}),
|
|
16097
|
+
external_exports.strictObject({ operation: external_exports.literal("migrate"), routes: voiceRoutesSchema }),
|
|
16098
|
+
external_exports.strictObject({
|
|
16099
|
+
operation: external_exports.literal("set"),
|
|
16100
|
+
settings: voiceSettingsSchema,
|
|
16101
|
+
revision: external_exports.string().max(64)
|
|
16102
|
+
}),
|
|
16103
|
+
external_exports.strictObject({ operation: external_exports.literal("restart"), confirm: external_exports.literal(true) })
|
|
16104
|
+
]);
|
|
16105
|
+
var voiceSettingsStateSchema = external_exports.strictObject({
|
|
16106
|
+
settings: voiceSettingsSchema,
|
|
16107
|
+
initialized: external_exports.boolean(),
|
|
16108
|
+
revision: external_exports.string(),
|
|
16109
|
+
activeInject: external_exports.boolean().nullable(),
|
|
16110
|
+
envOverride: external_exports.enum(["0", "1"]).nullable(),
|
|
16111
|
+
activeEnvOverride: external_exports.enum(["0", "1"]).nullable(),
|
|
16112
|
+
routesActive: external_exports.boolean().nullable(),
|
|
16113
|
+
activeCall: external_exports.boolean().nullable(),
|
|
16114
|
+
gatewayReady: external_exports.boolean().nullable(),
|
|
16115
|
+
restartAvailable: external_exports.boolean(),
|
|
16116
|
+
restart: external_exports.strictObject({
|
|
16117
|
+
phase: external_exports.enum(["idle", "restarting", "succeeded", "failed"]),
|
|
16118
|
+
error: external_exports.string().nullable()
|
|
16119
|
+
})
|
|
16120
|
+
});
|
|
16121
|
+
|
|
16049
16122
|
// ../shared-contracts/dist/index.js
|
|
16050
16123
|
var workspaceContractVersionSchema = external_exports.literal(WORKSPACE_CONTRACT_VERSION);
|
|
16051
16124
|
|
|
@@ -17042,6 +17115,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
17042
17115
|
if (!client.setHarnessLaunchSettings) throw new Error("Launch settings are unavailable");
|
|
17043
17116
|
return client.setHarnessLaunchSettings({ harnessId: harnessIdSchema.parse(agent), path });
|
|
17044
17117
|
},
|
|
17118
|
+
async getGrokComputerUse() {
|
|
17119
|
+
if (!client.getGrokComputerUse) throw new Error("Grok Computer Use settings are unavailable");
|
|
17120
|
+
return client.getGrokComputerUse();
|
|
17121
|
+
},
|
|
17122
|
+
async setGrokComputerUse(_hostId, update) {
|
|
17123
|
+
if (!client.setGrokComputerUse) throw new Error("Grok Computer Use settings are unavailable");
|
|
17124
|
+
return client.setGrokComputerUse(update);
|
|
17125
|
+
},
|
|
17045
17126
|
subscribe(listener) {
|
|
17046
17127
|
listeners.add(listener);
|
|
17047
17128
|
return () => listeners.delete(listener);
|
|
@@ -17050,7 +17131,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
17050
17131
|
}
|
|
17051
17132
|
|
|
17052
17133
|
// src/console/console.css
|
|
17053
|
-
var console_default = '/*\n * Standalone console layout. Colors and components come from the settings\n * design tokens (shell.css) so reused settings pages and console pages match.\n */\n\n:host {\n position: fixed;\n inset: 0;\n display: block;\n}\n\n.console-app {\n display: grid;\n grid-template-columns: 248px minmax(0, 1fr);\n height: 100%;\n min-height: 0;\n background: var(--settings-bg);\n color: var(--settings-text);\n}\n\n.console-sidebar {\n padding-top: 0;\n}\n\n.console-sidebar .settings-nav {\n padding-top: 4px;\n}\n\n.console-brand {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 18px 16px 16px;\n}\n\n.console-brand__copy {\n display: flex;\n min-width: 0;\n flex-direction: column;\n line-height: 18px;\n}\n\n.console-brand__name {\n font-size: 14px;\n font-weight: 650;\n letter-spacing: -0.01em;\n}\n\n.console-brand__subtitle {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.console-status-card {\n display: grid;\n gap: 4px;\n margin: 8px 10px 14px;\n padding: 11px 12px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.console-status-card__row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.console-status-card__title {\n font-size: 12px;\n font-weight: 600;\n}\n\n.console-status-card__meta {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 11px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.console-dot {\n width: 8px;\n height: 8px;\n flex: none;\n background: var(--settings-subtle);\n border-radius: 50%;\n}\n\n.console-dot.is-ok {\n background: var(--settings-success);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--settings-success) 18%, transparent);\n}\n\n.console-dot.is-warn {\n background: var(--settings-warning);\n}\n\n.console-dot.is-bad {\n background: var(--settings-danger);\n}\n\n.console-main {\n position: relative;\n}\n\n.console-announcement {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n width: min(930px, calc(100% - 80px));\n margin: 28px auto 0;\n padding: 14px 16px;\n font-size: 13px;\n line-height: 20px;\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n border: 1px solid var(--settings-warning-border);\n border-radius: 12px;\n overflow-wrap: anywhere;\n}\n\n.console-announcement[data-type="info"] {\n color: var(--settings-focus);\n background: color-mix(in srgb, var(--settings-focus) 7%, var(--settings-bg));\n border-color: color-mix(in srgb, var(--settings-focus) 24%, var(--settings-bg));\n}\n\n.console-announcement[data-type="danger"] {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border-color: var(--settings-danger-border);\n}\n\n.console-announcement > svg {\n flex: none;\n margin-top: 2px;\n}\n\n.console-announcement[hidden] {\n display: none;\n}\n\n.console-announcement > div {\n min-width: 0;\n}\n\n.console-announcement .settings-update-notes {\n margin-top: 4px;\n color: inherit;\n font: inherit;\n}\n\n.console-announcement a {\n color: inherit;\n}\n\n.console-offline {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 16px auto 0;\n width: min(930px, calc(100% - 80px));\n padding: 10px 12px;\n color: var(--settings-danger);\n font-size: 12px;\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.console-offline[hidden] {\n display: none;\n}\n\n/* Overview */\n\n.console-hero {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr)
|
|
17134
|
+
var console_default = '/*\n * Standalone console layout. Colors and components come from the settings\n * design tokens (shell.css) so reused settings pages and console pages match.\n */\n\n:host {\n position: fixed;\n inset: 0;\n display: block;\n}\n\n.console-app {\n display: grid;\n grid-template-columns: 248px minmax(0, 1fr);\n height: 100%;\n min-height: 0;\n background: var(--settings-bg);\n color: var(--settings-text);\n}\n\n.console-sidebar {\n padding-top: 0;\n}\n\n.console-sidebar .settings-nav {\n padding-top: 4px;\n}\n\n.console-brand {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 18px 16px 16px;\n}\n\n.console-brand__copy {\n display: flex;\n min-width: 0;\n flex-direction: column;\n line-height: 18px;\n}\n\n.console-brand__name {\n font-size: 14px;\n font-weight: 650;\n letter-spacing: -0.01em;\n}\n\n.console-brand__subtitle {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.console-status-card {\n display: grid;\n gap: 4px;\n margin: 8px 10px 14px;\n padding: 11px 12px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.console-status-card__row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.console-status-card__title {\n font-size: 12px;\n font-weight: 600;\n}\n\n.console-status-card__meta {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 11px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.console-dot {\n width: 8px;\n height: 8px;\n flex: none;\n background: var(--settings-subtle);\n border-radius: 50%;\n}\n\n.console-dot.is-ok {\n background: var(--settings-success);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--settings-success) 18%, transparent);\n}\n\n.console-dot.is-warn {\n background: var(--settings-warning);\n}\n\n.console-dot.is-bad {\n background: var(--settings-danger);\n}\n\n.console-main {\n position: relative;\n}\n\n.console-announcement {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n width: min(930px, calc(100% - 80px));\n margin: 28px auto 0;\n padding: 14px 16px;\n font-size: 13px;\n line-height: 20px;\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n border: 1px solid var(--settings-warning-border);\n border-radius: 12px;\n overflow-wrap: anywhere;\n}\n\n.console-announcement[data-type="info"] {\n color: var(--settings-focus);\n background: color-mix(in srgb, var(--settings-focus) 7%, var(--settings-bg));\n border-color: color-mix(in srgb, var(--settings-focus) 24%, var(--settings-bg));\n}\n\n.console-announcement[data-type="danger"] {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border-color: var(--settings-danger-border);\n}\n\n.console-announcement > svg {\n flex: none;\n margin-top: 2px;\n}\n\n.console-announcement[hidden] {\n display: none;\n}\n\n.console-announcement > div {\n min-width: 0;\n}\n\n.console-announcement .settings-update-notes {\n margin-top: 4px;\n color: inherit;\n font: inherit;\n}\n\n.console-announcement a {\n color: inherit;\n}\n\n.console-offline {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 16px auto 0;\n width: min(930px, calc(100% - 80px));\n padding: 10px 12px;\n color: var(--settings-danger);\n font-size: 12px;\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.console-offline[hidden] {\n display: none;\n}\n\n/* Overview */\n\n.console-hero {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 14px;\n}\n\n.console-hero > .console-actions {\n grid-column: 1 / -1;\n}\n\n.console-hero__icon {\n display: grid;\n width: 44px;\n height: 44px;\n place-items: center;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 12px;\n}\n\n.console-hero[data-tone="ok"] .console-hero__icon {\n color: var(--settings-success);\n background: color-mix(in srgb, var(--settings-success) 12%, transparent);\n}\n\n.console-hero[data-tone="warn"] .console-hero__icon {\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n}\n\n.console-hero[data-tone="bad"] .console-hero__icon {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n\n.console-hero__title {\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.console-hero__detail {\n margin-top: 2px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.console-versions {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));\n gap: 12px;\n margin: 12px 0;\n}\n\n.console-version-card {\n min-width: 0;\n padding: 14px 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.console-version-card dt {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.console-version-card dd {\n margin: 6px 0 0;\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n overflow-wrap: anywhere;\n}\n\n.console-lead {\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.console-details summary {\n color: var(--settings-muted);\n font-size: 12px;\n cursor: pointer;\n}\n\n.console-details[open] summary {\n margin-bottom: 12px;\n}\n\n.console-details .console-facts {\n margin-bottom: 12px;\n}\n\n.console-section-title {\n margin: 28px 0 10px;\n font-size: 13px;\n font-weight: 600;\n}\n\n/* Startup timeline */\n\n.console-timeline {\n display: grid;\n gap: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.console-timeline li {\n display: flex;\n align-items: center;\n gap: 10px;\n position: relative;\n min-height: 30px;\n padding-left: 22px;\n font-size: 13px;\n}\n\n.console-timeline li::before {\n content: "";\n position: absolute;\n top: 11px;\n left: 4px;\n width: 8px;\n height: 8px;\n background: var(--settings-success);\n border-radius: 50%;\n}\n\n.console-timeline li:not(:last-child)::after {\n content: "";\n position: absolute;\n top: 21px;\n bottom: -9px;\n left: 7.5px;\n width: 1px;\n background: var(--settings-divider);\n}\n\n.console-timeline li.is-stopped::before {\n background: var(--settings-danger);\n box-shadow: 0 0 0 3px var(--settings-danger-bg);\n}\n\n.console-timeline__time {\n color: var(--settings-subtle);\n font:\n 11px ui-monospace,\n "SFMono-Regular",\n Consolas,\n monospace;\n}\n\n.console-menu-button {\n display: none;\n margin-left: auto;\n}\n\n/* Empty states */\n\n.console-empty {\n display: grid;\n justify-items: center;\n gap: 10px;\n padding: 56px 24px;\n text-align: center;\n background: var(--settings-panel);\n border: 1px dashed var(--settings-border);\n border-radius: 14px;\n}\n\n.console-empty__icon {\n display: grid;\n width: 48px;\n height: 48px;\n place-items: center;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 14px;\n}\n\n.console-empty__title {\n font-size: 15px;\n font-weight: 600;\n}\n\n.console-empty__body {\n max-width: 440px;\n margin: 0 0 6px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n/* Offline Harness list */\n\n.console-harness-list {\n display: grid;\n gap: 8px;\n}\n\n.console-harness {\n display: grid;\n gap: 10px;\n padding: 14px 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.console-harness__identity {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.console-harness__icon {\n width: 28px;\n height: 28px;\n flex: none;\n object-fit: contain;\n border-radius: 8px;\n}\n\n.console-harness__icon.is-placeholder {\n background: var(--settings-surface);\n}\n\n.console-harness__name {\n font-size: 13px;\n font-weight: 600;\n}\n\n.console-harness__path {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.console-harness__path .console-input {\n flex: 1;\n}\n\n@media (max-width: 760px) {\n .console-app {\n grid-template-columns: 1fr;\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .console-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .console-sidebar .settings-nav {\n display: none;\n flex-direction: column;\n overflow-x: hidden;\n max-height: 55vh;\n overflow-y: auto;\n }\n\n .console-menu-button {\n display: inline-flex;\n }\n .console-brand {\n padding: 12px 16px;\n }\n .console-brand__copy {\n flex-direction: row;\n gap: 5px;\n align-items: baseline;\n }\n .console-sidebar .settings-nav.is-open {\n display: flex;\n }\n\n .console-sidebar .settings-nav-section-label,\n .console-status-card {\n display: none;\n }\n\n .console-hero {\n grid-template-columns: 1fr;\n }\n\n .settings-page__content,\n .console-announcement,\n .console-offline {\n width: calc(100% - 32px);\n }\n}\n';
|
|
17054
17135
|
|
|
17055
17136
|
// src/console/components.css
|
|
17056
17137
|
var components_default = `/* Shared blocks */
|
|
@@ -17089,6 +17170,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
17089
17170
|
gap: 8px;
|
|
17090
17171
|
}
|
|
17091
17172
|
|
|
17173
|
+
.console-restart {
|
|
17174
|
+
width: 100%;
|
|
17175
|
+
min-width: 0;
|
|
17176
|
+
}
|
|
17177
|
+
|
|
17178
|
+
.console-restart > p {
|
|
17179
|
+
flex-basis: 100%;
|
|
17180
|
+
margin: 0;
|
|
17181
|
+
overflow-wrap: anywhere;
|
|
17182
|
+
}
|
|
17183
|
+
|
|
17092
17184
|
.console-muted {
|
|
17093
17185
|
margin: 0;
|
|
17094
17186
|
color: var(--settings-muted);
|
|
@@ -18260,6 +18352,12 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18260
18352
|
stopped: "codexhost is not running",
|
|
18261
18353
|
stoppedDetail: "Start codexhost to use Codex Desktop with your Harnesses.",
|
|
18262
18354
|
start: "Start codexhost",
|
|
18355
|
+
restart: "Restart codexhost",
|
|
18356
|
+
restartConfirm: "Restart now",
|
|
18357
|
+
restartCancel: "Cancel",
|
|
18358
|
+
restartWarning: "Restart closes Desktop and may interrupt a voice call or running tasks. Finish or stop them before continuing. Saved chats remain available; Desktop controls which chat reopens.",
|
|
18359
|
+
restarting: "Restarting codexhost\u2026 Waiting for the new Desktop controller.",
|
|
18360
|
+
restarted: "Restart complete. The new Desktop controller is ready.",
|
|
18263
18361
|
starting: "Starting\u2026",
|
|
18264
18362
|
startingTitle: "codexhost is starting",
|
|
18265
18363
|
startingDetail: "Preparing Codex Desktop. Please wait; there is no need to start it again.",
|
|
@@ -18312,6 +18410,13 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18312
18410
|
save: "Save",
|
|
18313
18411
|
useAutomatic: "Use automatic",
|
|
18314
18412
|
saved: "Saved",
|
|
18413
|
+
grokComputerUse: "Grok Computer Use",
|
|
18414
|
+
grokComputerUseHelp: "Lets Grok control Mac apps through ChatGPT\u2019s Computer Use helper. ChatGPT Settings \u2192 Computer use still applies only to official Codex. New Grok threads pick up this switch.",
|
|
18415
|
+
grokComputerUseUnavailable: "ChatGPT Desktop Computer Use files were not found.",
|
|
18416
|
+
grokBrowser: "Grok in-app browser",
|
|
18417
|
+
grokBrowserHelp: "Lets Grok use ChatGPT\u2019s built-in browser (Browser Use) through cua_repl. Independent of Computer Use; official Codex Browser Use is unchanged. Grok fails closed when the in-app tab cannot be bound.",
|
|
18418
|
+
grokBrowserUnavailable: "ChatGPT Desktop in-app browser files were not found.",
|
|
18419
|
+
grokBrowserBlocked: "Saved as intent. ChatGPT Desktop does not authorize Grok to use the in-app browser.",
|
|
18315
18420
|
installGuide: "Install guide",
|
|
18316
18421
|
noHarness: "No Harness plugins are installed.",
|
|
18317
18422
|
consoleOffline: "The console is not running",
|
|
@@ -18443,6 +18548,12 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18443
18548
|
stopped: "codexhost \u672A\u8FD0\u884C",
|
|
18444
18549
|
stoppedDetail: "\u542F\u52A8 codexhost \u540E\u5373\u53EF\u5728 Codex Desktop \u4E2D\u4F7F\u7528\u5404\u4E2A Harness\u3002",
|
|
18445
18550
|
start: "\u542F\u52A8 codexhost",
|
|
18551
|
+
restart: "\u91CD\u65B0\u542F\u52A8 codexhost",
|
|
18552
|
+
restartConfirm: "\u7ACB\u5373\u91CD\u65B0\u542F\u52A8",
|
|
18553
|
+
restartCancel: "\u53D6\u6D88",
|
|
18554
|
+
restartWarning: "\u91CD\u65B0\u542F\u52A8\u4F1A\u5173\u95ED Desktop\uFF0C\u53EF\u80FD\u4E2D\u65AD\u8BED\u97F3\u901A\u8BDD\u6216\u8FD0\u884C\u4E2D\u7684\u4EFB\u52A1\u3002\u8BF7\u5148\u5B8C\u6210\u6216\u505C\u6B62\u5B83\u4EEC\u3002\u5DF2\u4FDD\u5B58\u804A\u5929\u4ECD\u53EF\u4F7F\u7528\uFF1B\u91CD\u65B0\u6253\u5F00\u54EA\u4E2A\u804A\u5929\u7531 Desktop \u51B3\u5B9A\u3002",
|
|
18555
|
+
restarting: "\u6B63\u5728\u91CD\u65B0\u542F\u52A8 codexhost\u2026 \u7B49\u5F85\u65B0\u7684 Desktop \u63A7\u5236\u5668\u3002",
|
|
18556
|
+
restarted: "\u91CD\u65B0\u542F\u52A8\u5B8C\u6210\u3002\u65B0\u7684 Desktop \u63A7\u5236\u5668\u5DF2\u5C31\u7EEA\u3002",
|
|
18446
18557
|
starting: "\u6B63\u5728\u542F\u52A8\u2026",
|
|
18447
18558
|
startingTitle: "codexhost \u6B63\u5728\u542F\u52A8",
|
|
18448
18559
|
startingDetail: "\u6B63\u5728\u51C6\u5907 Codex Desktop\uFF0C\u8BF7\u7A0D\u5019\uFF0C\u65E0\u9700\u91CD\u590D\u542F\u52A8\u3002",
|
|
@@ -18495,6 +18606,13 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18495
18606
|
save: "\u4FDD\u5B58",
|
|
18496
18607
|
useAutomatic: "\u6062\u590D\u81EA\u52A8\u67E5\u627E",
|
|
18497
18608
|
saved: "\u5DF2\u4FDD\u5B58",
|
|
18609
|
+
grokComputerUse: "Grok Computer Use",
|
|
18610
|
+
grokComputerUseHelp: "\u8BA9 Grok \u901A\u8FC7 ChatGPT \u7684 Computer Use \u52A9\u624B\u63A7\u5236 Mac \u5E94\u7528\u3002ChatGPT \u8BBE\u7F6E \u2192 Computer use \u4ECD\u53EA\u4F5C\u7528\u4E8E\u5B98\u65B9 Codex\u3002\u65B0\u7684 Grok \u7EBF\u7A0B\u4F1A\u8BFB\u53D6\u6B64\u5F00\u5173\u3002",
|
|
18611
|
+
grokComputerUseUnavailable: "\u672A\u627E\u5230 ChatGPT Desktop \u7684 Computer Use \u6587\u4EF6\u3002",
|
|
18612
|
+
grokBrowser: "Grok \u5185\u7F6E\u6D4F\u89C8\u5668",
|
|
18613
|
+
grokBrowserHelp: "\u8BA9 Grok \u901A\u8FC7 cua_repl \u4F7F\u7528 ChatGPT \u5185\u7F6E\u6D4F\u89C8\u5668\uFF08Browser Use\uFF09\u3002\u4E0E Computer Use \u76F8\u4E92\u72EC\u7ACB\uFF0C\u5B98\u65B9 Codex Browser Use \u4E0D\u53D7\u5F71\u54CD\u3002\u65E0\u6CD5\u7ED1\u5B9A\u5185\u7F6E\u6807\u7B7E\u9875\u65F6 Grok \u4F1A\u76F4\u63A5\u5931\u8D25\u3002",
|
|
18614
|
+
grokBrowserUnavailable: "\u672A\u627E\u5230 ChatGPT Desktop \u7684\u5185\u7F6E\u6D4F\u89C8\u5668\u6587\u4EF6\u3002",
|
|
18615
|
+
grokBrowserBlocked: "\u5DF2\u4FDD\u5B58\u4E3A\u610F\u5411\u3002ChatGPT Desktop \u5C1A\u672A\u6388\u6743 Grok \u4F7F\u7528\u5185\u7F6E\u6D4F\u89C8\u5668\u3002",
|
|
18498
18616
|
installGuide: "\u5B89\u88C5\u8BF4\u660E",
|
|
18499
18617
|
noHarness: "\u6CA1\u6709\u5DF2\u5B89\u88C5\u7684 Harness \u63D2\u4EF6\u3002",
|
|
18500
18618
|
consoleOffline: "\u63A7\u5236\u53F0\u672A\u8FD0\u884C",
|
|
@@ -18626,6 +18744,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18626
18744
|
const document2 = context.content.ownerDocument;
|
|
18627
18745
|
const list = h(document2, "div", { className: "console-harness-list" });
|
|
18628
18746
|
const status = /* @__PURE__ */ new Map();
|
|
18747
|
+
const busy = /* @__PURE__ */ new Set();
|
|
18629
18748
|
let harnesses = [];
|
|
18630
18749
|
const render = () => {
|
|
18631
18750
|
if (harnesses.length === 0) {
|
|
@@ -18702,6 +18821,75 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18702
18821
|
);
|
|
18703
18822
|
}
|
|
18704
18823
|
}
|
|
18824
|
+
if (harness2.computerUse) {
|
|
18825
|
+
const computerUse = harness2.computerUse;
|
|
18826
|
+
const pending = busy.has(harness2.id);
|
|
18827
|
+
const post = (update) => {
|
|
18828
|
+
busy.add(harness2.id);
|
|
18829
|
+
toggle.disabled = true;
|
|
18830
|
+
browserToggle.disabled = true;
|
|
18831
|
+
void consolePost(
|
|
18832
|
+
"/api/harnesses/grok-computer-use",
|
|
18833
|
+
update
|
|
18834
|
+
).then(({ harness: saved }) => {
|
|
18835
|
+
harnesses = harnesses.map((entry) => entry.id === saved.id ? saved : entry);
|
|
18836
|
+
status.set(harness2.id, messages.saved);
|
|
18837
|
+
}).catch(
|
|
18838
|
+
(error51) => status.set(harness2.id, error51 instanceof Error ? error51.message : String(error51))
|
|
18839
|
+
).finally(() => {
|
|
18840
|
+
busy.delete(harness2.id);
|
|
18841
|
+
render();
|
|
18842
|
+
});
|
|
18843
|
+
};
|
|
18844
|
+
const toggle = h(document2, "input", {
|
|
18845
|
+
type: "checkbox",
|
|
18846
|
+
"aria-label": messages.grokComputerUse
|
|
18847
|
+
});
|
|
18848
|
+
toggle.checked = computerUse.enabled;
|
|
18849
|
+
toggle.disabled = pending || !computerUse.available && !computerUse.enabled;
|
|
18850
|
+
toggle.addEventListener("change", () => post({ enabled: toggle.checked }));
|
|
18851
|
+
const browserToggle = h(document2, "input", {
|
|
18852
|
+
type: "checkbox",
|
|
18853
|
+
"aria-label": messages.grokBrowser
|
|
18854
|
+
});
|
|
18855
|
+
browserToggle.checked = computerUse.browser === true;
|
|
18856
|
+
browserToggle.disabled = pending || computerUse.browserFilesPresent !== true && computerUse.browser !== true;
|
|
18857
|
+
browserToggle.addEventListener(
|
|
18858
|
+
"change",
|
|
18859
|
+
() => post({ browser: browserToggle.checked })
|
|
18860
|
+
);
|
|
18861
|
+
row.append(
|
|
18862
|
+
h(
|
|
18863
|
+
document2,
|
|
18864
|
+
"div",
|
|
18865
|
+
{ className: "console-harness__path" },
|
|
18866
|
+
h(document2, "label", {}, toggle, ` ${messages.grokComputerUse}`)
|
|
18867
|
+
),
|
|
18868
|
+
h(
|
|
18869
|
+
document2,
|
|
18870
|
+
"div",
|
|
18871
|
+
{ className: "console-muted" },
|
|
18872
|
+
harness2.computerUse.available ? messages.grokComputerUseHelp : computerUse.unavailableReason ?? messages.grokComputerUseUnavailable
|
|
18873
|
+
),
|
|
18874
|
+
h(
|
|
18875
|
+
document2,
|
|
18876
|
+
"div",
|
|
18877
|
+
{ className: "console-harness__path" },
|
|
18878
|
+
h(document2, "label", {}, browserToggle, ` ${messages.grokBrowser}`)
|
|
18879
|
+
),
|
|
18880
|
+
h(
|
|
18881
|
+
document2,
|
|
18882
|
+
"div",
|
|
18883
|
+
{ className: "console-muted" },
|
|
18884
|
+
computerUse.browserAvailable === true ? messages.grokBrowserHelp : computerUse.browserFilesPresent === true ? computerUse.browserUnavailableReason ?? messages.grokBrowserBlocked : computerUse.browserUnavailableReason ?? messages.grokBrowserUnavailable
|
|
18885
|
+
)
|
|
18886
|
+
);
|
|
18887
|
+
if (status.has(harness2.id)) {
|
|
18888
|
+
row.append(
|
|
18889
|
+
h(document2, "div", { className: "console-muted" }, status.get(harness2.id) ?? "")
|
|
18890
|
+
);
|
|
18891
|
+
}
|
|
18892
|
+
}
|
|
18705
18893
|
if (guide) {
|
|
18706
18894
|
identity.append(
|
|
18707
18895
|
h(
|
|
@@ -18846,6 +19034,599 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18846
19034
|
});
|
|
18847
19035
|
}
|
|
18848
19036
|
|
|
19037
|
+
// src/renderer-cpa-live-voice-preference.ts
|
|
19038
|
+
var voiceStateOwner = globalThis;
|
|
19039
|
+
var { sharedRoutes, gatewayReady } = voiceStateOwner.__codexhostVoicePreferenceStateV1 ??= {
|
|
19040
|
+
sharedRoutes: /* @__PURE__ */ new WeakMap(),
|
|
19041
|
+
gatewayReady: /* @__PURE__ */ new WeakMap()
|
|
19042
|
+
};
|
|
19043
|
+
|
|
19044
|
+
// src/voice-settings-sync.ts
|
|
19045
|
+
function desktopVoiceCallActive(owner) {
|
|
19046
|
+
const hook = Reflect.get(owner, "__codexhostNativeChatVoiceV1");
|
|
19047
|
+
if (hook?.activeCall) return true;
|
|
19048
|
+
return [
|
|
19049
|
+
...owner.document.querySelectorAll(
|
|
19050
|
+
'button[aria-label="End Voice"],button[aria-label="End voice"],button[aria-label="End voice chat"]'
|
|
19051
|
+
)
|
|
19052
|
+
].some((button2) => button2.getBoundingClientRect().width > 0);
|
|
19053
|
+
}
|
|
19054
|
+
|
|
19055
|
+
// src/settings/preference-ui.ts
|
|
19056
|
+
var nextPreferenceId = 0;
|
|
19057
|
+
function preferenceId(prefix) {
|
|
19058
|
+
nextPreferenceId += 1;
|
|
19059
|
+
return `codexhost-${prefix}-${nextPreferenceId}`;
|
|
19060
|
+
}
|
|
19061
|
+
function createPreferenceGroup(document2, title) {
|
|
19062
|
+
const group = document2.createElement("section");
|
|
19063
|
+
group.className = "mt-7 first-of-type:mt-0";
|
|
19064
|
+
const header = document2.createElement("div");
|
|
19065
|
+
header.className = "mb-2 flex min-h-6 items-center gap-2 px-1";
|
|
19066
|
+
const heading = document2.createElement("h3");
|
|
19067
|
+
heading.id = preferenceId("preference-group");
|
|
19068
|
+
heading.className = "m-0 text-[13px] leading-5 font-semibold text-settings-text";
|
|
19069
|
+
heading.textContent = title;
|
|
19070
|
+
header.append(heading);
|
|
19071
|
+
const card = document2.createElement("div");
|
|
19072
|
+
card.className = "rounded-[10px] border border-settings-border bg-settings-panel";
|
|
19073
|
+
group.setAttribute("aria-labelledby", heading.id);
|
|
19074
|
+
group.append(header, card);
|
|
19075
|
+
return { group, header, card };
|
|
19076
|
+
}
|
|
19077
|
+
function createPreferenceItem(document2, input) {
|
|
19078
|
+
const item = document2.createElement("div");
|
|
19079
|
+
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";
|
|
19080
|
+
const copy = document2.createElement("div");
|
|
19081
|
+
copy.className = "flex min-w-0 flex-col gap-0.5";
|
|
19082
|
+
const heading = document2.createElement("div");
|
|
19083
|
+
heading.className = "flex items-center gap-1.5";
|
|
19084
|
+
const title = document2.createElement("label");
|
|
19085
|
+
title.htmlFor = input.controlId;
|
|
19086
|
+
title.className = "cursor-pointer text-[13px] leading-5 font-medium text-settings-text";
|
|
19087
|
+
title.textContent = input.title;
|
|
19088
|
+
heading.append(title);
|
|
19089
|
+
if (input.help) heading.append(createHelpTooltip(document2, input.help.label, input.help.lines));
|
|
19090
|
+
const description = document2.createElement("div");
|
|
19091
|
+
description.id = preferenceId("preference-description");
|
|
19092
|
+
description.className = "text-xs leading-[18px] text-settings-muted data-[invalid=true]:text-settings-danger";
|
|
19093
|
+
description.textContent = input.description;
|
|
19094
|
+
copy.append(heading, description);
|
|
19095
|
+
item.append(copy);
|
|
19096
|
+
return { item, description };
|
|
19097
|
+
}
|
|
19098
|
+
function createHelpTooltip(document2, label, lines) {
|
|
19099
|
+
const wrapper = document2.createElement("span");
|
|
19100
|
+
wrapper.className = "group relative inline-flex";
|
|
19101
|
+
const button2 = document2.createElement("button");
|
|
19102
|
+
button2.type = "button";
|
|
19103
|
+
button2.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";
|
|
19104
|
+
button2.setAttribute("aria-label", label);
|
|
19105
|
+
button2.append(createRendererSettingsIcon("help", 14));
|
|
19106
|
+
const tooltip = document2.createElement("div");
|
|
19107
|
+
tooltip.id = preferenceId("preference-tooltip");
|
|
19108
|
+
tooltip.setAttribute("role", "tooltip");
|
|
19109
|
+
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";
|
|
19110
|
+
const list = document2.createElement("ul");
|
|
19111
|
+
list.className = "m-0 grid list-disc gap-1 pl-4 marker:text-settings-subtle";
|
|
19112
|
+
for (const line of lines) {
|
|
19113
|
+
const item = document2.createElement("li");
|
|
19114
|
+
item.textContent = line;
|
|
19115
|
+
list.append(item);
|
|
19116
|
+
}
|
|
19117
|
+
tooltip.append(list);
|
|
19118
|
+
button2.setAttribute("aria-describedby", tooltip.id);
|
|
19119
|
+
button2.addEventListener("keydown", (event) => {
|
|
19120
|
+
if (event.key === "Escape") button2.blur();
|
|
19121
|
+
});
|
|
19122
|
+
wrapper.append(button2, tooltip);
|
|
19123
|
+
return wrapper;
|
|
19124
|
+
}
|
|
19125
|
+
function createPreferenceSwitch(document2, id, describedBy) {
|
|
19126
|
+
const input = document2.createElement("input");
|
|
19127
|
+
input.type = "checkbox";
|
|
19128
|
+
input.id = id;
|
|
19129
|
+
input.setAttribute("role", "switch");
|
|
19130
|
+
input.setAttribute("aria-describedby", describedBy);
|
|
19131
|
+
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";
|
|
19132
|
+
return input;
|
|
19133
|
+
}
|
|
19134
|
+
function createNumberField(document2, input) {
|
|
19135
|
+
const field = document2.createElement("div");
|
|
19136
|
+
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";
|
|
19137
|
+
const control = document2.createElement("input");
|
|
19138
|
+
control.type = "number";
|
|
19139
|
+
control.id = input.id;
|
|
19140
|
+
control.min = String(input.min);
|
|
19141
|
+
control.max = String(input.max);
|
|
19142
|
+
control.step = "1";
|
|
19143
|
+
control.setAttribute("aria-describedby", input.describedBy);
|
|
19144
|
+
control.className = "w-14 border-0 bg-transparent p-0 text-right text-[13px] leading-5 text-settings-text tabular-nums outline-none";
|
|
19145
|
+
const unit = document2.createElement("span");
|
|
19146
|
+
unit.className = "text-xs text-settings-muted";
|
|
19147
|
+
unit.setAttribute("aria-hidden", "true");
|
|
19148
|
+
unit.textContent = input.unit;
|
|
19149
|
+
field.append(control, unit);
|
|
19150
|
+
return { field, control };
|
|
19151
|
+
}
|
|
19152
|
+
|
|
19153
|
+
// src/settings/voice-messages.ts
|
|
19154
|
+
function voiceMessages(locale) {
|
|
19155
|
+
const en = {
|
|
19156
|
+
title: "Voice",
|
|
19157
|
+
description: "Choose voice for Chat and Work. Shared on this Mac.",
|
|
19158
|
+
chat: "Chat",
|
|
19159
|
+
experience: "Voice experience",
|
|
19160
|
+
chatHint: "ChatGPT stays in your current Chat conversation.",
|
|
19161
|
+
codexConnection: "Codex connection",
|
|
19162
|
+
codexHint: "Available when Codex voice is selected.",
|
|
19163
|
+
work: "Work",
|
|
19164
|
+
connection: "Voice connection",
|
|
19165
|
+
workHint: "Desktop default applies to Codex Work. External Harness voice uses the configured gateway.",
|
|
19166
|
+
desktop: "Desktop default",
|
|
19167
|
+
gateway: "Configured gateway",
|
|
19168
|
+
configuration: "Configuration",
|
|
19169
|
+
gatewayTitle: "Gateway",
|
|
19170
|
+
gatewayHint: "Used only when Configured gateway is selected.",
|
|
19171
|
+
configured: "Configured",
|
|
19172
|
+
needsSetup: "Needs setup",
|
|
19173
|
+
unknown: "Not checked",
|
|
19174
|
+
gatewayStatus: "Gateway configuration",
|
|
19175
|
+
preferencesStatus: "Preferences applied",
|
|
19176
|
+
hookStatus: "Desktop gateway voice integration",
|
|
19177
|
+
preferencesOn: "Applied",
|
|
19178
|
+
preferencesOff: "Not applied yet",
|
|
19179
|
+
hookSupported: "Supported",
|
|
19180
|
+
hookUnsupported: "This Desktop build is not supported for gateway voice",
|
|
19181
|
+
hookPending: "Attaching\u2026",
|
|
19182
|
+
hookDisabled: "Off",
|
|
19183
|
+
configure: "Configure",
|
|
19184
|
+
setup: "Gateway setup",
|
|
19185
|
+
setupHint: "Gateway settings use your local Codex configuration and the selected provider\u2019s credential. End voice before editing configuration. Never paste credentials here.",
|
|
19186
|
+
advanced: "Advanced",
|
|
19187
|
+
advancedHint: "Voice integration and diagnostics.",
|
|
19188
|
+
inject: "Enable voice integration",
|
|
19189
|
+
injectHint: "Enables the ChatGPT voice control and gateway routing. Changing this requires restarting codexhost.",
|
|
19190
|
+
environment: "Voice integration is controlled by this launch environment.",
|
|
19191
|
+
loading: "Loading voice settings\u2026",
|
|
19192
|
+
unavailable: "Voice settings are unavailable. Check the local Host connection.",
|
|
19193
|
+
retry: "Reload",
|
|
19194
|
+
cancel: "Cancel",
|
|
19195
|
+
apply: "Apply changes",
|
|
19196
|
+
applyRestart: "Apply and restart codexhost",
|
|
19197
|
+
retryRestart: "Retry restart",
|
|
19198
|
+
saving: "Saving settings\u2026",
|
|
19199
|
+
restarting: "Restarting codexhost\u2026",
|
|
19200
|
+
ready: "No pending changes",
|
|
19201
|
+
edited: "Unsaved changes",
|
|
19202
|
+
nextCall: "Voice choices apply to the next call.",
|
|
19203
|
+
pending: "Saved \u2014 waiting for Desktop to apply voice choices.",
|
|
19204
|
+
restartNeeded: "Saved \u2014 restart required",
|
|
19205
|
+
activeUnknown: "Saved \u2014 active setting is unknown.",
|
|
19206
|
+
activeCall: "End your voice call to apply changes.",
|
|
19207
|
+
integrationOff: "Voice integration is off. Enable it in Advanced to use these choices.",
|
|
19208
|
+
restartWarning: "Restart codexhost to apply voice integration? This may interrupt running tasks. End voice before continuing.",
|
|
19209
|
+
confirm: "Apply and restart",
|
|
19210
|
+
restartFailed: "Settings are saved, but restart failed.",
|
|
19211
|
+
conflict: "Settings changed in another window. Reload before applying.",
|
|
19212
|
+
gatewayWarning: "The selected gateway needs setup before voice can connect."
|
|
19213
|
+
};
|
|
19214
|
+
if (locale !== "zh-CN") return en;
|
|
19215
|
+
return {
|
|
19216
|
+
...en,
|
|
19217
|
+
title: "\u8BED\u97F3",
|
|
19218
|
+
description: "\u9009\u62E9 Chat \u548C Work \u7684\u8BED\u97F3\u65B9\u5F0F\u3002\u5728\u6B64 Mac \u4E0A\u5171\u4EAB\u3002",
|
|
19219
|
+
experience: "\u8BED\u97F3\u4F53\u9A8C",
|
|
19220
|
+
chatHint: "ChatGPT \u8BED\u97F3\u4FDD\u7559\u5728\u5F53\u524D Chat \u5BF9\u8BDD\u4E2D\u3002",
|
|
19221
|
+
codexConnection: "Codex \u8FDE\u63A5",
|
|
19222
|
+
codexHint: "\u9009\u62E9 Codex \u8BED\u97F3\u540E\u53EF\u7528\u3002",
|
|
19223
|
+
connection: "\u8BED\u97F3\u8FDE\u63A5",
|
|
19224
|
+
workHint: "Desktop \u9ED8\u8BA4\u9002\u7528\u4E8E Codex Work\u3002\u5916\u90E8 Harness \u8BED\u97F3\u4F7F\u7528\u5DF2\u914D\u7F6E\u7684\u7F51\u5173\u3002",
|
|
19225
|
+
desktop: "Desktop \u9ED8\u8BA4",
|
|
19226
|
+
gateway: "\u5DF2\u914D\u7F6E\u7684\u7F51\u5173",
|
|
19227
|
+
configuration: "\u914D\u7F6E",
|
|
19228
|
+
gatewayTitle: "\u7F51\u5173",
|
|
19229
|
+
gatewayHint: "\u4EC5\u5728\u9009\u62E9\u5DF2\u914D\u7F6E\u7684\u7F51\u5173\u65F6\u4F7F\u7528\u3002",
|
|
19230
|
+
configured: "\u5DF2\u914D\u7F6E",
|
|
19231
|
+
needsSetup: "\u9700\u8981\u914D\u7F6E",
|
|
19232
|
+
unknown: "\u672A\u68C0\u67E5",
|
|
19233
|
+
gatewayStatus: "\u7F51\u5173\u914D\u7F6E",
|
|
19234
|
+
preferencesStatus: "\u504F\u597D\u662F\u5426\u5DF2\u5E94\u7528",
|
|
19235
|
+
hookStatus: "Desktop \u7F51\u5173\u8BED\u97F3\u96C6\u6210",
|
|
19236
|
+
preferencesOn: "\u5DF2\u5E94\u7528",
|
|
19237
|
+
preferencesOff: "\u5C1A\u672A\u5E94\u7528",
|
|
19238
|
+
hookSupported: "\u652F\u6301",
|
|
19239
|
+
hookUnsupported: "\u5F53\u524D Desktop \u7248\u672C\u4E0D\u652F\u6301\u7F51\u5173\u8BED\u97F3",
|
|
19240
|
+
hookPending: "\u6B63\u5728\u63A5\u5165\u2026",
|
|
19241
|
+
hookDisabled: "\u5DF2\u5173\u95ED",
|
|
19242
|
+
configure: "\u914D\u7F6E",
|
|
19243
|
+
setup: "\u7F51\u5173\u914D\u7F6E",
|
|
19244
|
+
setupHint: "\u7F51\u5173\u4F7F\u7528\u672C\u5730 Codex \u914D\u7F6E\u53CA\u6240\u9009 Provider \u7684\u51ED\u636E\u3002\u7F16\u8F91\u524D\u8BF7\u7ED3\u675F\u8BED\u97F3\u3002\u8BF7\u52FF\u5728\u6B64\u7C98\u8D34\u51ED\u636E\u3002",
|
|
19245
|
+
advanced: "\u9AD8\u7EA7",
|
|
19246
|
+
advancedHint: "\u8BED\u97F3\u96C6\u6210\u4E0E\u8BCA\u65AD\u3002",
|
|
19247
|
+
inject: "\u542F\u7528\u8BED\u97F3\u96C6\u6210",
|
|
19248
|
+
injectHint: "\u542F\u7528 ChatGPT \u8BED\u97F3\u6309\u94AE\u4E0E\u7F51\u5173\u8DEF\u7531\u3002\u66F4\u6539\u6B64\u9879\u9700\u8981\u91CD\u542F codexhost\u3002",
|
|
19249
|
+
environment: "\u5F53\u524D\u542F\u52A8\u73AF\u5883\u63A7\u5236\u8BED\u97F3\u96C6\u6210\u3002",
|
|
19250
|
+
loading: "\u6B63\u5728\u52A0\u8F7D\u8BED\u97F3\u8BBE\u7F6E\u2026",
|
|
19251
|
+
unavailable: "\u8BED\u97F3\u8BBE\u7F6E\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u672C\u5730 Host \u8FDE\u63A5\u3002",
|
|
19252
|
+
retry: "\u91CD\u65B0\u52A0\u8F7D",
|
|
19253
|
+
cancel: "\u53D6\u6D88",
|
|
19254
|
+
apply: "\u5E94\u7528\u66F4\u6539",
|
|
19255
|
+
applyRestart: "\u5E94\u7528\u5E76\u91CD\u542F codexhost",
|
|
19256
|
+
retryRestart: "\u91CD\u8BD5\u91CD\u542F",
|
|
19257
|
+
saving: "\u6B63\u5728\u4FDD\u5B58\u8BBE\u7F6E\u2026",
|
|
19258
|
+
restarting: "\u6B63\u5728\u91CD\u542F codexhost\u2026",
|
|
19259
|
+
ready: "\u6CA1\u6709\u5F85\u5E94\u7528\u7684\u66F4\u6539",
|
|
19260
|
+
edited: "\u66F4\u6539\u5C1A\u672A\u4FDD\u5B58",
|
|
19261
|
+
nextCall: "\u8BED\u97F3\u9009\u62E9\u4ECE\u4E0B\u6B21\u901A\u8BDD\u751F\u6548\u3002",
|
|
19262
|
+
pending: "\u5DF2\u4FDD\u5B58\uFF0C\u7B49\u5F85 Desktop \u5E94\u7528\u8BED\u97F3\u9009\u62E9\u3002",
|
|
19263
|
+
restartNeeded: "\u5DF2\u4FDD\u5B58\uFF0C\u9700\u8981\u91CD\u542F",
|
|
19264
|
+
activeUnknown: "\u5DF2\u4FDD\u5B58\uFF0C\u5F53\u524D\u751F\u6548\u72B6\u6001\u672A\u77E5\u3002",
|
|
19265
|
+
activeCall: "\u8BF7\u7ED3\u675F\u8BED\u97F3\u540E\u518D\u5E94\u7528\u66F4\u6539\u3002",
|
|
19266
|
+
integrationOff: "\u8BED\u97F3\u96C6\u6210\u5DF2\u5173\u95ED\uFF0C\u8BF7\u5728\u9AD8\u7EA7\u8BBE\u7F6E\u4E2D\u542F\u7528\u540E\u4F7F\u7528\u8FD9\u4E9B\u9009\u9879\u3002",
|
|
19267
|
+
restartWarning: "\u91CD\u542F codexhost \u4EE5\u5E94\u7528\u8BED\u97F3\u96C6\u6210\uFF1F\u8FD9\u53EF\u80FD\u4E2D\u65AD\u8FD0\u884C\u4E2D\u7684\u4EFB\u52A1\uFF0C\u8BF7\u5148\u7ED3\u675F\u8BED\u97F3\u3002",
|
|
19268
|
+
confirm: "\u5E94\u7528\u5E76\u91CD\u542F",
|
|
19269
|
+
restartFailed: "\u8BBE\u7F6E\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u91CD\u542F\u5931\u8D25\u3002",
|
|
19270
|
+
conflict: "\u5176\u4ED6\u7A97\u53E3\u66F4\u6539\u4E86\u8BBE\u7F6E\uFF0C\u8BF7\u91CD\u65B0\u52A0\u8F7D\u540E\u518D\u5E94\u7528\u3002",
|
|
19271
|
+
gatewayWarning: "\u6240\u9009\u7F51\u5173\u9700\u8981\u914D\u7F6E\u540E\u624D\u80FD\u8FDE\u63A5\u8BED\u97F3\u3002"
|
|
19272
|
+
};
|
|
19273
|
+
}
|
|
19274
|
+
|
|
19275
|
+
// src/settings/voice-page.ts
|
|
19276
|
+
function createVoiceSettingsPage(locale, request, options = {}) {
|
|
19277
|
+
const m = voiceMessages(locale);
|
|
19278
|
+
return Object.freeze({
|
|
19279
|
+
id: options.id ?? "voice",
|
|
19280
|
+
label: m.title,
|
|
19281
|
+
icon: "settings",
|
|
19282
|
+
mount(context) {
|
|
19283
|
+
const doc = context.content.ownerDocument;
|
|
19284
|
+
let state = null;
|
|
19285
|
+
let base = null;
|
|
19286
|
+
let draft = null;
|
|
19287
|
+
let offline = false;
|
|
19288
|
+
let busy = false;
|
|
19289
|
+
let refreshing = false;
|
|
19290
|
+
let generation = 0;
|
|
19291
|
+
let disposed = false;
|
|
19292
|
+
let confirm = false;
|
|
19293
|
+
let advanced = false;
|
|
19294
|
+
let setup = false;
|
|
19295
|
+
let error51 = null;
|
|
19296
|
+
const ids = /* @__PURE__ */ new Map();
|
|
19297
|
+
const controlId = (key) => {
|
|
19298
|
+
const existing = ids.get(key);
|
|
19299
|
+
if (existing) return existing;
|
|
19300
|
+
const id = preferenceId(key);
|
|
19301
|
+
ids.set(key, id);
|
|
19302
|
+
return id;
|
|
19303
|
+
};
|
|
19304
|
+
const dirty = () => !!draft && JSON.stringify(draft) !== JSON.stringify(base?.settings);
|
|
19305
|
+
const isActiveCall = () => state?.activeCall === true || options.desktop && !!doc.defaultView && desktopVoiceCallActive(doc.defaultView);
|
|
19306
|
+
const needsRestart = () => !!draft && !!state && (state.activeInject === null ? draft.inject !== base?.settings.inject : (state.envOverride ? state.envOverride === "1" : draft.inject) !== state.activeInject);
|
|
19307
|
+
const load = async (reset = false) => {
|
|
19308
|
+
if (refreshing || busy || disposed) return;
|
|
19309
|
+
refreshing = true;
|
|
19310
|
+
const currentGeneration = generation;
|
|
19311
|
+
try {
|
|
19312
|
+
const next = voiceSettingsStateSchema.parse(await request({ operation: "get" }));
|
|
19313
|
+
if (disposed || generation !== currentGeneration) return;
|
|
19314
|
+
const changed = JSON.stringify(state) !== JSON.stringify(next) || offline || reset;
|
|
19315
|
+
if (reset || !dirty()) {
|
|
19316
|
+
base = next;
|
|
19317
|
+
draft = { ...next.settings };
|
|
19318
|
+
}
|
|
19319
|
+
state = next;
|
|
19320
|
+
offline = false;
|
|
19321
|
+
if (reset) {
|
|
19322
|
+
error51 = null;
|
|
19323
|
+
confirm = false;
|
|
19324
|
+
}
|
|
19325
|
+
if (changed) render();
|
|
19326
|
+
} catch {
|
|
19327
|
+
if (!disposed && generation === currentGeneration) {
|
|
19328
|
+
offline = true;
|
|
19329
|
+
render();
|
|
19330
|
+
}
|
|
19331
|
+
} finally {
|
|
19332
|
+
refreshing = false;
|
|
19333
|
+
}
|
|
19334
|
+
};
|
|
19335
|
+
const apply = async (restart) => {
|
|
19336
|
+
if (!draft || !base || busy || isActiveCall()) return;
|
|
19337
|
+
busy = true;
|
|
19338
|
+
generation += 1;
|
|
19339
|
+
error51 = null;
|
|
19340
|
+
confirm = false;
|
|
19341
|
+
render();
|
|
19342
|
+
try {
|
|
19343
|
+
const current = voiceSettingsStateSchema.parse(await request({ operation: "get" }));
|
|
19344
|
+
if (disposed) return;
|
|
19345
|
+
if (current.activeCall || isActiveCall()) throw new Error(m.activeCall);
|
|
19346
|
+
if (current.revision !== base.revision) throw new Error(m.conflict);
|
|
19347
|
+
if (dirty()) {
|
|
19348
|
+
const saved = voiceSettingsStateSchema.parse(
|
|
19349
|
+
await request({
|
|
19350
|
+
operation: "set",
|
|
19351
|
+
settings: draft,
|
|
19352
|
+
revision: base.revision
|
|
19353
|
+
})
|
|
19354
|
+
);
|
|
19355
|
+
if (disposed) return;
|
|
19356
|
+
state = saved;
|
|
19357
|
+
base = saved;
|
|
19358
|
+
draft = { ...saved.settings };
|
|
19359
|
+
}
|
|
19360
|
+
if (restart) await request({ operation: "restart", confirm: true });
|
|
19361
|
+
} catch (failure) {
|
|
19362
|
+
if (!disposed) error51 = failure instanceof Error ? failure.message : m.unavailable;
|
|
19363
|
+
} finally {
|
|
19364
|
+
busy = false;
|
|
19365
|
+
if (!disposed) {
|
|
19366
|
+
render();
|
|
19367
|
+
void load();
|
|
19368
|
+
}
|
|
19369
|
+
}
|
|
19370
|
+
};
|
|
19371
|
+
const render = () => {
|
|
19372
|
+
if (disposed) return;
|
|
19373
|
+
const tree = context.content.getRootNode();
|
|
19374
|
+
const focused = tree.activeElement;
|
|
19375
|
+
const focusedId = focused && context.content.contains(focused) ? focused.id : "";
|
|
19376
|
+
const root = h(doc, "div", { className: "settings-voice" });
|
|
19377
|
+
root.append(
|
|
19378
|
+
h(doc, "div", { className: "settings-section-label" }, m.title),
|
|
19379
|
+
h(doc, "p", { className: "settings-page-description" }, m.description)
|
|
19380
|
+
);
|
|
19381
|
+
if (!draft || !state) {
|
|
19382
|
+
root.append(h(doc, "p", { role: "status" }, offline ? m.unavailable : m.loading));
|
|
19383
|
+
if (offline) root.append(button(doc, m.retry, () => void load(true)));
|
|
19384
|
+
context.content.replaceChildren(root);
|
|
19385
|
+
return;
|
|
19386
|
+
}
|
|
19387
|
+
const unavailable = busy || offline || state.restart.phase === "restarting";
|
|
19388
|
+
const row = (card, title, description, key, choices, disabled = false) => {
|
|
19389
|
+
const id = controlId(`voice-${key}`);
|
|
19390
|
+
const item = createPreferenceItem(doc, { title, description, controlId: id });
|
|
19391
|
+
item.item.classList.add("settings-voice__row");
|
|
19392
|
+
const select = h(doc, "select", {
|
|
19393
|
+
id,
|
|
19394
|
+
className: "settings-voice__select",
|
|
19395
|
+
"aria-describedby": item.description.id
|
|
19396
|
+
});
|
|
19397
|
+
for (const [value, label] of choices) select.append(h(doc, "option", { value }, label));
|
|
19398
|
+
select.value = draft?.[key] ?? "";
|
|
19399
|
+
select.disabled = unavailable || disabled;
|
|
19400
|
+
select.addEventListener("change", () => {
|
|
19401
|
+
if (!draft) return;
|
|
19402
|
+
draft = { ...draft, [key]: select.value };
|
|
19403
|
+
confirm = false;
|
|
19404
|
+
render();
|
|
19405
|
+
});
|
|
19406
|
+
item.item.append(select);
|
|
19407
|
+
card.append(item.item);
|
|
19408
|
+
};
|
|
19409
|
+
const connections = [
|
|
19410
|
+
["desktop", m.desktop],
|
|
19411
|
+
["gateway", m.gateway]
|
|
19412
|
+
];
|
|
19413
|
+
const chat = createPreferenceGroup(doc, m.chat);
|
|
19414
|
+
row(chat.card, m.experience, m.chatHint, "chatExperience", [
|
|
19415
|
+
["chatgpt", "ChatGPT"],
|
|
19416
|
+
["codex", "Codex"]
|
|
19417
|
+
]);
|
|
19418
|
+
row(
|
|
19419
|
+
chat.card,
|
|
19420
|
+
m.codexConnection,
|
|
19421
|
+
m.codexHint,
|
|
19422
|
+
"chatConnection",
|
|
19423
|
+
connections,
|
|
19424
|
+
draft.chatExperience !== "codex"
|
|
19425
|
+
);
|
|
19426
|
+
const work = createPreferenceGroup(doc, m.work);
|
|
19427
|
+
row(work.card, m.connection, m.workHint, "workConnection", connections);
|
|
19428
|
+
const config2 = createPreferenceGroup(doc, m.configuration);
|
|
19429
|
+
const gateway = createPreferenceItem(doc, {
|
|
19430
|
+
title: m.gatewayTitle,
|
|
19431
|
+
description: m.gatewayHint,
|
|
19432
|
+
controlId: preferenceId("gateway-config")
|
|
19433
|
+
});
|
|
19434
|
+
gateway.item.classList.add("settings-voice__row");
|
|
19435
|
+
const configure = button(doc, m.configure, () => {
|
|
19436
|
+
setup = !setup;
|
|
19437
|
+
render();
|
|
19438
|
+
});
|
|
19439
|
+
configure.id = gateway.item.querySelector("label")?.htmlFor ?? "";
|
|
19440
|
+
configure.setAttribute("aria-expanded", String(setup));
|
|
19441
|
+
const gatewayReadyLabel = state.gatewayReady === null ? m.unknown : state.gatewayReady ? m.configured : m.needsSetup;
|
|
19442
|
+
const gatewayActions = h(
|
|
19443
|
+
doc,
|
|
19444
|
+
"div",
|
|
19445
|
+
{ className: "settings-voice__gateway-actions" },
|
|
19446
|
+
h(doc, "span", {}, gatewayReadyLabel),
|
|
19447
|
+
configure
|
|
19448
|
+
);
|
|
19449
|
+
gateway.item.append(gatewayActions);
|
|
19450
|
+
config2.card.append(gateway.item);
|
|
19451
|
+
const hook = options.desktop ? desktopVoiceHookStatus(doc.defaultView) : "unknown";
|
|
19452
|
+
const hookLabel = hook === "active" ? m.hookSupported : hook === "pending" ? m.hookPending : hook === "unsupported" ? m.hookUnsupported : hook === "disabled" ? m.hookDisabled : m.unknown;
|
|
19453
|
+
const health = h(doc, "div", { className: "settings-voice__health" });
|
|
19454
|
+
health.append(
|
|
19455
|
+
h(doc, "p", {}, `${m.gatewayStatus}: ${gatewayReadyLabel}`),
|
|
19456
|
+
h(
|
|
19457
|
+
doc,
|
|
19458
|
+
"p",
|
|
19459
|
+
{},
|
|
19460
|
+
`${m.preferencesStatus}: ${state.routesActive === true ? m.preferencesOn : state.routesActive === false ? m.preferencesOff : m.unknown}`
|
|
19461
|
+
),
|
|
19462
|
+
h(doc, "p", {}, `${m.hookStatus}: ${hookLabel}`)
|
|
19463
|
+
);
|
|
19464
|
+
config2.card.append(health);
|
|
19465
|
+
if (setup) {
|
|
19466
|
+
const details = h(
|
|
19467
|
+
doc,
|
|
19468
|
+
"div",
|
|
19469
|
+
{ className: "settings-voice__details" },
|
|
19470
|
+
h(doc, "strong", {}, m.setup),
|
|
19471
|
+
h(doc, "p", {}, m.setupHint)
|
|
19472
|
+
);
|
|
19473
|
+
details.append(
|
|
19474
|
+
h(doc, "code", {}, "~/.codex/config.toml"),
|
|
19475
|
+
h(
|
|
19476
|
+
doc,
|
|
19477
|
+
"p",
|
|
19478
|
+
{},
|
|
19479
|
+
"experimental_realtime_webrtc_call_base_url \xB7 experimental_realtime_ws_base_url"
|
|
19480
|
+
)
|
|
19481
|
+
);
|
|
19482
|
+
config2.card.append(details);
|
|
19483
|
+
}
|
|
19484
|
+
const adv = createPreferenceItem(doc, {
|
|
19485
|
+
title: m.advanced,
|
|
19486
|
+
description: m.advancedHint,
|
|
19487
|
+
controlId: preferenceId("voice-advanced")
|
|
19488
|
+
});
|
|
19489
|
+
const expand = button(doc, advanced ? "\u2303" : "\u203A", () => {
|
|
19490
|
+
advanced = !advanced;
|
|
19491
|
+
render();
|
|
19492
|
+
});
|
|
19493
|
+
expand.id = adv.item.querySelector("label")?.htmlFor ?? "";
|
|
19494
|
+
expand.setAttribute("aria-label", m.advanced);
|
|
19495
|
+
expand.setAttribute("aria-expanded", String(advanced));
|
|
19496
|
+
adv.item.append(expand);
|
|
19497
|
+
config2.card.append(adv.item);
|
|
19498
|
+
if (advanced) {
|
|
19499
|
+
const id = controlId("voice-inject");
|
|
19500
|
+
const injection = createPreferenceItem(doc, {
|
|
19501
|
+
title: m.inject,
|
|
19502
|
+
description: m.injectHint,
|
|
19503
|
+
controlId: id
|
|
19504
|
+
});
|
|
19505
|
+
injection.item.classList.add("settings-voice__row");
|
|
19506
|
+
const toggle = createPreferenceSwitch(doc, id, injection.description.id);
|
|
19507
|
+
toggle.checked = draft.inject;
|
|
19508
|
+
toggle.disabled = unavailable || !!state.envOverride;
|
|
19509
|
+
toggle.addEventListener("change", () => {
|
|
19510
|
+
if (draft) draft = { ...draft, inject: toggle.checked };
|
|
19511
|
+
confirm = false;
|
|
19512
|
+
render();
|
|
19513
|
+
});
|
|
19514
|
+
injection.item.append(toggle);
|
|
19515
|
+
config2.card.append(injection.item);
|
|
19516
|
+
if (state.envOverride || state.activeEnvOverride)
|
|
19517
|
+
config2.card.append(
|
|
19518
|
+
h(doc, "p", { className: "settings-voice__details" }, m.environment)
|
|
19519
|
+
);
|
|
19520
|
+
}
|
|
19521
|
+
root.append(chat.group, work.group, config2.group);
|
|
19522
|
+
const restarting = state.restart.phase === "restarting";
|
|
19523
|
+
const failed = state.restart.phase === "failed";
|
|
19524
|
+
const status = busy ? m.saving : restarting ? m.restarting : isActiveCall() ? m.activeCall : offline ? m.unavailable : dirty() ? m.edited : needsRestart() ? m.restartNeeded : state.activeInject === null ? m.activeUnknown : state.routesActive === false ? m.pending : state.routesActive === null ? m.activeUnknown : m.ready;
|
|
19525
|
+
const footer = h(
|
|
19526
|
+
doc,
|
|
19527
|
+
"div",
|
|
19528
|
+
{ className: "settings-voice__footer" },
|
|
19529
|
+
h(doc, "div", { role: "status" }, h(doc, "div", {}, status), h(doc, "p", {}, m.nextCall))
|
|
19530
|
+
);
|
|
19531
|
+
const actions = h(doc, "div", { className: "settings-voice__actions" });
|
|
19532
|
+
const cancel = button(doc, m.cancel, () => {
|
|
19533
|
+
draft = base ? { ...base.settings } : null;
|
|
19534
|
+
confirm = false;
|
|
19535
|
+
error51 = null;
|
|
19536
|
+
render();
|
|
19537
|
+
});
|
|
19538
|
+
cancel.disabled = busy || !dirty() && !confirm;
|
|
19539
|
+
const submit = button(
|
|
19540
|
+
doc,
|
|
19541
|
+
failed && needsRestart() && !dirty() ? m.retryRestart : needsRestart() && state.restartAvailable ? m.applyRestart : m.apply,
|
|
19542
|
+
() => {
|
|
19543
|
+
if (needsRestart() && state?.restartAvailable) {
|
|
19544
|
+
confirm = true;
|
|
19545
|
+
render();
|
|
19546
|
+
} else void apply(false);
|
|
19547
|
+
},
|
|
19548
|
+
"primary"
|
|
19549
|
+
);
|
|
19550
|
+
submit.disabled = unavailable || !!isActiveCall() || !dirty() && !(needsRestart() && state.restartAvailable);
|
|
19551
|
+
actions.append(cancel, submit);
|
|
19552
|
+
footer.append(actions);
|
|
19553
|
+
root.append(footer);
|
|
19554
|
+
if (confirm)
|
|
19555
|
+
root.append(
|
|
19556
|
+
h(
|
|
19557
|
+
doc,
|
|
19558
|
+
"div",
|
|
19559
|
+
{ className: "settings-voice__confirmation" },
|
|
19560
|
+
h(doc, "p", {}, m.restartWarning),
|
|
19561
|
+
button(doc, m.confirm, () => void apply(true), "primary"),
|
|
19562
|
+
button(doc, m.cancel, () => {
|
|
19563
|
+
confirm = false;
|
|
19564
|
+
render();
|
|
19565
|
+
})
|
|
19566
|
+
)
|
|
19567
|
+
);
|
|
19568
|
+
if (failed)
|
|
19569
|
+
root.append(
|
|
19570
|
+
h(doc, "p", { role: "alert" }, `${m.restartFailed} ${state.restart.error ?? ""}`)
|
|
19571
|
+
);
|
|
19572
|
+
if (error51) root.append(h(doc, "p", { role: "alert" }, error51));
|
|
19573
|
+
const gatewaySelected = draft.workConnection === "gateway" || draft.chatExperience === "codex" && draft.chatConnection === "gateway";
|
|
19574
|
+
if (gatewaySelected && state.gatewayReady === false)
|
|
19575
|
+
root.append(h(doc, "p", { className: "settings-voice__hint" }, m.gatewayWarning));
|
|
19576
|
+
if (!draft.inject)
|
|
19577
|
+
root.append(h(doc, "p", { className: "settings-voice__hint" }, m.integrationOff));
|
|
19578
|
+
if (offline || base?.revision !== state.revision)
|
|
19579
|
+
root.append(button(doc, m.retry, () => void load(true)));
|
|
19580
|
+
context.content.replaceChildren(root);
|
|
19581
|
+
if (focusedId)
|
|
19582
|
+
root.querySelector(`#${focusedId}`)?.focus({ preventScroll: true });
|
|
19583
|
+
};
|
|
19584
|
+
render();
|
|
19585
|
+
void load();
|
|
19586
|
+
const timer = doc.defaultView?.setInterval(() => void load(), 3e3);
|
|
19587
|
+
return () => {
|
|
19588
|
+
disposed = true;
|
|
19589
|
+
if (timer !== void 0) doc.defaultView?.clearInterval(timer);
|
|
19590
|
+
};
|
|
19591
|
+
}
|
|
19592
|
+
});
|
|
19593
|
+
}
|
|
19594
|
+
function desktopVoiceHookStatus(win) {
|
|
19595
|
+
if (!win) return "unknown";
|
|
19596
|
+
const value = win.__codexhostClientOwnedVoiceV1;
|
|
19597
|
+
if (!value || typeof value !== "object") return "unknown";
|
|
19598
|
+
const status = value.status;
|
|
19599
|
+
if (status === "active" || status === "pending" || status === "unsupported" || status === "disabled")
|
|
19600
|
+
return status;
|
|
19601
|
+
return "unknown";
|
|
19602
|
+
}
|
|
19603
|
+
|
|
19604
|
+
// src/console/pages/restart-control.ts
|
|
19605
|
+
function renderRestartControl(document2, messages, state) {
|
|
19606
|
+
const root = h(document2, "div", { className: "console-actions console-restart" });
|
|
19607
|
+
const status = state.overview?.restart;
|
|
19608
|
+
const busy = state.restartSubmitting || status?.phase === "restarting";
|
|
19609
|
+
if (state.restartConfirm && !busy) {
|
|
19610
|
+
root.append(
|
|
19611
|
+
h(document2, "p", { role: "status" }, messages.restartWarning),
|
|
19612
|
+
button(document2, messages.restartConfirm, () => void state.restart(), "primary"),
|
|
19613
|
+
button(document2, messages.restartCancel, () => state.confirmRestart(false))
|
|
19614
|
+
);
|
|
19615
|
+
} else {
|
|
19616
|
+
const restart = button(document2, messages.restart, () => state.confirmRestart(true));
|
|
19617
|
+
restart.disabled = busy || state.offline || !state.overview?.launchAvailable || !["running", "integration-unavailable"].includes(state.overview.summary.state);
|
|
19618
|
+
root.append(restart);
|
|
19619
|
+
}
|
|
19620
|
+
if (busy || status?.phase === "succeeded") {
|
|
19621
|
+
root.append(
|
|
19622
|
+
h(document2, "p", { role: "status" }, busy ? messages.restarting : messages.restarted)
|
|
19623
|
+
);
|
|
19624
|
+
}
|
|
19625
|
+
const error51 = state.restartError ?? status?.error;
|
|
19626
|
+
if (error51) root.append(h(document2, "p", { role: "alert" }, error51));
|
|
19627
|
+
return root;
|
|
19628
|
+
}
|
|
19629
|
+
|
|
18849
19630
|
// src/console/pages/report-actions.ts
|
|
18850
19631
|
function mountReportActions(document2, messages, overview) {
|
|
18851
19632
|
const exportLink = h(
|
|
@@ -19117,6 +19898,8 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19117
19898
|
start.disabled = launching || !overview.launchAvailable;
|
|
19118
19899
|
actions.append(start);
|
|
19119
19900
|
}
|
|
19901
|
+
if (summaryState === "running" || summaryState === "integration-unavailable")
|
|
19902
|
+
actions.append(renderRestartControl(document2, messages, state));
|
|
19120
19903
|
if (state.update?.updateAvailable) {
|
|
19121
19904
|
actions.append(
|
|
19122
19905
|
button(
|
|
@@ -19187,12 +19970,35 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19187
19970
|
overview = null;
|
|
19188
19971
|
update = null;
|
|
19189
19972
|
offline = false;
|
|
19973
|
+
restartConfirm = false;
|
|
19974
|
+
restartSubmitting = false;
|
|
19975
|
+
restartError = null;
|
|
19190
19976
|
#listeners = /* @__PURE__ */ new Set();
|
|
19191
19977
|
#timer;
|
|
19192
19978
|
subscribe(listener) {
|
|
19193
19979
|
this.#listeners.add(listener);
|
|
19194
19980
|
return () => this.#listeners.delete(listener);
|
|
19195
19981
|
}
|
|
19982
|
+
confirmRestart(confirm) {
|
|
19983
|
+
this.restartConfirm = confirm;
|
|
19984
|
+
this.#emit();
|
|
19985
|
+
}
|
|
19986
|
+
async restart() {
|
|
19987
|
+
if (!this.restartConfirm || this.restartSubmitting) return;
|
|
19988
|
+
this.restartConfirm = false;
|
|
19989
|
+
this.restartSubmitting = true;
|
|
19990
|
+
this.restartError = null;
|
|
19991
|
+
this.#emit();
|
|
19992
|
+
try {
|
|
19993
|
+
await consolePost("/api/restart", { confirm: true });
|
|
19994
|
+
await this.refresh();
|
|
19995
|
+
} catch (error51) {
|
|
19996
|
+
this.restartError = error51 instanceof Error ? error51.message : String(error51);
|
|
19997
|
+
} finally {
|
|
19998
|
+
this.restartSubmitting = false;
|
|
19999
|
+
this.#emit();
|
|
20000
|
+
}
|
|
20001
|
+
}
|
|
19196
20002
|
async refresh() {
|
|
19197
20003
|
try {
|
|
19198
20004
|
this.overview = await consoleGet("/api/overview");
|
|
@@ -19424,7 +20230,15 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19424
20230
|
};
|
|
19425
20231
|
const inspectHarness = async (input, options) => {
|
|
19426
20232
|
const params = harnessInspectParamsSchema.parse(input);
|
|
19427
|
-
|
|
20233
|
+
let result;
|
|
20234
|
+
try {
|
|
20235
|
+
result = await manager.sendRequest(HARNESS_INSPECT_METHOD, params, options);
|
|
20236
|
+
} catch (error51) {
|
|
20237
|
+
if (!params.purpose || !isInvalidParams(error51)) throw error51;
|
|
20238
|
+
const full = { ...params };
|
|
20239
|
+
delete full.purpose;
|
|
20240
|
+
result = await manager.sendRequest(HARNESS_INSPECT_METHOD, full, options);
|
|
20241
|
+
}
|
|
19428
20242
|
return harnessInspectionSchema.parse(result);
|
|
19429
20243
|
};
|
|
19430
20244
|
const inspectHarnessCommands = async (input) => {
|
|
@@ -19498,6 +20312,19 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19498
20312
|
)
|
|
19499
20313
|
);
|
|
19500
20314
|
},
|
|
20315
|
+
async getGrokComputerUse() {
|
|
20316
|
+
return grokComputerUseSettingsSchema.parse(
|
|
20317
|
+
await manager.sendRequest(GROK_COMPUTER_USE_GET_METHOD, {})
|
|
20318
|
+
);
|
|
20319
|
+
},
|
|
20320
|
+
async setGrokComputerUse(update) {
|
|
20321
|
+
return grokComputerUseSettingsSchema.parse(
|
|
20322
|
+
await manager.sendRequest(
|
|
20323
|
+
GROK_COMPUTER_USE_SET_METHOD,
|
|
20324
|
+
grokComputerUseSetSchema.parse(update)
|
|
20325
|
+
)
|
|
20326
|
+
);
|
|
20327
|
+
},
|
|
19501
20328
|
async listLoadedSessions() {
|
|
19502
20329
|
return loadedSessionsSchema.parse(await manager.sendRequest(LOADED_SESSIONS_METHOD, {}));
|
|
19503
20330
|
},
|
|
@@ -19686,6 +20513,9 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19686
20513
|
}
|
|
19687
20514
|
});
|
|
19688
20515
|
}
|
|
20516
|
+
function isInvalidParams(error51) {
|
|
20517
|
+
return typeof error51 === "object" && error51 !== null && "code" in error51 && error51.code === -32602;
|
|
20518
|
+
}
|
|
19689
20519
|
|
|
19690
20520
|
// src/settings/accounts.css
|
|
19691
20521
|
var accounts_default = `.settings-harness-account__logo {
|
|
@@ -20701,16 +21531,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20701
21531
|
"When this is on, that card is hidden on every Composer, including Codex threads. Reset usage and Upgrade stay available in Settings.",
|
|
20702
21532
|
"Turning this off only shows the native card again. Send on this Composer, including Codex threads, is already separated from that quota card."
|
|
20703
21533
|
]),
|
|
20704
|
-
cpaLiveVoiceTitle: "Override live voice",
|
|
20705
|
-
cpaLiveVoiceDescription: "On by default. Host creates the realtime call instead of ChatGPT.",
|
|
20706
|
-
cpaLiveVoiceHelpLabel: "About overriding live voice",
|
|
20707
|
-
cpaLiveVoiceHelp: Object.freeze([
|
|
20708
|
-
"Overrides Desktop's existing-call path on audited 26.1007.30912 so a local host can create the WebRTC call.",
|
|
20709
|
-
"This switch applies on the next voice session. No relaunch.",
|
|
20710
|
-
"Also set both keys in ~/.codex/config.toml and relaunch Codex: experimental_realtime_ws_base_url and experimental_realtime_webrtc_call_base_url, each pointing at your realtime host /v1.",
|
|
20711
|
-
"CODEXHOST_CPA_LIVE_VOICE=0 is not live. Relaunch Codex after changing that environment variable."
|
|
20712
|
-
]),
|
|
20713
|
-
cpaLiveVoiceRestartRequired: "This override is not injected. Unset CODEXHOST_CPA_LIVE_VOICE=0 and relaunch Codex. The switch cannot take effect until then.",
|
|
20714
21534
|
loadedSessions: {
|
|
20715
21535
|
title: "Loaded sessions",
|
|
20716
21536
|
description: "Local external Harnesses only. Refreshes every 10 seconds without waking sessions or resetting activity. Released sessions disappear from this list.",
|
|
@@ -20871,6 +21691,26 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20871
21691
|
launchPathLoading: "Loading launch settings\u2026",
|
|
20872
21692
|
launchPathLoadError: "Could not load launch settings. Reopen this detail panel to retry.",
|
|
20873
21693
|
launchPathSaveError: "Could not save. Enter an existing absolute installation folder on this Host and check configuration permissions.",
|
|
21694
|
+
grokComputerUseLabel: "Grok Computer Use",
|
|
21695
|
+
grokComputerUseTitle: "Computer Use",
|
|
21696
|
+
grokComputerUseDescription: "Let Grok control Mac apps via ChatGPT Computer Use (cua_repl).",
|
|
21697
|
+
grokComputerUseHelp: "ChatGPT Settings \u2192 Computer use still applies to official Codex threads. Always-allowed apps stay in that list. New Grok threads pick up this switch.",
|
|
21698
|
+
grokComputerUseOn: "On \xB7 available",
|
|
21699
|
+
grokComputerUseOff: "Off",
|
|
21700
|
+
grokComputerUseSaving: "Saving\u2026",
|
|
21701
|
+
grokComputerUseLoading: "Loading Grok Computer Use\u2026",
|
|
21702
|
+
grokComputerUseLoadError: "Could not load Grok Computer Use. Reopen this panel to retry.",
|
|
21703
|
+
grokComputerUseSaveError: "Could not save. Install ChatGPT.app with Computer Use, then try again.",
|
|
21704
|
+
grokComputerUseUnavailable: "ChatGPT Desktop Computer Use files were not found on this Mac.",
|
|
21705
|
+
grokBrowserLabel: "Grok in-app browser",
|
|
21706
|
+
grokBrowserTitle: "In-app browser",
|
|
21707
|
+
grokBrowserDescription: "Let Grok use ChatGPT's built-in browser (Browser Use) through cua_repl. Independent of Computer Use.",
|
|
21708
|
+
grokBrowserHelp: "Official Codex Browser Use is unchanged. Grok fails closed when ChatGPT does not authorize the connection or no in-app browser tab can be bound. The Chrome extension is a separate path.",
|
|
21709
|
+
grokBrowserOn: "On \xB7 browser surface enabled",
|
|
21710
|
+
grokBrowserOff: "Off",
|
|
21711
|
+
grokBrowserUnavailable: "ChatGPT Desktop in-app browser files were not found on this Mac.",
|
|
21712
|
+
grokBrowserBlocked: "Saved as intent. ChatGPT Desktop does not authorize Grok to use the in-app browser.",
|
|
21713
|
+
grokComputerUseApplyFailed: "Could not apply the saved setting to Grok config.",
|
|
20874
21714
|
connectionOfficialWebsite: "Visit official website",
|
|
20875
21715
|
connectionOpenHarnessWeb: "Open DeepSeek Harness Web",
|
|
20876
21716
|
connectionDeepSeekTestedVersions: "Supported DSH versions: 0.1.7-rc.1, 0.1.7-rc.2, 0.2.0-rc.1, 0.2.0-rc.2, 0.2.1-rc.1 and 0.2.1-rc.2. Versions newer than 0.2.1-rc.2 can be tried, but compatibility may be limited; versions older than 0.1.7-rc.1 must be upgraded first.",
|
|
@@ -20882,6 +21722,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20882
21722
|
harnessVersionCurrent: "Current version",
|
|
20883
21723
|
harnessVersionLatest: "Latest version",
|
|
20884
21724
|
harnessVersionChecking: "Checking versions\u2026",
|
|
21725
|
+
harnessVersionAvailable: "Update available",
|
|
20885
21726
|
harnessVersionUpdate: "Update",
|
|
20886
21727
|
harnessVersionUpdating: "Updating\u2026",
|
|
20887
21728
|
harnessVersionUpToDate: "Up to date",
|
|
@@ -20966,6 +21807,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20966
21807
|
connections: "Connections",
|
|
20967
21808
|
"remote-connections": "Remote connections",
|
|
20968
21809
|
appearance: "General",
|
|
21810
|
+
voice: "Voice",
|
|
20969
21811
|
accounts: "Accounts",
|
|
20970
21812
|
"session-import": "Session Import",
|
|
20971
21813
|
"usage-statistics": "Usage statistics",
|
|
@@ -20992,16 +21834,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20992
21834
|
"\u5F00\u542F\u540E\uFF0C\u6240\u6709 Composer \u90FD\u9690\u85CF\u8BE5\u5361\u7247\uFF0C\u5305\u62EC Codex \u4F1A\u8BDD\u3002\u300C\u91CD\u7F6E\u7528\u91CF\u300D\u548C\u300C\u5347\u7EA7\u300D\u4ECD\u53EF\u5728\u8BBE\u7F6E\u4E2D\u4F7F\u7528\u3002",
|
|
20993
21835
|
"\u5173\u95ED\u6B64\u5F00\u5173\u53EA\u4F1A\u91CD\u65B0\u663E\u793A\u539F\u751F\u5361\u7247\u3002\u5F53\u524D Composer \u7684\u53D1\u9001\uFF08\u5305\u62EC Codex \u4F1A\u8BDD\uFF09\u5DF2\u4E0E\u8BE5\u989D\u5EA6\u5361\u7247\u5206\u79BB\u3002"
|
|
20994
21836
|
]),
|
|
20995
|
-
cpaLiveVoiceTitle: "\u6539\u5199\u5B9E\u65F6\u8BED\u97F3",
|
|
20996
|
-
cpaLiveVoiceDescription: "\u9ED8\u8BA4\u5F00\u542F\u3002\u7531 Host \u521B\u5EFA realtime \u901A\u8BDD\uFF0C\u800C\u4E0D\u662F ChatGPT\u3002",
|
|
20997
|
-
cpaLiveVoiceHelpLabel: "\u6539\u5199\u5B9E\u65F6\u8BED\u97F3\u8BF4\u660E",
|
|
20998
|
-
cpaLiveVoiceHelp: Object.freeze([
|
|
20999
|
-
"\u5728\u5DF2\u5BA1\u8BA1\u7684 Desktop 26.1007.30912 \u4E0A\u8986\u76D6 existing-call \u8DEF\u5F84\uFF0C\u8BA9\u672C\u5730 Host \u521B\u5EFA WebRTC \u901A\u8BDD\u3002",
|
|
21000
|
-
"\u6B64\u5F00\u5173\u5728\u4E0B\u4E00\u6B21\u8BED\u97F3\u4F1A\u8BDD\u751F\u6548\uFF0C\u65E0\u9700\u91CD\u65B0\u542F\u52A8\u3002",
|
|
21001
|
-
"\u8FD8\u9700\u8981\u5728 ~/.codex/config.toml \u8BBE\u7F6E experimental_realtime_ws_base_url \u4E0E experimental_realtime_webrtc_call_base_url\uFF0C\u90FD\u6307\u5411\u4F60\u7684 realtime \u4E3B\u673A /v1\uFF0C\u7136\u540E\u91CD\u65B0\u542F\u52A8 Codex\u3002",
|
|
21002
|
-
"CODEXHOST_CPA_LIVE_VOICE=0 \u4E0D\u4F1A\u5373\u65F6\u751F\u6548\u3002\u4FEE\u6539\u8BE5\u73AF\u5883\u53D8\u91CF\u540E\u5FC5\u987B\u91CD\u65B0\u542F\u52A8 Codex\u3002"
|
|
21003
|
-
]),
|
|
21004
|
-
cpaLiveVoiceRestartRequired: "\u5F53\u524D\u672A\u6CE8\u5165\u6B64\u6539\u5199\u3002\u8BF7\u53D6\u6D88 CODEXHOST_CPA_LIVE_VOICE=0 \u5E76\u91CD\u65B0\u542F\u52A8 Codex\uFF0C\u672C\u5F00\u5173\u624D\u4F1A\u751F\u6548\u3002",
|
|
21005
21837
|
loadedSessions: {
|
|
21006
21838
|
title: "\u5DF2\u52A0\u8F7D\u4F1A\u8BDD",
|
|
21007
21839
|
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",
|
|
@@ -21162,6 +21994,26 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21162
21994
|
launchPathLoading: "\u6B63\u5728\u8BFB\u53D6\u542F\u52A8\u8BBE\u7F6E\u2026",
|
|
21163
21995
|
launchPathLoadError: "\u65E0\u6CD5\u8BFB\u53D6\u542F\u52A8\u8BBE\u7F6E\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u6B64\u8BE6\u60C5\u9762\u677F\u91CD\u8BD5\u3002",
|
|
21164
21996
|
launchPathSaveError: "\u4FDD\u5B58\u5931\u8D25\u3002\u8BF7\u586B\u5199\u6B64 Host \u4E0A\u5B9E\u9645\u5B58\u5728\u7684\u5B89\u88C5\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5E76\u786E\u8BA4\u914D\u7F6E\u76EE\u5F55\u53EF\u5199\u3002",
|
|
21997
|
+
grokComputerUseLabel: "Grok Computer Use",
|
|
21998
|
+
grokComputerUseTitle: "Computer Use",
|
|
21999
|
+
grokComputerUseDescription: "\u8BA9 Grok \u901A\u8FC7 ChatGPT Computer Use\uFF08cua_repl\uFF09\u63A7\u5236 Mac \u5E94\u7528\u3002",
|
|
22000
|
+
grokComputerUseHelp: "ChatGPT \u8BBE\u7F6E \u2192 Computer use \u4ECD\u53EA\u4F5C\u7528\u4E8E\u5B98\u65B9 Codex \u7EBF\u7A0B\u3002Always-allowed \u5E94\u7528\u4ECD\u4FDD\u5B58\u5728\u8BE5\u5217\u8868\u3002\u65B0\u7684 Grok \u7EBF\u7A0B\u4F1A\u8BFB\u53D6\u6B64\u5F00\u5173\u3002",
|
|
22001
|
+
grokComputerUseOn: "\u5DF2\u5F00\u542F \xB7 \u53EF\u7528",
|
|
22002
|
+
grokComputerUseOff: "\u5DF2\u5173\u95ED",
|
|
22003
|
+
grokComputerUseSaving: "\u6B63\u5728\u4FDD\u5B58\u2026",
|
|
22004
|
+
grokComputerUseLoading: "\u6B63\u5728\u8BFB\u53D6 Grok Computer Use\u2026",
|
|
22005
|
+
grokComputerUseLoadError: "\u65E0\u6CD5\u8BFB\u53D6 Grok Computer Use\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u6B64\u9762\u677F\u91CD\u8BD5\u3002",
|
|
22006
|
+
grokComputerUseSaveError: "\u4FDD\u5B58\u5931\u8D25\u3002\u8BF7\u5148\u5B89\u88C5\u5E26 Computer Use \u7684 ChatGPT.app\u3002",
|
|
22007
|
+
grokComputerUseUnavailable: "\u672C\u673A\u672A\u627E\u5230 ChatGPT Desktop \u7684 Computer Use \u6587\u4EF6\u3002",
|
|
22008
|
+
grokBrowserLabel: "Grok \u5185\u7F6E\u6D4F\u89C8\u5668",
|
|
22009
|
+
grokBrowserTitle: "\u5185\u7F6E\u6D4F\u89C8\u5668",
|
|
22010
|
+
grokBrowserDescription: "\u8BA9 Grok \u901A\u8FC7 cua_repl \u4F7F\u7528 ChatGPT \u5185\u7F6E\u6D4F\u89C8\u5668\uFF08Browser Use\uFF09\u3002\u4E0E Computer Use \u76F8\u4E92\u72EC\u7ACB\u3002",
|
|
22011
|
+
grokBrowserHelp: "\u5B98\u65B9 Codex Browser Use \u4E0D\u53D7\u5F71\u54CD\u3002ChatGPT \u4E0D\u6388\u6743\u8FDE\u63A5\u6216\u65E0\u6CD5\u7ED1\u5B9A\u5185\u7F6E\u6D4F\u89C8\u5668\u6807\u7B7E\u9875\u65F6\uFF0CGrok \u4F1A\u76F4\u63A5\u5931\u8D25\u3002Chrome \u6269\u5C55\u662F\u53E6\u4E00\u6761\u8DEF\u5F84\u3002",
|
|
22012
|
+
grokBrowserOn: "\u5DF2\u5F00\u542F \xB7 \u6D4F\u89C8\u5668\u80FD\u529B\u5DF2\u542F\u7528",
|
|
22013
|
+
grokBrowserOff: "\u5DF2\u5173\u95ED",
|
|
22014
|
+
grokBrowserUnavailable: "\u672C\u673A\u672A\u627E\u5230 ChatGPT Desktop \u7684\u5185\u7F6E\u6D4F\u89C8\u5668\u6587\u4EF6\u3002",
|
|
22015
|
+
grokBrowserBlocked: "\u5DF2\u4FDD\u5B58\u4E3A\u610F\u5411\u3002ChatGPT Desktop \u5C1A\u672A\u6388\u6743 Grok \u4F7F\u7528\u5185\u7F6E\u6D4F\u89C8\u5668\u3002",
|
|
22016
|
+
grokComputerUseApplyFailed: "\u65E0\u6CD5\u5C06\u5DF2\u4FDD\u5B58\u7684\u8BBE\u7F6E\u5199\u5165 Grok \u914D\u7F6E\u3002",
|
|
21165
22017
|
connectionOfficialWebsite: "\u8BBF\u95EE\u5B98\u7F51",
|
|
21166
22018
|
connectionOpenHarnessWeb: "\u6253\u5F00 DeepSeek Harness Web",
|
|
21167
22019
|
connectionDeepSeekTestedVersions: "\u652F\u6301 DSH \u7248\u672C\uFF1A0.1.7-rc.1\u30010.1.7-rc.2\u30010.2.0-rc.1\u30010.2.0-rc.2\u30010.2.1-rc.1 \u548C 0.2.1-rc.2\u3002\u9AD8\u4E8E 0.2.1-rc.2 \u7684\u7248\u672C\u53EF\u4EE5\u5C1D\u8BD5\u8FDE\u63A5\uFF0C\u4F46\u9002\u914D\u5EA6\u53EF\u80FD\u6709\u9650\uFF1B\u4F4E\u4E8E 0.1.7-rc.1 \u7684\u7248\u672C\u9700\u8981\u5148\u5347\u7EA7\u3002",
|
|
@@ -21173,6 +22025,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21173
22025
|
harnessVersionCurrent: "\u5F53\u524D\u7248\u672C",
|
|
21174
22026
|
harnessVersionLatest: "\u6700\u65B0\u7248\u672C",
|
|
21175
22027
|
harnessVersionChecking: "\u6B63\u5728\u68C0\u67E5\u7248\u672C\u2026",
|
|
22028
|
+
harnessVersionAvailable: "\u6709\u65B0\u7248\u672C",
|
|
21176
22029
|
harnessVersionUpdate: "\u66F4\u65B0",
|
|
21177
22030
|
harnessVersionUpdating: "\u6B63\u5728\u66F4\u65B0\u2026",
|
|
21178
22031
|
harnessVersionUpToDate: "\u5DF2\u662F\u6700\u65B0",
|
|
@@ -21257,6 +22110,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21257
22110
|
connections: "\u8FDE\u63A5",
|
|
21258
22111
|
"remote-connections": "\u8FDC\u7A0B\u8FDE\u63A5",
|
|
21259
22112
|
appearance: "\u901A\u7528",
|
|
22113
|
+
voice: "\u8BED\u97F3",
|
|
21260
22114
|
accounts: "\u8D26\u53F7",
|
|
21261
22115
|
"session-import": "\u4F1A\u8BDD\u5BFC\u5165",
|
|
21262
22116
|
"usage-statistics": "\u7528\u91CF\u7EDF\u8BA1",
|
|
@@ -24032,109 +24886,11 @@ ${detail}` : ""}`
|
|
|
24032
24886
|
true
|
|
24033
24887
|
);
|
|
24034
24888
|
serviceActions.append(update);
|
|
24035
|
-
}
|
|
24036
|
-
}
|
|
24037
|
-
service.append(copy, serviceActions);
|
|
24038
|
-
card.append(service);
|
|
24039
|
-
return card;
|
|
24040
|
-
}
|
|
24041
|
-
|
|
24042
|
-
// src/settings/preference-ui.ts
|
|
24043
|
-
var nextPreferenceId = 0;
|
|
24044
|
-
function preferenceId(prefix) {
|
|
24045
|
-
nextPreferenceId += 1;
|
|
24046
|
-
return `codexhost-${prefix}-${nextPreferenceId}`;
|
|
24047
|
-
}
|
|
24048
|
-
function createPreferenceGroup(document2, title) {
|
|
24049
|
-
const group = document2.createElement("section");
|
|
24050
|
-
group.className = "mt-7 first-of-type:mt-0";
|
|
24051
|
-
const header = document2.createElement("div");
|
|
24052
|
-
header.className = "mb-2 flex min-h-6 items-center gap-2 px-1";
|
|
24053
|
-
const heading = document2.createElement("h3");
|
|
24054
|
-
heading.id = preferenceId("preference-group");
|
|
24055
|
-
heading.className = "m-0 text-[13px] leading-5 font-semibold text-settings-text";
|
|
24056
|
-
heading.textContent = title;
|
|
24057
|
-
header.append(heading);
|
|
24058
|
-
const card = document2.createElement("div");
|
|
24059
|
-
card.className = "rounded-[10px] border border-settings-border bg-settings-panel";
|
|
24060
|
-
group.setAttribute("aria-labelledby", heading.id);
|
|
24061
|
-
group.append(header, card);
|
|
24062
|
-
return { group, header, card };
|
|
24063
|
-
}
|
|
24064
|
-
function createPreferenceItem(document2, input) {
|
|
24065
|
-
const item = document2.createElement("div");
|
|
24066
|
-
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";
|
|
24067
|
-
const copy = document2.createElement("div");
|
|
24068
|
-
copy.className = "flex min-w-0 flex-col gap-0.5";
|
|
24069
|
-
const heading = document2.createElement("div");
|
|
24070
|
-
heading.className = "flex items-center gap-1.5";
|
|
24071
|
-
const title = document2.createElement("label");
|
|
24072
|
-
title.htmlFor = input.controlId;
|
|
24073
|
-
title.className = "cursor-pointer text-[13px] leading-5 font-medium text-settings-text";
|
|
24074
|
-
title.textContent = input.title;
|
|
24075
|
-
heading.append(title);
|
|
24076
|
-
if (input.help) heading.append(createHelpTooltip(document2, input.help.label, input.help.lines));
|
|
24077
|
-
const description = document2.createElement("div");
|
|
24078
|
-
description.id = preferenceId("preference-description");
|
|
24079
|
-
description.className = "text-xs leading-[18px] text-settings-muted data-[invalid=true]:text-settings-danger";
|
|
24080
|
-
description.textContent = input.description;
|
|
24081
|
-
copy.append(heading, description);
|
|
24082
|
-
item.append(copy);
|
|
24083
|
-
return { item, description };
|
|
24084
|
-
}
|
|
24085
|
-
function createHelpTooltip(document2, label, lines) {
|
|
24086
|
-
const wrapper = document2.createElement("span");
|
|
24087
|
-
wrapper.className = "group relative inline-flex";
|
|
24088
|
-
const button2 = document2.createElement("button");
|
|
24089
|
-
button2.type = "button";
|
|
24090
|
-
button2.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";
|
|
24091
|
-
button2.setAttribute("aria-label", label);
|
|
24092
|
-
button2.append(createRendererSettingsIcon("help", 14));
|
|
24093
|
-
const tooltip = document2.createElement("div");
|
|
24094
|
-
tooltip.id = preferenceId("preference-tooltip");
|
|
24095
|
-
tooltip.setAttribute("role", "tooltip");
|
|
24096
|
-
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";
|
|
24097
|
-
const list = document2.createElement("ul");
|
|
24098
|
-
list.className = "m-0 grid list-disc gap-1 pl-4 marker:text-settings-subtle";
|
|
24099
|
-
for (const line of lines) {
|
|
24100
|
-
const item = document2.createElement("li");
|
|
24101
|
-
item.textContent = line;
|
|
24102
|
-
list.append(item);
|
|
24103
|
-
}
|
|
24104
|
-
tooltip.append(list);
|
|
24105
|
-
button2.setAttribute("aria-describedby", tooltip.id);
|
|
24106
|
-
button2.addEventListener("keydown", (event) => {
|
|
24107
|
-
if (event.key === "Escape") button2.blur();
|
|
24108
|
-
});
|
|
24109
|
-
wrapper.append(button2, tooltip);
|
|
24110
|
-
return wrapper;
|
|
24111
|
-
}
|
|
24112
|
-
function createPreferenceSwitch(document2, id, describedBy) {
|
|
24113
|
-
const input = document2.createElement("input");
|
|
24114
|
-
input.type = "checkbox";
|
|
24115
|
-
input.id = id;
|
|
24116
|
-
input.setAttribute("role", "switch");
|
|
24117
|
-
input.setAttribute("aria-describedby", describedBy);
|
|
24118
|
-
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";
|
|
24119
|
-
return input;
|
|
24120
|
-
}
|
|
24121
|
-
function createNumberField(document2, input) {
|
|
24122
|
-
const field = document2.createElement("div");
|
|
24123
|
-
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";
|
|
24124
|
-
const control = document2.createElement("input");
|
|
24125
|
-
control.type = "number";
|
|
24126
|
-
control.id = input.id;
|
|
24127
|
-
control.min = String(input.min);
|
|
24128
|
-
control.max = String(input.max);
|
|
24129
|
-
control.step = "1";
|
|
24130
|
-
control.setAttribute("aria-describedby", input.describedBy);
|
|
24131
|
-
control.className = "w-14 border-0 bg-transparent p-0 text-right text-[13px] leading-5 text-settings-text tabular-nums outline-none";
|
|
24132
|
-
const unit = document2.createElement("span");
|
|
24133
|
-
unit.className = "text-xs text-settings-muted";
|
|
24134
|
-
unit.setAttribute("aria-hidden", "true");
|
|
24135
|
-
unit.textContent = input.unit;
|
|
24136
|
-
field.append(control, unit);
|
|
24137
|
-
return { field, control };
|
|
24889
|
+
}
|
|
24890
|
+
}
|
|
24891
|
+
service.append(copy, serviceActions);
|
|
24892
|
+
card.append(service);
|
|
24893
|
+
return card;
|
|
24138
24894
|
}
|
|
24139
24895
|
|
|
24140
24896
|
// src/settings/remote-connections-dialogs.ts
|
|
@@ -24984,6 +25740,144 @@ ${detail}` : ""}`
|
|
|
24984
25740
|
return section;
|
|
24985
25741
|
}
|
|
24986
25742
|
|
|
25743
|
+
// src/settings/grok-computer-use-controls.ts
|
|
25744
|
+
function createGrokComputerUseControls(document2, messages, settings) {
|
|
25745
|
+
const section = document2.createElement("section");
|
|
25746
|
+
section.className = "settings-grok-computer-use";
|
|
25747
|
+
section.dataset.grokComputerUse = "true";
|
|
25748
|
+
const header = document2.createElement("div");
|
|
25749
|
+
header.className = "settings-grok-computer-use__header";
|
|
25750
|
+
const copy = document2.createElement("div");
|
|
25751
|
+
copy.className = "settings-grok-computer-use__copy";
|
|
25752
|
+
const title = document2.createElement("h3");
|
|
25753
|
+
title.className = "settings-grok-computer-use__title";
|
|
25754
|
+
title.id = "grok-computer-use-title";
|
|
25755
|
+
title.textContent = messages.grokComputerUseTitle;
|
|
25756
|
+
const description = document2.createElement("p");
|
|
25757
|
+
description.className = "settings-grok-computer-use__description";
|
|
25758
|
+
description.id = "grok-computer-use-description";
|
|
25759
|
+
description.textContent = messages.grokComputerUseDescription;
|
|
25760
|
+
copy.append(title, description);
|
|
25761
|
+
const input = createPreferenceSwitch(
|
|
25762
|
+
document2,
|
|
25763
|
+
"grok-computer-use-enabled",
|
|
25764
|
+
"grok-computer-use-description grok-computer-use-help grok-computer-use-status"
|
|
25765
|
+
);
|
|
25766
|
+
input.setAttribute("aria-labelledby", title.id);
|
|
25767
|
+
input.setAttribute("aria-label", messages.grokComputerUseLabel);
|
|
25768
|
+
header.append(copy, input);
|
|
25769
|
+
const help = document2.createElement("p");
|
|
25770
|
+
help.className = "settings-grok-computer-use__help";
|
|
25771
|
+
help.id = "grok-computer-use-help";
|
|
25772
|
+
help.textContent = messages.grokComputerUseHelp;
|
|
25773
|
+
const status = document2.createElement("p");
|
|
25774
|
+
status.className = "settings-grok-computer-use__status";
|
|
25775
|
+
status.id = "grok-computer-use-status";
|
|
25776
|
+
status.setAttribute("role", "status");
|
|
25777
|
+
status.setAttribute("aria-live", "polite");
|
|
25778
|
+
const browserHeader = document2.createElement("div");
|
|
25779
|
+
browserHeader.className = "settings-grok-computer-use__header settings-grok-computer-use__browser";
|
|
25780
|
+
const browserCopy = document2.createElement("div");
|
|
25781
|
+
browserCopy.className = "settings-grok-computer-use__copy";
|
|
25782
|
+
const browserTitle = document2.createElement("h3");
|
|
25783
|
+
browserTitle.className = "settings-grok-computer-use__title";
|
|
25784
|
+
browserTitle.id = "grok-browser-title";
|
|
25785
|
+
browserTitle.textContent = messages.grokBrowserTitle;
|
|
25786
|
+
const browserDescription = document2.createElement("p");
|
|
25787
|
+
browserDescription.className = "settings-grok-computer-use__description";
|
|
25788
|
+
browserDescription.id = "grok-browser-description";
|
|
25789
|
+
browserDescription.textContent = messages.grokBrowserDescription;
|
|
25790
|
+
browserCopy.append(browserTitle, browserDescription);
|
|
25791
|
+
const browserInput = createPreferenceSwitch(
|
|
25792
|
+
document2,
|
|
25793
|
+
"grok-browser-enabled",
|
|
25794
|
+
"grok-browser-description grok-browser-help grok-browser-status"
|
|
25795
|
+
);
|
|
25796
|
+
browserInput.setAttribute("aria-labelledby", browserTitle.id);
|
|
25797
|
+
browserInput.setAttribute("aria-label", messages.grokBrowserLabel);
|
|
25798
|
+
browserHeader.append(browserCopy, browserInput);
|
|
25799
|
+
const browserHelp = document2.createElement("p");
|
|
25800
|
+
browserHelp.className = "settings-grok-computer-use__help";
|
|
25801
|
+
browserHelp.id = "grok-browser-help";
|
|
25802
|
+
browserHelp.textContent = messages.grokBrowserHelp;
|
|
25803
|
+
const browserStatus = document2.createElement("p");
|
|
25804
|
+
browserStatus.className = "settings-grok-computer-use__status";
|
|
25805
|
+
browserStatus.id = "grok-browser-status";
|
|
25806
|
+
browserStatus.setAttribute("role", "status");
|
|
25807
|
+
browserStatus.setAttribute("aria-live", "polite");
|
|
25808
|
+
section.append(header, help, status, browserHeader, browserHelp, browserStatus);
|
|
25809
|
+
let busy = true;
|
|
25810
|
+
let loaded = false;
|
|
25811
|
+
let last;
|
|
25812
|
+
const show = (value) => {
|
|
25813
|
+
last = value;
|
|
25814
|
+
input.checked = value.enabled;
|
|
25815
|
+
input.disabled = busy || !loaded || !value.available && !value.enabled;
|
|
25816
|
+
const browserOn = value.browser === true;
|
|
25817
|
+
const browserFiles = value.browserFilesPresent === true;
|
|
25818
|
+
browserInput.checked = browserOn;
|
|
25819
|
+
browserInput.disabled = busy || !loaded || !browserFiles && !browserOn;
|
|
25820
|
+
if (!browserFiles) {
|
|
25821
|
+
browserStatus.dataset.state = "unavailable";
|
|
25822
|
+
browserStatus.textContent = value.browserUnavailableReason ?? messages.grokBrowserUnavailable;
|
|
25823
|
+
} else if (value.browserAvailable !== true) {
|
|
25824
|
+
browserStatus.dataset.state = browserOn ? "unavailable" : "off";
|
|
25825
|
+
browserStatus.textContent = browserOn ? value.browserUnavailableReason ?? messages.grokBrowserBlocked : messages.grokBrowserOff;
|
|
25826
|
+
} else {
|
|
25827
|
+
browserStatus.dataset.state = browserOn ? "on" : "off";
|
|
25828
|
+
browserStatus.textContent = browserOn ? messages.grokBrowserOn : messages.grokBrowserOff;
|
|
25829
|
+
}
|
|
25830
|
+
if (value.applyFailed) {
|
|
25831
|
+
status.dataset.state = "unavailable";
|
|
25832
|
+
status.textContent = value.applyError ?? messages.grokComputerUseApplyFailed;
|
|
25833
|
+
return;
|
|
25834
|
+
}
|
|
25835
|
+
if (!value.available) {
|
|
25836
|
+
status.dataset.state = "unavailable";
|
|
25837
|
+
status.textContent = value.unavailableReason ?? messages.grokComputerUseUnavailable;
|
|
25838
|
+
return;
|
|
25839
|
+
}
|
|
25840
|
+
status.dataset.state = value.enabled ? "on" : "off";
|
|
25841
|
+
status.textContent = value.enabled ? messages.grokComputerUseOn : messages.grokComputerUseOff;
|
|
25842
|
+
};
|
|
25843
|
+
const save = (update, target) => {
|
|
25844
|
+
if (busy || !loaded) return;
|
|
25845
|
+
busy = true;
|
|
25846
|
+
input.disabled = true;
|
|
25847
|
+
browserInput.disabled = true;
|
|
25848
|
+
target.textContent = messages.grokComputerUseSaving;
|
|
25849
|
+
void settings.set(update).then((value) => {
|
|
25850
|
+
busy = false;
|
|
25851
|
+
show(value);
|
|
25852
|
+
}).catch(() => {
|
|
25853
|
+
busy = false;
|
|
25854
|
+
if (last) show(last);
|
|
25855
|
+
else {
|
|
25856
|
+
input.disabled = false;
|
|
25857
|
+
browserInput.disabled = false;
|
|
25858
|
+
}
|
|
25859
|
+
target.textContent = messages.grokComputerUseSaveError;
|
|
25860
|
+
});
|
|
25861
|
+
};
|
|
25862
|
+
input.addEventListener("change", () => save({ enabled: input.checked }, status));
|
|
25863
|
+
browserInput.addEventListener(
|
|
25864
|
+
"change",
|
|
25865
|
+
() => save({ browser: browserInput.checked }, browserStatus)
|
|
25866
|
+
);
|
|
25867
|
+
status.textContent = messages.grokComputerUseLoading;
|
|
25868
|
+
browserStatus.textContent = messages.grokBrowserOff;
|
|
25869
|
+
void settings.get().then((value) => {
|
|
25870
|
+
loaded = true;
|
|
25871
|
+
busy = false;
|
|
25872
|
+
show(value);
|
|
25873
|
+
}).catch(() => {
|
|
25874
|
+
busy = false;
|
|
25875
|
+
status.textContent = messages.grokComputerUseLoadError;
|
|
25876
|
+
browserStatus.textContent = messages.grokComputerUseLoadError;
|
|
25877
|
+
});
|
|
25878
|
+
return section;
|
|
25879
|
+
}
|
|
25880
|
+
|
|
24987
25881
|
// src/settings/harness-installation-guides.ts
|
|
24988
25882
|
function harnessHasInstallCommands(plugin) {
|
|
24989
25883
|
return (plugin?.installation?.commands.length ?? 0) > 0;
|
|
@@ -25135,7 +26029,7 @@ ${detail}` : ""}`
|
|
|
25135
26029
|
}
|
|
25136
26030
|
|
|
25137
26031
|
// src/settings/harness-version-panel.ts
|
|
25138
|
-
function createHarnessVersionPanel(document2, messages, signal, agent, client) {
|
|
26032
|
+
function createHarnessVersionPanel(document2, messages, signal, agent, client, onChange = () => void 0) {
|
|
25139
26033
|
const panel = document2.createElement("section");
|
|
25140
26034
|
panel.className = "settings-harness-version";
|
|
25141
26035
|
panel.dataset.harnessVersion = agent;
|
|
@@ -25161,6 +26055,7 @@ ${detail}` : ""}`
|
|
|
25161
26055
|
panel.append(heading, versions, status, actions, note);
|
|
25162
26056
|
let state;
|
|
25163
26057
|
let busy = false;
|
|
26058
|
+
let updating = false;
|
|
25164
26059
|
let unsupported = false;
|
|
25165
26060
|
const render = () => {
|
|
25166
26061
|
current.textContent = `${messages.harnessVersionCurrent}: ${state?.currentVersion ?? "\u2014"}`;
|
|
@@ -25174,6 +26069,8 @@ ${detail}` : ""}`
|
|
|
25174
26069
|
if (busy || unsupported || signal.aborted) return;
|
|
25175
26070
|
if (action === "update" && (!state?.canUpdate || !state.updateAvailable)) return;
|
|
25176
26071
|
busy = true;
|
|
26072
|
+
updating = action === "update";
|
|
26073
|
+
onChange();
|
|
25177
26074
|
status.textContent = action === "check" ? messages.harnessVersionChecking : messages.harnessVersionUpdating;
|
|
25178
26075
|
render();
|
|
25179
26076
|
try {
|
|
@@ -25188,7 +26085,11 @@ ${detail}` : ""}`
|
|
|
25188
26085
|
if (state) state = { ...state, canUpdate: false };
|
|
25189
26086
|
} finally {
|
|
25190
26087
|
busy = false;
|
|
25191
|
-
|
|
26088
|
+
updating = false;
|
|
26089
|
+
if (!signal.aborted) {
|
|
26090
|
+
render();
|
|
26091
|
+
onChange();
|
|
26092
|
+
}
|
|
25192
26093
|
}
|
|
25193
26094
|
};
|
|
25194
26095
|
update.addEventListener("click", () => void run("update"));
|
|
@@ -25218,7 +26119,43 @@ ${detail}` : ""}`
|
|
|
25218
26119
|
} else {
|
|
25219
26120
|
void run("check");
|
|
25220
26121
|
}
|
|
25221
|
-
return
|
|
26122
|
+
return {
|
|
26123
|
+
element: panel,
|
|
26124
|
+
get state() {
|
|
26125
|
+
return state;
|
|
26126
|
+
},
|
|
26127
|
+
get updating() {
|
|
26128
|
+
return updating;
|
|
26129
|
+
},
|
|
26130
|
+
update: () => void run("update")
|
|
26131
|
+
};
|
|
26132
|
+
}
|
|
26133
|
+
|
|
26134
|
+
// src/settings/connection-versions.ts
|
|
26135
|
+
function createConnectionVersions(document2, messages, signal, diagnostics, onChange) {
|
|
26136
|
+
const panels = /* @__PURE__ */ new Map();
|
|
26137
|
+
const installation = diagnostics?.installation?.bind(diagnostics);
|
|
26138
|
+
return {
|
|
26139
|
+
get(hostId2, agent) {
|
|
26140
|
+
if (!installation || signal.aborted) return void 0;
|
|
26141
|
+
const key = JSON.stringify([hostId2, agent]);
|
|
26142
|
+
let panel = panels.get(key);
|
|
26143
|
+
if (!panel) {
|
|
26144
|
+
panel = createHarnessVersionPanel(
|
|
26145
|
+
document2,
|
|
26146
|
+
messages,
|
|
26147
|
+
signal,
|
|
26148
|
+
agent,
|
|
26149
|
+
{
|
|
26150
|
+
run: (action) => installation(hostId2, agent, action)
|
|
26151
|
+
},
|
|
26152
|
+
onChange
|
|
26153
|
+
);
|
|
26154
|
+
panels.set(key, panel);
|
|
26155
|
+
}
|
|
26156
|
+
return panel;
|
|
26157
|
+
}
|
|
26158
|
+
};
|
|
25222
26159
|
}
|
|
25223
26160
|
|
|
25224
26161
|
// src/settings/connections-page.ts
|
|
@@ -25386,6 +26323,14 @@ ${error51.stderrTail}`] : []
|
|
|
25386
26323
|
status.dataset.connectionTone = connectionStatusTone(item.availability, item.error !== null);
|
|
25387
26324
|
status.setAttribute("role", "cell");
|
|
25388
26325
|
status.textContent = item.error?.code === "authenticationRequired" ? messages.connectionLoginRequired : item.error?.code === "configurationRequired" ? messages.connectionConfigurationRequired : connectionStatusLabel(item.availability, messages, item.error !== null);
|
|
26326
|
+
const version2 = item.version;
|
|
26327
|
+
if (version2?.state?.updateAvailable && !version2.updating) {
|
|
26328
|
+
const available = document2.createElement("span");
|
|
26329
|
+
available.className = "settings-connection-version-available";
|
|
26330
|
+
available.textContent = `${messages.harnessVersionAvailable}: ${harnessVersionLabel(version2.state, messages.harnessVersion)}`;
|
|
26331
|
+
available.title = `${messages.harnessVersionCurrent}: ${version2.state.currentVersion ?? "\u2014"}`;
|
|
26332
|
+
status.append(available);
|
|
26333
|
+
}
|
|
25389
26334
|
const action = document2.createElement("div");
|
|
25390
26335
|
action.className = "settings-connection-row__action";
|
|
25391
26336
|
action.setAttribute("role", "cell");
|
|
@@ -25415,6 +26360,23 @@ ${error51.stderrTail}`] : []
|
|
|
25415
26360
|
});
|
|
25416
26361
|
action.append(viewError);
|
|
25417
26362
|
}
|
|
26363
|
+
if (version2?.state?.updateAvailable && version2.state.canUpdate) {
|
|
26364
|
+
const update = document2.createElement("button");
|
|
26365
|
+
update.type = "button";
|
|
26366
|
+
update.className = "settings-connection-install-link";
|
|
26367
|
+
update.dataset.connectionAction = "update";
|
|
26368
|
+
update.disabled = version2.updating;
|
|
26369
|
+
update.title = messages.harnessVersionUpdate;
|
|
26370
|
+
update.setAttribute("aria-label", `${messages.harnessVersionUpdate}: ${item.name}`);
|
|
26371
|
+
update.append(createRendererSettingsIcon("download", 17));
|
|
26372
|
+
update.addEventListener("click", (event) => {
|
|
26373
|
+
event.stopPropagation();
|
|
26374
|
+
if (update.disabled) return;
|
|
26375
|
+
version2.update();
|
|
26376
|
+
select();
|
|
26377
|
+
});
|
|
26378
|
+
action.append(update);
|
|
26379
|
+
}
|
|
25418
26380
|
if (group) {
|
|
25419
26381
|
const toggle = document2.createElement("button");
|
|
25420
26382
|
toggle.type = "button";
|
|
@@ -25612,6 +26574,16 @@ ${error51.stderrTail}`] : []
|
|
|
25612
26574
|
});
|
|
25613
26575
|
body.append(launchControls);
|
|
25614
26576
|
}
|
|
26577
|
+
const getGrokComputerUse = diagnostics?.getGrokComputerUse?.bind(diagnostics);
|
|
26578
|
+
const setGrokComputerUse = diagnostics?.setGrokComputerUse?.bind(diagnostics);
|
|
26579
|
+
if (hostId2 === "local" && agent === "grok" && getGrokComputerUse && setGrokComputerUse) {
|
|
26580
|
+
body.append(
|
|
26581
|
+
createGrokComputerUseControls(document2, messages, {
|
|
26582
|
+
get: () => getGrokComputerUse(hostId2),
|
|
26583
|
+
set: (update) => setGrokComputerUse(hostId2, update)
|
|
26584
|
+
})
|
|
26585
|
+
);
|
|
26586
|
+
}
|
|
25615
26587
|
inspector.append(body);
|
|
25616
26588
|
return launchControls;
|
|
25617
26589
|
}
|
|
@@ -25703,8 +26675,6 @@ ${error51.stderrTail}`] : []
|
|
|
25703
26675
|
let selectedHostId = null;
|
|
25704
26676
|
let selectedItemKey = null;
|
|
25705
26677
|
let launchControls = null;
|
|
25706
|
-
const versionPanels = /* @__PURE__ */ new Map();
|
|
25707
|
-
const updatingVersions = /* @__PURE__ */ new Set();
|
|
25708
26678
|
const hostNames = /* @__PURE__ */ new Map();
|
|
25709
26679
|
let latestSnapshot = null;
|
|
25710
26680
|
let disposeHostScroller = () => void 0;
|
|
@@ -25733,6 +26703,13 @@ ${error51.stderrTail}`] : []
|
|
|
25733
26703
|
renderFrame = null;
|
|
25734
26704
|
};
|
|
25735
26705
|
const diagnostics = getDiagnostics();
|
|
26706
|
+
const versions = createConnectionVersions(
|
|
26707
|
+
document2,
|
|
26708
|
+
messages,
|
|
26709
|
+
context.signal,
|
|
26710
|
+
diagnostics,
|
|
26711
|
+
scheduleRender
|
|
26712
|
+
);
|
|
25736
26713
|
const installs = diagnostics ? harnessInstallStore(diagnostics) : null;
|
|
25737
26714
|
const runRefresh = () => {
|
|
25738
26715
|
if (pending || !diagnostics) return;
|
|
@@ -25869,10 +26846,13 @@ ${error51.stderrTail}`] : []
|
|
|
25869
26846
|
const agent = item.agentSnapshot?.agent;
|
|
25870
26847
|
if (!agent) return item;
|
|
25871
26848
|
const state = installs?.get(selectedHost.hostId, agent);
|
|
26849
|
+
const availability = state?.status ?? item.availability;
|
|
26850
|
+
const version2 = item.agentSnapshot?.availability !== "notInstalled" && availability !== "installing" && availability !== "checking" ? versions.get(selectedHost.hostId, agent) : void 0;
|
|
25872
26851
|
return {
|
|
25873
26852
|
...item,
|
|
25874
26853
|
...state ? { availability: state.status } : {},
|
|
25875
|
-
...
|
|
26854
|
+
...version2 ? { version: version2 } : {},
|
|
26855
|
+
...version2?.updating ? { availability: "updating" } : {},
|
|
25876
26856
|
...state?.error ? { installError: state.error } : {},
|
|
25877
26857
|
...diagnostics?.installation && harnessHasInstallCommands(item.agentSnapshot?.plugin) ? {
|
|
25878
26858
|
install: () => {
|
|
@@ -25909,30 +26889,7 @@ ${error51.stderrTail}`] : []
|
|
|
25909
26889
|
runRefresh
|
|
25910
26890
|
);
|
|
25911
26891
|
launchControls = { hostId: selectedHost.hostId, itemKey: item.key, element };
|
|
25912
|
-
|
|
25913
|
-
const installation = diagnostics?.installation?.bind(diagnostics);
|
|
25914
|
-
if (agent && item.agentSnapshot?.availability !== "notInstalled" && item.availability !== "installing" && item.availability !== "checking" && installation) {
|
|
25915
|
-
const key = JSON.stringify([selectedHost.hostId, agent]);
|
|
25916
|
-
let panel = versionPanels.get(key);
|
|
25917
|
-
if (!panel) {
|
|
25918
|
-
const hostId2 = selectedHost.hostId;
|
|
25919
|
-
panel = createHarnessVersionPanel(document2, messages, context.signal, agent, {
|
|
25920
|
-
async run(action) {
|
|
25921
|
-
if (action !== "update") return installation(hostId2, agent, action);
|
|
25922
|
-
updatingVersions.add(key);
|
|
25923
|
-
if (diagnostics) render(diagnostics.snapshot());
|
|
25924
|
-
try {
|
|
25925
|
-
return await installation(hostId2, agent, action);
|
|
25926
|
-
} finally {
|
|
25927
|
-
updatingVersions.delete(key);
|
|
25928
|
-
if (!context.signal.aborted && diagnostics) render(diagnostics.snapshot());
|
|
25929
|
-
}
|
|
25930
|
-
}
|
|
25931
|
-
});
|
|
25932
|
-
versionPanels.set(key, panel);
|
|
25933
|
-
}
|
|
25934
|
-
inspector.append(panel);
|
|
25935
|
-
}
|
|
26892
|
+
if (item.version) inspector.append(item.version.element);
|
|
25936
26893
|
};
|
|
25937
26894
|
const pinnedItem = items.find((item) => item.key === "renderer-adapter");
|
|
25938
26895
|
if (pinnedItem) {
|
|
@@ -26752,45 +27709,6 @@ ${error51.stderrTail}`] : []
|
|
|
26752
27709
|
});
|
|
26753
27710
|
}
|
|
26754
27711
|
|
|
26755
|
-
// src/renderer-cpa-live-voice-preference.ts
|
|
26756
|
-
var CPA_LIVE_VOICE_STORAGE_KEY = "codexhost.cpa-live-voice.v1";
|
|
26757
|
-
var CPA_LIVE_VOICE_CHANGE_EVENT = "codexhost:cpa-live-voice-changed";
|
|
26758
|
-
function readCpaLiveVoicePreference(owner) {
|
|
26759
|
-
try {
|
|
26760
|
-
return owner.localStorage.getItem(CPA_LIVE_VOICE_STORAGE_KEY) !== "0";
|
|
26761
|
-
} catch {
|
|
26762
|
-
return true;
|
|
26763
|
-
}
|
|
26764
|
-
}
|
|
26765
|
-
function writeCpaLiveVoicePreference(owner, enabled) {
|
|
26766
|
-
try {
|
|
26767
|
-
owner.localStorage.setItem(CPA_LIVE_VOICE_STORAGE_KEY, enabled ? "1" : "0");
|
|
26768
|
-
} catch {
|
|
26769
|
-
return false;
|
|
26770
|
-
}
|
|
26771
|
-
owner.dispatchEvent(new Event(CPA_LIVE_VOICE_CHANGE_EVENT));
|
|
26772
|
-
return true;
|
|
26773
|
-
}
|
|
26774
|
-
|
|
26775
|
-
// src/renderer-cpa-live-voice-hook.ts
|
|
26776
|
-
var CPA_LIVE_VOICE_HOOK_GLOBAL = "__codexhostCpaLiveVoiceHookV1";
|
|
26777
|
-
function isRecord3(value) {
|
|
26778
|
-
return typeof value === "object" && value !== null;
|
|
26779
|
-
}
|
|
26780
|
-
function readCpaLiveVoiceHookConfig(globalObject) {
|
|
26781
|
-
const value = globalObject[CPA_LIVE_VOICE_HOOK_GLOBAL];
|
|
26782
|
-
if (!isRecord3(value) || value.enabled !== true) return null;
|
|
26783
|
-
if (typeof value.auditedDesktopVersion !== "string" || typeof value.auditedAppInitialAsset !== "string") {
|
|
26784
|
-
return null;
|
|
26785
|
-
}
|
|
26786
|
-
return {
|
|
26787
|
-
enabled: true,
|
|
26788
|
-
auditedDesktopVersion: value.auditedDesktopVersion,
|
|
26789
|
-
auditedAppInitialAsset: value.auditedAppInitialAsset,
|
|
26790
|
-
...typeof value.desktopVersion === "string" ? { desktopVersion: value.desktopVersion } : {}
|
|
26791
|
-
};
|
|
26792
|
-
}
|
|
26793
|
-
|
|
26794
27712
|
// src/renderer-codex-usage-banner-preference.ts
|
|
26795
27713
|
var CODEX_USAGE_BANNER_STORAGE_KEY = "codexhost.codex-usage-banner-hidden.v1";
|
|
26796
27714
|
var CODEX_USAGE_BANNER_CHANGE_EVENT = "codexhost:codex-usage-banner-changed";
|
|
@@ -27103,31 +28021,6 @@ ${error51.stderrTail}`] : []
|
|
|
27103
28021
|
ownerWindow.addEventListener(CODEX_USAGE_BANNER_CHANGE_EVENT, syncUsageBanner);
|
|
27104
28022
|
usageBannerRow.item.append(usageBanner);
|
|
27105
28023
|
card.append(usageBannerRow.item);
|
|
27106
|
-
const liveVoiceId = preferenceId("cpa-live-voice");
|
|
27107
|
-
const liveVoiceRow = createPreferenceItem(document2, {
|
|
27108
|
-
title: messages.cpaLiveVoiceTitle,
|
|
27109
|
-
description: messages.cpaLiveVoiceDescription,
|
|
27110
|
-
controlId: liveVoiceId,
|
|
27111
|
-
help: { label: messages.cpaLiveVoiceHelpLabel, lines: messages.cpaLiveVoiceHelp }
|
|
27112
|
-
});
|
|
27113
|
-
const liveVoice = createPreferenceSwitch(document2, liveVoiceId, liveVoiceRow.description.id);
|
|
27114
|
-
liveVoice.checked = readCpaLiveVoicePreference(ownerWindow);
|
|
27115
|
-
liveVoice.addEventListener("change", () => {
|
|
27116
|
-
writeCpaLiveVoicePreference(ownerWindow, liveVoice.checked);
|
|
27117
|
-
});
|
|
27118
|
-
const syncLiveVoice = () => {
|
|
27119
|
-
liveVoice.checked = readCpaLiveVoicePreference(ownerWindow);
|
|
27120
|
-
};
|
|
27121
|
-
ownerWindow.addEventListener(CPA_LIVE_VOICE_CHANGE_EVENT, syncLiveVoice);
|
|
27122
|
-
liveVoiceRow.item.append(liveVoice);
|
|
27123
|
-
if (!readCpaLiveVoiceHookConfig(ownerWindow)) {
|
|
27124
|
-
const warning = document2.createElement("div");
|
|
27125
|
-
warning.className = "text-xs leading-[18px] text-settings-warning";
|
|
27126
|
-
warning.setAttribute("role", "status");
|
|
27127
|
-
warning.textContent = messages.cpaLiveVoiceRestartRequired;
|
|
27128
|
-
liveVoiceRow.description.after(warning);
|
|
27129
|
-
}
|
|
27130
|
-
card.append(liveVoiceRow.item);
|
|
27131
28024
|
const softWrapId = preferenceId("reasoning-soft-wrap");
|
|
27132
28025
|
const row = createPreferenceItem(document2, {
|
|
27133
28026
|
title: messages.reasoningSoftWrapTitle,
|
|
@@ -27153,7 +28046,6 @@ ${error51.stderrTail}`] : []
|
|
|
27153
28046
|
);
|
|
27154
28047
|
return () => {
|
|
27155
28048
|
ownerWindow.removeEventListener(CODEX_USAGE_BANNER_CHANGE_EVENT, syncUsageBanner);
|
|
27156
|
-
ownerWindow.removeEventListener(CPA_LIVE_VOICE_CHANGE_EVENT, syncLiveVoice);
|
|
27157
28049
|
ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
27158
28050
|
disposeIdleRelease();
|
|
27159
28051
|
};
|
|
@@ -29326,7 +30218,7 @@ ${error51.stderrTail}`] : []
|
|
|
29326
30218
|
}
|
|
29327
30219
|
});
|
|
29328
30220
|
}
|
|
29329
|
-
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, getRemoteConnections = () => null, requestUsageStatistics = () => Promise.reject(new Error("Local Host connection is unavailable"))) {
|
|
30221
|
+
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, getRemoteConnections = () => null, requestUsageStatistics = () => Promise.reject(new Error("Local Host connection is unavailable")), requestVoiceSettings = () => Promise.reject(new Error("Local Host connection is unavailable"))) {
|
|
29330
30222
|
return Object.freeze([
|
|
29331
30223
|
createConnectionsSettingsPage(messages, getDiagnostics, void 0, getRemoteConnections),
|
|
29332
30224
|
createRemoteConnectionsPage(messages, getRemoteConnections),
|
|
@@ -29343,6 +30235,7 @@ ${error51.stderrTail}`] : []
|
|
|
29343
30235
|
messages.locale
|
|
29344
30236
|
),
|
|
29345
30237
|
createAppearanceSettingsPage(messages, getLoadedSessionsClient),
|
|
30238
|
+
createVoiceSettingsPage(messages.locale, requestVoiceSettings, { desktop: true }),
|
|
29346
30239
|
updatesPage(messages, getUpdateClient),
|
|
29347
30240
|
aboutPage(messages, getUpdateClient)
|
|
29348
30241
|
]);
|
|
@@ -30322,6 +31215,17 @@ ${error51.stderrTail}`] : []
|
|
|
30322
31215
|
line-height: 18px;
|
|
30323
31216
|
}
|
|
30324
31217
|
|
|
31218
|
+
.settings-connection-row__status:has(.settings-connection-version-available) {
|
|
31219
|
+
flex-wrap: wrap;
|
|
31220
|
+
max-width: 160px;
|
|
31221
|
+
}
|
|
31222
|
+
|
|
31223
|
+
.settings-connection-version-available {
|
|
31224
|
+
flex-basis: 100%;
|
|
31225
|
+
color: var(--settings-focus);
|
|
31226
|
+
overflow-wrap: anywhere;
|
|
31227
|
+
}
|
|
31228
|
+
|
|
30325
31229
|
.settings-connection-row__status::before {
|
|
30326
31230
|
width: 6px;
|
|
30327
31231
|
height: 6px;
|
|
@@ -30665,6 +31569,69 @@ ${error51.stderrTail}`] : []
|
|
|
30665
31569
|
gap: 8px;
|
|
30666
31570
|
}
|
|
30667
31571
|
|
|
31572
|
+
.settings-grok-computer-use {
|
|
31573
|
+
display: grid;
|
|
31574
|
+
gap: 10px;
|
|
31575
|
+
min-width: 0;
|
|
31576
|
+
margin-top: 4px;
|
|
31577
|
+
padding: 12px;
|
|
31578
|
+
background: var(--settings-surface);
|
|
31579
|
+
border: 1px solid var(--settings-divider);
|
|
31580
|
+
border-radius: 12px;
|
|
31581
|
+
}
|
|
31582
|
+
|
|
31583
|
+
.settings-grok-computer-use__header {
|
|
31584
|
+
display: flex;
|
|
31585
|
+
align-items: flex-start;
|
|
31586
|
+
justify-content: space-between;
|
|
31587
|
+
gap: 12px;
|
|
31588
|
+
}
|
|
31589
|
+
|
|
31590
|
+
.settings-grok-computer-use__copy {
|
|
31591
|
+
display: grid;
|
|
31592
|
+
gap: 4px;
|
|
31593
|
+
min-width: 0;
|
|
31594
|
+
}
|
|
31595
|
+
|
|
31596
|
+
.settings-grok-computer-use__title {
|
|
31597
|
+
margin: 0;
|
|
31598
|
+
color: var(--settings-text);
|
|
31599
|
+
font-size: 14px;
|
|
31600
|
+
font-weight: 600;
|
|
31601
|
+
line-height: 20px;
|
|
31602
|
+
}
|
|
31603
|
+
|
|
31604
|
+
.settings-grok-computer-use__description {
|
|
31605
|
+
margin: 0;
|
|
31606
|
+
color: var(--settings-muted);
|
|
31607
|
+
font-size: 13px;
|
|
31608
|
+
line-height: 18px;
|
|
31609
|
+
overflow-wrap: anywhere;
|
|
31610
|
+
}
|
|
31611
|
+
|
|
31612
|
+
.settings-grok-computer-use__help,
|
|
31613
|
+
.settings-grok-computer-use__status {
|
|
31614
|
+
margin: 0;
|
|
31615
|
+
color: var(--settings-subtle);
|
|
31616
|
+
font-size: 12px;
|
|
31617
|
+
line-height: 16px;
|
|
31618
|
+
overflow-wrap: anywhere;
|
|
31619
|
+
}
|
|
31620
|
+
|
|
31621
|
+
.settings-grok-computer-use__help {
|
|
31622
|
+
padding-top: 8px;
|
|
31623
|
+
border-top: 1px solid var(--settings-divider);
|
|
31624
|
+
}
|
|
31625
|
+
|
|
31626
|
+
.settings-grok-computer-use__browser {
|
|
31627
|
+
padding-top: 8px;
|
|
31628
|
+
border-top: 1px solid var(--settings-divider);
|
|
31629
|
+
}
|
|
31630
|
+
|
|
31631
|
+
.settings-grok-computer-use__status[data-state="on"] {
|
|
31632
|
+
color: var(--settings-success);
|
|
31633
|
+
}
|
|
31634
|
+
|
|
30668
31635
|
.settings-connection-install-callout {
|
|
30669
31636
|
display: grid;
|
|
30670
31637
|
grid-template-columns: 28px minmax(0, 1fr);
|
|
@@ -31885,10 +32852,114 @@ ${error51.stderrTail}`] : []
|
|
|
31885
32852
|
animation: none !important;
|
|
31886
32853
|
}
|
|
31887
32854
|
}
|
|
32855
|
+
.settings-voice__select {
|
|
32856
|
+
flex: none;
|
|
32857
|
+
width: 190px;
|
|
32858
|
+
max-width: 100%;
|
|
32859
|
+
min-height: 34px;
|
|
32860
|
+
padding: 6px 10px;
|
|
32861
|
+
border: 1px solid var(--settings-border);
|
|
32862
|
+
border-radius: 6px;
|
|
32863
|
+
color: var(--settings-text);
|
|
32864
|
+
background: var(--settings-panel);
|
|
32865
|
+
font: inherit;
|
|
32866
|
+
font-size: 13px;
|
|
32867
|
+
}
|
|
32868
|
+
|
|
32869
|
+
.settings-voice :disabled {
|
|
32870
|
+
opacity: 0.45;
|
|
32871
|
+
cursor: not-allowed;
|
|
32872
|
+
}
|
|
32873
|
+
.settings-voice__footer {
|
|
32874
|
+
display: flex;
|
|
32875
|
+
align-items: center;
|
|
32876
|
+
justify-content: space-between;
|
|
32877
|
+
flex-wrap: wrap;
|
|
32878
|
+
gap: 16px;
|
|
32879
|
+
margin-top: 28px;
|
|
32880
|
+
padding-top: 18px;
|
|
32881
|
+
border-top: 1px solid var(--settings-divider);
|
|
32882
|
+
font-size: 13px;
|
|
32883
|
+
}
|
|
32884
|
+
.settings-voice__health {
|
|
32885
|
+
display: grid;
|
|
32886
|
+
gap: 4px;
|
|
32887
|
+
margin: 8px 12px 12px;
|
|
32888
|
+
color: var(--settings-subtle);
|
|
32889
|
+
font-size: 12px;
|
|
32890
|
+
line-height: 16px;
|
|
32891
|
+
}
|
|
32892
|
+
|
|
32893
|
+
.settings-voice__health p {
|
|
32894
|
+
margin: 0;
|
|
32895
|
+
}
|
|
32896
|
+
|
|
32897
|
+
.settings-voice__footer p,
|
|
32898
|
+
.settings-voice__hint {
|
|
32899
|
+
margin: 4px 0 0;
|
|
32900
|
+
color: var(--settings-muted);
|
|
32901
|
+
font-size: 12px;
|
|
32902
|
+
line-height: 18px;
|
|
32903
|
+
}
|
|
32904
|
+
.settings-voice__actions,
|
|
32905
|
+
.settings-voice__gateway-actions {
|
|
32906
|
+
display: flex;
|
|
32907
|
+
align-items: center;
|
|
32908
|
+
flex-wrap: wrap;
|
|
32909
|
+
gap: 12px;
|
|
32910
|
+
}
|
|
32911
|
+
.settings-voice__gateway-actions {
|
|
32912
|
+
color: var(--settings-muted);
|
|
32913
|
+
font-size: 12px;
|
|
32914
|
+
}
|
|
32915
|
+
.settings-voice__details {
|
|
32916
|
+
padding: 12px 16px;
|
|
32917
|
+
border-top: 1px solid var(--settings-divider);
|
|
32918
|
+
color: var(--settings-muted);
|
|
32919
|
+
font-size: 12px;
|
|
32920
|
+
line-height: 18px;
|
|
32921
|
+
overflow-wrap: anywhere;
|
|
32922
|
+
}
|
|
32923
|
+
.settings-voice__confirmation {
|
|
32924
|
+
margin-top: 12px;
|
|
32925
|
+
font-size: 13px;
|
|
32926
|
+
line-height: 20px;
|
|
32927
|
+
}
|
|
32928
|
+
.settings-voice__confirmation button + button {
|
|
32929
|
+
margin-left: 8px;
|
|
32930
|
+
}
|
|
32931
|
+
.settings-voice [role="alert"] {
|
|
32932
|
+
color: var(--settings-danger);
|
|
32933
|
+
font-size: 13px;
|
|
32934
|
+
overflow-wrap: anywhere;
|
|
32935
|
+
}
|
|
32936
|
+
.settings-voice {
|
|
32937
|
+
container-type: inline-size;
|
|
32938
|
+
}
|
|
32939
|
+
@container (max-width: 620px) {
|
|
32940
|
+
.settings-voice__row {
|
|
32941
|
+
align-items: stretch;
|
|
32942
|
+
flex-direction: column;
|
|
32943
|
+
gap: 10px;
|
|
32944
|
+
}
|
|
32945
|
+
.settings-voice__select {
|
|
32946
|
+
width: 100%;
|
|
32947
|
+
}
|
|
32948
|
+
.settings-voice__row input[role="switch"] {
|
|
32949
|
+
align-self: flex-start;
|
|
32950
|
+
}
|
|
32951
|
+
.settings-voice__footer {
|
|
32952
|
+
align-items: stretch;
|
|
32953
|
+
flex-direction: column;
|
|
32954
|
+
}
|
|
32955
|
+
.settings-voice__actions > button {
|
|
32956
|
+
flex: 1;
|
|
32957
|
+
}
|
|
32958
|
+
}
|
|
31888
32959
|
`;
|
|
31889
32960
|
|
|
31890
32961
|
// src/settings/tailwind.css
|
|
31891
|
-
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}.fixed{position:fixed}.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}.list-item{display:list-item}.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)}.text-settings-warning{color:var(--settings-warning)}.lowercase{text-transform:lowercase}.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,.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';
|
|
32962
|
+
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}.fixed{position:fixed}.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}.list-item{display:list-item}.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)}.lowercase{text-transform:lowercase}.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,.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';
|
|
31892
32963
|
|
|
31893
32964
|
// src/console/app.ts
|
|
31894
32965
|
function required2(pages, id) {
|
|
@@ -31970,6 +33041,8 @@ ${error51.stderrTail}`] : []
|
|
|
31970
33041
|
(method, params) => manager.sendRequest(method, params)
|
|
31971
33042
|
);
|
|
31972
33043
|
const navigate = (pageId) => {
|
|
33044
|
+
navigation.classList.remove("is-open");
|
|
33045
|
+
menu.setAttribute("aria-expanded", "false");
|
|
31973
33046
|
window.location.hash = pageId;
|
|
31974
33047
|
};
|
|
31975
33048
|
const sections = [
|
|
@@ -31994,6 +33067,11 @@ ${error51.stderrTail}`] : []
|
|
|
31994
33067
|
hostPage(required2(settingsPages, "accounts"), messages, state),
|
|
31995
33068
|
hostPage(required2(settingsPages, "session-import"), messages, state),
|
|
31996
33069
|
hostPage(required2(settingsPages, "usage-statistics"), messages, state),
|
|
33070
|
+
createVoiceSettingsPage(
|
|
33071
|
+
locale,
|
|
33072
|
+
(input) => consolePost("/api/voice-settings", input, AbortSignal.timeout(1e4)),
|
|
33073
|
+
{ id: "live-voice" }
|
|
33074
|
+
),
|
|
31997
33075
|
required2(settingsPages, "updates")
|
|
31998
33076
|
]
|
|
31999
33077
|
},
|
|
@@ -32076,6 +33154,32 @@ ${console_default}`
|
|
|
32076
33154
|
createRendererSettingsIcon("alert", 16),
|
|
32077
33155
|
h(document2, "span", {}, `${messages.consoleOffline} \xB7 ${messages.consoleOfflineBody}`)
|
|
32078
33156
|
);
|
|
33157
|
+
const menu = h(
|
|
33158
|
+
document2,
|
|
33159
|
+
"button",
|
|
33160
|
+
{
|
|
33161
|
+
type: "button",
|
|
33162
|
+
className: "console-menu-button settings-command-button settings-command-button--secondary",
|
|
33163
|
+
"aria-label": settingsMessages.sectionsLabel,
|
|
33164
|
+
"aria-expanded": "false",
|
|
33165
|
+
"aria-controls": "console-navigation"
|
|
33166
|
+
},
|
|
33167
|
+
"\u2630"
|
|
33168
|
+
);
|
|
33169
|
+
navigation.id = "console-navigation";
|
|
33170
|
+
menu.addEventListener("click", () => {
|
|
33171
|
+
const open = menu.getAttribute("aria-expanded") !== "true";
|
|
33172
|
+
menu.setAttribute("aria-expanded", String(open));
|
|
33173
|
+
navigation.classList.toggle("is-open", open);
|
|
33174
|
+
});
|
|
33175
|
+
navigation.addEventListener("keydown", (event) => {
|
|
33176
|
+
if (event.key === "Escape") {
|
|
33177
|
+
navigation.classList.remove("is-open");
|
|
33178
|
+
menu.setAttribute("aria-expanded", "false");
|
|
33179
|
+
menu.focus();
|
|
33180
|
+
}
|
|
33181
|
+
});
|
|
33182
|
+
brand.append(menu);
|
|
32079
33183
|
shadow.append(
|
|
32080
33184
|
h(
|
|
32081
33185
|
document2,
|
|
@@ -32111,6 +33215,8 @@ ${console_default}`
|
|
|
32111
33215
|
const pageId = pages.has(requested) ? requested : "overview";
|
|
32112
33216
|
if (pageId === activeId) return;
|
|
32113
33217
|
activeId = pageId;
|
|
33218
|
+
navigation.classList.remove("is-open");
|
|
33219
|
+
menu.setAttribute("aria-expanded", "false");
|
|
32114
33220
|
scope?.dispose();
|
|
32115
33221
|
try {
|
|
32116
33222
|
cleanup?.();
|