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
@@ -4,25 +4,19 @@ window.__ModuleLoader__.load({
4
4
  var module = { exports: {} };
5
5
  var exports = module.exports;
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
7
8
  let react_jsx_runtime = require("react/jsx-runtime");
8
9
  let react = require("react");
9
10
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
10
- //#region ../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
11
- function r(e) {
12
- var t, f, n = "";
13
- if ("string" == typeof e || "number" == typeof e) n += e;
14
- else if ("object" == typeof e) if (Array.isArray(e)) {
15
- var o = e.length;
16
- for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
17
- } else for (f in e) e[f] && (n && (n += " "), n += f);
18
- return n;
19
- }
20
- function clsx() {
21
- for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
22
- return n;
23
- }
24
- //#endregion
25
11
  //#region lib/types/client/contract/slots.js
12
+ function settlePendingComposer(settle, failureMessage) {
13
+ try {
14
+ settle();
15
+ return Promise.resolve();
16
+ } catch (error) {
17
+ return Promise.reject(error instanceof Error ? error : new Error(failureMessage, { cause: error }));
18
+ }
19
+ }
26
20
  /**
27
21
  * Narrow a request to a renderable plan review, or return undefined to leave it
28
22
  * to the generic question flow.
@@ -60,59 +54,158 @@ window.__ModuleLoader__.load({
60
54
  ...decline === void 0 ? {} : { decline }
61
55
  };
62
56
  }
63
- /**
64
- * Question domain face over the carrier: render identity and questions
65
- * transparently forwarded; answer/cancel own the wire encoding (the success
66
- * fields and the cancelled error) and turn a rejected carrier receipt into a
67
- * thrown error. Components mint one per carrier via useMemo (never inside a
68
- * select — a per-dispatch mint would churn identity and break memoization).
69
- */
57
+ let nextQuestionKey = 0;
58
+ /** Create a wire-preserved user-question rejection. */
59
+ function questionError(message, code) {
60
+ const error = new Error(message);
61
+ error.name = "UserQuestionError";
62
+ error.code = code;
63
+ return error;
64
+ }
65
+ /** One answerable Client presentation of a pending Host waterfall. */
70
66
  var PendingQuestion = class {
71
- wait;
67
+ sessionId;
68
+ /** Presentation discriminator used by Session pending-interaction consumers. */
69
+ kind;
70
+ /** Opaque render identity and request key for the Session-scoped draft store. */
71
+ key;
72
+ /** The request's question list. */
73
+ questions;
74
+ /** Result returned by the Remote Event listener to the Host waterfall. */
75
+ result;
76
+ #resolve;
77
+ #reject;
78
+ #signal;
79
+ #onAbort;
80
+ #delegated = Symbol("pending question delegated");
81
+ #settled = false;
72
82
  /**
73
- * @param wait - the runtime carrier for one pending question request.
83
+ * @param sessionId - Agent/Session identity owning the scoped request.
84
+ * @param questions - complete question batch.
85
+ * @param signal - Host request and delivery lifetime.
74
86
  */
75
- constructor(wait) {
76
- this.wait = wait;
77
- }
78
- /** Opaque render identity (React key / draft remount axis), forwarded from the carrier. */
79
- get key() {
80
- return this.wait.key;
81
- }
82
- /** The request's question list, forwarded from the carrier payload. */
83
- get questions() {
84
- return this.wait.payload.questions;
87
+ constructor(sessionId, questions, signal) {
88
+ this.sessionId = sessionId;
89
+ nextQuestionKey += 1;
90
+ this.key = `question:${String(nextQuestionKey)}`;
91
+ this.questions = questions;
92
+ this.kind = planReviewOf(questions) === void 0 ? "question" : "plan-review";
93
+ const completion = Promise.withResolvers();
94
+ this.result = completion.promise;
95
+ this.#resolve = completion.resolve;
96
+ this.#reject = completion.reject;
97
+ this.#signal = signal;
98
+ if (signal === void 0) {
99
+ this.#onAbort = void 0;
100
+ return;
101
+ }
102
+ const onAbort = () => {
103
+ this.abort(questionError("ask_user_question was aborted before the user answered", "ASK_ABORTED"));
104
+ };
105
+ this.#onAbort = onAbort;
106
+ signal.addEventListener("abort", onAbort, { once: true });
107
+ if (signal.aborted) onAbort();
85
108
  }
86
109
  /**
87
- * Deliver the whole answer batch; a rejected carrier receipt throws.
110
+ * Resolve the Host waterfall with the whole answer batch.
88
111
  * @param answer - complete structured answer batch.
89
112
  */
90
- async answer(answer) {
91
- const receipt = await this.wait.respond({
92
- ok: true,
93
- value: {
94
- sessionId: this.wait.sessionId,
95
- answer
96
- }
113
+ answer(answer) {
114
+ return settlePendingComposer(() => {
115
+ this.finish(() => {
116
+ this.#resolve(answer);
117
+ });
118
+ }, "pending question settlement failed");
119
+ }
120
+ /** Delegate an unanswered request to the next waterfall listener. */
121
+ delegate() {
122
+ if (this.#settled) return;
123
+ this.finish(() => {
124
+ this.#reject(this.#delegated);
97
125
  });
98
- if (!receipt.accepted) throw new Error(`question response rejected: ${receipt.reason}`);
99
126
  }
100
- /** Reject the whole wait (the host resolves the tool call as cancelled); a rejected receipt throws. */
101
- async cancel() {
102
- const receipt = await this.wait.respond({
103
- ok: false,
104
- error: {
105
- code: "cancelled",
106
- message: "the user closed this question request",
107
- details: {}
108
- }
127
+ /**
128
+ * Test whether a rejection requests waterfall delegation.
129
+ * @param reason - rejection received from {@link PendingQuestion.result}.
130
+ * @returns whether {@link PendingQuestion.delegate} produced it.
131
+ */
132
+ isDelegation(reason) {
133
+ return reason === this.#delegated;
134
+ }
135
+ /** Reject the Host waterfall because the user closed the question. */
136
+ cancel() {
137
+ return settlePendingComposer(() => {
138
+ this.finish(() => {
139
+ this.#reject(questionError("the user cancelled ask_user_question", "ASK_CANCELLED"));
140
+ });
141
+ }, "pending question cancellation failed");
142
+ }
143
+ /**
144
+ * End an unanswered presentation when its transport, scope, or plugin lifetime ends.
145
+ * @param reason - rejection exposed to the waiting Remote Event listener.
146
+ */
147
+ abort(reason) {
148
+ if (this.#settled) return;
149
+ this.finish(() => {
150
+ this.#reject(reason);
109
151
  });
110
- if (!receipt.accepted) throw new Error(`question cancellation rejected: ${receipt.reason}`);
152
+ }
153
+ finish(settle) {
154
+ if (this.#settled) throw new Error(`pending question ${this.key} is already settled`);
155
+ this.#settled = true;
156
+ if (this.#signal !== void 0 && this.#onAbort !== void 0) this.#signal.removeEventListener("abort", this.#onAbort);
157
+ settle();
111
158
  }
112
159
  };
113
160
  //#endregion
161
+ //#region lib/types/client/draft-store.js
162
+ /**
163
+ * Session-scoped draft state for the generic question composer. The Slot
164
+ * registry owns store instances; this module exports only the factory so a
165
+ * plugin reload cannot reuse a module-global handle.
166
+ */
167
+ const emptyProgress = () => ({
168
+ index: 0,
169
+ drafts: []
170
+ });
171
+ /**
172
+ * Declare the question composer's transient Session store.
173
+ * @returns a non-persisted store handle whose instance is owned by the Slot registry.
174
+ */
175
+ function createQuestionDraftStore() {
176
+ return (0, _deepseek_ai_dsh_client_store.defineStore)({
177
+ init: () => ({ progress: emptyProgress() }),
178
+ actions: {
179
+ replace: (draft, requestKey, progress) => {
180
+ draft.requestKey = requestKey;
181
+ draft.progress = progress;
182
+ },
183
+ clear: (draft, requestKey) => {
184
+ if (draft.requestKey !== requestKey) return;
185
+ delete draft.requestKey;
186
+ draft.progress = emptyProgress();
187
+ }
188
+ }
189
+ });
190
+ }
191
+ //#endregion
192
+ //#region ../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
193
+ function r(e) {
194
+ var t, f, n = "";
195
+ if ("string" == typeof e || "number" == typeof e) n += e;
196
+ else if ("object" == typeof e) if (Array.isArray(e)) {
197
+ var o = e.length;
198
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
199
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
200
+ return n;
201
+ }
202
+ function clsx() {
203
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
204
+ return n;
205
+ }
206
+ //#endregion
114
207
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-user-questions/src/client/PlanReviewPanel.module.css.mjs
115
- const css$1 = ".LVzXQa_frame{padding:6px calc(var(--dsh-composer-side-clearance) + 16px) 10px;justify-content:center;display:flex}.LVzXQa_card{width:100%;max-width:var(--dsh-chat-content-width);border:1px solid var(--dsw-alias-state-warn-secondary);background:var(--dsw-specific-input-major);max-height:min(60vh,520px);box-shadow:var(--dsw-shadow-lv2);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:20px;flex-direction:column;display:flex;overflow:hidden}.LVzXQa_card,.LVzXQa_card *{box-sizing:border-box}.LVzXQa_strip{background:var(--dsw-alias-state-warn-tertiary);color:var(--dsw-alias-state-warn-primary);flex-shrink:0;align-items:center;gap:8px;padding:10px 16px;font-size:13px;line-height:18px;display:flex}.LVzXQa_dot{background:var(--dsw-alias-state-warn-primary);border-radius:50%;width:8px;height:8px}.LVzXQa_body{overscroll-behavior:contain;flex:auto;min-height:0;padding:12px 16px 4px;font-size:14px;line-height:22px;overflow-y:auto}.LVzXQa_footer{flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:8px 16px 12px;display:flex}.LVzXQa_feedback{min-height:16px;color:var(--dsw-alias-state-error-primary);font-size:11px;line-height:16px}.LVzXQa_actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.LVzXQa_discuss{color:var(--dsw-alias-label-secondary);gap:6px}.LVzXQa_discuss:hover:not(:disabled){color:var(--dsw-alias-label-primary)}@media (width<=720px){.LVzXQa_card{border-radius:16px}.LVzXQa_body{padding:10px 12px 4px}.LVzXQa_footer{align-items:flex-end;padding:8px 12px 10px}}";
208
+ const css$1 = ".LVzXQa_frame{padding:6px calc(var(--dsh-composer-side-clearance) + 16px) 10px;justify-content:center;display:flex}.LVzXQa_card{width:100%;max-width:var(--dsh-chat-content-width);border:1px solid var(--dsw-alias-state-warn-secondary);background:var(--dsw-specific-input-major);max-height:min(60vh,520px);box-shadow:var(--dsw-shadow-lv2);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:20px;flex-direction:column;display:flex;overflow:hidden}.LVzXQa_card,.LVzXQa_card *{box-sizing:border-box}.LVzXQa_strip{background:var(--dsw-alias-state-warn-tertiary);color:var(--dsw-alias-state-warn-primary);flex-shrink:0;align-items:center;gap:8px;padding:10px 16px;font-size:13px;line-height:18px;display:flex}.LVzXQa_dot{corner-shape:round;background:var(--dsw-alias-state-warn-primary);border-radius:50%;width:8px;height:8px}.LVzXQa_body{overscroll-behavior:contain;flex:auto;min-height:0;padding:12px 16px 4px;font-size:14px;line-height:22px;overflow-y:auto}.LVzXQa_footer{flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:8px 16px 12px;display:flex}.LVzXQa_feedback{min-height:16px;color:var(--dsw-alias-state-error-primary);font-size:11px;line-height:16px}.LVzXQa_actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.LVzXQa_discuss{color:var(--dsw-alias-label-secondary);gap:6px}.LVzXQa_discuss:hover:not(:disabled){color:var(--dsw-alias-label-primary)}@media (width<=720px){.LVzXQa_card{border-radius:16px}.LVzXQa_body{padding:10px 12px 4px}.LVzXQa_footer{align-items:flex-end;padding:8px 12px 10px}}";
116
209
  const tagId$1 = "@deepseek-ai/dsh-client-ui-user-questions/PlanReviewPanel.module.css";
117
210
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
118
211
  const tag = document.createElement("style");
@@ -151,6 +244,13 @@ window.__ModuleLoader__.load({
151
244
  * @returns The plan-review takeover for this request.
152
245
  */
153
246
  function PlanReviewPanel({ pending, review, t }) {
247
+ const markdownLabels = (0, react.useMemo)(() => ({
248
+ code: {
249
+ copyLabel: t("copy"),
250
+ copiedLabel: t("copied")
251
+ },
252
+ footnotes: t("markdown.footnotes")
253
+ }), [t]);
154
254
  const [busy, setBusy] = (0, react.useState)(false);
155
255
  const [error, setError] = (0, react.useState)(null);
156
256
  const settle = (send) => {
@@ -182,7 +282,10 @@ window.__ModuleLoader__.load({
182
282
  (0, react_jsx_runtime.jsx)("div", {
183
283
  className: PlanReviewPanel_module_css_default.body,
184
284
  "data-plan-review-scroll": true,
185
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, { text: review.plan })
285
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, {
286
+ text: review.plan,
287
+ labels: markdownLabels
288
+ })
186
289
  }),
187
290
  (0, react_jsx_runtime.jsxs)("div", {
188
291
  className: PlanReviewPanel_module_css_default.footer,
@@ -230,7 +333,7 @@ window.__ModuleLoader__.load({
230
333
  }
231
334
  //#endregion
232
335
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-user-questions/src/client/QuestionComposer.module.css.mjs
233
- const css = ".Mbwy4a_frame{padding:6px calc(var(--dsh-composer-side-clearance) + 16px) 10px;justify-content:center;display:flex}.Mbwy4a_card{width:100%;max-width:var(--dsh-chat-content-width);border:1px solid var(--dsw-alias-border-l2-darkmode-thin);background:var(--dsw-specific-input-major);max-height:min(60vh,520px);box-shadow:var(--dsw-shadow-lv2);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:20px;flex-direction:column;padding:0 0 10px;display:flex;overflow:hidden}.Mbwy4a_card,.Mbwy4a_card *{box-sizing:border-box}.Mbwy4a_cardMinimized{max-height:none}.Mbwy4a_cardMinimized .Mbwy4a_header{padding-bottom:14px}.Mbwy4a_headerActions{flex-shrink:0;align-items:center;gap:4px;display:flex}.Mbwy4a_header{flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:16px;padding:20px 16px 0 24px;display:flex}.Mbwy4a_headingBlock{min-width:0}.Mbwy4a_eyebrow{color:var(--dsw-alias-label-tertiary);margin-bottom:5px;font-size:11px;line-height:16px}.Mbwy4a_title{margin:0;font-size:16px;font-weight:500;line-height:22px}.Mbwy4a_detail{margin:0 2px 8px}.Mbwy4a_footerActions{flex-shrink:0;align-items:center;gap:12px;display:flex}.Mbwy4a_pager{flex-shrink:0;align-items:center;gap:6px;display:flex}.Mbwy4a_progress{color:var(--dsw-alias-label-secondary);white-space:nowrap;word-spacing:-2px;padding:0 4px;font-size:14px;font-weight:500;line-height:24px}.Mbwy4a_iconButton{width:24px;height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;place-items:center;padding:0;display:grid}.Mbwy4a_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.Mbwy4a_iconButton:disabled{color:var(--dsw-alias-label-dimmed);cursor:default}.Mbwy4a_body{overscroll-behavior:contain;flex-direction:column;flex:auto;min-height:0;display:flex;overflow-y:auto}.Mbwy4a_options{flex-direction:column;gap:1px;margin:8px 0 0;padding:4px 12px;display:flex}.Mbwy4a_option{width:100%;min-height:40px;color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:12px;flex-shrink:0;align-items:flex-start;gap:8px;padding:8px 12px 8px 8px;transition:background-color .12s,border-color .12s;display:flex}.Mbwy4a_option:hover:not(:disabled),.Mbwy4a_optionSelected{background:var(--dsw-alias-interactive-bg-hover)}.Mbwy4a_optionSelected{border-color:var(--dsw-alias-border-l2)}.Mbwy4a_option:disabled{cursor:default}.Mbwy4a_number{background:var(--dsw-alias-bg-overlay);width:20px;height:20px;color:var(--dsw-alias-label-secondary);border-radius:6px;flex:0 0 20px;place-items:center;margin-top:2px;font-size:12px;font-weight:500;line-height:18px;display:grid}.Mbwy4a_checkbox{flex:0 0 20px;place-items:center;width:20px;height:20px;margin-top:2px;display:grid}.Mbwy4a_checkbox:before{content:\"\";border:1px solid var(--dsw-alias-border-l4);border-radius:4px;grid-area:1/1;width:14px;height:14px;transition:background-color .12s,border-color .12s}.Mbwy4a_checkbox>svg{grid-area:1/1}.Mbwy4a_checkboxChecked{color:var(--dsw-alias-label-primary-foreground)}.Mbwy4a_checkboxChecked:before{border-color:var(--dsw-alias-label-primary);background:var(--dsw-alias-label-primary)}.Mbwy4a_optionCopy{flex:1;min-width:0}.Mbwy4a_optionLine{flex-wrap:wrap;align-items:baseline;gap:2px 6px;display:flex}.Mbwy4a_optionLabel{font-size:14px;font-weight:500;line-height:24px}.Mbwy4a_badge{background:var(--dsw-specific-sidebar-nav-item-active-accent);color:var(--dsw-alias-button-info-fill);border-radius:6px;padding:0 4px;font-size:11px;font-weight:600;line-height:18px}.Mbwy4a_description{color:var(--dsw-alias-label-tertiary);font-size:14px;font-weight:400;line-height:24px}.Mbwy4a_customRow{border:1px solid #0000;border-radius:12px;flex-shrink:0;align-items:flex-start;gap:8px;width:100%;min-height:40px;padding:8px 12px 8px 8px;transition:background-color .12s,border-color .12s;display:flex}.Mbwy4a_customRow:hover,.Mbwy4a_customRow:focus-within,.Mbwy4a_customRowActive{background:var(--dsw-alias-interactive-bg-hover)}.Mbwy4a_customRow:focus-within,.Mbwy4a_customRowActive{border-color:var(--dsw-alias-border-l2)}.Mbwy4a_field{--dsh-answer-field-padding:0;min-width:0;display:grid}.Mbwy4a_field>*{min-width:0;padding:var(--dsh-answer-field-padding);font:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;grid-area:1/1;font-size:14px;line-height:24px}.Mbwy4a_fieldMirror{box-sizing:content-box;visibility:hidden;max-height:144px;overflow:hidden}.Mbwy4a_fieldInput{resize:none;color:var(--dsw-alias-label-primary);caret-color:var(--dsw-alias-state-business-primary);background:0 0;border:none;outline:none;overflow-y:auto}.Mbwy4a_fieldInput::placeholder{color:var(--dsw-alias-label-caption)}.Mbwy4a_customInline{flex:1}.Mbwy4a_customBlock{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);--dsh-answer-field-padding:8px 12px;border-radius:10px;flex-shrink:0;min-height:64px;margin:0 12px}.Mbwy4a_customBlock:focus-within{border-color:var(--dsw-alias-state-business-primary)}.Mbwy4a_footer{flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;margin-top:12px;padding:0 10px 0 18px;display:flex}.Mbwy4a_feedback{min-height:16px;color:var(--dsw-alias-state-error-primary);text-align:right;flex:1;font-size:11px;line-height:16px}@media (width<=720px){.Mbwy4a_card{border-radius:16px}.Mbwy4a_header{padding:10px 12px 0 18px}.Mbwy4a_options{padding:4px 8px}.Mbwy4a_title{font-size:15px;line-height:21px}.Mbwy4a_option,.Mbwy4a_customRow{padding:8px 6px}.Mbwy4a_footer{align-items:flex-end;padding:0 10px}.Mbwy4a_footerActions{flex-shrink:0}}@media (prefers-reduced-motion:reduce){.Mbwy4a_option,.Mbwy4a_customRow{transition:none}}";
336
+ const css = ".Mbwy4a_frame{padding:6px calc(var(--dsh-composer-side-clearance) + 16px) 10px;justify-content:center;display:flex}.Mbwy4a_card{width:100%;max-width:var(--dsh-chat-content-width);--dsw-elevation-stroke-color:var(--dsw-alias-border-l2-darkmode-thin);background:var(--dsw-specific-input-major);max-height:min(60vh,520px);box-shadow:var(--dsw-elevation-panel);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;border-radius:20px;flex-direction:column;padding:0 0 10px;display:flex;overflow:hidden}.Mbwy4a_card,.Mbwy4a_card *{box-sizing:border-box}.Mbwy4a_cardMinimized{max-height:none}.Mbwy4a_cardMinimized .Mbwy4a_header{padding-bottom:14px}.Mbwy4a_headerActions{flex-shrink:0;align-items:center;gap:4px;display:flex}.Mbwy4a_header{flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:16px;padding:20px 16px 0 24px;display:flex}.Mbwy4a_headingBlock{min-width:0}.Mbwy4a_eyebrow{color:var(--dsw-alias-label-tertiary);margin-bottom:5px;font-size:11px;line-height:16px}.Mbwy4a_title{margin:0;font-size:16px;font-weight:500;line-height:22px}.Mbwy4a_detail{margin:0 2px 8px}.Mbwy4a_footerActions{flex-shrink:0;align-items:center;gap:12px;display:flex}.Mbwy4a_pager{flex-shrink:0;align-items:center;gap:6px;display:flex}.Mbwy4a_progress{color:var(--dsw-alias-label-secondary);white-space:nowrap;word-spacing:-2px;padding:0 4px;font-size:14px;font-weight:500;line-height:24px}.Mbwy4a_iconButton{corner-shape:round;width:24px;height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;place-items:center;padding:0;display:grid}.Mbwy4a_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.Mbwy4a_iconButton:disabled{color:var(--dsw-alias-label-dimmed);cursor:default}.Mbwy4a_body{overscroll-behavior:contain;flex-direction:column;flex:auto;min-height:0;display:flex;overflow-y:auto}.Mbwy4a_options{flex-direction:column;gap:1px;margin:8px 0 0;padding:4px 12px;display:flex}.Mbwy4a_option{width:100%;min-height:40px;color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:12px;flex-shrink:0;align-items:flex-start;gap:8px;padding:8px 12px 8px 8px;transition:background-color .12s,border-color .12s;display:flex}.Mbwy4a_option:hover:not(:disabled),.Mbwy4a_optionSelected{background:var(--dsw-alias-interactive-bg-hover)}.Mbwy4a_optionSelected{border-color:var(--dsw-alias-border-l2)}.Mbwy4a_option:disabled{cursor:default}.Mbwy4a_number{background:var(--dsw-alias-bg-overlay);width:20px;height:20px;color:var(--dsw-alias-label-secondary);border-radius:6px;flex:0 0 20px;place-items:center;margin-top:2px;font-size:12px;font-weight:500;line-height:18px;display:grid}.Mbwy4a_checkbox{flex:0 0 20px;place-items:center;width:20px;height:20px;margin-top:2px;display:grid}.Mbwy4a_checkbox:before{content:\"\";border:.5px solid var(--dsw-alias-border-l4);border-radius:4px;grid-area:1/1;width:14px;height:14px;transition:background-color .12s,border-color .12s}.Mbwy4a_checkbox>svg{grid-area:1/1}.Mbwy4a_checkboxChecked{color:var(--dsw-alias-label-primary-foreground)}.Mbwy4a_checkboxChecked:before{border-color:var(--dsw-alias-label-primary);background:var(--dsw-alias-label-primary)}.Mbwy4a_optionCopy{flex:1;min-width:0}.Mbwy4a_optionLine{flex-wrap:wrap;align-items:baseline;gap:2px 6px;display:flex}.Mbwy4a_optionLabel{font-size:14px;font-weight:500;line-height:24px}.Mbwy4a_badge{background:var(--dsw-specific-sidebar-nav-item-active-accent);color:var(--dsw-alias-button-info-fill);border-radius:6px;padding:0 4px;font-size:11px;font-weight:600;line-height:18px}.Mbwy4a_description{color:var(--dsw-alias-label-tertiary);font-size:14px;font-weight:400;line-height:24px}.Mbwy4a_customRow{border:1px solid #0000;border-radius:12px;flex-shrink:0;align-items:flex-start;gap:8px;width:100%;min-height:40px;padding:8px 12px 8px 8px;transition:background-color .12s,border-color .12s;display:flex}.Mbwy4a_customRow:hover,.Mbwy4a_customRow:focus-within,.Mbwy4a_customRowActive{background:var(--dsw-alias-interactive-bg-hover)}.Mbwy4a_customRow:focus-within,.Mbwy4a_customRowActive{border-color:var(--dsw-alias-border-l2)}.Mbwy4a_field{--dsh-answer-field-padding:0;min-width:0;display:grid}.Mbwy4a_field>*{min-width:0;padding:var(--dsh-answer-field-padding);font:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;grid-area:1/1;font-size:14px;line-height:24px}.Mbwy4a_fieldMirror{box-sizing:content-box;visibility:hidden;max-height:144px;overflow:hidden}.Mbwy4a_fieldInput{resize:none;color:var(--dsw-alias-label-primary);caret-color:var(--dsw-alias-state-business-primary);background:0 0;border:none;outline:none;overflow-y:auto}.Mbwy4a_fieldInput::placeholder{color:var(--dsw-alias-label-caption)}.Mbwy4a_customInline{flex:1}.Mbwy4a_customBlock{border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-module-platform);--dsh-answer-field-padding:8px 12px;border-radius:10px;flex-shrink:0;min-height:64px;margin:0 12px}.Mbwy4a_customBlock:focus-within{border-color:var(--dsw-alias-state-business-primary)}.Mbwy4a_footer{flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;margin-top:12px;padding:0 10px 0 18px;display:flex}.Mbwy4a_feedback{min-height:16px;color:var(--dsw-alias-state-error-primary);text-align:right;flex:1;font-size:11px;line-height:16px}@media (width<=720px){.Mbwy4a_card{border-radius:16px}.Mbwy4a_header{padding:10px 12px 0 18px}.Mbwy4a_options{padding:4px 8px}.Mbwy4a_title{font-size:15px;line-height:21px}.Mbwy4a_option,.Mbwy4a_customRow{padding:8px 6px}.Mbwy4a_footer{align-items:flex-end;padding:0 10px}.Mbwy4a_footerActions{flex-shrink:0}}@media (prefers-reduced-motion:reduce){.Mbwy4a_option,.Mbwy4a_customRow{transition:none}}";
234
337
  const tagId = "@deepseek-ai/dsh-client-ui-user-questions/QuestionComposer.module.css";
235
338
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
236
339
  const tag = document.createElement("style");
@@ -309,7 +412,7 @@ window.__ModuleLoader__.load({
309
412
  * Mirror and textarea MUST share font, line-height, padding and wrapping rules
310
413
  * or the two heights diverge.
311
414
  *
312
- * @param props - field shape, draft text, and the field's event handlers.
415
+ * @param props - visual variant, draft text, and the field's event handlers.
313
416
  * @returns The mirrored auto-growing field.
314
417
  */
315
418
  function AnswerField(props) {
@@ -333,38 +436,51 @@ window.__ModuleLoader__.load({
333
436
  });
334
437
  }
335
438
  /**
336
- * Composer takeover boundary; the carrier key keys local drafts, so a
337
- * same-request replay (same key, new carrier object) preserves them.
439
+ * Composer takeover router. Generic-question drafts live in this entry's
440
+ * Session-scoped Slot store, keyed by the pending carrier, so a strict Session
441
+ * entry remount restores the same request without exposing it to another one.
338
442
  *
339
- * One takeover, two shapes: a request that declares a presentation intent this
340
- * package renders takes that shape (a plan review is one decision over one
443
+ * One takeover, two presentations: a request that declares a presentation intent this
444
+ * package renders uses that presentation (a plan review is one decision over one
341
445
  * plan, not a question set), and every other request takes the generic flow.
342
446
  * The routing lives here, at the one entry that owns the composer seat, so
343
- * neither shape can claim a request the other is already rendering.
447
+ * neither presentation can claim a request the other is already rendering.
344
448
  *
345
449
  * @param props - the selector-matched pending question carrier plus the framework standard kit.
346
450
  * @returns The question flow, or the intent's own surface, for this request.
347
451
  */
348
452
  function QuestionComposer(props) {
349
- const question = (0, react.useMemo)(() => new PendingQuestion(props.matched), [props.matched]);
453
+ const question = props.matched;
350
454
  const review = (0, react.useMemo)(() => planReviewOf(question.questions), [question]);
351
455
  return review === void 0 ? (0, react_jsx_runtime.jsx)(QuestionFlow, {
352
456
  pending: question,
353
- t: props.t
457
+ t: props.t,
458
+ useStore: props.useStore,
459
+ actions: props.actions
354
460
  }, question.key) : (0, react_jsx_runtime.jsx)(PlanReviewPanel, {
355
461
  pending: question,
356
462
  review,
357
463
  t: props.t
358
464
  }, question.key);
359
465
  }
360
- function QuestionFlow({ pending, t }) {
466
+ function QuestionFlow({ pending, t, useStore, actions }) {
361
467
  const questions = pending.questions;
362
- const [index, setIndex] = (0, react.useState)(0);
363
- const [drafts, setDrafts] = (0, react.useState)(() => questions.map(() => ({
364
- selected: [],
365
- custom: "",
366
- skipped: false
367
- })));
468
+ const markdownLabels = (0, react.useMemo)(() => ({
469
+ code: {
470
+ copyLabel: t("copy"),
471
+ copiedLabel: t("copied")
472
+ },
473
+ footnotes: t("markdown.footnotes")
474
+ }), [t]);
475
+ const initialProgress = (0, react.useMemo)(() => ({
476
+ index: 0,
477
+ drafts: questions.map(() => ({
478
+ selected: [],
479
+ custom: "",
480
+ skipped: false
481
+ }))
482
+ }), [questions]);
483
+ const { index, drafts } = useStore((state) => state.requestKey === pending.key && state.progress.drafts.length === questions.length ? state.progress : void 0) ?? initialProgress;
368
484
  const [busy, setBusy] = (0, react.useState)(null);
369
485
  const [error, setError] = (0, react.useState)(null);
370
486
  const [minimized, setMinimized] = (0, react.useState)(false);
@@ -372,16 +488,24 @@ window.__ModuleLoader__.load({
372
488
  const question = questions[index];
373
489
  const draft = drafts[index];
374
490
  const hasOptions = (question.options?.length ?? 0) > 0;
491
+ const replaceProgress = (nextIndex, nextDrafts) => {
492
+ actions.replace(pending.key, {
493
+ index: nextIndex,
494
+ drafts: nextDrafts
495
+ });
496
+ };
375
497
  const cancelFlow = () => {
376
498
  setBusy("cancel");
377
499
  setError(null);
378
- pending.cancel().catch((cause) => {
500
+ pending.cancel().then(() => {
501
+ actions.clear(pending.key);
502
+ }).catch((cause) => {
379
503
  setBusy(null);
380
504
  setError({ text: cause instanceof Error ? cause.message : String(cause) });
381
505
  });
382
506
  };
383
- const updateDraft = (update) => {
384
- setDrafts((current) => current.map((item, itemIndex) => itemIndex === index ? update(item) : item));
507
+ const updateDraft = (update, nextIndex = index) => {
508
+ replaceProgress(nextIndex, drafts.map((item, itemIndex) => itemIndex === index ? update(item) : item));
385
509
  setError(null);
386
510
  };
387
511
  const choose = (label) => {
@@ -399,15 +523,14 @@ window.__ModuleLoader__.load({
399
523
  custom: "",
400
524
  skipped: false
401
525
  };
402
- });
403
- if (question.multiSelect !== true && index < questions.length - 1) setIndex((current) => current + 1);
526
+ }, question.multiSelect !== true && index < questions.length - 1 ? index + 1 : index);
404
527
  };
405
528
  const answered = (item) => item.selected.length > 0 || item.custom.trim() !== "";
406
529
  const completed = (item) => answered(item) || item.skipped;
407
530
  const submitDrafts = (values) => {
408
531
  const missing = values.findIndex((item) => !completed(item));
409
532
  if (missing >= 0) {
410
- setIndex(missing);
533
+ replaceProgress(missing, values);
411
534
  setError({ key: "error.incomplete" });
412
535
  return;
413
536
  }
@@ -426,7 +549,9 @@ window.__ModuleLoader__.load({
426
549
  }) };
427
550
  setBusy("answer");
428
551
  setError(null);
429
- pending.answer(answer).catch((cause) => {
552
+ pending.answer(answer).then(() => {
553
+ actions.clear(pending.key);
554
+ }).catch((cause) => {
430
555
  setBusy(null);
431
556
  setError({ text: cause instanceof Error ? cause.message : String(cause) });
432
557
  });
@@ -437,7 +562,7 @@ window.__ModuleLoader__.load({
437
562
  return;
438
563
  }
439
564
  if (index < questions.length - 1) {
440
- setIndex((current) => current + 1);
565
+ replaceProgress(index + 1, drafts);
441
566
  setError(null);
442
567
  return;
443
568
  }
@@ -463,12 +588,9 @@ window.__ModuleLoader__.load({
463
588
  custom: "",
464
589
  skipped: true
465
590
  } : item);
466
- setDrafts(nextDrafts);
591
+ replaceProgress(index < questions.length - 1 ? index + 1 : index, nextDrafts);
467
592
  setError(null);
468
- if (index < questions.length - 1) {
469
- setIndex((current) => current + 1);
470
- return;
471
- }
593
+ if (index < questions.length - 1) return;
472
594
  submitDrafts(nextDrafts);
473
595
  };
474
596
  return (0, react_jsx_runtime.jsx)("div", {
@@ -517,7 +639,10 @@ window.__ModuleLoader__.load({
517
639
  "data-question-scroll": true,
518
640
  children: [question.detail !== void 0 && (0, react_jsx_runtime.jsx)("div", {
519
641
  className: QuestionComposer_module_css_default.detail,
520
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, { text: question.detail })
642
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, {
643
+ text: question.detail,
644
+ labels: markdownLabels
645
+ })
521
646
  }), (0, react_jsx_runtime.jsxs)("div", {
522
647
  className: QuestionComposer_module_css_default.options,
523
648
  role: question.multiSelect === true ? "group" : "radiogroup",
@@ -610,7 +735,7 @@ window.__ModuleLoader__.load({
610
735
  "aria-label": t("nav.prev"),
611
736
  disabled: index === 0 || busy !== null,
612
737
  onClick: () => {
613
- setIndex(index - 1);
738
+ replaceProgress(index - 1, drafts);
614
739
  setError(null);
615
740
  },
616
741
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutline14, {})
@@ -629,7 +754,7 @@ window.__ModuleLoader__.load({
629
754
  "aria-label": t("nav.next"),
630
755
  disabled: index === questions.length - 1 || busy !== null,
631
756
  onClick: () => {
632
- setIndex(index + 1);
757
+ replaceProgress(index + 1, drafts);
633
758
  setError(null);
634
759
  },
635
760
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {})
@@ -703,11 +828,35 @@ window.__ModuleLoader__.load({
703
828
  //#region lib/types/client/index.js
704
829
  /** Dictionary namespace owned by this plugin. */
705
830
  const NS = "question";
706
- /** Required services: the slot registry and the question composer's copy. */
707
- const inject = ["slots", "locale"];
708
- /** Chain routing: claim the composer while a question wait is pending (pure — owner props only). */
709
- function selectQuestion({ interactions }) {
710
- return interactions.find((i) => i.kind === "question") ?? null;
831
+ /** Required services: Agent scopes, Remote Events, Session UI, Slot registry, and copy. */
832
+ const inject = [
833
+ "sessions",
834
+ "remote",
835
+ "uiSession",
836
+ "slots",
837
+ "locale"
838
+ ];
839
+ /** Present one request until the user answers, cancels, or its lifetime ends. */
840
+ async function answerQuestion(ctx, owner, request, next, registerPendingInteraction) {
841
+ const sessionId = ctx.sessions.scopeOf(owner);
842
+ if (sessionId === void 0) return next();
843
+ const pending = new PendingQuestion(sessionId, request.questions, request.signal);
844
+ const completed = Promise.withResolvers();
845
+ const remove = registerPendingInteraction(pending, async () => {
846
+ pending.delegate();
847
+ await completed.promise;
848
+ });
849
+ try {
850
+ try {
851
+ return await pending.result;
852
+ } catch (error) {
853
+ if (pending.isDelegation(error)) return await next();
854
+ throw error;
855
+ }
856
+ } finally {
857
+ remove();
858
+ completed.resolve();
859
+ }
711
860
  }
712
861
  /**
713
862
  * Client plugin body: register the `question` dictionaries and the question
@@ -720,14 +869,19 @@ window.__ModuleLoader__.load({
720
869
  zh,
721
870
  en
722
871
  }), "ui-user-questions: dictionaries");
872
+ const questionDraftStore = createQuestionDraftStore();
873
+ const registerPendingInteraction = ctx.uiSession.registerPendingInteraction((pending) => pending.kind === "plan-review" ? 2 : 1);
723
874
  ctx.slots.inject("conversation.composer", () => ctx.slots.register({
724
875
  name: "conversation.composer",
725
- select: selectQuestion,
726
- locale: NS
876
+ select: ({ pendingInteraction }) => pendingInteraction instanceof PendingQuestion ? pendingInteraction : null,
877
+ locale: NS,
878
+ store: questionDraftStore
727
879
  }, QuestionComposer));
880
+ ctx.remote.$on("user-questions/request", function(request, next) {
881
+ return answerQuestion(ctx, this, request, next, registerPendingInteraction);
882
+ });
728
883
  }
729
884
  //#endregion
730
- exports.PendingQuestion = PendingQuestion;
731
885
  exports.apply = apply;
732
886
  exports.inject = inject;
733
887
  return module.exports;
@@ -7,9 +7,9 @@ window.__ModuleLoader__.load({
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let react = require("react");
9
9
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
10
- let _deepseek_ai_dsh_client_runtime_client = require("@deepseek-ai/dsh-client-runtime/client");
10
+ let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
11
11
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-workflow-run/src/client/WorkflowRunPanel.module.css.mjs
12
- const css = ".DBuyfa_root{width:100%;min-width:0}.DBuyfa_runHeader{box-sizing:border-box;background:var(--dsw-alias-bg-module-platform);border-radius:8px;align-items:center;gap:6px;width:100%;min-width:0;height:32px;padding:0 8px;display:flex}.DBuyfa_runHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.DBuyfa_runLeading{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_runTitle{max-width:42%;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:14px;font-weight:510;line-height:24px;overflow:hidden}.DBuyfa_runSummary{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;line-height:18px;overflow:hidden}.DBuyfa_statusTail{height:20px;color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;align-items:center;gap:4px;font-size:11px;font-weight:510;line-height:16px;display:inline-flex;overflow:hidden}.DBuyfa_phaseHeader{box-sizing:border-box;align-items:center;gap:6px;width:100%;min-width:0;height:32px;display:flex}.DBuyfa_phaseHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:4px}.DBuyfa_phaseLeading{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_phaseTitle{min-width:0;max-width:42%;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:14px;line-height:24px;overflow:hidden}.DBuyfa_phaseCount{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;line-height:20px;overflow:hidden}.DBuyfa_phaseStatus{width:132px;color:var(--dsw-alias-label-secondary);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:13px;line-height:20px;overflow:hidden}.DBuyfa_separator{background:var(--dsw-alias-label-tertiary);border-radius:50%;flex:none;width:2px;height:2px}.DBuyfa_phaseList{flex-direction:column;gap:4px;min-width:0;padding:4px 0 0 16px;display:flex}.DBuyfa_phase{min-width:0}.DBuyfa_members{flex-direction:column;gap:2px;min-width:0;padding:0 0 0 16px;display:flex}.DBuyfa_memberRow,.DBuyfa_memberButton{width:100%;min-width:0;min-height:24px;color:var(--dsw-alias-label-secondary);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;align-items:center;gap:12px;padding:0;display:flex}.DBuyfa_memberButton{cursor:pointer}.DBuyfa_memberButton .DBuyfa_memberLabel{color:var(--dsw-alias-state-business-primary);text-underline-position:from-font;text-decoration:underline}.DBuyfa_dotSlot{flex:none;justify-content:center;align-items:center;width:16px;height:24px;display:inline-flex;overflow:hidden}.DBuyfa_memberButton:focus-visible{outline:none}.DBuyfa_memberButton:focus-visible .DBuyfa_memberLabelWrap{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.DBuyfa_memberLabelWrap{border-radius:4px;flex:1;align-items:center;min-width:0;height:24px;padding:0 2px;display:flex;overflow:hidden}.DBuyfa_memberLabel{min-width:0;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;line-height:24px;overflow:hidden}.DBuyfa_memberStatus{width:64px;color:var(--dsw-alias-label-secondary);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:13px;line-height:20px;overflow:hidden}.DBuyfa_empty{color:var(--dsw-alias-label-tertiary);padding:0;font-size:13px;line-height:20px}@media (width<=560px){.DBuyfa_phaseList,.DBuyfa_members{padding-left:12px}}";
12
+ const css = ".DBuyfa_root{width:100%;min-width:0}.DBuyfa_runHeader{box-sizing:border-box;background:var(--dsw-alias-bg-module-platform);border-radius:8px;align-items:center;gap:6px;width:100%;min-width:0;height:32px;padding:0 8px;display:flex}.DBuyfa_runHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.DBuyfa_runLeading{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_runTitle{max-width:42%;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);font-weight:510;line-height:calc(24px + var(--dsh-content-font-delta,0px));text-overflow:ellipsis;white-space:nowrap;flex:none;overflow:hidden}.DBuyfa_runSummary{min-width:0;color:var(--dsw-alias-label-tertiary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(18px + var(--dsh-content-font-delta-secondary,0px));text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.DBuyfa_statusTail{height:20px;color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;align-items:center;gap:4px;font-size:11px;font-weight:510;line-height:16px;display:inline-flex;overflow:hidden}.DBuyfa_phaseHeader{box-sizing:border-box;align-items:center;gap:6px;width:100%;min-width:0;height:32px;display:flex}.DBuyfa_phaseHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:4px}.DBuyfa_phaseLeading{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_phaseTitle{min-width:0;max-width:42%;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));text-overflow:ellipsis;white-space:nowrap;flex:0 auto;overflow:hidden}.DBuyfa_phaseCount{min-width:0;color:var(--dsw-alias-label-tertiary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.DBuyfa_phaseStatus{width:calc(132px + var(--dsh-content-font-delta-secondary,0px) * 10);color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;overflow:hidden}.DBuyfa_separator{corner-shape:round;background:var(--dsw-alias-label-tertiary);border-radius:50%;flex:none;width:2px;height:2px}.DBuyfa_phaseList{flex-direction:column;gap:4px;min-width:0;padding:4px 0 0 16px;display:flex}.DBuyfa_phase{min-width:0}.DBuyfa_members{flex-direction:column;gap:2px;min-width:0;padding:0 0 0 16px;display:flex}.DBuyfa_memberRow,.DBuyfa_memberButton{width:100%;min-width:0;min-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-secondary);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;align-items:center;gap:12px;padding:0;display:flex}.DBuyfa_memberButton{cursor:pointer}.DBuyfa_memberButton .DBuyfa_memberLabel{color:var(--dsw-alias-state-business-primary);text-underline-position:from-font;text-decoration:underline}.DBuyfa_dotSlot{width:16px;height:calc(24px + var(--dsh-content-font-delta,0px));flex:none;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}.DBuyfa_memberButton:focus-visible{outline:none}.DBuyfa_memberButton:focus-visible .DBuyfa_memberLabelWrap{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.DBuyfa_memberLabelWrap{min-width:0;height:calc(24px + var(--dsh-content-font-delta,0px));border-radius:4px;flex:1;align-items:center;padding:0 2px;display:flex;overflow:hidden}.DBuyfa_memberLabel{min-width:0;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.DBuyfa_memberStatus{width:64px;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;overflow:hidden}.DBuyfa_empty{color:var(--dsw-alias-label-tertiary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));padding:0}@media (width<=560px){.DBuyfa_phaseList,.DBuyfa_members{padding-left:12px}}";
13
13
  const tagId = "@deepseek-ai/dsh-client-ui-workflow-run/WorkflowRunPanel.module.css";
14
14
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
15
15
  const tag = document.createElement("style");
@@ -311,7 +311,7 @@ window.__ModuleLoader__.load({
311
311
  }));
312
312
  const runContentRef = (0, react.useRef)(null);
313
313
  const phaseContentRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
314
- const navigable = useSessions((sessions) => navigableMembers(sessions, node.data.phases, sessionId), _deepseek_ai_dsh_client_runtime_client.shallowEqual);
314
+ const navigable = useSessions((sessions) => navigableMembers(sessions, node.data.phases, sessionId), _deepseek_ai_dsh_client_store.shallowEqual);
315
315
  (0, react.useLayoutEffect)(() => {
316
316
  setDisclosures((current) => {
317
317
  const phases = /* @__PURE__ */ new Map();
@@ -618,14 +618,14 @@ window.__ModuleLoader__.load({
618
618
  /** Browser plugin for durable workflow-run Conversation Nodes. */
619
619
  /** Required services for Definition, keyed renderer, navigation, and copy. */
620
620
  const inject = [
621
- "conversationEvents",
621
+ "uiConversation",
622
622
  "slots",
623
623
  "sessions",
624
624
  "locale"
625
625
  ];
626
626
  /** Register the workflow Definition, dictionary, and keyed Chat renderer. */
627
627
  function apply(ctx) {
628
- ctx.conversationEvents.register(workflowRunDefinition);
628
+ ctx.uiConversation.events.register(workflowRunDefinition);
629
629
  ctx.effect(() => ctx.locale.register(NS, {
630
630
  zh,
631
631
  en