@lemoncat7/dsh-partner 1.3.9 → 1.4.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.
Files changed (51) hide show
  1. package/README.md +9 -3
  2. package/lib/agent-runtime.d.ts +4 -0
  3. package/lib/agent-runtime.d.ts.map +1 -1
  4. package/lib/agent-runtime.js +78 -12
  5. package/lib/agent-runtime.js.map +1 -1
  6. package/lib/api.d.ts.map +1 -1
  7. package/lib/api.js +15 -2
  8. package/lib/api.js.map +1 -1
  9. package/lib/client-api.d.ts +17 -0
  10. package/lib/client-api.d.ts.map +1 -1
  11. package/lib/client-api.js.map +1 -1
  12. package/lib/client.d.ts.map +1 -1
  13. package/lib/client.js +1541 -722
  14. package/lib/client.js.map +4 -4
  15. package/lib/concern-domain.d.ts +11 -0
  16. package/lib/concern-domain.d.ts.map +1 -1
  17. package/lib/concern-domain.js +30 -0
  18. package/lib/concern-domain.js.map +1 -1
  19. package/lib/concern-store.d.ts +28 -1
  20. package/lib/concern-store.d.ts.map +1 -1
  21. package/lib/concern-store.js +91 -7
  22. package/lib/concern-store.js.map +1 -1
  23. package/lib/concern-tool.d.ts +25 -0
  24. package/lib/concern-tool.d.ts.map +1 -0
  25. package/lib/concern-tool.js +145 -0
  26. package/lib/concern-tool.js.map +1 -0
  27. package/lib/glass-surface.d.ts +20 -0
  28. package/lib/glass-surface.d.ts.map +1 -0
  29. package/lib/glass-surface.js +119 -0
  30. package/lib/glass-surface.js.map +1 -0
  31. package/lib/index.d.ts.map +1 -1
  32. package/lib/index.js +3 -0
  33. package/lib/index.js.map +1 -1
  34. package/lib/memory-domain.d.ts +36 -7
  35. package/lib/memory-domain.d.ts.map +1 -1
  36. package/lib/memory-prompt-context.d.ts +20 -0
  37. package/lib/memory-prompt-context.d.ts.map +1 -0
  38. package/lib/memory-prompt-context.js +138 -0
  39. package/lib/memory-prompt-context.js.map +1 -0
  40. package/lib/memory-reflection.d.ts.map +1 -1
  41. package/lib/memory-reflection.js +30 -22
  42. package/lib/memory-reflection.js.map +1 -1
  43. package/lib/memory-store.d.ts +5 -1
  44. package/lib/memory-store.d.ts.map +1 -1
  45. package/lib/memory-store.js +155 -8
  46. package/lib/memory-store.js.map +1 -1
  47. package/lib/profile-domain.d.ts +7 -0
  48. package/lib/profile-domain.d.ts.map +1 -0
  49. package/lib/profile-domain.js +56 -0
  50. package/lib/profile-domain.js.map +1 -0
  51. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -35,7 +35,7 @@ __export(client_exports, {
35
35
  inject: () => inject
36
36
  });
37
37
  module.exports = __toCommonJS(client_exports);
38
- var import_react3 = require("react");
38
+ var import_react4 = require("react");
39
39
 
40
40
  // src/workspace-ownership.ts
41
41
  var WORKSPACE_ACTIVATE_EVENT = "@lemoncat7/dsh-plugin-ui/workspace-activate";
@@ -1161,23 +1161,107 @@ QRCodeSVG.displayName = "QRCodeSVG";
1161
1161
  // src/client.css
1162
1162
  var client_default = `.dsh-partner-sidebar,
1163
1163
  .dsh-partner-workspace {
1164
- --partner-accent: #547d78;
1165
- --partner-accent-strong: #3f6964;
1166
- --partner-danger: #9a5752;
1167
- --partner-border: color-mix(in srgb, var(--dsw-alias-label-primary) 10%, transparent);
1168
- --partner-surface: var(--xiaohei-plugin-pane-fill, transparent);
1169
- --partner-pane: var(--xiaohei-plugin-pane-fill, var(--partner-surface));
1170
- --partner-raised: var(--xiaohei-plugin-raised-fill, color-mix(in srgb, var(--dsw-alias-bg-layer-2, #fff) 76%, transparent));
1171
- --partner-control: var(--xiaohei-plugin-control-fill, var(--partner-raised));
1172
- --partner-font-family: var(--ds-font-family, -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Microsoft YaHei", sans-serif);
1164
+ color-scheme: light;
1165
+ --partner-canvas: transparent;
1166
+ --partner-surface: rgba(246, 247, 250, .17);
1167
+ --partner-pane: rgba(255, 255, 255, .16);
1168
+ --partner-raised: rgba(255, 255, 255, .38);
1169
+ --partner-control: rgba(255, 255, 255, .27);
1170
+ --partner-card-surface: rgba(255, 255, 255, .16);
1171
+ --partner-card-highlight: rgba(255, 255, 255, .58);
1172
+ --partner-solid-canvas: #e9e9ed;
1173
+ --partner-solid-panel: #f2f3f7;
1174
+ --partner-solid-raised: #f8f8fa;
1175
+ --partner-solid-control: #ffffff;
1176
+ --partner-card-shadow:
1177
+ inset 0 1px 0 var(--partner-card-highlight),
1178
+ inset 0 -1px 0 rgba(60, 60, 67, .08),
1179
+ 0 9px 24px rgba(31, 31, 35, .075),
1180
+ 0 2px 6px rgba(31, 31, 35, .04);
1181
+ --partner-text: #1d1d1f;
1182
+ --partner-text-secondary: #515154;
1183
+ --partner-text-tertiary: #747478;
1184
+ --partner-accent: #6e6e73;
1185
+ --partner-accent-strong: #2c2c2e;
1186
+ --partner-on-accent: #ffffff;
1187
+ --partner-success: #248a3d;
1188
+ --partner-weixin: #248a52;
1189
+ --partner-warning: #c93400;
1190
+ --partner-danger: #d70015;
1191
+ --partner-border: rgba(60, 60, 67, .14);
1192
+ --partner-separator: rgba(60, 60, 67, .11);
1193
+ --partner-hover: rgba(118, 118, 128, .09);
1194
+ --partner-selected: rgba(60, 60, 67, .085);
1195
+ --partner-focus-ring: rgba(60, 60, 67, .46);
1196
+ --partner-glass-clear: rgba(255, 255, 255, .11);
1197
+ --partner-glass-regular: rgba(255, 255, 255, .24);
1198
+ --partner-glass-thick: rgba(255, 255, 255, .42);
1199
+ --partner-glass-highlight: rgba(255, 255, 255, .7);
1200
+ --partner-glass-rim-shadow: rgba(60, 60, 67, .11);
1201
+ --partner-glass-filter: saturate(1.22) contrast(1.03) blur(32px);
1202
+ --partner-frosted-filter: blur(18px) saturate(.84) contrast(1.025);
1203
+ --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .055);
1204
+ --partner-shadow-md: 0 10px 28px rgba(31, 31, 35, .085);
1205
+ --partner-shadow-lg: 0 24px 64px rgba(31, 31, 35, .14);
1206
+ --partner-glass-shadow:
1207
+ inset 0 1px 0 var(--partner-glass-highlight),
1208
+ inset 0 -1px 0 var(--partner-glass-rim-shadow),
1209
+ var(--partner-shadow-sm);
1210
+ --partner-ease-out: cubic-bezier(.22, 1, .36, 1);
1211
+ --partner-font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Microsoft YaHei", sans-serif;
1173
1212
  --partner-font-caption: 12px;
1174
1213
  --partner-font-body: 13px;
1175
1214
  --partner-font-label: 14px;
1176
1215
  --partner-font-title: 18px;
1177
1216
  --partner-font-heading: 22px;
1178
1217
  --partner-font-display: clamp(24px, 2.2vw, 28px);
1179
- color: var(--dsw-alias-label-primary);
1218
+ color: var(--partner-text);
1180
1219
  font-family: var(--partner-font-family);
1220
+ font-size: var(--partner-font-body);
1221
+ line-height: 1.5;
1222
+ }
1223
+
1224
+ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
1225
+ color-scheme: dark;
1226
+ --partner-canvas: transparent;
1227
+ --partner-surface: rgba(8, 10, 12, .19);
1228
+ --partner-pane: rgba(8, 10, 12, .18);
1229
+ --partner-raised: rgba(8, 10, 12, .42);
1230
+ --partner-control: rgba(8, 10, 12, .3);
1231
+ --partner-card-surface: rgba(7, 9, 11, .22);
1232
+ --partner-card-highlight: rgba(255, 255, 255, .11);
1233
+ --partner-solid-canvas: #1c1c1e;
1234
+ --partner-solid-panel: #2c2c2e;
1235
+ --partner-solid-raised: #323235;
1236
+ --partner-solid-control: #3a3a3c;
1237
+ --partner-card-shadow:
1238
+ inset 0 1px 0 var(--partner-card-highlight),
1239
+ inset 0 -1px 0 rgba(0, 0, 0, .28),
1240
+ 0 12px 30px rgba(0, 0, 0, .28),
1241
+ 0 2px 7px rgba(0, 0, 0, .2);
1242
+ --partner-text: #f5f5f7;
1243
+ --partner-text-secondary: #d1d1d6;
1244
+ --partner-text-tertiary: #98989d;
1245
+ --partner-accent: #aeaeb2;
1246
+ --partner-accent-strong: #f5f5f7;
1247
+ --partner-on-accent: #1d1d1f;
1248
+ --partner-success: #30d158;
1249
+ --partner-weixin: #30c96b;
1250
+ --partner-warning: #ff9f0a;
1251
+ --partner-danger: #ff453a;
1252
+ --partner-border: rgba(255, 255, 255, .105);
1253
+ --partner-separator: rgba(255, 255, 255, .08);
1254
+ --partner-hover: rgba(255, 255, 255, .075);
1255
+ --partner-selected: rgba(255, 255, 255, .09);
1256
+ --partner-focus-ring: rgba(255, 255, 255, .52);
1257
+ --partner-glass-clear: rgba(0, 0, 0, .1);
1258
+ --partner-glass-regular: rgba(0, 0, 0, .16);
1259
+ --partner-glass-thick: rgba(0, 0, 0, .26);
1260
+ --partner-glass-highlight: rgba(255, 255, 255, .16);
1261
+ --partner-glass-rim-shadow: rgba(0, 0, 0, .3);
1262
+ --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .28);
1263
+ --partner-shadow-md: 0 12px 32px rgba(0, 0, 0, .34);
1264
+ --partner-shadow-lg: 0 28px 72px rgba(0, 0, 0, .48);
1181
1265
  }
1182
1266
 
1183
1267
  .dsh-partner-sidebar,
@@ -1203,7 +1287,7 @@ var client_default = `.dsh-partner-sidebar,
1203
1287
 
1204
1288
  .dsh-partner-sidebar :where(button, input, textarea, select):focus-visible,
1205
1289
  .dsh-partner-workspace :where(button, input, textarea, select):focus-visible {
1206
- outline: 2px solid color-mix(in srgb, var(--partner-accent) 58%, transparent);
1290
+ outline: 2px solid var(--partner-focus-ring);
1207
1291
  outline-offset: 2px;
1208
1292
  }
1209
1293
 
@@ -1229,57 +1313,88 @@ var client_default = `.dsh-partner-sidebar,
1229
1313
  .dsh-partner-workspace input[type="number"]::-webkit-inner-spin-button,
1230
1314
  .dsh-partner-workspace input[type="number"]::-webkit-outer-spin-button { margin: 0; appearance: none; }
1231
1315
 
1232
- .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail) {
1316
+ .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds) {
1233
1317
  scrollbar-width: thin;
1234
- scrollbar-color: color-mix(in srgb, var(--dsw-alias-label-primary) 20%, transparent) transparent;
1318
+ scrollbar-color: color-mix(in srgb, var(--partner-text) 20%, transparent) transparent;
1235
1319
  }
1236
1320
 
1237
- .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail)::-webkit-scrollbar { width: 6px; height: 6px; }
1238
- .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail)::-webkit-scrollbar-track { background: transparent; }
1239
- .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail)::-webkit-scrollbar-thumb {
1321
+ .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar { width: 6px; height: 6px; }
1322
+ .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-track { background: transparent; }
1323
+ .dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-thumb {
1240
1324
  border: 1px solid transparent;
1241
1325
  border-radius: 999px;
1242
- background: color-mix(in srgb, var(--dsw-alias-label-primary) 20%, transparent);
1326
+ background: color-mix(in srgb, var(--partner-text) 20%, transparent);
1243
1327
  background-clip: padding-box;
1244
1328
  }
1245
1329
 
1246
- .dsh-partner-sidebar { box-sizing: border-box; flex: none; margin: 0 8px 8px 2px; padding: 4px 0 7px; border-bottom: 1px solid color-mix(in srgb, var(--dsw-alias-border-l2) 62%, transparent); }
1330
+ .dsh-partner-sidebar { box-sizing: border-box; flex: none; margin: 0 8px 8px 2px; padding: 4px 0 7px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 62%, transparent); }
1247
1331
  .dsh-partner-sidebar.is-rail { width: 36px; margin: 0 0 8px; padding: 0; border: 0; }
1248
1332
  .dsh-partner-sidebar-heading { display: flex; align-items: center; justify-content: space-between; height: 32px; padding: 0 4px 0 5px; }
1249
- .dsh-partner-sidebar-title { display: flex; min-width: 0; align-items: center; gap: 5px; height: 28px; padding: 0 5px; border: 0; border-radius: 7px; color: var(--dsw-alias-label-secondary); background: transparent; font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }
1333
+ .dsh-partner-sidebar-title { display: flex; min-width: 0; align-items: center; gap: 5px; height: 28px; padding: 0 5px; border: 0; border-radius: 7px; color: var(--partner-text-secondary); background: transparent; font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }
1250
1334
  .dsh-partner-sidebar-title > span { display: grid; place-items: center; transition: transform .16s ease; }
1251
1335
  .dsh-partner-sidebar-title > span[data-open="false"] { transform: rotate(-90deg); }
1252
1336
  .dsh-partner-sidebar-title:hover,
1253
1337
  .dsh-partner-sidebar-open:hover,
1254
- .dsh-partner-rail:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-interactive-bg-hover); }
1255
- .dsh-partner-sidebar-open { display: grid; place-items: center; width: 28px; height: 28px; padding: 0; border: 0; border-radius: 8px; color: var(--dsw-alias-label-secondary); background: transparent; cursor: pointer; }
1256
- .dsh-partner-sidebar-list { display: grid; gap: 2px; padding: 2px 1px 0; }
1257
- .dsh-partner-sidebar-row { display: grid; grid-template-columns: 26px minmax(0, 1fr) 7px; align-items: center; gap: 8px; width: 100%; min-height: 40px; padding: 4px 7px; border: 1px solid transparent; border-radius: 9px; color: inherit; background: transparent; text-align: left; cursor: pointer; }
1258
- .dsh-partner-sidebar-row:hover { background: color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 70%, transparent); }
1259
- .dsh-partner-sidebar-row.is-active { border-color: color-mix(in srgb, var(--partner-accent) 10%, transparent); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }
1338
+ .dsh-partner-rail:hover { color: var(--partner-text); background: var(--partner-hover); }
1339
+ .dsh-partner-sidebar-open { display: grid; place-items: center; width: 28px; height: 28px; padding: 0; border: 0; border-radius: 8px; color: var(--partner-text-secondary); background: transparent; cursor: pointer; }
1340
+ .dsh-partner-sidebar-list { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 220ms var(--partner-ease-out), opacity 150ms ease; }
1341
+ .dsh-partner-sidebar-list.is-open { grid-template-rows: 1fr; opacity: 1; }
1342
+ .dsh-partner-sidebar-list-inner { display: grid; min-height: 0; gap: 2px; overflow: hidden; padding: 2px 1px 0; }
1343
+ .dsh-partner-sidebar-row { position: relative; isolation: isolate; display: grid; grid-template-columns: 26px minmax(0, 1fr) 7px; align-items: center; gap: 8px; width: 100%; min-height: 40px; padding: 4px 7px; overflow: hidden; border: 1px solid transparent; border-radius: 10px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: color 140ms ease, background-color 140ms ease, box-shadow 180ms ease, transform 180ms var(--partner-ease-out); }
1344
+ .dsh-partner-sidebar-row:hover { background: var(--partner-hover); transform: translateX(1px); }
1345
+ .dsh-partner-sidebar-row.is-active { border-color: transparent; background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }
1260
1346
  .dsh-partner-sidebar-row > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }
1261
1347
  .dsh-partner-sidebar-row strong,
1262
1348
  .dsh-partner-sidebar-row small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1263
1349
  .dsh-partner-sidebar-row strong { font-size: var(--partner-font-label); font-weight: 520; }
1264
- .dsh-partner-sidebar-row small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1350
+ .dsh-partner-sidebar-row small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1265
1351
  .dsh-partner-sidebar-row > i,
1266
- .dsh-partner-roster-list button > i { width: 6px; height: 6px; border: 1px solid var(--dsw-alias-label-tertiary); border-radius: 50%; }
1352
+ .dsh-partner-roster-list button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }
1267
1353
  .dsh-partner-sidebar-row > i.is-online,
1268
- .dsh-partner-roster-list button > i.is-online { border-color: #5c9184; background: #5c9184; box-shadow: 0 0 0 2px color-mix(in srgb, #5c9184 12%, transparent); }
1269
- .dsh-partner-sidebar-symbol { display: grid !important; place-items: center; width: 25px; height: 25px; border-radius: 8px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }
1270
- .dsh-partner-sidebar-empty { margin: 5px 9px; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-body); }
1271
- .dsh-partner-rail { display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 10px; color: var(--dsw-alias-label-primary); background: transparent; cursor: pointer; }
1272
- .dsh-partner-rail.is-active { background: var(--dsw-alias-interactive-bg-hover); }
1354
+ .dsh-partner-roster-list button > i.is-online { border-color: var(--partner-success); background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 12%, transparent); }
1355
+ .dsh-partner-sidebar-symbol { display: grid !important; place-items: center; width: 25px; height: 25px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }
1356
+ .dsh-partner-sidebar-empty { margin: 5px 9px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); }
1357
+ .dsh-partner-rail { display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 10px; color: var(--partner-text); background: transparent; cursor: pointer; }
1358
+ .dsh-partner-rail.is-active { background: var(--partner-hover); }
1273
1359
 
1274
- .dsh-partner-avatar { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border: 1px solid color-mix(in srgb, var(--partner-accent) 18%, var(--partner-border)); border-radius: 12px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, var(--partner-raised)); font-size: var(--partner-font-label); font-weight: 650; }
1360
+ .dsh-partner-avatar { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: linear-gradient(145deg, var(--partner-glass-thick), var(--partner-control)); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); font-size: var(--partner-font-label); font-weight: 650; }
1275
1361
  .dsh-partner-avatar.is-small { width: 25px; height: 25px; border-radius: 8px; font-size: var(--partner-font-caption); }
1276
1362
 
1277
- .dsh-partner-workspace { position: relative; display: grid; grid-template-rows: 52px minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: var(--partner-surface); }
1278
- .dsh-partner-topbar { display: flex; align-items: center; justify-content: space-between; padding: 0 16px 0 18px; border-bottom: 1px solid var(--partner-border); background: var(--partner-pane, var(--partner-surface)); }
1363
+ .dsh-partner-workspace { position: relative; isolation: isolate; display: grid; grid-template-rows: 64px minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: var(--partner-canvas); }
1364
+ .dsh-partner-glass-surface { position: relative; isolation: isolate; transition: opacity 180ms ease-out, border-color 180ms ease, box-shadow 220ms var(--partner-ease-out), transform 220ms var(--partner-ease-out); }
1365
+ .dsh-partner-glass-surface.is-svg { -webkit-backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); }
1366
+ .dsh-partner-glass-surface.is-fallback { -webkit-backdrop-filter: var(--partner-glass-filter); backdrop-filter: var(--partner-glass-filter); }
1367
+ .dsh-partner-glass-filter { position: absolute; z-index: -1; inset: 0; width: 100%; height: 100%; opacity: 0; pointer-events: none; }
1368
+ .dsh-partner-glass-surface.is-interactive::after {
1369
+ position: absolute;
1370
+ z-index: 2;
1371
+ inset: 1px;
1372
+ border-radius: inherit;
1373
+ background: linear-gradient(112deg, transparent 20%, color-mix(in srgb, var(--partner-glass-highlight) 86%, transparent) 48%, transparent 76%);
1374
+ -webkit-mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);
1375
+ mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);
1376
+ opacity: 0;
1377
+ pointer-events: none;
1378
+ transition: opacity 180ms ease-out;
1379
+ content: "";
1380
+ }
1381
+ .dsh-partner-glass-surface.is-interactive > :not(.dsh-partner-glass-filter) { position: relative; z-index: 1; }
1382
+ @media (hover: hover) {
1383
+ .dsh-partner-glass-surface.is-interactive:hover {
1384
+ border-color: color-mix(in srgb, var(--partner-border) 70%, var(--partner-text-tertiary));
1385
+ box-shadow:
1386
+ inset 0 1px 0 var(--partner-card-highlight),
1387
+ inset 0 -1px 0 var(--partner-glass-rim-shadow),
1388
+ 0 14px 32px color-mix(in srgb, var(--partner-text) 9%, transparent);
1389
+ transform: translateY(-1px);
1390
+ }
1391
+ .dsh-partner-glass-surface.is-interactive:hover::after { opacity: .72; }
1392
+ }
1393
+ .dsh-partner-topbar { position: relative; z-index: 3; display: flex; align-items: center; justify-content: space-between; min-height: 52px; margin: 8px 10px 0; padding: 7px 14px; border: 1px solid var(--partner-border); border-radius: 14px 14px 11px 11px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 20%, transparent), transparent 58%), var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }
1279
1394
  .dsh-partner-topbar > div { display: flex; align-items: center; gap: 10px; }
1280
1395
  .dsh-partner-topbar > div > span:last-child { display: grid; gap: 2px; }
1281
1396
  .dsh-partner-topbar strong { font-size: var(--partner-font-label); font-weight: 620; }
1282
- .dsh-partner-topbar small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1397
+ .dsh-partner-topbar small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1283
1398
  .dsh-partner-topbar [data-xiaohei-workspace-close] {
1284
1399
  display: grid;
1285
1400
  place-items: center;
@@ -1289,7 +1404,7 @@ var client_default = `.dsh-partner-sidebar,
1289
1404
  padding: 0;
1290
1405
  border: 1px solid transparent;
1291
1406
  border-radius: 9px;
1292
- color: var(--dsw-alias-label-secondary);
1407
+ color: var(--partner-text-secondary);
1293
1408
  background: transparent;
1294
1409
  line-height: 1;
1295
1410
  cursor: pointer;
@@ -1297,14 +1412,14 @@ var client_default = `.dsh-partner-sidebar,
1297
1412
  }
1298
1413
  .dsh-partner-topbar [data-xiaohei-workspace-close]:hover {
1299
1414
  border-color: var(--partner-border);
1300
- color: var(--dsw-alias-label-primary);
1301
- background: var(--dsw-alias-interactive-bg-hover);
1415
+ color: var(--partner-text);
1416
+ background: var(--partner-hover);
1302
1417
  }
1303
1418
  .dsh-partner-topbar [data-xiaohei-workspace-close]:active { transform: scale(.96); }
1304
1419
  .dsh-partner-topbar [data-xiaohei-workspace-close] > svg { display: block; pointer-events: none; }
1305
- .dsh-partner-grid { display: grid; grid-template-columns: 206px minmax(520px, 1fr); min-width: 0; min-height: 0; }
1420
+ .dsh-partner-grid { display: grid; grid-template-columns: 214px minmax(520px, 1fr); min-width: 0; min-height: 0; padding: 8px 10px 10px; gap: 8px; }
1306
1421
 
1307
- .dsh-partner-roster { display: flex; min-width: 0; min-height: 0; flex-direction: column; padding: 20px 10px 14px; border-right: 1px solid var(--partner-border); background: color-mix(in srgb, var(--partner-raised) 94%, var(--partner-surface)); }
1422
+ .dsh-partner-roster { position: relative; display: flex; min-width: 0; min-height: 0; flex-direction: column; padding: 17px 10px 13px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 20%, transparent), transparent 56%), var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }
1308
1423
  .dsh-partner-roster-title { display: flex; align-items: flex-start; justify-content: space-between; padding: 0 5px 13px; }
1309
1424
  .dsh-partner-roster-title > span { display: grid; gap: 5px; }
1310
1425
  .dsh-partner-roster-title small,
@@ -1314,81 +1429,109 @@ var client_default = `.dsh-partner-sidebar,
1314
1429
  .dsh-partner-pairing-heading small,
1315
1430
  .dsh-partner-qr small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }
1316
1431
  .dsh-partner-roster-title strong { font-size: var(--partner-font-label); font-weight: 640; }
1317
- .dsh-partner-roster-title button { display: grid; place-items: center; width: 28px; height: 28px; padding: 0; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--dsw-alias-label-secondary); background: var(--partner-control); cursor: pointer; }
1318
- .dsh-partner-roster-title button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 28%, transparent); }
1319
- .dsh-partner-roster-list { display: grid; gap: 3px; overflow: auto; }
1432
+ .dsh-partner-roster-title button { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, transform 160ms var(--partner-ease-out), box-shadow 180ms ease; }
1433
+ .dsh-partner-roster-title button:hover { color: var(--partner-text); border-color: var(--partner-border); background: var(--partner-glass-thick); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); transform: translateY(-1px); }
1434
+ .dsh-partner-roster-list { display: grid; width: 100%; min-width: 0; gap: 3px; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; }
1320
1435
  .dsh-partner-roster-list button { display: grid; grid-template-columns: 36px minmax(0, 1fr) 7px; align-items: center; gap: 9px; width: 100%; min-height: 58px; padding: 9px 8px; border: 1px solid transparent; border-radius: 12px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: transform .17s cubic-bezier(.2,.8,.2,1), background .15s ease, border-color .15s ease; }
1321
- .dsh-partner-roster-list button:hover { background: var(--dsw-alias-interactive-bg-hover); }
1322
- .dsh-partner-roster-list button.is-active { transform: translateX(2px); border-color: color-mix(in srgb, var(--partner-accent) 13%, transparent); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }
1436
+ .dsh-partner-roster-list button:hover { background: var(--partner-hover); transform: translateX(1px); }
1437
+ .dsh-partner-roster-list button.is-active { transform: translateX(2px); border-color: transparent; background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-text-secondary), inset 0 1px 0 var(--partner-glass-highlight); }
1323
1438
  .dsh-partner-roster-list button > span:nth-child(2) { display: grid; min-width: 0; gap: 3px; }
1324
1439
  .dsh-partner-roster-list strong,
1325
1440
  .dsh-partner-roster-list small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1326
1441
  .dsh-partner-roster-list strong { font-size: var(--partner-font-label); font-weight: 580; }
1327
- .dsh-partner-roster-list small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1328
- .dsh-partner-roster-note { display: flex; align-items: flex-start; gap: 9px; margin-top: auto; padding: 12px 8px 2px; color: var(--dsw-alias-label-tertiary); }
1442
+ .dsh-partner-roster-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1443
+ .dsh-partner-roster-note { display: flex; align-items: flex-start; gap: 9px; margin-top: auto; padding: 12px 8px 2px; color: var(--partner-text-tertiary); }
1329
1444
  .dsh-partner-roster-note > svg { flex: none; margin-top: 1px; color: var(--partner-accent); }
1330
1445
  .dsh-partner-roster-note > span { display: grid; gap: 4px; }
1331
- .dsh-partner-roster-note strong { color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); font-weight: 580; }
1446
+ .dsh-partner-roster-note strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 580; }
1332
1447
  .dsh-partner-roster-note small { font-size: var(--partner-font-caption); line-height: 1.5; }
1333
1448
 
1334
- .dsh-partner-stage { position: relative; display: grid; grid-template-rows: auto auto minmax(0, 1fr); min-width: 0; min-height: 0; background: radial-gradient(circle at 92% 3%, color-mix(in srgb, var(--partner-accent) 4%, transparent), transparent 30%), var(--partner-surface); }
1449
+ .dsh-partner-stage { position: relative; display: grid; grid-template-rows: auto auto minmax(0, 1fr); min-width: 0; min-height: 0; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 16%, transparent), transparent 52%), var(--partner-surface); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 72%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow), var(--partner-shadow-sm); }
1335
1450
  .dsh-partner-identity { display: flex; align-items: center; gap: 12px; min-height: 86px; padding: 18px clamp(20px, 4vw, 46px) 13px; }
1336
1451
  .dsh-partner-identity > span:nth-child(2) { display: grid; min-width: 0; flex: 1; gap: 3px; }
1337
1452
  .dsh-partner-identity h1 { margin: 0; font-size: var(--partner-font-heading); line-height: 1.15; font-weight: 650; letter-spacing: -.025em; }
1338
- .dsh-partner-identity p { margin: 0; overflow: hidden; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }
1339
- .dsh-partner-status { display: inline-flex; align-items: center; flex: none; gap: 6px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--dsw-alias-label-secondary); background: color-mix(in srgb, var(--partner-raised) 76%, transparent); font-size: var(--partner-font-caption); }
1340
- .dsh-partner-status > i { width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-label-tertiary); }
1341
- .dsh-partner-status.is-running > i { background: #5c9184; box-shadow: 0 0 0 2px color-mix(in srgb, #5c9184 13%, transparent); }
1342
- .dsh-partner-status.is-starting > i { background: #9a8158; }
1453
+ .dsh-partner-identity p { margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }
1454
+ .dsh-partner-status { display: inline-flex; align-items: center; flex: none; gap: 6px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-raised) 76%, transparent); font-size: var(--partner-font-caption); }
1455
+ .dsh-partner-status > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }
1456
+ .dsh-partner-status.is-running > i { background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 13%, transparent); }
1457
+ .dsh-partner-status.is-starting > i { background: var(--partner-warning); }
1343
1458
  .dsh-partner-status.is-error > i { background: var(--partner-danger); }
1344
1459
  .dsh-partner-tabs { display: flex; align-items: center; gap: 3px; margin: 0 clamp(20px, 4vw, 46px); border-bottom: 1px solid var(--partner-border); }
1345
- .dsh-partner-tabs button { position: relative; display: inline-flex; align-items: center; gap: 6px; min-height: 37px; padding: 0 10px; border: 0; color: var(--dsw-alias-label-tertiary); background: transparent; font-size: var(--partner-font-body); cursor: pointer; }
1346
- .dsh-partner-tabs button::after { content: ""; position: absolute; right: 9px; bottom: -1px; left: 9px; height: 2px; border-radius: 99px; background: var(--partner-accent); opacity: 0; transform: scaleX(.5); transition: opacity .15s ease, transform .18s cubic-bezier(.2,.8,.2,1); }
1347
- .dsh-partner-tabs button:hover { color: var(--dsw-alias-label-primary); }
1460
+ .dsh-partner-tabs button { position: relative; display: inline-flex; align-items: center; gap: 6px; min-height: 37px; padding: 0 10px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-body); cursor: pointer; }
1461
+ .dsh-partner-tabs button::after { content: ""; position: absolute; right: 9px; bottom: -1px; left: 9px; height: 2px; border-radius: 99px; background: var(--partner-text); opacity: 0; transform: scaleX(.45); transition: opacity 150ms ease, transform 210ms var(--partner-ease-out); }
1462
+ .dsh-partner-tabs button:hover { color: var(--partner-text); }
1348
1463
  .dsh-partner-tabs button.is-active { color: var(--partner-accent-strong); }
1349
1464
  .dsh-partner-tabs button.is-active::after { opacity: 1; transform: scaleX(1); }
1350
- .dsh-partner-stage-scroll { min-width: 0; min-height: 0; overflow: auto; padding: 26px clamp(22px, 4vw, 52px) 52px; }
1465
+ .dsh-partner-stage-scroll { min-width: 0; min-height: 0; overflow: auto; padding: 26px clamp(22px, 4vw, 52px) 52px; overscroll-behavior: contain; }
1466
+ .dsh-partner-stage-scroll > * { animation: dsh-partner-content-enter 260ms var(--partner-ease-out) both; }
1351
1467
 
1352
1468
  .dsh-partner-home { width: min(100%, 1160px); margin: 0 auto; }
1353
1469
  .dsh-partner-home-heading { display: flex; align-items: end; justify-content: space-between; gap: 28px; margin: 0 2px 22px; }
1354
1470
  .dsh-partner-home-heading > span { display: grid; gap: 6px; }
1355
1471
  .dsh-partner-home-heading small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .08em; }
1356
1472
  .dsh-partner-home-heading h2 { margin: 0; font-size: var(--partner-font-display); line-height: 1.18; font-weight: 660; letter-spacing: -.035em; }
