@lmzhen/dsh-evolution-settings-ui 0.27.2 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -65,9 +65,9 @@ dropped rather than painted under another row's heading.
65
65
 
66
66
  ## The diagnostics card
67
67
 
68
- One card in the same section is the read-only **self-check** (`data-card="diagnostics"`): it renders the Host's one `DiagnosticsView` — the same object the CLI and `/api/dsh-evolution/diagnostics` answer — and owns no key list and no status vocabulary.
68
+ One card in the same section is the read-only **self-check** (`data-card="diagnostics"`): it renders the Host's `DiagnosticsView` runtime window — the same rows the CLI and `/api/dsh-evolution/diagnostics` answer — and owns no key list and no status vocabulary. The view's documentation facts are a CLI/JSON concern and are deliberately not rendered here: a settings page carries the runtime reading, not a spec sheet.
69
69
 
70
- It leads with a plain-language verdict derived from the frozen runtime statuses (`运行正常` / `{n} 项需要注意` / `{n} 项异常` / `{n} 项待确认`, decided fail > warn > unknown > ok), then groups the view as **环境信息** (fact label above value) and **运行状态** (status dot and word, detail line, remedy line). The raw material — view schema, check time and each fact's source home — sits behind one **技术详情** disclosure, so the default reading path carries no identifiers.
70
+ It leads with a plain-language verdict derived from the frozen runtime statuses (`运行正常` / `{n} 项需要注意` / `{n} 项异常` / `{n} 项待确认`, decided fail > warn > unknown > ok), then renders **运行状态** rows (status dot and word, detail line, remedy line).
71
71
 
72
72
  The card is collapsible with the same `.evolution-param-head` button and body inset as the parameter cards; Refresh is an explicit control in the body (one read on mount, one per click), and a failed read renders the shared failure block with the `/evolution doctor` command fallback.
73
73
  ## A seat that arrives late revives the card
package/lib/client.js CHANGED
@@ -28,6 +28,12 @@ window.__ModuleLoader__.load({
28
28
  health: "/api/dsh-evolution/skill-history/health"
29
29
  },
30
30
  "skill-health": { rows: "/api/dsh-evolution/skill-health/rows" },
31
+ merge: {
32
+ view: "/api/dsh-evolution/merge/view",
33
+ rows: "/api/dsh-evolution/merge/rows",
34
+ run: "/api/dsh-evolution/merge/run",
35
+ runs: "/api/dsh-evolution/merge/runs"
36
+ },
31
37
  diagnostics: { view: "/api/dsh-evolution/diagnostics" }
32
38
  };
33
39
  //#endregion
@@ -331,6 +337,48 @@ window.__ModuleLoader__.load({
331
337
  }
332
338
  ]
333
339
  },
