@karlorz/codexhost-cli-win32-x64 0.13.3-4 → 0.13.3-6
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 +432 -31
- package/app/console-web.js +806 -186
- package/app/cpa-live-voice-hook.js +16310 -31
- package/app/desktop-controller.mjs +147 -37
- package/app/host-runtime.mjs +3535 -3126
- package/app/plugins/antigravity/plugin.mjs +77 -0
- package/app/plugins/claude-code/plugin.mjs +152 -29
- package/app/plugins/codebuddy/plugin.mjs +109 -32
- package/app/plugins/codex-usage/plugin.mjs +77 -0
- package/app/plugins/cursor-cli/plugin.mjs +120 -43
- package/app/plugins/deepseek-harness/plugin.mjs +82 -5
- package/app/plugins/grok/plugin.mjs +138 -24
- package/app/plugins/hermes/plugin.mjs +77 -0
- package/app/plugins/kimi-code/plugin.mjs +99 -22
- package/app/plugins/kiro-cli/plugin.mjs +99 -22
- package/app/plugins/omp/plugin.mjs +92 -15
- package/app/plugins/opencode/plugin.mjs +77 -0
- package/app/plugins/pi/plugin.mjs +98 -21
- package/app/plugins/qoder/plugin.mjs +85 -8
- package/app/plugins/qoder-cn/plugin.mjs +85 -8
- package/app/plugins/workbuddy/plugin.mjs +109 -32
- package/app/plugins/zcode/plugin.mjs +100 -23
- package/app/renderer-extension.js +2238 -860
- 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
|
@@ -14887,6 +14887,36 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14887
14887
|
var threadPrewarmDiscardParamsSchema = external_exports.object({ threadId: hostThreadIdSchema });
|
|
14888
14888
|
var threadPrewarmDiscardResultSchema = external_exports.object({ discarded: external_exports.boolean() });
|
|
14889
14889
|
|
|
14890
|
+
// ../shared-contracts/dist/realtime-call.js
|
|
14891
|
+
var REALTIME_CALL_FORWARDED_HEADERS = [
|
|
14892
|
+
"openai-alpha",
|
|
14893
|
+
"thread-id",
|
|
14894
|
+
"session-id",
|
|
14895
|
+
"originator",
|
|
14896
|
+
"x-codex-turn-metadata"
|
|
14897
|
+
];
|
|
14898
|
+
var FORWARDED_HEADERS = new Set(REALTIME_CALL_FORWARDED_HEADERS);
|
|
14899
|
+
var REALTIME_CALL_ID_PATTERN = /^rtc_[A-Za-z0-9_-]{1,128}$/u;
|
|
14900
|
+
var requestId = external_exports.string().min(1).max(128);
|
|
14901
|
+
var realtimeCallParamsSchema = external_exports.discriminatedUnion("operation", [
|
|
14902
|
+
external_exports.object({
|
|
14903
|
+
operation: external_exports.literal("create"),
|
|
14904
|
+
requestId,
|
|
14905
|
+
body: external_exports.string().min(1).max(16 << 20),
|
|
14906
|
+
headers: external_exports.record(external_exports.string(), external_exports.string()).default({})
|
|
14907
|
+
}),
|
|
14908
|
+
external_exports.object({ operation: external_exports.literal("cancel"), requestId }),
|
|
14909
|
+
external_exports.object({
|
|
14910
|
+
operation: external_exports.literal("hangup"),
|
|
14911
|
+
callId: external_exports.string().regex(REALTIME_CALL_ID_PATTERN)
|
|
14912
|
+
})
|
|
14913
|
+
]);
|
|
14914
|
+
var realtimeCallResponseSchema = external_exports.object({
|
|
14915
|
+
status: external_exports.number().int().min(200).max(599),
|
|
14916
|
+
body: external_exports.string(),
|
|
14917
|
+
headers: external_exports.record(external_exports.string(), external_exports.string())
|
|
14918
|
+
});
|
|
14919
|
+
|
|
14890
14920
|
// ../shared-contracts/dist/console.js
|
|
14891
14921
|
var consoleAnnouncementSchema = external_exports.strictObject({
|
|
14892
14922
|
title: external_exports.string().trim().min(1).max(200),
|
|
@@ -14900,6 +14930,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
14900
14930
|
url: external_exports.string().max(2048).regex(/^http:\/\/(?:127\.0\.0\.1|localhost):\d{1,5}\/(?:\?.*)?$/u)
|
|
14901
14931
|
});
|
|
14902
14932
|
var CONSOLE_HOST_METHODS = Object.freeze([
|
|
14933
|
+
"codexhost/voice/gateway-status",
|
|
14903
14934
|
"codexhost/console/remote-connections",
|
|
14904
14935
|
"codexhost/runtime/status",
|
|
14905
14936
|
"codexhost/remote/ssh-setup",
|
|
@@ -16016,6 +16047,52 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16016
16047
|
external_exports.strictObject({ error: external_exports.strictObject({ code: external_exports.number().int(), message: external_exports.string() }) })
|
|
16017
16048
|
]);
|
|
16018
16049
|
|
|
16050
|
+
// ../shared-contracts/dist/voice-settings.js
|
|
16051
|
+
var voiceRoutesSchema = external_exports.strictObject({
|
|
16052
|
+
chatExperience: external_exports.enum(["chatgpt", "codex"]),
|
|
16053
|
+
chatConnection: external_exports.enum(["desktop", "gateway"]),
|
|
16054
|
+
workConnection: external_exports.enum(["desktop", "gateway"])
|
|
16055
|
+
});
|
|
16056
|
+
var DEFAULT_VOICE_ROUTES = Object.freeze({
|
|
16057
|
+
chatExperience: "chatgpt",
|
|
16058
|
+
chatConnection: "desktop",
|
|
16059
|
+
workConnection: "gateway"
|
|
16060
|
+
});
|
|
16061
|
+
var voiceSettingsSchema = voiceRoutesSchema.extend({ inject: external_exports.boolean() });
|
|
16062
|
+
var voiceSettingsRequestSchema = external_exports.discriminatedUnion("operation", [
|
|
16063
|
+
external_exports.strictObject({
|
|
16064
|
+
operation: external_exports.literal("get"),
|
|
16065
|
+
runtime: external_exports.strictObject({
|
|
16066
|
+
id: external_exports.string().uuid(),
|
|
16067
|
+
revision: external_exports.string().max(64),
|
|
16068
|
+
activeCall: external_exports.boolean()
|
|
16069
|
+
}).optional()
|
|
16070
|
+
}),
|
|
16071
|
+
external_exports.strictObject({ operation: external_exports.literal("migrate"), routes: voiceRoutesSchema }),
|
|
16072
|
+
external_exports.strictObject({
|
|
16073
|
+
operation: external_exports.literal("set"),
|
|
16074
|
+
settings: voiceSettingsSchema,
|
|
16075
|
+
revision: external_exports.string().max(64)
|
|
16076
|
+
}),
|
|
16077
|
+
external_exports.strictObject({ operation: external_exports.literal("restart"), confirm: external_exports.literal(true) })
|
|
16078
|
+
]);
|
|
16079
|
+
var voiceSettingsStateSchema = external_exports.strictObject({
|
|
16080
|
+
settings: voiceSettingsSchema,
|
|
16081
|
+
initialized: external_exports.boolean(),
|
|
16082
|
+
revision: external_exports.string(),
|
|
16083
|
+
activeInject: external_exports.boolean().nullable(),
|
|
16084
|
+
envOverride: external_exports.enum(["0", "1"]).nullable(),
|
|
16085
|
+
activeEnvOverride: external_exports.enum(["0", "1"]).nullable(),
|
|
16086
|
+
routesActive: external_exports.boolean().nullable(),
|
|
16087
|
+
activeCall: external_exports.boolean().nullable(),
|
|
16088
|
+
gatewayReady: external_exports.boolean().nullable(),
|
|
16089
|
+
restartAvailable: external_exports.boolean(),
|
|
16090
|
+
restart: external_exports.strictObject({
|
|
16091
|
+
phase: external_exports.enum(["idle", "restarting", "succeeded", "failed"]),
|
|
16092
|
+
error: external_exports.string().nullable()
|
|
16093
|
+
})
|
|
16094
|
+
});
|
|
16095
|
+
|
|
16019
16096
|
// ../shared-contracts/dist/index.js
|
|
16020
16097
|
var workspaceContractVersionSchema = external_exports.literal(WORKSPACE_CONTRACT_VERSION);
|
|
16021
16098
|
|
|
@@ -17020,7 +17097,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
17020
17097
|
}
|
|
17021
17098
|
|
|
17022
17099
|
// src/console/console.css
|
|
17023
|
-
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)
|
|
17100
|
+
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';
|
|
17024
17101
|
|
|
17025
17102
|
// src/console/components.css
|
|
17026
17103
|
var components_default = `/* Shared blocks */
|
|
@@ -17059,6 +17136,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
17059
17136
|
gap: 8px;
|
|
17060
17137
|
}
|
|
17061
17138
|
|
|
17139
|
+
.console-restart {
|
|
17140
|
+
width: 100%;
|
|
17141
|
+
min-width: 0;
|
|
17142
|
+
}
|
|
17143
|
+
|
|
17144
|
+
.console-restart > p {
|
|
17145
|
+
flex-basis: 100%;
|
|
17146
|
+
margin: 0;
|
|
17147
|
+
overflow-wrap: anywhere;
|
|
17148
|
+
}
|
|
17149
|
+
|
|
17062
17150
|
.console-muted {
|
|
17063
17151
|
margin: 0;
|
|
17064
17152
|
color: var(--settings-muted);
|
|
@@ -18230,6 +18318,12 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18230
18318
|
stopped: "codexhost is not running",
|
|
18231
18319
|
stoppedDetail: "Start codexhost to use Codex Desktop with your Harnesses.",
|
|
18232
18320
|
start: "Start codexhost",
|
|
18321
|
+
restart: "Restart codexhost",
|
|
18322
|
+
restartConfirm: "Restart now",
|
|
18323
|
+
restartCancel: "Cancel",
|
|
18324
|
+
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.",
|
|
18325
|
+
restarting: "Restarting codexhost\u2026 Waiting for the new Desktop controller.",
|
|
18326
|
+
restarted: "Restart complete. The new Desktop controller is ready.",
|
|
18233
18327
|
starting: "Starting\u2026",
|
|
18234
18328
|
startingTitle: "codexhost is starting",
|
|
18235
18329
|
startingDetail: "Preparing Codex Desktop. Please wait; there is no need to start it again.",
|
|
@@ -18413,6 +18507,12 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18413
18507
|
stopped: "codexhost \u672A\u8FD0\u884C",
|
|
18414
18508
|
stoppedDetail: "\u542F\u52A8 codexhost \u540E\u5373\u53EF\u5728 Codex Desktop \u4E2D\u4F7F\u7528\u5404\u4E2A Harness\u3002",
|
|
18415
18509
|
start: "\u542F\u52A8 codexhost",
|
|
18510
|
+
restart: "\u91CD\u65B0\u542F\u52A8 codexhost",
|
|
18511
|
+
restartConfirm: "\u7ACB\u5373\u91CD\u65B0\u542F\u52A8",
|
|
18512
|
+
restartCancel: "\u53D6\u6D88",
|
|
18513
|
+
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",
|
|
18514
|
+
restarting: "\u6B63\u5728\u91CD\u65B0\u542F\u52A8 codexhost\u2026 \u7B49\u5F85\u65B0\u7684 Desktop \u63A7\u5236\u5668\u3002",
|
|
18515
|
+
restarted: "\u91CD\u65B0\u542F\u52A8\u5B8C\u6210\u3002\u65B0\u7684 Desktop \u63A7\u5236\u5668\u5DF2\u5C31\u7EEA\u3002",
|
|
18416
18516
|
starting: "\u6B63\u5728\u542F\u52A8\u2026",
|
|
18417
18517
|
startingTitle: "codexhost \u6B63\u5728\u542F\u52A8",
|
|
18418
18518
|
startingDetail: "\u6B63\u5728\u51C6\u5907 Codex Desktop\uFF0C\u8BF7\u7A0D\u5019\uFF0C\u65E0\u9700\u91CD\u590D\u542F\u52A8\u3002",
|
|
@@ -18816,6 +18916,555 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18816
18916
|
});
|
|
18817
18917
|
}
|
|
18818
18918
|
|
|
18919
|
+
// src/voice-settings-sync.ts
|
|
18920
|
+
function desktopVoiceCallActive(owner) {
|
|
18921
|
+
const hook = Reflect.get(owner, "__codexhostNativeChatVoiceV1");
|
|
18922
|
+
if (hook?.activeCall) return true;
|
|
18923
|
+
return [
|
|
18924
|
+
...owner.document.querySelectorAll(
|
|
18925
|
+
'button[aria-label="End Voice"],button[aria-label="End voice"],button[aria-label="End voice chat"]'
|
|
18926
|
+
)
|
|
18927
|
+
].some((button2) => button2.getBoundingClientRect().width > 0);
|
|
18928
|
+
}
|
|
18929
|
+
|
|
18930
|
+
// src/settings/preference-ui.ts
|
|
18931
|
+
var nextPreferenceId = 0;
|
|
18932
|
+
function preferenceId(prefix) {
|
|
18933
|
+
nextPreferenceId += 1;
|
|
18934
|
+
return `codexhost-${prefix}-${nextPreferenceId}`;
|
|
18935
|
+
}
|
|
18936
|
+
function createPreferenceGroup(document2, title) {
|
|
18937
|
+
const group = document2.createElement("section");
|
|
18938
|
+
group.className = "mt-7 first-of-type:mt-0";
|
|
18939
|
+
const header = document2.createElement("div");
|
|
18940
|
+
header.className = "mb-2 flex min-h-6 items-center gap-2 px-1";
|
|
18941
|
+
const heading = document2.createElement("h3");
|
|
18942
|
+
heading.id = preferenceId("preference-group");
|
|
18943
|
+
heading.className = "m-0 text-[13px] leading-5 font-semibold text-settings-text";
|
|
18944
|
+
heading.textContent = title;
|
|
18945
|
+
header.append(heading);
|
|
18946
|
+
const card = document2.createElement("div");
|
|
18947
|
+
card.className = "rounded-[10px] border border-settings-border bg-settings-panel";
|
|
18948
|
+
group.setAttribute("aria-labelledby", heading.id);
|
|
18949
|
+
group.append(header, card);
|
|
18950
|
+
return { group, header, card };
|
|
18951
|
+
}
|
|
18952
|
+
function createPreferenceItem(document2, input) {
|
|
18953
|
+
const item = document2.createElement("div");
|
|
18954
|
+
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";
|
|
18955
|
+
const copy = document2.createElement("div");
|
|
18956
|
+
copy.className = "flex min-w-0 flex-col gap-0.5";
|
|
18957
|
+
const heading = document2.createElement("div");
|
|
18958
|
+
heading.className = "flex items-center gap-1.5";
|
|
18959
|
+
const title = document2.createElement("label");
|
|
18960
|
+
title.htmlFor = input.controlId;
|
|
18961
|
+
title.className = "cursor-pointer text-[13px] leading-5 font-medium text-settings-text";
|
|
18962
|
+
title.textContent = input.title;
|
|
18963
|
+
heading.append(title);
|
|
18964
|
+
if (input.help) heading.append(createHelpTooltip(document2, input.help.label, input.help.lines));
|
|
18965
|
+
const description = document2.createElement("div");
|
|
18966
|
+
description.id = preferenceId("preference-description");
|
|
18967
|
+
description.className = "text-xs leading-[18px] text-settings-muted data-[invalid=true]:text-settings-danger";
|
|
18968
|
+
description.textContent = input.description;
|
|
18969
|
+
copy.append(heading, description);
|
|
18970
|
+
item.append(copy);
|
|
18971
|
+
return { item, description };
|
|
18972
|
+
}
|
|
18973
|
+
function createHelpTooltip(document2, label, lines) {
|
|
18974
|
+
const wrapper = document2.createElement("span");
|
|
18975
|
+
wrapper.className = "group relative inline-flex";
|
|
18976
|
+
const button2 = document2.createElement("button");
|
|
18977
|
+
button2.type = "button";
|
|
18978
|
+
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";
|
|
18979
|
+
button2.setAttribute("aria-label", label);
|
|
18980
|
+
button2.append(createRendererSettingsIcon("help", 14));
|
|
18981
|
+
const tooltip = document2.createElement("div");
|
|
18982
|
+
tooltip.id = preferenceId("preference-tooltip");
|
|
18983
|
+
tooltip.setAttribute("role", "tooltip");
|
|
18984
|
+
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";
|
|
18985
|
+
const list = document2.createElement("ul");
|
|
18986
|
+
list.className = "m-0 grid list-disc gap-1 pl-4 marker:text-settings-subtle";
|
|
18987
|
+
for (const line of lines) {
|
|
18988
|
+
const item = document2.createElement("li");
|
|
18989
|
+
item.textContent = line;
|
|
18990
|
+
list.append(item);
|
|
18991
|
+
}
|
|
18992
|
+
tooltip.append(list);
|
|
18993
|
+
button2.setAttribute("aria-describedby", tooltip.id);
|
|
18994
|
+
button2.addEventListener("keydown", (event) => {
|
|
18995
|
+
if (event.key === "Escape") button2.blur();
|
|
18996
|
+
});
|
|
18997
|
+
wrapper.append(button2, tooltip);
|
|
18998
|
+
return wrapper;
|
|
18999
|
+
}
|
|
19000
|
+
function createPreferenceSwitch(document2, id, describedBy) {
|
|
19001
|
+
const input = document2.createElement("input");
|
|
19002
|
+
input.type = "checkbox";
|
|
19003
|
+
input.id = id;
|
|
19004
|
+
input.setAttribute("role", "switch");
|
|
19005
|
+
input.setAttribute("aria-describedby", describedBy);
|
|
19006
|
+
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";
|
|
19007
|
+
return input;
|
|
19008
|
+
}
|
|
19009
|
+
function createNumberField(document2, input) {
|
|
19010
|
+
const field = document2.createElement("div");
|
|
19011
|
+
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";
|
|
19012
|
+
const control = document2.createElement("input");
|
|
19013
|
+
control.type = "number";
|
|
19014
|
+
control.id = input.id;
|
|
19015
|
+
control.min = String(input.min);
|
|
19016
|
+
control.max = String(input.max);
|
|
19017
|
+
control.step = "1";
|
|
19018
|
+
control.setAttribute("aria-describedby", input.describedBy);
|
|
19019
|
+
control.className = "w-14 border-0 bg-transparent p-0 text-right text-[13px] leading-5 text-settings-text tabular-nums outline-none";
|
|
19020
|
+
const unit = document2.createElement("span");
|
|
19021
|
+
unit.className = "text-xs text-settings-muted";
|
|
19022
|
+
unit.setAttribute("aria-hidden", "true");
|
|
19023
|
+
unit.textContent = input.unit;
|
|
19024
|
+
field.append(control, unit);
|
|
19025
|
+
return { field, control };
|
|
19026
|
+
}
|
|
19027
|
+
|
|
19028
|
+
// src/settings/voice-messages.ts
|
|
19029
|
+
function voiceMessages(locale) {
|
|
19030
|
+
const en = {
|
|
19031
|
+
title: "Voice",
|
|
19032
|
+
description: "Choose voice for Chat and Work. Shared on this Mac.",
|
|
19033
|
+
chat: "Chat",
|
|
19034
|
+
experience: "Voice experience",
|
|
19035
|
+
chatHint: "ChatGPT stays in your current Chat conversation.",
|
|
19036
|
+
codexConnection: "Codex connection",
|
|
19037
|
+
codexHint: "Available when Codex voice is selected.",
|
|
19038
|
+
work: "Work",
|
|
19039
|
+
connection: "Voice connection",
|
|
19040
|
+
workHint: "Desktop default applies to Codex Work. External Harness voice uses the configured gateway.",
|
|
19041
|
+
desktop: "Desktop default",
|
|
19042
|
+
gateway: "Configured gateway",
|
|
19043
|
+
configuration: "Configuration",
|
|
19044
|
+
gatewayTitle: "Gateway",
|
|
19045
|
+
gatewayHint: "Used only when Configured gateway is selected.",
|
|
19046
|
+
configured: "Configured",
|
|
19047
|
+
needsSetup: "Needs setup",
|
|
19048
|
+
unknown: "Not checked",
|
|
19049
|
+
configure: "Configure",
|
|
19050
|
+
setup: "Gateway setup",
|
|
19051
|
+
setupHint: "Gateway settings use your local Codex configuration and the selected provider\u2019s credential. End voice before editing configuration. Never paste credentials here.",
|
|
19052
|
+
advanced: "Advanced",
|
|
19053
|
+
advancedHint: "Voice integration and diagnostics.",
|
|
19054
|
+
inject: "Enable voice integration",
|
|
19055
|
+
injectHint: "Enables the ChatGPT voice control and gateway routing. Changing this requires restarting codexhost.",
|
|
19056
|
+
environment: "Voice integration is controlled by this launch environment.",
|
|
19057
|
+
loading: "Loading voice settings\u2026",
|
|
19058
|
+
unavailable: "Voice settings are unavailable. Check the local Host connection.",
|
|
19059
|
+
retry: "Reload",
|
|
19060
|
+
cancel: "Cancel",
|
|
19061
|
+
apply: "Apply changes",
|
|
19062
|
+
applyRestart: "Apply and restart codexhost",
|
|
19063
|
+
retryRestart: "Retry restart",
|
|
19064
|
+
saving: "Saving settings\u2026",
|
|
19065
|
+
restarting: "Restarting codexhost\u2026",
|
|
19066
|
+
ready: "No pending changes",
|
|
19067
|
+
edited: "Unsaved changes",
|
|
19068
|
+
nextCall: "Voice choices apply to the next call.",
|
|
19069
|
+
pending: "Saved \u2014 waiting for Desktop to apply voice choices.",
|
|
19070
|
+
restartNeeded: "Saved \u2014 restart required",
|
|
19071
|
+
activeUnknown: "Saved \u2014 active setting is unknown.",
|
|
19072
|
+
activeCall: "End your voice call to apply changes.",
|
|
19073
|
+
integrationOff: "Voice integration is off. Enable it in Advanced to use these choices.",
|
|
19074
|
+
restartWarning: "Restart codexhost to apply voice integration? This may interrupt running tasks. End voice before continuing.",
|
|
19075
|
+
confirm: "Apply and restart",
|
|
19076
|
+
restartFailed: "Settings are saved, but restart failed.",
|
|
19077
|
+
conflict: "Settings changed in another window. Reload before applying.",
|
|
19078
|
+
gatewayWarning: "The selected gateway needs setup before voice can connect."
|
|
19079
|
+
};
|
|
19080
|
+
if (locale !== "zh-CN") return en;
|
|
19081
|
+
return {
|
|
19082
|
+
...en,
|
|
19083
|
+
title: "\u8BED\u97F3",
|
|
19084
|
+
description: "\u9009\u62E9 Chat \u548C Work \u7684\u8BED\u97F3\u65B9\u5F0F\u3002\u5728\u6B64 Mac \u4E0A\u5171\u4EAB\u3002",
|
|
19085
|
+
experience: "\u8BED\u97F3\u4F53\u9A8C",
|
|
19086
|
+
chatHint: "ChatGPT \u8BED\u97F3\u4FDD\u7559\u5728\u5F53\u524D Chat \u5BF9\u8BDD\u4E2D\u3002",
|
|
19087
|
+
codexConnection: "Codex \u8FDE\u63A5",
|
|
19088
|
+
codexHint: "\u9009\u62E9 Codex \u8BED\u97F3\u540E\u53EF\u7528\u3002",
|
|
19089
|
+
connection: "\u8BED\u97F3\u8FDE\u63A5",
|
|
19090
|
+
workHint: "Desktop \u9ED8\u8BA4\u9002\u7528\u4E8E Codex Work\u3002\u5916\u90E8 Harness \u8BED\u97F3\u4F7F\u7528\u5DF2\u914D\u7F6E\u7684\u7F51\u5173\u3002",
|
|
19091
|
+
desktop: "Desktop \u9ED8\u8BA4",
|
|
19092
|
+
gateway: "\u5DF2\u914D\u7F6E\u7684\u7F51\u5173",
|
|
19093
|
+
configuration: "\u914D\u7F6E",
|
|
19094
|
+
gatewayTitle: "\u7F51\u5173",
|
|
19095
|
+
gatewayHint: "\u4EC5\u5728\u9009\u62E9\u5DF2\u914D\u7F6E\u7684\u7F51\u5173\u65F6\u4F7F\u7528\u3002",
|
|
19096
|
+
configured: "\u5DF2\u914D\u7F6E",
|
|
19097
|
+
needsSetup: "\u9700\u8981\u914D\u7F6E",
|
|
19098
|
+
unknown: "\u672A\u68C0\u67E5",
|
|
19099
|
+
configure: "\u914D\u7F6E",
|
|
19100
|
+
setup: "\u7F51\u5173\u914D\u7F6E",
|
|
19101
|
+
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",
|
|
19102
|
+
advanced: "\u9AD8\u7EA7",
|
|
19103
|
+
advancedHint: "\u8BED\u97F3\u96C6\u6210\u4E0E\u8BCA\u65AD\u3002",
|
|
19104
|
+
inject: "\u542F\u7528\u8BED\u97F3\u96C6\u6210",
|
|
19105
|
+
injectHint: "\u542F\u7528 ChatGPT \u8BED\u97F3\u6309\u94AE\u4E0E\u7F51\u5173\u8DEF\u7531\u3002\u66F4\u6539\u6B64\u9879\u9700\u8981\u91CD\u542F codexhost\u3002",
|
|
19106
|
+
environment: "\u5F53\u524D\u542F\u52A8\u73AF\u5883\u63A7\u5236\u8BED\u97F3\u96C6\u6210\u3002",
|
|
19107
|
+
loading: "\u6B63\u5728\u52A0\u8F7D\u8BED\u97F3\u8BBE\u7F6E\u2026",
|
|
19108
|
+
unavailable: "\u8BED\u97F3\u8BBE\u7F6E\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u672C\u5730 Host \u8FDE\u63A5\u3002",
|
|
19109
|
+
retry: "\u91CD\u65B0\u52A0\u8F7D",
|
|
19110
|
+
cancel: "\u53D6\u6D88",
|
|
19111
|
+
apply: "\u5E94\u7528\u66F4\u6539",
|
|
19112
|
+
applyRestart: "\u5E94\u7528\u5E76\u91CD\u542F codexhost",
|
|
19113
|
+
retryRestart: "\u91CD\u8BD5\u91CD\u542F",
|
|
19114
|
+
saving: "\u6B63\u5728\u4FDD\u5B58\u8BBE\u7F6E\u2026",
|
|
19115
|
+
restarting: "\u6B63\u5728\u91CD\u542F codexhost\u2026",
|
|
19116
|
+
ready: "\u6CA1\u6709\u5F85\u5E94\u7528\u7684\u66F4\u6539",
|
|
19117
|
+
edited: "\u66F4\u6539\u5C1A\u672A\u4FDD\u5B58",
|
|
19118
|
+
nextCall: "\u8BED\u97F3\u9009\u62E9\u4ECE\u4E0B\u6B21\u901A\u8BDD\u751F\u6548\u3002",
|
|
19119
|
+
pending: "\u5DF2\u4FDD\u5B58\uFF0C\u7B49\u5F85 Desktop \u5E94\u7528\u8BED\u97F3\u9009\u62E9\u3002",
|
|
19120
|
+
restartNeeded: "\u5DF2\u4FDD\u5B58\uFF0C\u9700\u8981\u91CD\u542F",
|
|
19121
|
+
activeUnknown: "\u5DF2\u4FDD\u5B58\uFF0C\u5F53\u524D\u751F\u6548\u72B6\u6001\u672A\u77E5\u3002",
|
|
19122
|
+
activeCall: "\u8BF7\u7ED3\u675F\u8BED\u97F3\u540E\u518D\u5E94\u7528\u66F4\u6539\u3002",
|
|
19123
|
+
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",
|
|
19124
|
+
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",
|
|
19125
|
+
confirm: "\u5E94\u7528\u5E76\u91CD\u542F",
|
|
19126
|
+
restartFailed: "\u8BBE\u7F6E\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u91CD\u542F\u5931\u8D25\u3002",
|
|
19127
|
+
conflict: "\u5176\u4ED6\u7A97\u53E3\u66F4\u6539\u4E86\u8BBE\u7F6E\uFF0C\u8BF7\u91CD\u65B0\u52A0\u8F7D\u540E\u518D\u5E94\u7528\u3002",
|
|
19128
|
+
gatewayWarning: "\u6240\u9009\u7F51\u5173\u9700\u8981\u914D\u7F6E\u540E\u624D\u80FD\u8FDE\u63A5\u8BED\u97F3\u3002"
|
|
19129
|
+
};
|
|
19130
|
+
}
|
|
19131
|
+
|
|
19132
|
+
// src/settings/voice-page.ts
|
|
19133
|
+
function createVoiceSettingsPage(locale, request, options = {}) {
|
|
19134
|
+
const m = voiceMessages(locale);
|
|
19135
|
+
return Object.freeze({
|
|
19136
|
+
id: options.id ?? "voice",
|
|
19137
|
+
label: m.title,
|
|
19138
|
+
icon: "settings",
|
|
19139
|
+
mount(context) {
|
|
19140
|
+
const doc = context.content.ownerDocument;
|
|
19141
|
+
let state = null;
|
|
19142
|
+
let base = null;
|
|
19143
|
+
let draft = null;
|
|
19144
|
+
let offline = false;
|
|
19145
|
+
let busy = false;
|
|
19146
|
+
let refreshing = false;
|
|
19147
|
+
let generation = 0;
|
|
19148
|
+
let disposed = false;
|
|
19149
|
+
let confirm = false;
|
|
19150
|
+
let advanced = false;
|
|
19151
|
+
let setup = false;
|
|
19152
|
+
let error51 = null;
|
|
19153
|
+
const ids = /* @__PURE__ */ new Map();
|
|
19154
|
+
const controlId = (key) => {
|
|
19155
|
+
const existing = ids.get(key);
|
|
19156
|
+
if (existing) return existing;
|
|
19157
|
+
const id = preferenceId(key);
|
|
19158
|
+
ids.set(key, id);
|
|
19159
|
+
return id;
|
|
19160
|
+
};
|
|
19161
|
+
const dirty = () => !!draft && JSON.stringify(draft) !== JSON.stringify(base?.settings);
|
|
19162
|
+
const isActiveCall = () => state?.activeCall === true || options.desktop && !!doc.defaultView && desktopVoiceCallActive(doc.defaultView);
|
|
19163
|
+
const needsRestart = () => !!draft && !!state && (state.activeInject === null ? draft.inject !== base?.settings.inject : (state.envOverride ? state.envOverride === "1" : draft.inject) !== state.activeInject);
|
|
19164
|
+
const load = async (reset = false) => {
|
|
19165
|
+
if (refreshing || busy || disposed) return;
|
|
19166
|
+
refreshing = true;
|
|
19167
|
+
const currentGeneration = generation;
|
|
19168
|
+
try {
|
|
19169
|
+
const next = voiceSettingsStateSchema.parse(await request({ operation: "get" }));
|
|
19170
|
+
if (disposed || generation !== currentGeneration) return;
|
|
19171
|
+
const changed = JSON.stringify(state) !== JSON.stringify(next) || offline || reset;
|
|
19172
|
+
if (reset || !dirty()) {
|
|
19173
|
+
base = next;
|
|
19174
|
+
draft = { ...next.settings };
|
|
19175
|
+
}
|
|
19176
|
+
state = next;
|
|
19177
|
+
offline = false;
|
|
19178
|
+
if (reset) {
|
|
19179
|
+
error51 = null;
|
|
19180
|
+
confirm = false;
|
|
19181
|
+
}
|
|
19182
|
+
if (changed) render();
|
|
19183
|
+
} catch {
|
|
19184
|
+
if (!disposed && generation === currentGeneration) {
|
|
19185
|
+
offline = true;
|
|
19186
|
+
render();
|
|
19187
|
+
}
|
|
19188
|
+
} finally {
|
|
19189
|
+
refreshing = false;
|
|
19190
|
+
}
|
|
19191
|
+
};
|
|
19192
|
+
const apply = async (restart) => {
|
|
19193
|
+
if (!draft || !base || busy || isActiveCall()) return;
|
|
19194
|
+
busy = true;
|
|
19195
|
+
generation += 1;
|
|
19196
|
+
error51 = null;
|
|
19197
|
+
confirm = false;
|
|
19198
|
+
render();
|
|
19199
|
+
try {
|
|
19200
|
+
const current = voiceSettingsStateSchema.parse(await request({ operation: "get" }));
|
|
19201
|
+
if (disposed) return;
|
|
19202
|
+
if (current.activeCall || isActiveCall()) throw new Error(m.activeCall);
|
|
19203
|
+
if (current.revision !== base.revision) throw new Error(m.conflict);
|
|
19204
|
+
if (dirty()) {
|
|
19205
|
+
const saved = voiceSettingsStateSchema.parse(
|
|
19206
|
+
await request({
|
|
19207
|
+
operation: "set",
|
|
19208
|
+
settings: draft,
|
|
19209
|
+
revision: base.revision
|
|
19210
|
+
})
|
|
19211
|
+
);
|
|
19212
|
+
if (disposed) return;
|
|
19213
|
+
state = saved;
|
|
19214
|
+
base = saved;
|
|
19215
|
+
draft = { ...saved.settings };
|
|
19216
|
+
}
|
|
19217
|
+
if (restart) await request({ operation: "restart", confirm: true });
|
|
19218
|
+
} catch (failure) {
|
|
19219
|
+
if (!disposed) error51 = failure instanceof Error ? failure.message : m.unavailable;
|
|
19220
|
+
} finally {
|
|
19221
|
+
busy = false;
|
|
19222
|
+
if (!disposed) {
|
|
19223
|
+
render();
|
|
19224
|
+
void load();
|
|
19225
|
+
}
|
|
19226
|
+
}
|
|
19227
|
+
};
|
|
19228
|
+
const render = () => {
|
|
19229
|
+
if (disposed) return;
|
|
19230
|
+
const tree = context.content.getRootNode();
|
|
19231
|
+
const focused = tree.activeElement;
|
|
19232
|
+
const focusedId = focused && context.content.contains(focused) ? focused.id : "";
|
|
19233
|
+
const root = h(doc, "div", { className: "settings-voice" });
|
|
19234
|
+
root.append(
|
|
19235
|
+
h(doc, "div", { className: "settings-section-label" }, m.title),
|
|
19236
|
+
h(doc, "p", { className: "settings-page-description" }, m.description)
|
|
19237
|
+
);
|
|
19238
|
+
if (!draft || !state) {
|
|
19239
|
+
root.append(h(doc, "p", { role: "status" }, offline ? m.unavailable : m.loading));
|
|
19240
|
+
if (offline) root.append(button(doc, m.retry, () => void load(true)));
|
|
19241
|
+
context.content.replaceChildren(root);
|
|
19242
|
+
return;
|
|
19243
|
+
}
|
|
19244
|
+
const unavailable = busy || offline || state.restart.phase === "restarting";
|
|
19245
|
+
const row = (card, title, description, key, choices, disabled = false) => {
|
|
19246
|
+
const id = controlId(`voice-${key}`);
|
|
19247
|
+
const item = createPreferenceItem(doc, { title, description, controlId: id });
|
|
19248
|
+
item.item.classList.add("settings-voice__row");
|
|
19249
|
+
const select = h(doc, "select", {
|
|
19250
|
+
id,
|
|
19251
|
+
className: "settings-voice__select",
|
|
19252
|
+
"aria-describedby": item.description.id
|
|
19253
|
+
});
|
|
19254
|
+
for (const [value, label] of choices) select.append(h(doc, "option", { value }, label));
|
|
19255
|
+
select.value = draft?.[key] ?? "";
|
|
19256
|
+
select.disabled = unavailable || disabled;
|
|
19257
|
+
select.addEventListener("change", () => {
|
|
19258
|
+
if (!draft) return;
|
|
19259
|
+
draft = { ...draft, [key]: select.value };
|
|
19260
|
+
confirm = false;
|
|
19261
|
+
render();
|
|
19262
|
+
});
|
|
19263
|
+
item.item.append(select);
|
|
19264
|
+
card.append(item.item);
|
|
19265
|
+
};
|
|
19266
|
+
const connections = [
|
|
19267
|
+
["desktop", m.desktop],
|
|
19268
|
+
["gateway", m.gateway]
|
|
19269
|
+
];
|
|
19270
|
+
const chat = createPreferenceGroup(doc, m.chat);
|
|
19271
|
+
row(chat.card, m.experience, m.chatHint, "chatExperience", [
|
|
19272
|
+
["chatgpt", "ChatGPT"],
|
|
19273
|
+
["codex", "Codex"]
|
|
19274
|
+
]);
|
|
19275
|
+
row(
|
|
19276
|
+
chat.card,
|
|
19277
|
+
m.codexConnection,
|
|
19278
|
+
m.codexHint,
|
|
19279
|
+
"chatConnection",
|
|
19280
|
+
connections,
|
|
19281
|
+
draft.chatExperience !== "codex"
|
|
19282
|
+
);
|
|
19283
|
+
const work = createPreferenceGroup(doc, m.work);
|
|
19284
|
+
row(work.card, m.connection, m.workHint, "workConnection", connections);
|
|
19285
|
+
const config2 = createPreferenceGroup(doc, m.configuration);
|
|
19286
|
+
const gateway = createPreferenceItem(doc, {
|
|
19287
|
+
title: m.gatewayTitle,
|
|
19288
|
+
description: m.gatewayHint,
|
|
19289
|
+
controlId: preferenceId("gateway-config")
|
|
19290
|
+
});
|
|
19291
|
+
gateway.item.classList.add("settings-voice__row");
|
|
19292
|
+
const configure = button(doc, m.configure, () => {
|
|
19293
|
+
setup = !setup;
|
|
19294
|
+
render();
|
|
19295
|
+
});
|
|
19296
|
+
configure.id = gateway.item.querySelector("label")?.htmlFor ?? "";
|
|
19297
|
+
configure.setAttribute("aria-expanded", String(setup));
|
|
19298
|
+
const gatewayActions = h(
|
|
19299
|
+
doc,
|
|
19300
|
+
"div",
|
|
19301
|
+
{ className: "settings-voice__gateway-actions" },
|
|
19302
|
+
h(
|
|
19303
|
+
doc,
|
|
19304
|
+
"span",
|
|
19305
|
+
{},
|
|
19306
|
+
state.gatewayReady === null ? m.unknown : state.gatewayReady ? m.configured : m.needsSetup
|
|
19307
|
+
),
|
|
19308
|
+
configure
|
|
19309
|
+
);
|
|
19310
|
+
gateway.item.append(gatewayActions);
|
|
19311
|
+
config2.card.append(gateway.item);
|
|
19312
|
+
if (setup) {
|
|
19313
|
+
const details = h(
|
|
19314
|
+
doc,
|
|
19315
|
+
"div",
|
|
19316
|
+
{ className: "settings-voice__details" },
|
|
19317
|
+
h(doc, "strong", {}, m.setup),
|
|
19318
|
+
h(doc, "p", {}, m.setupHint)
|
|
19319
|
+
);
|
|
19320
|
+
details.append(
|
|
19321
|
+
h(doc, "code", {}, "~/.codex/config.toml"),
|
|
19322
|
+
h(
|
|
19323
|
+
doc,
|
|
19324
|
+
"p",
|
|
19325
|
+
{},
|
|
19326
|
+
"experimental_realtime_webrtc_call_base_url \xB7 experimental_realtime_ws_base_url"
|
|
19327
|
+
)
|
|
19328
|
+
);
|
|
19329
|
+
config2.card.append(details);
|
|
19330
|
+
}
|
|
19331
|
+
const adv = createPreferenceItem(doc, {
|
|
19332
|
+
title: m.advanced,
|
|
19333
|
+
description: m.advancedHint,
|
|
19334
|
+
controlId: preferenceId("voice-advanced")
|
|
19335
|
+
});
|
|
19336
|
+
const expand = button(doc, advanced ? "\u2303" : "\u203A", () => {
|
|
19337
|
+
advanced = !advanced;
|
|
19338
|
+
render();
|
|
19339
|
+
});
|
|
19340
|
+
expand.id = adv.item.querySelector("label")?.htmlFor ?? "";
|
|
19341
|
+
expand.setAttribute("aria-label", m.advanced);
|
|
19342
|
+
expand.setAttribute("aria-expanded", String(advanced));
|
|
19343
|
+
adv.item.append(expand);
|
|
19344
|
+
config2.card.append(adv.item);
|
|
19345
|
+
if (advanced) {
|
|
19346
|
+
const id = controlId("voice-inject");
|
|
19347
|
+
const injection = createPreferenceItem(doc, {
|
|
19348
|
+
title: m.inject,
|
|
19349
|
+
description: m.injectHint,
|
|
19350
|
+
controlId: id
|
|
19351
|
+
});
|
|
19352
|
+
injection.item.classList.add("settings-voice__row");
|
|
19353
|
+
const toggle = createPreferenceSwitch(doc, id, injection.description.id);
|
|
19354
|
+
toggle.checked = draft.inject;
|
|
19355
|
+
toggle.disabled = unavailable || !!state.envOverride;
|
|
19356
|
+
toggle.addEventListener("change", () => {
|
|
19357
|
+
if (draft) draft = { ...draft, inject: toggle.checked };
|
|
19358
|
+
confirm = false;
|
|
19359
|
+
render();
|
|
19360
|
+
});
|
|
19361
|
+
injection.item.append(toggle);
|
|
19362
|
+
config2.card.append(injection.item);
|
|
19363
|
+
if (state.envOverride || state.activeEnvOverride)
|
|
19364
|
+
config2.card.append(
|
|
19365
|
+
h(doc, "p", { className: "settings-voice__details" }, m.environment)
|
|
19366
|
+
);
|
|
19367
|
+
}
|
|
19368
|
+
root.append(chat.group, work.group, config2.group);
|
|
19369
|
+
const restarting = state.restart.phase === "restarting";
|
|
19370
|
+
const failed = state.restart.phase === "failed";
|
|
19371
|
+
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;
|
|
19372
|
+
const footer = h(
|
|
19373
|
+
doc,
|
|
19374
|
+
"div",
|
|
19375
|
+
{ className: "settings-voice__footer" },
|
|
19376
|
+
h(doc, "div", { role: "status" }, h(doc, "div", {}, status), h(doc, "p", {}, m.nextCall))
|
|
19377
|
+
);
|
|
19378
|
+
const actions = h(doc, "div", { className: "settings-voice__actions" });
|
|
19379
|
+
const cancel = button(doc, m.cancel, () => {
|
|
19380
|
+
draft = base ? { ...base.settings } : null;
|
|
19381
|
+
confirm = false;
|
|
19382
|
+
error51 = null;
|
|
19383
|
+
render();
|
|
19384
|
+
});
|
|
19385
|
+
cancel.disabled = busy || !dirty() && !confirm;
|
|
19386
|
+
const submit = button(
|
|
19387
|
+
doc,
|
|
19388
|
+
failed && needsRestart() && !dirty() ? m.retryRestart : needsRestart() && state.restartAvailable ? m.applyRestart : m.apply,
|
|
19389
|
+
() => {
|
|
19390
|
+
if (needsRestart() && state?.restartAvailable) {
|
|
19391
|
+
confirm = true;
|
|
19392
|
+
render();
|
|
19393
|
+
} else void apply(false);
|
|
19394
|
+
},
|
|
19395
|
+
"primary"
|
|
19396
|
+
);
|
|
19397
|
+
submit.disabled = unavailable || !!isActiveCall() || !dirty() && !(needsRestart() && state.restartAvailable);
|
|
19398
|
+
actions.append(cancel, submit);
|
|
19399
|
+
footer.append(actions);
|
|
19400
|
+
root.append(footer);
|
|
19401
|
+
if (confirm)
|
|
19402
|
+
root.append(
|
|
19403
|
+
h(
|
|
19404
|
+
doc,
|
|
19405
|
+
"div",
|
|
19406
|
+
{ className: "settings-voice__confirmation" },
|
|
19407
|
+
h(doc, "p", {}, m.restartWarning),
|
|
19408
|
+
button(doc, m.confirm, () => void apply(true), "primary"),
|
|
19409
|
+
button(doc, m.cancel, () => {
|
|
19410
|
+
confirm = false;
|
|
19411
|
+
render();
|
|
19412
|
+
})
|
|
19413
|
+
)
|
|
19414
|
+
);
|
|
19415
|
+
if (failed)
|
|
19416
|
+
root.append(
|
|
19417
|
+
h(doc, "p", { role: "alert" }, `${m.restartFailed} ${state.restart.error ?? ""}`)
|
|
19418
|
+
);
|
|
19419
|
+
if (error51) root.append(h(doc, "p", { role: "alert" }, error51));
|
|
19420
|
+
const gatewaySelected = draft.workConnection === "gateway" || draft.chatExperience === "codex" && draft.chatConnection === "gateway";
|
|
19421
|
+
if (gatewaySelected && state.gatewayReady === false)
|
|
19422
|
+
root.append(h(doc, "p", { className: "settings-voice__hint" }, m.gatewayWarning));
|
|
19423
|
+
if (!draft.inject)
|
|
19424
|
+
root.append(h(doc, "p", { className: "settings-voice__hint" }, m.integrationOff));
|
|
19425
|
+
if (offline || base?.revision !== state.revision)
|
|
19426
|
+
root.append(button(doc, m.retry, () => void load(true)));
|
|
19427
|
+
context.content.replaceChildren(root);
|
|
19428
|
+
if (focusedId)
|
|
19429
|
+
root.querySelector(`#${focusedId}`)?.focus({ preventScroll: true });
|
|
19430
|
+
};
|
|
19431
|
+
render();
|
|
19432
|
+
void load();
|
|
19433
|
+
const timer = doc.defaultView?.setInterval(() => void load(), 3e3);
|
|
19434
|
+
return () => {
|
|
19435
|
+
disposed = true;
|
|
19436
|
+
if (timer !== void 0) doc.defaultView?.clearInterval(timer);
|
|
19437
|
+
};
|
|
19438
|
+
}
|
|
19439
|
+
});
|
|
19440
|
+
}
|
|
19441
|
+
|
|
19442
|
+
// src/console/pages/restart-control.ts
|
|
19443
|
+
function renderRestartControl(document2, messages, state) {
|
|
19444
|
+
const root = h(document2, "div", { className: "console-actions console-restart" });
|
|
19445
|
+
const status = state.overview?.restart;
|
|
19446
|
+
const busy = state.restartSubmitting || status?.phase === "restarting";
|
|
19447
|
+
if (state.restartConfirm && !busy) {
|
|
19448
|
+
root.append(
|
|
19449
|
+
h(document2, "p", { role: "status" }, messages.restartWarning),
|
|
19450
|
+
button(document2, messages.restartConfirm, () => void state.restart(), "primary"),
|
|
19451
|
+
button(document2, messages.restartCancel, () => state.confirmRestart(false))
|
|
19452
|
+
);
|
|
19453
|
+
} else {
|
|
19454
|
+
const restart = button(document2, messages.restart, () => state.confirmRestart(true));
|
|
19455
|
+
restart.disabled = busy || state.offline || !state.overview?.launchAvailable || !["running", "integration-unavailable"].includes(state.overview.summary.state);
|
|
19456
|
+
root.append(restart);
|
|
19457
|
+
}
|
|
19458
|
+
if (busy || status?.phase === "succeeded") {
|
|
19459
|
+
root.append(
|
|
19460
|
+
h(document2, "p", { role: "status" }, busy ? messages.restarting : messages.restarted)
|
|
19461
|
+
);
|
|
19462
|
+
}
|
|
19463
|
+
const error51 = state.restartError ?? status?.error;
|
|
19464
|
+
if (error51) root.append(h(document2, "p", { role: "alert" }, error51));
|
|
19465
|
+
return root;
|
|
19466
|
+
}
|
|
19467
|
+
|
|
18819
19468
|
// src/console/pages/report-actions.ts
|
|
18820
19469
|
function mountReportActions(document2, messages, overview) {
|
|
18821
19470
|
const exportLink = h(
|
|
@@ -19087,6 +19736,8 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19087
19736
|
start.disabled = launching || !overview.launchAvailable;
|
|
19088
19737
|
actions.append(start);
|
|
19089
19738
|
}
|
|
19739
|
+
if (summaryState === "running" || summaryState === "integration-unavailable")
|
|
19740
|
+
actions.append(renderRestartControl(document2, messages, state));
|
|
19090
19741
|
if (state.update?.updateAvailable) {
|
|
19091
19742
|
actions.append(
|
|
19092
19743
|
button(
|
|
@@ -19157,12 +19808,35 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19157
19808
|
overview = null;
|
|
19158
19809
|
update = null;
|
|
19159
19810
|
offline = false;
|
|
19811
|
+
restartConfirm = false;
|
|
19812
|
+
restartSubmitting = false;
|
|
19813
|
+
restartError = null;
|
|
19160
19814
|
#listeners = /* @__PURE__ */ new Set();
|
|
19161
19815
|
#timer;
|
|
19162
19816
|
subscribe(listener) {
|
|
19163
19817
|
this.#listeners.add(listener);
|
|
19164
19818
|
return () => this.#listeners.delete(listener);
|
|
19165
19819
|
}
|
|
19820
|
+
confirmRestart(confirm) {
|
|
19821
|
+
this.restartConfirm = confirm;
|
|
19822
|
+
this.#emit();
|
|
19823
|
+
}
|
|
19824
|
+
async restart() {
|
|
19825
|
+
if (!this.restartConfirm || this.restartSubmitting) return;
|
|
19826
|
+
this.restartConfirm = false;
|
|
19827
|
+
this.restartSubmitting = true;
|
|
19828
|
+
this.restartError = null;
|
|
19829
|
+
this.#emit();
|
|
19830
|
+
try {
|
|
19831
|
+
await consolePost("/api/restart", { confirm: true });
|
|
19832
|
+
await this.refresh();
|
|
19833
|
+
} catch (error51) {
|
|
19834
|
+
this.restartError = error51 instanceof Error ? error51.message : String(error51);
|
|
19835
|
+
} finally {
|
|
19836
|
+
this.restartSubmitting = false;
|
|
19837
|
+
this.#emit();
|
|
19838
|
+
}
|
|
19839
|
+
}
|
|
19166
19840
|
async refresh() {
|
|
19167
19841
|
try {
|
|
19168
19842
|
this.overview = await consoleGet("/api/overview");
|
|
@@ -20671,16 +21345,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20671
21345
|
"When this is on, that card is hidden on every Composer, including Codex threads. Reset usage and Upgrade stay available in Settings.",
|
|
20672
21346
|
"Turning this off only shows the native card again. Send on this Composer, including Codex threads, is already separated from that quota card."
|
|
20673
21347
|
]),
|
|
20674
|
-
cpaLiveVoiceTitle: "Override live voice",
|
|
20675
|
-
cpaLiveVoiceDescription: "On by default. Host creates the realtime call instead of ChatGPT.",
|
|
20676
|
-
cpaLiveVoiceHelpLabel: "About overriding live voice",
|
|
20677
|
-
cpaLiveVoiceHelp: Object.freeze([
|
|
20678
|
-
"Overrides Desktop's existing-call path on audited 26.1007.30912 so a local host can create the WebRTC call.",
|
|
20679
|
-
"This switch applies on the next voice session. No relaunch.",
|
|
20680
|
-
"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.",
|
|
20681
|
-
"CODEXHOST_CPA_LIVE_VOICE=0 is not live. Relaunch Codex after changing that environment variable."
|
|
20682
|
-
]),
|
|
20683
|
-
cpaLiveVoiceRestartRequired: "This override is not injected. Unset CODEXHOST_CPA_LIVE_VOICE=0 and relaunch Codex. The switch cannot take effect until then.",
|
|
20684
21348
|
loadedSessions: {
|
|
20685
21349
|
title: "Loaded sessions",
|
|
20686
21350
|
description: "Local external Harnesses only. Refreshes every 10 seconds without waking sessions or resetting activity. Released sessions disappear from this list.",
|
|
@@ -20936,6 +21600,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20936
21600
|
connections: "Connections",
|
|
20937
21601
|
"remote-connections": "Remote connections",
|
|
20938
21602
|
appearance: "General",
|
|
21603
|
+
voice: "Voice",
|
|
20939
21604
|
accounts: "Accounts",
|
|
20940
21605
|
"session-import": "Session Import",
|
|
20941
21606
|
"usage-statistics": "Usage statistics",
|
|
@@ -20962,16 +21627,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20962
21627
|
"\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",
|
|
20963
21628
|
"\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"
|
|
20964
21629
|
]),
|
|
20965
|
-
cpaLiveVoiceTitle: "\u6539\u5199\u5B9E\u65F6\u8BED\u97F3",
|
|
20966
|
-
cpaLiveVoiceDescription: "\u9ED8\u8BA4\u5F00\u542F\u3002\u7531 Host \u521B\u5EFA realtime \u901A\u8BDD\uFF0C\u800C\u4E0D\u662F ChatGPT\u3002",
|
|
20967
|
-
cpaLiveVoiceHelpLabel: "\u6539\u5199\u5B9E\u65F6\u8BED\u97F3\u8BF4\u660E",
|
|
20968
|
-
cpaLiveVoiceHelp: Object.freeze([
|
|
20969
|
-
"\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",
|
|
20970
|
-
"\u6B64\u5F00\u5173\u5728\u4E0B\u4E00\u6B21\u8BED\u97F3\u4F1A\u8BDD\u751F\u6548\uFF0C\u65E0\u9700\u91CD\u65B0\u542F\u52A8\u3002",
|
|
20971
|
-
"\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",
|
|
20972
|
-
"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"
|
|
20973
|
-
]),
|
|
20974
|
-
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",
|
|
20975
21630
|
loadedSessions: {
|
|
20976
21631
|
title: "\u5DF2\u52A0\u8F7D\u4F1A\u8BDD",
|
|
20977
21632
|
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",
|
|
@@ -21227,6 +21882,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21227
21882
|
connections: "\u8FDE\u63A5",
|
|
21228
21883
|
"remote-connections": "\u8FDC\u7A0B\u8FDE\u63A5",
|
|
21229
21884
|
appearance: "\u901A\u7528",
|
|
21885
|
+
voice: "\u8BED\u97F3",
|
|
21230
21886
|
accounts: "\u8D26\u53F7",
|
|
21231
21887
|
"session-import": "\u4F1A\u8BDD\u5BFC\u5165",
|
|
21232
21888
|
"usage-statistics": "\u7528\u91CF\u7EDF\u8BA1",
|
|
@@ -24009,104 +24665,6 @@ ${detail}` : ""}`
|
|
|
24009
24665
|
return card;
|
|
24010
24666
|
}
|
|
24011
24667
|
|
|
24012
|
-
// src/settings/preference-ui.ts
|
|
24013
|
-
var nextPreferenceId = 0;
|
|
24014
|
-
function preferenceId(prefix) {
|
|
24015
|
-
nextPreferenceId += 1;
|
|
24016
|
-
return `codexhost-${prefix}-${nextPreferenceId}`;
|
|
24017
|
-
}
|
|
24018
|
-
function createPreferenceGroup(document2, title) {
|
|
24019
|
-
const group = document2.createElement("section");
|
|
24020
|
-
group.className = "mt-7 first-of-type:mt-0";
|
|
24021
|
-
const header = document2.createElement("div");
|
|
24022
|
-
header.className = "mb-2 flex min-h-6 items-center gap-2 px-1";
|
|
24023
|
-
const heading = document2.createElement("h3");
|
|
24024
|
-
heading.id = preferenceId("preference-group");
|
|
24025
|
-
heading.className = "m-0 text-[13px] leading-5 font-semibold text-settings-text";
|
|
24026
|
-
heading.textContent = title;
|
|
24027
|
-
header.append(heading);
|
|
24028
|
-
const card = document2.createElement("div");
|
|
24029
|
-
card.className = "rounded-[10px] border border-settings-border bg-settings-panel";
|
|
24030
|
-
group.setAttribute("aria-labelledby", heading.id);
|
|
24031
|
-
group.append(header, card);
|
|
24032
|
-
return { group, header, card };
|
|
24033
|
-
}
|
|
24034
|
-
function createPreferenceItem(document2, input) {
|
|
24035
|
-
const item = document2.createElement("div");
|
|
24036
|
-
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";
|
|
24037
|
-
const copy = document2.createElement("div");
|
|
24038
|
-
copy.className = "flex min-w-0 flex-col gap-0.5";
|
|
24039
|
-
const heading = document2.createElement("div");
|
|
24040
|
-
heading.className = "flex items-center gap-1.5";
|
|
24041
|
-
const title = document2.createElement("label");
|
|
24042
|
-
title.htmlFor = input.controlId;
|
|
24043
|
-
title.className = "cursor-pointer text-[13px] leading-5 font-medium text-settings-text";
|
|
24044
|
-
title.textContent = input.title;
|
|
24045
|
-
heading.append(title);
|
|
24046
|
-
if (input.help) heading.append(createHelpTooltip(document2, input.help.label, input.help.lines));
|
|
24047
|
-
const description = document2.createElement("div");
|
|
24048
|
-
description.id = preferenceId("preference-description");
|
|
24049
|
-
description.className = "text-xs leading-[18px] text-settings-muted data-[invalid=true]:text-settings-danger";
|
|
24050
|
-
description.textContent = input.description;
|
|
24051
|
-
copy.append(heading, description);
|
|
24052
|
-
item.append(copy);
|
|
24053
|
-
return { item, description };
|
|
24054
|
-
}
|
|
24055
|
-
function createHelpTooltip(document2, label, lines) {
|
|
24056
|
-
const wrapper = document2.createElement("span");
|
|
24057
|
-
wrapper.className = "group relative inline-flex";
|
|
24058
|
-
const button2 = document2.createElement("button");
|
|
24059
|
-
button2.type = "button";
|
|
24060
|
-
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";
|
|
24061
|
-
button2.setAttribute("aria-label", label);
|
|
24062
|
-
button2.append(createRendererSettingsIcon("help", 14));
|
|
24063
|
-
const tooltip = document2.createElement("div");
|
|
24064
|
-
tooltip.id = preferenceId("preference-tooltip");
|
|
24065
|
-
tooltip.setAttribute("role", "tooltip");
|
|
24066
|
-
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";
|
|
24067
|
-
const list = document2.createElement("ul");
|
|
24068
|
-
list.className = "m-0 grid list-disc gap-1 pl-4 marker:text-settings-subtle";
|
|
24069
|
-
for (const line of lines) {
|
|
24070
|
-
const item = document2.createElement("li");
|
|
24071
|
-
item.textContent = line;
|
|
24072
|
-
list.append(item);
|
|
24073
|
-
}
|
|
24074
|
-
tooltip.append(list);
|
|
24075
|
-
button2.setAttribute("aria-describedby", tooltip.id);
|
|
24076
|
-
button2.addEventListener("keydown", (event) => {
|
|
24077
|
-
if (event.key === "Escape") button2.blur();
|
|
24078
|
-
});
|
|
24079
|
-
wrapper.append(button2, tooltip);
|
|
24080
|
-
return wrapper;
|
|
24081
|
-
}
|
|
24082
|
-
function createPreferenceSwitch(document2, id, describedBy) {
|
|
24083
|
-
const input = document2.createElement("input");
|
|
24084
|
-
input.type = "checkbox";
|
|
24085
|
-
input.id = id;
|
|
24086
|
-
input.setAttribute("role", "switch");
|
|
24087
|
-
input.setAttribute("aria-describedby", describedBy);
|
|
24088
|
-
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";
|
|
24089
|
-
return input;
|
|
24090
|
-
}
|
|
24091
|
-
function createNumberField(document2, input) {
|
|
24092
|
-
const field = document2.createElement("div");
|
|
24093
|
-
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";
|
|
24094
|
-
const control = document2.createElement("input");
|
|
24095
|
-
control.type = "number";
|
|
24096
|
-
control.id = input.id;
|
|
24097
|
-
control.min = String(input.min);
|
|
24098
|
-
control.max = String(input.max);
|
|
24099
|
-
control.step = "1";
|
|
24100
|
-
control.setAttribute("aria-describedby", input.describedBy);
|
|
24101
|
-
control.className = "w-14 border-0 bg-transparent p-0 text-right text-[13px] leading-5 text-settings-text tabular-nums outline-none";
|
|
24102
|
-
const unit = document2.createElement("span");
|
|
24103
|
-
unit.className = "text-xs text-settings-muted";
|
|
24104
|
-
unit.setAttribute("aria-hidden", "true");
|
|
24105
|
-
unit.textContent = input.unit;
|
|
24106
|
-
field.append(control, unit);
|
|
24107
|
-
return { field, control };
|
|
24108
|
-
}
|
|
24109
|
-
|
|
24110
24668
|
// src/settings/remote-connections-dialogs.ts
|
|
24111
24669
|
function createRemoteDialog({ container, signal, t }, title) {
|
|
24112
24670
|
if (signal.aborted || container.querySelector("dialog")) return null;
|
|
@@ -26722,45 +27280,6 @@ ${error51.stderrTail}`] : []
|
|
|
26722
27280
|
});
|
|
26723
27281
|
}
|
|
26724
27282
|
|
|
26725
|
-
// src/renderer-cpa-live-voice-preference.ts
|
|
26726
|
-
var CPA_LIVE_VOICE_STORAGE_KEY = "codexhost.cpa-live-voice.v1";
|
|
26727
|
-
var CPA_LIVE_VOICE_CHANGE_EVENT = "codexhost:cpa-live-voice-changed";
|
|
26728
|
-
function readCpaLiveVoicePreference(owner) {
|
|
26729
|
-
try {
|
|
26730
|
-
return owner.localStorage.getItem(CPA_LIVE_VOICE_STORAGE_KEY) !== "0";
|
|
26731
|
-
} catch {
|
|
26732
|
-
return true;
|
|
26733
|
-
}
|
|
26734
|
-
}
|
|
26735
|
-
function writeCpaLiveVoicePreference(owner, enabled) {
|
|
26736
|
-
try {
|
|
26737
|
-
owner.localStorage.setItem(CPA_LIVE_VOICE_STORAGE_KEY, enabled ? "1" : "0");
|
|
26738
|
-
} catch {
|
|
26739
|
-
return false;
|
|
26740
|
-
}
|
|
26741
|
-
owner.dispatchEvent(new Event(CPA_LIVE_VOICE_CHANGE_EVENT));
|
|
26742
|
-
return true;
|
|
26743
|
-
}
|
|
26744
|
-
|
|
26745
|
-
// src/renderer-cpa-live-voice-hook.ts
|
|
26746
|
-
var CPA_LIVE_VOICE_HOOK_GLOBAL = "__codexhostCpaLiveVoiceHookV1";
|
|
26747
|
-
function isRecord3(value) {
|
|
26748
|
-
return typeof value === "object" && value !== null;
|
|
26749
|
-
}
|
|
26750
|
-
function readCpaLiveVoiceHookConfig(globalObject) {
|
|
26751
|
-
const value = globalObject[CPA_LIVE_VOICE_HOOK_GLOBAL];
|
|
26752
|
-
if (!isRecord3(value) || value.enabled !== true) return null;
|
|
26753
|
-
if (typeof value.auditedDesktopVersion !== "string" || typeof value.auditedAppInitialAsset !== "string") {
|
|
26754
|
-
return null;
|
|
26755
|
-
}
|
|
26756
|
-
return {
|
|
26757
|
-
enabled: true,
|
|
26758
|
-
auditedDesktopVersion: value.auditedDesktopVersion,
|
|
26759
|
-
auditedAppInitialAsset: value.auditedAppInitialAsset,
|
|
26760
|
-
...typeof value.desktopVersion === "string" ? { desktopVersion: value.desktopVersion } : {}
|
|
26761
|
-
};
|
|
26762
|
-
}
|
|
26763
|
-
|
|
26764
27283
|
// src/renderer-codex-usage-banner-preference.ts
|
|
26765
27284
|
var CODEX_USAGE_BANNER_STORAGE_KEY = "codexhost.codex-usage-banner-hidden.v1";
|
|
26766
27285
|
var CODEX_USAGE_BANNER_CHANGE_EVENT = "codexhost:codex-usage-banner-changed";
|
|
@@ -27073,31 +27592,6 @@ ${error51.stderrTail}`] : []
|
|
|
27073
27592
|
ownerWindow.addEventListener(CODEX_USAGE_BANNER_CHANGE_EVENT, syncUsageBanner);
|
|
27074
27593
|
usageBannerRow.item.append(usageBanner);
|
|
27075
27594
|
card.append(usageBannerRow.item);
|
|
27076
|
-
const liveVoiceId = preferenceId("cpa-live-voice");
|
|
27077
|
-
const liveVoiceRow = createPreferenceItem(document2, {
|
|
27078
|
-
title: messages.cpaLiveVoiceTitle,
|
|
27079
|
-
description: messages.cpaLiveVoiceDescription,
|
|
27080
|
-
controlId: liveVoiceId,
|
|
27081
|
-
help: { label: messages.cpaLiveVoiceHelpLabel, lines: messages.cpaLiveVoiceHelp }
|
|
27082
|
-
});
|
|
27083
|
-
const liveVoice = createPreferenceSwitch(document2, liveVoiceId, liveVoiceRow.description.id);
|
|
27084
|
-
liveVoice.checked = readCpaLiveVoicePreference(ownerWindow);
|
|
27085
|
-
liveVoice.addEventListener("change", () => {
|
|
27086
|
-
writeCpaLiveVoicePreference(ownerWindow, liveVoice.checked);
|
|
27087
|
-
});
|
|
27088
|
-
const syncLiveVoice = () => {
|
|
27089
|
-
liveVoice.checked = readCpaLiveVoicePreference(ownerWindow);
|
|
27090
|
-
};
|
|
27091
|
-
ownerWindow.addEventListener(CPA_LIVE_VOICE_CHANGE_EVENT, syncLiveVoice);
|
|
27092
|
-
liveVoiceRow.item.append(liveVoice);
|
|
27093
|
-
if (!readCpaLiveVoiceHookConfig(ownerWindow)) {
|
|
27094
|
-
const warning = document2.createElement("div");
|
|
27095
|
-
warning.className = "text-xs leading-[18px] text-settings-warning";
|
|
27096
|
-
warning.setAttribute("role", "status");
|
|
27097
|
-
warning.textContent = messages.cpaLiveVoiceRestartRequired;
|
|
27098
|
-
liveVoiceRow.description.after(warning);
|
|
27099
|
-
}
|
|
27100
|
-
card.append(liveVoiceRow.item);
|
|
27101
27595
|
const softWrapId = preferenceId("reasoning-soft-wrap");
|
|
27102
27596
|
const row = createPreferenceItem(document2, {
|
|
27103
27597
|
title: messages.reasoningSoftWrapTitle,
|
|
@@ -27123,7 +27617,6 @@ ${error51.stderrTail}`] : []
|
|
|
27123
27617
|
);
|
|
27124
27618
|
return () => {
|
|
27125
27619
|
ownerWindow.removeEventListener(CODEX_USAGE_BANNER_CHANGE_EVENT, syncUsageBanner);
|
|
27126
|
-
ownerWindow.removeEventListener(CPA_LIVE_VOICE_CHANGE_EVENT, syncLiveVoice);
|
|
27127
27620
|
ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
27128
27621
|
disposeIdleRelease();
|
|
27129
27622
|
};
|
|
@@ -29296,7 +29789,7 @@ ${error51.stderrTail}`] : []
|
|
|
29296
29789
|
}
|
|
29297
29790
|
});
|
|
29298
29791
|
}
|
|
29299
|
-
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"))) {
|
|
29792
|
+
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"))) {
|
|
29300
29793
|
return Object.freeze([
|
|
29301
29794
|
createConnectionsSettingsPage(messages, getDiagnostics, void 0, getRemoteConnections),
|
|
29302
29795
|
createRemoteConnectionsPage(messages, getRemoteConnections),
|
|
@@ -29313,6 +29806,7 @@ ${error51.stderrTail}`] : []
|
|
|
29313
29806
|
messages.locale
|
|
29314
29807
|
),
|
|
29315
29808
|
createAppearanceSettingsPage(messages, getLoadedSessionsClient),
|
|
29809
|
+
createVoiceSettingsPage(messages.locale, requestVoiceSettings, { desktop: true }),
|
|
29316
29810
|
updatesPage(messages, getUpdateClient),
|
|
29317
29811
|
aboutPage(messages, getUpdateClient)
|
|
29318
29812
|
]);
|
|
@@ -31855,10 +32349,101 @@ ${error51.stderrTail}`] : []
|
|
|
31855
32349
|
animation: none !important;
|
|
31856
32350
|
}
|
|
31857
32351
|
}
|
|
32352
|
+
.settings-voice__select {
|
|
32353
|
+
flex: none;
|
|
32354
|
+
width: 190px;
|
|
32355
|
+
max-width: 100%;
|
|
32356
|
+
min-height: 34px;
|
|
32357
|
+
padding: 6px 10px;
|
|
32358
|
+
border: 1px solid var(--settings-border);
|
|
32359
|
+
border-radius: 6px;
|
|
32360
|
+
color: var(--settings-text);
|
|
32361
|
+
background: var(--settings-panel);
|
|
32362
|
+
font: inherit;
|
|
32363
|
+
font-size: 13px;
|
|
32364
|
+
}
|
|
32365
|
+
|
|
32366
|
+
.settings-voice :disabled {
|
|
32367
|
+
opacity: 0.45;
|
|
32368
|
+
cursor: not-allowed;
|
|
32369
|
+
}
|
|
32370
|
+
.settings-voice__footer {
|
|
32371
|
+
display: flex;
|
|
32372
|
+
align-items: center;
|
|
32373
|
+
justify-content: space-between;
|
|
32374
|
+
flex-wrap: wrap;
|
|
32375
|
+
gap: 16px;
|
|
32376
|
+
margin-top: 28px;
|
|
32377
|
+
padding-top: 18px;
|
|
32378
|
+
border-top: 1px solid var(--settings-divider);
|
|
32379
|
+
font-size: 13px;
|
|
32380
|
+
}
|
|
32381
|
+
.settings-voice__footer p,
|
|
32382
|
+
.settings-voice__hint {
|
|
32383
|
+
margin: 4px 0 0;
|
|
32384
|
+
color: var(--settings-muted);
|
|
32385
|
+
font-size: 12px;
|
|
32386
|
+
line-height: 18px;
|
|
32387
|
+
}
|
|
32388
|
+
.settings-voice__actions,
|
|
32389
|
+
.settings-voice__gateway-actions {
|
|
32390
|
+
display: flex;
|
|
32391
|
+
align-items: center;
|
|
32392
|
+
flex-wrap: wrap;
|
|
32393
|
+
gap: 12px;
|
|
32394
|
+
}
|
|
32395
|
+
.settings-voice__gateway-actions {
|
|
32396
|
+
color: var(--settings-muted);
|
|
32397
|
+
font-size: 12px;
|
|
32398
|
+
}
|
|
32399
|
+
.settings-voice__details {
|
|
32400
|
+
padding: 12px 16px;
|
|
32401
|
+
border-top: 1px solid var(--settings-divider);
|
|
32402
|
+
color: var(--settings-muted);
|
|
32403
|
+
font-size: 12px;
|
|
32404
|
+
line-height: 18px;
|
|
32405
|
+
overflow-wrap: anywhere;
|
|
32406
|
+
}
|
|
32407
|
+
.settings-voice__confirmation {
|
|
32408
|
+
margin-top: 12px;
|
|
32409
|
+
font-size: 13px;
|
|
32410
|
+
line-height: 20px;
|
|
32411
|
+
}
|
|
32412
|
+
.settings-voice__confirmation button + button {
|
|
32413
|
+
margin-left: 8px;
|
|
32414
|
+
}
|
|
32415
|
+
.settings-voice [role="alert"] {
|
|
32416
|
+
color: var(--settings-danger);
|
|
32417
|
+
font-size: 13px;
|
|
32418
|
+
overflow-wrap: anywhere;
|
|
32419
|
+
}
|
|
32420
|
+
.settings-voice {
|
|
32421
|
+
container-type: inline-size;
|
|
32422
|
+
}
|
|
32423
|
+
@container (max-width: 620px) {
|
|
32424
|
+
.settings-voice__row {
|
|
32425
|
+
align-items: stretch;
|
|
32426
|
+
flex-direction: column;
|
|
32427
|
+
gap: 10px;
|
|
32428
|
+
}
|
|
32429
|
+
.settings-voice__select {
|
|
32430
|
+
width: 100%;
|
|
32431
|
+
}
|
|
32432
|
+
.settings-voice__row input[role="switch"] {
|
|
32433
|
+
align-self: flex-start;
|
|
32434
|
+
}
|
|
32435
|
+
.settings-voice__footer {
|
|
32436
|
+
align-items: stretch;
|
|
32437
|
+
flex-direction: column;
|
|
32438
|
+
}
|
|
32439
|
+
.settings-voice__actions > button {
|
|
32440
|
+
flex: 1;
|
|
32441
|
+
}
|
|
32442
|
+
}
|
|
31858
32443
|
`;
|
|
31859
32444
|
|
|
31860
32445
|
// src/settings/tailwind.css
|
|
31861
|
-
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';
|
|
32446
|
+
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';
|
|
31862
32447
|
|
|
31863
32448
|
// src/console/app.ts
|
|
31864
32449
|
function required2(pages, id) {
|
|
@@ -31940,6 +32525,8 @@ ${error51.stderrTail}`] : []
|
|
|
31940
32525
|
(method, params) => manager.sendRequest(method, params)
|
|
31941
32526
|
);
|
|
31942
32527
|
const navigate = (pageId) => {
|
|
32528
|
+
navigation.classList.remove("is-open");
|
|
32529
|
+
menu.setAttribute("aria-expanded", "false");
|
|
31943
32530
|
window.location.hash = pageId;
|
|
31944
32531
|
};
|
|
31945
32532
|
const sections = [
|
|
@@ -31964,6 +32551,11 @@ ${error51.stderrTail}`] : []
|
|
|
31964
32551
|
hostPage(required2(settingsPages, "accounts"), messages, state),
|
|
31965
32552
|
hostPage(required2(settingsPages, "session-import"), messages, state),
|
|
31966
32553
|
hostPage(required2(settingsPages, "usage-statistics"), messages, state),
|
|
32554
|
+
createVoiceSettingsPage(
|
|
32555
|
+
locale,
|
|
32556
|
+
(input) => consolePost("/api/voice-settings", input, AbortSignal.timeout(1e4)),
|
|
32557
|
+
{ id: "live-voice" }
|
|
32558
|
+
),
|
|
31967
32559
|
required2(settingsPages, "updates")
|
|
31968
32560
|
]
|
|
31969
32561
|
},
|
|
@@ -32046,6 +32638,32 @@ ${console_default}`
|
|
|
32046
32638
|
createRendererSettingsIcon("alert", 16),
|
|
32047
32639
|
h(document2, "span", {}, `${messages.consoleOffline} \xB7 ${messages.consoleOfflineBody}`)
|
|
32048
32640
|
);
|
|
32641
|
+
const menu = h(
|
|
32642
|
+
document2,
|
|
32643
|
+
"button",
|
|
32644
|
+
{
|
|
32645
|
+
type: "button",
|
|
32646
|
+
className: "console-menu-button settings-command-button settings-command-button--secondary",
|
|
32647
|
+
"aria-label": settingsMessages.sectionsLabel,
|
|
32648
|
+
"aria-expanded": "false",
|
|
32649
|
+
"aria-controls": "console-navigation"
|
|
32650
|
+
},
|
|
32651
|
+
"\u2630"
|
|
32652
|
+
);
|
|
32653
|
+
navigation.id = "console-navigation";
|
|
32654
|
+
menu.addEventListener("click", () => {
|
|
32655
|
+
const open = menu.getAttribute("aria-expanded") !== "true";
|
|
32656
|
+
menu.setAttribute("aria-expanded", String(open));
|
|
32657
|
+
navigation.classList.toggle("is-open", open);
|
|
32658
|
+
});
|
|
32659
|
+
navigation.addEventListener("keydown", (event) => {
|
|
32660
|
+
if (event.key === "Escape") {
|
|
32661
|
+
navigation.classList.remove("is-open");
|
|
32662
|
+
menu.setAttribute("aria-expanded", "false");
|
|
32663
|
+
menu.focus();
|
|
32664
|
+
}
|
|
32665
|
+
});
|
|
32666
|
+
brand.append(menu);
|
|
32049
32667
|
shadow.append(
|
|
32050
32668
|
h(
|
|
32051
32669
|
document2,
|
|
@@ -32081,6 +32699,8 @@ ${console_default}`
|
|
|
32081
32699
|
const pageId = pages.has(requested) ? requested : "overview";
|
|
32082
32700
|
if (pageId === activeId) return;
|
|
32083
32701
|
activeId = pageId;
|
|
32702
|
+
navigation.classList.remove("is-open");
|
|
32703
|
+
menu.setAttribute("aria-expanded", "false");
|
|
32084
32704
|
scope?.dispose();
|
|
32085
32705
|
try {
|
|
32086
32706
|
cleanup?.();
|