1357
- .dsh-partner-home-heading p { max-width: 320px; margin: 0 0 2px; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-align: right; }
1358
- .dsh-partner-home-channel { position: relative; display: grid; grid-template-columns: minmax(230px, .8fr) minmax(330px, 1.2fr); align-items: center; min-height: 238px; overflow: hidden; border: 1px solid color-mix(in srgb, var(--partner-accent) 13%, var(--partner-border)); border-radius: 20px; background: linear-gradient(110deg, color-mix(in srgb, var(--partner-accent) 7%, var(--partner-raised)) 0%, var(--partner-raised) 53%, color-mix(in srgb, var(--partner-raised) 96%, transparent) 100%); box-shadow: 0 18px 50px color-mix(in srgb, var(--partner-accent-strong) 5%, transparent); }
1359
- .dsh-partner-home-channel::after { content: ""; position: absolute; right: -84px; bottom: -118px; width: 260px; height: 260px; border: 1px solid color-mix(in srgb, var(--partner-accent) 8%, transparent); border-radius: 50%; box-shadow: 0 0 0 34px color-mix(in srgb, var(--partner-accent) 2.5%, transparent), 0 0 0 78px color-mix(in srgb, var(--partner-accent) 1.5%, transparent); pointer-events: none; }
1360
- .dsh-partner-home-route { position: relative; display: flex; align-items: center; justify-content: center; min-height: 100%; padding: 28px; background: radial-gradient(circle at 42% 50%, color-mix(in srgb, var(--partner-accent) 9%, transparent), transparent 56%); }
1473
+ .dsh-partner-home-heading p { max-width: 320px; margin: 0 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-align: right; }
1474
+ .dsh-partner-home-channel { display: grid; grid-template-columns: minmax(230px, .8fr) minmax(330px, 1.2fr); align-items: center; min-height: 238px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 20px; background: linear-gradient(118deg, color-mix(in srgb, var(--partner-glass-highlight) 18%, transparent), transparent 56%), var(--partner-pane); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); transition: transform 240ms var(--partner-ease-out), box-shadow 240ms ease, border-color 180ms ease; }
1475
+ .dsh-partner-home-channel:hover { transform: translateY(-1px); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-lg); }
1476
+ .dsh-partner-home-route { position: relative; display: flex; align-items: center; justify-content: center; min-height: 100%; padding: 28px; background: radial-gradient(circle at 42% 50%, color-mix(in srgb, var(--partner-glass-highlight) 44%, transparent), transparent 58%); }
1361
1477
  .dsh-partner-home-route > .dsh-partner-avatar { position: relative; z-index: 1; width: 58px; height: 58px; border-radius: 18px; background: var(--partner-raised); box-shadow: 0 9px 28px color-mix(in srgb, var(--partner-accent-strong) 10%, transparent); font-size: var(--partner-font-title); }
1362
1478
  .dsh-partner-route-line { position: relative; width: clamp(58px, 7vw, 94px); height: 1px; margin: 0 10px; overflow: hidden; background: repeating-linear-gradient(90deg, color-mix(in srgb, var(--partner-accent) 25%, transparent) 0 4px, transparent 4px 9px); }
1363
1479
  .dsh-partner-route-line > i { position: absolute; left: 0; top: -2px; width: 5px; height: 5px; border-radius: 50%; background: var(--partner-accent); opacity: 0; transform: translateX(0); }
1364
1480
  .dsh-partner-home-channel.is-online .dsh-partner-route-line > i { animation: dsh-partner-route-pulse 2.4s ease-in-out infinite; }
1365
- .dsh-partner-route-weixin { position: relative; z-index: 1; display: grid; place-items: center; width: 58px; height: 58px; border: 1px solid color-mix(in srgb, #538b72 20%, var(--partner-border)); border-radius: 18px; color: #4f836b; background: var(--partner-raised); box-shadow: 0 9px 28px color-mix(in srgb, #46735f 9%, transparent); }
1481
+ .dsh-partner-route-weixin { position: relative; z-index: 1; display: grid; place-items: center; width: 58px; height: 58px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 18px; color: var(--partner-weixin); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); }
1366
1482
  .dsh-partner-home-channel-copy { position: relative; z-index: 1; display: grid; justify-items: start; gap: 8px; padding: 32px 36px 32px 12px; }
1367
1483
  .dsh-partner-home-kicker { display: inline-flex; align-items: center; gap: 7px; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .06em; }
1368
- .dsh-partner-home-kicker > i { width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-label-tertiary); }
1369
- .dsh-partner-home-channel.is-online .dsh-partner-home-kicker > i { background: #5c9184; box-shadow: 0 0 0 3px color-mix(in srgb, #5c9184 11%, transparent); }
1484
+ .dsh-partner-home-kicker > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }
1485
+ .dsh-partner-home-channel.is-online .dsh-partner-home-kicker > i { background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 11%, transparent); }
1370
1486
  .dsh-partner-home-channel-copy h3 { margin: 1px 0 0; font-size: var(--partner-font-title); line-height: 1.28; font-weight: 650; letter-spacing: -.025em; }
1371
- .dsh-partner-home-channel-copy p { max-width: 510px; margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.65; }
1487
+ .dsh-partner-home-channel-copy p { max-width: 510px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }
1372
1488
  .dsh-partner-home-channel-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; margin-top: 7px; }
1373
- .dsh-partner-home-channel-actions button { min-height: 36px; padding: 0 15px; border: 1px solid var(--partner-accent-strong); border-radius: 10px; color: #fff; background: var(--partner-accent-strong); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: transform .16s ease, background .16s ease; }
1489
+ .dsh-partner-home-channel-actions button { min-height: 36px; padding: 0 16px; border: 1px solid color-mix(in srgb, var(--partner-accent-strong) 78%, var(--partner-glass-highlight)); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 45%, transparent), var(--partner-shadow-sm); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: transform 160ms var(--partner-ease-out), background-color 160ms ease, box-shadow 180ms ease; }
1374
1490
  .dsh-partner-home-channel-actions button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); transform: translateY(-1px); }
1375
1491
  .dsh-partner-home-channel-actions button:active { transform: translateY(0) scale(.98); }
1376
- .dsh-partner-home-channel-actions span { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1377
- .dsh-partner-home-details { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(260px, .82fr); gap: 0 28px; margin-top: 20px; }
1378
- .dsh-partner-home-details > section { min-width: 0; padding: 20px 2px; border-bottom: 1px solid var(--partner-border); }
1379
- .dsh-partner-home-profile { grid-row: span 2; padding-right: 28px !important; border-right: 1px solid var(--partner-border); }
1492
+ .dsh-partner-home-channel-actions span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1493
+ .dsh-partner-home-details { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(260px, .82fr); gap: 12px; margin-top: 18px; }
1494
+ .dsh-partner-home-details > section {
1495
+ position: relative;
1496
+ min-width: 0;
1497
+ padding: 19px 18px 21px;
1498
+ overflow: hidden;
1499
+ border: 1px solid var(--partner-border);
1500
+ border-radius: 15px;
1501
+ background:
1502
+ linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-thick) 88%, transparent), var(--partner-glass-clear)),
1503
+ var(--partner-glass-regular);
1504
+ box-shadow:
1505
+ inset 0 1px 0 var(--partner-glass-highlight),
1506
+ inset 0 -1px 0 var(--partner-glass-rim-shadow),
1507
+ 0 8px 22px rgba(31, 31, 35, .075),
1508
+ 0 2px 5px rgba(31, 31, 35, .045);
1509
+ transition: transform 220ms var(--partner-ease-out), border-color 180ms ease, box-shadow 220ms ease;
1510
+ }
1511
+ .dsh-partner-home-details > section::after {
1512
+ position: absolute;
1513
+ top: 0;
1514
+ right: 16px;
1515
+ left: 16px;
1516
+ height: 1px;
1517
+ background: linear-gradient(90deg, transparent, var(--partner-glass-highlight), transparent);
1518
+ opacity: .72;
1519
+ pointer-events: none;
1520
+ content: "";
1521
+ }
1522
+ .dsh-partner-home-profile { grid-row: span 2; }
1380
1523
  .dsh-partner-home-details header { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; align-items: center; gap: 10px; }
1381
1524
  .dsh-partner-home-details header > span { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }
1382
1525
  .dsh-partner-home-details header > div { display: grid; min-width: 0; gap: 3px; }
1383
- .dsh-partner-home-details header small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1526
+ .dsh-partner-home-details header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1384
1527
  .dsh-partner-home-details header strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }
1385
- .dsh-partner-home-details header button { padding: 5px 7px; border: 0; border-radius: 7px; color: var(--dsw-alias-label-tertiary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1528
+ .dsh-partner-home-details header button { padding: 5px 7px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1386
1529
  .dsh-partner-home-details header button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 6%, transparent); }
1387
- .dsh-partner-home-profile blockquote { display: -webkit-box; margin: 17px 2px 0 44px; overflow: hidden; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 5; }
1530
+ .dsh-partner-home-profile blockquote { display: -webkit-box; margin: 17px 2px 0 44px; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 5; }
1388
1531
  .dsh-partner-home-capability-list { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0 0 44px; }
1389
1532
  .dsh-partner-home-capability-list em { padding: 5px 8px; border-radius: 7px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); font-size: var(--partner-font-caption); font-style: normal; }
1390
1533
  .dsh-partner-home-capability-list small,
1391
- .dsh-partner-home-continuity > p { margin: 13px 0 0 44px; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }
1534
+ .dsh-partner-home-continuity > p { margin: 13px 0 0 44px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }
1392
1535
  @keyframes dsh-partner-route-pulse { 0% { opacity: 0; transform: translateX(0); } 18% { opacity: .8; } 82% { opacity: .8; } 100% { opacity: 0; transform: translateX(clamp(58px, 7vw, 94px)); } }
1393
1536
 
1394
1537
  .dsh-partner-form { width: min(100%, 1120px); margin: 0 auto; }
@@ -1396,28 +1539,29 @@ var client_default = `.dsh-partner-sidebar,
1396
1539
  .dsh-partner-form.is-capabilities,
1397
1540
  .dsh-partner-form.is-channel,
1398
1541
  .dsh-partner-form.is-memory { width: min(100%, 1180px); }
1542
+ .dsh-partner-form.is-memory { container: partner-memory / inline-size; }
1399
1543
  .dsh-partner-section { position: relative; margin-bottom: 27px; padding-left: 14px; }
1400
- .dsh-partner-section::before { position: absolute; top: 3px; bottom: 2px; left: 0; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-accent), transparent); content: ''; }
1544
+ .dsh-partner-section::before { position: absolute; top: 3px; bottom: 2px; left: 0; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }
1401
1545
  .dsh-partner-section h2 { margin: 5px 0 7px; font-size: var(--partner-font-display); font-weight: 650; letter-spacing: -.035em; }
1402
- .dsh-partner-section p { max-width: 640px; margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.65; }
1546
+ .dsh-partner-section p { max-width: 640px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }
1403
1547
  .dsh-partner-fields { display: grid; gap: 14px; }
1404
1548
  .dsh-partner-fields.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1405
- .dsh-partner-field { display: grid; gap: 8px; margin-bottom: 16px; }
1549
+ .dsh-partner-field { display: grid; min-width: 0; gap: 8px; margin-bottom: 16px; }
1406
1550
  .dsh-partner-field > span { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
1407
1551
  .dsh-partner-field strong { font-size: var(--partner-font-body); font-weight: 610; }
1408
- .dsh-partner-field small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); line-height: 1.35; text-align: right; }
1552
+ .dsh-partner-field small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.35; text-align: right; }
1409
1553
  .dsh-partner-field input,
1410
1554
  .dsh-partner-field textarea,
1411
- .dsh-partner-field select { box-sizing: border-box; width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; outline: none; color: var(--dsw-alias-label-primary); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }
1555
+ .dsh-partner-field select { box-sizing: border-box; width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; outline: none; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }
1412
1556
  .dsh-partner-field textarea { resize: vertical; }
1413
1557
  .dsh-partner-field input:focus,
1414
1558
  .dsh-partner-field textarea:focus,
1415
- .dsh-partner-field select:focus { border-color: color-mix(in srgb, var(--partner-accent) 54%, transparent); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 8%, transparent); }
1559
+ .dsh-partner-field select:focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }
1416
1560
  .dsh-partner-form-actions { display: flex; align-items: center; justify-content: space-between; min-height: 40px; padding-top: 5px; }
1417
1561
  .dsh-partner-form-actions > span { display: inline-flex; align-items: center; gap: 5px; color: var(--partner-accent-strong); font-size: var(--partner-font-body); }
1418
1562
  .dsh-partner-form-actions > button,
1419
1563
  .dsh-partner-state > button,
1420
- .dsh-partner-weixin-connect > button { min-height: 34px; padding: 0 15px; border: 1px solid color-mix(in srgb, var(--partner-accent) 60%, transparent); border-radius: 10px; color: #fff; background: var(--partner-accent-strong); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }
1564
+ .dsh-partner-weixin-connect > button { min-height: 34px; padding: 0 15px; border: 1px solid color-mix(in srgb, var(--partner-accent) 60%, transparent); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }
1421
1565
  .dsh-partner-form-actions > button:hover,
1422
1566
  .dsh-partner-state > button:hover,
1423
1567
  .dsh-partner-weixin-connect > button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }
@@ -1426,7 +1570,7 @@ var client_default = `.dsh-partner-sidebar,
1426
1570
  .dsh-partner-identity-danger { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 34px; padding-top: 17px; border-top: 1px solid var(--partner-border); }
1427
1571
  .dsh-partner-identity-danger > span { display: grid; gap: 4px; }
1428
1572
  .dsh-partner-identity-danger strong { font-size: var(--partner-font-body); font-weight: 600; }
1429
- .dsh-partner-identity-danger small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1573
+ .dsh-partner-identity-danger small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1430
1574
  .dsh-partner-identity-danger button { display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 0 10px; border: 1px solid color-mix(in srgb, var(--partner-danger) 24%, transparent); border-radius: 8px; color: var(--partner-danger); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1431
1575
  .dsh-partner-identity-danger button:disabled { opacity: .4; cursor: default; }
1432
1576
  .dsh-partner-inline-error,
@@ -1435,20 +1579,19 @@ var client_default = `.dsh-partner-sidebar,
1435
1579
 
1436
1580
  .dsh-partner-capabilities { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 9px; margin: 3px 0 22px; }
1437
1581
  .dsh-partner-capabilities button { position: relative; display: grid; grid-template-columns: 22px minmax(0, 1fr); gap: 3px 9px; min-height: 78px; padding: 13px; border: 1px solid var(--partner-border); border-radius: 12px; color: inherit; background: color-mix(in srgb, var(--partner-raised) 70%, transparent); text-align: left; cursor: pointer; }
1438
- .dsh-partner-capabilities button:hover { border-color: color-mix(in srgb, var(--partner-accent) 24%, transparent); background: var(--partner-raised); }
1439
1582
  .dsh-partner-capabilities button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 30%, transparent); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-raised)); }
1440
- .dsh-partner-capabilities button > span { display: grid; place-items: center; grid-row: 1 / span 2; width: 19px; height: 19px; margin-top: 1px; border: 1px solid var(--partner-border); border-radius: 6px; color: #fff; }
1583
+ .dsh-partner-capabilities button > span { display: grid; place-items: center; grid-row: 1 / span 2; width: 19px; height: 19px; margin-top: 1px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-on-accent); }
1441
1584
  .dsh-partner-capabilities button.is-active > span { border-color: var(--partner-accent); background: var(--partner-accent); }
1442
1585
  .dsh-partner-capabilities strong { font-size: var(--partner-font-body); font-weight: 610; }
1443
- .dsh-partner-capabilities small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }
1586
+ .dsh-partner-capabilities small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }
1444
1587
 
1445
1588
  .dsh-partner-weixin-connect { display: grid; grid-template-columns: 54px minmax(0, 1fr) auto; align-items: center; gap: 17px; padding: 19px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }
1446
1589
  .dsh-partner-weixin-connect > span { display: grid; gap: 4px; }
1447
1590
  .dsh-partner-weixin-connect strong { font-size: var(--partner-font-label); }
1448
- .dsh-partner-weixin-connect p { margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.55; }
1449
- .dsh-partner-weixin-connect ul { display: flex; flex-wrap: wrap; gap: 6px 15px; margin: 7px 0 0; padding: 0; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); list-style: none; }
1591
+ .dsh-partner-weixin-connect p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; }
1592
+ .dsh-partner-weixin-connect ul { display: flex; flex-wrap: wrap; gap: 6px 15px; margin: 7px 0 0; padding: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; }
1450
1593
  .dsh-partner-weixin-connect li::before { content: "\xB7"; margin-right: 4px; color: var(--partner-accent); }
1451
- .dsh-partner-weixin-mark { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid color-mix(in srgb, #5a9176 18%, var(--partner-border)); border-radius: 16px; color: #568b72; background: color-mix(in srgb, #5a9176 7%, var(--partner-raised)); }
1594
+ .dsh-partner-weixin-mark { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-weixin); background: color-mix(in srgb, var(--partner-weixin) 7%, var(--partner-raised)); }
1452
1595
  .dsh-partner-weixin-glyph { position: relative; display: inline-block; width: 16px; height: 14px; }
1453
1596
  .dsh-partner-weixin-glyph::before,
1454
1597
  .dsh-partner-weixin-glyph::after { content: ""; position: absolute; border: 1.5px solid currentColor; border-radius: 48%; }
@@ -1463,76 +1606,76 @@ var client_default = `.dsh-partner-sidebar,
1463
1606
  .dsh-partner-qr-code { display: grid; place-items: center; width: 196px; height: 196px; border-radius: 14px; background: #fff; box-shadow: 0 9px 28px color-mix(in srgb, #000 7%, transparent); }
1464
1607
  .dsh-partner-qr > span { display: grid; justify-items: start; gap: 7px; }
1465
1608
  .dsh-partner-qr strong { font-size: var(--partner-font-title); }
1466
- .dsh-partner-qr p { max-width: 300px; margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.6; }
1609
+ .dsh-partner-qr p { max-width: 300px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }
1467
1610
  .dsh-partner-qr button { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: inherit; background: var(--partner-raised); cursor: pointer; }
1468
1611
  .dsh-partner-channel-card { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto auto; align-items: center; gap: 14px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }
1469
1612
  .dsh-partner-channel-card > span:nth-child(2) { display: grid; gap: 3px; }
1470
1613
  .dsh-partner-channel-card strong { font-size: var(--partner-font-label); }
1471
- .dsh-partner-channel-card p { margin: 0; color: var(--dsw-alias-label-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; }
1472
- .dsh-partner-switch { position: relative; width: 38px; height: 22px; padding: 0; border: 1px solid var(--partner-border); border-radius: 999px; background: color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent); cursor: pointer; transition: background .16s ease; }
1614
+ .dsh-partner-channel-card p { margin: 0; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; }
1615
+ .dsh-partner-switch { position: relative; width: 38px; height: 22px; padding: 0; border: 1px solid var(--partner-border); border-radius: 999px; background: color-mix(in srgb, var(--partner-text) 9%, transparent); cursor: pointer; transition: background .16s ease; }
1473
1616
  .dsh-partner-switch i { position: absolute; left: 3px; top: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s cubic-bezier(.2,.8,.2,1); }
1474
- .dsh-partner-switch[data-on="true"] { background: var(--partner-accent); }
1617
+ .dsh-partner-switch[data-on="true"] { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }
1475
1618
  .dsh-partner-switch[data-on="true"] i { transform: translateX(16px); }
1476
1619
  .dsh-partner-pairing-heading { display: flex; align-items: end; justify-content: space-between; margin: 25px 1px 10px; }
1477
1620
  .dsh-partner-pairing-heading > span { display: grid; gap: 4px; }
1478
1621
  .dsh-partner-pairing-heading strong { font-size: var(--partner-font-label); }
1479
- .dsh-partner-pairing-heading em { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); font-style: normal; }
1622
+ .dsh-partner-pairing-heading em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }
1480
1623
  .dsh-partner-pairings { display: grid; gap: 5px; }
1481
1624
  .dsh-partner-pairings article { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto auto; align-items: center; gap: 9px; min-height: 52px; padding: 8px 9px; border-bottom: 1px solid var(--partner-border); }
1482
- .dsh-partner-pairings article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--dsw-alias-label-tertiary); background: var(--dsw-alias-interactive-bg-hover); }
1625
+ .dsh-partner-pairings article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-text-tertiary); background: var(--partner-hover); }
1483
1626
  .dsh-partner-pairings article > span.is-approved { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); }
1484
1627
  .dsh-partner-pairings article > div { display: grid; gap: 3px; }
1485
1628
  .dsh-partner-pairings strong { font-size: var(--partner-font-body); }
1486
- .dsh-partner-pairings small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1487
- .dsh-partner-pairings button { min-height: 29px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--dsw-alias-label-secondary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1488
- .dsh-partner-pairings button.is-primary { color: #fff; border-color: var(--partner-accent); background: var(--partner-accent-strong); }
1629
+ .dsh-partner-pairings small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1630
+ .dsh-partner-pairings button { min-height: 29px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1631
+ .dsh-partner-pairings button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }
1489
1632
 
1490
1633
  .dsh-partner-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
1491
1634
  .dsh-partner-metrics article { padding: 14px; border: 1px solid var(--partner-border); border-radius: 12px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }
1492
- .dsh-partner-metrics small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1635
+ .dsh-partner-metrics small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1493
1636
  .dsh-partner-metrics strong { display: block; margin: 8px 0 4px; font-size: var(--partner-font-title); font-weight: 640; }
1494
- .dsh-partner-metrics p { margin: 0; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1637
+ .dsh-partner-metrics p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1495
1638
  .dsh-partner-session-list { display: grid; gap: 4px; margin-top: 20px; }
1496
1639
  .dsh-partner-session-list article { display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 7px 5px; border-bottom: 1px solid var(--partner-border); }
1497
1640
  .dsh-partner-session-list article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }
1498
1641
  .dsh-partner-session-list article > div { display: grid; min-width: 0; flex: 1; gap: 3px; }
1499
1642
  .dsh-partner-session-list strong { font-size: var(--partner-font-body); }
1500
- .dsh-partner-session-list small { overflow: hidden; color: var(--dsw-alias-label-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }
1501
- .dsh-partner-session-list button { flex: none; min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--dsw-alias-label-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1643
+ .dsh-partner-session-list small { overflow: hidden; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }
1644
+ .dsh-partner-session-list button { flex: none; min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1502
1645
  .dsh-partner-session-list button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 24%, var(--partner-border)); }
1503
- .dsh-partner-automation { display: grid; gap: 14px; margin-top: 16px; padding: 16px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }
1504
- .dsh-partner-automation-grid { display: grid; grid-template-columns: minmax(480px, .95fr) minmax(430px, 1.05fr); align-items: stretch; gap: 12px; margin-top: 17px; }
1646
+ .dsh-partner-automation { display: grid; min-width: 0; max-width: 100%; gap: 14px; margin-top: 16px; padding: 16px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }
1647
+ .dsh-partner-automation-grid { display: grid; min-width: 0; grid-template-columns: minmax(480px, .95fr) minmax(430px, 1.05fr); align-items: stretch; gap: 12px; margin-top: 17px; }
1505
1648
  .dsh-partner-automation-grid .dsh-partner-automation { align-content: start; margin-top: 0; }
1506
1649
  .dsh-partner-automation-grid .dsh-partner-automation:last-child .dsh-partner-automation-actions { margin-top: auto; }
1507
1650
  .dsh-partner-review-policy { display: grid; grid-template-columns: auto minmax(0, 1fr) 90px auto; align-items: center; gap: 10px; padding-top: 12px; border-top: 1px solid var(--partner-border); }
1508
1651
  .dsh-partner-review-policy > span { display: grid; gap: 2px; }
1509
1652
  .dsh-partner-review-policy > span strong { font-size: var(--partner-font-body); }
1510
- .dsh-partner-review-policy > span small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }
1653
+ .dsh-partner-review-policy > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }
1511
1654
  .dsh-partner-review-policy select { width: 100%; height: 32px; padding: 0 26px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; background-color: var(--partner-control); font-size: var(--partner-font-caption); }
1512
- .dsh-partner-review-policy > button:last-child { height: 32px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--dsw-alias-label-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }
1655
+ .dsh-partner-review-policy > button:last-child { height: 32px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }
1513
1656
  .dsh-partner-automation > header { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
1514
1657
  .dsh-partner-automation > header > span { display: grid; gap: 4px; }
1515
1658
  .dsh-partner-automation > header strong { font-size: var(--partner-font-body); }
1516
- .dsh-partner-automation > header small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }
1517
- .dsh-partner-automation-fields { display: grid; grid-template-columns: minmax(120px, 180px); gap: 10px; }
1659
+ .dsh-partner-automation > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }
1660
+ .dsh-partner-automation-fields { display: grid; min-width: 0; grid-template-columns: minmax(120px, 180px); gap: 10px; }
1518
1661
  .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(110px, .7fr) minmax(130px, 1fr) minmax(150px, 1.25fr); }
1519
1662
  .dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(4, minmax(100px, 1fr)); }
1520
- .dsh-partner-concern-board { position: relative; display: grid; min-width: 0; overflow: visible; border: 1px solid var(--partner-border); border-radius: 11px; background: color-mix(in srgb, var(--partner-raised) 42%, transparent); }
1663
+ .dsh-partner-concern-board { position: relative; display: grid; min-width: 0; max-width: 100%; overflow: visible; border: 1px solid var(--partner-border); border-radius: 11px; background: color-mix(in srgb, var(--partner-raised) 42%, transparent); }
1521
1664
  .dsh-partner-concern-board > header { display: flex; min-height: 46px; align-items: center; justify-content: space-between; gap: 14px; padding: 7px 10px 7px 12px; }
1522
1665
  .dsh-partner-concern-board > header > span { display: flex; min-width: 0; align-items: baseline; gap: 8px; }
1523
1666
  .dsh-partner-concern-board > header strong { display: flex; align-items: center; gap: 6px; font-size: var(--partner-font-body); font-weight: 640; white-space: nowrap; }
1524
1667
  .dsh-partner-concern-board > header strong b { display: grid; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; place-items: center; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }
1525
- .dsh-partner-concern-board > header p { min-width: 0; margin: 0; overflow: hidden; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }
1526
- .dsh-partner-concern-board > header > button { display: inline-flex; flex: none; height: 30px; align-items: center; gap: 5px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--dsw-alias-label-secondary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1668
+ .dsh-partner-concern-board > header p { min-width: 0; margin: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }
1669
+ .dsh-partner-concern-board > header > button { display: inline-flex; flex: none; height: 30px; align-items: center; gap: 5px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1527
1670
  .dsh-partner-concern-board > header > button:hover,
1528
1671
  .dsh-partner-concern-board > header > button[aria-expanded="true"] { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }
1529
1672
  .dsh-partner-concern-compose { display: grid; gap: 8px; padding: 10px 12px 11px; border-top: 1px solid var(--partner-border); background: color-mix(in srgb, var(--partner-control) 60%, transparent); animation: dsh-partner-reveal .16s ease-out; }
1530
1673
  .dsh-partner-concern-compose label { display: grid; gap: 6px; }
1531
- .dsh-partner-concern-compose label > span { color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-caption); font-weight: 600; }
1532
- .dsh-partner-concern-compose input { width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--dsw-alias-label-primary); background: var(--partner-raised); font: var(--partner-font-body)/1 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease; }
1674
+ .dsh-partner-concern-compose label > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 600; }
1675
+ .dsh-partner-concern-compose input { width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease; }
1533
1676
  .dsh-partner-concern-compose input:focus-visible { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }
1534
1677
  .dsh-partner-concern-input-wrap { position: relative; min-width: 0; }
1535
- .dsh-partner-concern-compose-hint { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); font-weight: 400; line-height: 1.45; }
1678
+ .dsh-partner-concern-compose-hint { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; line-height: 1.45; }
1536
1679
  .dsh-partner-concern-compose-hint b { color: var(--partner-accent-strong); font-weight: 700; }
1537
1680
  .dsh-partner-concern-sources {
1538
1681
  position: absolute;
@@ -1544,13 +1687,13 @@ var client_default = `.dsh-partner-sidebar,
1544
1687
  max-height: 264px;
1545
1688
  overflow-y: auto;
1546
1689
  padding: 5px;
1547
- border: 1px solid color-mix(in srgb, var(--partner-border) 88%, var(--dsw-alias-label-primary) 12%);
1690
+ border: 1px solid color-mix(in srgb, var(--partner-border) 88%, var(--partner-text) 12%);
1548
1691
  border-radius: 10px;
1549
- background: var(--dsw-alias-bg-layer-2, #fff);
1550
- box-shadow: 0 14px 34px color-mix(in srgb, var(--dsw-alias-label-primary) 15%, transparent);
1692
+ background: var(--partner-raised);
1693
+ box-shadow: 0 14px 34px color-mix(in srgb, var(--partner-text) 15%, transparent);
1551
1694
  scrollbar-width: thin;
1552
1695
  }
1553
- .dsh-partner-concern-sources > p { margin: 0; padding: 14px 12px; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-caption); line-height: 1.45; }
1696
+ .dsh-partner-concern-sources > p { margin: 0; padding: 14px 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.45; }
1554
1697
  .dsh-partner-concern-sources > button {
1555
1698
  display: grid;
1556
1699
  min-height: 46px;
@@ -1561,60 +1704,60 @@ var client_default = `.dsh-partner-sidebar,
1561
1704
  padding: 6px 8px;
1562
1705
  border: 1px solid transparent;
1563
1706
  border-radius: 8px;
1564
- color: var(--dsw-alias-label-primary);
1707
+ color: var(--partner-text);
1565
1708
  background: transparent;
1566
1709
  text-align: left;
1567
1710
  cursor: pointer;
1568
1711
  }
1569
1712
  .dsh-partner-concern-sources > button > span { display: grid; grid-row: 1 / 3; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, var(--partner-control)); }
1570
1713
  .dsh-partner-concern-sources > button > strong { min-width: 0; overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }
1571
- .dsh-partner-concern-sources > button > small { min-width: 0; overflow: hidden; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }
1714
+ .dsh-partner-concern-sources > button > small { min-width: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }
1572
1715
  .dsh-partner-concern-sources > button:hover,
1573
- .dsh-partner-concern-sources > button[aria-selected="true"] { border-color: color-mix(in srgb, var(--partner-accent) 22%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 8%, var(--dsw-alias-bg-layer-2, #fff)); }
1716
+ .dsh-partner-concern-sources > button[aria-selected="true"] { border-color: color-mix(in srgb, var(--partner-accent) 22%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 8%, var(--partner-raised)); }
1574
1717
  .dsh-partner-concern-compose > div { display: flex; justify-content: flex-end; gap: 6px; }
1575
- .dsh-partner-concern-compose button { min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--dsw-alias-label-secondary); background: var(--partner-raised); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1576
- .dsh-partner-concern-compose button.is-primary { border-color: transparent; color: var(--dsw-alias-label-on-accent, #fff); background: var(--partner-accent-strong); }
1718
+ .dsh-partner-concern-compose button { min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-raised); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1719
+ .dsh-partner-concern-compose button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }
1577
1720
  .dsh-partner-concern-list { display: grid; min-height: 0; border-top: 1px solid var(--partner-border); }
1578
1721
  .dsh-partner-concern-list > article { min-width: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); background: transparent; transition: background .15s ease; }
1579
1722
  .dsh-partner-concern-list > article:last-child { border-bottom: 0; }
1580
1723
  .dsh-partner-concern-list > article:hover,
1581
1724
  .dsh-partner-concern-list > article[data-expanded="true"] { background: color-mix(in srgb, var(--partner-accent) 4.5%, transparent); }
1582
1725
  .dsh-partner-concern-row { display: grid; width: 100%; min-height: 49px; grid-template-columns: 76px minmax(0, 1fr) auto 14px; align-items: center; gap: 9px; padding: 6px 11px 6px 12px; border: 0; color: inherit; background: transparent; text-align: left; cursor: pointer; }
1583
- .dsh-partner-concern-state { display: flex; align-items: center; gap: 7px; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); white-space: nowrap; }
1726
+ .dsh-partner-concern-state { display: flex; align-items: center; gap: 7px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); white-space: nowrap; }
1584
1727
  .dsh-partner-concern-state i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }
1585
1728
  .dsh-partner-concern-copy { display: grid; min-width: 0; gap: 3px; }
1586
1729
  .dsh-partner-concern-copy strong,
1587
1730
  .dsh-partner-concern-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1588
1731
  .dsh-partner-concern-copy strong { font-size: var(--partner-font-body); font-weight: 610; }
1589
- .dsh-partner-concern-copy small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1590
- .dsh-partner-concern-time { display: grid; justify-items: end; gap: 2px; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; line-height: 1.1; white-space: nowrap; }
1732
+ .dsh-partner-concern-copy small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1733
+ .dsh-partner-concern-time { display: grid; justify-items: end; gap: 2px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; line-height: 1.1; white-space: nowrap; }
1591
1734
  .dsh-partner-concern-time small { font: inherit; }
