@shgroup/dsh-serenity-hooks 1.26.17 → 1.27.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/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-serenity-hooks",
3
- "version": "1.26.17",
3
+ "version": "1.27.1",
4
4
  "main": "lib/index.js",
5
5
  "description": "宁静号 ACC harness(Native Cordis 插件):真实 DSH 工具 cc_fs/session/acc_msm/eap/neat/cce/handyman/session_rebuild/skiff_admin + 拦截缝机械约束(safe-mode/路径守卫)+ 高级设定面板(双端口网关/账号管理)+ Skiff 认知子集角色(实验性)。适配 DSH 公开版(0.1.0-rc,deepseek-ai/deepseek-harness)。",
6
6
  "engines": {
package/lib/ccc.d.ts CHANGED
@@ -63,6 +63,14 @@ export interface SerenityConfig {
63
63
  * 未配置或 enabled=false → 机制完全不启动(零资源占用,零影响现有功能)。
64
64
  */
65
65
  autotrajectory?: AutoTrajectorySettings;
66
+ /**
67
+ * 微信桥(F4c-3,v1.27.0 实验性):**CCC 级**配置——dsh 一个进程含多个 CCC,
68
+ * 每个 CCC 独立对接微信桥(S142 用户拍板:ACC 不绑定 role,配置归 CCC,手工)。
69
+ * 结构/路由/开关在此文件(git 管可重建);**bot_token 凭据在 CCC localstore**
70
+ * (weixin.accounts.<accountId>.token/.baseUrl/.userId——扫码后自动写入,安全纪律)。
71
+ * 未配置或 enabled=false → 该 CCC 桥完全不启动(零资源占用)。
72
+ */
73
+ weixin?: WeixinSettings;
66
74
  }
67
75
  /**
68
76
  * 自主轨迹配置(CCC 定义;S142 用户拍板 v0.5):
@@ -95,6 +103,40 @@ export interface AutoTrajectorySettings {
95
103
  end?: number;
96
104
  };
97
105
  }
106
+ /**
107
+ * 微信桥配置(CCC 级;S142 用户拍板):
108
+ * - 结构/路由/开关在 .opencode/serenity.json(git 管可重建)
109
+ * - **bot_token 凭据在 CCC localstore**(weixin.accounts.<accountId>.token/.baseUrl/.userId)——
110
+ * 扫码登录后插件自动写入(面板只显示"已绑定"),永不进 git 明文面
111
+ * - 路由 user → role:exact 匹配优先,通配 `*` 兜底;role 必须是该 CCC skiff.roles 之一
112
+ * - 多账号:accounts[] 每项 { accountId, name?, enabled }(本地唯一键,如 wechat-1)
113
+ */
114
+ export interface WeixinSettings {
115
+ /** 总开关(缺省 false——默认关,未开零资源占用) */
116
+ enabled?: boolean;
117
+ /** bot_type(iLink 取码参数;实证 3 可用,留配置项应对未来语义变化) */
118
+ botType?: string;
119
+ /** 账号表(本地键 accountId;凭据在 localstore) */
120
+ accounts?: WeixinAccountConfig[];
121
+ /** 消息路由:微信用户 → 该 CCC 的 skiff role(不绑定具体 role——用户自选) */
122
+ routes?: WeixinRouteConfig[];
123
+ }
124
+ /** 微信桥账号配置(serenity.json 内;凭据部分在 localstore) */
125
+ export interface WeixinAccountConfig {
126
+ /** 本地唯一键(如 wechat-1;localstore 凭据键 weixin.accounts.<accountId>.*) */
127
+ accountId: string;
128
+ /** 展示名(可选;如"家庭招财") */
129
+ name?: string;
130
+ /** 该账号轮询开关(缺省 true) */
131
+ enabled?: boolean;
132
+ }
133
+ /** 微信桥路由配置:微信用户 → CCC 的 skiff role */
134
+ export interface WeixinRouteConfig {
135
+ /** 微信用户标识(from_user_id,形如 userA@im.wechat);`*` = 通配兜底 */
136
+ user: string;
137
+ /** 目标 skiff role 名(必须 ∈ 该 CCC skiff.roles;ACC 不绑定——用户自选) */
138
+ role: string;
139
+ }
98
140
  /**
99
141
  * Skiff 角色配置(CCC 定义:全知全能轨迹的一个子集):
100
142
  * 能力面 = tools(非 MSM 工具白名单)+ msms(MSM 白名单)双白名单,白名单外全隐藏;
package/lib/client.js CHANGED
@@ -4098,8 +4098,456 @@ Instruction-following style:
4098
4098
  });
4099
4099
  }
4100
4100
  //#endregion
4101
+ //#region src/client/WeixinBridgeEditor.tsx
4102
+ /**
4103
+ * WeixinBridgeEditor.tsx — 「微信桥」配置区块(F4c-3,v1.27.0 实验性)
4104
+ *
4105
+ * **CCC 级配置**(S142 用户拍板:dsh 一个进程含多个 CCC,每个 CCC 独立对接微信桥):
4106
+ * - 顶部 **CCC 选择器**(数据源 /serenity/cccs——discoverCccs 复用)——显式选择配置目标,
4107
+ * 不隐式依赖"当前活跃会话"(WebUI 顶层全局,微信桥是配置写入必须显式)
4108
+ * - 选中 CCC 后:总开关 / 账号列表(扫码绑定)/ 路由表(user → role)
4109
+ * - 扫码绑定:POST login-start → qrcode-generator 生成二维码 SVG(复用 v1.24.6 TOTP 同款机制)
4110
+ * → 轮询 /serenity/weixin/login → confirmed 自动写凭据 + 账号元信息
4111
+ *
4112
+ * 全部端点带显式 ccc 参数 + x-serenity-ui 头(服务端校验)。
4113
+ */
4114
+ /** 生成二维码 SVG(内容 = iLink qrcode_img_content URL——用户微信扫它打开 liteapp 确认页) */
4115
+ function qrSvgFor(content) {
4116
+ const qr = qrcode(0, "M");
4117
+ qr.addData(content);
4118
+ qr.make();
4119
+ return qr.createSvgTag({
4120
+ cellSize: 4,
4121
+ margin: 2,
4122
+ scalable: true
4123
+ });
4124
+ }
4125
+ /** 当前工作区 CCC(默认选择器初值:settings 面板无 workspace 参数——服务端 /serenity/weixin 显式 ccc;
4126
+ * 选择器默认选第一个;用户手选) */
4127
+ function WeixinBridgeEditor() {
4128
+ const [cccs, setCccs] = (0, react.useState)([]);
4129
+ const [selectedRoot, setSelectedRoot] = (0, react.useState)("");
4130
+ const [status, setStatus] = (0, react.useState)(null);
4131
+ const [loadError, setLoadError] = (0, react.useState)(null);
4132
+ const [loginPhase, setLoginPhase] = (0, react.useState)("idle");
4133
+ const [loginQrSvg, setLoginQrSvg] = (0, react.useState)("");
4134
+ const [loginKey, setLoginKey] = (0, react.useState)("");
4135
+ const [loginError, setLoginError] = (0, react.useState)(null);
4136
+ const [loginNotice, setLoginNotice] = (0, react.useState)(null);
4137
+ const [routesDraft, setRoutesDraft] = (0, react.useState)("");
4138
+ (0, react.useEffect)(() => {
4139
+ let alive = true;
4140
+ (async () => {
4141
+ try {
4142
+ const res = await fetch("/serenity/cccs", { headers: { accept: "application/json" } });
4143
+ if (!res.ok) return;
4144
+ const body = await res.json();
4145
+ if (!alive || !Array.isArray(body.cccs)) return;
4146
+ setCccs(body.cccs);
4147
+ if (body.cccs.length > 0) setSelectedRoot((prev) => prev || body.cccs[0].root);
4148
+ } catch {}
4149
+ })();
4150
+ return () => {
4151
+ alive = false;
4152
+ };
4153
+ }, []);
4154
+ (0, react.useEffect)(() => {
4155
+ if (!selectedRoot) return;
4156
+ let alive = true;
4157
+ setStatus(null);
4158
+ setLoadError(null);
4159
+ setLoginPhase("idle");
4160
+ (async () => {
4161
+ try {
4162
+ const res = await fetch(`/serenity/weixin?ccc=${encodeURIComponent(selectedRoot)}`, { headers: {
4163
+ accept: "application/json",
4164
+ "x-serenity-ui": "1"
4165
+ } });
4166
+ if (!res.ok) {
4167
+ const body = await res.json().catch(() => null);
4168
+ if (alive) setLoadError(body?.error ?? `HTTP ${res.status}`);
4169
+ return;
4170
+ }
4171
+ const body = await res.json();
4172
+ if (!alive) return;
4173
+ setStatus(body);
4174
+ setRoutesDraft(JSON.stringify(body.routes ?? [], null, 2));
4175
+ } catch {}
4176
+ })();
4177
+ return () => {
4178
+ alive = false;
4179
+ };
4180
+ }, [selectedRoot]);
4181
+ (0, react.useEffect)(() => {
4182
+ if (loginPhase !== "waiting" || !loginKey) return;
4183
+ let alive = true;
4184
+ let timer;
4185
+ const poll = async () => {
4186
+ try {
4187
+ const res = await fetch(`/serenity/weixin/login?key=${encodeURIComponent(loginKey)}`, { headers: {
4188
+ accept: "application/json",
4189
+ "x-serenity-ui": "1"
4190
+ } });
4191
+ if (!alive) return;
4192
+ if (!res.ok) {
4193
+ const body = await res.json().catch(() => null);
4194
+ setLoginPhase("error");
4195
+ setLoginError(body?.error ?? `HTTP ${res.status}`);
4196
+ return;
4197
+ }
4198
+ const body = await res.json();
4199
+ if (body.status === "confirmed") {
4200
+ setLoginPhase("confirmed");
4201
+ setLoginNotice(`账号 ${body.accountId} 已绑定 ✓(token 已写入 CCC localstore)`);
4202
+ if (selectedRoot) {
4203
+ const sbody = await (await fetch(`/serenity/weixin?ccc=${encodeURIComponent(selectedRoot)}`, { headers: {
4204
+ accept: "application/json",
4205
+ "x-serenity-ui": "1"
4206
+ } })).json().catch(() => null);
4207
+ if (alive && sbody) setStatus(sbody);
4208
+ }
4209
+ return;
4210
+ }
4211
+ if (body.status === "expired" || body.status === "error") {
4212
+ setLoginPhase("error");
4213
+ setLoginError(body.error ?? "二维码已过期,请重新获取");
4214
+ return;
4215
+ }
4216
+ timer = setTimeout(() => void poll(), 1e3);
4217
+ } catch {
4218
+ if (alive) timer = setTimeout(() => void poll(), 1e3);
4219
+ }
4220
+ };
4221
+ poll();
4222
+ return () => {
4223
+ alive = false;
4224
+ if (timer) clearTimeout(timer);
4225
+ };
4226
+ }, [
4227
+ loginPhase,
4228
+ loginKey,
4229
+ selectedRoot
4230
+ ]);
4231
+ const startLogin = async () => {
4232
+ if (!selectedRoot || loginPhase === "waiting") return;
4233
+ setLoginPhase("waiting");
4234
+ setLoginError(null);
4235
+ setLoginNotice(null);
4236
+ try {
4237
+ const res = await fetch("/serenity/weixin", {
4238
+ method: "POST",
4239
+ headers: {
4240
+ "content-type": "application/json",
4241
+ "x-serenity-ui": "1"
4242
+ },
4243
+ body: JSON.stringify({
4244
+ action: "login-start",
4245
+ ccc: selectedRoot
4246
+ })
4247
+ });
4248
+ const body = await res.json();
4249
+ if (!res.ok || !body.qrcode_img_content || !body.loginKey) {
4250
+ setLoginPhase("error");
4251
+ setLoginError(body.error ?? `HTTP ${res.status}`);
4252
+ return;
4253
+ }
4254
+ setLoginQrSvg(qrSvgFor(body.qrcode_img_content));
4255
+ setLoginKey(body.loginKey);
4256
+ } catch (err) {
4257
+ setLoginPhase("error");
4258
+ setLoginError(err instanceof Error ? err.message : String(err));
4259
+ }
4260
+ };
4261
+ const removeAccount = async (accountId) => {
4262
+ if (!selectedRoot) return;
4263
+ try {
4264
+ if (!(await fetch("/serenity/weixin", {
4265
+ method: "POST",
4266
+ headers: {
4267
+ "content-type": "application/json",
4268
+ "x-serenity-ui": "1"
4269
+ },
4270
+ body: JSON.stringify({
4271
+ action: "remove-account",
4272
+ ccc: selectedRoot,
4273
+ accountId
4274
+ })
4275
+ })).ok) return;
4276
+ const sbody = await (await fetch(`/serenity/weixin?ccc=${encodeURIComponent(selectedRoot)}`, { headers: {
4277
+ accept: "application/json",
4278
+ "x-serenity-ui": "1"
4279
+ } })).json().catch(() => null);
4280
+ if (sbody) setStatus(sbody);
4281
+ } catch {}
4282
+ };
4283
+ const saveRoutes = async () => {
4284
+ if (!selectedRoot) return;
4285
+ let routes;
4286
+ try {
4287
+ routes = JSON.parse(routesDraft);
4288
+ if (!Array.isArray(routes) || routes.some((r) => typeof r?.user !== "string" || typeof r?.role !== "string")) throw new Error("bad");
4289
+ } catch {
4290
+ setLoadError("路由表 JSON 格式错误(期望 [{user, role}, ...])");
4291
+ return;
4292
+ }
4293
+ try {
4294
+ const res = await fetch("/serenity/weixin", {
4295
+ method: "POST",
4296
+ headers: {
4297
+ "content-type": "application/json",
4298
+ "x-serenity-ui": "1"
4299
+ },
4300
+ body: JSON.stringify({
4301
+ action: "save-routes",
4302
+ ccc: selectedRoot,
4303
+ routes
4304
+ })
4305
+ });
4306
+ const body = await res.json().catch(() => null);
4307
+ if (!res.ok) {
4308
+ setLoadError(body?.error ?? `HTTP ${res.status}`);
4309
+ return;
4310
+ }
4311
+ setLoadError(null);
4312
+ const sbody = await (await fetch(`/serenity/weixin?ccc=${encodeURIComponent(selectedRoot)}`, { headers: {
4313
+ accept: "application/json",
4314
+ "x-serenity-ui": "1"
4315
+ } })).json().catch(() => null);
4316
+ if (sbody) setStatus(sbody);
4317
+ } catch {}
4318
+ };
4319
+ const toggleEnabled = async (on) => {
4320
+ if (!selectedRoot) return;
4321
+ try {
4322
+ const res = await fetch("/serenity/weixin", {
4323
+ method: "POST",
4324
+ headers: {
4325
+ "content-type": "application/json",
4326
+ "x-serenity-ui": "1"
4327
+ },
4328
+ body: JSON.stringify({
4329
+ action: "set-enabled",
4330
+ ccc: selectedRoot,
4331
+ enabled: on
4332
+ })
4333
+ });
4334
+ const body = await res.json().catch(() => null);
4335
+ if (!res.ok) {
4336
+ setLoadError(body?.error ?? `HTTP ${res.status}`);
4337
+ return;
4338
+ }
4339
+ setLoadError(null);
4340
+ const sbody = await (await fetch(`/serenity/weixin?ccc=${encodeURIComponent(selectedRoot)}`, { headers: {
4341
+ accept: "application/json",
4342
+ "x-serenity-ui": "1"
4343
+ } })).json().catch(() => null);
4344
+ if (sbody) setStatus(sbody);
4345
+ } catch {}
4346
+ };
4347
+ const bridgeStateText = (accountId) => {
4348
+ const b = status?.bridge.find((x) => x.accountId === accountId);
4349
+ if (!b) return "未运行";
4350
+ if (b.lastError) return `错误: ${b.lastError}`;
4351
+ if (b.lastPollAt > 0) return `轮询中(${new Date(b.lastPollAt).toLocaleTimeString()})`;
4352
+ return "启动中";
4353
+ };
4354
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
4355
+ className: "ss-rows",
4356
+ children: [
4357
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4358
+ className: "ss-rowCard",
4359
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4360
+ className: "ss-rowText",
4361
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4362
+ className: "ss-rowName",
4363
+ children: "目标 CCC"
4364
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4365
+ className: "ss-rowDesc",
4366
+ children: "选择要配置微信桥的认知容器(显式,非当前活跃会话)"
4367
+ })]
4368
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4369
+ className: "ss-rowControl",
4370
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4371
+ className: "ss-select",
4372
+ value: selectedRoot,
4373
+ onChange: (e) => setSelectedRoot(e.target.value),
4374
+ children: [cccs.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4375
+ value: "",
4376
+ children: "加载中…"
4377
+ }), cccs.map((c) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4378
+ value: c.root,
4379
+ children: c.name
4380
+ }, c.root))]
4381
+ })
4382
+ })]
4383
+ }) }),
4384
+ loadError && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4385
+ className: "ss-rowCard",
4386
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4387
+ className: "ss-rowText",
4388
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4389
+ className: "ss-rowName",
4390
+ children: "提示"
4391
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4392
+ className: "ss-rowDesc",
4393
+ children: loadError
4394
+ })]
4395
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "ss-rowControl" })]
4396
+ }) }),
4397
+ status && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
4398
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4399
+ className: "ss-rowCard",
4400
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4401
+ className: "ss-rowText",
4402
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4403
+ className: "ss-rowName",
4404
+ children: "总开关"
4405
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4406
+ className: "ss-rowDesc",
4407
+ children: "启用后该 CCC 的微信桥开始轮询(需先扫码绑定至少一个账号)"
4408
+ })]
4409
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4410
+ className: "ss-rowControl",
4411
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4412
+ className: "ss-switch",
4413
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4414
+ type: "checkbox",
4415
+ checked: status.enabled,
4416
+ onChange: (e) => void toggleEnabled(e.target.checked)
4417
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "ss-switchTrack" })]
4418
+ })
4419
+ })]
4420
+ }) }),
4421
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4422
+ className: "ss-rowCard",
4423
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4424
+ className: "ss-rowText",
4425
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4426
+ className: "ss-rowName",
4427
+ children: [
4428
+ "账号(",
4429
+ status.accounts.length,
4430
+ ")"
4431
+ ]
4432
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4433
+ className: "ss-rowDesc",
4434
+ children: status.accounts.length === 0 ? "未绑定任何微信账号——点击下方「扫码绑定微信」逐个添加" : "每个账号独立轮询;可继续扫码添加更多"
4435
+ })]
4436
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "ss-rowControl" })]
4437
+ }) }),
4438
+ status.accounts.map((a) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4439
+ className: "ss-rowCard",
4440
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4441
+ className: "ss-rowText",
4442
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4443
+ className: "ss-rowName",
4444
+ children: [a.accountId, a.name ? ` · ${a.name}` : ""]
4445
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4446
+ className: "ss-rowDesc",
4447
+ children: [
4448
+ a.bound ? "已绑定凭据" : "未绑定凭据",
4449
+ "(",
4450
+ bridgeStateText(a.accountId),
4451
+ ")"
4452
+ ]
4453
+ })]
4454
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4455
+ className: "ss-rowControl",
4456
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4457
+ type: "button",
4458
+ className: "ss-removeBtn",
4459
+ onClick: () => void removeAccount(a.accountId),
4460
+ children: "移除"
4461
+ })
4462
+ })]
4463
+ }) }, a.accountId)),
4464
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4465
+ className: "ss-rowCard",
4466
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4467
+ className: "ss-rowText",
4468
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4469
+ className: "ss-rowName",
4470
+ children: "扫码绑定微信"
4471
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4472
+ className: "ss-rowDesc",
4473
+ children: [
4474
+ loginPhase === "idle" && "用手机微信「扫一扫」扫描二维码并确认——每扫一次绑定一个新账号",
4475
+ loginPhase === "waiting" && "二维码已生成(5 分钟内有效)——微信扫一扫 → 手机上确认绑定",
4476
+ loginPhase === "confirmed" && (loginNotice ?? "绑定成功"),
4477
+ loginPhase === "error" && (loginError ?? "绑定失败"),
4478
+ loginPhase === "expired" && "二维码已过期,请重新获取"
4479
+ ]
4480
+ })]
4481
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4482
+ className: "ss-rowControl",
4483
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4484
+ type: "button",
4485
+ className: "ss-loginBtn",
4486
+ disabled: loginPhase === "waiting",
4487
+ onClick: () => void startLogin(),
4488
+ children: loginPhase === "waiting" ? "等待扫码…" : "扫码绑定"
4489
+ })
4490
+ })]
4491
+ }) }),
4492
+ loginPhase === "waiting" && loginQrSvg !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4493
+ className: "ss-rowCard ss-qrRow",
4494
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4495
+ className: "ss-qrSvg",
4496
+ dangerouslySetInnerHTML: { __html: loginQrSvg }
4497
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4498
+ className: "ss-rowText",
4499
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4500
+ className: "ss-rowDesc",
4501
+ children: "1. 打开手机微信 → 扫一扫 2. 扫描此二维码 3. 在手机上确认绑定"
4502
+ })
4503
+ })]
4504
+ }) }),
4505
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4506
+ className: "ss-rowCard",
4507
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4508
+ className: "ss-rowText",
4509
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4510
+ className: "ss-rowName",
4511
+ children: "路由表"
4512
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4513
+ className: "ss-rowDesc",
4514
+ children: "微信用户 → 该 CCC 的 skiff 角色(`*` = 通配兜底;role 必须已定义)"
4515
+ })]
4516
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4517
+ className: "ss-rowControl",
4518
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4519
+ type: "button",
4520
+ className: "ss-loginBtn",
4521
+ onClick: () => void saveRoutes(),
4522
+ children: "保存路由"
4523
+ })
4524
+ })]
4525
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
4526
+ className: "ss-routesEditor",
4527
+ rows: 5,
4528
+ value: routesDraft,
4529
+ onChange: (e) => setRoutesDraft(e.target.value)
4530
+ })] })
4531
+ ] }),
4532
+ !status && !loadError && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4533
+ className: "ss-rowCard",
4534
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4535
+ className: "ss-rowText",
4536
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4537
+ className: "ss-rowName",
4538
+ children: "加载中…"
4539
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4540
+ className: "ss-rowDesc",
4541
+ children: "读取所选 CCC 的微信桥配置"
4542
+ })]
4543
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "ss-rowControl" })]
4544
+ }) })
4545
+ ]
4546
+ });
4547
+ }
4548
+ //#endregion
4101
4549
  //#region \0sp-css:/home/yh/home/home-serenity/AI_LAB/dsh-serenity-plugin/hooks/dsh-serenity-hooks/src/client/SettingsSection
