dsh-edge 0.9.0 → 0.10.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 (56) hide show
  1. package/THIRD_PARTY_NOTICES.md +1318 -1075
  2. package/dist/assets/index-Df-65__b.js +110 -0
  3. package/dist/assets/index-b24khbeK.css +1 -0
  4. package/dist/assets/langs/{php-DDkx9sim.js → php-DJl5gRdb.js} +2 -2
  5. package/dist/assets/langs/{ruby-DCxyoPen.js → ruby-5eNB0pDK.js} +2 -2
  6. package/dist/assets/vendor-BNsW4eBh.css +1 -0
  7. package/dist/assets/vendor-CCJJTK99.js +411 -0
  8. package/dist/index.html +8 -8
  9. package/dist/plugins/@deepseek-ai/dsh-api-gateway/client.js +1513 -77
  10. package/dist/plugins/@deepseek-ai/dsh-api-remotes/client.js +3608 -757
  11. package/dist/plugins/@deepseek-ai/dsh-api-session-controller/client.js +2777 -0
  12. package/dist/plugins/@deepseek-ai/dsh-api-workspace-controller/client.js +415 -0
  13. package/dist/plugins/@deepseek-ai/dsh-client-connection/client.js +1975 -7466
  14. package/dist/plugins/@deepseek-ai/dsh-client-locale/client.js +225 -76
  15. package/dist/plugins/@deepseek-ai/dsh-client-modules/client.js +67 -15
  16. package/dist/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js +270 -460
  17. package/dist/plugins/@deepseek-ai/dsh-client-ui-approval/client.js +292 -0
  18. package/dist/plugins/@deepseek-ai/dsh-client-ui-attachment/client.js +42 -17
  19. package/dist/plugins/@deepseek-ai/dsh-client-ui-brand-official/client.js +7 -9
  20. package/dist/plugins/@deepseek-ai/dsh-client-ui-chat/client.js +8177 -0
  21. package/dist/plugins/@deepseek-ai/dsh-client-ui-commands/client.js +22 -10
  22. package/dist/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js +14950 -8910
  23. package/dist/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js +161 -137
  24. package/dist/plugins/@deepseek-ai/dsh-client-ui-goal/client.js +6 -7
  25. package/dist/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js +268 -40
  26. package/dist/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js +1 -1
  27. package/dist/plugins/@deepseek-ai/dsh-client-ui-layout/client.js +45 -11
  28. package/dist/plugins/@deepseek-ai/dsh-client-ui-message-feedback/client.js +30 -58
  29. package/dist/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js +188 -89
  30. package/dist/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js +105 -75
  31. package/dist/plugins/@deepseek-ai/dsh-client-ui-renderer/client.js +650 -188
  32. package/dist/plugins/@deepseek-ai/dsh-client-ui-schedule/client.js +307 -0
  33. package/dist/plugins/@deepseek-ai/dsh-client-ui-session/client.js +340 -0
  34. package/dist/plugins/@deepseek-ai/dsh-client-ui-settings/client.js +57 -50
  35. package/dist/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js +134 -69
  36. package/dist/plugins/@deepseek-ai/dsh-client-ui-settings-models/client.js +575 -442
  37. package/dist/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js +24 -11
  38. package/dist/plugins/@deepseek-ai/dsh-client-ui-skill/client.js +13 -9
  39. package/dist/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js +44 -20
  40. package/dist/plugins/@deepseek-ai/dsh-client-ui-theme/client.js +265 -94
  41. package/dist/plugins/@deepseek-ai/dsh-client-ui-tool/client.js +899 -433
  42. package/dist/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js +1472 -613
  43. package/dist/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js +249 -95
  44. package/dist/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js +5 -5
  45. package/dist/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js +425 -146
  46. package/dist/plugins/@deepseek-ai/dsh-typert-registry/client.js +29 -14
  47. package/dist/plugins/dsh-edge-client-ui/client.js +28 -26
  48. package/package.json +62 -58
  49. package/scripts/verify-packed.mjs +1 -1
  50. package/worker/direct/index.js +2866 -1466
  51. package/worker/isolated/index.js +2438 -1038
  52. package/dist/assets/index-C6eRlFa6.css +0 -1
  53. package/dist/assets/index-ClqxG24t.js +0 -96
  54. package/dist/assets/vendor-CjyC-hUb.css +0 -1
  55. package/dist/assets/vendor-D22_Mp1f.js +0 -411
  56. package/dist/plugins/@deepseek-ai/dsh-client-runtime/client.js +0 -10574