1592
- .dsh-partner-concern-time strong { color: var(--dsw-alias-label-secondary); font: 590 var(--partner-font-caption)/1.1 var(--partner-font-family); }
1593
- .dsh-partner-concern-row > svg { color: var(--dsw-alias-label-tertiary); transition: transform .16s ease, color .16s ease; }
1735
+ .dsh-partner-concern-time strong { color: var(--partner-text-secondary); font: 590 var(--partner-font-caption)/1.1 var(--partner-font-family); }
1736
+ .dsh-partner-concern-row > svg { color: var(--partner-text-tertiary); transition: transform .16s ease, color .16s ease; }
1594
1737
  .dsh-partner-concern-list > article[data-expanded="true"] .dsh-partner-concern-row > svg { color: var(--partner-accent); transform: rotate(180deg); }
1595
1738
  .dsh-partner-concern-detail { display: grid; gap: 7px; padding: 0 34px 11px 97px; animation: dsh-partner-reveal .16s ease-out; }
1596
1739
  .dsh-partner-concern-detail p,
1597
- .dsh-partner-concern-detail blockquote { margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }
1740
+ .dsh-partner-concern-detail blockquote { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }
1598
1741
  .dsh-partner-concern-detail blockquote { padding-left: 9px; border-left: 2px solid color-mix(in srgb, var(--partner-accent) 40%, transparent); }
1599
- .dsh-partner-concern-detail > small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1742
+ .dsh-partner-concern-detail > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1600
1743
  .dsh-partner-concern-decision { display: grid; min-width: 0; grid-template-columns: auto minmax(0, 1fr); align-items: baseline; gap: 3px 8px; padding: 7px 9px; border: 1px solid var(--partner-border); border-radius: 8px; background: var(--partner-control); font-size: var(--partner-font-caption); }
1601
1744
  .dsh-partner-concern-decision strong { color: var(--partner-accent-strong); font-weight: 620; white-space: nowrap; }
1602
- .dsh-partner-concern-decision span { min-width: 0; color: var(--dsw-alias-label-secondary); line-height: 1.45; }
1603
- .dsh-partner-concern-decision small { grid-column: 1 / -1; color: var(--dsw-alias-label-tertiary); line-height: 1.45; overflow-wrap: anywhere; }
1745
+ .dsh-partner-concern-decision span { min-width: 0; color: var(--partner-text-secondary); line-height: 1.45; }
1746
+ .dsh-partner-concern-decision small { grid-column: 1 / -1; color: var(--partner-text-tertiary); line-height: 1.45; overflow-wrap: anywhere; }
1604
1747
  .dsh-partner-concern-resources { display: flex; flex-wrap: wrap; gap: 5px; }
1605
1748
  .dsh-partner-concern-resources span { max-width: 100%; overflow: hidden; padding: 4px 7px; border-radius: 6px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }
1606
1749
  .dsh-partner-concern-actions { display: flex; flex-wrap: wrap; gap: 5px; padding-top: 2px; }
1607
1750
  .dsh-partner-concern-actions button,
1608
- .dsh-partner-concern-resolved button { min-height: 28px; padding: 0 8px; border: 1px solid var(--partner-border); border-radius: 7px; color: var(--dsw-alias-label-secondary); background: var(--partner-control); font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1751
+ .dsh-partner-concern-resolved button { min-height: 28px; padding: 0 8px; border: 1px solid var(--partner-border); border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-control); font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1609
1752
  .dsh-partner-concern-actions button:hover,
1610
1753
  .dsh-partner-concern-resolved button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 32%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-control)); }
1611
1754
  .dsh-partner-concern-actions button.is-danger:hover { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 35%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }
1612
1755
  .dsh-partner-concern-more { display: flex; justify-content: center; padding: 5px; border-top: 1px solid var(--partner-border); }
1613
- .dsh-partner-concern-more button { min-height: 26px; padding: 0 9px; border: 0; border-radius: 7px; color: var(--dsw-alias-label-tertiary); background: transparent; font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1756
+ .dsh-partner-concern-more button { min-height: 26px; padding: 0 9px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1614
1757
  .dsh-partner-concern-more button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }
1615
- .dsh-partner-concern-empty { margin: 0; padding: 13px 12px; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }
1758
+ .dsh-partner-concern-empty { margin: 0; padding: 13px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }
1616
1759
  .dsh-partner-concern-resolved { border-top: 1px solid var(--partner-border); }
1617
- .dsh-partner-concern-resolved summary { min-height: 34px; padding: 9px 12px; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); cursor: pointer; list-style: none; }
1760
+ .dsh-partner-concern-resolved summary { min-height: 34px; padding: 9px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); cursor: pointer; list-style: none; }
1618
1761
  .dsh-partner-concern-resolved summary::-webkit-details-marker { display: none; }
1619
1762
  .dsh-partner-concern-resolved summary::before { display: inline-block; margin-right: 7px; content: '\\203A'; transition: transform .15s ease; }
1620
1763
  .dsh-partner-concern-resolved[open] summary::before { transform: rotate(90deg); }
@@ -1625,112 +1768,443 @@ var client_default = `.dsh-partner-sidebar,
1625
1768
  .dsh-partner-concern-resolved article strong { overflow: hidden; font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }
1626
1769
  @keyframes dsh-partner-reveal { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: translateY(0); } }
1627
1770
  .dsh-partner-automation-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 12px; border-top: 1px solid var(--partner-border); }
1628
- .dsh-partner-automation-actions button, .dsh-partner-section-heading button { min-height: 32px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--dsw-alias-label-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1771
+ .dsh-partner-automation-actions button, .dsh-partner-section-heading button { min-height: 32px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1629
1772
  .dsh-partner-automation-actions button.is-primary { color: var(--partner-raised); border-color: transparent; background: var(--partner-accent-strong); }
1630
1773
  .dsh-partner-automation-actions button:disabled, .dsh-partner-section-heading button:disabled { opacity: .45; cursor: default; }
1631
1774
  .dsh-partner-inline-notice { display: flex; align-items: center; gap: 6px; margin: 12px 0 0; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }
1632
1775
  .dsh-partner-section-heading { display: flex; align-items: end; justify-content: space-between; gap: 12px; margin-top: 24px; padding-bottom: 8px; border-bottom: 1px solid var(--partner-border); }
1633
1776
  .dsh-partner-section-heading span { display: grid; gap: 3px; }
1634
- .dsh-partner-section-heading small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); letter-spacing: .12em; }
1777
+ .dsh-partner-section-heading small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); letter-spacing: .12em; }
1635
1778
  .dsh-partner-section-heading strong { font-size: var(--partner-font-body); }
1636
1779
  .dsh-partner-memory-library { margin-top: 28px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 17px; background: color-mix(in srgb, var(--partner-raised) 58%, transparent); box-shadow: 0 22px 64px color-mix(in srgb, var(--partner-accent-strong) 5%, transparent), inset 0 1px color-mix(in srgb, white 6%, transparent); }
1637
1780
  .dsh-partner-library-header { display: flex; align-items: end; justify-content: space-between; gap: 24px; padding: 19px 20px 0; border-bottom: 1px solid var(--partner-border); }
1638
1781
  .dsh-partner-library-header > span { display: grid; gap: 4px; padding-bottom: 15px; }
1639
1782
  .dsh-partner-library-header > span small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }
1640
1783
  .dsh-partner-library-header > span strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.02em; }
1641
- .dsh-partner-library-header > span p { margin: 0; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1784
+ .dsh-partner-library-header > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1642
1785
  .dsh-partner-library-header nav { display: flex; align-self: stretch; gap: 4px; }
1643
- .dsh-partner-library-header nav button { position: relative; padding: 0 8px; border: 0; color: var(--dsw-alias-label-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1786
+ .dsh-partner-library-header nav button { position: relative; padding: 0 8px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1644
1787
  .dsh-partner-library-header nav button::after { position: absolute; right: 7px; bottom: -1px; left: 7px; height: 2px; border-radius: 2px; background: var(--partner-accent); opacity: 0; content: ''; }
1645
- .dsh-partner-library-header nav button.is-active { color: var(--dsw-alias-label-primary); }
1788
+ .dsh-partner-library-header nav button.is-active { color: var(--partner-text); }
1646
1789
  .dsh-partner-library-header nav button.is-active::after { opacity: 1; }
1647
1790
  .dsh-partner-library-header nav b { margin-left: 4px; color: var(--partner-accent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }
1648
1791
  .dsh-partner-library-tools { display: flex; align-items: center; gap: 12px; min-height: 53px; padding: 9px 12px; border-bottom: 1px solid var(--partner-border); }
1649
1792
  .dsh-partner-library-tools > label { flex: 0 1 230px; }
1650
- .dsh-partner-library-tools input { width: 100%; height: 34px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--dsw-alias-label-primary); background: var(--partner-control); font-size: var(--partner-font-caption); }
1651
- .dsh-partner-library-tools input::placeholder { color: var(--dsw-alias-label-tertiary); }
1793
+ .dsh-partner-library-tools input { width: 100%; height: 34px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background: var(--partner-control); font-size: var(--partner-font-caption); }
1794
+ .dsh-partner-library-tools input::placeholder { color: var(--partner-text-tertiary); }
1652
1795
  .dsh-partner-memory-kinds { display: flex; min-width: 0; gap: 3px; overflow-x: auto; }
1653
- .dsh-partner-memory-kinds button { flex: none; height: 28px; padding: 0 8px; border: 0; border-radius: 7px; color: var(--dsw-alias-label-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1654
- .dsh-partner-memory-kinds button:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-interactive-bg-hover); }
1796
+ .dsh-partner-memory-kinds button { flex: none; height: 28px; padding: 0 8px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1797
+ .dsh-partner-memory-kinds button:hover { color: var(--partner-text); background: var(--partner-hover); }
1655
1798
  .dsh-partner-memory-kinds button.is-active { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 10%, transparent); }
1656
1799
  .dsh-partner-library-browser { display: grid; grid-template-columns: minmax(270px, 31%) minmax(0, 1fr); height: clamp(430px, 58vh, 640px); min-height: 0; overflow: hidden; }
1657
- .dsh-partner-library-list { min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }
1800
+ .dsh-partner-library-list { min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }
1658
1801
  .dsh-partner-library-list > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; }
1659
1802
  .dsh-partner-library-list > button:hover { background: color-mix(in srgb, var(--partner-accent) 4%, transparent); }
1660
1803
  .dsh-partner-library-list > button.is-active { background: color-mix(in srgb, var(--partner-accent) 8%, transparent); box-shadow: inset 2px 0 var(--partner-accent); }
1661
1804
  .dsh-partner-library-list > button > span { width: max-content; color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }
1662
1805
  .dsh-partner-library-list > button > strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }
1663
- .dsh-partner-library-list > button > p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
1664
- .dsh-partner-library-list > button > small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1806
+ .dsh-partner-library-list > button > p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
1807
+ .dsh-partner-library-list > button > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1665
1808
  .dsh-partner-library-list.is-diary time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1.2 var(--partner-font-family); font-variant-numeric: tabular-nums; }
1666
- .dsh-partner-library-detail { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; padding: 24px clamp(20px, 3vw, 34px) 40px; background: radial-gradient(circle at 92% 4%, color-mix(in srgb, var(--partner-accent) 6%, transparent), transparent 34%); scrollbar-gutter: stable; }
1809
+ .dsh-partner-library-detail { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 24px clamp(20px, 3vw, 34px) 40px; background: radial-gradient(circle at 92% 4%, color-mix(in srgb, var(--partner-accent) 6%, transparent), transparent 34%); scrollbar-gutter: stable; }
1667
1810
  .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) { display: grid; align-content: start; gap: 13px; }
1668
1811
  .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header,
1669
1812
  .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
1670
1813
  .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header span { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .08em; }
1671
1814
  .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header > div { display: flex; gap: 10px; }
1672
- .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button { padding: 0; border: 0; color: var(--dsw-alias-label-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1815
+ .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1673
1816
  .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button:hover { color: var(--partner-accent); }
1674
1817
  .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }
1675
- .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > p { max-width: 64ch; margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }
1818
+ .dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > p { max-width: 64ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }
1676
1819
  .dsh-partner-library-detail progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }
1677
1820
  .dsh-partner-library-detail progress::-webkit-progress-bar { background: transparent; }
1678
1821
  .dsh-partner-library-detail progress::-webkit-progress-value { background: var(--partner-accent); }
1679
1822
  .dsh-partner-library-detail progress::-moz-progress-bar { background: var(--partner-accent); }
1680
- .dsh-partner-library-detail footer small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1823
+ .dsh-partner-library-detail footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1824
+ .dsh-partner-profile-browser { display: grid; grid-template-columns: minmax(220px, 25%) minmax(0, 1fr); height: clamp(450px, 61vh, 660px); min-height: 0; overflow: hidden; }
1825
+ .dsh-partner-profile-people { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }
1826
+ .dsh-partner-profile-people > button { display: grid; grid-template-columns: 32px minmax(0, 1fr) 7px; align-items: center; gap: 10px; width: 100%; min-height: 58px; padding: 9px 13px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }
1827
+ .dsh-partner-profile-people > button:hover { background: var(--partner-hover); }
1828
+ .dsh-partner-profile-people > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }
1829
+ .dsh-partner-profile-people > button > span { display: grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }
1830
+ .dsh-partner-profile-people > button > div { display: grid; min-width: 0; gap: 2px; }
1831
+ .dsh-partner-profile-people strong, .dsh-partner-profile-people small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1832
+ .dsh-partner-profile-people strong { font-size: var(--partner-font-body); font-weight: 610; }
1833
+ .dsh-partner-profile-people small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1834
+ .dsh-partner-profile-people > button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }
1835
+ .dsh-partner-profile-people > button.is-active > i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }
1836
+ .dsh-partner-profile-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 25px clamp(20px, 3vw, 36px) 42px; scrollbar-gutter: stable; }
1837
+ .dsh-partner-profile-heading { display: flex; align-items: start; justify-content: space-between; gap: 24px; padding-bottom: 21px; border-bottom: 1px solid var(--partner-border); }
1838
+ .dsh-partner-profile-heading > span { display: grid; max-width: 66ch; gap: 5px; }
1839
+ .dsh-partner-profile-heading > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }
1840
+ .dsh-partner-profile-heading > span strong { font-size: var(--partner-font-title); font-weight: 660; letter-spacing: -.025em; }
1841
+ .dsh-partner-profile-heading > span p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }
1842
+ .dsh-partner-profile-heading > div { display: flex; flex: none; align-items: center; gap: 6px; min-height: 28px; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }
1843
+ .dsh-partner-profile-heading > div > i { width: 6px; height: 6px; border: 1px solid currentColor; border-radius: 50%; }
1844
+ .dsh-partner-profile-heading > div[data-ready="true"] { color: var(--partner-text-secondary); }
1845
+ .dsh-partner-profile-heading > div[data-ready="true"] > i { background: currentColor; }
1846
+ .dsh-partner-profile-meta { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 17px 0 8px; padding: 13px 0; border-block: 1px solid var(--partner-separator); }
1847
+ .dsh-partner-profile-meta > span { display: grid; min-width: 0; gap: 3px; padding: 0 14px; border-left: 1px solid var(--partner-separator); }
1848
+ .dsh-partner-profile-meta > span:first-child { padding-left: 0; border-left: 0; }
1849
+ .dsh-partner-profile-meta small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1850
+ .dsh-partner-profile-meta strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }
1851
+ .dsh-partner-profile-entries { display: grid; }
1852
+ .dsh-partner-profile-entries > article, .dsh-partner-profile-pending > div > article { display: grid; gap: 11px; padding: 18px 0; border-bottom: 1px solid var(--partner-separator); }
1853
+ .dsh-partner-profile-entries > article > header, .dsh-partner-profile-entries > article > footer,
1854
+ .dsh-partner-profile-pending > div > article > header, .dsh-partner-profile-pending > div > article > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
1855
+ .dsh-partner-profile-entries article > header > span, .dsh-partner-profile-pending article > header > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .07em; }
1856
+ .dsh-partner-profile-entries article > header > div, .dsh-partner-profile-pending article > header > div { display: flex; gap: 11px; }
1857
+ .dsh-partner-profile-entries article > header button, .dsh-partner-profile-pending article > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }
1858
+ .dsh-partner-profile-entries article > header button:hover, .dsh-partner-profile-pending article > header button:hover { color: var(--partner-text); }
1859
+ .dsh-partner-profile-entries article > strong, .dsh-partner-profile-pending article > strong { font-size: var(--partner-font-label); font-weight: 640; }
1860
+ .dsh-partner-profile-entries article > p, .dsh-partner-profile-pending article > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; text-wrap: pretty; }
1861
+ .dsh-partner-profile-entries progress, .dsh-partner-profile-pending progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }
1862
+ .dsh-partner-profile-entries progress::-webkit-progress-bar, .dsh-partner-profile-pending progress::-webkit-progress-bar { background: transparent; }
1863
+ .dsh-partner-profile-entries progress::-webkit-progress-value, .dsh-partner-profile-pending progress::-webkit-progress-value { background: var(--partner-accent); }
1864
+ .dsh-partner-profile-entries progress::-moz-progress-bar, .dsh-partner-profile-pending progress::-moz-progress-bar { background: var(--partner-accent); }
1865
+ .dsh-partner-profile-entries footer small, .dsh-partner-profile-pending footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1866
+ .dsh-partner-profile-pending { margin-top: 18px; border-top: 1px solid var(--partner-border); }
1867
+ .dsh-partner-profile-pending > summary { display: flex; min-height: 40px; align-items: center; gap: 6px; padding: 8px 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 610; list-style: none; cursor: pointer; }
1868
+ .dsh-partner-profile-pending > summary::-webkit-details-marker, .dsh-partner-memory-evidence > summary::-webkit-details-marker { display: none; }
1869
+ .dsh-partner-profile-pending > summary::before, .dsh-partner-memory-evidence > summary::before { display: inline-block; color: var(--partner-text-tertiary); font-size: 10px; content: '\u203A'; transform: rotate(0); transition: transform 160ms var(--partner-ease-out); }
1870
+ .dsh-partner-profile-pending[open] > summary::before, .dsh-partner-memory-evidence[open] > summary::before { transform: rotate(90deg); }
1871
+ .dsh-partner-profile-pending > summary b { margin-left: 4px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1872
+ .dsh-partner-memory-evidence { margin-top: 2px; border-top: 1px solid var(--partner-separator); }
1873
+ .dsh-partner-memory-evidence > summary { display: flex; min-height: 34px; align-items: center; gap: 5px; padding-top: 6px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; cursor: pointer; }
1874
+ .dsh-partner-memory-evidence > summary b { margin-left: 3px; font-weight: 620; }
1875
+ .dsh-partner-memory-evidence > div { display: grid; gap: 7px; padding-top: 9px; }
1876
+ .dsh-partner-memory-evidence blockquote { margin: 0; padding: 9px 11px; border-left: 2px solid var(--partner-border); color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-control) 50%, transparent); }
1877
+ .dsh-partner-memory-evidence blockquote p { margin: 0; font-size: var(--partner-font-caption); line-height: 1.55; }
1878
+ .dsh-partner-memory-evidence blockquote time { display: block; margin-top: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1681
1879
  .dsh-partner-memory-editor { display: grid; gap: 9px; }
1682
- .dsh-partner-memory-editor input, .dsh-partner-memory-editor textarea { box-sizing: border-box; width: 100%; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--dsw-alias-label-primary); outline: none; background: var(--partner-control); font: 500 var(--partner-font-caption)/1.5 var(--partner-font-family); }
1880
+ .dsh-partner-memory-editor input, .dsh-partner-memory-editor textarea { box-sizing: border-box; width: 100%; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); outline: none; background: var(--partner-control); font: 500 var(--partner-font-caption)/1.5 var(--partner-font-family); }
1683
1881
  .dsh-partner-memory-editor input { min-height: 32px; padding: 0 10px; }
1684
1882
  .dsh-partner-memory-editor textarea { min-height: 76px; padding: 8px 10px; resize: vertical; }
1685
1883
  .dsh-partner-memory-editor input:focus, .dsh-partner-memory-editor textarea:focus { border-color: color-mix(in srgb, var(--partner-accent) 48%, var(--partner-border)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-accent) 8%, transparent); }
1686
1884
  .dsh-partner-memory-editor footer { display: flex; justify-content: flex-end; gap: 7px; }
1687
- .dsh-partner-memory-editor button { min-height: 28px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--dsw-alias-label-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1688
- .dsh-partner-memory-editor button.is-primary { border-color: transparent; color: #fff; background: var(--partner-accent-strong); }
1885
+ .dsh-partner-memory-editor button { min-height: 28px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }
1886
+ .dsh-partner-memory-editor button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }
1689
1887
  .dsh-partner-diary-detail { display: grid; align-content: start; gap: 20px; }
1690
1888
  .dsh-partner-diary-detail > header { display: grid; gap: 5px; padding-bottom: 16px; border-bottom: 1px solid var(--partner-border); }
1691
1889
  .dsh-partner-diary-detail > header time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1 var(--partner-font-family); font-variant-numeric: tabular-nums; }
1692
1890
  .dsh-partner-diary-detail > header strong { font-size: var(--partner-font-title); letter-spacing: -.02em; }
1693
- .dsh-partner-diary-detail > header small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1694
- .dsh-partner-diary-detail > p { margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }
1891
+ .dsh-partner-diary-detail > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1892
+ .dsh-partner-diary-detail > p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }
1695
1893
  .dsh-partner-diary-detail > section { display: grid; gap: 8px; }
1696
1894
  .dsh-partner-diary-detail > section > strong { color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }
1697
1895
  .dsh-partner-diary-detail ul { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; }
1698
- .dsh-partner-diary-detail li { position: relative; padding-left: 12px; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }
1896
+ .dsh-partner-diary-detail li { position: relative; padding-left: 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }
1699
1897
  .dsh-partner-diary-detail li::before { position: absolute; top: .62em; left: 1px; width: 3px; height: 3px; border-radius: 50%; background: var(--partner-accent); content: ''; }
1700
- .dsh-partner-graph-browser { display: grid; grid-template-columns: minmax(240px, 28%) minmax(0, 1fr); height: clamp(430px, 58vh, 640px); min-height: 0; overflow: hidden; }
1701
- .dsh-partner-graph-index { min-height: 0; overflow-y: auto; border-right: 1px solid var(--partner-border); }
1702
- .dsh-partner-graph-index > button { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 5px 9px; width: 100%; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; }
1703
- .dsh-partner-graph-index > button:hover { background: color-mix(in srgb, var(--partner-accent) 4%, transparent); }
1704
- .dsh-partner-graph-index > button.is-active { background: color-mix(in srgb, var(--partner-accent) 8%, transparent); box-shadow: inset 2px 0 var(--partner-accent); }
1705
- .dsh-partner-graph-index span { grid-row: span 2; padding: 4px 6px; border-radius: 6px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); font-size: var(--partner-font-caption); }
1706
- .dsh-partner-graph-index strong { overflow: hidden; font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }
1707
- .dsh-partner-graph-index small { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1708
- .dsh-partner-graph-stage { min-width: 0; min-height: 0; overflow-y: auto; padding: 26px clamp(22px, 4vw, 42px) 40px; background: radial-gradient(circle at 78% 14%, color-mix(in srgb, var(--partner-accent) 7%, transparent), transparent 38%); }
1709
- .dsh-partner-graph-stage > header { display: grid; gap: 7px; max-width: 66ch; padding-bottom: 20px; border-bottom: 1px solid var(--partner-border); }
1710
- .dsh-partner-graph-stage > header span { width: max-content; color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; }
1711
- .dsh-partner-graph-stage > header strong { font-size: var(--partner-font-title); letter-spacing: -.025em; }
1712
- .dsh-partner-graph-stage > header p { margin: 0; color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-body); line-height: 1.7; }
1713
- .dsh-partner-graph-links { position: relative; display: grid; gap: 8px; margin: 21px 0 0 16px; padding-left: 24px; }
1714
- .dsh-partner-graph-links::before { position: absolute; top: 0; bottom: 0; left: 3px; width: 1px; background: linear-gradient(var(--partner-accent), color-mix(in srgb, var(--partner-accent) 8%, transparent)); content: ''; }
1715
- .dsh-partner-graph-links > button { position: relative; display: grid; grid-template-columns: 8px minmax(0, 1fr) auto; align-items: center; gap: 11px; padding: 12px 13px; border: 1px solid var(--partner-border); border-radius: 11px; color: inherit; background: color-mix(in srgb, var(--partner-control) 82%, transparent); text-align: left; cursor: pointer; }
1716
- .dsh-partner-graph-links > button::before { position: absolute; top: 50%; right: 100%; width: 25px; height: 1px; background: color-mix(in srgb, var(--partner-accent) 42%, transparent); content: ''; }
1717
- .dsh-partner-graph-links > button > i { width: 7px; height: 7px; border-radius: 50%; background: var(--partner-accent); }
1718
- .dsh-partner-graph-links > button > span { display: grid; gap: 3px; }
1719
- .dsh-partner-graph-links small { color: var(--partner-accent); font-size: var(--partner-font-caption); }
1720
- .dsh-partner-graph-links strong { font-size: var(--partner-font-body); }
1721
- .dsh-partner-graph-links p { margin: 0; color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); }
1722
- .dsh-partner-graph-links b { color: var(--dsw-alias-label-tertiary); font-size: var(--partner-font-caption); font-weight: 560; font-variant-numeric: tabular-nums; }
1723
- .dsh-partner-state { display: grid; place-items: center; align-content: center; min-height: 280px; padding: 30px; color: var(--dsw-alias-label-tertiary); text-align: center; }
1898
+ .dsh-partner-graph-audit { min-height: 0; }
1899
+ .dsh-partner-graph-toolbar { display: flex; min-height: 78px; align-items: center; justify-content: space-between; gap: 20px; padding: 13px 18px; border-bottom: 1px solid var(--partner-border); }
1900
+ .dsh-partner-graph-toolbar > span { display: grid; min-width: 0; gap: 3px; }
1901
+ .dsh-partner-graph-toolbar > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }
1902
+ .dsh-partner-graph-toolbar > span strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 650; text-overflow: ellipsis; white-space: nowrap; }
1903
+ .dsh-partner-graph-toolbar > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1904
+ .dsh-partner-graph-toolbar > label { display: grid; flex: 0 1 220px; gap: 4px; }
1905
+ .dsh-partner-graph-toolbar > label > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1906
+ .dsh-partner-graph-toolbar select { width: 100%; height: 34px; padding: 0 30px 0 10px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background-color: var(--partner-control); font-size: var(--partner-font-caption); }
1907
+ .dsh-partner-graph-filters { display: flex; min-width: 0; gap: 4px; min-height: 45px; align-items: center; padding: 7px 12px; overflow-x: auto; border-bottom: 1px solid var(--partner-border); scrollbar-width: none; }
1908
+ .dsh-partner-graph-filters::-webkit-scrollbar { display: none; }
1909
+ .dsh-partner-graph-filters button { flex: none; min-height: 30px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease; }
1910
+ .dsh-partner-graph-filters button:hover { color: var(--partner-text); background: var(--partner-hover); }
1911
+ .dsh-partner-graph-filters button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }
1912
+ .dsh-partner-graph-filters b { margin-left: 3px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }
1913
+ .dsh-partner-graph-browser { display: grid; grid-template-columns: minmax(270px, 33%) minmax(0, 1fr); height: clamp(430px, 56vh, 620px); min-height: 0; overflow: hidden; }
1914
+ .dsh-partner-graph-index { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }
1915
+ .dsh-partner-graph-index > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }
1916
+ .dsh-partner-graph-index > button:hover { background: var(--partner-hover); }
1917
+ .dsh-partner-graph-index > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }
1918
+ .dsh-partner-graph-index > button > span { width: max-content; padding: 3px 6px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); font-weight: 630; }
1919
+ .dsh-partner-graph-index > button[data-kind="conflicts_with"] > span { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 26%, var(--partner-border)); }
1920
+ .dsh-partner-graph-index strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }
1921
+ .dsh-partner-graph-index strong i { color: var(--partner-text-tertiary); font-style: normal; }
1922
+ .dsh-partner-graph-index p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
1923
+ .dsh-partner-graph-index small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1924
+ .dsh-partner-graph-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; padding: 24px clamp(20px, 3vw, 36px) 40px; scrollbar-gutter: stable; }
1925
+ .dsh-partner-graph-stage > article { display: grid; gap: 20px; animation: dsh-partner-content-enter 220ms var(--partner-ease-out) both; }
1926
+ .dsh-partner-graph-stage > article > header { display: grid; gap: 6px; padding-bottom: 18px; border-bottom: 1px solid var(--partner-border); }
1927
+ .dsh-partner-graph-stage > article > header > span { width: max-content; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }
1928
+ .dsh-partner-graph-stage > article[data-kind="conflicts_with"] > header > span { color: var(--partner-danger); }
1929
+ .dsh-partner-graph-stage > article > header > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }
1930
+ .dsh-partner-graph-stage > article > header > strong i { color: var(--partner-text-tertiary); font-style: normal; font-weight: 450; }
1931
+ .dsh-partner-graph-stage > article > header > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }
1932
+ .dsh-partner-graph-stage > article > header > small { max-width: 72ch; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }
1933
+ .dsh-partner-graph-pair { display: grid; grid-template-columns: minmax(0, 1fr) 64px minmax(0, 1fr); align-items: stretch; }
1934
+ .dsh-partner-graph-pair > section { display: grid; align-content: start; gap: 9px; min-height: 170px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 13px; }
1935
+ .dsh-partner-graph-pair > section > header { display: grid; gap: 3px; }
1936
+ .dsh-partner-graph-pair > section small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1937
+ .dsh-partner-graph-pair > section strong { font-size: var(--partner-font-label); font-weight: 640; }
1938
+ .dsh-partner-graph-pair > section p { margin: 0 0 8px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; overflow-wrap: anywhere; }
1939
+ .dsh-partner-graph-pair > section button { width: max-content; min-height: 30px; margin-top: auto; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }
1940
+ .dsh-partner-graph-pair > section button:hover { color: var(--partner-text); background: var(--partner-hover); }
1941
+ .dsh-partner-graph-pair > div { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1942
+ .dsh-partner-graph-pair > div i { height: 1px; background: var(--partner-border); }
1943
+ .dsh-partner-graph-pair > div span { padding: 0 5px; white-space: nowrap; }
1944
+ .dsh-partner-graph-stage > article > footer { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding-top: 2px; }
1945
+ .dsh-partner-graph-stage > article > footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1946
+ .dsh-partner-graph-stage > article > footer > strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-variant-numeric: tabular-nums; }
1947
+ .dsh-partner-state { display: grid; place-items: center; align-content: center; min-height: 280px; padding: 30px; color: var(--partner-text-tertiary); text-align: center; }
1724
1948
  .dsh-partner-state > svg { margin-bottom: 10px; color: var(--partner-accent); }
1725
- .dsh-partner-state strong { color: var(--dsw-alias-label-secondary); font-size: var(--partner-font-label); }
1949
+ .dsh-partner-state strong { color: var(--partner-text-secondary); font-size: var(--partner-font-label); }
1726
1950
  .dsh-partner-state p { max-width: 330px; margin: 7px 0 14px; font-size: var(--partner-font-body); line-height: 1.55; }
1727
1951
  .dsh-partner-state.is-compact { min-height: 130px; }
1728
1952
 
1953
+ /* One material contract for every card surface in the partner workspace.
1954
+ Individual components own layout and state; this layer owns glass, edge
1955
+ refraction and elevation so visual treatment cannot drift between tabs. */
1956
+ :is(
1957
+ .dsh-partner-home-details > section,
1958
+ .dsh-partner-capabilities button,
1959
+ .dsh-partner-weixin-connect,
1960
+ .dsh-partner-qr,
1961
+ .dsh-partner-channel-card,
1962
+ .dsh-partner-metrics article,
1963
+ .dsh-partner-automation,
1964
+ .dsh-partner-concern-board,
1965
+ .dsh-partner-memory-library,
1966
+ .dsh-partner-graph-pair > section
1967
+ ) {
1968
+ border-color: var(--partner-border);
1969
+ background:
1970
+ linear-gradient(118deg, color-mix(in srgb, var(--partner-card-highlight) 18%, transparent), transparent 56%),
1971
+ var(--partner-card-surface);
1972
+ box-shadow: var(--partner-card-shadow);
1973
+ }
1974
+
1975
+ /* Editable controls share one compact translucent material. Keeping this
1976
+ separate from cards preserves hierarchy while preventing theme defaults or
1977
+ platform form colors from leaking into the workspace. */
1978
+ :is(
1979
+ .dsh-partner-field input,
1980
+ .dsh-partner-field textarea,
1981
+ .dsh-partner-field select,
1982
+ .dsh-partner-review-policy select,
1983
+ .dsh-partner-concern-compose input,
1984
+ .dsh-partner-library-tools input,
1985
+ .dsh-partner-memory-editor input,
1986
+ .dsh-partner-memory-editor textarea,
1987
+ .dsh-partner-graph-toolbar select
1988
+ ) {
1989
+ background-color: var(--partner-control);
1990
+ box-shadow:
1991
+ inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent),
1992
+ inset 0 -1px 0 var(--partner-glass-rim-shadow);
1993
+ }
1994
+
1995
+ :is(
1996
+ .dsh-partner-field input,
1997
+ .dsh-partner-field textarea,
1998
+ .dsh-partner-field select,
1999
+ .dsh-partner-review-policy select,
2000
+ .dsh-partner-concern-compose input,
2001
+ .dsh-partner-library-tools input,
2002
+ .dsh-partner-memory-editor input,
2003
+ .dsh-partner-memory-editor textarea,
2004
+ .dsh-partner-graph-toolbar select
2005
+ ):focus {
2006
+ border-color: var(--partner-focus-ring);
2007
+ background-color: var(--partner-raised);
2008
+ box-shadow:
2009
+ 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent),
2010
+ inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent);
2011
+ }
2012
+
2013
+ .dsh-partner-concern-decision {
2014
+ background: color-mix(in srgb, var(--partner-card-surface) 76%, transparent);
2015
+ box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 68%, transparent);
2016
+ }
2017
+
2018
+ .dsh-partner-capabilities button.is-active {
2019
+ border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border));
2020
+ background:
2021
+ linear-gradient(145deg, color-mix(in srgb, var(--partner-card-highlight) 46%, transparent), transparent 58%),
2022
+ color-mix(in srgb, var(--partner-card-surface) 90%, var(--partner-card-highlight) 10%);
2023
+ box-shadow: var(--partner-card-shadow), inset 2px 0 var(--partner-text-secondary);
2024
+ }
2025
+
2026
+ /* Shared motion and material contract. Business components keep their own
2027
+ layout while interactive surfaces receive one consistent physical response. */
2028
+ :is(
2029
+ .dsh-partner-home-channel-actions button,
2030
+ .dsh-partner-form-actions > button,
2031
+ .dsh-partner-state > button,
2032
+ .dsh-partner-weixin-connect > button,
2033
+ .dsh-partner-pairings button.is-primary,
2034
+ .dsh-partner-automation-actions button.is-primary,
2035
+ .dsh-partner-concern-compose button.is-primary,
2036
+ .dsh-partner-memory-editor button.is-primary
2037
+ ) {
2038
+ position: relative;
2039
+ isolation: isolate;
2040
+ overflow: hidden;
2041
+ }
2042
+
2043
+ :is(
2044
+ .dsh-partner-home-channel-actions button,
2045
+ .dsh-partner-form-actions > button,
2046
+ .dsh-partner-state > button,
2047
+ .dsh-partner-weixin-connect > button,
2048
+ .dsh-partner-pairings button.is-primary,
2049
+ .dsh-partner-automation-actions button.is-primary,
2050
+ .dsh-partner-concern-compose button.is-primary,
2051
+ .dsh-partner-memory-editor button.is-primary
2052
+ )::after {
2053
+ position: absolute;
2054
+ z-index: -1;
2055
+ top: -75%;
2056
+ bottom: -75%;
2057
+ left: -70%;
2058
+ width: 48%;
2059
+ border-radius: 45%;
2060
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .24), transparent);
2061
+ opacity: 0;
2062
+ transform: skewX(-18deg) translate3d(0, 0, 0);
2063
+ pointer-events: none;
2064
+ transition: opacity 140ms ease, transform 680ms var(--partner-ease-out);
2065
+ content: "";
2066
+ }
2067
+
2068
+ :is(
2069
+ .dsh-partner-home-channel-actions button,
2070
+ .dsh-partner-form-actions > button,
2071
+ .dsh-partner-state > button,
2072
+ .dsh-partner-weixin-connect > button,
2073
+ .dsh-partner-pairings button.is-primary,
2074
+ .dsh-partner-automation-actions button.is-primary,
2075
+ .dsh-partner-concern-compose button.is-primary,
2076
+ .dsh-partner-memory-editor button.is-primary
2077
+ ):hover:not(:disabled)::after {
2078
+ opacity: 1;
2079
+ transform: skewX(-18deg) translate3d(360%, 0, 0);
2080
+ }
2081
+
2082
+ :is(
2083
+ .dsh-partner-roster-title button,
2084
+ .dsh-partner-home-details header button,
2085
+ .dsh-partner-qr button,
2086
+ .dsh-partner-pairings button,
2087
+ .dsh-partner-session-list button,
2088
+ .dsh-partner-review-policy > button:last-child,
2089
+ .dsh-partner-automation-actions button,
2090
+ .dsh-partner-section-heading button,
2091
+ .dsh-partner-concern-actions button,
2092
+ .dsh-partner-concern-resolved button,
2093
+ .dsh-partner-memory-editor button,
2094
+ .dsh-partner-graph-pair > section button
2095
+ ) {
2096
+ transition:
2097
+ color 140ms ease,
2098
+ border-color 140ms ease,
2099
+ background-color 140ms ease,
2100
+ box-shadow 180ms ease,
2101
+ transform 160ms var(--partner-ease-out);
2102
+ }
2103
+
2104
+ :is(
2105
+ .dsh-partner-home-channel-actions button,
2106
+ .dsh-partner-form-actions > button,
2107
+ .dsh-partner-state > button,
2108
+ .dsh-partner-weixin-connect > button,
2109
+ .dsh-partner-pairings button,
2110
+ .dsh-partner-session-list button,
2111
+ .dsh-partner-review-policy > button:last-child,
2112
+ .dsh-partner-automation-actions button,
2113
+ .dsh-partner-section-heading button,
2114
+ .dsh-partner-concern-actions button,
2115
+ .dsh-partner-concern-resolved button,
2116
+ .dsh-partner-memory-editor button,
2117
+ .dsh-partner-graph-pair > section button
2118
+ ):active:not(:disabled) {
2119
+ transform: scale(.97);
2120
+ }
2121
+
2122
+ :is(.dsh-partner-library-list > button, .dsh-partner-graph-index > button):hover {
2123
+ border-color: var(--partner-border);
2124
+ background: var(--partner-hover);
2125
+ }
2126
+
2127
+ .dsh-partner-home-details > section,
2128
+ .dsh-partner-metrics > article,
2129
+ .dsh-partner-automation-grid > section {
2130
+ animation: dsh-partner-item-enter 300ms var(--partner-ease-out) both;
2131
+ }
2132
+ .dsh-partner-home-details > section:nth-child(2),
2133
+ .dsh-partner-metrics > article:nth-child(2),
2134
+ .dsh-partner-automation-grid > section:nth-child(2) { animation-delay: 36ms; }
2135
+ .dsh-partner-home-details > section:nth-child(3),
2136
+ .dsh-partner-metrics > article:nth-child(3) { animation-delay: 72ms; }
2137
+
2138
+ @keyframes dsh-partner-content-enter {
2139
+ from { opacity: 0; transform: translate3d(0, 6px, 0); }
2140
+ to { opacity: 1; transform: translate3d(0, 0, 0); }
2141
+ }
2142
+ @keyframes dsh-partner-item-enter {
2143
+ from { opacity: 0; transform: translate3d(0, 8px, 0) scale(.99); }
2144
+ to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); }
2145
+ }
2146
+
2147
+ @media (prefers-reduced-transparency: reduce) {
2148
+ :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
2149
+ --partner-canvas: var(--partner-solid-canvas);
2150
+ --partner-surface: var(--partner-solid-panel);
2151
+ --partner-pane: var(--partner-solid-panel);
2152
+ --partner-raised: var(--partner-solid-raised);
2153
+ --partner-control: var(--partner-solid-control);
2154
+ --partner-card-surface: var(--partner-solid-raised);
2155
+ }
2156
+ .dsh-partner-topbar,
2157
+ .dsh-partner-roster,
2158
+ .dsh-partner-stage,
2159
+ .dsh-partner-home-channel,
2160
+ .dsh-partner-home-details > section,
2161
+ .dsh-partner-capabilities button,
2162
+ .dsh-partner-weixin-connect,
2163
+ .dsh-partner-qr,
2164
+ .dsh-partner-channel-card,
2165
+ .dsh-partner-metrics article,
2166
+ .dsh-partner-automation,
2167
+ .dsh-partner-concern-board,
2168
+ .dsh-partner-memory-library,
2169
+ .dsh-partner-graph-pair > section { -webkit-backdrop-filter: none; backdrop-filter: none; }
2170
+ .dsh-partner-glass-surface { -webkit-backdrop-filter: none; backdrop-filter: none; }
2171
+ }
2172
+
2173
+ @supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
2174
+ :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
2175
+ --partner-canvas: var(--partner-solid-canvas);
2176
+ --partner-surface: var(--partner-solid-panel);
2177
+ --partner-pane: var(--partner-solid-panel);
2178
+ --partner-raised: var(--partner-solid-raised);
2179
+ --partner-control: var(--partner-solid-control);
2180
+ --partner-card-surface: var(--partner-solid-raised);
2181
+ }
2182
+ }
2183
+
2184
+ @container partner-memory (max-width: 980px) {
2185
+ .dsh-partner-automation-grid { grid-template-columns: minmax(0, 1fr); }
2186
+ }
2187
+
2188
+ @container partner-memory (max-width: 640px) {
2189
+ .dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2190
+ .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(0, 1fr); }
2191
+ .dsh-partner-review-policy { grid-template-columns: auto minmax(0, 1fr); }
2192
+ .dsh-partner-review-policy > label,
2193
+ .dsh-partner-review-policy > button:last-child { grid-column: span 1; }
2194
+ .dsh-partner-concern-board > header p { display: none; }
2195
+ .dsh-partner-concern-row { grid-template-columns: minmax(0, 1fr) auto 14px; gap: 7px; }
2196
+ .dsh-partner-concern-state { grid-column: 1; }
2197
+ .dsh-partner-concern-copy { grid-row: 2; grid-column: 1 / -1; padding-left: 13px; }
2198
+ .dsh-partner-concern-time { grid-row: 1; grid-column: 2; }
2199
+ .dsh-partner-concern-row > svg { grid-row: 1; grid-column: 3; }
2200
+ .dsh-partner-concern-detail { padding: 0 12px 11px 25px; }
2201
+ .dsh-partner-concern-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
2202
+ }
2203
+
1729
2204
  @media (max-width: 1080px) {
1730
2205
  .dsh-partner-grid { grid-template-columns: 190px minmax(400px, 1fr); }
1731
2206
  .dsh-partner-home-channel { grid-template-columns: minmax(190px, .7fr) minmax(300px, 1.3fr); }
1732
2207
  .dsh-partner-home-channel-copy { padding-right: 26px; }
1733
- .dsh-partner-automation-grid { grid-template-columns: 1fr; }
1734
2208
  }
1735
2209
  @media (max-width: 760px) {
1736
2210
  .dsh-partner-grid { grid-template-columns: 1fr; }
@@ -1742,15 +2216,13 @@ var client_default = `.dsh-partner-sidebar,
1742
2216
  .dsh-partner-fields.two,
