@khorsheed/dsh-local-agent-claude-code 0.2.0 → 0.2.2
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 +12 -0
- package/README.en.md +1 -1
- package/README.i18n.yaml +2 -2
- package/README.md +1 -1
- package/lib/client.js +153 -68
- package/lib/index.js +5 -3
- package/lib/types/claude-cli-provider.d.ts +2 -0
- package/lib/types/claude-cli-provider.js +6 -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,16 @@
|
|
|
1
1
|
# 变更记录
|
|
2
|
+
## 0.2.2(2026-10-27)
|
|
3
|
+
|
|
4
|
+
- 成员的工具调用保留结构化参数,透镜和记录里能看到完整入参。
|
|
5
|
+
|
|
6
|
+
## 0.2.1(2026-10-27)
|
|
7
|
+
|
|
8
|
+
- **修复几个模式套件一起装时设置存不上**:卡片上的开关和设置改存在本 harness 自己的目录里,不再写进配置文件;原来配好的值照常生效。
|
|
9
|
+
- **保存失败就说保存失败**:设置被拒时显示「保存失败」,不再假装「已保存」。
|
|
10
|
+
- **常驻模式(live)默认打开**:遇到问题可以在卡片上关掉,改回每次新起一个。
|
|
11
|
+
- **端点表单跟着登录、登出刷新**:登出后不再显示「API Key 已配置」,验证端点也不再报找不到凭据。
|
|
12
|
+
- **读不到登录状态时直说**:显示「读取登录状态失败」。
|
|
13
|
+
|
|
2
14
|
## 0.2.0(2026-10-26)
|
|
3
15
|
|
|
4
16
|
rc.3 之后到正式版的变化:
|
package/README.en.md
CHANGED
|
@@ -16,7 +16,7 @@ Getting Claude Code to help used to mean opening a terminal, pasting things in,
|
|
|
16
16
|
- **Keep talking, no cold start**: have the agent follow up, or open the sub-session and message it yourself; it's the same Claude Code session.
|
|
17
17
|
- **Paste a key and go**: enter the endpoint and API key (or Auth Token) on the settings card, press "Save credential", then "Verify endpoint & fetch models" to check it connects.
|
|
18
18
|
- **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.
|
|
19
|
-
- **Resident mode is faster**:
|
|
19
|
+
- **Resident mode is faster**: "Resident mode (live)" is on by default and the Claude Code process stays up; stopping doesn't kill it, and after a crash it resumes the same session.
|
|
20
20
|
|
|
21
21
|
## Install
|
|
22
22
|
|
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-claude-code/README.en.md
|
|
5
|
-
packages/local-agent-claude-code/README.en.md:
|
|
6
|
-
packages/local-agent-claude-code/README.md:
|
|
5
|
+
packages/local-agent-claude-code/README.en.md: 37ed09d088c95c8fc6e3fcd0849de51db10ad823
|
|
6
|
+
packages/local-agent-claude-code/README.md: 720e3e5345e6b48d00f033f0a818779cfe74c563
|
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
- **接着聊,不冷启动**:让 agent 追问,或者打开子会话直接发消息,继续的是同一个 Claude Code 会话。
|
|
17
17
|
- **填好 key 就能用**:在设置卡片里填端点地址和 API Key(或 Auth Token),点「保存凭据」,再点「验证端点并获取模型」确认能连上。
|
|
18
18
|
- **自己挑模型**:在「可用模型」里勾选、拖动排序,排第一的就是默认模型;子会话里也能临时换模型和推理强度。
|
|
19
|
-
-
|
|
19
|
+
- **常驻模式更快**:「常驻模式(live)」默认开着,Claude Code 进程常驻,停下不杀进程,崩溃后自动续上原来的会话。
|
|
20
20
|
|
|
21
21
|
## 安装
|
|
22
22
|
|
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-claude-code` namespace dictionaries. */
|
|
@@ -204,8 +281,13 @@ window.__ModuleLoader__.load({
|
|
|
204
281
|
* re-probes so a mid-session credential loss cannot leave a stale green dot.
|
|
205
282
|
* @module @khorsheed/dsh-local-agent/client — auth status bus
|
|
206
283
|
*/
|
|
207
|
-
const
|
|
208
|
-
const
|
|
284
|
+
const BUS_KEY = Symbol.for("dsh.local-agent.auth-status");
|
|
285
|
+
const bus = globalThis[BUS_KEY] ??= {
|
|
286
|
+
statuses: /* @__PURE__ */ new Map(),
|
|
287
|
+
listeners: /* @__PURE__ */ new Set()
|
|
288
|
+
};
|
|
289
|
+
const statuses = bus.statuses;
|
|
290
|
+
const listeners = bus.listeners;
|
|
209
291
|
/** Record one harness's latest probe result and notify subscribers. */
|
|
210
292
|
function publishAuthStatus(harnessId, status) {
|
|
211
293
|
if (statuses.get(harnessId) === status) return;
|
|
@@ -263,30 +345,30 @@ window.__ModuleLoader__.load({
|
|
|
263
345
|
document.head.appendChild(tag);
|
|
264
346
|
}
|
|
265
347
|
var ProviderAuthBlock_module_css_default = {
|
|
348
|
+
"rowTag": "On5p7W_rowTag",
|
|
266
349
|
"rowCard": "On5p7W_rowCard",
|
|
267
|
-
"
|
|
350
|
+
"intro": "On5p7W_intro",
|
|
351
|
+
"title": "On5p7W_title",
|
|
352
|
+
"rowIdentity": "On5p7W_rowIdentity",
|
|
353
|
+
"status": "On5p7W_status",
|
|
268
354
|
"loginPrompt": "On5p7W_loginPrompt",
|
|
269
|
-
"
|
|
355
|
+
"codeInput": "On5p7W_codeInput",
|
|
356
|
+
"retryButton": "On5p7W_retryButton",
|
|
357
|
+
"dotPending": "On5p7W_dotPending",
|
|
358
|
+
"credentialDot": "On5p7W_credentialDot",
|
|
270
359
|
"dotOn": "On5p7W_dotOn",
|
|
271
|
-
"rowIdentity": "On5p7W_rowIdentity",
|
|
272
|
-
"rowPending": "On5p7W_rowPending",
|
|
273
|
-
"rows": "On5p7W_rows",
|
|
274
|
-
"title": "On5p7W_title",
|
|
275
|
-
"intro": "On5p7W_intro",
|
|
276
360
|
"rowName": "On5p7W_rowName",
|
|
277
361
|
"rowActions": "On5p7W_rowActions",
|
|
362
|
+
"rowPending": "On5p7W_rowPending",
|
|
278
363
|
"dotOff": "On5p7W_dotOff",
|
|
364
|
+
"logoutButton": "On5p7W_logoutButton",
|
|
279
365
|
"section": "On5p7W_section",
|
|
366
|
+
"openPage": "On5p7W_openPage",
|
|
280
367
|
"rowHead": "On5p7W_rowHead",
|
|
281
|
-
"
|
|
282
|
-
"rowTag": "On5p7W_rowTag",
|
|
283
|
-
"credentialDot": "On5p7W_credentialDot",
|
|
284
|
-
"status": "On5p7W_status",
|
|
368
|
+
"rows": "On5p7W_rows",
|
|
285
369
|
"loginButton": "On5p7W_loginButton",
|
|
286
370
|
"rosterError": "On5p7W_rosterError",
|
|
287
|
-
"
|
|
288
|
-
"codeInput": "On5p7W_codeInput",
|
|
289
|
-
"openPage": "On5p7W_openPage"
|
|
371
|
+
"promptText": "On5p7W_promptText"
|
|
290
372
|
};
|
|
291
373
|
//#endregion
|
|
292
374
|
//#region ../local-agent/src/client/ProviderAuthBlock.tsx
|
|
@@ -439,8 +521,8 @@ window.__ModuleLoader__.load({
|
|
|
439
521
|
const statusKind = usePublishedAuthStatus(harness.id) ?? view.status;
|
|
440
522
|
const authenticated = statusKind === "authenticated";
|
|
441
523
|
const loginPending = pendingSince !== void 0;
|
|
442
|
-
const loginable = view.loginable ??
|
|
443
|
-
const logoutable = view.logoutable ??
|
|
524
|
+
const loginable = view.loginable ?? statusKind !== "unavailable";
|
|
525
|
+
const logoutable = view.logoutable ?? statusKind !== "unavailable";
|
|
444
526
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
445
527
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
446
528
|
className: ProviderAuthBlock_module_css_default.rowHead,
|
|
@@ -473,7 +555,7 @@ window.__ModuleLoader__.load({
|
|
|
473
555
|
statusKind === "checking" && t("loading"),
|
|
474
556
|
statusKind === "authenticated" && t("settings.authenticated"),
|
|
475
557
|
statusKind === "anonymous" && t("settings.notAuthenticated"),
|
|
476
|
-
statusKind === "unavailable" && t("
|
|
558
|
+
statusKind === "unavailable" && t("settings.statusFailed")
|
|
477
559
|
]
|
|
478
560
|
}),
|
|
479
561
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
@@ -566,8 +648,8 @@ window.__ModuleLoader__.load({
|
|
|
566
648
|
}
|
|
567
649
|
var AuthStatusDot_module_css_default = {
|
|
568
650
|
"credentialDot": "OFjNUG_credentialDot",
|
|
569
|
-
"dotOff": "OFjNUG_dotOff",
|
|
570
651
|
"dotPending": "OFjNUG_dotPending",
|
|
652
|
+
"dotOff": "OFjNUG_dotOff",
|
|
571
653
|
"dotOn": "OFjNUG_dotOn"
|
|
572
654
|
};
|
|
573
655
|
//#endregion
|
|
@@ -584,7 +666,7 @@ window.__ModuleLoader__.load({
|
|
|
584
666
|
}
|
|
585
667
|
//#endregion
|
|
586
668
|
//#region \0dsh-css:../local-agent/src/client/ModelListSection.module.css.mjs
|
|
587
|
-
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-
|
|
669
|
+
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}";
|
|
588
670
|
const tagId$1 = "@khorsheed/dsh-local-agent-claude-code/ModelListSection.module.css";
|
|
589
671
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
590
672
|
const tag = document.createElement("style");
|
|
@@ -594,39 +676,39 @@ window.__ModuleLoader__.load({
|
|
|
594
676
|
document.head.appendChild(tag);
|
|
595
677
|
}
|
|
596
678
|
var ModelListSection_module_css_default = {
|
|
597
|
-
"
|
|
679
|
+
"saved": "_4eeJ7W_saved",
|
|
680
|
+
"modelDelete": "_4eeJ7W_modelDelete",
|
|
681
|
+
"dialogItem": "_4eeJ7W_dialogItem",
|
|
598
682
|
"modelList": "_4eeJ7W_modelList",
|
|
683
|
+
"modelDefaultChip": "_4eeJ7W_modelDefaultChip",
|
|
684
|
+
"modelRowLabel": "_4eeJ7W_modelRowLabel",
|
|
685
|
+
"dialogItemValue": "_4eeJ7W_dialogItemValue",
|
|
686
|
+
"info": "_4eeJ7W_info",
|
|
687
|
+
"dialogBackdrop": "_4eeJ7W_dialogBackdrop",
|
|
688
|
+
"dialogList": "_4eeJ7W_dialogList",
|
|
689
|
+
"modelRowValue": "_4eeJ7W_modelRowValue",
|
|
690
|
+
"dialogHead": "_4eeJ7W_dialogHead",
|
|
691
|
+
"dialogActions": "_4eeJ7W_dialogActions",
|
|
692
|
+
"dialogItemAdded": "_4eeJ7W_dialogItemAdded",
|
|
599
693
|
"dialogSelectAll": "_4eeJ7W_dialogSelectAll",
|
|
600
|
-
"
|
|
601
|
-
"dialogHint": "_4eeJ7W_dialogHint",
|
|
694
|
+
"dialogTitle": "_4eeJ7W_dialogTitle",
|
|
602
695
|
"modelDrag": "_4eeJ7W_modelDrag",
|
|
603
|
-
"
|
|
696
|
+
"dialogHint": "_4eeJ7W_dialogHint",
|
|
697
|
+
"blockTitle": "_4eeJ7W_blockTitle",
|
|
698
|
+
"row": "_4eeJ7W_row",
|
|
699
|
+
"errorText": "_4eeJ7W_errorText",
|
|
604
700
|
"modelInput": "_4eeJ7W_modelInput",
|
|
605
|
-
"modelRow": "_4eeJ7W_modelRow",
|
|
606
|
-
"dialogHead": "_4eeJ7W_dialogHead",
|
|
607
|
-
"dialogItemValue": "_4eeJ7W_dialogItemValue",
|
|
608
701
|
"hint": "_4eeJ7W_hint",
|
|
609
|
-
"dialogConfirm": "_4eeJ7W_dialogConfirm",
|
|
610
|
-
"dialogClose": "_4eeJ7W_dialogClose",
|
|
611
|
-
"dialogToolbar": "_4eeJ7W_dialogToolbar",
|
|
612
|
-
"errorText": "_4eeJ7W_errorText",
|
|
613
|
-
"dialogItemAdded": "_4eeJ7W_dialogItemAdded",
|
|
614
702
|
"modelSave": "_4eeJ7W_modelSave",
|
|
615
|
-
"
|
|
616
|
-
"saved": "_4eeJ7W_saved",
|
|
617
|
-
"modelDefaultChip": "_4eeJ7W_modelDefaultChip",
|
|
618
|
-
"modelRowLabel": "_4eeJ7W_modelRowLabel",
|
|
619
|
-
"info": "_4eeJ7W_info",
|
|
620
|
-
"block": "_4eeJ7W_block",
|
|
621
|
-
"modelRowValue": "_4eeJ7W_modelRowValue",
|
|
703
|
+
"modelRowDragging": "_4eeJ7W_modelRowDragging",
|
|
622
704
|
"modelAdd": "_4eeJ7W_modelAdd",
|
|
623
|
-
"
|
|
624
|
-
"
|
|
625
|
-
"
|
|
705
|
+
"modelRow": "_4eeJ7W_modelRow",
|
|
706
|
+
"dialogConfirm": "_4eeJ7W_dialogConfirm",
|
|
707
|
+
"block": "_4eeJ7W_block",
|
|
626
708
|
"dialog": "_4eeJ7W_dialog",
|
|
627
|
-
"
|
|
628
|
-
"
|
|
629
|
-
"
|
|
709
|
+
"dialogToolbar": "_4eeJ7W_dialogToolbar",
|
|
710
|
+
"dialogItemLabel": "_4eeJ7W_dialogItemLabel",
|
|
711
|
+
"dialogClose": "_4eeJ7W_dialogClose"
|
|
630
712
|
};
|
|
631
713
|
//#endregion
|
|
632
714
|
//#region ../local-agent/src/client/ModelListSection.tsx
|
|
@@ -998,33 +1080,33 @@ window.__ModuleLoader__.load({
|
|
|
998
1080
|
document.head.appendChild(tag);
|
|
999
1081
|
}
|
|
1000
1082
|
var SettingsCard_module_css_default = {
|
|
1001
|
-
"
|
|
1083
|
+
"endpointFields": "C-VWHa_endpointFields",
|
|
1084
|
+
"modelInput": "C-VWHa_modelInput",
|
|
1002
1085
|
"hint": "C-VWHa_hint",
|
|
1003
|
-
"
|
|
1004
|
-
"
|
|
1086
|
+
"switch": "C-VWHa_switch",
|
|
1087
|
+
"nameRow": "C-VWHa_nameRow",
|
|
1088
|
+
"row": "C-VWHa_row",
|
|
1005
1089
|
"headText": "C-VWHa_headText",
|
|
1090
|
+
"info": "C-VWHa_info",
|
|
1006
1091
|
"knob": "C-VWHa_knob",
|
|
1007
|
-
"
|
|
1092
|
+
"modelSave": "C-VWHa_modelSave",
|
|
1093
|
+
"errorText": "C-VWHa_errorText",
|
|
1008
1094
|
"blockTitle": "C-VWHa_blockTitle",
|
|
1009
|
-
"nameRow": "C-VWHa_nameRow",
|
|
1010
|
-
"description": "C-VWHa_description",
|
|
1011
1095
|
"body": "C-VWHa_body",
|
|
1012
|
-
"
|
|
1013
|
-
"switch": "C-VWHa_switch",
|
|
1014
|
-
"block": "C-VWHa_block",
|
|
1096
|
+
"description": "C-VWHa_description",
|
|
1015
1097
|
"saved": "C-VWHa_saved",
|
|
1016
|
-
"modelSave": "C-VWHa_modelSave",
|
|
1017
|
-
"errorText": "C-VWHa_errorText",
|
|
1018
|
-
"rowLabel": "C-VWHa_rowLabel",
|
|
1019
|
-
"chevronOpen": "C-VWHa_chevronOpen",
|
|
1020
|
-
"endpointFields": "C-VWHa_endpointFields",
|
|
1021
1098
|
"card": "C-VWHa_card",
|
|
1022
|
-
"
|
|
1023
|
-
"
|
|
1099
|
+
"chevronOpen": "C-VWHa_chevronOpen",
|
|
1100
|
+
"endpointField": "C-VWHa_endpointField",
|
|
1024
1101
|
"endpointLabel": "C-VWHa_endpointLabel",
|
|
1025
|
-
"info": "C-VWHa_info",
|
|
1026
1102
|
"cardOpen": "C-VWHa_cardOpen",
|
|
1027
|
-
"
|
|
1103
|
+
"block": "C-VWHa_block",
|
|
1104
|
+
"configuredChip": "C-VWHa_configuredChip",
|
|
1105
|
+
"rowLabel": "C-VWHa_rowLabel",
|
|
1106
|
+
"name": "C-VWHa_name",
|
|
1107
|
+
"switchOn": "C-VWHa_switchOn",
|
|
1108
|
+
"chevron": "C-VWHa_chevron",
|
|
1109
|
+
"header": "C-VWHa_header"
|
|
1028
1110
|
};
|
|
1029
1111
|
//#endregion
|
|
1030
1112
|
//#region src/client/SettingsCard.tsx
|
|
@@ -1059,6 +1141,7 @@ window.__ModuleLoader__.load({
|
|
|
1059
1141
|
const endpointLoading = !endpointUnavailable && endpointState === null;
|
|
1060
1142
|
const apiKeyConfigured = endpointState !== null && endpointState !== "unavailable" && endpointState.apiKeySet;
|
|
1061
1143
|
const authTokenConfigured = endpointState !== null && endpointState !== "unavailable" && endpointState.authTokenSet;
|
|
1144
|
+
const authPublished = usePublishedAuthStatus("claude-code");
|
|
1062
1145
|
(0, react.useEffect)(() => {
|
|
1063
1146
|
if (!active || endpointAuth === void 0) return;
|
|
1064
1147
|
let stale = false;
|
|
@@ -1073,13 +1156,15 @@ window.__ModuleLoader__.load({
|
|
|
1073
1156
|
}, [
|
|
1074
1157
|
active,
|
|
1075
1158
|
endpointAuth,
|
|
1076
|
-
endpointSaved
|
|
1159
|
+
endpointSaved,
|
|
1160
|
+
authPublished
|
|
1077
1161
|
]);
|
|
1078
1162
|
const write = (field, value) => {
|
|
1079
1163
|
setSaved(false);
|
|
1080
1164
|
setError(false);
|
|
1081
|
-
scope.set(field, value).then(() => {
|
|
1082
|
-
|
|
1165
|
+
scope.set(field, value).then((accepted) => {
|
|
1166
|
+
if (accepted === false) setError(true);
|
|
1167
|
+
else setSaved(true);
|
|
1083
1168
|
}, () => {
|
|
1084
1169
|
setError(true);
|
|
1085
1170
|
});
|
|
@@ -1495,7 +1580,7 @@ window.__ModuleLoader__.load({
|
|
|
1495
1580
|
en
|
|
1496
1581
|
}), "local-agent-claude-code: dictionaries");
|
|
1497
1582
|
const t = ctx.locale.bind(NS);
|
|
1498
|
-
const scope =
|
|
1583
|
+
const scope = bindCardSettingsScope(ctx, "claude-code", "local-agent-claude-code");
|
|
1499
1584
|
const authT = ctx.locale.bind("local-agent");
|
|
1500
1585
|
const gateway = () => ctx.get("remote.localAgentGateway");
|
|
1501
1586
|
const cardFace = () => ({
|
package/lib/index.js
CHANGED
|
@@ -2308,7 +2308,8 @@ function inputDetail(input) {
|
|
|
2308
2308
|
}
|
|
2309
2309
|
const json = JSON.stringify(record);
|
|
2310
2310
|
if (json === "{}") return void 0;
|
|
2311
|
-
|
|
2311
|
+
const cap = Object.values(record).some((value) => typeof value === "object" && value !== null) ? 16e3 : 160;
|
|
2312
|
+
return json.length <= cap ? json : `${json.slice(0, cap)}…`;
|
|
2312
2313
|
}
|
|
2313
2314
|
/**
|
|
2314
2315
|
* The actual edit behind an Edit/Write/MultiEdit/NotebookEdit tool_use, for
|
|
@@ -3850,7 +3851,7 @@ const inject = [
|
|
|
3850
3851
|
* behavior byte-identical.
|
|
3851
3852
|
*/
|
|
3852
3853
|
const SETTINGS_FIELDS = {
|
|
3853
|
-
live: z.boolean().default(
|
|
3854
|
+
live: z.boolean().default(true),
|
|
3854
3855
|
liveMirrorGranularity: z.union([z.const("event"), z.const("token")]).default("token"),
|
|
3855
3856
|
model: z.string(),
|
|
3856
3857
|
recentModels: z.array(z.string()).default([])
|
|
@@ -3900,7 +3901,7 @@ function apply(ctx, config) {
|
|
|
3900
3901
|
const model = vol(config.model);
|
|
3901
3902
|
const recentModels = vol(config.recentModels);
|
|
3902
3903
|
return {
|
|
3903
|
-
live: vol(config.live) ??
|
|
3904
|
+
live: vol(config.live) ?? true,
|
|
3904
3905
|
liveMirrorGranularity: vol(config.liveMirrorGranularity) ?? "token",
|
|
3905
3906
|
...model === void 0 ? {} : { model },
|
|
3906
3907
|
...recentModels === void 0 ? {} : { recentModels }
|
|
@@ -3917,6 +3918,7 @@ function apply(ctx, config) {
|
|
|
3917
3918
|
}
|
|
3918
3919
|
const face = settingsFace(ctx, {
|
|
3919
3920
|
namespace: CLAUDE_SETTINGS_NAMESPACE,
|
|
3921
|
+
harness: "claude-code",
|
|
3920
3922
|
legacySchema: CLAUDE_SETTINGS_SCHEMA,
|
|
3921
3923
|
legacyBase,
|
|
3922
3924
|
read: readSettings
|
|
@@ -388,6 +388,8 @@ export declare function parseClaudeStreamJson(output: string): {
|
|
|
388
388
|
};
|
|
389
389
|
/** The placeholder think line for a `redacted_thinking` block (content is server-encrypted by design). */
|
|
390
390
|
export declare const REDACTED_THINKING_TEXT = "\uFF08\u601D\u8003\u5185\u5BB9\u5DF2\u7531\u670D\u52A1\u7AEF\u9690\u85CF\uFF1Aredacted_thinking\uFF0C\u5185\u5BB9\u6309\u8BBE\u8BA1\u4E0D\u53EF\u89C1\uFF0C\u6B64\u884C\u4EC5\u6807\u793A\u5B83\u5B58\u5728\uFF09";
|
|
391
|
+
/** Render a tool_use input payload as a compact command/query line. */
|
|
392
|
+
export declare function inputDetail(input: unknown): string | undefined;
|
|
391
393
|
/**
|
|
392
394
|
* Map claude's usage payload onto the shared usage contract. Claude's
|
|
393
395
|
* `input_tokens` is the uncached input; cache reads and cache creation are
|
|
@@ -915,7 +915,7 @@ const SERVER_TOOL_CARD_NAMES = {
|
|
|
915
915
|
web_fetch: 'WebFetch',
|
|
916
916
|
};
|
|
917
917
|
/** Render a tool_use input payload as a compact command/query line. */
|
|
918
|
-
function inputDetail(input) {
|
|
918
|
+
export function inputDetail(input) {
|
|
919
919
|
if (input === undefined)
|
|
920
920
|
return undefined;
|
|
921
921
|
if (typeof input === 'string')
|
|
@@ -933,7 +933,11 @@ function inputDetail(input) {
|
|
|
933
933
|
const json = JSON.stringify(record);
|
|
934
934
|
if (json === '{}')
|
|
935
935
|
return undefined;
|
|
936
|
-
|
|
936
|
+
// Structured input (an MCP tool's nested questions, options, lists) stays
|
|
937
|
+
// whole and parseable: a 160-character cut left ask_user_question unreadable.
|
|
938
|
+
const structured = Object.values(record).some(value => typeof value === 'object' && value !== null);
|
|
939
|
+
const cap = structured ? 16_000 : 160;
|
|
940
|
+
return json.length <= cap ? json : `${json.slice(0, cap)}…`;
|
|
937
941
|
}
|
|
938
942
|
/**
|
|
939
943
|
* The actual edit behind an Edit/Write/MultiEdit/NotebookEdit tool_use, for
|
|
@@ -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
|
/**
|
|
@@ -47,6 +47,10 @@ function useCardState(active, useSettings, scope, endpointAuth) {
|
|
|
47
47
|
const endpointLoading = !endpointUnavailable && endpointState === null;
|
|
48
48
|
const apiKeyConfigured = endpointState !== null && endpointState !== 'unavailable' && endpointState.apiKeySet;
|
|
49
49
|
const authTokenConfigured = endpointState !== null && endpointState !== 'unavailable' && endpointState.authTokenSet;
|
|
50
|
+
// A login or logout elsewhere in the card (the auth block) changes what
|
|
51
|
+
// the store holds — logout deletes the saved key: re-read, or the form
|
|
52
|
+
// keeps saying 已配置 for a key that is gone.
|
|
53
|
+
const authPublished = usePublishedAuthStatus('claude-code');
|
|
50
54
|
useEffect(() => {
|
|
51
55
|
if (!active || endpointAuth === undefined)
|
|
52
56
|
return;
|
|
@@ -55,11 +59,15 @@ function useCardState(active, useSettings, scope, endpointAuth) {
|
|
|
55
59
|
setEndpointState(state ?? 'unavailable'); }, () => { if (!stale)
|
|
56
60
|
setEndpointState('unavailable'); });
|
|
57
61
|
return () => { stale = true; };
|
|
58
|
-
}, [active, endpointAuth, endpointSaved]);
|
|
62
|
+
}, [active, endpointAuth, endpointSaved, authPublished]);
|
|
59
63
|
const write = (field, value) => {
|
|
60
64
|
setSaved(false);
|
|
61
65
|
setError(false);
|
|
62
|
-
|
|
66
|
+
// The host answers a refused write with `false` (ConfigForm), not a rejection.
|
|
67
|
+
void scope.set(field, value).then((accepted) => { if (accepted === false)
|
|
68
|
+
setError(true);
|
|
69
|
+
else
|
|
70
|
+
setSaved(true); }, () => { setError(true); });
|
|
63
71
|
};
|
|
64
72
|
// The credential save: one `configureEndpoint` call carrying only the
|
|
65
73
|
// dirty fields (a blank draft clears its field); the answer is the
|
|
@@ -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-claude-code plugin, browser half: the claude-code settings card
|
|
4
4
|
* — a section of the family core's「本机 Agent 委派」family card on the
|
|
@@ -44,7 +44,7 @@ export const inject = ['slots', 'remote', 'remote.commands', 'locale'];
|
|
|
44
44
|
export function apply(ctx) {
|
|
45
45
|
ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'local-agent-claude-code: dictionaries');
|
|
46
46
|
const t = ctx.locale.bind(NS);
|
|
47
|
-
const scope =
|
|
47
|
+
const scope = bindCardSettingsScope(ctx, 'claude-code', 'local-agent-claude-code');
|
|
48
48
|
// The auth block's copy lives in the family core's dictionary; binding is
|
|
49
49
|
// stable per namespace and late dictionary registration still resolves.
|
|
50
50
|
const authT = ctx.locale.bind('local-agent');
|
package/lib/types/index.js
CHANGED
|
@@ -42,7 +42,7 @@ export const inject = ['localAgent', 'subagents', 'subprocess', 'settings'];
|
|
|
42
42
|
* behavior byte-identical.
|
|
43
43
|
*/
|
|
44
44
|
const SETTINGS_FIELDS = {
|
|
45
|
-
live: z.boolean().default(
|
|
45
|
+
live: z.boolean().default(true),
|
|
46
46
|
liveMirrorGranularity: z.union([z.const('event'), z.const('token')]).default('token'),
|
|
47
47
|
model: z.string(),
|
|
48
48
|
recentModels: z.array(z.string()).default([]),
|
|
@@ -109,7 +109,7 @@ export function apply(ctx, config) {
|
|
|
109
109
|
const model = vol(config.model);
|
|
110
110
|
const recentModels = vol(config.recentModels);
|
|
111
111
|
return {
|
|
112
|
-
live: vol(config.live) ??
|
|
112
|
+
live: vol(config.live) ?? true,
|
|
113
113
|
liveMirrorGranularity: vol(config.liveMirrorGranularity) ?? 'token',
|
|
114
114
|
...model === undefined ? {} : { model },
|
|
115
115
|
...recentModels === undefined ? {} : { recentModels },
|
|
@@ -123,6 +123,8 @@ export function apply(ctx, config) {
|
|
|
123
123
|
}
|
|
124
124
|
const face = settingsFace(ctx, {
|
|
125
125
|
namespace: CLAUDE_SETTINGS_NAMESPACE,
|
|
126
|
+
// Card writes live in the harness's own store (card-settings.ts), never the profile patch.
|
|
127
|
+
harness: 'claude-code',
|
|
126
128
|
legacySchema: CLAUDE_SETTINGS_SCHEMA,
|
|
127
129
|
legacyBase,
|
|
128
130
|
read: readSettings,
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"local-agent",
|
|
9
9
|
"claude-code"
|
|
10
10
|
],
|
|
11
|
-
"version": "0.2.
|
|
11
|
+
"version": "0.2.2",
|
|
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.2"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
75
|
"@deepseek-ai/cordis": "^4.0.1",
|