@khorsheed/dsh-local-agent-codex 0.2.0 → 0.2.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/CHANGELOG.md +8 -0
- package/README.en.md +1 -1
- package/README.i18n.yaml +2 -2
- package/README.md +1 -1
- package/lib/client.js +159 -74
- package/lib/index.js +3 -2
- package/lib/types/client/SettingsCard.js +11 -3
- package/lib/types/client/index.js +2 -2
- package/lib/types/index.js +4 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
# 变更记录
|
|
2
|
+
## 0.2.1(2026-10-27)
|
|
3
|
+
|
|
4
|
+
- **修复几个模式套件一起装时设置存不上**:卡片上的开关和设置改存在本 harness 自己的目录里,不再写进配置文件;原来配好的值照常生效。
|
|
5
|
+
- **保存失败就说保存失败**:设置被拒时显示「保存失败」,不再假装「已保存」。
|
|
6
|
+
- **常驻模式(live)默认打开**:遇到问题可以在卡片上关掉,改回每次新起一个。
|
|
7
|
+
- **端点表单跟着登录、登出刷新**:登出后不再显示「API Key 已配置」,验证端点也不再报找不到凭据。
|
|
8
|
+
- **读不到登录状态时直说**:显示「读取登录状态失败」。
|
|
9
|
+
|
|
2
10
|
## 0.2.0(2026-10-26)
|
|
3
11
|
|
|
4
12
|
rc.3 之后到正式版的变化:
|
package/README.en.md
CHANGED
|
@@ -15,7 +15,7 @@ Some jobs you simply want Codex to do, and that used to mean running it in a ter
|
|
|
15
15
|
- **Keep talking, even after a restart**: have the agent follow up, or open the sub-session and message Codex yourself; it's the same Codex thread, and it picks up again after DSH restarts.
|
|
16
16
|
- **Paste a key and go**: enter the endpoint and API key on the settings card (an official platform key or a relay key), press "Save credential", then "Verify endpoint & list models" to check it connects.
|
|
17
17
|
- **Pick your models**: under "Available models", tick and drag to reorder; the top one is the default. You can also switch model and reasoning effort inside a sub-session.
|
|
18
|
-
- **Resident mode is faster**:
|
|
18
|
+
- **Resident mode is faster**: "Resident mode (live)" is on by default and the Codex process stays up, streaming output into the sub-session; stopping doesn't kill it, and after a crash it resumes the same thread.
|
|
19
19
|
|
|
20
20
|
## Install
|
|
21
21
|
|
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# last confirmed-consistent state. Both languages carry equal authority; after
|
|
3
3
|
# editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/local-agent-codex/README.en.md
|
|
5
|
-
packages/local-agent-codex/README.en.md:
|
|
6
|
-
packages/local-agent-codex/README.md:
|
|
5
|
+
packages/local-agent-codex/README.en.md: f41756008c330d0db9d309e8f2da59ee31bacd11
|
|
6
|
+
packages/local-agent-codex/README.md: fc175adc5795b795038a39b9031310e0bc40e0d6
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
- **接着聊,重启也续得上**:让 agent 追问,或者打开子会话直接发消息,继续的是同一个 Codex 线程;DSH 重启之后也接得上。
|
|
16
16
|
- **填好 key 就能用**:在设置卡片里填端点地址和 API Key(官方平台的 key 或中转的 key 都行),点「保存凭据」,再点「验证端点并获取模型」确认能连上。
|
|
17
17
|
- **自己挑模型**:在「可用模型」里勾选、拖动排序,排第一的就是默认模型;子会话里也能临时换模型和推理强度。
|
|
18
|
-
-
|
|
18
|
+
- **常驻模式更快**:「常驻模式(live)」默认开着,Codex 进程常驻,输出实时流进子会话;停下不杀进程,崩溃后自动续上原来的线程。
|
|
19
19
|
|
|
20
20
|
## 安装
|
|
21
21
|
|
package/lib/client.js
CHANGED
|
@@ -93,6 +93,83 @@ window.__ModuleLoader__.load({
|
|
|
93
93
|
});
|
|
94
94
|
return channel;
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Bind a settings card to the harness's own card-settings store (card-settings.ts
|
|
98
|
+
* on the host) layered over the row's host settings form: reads are the
|
|
99
|
+
* form's value with the stored overrides on top; writes go to the store only,
|
|
100
|
+
* never the profile patch — so they cannot be refused when several suites
|
|
101
|
+
* insert the same row. A host without the store keeps the plain row scope.
|
|
102
|
+
* @param ctx - the provider's client context.
|
|
103
|
+
* @param harness - the harness name (`dsh`, `kimi`, …).
|
|
104
|
+
* @param entryId - the plugin row id the base values come from.
|
|
105
|
+
* @returns the bound scope.
|
|
106
|
+
*/
|
|
107
|
+
function bindCardSettingsScope(ctx, harness, entryId) {
|
|
108
|
+
const row = bindSettingsScope(ctx, entryId);
|
|
109
|
+
const gateway = () => {
|
|
110
|
+
const remote = ctx.get("remote.localAgentGateway");
|
|
111
|
+
return typeof remote?.cardSettings === "function" && typeof remote.setCardSettings === "function" ? remote : void 0;
|
|
112
|
+
};
|
|
113
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
114
|
+
let stored;
|
|
115
|
+
let cached;
|
|
116
|
+
const emit = () => {
|
|
117
|
+
for (const listener of [...listeners]) listener();
|
|
118
|
+
};
|
|
119
|
+
const load = () => {
|
|
120
|
+
gateway()?.cardSettings(harness).then((result) => {
|
|
121
|
+
if (!result.ok || result.value === void 0) return;
|
|
122
|
+
stored = result.value;
|
|
123
|
+
emit();
|
|
124
|
+
}).catch(() => {});
|
|
125
|
+
};
|
|
126
|
+
const write = async (patch) => {
|
|
127
|
+
const remote = gateway();
|
|
128
|
+
if (remote === void 0) return false;
|
|
129
|
+
try {
|
|
130
|
+
const result = await remote.setCardSettings(harness, patch);
|
|
131
|
+
if (!result.ok || result.value === void 0) return false;
|
|
132
|
+
stored = result.value;
|
|
133
|
+
emit();
|
|
134
|
+
return true;
|
|
135
|
+
} catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
return {
|
|
140
|
+
getSnapshot: () => {
|
|
141
|
+
const rowSnapshot = row.getSnapshot();
|
|
142
|
+
if (cached !== void 0 && cached.rowSnapshot === rowSnapshot && cached.stored === stored) return cached.snapshot;
|
|
143
|
+
const overrides = stored ?? {};
|
|
144
|
+
const snapshot = gateway() === void 0 ? rowSnapshot : {
|
|
145
|
+
...rowSnapshot,
|
|
146
|
+
value: rowSnapshot.value === void 0 && stored === void 0 ? void 0 : {
|
|
147
|
+
...rowSnapshot.value,
|
|
148
|
+
...overrides
|
|
149
|
+
},
|
|
150
|
+
writable: true,
|
|
151
|
+
status: rowSnapshot.status === "loading" && stored !== void 0 ? "ready" : rowSnapshot.status === "unavailable" && stored !== void 0 ? "ready" : rowSnapshot.status
|
|
152
|
+
};
|
|
153
|
+
cached = {
|
|
154
|
+
rowSnapshot,
|
|
155
|
+
stored,
|
|
156
|
+
snapshot
|
|
157
|
+
};
|
|
158
|
+
return snapshot;
|
|
159
|
+
},
|
|
160
|
+
subscribe: (listener) => {
|
|
161
|
+
if (listeners.size === 0) load();
|
|
162
|
+
listeners.add(listener);
|
|
163
|
+
const off = row.subscribe(listener);
|
|
164
|
+
return () => {
|
|
165
|
+
listeners.delete(listener);
|
|
166
|
+
off();
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
set: (field, value) => gateway() === void 0 ? row.set(field, value) : write({ [field]: value }),
|
|
170
|
+
unset: (field) => gateway() === void 0 ? row.unset(field) : write({ [field]: null })
|
|
171
|
+
};
|
|
172
|
+
}
|
|
96
173
|
//#endregion
|
|
97
174
|
//#region src/client/locales.ts
|
|
98
175
|
/** `local-agent-codex` namespace dictionaries. */
|
|
@@ -202,8 +279,13 @@ window.__ModuleLoader__.load({
|
|
|
202
279
|
* re-probes so a mid-session credential loss cannot leave a stale green dot.
|
|
203
280
|
* @module @khorsheed/dsh-local-agent/client — auth status bus
|
|
204
281
|
*/
|
|
205
|
-
const
|
|
206
|
-
const
|
|
282
|
+
const BUS_KEY = Symbol.for("dsh.local-agent.auth-status");
|
|
283
|
+
const bus = globalThis[BUS_KEY] ??= {
|
|
284
|
+
statuses: /* @__PURE__ */ new Map(),
|
|
285
|
+
listeners: /* @__PURE__ */ new Set()
|
|
286
|
+
};
|
|
287
|
+
const statuses = bus.statuses;
|
|
288
|
+
const listeners = bus.listeners;
|
|
207
289
|
/** Record one harness's latest probe result and notify subscribers. */
|
|
208
290
|
function publishAuthStatus(harnessId, status) {
|
|
209
291
|
if (statuses.get(harnessId) === status) return;
|
|
@@ -261,30 +343,30 @@ window.__ModuleLoader__.load({
|
|
|
261
343
|
document.head.appendChild(tag);
|
|
262
344
|
}
|
|
263
345
|
var ProviderAuthBlock_module_css_default = {
|
|
346
|
+
"promptText": "On5p7W_promptText",
|
|
264
347
|
"status": "On5p7W_status",
|
|
265
|
-
"
|
|
266
|
-
"rosterError": "On5p7W_rosterError",
|
|
267
|
-
"section": "On5p7W_section",
|
|
268
|
-
"retryButton": "On5p7W_retryButton",
|
|
269
|
-
"rowIdentity": "On5p7W_rowIdentity",
|
|
270
|
-
"rows": "On5p7W_rows",
|
|
271
|
-
"loginButton": "On5p7W_loginButton",
|
|
348
|
+
"title": "On5p7W_title",
|
|
272
349
|
"rowCard": "On5p7W_rowCard",
|
|
350
|
+
"loginButton": "On5p7W_loginButton",
|
|
351
|
+
"retryButton": "On5p7W_retryButton",
|
|
352
|
+
"rowActions": "On5p7W_rowActions",
|
|
353
|
+
"logoutButton": "On5p7W_logoutButton",
|
|
354
|
+
"section": "On5p7W_section",
|
|
273
355
|
"intro": "On5p7W_intro",
|
|
274
|
-
"
|
|
275
|
-
"loginPrompt": "On5p7W_loginPrompt",
|
|
276
|
-
"openPage": "On5p7W_openPage",
|
|
277
|
-
"title": "On5p7W_title",
|
|
278
|
-
"rowHead": "On5p7W_rowHead",
|
|
356
|
+
"dotPending": "On5p7W_dotPending",
|
|
279
357
|
"dotOn": "On5p7W_dotOn",
|
|
280
|
-
"
|
|
281
|
-
"dotOff": "On5p7W_dotOff",
|
|
358
|
+
"rowName": "On5p7W_rowName",
|
|
282
359
|
"codeInput": "On5p7W_codeInput",
|
|
283
|
-
"
|
|
360
|
+
"openPage": "On5p7W_openPage",
|
|
284
361
|
"rowPending": "On5p7W_rowPending",
|
|
285
|
-
"
|
|
286
|
-
"
|
|
287
|
-
"
|
|
362
|
+
"rowIdentity": "On5p7W_rowIdentity",
|
|
363
|
+
"rows": "On5p7W_rows",
|
|
364
|
+
"rosterError": "On5p7W_rosterError",
|
|
365
|
+
"rowTag": "On5p7W_rowTag",
|
|
366
|
+
"dotOff": "On5p7W_dotOff",
|
|
367
|
+
"credentialDot": "On5p7W_credentialDot",
|
|
368
|
+
"rowHead": "On5p7W_rowHead",
|
|
369
|
+
"loginPrompt": "On5p7W_loginPrompt"
|
|
288
370
|
};
|
|
289
371
|
//#endregion
|
|
290
372
|
//#region ../local-agent/src/client/ProviderAuthBlock.tsx
|
|
@@ -437,8 +519,8 @@ window.__ModuleLoader__.load({
|
|
|
437
519
|
const statusKind = usePublishedAuthStatus(harness.id) ?? view.status;
|
|
438
520
|
const authenticated = statusKind === "authenticated";
|
|
439
521
|
const loginPending = pendingSince !== void 0;
|
|
440
|
-
const loginable = view.loginable ??
|
|
441
|
-
const logoutable = view.logoutable ??
|
|
522
|
+
const loginable = view.loginable ?? statusKind !== "unavailable";
|
|
523
|
+
const logoutable = view.logoutable ?? statusKind !== "unavailable";
|
|
442
524
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
443
525
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
444
526
|
className: ProviderAuthBlock_module_css_default.rowHead,
|
|
@@ -471,7 +553,7 @@ window.__ModuleLoader__.load({
|
|
|
471
553
|
statusKind === "checking" && t("loading"),
|
|
472
554
|
statusKind === "authenticated" && t("settings.authenticated"),
|
|
473
555
|
statusKind === "anonymous" && t("settings.notAuthenticated"),
|
|
474
|
-
statusKind === "unavailable" && t("
|
|
556
|
+
statusKind === "unavailable" && t("settings.statusFailed")
|
|
475
557
|
]
|
|
476
558
|
}),
|
|
477
559
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
@@ -563,10 +645,10 @@ window.__ModuleLoader__.load({
|
|
|
563
645
|
document.head.appendChild(tag);
|
|
564
646
|
}
|
|
565
647
|
var AuthStatusDot_module_css_default = {
|
|
648
|
+
"dotOn": "OFjNUG_dotOn",
|
|
566
649
|
"credentialDot": "OFjNUG_credentialDot",
|
|
567
|
-
"dotPending": "OFjNUG_dotPending",
|
|
568
650
|
"dotOff": "OFjNUG_dotOff",
|
|
569
|
-
"
|
|
651
|
+
"dotPending": "OFjNUG_dotPending"
|
|
570
652
|
};
|
|
571
653
|
//#endregion
|
|
572
654
|
//#region ../local-agent/src/client/AuthStatusDot.tsx
|
|
@@ -582,7 +664,7 @@ window.__ModuleLoader__.load({
|
|
|
582
664
|
}
|
|
583
665
|
//#endregion
|
|
584
666
|
//#region \0dsh-css:../local-agent/src/client/ModelListSection.module.css.mjs
|
|
585
|
-
const css$1 = "._4eeJ7W_block{flex-direction:column;gap:10px;display:flex}._4eeJ7W_blockTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:6px;margin:0;font-size:13px;font-weight:500;line-height:1.4;display:flex}._4eeJ7W_info{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:help;background:0 0;border:0;border-radius:50%;padding:0 2px;font-size:12px;line-height:1}._4eeJ7W_row{align-items:center;gap:12px;display:flex}._4eeJ7W_saved{color:var(--dsw-alias-state-success-primary);font-size:12px}._4eeJ7W_errorText{color:var(--dsw-alias-state-error-primary);font-size:12px}._4eeJ7W_hint{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:1.5}._4eeJ7W_modelInput{min-width:0;font:inherit;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:5px 8px;font-size:13px;line-height:1.4}._4eeJ7W_modelSave{appearance:none;font:inherit;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;flex:none;padding:5px 10px;font-size:13px;line-height:1.4}._4eeJ7W_modelList{flex-direction:column;gap:8px;display:flex}._4eeJ7W_modelRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:grab;border-radius:8px;align-items:center;gap:8px;padding:6px 8px;display:flex}._4eeJ7W_modelRowDragging{opacity:.6;cursor:grabbing}._4eeJ7W_modelDrag{color:var(--dsw-alias-label-tertiary);cursor:grab;user-select:none}._4eeJ7W_modelRowValue{font-size:13px;font-family:var(--dsw-alias-font-mono,monospace);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._4eeJ7W_modelRowLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:40%;font-size:12px;overflow:hidden}._4eeJ7W_modelDefaultChip{color:var(--dsw-alias-success,#1a9e54);background:color-mix(in srgb, var(--dsw-alias-success,#1a9e54) 12%, transparent);border-radius:999px;padding:1px 8px;font-size:11px;line-height:1.4}._4eeJ7W_modelDelete{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:2px 4px;font-size:12px}._4eeJ7W_modelAdd{appearance:none;border:1px dashed var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 12px;font-size:13px}._4eeJ7W_dialogBackdrop{z-index:100;background:#00000052;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}._4eeJ7W_dialog{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;flex-direction:column;gap:10px;width:min(520px,100vw - 48px);max-height:min(560px,100vh - 96px);padding:16px;display:flex;box-shadow:0 12px 40px #00000059}._4eeJ7W_dialogHead{justify-content:space-between;align-items:center;display:flex}._4eeJ7W_dialogTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:600}._4eeJ7W_dialogClose{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:2px 4px;font-size:13px}._4eeJ7W_dialogHint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px}._4eeJ7W_dialogToolbar{align-items:center;gap:8px;display:flex}._4eeJ7W_dialogToolbar ._4eeJ7W_modelInput{flex:1}._4eeJ7W_dialogSelectAll{appearance:none;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:0;padding:4px 6px;font-size:13px}._4eeJ7W_dialogList{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;flex-direction:column;flex:1;gap:2px;min-height:120px;max-height:320px;padding:6px;display:flex;overflow-y:auto}._4eeJ7W_dialogItem{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}._4eeJ7W_dialogItemAdded{opacity:.55;cursor:default}._4eeJ7W_dialogItemValue{font-family:var(--dsw-alias-font-mono,monospace)}._4eeJ7W_dialogItemLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}._4eeJ7W_dialogActions{justify-content:flex-end;gap:8px;display:flex}._4eeJ7W_dialogConfirm{appearance:none;color:var(--dsw-alias-
|
|
667
|
+
const css$1 = "._4eeJ7W_block{flex-direction:column;gap:10px;display:flex}._4eeJ7W_blockTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:6px;margin:0;font-size:13px;font-weight:500;line-height:1.4;display:flex}._4eeJ7W_info{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:help;background:0 0;border:0;border-radius:50%;padding:0 2px;font-size:12px;line-height:1}._4eeJ7W_row{align-items:center;gap:12px;display:flex}._4eeJ7W_saved{color:var(--dsw-alias-state-success-primary);font-size:12px}._4eeJ7W_errorText{color:var(--dsw-alias-state-error-primary);font-size:12px}._4eeJ7W_hint{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:1.5}._4eeJ7W_modelInput{min-width:0;font:inherit;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:5px 8px;font-size:13px;line-height:1.4}._4eeJ7W_modelSave{appearance:none;font:inherit;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;flex:none;padding:5px 10px;font-size:13px;line-height:1.4}._4eeJ7W_modelList{flex-direction:column;gap:8px;display:flex}._4eeJ7W_modelRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:grab;border-radius:8px;align-items:center;gap:8px;padding:6px 8px;display:flex}._4eeJ7W_modelRowDragging{opacity:.6;cursor:grabbing}._4eeJ7W_modelDrag{color:var(--dsw-alias-label-tertiary);cursor:grab;user-select:none}._4eeJ7W_modelRowValue{font-size:13px;font-family:var(--dsw-alias-font-mono,monospace);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._4eeJ7W_modelRowLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:40%;font-size:12px;overflow:hidden}._4eeJ7W_modelDefaultChip{color:var(--dsw-alias-success,#1a9e54);background:color-mix(in srgb, var(--dsw-alias-success,#1a9e54) 12%, transparent);border-radius:999px;padding:1px 8px;font-size:11px;line-height:1.4}._4eeJ7W_modelDelete{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:2px 4px;font-size:12px}._4eeJ7W_modelAdd{appearance:none;border:1px dashed var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 12px;font-size:13px}._4eeJ7W_dialogBackdrop{z-index:100;background:#00000052;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}._4eeJ7W_dialog{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;flex-direction:column;gap:10px;width:min(520px,100vw - 48px);max-height:min(560px,100vh - 96px);padding:16px;display:flex;box-shadow:0 12px 40px #00000059}._4eeJ7W_dialogHead{justify-content:space-between;align-items:center;display:flex}._4eeJ7W_dialogTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:600}._4eeJ7W_dialogClose{appearance:none;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:2px 4px;font-size:13px}._4eeJ7W_dialogHint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px}._4eeJ7W_dialogToolbar{align-items:center;gap:8px;display:flex}._4eeJ7W_dialogToolbar ._4eeJ7W_modelInput{flex:1}._4eeJ7W_dialogSelectAll{appearance:none;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:0;padding:4px 6px;font-size:13px}._4eeJ7W_dialogList{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;flex-direction:column;flex:1;gap:2px;min-height:120px;max-height:320px;padding:6px;display:flex;overflow-y:auto}._4eeJ7W_dialogItem{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}._4eeJ7W_dialogItemAdded{opacity:.55;cursor:default}._4eeJ7W_dialogItemValue{font-family:var(--dsw-alias-font-mono,monospace)}._4eeJ7W_dialogItemLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}._4eeJ7W_dialogActions{justify-content:flex-end;gap:8px;display:flex}._4eeJ7W_dialogConfirm{appearance:none;color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-button-primary-fill,#1f2329);cursor:pointer;border:0;border-radius:8px;padding:6px 14px;font-size:13px}._4eeJ7W_dialogConfirm:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover,var(--dsw-alias-button-primary-fill,#1f2329))}._4eeJ7W_dialogConfirm:disabled{opacity:.4;cursor:default}";
|
|
586
668
|
const tagId$1 = "@khorsheed/dsh-local-agent-codex/ModelListSection.module.css";
|
|
587
669
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
588
670
|
const tag = document.createElement("style");
|
|
@@ -592,39 +674,39 @@ window.__ModuleLoader__.load({
|
|
|
592
674
|
document.head.appendChild(tag);
|
|
593
675
|
}
|
|
594
676
|
var ModelListSection_module_css_default = {
|
|
595
|
-
"
|
|
596
|
-
"blockTitle": "_4eeJ7W_blockTitle",
|
|
597
|
-
"block": "_4eeJ7W_block",
|
|
598
|
-
"modelRowDragging": "_4eeJ7W_modelRowDragging",
|
|
677
|
+
"dialogItemLabel": "_4eeJ7W_dialogItemLabel",
|
|
599
678
|
"dialogSelectAll": "_4eeJ7W_dialogSelectAll",
|
|
600
|
-
"
|
|
679
|
+
"row": "_4eeJ7W_row",
|
|
680
|
+
"block": "_4eeJ7W_block",
|
|
681
|
+
"blockTitle": "_4eeJ7W_blockTitle",
|
|
682
|
+
"modelInput": "_4eeJ7W_modelInput",
|
|
683
|
+
"dialogItem": "_4eeJ7W_dialogItem",
|
|
684
|
+
"hint": "_4eeJ7W_hint",
|
|
601
685
|
"dialog": "_4eeJ7W_dialog",
|
|
686
|
+
"modelList": "_4eeJ7W_modelList",
|
|
687
|
+
"modelRowDragging": "_4eeJ7W_modelRowDragging",
|
|
602
688
|
"dialogList": "_4eeJ7W_dialogList",
|
|
603
|
-
"
|
|
604
|
-
"modelSave": "_4eeJ7W_modelSave",
|
|
689
|
+
"modelAdd": "_4eeJ7W_modelAdd",
|
|
605
690
|
"errorText": "_4eeJ7W_errorText",
|
|
691
|
+
"dialogTitle": "_4eeJ7W_dialogTitle",
|
|
692
|
+
"modelSave": "_4eeJ7W_modelSave",
|
|
693
|
+
"modelRowValue": "_4eeJ7W_modelRowValue",
|
|
694
|
+
"saved": "_4eeJ7W_saved",
|
|
695
|
+
"modelRow": "_4eeJ7W_modelRow",
|
|
696
|
+
"dialogActions": "_4eeJ7W_dialogActions",
|
|
697
|
+
"dialogClose": "_4eeJ7W_dialogClose",
|
|
698
|
+
"modelDrag": "_4eeJ7W_modelDrag",
|
|
606
699
|
"info": "_4eeJ7W_info",
|
|
607
700
|
"modelDelete": "_4eeJ7W_modelDelete",
|
|
608
|
-
"
|
|
609
|
-
"dialogConfirm": "_4eeJ7W_dialogConfirm",
|
|
610
|
-
"modelDrag": "_4eeJ7W_modelDrag",
|
|
701
|
+
"dialogItemAdded": "_4eeJ7W_dialogItemAdded",
|
|
611
702
|
"dialogItemValue": "_4eeJ7W_dialogItemValue",
|
|
703
|
+
"dialogConfirm": "_4eeJ7W_dialogConfirm",
|
|
612
704
|
"dialogBackdrop": "_4eeJ7W_dialogBackdrop",
|
|
613
|
-
"
|
|
614
|
-
"dialogItemLabel": "_4eeJ7W_dialogItemLabel",
|
|
615
|
-
"modelList": "_4eeJ7W_modelList",
|
|
616
|
-
"modelDefaultChip": "_4eeJ7W_modelDefaultChip",
|
|
705
|
+
"dialogHead": "_4eeJ7W_dialogHead",
|
|
617
706
|
"dialogToolbar": "_4eeJ7W_dialogToolbar",
|
|
618
|
-
"
|
|
619
|
-
"
|
|
620
|
-
"
|
|
621
|
-
"modelRowLabel": "_4eeJ7W_modelRowLabel",
|
|
622
|
-
"dialogItemAdded": "_4eeJ7W_dialogItemAdded",
|
|
623
|
-
"modelRowValue": "_4eeJ7W_modelRowValue",
|
|
624
|
-
"modelInput": "_4eeJ7W_modelInput",
|
|
625
|
-
"saved": "_4eeJ7W_saved",
|
|
626
|
-
"dialogItem": "_4eeJ7W_dialogItem",
|
|
627
|
-
"dialogHint": "_4eeJ7W_dialogHint"
|
|
707
|
+
"dialogHint": "_4eeJ7W_dialogHint",
|
|
708
|
+
"modelDefaultChip": "_4eeJ7W_modelDefaultChip",
|
|
709
|
+
"modelRowLabel": "_4eeJ7W_modelRowLabel"
|
|
628
710
|
};
|
|
629
711
|
//#endregion
|
|
630
712
|
//#region ../local-agent/src/client/ModelListSection.tsx
|
|
@@ -996,33 +1078,33 @@ window.__ModuleLoader__.load({
|
|
|
996
1078
|
document.head.appendChild(tag);
|
|
997
1079
|
}
|
|
998
1080
|
var SettingsCard_module_css_default = {
|
|
999
|
-
"
|
|
1081
|
+
"configuredChip": "oWITGW_configuredChip",
|
|
1082
|
+
"switchOn": "oWITGW_switchOn",
|
|
1083
|
+
"block": "oWITGW_block",
|
|
1000
1084
|
"knob": "oWITGW_knob",
|
|
1001
|
-
"
|
|
1002
|
-
"
|
|
1085
|
+
"endpointFields": "oWITGW_endpointFields",
|
|
1086
|
+
"row": "oWITGW_row",
|
|
1003
1087
|
"card": "oWITGW_card",
|
|
1004
|
-
"
|
|
1005
|
-
"
|
|
1006
|
-
"modelSave": "oWITGW_modelSave",
|
|
1007
|
-
"chevronOpen": "oWITGW_chevronOpen",
|
|
1008
|
-
"saved": "oWITGW_saved",
|
|
1088
|
+
"endpointField": "oWITGW_endpointField",
|
|
1089
|
+
"chevron": "oWITGW_chevron",
|
|
1009
1090
|
"switch": "oWITGW_switch",
|
|
1010
|
-
"description": "oWITGW_description",
|
|
1011
|
-
"errorText": "oWITGW_errorText",
|
|
1012
|
-
"headText": "oWITGW_headText",
|
|
1013
|
-
"endpointFields": "oWITGW_endpointFields",
|
|
1014
1091
|
"body": "oWITGW_body",
|
|
1015
|
-
"rowLabel": "oWITGW_rowLabel",
|
|
1016
1092
|
"blockTitle": "oWITGW_blockTitle",
|
|
1017
|
-
"
|
|
1093
|
+
"description": "oWITGW_description",
|
|
1018
1094
|
"info": "oWITGW_info",
|
|
1019
|
-
"
|
|
1020
|
-
"
|
|
1021
|
-
"
|
|
1095
|
+
"name": "oWITGW_name",
|
|
1096
|
+
"rowLabel": "oWITGW_rowLabel",
|
|
1097
|
+
"errorText": "oWITGW_errorText",
|
|
1098
|
+
"hint": "oWITGW_hint",
|
|
1099
|
+
"cardOpen": "oWITGW_cardOpen",
|
|
1022
1100
|
"endpointLabel": "oWITGW_endpointLabel",
|
|
1023
|
-
"
|
|
1024
|
-
"
|
|
1025
|
-
"
|
|
1101
|
+
"headText": "oWITGW_headText",
|
|
1102
|
+
"modelInput": "oWITGW_modelInput",
|
|
1103
|
+
"modelSave": "oWITGW_modelSave",
|
|
1104
|
+
"saved": "oWITGW_saved",
|
|
1105
|
+
"nameRow": "oWITGW_nameRow",
|
|
1106
|
+
"chevronOpen": "oWITGW_chevronOpen",
|
|
1107
|
+
"header": "oWITGW_header"
|
|
1026
1108
|
};
|
|
1027
1109
|
//#endregion
|
|
1028
1110
|
//#region src/client/SettingsCard.tsx
|
|
@@ -1053,6 +1135,7 @@ window.__ModuleLoader__.load({
|
|
|
1053
1135
|
const endpointUnavailable = endpointAuth === void 0 || endpointState === "unavailable";
|
|
1054
1136
|
const endpointLoading = !endpointUnavailable && endpointState === null;
|
|
1055
1137
|
const apiKeyConfigured = endpointState !== null && endpointState !== "unavailable" && endpointState.apiKeySet;
|
|
1138
|
+
const authPublished = usePublishedAuthStatus("codex");
|
|
1056
1139
|
(0, react.useEffect)(() => {
|
|
1057
1140
|
if (!active || endpointAuth === void 0) return;
|
|
1058
1141
|
let stale = false;
|
|
@@ -1067,7 +1150,8 @@ window.__ModuleLoader__.load({
|
|
|
1067
1150
|
}, [
|
|
1068
1151
|
active,
|
|
1069
1152
|
endpointAuth,
|
|
1070
|
-
endpointSaved
|
|
1153
|
+
endpointSaved,
|
|
1154
|
+
authPublished
|
|
1071
1155
|
]);
|
|
1072
1156
|
const saveEndpoint = () => {
|
|
1073
1157
|
if (endpointAuth === void 0) return;
|
|
@@ -1092,8 +1176,9 @@ window.__ModuleLoader__.load({
|
|
|
1092
1176
|
const write = (field, value) => {
|
|
1093
1177
|
setSaved(false);
|
|
1094
1178
|
setError(false);
|
|
1095
|
-
scope.set(field, value).then(() => {
|
|
1096
|
-
|
|
1179
|
+
scope.set(field, value).then((accepted) => {
|
|
1180
|
+
if (accepted === false) setError(true);
|
|
1181
|
+
else setSaved(true);
|
|
1097
1182
|
}, () => {
|
|
1098
1183
|
setError(true);
|
|
1099
1184
|
});
|
|
@@ -1463,7 +1548,7 @@ window.__ModuleLoader__.load({
|
|
|
1463
1548
|
en
|
|
1464
1549
|
}), "local-agent-codex: dictionaries");
|
|
1465
1550
|
const t = ctx.locale.bind(NS);
|
|
1466
|
-
const scope =
|
|
1551
|
+
const scope = bindCardSettingsScope(ctx, "codex", "local-agent-codex");
|
|
1467
1552
|
const authT = ctx.locale.bind("local-agent");
|
|
1468
1553
|
const gateway = () => ctx.get("remote.localAgentGateway");
|
|
1469
1554
|
const cardFace = () => ({
|
package/lib/index.js
CHANGED
|
@@ -3902,7 +3902,7 @@ const inject = [
|
|
|
3902
3902
|
* behavior byte-identical.
|
|
3903
3903
|
*/
|
|
3904
3904
|
const SETTINGS_FIELDS = {
|
|
3905
|
-
live: z.boolean().default(
|
|
3905
|
+
live: z.boolean().default(true),
|
|
3906
3906
|
liveMirrorGranularity: z.union([z.const("event"), z.const("token")]).default("token"),
|
|
3907
3907
|
model: z.string(),
|
|
3908
3908
|
recentModels: z.array(z.string()).default([])
|
|
@@ -3954,7 +3954,7 @@ function apply(ctx, config) {
|
|
|
3954
3954
|
const model = vol(config.model);
|
|
3955
3955
|
const recentModels = vol(config.recentModels);
|
|
3956
3956
|
return {
|
|
3957
|
-
live: vol(config.live) ??
|
|
3957
|
+
live: vol(config.live) ?? true,
|
|
3958
3958
|
liveMirrorGranularity: vol(config.liveMirrorGranularity) ?? "token",
|
|
3959
3959
|
...model === void 0 ? {} : { model },
|
|
3960
3960
|
...recentModels === void 0 ? {} : { recentModels }
|
|
@@ -3971,6 +3971,7 @@ function apply(ctx, config) {
|
|
|
3971
3971
|
}
|
|
3972
3972
|
const face = settingsFace(ctx, {
|
|
3973
3973
|
namespace: CODEX_SETTINGS_NAMESPACE,
|
|
3974
|
+
harness: "codex",
|
|
3974
3975
|
legacySchema: CODEX_SETTINGS_SCHEMA,
|
|
3975
3976
|
legacyBase,
|
|
3976
3977
|
read: readSettings
|
|
@@ -7,7 +7,7 @@ import { IconChevronDownOutlineMedium } from './icons.js';
|
|
|
7
7
|
// the block carries no runtime identity to share.
|
|
8
8
|
import { ProviderAuthBlock, } from '@khorsheed/dsh-local-agent/src/client/ProviderAuthBlock.tsx';
|
|
9
9
|
import { AuthStatusDot } from '@khorsheed/dsh-local-agent/src/client/AuthStatusDot.tsx';
|
|
10
|
-
import { publishAuthStatus, useHarnessAuthStatus } from '@khorsheed/dsh-local-agent/src/client/auth-status.ts';
|
|
10
|
+
import { publishAuthStatus, useHarnessAuthStatus, usePublishedAuthStatus } from '@khorsheed/dsh-local-agent/src/client/auth-status.ts';
|
|
11
11
|
import { ModelListSection } from '@khorsheed/dsh-local-agent/src/client/ModelListSection.tsx';
|
|
12
12
|
import css from './SettingsCard.module.css';
|
|
13
13
|
/**
|
|
@@ -43,6 +43,10 @@ function useCardState(active, useSettings, scope, endpointAuth) {
|
|
|
43
43
|
const endpointUnavailable = endpointAuth === undefined || endpointState === 'unavailable';
|
|
44
44
|
const endpointLoading = !endpointUnavailable && endpointState === null;
|
|
45
45
|
const apiKeyConfigured = endpointState !== null && endpointState !== 'unavailable' && endpointState.apiKeySet;
|
|
46
|
+
// A login or logout elsewhere in the card (the auth block) changes what
|
|
47
|
+
// the store holds — logout deletes the saved key: re-read, or the form
|
|
48
|
+
// keeps saying 已配置 for a key that is gone.
|
|
49
|
+
const authPublished = usePublishedAuthStatus('codex');
|
|
46
50
|
useEffect(() => {
|
|
47
51
|
if (!active || endpointAuth === undefined)
|
|
48
52
|
return;
|
|
@@ -51,7 +55,7 @@ function useCardState(active, useSettings, scope, endpointAuth) {
|
|
|
51
55
|
setEndpointState(state ?? 'unavailable'); }, () => { if (!stale)
|
|
52
56
|
setEndpointState('unavailable'); });
|
|
53
57
|
return () => { stale = true; };
|
|
54
|
-
}, [active, endpointAuth, endpointSaved]);
|
|
58
|
+
}, [active, endpointAuth, endpointSaved, authPublished]);
|
|
55
59
|
// The credential save: one `configureEndpoint` call carrying only the
|
|
56
60
|
// dirty fields (a blank draft clears its field); the answer is the
|
|
57
61
|
// post-write resolved state, so the chips and the auth probe flip without
|
|
@@ -82,7 +86,11 @@ function useCardState(active, useSettings, scope, endpointAuth) {
|
|
|
82
86
|
const write = (field, value) => {
|
|
83
87
|
setSaved(false);
|
|
84
88
|
setError(false);
|
|
85
|
-
|
|
89
|
+
// The host answers a refused write with `false` (ConfigForm), not a rejection.
|
|
90
|
+
void scope.set(field, value).then((accepted) => { if (accepted === false)
|
|
91
|
+
setError(true);
|
|
92
|
+
else
|
|
93
|
+
setSaved(true); }, () => { setError(true); });
|
|
86
94
|
};
|
|
87
95
|
return {
|
|
88
96
|
snapshot, saved, error, ready, live, write,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { bindCardSettingsScope } from '@khorsheed/dsh-local-agent/src/client/settings-scope.ts';
|
|
2
2
|
/**
|
|
3
3
|
* Local-agent-codex plugin, browser half: the codex settings card — a section
|
|
4
4
|
* of the family core's「本机 Agent 委派」family card on the Plugins page
|
|
@@ -46,7 +46,7 @@ export const inject = ['slots', 'remote', 'remote.commands', 'locale'];
|
|
|
46
46
|
export function apply(ctx) {
|
|
47
47
|
ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'local-agent-codex: dictionaries');
|
|
48
48
|
const t = ctx.locale.bind(NS);
|
|
49
|
-
const scope =
|
|
49
|
+
const scope = bindCardSettingsScope(ctx, 'codex', 'local-agent-codex');
|
|
50
50
|
// The auth block's copy lives in the family core's dictionary; binding is
|
|
51
51
|
// stable per namespace and late dictionary registration still resolves.
|
|
52
52
|
const authT = ctx.locale.bind('local-agent');
|
package/lib/types/index.js
CHANGED
|
@@ -49,7 +49,7 @@ export const inject = ['localAgent', 'subagents', 'subprocess', 'settings'];
|
|
|
49
49
|
* behavior byte-identical.
|
|
50
50
|
*/
|
|
51
51
|
const SETTINGS_FIELDS = {
|
|
52
|
-
live: z.boolean().default(
|
|
52
|
+
live: z.boolean().default(true),
|
|
53
53
|
liveMirrorGranularity: z.union([z.const('event'), z.const('token')]).default('token'),
|
|
54
54
|
model: z.string(),
|
|
55
55
|
recentModels: z.array(z.string()).default([]),
|
|
@@ -117,7 +117,7 @@ export function apply(ctx, config) {
|
|
|
117
117
|
const model = vol(config.model);
|
|
118
118
|
const recentModels = vol(config.recentModels);
|
|
119
119
|
return {
|
|
120
|
-
live: vol(config.live) ??
|
|
120
|
+
live: vol(config.live) ?? true,
|
|
121
121
|
liveMirrorGranularity: vol(config.liveMirrorGranularity) ?? 'token',
|
|
122
122
|
...model === undefined ? {} : { model },
|
|
123
123
|
...recentModels === undefined ? {} : { recentModels },
|
|
@@ -131,6 +131,8 @@ export function apply(ctx, config) {
|
|
|
131
131
|
}
|
|
132
132
|
const face = settingsFace(ctx, {
|
|
133
133
|
namespace: CODEX_SETTINGS_NAMESPACE,
|
|
134
|
+
// Card writes live in the harness's own store (card-settings.ts), never the profile patch.
|
|
135
|
+
harness: 'codex',
|
|
134
136
|
legacySchema: CODEX_SETTINGS_SCHEMA,
|
|
135
137
|
legacyBase,
|
|
136
138
|
read: readSettings,
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"local-agent",
|
|
9
9
|
"codex"
|
|
10
10
|
],
|
|
11
|
-
"version": "0.2.
|
|
11
|
+
"version": "0.2.1",
|
|
12
12
|
"type": "module",
|
|
13
13
|
"main": "lib/index.js",
|
|
14
14
|
"types": "lib/types/index.d.ts",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"dsh": ">=0.1.5-rc.1 <0.3.0-0"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@khorsheed/dsh-local-agent": "^0.2.
|
|
72
|
+
"@khorsheed/dsh-local-agent": "^0.2.1"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
75
|
"@deepseek-ai/cordis": "^4.0.1",
|