1743
2217
  .dsh-partner-capabilities,
1744
2218
  .dsh-partner-metrics { grid-template-columns: 1fr; }
1745
- .dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1746
- .dsh-partner-automation-fields.is-memory-model { grid-template-columns: 1fr; }
1747
2219
  .dsh-partner-home-heading { display: grid; gap: 8px; }
1748
2220
  .dsh-partner-home-heading p { text-align: left; }
1749
2221
  .dsh-partner-home-channel { grid-template-columns: 1fr; }
1750
2222
  .dsh-partner-home-route { min-height: 128px; padding-bottom: 10px; }
1751
2223
  .dsh-partner-home-channel-copy { padding: 12px 22px 24px; }
1752
2224
  .dsh-partner-home-details { grid-template-columns: 1fr; }
1753
- .dsh-partner-home-profile { grid-row: auto; padding-right: 2px !important; border-right: 0; }
2225
+ .dsh-partner-home-profile { grid-row: auto; }
1754
2226
  .dsh-partner-weixin-connect { grid-template-columns: 52px 1fr; }
1755
2227
  .dsh-partner-weixin-connect > button { grid-column: 1 / -1; }
1756
2228
  .dsh-partner-qr { grid-template-columns: 1fr; justify-items: center; text-align: center; }
@@ -1764,19 +2236,21 @@ var client_default = `.dsh-partner-sidebar,
1764
2236
  .dsh-partner-library-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }
1765
2237
  .dsh-partner-library-list { max-height: 300px; border-right: 0; border-bottom: 1px solid var(--partner-border); }
1766
2238
  .dsh-partner-library-detail { min-height: 280px; }
1767
- .dsh-partner-review-policy { grid-template-columns: auto minmax(0, 1fr); }
1768
- .dsh-partner-concern-board > header p { display: none; }
1769
- .dsh-partner-concern-row { grid-template-columns: minmax(0, 1fr) auto 14px; gap: 7px; }
1770
- .dsh-partner-concern-state { grid-column: 1; }
1771
- .dsh-partner-concern-copy { grid-row: 2; grid-column: 1 / -1; padding-left: 13px; }
1772
- .dsh-partner-concern-time { grid-row: 1; grid-column: 2; }
1773
- .dsh-partner-concern-row > svg { grid-row: 1; grid-column: 3; }
1774
- .dsh-partner-concern-detail { padding: 0 12px 11px 25px; }
1775
- .dsh-partner-concern-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
1776
- .dsh-partner-review-policy > label, .dsh-partner-review-policy > button:last-child { grid-column: span 1; }
2239
+ .dsh-partner-profile-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }
2240
+ .dsh-partner-profile-people { max-height: 240px; border-right: 0; border-bottom: 1px solid var(--partner-border); }
2241
+ .dsh-partner-profile-stage { min-height: 330px; }
2242
+ .dsh-partner-profile-heading { display: grid; }
2243
+ .dsh-partner-profile-heading > div { width: max-content; }
2244
+ .dsh-partner-profile-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2245
+ .dsh-partner-profile-meta > span:nth-child(3) { padding-left: 0; border-left: 0; }
2246
+ .dsh-partner-graph-toolbar { display: grid; min-height: 0; gap: 12px; }
2247
+ .dsh-partner-graph-toolbar > label { width: 100%; }
1777
2248
  .dsh-partner-graph-browser { grid-template-columns: 1fr; height: auto; }
1778
2249
  .dsh-partner-graph-index { max-height: 280px; border-right: 0; border-bottom: 1px solid var(--partner-border); }
1779
2250
  .dsh-partner-graph-stage { min-height: 320px; }
2251
+ .dsh-partner-graph-pair { grid-template-columns: 1fr; gap: 9px; }
2252
+ .dsh-partner-graph-pair > div { min-height: 20px; grid-template-columns: 1fr auto 1fr; }
2253
+ .dsh-partner-graph-stage > article > footer { display: grid; gap: 4px; }
1780
2254
  }
1781
2255
  @media (prefers-reduced-motion: reduce) {
1782
2256
  .dsh-partner-workspace *,
@@ -1860,8 +2334,165 @@ function futureTime(value, now = Date.now()) {
1860
2334
  return `${month}/${day} ${hour}:${minute}`;
1861
2335
  }
1862
2336
 
1863
- // src/client.tsx
2337
+ // src/glass-surface.tsx
2338
+ var import_react3 = require("react");
1864
2339
  var import_jsx_runtime = require("react/jsx-runtime");
2340
+ function supportsSvgBackdropFilter(filterId) {
2341
+ if (typeof window === "undefined" || typeof document === "undefined") return false;
2342
+ if (window.matchMedia("(prefers-reduced-transparency: reduce)").matches) return false;
2343
+ const userAgent = navigator.userAgent;
2344
+ if (/Firefox/i.test(userAgent) || /Safari/i.test(userAgent) && !/(Chrome|Chromium|CriOS)/i.test(userAgent)) return false;
2345
+ const probe = document.createElement("div");
2346
+ probe.style.backdropFilter = `url(#${filterId})`;
2347
+ return probe.style.backdropFilter !== "";
2348
+ }
2349
+ function displacementMap(width, height, radius, borderWidth, brightness, opacity, blur, redGradientId, blueGradientId) {
2350
+ const edge = Math.max(1, Math.min(width, height) * borderWidth * 0.5);
2351
+ const innerWidth = Math.max(1, width - edge * 2);
2352
+ const innerHeight = Math.max(1, height - edge * 2);
2353
+ const svg = `<svg viewBox="0 0 ${width} ${height}" xmlns="http://www.w3.org/2000/svg">
2354
+ <defs>
2355
+ <linearGradient id="${redGradientId}" x1="100%" y1="0%" x2="0%" y2="0%"><stop offset="0%" stop-color="#0000"/><stop offset="100%" stop-color="red"/></linearGradient>
2356
+ <linearGradient id="${blueGradientId}" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#0000"/><stop offset="100%" stop-color="blue"/></linearGradient>
2357
+ </defs>
2358
+ <rect width="${width}" height="${height}" fill="black"/>
2359
+ <rect width="${width}" height="${height}" rx="${radius}" fill="url(#${redGradientId})"/>
2360
+ <rect width="${width}" height="${height}" rx="${radius}" fill="url(#${blueGradientId})" style="mix-blend-mode:difference"/>
2361
+ <rect x="${edge}" y="${edge}" width="${innerWidth}" height="${innerHeight}" rx="${radius}" fill="hsl(0 0% ${brightness}% / ${opacity})" style="filter:blur(${blur}px)"/>
2362
+ </svg>`;
2363
+ return `data:image/svg+xml,${encodeURIComponent(svg)}`;
2364
+ }
2365
+ function GlassSurface({
2366
+ as: Element,
2367
+ children,
2368
+ className,
2369
+ borderRadius,
2370
+ borderWidth = 0.07,
2371
+ brightness = 50,
2372
+ blur = 11,
2373
+ distortionScale = -26,
2374
+ interactive = false,
2375
+ opacity = 0.93,
2376
+ saturation = 1.16,
2377
+ ...elementProps
2378
+ }) {
2379
+ const uniqueId = (0, import_react3.useId)().replace(/:/g, "-");
2380
+ const filterId = `partner-glass-filter-${uniqueId}`;
2381
+ const redGradientId = `partner-glass-red-${uniqueId}`;
2382
+ const blueGradientId = `partner-glass-blue-${uniqueId}`;
2383
+ const containerRef = (0, import_react3.useRef)(null);
2384
+ const imageRef = (0, import_react3.useRef)(null);
2385
+ const redRef = (0, import_react3.useRef)(null);
2386
+ const greenRef = (0, import_react3.useRef)(null);
2387
+ const blueRef = (0, import_react3.useRef)(null);
2388
+ const glareFrameRef = (0, import_react3.useRef)(0);
2389
+ const glarePositionRef = (0, import_react3.useRef)({ x: 50, y: 50 });
2390
+ const [svgSupported, setSvgSupported] = (0, import_react3.useState)(false);
2391
+ (0, import_react3.useEffect)(() => {
2392
+ setSvgSupported(supportsSvgBackdropFilter(filterId));
2393
+ }, [filterId]);
2394
+ (0, import_react3.useEffect)(() => {
2395
+ const element = containerRef.current;
2396
+ const image = imageRef.current;
2397
+ if (element === null || image === null) return;
2398
+ let frame = 0;
2399
+ const update = () => {
2400
+ frame = 0;
2401
+ const rect = element.getBoundingClientRect();
2402
+ const width = Math.max(1, Math.round(rect.width));
2403
+ const height = Math.max(1, Math.round(rect.height));
2404
+ image.setAttribute("href", displacementMap(
2405
+ width,
2406
+ height,
2407
+ Math.min(borderRadius, Math.min(width, height) / 2),
2408
+ borderWidth,
2409
+ brightness,
2410
+ opacity,
2411
+ blur,
2412
+ redGradientId,
2413
+ blueGradientId
2414
+ ));
2415
+ };
2416
+ const schedule = () => {
2417
+ if (frame === 0) frame = requestAnimationFrame(update);
2418
+ };
2419
+ const observer = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
2420
+ observer?.observe(element);
2421
+ schedule();
2422
+ return () => {
2423
+ if (frame !== 0) cancelAnimationFrame(frame);
2424
+ observer?.disconnect();
2425
+ };
2426
+ }, [blueGradientId, blur, borderRadius, borderWidth, brightness, opacity, redGradientId]);
2427
+ (0, import_react3.useEffect)(() => {
2428
+ const channels = [redRef.current, greenRef.current, blueRef.current];
2429
+ const offsets = [0, 5, 10];
2430
+ channels.forEach((channel, index) => channel?.setAttribute("scale", String(distortionScale + (offsets[index] ?? 0))));
2431
+ }, [distortionScale]);
2432
+ (0, import_react3.useEffect)(() => () => {
2433
+ if (glareFrameRef.current !== 0) cancelAnimationFrame(glareFrameRef.current);
2434
+ }, []);
2435
+ const renderGlare = () => {
2436
+ glareFrameRef.current = 0;
2437
+ const element = containerRef.current;
2438
+ if (element === null) return;
2439
+ element.style.setProperty("--partner-glare-x", `${glarePositionRef.current.x}%`);
2440
+ element.style.setProperty("--partner-glare-y", `${glarePositionRef.current.y}%`);
2441
+ };
2442
+ const scheduleGlare = () => {
2443
+ if (glareFrameRef.current === 0) glareFrameRef.current = requestAnimationFrame(renderGlare);
2444
+ };
2445
+ const moveGlare = (clientX, clientY) => {
2446
+ const element = containerRef.current;
2447
+ if (!interactive || element === null) return;
2448
+ const rect = element.getBoundingClientRect();
2449
+ glarePositionRef.current = {
2450
+ x: Math.max(0, Math.min(100, (clientX - rect.left) / rect.width * 100)),
2451
+ y: Math.max(0, Math.min(100, (clientY - rect.top) / rect.height * 100))
2452
+ };
2453
+ scheduleGlare();
2454
+ };
2455
+ const resetGlare = () => {
2456
+ if (!interactive) return;
2457
+ glarePositionRef.current = { x: 50, y: 50 };
2458
+ scheduleGlare();
2459
+ };
2460
+ const style = {
2461
+ "--partner-glass-filter-id": `url(#${filterId})`,
2462
+ "--partner-glass-saturation": saturation,
2463
+ "--partner-glare-x": "50%",
2464
+ "--partner-glare-y": "50%"
2465
+ };
2466
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
2467
+ Element,
2468
+ {
2469
+ ...elementProps,
2470
+ ref: containerRef,
2471
+ className: `dsh-partner-glass-surface ${svgSupported ? "is-svg" : "is-fallback"}${interactive ? " is-interactive" : ""} ${className}`,
2472
+ style,
2473
+ onPointerMove: interactive ? (event) => moveGlare(event.clientX, event.clientY) : void 0,
2474
+ onPointerLeave: interactive ? resetGlare : void 0,
2475
+ children: [
2476
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "dsh-partner-glass-filter", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", focusable: "false", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("filter", { id: filterId, colorInterpolationFilters: "sRGB", x: "0%", y: "0%", width: "100%", height: "100%", children: [
2477
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feImage", { ref: imageRef, x: "0", y: "0", width: "100%", height: "100%", preserveAspectRatio: "none", result: "map" }),
2478
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feDisplacementMap", { ref: redRef, in: "SourceGraphic", in2: "map", result: "displaced-red" }),
2479
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feColorMatrix", { in: "displaced-red", type: "matrix", values: "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0", result: "red" }),
2480
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feDisplacementMap", { ref: greenRef, in: "SourceGraphic", in2: "map", result: "displaced-green" }),
2481
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feColorMatrix", { in: "displaced-green", type: "matrix", values: "0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0", result: "green" }),
2482
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feDisplacementMap", { ref: blueRef, in: "SourceGraphic", in2: "map", result: "displaced-blue" }),
2483
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feColorMatrix", { in: "displaced-blue", type: "matrix", values: "0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0", result: "blue" }),
2484
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feBlend", { in: "red", in2: "green", mode: "screen", result: "red-green" }),
2485
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feBlend", { in: "red-green", in2: "blue", mode: "screen", result: "output" }),
2486
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feGaussianBlur", { in: "output", stdDeviation: ".45" })
2487
+ ] }) }) }),
2488
+ children
2489
+ ]
2490
+ }
2491
+ );
2492
+ }
2493
+
2494
+ // src/client.tsx
2495
+ var import_jsx_runtime2 = require("react/jsx-runtime");
1865
2496
  var PLUGIN_ID = "@lemoncat7/dsh-partner";
1866
2497
  var STYLE_ID = `${PLUGIN_ID}/client`;
1867
2498
  var inject = ["slots", "layout", "sessions"];
@@ -1874,7 +2505,7 @@ function apply(ctx) {
1874
2505
  name: "sidebar.footer.action",
1875
2506
  id: "partner",
1876
2507
  order: -120
1877
- }, (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PartnerSidebar, { ...props, controller, collapse: () => ctx.layout.toggleSidebar() })));
2508
+ }, (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PartnerSidebar, { ...props, controller, collapse: () => ctx.layout.toggleSidebar() })));
1878
2509
  }
1879
2510
  function createController(ctx) {
1880
2511
  const listeners = /* @__PURE__ */ new Set();
@@ -1888,7 +2519,7 @@ function createController(ctx) {
1888
2519
  if (companionId !== void 0) selected = companionId;
1889
2520
  if (dispose === void 0) {
1890
2521
  activatePluginWorkspace(PLUGIN_ID);
1891
- dispose = ctx.slots.register({ name: "conversation", priority: -3 }, (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PartnerWorkspace, { ...props, controller }));
2522
+ dispose = ctx.slots.register({ name: "conversation", priority: -3 }, (props) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PartnerWorkspace, { ...props, controller }));
1892
2523
  }
1893
2524
  notify();
1894
2525
  },
@@ -1925,13 +2556,13 @@ function createController(ctx) {
1925
2556
  return controller;
1926
2557
  }
1927
2558
  function PartnerSidebar(props) {
1928
- const ref = (0, import_react3.useRef)(null);
2559
+ const ref = (0, import_react4.useRef)(null);
1929
2560
  useWorkspaceTopAnchor(ref);
1930
- const [open, setOpen] = (0, import_react3.useState)(true);
1931
- const [snapshot, setSnapshot] = (0, import_react3.useState)();
1932
- const [, update] = (0, import_react3.useState)(0);
1933
- (0, import_react3.useEffect)(() => props.controller.subscribe(() => update((value) => value + 1)), [props.controller]);
1934
- (0, import_react3.useEffect)(() => {
2561
+ const [open, setOpen] = (0, import_react4.useState)(true);
2562
+ const [snapshot, setSnapshot] = (0, import_react4.useState)();
2563
+ const [, update] = (0, import_react4.useState)(0);
2564
+ (0, import_react4.useEffect)(() => props.controller.subscribe(() => update((value) => value + 1)), [props.controller]);
2565
+ (0, import_react4.useEffect)(() => {
1935
2566
  void loadPartner().then(setSnapshot).catch(() => {
1936
2567
  });
1937
2568
  }, [props.controller.isOpen()]);
@@ -1939,32 +2570,32 @@ function PartnerSidebar(props) {
1939
2570
  props.controller.open(id);
1940
2571
  if (props.wide && window.matchMedia("(max-width: 820px)").matches) props.collapse();
1941
2572
  };
1942
- if (!props.wide) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", { ref, className: "dsh-partner-sidebar is-rail", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: `dsh-partner-rail${props.controller.isOpen() ? " is-active" : ""}`, title: "\u4F19\u4F34", onClick: () => props.controller.toggle(), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 18 }) }) });
1943
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { ref, className: "dsh-partner-sidebar", children: [
1944
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-sidebar-heading", children: [
1945
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: "dsh-partner-sidebar-title", "aria-expanded": open, onClick: () => setOpen((value) => !value), children: [
1946
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "data-open": open, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 14 }) }),
2573
+ if (!props.wide) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("section", { ref, className: "dsh-partner-sidebar is-rail", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: `dsh-partner-rail${props.controller.isOpen() ? " is-active" : ""}`, title: "\u4F19\u4F34", onClick: () => props.controller.toggle(), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 18 }) }) });
2574
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("section", { ref, className: "dsh-partner-sidebar", children: [
2575
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-sidebar-heading", children: [
2576
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: "dsh-partner-sidebar-title", "aria-expanded": open, onClick: () => setOpen((value) => !value), children: [
2577
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { "data-open": open, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 14 }) }),
1947
2578
  "\u4F19\u4F34"
1948
2579
  ] }),
1949
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dsh-partner-sidebar-open", onClick: () => launch(), "aria-label": "\u6253\u5F00\u4F19\u4F34\u9762\u677F", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconPlusOutline16, { size: 16 }) })
2580
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "dsh-partner-sidebar-open", onClick: () => launch(), "aria-label": "\u6253\u5F00\u4F19\u4F34\u9762\u677F", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconPlusOutline16, { size: 16 }) })
1950
2581
  ] }),
1951
- open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-sidebar-list", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: `dsh-partner-sidebar-row${props.controller.isOpen() ? " is-active" : ""}`, onClick: () => launch(), children: [
1952
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dsh-partner-sidebar-symbol", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }) }),
1953
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
1954
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u4F19\u4F34\u9762\u677F" }),
1955
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: snapshot ? `${snapshot.companions.length} \u4F4D\u4F19\u4F34 \xB7 ${snapshot.channels.filter((item) => item.runtimeStatus === "running").length} \u4E2A\u5FAE\u4FE1\u5728\u7EBF` : "\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E\u6E20\u9053" })
2582
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: `dsh-partner-sidebar-list${open ? " is-open" : ""}`, "aria-hidden": !open, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-sidebar-list-inner", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", tabIndex: open ? 0 : -1, className: `dsh-partner-sidebar-row${props.controller.isOpen() ? " is-active" : ""}`, onClick: () => launch(), children: [
2583
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "dsh-partner-sidebar-symbol", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }) }),
2584
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2585
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u4F19\u4F34\u9762\u677F" }),
2586
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: snapshot ? `${snapshot.companions.length} \u4F4D\u4F19\u4F34 \xB7 ${snapshot.channels.filter((item) => item.runtimeStatus === "running").length} \u4E2A\u5FAE\u4FE1\u5728\u7EBF` : "\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E\u6E20\u9053" })
1956
2587
  ] }),
1957
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", { className: snapshot?.channels.some((item) => item.runtimeStatus === "running") ? "is-online" : "" })
1958
- ] }) })
2588
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: snapshot?.channels.some((item) => item.runtimeStatus === "running") ? "is-online" : "" })
2589
+ ] }) }) })
1959
2590
  ] });
1960
2591
  }
1961
2592
  function PartnerWorkspace({ controller }) {
1962
- const [snapshot, setSnapshot] = (0, import_react3.useState)();
1963
- const [selectedId, setSelectedId] = (0, import_react3.useState)(controller.selected());
1964
- const [tab, setTab] = (0, import_react3.useState)("home");
1965
- const [error, setError] = (0, import_react3.useState)();
1966
- const [loading, setLoading] = (0, import_react3.useState)(true);
1967
- const refresh = (0, import_react3.useCallback)(async () => {
2593
+ const [snapshot, setSnapshot] = (0, import_react4.useState)();
2594
+ const [selectedId, setSelectedId] = (0, import_react4.useState)(controller.selected());
2595
+ const [tab, setTab] = (0, import_react4.useState)("home");
2596
+ const [error, setError] = (0, import_react4.useState)();
2597
+ const [loading, setLoading] = (0, import_react4.useState)(true);
2598
+ const refresh = (0, import_react4.useCallback)(async () => {
1968
2599
  try {
1969
2600
  const next = await loadPartner();
1970
2601
  setSnapshot(next);
@@ -1976,10 +2607,10 @@ function PartnerWorkspace({ controller }) {
1976
2607
  setLoading(false);
1977
2608
  }
1978
2609
  }, []);
1979
- (0, import_react3.useEffect)(() => {
2610
+ (0, import_react4.useEffect)(() => {
1980
2611
  void refresh();
1981
2612
  }, [refresh]);
1982
- (0, import_react3.useEffect)(() => controller.subscribe(() => {
2613
+ (0, import_react4.useEffect)(() => controller.subscribe(() => {
1983
2614
  const next = controller.selected();
1984
2615
  if (next) setSelectedId(next);
1985
2616
  }), [controller]);
@@ -2016,77 +2647,77 @@ function PartnerWorkspace({ controller }) {
2016
2647
  setError(message(reason));
2017
2648
  }
2018
2649
  };
2019
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("main", { className: "dsh-partner-workspace", "data-xiaohei-surface": "plugin-workspace", children: [
2020
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", { className: "dsh-partner-topbar", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
2021
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", "data-xiaohei-workspace-close": true, onClick: controller.close, "aria-label": "\u8FD4\u56DE\u4F1A\u8BDD", title: "\u8FD4\u56DE\u4F1A\u8BDD", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconChevronLeftOutline14, { size: 15 }) }),
2022
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 18 }),
2023
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2024
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u4F19\u4F34" }),
2025
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u957F\u671F\u8EAB\u4EFD\u4E0E\u5FAE\u4FE1\u6E20\u9053" })
2650
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("main", { className: "dsh-partner-workspace", children: [
2651
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("header", { className: "dsh-partner-topbar", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
2652
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", "data-xiaohei-workspace-close": true, onClick: controller.close, "aria-label": "\u8FD4\u56DE\u4F1A\u8BDD", title: "\u8FD4\u56DE\u4F1A\u8BDD", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconChevronLeftOutline14, { size: 15 }) }),
2653
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 18 }),
2654
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2655
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u4F19\u4F34" }),
2656
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u957F\u671F\u8EAB\u4EFD\u4E0E\u5FAE\u4FE1\u6E20\u9053" })
2026
2657
  ] })
2027
2658
  ] }) }),
2028
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-grid", children: [
2029
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("aside", { className: "dsh-partner-roster", children: [
2030
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-roster-title", children: [
2031
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2032
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "COMPANIONS" }),
2033
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u4F19\u4F34\u540D\u518C" })
2659
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-grid", children: [
2660
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("aside", { className: "dsh-partner-roster", children: [
2661
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-roster-title", children: [
2662
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2663
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "COMPANIONS" }),
2664
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u4F19\u4F34\u540D\u518C" })
2034
2665
  ] }),
2035
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => {
2666
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => {
2036
2667
  void create();
2037
- }, "aria-label": "\u65B0\u5EFA\u4F19\u4F34", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconPlusOutline16, { size: 16 }) })
2668
+ }, "aria-label": "\u65B0\u5EFA\u4F19\u4F34", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconPlusOutline16, { size: 16 }) })
2038
2669
  ] }),
2039
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-roster-list", children: snapshot?.companions.map((companion) => {
2670
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-roster-list", children: snapshot?.companions.map((companion) => {
2040
2671
  const channel = snapshot.channels.find((item) => item.companionId === companion.id);
2041
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: selectedId === companion.id ? "is-active" : "", onClick: () => {
2672
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: selectedId === companion.id ? "is-active" : "", onClick: () => {
2042
2673
  setSelectedId(companion.id);
2043
2674
  setTab("home");
2044
2675
  }, children: [
2045
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Avatar, { name: companion.name }),
2046
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2047
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: companion.name }),
2048
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: companion.role })
2676
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Avatar, { name: companion.name }),
2677
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2678
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: companion.name }),
2679
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: companion.role })
2049
2680
  ] }),
2050
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", { className: channel?.runtimeStatus === "running" ? "is-online" : "", title: channel ? channel.runtimeStatus : "\u672A\u8FDE\u63A5\u6E20\u9053" })
2681
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: channel?.runtimeStatus === "running" ? "is-online" : "", title: channel ? channel.runtimeStatus : "\u672A\u8FDE\u63A5\u6E20\u9053" })
2051
2682
  ] }, companion.id);
2052
2683
  }) }),
2053
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-roster-note", children: [
2054
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconLinkOutline16, { size: 16 }),
2055
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2056
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u8EAB\u4EFD\u4E0E\u6E20\u9053\u5206\u79BB" }),
2057
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u5FAE\u4FE1\u53EA\u8D1F\u8D23\u6536\u53D1\uFF0C\u6743\u9650\u4ECD\u7531 DSH \u5DE5\u5177\u51B3\u5B9A\u3002" })
2684
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-roster-note", children: [
2685
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconLinkOutline16, { size: 16 }),
2686
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2687
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u8EAB\u4EFD\u4E0E\u6E20\u9053\u5206\u79BB" }),
2688
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u5FAE\u4FE1\u53EA\u8D1F\u8D23\u6536\u53D1\uFF0C\u6743\u9650\u4ECD\u7531 DSH \u5DE5\u5177\u51B3\u5B9A\u3002" })
2058
2689
  ] })
2059
2690
  ] })
2060
2691
  ] }),
2061
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-stage", children: [
2062
- loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u6B63\u5728\u8BFB\u53D6\u4F19\u4F34\u2026" }) : selected === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u521B\u5EFA\u7B2C\u4E00\u4E2A\u4F19\u4F34", detail: "\u4F19\u4F34\u4F1A\u4FDD\u5B58\u72EC\u7ACB\u8EAB\u4EFD\u3001\u80FD\u529B\u548C\u5FAE\u4FE1\u4F1A\u8BDD\u3002", action: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: () => {
2692
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("section", { className: "dsh-partner-stage", children: [
2693
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u6B63\u5728\u8BFB\u53D6\u4F19\u4F34\u2026" }) : selected === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u521B\u5EFA\u7B2C\u4E00\u4E2A\u4F19\u4F34", detail: "\u4F19\u4F34\u4F1A\u4FDD\u5B58\u72EC\u7ACB\u8EAB\u4EFD\u3001\u80FD\u529B\u548C\u5FAE\u4FE1\u4F1A\u8BDD\u3002", action: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { onClick: () => {
2063
2694
  void create();
2064
- }, children: "\u65B0\u5EFA\u4F19\u4F34" }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
2065
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-identity", children: [
2066
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Avatar, { name: selected.name }),
2067
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2068
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "ACTIVE COMPANION" }),
2069
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { children: selected.name }),
2070
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: selected.description || selected.role })
2695
+ }, children: "\u65B0\u5EFA\u4F19\u4F34" }) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
2696
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-identity", children: [
2697
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Avatar, { name: selected.name }),
2698
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2699
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "ACTIVE COMPANION" }),
2700
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { children: selected.name }),
2701
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: selected.description || selected.role })
2071
2702
  ] }),
2072
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Status, { channel: snapshot?.channels.find((item) => item.companionId === selected.id) })
2703
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Status, { channel: snapshot?.channels.find((item) => item.companionId === selected.id) })
2073
2704
  ] }),
2074
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", { className: "dsh-partner-tabs", "aria-label": "\u4F19\u4F34\u914D\u7F6E", children: [
2075
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TabButton, { active: tab === "home", onClick: () => setTab("home"), icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }), children: "\u603B\u89C8" }),
2076
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TabButton, { active: tab === "identity", onClick: () => setTab("identity"), icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconEditOutline16, { size: 16 }), children: "\u8EAB\u4EFD" }),
2077
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TabButton, { active: tab === "capabilities", onClick: () => setTab("capabilities"), icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }), children: "\u80FD\u529B" }),
2078
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TabButton, { active: tab === "weixin", onClick: () => setTab("weixin"), icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeixinGlyph, {}), children: "\u5FAE\u4FE1" }),
2079
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TabButton, { active: tab === "memory", onClick: () => setTab("memory"), icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 16 }), children: "\u8BB0\u5FC6" })
2705
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("nav", { className: "dsh-partner-tabs", "aria-label": "\u4F19\u4F34\u914D\u7F6E", children: [
2706
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TabButton, { active: tab === "home", onClick: () => setTab("home"), icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }), children: "\u603B\u89C8" }),
2707
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TabButton, { active: tab === "identity", onClick: () => setTab("identity"), icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconEditOutline16, { size: 16 }), children: "\u8EAB\u4EFD" }),
2708
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TabButton, { active: tab === "capabilities", onClick: () => setTab("capabilities"), icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }), children: "\u80FD\u529B" }),
2709
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TabButton, { active: tab === "weixin", onClick: () => setTab("weixin"), icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(WeixinGlyph, {}), children: "\u5FAE\u4FE1" }),
2710
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TabButton, { active: tab === "memory", onClick: () => setTab("memory"), icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 16 }), children: "\u8BB0\u5FC6" })
2080
2711
  ] }),
2081
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-stage-scroll", children: [
2082
- tab === "home" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HomePanel, { companion: selected, snapshot, navigate: setTab, openSession, renewSession }),
2083
- tab === "identity" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IdentityEditor, { companion: selected, count: snapshot?.companions.length ?? 1, onChanged: refresh }),
2084
- tab === "capabilities" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CapabilityEditor, { companion: selected, presets: snapshot?.presets ?? [], onChanged: refresh }),
2085
- tab === "weixin" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeixinPanel, { companion: selected, snapshot, onChanged: refresh }),
2086
- tab === "memory" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MemoryPanel, { companion: selected, snapshot, openSession, renewSession, onChanged: refresh })
2712
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-stage-scroll", children: [
2713
+ tab === "home" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(HomePanel, { companion: selected, snapshot, navigate: setTab, openSession, renewSession }),
2714
+ tab === "identity" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(IdentityEditor, { companion: selected, count: snapshot?.companions.length ?? 1, onChanged: refresh }),
2715
+ tab === "capabilities" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CapabilityEditor, { companion: selected, presets: snapshot?.presets ?? [], onChanged: refresh }),
2716
+ tab === "weixin" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(WeixinPanel, { companion: selected, snapshot, onChanged: refresh }),
2717
+ tab === "memory" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MemoryPanel, { companion: selected, snapshot, openSession, renewSession, onChanged: refresh })
2087
2718
  ] })
2088
2719
  ] }),
2089
- error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-error", role: "alert", children: error })
2720
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-error", role: "alert", children: error })
2090
2721
  ] })
2091
2722
  ] })
2092
2723
  ] });
@@ -2099,76 +2730,76 @@ function HomePanel({ companion, snapshot, navigate, openSession, renewSession })
2099
2730
  const capabilities = companion.capabilities.map((item) => ({ knowledge: "\u77E5\u8BC6\u5E93", skills: "\u6280\u80FD", ssh: "SSH", git: "Git" })[item]);
2100
2731
  const online = channel?.runtimeStatus === "running";
2101
2732
  const latestSession = sessions.reduce((latest, item) => latest === void 0 || item.lastMessageAt > latest.lastMessageAt ? item : latest, void 0);
2102
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-home", children: [
2103
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "dsh-partner-home-heading", children: [
2104
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2105
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u5DE5\u4F5C\u53F0" }),
2106
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: online ? `${companion.name} \u6B63\u5728\u5FAE\u4FE1\u5F85\u547D` : `\u8FDE\u63A5 ${companion.name} \u7684\u7B2C\u4E00\u6761\u6E20\u9053` })
2733
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-home", children: [
2734
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { className: "dsh-partner-home-heading", children: [
2735
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2736
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u5DE5\u4F5C\u53F0" }),
2737
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { children: online ? `${companion.name} \u6B63\u5728\u5FAE\u4FE1\u5F85\u547D` : `\u8FDE\u63A5 ${companion.name} \u7684\u7B2C\u4E00\u6761\u6E20\u9053` })
2107
2738
  ] }),
2108
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: online ? "\u6D88\u606F\u3001\u6388\u6743\u4E0E\u4E0A\u4E0B\u6587\u8FB9\u754C\u90FD\u5728\u8FD9\u91CC\u6C47\u603B\u3002" : "\u4F19\u4F34\u8EAB\u4EFD\u5DF2\u7ECF\u5C31\u7EEA\uFF0C\u8FDE\u63A5\u5FAE\u4FE1\u540E\u5373\u53EF\u5F00\u59CB\u6301\u7EED\u5DE5\u4F5C\u3002" })
2739
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: online ? "\u6D88\u606F\u3001\u6388\u6743\u4E0E\u4E0A\u4E0B\u6587\u8FB9\u754C\u90FD\u5728\u8FD9\u91CC\u6C47\u603B\u3002" : "\u4F19\u4F34\u8EAB\u4EFD\u5DF2\u7ECF\u5C31\u7EEA\uFF0C\u8FDE\u63A5\u5FAE\u4FE1\u540E\u5373\u53EF\u5F00\u59CB\u6301\u7EED\u5DE5\u4F5C\u3002" })
2109
2740
  ] }),
2110
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: `dsh-partner-home-channel${online ? " is-online" : ""}`, children: [
2111
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-home-route", "aria-hidden": "true", children: [
2112
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Avatar, { name: companion.name }),
2113
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dsh-partner-route-line", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}) }),
2114
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dsh-partner-route-weixin", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeixinGlyph, { large: true }) })
2741
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: `dsh-partner-home-channel${online ? " is-online" : ""}`, borderRadius: 20, distortionScale: -16, saturation: 1.08, children: [
2742
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-home-route", "aria-hidden": "true", children: [
2743
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Avatar, { name: companion.name }),
2744
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "dsh-partner-route-line", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}) }),
2745
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "dsh-partner-route-weixin", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(WeixinGlyph, { large: true }) })
2115
2746
  ] }),
2116
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-home-channel-copy", children: [
2117
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dsh-partner-home-kicker", children: [
2118
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}),
2747
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-home-channel-copy", children: [
2748
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "dsh-partner-home-kicker", children: [
2749
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}),
2119
2750
  "\u4E3B\u8981\u6E20\u9053 \xB7 \u5FAE\u4FE1"
2120
2751
  ] }),
2121
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { children: !channel ? "\u7B49\u5F85\u626B\u7801\u8FDE\u63A5" : online ? "\u8FDE\u63A5\u6B63\u5E38\uFF0C\u6B63\u5728\u63A5\u6536\u6D88\u606F" : channel.runtimeStatus === "error" ? "\u6E20\u9053\u8FDE\u63A5\u9700\u8981\u5904\u7406" : "\u6E20\u9053\u5F53\u524D\u5DF2\u505C\u7528" }),
2122
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: !channel ? "\u901A\u8FC7\u5FAE\u4FE1 iLink Bot \u63A5\u5165\u3002\u51ED\u636E\u53EA\u8FDB\u5165 DSH \u51ED\u636E\u5E93\uFF0C\u8054\u7CFB\u4EBA\u9996\u6B21\u53D1\u6D88\u606F\u4ECD\u9700\u4F60\u7684\u6279\u51C6\u3002" : online ? "\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u62E5\u6709\u72EC\u7ACB DSH \u4F1A\u8BDD\uFF0C\u4F19\u4F34\u8EAB\u4EFD\u4E00\u81F4\uFF0C\u4F46\u4E0A\u4E0B\u6587\u4E0D\u4F1A\u4E92\u76F8\u6DF7\u5408\u3002" : channel.lastError || "\u6E20\u9053\u914D\u7F6E\u4ECD\u7136\u4FDD\u7559\uFF0C\u53EF\u4EE5\u968F\u65F6\u91CD\u65B0\u542F\u7528\u3002" }),
2123
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-home-channel-actions", children: [
2124
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "is-primary", onClick: () => navigate("weixin"), children: !channel ? "\u8FDE\u63A5\u5FAE\u4FE1" : pending > 0 ? `\u5904\u7406 ${pending} \u4E2A\u8BF7\u6C42` : "\u7BA1\u7406\u6E20\u9053" }),
2125
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: !channel ? "\u626B\u7801\u5B8C\u6210\uFF0C\u65E0\u9700\u7C98\u8D34 Token" : `${approved} \u4F4D\u8054\u7CFB\u4EBA \xB7 ${sessions.length} \u4E2A\u72EC\u7ACB\u4F1A\u8BDD` })
2752
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { children: !channel ? "\u7B49\u5F85\u626B\u7801\u8FDE\u63A5" : online ? "\u8FDE\u63A5\u6B63\u5E38\uFF0C\u6B63\u5728\u63A5\u6536\u6D88\u606F" : channel.runtimeStatus === "error" ? "\u6E20\u9053\u8FDE\u63A5\u9700\u8981\u5904\u7406" : "\u6E20\u9053\u5F53\u524D\u5DF2\u505C\u7528" }),
2753
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: !channel ? "\u901A\u8FC7\u5FAE\u4FE1 iLink Bot \u63A5\u5165\u3002\u51ED\u636E\u53EA\u8FDB\u5165 DSH \u51ED\u636E\u5E93\uFF0C\u8054\u7CFB\u4EBA\u9996\u6B21\u53D1\u6D88\u606F\u4ECD\u9700\u4F60\u7684\u6279\u51C6\u3002" : online ? "\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u62E5\u6709\u72EC\u7ACB DSH \u4F1A\u8BDD\uFF0C\u4F19\u4F34\u8EAB\u4EFD\u4E00\u81F4\uFF0C\u4F46\u4E0A\u4E0B\u6587\u4E0D\u4F1A\u4E92\u76F8\u6DF7\u5408\u3002" : channel.lastError || "\u6E20\u9053\u914D\u7F6E\u4ECD\u7136\u4FDD\u7559\uFF0C\u53EF\u4EE5\u968F\u65F6\u91CD\u65B0\u542F\u7528\u3002" }),
2754
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-home-channel-actions", children: [
2755
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "is-primary", onClick: () => navigate("weixin"), children: !channel ? "\u8FDE\u63A5\u5FAE\u4FE1" : pending > 0 ? `\u5904\u7406 ${pending} \u4E2A\u8BF7\u6C42` : "\u7BA1\u7406\u6E20\u9053" }),
2756
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: !channel ? "\u626B\u7801\u5B8C\u6210\uFF0C\u65E0\u9700\u7C98\u8D34 Token" : `${approved} \u4F4D\u8054\u7CFB\u4EBA \xB7 ${sessions.length} \u4E2A\u72EC\u7ACB\u4F1A\u8BDD` })
2126
2757
  ] })
2127
2758
  ] })
2128
2759
  ] }),
2129
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-home-details", children: [
2130
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-home-profile", children: [
2131
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
2132
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconUserOutline16, { size: 16 }) }),
2133
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
2134
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u4F19\u4F34\u5E95\u7A3F" }),
2135
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: companion.role })
2760
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-home-details", children: [
2761
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "dsh-partner-home-profile", borderRadius: 15, distortionScale: -11, saturation: 1.06, children: [
2762
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
2763
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconUserOutline16, { size: 16 }) }),
2764
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
2765
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u4F19\u4F34\u5E95\u7A3F" }),
2766
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: companion.role })
2136
2767
  ] }),
2137
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => navigate("identity"), children: "\u7F16\u8F91" })
2768
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => navigate("identity"), children: "\u7F16\u8F91" })
2138
2769
  ] }),
2139
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("blockquote", { children: companion.instructions || companion.description || "\u5C1A\u672A\u8BBE\u7F6E\u957F\u671F\u884C\u4E3A\u51C6\u5219\u3002" })
2770
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("blockquote", { children: companion.instructions || companion.description || "\u5C1A\u672A\u8BBE\u7F6E\u957F\u671F\u884C\u4E3A\u51C6\u5219\u3002" })
2140
2771
  ] }),
2141
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-home-runtime", children: [
2142
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
2143
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }) }),
2144
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
2145
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u8FD0\u884C\u80FD\u529B" }),
2146
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: companion.presetId || "DSH \u9ED8\u8BA4 Preset" })
2772
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "dsh-partner-home-runtime", borderRadius: 15, distortionScale: -11, saturation: 1.06, children: [
2773
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
2774
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 16 }) }),
2775
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
2776
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u8FD0\u884C\u80FD\u529B" }),
2777
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: companion.presetId || "DSH \u9ED8\u8BA4 Preset" })
2147
2778
  ] }),
2148
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => navigate("capabilities"), children: "\u8C03\u6574" })
2779
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => navigate("capabilities"), children: "\u8C03\u6574" })
2149
2780
  ] }),
2150
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-home-capability-list", children: capabilities.length ? capabilities.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("em", { children: item }, item)) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u5C1A\u672A\u58F0\u660E\u80FD\u529B\u8303\u56F4" }) })
2781
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-home-capability-list", children: capabilities.length ? capabilities.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("em", { children: item }, item)) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u5C1A\u672A\u58F0\u660E\u80FD\u529B\u8303\u56F4" }) })
2151
2782
  ] }),
2152
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-home-continuity", children: [
2153
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
2154
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 16 }) }),
2155
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
2156
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u4F1A\u8BDD\u8FDE\u7EED\u6027" }),
2157
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: sessions.length ? `${sessions.length} \u4E2A\u5171\u4EAB\u4F1A\u8BDD` : "\u7B49\u5F85\u7B2C\u4E00\u6761\u6D88\u606F" })
2783
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "dsh-partner-home-continuity", borderRadius: 15, distortionScale: -11, saturation: 1.06, children: [
2784
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
2785
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 16 }) }),
2786
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
2787
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u4F1A\u8BDD\u8FDE\u7EED\u6027" }),
2788
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: sessions.length ? `${sessions.length} \u4E2A\u5171\u4EAB\u4F1A\u8BDD` : "\u7B49\u5F85\u7B2C\u4E00\u6761\u6D88\u606F" })
2158
2789
  ] }),
2159
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => latestSession === void 0 ? navigate("memory") : latestSession.archived ? void renewSession(latestSession.id) : void openSession(latestSession.id, latestSession.sessionId), children: latestSession === void 0 ? "\u67E5\u770B" : latestSession.archived ? "\u5F00\u59CB\u65B0\u4F1A\u8BDD" : "\u6253\u5F00\u4F1A\u8BDD" })
2790
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => latestSession === void 0 ? navigate("memory") : latestSession.archived ? void renewSession(latestSession.id) : void openSession(latestSession.id, latestSession.sessionId), children: latestSession === void 0 ? "\u67E5\u770B" : latestSession.archived ? "\u5F00\u59CB\u65B0\u4F1A\u8BDD" : "\u6253\u5F00\u4F1A\u8BDD" })
2160
2791
  ] }),
2161
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: sessions.length ? `\u6700\u8FD1\u6D3B\u52A8\u4E8E ${relativeTime(Math.max(...sessions.map((item) => item.lastMessageAt)))}` : "\u5FAE\u4FE1\u8054\u7CFB\u4EBA\u901A\u8FC7\u914D\u5BF9\u540E\uFF0C\u5C06\u5728\u8FD9\u91CC\u5EFA\u7ACB\u72EC\u7ACB\u4E0A\u4E0B\u6587\u3002" })
2792
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: sessions.length ? `\u6700\u8FD1\u6D3B\u52A8\u4E8E ${relativeTime(Math.max(...sessions.map((item) => item.lastMessageAt)))}` : "\u5FAE\u4FE1\u8054\u7CFB\u4EBA\u901A\u8FC7\u914D\u5BF9\u540E\uFF0C\u5C06\u5728\u8FD9\u91CC\u5EFA\u7ACB\u72EC\u7ACB\u4E0A\u4E0B\u6587\u3002" })
2162
2793
  ] })
2163
2794
  ] })
2164
2795
  ] });
2165
2796
  }
2166
2797
  function IdentityEditor({ companion, count, onChanged }) {
2167
- const [form, setForm] = (0, import_react3.useState)(() => companionDraft(companion));
2168
- const [saving, setSaving] = (0, import_react3.useState)(false);
2169
- const [saved, setSaved] = (0, import_react3.useState)(false);
2170
- const [error, setError] = (0, import_react3.useState)();
2171
- (0, import_react3.useEffect)(() => {
2798
+ const [form, setForm] = (0, import_react4.useState)(() => companionDraft(companion));
2799
+ const [saving, setSaving] = (0, import_react4.useState)(false);
2800
+ const [saved, setSaved] = (0, import_react4.useState)(false);
2801
+ const [error, setError] = (0, import_react4.useState)();
2802
+ (0, import_react4.useEffect)(() => {
2172
2803
  setForm(companionDraft(companion));
2173
2804
  setSaved(false);
2174
2805
  }, [companion.id, companion.updatedAt]);
@@ -2195,45 +2826,45 @@ function IdentityEditor({ companion, count, onChanged }) {
2195
2826
  setError(message(reason));
2196
2827
  }
2197
2828
  };
2198
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", { className: "dsh-partner-form is-identity", onSubmit: (event) => {
2829
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("form", { className: "dsh-partner-form is-identity", onSubmit: (event) => {
2199
2830
  void submit(event);
2200
2831
  }, children: [
2201
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Section, { eyebrow: "IDENTITY", title: "\u5DE5\u4F5C\u8EAB\u4EFD", detail: "\u5B83\u4E0D\u662F\u4E00\u6B21\u5BF9\u8BDD\u7684\u63D0\u793A\u8BCD\uFF0C\u800C\u662F\u8FD9\u4E2A\u4F19\u4F34\u5728\u684C\u9762\u548C\u5FAE\u4FE1\u4E2D\u7684\u957F\u671F\u884C\u4E3A\u57FA\u7EBF\u3002" }),
2202
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-fields two", children: [
2203
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u540D\u5B57", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { required: true, maxLength: 60, value: form.name, onChange: (event) => setForm({ ...form, name: event.target.value }) }) }),
2204
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u89D2\u8272", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { required: true, maxLength: 120, value: form.role, onChange: (event) => setForm({ ...form, role: event.target.value }) }) })
2832
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { eyebrow: "IDENTITY", title: "\u5DE5\u4F5C\u8EAB\u4EFD", detail: "\u5B83\u4E0D\u662F\u4E00\u6B21\u5BF9\u8BDD\u7684\u63D0\u793A\u8BCD\uFF0C\u800C\u662F\u8FD9\u4E2A\u4F19\u4F34\u5728\u684C\u9762\u548C\u5FAE\u4FE1\u4E2D\u7684\u957F\u671F\u884C\u4E3A\u57FA\u7EBF\u3002" }),
2833
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-fields two", children: [
2834
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u540D\u5B57", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("input", { required: true, maxLength: 60, value: form.name, onChange: (event) => setForm({ ...form, name: event.target.value }) }) }),
2835
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u89D2\u8272", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("input", { required: true, maxLength: 120, value: form.role, onChange: (event) => setForm({ ...form, role: event.target.value }) }) })
2205
2836
  ] }),
2206
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u4E00\u53E5\u8BDD\u5B9A\u4F4D", hint: "\u7528\u4E8E\u540D\u518C\u8BC6\u522B\uFF0C\u4E0D\u4F1A\u66FF\u4EE3\u5B8C\u6574\u884C\u4E3A\u51C6\u5219\u3002", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", { rows: 2, maxLength: 500, value: form.description, onChange: (event) => setForm({ ...form, description: event.target.value }) }) }),
2207
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u957F\u671F\u884C\u4E3A\u51C6\u5219", hint: "\u5EFA\u8BAE\u5199\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u4E0E\u8FB9\u754C\uFF1B\u6E20\u9053\u3001\u5DE5\u5177\u548C\u6388\u6743\u7531\u7CFB\u7EDF\u5355\u72EC\u63A7\u5236\u3002", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", { rows: 9, maxLength: 12e3, value: form.instructions, onChange: (event) => setForm({ ...form, instructions: event.target.value }) }) }),
2208
- error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-inline-error", children: error }),
2209
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-form-actions", children: [
2210
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: saved && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
2211
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 14 }),
2837
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u4E00\u53E5\u8BDD\u5B9A\u4F4D", hint: "\u7528\u4E8E\u540D\u518C\u8BC6\u522B\uFF0C\u4E0D\u4F1A\u66FF\u4EE3\u5B8C\u6574\u884C\u4E3A\u51C6\u5219\u3002", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("textarea", { rows: 2, maxLength: 500, value: form.description, onChange: (event) => setForm({ ...form, description: event.target.value }) }) }),
2838
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u957F\u671F\u884C\u4E3A\u51C6\u5219", hint: "\u5EFA\u8BAE\u5199\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u4E0E\u8FB9\u754C\uFF1B\u6E20\u9053\u3001\u5DE5\u5177\u548C\u6388\u6743\u7531\u7CFB\u7EDF\u5355\u72EC\u63A7\u5236\u3002", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("textarea", { rows: 9, maxLength: 12e3, value: form.instructions, onChange: (event) => setForm({ ...form, instructions: event.target.value }) }) }),
2839
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-inline-error", children: error }),
2840
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-form-actions", children: [
2841
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: saved && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
2842
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 14 }),
2212
2843
  "\u5DF2\u4FDD\u5B58\uFF0C\u540E\u7EED\u5FAE\u4FE1\u6D88\u606F\u5C06\u4F7F\u7528\u65B0\u8EAB\u4EFD"
2213
2844
  ] }) }),
2214
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { disabled: saving, children: saving ? "\u6B63\u5728\u4FDD\u5B58\u2026" : "\u4FDD\u5B58\u8EAB\u4EFD" })
2845
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { disabled: saving, children: saving ? "\u6B63\u5728\u4FDD\u5B58\u2026" : "\u4FDD\u5B58\u8EAB\u4EFD" })
2215
2846
  ] }),
2216
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-identity-danger", children: [
2217
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2218
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u5220\u9664\u4F19\u4F34" }),
2219
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u5FC5\u987B\u5148\u79FB\u9664\u5DF2\u7ED1\u5B9A\u5FAE\u4FE1\u6E20\u9053\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u628A\u8054\u7CFB\u4EBA\u8F6C\u4EA4\u7ED9\u5176\u4ED6\u4F19\u4F34\u3002" })
2847
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-identity-danger", children: [
2848
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2849
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u5220\u9664\u4F19\u4F34" }),
2850
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u5FC5\u987B\u5148\u79FB\u9664\u5DF2\u7ED1\u5B9A\u5FAE\u4FE1\u6E20\u9053\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u628A\u8054\u7CFB\u4EBA\u8F6C\u4EA4\u7ED9\u5176\u4ED6\u4F19\u4F34\u3002" })
2220
2851
  ] }),
2221
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", disabled: count <= 1, onClick: () => {
2852
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", disabled: count <= 1, onClick: () => {
2222
2853
  void remove();
2223
2854
  }, children: [
2224
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconTrashOutline16, { size: 16 }),
2855
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconTrashOutline16, { size: 16 }),
2225
2856
  "\u5220\u9664"
2226
2857
  ] })
2227
2858
  ] })
2228
2859
  ] });
2229
2860
  }
2230
2861
  function CapabilityEditor({ companion, presets, onChanged }) {
2231
- const [form, setForm] = (0, import_react3.useState)(() => companionDraft(companion));
2232
- const [modelCatalog, setModelCatalog] = (0, import_react3.useState)();
2233
- const [saving, setSaving] = (0, import_react3.useState)(false);
2234
- const [error, setError] = (0, import_react3.useState)();
2235
- (0, import_react3.useEffect)(() => setForm(companionDraft(companion)), [companion.id, companion.updatedAt]);
2236
- (0, import_react3.useEffect)(() => {
2862
+ const [form, setForm] = (0, import_react4.useState)(() => companionDraft(companion));
2863
+ const [modelCatalog, setModelCatalog] = (0, import_react4.useState)();
2864
+ const [saving, setSaving] = (0, import_react4.useState)(false);
2865
+ const [error, setError] = (0, import_react4.useState)();
2866
+ (0, import_react4.useEffect)(() => setForm(companionDraft(companion)), [companion.id, companion.updatedAt]);
2867
+ (0, import_react4.useEffect)(() => {
2237
2868
  void api("/models").then(setModelCatalog).catch((reason) => setError(message(reason)));
2238
2869
  }, []);
2239
2870
  const toggle = (capability) => setForm((current) => ({ ...current, capabilities: current.capabilities.includes(capability) ? current.capabilities.filter((item) => item !== capability) : [...current.capabilities, capability] }));
@@ -2258,41 +2889,41 @@ function CapabilityEditor({ companion, presets, onChanged }) {
2258
2889
  const selectedProvider = form.provider || modelCatalog?.defaultSelection.provider || "";
2259
2890
  const modelOptions = modelCatalog?.providers.find((item) => item.id === selectedProvider)?.models ?? [];
2260
2891
  const currentModelMissing = Boolean(form.model) && !modelOptions.some((item) => item.id === form.model);
2261
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-form is-capabilities", children: [
2262
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Section, { eyebrow: "COMPOSITION", title: "\u80FD\u529B\u7EC4\u5408", detail: "\u4F19\u4F34\u58F0\u660E\u610F\u56FE\u8303\u56F4\uFF1B\u771F\u6B63\u53EF\u8C03\u7528\u7684\u5DE5\u5177\u4ECD\u6765\u81EA\u6240\u9009 Agent Preset\uFF0C\u5E76\u7EE7\u7EED\u6267\u884C\u5404\u63D2\u4EF6\u6743\u9650\u3002" }),
2263
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "Agent Preset", hint: "\u51B3\u5B9A\u8FD9\u4E2A\u4F19\u4F34\u5B9E\u9645\u52A0\u8F7D\u54EA\u4E9B\u5DE5\u5177\u3001\u6280\u80FD\u548C\u7CFB\u7EDF\u63D0\u793A\u3002", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: form.presetId, onChange: (event) => setForm({ ...form, presetId: event.target.value }), children: [
2264
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "", children: "\u8DDF\u968F DSH \u9ED8\u8BA4 Preset" }),
2265
- presets.filter((item) => !item.broken).map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: item.id, children: item.name }, item.id))
2892
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-form is-capabilities", children: [
2893
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { eyebrow: "COMPOSITION", title: "\u80FD\u529B\u7EC4\u5408", detail: "\u4F19\u4F34\u58F0\u660E\u610F\u56FE\u8303\u56F4\uFF1B\u771F\u6B63\u53EF\u8C03\u7528\u7684\u5DE5\u5177\u4ECD\u6765\u81EA\u6240\u9009 Agent Preset\uFF0C\u5E76\u7EE7\u7EED\u6267\u884C\u5404\u63D2\u4EF6\u6743\u9650\u3002" }),
2894
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Agent Preset", hint: "\u51B3\u5B9A\u8FD9\u4E2A\u4F19\u4F34\u5B9E\u9645\u52A0\u8F7D\u54EA\u4E9B\u5DE5\u5177\u3001\u6280\u80FD\u548C\u7CFB\u7EDF\u63D0\u793A\u3002", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: form.presetId, onChange: (event) => setForm({ ...form, presetId: event.target.value }), children: [
2895
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: "", children: "\u8DDF\u968F DSH \u9ED8\u8BA4 Preset" }),
2896
+ presets.filter((item) => !item.broken).map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: item.id, children: item.name }, item.id))
2266
2897
  ] }) }),
2267
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-capabilities", children: choices.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: form.capabilities.includes(choice.id) ? "is-active" : "", onClick: () => toggle(choice.id), children: [
2268
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: form.capabilities.includes(choice.id) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 14 }) }),
2269
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: choice.title }),
2270
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: choice.detail })
2898
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-capabilities", children: choices.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "button", interactive: true, type: "button", className: form.capabilities.includes(choice.id) ? "is-active" : "", borderRadius: 12, distortionScale: -9, saturation: 1.05, "aria-pressed": form.capabilities.includes(choice.id), onClick: () => toggle(choice.id), children: [
2899
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: form.capabilities.includes(choice.id) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 14 }) }),
2900
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: choice.title }),
2901
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: choice.detail })
2271
2902
  ] }, choice.id)) }),
2272
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-fields two", children: [
2273
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u6A21\u578B\u63D0\u4F9B\u65B9", hint: "\u6A21\u578B\u76EE\u5F55\u6765\u81EA\u5F53\u524D\u5BA2\u6237\u7AEF", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: form.provider, onChange: (event) => setForm({ ...form, provider: event.target.value, model: "" }), children: [
2274
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: "", children: [
2903
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-fields two", children: [
2904
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u6A21\u578B\u63D0\u4F9B\u65B9", hint: "\u6A21\u578B\u76EE\u5F55\u6765\u81EA\u5F53\u524D\u5BA2\u6237\u7AEF", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: form.provider, onChange: (event) => setForm({ ...form, provider: event.target.value, model: "" }), children: [
2905
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: "", children: [
2275
2906
  "\u8DDF\u968F DSH \u9ED8\u8BA4 \xB7 ",
2276
2907
  modelCatalog?.defaultSelection.provider || "\u6B63\u5728\u8BFB\u53D6"
2277
2908
  ] }),
2278
- modelCatalog?.providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: provider.id, children: provider.name || provider.id }, provider.id))
2909
+ modelCatalog?.providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: provider.id, children: provider.name || provider.id }, provider.id))
2279
2910
  ] }) }),
2280
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u6A21\u578B", hint: "\u968F\u63D0\u4F9B\u65B9\u8054\u52A8", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: form.model, onChange: (event) => setForm({ ...form, model: event.target.value }), children: [
2281
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: "", children: [
2911
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u6A21\u578B", hint: "\u968F\u63D0\u4F9B\u65B9\u8054\u52A8", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: form.model, onChange: (event) => setForm({ ...form, model: event.target.value }), children: [
2912
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: "", children: [
2282
2913
  "\u8DDF\u968F DSH \u9ED8\u8BA4 \xB7 ",
2283
2914
  modelCatalog?.defaultSelection.model || "\u6B63\u5728\u8BFB\u53D6"
2284
2915
  ] }),
2285
- currentModelMissing && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: form.model, children: [
2916
+ currentModelMissing && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: form.model, children: [
2286
2917
  "\u5F53\u524D\u914D\u7F6E \xB7 ",
2287
2918
  form.model
2288
2919
  ] }),
2289
- modelOptions.map((model) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: model.id, children: model.name || model.id }, model.id))
2920
+ modelOptions.map((model) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: model.id, children: model.name || model.id }, model.id))
2290
2921
  ] }) })
2291
2922
  ] }),
2292
- error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-inline-error", children: error }),
2293
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-form-actions", children: [
2294
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {}),
2295
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: saving, onClick: () => {
2923
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-inline-error", children: error }),
2924
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-form-actions", children: [
2925
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", {}),
2926
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: saving, onClick: () => {
2296
2927
  void save();
2297
2928
  }, children: saving ? "\u6B63\u5728\u5E94\u7528\u2026" : "\u5E94\u7528\u80FD\u529B\u7EC4\u5408" })
2298
2929
  ] })
@@ -2300,10 +2931,10 @@ function CapabilityEditor({ companion, presets, onChanged }) {
2300
2931
  }
2301
2932
  function WeixinPanel({ companion, snapshot, onChanged }) {
2302
2933
  const channel = snapshot.channels.find((item) => item.companionId === companion.id);
2303
- const [login, setLogin] = (0, import_react3.useState)();
2304
- const [busy, setBusy] = (0, import_react3.useState)(false);
2305
- const [error, setError] = (0, import_react3.useState)();
2306
- (0, import_react3.useEffect)(() => {
2934
+ const [login, setLogin] = (0, import_react4.useState)();
2935
+ const [busy, setBusy] = (0, import_react4.useState)(false);
2936
+ const [error, setError] = (0, import_react4.useState)();
2937
+ (0, import_react4.useEffect)(() => {
2307
2938
  if (!login || login.phase === "confirmed" || login.phase === "expired" || login.phase === "error") return;
2308
2939
  const timer = window.setInterval(() => {
2309
2940
  void api(`/weixin/login/${login.id}`).then(async (result) => {
@@ -2349,121 +2980,123 @@ function WeixinPanel({ companion, snapshot, onChanged }) {
2349
2980
  setError(message(reason));
2350
2981
  }
2351
2982
  };
2352
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-form is-channel", children: [
2353
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Section, { eyebrow: "PRIMARY CHANNEL", title: "\u5FAE\u4FE1\u6E20\u9053", detail: "\u4F7F\u7528\u5FAE\u4FE1 iLink Bot \u626B\u7801\u63A5\u5165\u3002\u6BCF\u4E2A\u673A\u5668\u4EBA\u53EA\u7ED1\u5B9A\u4E00\u4E2A\u4F19\u4F34\uFF0C\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u4FDD\u6301\u72EC\u7ACB DSH \u4F1A\u8BDD\u3002" }),
2354
- !channel && !login && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-weixin-connect", children: [
2355
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-weixin-mark", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeixinGlyph, { large: true }) }),
2356
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2357
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { children: [
2983
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-form is-channel", children: [
2984
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { eyebrow: "PRIMARY CHANNEL", title: "\u5FAE\u4FE1\u6E20\u9053", detail: "\u4F7F\u7528\u5FAE\u4FE1 iLink Bot \u626B\u7801\u63A5\u5165\u3002\u6BCF\u4E2A\u673A\u5668\u4EBA\u53EA\u7ED1\u5B9A\u4E00\u4E2A\u4F19\u4F34\uFF0C\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u4FDD\u6301\u72EC\u7ACB DSH \u4F1A\u8BDD\u3002" }),
2985
+ !channel && !login && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "div", interactive: true, className: "dsh-partner-weixin-connect", borderRadius: 15, distortionScale: -10, saturation: 1.06, children: [
2986
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-weixin-mark", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(WeixinGlyph, { large: true }) }),
2987
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2988
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
2358
2989
  "\u628A ",
2359
2990
  companion.name,
2360
2991
  " \u5E26\u5230\u5FAE\u4FE1"
2361
2992
  ] }),
2362
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "\u626B\u7801\u540E\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u76F4\u63A5\u4FDD\u5B58\u8FDB DSH \u51ED\u636E\u5E93\uFF0C\u4E0D\u4F1A\u663E\u793A\u5728\u6D4F\u89C8\u5668\u6216\u666E\u901A\u914D\u7F6E\u6587\u4EF6\u4E2D\u3002" }),
2363
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ul", { children: [
2364
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: "\u79C1\u804A\u9996\u6B21\u8054\u7CFB\u5FC5\u987B\u5BA1\u6279" }),
2365
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: "\u8054\u7CFB\u4EBA\u4E4B\u95F4\u4E0A\u4E0B\u6587\u5B8C\u5168\u9694\u79BB" }),
2366
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: "\u5DE5\u5177\u6743\u9650\u4E0D\u4F1A\u56E0\u5FAE\u4FE1\u8EAB\u4EFD\u81EA\u52A8\u6269\u5927" })
2993
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: "\u626B\u7801\u540E\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u76F4\u63A5\u4FDD\u5B58\u8FDB DSH \u51ED\u636E\u5E93\uFF0C\u4E0D\u4F1A\u663E\u793A\u5728\u6D4F\u89C8\u5668\u6216\u666E\u901A\u914D\u7F6E\u6587\u4EF6\u4E2D\u3002" }),
2994
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("ul", { children: [
2995
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "\u79C1\u804A\u9996\u6B21\u8054\u7CFB\u5FC5\u987B\u5BA1\u6279" }),
2996
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "\u8054\u7CFB\u4EBA\u4E4B\u95F4\u4E0A\u4E0B\u6587\u5B8C\u5168\u9694\u79BB" }),
2997
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: "\u5DE5\u5177\u6743\u9650\u4E0D\u4F1A\u56E0\u5FAE\u4FE1\u8EAB\u4EFD\u81EA\u52A8\u6269\u5927" })
2367
2998
  ] })
2368
2999
  ] }),
2369
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy, onClick: () => {
3000
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy, onClick: () => {
2370
3001
  void begin();
2371
3002
  }, children: busy ? "\u6B63\u5728\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026" : "\u626B\u7801\u8FDE\u63A5\u5FAE\u4FE1" })
2372
3003
  ] }),
2373
- login && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-qr", children: [
2374
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-qr-code", children: login.qrContent && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(QRCodeSVG, { value: login.qrContent, size: 176, level: "M" }) }),
2375
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2376
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "WECHAT ILINK BOT" }),
2377
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: login.phase === "scanned" ? "\u5DF2\u626B\u7801\uFF0C\u8BF7\u5728\u5FAE\u4FE1\u786E\u8BA4" : login.phase === "expired" ? "\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F" : login.phase === "error" ? "\u8FDE\u63A5\u5931\u8D25" : "\u4F7F\u7528\u5FAE\u4FE1\u626B\u7801" }),
2378
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: login.error || (login.phase === "scanned" ? "\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u542F\u52A8\u6E20\u9053\uFF0C\u4E0D\u9700\u8981\u590D\u5236 Token\u3002" : "\u4E8C\u7EF4\u7801\u7EA6 5 \u5206\u949F\u6709\u6548\u3002\u6B64\u9875\u9762\u53EF\u4EE5\u5B89\u5168\u5730\u4FDD\u6301\u6253\u5F00\u3002") }),
2379
- (login.phase === "expired" || login.phase === "error") && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", onClick: () => {
3004
+ login && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "div", interactive: true, className: "dsh-partner-qr", borderRadius: 16, distortionScale: -10, saturation: 1.06, children: [
3005
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-qr-code", children: login.qrContent && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(QRCodeSVG, { value: login.qrContent, size: 176, level: "M" }) }),
3006
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3007
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "WECHAT ILINK BOT" }),
3008
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: login.phase === "scanned" ? "\u5DF2\u626B\u7801\uFF0C\u8BF7\u5728\u5FAE\u4FE1\u786E\u8BA4" : login.phase === "expired" ? "\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F" : login.phase === "error" ? "\u8FDE\u63A5\u5931\u8D25" : "\u4F7F\u7528\u5FAE\u4FE1\u626B\u7801" }),
3009
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: login.error || (login.phase === "scanned" ? "\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u542F\u52A8\u6E20\u9053\uFF0C\u4E0D\u9700\u8981\u590D\u5236 Token\u3002" : "\u4E8C\u7EF4\u7801\u7EA6 5 \u5206\u949F\u6709\u6548\u3002\u6B64\u9875\u9762\u53EF\u4EE5\u5B89\u5168\u5730\u4FDD\u6301\u6253\u5F00\u3002") }),
3010
+ (login.phase === "expired" || login.phase === "error") && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", onClick: () => {
2380
3011
  setLogin(void 0);
2381
3012
  void begin();
2382
3013
  }, children: [
2383
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconRefreshOutline16, { size: 16 }),
3014
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconRefreshOutline16, { size: 16 }),
2384
3015
  "\u91CD\u65B0\u751F\u6210"
2385
3016
  ] })
2386
3017
  ] })
2387
3018
  ] }),
2388
- channel && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
2389
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-channel-card", children: [
2390
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-weixin-mark", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WeixinGlyph, { large: true }) }),
2391
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2392
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "WECHAT CHANNEL" }),
2393
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: channel.name }),
2394
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: channel.accountId })
3019
+ channel && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
3020
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "div", interactive: true, className: "dsh-partner-channel-card", borderRadius: 14, distortionScale: -10, saturation: 1.06, children: [
3021
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-weixin-mark", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(WeixinGlyph, { large: true }) }),
3022
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3023
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "WECHAT CHANNEL" }),
3024
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: channel.name }),
3025
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: channel.accountId })
2395
3026
  ] }),
2396
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Status, { channel }),
2397
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": channel.enabled, disabled: busy, "aria-label": channel.enabled ? "\u505C\u7528\u5FAE\u4FE1\u6E20\u9053" : "\u542F\u7528\u5FAE\u4FE1\u6E20\u9053", onClick: () => {
3027
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Status, { channel }),
3028
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": channel.enabled, disabled: busy, "aria-label": channel.enabled ? "\u505C\u7528\u5FAE\u4FE1\u6E20\u9053" : "\u542F\u7528\u5FAE\u4FE1\u6E20\u9053", onClick: () => {
2398
3029
  void toggle();
2399
- }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}) })
3030
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}) })
2400
3031
  ] }),
2401
- channel.lastError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-inline-error", children: channel.lastError }),
2402
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-pairing-heading", children: [
2403
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2404
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "ACCESS" }),
2405
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u79C1\u804A\u914D\u5BF9" })
3032
+ channel.lastError && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-inline-error", children: channel.lastError }),
3033
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-pairing-heading", children: [
3034
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3035
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "ACCESS" }),
3036
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u79C1\u804A\u914D\u5BF9" })
2406
3037
  ] }),
2407
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("em", { children: [
3038
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("em", { children: [
2408
3039
  pairings.filter((item) => item.status === "pending").length,
2409
3040
  " \u4E2A\u5F85\u5904\u7406"
2410
3041
  ] })
2411
3042
  ] }),
2412
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-pairings", children: pairings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA", detail: "\u6709\u4EBA\u9996\u6B21\u5411\u673A\u5668\u4EBA\u53D1\u6D88\u606F\u540E\uFF0C\u914D\u5BF9\u8BF7\u6C42\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002", compact: true }) : pairings.map((pairing) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { children: [
2413
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `is-${pairing.status}`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconUserOutline16, { size: 16 }) }),
2414
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
2415
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: pairing.displayName }),
2416
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { children: [
3043
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-pairings", children: pairings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA", detail: "\u6709\u4EBA\u9996\u6B21\u5411\u673A\u5668\u4EBA\u53D1\u6D88\u606F\u540E\uFF0C\u914D\u5BF9\u8BF7\u6C42\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002", compact: true }) : pairings.map((pairing) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("article", { children: [
3044
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `is-${pairing.status}`, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconUserOutline16, { size: 16 }) }),
3045
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
3046
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: pairing.displayName }),
3047
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
2417
3048
  pairing.status === "pending" ? "\u7B49\u5F85\u5BA1\u6279" : pairing.status === "approved" ? "\u5DF2\u6388\u6743\u72EC\u7ACB\u4F1A\u8BDD" : "\u5DF2\u963B\u6B62",
2418
3049
  " \xB7 ",
2419
3050
  new Date(pairing.updatedAt).toLocaleString()
2420
3051
  ] })
2421
3052
  ] }),
2422
- pairing.status === "pending" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
2423
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: () => {
3053
+ pairing.status === "pending" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
3054
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { onClick: () => {
2424
3055
  void actPairing(pairing.id, "blocked");
2425
3056
  }, children: "\u62D2\u7EDD" }),
2426
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: "is-primary", onClick: () => {
3057
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { className: "is-primary", onClick: () => {
2427
3058
  void actPairing(pairing.id, "approved");
2428
3059
  }, children: "\u6279\u51C6" })
2429
3060
  ] }),
2430
- pairing.status === "approved" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: () => {
3061
+ pairing.status === "approved" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { onClick: () => {
2431
3062
  void actPairing(pairing.id, "blocked");
2432
3063
  }, children: "\u64A4\u9500" }),
2433
- pairing.status === "blocked" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: () => {
3064
+ pairing.status === "blocked" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { onClick: () => {
2434
3065
  void actPairing(pairing.id, "approved");
2435
3066
  }, children: "\u91CD\u65B0\u6279\u51C6" })
2436
3067
  ] }, pairing.id)) })
2437
3068
  ] }),
2438
- error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-inline-error", children: error })
3069
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-inline-error", children: error })
2439
3070
  ] });
2440
3071
  }
2441
3072
  function MemoryPanel({ companion, snapshot, openSession, renewSession, onChanged }) {
2442
3073
  const sessions = snapshot.sessions.filter((item) => item.companionId === companion.id);
2443
3074
  const heartbeat = snapshot.heartbeatStates.find((item) => item.companionId === companion.id);
2444
- const [automation, setAutomation] = (0, import_react3.useState)(() => structuredClone(companion.automation));
2445
- const [memories, setMemories] = (0, import_react3.useState)([]);
2446
- const [reflections, setReflections] = (0, import_react3.useState)([]);
2447
- const [concernActivity, setConcernActivity] = (0, import_react3.useState)({ concerns: [], observations: [] });
2448
- const [newConcern, setNewConcern] = (0, import_react3.useState)("");
2449
- const [graph, setGraph] = (0, import_react3.useState)({ memories: [], relations: [] });
2450
- const [editing, setEditing] = (0, import_react3.useState)();
2451
- const [busy, setBusy] = (0, import_react3.useState)(false);
2452
- const [notice, setNotice] = (0, import_react3.useState)();
2453
- const [error, setError] = (0, import_react3.useState)();
2454
- const [modelCatalog, setModelCatalog] = (0, import_react3.useState)();
2455
- const loadMemory = (0, import_react3.useCallback)(async () => {
3075
+ const [automation, setAutomation] = (0, import_react4.useState)(() => structuredClone(companion.automation));
3076
+ const [memories, setMemories] = (0, import_react4.useState)([]);
3077
+ const [reflections, setReflections] = (0, import_react4.useState)([]);
3078
+ const [profiles, setProfiles] = (0, import_react4.useState)([]);
3079
+ const [concernActivity, setConcernActivity] = (0, import_react4.useState)({ concerns: [], observations: [] });
3080
+ const [newConcern, setNewConcern] = (0, import_react4.useState)("");
3081
+ const [graph, setGraph] = (0, import_react4.useState)({ memories: [], relations: [] });
3082
+ const [editing, setEditing] = (0, import_react4.useState)();
3083
+ const [busy, setBusy] = (0, import_react4.useState)(false);
3084
+ const [notice, setNotice] = (0, import_react4.useState)();
3085
+ const [error, setError] = (0, import_react4.useState)();
3086
+ const [modelCatalog, setModelCatalog] = (0, import_react4.useState)();
3087
+ const loadMemory = (0, import_react4.useCallback)(async () => {
2456
3088
  const [result, relations, activity] = await Promise.all([api(`/companions/${companion.id}/memory`), api(`/companions/${companion.id}/memory/graph`), api(`/companions/${companion.id}/concerns`)]);
2457
3089
  setMemories(result.memories);
2458
3090
  setReflections(result.reflections);
3091
+ setProfiles(result.profiles);
2459
3092
  setGraph(relations);
2460
3093
  setConcernActivity(activity);
2461
3094
  }, [companion.id]);
2462
- (0, import_react3.useEffect)(() => {
3095
+ (0, import_react4.useEffect)(() => {
2463
3096
  setAutomation(structuredClone(companion.automation));
2464
3097
  void loadMemory().catch((reason) => setError(message(reason)));
2465
3098
  }, [companion.id, companion.updatedAt, loadMemory]);
2466
- (0, import_react3.useEffect)(() => {
3099
+ (0, import_react4.useEffect)(() => {
2467
3100
  void api("/models").then(setModelCatalog).catch((reason) => setError(message(reason)));
2468
3101
  }, []);
2469
3102
  const inheritedProvider = companion.provider || modelCatalog?.defaultSelection.provider || "";
@@ -2574,152 +3207,152 @@ function MemoryPanel({ companion, snapshot, openSession, renewSession, onChanged
2574
3207
  setBusy(false);
2575
3208
  }
2576
3209
  };
2577
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-form is-memory", children: [
2578
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Section, { eyebrow: "CONTINUITY", title: "\u4F1A\u8BDD\u8BB0\u5FC6", detail: "\u8FD9\u91CC\u5C55\u793A\u6E20\u9053\u4F1A\u8BDD\u8FB9\u754C\u3002\u77E5\u8BC6\u5E93\u4ECD\u7531\u77E5\u8BC6\u5E93\u63D2\u4EF6\u7BA1\u7406\uFF0C\u4F19\u4F34\u4E0D\u4F1A\u628A\u4E0D\u540C\u5FAE\u4FE1\u8054\u7CFB\u4EBA\u7684\u539F\u59CB\u4E0A\u4E0B\u6587\u6DF7\u5728\u4E00\u8D77\u3002" }),
2579
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-metrics", children: [
2580
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { children: [
2581
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u6E20\u9053\u4F1A\u8BDD" }),
2582
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: sessions.length }),
2583
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u72EC\u7ACB" })
3210
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-form is-memory", children: [
3211
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { eyebrow: "CONTINUITY", title: "\u4F1A\u8BDD\u8BB0\u5FC6", detail: "\u8FD9\u91CC\u5C55\u793A\u6E20\u9053\u4F1A\u8BDD\u8FB9\u754C\u3002\u77E5\u8BC6\u5E93\u4ECD\u7531\u77E5\u8BC6\u5E93\u63D2\u4EF6\u7BA1\u7406\uFF0C\u4F19\u4F34\u4E0D\u4F1A\u628A\u4E0D\u540C\u5FAE\u4FE1\u8054\u7CFB\u4EBA\u7684\u539F\u59CB\u4E0A\u4E0B\u6587\u6DF7\u5728\u4E00\u8D77\u3002" }),
3212
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-metrics", children: [
3213
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "article", interactive: true, className: "", borderRadius: 12, distortionScale: -9, saturation: 1.05, children: [
3214
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u6E20\u9053\u4F1A\u8BDD" }),
3215
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: sessions.length }),
3216
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: "\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u72EC\u7ACB" })
2584
3217
  ] }),
2585
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { children: [
2586
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u957F\u671F\u8BB0\u5FC6" }),
2587
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: memories.filter((item) => item.status === "active").length }),
2588
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { children: [
3218
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "article", interactive: true, className: "", borderRadius: 12, distortionScale: -9, saturation: 1.05, children: [
3219
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u957F\u671F\u8BB0\u5FC6" }),
3220
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: memories.filter((item) => item.status === "active").length }),
3221
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { children: [
2589
3222
  reflections.length,
2590
3223
  " \u7BC7\u6BCF\u65E5\u56DE\u987E"
2591
3224
  ] })
2592
3225
  ] }),
2593
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { children: [
2594
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u6700\u8FD1\u5FC3\u8DF3" }),
2595
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: heartbeat?.lastCheckedAt ? relativeTime(heartbeat.lastCheckedAt) : "\u5C1A\u672A" }),
2596
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: heartbeat?.lastError ? "\u4E0A\u6B21\u6267\u884C\u5F02\u5E38" : `\u4ECA\u65E5\u53D1\u9001 ${heartbeat?.sentCount ?? 0} \u6B21` })
3226
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "article", interactive: true, className: "", borderRadius: 12, distortionScale: -9, saturation: 1.05, children: [
3227
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u6700\u8FD1\u5FC3\u8DF3" }),
3228
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: heartbeat?.lastCheckedAt ? relativeTime(heartbeat.lastCheckedAt) : "\u5C1A\u672A" }),
3229
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: heartbeat?.lastError ? "\u4E0A\u6B21\u6267\u884C\u5F02\u5E38" : `\u4ECA\u65E5\u53D1\u9001 ${heartbeat?.sentCount ?? 0} \u6B21` })
2597
3230
  ] })
2598
3231
  ] }),
2599
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-automation-grid", children: [
2600
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-automation", children: [
2601
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
2602
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2603
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u5B66\u4E60\u4E0E\u957F\u671F\u8BB0\u5FC6" }),
2604
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u6309\u8054\u7CFB\u4EBA\u5F52\u6863\u5B8C\u6574\u5BF9\u8BDD\uFF0C\u63D0\u70BC\u6BCF\u65E5\u56DE\u987E\u548C\u7ED3\u6784\u5316\u8BB0\u5FC6\uFF0C\u5E76\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u53EC\u56DE\u3002" })
3232
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-automation-grid", children: [
3233
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "dsh-partner-automation", borderRadius: 14, distortionScale: -9, saturation: 1.05, children: [
3234
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
3235
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3236
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u5B66\u4E60\u4E0E\u957F\u671F\u8BB0\u5FC6" }),
3237
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u6309\u8054\u7CFB\u4EBA\u5F52\u6863\u5B8C\u6574\u5BF9\u8BDD\uFF0C\u63D0\u70BC\u6BCF\u65E5\u56DE\u987E\u548C\u7ED3\u6784\u5316\u8BB0\u5FC6\uFF0C\u5E76\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u53EC\u56DE\u3002" })
2605
3238
  ] }),
2606
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": automation.memory.enabled, "aria-label": "\u542F\u7528\u4F19\u4F34\u5B66\u4E60", onClick: () => setAutomation((current) => ({ ...current, memory: { ...current.memory, enabled: !current.memory.enabled } })), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}) })
3239
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": automation.memory.enabled, "aria-label": "\u542F\u7528\u4F19\u4F34\u5B66\u4E60", onClick: () => setAutomation((current) => ({ ...current, memory: { ...current.memory, enabled: !current.memory.enabled } })), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}) })
2607
3240
  ] }),
2608
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-automation-fields is-memory-model", children: [
2609
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u4FDD\u7559\u671F\u9650", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: automation.memory.retentionDays, onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, retentionDays: Number(event.target.value) } })), children: [
2610
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 0, children: "\u6C38\u4E45\u4FDD\u7559" }),
2611
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 30, children: "30 \u5929" }),
2612
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 90, children: "90 \u5929" }),
2613
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 180, children: "180 \u5929" }),
2614
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 365, children: "1 \u5E74" }),
2615
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 1095, children: "3 \u5E74" })
3241
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-automation-fields is-memory-model", children: [
3242
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u4FDD\u7559\u671F\u9650", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: automation.memory.retentionDays, onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, retentionDays: Number(event.target.value) } })), children: [
3243
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 0, children: "\u6C38\u4E45\u4FDD\u7559" }),
3244
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 30, children: "30 \u5929" }),
3245
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 90, children: "90 \u5929" }),
3246
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 180, children: "180 \u5929" }),
3247
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 365, children: "1 \u5E74" }),
3248
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 1095, children: "3 \u5E74" })
2616
3249
  ] }) }),
2617
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u63D0\u70BC Provider", hint: "\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: automation.memory.provider ?? "", onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, provider: event.target.value, model: "" } })), children: [
2618
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: "", children: [
3250
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u63D0\u70BC Provider", hint: "\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: automation.memory.provider ?? "", onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, provider: event.target.value, model: "" } })), children: [
3251
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: "", children: [
2619
3252
  "\u8DDF\u968F\u4F19\u4F34 \xB7 ",
2620
3253
  inheritedProvider || "DSH \u9ED8\u8BA4"
2621
3254
  ] }),
2622
- modelCatalog?.providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: provider.id, children: provider.name || provider.id }, provider.id))
3255
+ modelCatalog?.providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: provider.id, children: provider.name || provider.id }, provider.id))
2623
3256
  ] }) }),
2624
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u63D0\u70BC\u6A21\u578B", hint: "\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: automation.memory.model ?? "", onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, model: event.target.value } })), children: [
2625
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: "", children: [
3257
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u63D0\u70BC\u6A21\u578B", hint: "\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: automation.memory.model ?? "", onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, model: event.target.value } })), children: [
3258
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: "", children: [
2626
3259
  "\u8DDF\u968F\u4F19\u4F34 \xB7 ",
2627
3260
  companion.model || modelCatalog?.defaultSelection.model || "DSH \u9ED8\u8BA4"
2628
3261
  ] }),
2629
- modelOptions.map((model) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: model.id, children: model.name || model.id }, model.id))
3262
+ modelOptions.map((model) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: model.id, children: model.name || model.id }, model.id))
2630
3263
  ] }) })
2631
3264
  ] }),
2632
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-review-policy", children: [
2633
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": automation.memory.dailyReviewEnabled, "aria-label": "\u542F\u7528\u6BCF\u65E5\u7EC8\u5BA1", onClick: () => setAutomation((current) => ({ ...current, memory: { ...current.memory, dailyReviewEnabled: !current.memory.dailyReviewEnabled } })), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}) }),
2634
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2635
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u6BCF\u65E5\u7EC8\u5BA1" }),
2636
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u6B21\u65E5\u81EA\u52A8\u5408\u5E76\u91CD\u590D\u3001\u7EA0\u6B63\u504F\u5DEE\u5E76\u5EFA\u7ACB\u8BB0\u5FC6\u5173\u7CFB" })
3265
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-review-policy", children: [
3266
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": automation.memory.dailyReviewEnabled, "aria-label": "\u542F\u7528\u6BCF\u65E5\u7EC8\u5BA1", onClick: () => setAutomation((current) => ({ ...current, memory: { ...current.memory, dailyReviewEnabled: !current.memory.dailyReviewEnabled } })), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}) }),
3267
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3268
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u6BCF\u65E5\u7EC8\u5BA1" }),
3269
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u6B21\u65E5\u81EA\u52A8\u5408\u5E76\u91CD\u590D\u3001\u7EA0\u6B63\u504F\u5DEE\u5E76\u5EFA\u7ACB\u8BB0\u5FC6\u5173\u7CFB" })
2637
3270
  ] }),
2638
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("select", { "aria-label": "\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u95F4", value: automation.memory.dailyReviewHour, onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, dailyReviewHour: Number(event.target.value) } })), children: Array.from({ length: 24 }, (_, hour) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: hour, children: [
3271
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("label", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("select", { "aria-label": "\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u95F4", value: automation.memory.dailyReviewHour, onChange: (event) => setAutomation((current) => ({ ...current, memory: { ...current.memory, dailyReviewHour: Number(event.target.value) } })), children: Array.from({ length: 24 }, (_, hour) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: hour, children: [
2639
3272
  String(hour).padStart(2, "0"),
2640
3273
  ":00"
2641
3274
  ] }, hour)) }) }),
2642
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy || reflections.length === 0, onClick: () => {
3275
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy || reflections.length === 0, onClick: () => {
2643
3276
  void review();
2644
3277
  }, children: "\u7ACB\u5373\u7EC8\u5BA1" })
2645
3278
  ] })
2646
3279
  ] }),
2647
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-automation", children: [
2648
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
2649
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2650
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u6301\u7EED\u611F\u77E5" }),
2651
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u4F19\u4F34\u53EA\u89C2\u5BDF\u5C1A\u672A\u95ED\u73AF\u7684\u4E8B\u60C5\u662F\u5426\u51FA\u73B0\u65B0\u53D8\u5316\uFF0C\u5E76\u7531\u514B\u5236\u7684\u6253\u6270\u7B56\u7565\u51B3\u5B9A\u4F55\u65F6\u544A\u8BC9\u4F60\u3002" })
3280
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "dsh-partner-automation", borderRadius: 14, distortionScale: -9, saturation: 1.05, children: [
3281
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
3282
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3283
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u6301\u7EED\u611F\u77E5" }),
3284
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u4F19\u4F34\u53EA\u89C2\u5BDF\u5C1A\u672A\u95ED\u73AF\u7684\u4E8B\u60C5\u662F\u5426\u51FA\u73B0\u65B0\u53D8\u5316\uFF0C\u5E76\u7531\u514B\u5236\u7684\u6253\u6270\u7B56\u7565\u51B3\u5B9A\u4F55\u65F6\u544A\u8BC9\u4F60\u3002" })
2652
3285
  ] }),
2653
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": automation.heartbeat.enabled, "aria-label": "\u542F\u7528\u4F19\u4F34\u5FC3\u8DF3", onClick: () => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, enabled: !current.heartbeat.enabled } })), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}) })
3286
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "dsh-partner-switch", "data-on": automation.heartbeat.enabled, "aria-label": "\u542F\u7528\u4F19\u4F34\u5FC3\u8DF3", onClick: () => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, enabled: !current.heartbeat.enabled } })), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}) })
2654
3287
  ] }),