340
+ {
341
+ namespace: "evolution-merge",
342
+ seatKey: "evolution-merge",
343
+ fields: [
344
+ {
345
+ id: "mergeApproval",
346
+ group: "merge",
347
+ doc: "Pause after round 1 and put the pair in the pending queue instead of authoring round 2 automatically.",
348
+ label: "合并审批",
349
+ hint: "开启后,第一轮判定完先停下、进入待批准清单;关闭则直接进入第二轮合并。",
350
+ control: "switch",
351
+ unit: "",
352
+ values: [],
353
+ valueLabels: [],
354
+ atLeast: ""
355
+ },
356
+ {
357
+ id: "mergeSkippedTtlDays",
358
+ group: "merge",
359
+ doc: "Days a skipped pair stays out of screening; 0 means it never expires.",
360
+ label: "无需合并保留天数",
361
+ hint: "判定无需合并的对,多少天内不再参与筛选;0 表示一直保留。",
362
+ control: "number",
363
+ unit: "天",
364
+ values: [],
365
+ valueLabels: [],
366
+ atLeast: ""
367
+ },
368
+ {
369
+ id: "mergeRunTimeoutMinutes",
370
+ group: "merge",
371
+ doc: "Wall-clock budget of one merge run; 0 means no limit.",
372
+ label: "单次运行上限",
373
+ hint: "一次合并运行最多持续多少分钟;0 表示不设上限。",
374
+ control: "number",
375
+ unit: "分钟",
376
+ values: [],
377
+ valueLabels: [],
378
+ atLeast: ""
379
+ }
380
+ ]
381
+ },
334
382
  {
335
383
  namespace: "evolution-review",
336
384
  seatKey: "evolution-review",
@@ -642,6 +690,7 @@ window.__ModuleLoader__.load({
642
690
  "evolution-approval",
643
691
  "evolution-commands",
644
692
  "evolution-curator",
693
+ "evolution-merge",
645
694
  "evolution-review",
646
695
  "memory-files",
647
696
  "tool-memory",
@@ -1069,15 +1118,15 @@ window.__ModuleLoader__.load({
1069
1118
  //#endregion
1070
1119
  //#region src/client/DiagnosticsCard.ts
1071
1120
  /**
1072
- * The diagnostics card (W7 S7): the browser face of the SAME DiagnosticsView the CLI and the
1121
+ * The diagnostics card (W7 S7): the settings face of the SAME DiagnosticsView the CLI and the
1073
1122
  * `/api/dsh-evolution/diagnostics` route answer.
1074
1123
  *
1075
1124
  * Read-only by construction: it fetches once on mount and only refetches on an explicit Refresh; a
1076
- * failed read renders the shared FailureBlock with the command-face fallback. The client still owns
1077
- * no key list and no status vocabulary: it renders the host view's own order, groups the two
1078
- * sections the view carries (environment facts / runtime rows) and gives a plain-language summary
1079
- * from the frozen status set. Raw identifiers, source paths and the view schema live behind the
1080
- * one `技术详情` disclosure, not in the main reading path.
1125
+ * failed read renders the shared FailureBlock with the command-face fallback. The client owns no
1126
+ * key list and no status vocabulary: it renders the host view's frozen runtime rows and leads with
1127
+ * a plain-language summary. The view's documentation facts are a CLI/JSON concern and are
1128
+ * deliberately NOT rendered here (0.27.2 real-machine feedback: a settings page is not a spec
1129
+ * sheet; the runtime window is the whole reading).
1081
1130
  * @module @lmzhen/dsh-evolution-settings-ui/client/DiagnosticsCard
1082
1131
  */
1083
1132
  /** Which word one status gets (the frozen W1 status set). */
@@ -1113,15 +1162,6 @@ window.__ModuleLoader__.load({
1113
1162
  count: 0
1114
1163
  };
1115
1164
  }
1116
- /** A locally formatted check time; an unparseable stamp stays visible instead of becoming NaN. */
1117
- function checkedAt(iso) {
1118
- try {
1119
- const at = new Date(iso);
1120
- return Number.isNaN(at.getTime()) ? iso : at.toLocaleString();
1121
- } catch {
1122
- return iso;
1123
- }
1124
- }
1125
1165
  /**
1126
1166
  * Render the card.
1127
1167
  * @param props - the copy seat, the host call and the command fallback.
@@ -1166,21 +1206,12 @@ window.__ModuleLoader__.load({
1166
1206
  className: "evo-diag-badge",
1167
1207
  "data-status": summary.status
1168
1208
  }, t(SUMMARY_KEYS[summary.status], summary.count === 0 ? void 0 : { n: summary.count })), (0, react.createElement)("span", { className: "evolution-param-chevron" }, open ? "▲" : "▼"));
1169
- const facts = (view) => view.facts.length === 0 ? null : (0, react.createElement)("div", {}, (0, react.createElement)("h3", { className: "evolution-param-group" }, t("diagFactsTitle")), (0, react.createElement)("div", { className: "evo-diag-list" }, ...view.facts.map((fact) => (0, react.createElement)("div", {
1170
- key: "fact-" + fact.key,
1171
- className: "evo-diag-item",
1172
- "data-kind": "fact"
1173
- }, (0, react.createElement)("span", { className: "evo-diag-label" }, fact.label), (0, react.createElement)("span", { className: "evo-diag-value" }, fact.value)))));
1174
1209
  const runtime = (view) => view.runtime.length === 0 ? null : (0, react.createElement)("div", {}, (0, react.createElement)("h3", { className: "evolution-param-group" }, t("diagRuntimeTitle")), (0, react.createElement)("div", { className: "evo-diag-list" }, ...view.runtime.map((row) => (0, react.createElement)("div", {
1175
1210
  key: "runtime-" + row.key,
1176
1211
  className: "evo-diag-item",
1177
1212
  "data-kind": "runtime",
1178
1213
  "data-status": row.status
1179
1214
  }, (0, react.createElement)("div", { className: "evo-diag-row-head" }, (0, react.createElement)("span", { className: "evo-diag-dot" }), (0, react.createElement)("span", { className: "evo-diag-label" }, row.label), (0, react.createElement)("span", { className: "evo-diag-status" }, t(STATUS_KEYS[row.status]))), row.detail === void 0 ? null : (0, react.createElement)("span", { className: "evo-diag-detail" }, row.detail), row.remedy === void 0 ? null : (0, react.createElement)("span", { className: "evo-diag-remedy" }, t("diagRemedy") + row.remedy)))));
1180
- const details = (view) => (0, react.createElement)("details", { className: "evo-diag-meta" }, (0, react.createElement)("summary", {}, t("diagDetails")), (0, react.createElement)("div", { className: "evo-diag-meta-body" }, (0, react.createElement)("span", {}, t("diagCheckedAt", { at: checkedAt(view.generatedAt) })), (0, react.createElement)("span", {}, t("diagSchema", { n: view.schemaVersion })), view.facts.length === 0 ? null : (0, react.createElement)("span", { className: "evo-diag-sources-title" }, t("diagSourcesTitle")), ...view.facts.map((fact) => (0, react.createElement)("span", {
1181
- key: "source-" + fact.key,
1182
- className: "evo-diag-source"
1183
- }, (0, react.createElement)("span", { className: "evo-diag-source-label" }, fact.label), (0, react.createElement)("span", { className: "evo-diag-source-home" }, fact.home)))));
1184
1215
  const body = () => {
1185
1216
  if (state.phase === "loading") return (0, react.createElement)("p", { className: "evolution-param-loading" }, t("stateLoading"));
1186
1217
  if (state.phase === "failed") return FailureBlock({
@@ -1194,7 +1225,7 @@ window.__ModuleLoader__.load({
1194
1225
  className: "evolution-param-button",
1195
1226
  onClick: refresh,
1196
1227
  "data-action": "diag-refresh"
1197
- }, t("diagRefresh"))), facts(view), runtime(view), details(view));
1228
+ }, t("diagRefresh"))), runtime(view), view.runtime.length === 0 ? (0, react.createElement)("p", { className: "evolution-param-note" }, t("diagNoRows")) : null);
1198
1229
  };
1199
1230
  return (0, react.createElement)("section", {
1200
1231
  className: "evolution-param-card",
@@ -1229,6 +1260,7 @@ window.__ModuleLoader__.load({
1229
1260
  approval: { command: "/evolution pending … /evolution approve <id> … /evolution reject <id> … /evolution release <id>" },
1230
1261
  "skill-history": { command: "/evolution restore <name> [v](查看:/evolution skills history <name>)" },
1231
1262
  "skill-health": { command: "/evolution skills refresh(健康行:/evolution doctor)" },
1263
+ merge: { command: "/evolution merge status / pending / approve <id> / report" },
1232
1264
  diagnostics: {
1233
1265
  command: "/evolution doctor",
1234
1266
  platformCli: "dsh --json /evolution doctor"
@@ -1283,6 +1315,7 @@ window.__ModuleLoader__.load({
1283
1315
  cardSkills: "技能写入规则",
1284
1316
  cardApproval: "写入审批",
1285
1317
  cardCommands: "维护扫描",
1318
+ cardMerge: "技能自动合并",
1286
1319
  approvalTitle: "待批写入",
1287
1320
  approvalLoading: "正在读取待批项…",
1288
1321
  approvalEmpty: "没有待批的写入",
@@ -1310,8 +1343,7 @@ window.__ModuleLoader__.load({
1310
1343
  approvalDiffRemoved: "{n} 行删除",
1311
1344
  approvalDiffCut: "改动区域已截断",
1312
1345
  diagTitle: "诊断",
1313
- diagSubtitle: "安装、兼容与运行状态的只读自查;不会改动任何东西。",
1314
- diagFactsTitle: "环境信息",
1346
+ diagSubtitle: "运行状态的只读自查;不会改动任何东西。",
1315
1347
  diagRuntimeTitle: "运行状态",
1316
1348
  diagSummaryOk: "运行正常",
1317
1349
  diagSummaryWarn: "{n} 项需要注意",
@@ -1324,10 +1356,7 @@ window.__ModuleLoader__.load({
1324
1356
  diagStatusFail: "异常",
1325
1357
  diagStatusUnknown: "未知",
1326
1358
  diagRemedy: "建议:",
1327
- diagDetails: "技术详情",
1328
- diagCheckedAt: "检查时间:{at}",
1329
- diagSchema: "数据版本 v{n}",
1330
- diagSourcesTitle: "数据来源",
1359
+ diagNoRows: "没有可显示的运行状态",
1331
1360
  stateLoading: "正在读取…",
1332
1361
  failureUnauthorized: "需要登录:重新打开这个页面完成登录后再试。",
1333
1362
  failureForbidden: "平台拒绝了这个请求(身份不是 owner)。",
@@ -1370,6 +1399,7 @@ window.__ModuleLoader__.load({
1370
1399
  cardSkills: "Skill write rules",
1371
1400
  cardApproval: "Write approval",
1372
1401
  cardCommands: "Maintenance scans",
1402
+ cardMerge: "Skill auto-merge",
1373
1403
  approvalTitle: "Writes awaiting approval",
1374
1404
  approvalLoading: "reading the pending window…",
1375
1405
  approvalEmpty: "nothing is waiting for a decision",
@@ -1397,8 +1427,7 @@ window.__ModuleLoader__.load({
1397
1427
  approvalDiffRemoved: "{n} lines removed",
1398
1428
  approvalDiffCut: "the changed region is truncated",
1399
1429
  diagTitle: "Diagnostics",
1400
- diagSubtitle: "A read-only check of the install, compatibility and runtime state; nothing here changes anything.",
1401
- diagFactsTitle: "Environment",
1430
+ diagSubtitle: "A read-only check of the runtime state; nothing here changes anything.",
1402
1431
  diagRuntimeTitle: "Runtime status",
1403
1432
  diagSummaryOk: "All healthy",
1404
1433
  diagSummaryWarn: "{n} need attention",
@@ -1411,10 +1440,7 @@ window.__ModuleLoader__.load({
1411
1440
  diagStatusFail: "failing",
1412
1441
  diagStatusUnknown: "unknown",
1413
1442
  diagRemedy: "Suggested: ",
1414
- diagDetails: "Technical details",
1415
- diagCheckedAt: "Checked: {at}",
1416
- diagSchema: "data version v{n}",
1417
- diagSourcesTitle: "Data sources",
1443
+ diagNoRows: "no runtime status to show",
1418
1444
  stateLoading: "reading…",
1419
1445
  failureUnauthorized: "Sign-in is required: reopen this page and sign in, then retry.",
1420
1446
  failureForbidden: "The platform refused this request (not the owner principal).",
@@ -1434,7 +1460,8 @@ window.__ModuleLoader__.load({
1434
1460
  "evolution-curator": "cardCurator",
1435
1461
  "tool-skill-manage": "cardSkills",
1436
1462
  "evolution-approval": "cardApproval",
1437
- "evolution-commands": "cardCommands"
1463
+ "evolution-commands": "cardCommands",
1464
+ "evolution-merge": "cardMerge"
1438
1465
  });
1439
1466
  /**
1440
1467
  * Resolve one message without the locale seat (tests and the fallback path).
@@ -2091,7 +2118,7 @@ window.__ModuleLoader__.load({
2091
2118
  * @returns the section element.
2092
2119
  */
2093
2120
  function SettingsSection(face) {
2094
- return (0, react.createElement)("div", { className: "evolution-params" }, (0, react.createElement)("h2", { className: "evolution-params-title" }, face.t("title")), (0, react.createElement)("p", { className: "evolution-params-subtitle" }, face.t("subtitle")), (0, react.createElement)("p", { className: "evolution-params-about" }, "0.24.0 · Web settings cards for the evolution family's parameter namespaces"), (0, react.createElement)("div", {
2121
+ return (0, react.createElement)("div", { className: "evolution-params" }, (0, react.createElement)("h2", { className: "evolution-params-title" }, face.t("title")), (0, react.createElement)("p", { className: "evolution-params-subtitle" }, face.t("subtitle")), (0, react.createElement)("p", { className: "evolution-params-about" }, "0.28.0 · Web settings cards for the evolution family's parameter namespaces"), (0, react.createElement)("div", {
2095
2122
  key: PENDING_CARD_KEY,
2096
2123
  className: "evolution-params-group"
2097
2124
  }, face.renderSlot(CARD_SLOT, {}, { entryKey: PENDING_CARD_KEY })), (0, react.createElement)("div", {
@@ -2194,7 +2221,6 @@ window.__ModuleLoader__.load({
2194
2221
  ".evo-diag-item{padding:var(--evo-space-12) 0}",
2195
2222
  ".evo-diag-item+.evo-diag-item{border-top:var(--evo-hairline-width) solid var(--dsw-alias-border-l2)}",
2196
2223
  ".evo-diag-label{display:block;color:var(--dsw-alias-label-tertiary);font-size:var(--evo-type-xs);line-height:var(--evo-leading-base)}",
2197
- ".evo-diag-value{display:block;margin:var(--evo-space-2) 0 0;color:var(--dsw-alias-label-primary);font-size:var(--evo-type-sm);line-height:var(--evo-leading-base);overflow-wrap:anywhere}",
2198
2224
  ".evo-diag-row-head{display:flex;align-items:baseline;gap:var(--evo-space-6);flex-wrap:wrap}",
2199
2225
  ".evo-diag-dot{width:var(--evo-space-6);height:var(--evo-space-6);border-radius:var(--evo-radius-pill);background:var(--evo-diag-tone,var(--dsw-alias-state-idle-primary));flex:none}",
2200
2226
  ".evo-diag-status{color:var(--evo-diag-tone,var(--dsw-alias-state-idle-primary));font-size:var(--evo-type-xs);line-height:var(--evo-leading-base)}",
@@ -2203,14 +2229,7 @@ window.__ModuleLoader__.load({
2203
2229
  ".evo-diag-item[data-status=\"fail\"]{--evo-diag-tone:var(--dsw-alias-state-error-primary)}",
2204
2230
  ".evo-diag-item[data-status=\"unknown\"]{--evo-diag-tone:var(--dsw-alias-state-idle-primary)}",
2205
2231
  ".evo-diag-detail{display:block;margin:var(--evo-space-2) 0 0;color:var(--dsw-alias-label-secondary);font-size:var(--evo-type-xs);line-height:var(--evo-leading-base);overflow-wrap:anywhere}",
2206
- ".evo-diag-remedy{display:block;margin:var(--evo-space-4) 0 0;color:var(--dsw-alias-label-tertiary);font-size:var(--evo-type-xs);line-height:var(--evo-leading-base)}",
2207
- ".evo-diag-meta{margin:var(--evo-space-12) 0 0;padding-top:var(--evo-space-8);border-top:var(--evo-hairline-width) solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);font-size:var(--evo-type-xs);line-height:var(--evo-leading-base)}",
2208
- ".evo-diag-meta>summary{cursor:pointer;user-select:none;padding:var(--evo-space-4) 0}",
2209
- ".evo-diag-meta-body{display:flex;flex-direction:column;gap:var(--evo-space-2);padding:var(--evo-space-4) 0 0}",
2210
- ".evo-diag-sources-title{padding-top:var(--evo-space-6)}",
2211
- ".evo-diag-source{display:flex;justify-content:space-between;gap:var(--evo-space-8);overflow-wrap:anywhere}",
2212
- ".evo-diag-source-label{flex:none}",
2213
- ".evo-diag-source-home{text-align:right;overflow-wrap:anywhere}"
2232
+ ".evo-diag-remedy{display:block;margin:var(--evo-space-4) 0 0;color:var(--dsw-alias-label-tertiary);font-size:var(--evo-type-xs);line-height:var(--evo-leading-base)}"
2214
2233
  ].join("\n");
2215
2234
  /**
2216
2235
  * Inject the stylesheet once per document.
@@ -1,13 +1,13 @@
1
1
  /**
2
- * The diagnostics card (W7 S7): the browser face of the SAME DiagnosticsView the CLI and the
2
+ * The diagnostics card (W7 S7): the settings face of the SAME DiagnosticsView the CLI and the
3
3
  * `/api/dsh-evolution/diagnostics` route answer.
4
4
  *
5
5
  * Read-only by construction: it fetches once on mount and only refetches on an explicit Refresh; a
6
- * failed read renders the shared FailureBlock with the command-face fallback. The client still owns
7
- * no key list and no status vocabulary: it renders the host view's own order, groups the two
8
- * sections the view carries (environment facts / runtime rows) and gives a plain-language summary
9
- * from the frozen status set. Raw identifiers, source paths and the view schema live behind the
10
- * one `技术详情` disclosure, not in the main reading path.
6
+ * failed read renders the shared FailureBlock with the command-face fallback. The client owns no
7
+ * key list and no status vocabulary: it renders the host view's frozen runtime rows and leads with
8
+ * a plain-language summary. The view's documentation facts are a CLI/JSON concern and are
9
+ * deliberately NOT rendered here (0.27.2 real-machine feedback: a settings page is not a spec
10
+ * sheet; the runtime window is the whole reading).
11
11
  * @module @lmzhen/dsh-evolution-settings-ui/client/DiagnosticsCard
12
12
  */
13
13
  import { type ReactNode } from 'react';
@@ -4,5 +4,5 @@ import type { FallbackHint } from './contracts.generated.ts';
4
4
  * COMMAND_FALLBACKS (the ONE home). When the platform's connection carrier is absent (E-325) the
5
5
  * panels render this hint instead of a bare HTTP failure — same use case, command face.
6
6
  */
7
- export declare const FALLBACKS: Readonly<Record<'approval' | 'skill-history' | 'skill-health' | 'diagnostics', FallbackHint>>;
7
+ export declare const FALLBACKS: Readonly<Record<'approval' | 'skill-history' | 'skill-health' | 'merge' | 'diagnostics', FallbackHint>>;
8
8
  //# sourceMappingURL=fallbacks.generated.d.ts.map
@@ -5,7 +5,7 @@
5
5
  * description, so the settings surface can state both without a hand-written copy.
6
6
  */
7
7
  /** The family version this surface belongs to. */
8
- export declare const FAMILY_VERSION = "0.24.0";
8
+ export declare const FAMILY_VERSION = "0.28.0";
9
9
  /** What this surface is for, in one line. */
10
10
  export declare const PACKAGE_PURPOSE = "Web settings cards for the evolution family's parameter namespaces";
11
11
  //# sourceMappingURL=generated-about.d.ts.map
@@ -45,6 +45,7 @@ export declare const zh: {
45
45
  readonly cardSkills: "技能写入规则";
46
46
  readonly cardApproval: "写入审批";
47
47
  readonly cardCommands: "维护扫描";
48
+ readonly cardMerge: "技能自动合并";
48
49
  readonly approvalTitle: "待批写入";
49
50
  readonly approvalLoading: "正在读取待批项…";
50
51
  readonly approvalEmpty: "没有待批的写入";
@@ -72,8 +73,7 @@ export declare const zh: {
72
73
  readonly approvalDiffRemoved: "{n} 行删除";
73
74
  readonly approvalDiffCut: "改动区域已截断";
74
75
  readonly diagTitle: "诊断";
75
- readonly diagSubtitle: "安装、兼容与运行状态的只读自查;不会改动任何东西。";
76
- readonly diagFactsTitle: "环境信息";
76
+ readonly diagSubtitle: "运行状态的只读自查;不会改动任何东西。";
77
77
  readonly diagRuntimeTitle: "运行状态";
78
78
  readonly diagSummaryOk: "运行正常";
79
79
  readonly diagSummaryWarn: "{n} 项需要注意";
@@ -86,10 +86,7 @@ export declare const zh: {
86
86
  readonly diagStatusFail: "异常";
87
87
  readonly diagStatusUnknown: "未知";
88
88
  readonly diagRemedy: "建议:";
89
- readonly diagDetails: "技术详情";
90
- readonly diagCheckedAt: "检查时间:{at}";
91
- readonly diagSchema: "数据版本 v{n}";
92
- readonly diagSourcesTitle: "数据来源";
89
+ readonly diagNoRows: "没有可显示的运行状态";
93
90
  readonly stateLoading: "正在读取…";
94
91
  readonly failureUnauthorized: "需要登录:重新打开这个页面完成登录后再试。";
95
92
  readonly failureForbidden: "平台拒绝了这个请求(身份不是 owner)。";
@@ -1,5 +1,5 @@
1
1
  /** One host data-plane surface the browser half can call. */
2
- export type SurfaceId = 'approval' | 'skill-history' | 'skill-health' | 'diagnostics';
2
+ export type SurfaceId = 'approval' | 'skill-history' | 'skill-health' | 'merge' | 'diagnostics';
3
3
  /**
4
4
  * Every family host path, generated from evolution-core's HOST_ROUTES (the ONE declaration).
5
5
  * A browser half cannot import the host package at runtime (client bundles keep @deepseek-ai/*
@@ -24,6 +24,12 @@ export declare const ROUTES: {
24
24
  readonly 'skill-health': {
25
25
  readonly rows: "/api/dsh-evolution/skill-health/rows";
26
26
  };
27
+ readonly merge: {
28
+ readonly view: "/api/dsh-evolution/merge/view";
29
+ readonly rows: "/api/dsh-evolution/merge/rows";
30
+ readonly run: "/api/dsh-evolution/merge/run";
31
+ readonly runs: "/api/dsh-evolution/merge/runs";
32
+ };
27
33
  readonly diagnostics: {
28
34
  readonly view: "/api/dsh-evolution/diagnostics";
29
35
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmzhen/dsh-evolution-settings-ui",
3
3
  "description": "Web settings cards for the evolution family's parameter namespaces (community build)",
4
- "version": "0.27.2",
4
+ "version": "0.28.0",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },