@codexhost/cli-darwin-x64 0.16.0 → 0.17.0

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.
Files changed (38) hide show
  1. package/README.md +2 -2
  2. package/THIRD_PARTY_NOTICES.txt +6 -2
  3. package/app/codexhost-distribution.json +1 -1
  4. package/app/console-server.mjs +59 -21
  5. package/app/console-web.js +49 -18
  6. package/app/desktop-controller.mjs +554 -34
  7. package/app/host-runtime.mjs +3436 -1846
  8. package/app/plugins/antigravity/plugin.mjs +39 -3
  9. package/app/plugins/claude-code/plugin.mjs +16 -7
  10. package/app/plugins/codebuddy/plugin.mjs +14 -1
  11. package/app/plugins/codex-usage/plugin.mjs +4 -1
  12. package/app/plugins/copilot/plugin.mjs +4 -1
  13. package/app/plugins/cursor-cli/plugin.mjs +13 -6
  14. package/app/plugins/deepseek-harness/plugin.mjs +463 -47
  15. package/app/plugins/devin/assets/icon.svg +1 -0
  16. package/app/plugins/devin/manifest.json +30 -0
  17. package/app/plugins/devin/plugin.mjs +23363 -0
  18. package/app/plugins/enabled.json +2 -0
  19. package/app/plugins/grok/plugin.mjs +476 -392
  20. package/app/plugins/hermes/plugin.mjs +457 -197
  21. package/app/plugins/kimi-code/plugin.mjs +4 -1
  22. package/app/plugins/kiro-cli/plugin.mjs +4 -1
  23. package/app/plugins/omp/plugin.mjs +4 -1
  24. package/app/plugins/opencode/plugin.mjs +4 -1
  25. package/app/plugins/pi/plugin.mjs +1464 -412
  26. package/app/plugins/qoder/plugin.mjs +9528 -8655
  27. package/app/plugins/qoder-cn/plugin.mjs +9528 -8655
  28. package/app/plugins/qwen-code/assets/icon.svg +1 -0
  29. package/app/plugins/qwen-code/manifest.json +29 -0
  30. package/app/plugins/qwen-code/plugin.mjs +29298 -0
  31. package/app/plugins/workbuddy/plugin.mjs +14 -1
  32. package/app/plugins/zcode/plugin.mjs +4 -1
  33. package/app/renderer-extension.js +510 -114
  34. package/bin/codexhost +0 -0
  35. package/libexec/codexhost-shim +0 -0
  36. package/libexec/codexhost-updater +0 -0
  37. package/licenses/Qwen-Code-SDK-LICENSE.txt +203 -0
  38. package/package.json +2 -2
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.16.0
10
+ npm install -g @codexhost/cli@0.17.0
11
11
  ```
12
12
 
13
13
  Do not install this package directly. npm selects it through the optional dependencies of `@codexhost/cli`.
@@ -36,7 +36,7 @@ The `codexhost` command launches the packaged Rust launcher with:
36
36
 
37
37
  ## Requirements
38
38
 
39
- - Node.js 22 or 24 (Node 20 and older are not supported)
39
+ - Node.js 22.19.0 or later, except 23.x (other releases lack parts of the built-in `node:sqlite` module)
40
40
  - Official ChatGPT/Codex Desktop for macOS, Windows, or Linux
41
41
  - Pi on `PATH` when using the Pi agent
42
42
  - Claude Code installed when using the Claude Code adapter
@@ -32,14 +32,18 @@ License text: licenses/OpenCode-v2-Client-LICENSE.txt
32
32
  License: MIT
33
33
  License text: licenses/OpenCode-SDK-LICENSE.txt
34
34
 
35
- @qoder-ai/qoder-agent-sdk 1.0.39
35
+ @qoder-ai/qoder-agent-sdk 1.0.58
36
36
  License: SEE LICENSE IN LICENSE
37
37
  License text: licenses/Qoder-Agent-SDK-LICENSE.txt
38
38
 
39
- @qodercn-ai/qodercn-agent-sdk 1.0.39
39
+ @qodercn-ai/qodercn-agent-sdk 1.0.58
40
40
  License: SEE LICENSE IN LICENSE
41
41
  License text: licenses/QoderCN-Agent-SDK-LICENSE.txt
42
42
 
43
+ @qwen-code/sdk 0.1.26
44
+ License: Apache-2.0
45
+ License text: licenses/Qwen-Code-SDK-LICENSE.txt
46
+
43
47
  diff 8.0.2
44
48
  License: BSD-3-Clause
45
49
  License text: licenses/diff-LICENSE.txt
@@ -1 +1 @@
1
- {"schemaVersion":1,"version":"0.16.0","distribution":"npm","target":"macos-x64"}
1
+ {"schemaVersion":1,"version":"0.17.0","distribution":"npm","target":"macos-x64"}
@@ -16460,7 +16460,10 @@ var harnessPluginRouteSchema = external_exports.object({
16460
16460
  harnessId: harnessPluginIdSchema,
16461
16461
  model: harnessModelRefSchema.optional(),
16462
16462
  thinkingOptionId: harnessThinkingOptionIdSchema.optional(),
16463
- permissionModeId: harnessPermissionModeIdSchema.optional()
16463
+ permissionModeId: harnessPermissionModeIdSchema.optional(),
16464
+ /** A draft prewarm create: stays unsubmitted until the user's first Turn.
16465
+ * Desktop forwards only the Model of a main-process prewarm to thread/start. */
16466
+ prewarm: external_exports.literal(true).optional()
16464
16467
  }).strict();
16465
16468
 
16466
16469
  // packages/shared-contracts/dist/harness-launch-settings.js
@@ -17028,33 +17031,58 @@ var HarnessLaunchSettingsStore = class {
17028
17031
  return path8.join(this.#directory, `${harnessPluginIdSchema.parse(id)}.json`);
17029
17032
  }
17030
17033
  async #read(id) {
17034
+ const file2 = this.#file(id);
17035
+ let text;
17031
17036
  try {
17032
- const value = harnessLaunchPathSchema.parse(JSON.parse(await readFile4(this.#file(id), "utf8")));
17033
- if (!path8.isAbsolute(value))
17034
- throw new Error("Expected an absolute entrypoint path");
17035
- return value;
17037
+ text = await readFile4(file2, "utf8");
17036
17038
  } catch (error51) {
17037
17039
  if (error51 && typeof error51 === "object" && "code" in error51 && error51.code === "ENOENT")
17038
17040
  return null;
17039
- throw new Error("Could not read Harness launch settings");
17041
+ throw new Error(`Could not read Harness launch settings at ${file2}`, { cause: error51 });
17040
17042
  }
17043
+ let parsed;
17044
+ try {
17045
+ parsed = harnessLaunchPathSchema.parse(JSON.parse(text));
17046
+ } catch {
17047
+ }
17048
+ if (parsed === void 0 || !path8.isAbsolute(parsed)) {
17049
+ throw new Error(`Could not read Harness launch settings at ${file2}: expected an absolute installation path; save a new path or reset it`);
17050
+ }
17051
+ return parsed;
17041
17052
  }
17042
- /** Capture the value used to construct this Host's Adapter; changes require a restart. */
17043
- async initialCommand(id) {
17053
+ #snapshot(id) {
17044
17054
  let initial = this.#initial.get(id);
17045
17055
  if (!initial) {
17046
- initial = this.#read(id);
17056
+ initial = this.#read(id).then((value) => ({ path: value }), (error51) => ({ error: error51 instanceof Error ? error51 : new Error(String(error51)) }));
17047
17057
  this.#initial.set(id, initial);
17048
17058
  }
17049
- return await initial ?? void 0;
17059
+ return initial;
17060
+ }
17061
+ /**
17062
+ * Capture the value used to construct this Host's Adapter; changes require a restart. A failed
17063
+ * read is remembered for restart reporting but not reused: the next call reads the file again.
17064
+ */
17065
+ async initialCommand(id) {
17066
+ const cached2 = this.#initial.get(id);
17067
+ if (cached2 && "error" in await cached2)
17068
+ this.#initial.delete(id);
17069
+ const snapshot = await this.#snapshot(id);
17070
+ if ("error" in snapshot)
17071
+ throw snapshot.error;
17072
+ return snapshot.path ?? void 0;
17073
+ }
17074
+ /** The Adapter was built without a readable setting, so any saved value needs a restart. */
17075
+ #restartRequired(snapshot, value) {
17076
+ return "error" in snapshot || value !== snapshot.path;
17050
17077
  }
17051
17078
  async get(id) {
17052
- const initial = await this.initialCommand(id) ?? null;
17079
+ const snapshot = await this.#snapshot(id);
17053
17080
  const value = await this.#read(id);
17054
- return { path: value, restartRequired: value !== initial };
17081
+ return { path: value, restartRequired: this.#restartRequired(snapshot, value) };
17055
17082
  }
17083
+ /** Replaces the file without reading it, so an unreadable file can always be repaired. */
17056
17084
  async set(id, value) {
17057
- const initial = await this.initialCommand(id) ?? null;
17085
+ const snapshot = await this.#snapshot(id);
17058
17086
  const file2 = this.#file(id);
17059
17087
  if (value === null) {
17060
17088
  await rm3(file2, { force: true });
@@ -17075,7 +17103,7 @@ var HarnessLaunchSettingsStore = class {
17075
17103
  await rm3(temporary, { force: true });
17076
17104
  }
17077
17105
  }
17078
- return { path: value, restartRequired: value !== initial };
17106
+ return { path: value, restartRequired: this.#restartRequired(snapshot, value) };
17079
17107
  }
17080
17108
  };
17081
17109
 
@@ -17136,10 +17164,15 @@ function createConsoleHarnesses(roots, environment = process.env) {
17136
17164
  if (seen.has(manifest.id)) continue;
17137
17165
  seen.add(manifest.id);
17138
17166
  const icon = manifest.icon ? await readPluginIcon(plugin.root, manifest.icon).catch(() => null) : null;
17139
- const launchPath = manifest.launchCommand ? await store.get(manifest.id).then(
17140
- (settings) => settings.path,
17141
- () => null
17142
- ) : null;
17167
+ let launchPath = null;
17168
+ let launchPathError = null;
17169
+ if (manifest.launchCommand) {
17170
+ try {
17171
+ launchPath = (await store.get(manifest.id)).path;
17172
+ } catch (error51) {
17173
+ launchPathError = error51 instanceof Error ? error51.message : String(error51);
17174
+ }
17175
+ }
17143
17176
  harnesses.push({
17144
17177
  id: manifest.id,
17145
17178
  name: manifest.name,
@@ -17148,7 +17181,8 @@ function createConsoleHarnesses(roots, environment = process.env) {
17148
17181
  launchCommand: manifest.launchCommand === true,
17149
17182
  links: manifest.links ?? null,
17150
17183
  icon,
17151
- launchPath
17184
+ launchPath,
17185
+ launchPathError
17152
17186
  });
17153
17187
  }
17154
17188
  return harnesses.sort(
@@ -17165,7 +17199,7 @@ function createConsoleHarnesses(roots, environment = process.env) {
17165
17199
  }
17166
17200
  try {
17167
17201
  const settings = await store.set(id, value);
17168
- return { ...harness2, launchPath: settings.path };
17202
+ return { ...harness2, launchPath: settings.path, launchPathError: null };
17169
17203
  } catch (error51) {
17170
17204
  throw new ConsoleHarnessError(400, error51 instanceof Error ? error51.message : String(error51));
17171
17205
  }
@@ -18104,7 +18138,11 @@ function startConsoleServer(options) {
18104
18138
  return;
18105
18139
  }
18106
18140
  scheduleIdleExit();
18107
- const url2 = new URL(request.url ?? "/", `http://127.0.0.1:${port}`);
18141
+ const url2 = URL.parse(request.url ?? "/", `http://127.0.0.1:${port}`);
18142
+ if (!url2) {
18143
+ sendJson(response, 400, { error: "Bad Request" });
18144
+ return;
18145
+ }
18108
18146
  const method = request.method ?? "GET";