4102
- const css = "/* SettingsSection — dsh 原生设置面板 serenity-hooks 简单配置页\n v1.21.1 看齐 dsh 自身:官方 settings 设计语言——\n section > title + intro + group(groupTitle) + rowCard 行卡;\n 全部 --dsw-alias-* token(与 ui-settings-models 同词汇表)。 */\n\n/* 页面容器(官方 .section:flex column gap 12) */\n.ss-section {\n display: flex;\n flex-direction: column;\n gap: 14px;\n max-width: 720px;\n color: var(--dsw-alias-label-primary);\n}\n\n/* 页面标题(官方 .title:16px/24 500) */\n.ss-title {\n margin: 0;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n/* 页面说明(官方 .intro:14px/22 tertiary) */\n.ss-intro {\n margin: 0;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-tertiary);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* 分组(多级标题:分组标题 + 行卡列表) */\n.ss-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* 分组标题(二级:12px/18 500 secondary——官方 fieldLabel 风格) */\n.ss-groupTitle {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* 行卡列表(官方 .rows:无 marker,gap 8) */\n.ss-rows {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* 行卡(官方 .rowCard:border-l2 r12 padding 12/14) */\n.ss-rowCard {\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n padding: 12px 14px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n/* 行卡文本(标题 + 说明 左列) */\n.ss-rowText {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n flex: 1;\n}\n\n/* 行卡标题(官方 .rowName:14px/22 500) */\n.ss-rowName {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n/* 行卡说明(12px/18 tertiary) */\n.ss-rowDesc {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* 行卡控件(右置) */\n.ss-rowControl {\n flex: none;\n display: flex;\n align-items: center;\n}\n\n/* 开关(官方 token 的自绘 toggle:track 22px,thumb 16px) */\n.ss-switch {\n position: relative;\n flex: none;\n width: 40px;\n height: 22px;\n cursor: pointer;\n}\n\n.ss-switch input {\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n cursor: pointer;\n}\n\n.ss-switchTrack {\n position: absolute;\n inset: 0;\n border-radius: 11px;\n background: var(--dsw-alias-interactive-bg-active, rgba(128, 128, 128, 0.3));\n transition: background var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease);\n}\n\n.ss-switchTrack::after {\n content: '';\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--dsw-alias-label-primary, #eee);\n transition: transform var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease);\n}\n\n.ss-switch input:checked + .ss-switchTrack {\n background: var(--dsw-alias-state-success-primary, #22c55e);\n}\n\n.ss-switch input:checked + .ss-switchTrack::after {\n transform: translateX(18px);\n}\n\n.ss-switch input:disabled + .ss-switchTrack {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 阈值行(滑块 + 值) */\n.ss-threshold {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.ss-threshold input[type='range'] {\n width: 160px;\n}\n\n/* Skiff 调试端口输入(number;关闭时跟随 disabled 半透明) */\n.ss-portInput {\n width: 96px;\n padding: 6px 8px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-fill-l1, rgba(128, 128, 128, 0.08));\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n}\n\n.ss-portInput:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.ss-value {\n min-width: 40px;\n font-variant-numeric: tabular-nums;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n text-align: right;\n}\n\n/* 自主轨迹「立即唤起」按钮(v1.26.14 调试语义;官方 button 语言:primary 弱化) */\n.ss-wakeBtn {\n flex: none;\n padding: 5px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-interactive-bg-active, rgba(128, 128, 128, 0.12));\n color: var(--dsw-alias-label-primary);\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity var(--ds-transition-duration-fast, 0.15s) ease;\n}\n\n.ss-wakeBtn:hover:not(:disabled) {\n border-color: var(--dsw-alias-state-success-primary, #22c55e);\n color: var(--dsw-alias-state-success-primary, #22c55e);\n}\n\n.ss-wakeBtn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 底部帮助行 */\n.ss-hint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* 降级提示 */\n.ss-degrade {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-warn-label);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n";
4550
+ const css = "/* SettingsSection — dsh 原生设置面板 serenity-hooks 简单配置页\n v1.21.1 看齐 dsh 自身:官方 settings 设计语言——\n section > title + intro + group(groupTitle) + rowCard 行卡;\n 全部 --dsw-alias-* token(与 ui-settings-models 同词汇表)。 */\n\n/* 页面容器(官方 .section:flex column gap 12) */\n.ss-section {\n display: flex;\n flex-direction: column;\n gap: 14px;\n max-width: 720px;\n color: var(--dsw-alias-label-primary);\n}\n\n/* 页面标题(官方 .title:16px/24 500) */\n.ss-title {\n margin: 0;\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n/* 页面说明(官方 .intro:14px/22 tertiary) */\n.ss-intro {\n margin: 0;\n font-size: 14px;\n line-height: 22px;\n color: var(--dsw-alias-label-tertiary);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* 分组(多级标题:分组标题 + 行卡列表) */\n.ss-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* 分组标题(二级:12px/18 500 secondary——官方 fieldLabel 风格) */\n.ss-groupTitle {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* 行卡列表(官方 .rows:无 marker,gap 8) */\n.ss-rows {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* 行卡(官方 .rowCard:border-l2 r12 padding 12/14) */\n.ss-rowCard {\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n padding: 12px 14px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n/* 行卡文本(标题 + 说明 左列) */\n.ss-rowText {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n flex: 1;\n}\n\n/* 行卡标题(官方 .rowName:14px/22 500) */\n.ss-rowName {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n/* 行卡说明(12px/18 tertiary) */\n.ss-rowDesc {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* 行卡控件(右置) */\n.ss-rowControl {\n flex: none;\n display: flex;\n align-items: center;\n}\n\n/* 开关(官方 token 的自绘 toggle:track 22px,thumb 16px) */\n.ss-switch {\n position: relative;\n flex: none;\n width: 40px;\n height: 22px;\n cursor: pointer;\n}\n\n.ss-switch input {\n position: absolute;\n opacity: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n cursor: pointer;\n}\n\n.ss-switchTrack {\n position: absolute;\n inset: 0;\n border-radius: 11px;\n background: var(--dsw-alias-interactive-bg-active, rgba(128, 128, 128, 0.3));\n transition: background var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease);\n}\n\n.ss-switchTrack::after {\n content: '';\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--dsw-alias-label-primary, #eee);\n transition: transform var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease);\n}\n\n.ss-switch input:checked + .ss-switchTrack {\n background: var(--dsw-alias-state-success-primary, #22c55e);\n}\n\n.ss-switch input:checked + .ss-switchTrack::after {\n transform: translateX(18px);\n}\n\n.ss-switch input:disabled + .ss-switchTrack {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 阈值行(滑块 + 值) */\n.ss-threshold {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.ss-threshold input[type='range'] {\n width: 160px;\n}\n\n/* Skiff 调试端口输入(number;关闭时跟随 disabled 半透明) */\n.ss-portInput {\n width: 96px;\n padding: 6px 8px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-fill-l1, rgba(128, 128, 128, 0.08));\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n}\n\n.ss-portInput:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.ss-value {\n min-width: 40px;\n font-variant-numeric: tabular-nums;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n text-align: right;\n}\n\n/* 自主轨迹「立即唤起」按钮(v1.26.14 调试语义;官方 button 语言:primary 弱化) */\n.ss-wakeBtn {\n flex: none;\n padding: 5px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-interactive-bg-active, rgba(128, 128, 128, 0.12));\n color: var(--dsw-alias-label-primary);\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity var(--ds-transition-duration-fast, 0.15s) ease;\n}\n\n.ss-wakeBtn:hover:not(:disabled) {\n border-color: var(--dsw-alias-state-success-primary, #22c55e);\n color: var(--dsw-alias-state-success-primary, #22c55e);\n}\n\n.ss-wakeBtn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 底部帮助行 */\n.ss-hint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* 降级提示 */\n.ss-degrade {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-warn-label);\n word-break: break-word;\n overflow-wrap: anywhere;\n}\n\n/* ── 微信桥(F4c-3,v1.27.0 实验性)── */\n\n/* CCC 选择器(下拉) */\n.ss-select {\n max-width: 280px;\n padding: 6px 8px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-fill-l1, rgba(128, 128, 128, 0.08));\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* 扫码绑定按钮(复用 wakeBtn 语言) */\n.ss-loginBtn {\n flex: none;\n padding: 5px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-interactive-bg-active, rgba(128, 128, 128, 0.12));\n color: var(--dsw-alias-label-primary);\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity var(--ds-transition-duration-fast, 0.15s) ease;\n}\n\n.ss-loginBtn:hover:not(:disabled) {\n border-color: var(--dsw-alias-state-success-primary, #22c55e);\n color: var(--dsw-alias-state-success-primary, #22c55e);\n}\n\n.ss-loginBtn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* 移除账号按钮(危险语义:红边框) */\n.ss-removeBtn {\n flex: none;\n padding: 5px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-interactive-bg-active, rgba(128, 128, 128, 0.12));\n color: var(--dsw-alias-label-primary);\n font-size: 12px;\n line-height: 18px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity var(--ds-transition-duration-fast, 0.15s) ease;\n}\n\n.ss-removeBtn:hover:not(:disabled) {\n border-color: var(--dsw-alias-state-error-primary, #ef4444);\n color: var(--dsw-alias-state-error-primary, #ef4444);\n}\n\n/* 二维码展示行 */\n.ss-qrRow {\n align-items: flex-start;\n}\n\n.ss-qrSvg {\n flex: none;\n width: 160px;\n height: 160px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: #fff; /* 二维码需要白底才能被微信扫出 */\n padding: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.ss-qrSvg svg {\n width: 100%;\n height: 100%;\n}\n\n/* 路由表 JSON 编辑框 */\n.ss-routesEditor {\n width: 100%;\n box-sizing: border-box;\n margin-top: 6px;\n padding: 8px 10px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-fill-l1, rgba(128, 128, 128, 0.08));\n color: var(--dsw-alias-label-primary);\n font-size: 12px;\n line-height: 18px;\n font-family: var(--ds-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);\n resize: vertical;\n}\n";
4103
4551
  if (typeof document !== "undefined" && document.querySelector("style[data-sp-css=\"SettingsSection\"]") === null) {
4104
4552
  const tag = document.createElement("style");
4105
4553
  tag.setAttribute("data-sp-css", "SettingsSection");
@@ -4188,7 +4636,6 @@ Instruction-following style:
4188
4636
  const gatewayOn = value?.gatewayEnabled ?? false;
4189
4637
  const rebuildOn = value?.rebuildEnabled ?? true;
4190
4638
  const threshold = value?.rebuildThreshold ?? .9;
4191
- const namingOn = value?.namingEnabled ?? true;
4192
4639
  const skiffOn = value?.skiffEnabled ?? false;
4193
4640
  const skiffPort = value?.skiffDebugPort ?? 3099;
4194
4641
  const acpOn = value?.acpEnabled ?? false;
@@ -4245,17 +4692,6 @@ Instruction-following style:
4245
4692
  })
