@karlorz/codexhost-cli-darwin-arm64 0.13.2-3 → 0.13.3-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 +1 -1
- package/app/codexhost-distribution.json +1 -1
- package/app/console-web.js +2 -67
- package/app/cpa-live-voice-hook.js +71 -0
- package/app/desktop-controller.mjs +5 -0
- package/app/host-runtime.mjs +1733 -487
- package/app/plugins/codebuddy/plugin.mjs +22 -1
- package/app/plugins/deepseek-harness/manifest.json +2 -2
- package/app/plugins/deepseek-harness/plugin.mjs +67 -7
- package/app/plugins/opencode/plugin.mjs +6 -2
- package/app/plugins/workbuddy/plugin.mjs +139 -2
- package/app/renderer-extension.js +337 -280
- package/bin/codexhost +0 -0
- package/libexec/codexhost-shim +0 -0
- package/libexec/codexhost-updater +0 -0
- package/package.json +1 -1
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 @karlorz/codexhost-cli@0.13.
|
|
10
|
+
npm install -g @karlorz/codexhost-cli@0.13.3-0
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
Do not install this package directly. npm selects it through the optional dependencies of `@karlorz/codexhost-cli`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"schemaVersion":1,"version":"0.13.
|
|
1
|
+
{"schemaVersion":1,"version":"0.13.3-0","distribution":"npm","target":"macos-arm64"}
|
package/app/console-web.js
CHANGED
|
@@ -20662,14 +20662,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20662
20662
|
otherSection: "Other",
|
|
20663
20663
|
appearanceDescription: "Conversation display and local resource management.",
|
|
20664
20664
|
appearanceGroup: "Appearance",
|
|
20665
|
-
hideCodexUsageBannerTitle: "Hide Codex usage warning",
|
|
20666
|
-
hideCodexUsageBannerDescription: "On by default. Hide the out-of-usage card on every Composer.",
|
|
20667
|
-
hideCodexUsageBannerHelpLabel: "About hiding the Codex usage warning",
|
|
20668
|
-
hideCodexUsageBannerHelp: Object.freeze([
|
|
20669
|
-
"The native card appears when the signed-in ChatGPT Codex quota is exhausted.",
|
|
20670
|
-
"When this is on, that card is hidden on every Composer, including Codex threads. Reset usage and Upgrade stay available in Settings.",
|
|
20671
|
-
"Turning this off only shows the native card again. Send on this Composer, including Codex threads, is already separated from that quota card."
|
|
20672
|
-
]),
|
|
20673
20665
|
cpaLiveVoiceTitle: "Override live voice",
|
|
20674
20666
|
cpaLiveVoiceDescription: "On by default. Host creates the realtime call instead of ChatGPT.",
|
|
20675
20667
|
cpaLiveVoiceHelpLabel: "About overriding live voice",
|
|
@@ -20842,7 +20834,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20842
20834
|
launchPathSaveError: "Could not save. Enter an existing absolute installation folder on this Host and check configuration permissions.",
|
|
20843
20835
|
connectionOfficialWebsite: "Visit official website",
|
|
20844
20836
|
connectionOpenHarnessWeb: "Open DeepSeek Harness Web",
|
|
20845
|
-
connectionDeepSeekTestedVersions: "Supported DSH versions: 0.1.7-rc.1, 0.1.7-rc.2, 0.2.0-rc.1 and 0.2.
|
|
20837
|
+
connectionDeepSeekTestedVersions: "Supported DSH versions: 0.1.7-rc.1, 0.1.7-rc.2, 0.2.0-rc.1, 0.2.0-rc.2, 0.2.1-rc.1 and 0.2.1-rc.2. Versions newer than 0.2.1-rc.2 can be tried, but compatibility may be limited; versions older than 0.1.7-rc.1 must be upgraded first.",
|
|
20846
20838
|
connectionInstall: "Install",
|
|
20847
20839
|
connectionInstallDescription: "This Harness was not detected.",
|
|
20848
20840
|
connectionInstallRunning: "Installing on the selected Host. You can leave this page; login or setup may still be required afterward.",
|
|
@@ -20953,14 +20945,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
20953
20945
|
otherSection: "\u5176\u4ED6",
|
|
20954
20946
|
appearanceDescription: "\u4F1A\u8BDD\u663E\u793A\u4E0E\u672C\u5730\u8D44\u6E90\u7BA1\u7406\u3002",
|
|
20955
20947
|
appearanceGroup: "\u5916\u89C2",
|
|
20956
|
-
hideCodexUsageBannerTitle: "\u9690\u85CF Codex \u989D\u5EA6\u8B66\u544A",
|
|
20957
|
-
hideCodexUsageBannerDescription: "\u9ED8\u8BA4\u5F00\u542F\u3002\u5728\u6240\u6709 Composer \u4E0A\u9690\u85CF\u989D\u5EA6\u8017\u5C3D\u5361\u7247\u3002",
|
|
20958
|
-
hideCodexUsageBannerHelpLabel: "\u9690\u85CF Codex \u989D\u5EA6\u8B66\u544A\u8BF4\u660E",
|
|
20959
|
-
hideCodexUsageBannerHelp: Object.freeze([
|
|
20960
|
-
"\u5DF2\u767B\u5F55\u7684 ChatGPT Codex \u989D\u5EA6\u8017\u5C3D\u65F6\uFF0CDesktop \u4F1A\u663E\u793A\u539F\u751F\u8B66\u544A\u5361\u7247\u3002",
|
|
20961
|
-
"\u5F00\u542F\u540E\uFF0C\u6240\u6709 Composer \u90FD\u9690\u85CF\u8BE5\u5361\u7247\uFF0C\u5305\u62EC Codex \u4F1A\u8BDD\u3002\u300C\u91CD\u7F6E\u7528\u91CF\u300D\u548C\u300C\u5347\u7EA7\u300D\u4ECD\u53EF\u5728\u8BBE\u7F6E\u4E2D\u4F7F\u7528\u3002",
|
|
20962
|
-
"\u5173\u95ED\u6B64\u5F00\u5173\u53EA\u4F1A\u91CD\u65B0\u663E\u793A\u539F\u751F\u5361\u7247\u3002\u5F53\u524D Composer \u7684\u53D1\u9001\uFF08\u5305\u62EC Codex \u4F1A\u8BDD\uFF09\u5DF2\u4E0E\u8BE5\u989D\u5EA6\u5361\u7247\u5206\u79BB\u3002"
|
|
20963
|
-
]),
|
|
20964
20948
|
cpaLiveVoiceTitle: "\u6539\u5199\u5B9E\u65F6\u8BED\u97F3",
|
|
20965
20949
|
cpaLiveVoiceDescription: "\u9ED8\u8BA4\u5F00\u542F\u3002\u7531 Host \u521B\u5EFA realtime \u901A\u8BDD\uFF0C\u800C\u4E0D\u662F ChatGPT\u3002",
|
|
20966
20950
|
cpaLiveVoiceHelpLabel: "\u6539\u5199\u5B9E\u65F6\u8BED\u97F3\u8BF4\u660E",
|
|
@@ -21133,7 +21117,7 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21133
21117
|
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",
|
|
21134
21118
|
connectionOfficialWebsite: "\u8BBF\u95EE\u5B98\u7F51",
|
|
21135
21119
|
connectionOpenHarnessWeb: "\u6253\u5F00 DeepSeek Harness Web",
|
|
21136
|
-
connectionDeepSeekTestedVersions: "\u652F\u6301 DSH \u7248\u672C\uFF1A0.1.7-rc.1\u30010.1.7-rc.2\u30010.2.0-rc.1 \u548C 0.2.
|
|
21120
|
+
connectionDeepSeekTestedVersions: "\u652F\u6301 DSH \u7248\u672C\uFF1A0.1.7-rc.1\u30010.1.7-rc.2\u30010.2.0-rc.1\u30010.2.0-rc.2\u30010.2.1-rc.1 \u548C 0.2.1-rc.2\u3002\u9AD8\u4E8E 0.2.1-rc.2 \u7684\u7248\u672C\u53EF\u4EE5\u5C1D\u8BD5\u8FDE\u63A5\uFF0C\u4F46\u9002\u914D\u5EA6\u53EF\u80FD\u6709\u9650\uFF1B\u4F4E\u4E8E 0.1.7-rc.1 \u7684\u7248\u672C\u9700\u8981\u5148\u5347\u7EA7\u3002",
|
|
21137
21121
|
connectionInstall: "\u5B89\u88C5",
|
|
21138
21122
|
connectionInstallDescription: "\u5C1A\u672A\u68C0\u6D4B\u5230\u8BE5 Harness\u3002",
|
|
21139
21123
|
connectionInstallRunning: "\u6B63\u5728\u6240\u9009 Host \u4E0A\u5B89\u88C5\uFF0C\u79BB\u5F00\u9875\u9762\u4E0D\u4F1A\u4E2D\u65AD\u3002\u5B89\u88C5\u540E\u53EF\u80FD\u4ECD\u9700\u767B\u5F55\u6216\u914D\u7F6E\u3002",
|
|
@@ -21264,7 +21248,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21264
21248
|
// src/renderer-usage-control.ts
|
|
21265
21249
|
var ENGLISH_USAGE_MESSAGES = Object.freeze({
|
|
21266
21250
|
usage: "Usage",
|
|
21267
|
-
account: "Account",
|
|
21268
21251
|
context: "Context",
|
|
21269
21252
|
recordedCredits: "Recorded usage",
|
|
21270
21253
|
latestCacheHit: "Latest cache hit (CH)",
|
|
@@ -21290,7 +21273,6 @@ th[aria-sort] .console-usage-sort__mark {
|
|
|
21290
21273
|
});
|
|
21291
21274
|
var CHINESE_USAGE_MESSAGES = Object.freeze({
|
|
21292
21275
|
usage: "\u7528\u91CF",
|
|
21293
|
-
account: "\u8D26\u53F7",
|
|
21294
21276
|
context: "\u4E0A\u4E0B\u6587",
|
|
21295
21277
|
recordedCredits: "\u5DF2\u8BB0\u5F55\u6D88\u8017",
|
|
21296
21278
|
latestCacheHit: "\u6700\u8FD1\u7F13\u5B58\u547D\u4E2D\uFF08CH\uFF09",
|
|
@@ -26762,27 +26744,6 @@ ${error51.stderrTail}`] : []
|
|
|
26762
26744
|
};
|
|
26763
26745
|
}
|
|
26764
26746
|
|
|
26765
|
-
// src/renderer-codex-usage-banner-preference.ts
|
|
26766
|
-
var CODEX_USAGE_BANNER_STORAGE_KEY = "codexhost.codex-usage-banner-hidden.v1";
|
|
26767
|
-
var CODEX_USAGE_BANNER_CHANGE_EVENT = "codexhost:codex-usage-banner-changed";
|
|
26768
|
-
function readCodexUsageBannerPreference(owner) {
|
|
26769
|
-
if (!owner) return true;
|
|
26770
|
-
try {
|
|
26771
|
-
return owner.localStorage.getItem(CODEX_USAGE_BANNER_STORAGE_KEY) !== "0";
|
|
26772
|
-
} catch {
|
|
26773
|
-
return true;
|
|
26774
|
-
}
|
|
26775
|
-
}
|
|
26776
|
-
function writeCodexUsageBannerPreference(owner, enabled) {
|
|
26777
|
-
try {
|
|
26778
|
-
owner.localStorage.setItem(CODEX_USAGE_BANNER_STORAGE_KEY, enabled ? "1" : "0");
|
|
26779
|
-
} catch {
|
|
26780
|
-
return false;
|
|
26781
|
-
}
|
|
26782
|
-
owner.dispatchEvent(new Event(CODEX_USAGE_BANNER_CHANGE_EVENT));
|
|
26783
|
-
return true;
|
|
26784
|
-
}
|
|
26785
|
-
|
|
26786
26747
|
// src/renderer-transcript-dom.ts
|
|
26787
26748
|
var REASONING_SOFT_WRAP_STORAGE_KEY = "codexhost.reasoning-soft-wrap.v1";
|
|
26788
26749
|
var REASONING_SOFT_WRAP_CHANGE_EVENT = "codexhost:reasoning-soft-wrap-changed";
|
|
@@ -27049,31 +27010,6 @@ ${error51.stderrTail}`] : []
|
|
|
27049
27010
|
description.className = "settings-page-description";
|
|
27050
27011
|
description.textContent = messages.appearanceDescription;
|
|
27051
27012
|
const { group, card } = createPreferenceGroup(document2, messages.appearanceGroup);
|
|
27052
|
-
const usageBannerId = preferenceId("hide-codex-usage-banner");
|
|
27053
|
-
const usageBannerRow = createPreferenceItem(document2, {
|
|
27054
|
-
title: messages.hideCodexUsageBannerTitle,
|
|
27055
|
-
description: messages.hideCodexUsageBannerDescription,
|
|
27056
|
-
controlId: usageBannerId,
|
|
27057
|
-
help: {
|
|
27058
|
-
label: messages.hideCodexUsageBannerHelpLabel,
|
|
27059
|
-
lines: messages.hideCodexUsageBannerHelp
|
|
27060
|
-
}
|
|
27061
|
-
});
|
|
27062
|
-
const usageBanner = createPreferenceSwitch(
|
|
27063
|
-
document2,
|
|
27064
|
-
usageBannerId,
|
|
27065
|
-
usageBannerRow.description.id
|
|
27066
|
-
);
|
|
27067
|
-
usageBanner.checked = readCodexUsageBannerPreference(ownerWindow);
|
|
27068
|
-
usageBanner.addEventListener("change", () => {
|
|
27069
|
-
writeCodexUsageBannerPreference(ownerWindow, usageBanner.checked);
|
|
27070
|
-
});
|
|
27071
|
-
const syncUsageBanner = () => {
|
|
27072
|
-
usageBanner.checked = readCodexUsageBannerPreference(ownerWindow);
|
|
27073
|
-
};
|
|
27074
|
-
ownerWindow.addEventListener(CODEX_USAGE_BANNER_CHANGE_EVENT, syncUsageBanner);
|
|
27075
|
-
usageBannerRow.item.append(usageBanner);
|
|
27076
|
-
card.append(usageBannerRow.item);
|
|
27077
27013
|
const liveVoiceId = preferenceId("cpa-live-voice");
|
|
27078
27014
|
const liveVoiceRow = createPreferenceItem(document2, {
|
|
27079
27015
|
title: messages.cpaLiveVoiceTitle,
|
|
@@ -27123,7 +27059,6 @@ ${error51.stderrTail}`] : []
|
|
|
27123
27059
|
getLoadedSessionsClient
|
|
27124
27060
|
);
|
|
27125
27061
|
return () => {
|
|
27126
|
-
ownerWindow.removeEventListener(CODEX_USAGE_BANNER_CHANGE_EVENT, syncUsageBanner);
|
|
27127
27062
|
ownerWindow.removeEventListener(CPA_LIVE_VOICE_CHANGE_EVENT, syncLiveVoice);
|
|
27128
27063
|
ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
27129
27064
|
disposeIdleRelease();
|
|
@@ -144,6 +144,77 @@
|
|
|
144
144
|
return handle;
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
+
// src/renderer-overlay-thread-isolation.ts
|
|
148
|
+
function isRecord2(value) {
|
|
149
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
150
|
+
}
|
|
151
|
+
var BLOCKED_METHODS = /* @__PURE__ */ new Set(["thread/started"]);
|
|
152
|
+
function isAvatarOverlayHref(href) {
|
|
153
|
+
try {
|
|
154
|
+
const url = new URL(href);
|
|
155
|
+
if (url.pathname === "/avatar-overlay.html") return true;
|
|
156
|
+
return url.searchParams.get("initialRoute") === "/avatar-overlay";
|
|
157
|
+
} catch {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function overlayBlocksHostNotification(method, threadId, activeRealtimeThreadIds) {
|
|
162
|
+
if (method.startsWith("thread/realtime/")) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
if (threadId !== void 0 && activeRealtimeThreadIds.has(threadId)) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
if (BLOCKED_METHODS.has(method)) return true;
|
|
169
|
+
return method.startsWith("turn/") || method.startsWith("item/");
|
|
170
|
+
}
|
|
171
|
+
function notificationThreadId(params) {
|
|
172
|
+
if (!isRecord2(params)) return void 0;
|
|
173
|
+
if (typeof params.threadId === "string" && params.threadId.length > 0) return params.threadId;
|
|
174
|
+
const thread = params.thread;
|
|
175
|
+
if (isRecord2(thread) && typeof thread.id === "string" && thread.id.length > 0) {
|
|
176
|
+
return thread.id;
|
|
177
|
+
}
|
|
178
|
+
return void 0;
|
|
179
|
+
}
|
|
180
|
+
function installOverlayThreadIsolation(target = typeof globalThis === "undefined" ? null : globalThis) {
|
|
181
|
+
if (!target || typeof target.addEventListener !== "function") {
|
|
182
|
+
return { status: "disabled", dispose() {
|
|
183
|
+
} };
|
|
184
|
+
}
|
|
185
|
+
const href = target.location?.href;
|
|
186
|
+
if (typeof href !== "string" || !isAvatarOverlayHref(href)) {
|
|
187
|
+
return { status: "disabled", dispose() {
|
|
188
|
+
} };
|
|
189
|
+
}
|
|
190
|
+
const activeRealtimeThreadIds = /* @__PURE__ */ new Set();
|
|
191
|
+
const listener = (event) => {
|
|
192
|
+
const message = event.data;
|
|
193
|
+
if (!isRecord2(message) || message.type !== "mcp-notification") return;
|
|
194
|
+
if (typeof message.method !== "string") return;
|
|
195
|
+
const threadId = notificationThreadId(message.params);
|
|
196
|
+
if (message.method === "thread/realtime/started" && threadId) {
|
|
197
|
+
activeRealtimeThreadIds.add(threadId);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if ((message.method === "thread/realtime/closed" || message.method === "thread/realtime/error") && threadId) {
|
|
201
|
+
activeRealtimeThreadIds.delete(threadId);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (overlayBlocksHostNotification(message.method, threadId, activeRealtimeThreadIds)) {
|
|
205
|
+
event.stopImmediatePropagation();
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
target.addEventListener("message", listener, true);
|
|
209
|
+
return {
|
|
210
|
+
status: "active",
|
|
211
|
+
dispose() {
|
|
212
|
+
target.removeEventListener("message", listener, true);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
147
217
|
// src/cpa-live-voice-entry.ts
|
|
148
218
|
installCpaLiveVoiceHook();
|
|
219
|
+
installOverlayThreadIsolation();
|
|
149
220
|
})();
|
|
@@ -17133,6 +17133,11 @@ function createDraftPrewarmPolicyBridge(manager, bridge, hostId2, target, prewar
|
|
|
17133
17133
|
throw new Error("Renderer request manager is retired");
|
|
17134
17134
|
return manager;
|
|
17135
17135
|
},
|
|
17136
|
+
selectedModel() {
|
|
17137
|
+
if (disposed || isCurrentManager && !isCurrentManager())
|
|
17138
|
+
throw new Error("Renderer request manager is retired");
|
|
17139
|
+
return selectedModel;
|
|
17140
|
+
},
|
|
17136
17141
|
select(model2) {
|
|
17137
17142
|
if (disposed || isCurrentManager && !isCurrentManager())
|
|
17138
17143
|
throw new Error("Renderer request manager is retired");
|