@codexhost/cli-win32-x64 0.1.4 → 0.1.5

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 CHANGED
@@ -7,7 +7,7 @@ Run Pi and Claude Code as first-class external harnesses inside Codex Desktop.
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- npm install -g @codexhost/cli@0.1.4
10
+ npm install -g @codexhost/cli@0.1.5
11
11
  ```
12
12
 
13
13
  Do not install this package directly. npm selects it through the optional dependencies of `@codexhost/cli`.
@@ -1 +1 @@
1
- {"schemaVersion":1,"version":"0.1.4","distribution":"npm","target":"windows-x64"}
1
+ {"schemaVersion":1,"version":"0.1.5","distribution":"npm","target":"windows-x64"}
@@ -1087,15 +1087,27 @@ var InstalledRendererControlSession = class {
1087
1087
  this.inspector.close();
1088
1088
  }
1089
1089
  };
1090
+ var startupTraceStartedAt = Date.now();
1091
+ function startupTrace(stage) {
1092
+ if (process.env.CODEXHOST_STARTUP_TRACE !== "1") return;
1093
+ console.error(
1094
+ `[codexhost startup +${Date.now() - startupTraceStartedAt}ms] renderer-session: ${stage}`
1095
+ );
1096
+ }
1090
1097
  async function createRendererControlSession(options) {
1091
1098
  const enabledAgents = options.enabledAgents ?? ["codex", "pi"];
1092
1099
  const timeoutMs = options.timeoutMs ?? 3e4;
1093
1100
  const pollIntervalMs = options.pollIntervalMs ?? 250;
1094
1101
  const operations = options.operations ?? defaultOperations;
1102
+ startupTrace("waiting for initial Renderer");
1095
1103
  const initial = await waitForRenderer(options.inspector, operations, timeoutMs, pollIntervalMs);
1104
+ startupTrace("installing title policy");
1096
1105
  const titlePolicy = await operations.installTitlePolicy(options.inspector, initial.id);
1106
+ startupTrace("reloading Renderer");
1097
1107
  await operations.reload(options.inspector, initial.id);
1108
+ startupTrace("waiting for reloaded Renderer");
1098
1109
  const selected = await waitForRenderer(options.inspector, operations, timeoutMs, pollIntervalMs);
1110
+ startupTrace("waiting for title policy readiness");
1099
1111
  const titlePolicyReadiness = await waitForRendererTitlePolicyReady(
1100
1112
  () => operations.markTitlePolicyReady(options.inspector, selected.id),
1101
1113
  {
@@ -1103,7 +1115,9 @@ async function createRendererControlSession(options) {
1103
1115
  pollIntervalMs
1104
1116
  }
1105
1117
  );
1118
+ startupTrace("injecting Renderer bundle");
1106
1119
  await operations.execute(options.inspector, selected.id, options.rendererSource);
1120
+ startupTrace("waiting for Renderer binding");
1107
1121
  const binding = await waitForBinding(
1108
1122
  options.inspector,
1109
1123
  operations,
@@ -1112,6 +1126,7 @@ async function createRendererControlSession(options) {
1112
1126
  timeoutMs,
1113
1127
  pollIntervalMs
1114
1128
  );
1129
+ startupTrace("installing draft prewarm policy");
1115
1130
  const draftPrewarmPolicy = await operations.installDraftPrewarmPolicy(
1116
1131
  options.inspector,
1117
1132
  selected.id
@@ -1135,12 +1150,15 @@ async function createRendererControlSession(options) {
1135
1150
  async function installRendererControlSession(options) {
1136
1151
  const timeoutMs = options.timeoutMs ?? 3e4;
1137
1152
  const pollIntervalMs = options.pollIntervalMs ?? 250;
1153
+ startupTrace("waiting for Electron Inspector target");
1138
1154
  const target = await waitForInspectorTarget(options.inspectorEndpoint, {
1139
1155
  timeoutMs,
1140
1156
  pollIntervalMs
1141
1157
  });
1158
+ startupTrace("connecting to Electron Inspector");
1142
1159
  const inspector = await CdpClient.connect(target.webSocketDebuggerUrl);
1143
1160
  try {
1161
+ startupTrace("enabling Inspector Runtime domain");
1144
1162
  await inspector.command("Runtime.enable");
1145
1163
  return await createRendererControlSession({
1146
1164
  ...options,
@@ -1161,6 +1179,14 @@ var TRANSIENT_INSTALL_ATTEMPTS = 3;
1161
1179
  var TRANSIENT_INSTALL_RETRY_MS = 250;
1162
1180
  var RECOVERY_RETRY_INITIAL_MS = 3e4;
1163
1181
  var RECOVERY_RETRY_MAX_MS = 3e5;
1182
+ var startupTraceStartedAt2 = Date.now();
1183
+ function startupTrace2(stage, detail) {
1184
+ if (process.env.CODEXHOST_STARTUP_TRACE !== "1") return;
1185
+ const suffix = detail === void 0 ? "" : `: ${detail instanceof Error ? detail.message : String(detail)}`;
1186
+ console.error(
1187
+ `[codexhost startup +${Date.now() - startupTraceStartedAt2}ms] controller: ${stage}${suffix}`
1188
+ );
1189
+ }
1164
1190
  function validCompatibilityIssue(state, issue) {
1165
1191
  const keys = Object.keys(issue);
1166
1192
  if (state === "compatible-with-warning") {
@@ -1316,9 +1342,11 @@ async function runDesktopController(options, signal, dependencies = defaultDepen
1316
1342
  recoveryDelayMs = RECOVERY_RETRY_INITIAL_MS;
1317
1343
  };
1318
1344
  const createSession = async () => {
1345
+ startupTrace2("reading Renderer bundle");
1319
1346
  const rendererSource = await dependencies.readRenderer(options.rendererPath);
1320
1347
  if (rendererSource.trim().length === 0) throw new Error("production Renderer Bundle is empty");
1321
- return installProductionSession(
1348
+ startupTrace2("installing Renderer Session");
1349
+ const installed = await installProductionSession(
1322
1350
  {
1323
1351
  inspectorEndpoint: options.inspectorEndpoint,
1324
1352
  rendererSource: `${configuration}