4246
4693
  }) })]
4247
4694
  }),
4248
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Group, {
4249
- title: "会话",
4250
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
4251
- title: "会话命名",
4252
- desc: "使用宁静号会话时,把当前会话命名为 SESSION 目录名",
4253
- control: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Toggle, {
4254
- checked: namingOn,
4255
- onChange: (on) => toggle("namingEnabled", on)
4256
- })
4257
- }) })
4258
- }),
4259
4695
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Group, {
4260
4696
  title: "Skiff",
4261
4697
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowCard, {
@@ -4346,6 +4782,13 @@ Instruction-following style:
4346
4782
  className: "ss-groupTitle",
4347
4783
  children: "自主轨迹"
4348
4784
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AutoTrajectoryStatusBlock, {})]
4785
+ }),
4786
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4787
+ className: "ss-group",
4788
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
4789
+ className: "ss-groupTitle",
4790
+ children: "微信桥"
4791
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WeixinBridgeEditor, {})]
4349
4792
  })
4350
4793
  ]
4351
4794
  });
@@ -48,10 +48,6 @@ export interface RebuildSettings {
48
48
  /** contextPressure 触发比例(0~1) */
49
49
  thresholdRatio: number;
50
50
  }
51
- /** F3 会话命名配置 */
52
- export interface NamingSettings {
53
- enabled: boolean;
54
- }
55
51
  /** 彩蛋功能:persona 模式(v1.23.1,S142 用户需求)
56
52
  * 配置后替换 ACC 系统提示词中"输出约束/指令遵循约束"部分(EAP 块 + MSM 原则段);
57
53
  * 未配置(mode 空)→ 完全默认行为,零影响。 */