18109
18147
  const route = `${method} ${url2.pathname}`;
18110
18148
  if (route === "GET /api/health") {
@@ -15681,7 +15681,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15681
15681
  harnessId: harnessPluginIdSchema,
15682
15682
  model: harnessModelRefSchema.optional(),
15683
15683
  thinkingOptionId: harnessThinkingOptionIdSchema.optional(),
15684
- permissionModeId: harnessPermissionModeIdSchema.optional()
15684
+ permissionModeId: harnessPermissionModeIdSchema.optional(),
15685
+ /** A draft prewarm create: stays unsubmitted until the user's first Turn.
15686
+ * Desktop forwards only the Model of a main-process prewarm to thread/start. */
15687
+ prewarm: external_exports.literal(true).optional()
15685
15688
  }).strict();
15686
15689
 
15687
15690
  // ../shared-contracts/dist/harness-launch-settings.js
@@ -18779,13 +18782,12 @@ th[aria-sort] .console-usage-sort__mark {
18779
18782
  { className: "console-harness__path" },
18780
18783
  input,
18781
18784
  button(document2, messages.save, () => submit(input.value.trim() || null)),
18782
- harness2.launchPath ? button(document2, messages.useAutomatic, () => submit(null)) : null
18785
+ harness2.launchPath || harness2.launchPathError ? button(document2, messages.useAutomatic, () => submit(null)) : null
18783
18786
  )