@@ -1328,11 +1356,15 @@ ${rendererSource}`,
1328
1356
  },
1329
1357
  dependencies
1330
1358
  );
1359
+ startupTrace2("Renderer Session installed");
1360
+ return installed;
1331
1361
  };
1362
+ startupTrace2("initialization started");
1332
1363
  try {
1333
1364
  session = await createSession();
1334
1365
  recordRecoverySuccess();
1335
- } catch {
1366
+ } catch (error) {
1367
+ startupTrace2("initial Renderer Session unavailable", error);
1336
1368
  session = void 0;
1337
1369
  recordRecoveryFailure();
1338
1370
  }
@@ -1367,6 +1399,7 @@ ${rendererSource}`,
1367
1399
  };
1368
1400
  let attachmentServer;
1369
1401
  try {
1402
+ startupTrace2("starting attachment server");
1370
1403
  attachmentServer = await dependencies.startAttachmentServer({
1371
1404
  port: options.attachmentPort,
1372
1405
  nonce: options.attachmentNonce,
@@ -1383,7 +1416,9 @@ ${rendererSource}`,
1383
1416
  await current.quitDesktop();
1384
1417
  })
1385
1418
  });
1419
+ startupTrace2("attachment server ready");
1386
1420
  const issues = session?.snapshot.titlePolicy.warnings ?? [];
1421
+ startupTrace2("publishing readiness");
1387
1422
  dependencies.ready({
1388
1423
  schemaVersion: 2,
1389
1424
  state: issues.length === 0 ? "compatible" : "compatible-with-warning",
@@ -53101,8 +53101,7 @@ function createBackgroundUpdateManager(dependencies = {}) {
53101
53101
  kind: "npm",
53102
53102
  node_path: await requireRegularFile(options.nodePath, "npm Node.js executable"),
53103
53103
  npm_cli_path: await requireRegularFile(options.npmCliPath, "npm CLI"),
53104
- npm_launcher_path: await requireRegularFile(options.npmLauncherPath, "npm codexhost launcher"),
53105
- package_root: requireAbsolutePath(options.packageRoot, "npm platform package root")
53104
+ npm_launcher_path: await requireRegularFile(options.npmLauncherPath, "npm codexhost launcher")
53106
53105
  });
53107
53106
  } catch (error52) {
53108
53107
  await writeFailedStatus(common.statusPath, common.version, "npm", error52);
@@ -18168,15 +18168,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18168
18168
  locale: "en",
18169
18169
  title: "Settings",
18170
18170
  close: "Close settings",
18171
- interfaceLanguage: "Interface language",
18172
- automaticLanguage: "Automatic (follow Codex)",
18173
- englishLanguage: "English",
18174
- simplifiedChineseLanguage: "Simplified Chinese",
18175
- otherCodexLanguage: "Other Codex language",
18176
- languageUpdateFailed: "Could not update the language setting.",
18171
+ starOnGitHub: "Give us a Star~",
18177
18172
  sectionsLabel: "Settings sections",
18178
18173
  pageUnavailable: "Page unavailable",
18179
- availability: "Availability",
18174
+ inDevelopment: "In development",
18180
18175
  notAvailable: "Not available",
18181
18176
  runtimeCapabilityNotInstalled: "This runtime capability is not installed yet.",
18182
18177
  openSettings: "Open codexhost settings",
@@ -18195,11 +18190,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18195
18190
  updateChecking: "Checking for updates...",
18196
18191
  updateDownloading: "Downloading update...",
18197
18192
  updatePreparing: "Preparing update...",
18193
+ updateWaitingForExit: "Waiting for the application to close...",
18194
+ updateInstalling: "Installing update...",
18195
+ updateInstallingNpm: "Installing update through npm...",
18198
18196
  updateRequestTimeout: "The update service did not respond. Try again.",
18199
18197
  updateRestarting: "Restarting to finish the update...",
18200
18198
  updateSucceeded: "Update installed successfully.",
18201
18199
  updateFailed: "Update failed.",
18202
18200
  updateRetry: "Retry",
18201
+ updateManualNpmDescription: "To update manually, quit codexhost and run this command:",
18203
18202
  updateDownloadFromReleases: "Download from GitHub Releases",
18204
18203
  pageLabels: Object.freeze({
18205
18204
  connections: "Connections",
@@ -18213,15 +18212,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18213
18212
  locale: "zh-CN",
18214
18213
  title: "\u8BBE\u7F6E",
18215
18214
  close: "\u5173\u95ED\u8BBE\u7F6E",
18216
- interfaceLanguage: "\u754C\u9762\u8BED\u8A00",
18217
- automaticLanguage: "\u81EA\u52A8\uFF08\u8DDF\u968F Codex\uFF09",
18218
- englishLanguage: "English",
18219
- simplifiedChineseLanguage: "\u7B80\u4F53\u4E2D\u6587",
18220
- otherCodexLanguage: "\u5176\u4ED6 Codex \u8BED\u8A00",
18221
- languageUpdateFailed: "\u65E0\u6CD5\u66F4\u65B0\u8BED\u8A00\u8BBE\u7F6E\u3002",
18215
+ starOnGitHub: "\u70B9\u4E2A Star~",
18222
18216
  sectionsLabel: "\u8BBE\u7F6E\u5206\u7C7B",
18223
18217
  pageUnavailable: "\u9875\u9762\u4E0D\u53EF\u7528",
18224
- availability: "\u53EF\u7528\u6027",
18218
+ inDevelopment: "\u5F00\u53D1\u4E2D",
18225
18219
  notAvailable: "\u6682\u4E0D\u53EF\u7528",
18226
18220
  runtimeCapabilityNotInstalled: "\u8FD0\u884C\u65F6\u5C1A\u672A\u5B89\u88C5\u8BE5\u9879\u80FD\u529B\uFF0C\u56E0\u6B64\u6682\u4E0D\u53EF\u7528\u3002",
18227
18221
  openSettings: "\u6253\u5F00 codexhost \u8BBE\u7F6E",
@@ -18240,11 +18234,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18240
18234
  updateChecking: "\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...",
18241
18235
  updateDownloading: "\u6B63\u5728\u4E0B\u8F7D\u66F4\u65B0...",
18242
18236
  updatePreparing: "\u6B63\u5728\u51C6\u5907\u66F4\u65B0...",
18237
+ updateWaitingForExit: "\u6B63\u5728\u7B49\u5F85\u5E94\u7528\u9000\u51FA...",
18238
+ updateInstalling: "\u6B63\u5728\u5B89\u88C5\u66F4\u65B0...",
18239
+ updateInstallingNpm: "\u6B63\u5728\u901A\u8FC7 npm \u5B89\u88C5...",
18243
18240
  updateRequestTimeout: "\u66F4\u65B0\u670D\u52A1\u672A\u54CD\u5E94\uFF0C\u8BF7\u91CD\u8BD5\u3002",
18244
18241
  updateRestarting: "\u6B63\u5728\u91CD\u542F\u4EE5\u5B8C\u6210\u66F4\u65B0...",
18245
18242
  updateSucceeded: "\u66F4\u65B0\u5B89\u88C5\u6210\u529F\u3002",
18246
18243
  updateFailed: "\u66F4\u65B0\u5931\u8D25\u3002",
18247
18244
  updateRetry: "\u91CD\u8BD5",
18245
+ updateManualNpmDescription: "\u5982\u9700\u624B\u52A8\u66F4\u65B0\uFF0C\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C\u4EE5\u4E0B\u547D\u4EE4\u3002\u66F4\u65B0\u5B8C\u6210\u540E\uFF0C\u8BF7\u9000\u51FA Codex \u5E76\u901A\u8FC7 codexhost \u91CD\u65B0\u542F\u52A8\u3002",
18248
18246
  updateDownloadFromReleases: "\u524D\u5F80 GitHub Releases \u4E0B\u8F7D",
18249
18247
  pageLabels: Object.freeze({
18250
18248
  connections: "\u8FDE\u63A5",
@@ -18380,6 +18378,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18380
18378
  ["circle", { cx: "12", cy: "12", r: "3" }]
18381
18379
  ];
18382
18380
 
18381
+ // ../../node_modules/lucide/dist/esm/icons/star.mjs
18382
+ var Star = [
18383
+ [
18384
+ "path",
18385
+ {
18386
+ d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"
18387
+ }
18388
+ ]
18389
+ ];
18390
+
18383
18391
  // ../../node_modules/lucide/dist/esm/icons/x.mjs
18384
18392
  var X = [
18385
18393
  ["path", { d: "M18 6 6 18" }],
@@ -18393,6 +18401,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18393
18401
  var RENDERER_SETTINGS_ICON_NAMES = [
18394
18402
  "settings",
18395
18403
  "close",
18404
+ "star",
18396
18405
  "language",
18397
18406
  "connections",
18398
18407
  "model-pool",
@@ -18406,6 +18415,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18406
18415
  var iconNodes = {
18407
18416
  settings: Settings,
18408
18417
  close: X,
18418
+ star: Star,
18409
18419
  language: Languages,
18410
18420
  connections: PlugZap,
18411
18421
  "model-pool": Boxes,
@@ -18592,6 +18602,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18592
18602
 
18593
18603
  // src/settings/pages.ts
18594
18604
  var CODEXHOST_RELEASES_LATEST_URL = "https://github.com/BytePioneer-AI/codex-host/releases/latest";
18605
+ var CODEXHOST_NPM_MANUAL_UPDATE_COMMAND = "npm install -g @codexhost/cli@latest";
18595
18606
  var DEFAULT_RENDERER_SETTINGS_PAGE_IDS = [
18596
18607
  "connections",
18597
18608
  "model-pool",
@@ -18600,19 +18611,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18600
18611
  "updates"
18601
18612
  ];
18602
18613
  function appendUnavailableStatus(content, messages) {
18603
- const heading = content.ownerDocument.createElement("div");
18604
- heading.className = "settings-section-label";
18605
- heading.textContent = messages.availability;
18606
18614
  const status = content.ownerDocument.createElement("div");
18607
18615
  status.className = "settings-empty";
18608
18616
  const copy = content.ownerDocument.createElement("div");
18609
18617
  const title = content.ownerDocument.createElement("strong");
18610
- title.textContent = messages.notAvailable;
18611
- const detail = content.ownerDocument.createElement("span");
18612
- detail.textContent = messages.runtimeCapabilityNotInstalled;
18613
- copy.append(title, detail);
18618
+ title.textContent = messages.inDevelopment;
18619
+ copy.append(title);
18614
18620
  status.append(copy);
18615
- content.append(heading, status);
18621
+ content.append(status);
18616
18622
  }
18617
18623
  function unavailablePage(id, messages) {
18618
18624
  return Object.freeze({
@@ -18650,6 +18656,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18650
18656
  if (!status) return null;
18651
18657
  if (status.phase === "succeeded") return messages.updateSucceeded;
18652
18658
  if (status.phase === "failed") return status.error ?? messages.updateFailed;
18659
+ if (status.phase === "waiting-for-exit") return messages.updateWaitingForExit;
18660
+ if (status.phase === "installing") {
18661
+ return status.installation === "npm" ? messages.updateInstallingNpm : messages.updateInstalling;
18662
+ }
18653
18663
  if (status.phase === "restarting") return messages.updateRestarting;
18654
18664
  if (status.phase === "downloading") return messages.updateDownloading;
18655
18665
  return messages.updatePreparing;
@@ -18696,6 +18706,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18696
18706
  const panel = document2.createElement("section");
18697
18707
  panel.className = "settings-update-panel";
18698
18708
  panel.setAttribute("aria-live", "polite");
18709
+ const manualNpm = document2.createElement("div");
18710
+ manualNpm.className = "settings-update-manual";
18711
+ manualNpm.hidden = true;
18712
+ const manualNpmDescription = document2.createElement("span");
18713
+ manualNpmDescription.textContent = messages.updateManualNpmDescription;
18714
+ const manualNpmCommand = document2.createElement("code");
18715
+ manualNpmCommand.textContent = CODEXHOST_NPM_MANUAL_UPDATE_COMMAND;
18716
+ manualNpm.append(manualNpmDescription, manualNpmCommand);
18699
18717
  const actions = document2.createElement("div");
18700
18718
  actions.className = "settings-update-actions";
18701
18719
  const releaseLink = document2.createElement("a");
@@ -18708,7 +18726,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18708
18726
  createRendererSettingsIcon("external-link", 14)
18709
18727
  );
18710
18728
  actions.append(releaseLink);
18711
- context.content.append(heading, metadata, panel, actions);
18729
+ context.content.append(heading, metadata, panel, manualNpm, actions);
18712
18730
  let pollTimer;
18713
18731
  let pollAttempts = 0;
18714
18732
  let pending = false;
@@ -18813,6 +18831,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18813
18831
  const renderCheck = (result, client) => {
18814
18832
  currentVersionValue.textContent = `v${result.currentVersion}`;
18815
18833
  installationValue.textContent = installationLabel(result.installation, messages);
18834
+ manualNpm.hidden = result.installation !== "npm";
18816
18835
  if (result.releaseNotesUrl) releaseLink.href = result.releaseNotesUrl;
18817
18836
  const operationMessage = statusMessage(result.status, messages);
18818
18837
  if (isPendingStatus(result.status)) {
@@ -18904,10 +18923,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18904
18923
  }
18905
18924
 
18906
18925
  // src/settings/shell.css
18907
- var shell_default = ':host {\n --settings-bg: #181818;\n --settings-sidebar: #1c1c1c;\n --settings-panel: transparent;\n --settings-text: #f5f5f5;\n --settings-muted: #a1a1a1;\n --settings-border: rgb(255 255 255 / 10%);\n --settings-divider: rgb(255 255 255 / 10%);\n --settings-hover: rgb(255 255 255 / 6%);\n --settings-active: rgb(51 156 255 / 12%);\n --settings-focus: #339cff;\n color: var(--settings-text);\n color-scheme: dark;\n font:\n 14px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n box-shadow: 0 24px 64px rgb(0 0 0 / 38%);\n}\n\n.codexhost-settings-dialog::backdrop {\n background: rgb(0 0 0 / 52%);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 240px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 28px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 64px;\n flex: none;\n padding: 0 16px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 32px;\n height: 32px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 500;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 14px;\n padding-left: 14px;\n color: var(--settings-muted);\n font-size: 14px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 4px;\n padding: 0 12px 16px;\n overflow-y: auto;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 40px;\n flex: none;\n gap: 12px;\n padding: 8px 12px;\n color: var(--settings-text);\n font-size: 14px;\n line-height: 21px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 10px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 18px;\n height: 18px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-focus);\n}\n\n.settings-nav-button[aria-current="page"]::before {\n position: absolute;\n left: 0;\n width: 3px;\n height: 22px;\n content: "";\n background: var(--settings-focus);\n border-radius: 0 3px 3px 0;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 44px 0 56px;\n}\n\n.settings-section-label {\n min-height: auto;\n padding: 0 0 28px;\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 88px;\n gap: 28px;\n padding: 16px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 14px;\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n flex: none;\n color: var(--settings-muted);\n background: rgb(255 255 255 / 7%);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 5px 12px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 500;\n line-height: 18px;\n background: rgb(255 255 255 / 9%);\n border: 1px solid rgb(255 255 255 / 6%);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-update-panel {\n display: grid;\n gap: 16px;\n min-height: 128px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel > strong,\n.settings-update-panel > span,\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-panel > span,\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: #ef4444;\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: #238be8;\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-notes {\n max-height: 240px;\n padding: 14px;\n overflow: auto;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-divider);\n border-radius: 6px;\n}\n\n.settings-update-version-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-height: 32px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-update-version-row strong {\n color: var(--settings-text);\n font-size: 15px;\n}\n\n.settings-update-actions {\n display: flex;\n min-width: 0;\n margin-top: 16px;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n min-height: 36px;\n gap: 8px;\n padding: 8px 12px;\n color: white;\n font: inherit;\n font-size: 13px;\n text-decoration: none;\n background: #1677d2;\n border: 1px solid #238be8;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: transparent;\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover,\n.settings-update-link:hover {\n filter: brightness(1.08);\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host,\n :host([data-theme="dark"]) {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n }\n}\n';
18926
+ var shell_default = ':host {\n --settings-bg: #181818;\n --settings-sidebar: #1c1c1c;\n --settings-panel: transparent;\n --settings-text: #f5f5f5;\n --settings-muted: #a1a1a1;\n --settings-border: rgb(255 255 255 / 10%);\n --settings-divider: rgb(255 255 255 / 10%);\n --settings-hover: rgb(255 255 255 / 6%);\n --settings-active: rgb(51 156 255 / 12%);\n --settings-focus: #339cff;\n color: var(--settings-text);\n color-scheme: dark;\n font:\n 14px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n box-shadow: 0 24px 64px rgb(0 0 0 / 38%);\n}\n\n.codexhost-settings-dialog::backdrop {\n background: rgb(0 0 0 / 52%);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 240px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 28px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 64px;\n flex: none;\n padding: 0 16px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-header-actions {\n display: flex;\n align-items: center;\n flex: none;\n gap: 12px;\n margin-left: auto;\n}\n\n.settings-icon-button.settings-star-link {\n width: auto;\n gap: 6px;\n padding-inline: 8px;\n font-size: 12px;\n line-height: 18px;\n text-decoration: none;\n border: 2px dashed #f5c542;\n white-space: nowrap;\n}\n\n.settings-star-link .codexhost-settings-icon {\n color: #f5c542;\n fill: currentColor;\n stroke: currentColor;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 32px;\n height: 32px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 500;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 14px;\n padding-left: 14px;\n color: var(--settings-muted);\n font-size: 14px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 4px;\n padding: 0 12px 16px;\n overflow-y: auto;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 40px;\n flex: none;\n gap: 12px;\n padding: 8px 12px;\n color: var(--settings-text);\n font-size: 14px;\n line-height: 21px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 10px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 18px;\n height: 18px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-focus);\n}\n\n.settings-nav-button[aria-current="page"]::before {\n position: absolute;\n left: 0;\n width: 3px;\n height: 22px;\n content: "";\n background: var(--settings-focus);\n border-radius: 0 3px 3px 0;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 44px 0 56px;\n}\n\n.settings-section-label {\n min-height: auto;\n padding: 0 0 28px;\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 88px;\n gap: 28px;\n padding: 16px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 14px;\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n flex: none;\n color: var(--settings-muted);\n background: rgb(255 255 255 / 7%);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 5px 12px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 500;\n line-height: 18px;\n background: rgb(255 255 255 / 9%);\n border: 1px solid rgb(255 255 255 / 6%);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-update-panel {\n display: grid;\n gap: 16px;\n min-height: 128px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel > strong,\n.settings-update-panel > span,\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-panel > span,\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: #ef4444;\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: #238be8;\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-notes {\n max-height: 240px;\n padding: 14px;\n overflow: auto;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-divider);\n border-radius: 6px;\n}\n\n.settings-update-version-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-height: 32px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-update-version-row strong {\n color: var(--settings-text);\n font-size: 15px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 6px;\n margin-top: 14px;\n padding-inline: 4px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual code {\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-actions {\n display: flex;\n min-width: 0;\n margin-top: 16px;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n min-height: 36px;\n gap: 8px;\n padding: 8px 12px;\n color: white;\n font: inherit;\n font-size: 13px;\n text-decoration: none;\n background: #1677d2;\n border: 1px solid #238be8;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: transparent;\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover,\n.settings-update-link:hover {\n filter: brightness(1.08);\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-icon-button.settings-star-link {\n width: 28px;\n padding: 0;\n }\n\n .settings-star-link span {\n display: none;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host,\n :host([data-theme="dark"]) {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n }\n}\n';
18908
18927
 
18909
18928
  // src/settings/shell.ts
18910
18929
  var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
18930
+ var CODEXHOST_GITHUB_REPOSITORY_URL = "https://github.com/BytePioneer-AI/codex-host";
18911
18931
  function isRendererSettingsDialogSupported(dialog) {
18912
18932
  return typeof dialog.showModal === "function" && typeof dialog.close === "function";
18913
18933
  }
@@ -18952,13 +18972,26 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18952
18972
  brandTitle.textContent = messages.title;
18953
18973
  brandCopy.append(brandName, brandTitle);
18954
18974
  brand.append(brandMark, brandCopy);
18975
+ const headerActions = ownerDocument.createElement("div");
18976
+ headerActions.className = "settings-header-actions";
18977
+ const starLink = ownerDocument.createElement("a");
18978
+ starLink.className = "settings-icon-button settings-star-link";
18979
+ starLink.href = CODEXHOST_GITHUB_REPOSITORY_URL;
18980
+ starLink.target = "_blank";
18981
+ starLink.rel = "noopener noreferrer";
18982
+ starLink.setAttribute("aria-label", messages.starOnGitHub);
18983
+ starLink.title = messages.starOnGitHub;
18984
+ const starLabel = ownerDocument.createElement("span");
18985
+ starLabel.textContent = messages.starOnGitHub;
18986
+ starLink.append(createRendererSettingsIcon("star", 16), starLabel);
18955
18987
  const closeButton = ownerDocument.createElement("button");
18956
18988
  closeButton.type = "button";
18957
18989
  closeButton.className = "settings-icon-button";
18958
18990
  closeButton.setAttribute("aria-label", messages.close);
18959
18991
  closeButton.title = messages.close;
18960
18992
  closeButton.append(createRendererSettingsIcon("close", 18));
18961
- header.append(brand, closeButton);
18993
+ headerActions.append(starLink, closeButton);
18994
+ header.append(brand, headerActions);
18962
18995
  const layout = ownerDocument.createElement("div");
18963
18996
  layout.className = "settings-layout";
18964
18997
  const sidebar = ownerDocument.createElement("aside");
@@ -20874,6 +20907,7 @@ lucide/dist/esm/icons/plug-zap.mjs:
20874
20907
  lucide/dist/esm/icons/refresh-cw.mjs:
20875
20908
  lucide/dist/esm/icons/route.mjs:
20876
20909
  lucide/dist/esm/icons/settings.mjs:
20910
+ lucide/dist/esm/icons/star.mjs:
20877
20911
  lucide/dist/esm/icons/x.mjs:
20878
20912
  (**
20879
20913
  * @license lucide v1.28.0 - ISC
package/bin/codexhost.exe CHANGED
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codexhost/cli-win32-x64",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Run Pi and Claude Code as first-class external harnesses inside Codex Desktop.",
5
5
  "type": "module",
6
6
  "files": [