@@ -74,7 +70,6 @@ export interface PublicAskSettings {
74
70
  export interface AdvancedSettings {
75
71
  gateway: GatewaySettings;
76
72
  rebuild: RebuildSettings;
77
- naming: NamingSettings;
78
73
  persona: PersonaSettings;
79
74
  publicAsk: PublicAskSettings;
80
75
  }
@@ -136,7 +131,7 @@ export interface GatewayAccountWire {
136
131
  /** 该账号是否已绑定 TOTP(v1.22.4) */
137
132
  hasTotp: boolean;
138
133
  }
139
- /** 设定 wire 形态(GET /serenity/config 返回;rebuild/naming 同持久化,gateway 去 hash) */
134
+ /** 设定 wire 形态(GET /serenity/config 返回;rebuild 同持久化,gateway 去 hash) */
140
135
  export interface AdvancedSettingsWire {
141
136
  gateway: {
142
137
  enabled: boolean;
@@ -149,7 +144,6 @@ export interface AdvancedSettingsWire {
149
144
  totpEnabled: boolean;
150
145
  };
151
146
  rebuild: RebuildSettings;
152
- naming: NamingSettings;
153
147
  persona: PersonaSettings;
154
148
  publicAsk: {
155
149
  /** 开放容器白名单(v1.26.2:容器名数组;空 = 全部开放) */
package/lib/index.d.ts CHANGED
@@ -49,10 +49,6 @@ export interface Config {
49
49
  enabled?: boolean;
50
50
  thresholdRatio?: number;
51
51
  };
52
- /** F3 会话命名(entry 默认值,运行时经 DSH settings) */
53
- naming?: {
54
- enabled?: boolean;
55
- };
56
52
  /** F4 Skiff(实验性):调试服务启停(entry 默认值,运行时经 DSH settings) */
57
53
  skiff?: {
58
54
  enabled?: boolean;