@codexhost/cli-darwin-arm64 0.16.1 → 0.17.1
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 +2 -2
- package/THIRD_PARTY_NOTICES.txt +6 -2
- package/app/codexhost-distribution.json +1 -1
- package/app/console-server.mjs +55 -20
- package/app/console-web.js +46 -18
- package/app/desktop-controller.mjs +982 -59
- package/app/host-runtime.mjs +3578 -1900
- package/app/plugins/antigravity/plugin.mjs +62 -9
- package/app/plugins/claude-code/plugin.mjs +12 -6
- package/app/plugins/codebuddy/plugin.mjs +10 -0
- package/app/plugins/cursor-cli/plugin.mjs +28 -8
- package/app/plugins/deepseek-harness/plugin.mjs +459 -46
- package/app/plugins/devin/assets/icon.svg +1 -0
- package/app/plugins/devin/manifest.json +30 -0
- package/app/plugins/devin/plugin.mjs +23363 -0
- package/app/plugins/enabled.json +2 -0
- package/app/plugins/grok/plugin.mjs +472 -391
- package/app/plugins/hermes/plugin.mjs +453 -196
- package/app/plugins/kimi-code/plugin.mjs +50 -3
- package/app/plugins/pi/plugin.mjs +1580 -411
- package/app/plugins/qoder/plugin.mjs +9524 -8654
- package/app/plugins/qoder-cn/plugin.mjs +9524 -8654
- package/app/plugins/qwen-code/assets/icon.svg +1 -0
- package/app/plugins/qwen-code/manifest.json +29 -0
- package/app/plugins/qwen-code/plugin.mjs +29298 -0
- package/app/plugins/workbuddy/plugin.mjs +10 -0
- package/app/plugins/zcode/plugin.mjs +142 -9
- package/app/renderer-extension.js +163 -55
- package/bin/codexhost +0 -0
- package/libexec/codexhost-shim +0 -0
- package/libexec/codexhost-updater +0 -0
- package/licenses/Qwen-Code-SDK-LICENSE.txt +203 -0
- 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.
|
|
10
|
+
npm install -g @codexhost/cli@0.17.1
|
|
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
|
|
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
|
package/THIRD_PARTY_NOTICES.txt
CHANGED
|
@@ -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.
|
|
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
|
+
@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.
|
|
1
|
+
{"schemaVersion":1,"version":"0.17.1","distribution":"npm","target":"macos-arm64"}
|
package/app/console-server.mjs
CHANGED
|
@@ -17031,33 +17031,58 @@ var HarnessLaunchSettingsStore = class {
|
|
|
17031
17031
|
return path8.join(this.#directory, `${harnessPluginIdSchema.parse(id)}.json`);
|
|
17032
17032
|
}
|
|
17033
17033
|
async #read(id) {
|
|
17034
|
+
const file2 = this.#file(id);
|
|
17035
|
+
let text;
|
|
17034
17036
|
try {
|
|
17035
|
-
|
|
17036
|
-
if (!path8.isAbsolute(value))
|
|
17037
|
-
throw new Error("Expected an absolute entrypoint path");
|
|
17038
|
-
return value;
|
|
17037
|
+
text = await readFile4(file2, "utf8");
|
|
17039
17038
|
} catch (error51) {
|
|
17040
17039
|
if (error51 && typeof error51 === "object" && "code" in error51 && error51.code === "ENOENT")
|
|
17041
17040
|
return null;
|
|
17042
|
-
throw new Error(
|
|
17041
|
+
throw new Error(`Could not read Harness launch settings at ${file2}`, { cause: error51 });
|
|
17043
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;
|
|
17044
17052
|
}
|
|
17045
|
-
|
|
17046
|
-
async initialCommand(id) {
|
|
17053
|
+
#snapshot(id) {
|
|
17047
17054
|
let initial = this.#initial.get(id);
|
|
17048
17055
|
if (!initial) {
|
|
17049
|
-
initial = this.#read(id);
|
|
17056
|
+
initial = this.#read(id).then((value) => ({ path: value }), (error51) => ({ error: error51 instanceof Error ? error51 : new Error(String(error51)) }));
|
|
17050
17057
|
this.#initial.set(id, initial);
|
|
17051
17058
|
}
|
|
17052
|
-
return
|
|
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;
|
|
17053
17077
|
}
|
|
17054
17078
|
async get(id) {
|
|
17055
|
-
const
|
|
17079
|
+
const snapshot = await this.#snapshot(id);
|
|
17056
17080
|
const value = await this.#read(id);
|
|
17057
|
-
return { path: value, restartRequired: value
|
|
17081
|
+
return { path: value, restartRequired: this.#restartRequired(snapshot, value) };
|
|
17058
17082
|
}
|
|
17083
|
+
/** Replaces the file without reading it, so an unreadable file can always be repaired. */
|
|
17059
17084
|
async set(id, value) {
|
|
17060
|
-
const
|
|
17085
|
+
const snapshot = await this.#snapshot(id);
|
|
17061
17086
|
const file2 = this.#file(id);
|
|
17062
17087
|
if (value === null) {
|
|
17063
17088
|
await rm3(file2, { force: true });
|
|
@@ -17078,7 +17103,7 @@ var HarnessLaunchSettingsStore = class {
|
|
|
17078
17103
|
await rm3(temporary, { force: true });
|
|
17079
17104
|
}
|
|
17080
17105
|
}
|
|
17081
|
-
return { path: value, restartRequired: value
|
|
17106
|
+
return { path: value, restartRequired: this.#restartRequired(snapshot, value) };
|
|
17082
17107
|
}
|
|
17083
17108
|
};
|
|
17084
17109
|
|
|
@@ -17139,10 +17164,15 @@ function createConsoleHarnesses(roots, environment = process.env) {
|
|
|
17139
17164
|
if (seen.has(manifest.id)) continue;
|
|
17140
17165
|
seen.add(manifest.id);
|
|
17141
17166
|
const icon = manifest.icon ? await readPluginIcon(plugin.root, manifest.icon).catch(() => null) : null;
|
|
17142
|
-
|
|
17143
|
-
|
|
17144
|
-
|
|
17145
|
-
|
|
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
|
+
}
|
|
17146
17176
|
harnesses.push({
|
|
17147
17177
|
id: manifest.id,
|
|
17148
17178
|
name: manifest.name,
|
|
@@ -17151,7 +17181,8 @@ function createConsoleHarnesses(roots, environment = process.env) {
|
|
|
17151
17181
|
launchCommand: manifest.launchCommand === true,
|
|
17152
17182
|
links: manifest.links ?? null,
|
|
17153
17183
|
icon,
|
|
17154
|
-
launchPath
|
|
17184
|
+
launchPath,
|
|
17185
|
+
launchPathError
|
|
17155
17186
|
});
|
|
17156
17187
|
}
|
|
17157
17188
|
return harnesses.sort(
|
|
@@ -17168,7 +17199,7 @@ function createConsoleHarnesses(roots, environment = process.env) {
|
|
|
17168
17199
|
}
|
|
17169
17200
|
try {
|
|
17170
17201
|
const settings = await store.set(id, value);
|
|
17171
|
-
return { ...harness2, launchPath: settings.path };
|
|
17202
|
+
return { ...harness2, launchPath: settings.path, launchPathError: null };
|
|
17172
17203
|
} catch (error51) {
|
|
17173
17204
|
throw new ConsoleHarnessError(400, error51 instanceof Error ? error51.message : String(error51));
|
|
17174
17205
|
}
|
|
@@ -18107,7 +18138,11 @@ function startConsoleServer(options) {
|
|
|
18107
18138
|
return;
|
|
18108
18139
|
}
|
|
18109
18140
|
scheduleIdleExit();
|
|
18110
|
-
const url2 =
|
|
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
|
+
}
|
|
18111
18146
|
const method = request.method ?? "GET";
|
|
18112
18147
|
const route = `${method} ${url2.pathname}`;
|
|
18113
18148
|
if (route === "GET /api/health") {
|
package/app/console-web.js
CHANGED
|
@@ -18782,13 +18782,12 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
18782
18782
|
{ className: "console-harness__path" },
|
|
18783
18783
|
input,
|
|
18784
18784
|
button(document2, messages.save, () => submit(input.value.trim() || null)),
|
|
18785
|
-
harness2.launchPath ? button(document2, messages.useAutomatic, () => submit(null)) : null
|
|
18785
|
+
harness2.launchPath || harness2.launchPathError ? button(document2, messages.useAutomatic, () => submit(null)) : null
|
|
18786
18786
|
)
|
|
18787
18787
|
);
|
|
18788
|
-
|
|
18789
|
-
|
|
18790
|
-
|
|
18791
|
-
);
|
|
18788
|
+
const message2 = status.get(harness2.id) ?? harness2.launchPathError;
|
|
18789
|
+
if (message2) {
|
|
18790
|
+
row.append(h(document2, "div", { className: "console-muted" }, message2));
|
|
18792
18791
|
}
|
|
18793
18792
|
}
|
|
18794
18793
|
if (guide) {
|
|
@@ -19396,7 +19395,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
19396
19395
|
};
|
|
19397
19396
|
function isUnsupportedMethod(error51, method) {
|
|
19398
19397
|
if (typeof error51 !== "object" || error51 === null) return false;
|
|
19399
|
-
const code = "code" in error51 ? error51.code : void 0;
|
|
19398
|
+
const code = "code" in error51 ? error51.code : "jsonRpcCode" in error51 ? error51.jsonRpcCode : void 0;
|
|
19400
19399
|
const message2 = "message" in error51 ? error51.message : void 0;
|
|
19401
19400
|
return code === -32601 || code === -32600 && typeof message2 === "string" && message2.startsWith(`Invalid request: unknown variant \`${method}\``);
|
|
19402
19401
|
}
|
|
@@ -20965,7 +20964,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20965
20964
|
launchPathAutomatic: "No saved override. Uses environment configuration, then automatic discovery.",
|
|
20966
20965
|
launchPathSaving: "Saving\u2026",
|
|
20967
20966
|
launchPathLoading: "Loading launch settings\u2026",
|
|
20968
|
-
launchPathLoadError: "Could not load launch settings.
|
|
20967
|
+
launchPathLoadError: "Could not load launch settings. Save an installation directory or reset to automatic discovery to replace them.",
|
|
20969
20968
|
launchPathSaveError: "Could not save. Enter an existing absolute installation folder on this Host and check configuration permissions.",
|
|
20970
20969
|
connectionOfficialWebsite: "Visit official website",
|
|
20971
20970
|
connectionOpenHarnessWeb: "Open DeepSeek Harness Web",
|
|
@@ -21244,7 +21243,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21244
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",
|
|
21245
21244
|
launchPathSaving: "\u6B63\u5728\u4FDD\u5B58\u2026",
|
|
21246
21245
|
launchPathLoading: "\u6B63\u5728\u8BFB\u53D6\u542F\u52A8\u8BBE\u7F6E\u2026",
|
|
21247
|
-
launchPathLoadError: "\u65E0\u6CD5\u8BFB\u53D6\u542F\u52A8\u8BBE\u7F6E\
|
|
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",
|
|
21248
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",
|
|
21249
21248
|
connectionOfficialWebsite: "\u8BBF\u95EE\u5B98\u7F51",
|
|
21250
21249
|
connectionOpenHarnessWeb: "\u6253\u5F00 DeepSeek Harness Web",
|
|
@@ -23887,7 +23886,7 @@ ${detail}` : ""}`
|
|
|
23887
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",
|
|
23888
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",
|
|
23889
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",
|
|
23890
|
-
"Remote Node.js is unsupported. Select Node.js 22.19 or later
|
|
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",
|
|
23891
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",
|
|
23892
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",
|
|
23893
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",
|
|
@@ -25160,6 +25159,7 @@ ${detail}` : ""}`
|
|
|
25160
25159
|
loaded = true;
|
|
25161
25160
|
show(value);
|
|
25162
25161
|
}).catch(() => {
|
|
25162
|
+
loaded = true;
|
|
25163
25163
|
status.textContent = messages.launchPathLoadError;
|
|
25164
25164
|
}).finally(() => {
|
|
25165
25165
|
busy = false;
|
|
@@ -26647,6 +26647,30 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
|
|
|
26647
26647
|
};
|
|
26648
26648
|
}
|
|
26649
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
|
+
|
|
26650
26674
|
// src/settings/session-import-page.ts
|
|
26651
26675
|
function shortSessionId(value) {
|
|
26652
26676
|
return value.length <= 18 ? value : `${value.slice(0, 10)}\u2026${value.slice(-6)}`;
|
|
@@ -26716,7 +26740,7 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
|
|
|
26716
26740
|
...getDiagnostics()?.snapshot().hosts.map(({ hostId: hostId2 }) => hostId2) ?? [],
|
|
26717
26741
|
...current ? [current] : []
|
|
26718
26742
|
])
|
|
26719
|
-
];
|
|
26743
|
+
].filter((hostId2) => hostId2 !== "durable");
|
|
26720
26744
|
displayedHostId = current;
|
|
26721
26745
|
const scrollLeft = hostOptions.scrollLeft;
|
|
26722
26746
|
hostOptions.replaceChildren();
|
|
@@ -27060,10 +27084,14 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
|
|
|
27060
27084
|
content.append(list);
|
|
27061
27085
|
updateImportActions();
|
|
27062
27086
|
};
|
|
27063
|
-
const load = () => {
|
|
27087
|
+
const load = (refreshDiagnostics = false) => {
|
|
27064
27088
|
if (importingId !== null || context.signal.aborted) return;
|
|
27065
27089
|
loadedClient = null;
|
|
27066
|
-
|
|
27090
|
+
let client = getClient(selectedHostId);
|
|
27091
|
+
if (client?.hostId === "durable") {
|
|
27092
|
+
selectedHostId = "local";
|
|
27093
|
+
client = getClient(selectedHostId);
|
|
27094
|
+
}
|
|
27067
27095
|
renderHosts(client);
|
|
27068
27096
|
listControls.setBusy(client !== null);
|
|
27069
27097
|
refresh.disabled = client !== null;
|
|
@@ -27076,11 +27104,11 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
|
|
|
27076
27104
|
void context.runLatest(
|
|
27077
27105
|
async (signal) => {
|
|
27078
27106
|
if (!client) throw new RendererSessionImportUnavailableError();
|
|
27079
|
-
const
|
|
27080
|
-
|
|
27081
|
-
|
|
27082
|
-
|
|
27083
|
-
|
|
27107
|
+
const harnesses = await loadSessionImportSources(
|
|
27108
|
+
client,
|
|
27109
|
+
getDiagnostics(),
|
|
27110
|
+
signal,
|
|
27111
|
+
refreshDiagnostics
|
|
27084
27112
|
);
|
|
27085
27113
|
const selected = harnesses.find(({ harnessId }) => harnessId === requestedHarness)?.harnessId ?? harnesses[0]?.harnessId ?? null;
|
|
27086
27114
|
if (signal.aborted) throw new Error("Session import selection changed");
|
|
@@ -27131,7 +27159,7 @@ ${messages.harnessVersionLatest}: ${harnessVersionLabel(version2.state, messages
|
|
|
27131
27159
|
load();
|
|
27132
27160
|
hostButtons.find((button2) => button2.dataset.sessionImportHost === hostId2)?.focus();
|
|
27133
27161
|
};
|
|
27134
|
-
refresh.addEventListener("click", load);
|
|
27162
|
+
refresh.addEventListener("click", () => load(true));
|
|
27135
27163
|
load();
|
|
27136
27164
|
return void 0;
|
|
27137
27165
|
}
|