18784
18787
  );
18785
- if (status.has(harness2.id)) {
18786
- row.append(
18787
- h(document2, "div", { className: "console-muted" }, status.get(harness2.id) ?? "")
18788
- );
18788
+ const message2 = status.get(harness2.id) ?? harness2.launchPathError;
18789
+ if (message2) {
18790
+ row.append(h(document2, "div", { className: "console-muted" }, message2));
18789
18791
  }
18790
18792
  }
18791
18793
  if (guide) {
@@ -20962,7 +20964,7 @@ th[aria-sort] .console-usage-sort__mark {
20962
20964
  launchPathAutomatic: "No saved override. Uses environment configuration, then automatic discovery.",
20963
20965
  launchPathSaving: "Saving\u2026",
20964
20966
  launchPathLoading: "Loading launch settings\u2026",
20965
- launchPathLoadError: "Could not load launch settings. Reopen this detail panel to retry.",
20967
+ launchPathLoadError: "Could not load launch settings. Save an installation directory or reset to automatic discovery to replace them.",
20966
20968
  launchPathSaveError: "Could not save. Enter an existing absolute installation folder on this Host and check configuration permissions.",
20967
20969
  connectionOfficialWebsite: "Visit official website",
20968
20970
  connectionOpenHarnessWeb: "Open DeepSeek Harness Web",
@@ -21241,7 +21243,7 @@ th[aria-sort] .console-usage-sort__mark {
21241
21243
  launchPathAutomatic: "\u672A\u8BBE\u7F6E\u81EA\u5B9A\u4E49\u8DEF\u5F84\uFF0C\u4F7F\u7528\u73AF\u5883\u53D8\u91CF\u914D\u7F6E\u6216\u81EA\u52A8\u53D1\u73B0\u3002",
21242
21244
  launchPathSaving: "\u6B63\u5728\u4FDD\u5B58\u2026",
21243
21245
  launchPathLoading: "\u6B63\u5728\u8BFB\u53D6\u542F\u52A8\u8BBE\u7F6E\u2026",
21244
- launchPathLoadError: "\u65E0\u6CD5\u8BFB\u53D6\u542F\u52A8\u8BBE\u7F6E\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u6B64\u8BE6\u60C5\u9762\u677F\u91CD\u8BD5\u3002",
21246
+ launchPathLoadError: "\u65E0\u6CD5\u8BFB\u53D6\u542F\u52A8\u8BBE\u7F6E\u3002\u4FDD\u5B58\u5B89\u88C5\u76EE\u5F55\u6216\u6062\u590D\u81EA\u52A8\u53D1\u73B0\u5373\u53EF\u66FF\u6362\u3002",
21245
21247
  launchPathSaveError: "\u4FDD\u5B58\u5931\u8D25\u3002\u8BF7\u586B\u5199\u6B64 Host \u4E0A\u5B9E\u9645\u5B58\u5728\u7684\u5B89\u88C5\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5E76\u786E\u8BA4\u914D\u7F6E\u76EE\u5F55\u53EF\u5199\u3002",
21246
21248
  connectionOfficialWebsite: "\u8BBF\u95EE\u5B98\u7F51",
21247
21249
  connectionOpenHarnessWeb: "\u6253\u5F00 DeepSeek Harness Web",
@@ -23884,7 +23886,7 @@ ${detail}` : ""}`
23884
23886
  "codexhost was not detected over SSH. Install it on the remote computer or add it to the login shell PATH, then retry": "\u901A\u8FC7 SSH \u672A\u68C0\u6D4B\u5230 codexhost\u3002\u8BF7\u5728\u8FDC\u7A0B\u7535\u8111\u4E0A\u5B89\u88C5\uFF0C\u6216\u5C06\u5DF2\u5B89\u88C5\u7684 codexhost \u52A0\u5165\u767B\u5F55 shell \u7684 PATH \u540E\u91CD\u8BD5",
23885
23887
  "The active codexhost does not match the global npm installation. Uninstall only the remote service, or remove the package manually on the remote computer": "\u5F53\u524D codexhost \u4E0E npm \u5168\u5C40\u5B89\u88C5\u4F4D\u7F6E\u4E0D\u5339\u914D\u3002\u8BF7\u9009\u62E9\u4EC5\u5378\u8F7D\u8FDC\u7A0B\u670D\u52A1\uFF0C\u6216\u5728\u8FDC\u7A0B\u7535\u8111\u4E0A\u624B\u52A8\u5378\u8F7D\u8F6F\u4EF6\u5305",
23886
23888
  "The remote service was uninstalled, but removing the codexhost package failed. Check npm permissions on the remote computer and retry": "\u8FDC\u7A0B\u670D\u52A1\u5DF2\u5378\u8F7D\uFF0C\u4F46 codexhost \u8F6F\u4EF6\u5305\u5378\u8F7D\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u8FDC\u7A0B\u7535\u8111\u4E0A\u7684 npm \u6743\u9650\u540E\u91CD\u8BD5",
23887
- "Remote Node.js is unsupported. Select Node.js 22.19 or later in the 22.x series, or Node.js 24.x": "\u8FDC\u7A0B Node.js \u7248\u672C\u4E0D\u53D7\u652F\u6301\uFF0C\u8BF7\u9009\u62E9 Node.js 22.19 \u53CA\u4EE5\u4E0A\u7684 22.x \u7248\u672C\uFF0C\u6216 Node.js 24.x",
23889
+ "Remote Node.js is unsupported. Select Node.js 22.19 or later, except 23.x": "\u8FDC\u7A0B Node.js \u7248\u672C\u4E0D\u53D7\u652F\u6301\uFF0C\u8BF7\u9009\u62E9 Node.js 22.19 \u53CA\u4EE5\u4E0A\u7248\u672C\uFF0C\u4F46\u4E0D\u5305\u62EC 23.x",
23888
23890
  "npm installation failed. Check network access and global installation permissions": "npm \u5B89\u88C5\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u548C\u5168\u5C40\u5B89\u88C5\u6743\u9650",
23889
23891
  "Remote service configuration failed. Check Codex CLI and the remote desktop login": "\u8FDC\u7A0B\u670D\u52A1\u914D\u7F6E\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Codex CLI \u4EE5\u53CA\u8FDC\u7A0B\u7535\u8111\u7684\u684C\u9762\u767B\u5F55\u72B6\u6001",
23890
23892
  "Remote service could not stop. Check the remote service before retrying": "\u8FDC\u7A0B\u670D\u52A1\u65E0\u6CD5\u505C\u6B62\uFF0C\u8BF7\u68C0\u67E5\u8FDC\u7A0B\u670D\u52A1\u540E\u91CD\u8BD5",
@@ -25157,6 +25159,7 @@ ${detail}` : ""}`
25157
25159
  loaded = true;
25158
25160
  show(value);
25159
25161
  }).catch(() => {
25162
+ loaded = true;
25160
25163
  status.textContent = messages.launchPathLoadError;
25161
25164
  }).finally(() => {
25162
25165
  busy = false;
@@ -26644,6 +26647,30 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
26644
26647
  };
26645
26648
  }
26646
26649
 
26650
+ // src/settings/session-import-sources.ts
26651
+ async function loadSessionImportSources(client, diagnostics, signal, refresh) {
26652
+ const { harnesses } = await client.listSessionImportSources();
26653
+ signal.throwIfAborted();
26654
+ if (!diagnostics || harnesses.length === 0) return harnesses;
26655
+ const hostId2 = client.hostId ?? "local";
26656
+ const readHost = () => diagnostics.snapshot().hosts.find((host2) => host2.hostId === hostId2);
26657
+ let host = readHost();
26658
+ const incomplete = () => !host || Boolean(host.directoryError) || harnesses.some(({ harnessId }) => {
26659
+ const status = host?.agents.find(({ agent }) => agent === harnessId)?.availability;
26660
+ return status === void 0 || status === "checking";
26661
+ });
26662
+ if (refresh || incomplete()) {
26663
+ await diagnostics.refresh(hostId2);
26664
+ signal.throwIfAborted();
26665
+ host = readHost();
26666
+ }
26667
+ if (incomplete()) throw new Error("Harness installation diagnostics are incomplete");
26668
+ const missing = new Set(
26669
+ host?.agents.filter(({ availability }) => availability === "notInstalled").map(({ agent }) => agent)
26670
+ );
26671
+ return harnesses.filter(({ harnessId }) => !missing.has(harnessId));
26672
+ }
26673
+
26647
26674
  // src/settings/session-import-page.ts
26648
26675
  function shortSessionId(value) {
26649
26676
  return value.length <= 18 ? value : `${value.slice(0, 10)}\u2026${value.slice(-6)}`;
@@ -26713,7 +26740,7 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
26713
26740
  ...getDiagnostics()?.snapshot().hosts.map(({ hostId: hostId2 }) => hostId2) ?? [],
26714
26741
  ...current ? [current] : []
26715
26742
  ])
26716
- ];
26743
+ ].filter((hostId2) => hostId2 !== "durable");
26717
26744
  displayedHostId = current;
26718
26745
  const scrollLeft = hostOptions.scrollLeft;
26719
26746
  hostOptions.replaceChildren();
@@ -27057,10 +27084,14 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
27057
27084
  content.append(list);
27058
27085
  updateImportActions();
27059
27086
  };
27060
- const load = () => {
27087
+ const load = (refreshDiagnostics = false) => {
27061
27088
  if (importingId !== null || context.signal.aborted) return;
27062
27089
  loadedClient = null;
27063
- const client = getClient(selectedHostId);
27090
+ let client = getClient(selectedHostId);
27091
+ if (client?.hostId === "durable") {
27092
+ selectedHostId = "local";
27093
+ client = getClient(selectedHostId);
27094
+ }
27064
27095
  renderHosts(client);
27065
27096
  listControls.setBusy(client !== null);
27066
27097
  refresh.disabled = client !== null;
@@ -27073,11 +27104,11 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
27073
27104
  void context.runLatest(
27074
27105
  async (signal) => {
27075
27106
  if (!client) throw new RendererSessionImportUnavailableError();
27076
- const missing = new Set(
27077
- getDiagnostics()?.snapshot().hosts.find(({ hostId: hostId2 }) => hostId2 === (client.hostId ?? "local"))?.agents.filter(({ availability }) => availability === "notInstalled").map(({ agent }) => agent)
27078
- );
27079
- const harnesses = (await client.listSessionImportSources()).harnesses.filter(
27080
- ({ harnessId }) => !missing.has(harnessId)
27107
+ const harnesses = await loadSessionImportSources(
27108
+ client,
27109
+ getDiagnostics(),
27110
+ signal,
27111
+ refreshDiagnostics
27081
27112
  );
27082
27113
  const selected = harnesses.find(({ harnessId }) => harnessId === requestedHarness)?.harnessId ?? harnesses[0]?.harnessId ?? null;
27083
27114
  if (signal.aborted) throw new Error("Session import selection changed");
@@ -27128,7 +27159,7 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
27128
27159
  load();
27129
27160
  hostButtons.find((button2) => button2.dataset.sessionImportHost === hostId2)?.focus();
27130
27161
  };
27131
- refresh.addEventListener("click", load);
27162
+ refresh.addEventListener("click", () => load(true));
27132
27163
  load();
27133
27164
  return void 0;
27134
27165
  }