@@ -6,7 +6,7 @@ window.__ModuleLoader__.load({
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let react = require("react");
9
- let _deepseek_ai_dsh_client_runtime_client = require("@deepseek-ai/dsh-client-runtime/client");
9
+ let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
10
10
  /** Viewport width below which the sidebar auto-collapses to the rail (deepsuite
11
11
  * LG breakpoint); a manual toggle below it re-expands over the squeezed center
12
12
  * (stores.ts narrowExpanded). */
@@ -52,8 +52,25 @@ window.__ModuleLoader__.load({
52
52
  };
53
53
  }
54
54
  //#endregion
55
+ //#region lib/types/client/DocumentTitle.js
56
+ /**
57
+ * Project the selected durable session title into the browser title and
58
+ * restore the build-selected product title when unmounted.
59
+ * @param props - Selected session title projection.
60
+ * @returns No rendered content.
61
+ */
62
+ function DocumentTitle({ title, productTitle }) {
63
+ (0, react.useEffect)(() => {
64
+ document.title = title === void 0 ? productTitle : `${title} — ${productTitle}`;
65
+ return () => {
66
+ document.title = productTitle;
67
+ };
68
+ }, [productTitle, title]);
69
+ return null;
70
+ }
71
+ //#endregion
55
72
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-layout/src/client/AppFrame.module.css.mjs
56
- const css = ".pI_x6G_frame{background:var(--dsw-alias-bg-base);height:100%;transition:grid-template-columns var(--ds-transition-duration-slow) var(--ds-ease-in-out);grid-template-rows:100%;display:grid;position:relative;overflow:hidden}.pI_x6G_frame[data-dragging]{transition:none}@media (prefers-reduced-motion:reduce){.pI_x6G_frame{transition:none}}.pI_x6G_sidebarCol{background:var(--dsw-specific-sidebar-fill);border-right:1px solid var(--dsw-alias-border-l1);min-width:0;overflow:hidden}.pI_x6G_centerCol{flex-direction:column;min-width:0;display:flex;overflow:hidden}.pI_x6G_detailsCol{border-left:1px solid var(--dsw-alias-border-l2);min-width:0;overflow:hidden}.pI_x6G_frame[data-details-collapsed] .pI_x6G_detailsCol{border-left:none}.pI_x6G_handle{cursor:col-resize;z-index:2;touch-action:none;width:8px;transition:left var(--ds-transition-duration-slow) var(--ds-ease-in-out);margin-left:-4px;position:absolute;top:0;bottom:0}.pI_x6G_frame[data-dragging] .pI_x6G_handle{transition:none}@media (prefers-reduced-motion:reduce){.pI_x6G_handle{transition:none}}.pI_x6G_handle[data-side=details]:after{content:\"\";box-sizing:border-box;background:var(--dsw-alias-button-floating-fill);border:1px solid var(--dsw-alias-border-l2-darkmode-thin);opacity:0;width:12px;height:32px;transition:opacity var(--ds-transition-duration-slow) var(--ds-ease-in-out), background var(--ds-transition-duration-slow) var(--ds-ease-in-out);border-radius:10px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.pI_x6G_detailsCol:hover~.pI_x6G_handle[data-side=details]:after,.pI_x6G_handle[data-side=details]:hover:after,.pI_x6G_handle[data-side=details][data-dragging=true]:after{opacity:1}.pI_x6G_handle[data-side=details]:hover:after,.pI_x6G_handle[data-side=details][data-dragging=true]:after{background:var(--dsw-alias-button-floating-hover);border-color:var(--dsw-alias-border-l3)}.pI_x6G_overlayLayer{z-index:20;pointer-events:none;position:absolute;inset:0}.pI_x6G_overlayLayer>*{pointer-events:auto}";
73
+ const css = ".pI_x6G_frame{background:var(--dsw-alias-bg-base);height:100%;transition:grid-template-columns var(--ds-transition-duration-slow) var(--ds-ease-in-out);grid-template-rows:100%;display:grid;position:relative;overflow:hidden}.pI_x6G_frame[data-dragging]{transition:none}@media (prefers-reduced-motion:reduce){.pI_x6G_frame{transition:none}}.pI_x6G_sidebarCol{background:var(--dsw-specific-sidebar-fill);border-right:.5px solid var(--dsw-alias-border-l3);min-width:0;overflow:hidden}.pI_x6G_centerCol{flex-direction:column;min-width:0;display:flex;overflow:hidden}.pI_x6G_detailsCol{border-left:.5px solid var(--dsw-alias-border-l3);min-width:0;overflow:hidden}.pI_x6G_frame[data-details-collapsed] .pI_x6G_detailsCol{border-left:none}.pI_x6G_handle{cursor:col-resize;z-index:2;touch-action:none;width:8px;transition:left var(--ds-transition-duration-slow) var(--ds-ease-in-out);margin-left:-4px;position:absolute;top:0;bottom:0}.pI_x6G_frame[data-dragging] .pI_x6G_handle{transition:none}@media (prefers-reduced-motion:reduce){.pI_x6G_handle{transition:none}}.pI_x6G_handle[data-side=details]:after{content:\"\";box-sizing:border-box;background:var(--dsw-alias-button-floating-fill);border:.5px solid var(--dsw-alias-border-l2-darkmode-thin);opacity:0;width:12px;height:32px;transition:opacity var(--ds-transition-duration-slow) var(--ds-ease-in-out), background var(--ds-transition-duration-slow) var(--ds-ease-in-out);border-radius:10px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.pI_x6G_detailsCol:hover~.pI_x6G_handle[data-side=details]:after,.pI_x6G_handle[data-side=details]:hover:after,.pI_x6G_handle[data-side=details][data-dragging=true]:after{opacity:1}.pI_x6G_handle[data-side=details]:hover:after,.pI_x6G_handle[data-side=details][data-dragging=true]:after{background:var(--dsw-alias-button-floating-hover);border-color:var(--dsw-alias-border-l3)}.pI_x6G_overlayLayer{z-index:20;pointer-events:none;position:absolute;inset:0}.pI_x6G_overlayLayer>*{pointer-events:auto}";
57
74
  const tagId = "@deepseek-ai/dsh-client-ui-layout/AppFrame.module.css";
58
75
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
59
76
  const tag = document.createElement("style");
@@ -155,12 +172,16 @@ window.__ModuleLoader__.load({
155
172
  });
156
173
  }
157
174
  /** The three-column frame (see module doc). */
158
- function AppFrame({ useStore, useSessions, actions, renderSlot }) {
175
+ function AppFrame({ useStore, useSessions, actions, renderSlot, SessionProvider, t }) {
159
176
  const panels = useStore((s) => s);
160
177
  const detailsSession = useSessions((s) => {
161
178
  const current = s.current;
162
179
  return current !== void 0 && s.byId[current]?.blank === false ? current : void 0;
163
180
  });
181
+ const documentTitle = useSessions((s) => {
182
+ const current = s.current;
183
+ return current === void 0 ? void 0 : s.byId[current]?.title;
184
+ });
164
185
  const frameRef = (0, react.useRef)(null);
165
186
  const [viewport, setViewport] = (0, react.useState)(() => window.innerWidth);
166
187
  const lastSession = (0, react.useRef)(detailsSession);
@@ -223,6 +244,10 @@ window.__ModuleLoader__.load({
223
244
  "data-details-collapsed": cols.details === 0 || void 0,
224
245
  "data-dragging": dragging || void 0,
225
246
  children: [
247
+ (0, react_jsx_runtime.jsx)(DocumentTitle, {
248
+ productTitle: "DeepSeek Harness",
249
+ ...documentTitle === void 0 ? {} : { title: documentTitle }
250
+ }),
226
251
  (0, react_jsx_runtime.jsx)("div", {
227
252
  className: AppFrame_module_css_default.sidebarCol,
228
253
  children: renderSlot("sidebar", {
@@ -230,7 +255,7 @@ window.__ModuleLoader__.load({
230
255
  width: cols.sidebar
231
256
  })
232
257
  }),
233
- (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(CenterColumn, { children: renderSlot("conversation", {}) }), (0, react_jsx_runtime.jsx)(DetailsColumn, { children: renderSlot("details", {}) })] }),
258
+ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(CenterColumn, { children: renderSlot("conversation", {}) }), (0, react_jsx_runtime.jsx)(DetailsColumn, { children: (0, react_jsx_runtime.jsx)(SessionProvider, { children: renderSlot("details", {}) }) })] }),
234
259
  (0, react_jsx_runtime.jsx)("div", {
235
260
  className: AppFrame_module_css_default.overlayLayer,
236
261
  "data-shell-overlay": true,
@@ -275,7 +300,7 @@ window.__ModuleLoader__.load({
275
300
  * @returns the store handle (spec + type + identity + factory in one).
276
301
  */
277
302
  function createLayoutStore() {
278
- return (0, _deepseek_ai_dsh_client_runtime_client.defineStore)({
303
+ return (0, _deepseek_ai_dsh_client_store.defineStore)({
279
304
  init: () => ({
280
305
  sidebar: 280,
281
306
  details: 0,
@@ -343,6 +368,8 @@ window.__ModuleLoader__.load({
343
368
  //#region lib/types/client/theme-presenter.js
344
369
  /** Body attribute selecting the dark base palette in the token stylesheets. */
345
370
  const DARK_ATTRIBUTE = "data-ds-dark-theme";
371
+ /** Body variable carrying the user's content font size in px. */
372
+ const CONTENT_FONT_SIZE_VARIABLE = "--dsh-content-font-size";
346
373
  /** Applies theme snapshots to the document; one instance per plugin fiber. */
347
374
  var ThemePresenter = class {
348
375
  /** Token names this presenter wrote in the last apply (its retraction set). */
@@ -357,10 +384,10 @@ window.__ModuleLoader__.load({
357
384
  /**
358
385
  * Project a snapshot onto the document: set root `color-scheme` and the body
359
386
  * palette attribute from `active.colorScheme` (never the id — `system` is
360
- * resolved upstream), then replace the previously applied token variables
361
- * with `active.tokens`. Browser theme-color metadata follows the computed
362
- * body background after those writes, so the rendered palette remains the
363
- * color authority.
387
+ * resolved upstream), publish the content font-size axis, then replace the
388
+ * previously applied token variables with `active.tokens`. Browser
389
+ * theme-color metadata follows the computed body background after those
390
+ * writes, so the rendered palette remains the color authority.
364
391
  * @param snapshot - resolved theme snapshot from ctx.theme.
365
392
  */
366
393
  apply(snapshot) {
@@ -369,6 +396,7 @@ window.__ModuleLoader__.load({
369
396
  const body = document.body;
370
397
  if (scheme === "dark") body.setAttribute(DARK_ATTRIBUTE, "");
371
398
  else body.removeAttribute(DARK_ATTRIBUTE);
399
+ body.style.setProperty(CONTENT_FONT_SIZE_VARIABLE, `${snapshot.fontSize}px`);
372
400
  for (const name of this.appliedTokens) body.style.removeProperty(name);
373
401
  this.appliedTokens = [];
374
402
  for (const [name, value] of Object.entries(snapshot.active.tokens)) {
@@ -378,11 +406,12 @@ window.__ModuleLoader__.load({
378
406
  this.themeColorMeta.content = getComputedStyle(body).backgroundColor;
379
407
  if (!this.themeColorMeta.isConnected) document.head.append(this.themeColorMeta);
380
408
  }
381
- /** Retract root color-scheme, the palette attribute, token variables, and the owned metadata node. */
409
+ /** Retract root color-scheme, the palette attribute, token variables, the font-size axis, and the owned metadata node. */
382
410
  dispose() {
383
411
  document.documentElement.style.removeProperty("color-scheme");
384
412
  const body = document.body;
385
413
  body.removeAttribute(DARK_ATTRIBUTE);
414
+ body.style.removeProperty(CONTENT_FONT_SIZE_VARIABLE);
386
415
  for (const name of this.appliedTokens) body.style.removeProperty(name);
387
416
  this.appliedTokens = [];
388
417
  this.themeColorMeta.remove();
@@ -391,7 +420,11 @@ window.__ModuleLoader__.load({
391
420
  //#endregion
392
421
  //#region lib/types/client/index.js
393
422
  /** Required services (cordis fiber inject — the loader passes all module exports as an object plugin). */
394
- const inject = ["slots", "theme"];
423
+ const inject = [
424
+ "slots",
425
+ "theme",
426
+ "locale"
427
+ ];
395
428
  /**
396
429
  * Client plugin body: provide ctx.layout, then one register() call — AppFrame
397
430
  * into 'root' with the four child-slot declarations, the layout store seat,
@@ -404,6 +437,7 @@ window.__ModuleLoader__.load({
404
437
  const disposeService = ctx.reflect.provide("layout", layout);
405
438
  const disposeRegistration = ctx.slots.register({
406
439
  name: "root",
440
+ locale: "common",
407
441
  children: {
408
442
  "sidebar": {
409
443
  kind: "single",
@@ -58,7 +58,7 @@ window.__ModuleLoader__.load({
58
58
  * control in that Session, so a single list read seeds them all.
59
59
  */
60
60
  var MessageFeedbackController = class {
61
- remote;
61
+ ctx;
62
62
  sessionId;
63
63
  view = INITIAL_VIEW;
64
64
  listeners = /* @__PURE__ */ new Set();
@@ -66,11 +66,11 @@ window.__ModuleLoader__.load({
66
66
  operationTail = Promise.resolve();
67
67
  disposed = false;
68
68
  /**
69
- * @param remote - the messageFeedback Remote namespace.
69
+ * @param ctx - the browser plugin context carrying the messageFeedback Remote namespace.
70
70
  * @param sessionId - Session owning every addressed assistant message.
71
71
  */
72
- constructor(remote, sessionId) {
73
- this.remote = remote;
72
+ constructor(ctx, sessionId) {
73
+ this.ctx = ctx;
74
74
  this.sessionId = sessionId;
75
75
  }
76
76
  /** Return the cached immutable view. */
@@ -185,7 +185,7 @@ window.__ModuleLoader__.load({
185
185
  }
186
186
  /** Commit one put against the observed version and reconcile a conflict. */
187
187
  async putCommitted(messageId, rating, note, observed) {
188
- const carried = await this.remote.put({
188
+ const carried = await this.ctx.remote.messageFeedback.put({
189
189
  sessionId: this.sessionId,
190
190
  messageId,
191
191
  rating,
@@ -203,7 +203,7 @@ window.__ModuleLoader__.load({
203
203
  }
204
204
  /** Commit one delete against the observed version and reconcile a conflict. */
205
205
  async deleteCommitted(messageId, observed) {
206
- const carried = await this.remote.delete({
206
+ const carried = await this.ctx.remote.messageFeedback.delete({
207
207
  sessionId: this.sessionId,
208
208
  messageId,
209
209
  ifVersion: observed.version
@@ -224,55 +224,37 @@ window.__ModuleLoader__.load({
224
224
  }
225
225
  /** Fetch the whole sidecar and publish it as the seeded view. */
226
226
  async load() {
227
- try {
228
- const carried = await this.remote.list({ sessionId: this.sessionId });
229
- if (this.disposed) return OK;
230
- if (!carried.ok) {
231
- this.publish({
232
- status: "error",
233
- items: this.view.items,
234
- error: carried.error.message
235
- });
236
- return carrierFailure(carried.error);
237
- }
238
- const result = carried.value;
239
- if (!result.ok) {
240
- this.publish({
241
- status: "error",
242
- items: this.view.items,
243
- error: describe(result.error.code)
244
- });
245
- return fail(result.error.code);
246
- }
247
- const items = /* @__PURE__ */ new Map();
248
- for (const item of result.value.items) items.set(item.messageId, item);
227
+ const carried = await this.ctx.remote.messageFeedback.list({ sessionId: this.sessionId });
228
+ if (this.disposed) return OK;
229
+ if (!carried.ok) {
249
230
  this.publish({
250
- status: "ready",
251
- items,
252
- error: null
231
+ status: "error",
232
+ items: this.view.items,
233
+ error: carried.error.message
253
234
  });
254
- return OK;
255
- } catch (error) {
256
- if (this.disposed) return OK;
257
- const message = error instanceof Error ? error.message : "message feedback list failed";
235
+ return carrierFailure(carried.error);
236
+ }
237
+ const result = carried.value;
238
+ if (!result.ok) {
258
239
  this.publish({
259
240
  status: "error",
260
241
  items: this.view.items,
261
- error: message
242
+ error: describe(result.error.code)
262
243
  });
263
- return {
264
- ok: false,
265
- error: {
266
- code: "transport",
267
- message
268
- }
269
- };
244
+ return fail(result.error.code);
270
245
  }
246
+ const items = /* @__PURE__ */ new Map();
247
+ for (const item of result.value.items) items.set(item.messageId, item);
248
+ this.publish({
249
+ status: "ready",
250
+ items,
251
+ error: null
252
+ });
253
+ return OK;
271
254
  }
272
255
  /**
273
256
  * Serialize one mutation behind this Session's prior mutation so queued
274
- * operations always compare against the committed version, and translate a
275
- * transport throw into the same settled shape the controls already render.
257
+ * operations always compare against the committed version.
276
258
  */
277
259
  mutate(operation, options = {}) {
278
260
  const guarded = async () => {
@@ -282,17 +264,7 @@ window.__ModuleLoader__.load({
282
264
  if (!loaded.ok) return loaded;
283
265
  if (this.disposed) return DISPOSED;
284
266
  }
285
- try {
286
- return await operation();
287
- } catch (error) {
288
- return {
289
- ok: false,
290
- error: {
291
- code: "transport",
292
- message: error instanceof Error ? error.message : "message feedback mutation failed"
293
- }
294
- };
295
- }
267
+ return await operation();
296
268
  };
297
269
  const result = this.operationTail.then(guarded, guarded);
298
270
  this.operationTail = result.then(() => void 0);
@@ -326,7 +298,7 @@ window.__ModuleLoader__.load({
326
298
  };
327
299
  //#endregion
328
300
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-message-feedback/src/client/MessageFeedbackActions.module.css.mjs
329
- const css = "._8_XoUG_action{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}._8_XoUG_action:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._8_XoUG_action:disabled{cursor:default;opacity:.4}._8_XoUG_action[data-active]{color:var(--dsw-alias-label-primary)}._8_XoUG_noteOpen{max-width:220px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:none;border-radius:14px;padding:0 8px;font-size:13px;line-height:28px;overflow:hidden}._8_XoUG_noteOpen:hover,._8_XoUG_noteOpen[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._8_XoUG_notePanel{z-index:1100;box-sizing:border-box;border:1px solid var(--dsw-alias-border-inverted);background:var(--dsw-specific-menu);width:320px;max-width:min(360px,100vw - 24px);max-height:calc(100vh - 24px);box-shadow:var(--dsw-shadow-lv3);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;flex-direction:column;gap:8px;padding:8px;display:flex;position:fixed;overflow-y:auto}._8_XoUG_noteInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font:inherit;resize:vertical;border-radius:8px;padding:6px 8px;font-size:13px}._8_XoUG_noteActions{justify-content:flex-end;gap:6px;display:flex}._8_XoUG_noteSave,._8_XoUG_noteCancel{cursor:pointer;border:none;border-radius:14px;height:28px;padding:0 10px;font-size:13px}._8_XoUG_noteSave{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}._8_XoUG_noteSave:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}._8_XoUG_noteSave:disabled{cursor:default;opacity:.4}._8_XoUG_noteCancel{color:var(--dsw-alias-label-tertiary);background:0 0}._8_XoUG_noteCancel:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._8_XoUG_failure{color:var(--dsw-alias-label-tertiary);padding-left:4px;font-size:13px;line-height:20px}";
301
+ const css = "._8_XoUG_action{width:calc(28px + var(--dsh-content-font-delta,0px));height:calc(28px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}._8_XoUG_action svg{width:calc(15px + var(--dsh-content-font-delta,0px));height:calc(15px + var(--dsh-content-font-delta,0px))}._8_XoUG_action:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._8_XoUG_action:disabled{cursor:default;opacity:.4}._8_XoUG_action[data-active]{color:var(--dsw-alias-label-primary)}._8_XoUG_noteOpen{max-width:220px;color:var(--dsw-alias-label-tertiary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(28px + var(--dsh-content-font-delta,0px));white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:none;border-radius:14px;padding:0 8px;overflow:hidden}._8_XoUG_noteOpen:hover,._8_XoUG_noteOpen[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._8_XoUG_notePanel{z-index:1100;box-sizing:border-box;background:var(--dsw-specific-menu);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);width:320px;max-width:min(360px,100vw - 24px);max-height:calc(100vh - 24px);box-shadow:var(--dsw-elevation-prominent);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;border-radius:12px;flex-direction:column;gap:8px;padding:8px;display:flex;position:fixed;overflow-y:auto}._8_XoUG_noteInput{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font:inherit;resize:vertical;border-radius:8px;padding:6px 8px;font-size:13px}._8_XoUG_noteActions{justify-content:flex-end;gap:6px;display:flex}._8_XoUG_noteSave,._8_XoUG_noteCancel{cursor:pointer;border:none;border-radius:14px;height:28px;padding:0 10px;font-size:13px}._8_XoUG_noteSave{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}._8_XoUG_noteSave:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}._8_XoUG_noteSave:disabled{cursor:default;opacity:.4}._8_XoUG_noteCancel{color:var(--dsw-alias-label-tertiary);background:0 0}._8_XoUG_noteCancel:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._8_XoUG_failure{color:var(--dsw-alias-label-tertiary);padding-left:4px;font-size:13px;line-height:20px}";
330
302
  const tagId = "@deepseek-ai/dsh-client-ui-message-feedback/MessageFeedbackActions.module.css";
331
303
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
332
304
  const tag = document.createElement("style");
@@ -684,7 +656,7 @@ window.__ModuleLoader__.load({
684
656
  const controllerFor = (sessionId) => {
685
657
  let controller = controllers.get(sessionId);
686
658
  if (controller === void 0) {
687
- controller = new MessageFeedbackController(ctx.remote.messageFeedback, sessionId);
659
+ controller = new MessageFeedbackController(ctx, sessionId);
688
660
  controllers.set(sessionId, controller);
689
661
  }
690
662
  return controller;