2655
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-automation-fields is-heartbeat", children: [
2656
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u68C0\u67E5\u95F4\u9694", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: automation.heartbeat.intervalMinutes, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, intervalMinutes: Number(event.target.value) } })), children: [
2657
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 30, children: "30 \u5206\u949F" }),
2658
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 60, children: "1 \u5C0F\u65F6" }),
2659
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 180, children: "3 \u5C0F\u65F6" }),
2660
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 360, children: "6 \u5C0F\u65F6" }),
2661
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 720, children: "12 \u5C0F\u65F6" }),
2662
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 1440, children: "24 \u5C0F\u65F6" })
3288
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-automation-fields is-heartbeat", children: [
3289
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u68C0\u67E5\u95F4\u9694", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: automation.heartbeat.intervalMinutes, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, intervalMinutes: Number(event.target.value) } })), children: [
3290
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 30, children: "30 \u5206\u949F" }),
3291
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 60, children: "1 \u5C0F\u65F6" }),
3292
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 180, children: "3 \u5C0F\u65F6" }),
3293
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 360, children: "6 \u5C0F\u65F6" }),
3294
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 720, children: "12 \u5C0F\u65F6" }),
3295
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 1440, children: "24 \u5C0F\u65F6" })
2663
3296
  ] }) }),
2664
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u514D\u6253\u6270\u5F00\u59CB", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "number", min: 0, max: 23, value: automation.heartbeat.quietStartHour, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, quietStartHour: Number(event.target.value) } })) }) }),
2665
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u514D\u6253\u6270\u7ED3\u675F", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "number", min: 0, max: 23, value: automation.heartbeat.quietEndHour, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, quietEndHour: Number(event.target.value) } })) }) }),
2666
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: "\u6BCF\u65E5\u4E0A\u9650", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("select", { value: automation.heartbeat.dailyLimit, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, dailyLimit: Number(event.target.value) } })), children: [
2667
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 0, children: "\u4E0D\u9650" }),
2668
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 1, children: "1 \u6B21" }),
2669
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 2, children: "2 \u6B21" }),
2670
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 3, children: "3 \u6B21" }),
2671
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 5, children: "5 \u6B21" }),
2672
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: 8, children: "8 \u6B21" })
3297
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u514D\u6253\u6270\u5F00\u59CB", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("input", { type: "number", min: 0, max: 23, value: automation.heartbeat.quietStartHour, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, quietStartHour: Number(event.target.value) } })) }) }),
3298
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u514D\u6253\u6270\u7ED3\u675F", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("input", { type: "number", min: 0, max: 23, value: automation.heartbeat.quietEndHour, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, quietEndHour: Number(event.target.value) } })) }) }),
3299
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "\u6BCF\u65E5\u4E0A\u9650", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("select", { value: automation.heartbeat.dailyLimit, onChange: (event) => setAutomation((current) => ({ ...current, heartbeat: { ...current.heartbeat, dailyLimit: Number(event.target.value) } })), children: [
3300
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 0, children: "\u4E0D\u9650" }),
3301
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 1, children: "1 \u6B21" }),
3302
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 2, children: "2 \u6B21" }),
3303
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 3, children: "3 \u6B21" }),
3304
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 5, children: "5 \u6B21" }),
3305
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: 8, children: "8 \u6B21" })
2673
3306
  ] }) })
2674
3307
  ] }),
2675
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConcernBoard, { companionId: companion.id, activity: concernActivity, value: newConcern, busy, onValue: setNewConcern, onAdd: () => {
3308
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ConcernBoard, { companionId: companion.id, activity: concernActivity, value: newConcern, busy, onValue: setNewConcern, onAdd: () => {
2676
3309
  void addConcern();
2677
3310
  }, onCheck: (item) => {
2678
3311
  void trigger(item.id);
2679
3312
  }, onAct: (item, action) => {
2680
3313
  void actConcern(item, action);
2681
3314
  } }),
2682
- heartbeat?.lastError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-inline-error", children: heartbeat.lastError }),
2683
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-automation-actions", children: [
2684
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy || sessions.length === 0, onClick: () => {
3315
+ heartbeat?.lastError && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-inline-error", children: heartbeat.lastError }),
3316
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-automation-actions", children: [
3317
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy || sessions.length === 0, onClick: () => {
2685
3318
  void trigger();
2686
3319
  }, children: "\u68C0\u67E5\u5230\u671F\u9879" }),
2687
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "is-primary", disabled: busy, onClick: () => {
3320
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "is-primary", disabled: busy, onClick: () => {
2688
3321
  void save();
2689
3322
  }, children: busy ? "\u6B63\u5728\u5904\u7406\u2026" : "\u4FDD\u5B58\u8BBE\u7F6E" })
2690
3323
  ] })
2691
3324
  ] })
2692
3325
  ] }),
2693
- notice && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "dsh-partner-inline-notice", children: [
2694
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 14 }),
3326
+ notice && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { className: "dsh-partner-inline-notice", children: [
3327
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 14 }),
2695
3328
  notice
2696
3329
  ] }),
2697
- error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-inline-error", children: error }),
2698
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MemoryLibrary, { memories, reflections, graph, editing, busy, setEditing, save: () => {
3330
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-inline-error", children: error }),
3331
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MemoryLibrary, { profiles, memories, reflections, graph, editing, busy, setEditing, save: () => {
2699
3332
  void saveMemory();
2700
3333
  }, remove: (item) => {
2701
3334
  void deleteMemory(item);
2702
3335
  } }),
2703
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-section-heading", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2704
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "SESSIONS" }),
2705
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u5171\u4EAB\u4F1A\u8BDD" })
3336
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-section-heading", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3337
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "SESSIONS" }),
3338
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u5171\u4EAB\u4F1A\u8BDD" })
2706
3339
  ] }) }),
2707
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-session-list", children: [
2708
- sessions.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { "data-archived": item.archived, children: [
2709
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 16 }) }),
2710
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
2711
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { children: [
3340
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-session-list", children: [
3341
+ sessions.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("article", { "data-archived": item.archived, children: [
3342
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 16 }) }),
3343
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
3344
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
2712
3345
  "\u5FAE\u4FE1\u8054\u7CFB\u4EBA \xB7 ",
2713
3346
  item.userId.slice(-6)
2714
3347
  ] }),
2715
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: item.archived ? "\u5DF2\u5F52\u6863 \xB7 \u957F\u671F\u8BB0\u5FC6\u4FDD\u7559" : `${item.sessionId} \xB7 ${new Date(item.lastMessageAt).toLocaleString()}` })
3348
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: item.archived ? "\u5DF2\u5F52\u6863 \xB7 \u957F\u671F\u8BB0\u5FC6\u4FDD\u7559" : `${item.sessionId} \xB7 ${new Date(item.lastMessageAt).toLocaleString()}` })
2716
3349
  ] }),
2717
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: item.archived ? "is-primary" : void 0, onClick: () => {
3350
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: item.archived ? "is-primary" : void 0, onClick: () => {
2718
3351
  if (item.archived) void renewSession(item.id);
2719
3352
  else void openSession(item.id, item.sessionId);
2720
3353
  }, children: item.archived ? "\u5F00\u59CB\u65B0\u4F1A\u8BDD" : "\u6253\u5F00\u4F1A\u8BDD" })
2721
3354
  ] }, item.id)),
2722
- sessions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u8FD8\u6CA1\u6709\u5171\u4EAB\u4F1A\u8BDD", detail: "\u8054\u7CFB\u4EBA\u5B8C\u6210\u914D\u5BF9\u5E76\u53D1\u6765\u7B2C\u4E00\u6761\u6D88\u606F\u540E\uFF0C\u4F19\u4F34\u4F1A\u521B\u5EFA\u7F51\u9875\u4E0E\u5FAE\u4FE1\u5171\u7528\u7684\u4F1A\u8BDD\u3002", compact: true })
3355
+ sessions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u8FD8\u6CA1\u6709\u5171\u4EAB\u4F1A\u8BDD", detail: "\u8054\u7CFB\u4EBA\u5B8C\u6210\u914D\u5BF9\u5E76\u53D1\u6765\u7B2C\u4E00\u6761\u6D88\u606F\u540E\uFF0C\u4F19\u4F34\u4F1A\u521B\u5EFA\u7F51\u9875\u4E0E\u5FAE\u4FE1\u5171\u7528\u7684\u4F1A\u8BDD\u3002", compact: true })
2723
3356
  ] })
2724
3357
  ] });
2725
3358
  }
@@ -2728,19 +3361,19 @@ function ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCh
2728
3361
  const active = visible.filter((item) => item.state !== "resolved");
2729
3362
  const resolved = visible.filter((item) => item.state === "resolved");
2730
3363
  const latest = new Map([...activity.observations].reverse().map((item) => [item.concernId, item]));
2731
- const [composing, setComposing] = (0, import_react3.useState)(false);
2732
- const [expandedId, setExpandedId] = (0, import_react3.useState)();
2733
- const [visibleCount, setVisibleCount] = (0, import_react3.useState)(5);
2734
- const [mention, setMention] = (0, import_react3.useState)();
2735
- const [sources, setSources] = (0, import_react3.useState)([]);
2736
- const [sourcesLoading, setSourcesLoading] = (0, import_react3.useState)(false);
2737
- const [sourceError, setSourceError] = (0, import_react3.useState)();
2738
- const [activeSource, setActiveSource] = (0, import_react3.useState)(0);
2739
- const inputRef = (0, import_react3.useRef)(null);
2740
- const listboxId = (0, import_react3.useId)();
3364
+ const [composing, setComposing] = (0, import_react4.useState)(false);
3365
+ const [expandedId, setExpandedId] = (0, import_react4.useState)();
3366
+ const [visibleCount, setVisibleCount] = (0, import_react4.useState)(5);
3367
+ const [mention, setMention] = (0, import_react4.useState)();
3368
+ const [sources, setSources] = (0, import_react4.useState)([]);
3369
+ const [sourcesLoading, setSourcesLoading] = (0, import_react4.useState)(false);
3370
+ const [sourceError, setSourceError] = (0, import_react4.useState)();
3371
+ const [activeSource, setActiveSource] = (0, import_react4.useState)(0);
3372
+ const inputRef = (0, import_react4.useRef)(null);
3373
+ const listboxId = (0, import_react4.useId)();
2741
3374
  const shown = active.slice(0, visibleCount);
2742
3375
  const suggestionsOpen = composing && mention !== void 0;
2743
- (0, import_react3.useEffect)(() => {
3376
+ (0, import_react4.useEffect)(() => {
2744
3377
  if (!suggestionsOpen || mention === void 0) {
2745
3378
  setSources([]);
2746
3379
  setSourcesLoading(false);
@@ -2789,25 +3422,25 @@ function ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCh
2789
3422
  inputRef.current?.setSelectionRange(cursor, cursor);
2790
3423
  });
2791
3424
  };
2792
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-concern-board", "aria-labelledby": "partner-concerns-title", children: [
2793
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
2794
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2795
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { id: "partner-concerns-title", children: [
3425
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "dsh-partner-concern-board", borderRadius: 11, distortionScale: -8, saturation: 1.04, "aria-labelledby": "partner-concerns-title", children: [
3426
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
3427
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3428
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { id: "partner-concerns-title", children: [
2796
3429
  "\u4F19\u4F34\u5728\u610F\u7684\u4E8B ",
2797
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: active.length })
3430
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: active.length })
2798
3431
  ] }),
2799
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "\u5C1A\u672A\u95ED\u73AF\u3001\u503C\u5F97\u7EE7\u7EED\u7559\u610F\u7684\u4E8B\u60C5" })
3432
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: "\u5C1A\u672A\u95ED\u73AF\u3001\u503C\u5F97\u7EE7\u7EED\u7559\u610F\u7684\u4E8B\u60C5" })
2800
3433
  ] }),
2801
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", "aria-expanded": composing, onClick: () => setComposing((current) => !current), children: [
2802
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconPlusOutline16, { size: 14 }),
3434
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", "aria-expanded": composing, onClick: () => setComposing((current) => !current), children: [
3435
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconPlusOutline16, { size: 14 }),
2803
3436
  "\u4EA4\u4EE3\u4E00\u4EF6\u4E8B"
2804
3437
  ] })
2805
3438
  ] }),
2806
- composing && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", { className: "dsh-partner-concern-compose", onSubmit: submit, children: [
2807
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { children: [
2808
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "\u9700\u8981\u7559\u610F\u7684\u4E8B" }),
2809
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-concern-input-wrap", children: [
2810
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
3439
+ composing && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("form", { className: "dsh-partner-concern-compose", onSubmit: submit, children: [
3440
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { children: [
3441
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "\u9700\u8981\u7559\u610F\u7684\u4E8B" }),
3442
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-concern-input-wrap", children: [
3443
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
2811
3444
  "input",
2812
3445
  {
2813
3446
  ref: inputRef,
@@ -2843,10 +3476,10 @@ function ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCh
2843
3476
  }
2844
3477
  }
2845
3478
  ),
2846
- suggestionsOpen && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { id: listboxId, className: "dsh-partner-concern-sources", role: "listbox", "aria-label": "\u53EF\u5F15\u7528\u7684\u6587\u4EF6\u4E0E\u77E5\u8BC6\u6587\u6863", children: sourcesLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { role: "status", children: "\u6B63\u5728\u67E5\u627E\u53EF\u5F15\u7528\u5185\u5BB9\u2026" }) : sourceError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { role: "status", children: [
3479
+ suggestionsOpen && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { id: listboxId, className: "dsh-partner-concern-sources", role: "listbox", "aria-label": "\u53EF\u5F15\u7528\u7684\u6587\u4EF6\u4E0E\u77E5\u8BC6\u6587\u6863", children: sourcesLoading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { role: "status", children: "\u6B63\u5728\u67E5\u627E\u53EF\u5F15\u7528\u5185\u5BB9\u2026" }) : sourceError ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { role: "status", children: [
2847
3480
  "\u5019\u9009\u52A0\u8F7D\u5931\u8D25\uFF1A",
2848
3481
  sourceError
2849
- ] }) : sources.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { role: "status", children: "\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: sources.map((source, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
3482
+ ] }) : sources.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { role: "status", children: "\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863" }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: sources.map((source, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
2850
3483
  "button",
2851
3484
  {
2852
3485
  type: "button",
@@ -2858,97 +3491,97 @@ function ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCh
2858
3491
  onMouseEnter: () => setActiveSource(index),
2859
3492
  onClick: () => chooseSource(source),
2860
3493
  children: [
2861
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: source.kind === "file" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 15 }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconLinkOutline16, { size: 15 }) }),
2862
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: source.label }),
2863
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: source.detail })
3494
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: source.kind === "file" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: 15 }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconLinkOutline16, { size: 15 }) }),
3495
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: source.label }),
3496
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: source.detail })
2864
3497
  ]
2865
3498
  },
2866
3499
  `${source.kind}:${source.token}`
2867
3500
  )) }) })
2868
3501
  ] }),
2869
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { className: "dsh-partner-concern-compose-hint", children: [
3502
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { className: "dsh-partner-concern-compose-hint", children: [
2870
3503
  "\u8F93\u5165 ",
2871
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: "@" }),
3504
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: "@" }),
2872
3505
  " \u4F1A\u5217\u51FA\u5F53\u524D\u4F1A\u8BDD\u6587\u4EF6\u548C\u5DF2\u6302\u8F7D\u7684\u77E5\u8BC6\u6587\u6863\uFF0C\u4E5F\u53EF\u4EE5\u7EE7\u7EED\u8F93\u5165\u5173\u952E\u8BCD\u7B5B\u9009\u3002"
2873
3506
  ] })
2874
3507
  ] }),
2875
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
2876
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => {
3508
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
3509
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => {
2877
3510
  setComposing(false);
2878
3511
  setMention(void 0);
2879
3512
  onValue("");
2880
3513
  }, children: "\u53D6\u6D88" }),
2881
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "submit", className: "is-primary", disabled: busy || !value.trim(), children: "\u8BA9\u4F19\u4F34\u8BB0\u7740" })
3514
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "submit", className: "is-primary", disabled: busy || !value.trim(), children: "\u8BA9\u4F19\u4F34\u8BB0\u7740" })
2882
3515
  ] })
2883
3516
  ] }),
2884
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-concern-list", role: "list", children: active.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-partner-concern-empty", children: "\u6700\u8FD1\u6CA1\u6709\u672A\u95ED\u73AF\u7684\u4E8B\u3002\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5BF9\u4F19\u4F34\u8BF4\u201C\u8FD9\u4E2A\u5E2E\u6211\u7559\u610F\u201D\u3002" }) : shown.map((item) => {
3517
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-concern-list", role: "list", children: active.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "dsh-partner-concern-empty", children: "\u6700\u8FD1\u6CA1\u6709\u672A\u95ED\u73AF\u7684\u4E8B\u3002\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5BF9\u4F19\u4F34\u8BF4\u201C\u8FD9\u4E2A\u5E2E\u6211\u7559\u610F\u201D\u3002" }) : shown.map((item) => {
2885
3518
  const observation = latest.get(item.id);
2886
3519
  const expanded = expandedId === item.id;
2887
3520
  const status = observation ? concernObservationStatus(observation) : item.state === "active" ? "\u6B63\u5728\u7559\u610F" : "\u6682\u65F6\u8BB0\u7740";
2888
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { role: "listitem", "data-state": item.state, "data-expanded": expanded, children: [
2889
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: "dsh-partner-concern-row", "aria-expanded": expanded, onClick: () => setExpandedId((current) => current === item.id ? void 0 : item.id), children: [
2890
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dsh-partner-concern-state", children: [
2891
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}),
3521
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("article", { role: "listitem", "data-state": item.state, "data-expanded": expanded, children: [
3522
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: "dsh-partner-concern-row", "aria-expanded": expanded, onClick: () => setExpandedId((current) => current === item.id ? void 0 : item.id), children: [
3523
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "dsh-partner-concern-state", children: [
3524
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}),
2892
3525
  status
2893
3526
  ] }),
2894
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dsh-partner-concern-copy", children: [
2895
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: item.subject }),
2896
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: observation ? observation.event : item.reason })
3527
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "dsh-partner-concern-copy", children: [
3528
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: item.subject }),
3529
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: observation ? observation.event : item.reason })
2897
3530
  ] }),
2898
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dsh-partner-concern-time", title: `\u8BA1\u5212\u4E8E ${new Date(item.nextCheckAt).toLocaleString()} \u518D\u6B21\u7559\u610F`, children: [
2899
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u4E0B\u6B21\u7559\u610F" }),
2900
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: futureTime(item.nextCheckAt) })
3531
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "dsh-partner-concern-time", title: `\u8BA1\u5212\u4E8E ${new Date(item.nextCheckAt).toLocaleString()} \u518D\u6B21\u7559\u610F`, children: [
3532
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u4E0B\u6B21\u7559\u610F" }),
3533
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: futureTime(item.nextCheckAt) })
2901
3534
  ] }),
2902
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 14 })
3535
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 14 })
2903
3536
  ] }),
2904
- expanded && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-concern-detail", children: [
2905
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: item.reason }),
2906
- observation && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
2907
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("blockquote", { children: observation.event }),
2908
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-concern-decision", "data-decision": observation.decision, children: [
2909
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: concernObservationStatus(observation) }),
2910
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: observation.decisionReason || concernObservationExplanation(observation) }),
2911
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { children: [
3537
+ expanded && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-concern-detail", children: [
3538
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: item.reason }),
3539
+ observation && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
3540
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("blockquote", { children: observation.event }),
3541
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-concern-decision", "data-decision": observation.decision, children: [
3542
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: concernObservationStatus(observation) }),
3543
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: observation.decisionReason || concernObservationExplanation(observation) }),
3544
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
2912
3545
  "\u6253\u6270\u5206\u6570 ",
2913
3546
  Math.round(observation.interruptScore * 100),
2914
3547
  observation.notificationRuleEffect !== "auto" && observation.notificationRuleReason ? ` \xB7 \u77E5\u8BC6\u89C4\u5219\uFF1A${observation.notificationRuleReason}` : ""
2915
3548
  ] })
2916
3549
  ] })
2917
3550
  ] }),
2918
- item.resources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-concern-resources", children: item.resources.map((resource) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
3551
+ item.resources.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-concern-resources", children: item.resources.map((resource) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
2919
3552
  resource.kind === "file" ? "\u6587\u4EF6" : "\u77E5\u8BC6",
2920
3553
  " \xB7 ",
2921
3554
  resource.label
2922
3555
  ] }, `${resource.kind}:${resource.locator}`)) }),
2923
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { children: [
3556
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
2924
3557
  item.origin === "explicit" ? "\u4F60\u660E\u786E\u4EA4\u4EE3" : "\u4F19\u4F34\u4ECE\u5BF9\u8BDD\u4E2D\u6CE8\u610F\u5230",
2925
3558
  " \xB7 ",
2926
3559
  watchKindLabel(item.watchKind)
2927
3560
  ] }),
2928
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-concern-actions", "aria-label": `${item.subject} \u7684\u64CD\u4F5C`, children: [
2929
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy, onClick: () => onCheck(item), children: "\u7ACB\u5373\u68C0\u67E5\u8FD9\u6761" }),
2930
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "watch"), children: "\u7EE7\u7EED\u7559\u610F" }),
2931
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "prioritize"), children: "\u63D0\u9AD8\u5173\u6CE8" }),
2932
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "resolve"), children: "\u5DF2\u7ECF\u89E3\u51B3" }),
2933
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "is-danger", disabled: busy, onClick: () => onAct(item, "ignore"), children: "\u522B\u7BA1\u8FD9\u4E2A" })
3561
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-concern-actions", "aria-label": `${item.subject} \u7684\u64CD\u4F5C`, children: [
3562
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy, onClick: () => onCheck(item), children: "\u7ACB\u5373\u68C0\u67E5\u8FD9\u6761" }),
3563
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "watch"), children: "\u7EE7\u7EED\u7559\u610F" }),
3564
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "prioritize"), children: "\u63D0\u9AD8\u5173\u6CE8" }),
3565
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "resolve"), children: "\u5DF2\u7ECF\u89E3\u51B3" }),
3566
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "is-danger", disabled: busy, onClick: () => onAct(item, "ignore"), children: "\u522B\u7BA1\u8FD9\u4E2A" })
2934
3567
  ] })
2935
3568
  ] })
2936
3569
  ] }, item.id);
2937
3570
  }) }),
2938
- (active.length > shown.length || visibleCount > 5) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-concern-more", children: active.length > shown.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", onClick: () => setVisibleCount((count) => Math.min(active.length, count + 20)), children: [
3571
+ (active.length > shown.length || visibleCount > 5) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-concern-more", children: active.length > shown.length ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", onClick: () => setVisibleCount((count) => Math.min(active.length, count + 20)), children: [
2939
3572
  "\u518D\u663E\u793A ",
2940
3573
  Math.min(20, active.length - shown.length),
2941
3574
  " \u6761"
2942
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => setVisibleCount(5), children: "\u6536\u8D77\u5217\u8868" }) }),
2943
- resolved.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("details", { className: "dsh-partner-concern-resolved", children: [
2944
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("summary", { children: [
3575
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => setVisibleCount(5), children: "\u6536\u8D77\u5217\u8868" }) }),
3576
+ resolved.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("details", { className: "dsh-partner-concern-resolved", children: [
3577
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("summary", { children: [
2945
3578
  "\u5DF2\u7ECF\u89E3\u51B3 ",
2946
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: resolved.length })
3579
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: resolved.length })
2947
3580
  ] }),
2948
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: resolved.slice(0, 30).map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { children: [
2949
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 13 }) }),
2950
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: item.subject }),
2951
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "watch"), children: "\u91CD\u65B0\u7559\u610F" })
3581
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: resolved.slice(0, 30).map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("article", { children: [
3582
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconCheckOutline14, { size: 13 }) }),
3583
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: item.subject }),
3584
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", disabled: busy, onClick: () => onAct(item, "watch"), children: "\u91CD\u65B0\u7559\u610F" })
2952
3585
  ] }, item.id)) })
2953
3586
  ] })
2954
3587
  ] });
@@ -2972,184 +3605,370 @@ function activeMention(value, cursor) {
2972
3605
  function watchKindLabel(value) {
2973
3606
  return value === "knowledge" ? "\u77E5\u8BC6\u5E93\u53D8\u5316" : value === "workspace" ? "\u9879\u76EE\u53D8\u5316" : value === "web" ? "\u5916\u90E8\u53D8\u5316" : "\u6309\u4E8B\u60C5\u5224\u65AD\u6765\u6E90";
2974
3607
  }
2975
- var MEMORY_KINDS = ["all", "profile", "preference", "task", "event", "relationship", "emotion"];
2976
- function MemoryLibrary({ memories, reflections, graph, editing, busy, setEditing, save, remove }) {
2977
- const activeMemories = (0, import_react3.useMemo)(() => memories.filter((item) => item.status === "active"), [memories]);
2978
- const [mode, setMode] = (0, import_react3.useState)("memory");
2979
- const [kind, setKind] = (0, import_react3.useState)("all");
2980
- const [query, setQuery] = (0, import_react3.useState)("");
2981
- const [selectedMemoryId, setSelectedMemoryId] = (0, import_react3.useState)();
2982
- const [selectedDate, setSelectedDate] = (0, import_react3.useState)();
3608
+ var MEMORY_KINDS = ["all", "preference", "task", "event", "relationship", "emotion"];
3609
+ function MemoryLibrary({ profiles, memories, reflections, graph, editing, busy, setEditing, save, remove }) {
3610
+ const activeMemories = (0, import_react4.useMemo)(() => memories.filter((item) => item.status === "active" && item.kind !== "profile"), [memories]);
3611
+ const profileMemories = (0, import_react4.useMemo)(() => memories.filter((item) => item.status === "active" && item.kind === "profile"), [memories]);
3612
+ const [mode, setMode] = (0, import_react4.useState)("profile");
3613
+ const [kind, setKind] = (0, import_react4.useState)("all");
3614
+ const [query, setQuery] = (0, import_react4.useState)("");
3615
+ const [selectedMemoryId, setSelectedMemoryId] = (0, import_react4.useState)();
3616
+ const [selectedDate, setSelectedDate] = (0, import_react4.useState)();
2983
3617
  const normalized = query.trim().toLocaleLowerCase();
2984
- const filteredMemories = (0, import_react3.useMemo)(() => activeMemories.filter(
3618
+ const filteredMemories = (0, import_react4.useMemo)(() => activeMemories.filter(
2985
3619
  (item) => (kind === "all" || item.kind === kind) && (!normalized || `${item.subject} ${item.content}`.toLocaleLowerCase().includes(normalized))
2986
3620
  ), [activeMemories, kind, normalized]);
2987
- const filteredReflections = (0, import_react3.useMemo)(() => reflections.filter(
3621
+ const filteredReflections = (0, import_react4.useMemo)(() => reflections.filter(
2988
3622
  (item) => !normalized || `${item.date} ${item.summary} ${item.events.join(" ")} ${item.openTasks.join(" ")} ${item.learnings.join(" ")}`.toLocaleLowerCase().includes(normalized)
2989
3623
  ), [reflections, normalized]);
2990
3624
  const selectedMemory = filteredMemories.find((item) => item.id === selectedMemoryId) ?? filteredMemories[0];
2991
3625
  const selectedReflection = filteredReflections.find((item) => item.date === selectedDate) ?? filteredReflections[0];
2992
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "dsh-partner-memory-library", children: [
2993
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "dsh-partner-library-header", children: [
2994
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
2995
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "MEMORY LIBRARY" }),
2996
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u4F19\u4F34\u8BB0\u5FC6\u5E93" }),
2997
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "\u6309\u7C7B\u578B\u68C0\u7D22\u957F\u671F\u7406\u89E3\uFF0C\u6216\u6309\u65E5\u671F\u56DE\u770B\u6BCF\u5929\u7684\u8BA4\u8BC6\u53D8\u5316\u3002" })
3626
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "dsh-partner-memory-library", borderRadius: 17, distortionScale: -7, saturation: 1.04, children: [
3627
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { className: "dsh-partner-library-header", children: [
3628
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3629
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "MEMORY LIBRARY" }),
3630
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: "\u4F19\u4F34\u8BB0\u5FC6\u5E93" }),
3631
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: "\u67E5\u770B\u4F19\u4F34\u5982\u4F55\u4ECE\u957F\u671F\u5BF9\u8BDD\u4E2D\u8BA4\u8BC6\u4F60\uFF0C\u4EE5\u53CA\u8FD9\u4E9B\u7406\u89E3\u600E\u6837\u968F\u8BC1\u636E\u53D8\u5316\u3002" })
2998
3632
  ] }),
2999
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", { "aria-label": "\u8BB0\u5FC6\u5185\u5BB9", children: [
3000
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: mode === "memory" ? "is-active" : "", onClick: () => setMode("memory"), children: [
3001
- "\u957F\u671F\u8BB0\u5FC6 ",
3002
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: activeMemories.length })
3633
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("nav", { "aria-label": "\u8BB0\u5FC6\u5185\u5BB9", children: [
3634
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: mode === "profile" ? "is-active" : "", onClick: () => setMode("profile"), children: [
3635
+ "\u4EBA\u7269\u753B\u50CF ",
3636
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: profiles.length })
3637
+ ] }),
3638
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: mode === "memory" ? "is-active" : "", onClick: () => setMode("memory"), children: [
3639
+ "\u8BDD\u9898\u8BB0\u5FC6 ",
3640
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: activeMemories.length })
3003
3641
  ] }),
3004
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: mode === "reflection" ? "is-active" : "", onClick: () => setMode("reflection"), children: [
3642
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: mode === "reflection" ? "is-active" : "", onClick: () => setMode("reflection"), children: [
3005
3643
  "\u6BCF\u65E5\u56DE\u987E ",
3006
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: reflections.length })
3644
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: reflections.length })
3007
3645
  ] }),
3008
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: mode === "graph" ? "is-active" : "", onClick: () => setMode("graph"), children: [
3646
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: mode === "graph" ? "is-active" : "", onClick: () => setMode("graph"), children: [
3009
3647
  "\u5173\u7CFB\u56FE\u8C31 ",
3010
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: graph.relations.length })
3648
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: graph.relations.length })
3011
3649
  ] })
3012
3650
  ] })
3013
3651
  ] }),
3014
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-library-tools", children: [
3015
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { children: [
3016
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: "\u641C\u7D22\u8BB0\u5FC6" }),
3017
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { value: query, onChange: (event) => setQuery(event.target.value), placeholder: mode === "memory" ? "\u641C\u7D22\u4E3B\u9898\u6216\u8BB0\u5FC6\u5185\u5BB9" : "\u641C\u7D22\u65E5\u671F\u3001\u603B\u7ED3\u6216\u5F85\u529E" })
3652
+ mode !== "profile" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-library-tools", children: [
3653
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { children: [
3654
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "sr-only", children: "\u641C\u7D22\u8BB0\u5FC6" }),
3655
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("input", { value: query, onChange: (event) => setQuery(event.target.value), placeholder: mode === "memory" ? "\u641C\u7D22\u4E3B\u9898\u6216\u8BB0\u5FC6\u5185\u5BB9" : "\u641C\u7D22\u65E5\u671F\u3001\u603B\u7ED3\u6216\u5F85\u529E" })
3018
3656
  ] }),
3019
- mode === "memory" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-memory-kinds", children: MEMORY_KINDS.map((value) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: kind === value ? "is-active" : "", onClick: () => setKind(value), children: value === "all" ? "\u5168\u90E8" : memoryKind(value) }, value)) })
3657
+ mode === "memory" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-memory-kinds", children: MEMORY_KINDS.map((value) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: kind === value ? "is-active" : "", onClick: () => setKind(value), children: value === "all" ? "\u5168\u90E8" : memoryKind(value) }, value)) })
3020
3658
  ] }),
