@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.
- package/README.md +2 -2
- package/THIRD_PARTY_NOTICES.txt +6 -2
- package/app/codexhost-distribution.json +1 -1
- package/app/console-server.mjs +59 -21
- package/app/console-web.js +49 -18
- package/app/desktop-controller.mjs +554 -34
- package/app/host-runtime.mjs +3436 -1846
- package/app/plugins/antigravity/plugin.mjs +39 -3
- package/app/plugins/claude-code/plugin.mjs +16 -7
- package/app/plugins/codebuddy/plugin.mjs +14 -1
- package/app/plugins/codex-usage/plugin.mjs +4 -1
- package/app/plugins/copilot/plugin.mjs +4 -1
- package/app/plugins/cursor-cli/plugin.mjs +13 -6
- package/app/plugins/deepseek-harness/plugin.mjs +463 -47
- 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 +476 -392
- package/app/plugins/hermes/plugin.mjs +457 -197
- package/app/plugins/kimi-code/plugin.mjs +4 -1
- package/app/plugins/kiro-cli/plugin.mjs +4 -1
- package/app/plugins/omp/plugin.mjs +4 -1
- package/app/plugins/opencode/plugin.mjs +4 -1
- package/app/plugins/pi/plugin.mjs +1464 -412
- package/app/plugins/qoder/plugin.mjs +9528 -8655
- package/app/plugins/qoder-cn/plugin.mjs +9528 -8655
- 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 +14 -1
- package/app/plugins/zcode/plugin.mjs +4 -1
- package/app/renderer-extension.js +510 -114
- 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.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
|
|
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.0","distribution":"npm","target":"macos-x64"}
|
package/app/console-server.mjs
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
17079
|
+
const snapshot = await this.#snapshot(id);
|
|
17053
17080
|
const value = await this.#read(id);
|
|
17054
|
-
return { path: value, restartRequired: value
|
|
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
|
|
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
|
|
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
|
-
|
|
17140
|
-
|
|
17141
|
-
|
|
17142
|
-
|
|
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 =
|
|
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") {
|
package/app/console-web.js
CHANGED
|
@@ -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
|
-
|
|
18786
|
-
|
|
18787
|
-
|
|
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.
|
|
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\
|
|
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
|
|
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
|
-
|
|
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
|
|
27077
|
-
|
|
27078
|
-
|
|
27079
|
-
|
|
27080
|
-
|
|
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
|
}
|