3021
- mode === "memory" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-library-browser", children: [
3022
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-library-list", role: "list", children: filteredMemories.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: activeMemories.length === 0 ? "\u8FD8\u6CA1\u6709\u957F\u671F\u8BB0\u5FC6" : "\u6CA1\u6709\u5339\u914D\u7684\u8BB0\u5FC6", detail: activeMemories.length === 0 ? "\u4F19\u4F34\u5B8C\u6210\u5BF9\u8BDD\u540E\u4F1A\u81EA\u52A8\u63D0\u70BC\u503C\u5F97\u957F\u671F\u4FDD\u7559\u7684\u4FE1\u606F\u3002" : "\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u7C7B\u578B\u8BD5\u8BD5\u3002", compact: true }) : filteredMemories.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", role: "listitem", className: selectedMemory?.id === item.id ? "is-active" : "", onClick: () => {
3659
+ mode === "profile" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ProfileLibrary, { profiles, memories: profileMemories, editing, busy, setEditing, save, remove }) : mode === "memory" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-library-browser", children: [
3660
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-library-list", role: "list", children: filteredMemories.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: activeMemories.length === 0 ? "\u8FD8\u6CA1\u6709\u957F\u671F\u8BB0\u5FC6" : "\u6CA1\u6709\u5339\u914D\u7684\u8BB0\u5FC6", detail: activeMemories.length === 0 ? "\u4F19\u4F34\u5B8C\u6210\u5BF9\u8BDD\u540E\u4F1A\u81EA\u52A8\u63D0\u70BC\u503C\u5F97\u957F\u671F\u4FDD\u7559\u7684\u4FE1\u606F\u3002" : "\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u7C7B\u578B\u8BD5\u8BD5\u3002", compact: true }) : filteredMemories.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", role: "listitem", className: selectedMemory?.id === item.id ? "is-active" : "", onClick: () => {
3023
3661
  setSelectedMemoryId(item.id);
3024
3662
  setEditing(void 0);
3025
3663
  }, children: [
3026
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "data-kind": item.kind, children: memoryKind(item.kind) }),
3027
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: item.subject }),
3028
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: item.content }),
3029
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: relativeTime(item.updatedAt) })
3664
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { "data-kind": item.kind, children: memoryKind(item.kind) }),
3665
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: item.subject }),
3666
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: item.content }),
3667
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: relativeTime(item.updatedAt) })
3030
3668
  ] }, item.id)) }),
3031
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-library-detail", children: selectedMemory ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MemoryCard, { item: selectedMemory, editing: editing?.id === selectedMemory.id ? editing : void 0, busy, setEditing, save, remove: () => remove(selectedMemory) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u9009\u62E9\u4E00\u6761\u8BB0\u5FC6", detail: "\u8BB0\u5FC6\u8BE6\u60C5\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002", compact: true }) })
3032
- ] }) : mode === "reflection" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-library-browser", children: [
3033
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-library-list is-diary", role: "list", children: filteredReflections.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: reflections.length === 0 ? "\u8FD8\u6CA1\u6709\u6BCF\u65E5\u56DE\u987E" : "\u6CA1\u6709\u5339\u914D\u7684\u56DE\u987E", detail: reflections.length === 0 ? "\u6BCF\u65E5\u56DE\u987E\u4F1A\u5728\u6BCF\u8F6E\u5B8C\u6574\u5BF9\u8BDD\u540E\u6301\u7EED\u66F4\u65B0\u3002" : "\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u65E5\u671F\u8BD5\u8BD5\u3002", compact: true }) : filteredReflections.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", role: "listitem", className: selectedReflection?.date === entry.date ? "is-active" : "", onClick: () => setSelectedDate(entry.date), children: [
3034
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("time", { children: entry.date }),
3035
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { children: [
3669
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-library-detail", children: selectedMemory ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MemoryCard, { item: selectedMemory, editing: editing?.id === selectedMemory.id ? editing : void 0, busy, setEditing, save, remove: () => remove(selectedMemory) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u9009\u62E9\u4E00\u6761\u8BB0\u5FC6", detail: "\u8BB0\u5FC6\u8BE6\u60C5\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002", compact: true }) })
3670
+ ] }) : mode === "reflection" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-library-browser", children: [
3671
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-library-list is-diary", role: "list", children: filteredReflections.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: reflections.length === 0 ? "\u8FD8\u6CA1\u6709\u6BCF\u65E5\u56DE\u987E" : "\u6CA1\u6709\u5339\u914D\u7684\u56DE\u987E", detail: reflections.length === 0 ? "\u6BCF\u65E5\u56DE\u987E\u4F1A\u5728\u6BCF\u8F6E\u5B8C\u6574\u5BF9\u8BDD\u540E\u6301\u7EED\u66F4\u65B0\u3002" : "\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u65E5\u671F\u8BD5\u8BD5\u3002", compact: true }) : filteredReflections.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", role: "listitem", className: selectedReflection?.date === entry.date ? "is-active" : "", onClick: () => setSelectedDate(entry.date), children: [
3672
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("time", { children: entry.date }),
3673
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3036
3674
  entry.turnCount,
3037
3675
  " \u8F6E\u4EA4\u6D41"
3038
3676
  ] }),
3039
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: entry.summary }),
3040
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { children: [
3677
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: entry.summary }),
3678
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
3041
3679
  entry.openTasks.length,
3042
3680
  " \u9879\u5F85\u8DDF\u8FDB \xB7 ",
3043
3681
  entry.learnings.length,
3044
3682
  " \u9879\u7406\u89E3"
3045
3683
  ] })
3046
3684
  ] }, entry.date)) }),
3047
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-library-detail", children: selectedReflection ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DailyReflectionDetail, { entry: selectedReflection }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u9009\u62E9\u4E00\u5929", detail: "\u5F53\u5929\u7684\u603B\u7ED3\u4E0E\u5F85\u529E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002", compact: true }) })
3048
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MemoryGraph, { graph, query: normalized })
3685
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-library-detail", children: selectedReflection ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(DailyReflectionDetail, { entry: selectedReflection }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u9009\u62E9\u4E00\u5929", detail: "\u5F53\u5929\u7684\u603B\u7ED3\u4E0E\u5F85\u529E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002", compact: true }) })
3686
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MemoryGraph, { graph, profiles, query: normalized, inspect: (item) => {
3687
+ setEditing(void 0);
3688
+ if (item.kind === "profile") setMode("profile");
3689
+ else {
3690
+ setSelectedMemoryId(item.id);
3691
+ setMode("memory");
3692
+ }
3693
+ } })
3049
3694
  ] });
3050
3695
  }
3051
- function MemoryGraph({ graph, query }) {
3052
- const visible = graph.memories.filter((item) => !query || `${item.subject} ${item.content}`.toLocaleLowerCase().includes(query));
3053
- const [selectedId, setSelectedId] = (0, import_react3.useState)();
3054
- const selected = visible.find((item) => item.id === selectedId) ?? visible[0];
3055
- const related = selected ? graph.relations.filter((item) => item.sourceMemoryId === selected.id || item.targetMemoryId === selected.id) : [];
3056
- const byId = new Map(graph.memories.map((item) => [item.id, item]));
3057
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-graph-browser", children: [
3058
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-graph-index", children: visible.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u8FD8\u6CA1\u6709\u5173\u7CFB\u56FE\u8C31", detail: "\u5B8C\u6210\u6BCF\u65E5\u7EC8\u5BA1\u540E\uFF0C\u4F1A\u628A\u6709\u53EF\u9760\u8BC1\u636E\u7684\u8BB0\u5FC6\u5173\u7CFB\u6574\u7406\u5230\u8FD9\u91CC\u3002", compact: true }) : visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: selected?.id === item.id ? "is-active" : "", onClick: () => setSelectedId(item.id), children: [
3059
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "data-kind": item.kind, children: memoryKind(item.kind) }),
3060
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: item.subject }),
3061
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { children: [
3062
- graph.relations.filter((edge) => edge.sourceMemoryId === item.id || edge.targetMemoryId === item.id).length,
3063
- " \u6761\u5173\u7CFB"
3696
+ function ProfileLibrary({ profiles, memories, editing, busy, setEditing, save, remove }) {
3697
+ const [selectedScopeId, setSelectedScopeId] = (0, import_react4.useState)();
3698
+ const selected = profiles.find((item) => item.scopeId === selectedScopeId) ?? profiles[0];
3699
+ if (!selected) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA\u753B\u50CF", detail: "\u8054\u7CFB\u4EBA\u5F00\u59CB\u548C\u4F19\u4F34\u4EA4\u6D41\u540E\uFF0C\u8FD9\u91CC\u4F1A\u9010\u6B65\u5C55\u793A\u4F19\u4F34\u4ECE\u660E\u786E\u5BF9\u8BDD\u4E2D\u5F62\u6210\u7684\u957F\u671F\u7406\u89E3\u3002" });
3700
+ const activeIds = new Set(selected.entries.map((item) => item.id));
3701
+ const pending = memories.filter((item) => item.scopeId === selected.scopeId && !activeIds.has(item.id));
3702
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-profile-browser", children: [
3703
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-profile-people", role: "list", "aria-label": "\u8054\u7CFB\u4EBA\u753B\u50CF", children: profiles.map((profile) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", role: "listitem", className: profile.scopeId === selected.scopeId ? "is-active" : "", onClick: () => {
3704
+ setSelectedScopeId(profile.scopeId);
3705
+ setEditing(void 0);
3706
+ }, children: [
3707
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconUserOutline16, { size: 16 }) }),
3708
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
3709
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: profile.label }),
3710
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: profile.entries.length > 0 ? `${profile.entries.length} \u9879\u7A33\u5B9A\u7406\u89E3` : "\u8FD8\u5728\u8BA4\u8BC6\u4E2D" })
3711
+ ] }),
3712
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { "aria-hidden": "true" })
3713
+ ] }, profile.scopeId)) }),
3714
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-profile-stage", children: [
3715
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { className: "dsh-partner-profile-heading", children: [
3716
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3717
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "PARTNER UNDERSTANDING" }),
3718
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3719
+ "\u4F19\u4F34\u773C\u4E2D\u7684 ",
3720
+ selected.label
3721
+ ] }),
3722
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: "\u8FD9\u4E9B\u5185\u5BB9\u6765\u81EA\u4F60\u5728\u5BF9\u8BDD\u4E2D\u7684\u660E\u786E\u8868\u8FBE\u3002\u4F19\u4F34\u4F1A\u7528\u5B83\u4FDD\u6301\u7406\u89E3\u8FDE\u7EED\uFF0C\u4F46\u4E0D\u4F1A\u628A\u753B\u50CF\u5F53\u6210\u6807\u7B7E\u53CD\u590D\u590D\u8FF0\u3002" })
3723
+ ] }),
3724
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { "data-ready": selected.entries.length > 0, children: [
3725
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}),
3726
+ selected.entries.length > 0 ? "\u4E0A\u4E0B\u6587\u57FA\u7EBF\u5DF2\u5C31\u7EEA" : "\u7B49\u5F85\u53EF\u9760\u8BC1\u636E"
3727
+ ] })
3728
+ ] }),
3729
+ selected.entries.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
3730
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-profile-meta", children: [
3731
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3732
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u753B\u50CF\u7248\u672C" }),
3733
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: selected.version })
3734
+ ] }),
3735
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3736
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u5BF9\u8BDD\u4F9D\u636E" }),
3737
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3738
+ selected.evidenceCount,
3739
+ " \u5904"
3740
+ ] })
3741
+ ] }),
3742
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3743
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u7528\u6237\u786E\u8BA4" }),
3744
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3745
+ selected.lockedCount,
3746
+ " \u9879"
3747
+ ] })
3748
+ ] }),
3749
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3750
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u6700\u8FD1\u4F9D\u636E" }),
3751
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: selected.updatedAt ? relativeTime(selected.updatedAt) : "\u5C1A\u672A" })
3752
+ ] })
3753
+ ] }),
3754
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-profile-entries", children: selected.entries.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MemoryCard, { item, editing: editing?.id === item.id ? editing : void 0, busy, setEditing, save, remove: () => remove(item) }, item.id)) })
3755
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u4F19\u4F34\u8FD8\u5728\u8BA4\u8BC6\u4F60", detail: "\u53EA\u6709\u660E\u786E\u3001\u7A33\u5B9A\u5E76\u8FBE\u5230\u53EF\u9760\u6807\u51C6\u7684\u957F\u671F\u4FE1\u606F\u624D\u4F1A\u8FDB\u5165\u753B\u50CF\uFF1B\u666E\u901A\u504F\u597D\u3001\u4E34\u65F6\u4EFB\u52A1\u548C\u4E00\u6B21\u6027\u60C5\u7EEA\u4E0D\u4F1A\u653E\u5728\u8FD9\u91CC\u3002", compact: true }),
3756
+ pending.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("details", { className: "dsh-partner-profile-pending", children: [
3757
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("summary", { children: [
3758
+ "\u5F85\u786E\u8BA4\u7684\u7406\u89E3 ",
3759
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: pending.length })
3760
+ ] }),
3761
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: pending.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MemoryCard, { item, editing: editing?.id === item.id ? editing : void 0, busy, setEditing, save, remove: () => remove(item) }, item.id)) })
3064
3762
  ] })
3065
- ] }, item.id)) }),
3066
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-graph-stage", children: selected ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
3067
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
3068
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "data-kind": selected.kind, children: memoryKind(selected.kind) }),
3069
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: selected.subject }),
3070
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: selected.content })
3763
+ ] })
3764
+ ] });
3765
+ }
3766
+ var RELATION_FILTERS = ["all", "conflicts_with", "depends_on", "supports", "follows", "about"];
3767
+ function MemoryGraph({ graph, profiles, query, inspect }) {
3768
+ const byId = new Map(graph.memories.map((item) => [item.id, item]));
3769
+ const scopeIds = [...new Set(graph.relations.map((item) => item.scopeId))];
3770
+ const [requestedScopeId, setRequestedScopeId] = (0, import_react4.useState)();
3771
+ const scopeId = scopeIds.includes(requestedScopeId ?? "") ? requestedScopeId : scopeIds[0];
3772
+ const [filter, setFilter] = (0, import_react4.useState)("all");
3773
+ const scoped = graph.relations.filter((item) => item.scopeId === scopeId);
3774
+ const visible = scoped.filter((item) => {
3775
+ if (filter !== "all" && item.kind !== filter) return false;
3776
+ const source2 = byId.get(item.sourceMemoryId);
3777
+ const target2 = byId.get(item.targetMemoryId);
3778
+ return !query || `${source2?.subject ?? ""} ${source2?.content ?? ""} ${target2?.subject ?? ""} ${target2?.content ?? ""} ${item.label}`.toLocaleLowerCase().includes(query);
3779
+ }).sort((left, right) => Number(right.kind === "conflicts_with") - Number(left.kind === "conflicts_with") || right.confidence - left.confidence);
3780
+ const [selectedRelationId, setSelectedRelationId] = (0, import_react4.useState)();
3781
+ const selected = visible.find((item) => item.id === selectedRelationId) ?? visible[0];
3782
+ const source = selected ? byId.get(selected.sourceMemoryId) : void 0;
3783
+ const target = selected ? byId.get(selected.targetMemoryId) : void 0;
3784
+ const label = profiles.find((item) => item.scopeId === scopeId)?.label ?? (scopeId ? `\u8054\u7CFB\u4EBA ${scopeId.slice(-6)}` : "\u5F53\u524D\u8054\u7CFB\u4EBA");
3785
+ const conflictCount = scoped.filter((item) => item.kind === "conflicts_with").length;
3786
+ if (graph.relations.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u8FD8\u6CA1\u6709\u53EF\u9760\u5173\u7CFB", detail: "\u6BCF\u65E5\u7EC8\u5BA1\u53EA\u4F1A\u4FDD\u5B58\u6709\u660E\u786E\u8BC1\u636E\u7684\u8BB0\u5FC6\u8054\u7CFB\uFF0C\u4E0D\u4F1A\u4E3A\u4E86\u586B\u6EE1\u56FE\u8C31\u800C\u731C\u6D4B\u3002" });
3787
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-graph-audit", children: [
3788
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { className: "dsh-partner-graph-toolbar", children: [
3789
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3790
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: "\u5173\u7CFB\u5BA1\u8BA1" }),
3791
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3792
+ label,
3793
+ " \u7684\u7406\u89E3\u5173\u7CFB"
3794
+ ] }),
3795
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("p", { children: [
3796
+ scoped.length,
3797
+ " \u6761\u53EF\u9760\u8054\u7CFB",
3798
+ conflictCount > 0 ? `\uFF0C\u5176\u4E2D ${conflictCount} \u6761\u9700\u8981\u786E\u8BA4` : "\uFF0C\u6682\u65E0\u5F85\u786E\u8BA4\u51B2\u7A81"
3799
+ ] })
3071
3800
  ] }),
3072
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-partner-graph-links", children: related.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(State, { title: "\u6682\u65E0\u53EF\u9760\u5173\u7CFB", detail: "\u7EC8\u5BA1\u4E0D\u4F1A\u4E3A\u4E86\u586B\u6EE1\u56FE\u8C31\u800C\u731C\u6D4B\u5173\u7CFB\u3002", compact: true }) : related.map((edge) => {
3073
- const outgoing = edge.sourceMemoryId === selected.id;
3074
- const target = byId.get(outgoing ? edge.targetMemoryId : edge.sourceMemoryId);
3075
- return target ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", onClick: () => setSelectedId(target.id), children: [
3076
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}),
3077
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
3078
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: outgoing ? relationLabel(edge.kind) : `\u88AB${relationLabel(edge.kind)}` }),
3079
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: target.subject }),
3080
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: edge.label })
3801
+ scopeIds.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { children: [
3802
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "\u8054\u7CFB\u4EBA" }),
3803
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("select", { value: scopeId, onChange: (event) => {
3804
+ setRequestedScopeId(event.target.value);
3805
+ setSelectedRelationId(void 0);
3806
+ }, children: scopeIds.map((value) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value, children: profiles.find((item) => item.scopeId === value)?.label ?? `\u8054\u7CFB\u4EBA ${value.slice(-6)}` }, value)) })
3807
+ ] })
3808
+ ] }),
3809
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("nav", { className: "dsh-partner-graph-filters", "aria-label": "\u5173\u7CFB\u7C7B\u578B", children: RELATION_FILTERS.map((value) => {
3810
+ const count = value === "all" ? scoped.length : scoped.filter((item) => item.kind === value).length;
3811
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: filter === value ? "is-active" : "", "aria-pressed": filter === value, onClick: () => {
3812
+ setFilter(value);
3813
+ setSelectedRelationId(void 0);
3814
+ }, children: [
3815
+ value === "all" ? "\u5168\u90E8" : relationLabel(value),
3816
+ " ",
3817
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: count })
3818
+ ] }, value);
3819
+ }) }),
3820
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-graph-browser", children: [
3821
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-graph-index", role: "list", children: visible.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u6CA1\u6709\u5339\u914D\u7684\u5173\u7CFB", detail: "\u8C03\u6574\u5173\u7CFB\u7C7B\u578B\u6216\u641C\u7D22\u5173\u952E\u8BCD\u540E\u518D\u8BD5\u3002", compact: true }) : visible.map((item) => {
3822
+ const from = byId.get(item.sourceMemoryId);
3823
+ const to = byId.get(item.targetMemoryId);
3824
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", role: "listitem", "data-kind": item.kind, className: selected?.id === item.id ? "is-active" : "", onClick: () => setSelectedRelationId(item.id), children: [
3825
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: relationLabel(item.kind) }),
3826
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3827
+ from?.subject ?? "\u5DF2\u5220\u9664\u8BB0\u5FC6",
3828
+ " ",
3829
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { "aria-hidden": "true", children: "\u2192" }),
3830
+ " ",
3831
+ to?.subject ?? "\u5DF2\u5220\u9664\u8BB0\u5FC6"
3832
+ ] }),
3833
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: item.label }),
3834
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
3835
+ Math.round(item.confidence * 100),
3836
+ "% \u53EF\u4FE1"
3837
+ ] })
3838
+ ] }, item.id);
3839
+ }) }),
3840
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "dsh-partner-graph-stage", children: selected && source && target ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("article", { "data-kind": selected.kind, children: [
3841
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
3842
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: relationLabel(selected.kind) }),
3843
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3844
+ source.subject,
3845
+ " ",
3846
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { "aria-hidden": "true", children: "\u2192" }),
3847
+ " ",
3848
+ target.subject
3849
+ ] }),
3850
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: selected.label }),
3851
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: relationGuidance(selected.kind) })
3852
+ ] }),
3853
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-graph-pair", children: [
3854
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GraphMemory, { item: source, side: "\u8D77\u70B9", inspect }),
3855
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { "aria-hidden": "true", children: [
3856
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}),
3857
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: relationLabel(selected.kind) }),
3858
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {})
3081
3859
  ] }),
3082
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("b", { children: [
3083
- Math.round(edge.confidence * 100),
3860
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GraphMemory, { item: target, side: "\u5173\u8054\u9879", inspect })
3861
+ ] }),
3862
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("footer", { children: [
3863
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
3864
+ "\u6700\u8FD1\u7EC8\u5BA1\u4E8E ",
3865
+ new Date(selected.updatedAt).toLocaleString()
3866
+ ] }),
3867
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3868
+ "\u5173\u7CFB\u7F6E\u4FE1\u5EA6 ",
3869
+ Math.round(selected.confidence * 100),
3084
3870
  "%"
3085
3871
  ] })
3086
- ] }, edge.id) : null;
3087
- }) })
3088
- ] }) : null })
3872
+ ] })
3873
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(State, { title: "\u9009\u62E9\u4E00\u6761\u5173\u7CFB", detail: "\u5173\u7CFB\u4E24\u7AEF\u7684\u8BB0\u5FC6\u4E0E\u4F7F\u7528\u65B9\u5F0F\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002", compact: true }) })
3874
+ ] })
3875
+ ] });
3876
+ }
3877
+ function GraphMemory({ item, side, inspect }) {
3878
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(GlassSurface, { as: "section", interactive: true, className: "", borderRadius: 13, distortionScale: -8, saturation: 1.04, children: [
3879
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
3880
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
3881
+ side,
3882
+ " \xB7 ",
3883
+ memoryKind(item.kind)
3884
+ ] }),
3885
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: item.subject })
3886
+ ] }),
3887
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: item.content }),
3888
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => inspect(item), children: "\u67E5\u770B\u5E76\u4FEE\u6B63" })
3089
3889
  ] });
3090
3890
  }
3091
3891
  function relationLabel(kind) {
3092
3892
  return { supports: "\u652F\u6301", depends_on: "\u4F9D\u8D56", about: "\u5173\u4E8E", conflicts_with: "\u51B2\u7A81", follows: "\u540E\u7EED" }[kind];
3093
3893
  }
3894
+ function relationGuidance(kind) {
3895
+ return {
3896
+ supports: "\u56DE\u7B54\u6D89\u53CA\u76EE\u6807\u8BB0\u5FC6\u65F6\uFF0C\u53EF\u628A\u8D77\u70B9\u4F5C\u4E3A\u660E\u786E\u652F\u6301\u4F9D\u636E\uFF0C\u4F46\u4E0D\u80FD\u636E\u6B64\u8865\u5199\u65B0\u4E8B\u5B9E\u3002",
3897
+ depends_on: "\u5904\u7406\u8D77\u70B9\u4E8B\u9879\u65F6\uFF0C\u5E94\u540C\u65F6\u68C0\u67E5\u5173\u8054\u9879\u662F\u5426\u6210\u7ACB\u6216\u5DF2\u7ECF\u5B8C\u6210\u3002",
3898
+ about: "\u4E24\u6761\u8BB0\u5FC6\u5C5E\u4E8E\u540C\u4E00\u4E0A\u4E0B\u6587\uFF0C\u53EC\u56DE\u5176\u4E2D\u4E00\u6761\u65F6\u53EF\u4EE5\u8865\u5145\u53E6\u4E00\u6761\u5E2E\u52A9\u7406\u89E3\u3002",
3899
+ conflicts_with: "\u4E24\u6761\u7406\u89E3\u6682\u65F6\u4E0D\u80FD\u540C\u65F6\u4F5C\u4E3A\u4E8B\u5B9E\uFF1B\u4F19\u4F34\u5E94\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u6307\u51FA\u5DEE\u5F02\u5E76\u8BF7\u6C42\u786E\u8BA4\u3002",
3900
+ follows: "\u5B83\u4EEC\u5B58\u5728\u660E\u786E\u5148\u540E\u5173\u7CFB\uFF0C\u540E\u7EED\u5224\u65AD\u9700\u8981\u4FDD\u7559\u8FD9\u4E2A\u987A\u5E8F\u3002"
3901
+ }[kind];
3902
+ }
3094
3903
  function DailyReflectionDetail({ entry }) {
3095
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("article", { className: "dsh-partner-diary-detail", children: [
3096
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
3097
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("time", { children: entry.date }),
3098
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { children: [
3904
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("article", { className: "dsh-partner-diary-detail", children: [
3905
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
3906
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("time", { children: entry.date }),
3907
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("strong", { children: [
3099
3908
  entry.turnCount,
3100
3909
  " \u8F6E\u4EA4\u6D41\u540E\u7684\u7406\u89E3"
3101
3910
  ] }),
3102
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { children: [
3911
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
3103
3912
  "\u66F4\u65B0\u4E8E ",
3104
3913
  new Date(entry.updatedAt).toLocaleString()
3105
3914
  ] })
3106
3915
  ] }),
3107
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: entry.summary }),
3108
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReflectionGroup, { title: "\u5F85\u8DDF\u8FDB", items: entry.openTasks }),
3109
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReflectionGroup, { title: "\u5F53\u5929\u4E8B\u4EF6", items: entry.events }),
3110
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReflectionGroup, { title: "\u65B0\u7406\u89E3", items: entry.learnings }),
3111
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReflectionGroup, { title: "\u5DF2\u5B8C\u6210", items: entry.completedTasks })
3916
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: entry.summary }),
3917
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ReflectionGroup, { title: "\u5F85\u8DDF\u8FDB", items: entry.openTasks }),
3918
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ReflectionGroup, { title: "\u5F53\u5929\u4E8B\u4EF6", items: entry.events }),
3919
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ReflectionGroup, { title: "\u65B0\u7406\u89E3", items: entry.learnings }),
3920
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ReflectionGroup, { title: "\u5DF2\u5B8C\u6210", items: entry.completedTasks })
3112
3921
  ] });
3113
3922
  }
3114
3923
  function ReflectionGroup({ title, items }) {
3115
3924
  if (items.length === 0) return null;
3116
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { children: [
3117
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: title }),
3118
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: item }, item)) })
3925
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("section", { children: [
3926
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: title }),
3927
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: item }, item)) })
3119
3928
  ] });
3120
3929
  }
3121
3930
  function MemoryCard({ item, editing, busy, setEditing, save, remove }) {
3122
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("article", { "data-kind": item.kind, children: editing ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-partner-memory-editor", children: [
3123
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { "aria-label": "\u8BB0\u5FC6\u4E3B\u9898", value: editing.subject, onChange: (event) => setEditing({ ...editing, subject: event.target.value }) }),
3124
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("textarea", { "aria-label": "\u8BB0\u5FC6\u5185\u5BB9", value: editing.content, onChange: (event) => setEditing({ ...editing, content: event.target.value }) }),
3125
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("footer", { children: [
3126
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => setEditing(void 0), children: "\u53D6\u6D88" }),
3127
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "is-primary", disabled: busy || !editing.subject.trim() || !editing.content.trim(), onClick: save, children: "\u4FDD\u5B58\u4FEE\u6B63" })
3931
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("article", { "data-kind": item.kind, children: editing ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "dsh-partner-memory-editor", children: [
3932
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("input", { "aria-label": "\u8BB0\u5FC6\u4E3B\u9898", value: editing.subject, onChange: (event) => setEditing({ ...editing, subject: event.target.value }) }),
3933
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("textarea", { "aria-label": "\u8BB0\u5FC6\u5185\u5BB9", value: editing.content, onChange: (event) => setEditing({ ...editing, content: event.target.value }) }),
3934
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("footer", { children: [
3935
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => setEditing(void 0), children: "\u53D6\u6D88" }),
3936
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", className: "is-primary", disabled: busy || !editing.subject.trim() || !editing.content.trim(), onClick: save, children: "\u4FDD\u5B58\u4FEE\u6B63" })
3128
3937
  ] })
3129
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
3130
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { children: [
3131
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: memoryKind(item.kind) }),
3132
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
3133
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => setEditing({ ...item }), children: "\u7F16\u8F91" }),
3134
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: remove, children: "\u5220\u9664" })
3938
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
3939
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { children: [
3940
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: memoryKind(item.kind) }),
3941
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
3942
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: () => setEditing({ ...item }), children: "\u7F16\u8F91" }),
3943
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("button", { type: "button", onClick: remove, children: "\u5220\u9664" })
3135
3944
  ] })
3136
3945
  ] }),
3137
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: item.subject }),
3138
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: item.content }),
3139
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("footer", { children: [
3140
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("progress", { max: 1, value: item.confidence, "aria-label": `\u7F6E\u4FE1\u5EA6 ${Math.round(item.confidence * 100)}%` }),
3141
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("small", { children: [
3946
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: item.subject }),
3947
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: item.content }),
3948
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("footer", { children: [
3949
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("progress", { max: 1, value: item.confidence, "aria-label": `\u7F6E\u4FE1\u5EA6 ${Math.round(item.confidence * 100)}%` }),
3950
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("small", { children: [
3142
3951
  item.locked ? "\u624B\u52A8\u786E\u8BA4" : `${Math.round(item.confidence * 100)}% \u53EF\u4FE1`,
3143
3952
  " \xB7 ",
3144
3953
  relativeTime(item.updatedAt)
3145
3954
  ] })
3955
+ ] }),
3956
+ item.evidence.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("details", { className: "dsh-partner-memory-evidence", children: [
3957
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("summary", { children: [
3958
+ "\u67E5\u770B\u5BF9\u8BDD\u4F9D\u636E ",
3959
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: item.evidence.length })
3960
+ ] }),
3961
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: [...item.evidence].reverse().map((evidence) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("blockquote", { children: [
3962
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: evidence.excerpt }),
3963
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("time", { children: new Date(evidence.at).toLocaleString() })
3964
+ ] }, `${evidence.turnId}:${evidence.at}`)) })
3146
3965
  ] })
3147
3966
  ] }) });
3148
3967
  }
3149
3968
  function Status({ channel }) {
3150
3969
  const status = !channel ? "unbound" : channel.runtimeStatus;
3151
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: `dsh-partner-status is-${status}`, children: [
3152
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}),
3970
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: `dsh-partner-status is-${status}`, children: [
3971
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}),
3153
3972
  !channel ? "\u672A\u8FDE\u63A5" : statusLabel(channel.runtimeStatus)
3154
3973
  ] });
3155
3974
  }
@@ -3157,41 +3976,41 @@ function statusLabel(status) {
3157
3976
  return status === "running" ? "\u5FAE\u4FE1\u5728\u7EBF" : status === "starting" ? "\u8FDE\u63A5\u4E2D" : status === "error" ? "\u8FDE\u63A5\u5F02\u5E38" : "\u5DF2\u505C\u7528";
3158
3977
  }
3159
3978
  function Avatar({ name, small = false }) {
3160
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `dsh-partner-avatar${small ? " is-small" : ""}`, "aria-hidden": "true", children: [...name][0] ?? "\u4F34" });
3979
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `dsh-partner-avatar${small ? " is-small" : ""}`, "aria-hidden": "true", children: [...name][0] ?? "\u4F34" });
3161
3980
  }
3162
3981
  function WeixinGlyph({ large = false }) {
3163
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: `dsh-partner-weixin-glyph${large ? " is-large" : ""}`, "aria-hidden": "true", children: [
3164
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("i", {}),
3165
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", {})
3982
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: `dsh-partner-weixin-glyph${large ? " is-large" : ""}`, "aria-hidden": "true", children: [
3983
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", {}),
3984
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", {})
3166
3985
  ] });
3167
3986
  }
3168
3987
  function TabButton({ active, onClick, icon, children }) {
3169
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: active ? "is-active" : "", onClick, children: [
3988
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("button", { type: "button", className: active ? "is-active" : "", onClick, children: [
3170
3989
  icon,
3171
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children })
3990
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children })
3172
3991
  ] });
3173
3992
  }
3174
3993
  function Field({ label, hint, children }) {
3175
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "dsh-partner-field", children: [
3176
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
3177
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: label }),
3178
- hint && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: hint })
3994
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("label", { className: "dsh-partner-field", children: [
3995
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
3996
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: label }),
3997
+ hint && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: hint })
3179
3998
  ] }),
3180
3999
  children
3181
4000
  ] });
3182
4001
  }
3183
4002
  function Section({ eyebrow, title, detail }) {
3184
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "dsh-partner-section", children: [
3185
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: eyebrow }),
3186
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: title }),
3187
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: detail })
4003
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { className: "dsh-partner-section", children: [
4004
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("small", { children: eyebrow }),
4005
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { children: title }),
4006
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: detail })
3188
4007
  ] });
3189
4008
  }
3190
4009
  function State({ title, detail, action, compact = false }) {
3191
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: `dsh-partner-state${compact ? " is-compact" : ""}`, children: [
3192
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 20 }),
3193
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: title }),
3194
- detail && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: detail }),
4010
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: `dsh-partner-state${compact ? " is-compact" : ""}`, children: [
4011
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_dsh_client_ui_primitives.IconAgentPresetOutline16, { size: 20 }),
4012
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { children: title }),
4013
+ detail && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: detail }),
3195
4014
  action
3196
4015
  ] });
3197
4016
  }