@deepseek-ai/dsh-client-ui-conversation 0.1.2-alpha.3 → 0.1.2-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/ui-conversation/README.md
5
- README.md: ce99ede306e0b0aeac24d7b21beacd0a538380b6
6
- README.zh.md: 5a2e481071ed3303983d5b57c68690ea9f4c4ab3
5
+ README.md: 3292c39477a051ac406f453e781376164333ee78
6
+ README.zh.md: 433b2e6c8b3580dadf5dd9e38eaea7b1ab7022a6
package/README.md CHANGED
@@ -121,3 +121,5 @@ None; Conversation assembly and browser input state do not alter provider-side p
121
121
  None.
122
122
 
123
123
  </details>
124
+
125
+ **Runtime invariant:** No companion is published. Conversation Definitions, target builders, and Views are already validated by their owning registries and the Slot ledger.
package/README.zh.md CHANGED
@@ -121,3 +121,5 @@ selector 必须是 owner currency 的纯函数。非 null 返回值作为 `match
121
121
  无。
122
122
 
123
123
  </details>
124
+
125
+ **运行时不变式:** 不发布伴生入口。Conversation Definition、target builder 与 View 已由其所属注册表和 Slot ledger 校验。
package/lib/client.js CHANGED
@@ -76,14 +76,53 @@ window.__ModuleLoader__.load({
76
76
  }
77
77
  //#endregion
78
78
  //#region lib/types/client/conversation/location-index.js
79
+ var MutableLocationDataSource = class {
80
+ store;
81
+ key;
82
+ listeners = /* @__PURE__ */ new Set();
83
+ published;
84
+ constructor(store, key) {
85
+ this.store = store;
86
+ this.key = key;
87
+ this.published = store.get(key);
88
+ }
89
+ getSnapshot = () => this.store.get(this.key);
90
+ subscribe = (listener) => {
91
+ this.listeners.add(listener);
92
+ return () => {
93
+ this.listeners.delete(listener);
94
+ };
95
+ };
96
+ publish() {
97
+ const next = this.getSnapshot();
98
+ if (this.published === next) return;
99
+ this.published = next;
100
+ (0, _deepseek_ai_dsh_client_store.notifySubscribers)(this.listeners, `[ui-conversation] Location data ${this.key}`);
101
+ }
102
+ };
79
103
  var MutableLocationDataStore = class {
104
+ markDirty;
80
105
  entries = /* @__PURE__ */ new Map();
106
+ sources = /* @__PURE__ */ new Map();
107
+ dirtyKeys = /* @__PURE__ */ new Set();
108
+ constructor(markDirty) {
109
+ this.markDirty = markDirty;
110
+ }
81
111
  get(key) {
82
112
  return this.entries.get(key)?.value;
83
113
  }
114
+ source(key) {
115
+ let source = this.sources.get(key);
116
+ if (source === void 0) {
117
+ source = new MutableLocationDataSource(this, key);
118
+ this.sources.set(key, source);
119
+ }
120
+ return source;
121
+ }
84
122
  remove(owner, key) {
85
123
  if (this.entries.get(key)?.owner !== owner) return false;
86
124
  this.entries.delete(key);
125
+ this.changed(key);
87
126
  return true;
88
127
  }
89
128
  set(owner, key, value) {
@@ -94,19 +133,29 @@ window.__ModuleLoader__.load({
94
133
  owner,
95
134
  value
96
135
  });
136
+ this.changed(key);
97
137
  return true;
98
138
  }
99
139
  replace(entries) {
100
- let changed = this.entries.size !== entries.size;
101
- if (!changed) for (const [key, value] of entries) {
140
+ const changedKeys = [];
141
+ for (const key of new Set([...this.entries.keys(), ...entries.keys()])) {
102
142
  const current = this.entries.get(key);
103
- if (current?.owner !== value.owner || current.value !== value.value) {
104
- changed = true;
105
- break;
106
- }
143
+ const next = entries.get(key);
144
+ if (current?.owner !== next?.owner || current?.value !== next?.value) changedKeys.push(key);
107
145
  }
108
- if (changed) this.entries = new Map(entries);
109
- return changed;
146
+ if (changedKeys.length === 0) return false;
147
+ this.entries = new Map(entries);
148
+ for (const key of changedKeys) this.changed(key);
149
+ return true;
150
+ }
151
+ publish() {
152
+ const dirty = [...this.dirtyKeys];
153
+ this.dirtyKeys.clear();
154
+ for (const key of dirty) this.sources.get(key)?.publish();
155
+ }
156
+ changed(key) {
157
+ this.dirtyKeys.add(key);
158
+ this.markDirty(this);
110
159
  }
111
160
  };
112
161
  const SESSION_LOCATION = { kind: "session" };
@@ -148,6 +197,7 @@ window.__ModuleLoader__.load({
148
197
  };
149
198
  turnDataStores = /* @__PURE__ */ new Map();
150
199
  stepDataStores = /* @__PURE__ */ new Map();
200
+ dirtyDataStores = /* @__PURE__ */ new Set();
151
201
  currentTurn;
152
202
  currentStep;
153
203
  /**
@@ -200,6 +250,12 @@ window.__ModuleLoader__.load({
200
250
  }
201
251
  return changed;
202
252
  }
253
+ /** Publish committed Location-data changes to their keyed sources. */
254
+ publishData() {
255
+ const dirty = [...this.dirtyDataStores];
256
+ this.dirtyDataStores.clear();
257
+ for (const store of dirty) store.publish();
258
+ }
203
259
  /**
204
260
  * Resolve the latest Location for one event.
205
261
  * @param event - event already ingested into this index.
@@ -444,15 +500,18 @@ window.__ModuleLoader__.load({
444
500
  return this.mutableStepData(stepDataKey(turn, step));
445
501
  }
446
502
  mutableTurnData(turn) {
447
- const current = this.turnDataStores.get(turn) ?? new MutableLocationDataStore();
503
+ const current = this.turnDataStores.get(turn) ?? this.createDataStore();
448
504
  this.turnDataStores.set(turn, current);
449
505
  return current;
450
506
  }
451
507
  mutableStepData(key) {
452
- const current = this.stepDataStores.get(key) ?? new MutableLocationDataStore();
508
+ const current = this.stepDataStores.get(key) ?? this.createDataStore();
453
509
  this.stepDataStores.set(key, current);
454
510
  return current;
455
511
  }
512
+ createDataStore() {
513
+ return new MutableLocationDataStore((store) => this.dirtyDataStores.add(store));
514
+ }
456
515
  storeFor(data) {
457
516
  return data.kind === "turn" ? this.mutableTurnData(data.turn) : this.mutableStepData(stepDataKey(data.turn, requireStep(data)));
458
517
  }
@@ -697,6 +756,7 @@ window.__ModuleLoader__.load({
697
756
  });
698
757
  published = true;
699
758
  }
759
+ this.locationIndex.publishData();
700
760
  this.replacePending = false;
701
761
  this.dirty.clear();
702
762
  this.dirtyByTarget.clear();
@@ -719,6 +779,7 @@ window.__ModuleLoader__.load({
719
779
  });
720
780
  published = true;
721
781
  }
782
+ this.locationIndex.publishData();
722
783
  this.dirty.clear();
723
784
  this.dirtyByTarget.clear();
724
785
  this.timelineDirty = false;
@@ -1103,9 +1164,9 @@ window.__ModuleLoader__.load({
1103
1164
  }
1104
1165
  return upserts;
1105
1166
  }
1106
- buildLocationData(context, scope) {
1167
+ buildLocationData(context, scope, previous) {
1107
1168
  if (context.definition.buildLocationData === void 0) return null;
1108
- const data = context.definition.buildLocationData(contextSnapshot(context), scope);
1169
+ const data = context.definition.buildLocationData(contextSnapshot(context), scope, previous);
1109
1170
  if (data === null) return null;
1110
1171
  if (data.kind !== scope) throw new Error(`conversation Definition "${context.kind}" published ${data.kind} data through its ${scope} scope`);
1111
1172
  if (data.key !== context.kind) throw new Error(`conversation Definition "${context.kind}" published Location data key "${data.key}"; expected its owned kind`);
@@ -1117,7 +1178,7 @@ window.__ModuleLoader__.load({
1117
1178
  const entries = [];
1118
1179
  for (const scope of LOCATION_DATA_SCOPES) {
1119
1180
  for (const context of this.contexts.values()) {
1120
- const data = this.buildLocationData(context, scope);
1181
+ const data = this.buildLocationData(context, scope, context.locationData[scope]);
1121
1182
  context.locationData[scope] = data;
1122
1183
  if (data !== null) entries.push({
1123
1184
  owner: context.key,
@@ -1133,9 +1194,10 @@ window.__ModuleLoader__.load({
1133
1194
  const changes = [];
1134
1195
  for (const context of this.dirty) {
1135
1196
  const previous = context.locationData[scope];
1136
- const next = this.buildLocationData(context, scope);
1197
+ const next = this.buildLocationData(context, scope, previous);
1198
+ if (previous === next) continue;
1137
1199
  context.locationData[scope] = next;
1138
- if (previous !== next) changes.push({
1200
+ changes.push({
1139
1201
  owner: context.key,
1140
1202
  previous,
1141
1203
  next
@@ -1505,8 +1567,7 @@ window.__ModuleLoader__.load({
1505
1567
  this.publish(this.assembler.rebuildRegistry());
1506
1568
  }
1507
1569
  dispose() {
1508
- if (this.frame !== void 0 && typeof cancelAnimationFrame === "function") cancelAnimationFrame(this.frame);
1509
- this.frame = void 0;
1570
+ this.cancelFrame();
1510
1571
  this.disposeFeed();
1511
1572
  }
1512
1573
  replace(window) {
@@ -1539,13 +1600,22 @@ window.__ModuleLoader__.load({
1539
1600
  if (publication === "animation-frame" && typeof requestAnimationFrame === "function") {
1540
1601
  if (this.frame !== void 0) return;
1541
1602
  this.frame = requestAnimationFrame(() => {
1542
- this.frame = void 0;
1543
- this.flush();
1603
+ this.frame = requestAnimationFrame(() => {
1604
+ this.frame = requestAnimationFrame(() => {
1605
+ this.frame = void 0;
1606
+ this.flush();
1607
+ });
1608
+ });
1544
1609
  });
1545
1610
  return;
1546
1611
  }
1612
+ this.cancelFrame();
1547
1613
  this.flush();
1548
1614
  }
1615
+ cancelFrame() {
1616
+ if (this.frame !== void 0 && typeof cancelAnimationFrame === "function") cancelAnimationFrame(this.frame);
1617
+ this.frame = void 0;
1618
+ }
1549
1619
  flush() {
1550
1620
  if (this.assembler.flush()) this.snapshot.set(this.currentSnapshot());
1551
1621
  }
@@ -13508,7 +13578,7 @@ window.__ModuleLoader__.load({
13508
13578
  };
13509
13579
  //#endregion
13510
13580
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/queue/QueueDock.module.css.mjs
13511
- const css$7 = "._7yHdaG_dock{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));margin:0 auto calc(0px - var(--dsh-composer-stack-gap) - 3px);padding:0 var(--dsh-composer-dock-inset);flex:none}._7yHdaG_panel{background:var(--dsw-specific-tip);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px 12px 0 0;width:100%;padding:2px 0;position:relative;overflow:hidden}._7yHdaG_panel:after{border:1px solid var(--dsw-alias-border-l1);border-radius:inherit;content:\"\";pointer-events:none;border-bottom:none;position:absolute;inset:0}._7yHdaG_header{box-sizing:border-box;width:100%;height:36px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:10px;padding:4px 12px;display:flex}._7yHdaG_header:focus-visible{outline:2px solid var(--dsw-alias-label-tertiary);outline-offset:-2px}._7yHdaG_header:disabled{cursor:default}._7yHdaG_lead{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}._7yHdaG_count{min-width:0;font-family:Inter, var(--dsw-font-family);flex:auto;font-size:13px;font-weight:500;line-height:24px}._7yHdaG_chevron{width:14px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}._7yHdaG_list{max-height:180px;margin:0;padding:0;list-style:none;overflow-y:auto}._7yHdaG_row{box-sizing:border-box;border-radius:8px;align-items:center;gap:10px;width:100%;height:36px;padding:4px 5px 4px 12px;display:flex}._7yHdaG_row+._7yHdaG_row{box-shadow:inset 0 1px 0 var(--dsw-alias-border-l1)}._7yHdaG_thumbs{flex:none;gap:4px;display:flex}._7yHdaG_thumb{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);object-fit:cover;border-radius:4px;width:24px;height:24px}._7yHdaG_preview,._7yHdaG_editor{min-width:0;font:var(--dsw-font-xs-13);font-family:Inter, var(--dsw-font-family);flex:auto}._7yHdaG_preview{color:var(--dsw-alias-label-primary-dimmed);text-overflow:ellipsis;white-space:nowrap;word-break:break-word;overflow:hidden}._7yHdaG_editor{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);height:28px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:0 8px}._7yHdaG_editor:focus{border-color:var(--dsw-alias-state-business-primary)}._7yHdaG_actions{flex:none;align-items:center;gap:10px;display:flex}._7yHdaG_action{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;flex:none;place-items:center;padding:0;display:grid}._7yHdaG_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._7yHdaG_action:focus-visible{outline:2px solid var(--dsw-alias-label-tertiary);outline-offset:-2px}._7yHdaG_action:disabled{cursor:default;opacity:.45}";
13581
+ const css$7 = "._7yHdaG_dock{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));margin:0 auto calc(0px - var(--dsh-composer-stack-gap) - 3px);padding:0 var(--dsh-composer-dock-inset);flex:none}._7yHdaG_panel{background:var(--dsw-specific-tip);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px 12px 0 0;width:100%;padding:2px 0;position:relative;overflow:hidden}._7yHdaG_panel:after{border:.5px solid var(--dsw-alias-border-l1);border-radius:inherit;content:\"\";pointer-events:none;border-bottom:none;position:absolute;inset:0}._7yHdaG_header{box-sizing:border-box;width:100%;height:36px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:10px;padding:4px 12px;display:flex}._7yHdaG_header:focus-visible{outline:2px solid var(--dsw-alias-label-tertiary);outline-offset:-2px}._7yHdaG_header:disabled{cursor:default}._7yHdaG_lead{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}._7yHdaG_count{min-width:0;font-family:Inter, var(--dsw-font-family);flex:auto;font-size:13px;font-weight:500;line-height:24px}._7yHdaG_chevron{width:14px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}._7yHdaG_list{max-height:180px;margin:0;padding:0;list-style:none;overflow-y:auto}._7yHdaG_row{box-sizing:border-box;border-radius:8px;align-items:center;gap:10px;width:100%;height:36px;padding:4px 5px 4px 12px;display:flex}._7yHdaG_row+._7yHdaG_row{box-shadow:inset 0 1px 0 var(--dsw-alias-border-l1)}._7yHdaG_thumbs{flex:none;gap:4px;display:flex}._7yHdaG_thumb{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);object-fit:cover;border-radius:4px;width:24px;height:24px}._7yHdaG_preview,._7yHdaG_editor{min-width:0;font:var(--dsw-font-xs-13);font-family:Inter, var(--dsw-font-family);flex:auto}._7yHdaG_preview{color:var(--dsw-alias-label-primary-dimmed);text-overflow:ellipsis;white-space:nowrap;word-break:break-word;overflow:hidden}._7yHdaG_editor{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-base);height:28px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:0 8px}._7yHdaG_editor:focus{border-color:var(--dsw-alias-state-business-primary)}._7yHdaG_actions{flex:none;align-items:center;gap:10px;display:flex}._7yHdaG_action{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;flex:none;place-items:center;padding:0;display:grid}._7yHdaG_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._7yHdaG_action:focus-visible{outline:2px solid var(--dsw-alias-label-tertiary);outline-offset:-2px}._7yHdaG_action:disabled{cursor:default;opacity:.45}";
13512
13582
  const tagId$7 = "@deepseek-ai/dsh-client-ui-conversation/QueueDock.module.css";
13513
13583
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
13514
13584
  const tag = document.createElement("style");
@@ -13848,7 +13918,7 @@ window.__ModuleLoader__.load({
13848
13918
  };
13849
13919
  //#endregion
13850
13920
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/settings/EnterBehaviorRow.module.css.mjs
13851
- const css$6 = ".T1PP_q_row{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.T1PP_q_rowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.T1PP_q_title{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.T1PP_q_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.T1PP_q_selector{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.T1PP_q_selector:hover{background:var(--dsw-alias-interactive-bg-hover)}.T1PP_q_chevron{flex:none}";
13921
+ const css$6 = ".T1PP_q_row{border-bottom:.5px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.T1PP_q_rowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.T1PP_q_title{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.T1PP_q_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.T1PP_q_selector{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.T1PP_q_selector:hover{background:var(--dsw-alias-interactive-bg-hover)}.T1PP_q_chevron{flex:none}";
13852
13922
  const tagId$6 = "@deepseek-ai/dsh-client-ui-conversation/EnterBehaviorRow.module.css";
13853
13923
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
13854
13924
  const tag = document.createElement("style");
@@ -13955,7 +14025,7 @@ window.__ModuleLoader__.load({
13955
14025
  }
13956
14026
  //#endregion
13957
14027
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css.mjs
13958
- const css$5 = ".pXSMma_root{justify-content:center;align-items:center;min-width:0;height:100%;padding:0 24px;display:flex}.pXSMma_stack{width:100%;max-width:var(--dsh-composer-card-max-width);flex-direction:column;align-items:stretch;gap:12px;display:flex;overflow:visible}.pXSMma_headline{color:var(--dsw-alias-label-primary);grid-template-columns:34px auto auto;justify-content:center;align-items:center;column-gap:10px;font-size:26px;font-weight:500;line-height:32px;display:grid}.pXSMma_headlineText{grid-area:1/2}.pXSMma_previewBadge{border:1px solid var(--dsw-alias-interactive-bg-hover);background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-label-primary-bluish);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:24px;grid-area:1/3;align-self:start;margin-top:2px;margin-left:-3px;padding:1px 7px 0;font-size:12px;font-weight:500;line-height:18px}.pXSMma_fishHitbox{grid-area:1/1;justify-content:center;align-items:center;display:inline-flex}.pXSMma_fish{transform-origin:50% 60%;color:var(--dsw-alias-label-primary);display:block;overflow:visible}@keyframes pXSMma_hero-fish-swim{0%,to{transform:none}35%{transform:rotate(-4deg)translate(-.4px,-.9px)}70%{transform:rotate(1.6deg)translate(.3px,.2px)}}@media (hover:hover) and (prefers-reduced-motion:no-preference){.pXSMma_fishHitbox:hover .pXSMma_fish{animation:1.6s ease-in-out infinite pXSMma_hero-fish-swim}}.pXSMma_body{flex-direction:column;gap:12px;min-width:0;display:flex;position:relative;overflow:visible}.pXSMma_body>*{z-index:1;position:relative}.pXSMma_body>.pXSMma_workspaceRow{z-index:10;align-items:center;min-width:0;padding-left:8px;display:flex}.pXSMma_workspace{max-width:min(100%,360px);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:16px;align-items:center;gap:4px;padding:0 8px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.pXSMma_workspace:not(:disabled):hover,.pXSMma_workspace[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover)}.pXSMma_workspace:disabled{cursor:default}.pXSMma_folder{color:var(--dsw-alias-label-primary);flex:none}.pXSMma_workspaceLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.pXSMma_chevron{color:var(--dsw-alias-label-caption);flex:none}.pXSMma_modalInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);width:100%;height:44px;color:var(--dsw-alias-label-primary);background:0 0;border-radius:22px;outline:none;padding:7px 14px;font-size:14px;font-weight:400;line-height:22px}.pXSMma_modalInput::placeholder{color:var(--dsw-alias-label-caption)}.pXSMma_modalInput:disabled{color:var(--dsw-alias-label-dimmed)}.pXSMma_modalAction{min-width:72px}.pXSMma_modalError{color:var(--dsw-alias-state-error-primary);margin-top:8px;font-size:12px;line-height:18px}";
14028
+ const css$5 = ".pXSMma_root{justify-content:center;align-items:center;min-width:0;height:100%;padding:0 24px;display:flex}.pXSMma_stack{width:100%;max-width:var(--dsh-composer-card-max-width);flex-direction:column;align-items:stretch;gap:12px;display:flex;overflow:visible}.pXSMma_headline{color:var(--dsw-alias-label-primary);grid-template-columns:34px auto auto;justify-content:center;align-items:center;column-gap:10px;font-size:26px;font-weight:500;line-height:32px;display:grid}.pXSMma_headlineText{grid-area:1/2}.pXSMma_previewBadge{border:.5px solid var(--dsw-alias-interactive-bg-hover);background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-label-primary-bluish);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:24px;grid-area:1/3;align-self:start;margin-top:2px;margin-left:-3px;padding:1px 7px 0;font-size:12px;font-weight:500;line-height:18px}.pXSMma_fishHitbox{grid-area:1/1;justify-content:center;align-items:center;display:inline-flex}.pXSMma_fish{transform-origin:50% 60%;color:var(--dsw-alias-label-primary);display:block;overflow:visible}@keyframes pXSMma_hero-fish-swim{0%,to{transform:none}35%{transform:rotate(-4deg)translate(-.4px,-.9px)}70%{transform:rotate(1.6deg)translate(.3px,.2px)}}@media (hover:hover) and (prefers-reduced-motion:no-preference){.pXSMma_fishHitbox:hover .pXSMma_fish{animation:1.6s ease-in-out infinite pXSMma_hero-fish-swim}}.pXSMma_body{flex-direction:column;gap:12px;min-width:0;display:flex;position:relative;overflow:visible}.pXSMma_body>*{z-index:1;position:relative}.pXSMma_body>.pXSMma_workspaceRow{z-index:10;align-items:center;min-width:0;padding-left:8px;display:flex}.pXSMma_workspace{max-width:min(100%,360px);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:16px;align-items:center;gap:4px;padding:0 8px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.pXSMma_workspace:not(:disabled):hover,.pXSMma_workspace[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover)}.pXSMma_workspace:disabled{cursor:default}.pXSMma_folder{color:var(--dsw-alias-label-primary);flex:none}.pXSMma_workspaceLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.pXSMma_chevron{color:var(--dsw-alias-label-caption);flex:none}.pXSMma_modalInput{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);width:100%;height:44px;color:var(--dsw-alias-label-primary);background:0 0;border-radius:22px;outline:none;padding:7px 14px;font-size:14px;font-weight:400;line-height:22px}.pXSMma_modalInput::placeholder{color:var(--dsw-alias-label-caption)}.pXSMma_modalInput:disabled{color:var(--dsw-alias-label-dimmed)}.pXSMma_modalAction{min-width:72px}.pXSMma_modalError{color:var(--dsw-alias-state-error-primary);margin-top:8px;font-size:12px;line-height:18px}";
13959
14029
  const tagId$5 = "@deepseek-ai/dsh-client-ui-conversation/HeroShell.module.css";
13960
14030
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
13961
14031
  const tag = document.createElement("style");
@@ -14112,7 +14182,7 @@ window.__ModuleLoader__.load({
14112
14182
  }
14113
14183
  //#endregion
14114
14184
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css.mjs
14115
- const css$4 = ".wSkVaW_root{background:var(--dsw-alias-bg-base);--dsh-chat-content-width:var(--dsh-chat-user-width,clamp(680px, calc(var(--dsh-conversation-column-width,0px) * .64), 920px));--dsh-composer-card-max-width:calc(var(--dsh-chat-content-width) + 32px);--dsh-composer-side-clearance:16px;--dsh-composer-dock-inset:8px;flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.wSkVaW_header{border-bottom:1px solid #0000;flex:none;padding:12px 28px 0 20px;position:relative}.wSkVaW_header:after{content:\"\";z-index:0;background:var(--dsw-alias-border-l2);pointer-events:none;height:1px;position:absolute;bottom:1px;left:0;right:0}.wSkVaW_headerHidden{display:none}.wSkVaW_titleRow{align-items:center;gap:0;min-height:32px;display:flex}.wSkVaW_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.wSkVaW_crumbs{white-space:nowrap;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.wSkVaW_crumbSeg{align-items:center;gap:4px;min-width:0;display:inline-flex}.wSkVaW_crumbSep{color:var(--dsw-alias-label-caption);font-size:14px;line-height:20px}.wSkVaW_crumb{max-width:220px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:12px;padding:4px 8px;font-size:14px;line-height:20px;overflow:hidden}.wSkVaW_crumbSubagent{font-size:12px;line-height:18px}.wSkVaW_crumb:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.wSkVaW_crumbCurrent{color:var(--dsw-alias-label-primary);cursor:default;font-weight:500}.wSkVaW_headerActions{flex:none;align-items:center;gap:8px;display:flex}.wSkVaW_headerUtilities{flex:none;align-items:center;gap:8px;margin-left:20px;display:flex}.wSkVaW_headerUtilities:empty{display:none}.wSkVaW_tabs{z-index:1;gap:36px;margin-top:4px;padding-left:8px;display:flex;position:relative}.wSkVaW_tab{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;padding:0 0 11px;font-size:13px;font-weight:500;line-height:16px;position:relative}.wSkVaW_tab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:1px;left:0;right:0}.wSkVaW_tabActive{color:var(--dsw-alias-state-business-primary)}.wSkVaW_tabActive:after{background:var(--dsw-alias-state-business-primary)}.wSkVaW_viewArea{flex-direction:column;flex:1;min-height:0;display:flex}.wSkVaW_widthHandle{z-index:8;width:min(40px, calc((100% - var(--dsh-chat-content-width)) / 2 - 24px - 24px));cursor:col-resize;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]{right:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}.wSkVaW_widthHandle[data-side=right]{left:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}.wSkVaW_widthHandle:after{content:\"\";background:linear-gradient(to bottom, transparent calc(var(--dsh-width-handle-pointer-y,50%) - 52px), var(--dsw-alias-scrollbar-hover-l1) calc(var(--dsh-width-handle-pointer-y,50%) - 12px), var(--dsw-alias-scrollbar-hover-l1) calc(var(--dsh-width-handle-pointer-y,50%) + 12px), transparent calc(var(--dsh-width-handle-pointer-y,50%) + 52px));opacity:0;pointer-events:none;border-radius:3px;width:3px;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]:after{right:16px}.wSkVaW_widthHandle[data-side=right]:after{left:16px}.wSkVaW_widthHandle:hover:after,.wSkVaW_widthHandle[data-dragging]:after{opacity:1}.wSkVaW_root:has([data-conversation-composer-overlay]) .wSkVaW_widthHandle{display:none}.wSkVaW_composerStack{--dsh-composer-stack-gap:6px;gap:var(--dsh-composer-stack-gap);flex-direction:column;display:flex}.wSkVaW_composerSeat{--dsh-composer-text-max-height:336px;flex-direction:column;flex:none;display:flex}.wSkVaW_root[data-phase=active]{overflow:hidden}.wSkVaW_root[data-phase=active] .wSkVaW_header{flex:none}.wSkVaW_body{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.wSkVaW_scrollBody{scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}.wSkVaW_root[data-phase=active] .wSkVaW_viewArea{flex:1 0 auto;min-height:auto}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat{z-index:7;background:linear-gradient(180deg, color-mix(in srgb, var(--dsw-alias-bg-base) 0%, transparent) 0px, var(--dsw-alias-bg-base) 36px);position:sticky;bottom:0}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat:has([data-trigger-menu]){z-index:9}.wSkVaW_scrollBody:has([data-conversation-composer-overlay]){scrollbar-gutter:auto;position:relative;overflow:hidden auto}.wSkVaW_scrollBody:has([data-conversation-composer-overlay])>[data-slot=conversation\\.session]>.wSkVaW_viewArea{flex:1 1 0;min-height:0;overflow:hidden}.wSkVaW_scrollBody:has([data-conversation-composer-overlay])>.wSkVaW_composerSeat{right:var(--dsh-scrollbar-width);position:absolute;bottom:0;left:0}.wSkVaW_composerHero{width:min(calc(var(--dsh-composer-card-max-width) + 2 * var(--dsh-composer-side-clearance)), 100%);z-index:1;align-self:center;gap:8px;padding-bottom:32px}.wSkVaW_heroWorkspaceRow{align-items:center;gap:2px;min-width:0;margin-top:4px;padding-left:20px;display:flex}.wSkVaW_root[data-phase=hero] .wSkVaW_scrollBody{justify-content:center;overflow-y:auto}.wSkVaW_root[data-phase=settling] .wSkVaW_composerSeat{visibility:hidden}";
14185
+ const css$4 = ".wSkVaW_root{background:var(--dsw-alias-bg-base);--dsh-chat-content-width:var(--dsh-chat-user-width,clamp(680px, calc(var(--dsh-conversation-column-width,0px) * .64), 920px));--dsh-composer-card-max-width:calc(var(--dsh-chat-content-width) + 32px);--dsh-composer-side-clearance:16px;--dsh-composer-dock-inset:8px;flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.wSkVaW_header{border-bottom:1px solid #0000;flex:none;padding:12px 28px 0 20px;position:relative}.wSkVaW_header:after{content:\"\";z-index:0;background:var(--dsw-alias-border-l3);pointer-events:none;height:.5px;position:absolute;bottom:1px;left:0;right:0}.wSkVaW_headerHidden{display:none}.wSkVaW_titleRow{align-items:center;gap:0;min-height:32px;display:flex}.wSkVaW_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.wSkVaW_crumbs{white-space:nowrap;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.wSkVaW_crumbSeg{align-items:center;gap:4px;min-width:0;display:inline-flex}.wSkVaW_crumbSep{color:var(--dsw-alias-label-caption);font-size:14px;line-height:20px}.wSkVaW_crumb{max-width:220px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:12px;padding:4px 8px;font-size:14px;line-height:20px;overflow:hidden}.wSkVaW_crumbSubagent{font-size:12px;line-height:18px}.wSkVaW_crumb:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.wSkVaW_crumbCurrent{color:var(--dsw-alias-label-primary);cursor:default;font-weight:500}.wSkVaW_headerActions{flex:none;align-items:center;gap:8px;display:flex}.wSkVaW_headerUtilities{flex:none;align-items:center;gap:8px;margin-left:20px;display:flex}.wSkVaW_headerUtilities:empty{display:none}.wSkVaW_tabs{z-index:1;gap:36px;margin-top:4px;padding-left:8px;display:flex;position:relative}.wSkVaW_tab{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;padding:0 0 11px;font-size:13px;font-weight:500;line-height:16px;position:relative}.wSkVaW_tab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:1px;left:0;right:0}.wSkVaW_tabActive{color:var(--dsw-alias-state-business-primary)}.wSkVaW_tabActive:after{background:var(--dsw-alias-state-business-primary)}.wSkVaW_viewArea{flex-direction:column;flex:1;min-height:0;display:flex}.wSkVaW_widthHandle{z-index:8;width:min(40px, calc((100% - var(--dsh-chat-content-width)) / 2 - 24px - 24px));cursor:col-resize;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]{right:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}.wSkVaW_widthHandle[data-side=right]{left:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}.wSkVaW_widthHandle:after{content:\"\";background:linear-gradient(to bottom, transparent calc(var(--dsh-width-handle-pointer-y,50%) - 52px), var(--dsw-alias-scrollbar-hover-l1) calc(var(--dsh-width-handle-pointer-y,50%) - 12px), var(--dsw-alias-scrollbar-hover-l1) calc(var(--dsh-width-handle-pointer-y,50%) + 12px), transparent calc(var(--dsh-width-handle-pointer-y,50%) + 52px));opacity:0;pointer-events:none;border-radius:3px;width:3px;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]:after{right:16px}.wSkVaW_widthHandle[data-side=right]:after{left:16px}.wSkVaW_widthHandle:hover:after,.wSkVaW_widthHandle[data-dragging]:after{opacity:1}.wSkVaW_root:has([data-conversation-composer-overlay]) .wSkVaW_widthHandle{display:none}.wSkVaW_composerStack{--dsh-composer-stack-gap:6px;gap:var(--dsh-composer-stack-gap);flex-direction:column;display:flex}.wSkVaW_composerSeat{--dsh-composer-text-max-height:336px;flex-direction:column;flex:none;display:flex}.wSkVaW_root[data-phase=active]{overflow:hidden}.wSkVaW_root[data-phase=active] .wSkVaW_header{flex:none}.wSkVaW_body{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.wSkVaW_scrollBody{scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}.wSkVaW_root[data-phase=active] .wSkVaW_viewArea{flex:1 0 auto;min-height:auto}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat{z-index:7;background:linear-gradient(180deg, color-mix(in srgb, var(--dsw-alias-bg-base) 0%, transparent) 0px, var(--dsw-alias-bg-base) 36px);position:sticky;bottom:0}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat:has([data-trigger-menu]){z-index:9}.wSkVaW_scrollBody:has([data-conversation-composer-overlay]){scrollbar-gutter:auto;position:relative;overflow:hidden auto}.wSkVaW_scrollBody:has([data-conversation-composer-overlay])>[data-slot=conversation\\.session]>.wSkVaW_viewArea{flex:1 1 0;min-height:0;overflow:hidden}.wSkVaW_scrollBody:has([data-conversation-composer-overlay])>.wSkVaW_composerSeat{right:var(--dsh-scrollbar-width);position:absolute;bottom:0;left:0}.wSkVaW_composerHero{width:min(calc(var(--dsh-composer-card-max-width) + 2 * var(--dsh-composer-side-clearance)), 100%);z-index:1;align-self:center;gap:8px;padding-bottom:32px}.wSkVaW_heroWorkspaceRow{align-items:center;gap:2px;min-width:0;margin-top:4px;padding-left:20px;display:flex}.wSkVaW_root[data-phase=hero] .wSkVaW_scrollBody{justify-content:center;overflow-y:auto}.wSkVaW_root[data-phase=settling] .wSkVaW_composerSeat{visibility:hidden}";
14116
14186
  const tagId$4 = "@deepseek-ai/dsh-client-ui-conversation/ConversationRoot.module.css";
14117
14187
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
14118
14188
  const tag = document.createElement("style");
@@ -14376,11 +14446,7 @@ window.__ModuleLoader__.load({
14376
14446
  } : !inert && composerBlock !== void 0 ? {
14377
14447
  blocked: composerBlock,
14378
14448
  placeholder: composerBlock.reason
14379
- } : hero ? { placeholder: t("placeholder.hero") } : {},
14380
- overlay: sessionId === void 0 ? void 0 : renderSlot("conversation.input.overlay", {}),
14381
- leftItems: zone === void 0 ? null : renderSlot("conversation.input.left", zone),
14382
- rightItems: zone === void 0 ? null : renderSlot("conversation.input.right", zone),
14383
- footer: !hero && zone !== void 0 ? renderSlot("conversation.composer.dock", zone) : null
14449
+ } : hero ? { placeholder: t("placeholder.hero") } : {}
14384
14450
  });
14385
14451
  const composerBar = (0, react_jsx_runtime.jsxs)("div", {
14386
14452
  className: clsx(ConversationRoot_module_css_default.composerStack, hero && ConversationRoot_module_css_default.composerHero),
@@ -14783,7 +14849,7 @@ window.__ModuleLoader__.load({
14783
14849
  }
14784
14850
  //#endregion
14785
14851
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/ContextMeter.module.css.mjs
14786
- const css$3 = ".JObwrW_root{display:inline-flex;position:relative}.JObwrW_trigger{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.JObwrW_trigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.JObwrW_track{fill:none;stroke:var(--dsw-alias-border-l3);stroke-width:2px}.JObwrW_fill{fill:none;stroke:var(--dsw-alias-label-tertiary);stroke-width:2px;stroke-linecap:round}.JObwrW_panel{z-index:100;box-sizing:border-box;border:1px solid var(--dsw-alias-border-inverted);background:var(--dsw-specific-menu);width:264px;box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-secondary);cursor:default;border-radius:12px;padding:12px;font-size:12px;line-height:20px;position:absolute;bottom:calc(100% + 8px);right:0}.JObwrW_header{align-items:center;gap:6px;display:flex}.JObwrW_figures{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);margin-left:auto;font-weight:500}.JObwrW_percent{color:var(--dsw-alias-label-primary);font-weight:500}.JObwrW_headline{color:var(--dsw-alias-label-tertiary)}.JObwrW_headline:empty{display:none}.JObwrW_bar{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;gap:1px;height:4px;margin:10px 0 12px;display:flex;overflow:hidden}.JObwrW_segment{background:var(--meter-tint,var(--dsw-alias-label-tertiary));border-radius:1px;flex:none;min-width:2px;height:100%}.JObwrW_swatch{background:var(--meter-tint);vertical-align:baseline;border-radius:2px;width:8px;height:8px;margin-right:6px;display:inline-block}.JObwrW_colorSystem{--meter-tint:var(--dsw-static-neutral-bluish-400)}.JObwrW_colorTools{--meter-tint:#a78bfa}.JObwrW_colorMessages{--meter-tint:var(--dsw-static-blue-450)}.JObwrW_rows{margin:6px 0 0}.JObwrW_row{justify-content:space-between;align-items:center;gap:12px;padding:2px 0;display:flex}.JObwrW_row dt{color:var(--dsw-alias-label-secondary)}.JObwrW_row dd{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);margin:0}";
14852
+ const css$3 = ".JObwrW_root{display:inline-flex;position:relative}.JObwrW_trigger{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.JObwrW_trigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.JObwrW_track{fill:none;stroke:var(--dsw-alias-border-l3);stroke-width:2px}.JObwrW_fill{fill:none;stroke:var(--dsw-alias-label-tertiary);stroke-width:2px;stroke-linecap:round}.JObwrW_panel{z-index:100;box-sizing:border-box;background:var(--dsw-specific-menu);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);width:264px;box-shadow:var(--dsw-elevation-prominent);color:var(--dsw-alias-label-secondary);cursor:default;border:0;border-radius:12px;padding:12px;font-size:12px;line-height:20px;position:absolute;bottom:calc(100% + 8px);right:0}.JObwrW_header{align-items:center;gap:6px;display:flex}.JObwrW_figures{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);margin-left:auto;font-weight:500}.JObwrW_percent{color:var(--dsw-alias-label-primary);font-weight:500}.JObwrW_headline{color:var(--dsw-alias-label-tertiary)}.JObwrW_headline:empty{display:none}.JObwrW_bar{corner-shape:round;background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;gap:1px;height:4px;margin:10px 0 12px;display:flex;overflow:hidden}.JObwrW_segment{background:var(--meter-tint,var(--dsw-alias-label-tertiary));border-radius:1px;flex:none;min-width:2px;height:100%}.JObwrW_swatch{background:var(--meter-tint);vertical-align:baseline;border-radius:2px;width:8px;height:8px;margin-right:6px;display:inline-block}.JObwrW_colorSystem{--meter-tint:var(--dsw-static-neutral-bluish-400)}.JObwrW_colorTools{--meter-tint:#a78bfa}.JObwrW_colorMessages{--meter-tint:var(--dsw-static-blue-450)}.JObwrW_rows{margin:6px 0 0}.JObwrW_row{justify-content:space-between;align-items:center;gap:12px;padding:2px 0;display:flex}.JObwrW_row dt{color:var(--dsw-alias-label-secondary)}.JObwrW_row dd{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);margin:0}";
14787
14853
  const tagId$3 = "@deepseek-ai/dsh-client-ui-conversation/ContextMeter.module.css";
14788
14854
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
14789
14855
  const tag = document.createElement("style");
@@ -15201,7 +15267,7 @@ window.__ModuleLoader__.load({
15201
15267
  }
15202
15268
  //#endregion
15203
15269
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css.mjs
15204
- const css$1 = ".uV2eYG_root{padding:0 var(--dsh-composer-side-clearance) 8px;flex-direction:column;align-items:center;display:flex}.uV2eYG_hero{padding:0 var(--dsh-composer-side-clearance)}.uV2eYG_notice{width:100%;max-width:var(--dsh-composer-card-max-width);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:8px;margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.uV2eYG_card{box-sizing:border-box;width:100%;max-width:var(--dsh-composer-card-max-width);border:1px solid var(--dsw-alias-border-l2-darkmode-thin);background:var(--dsw-specific-input-major);box-shadow:var(--dsw-shadow-lv2);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:22px;flex-direction:column;gap:12px;padding-top:10px;display:flex;position:relative}.uV2eYG_cardWorkspaceTrigger{cursor:pointer;border-color:#0000}.uV2eYG_cardWorkspaceTrigger:after{content:\"\";background:var(--dsw-alias-border-l4);pointer-events:none;border-radius:22px;transition:background-color .1s;position:absolute;inset:-1px;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='22' ry='22' stroke='black' stroke-width='2' stroke-dasharray='4 4'/%3E%3C/svg%3E\");mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='22' ry='22' stroke='black' stroke-width='2' stroke-dasharray='4 4'/%3E%3C/svg%3E\")}.uV2eYG_cardWorkspaceTrigger :disabled{pointer-events:none}.uV2eYG_cardWorkspaceTrigger:hover:after{background:var(--dsw-alias-state-business-primary)}.uV2eYG_accessory{align-items:center;gap:8px;padding:10px 12px 0;display:flex}.uV2eYG_overlayAnchor{height:0;position:absolute;inset:0 0 auto}.uV2eYG_scroll{max-height:var(--dsh-composer-text-max-height);margin-right:4px;overflow-y:auto}.uV2eYG_scroll::-webkit-scrollbar-track{margin-top:8px}.uV2eYG_grow{position:relative}.uV2eYG_pending{background:var(--dsw-alias-state-business-primary);border-radius:50%;width:8px;height:8px;animation:1s ease-in-out infinite alternate uV2eYG_input-pending}@keyframes uV2eYG_input-pending{0%{opacity:.35}to{opacity:1}}.uV2eYG_input{box-sizing:border-box;font-family:var(--dsw-font-family);font-size:inherit;line-height:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);caret-color:var(--dsw-alias-state-business-primary);outline:none;padding:4px 8px 0 16px}.uV2eYG_input p{margin:0}.uV2eYG_input p:last-child:after{content:var(--dsh-composer-hint);color:var(--dsw-alias-label-caption)}.uV2eYG_placeholder{color:var(--dsw-alias-label-caption);pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 16px}.uV2eYG_inputDisabled{color:var(--dsw-alias-label-tertiary);cursor:not-allowed}.uV2eYG_input[aria-haspopup=menu]{cursor:pointer}.uV2eYG_hero .uV2eYG_input{min-height:52px}.uV2eYG_row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:2px 8px 6px;display:flex;container-type:inline-size}.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{align-items:center;min-width:0;display:flex}.uV2eYG_tools{gap:16px}.uV2eYG_modes{gap:12px}.uV2eYG_trailing{flex:none;gap:12px;margin-left:auto}.uV2eYG_add{background:var(--dsw-specific-selector);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.uV2eYG_add:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}.uV2eYG_add:disabled{opacity:.5;cursor:default}.uV2eYG_select{max-width:220px;height:28px;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;appearance:none;background-color:#0000;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 4px center;background-repeat:no-repeat;background-size:12px 12px;border:none;border-radius:8px;outline:none;padding:0 20px 0 8px;font-size:13px;font-weight:500;line-height:20px}.uV2eYG_select:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover)}.uV2eYG_select:disabled{opacity:.5;cursor:default}.uV2eYG_primary{background:var(--dsw-alias-button-info-fill);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid;transform:translateY(-2px)}.uV2eYG_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}.uV2eYG_primary:disabled{opacity:.4;cursor:default}.uV2eYG_retry{color:inherit;cursor:pointer;background:0 0;border:1px solid;border-radius:4px;margin-left:8px;padding:1px 8px;font-size:12px}";
15270
+ const css$1 = ".uV2eYG_root{padding:0 var(--dsh-composer-side-clearance) 8px;flex-direction:column;align-items:center;display:flex}.uV2eYG_hero{padding:0 var(--dsh-composer-side-clearance)}.uV2eYG_notice{width:100%;max-width:var(--dsh-composer-card-max-width);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:8px;margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.uV2eYG_card{box-sizing:border-box;width:100%;max-width:var(--dsh-composer-card-max-width);--dsw-elevation-stroke-color:var(--dsw-alias-border-l2);background:var(--dsw-specific-input-major);box-shadow:var(--dsw-elevation-soft);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;border-radius:22px;flex-direction:column;gap:12px;padding-top:10px;display:flex;position:relative}.uV2eYG_cardWorkspaceTrigger{--dsw-elevation-stroke-color:transparent;cursor:pointer}.uV2eYG_cardWorkspaceTrigger:after{content:\"\";background:var(--dsw-alias-border-l4);pointer-events:none;border-radius:22px;transition:background-color .1s;position:absolute;inset:-1px;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='22' ry='22' stroke='black' stroke-width='2' stroke-dasharray='4 4'/%3E%3C/svg%3E\");mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' fill='none' rx='22' ry='22' stroke='black' stroke-width='2' stroke-dasharray='4 4'/%3E%3C/svg%3E\")}.uV2eYG_cardWorkspaceTrigger :disabled{pointer-events:none}.uV2eYG_cardWorkspaceTrigger:hover:after{background:var(--dsw-alias-state-business-primary)}.uV2eYG_accessory{align-items:center;gap:8px;padding:10px 12px 0;display:flex}.uV2eYG_overlayAnchor{height:0;position:absolute;inset:0 0 auto}.uV2eYG_scroll{max-height:var(--dsh-composer-text-max-height);margin-right:4px;overflow-y:auto}.uV2eYG_scroll::-webkit-scrollbar-track{margin-top:8px}.uV2eYG_grow{position:relative}.uV2eYG_pending{corner-shape:round;background:var(--dsw-alias-state-business-primary);border-radius:50%;width:8px;height:8px;animation:1s ease-in-out infinite alternate uV2eYG_input-pending}@keyframes uV2eYG_input-pending{0%{opacity:.35}to{opacity:1}}.uV2eYG_input{box-sizing:border-box;font-family:var(--dsw-font-family);font-size:inherit;line-height:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);caret-color:var(--dsw-alias-state-business-primary);outline:none;padding:4px 8px 0 16px}.uV2eYG_input p{margin:0}.uV2eYG_input p:last-child:after{content:var(--dsh-composer-hint);color:var(--dsw-alias-label-caption)}.uV2eYG_placeholder{color:var(--dsw-alias-label-caption);pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 16px}.uV2eYG_inputDisabled{color:var(--dsw-alias-label-tertiary);cursor:not-allowed}.uV2eYG_input[aria-haspopup=menu]{cursor:pointer}.uV2eYG_hero .uV2eYG_input{min-height:52px}.uV2eYG_row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:2px 8px 6px;display:flex;container-type:inline-size}.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{align-items:center;min-width:0;display:flex}.uV2eYG_tools{gap:16px}.uV2eYG_modes{gap:12px}.uV2eYG_trailing{flex:none;gap:12px;margin-left:auto}.uV2eYG_add{corner-shape:round;background:var(--dsw-specific-selector);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.uV2eYG_add:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}.uV2eYG_add:disabled{opacity:.5;cursor:default}.uV2eYG_select{max-width:220px;height:28px;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;appearance:none;background-color:#0000;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 4px center;background-repeat:no-repeat;background-size:12px 12px;border:none;border-radius:8px;outline:none;padding:0 20px 0 8px;font-size:13px;font-weight:500;line-height:20px}.uV2eYG_select:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover)}.uV2eYG_select:disabled{opacity:.5;cursor:default}.uV2eYG_primary{corner-shape:round;background:var(--dsw-alias-button-info-fill);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid;transform:translateY(-2px)}.uV2eYG_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}.uV2eYG_primary:disabled{opacity:.4;cursor:default}.uV2eYG_retry{color:inherit;cursor:pointer;background:0 0;border:1px solid;border-radius:4px;margin-left:8px;padding:1px 8px;font-size:12px}";
15205
15271
  const tagId$1 = "@deepseek-ai/dsh-client-ui-conversation/InputBar.module.css";
15206
15272
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
15207
15273
  const tag = document.createElement("style");
@@ -15240,8 +15306,8 @@ window.__ModuleLoader__.load({
15240
15306
  * Machine state arrives through the standard provide channel
15241
15307
  * (useInput + inputActions); the keyboard/DOM command face and stop arrive
15242
15308
  * through this entry's own inject, whose hooks compartment binds
15243
- * useNotices/useLexicon; layout-phase inputs (variant, placeholder,
15244
- * region-slot content) ride the owner props. Session facts
15309
+ * useNotices/useLexicon; layout-phase inputs (variant and placeholder) ride
15310
+ * the owner props. Session facts
15245
15311
  * (running/removed/promptError) are self-selected via useSession.
15246
15312
  *
15247
15313
  * The text surface is the shell-owned Lexical editor bound here through
@@ -15250,7 +15316,7 @@ window.__ModuleLoader__.load({
15250
15316
  * The no-session state renders the SAME div inert as the Workspace-picker
15251
15317
  * trigger instead of a parallel tree.
15252
15318
  */
15253
- function InputBar({ useSession, useInput, inputActions, keyboard, addImages, removeImage, draftImages, resolveSubmitMode, toggleCommandMenu, stop, command, t, renderSlot, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory, overlay, leftItems, rightItems, footer }) {
15319
+ const InputBar = (0, react.memo)(function InputBar({ useSession, useInput, inputActions, keyboard, addImages, removeImage, draftImages, resolveSubmitMode, toggleCommandMenu, stop, command, t, renderSlot, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory }) {
15254
15320
  const input = useInput((s) => s);
15255
15321
  const notice = useNotices((s) => s);
15256
15322
  const commandMenuOpen = useMenuLauncher((source) => source === "command");
@@ -15492,9 +15558,9 @@ window.__ModuleLoader__.load({
15492
15558
  e.stopPropagation();
15493
15559
  } : void 0,
15494
15560
  children: [
15495
- overlay !== void 0 && (0, react_jsx_runtime.jsx)("div", {
15561
+ sessionId !== void 0 && (0, react_jsx_runtime.jsx)("div", {
15496
15562
  className: InputBar_module_css_default.overlayAnchor,
15497
- children: overlay
15563
+ children: renderSlot("conversation.input.overlay", {})
15498
15564
  }),
15499
15565
  accessory !== void 0 && (0, react_jsx_runtime.jsx)("div", {
15500
15566
  className: InputBar_module_css_default.accessory,
@@ -15568,12 +15634,12 @@ window.__ModuleLoader__.load({
15568
15634
  className: InputBar_module_css_default.modes,
15569
15635
  children: [accessSelect, sessionId === void 0 ? null : renderSlot("conversation.input.plan", { locked })]
15570
15636
  }),
15571
- leftItems
15637
+ input === void 0 || sessionId === void 0 ? null : renderSlot("conversation.input.left", {})
15572
15638
  ]
15573
15639
  }), (0, react_jsx_runtime.jsxs)("div", {
15574
15640
  className: InputBar_module_css_default.trailing,
15575
15641
  children: [
15576
- rightItems,
15642
+ input === void 0 || sessionId === void 0 ? null : renderSlot("conversation.input.right", {}),
15577
15643
  sessionId === void 0 ? null : renderSlot("conversation.input.model", { locked: modelSeatLocked }),
15578
15644
  (0, react_jsx_runtime.jsx)(ContextMeter, {
15579
15645
  useProjection,
@@ -15647,13 +15713,13 @@ window.__ModuleLoader__.load({
15647
15713
  })
15648
15714
  ]
15649
15715
  }),
15650
- footer
15716
+ variant === "composer" && input !== void 0 && sessionId !== void 0 ? renderSlot("conversation.composer.dock", {}) : null
15651
15717
  ]
15652
15718
  });
15653
- }
15719
+ });
15654
15720
  //#endregion
15655
15721
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css.mjs
15656
- const css = ".lXshSW_root{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-specific-tip);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;flex:none;margin:0 auto;overflow:hidden}.lXshSW_body{flex-direction:column;gap:8px;padding:6px 12px;display:flex}.lXshSW_header{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:0;display:flex}.lXshSW_lead{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}.lXshSW_title{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:24px}.lXshSW_progress{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:13px;font-weight:400;line-height:20px;overflow:hidden}.lXshSW_chevron{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}.lXshSW_list{flex-direction:column;gap:8px;max-height:180px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.lXshSW_item{min-width:0;color:var(--dsw-alias-label-secondary);align-items:center;gap:10px;font-size:13px;line-height:20px;display:flex}.lXshSW_glyph{flex:none;place-items:center;width:16px;height:16px;display:grid}.lXshSW_glyphCompleted{color:var(--dsw-alias-state-success-primary)}.lXshSW_glyphPending{color:var(--dsw-alias-label-caption)}.lXshSW_glyphProgress{color:var(--dsw-alias-state-business-primary);animation:1s linear infinite lXshSW_todo-progress-spin}@keyframes lXshSW_todo-progress-spin{to{transform:rotate(360deg)}}.lXshSW_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";
15722
+ const css = ".lXshSW_root{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-specific-tip);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;flex:none;margin:0 auto;overflow:hidden}.lXshSW_body{flex-direction:column;gap:8px;padding:6px 12px;display:flex}.lXshSW_header{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:0;display:flex}.lXshSW_lead{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}.lXshSW_title{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:24px}.lXshSW_progress{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:13px;font-weight:400;line-height:20px;overflow:hidden}.lXshSW_chevron{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}.lXshSW_list{flex-direction:column;gap:8px;max-height:180px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.lXshSW_item{min-width:0;color:var(--dsw-alias-label-secondary);align-items:center;gap:10px;font-size:13px;line-height:20px;display:flex}.lXshSW_glyph{flex:none;place-items:center;width:16px;height:16px;display:grid}.lXshSW_glyphCompleted{color:var(--dsw-alias-state-success-primary)}.lXshSW_glyphPending{color:var(--dsw-alias-label-caption)}.lXshSW_glyphProgress{color:var(--dsw-alias-state-business-primary);animation:1s linear infinite lXshSW_todo-progress-spin}@keyframes lXshSW_todo-progress-spin{to{transform:rotate(360deg)}}.lXshSW_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";
15657
15723
  const tagId = "@deepseek-ai/dsh-client-ui-conversation/TodoPanel.module.css";
15658
15724
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
15659
15725
  const tag = document.createElement("style");
@@ -16008,26 +16074,10 @@ window.__ModuleLoader__.load({
16008
16074
  kind: "single",
16009
16075
  scope: "session-maybe"
16010
16076
  },
16011
- "conversation.input.overlay": {
16012
- kind: "list",
16013
- scope: "session"
16014
- },
16015
16077
  "conversation.input.dock": {
16016
16078
  kind: "list",
16017
16079
  scope: "session"
16018
16080
  },
16019
- "conversation.composer.dock": {
16020
- kind: "list",
16021
- scope: "session"
16022
- },
16023
- "conversation.input.left": {
16024
- kind: "list",
16025
- scope: "session"
16026
- },
16027
- "conversation.input.right": {
16028
- kind: "list",
16029
- scope: "session"
16030
- },
16031
16081
  "conversation.hero.brand.mark": {
16032
16082
  kind: "single",
16033
16083
  scope: "root"
@@ -16115,13 +16165,29 @@ window.__ModuleLoader__.load({
16115
16165
  kind: "single",
16116
16166
  scope: "session-maybe"
16117
16167
  },
16168
+ "conversation.input.overlay": {
16169
+ kind: "list",
16170
+ scope: "session"
16171
+ },
16172
+ "conversation.input.left": {
16173
+ kind: "list",
16174
+ scope: "session"
16175
+ },
16118
16176
  "conversation.input.plan": {
16119
16177
  kind: "single",
16120
16178
  scope: "session"
16121
16179
  },
16180
+ "conversation.input.right": {
16181
+ kind: "list",
16182
+ scope: "session"
16183
+ },
16122
16184
  "conversation.input.model": {
16123
16185
  kind: "single",
16124
16186
  scope: "session"
16187
+ },
16188
+ "conversation.composer.dock": {
16189
+ kind: "list",
16190
+ scope: "session"
16125
16191
  }
16126
16192
  },
16127
16193
  inject: (sessionId) => {
@@ -11,6 +11,13 @@ export interface ConversationTurnDataMap {
11
11
  /** Merge-extensible business values published against one Step. */
12
12
  export interface ConversationStepDataMap {
13
13
  }
14
+ /** Observable value for one independently owned Location-data key. */
15
+ export interface ConversationLocationDataSource<Value> {
16
+ /** @returns the current value. */
17
+ readonly getSnapshot: () => Value;
18
+ /** @param listener - callback for value changes. @returns the unsubscribe function. */
19
+ readonly subscribe: (listener: () => void) => () => void;
20
+ }
14
21
  /** Stable keyed reader for independently owned Location business values. */
15
22
  export interface ConversationLocationDataStore<DataMap extends object> {
16
23
  /**
@@ -19,6 +26,12 @@ export interface ConversationLocationDataStore<DataMap extends object> {
19
26
  * @returns latest immutable value, when its owning Context has published one.
20
27
  */
21
28
  get<Key extends keyof DataMap & string>(key: Key): Readonly<DataMap[Key]> | undefined;
29
+ /**
30
+ * Observe one business value without subscribing to unrelated Location keys.
31
+ * @param key - declaration-merged business key.
32
+ * @returns identity-stable source for the current value.
33
+ */
34
+ source<Key extends keyof DataMap & string>(key: Key): ConversationLocationDataSource<Readonly<DataMap[Key]> | undefined>;
22
35
  }
23
36
  interface ConversationLocationDataValue {
24
37
  readonly kind: 'turn' | 'step';
@@ -27,27 +40,28 @@ interface ConversationLocationDataValue {
27
40
  readonly key: string;
28
41
  readonly value: unknown;
29
42
  }
30
- type RegisteredTurnData = {
31
- [Key in keyof ConversationTurnDataMap & string]: {
43
+ type RegisteredTurnData<DataMap extends object> = {
44
+ [Key in Extract<keyof DataMap, string>]: {
32
45
  readonly kind: 'turn';
33
46
  readonly turn: number;
34
47
  readonly key: Key;
35
- readonly value: ConversationTurnDataMap[Key];
48
+ readonly value: DataMap[Key];
36
49
  };
37
- }[keyof ConversationTurnDataMap & string];
38
- type RegisteredStepData = {
39
- [Key in keyof ConversationStepDataMap & string]: {
50
+ }[Extract<keyof DataMap, string>];
51
+ type RegisteredStepData<DataMap extends object> = {
52
+ [Key in Extract<keyof DataMap, string>]: {
40
53
  readonly kind: 'step';
41
54
  readonly turn: number;
42
55
  readonly step: number;
43
56
  readonly key: Key;
44
- readonly value: ConversationStepDataMap[Key];
57
+ readonly value: DataMap[Key];
45
58
  };
46
- }[keyof ConversationStepDataMap & string];
59
+ }[Extract<keyof DataMap, string>];
60
+ type ConversationLocationDataOf<TurnData extends object, StepData extends object> = [
61
+ keyof TurnData | keyof StepData
62
+ ] extends [never] ? ConversationLocationDataValue : RegisteredTurnData<TurnData> | RegisteredStepData<StepData>;
47
63
  /** One Definition-owned value attached to an Engine-owned Turn or Step. */
48
- export type ConversationLocationData = [
49
- keyof ConversationTurnDataMap | keyof ConversationStepDataMap
50
- ] extends [never] ? ConversationLocationDataValue : RegisteredTurnData | RegisteredStepData;
64
+ export type ConversationLocationData = ConversationLocationDataOf<ConversationTurnDataMap, ConversationStepDataMap>;
51
65
  /** Immutable resolved boundary for one Agent step. */
52
66
  export interface StepLocation {
53
67
  readonly turn: number;
@@ -135,7 +149,7 @@ export interface ConversationContextReader {
135
149
  */
136
150
  previous<State>(kind: string): ConversationPreviousContext<State> | undefined;
137
151
  }
138
- /** Requested cadence for materializing updated business State into view Nodes. */
152
+ /** Requested cadence; `animation-frame` materializes after three browser animation frames. */
139
153
  export type ConversationPublication = 'none' | 'animation-frame' | 'immediate';
140
154
  /** Engine-owned Location data publication phase. */
141
155
  export type ConversationLocationDataScope = 'step' | 'turn';
@@ -180,9 +194,11 @@ export interface ConversationNodeDefinition<State = unknown> {
180
194
  * the same Location key.
181
195
  * @param context - latest complete Context.
182
196
  * @param scope - Location hierarchy level currently being materialized.
183
- * @returns current Location value, or null while unavailable.
197
+ * @param previous - value from the preceding materialization; return it when unchanged.
198
+ * @returns current Location value, preserving value identity while unchanged,
199
+ * or null while unavailable.
184
200
  */
185
- buildLocationData?(context: ConversationNodeContext<State>, scope: ConversationLocationDataScope): ConversationLocationData | null;
201
+ buildLocationData?(context: ConversationNodeContext<State>, scope: ConversationLocationDataScope, previous: ConversationLocationData | null): ConversationLocationData | null;
186
202
  /**
187
203
  * Materialize one final Node for this Definition's declared view target.
188
204
  * @param context - latest complete Context.
@@ -152,19 +152,16 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
152
152
  'conversation.composer.dock': {
153
153
  kind: 'list';
154
154
  scope: 'session';
155
- owner: InputZone;
156
155
  };
157
156
  /** Compact controls at the left of the composer tool row. */
158
157
  'conversation.input.left': {
159
158
  kind: 'list';
160
159
  scope: 'session';
161
- owner: InputZone;
162
160
  };
163
161
  /** Compact controls before the composer submit action. */
164
162
  'conversation.input.right': {
165
163
  kind: 'list';
166
164
  scope: 'session';
167
- owner: InputZone;
168
165
  };
169
166
  /** Resident composer body, including the no-Session inert state. */
170
167
  'conversation.composer.bar': {
@@ -295,14 +292,6 @@ export interface ComposerBarOwnerProps {
295
292
  placeholder?: string;
296
293
  /** Optional content rendered above the composer surface. */
297
294
  accessory?: ReactNode;
298
- /** Floating overlay content rendered inside the composer card. */
299
- overlay?: ReactNode;
300
- /** Left-side input controls. */
301
- leftItems?: ReactNode;
302
- /** Right-side input controls. */
303
- rightItems?: ReactNode;
304
- /** Ambient content below the card. */
305
- footer?: ReactNode;
306
295
  }
307
296
  /** Package-private operations injected into the resident composer bar. */
308
297
  export interface ComposerBarInjected {
@@ -326,7 +315,7 @@ export interface InputControlOwnerProps {
326
315
  locked: boolean;
327
316
  }
328
317
  /** Full props of the resident composer bar. */
329
- export type ComposerBarProps = PropsRuntime<'conversation.composer.bar'> & PropsRenderSlots<'conversation.input.attachments' | 'conversation.input.plan' | 'conversation.input.model'> & InjectFace<ComposerBarInjected> & PropsLocale<'conversation'>;
318
+ export type ComposerBarProps = PropsRuntime<'conversation.composer.bar'> & PropsRenderSlots<'conversation.input.attachments' | 'conversation.input.overlay' | 'conversation.input.left' | 'conversation.input.plan' | 'conversation.input.right' | 'conversation.input.model' | 'conversation.composer.dock'> & InjectFace<ComposerBarInjected> & PropsLocale<'conversation'>;
330
319
  /** Owner values used to elect a composer takeover. */
331
320
  export interface ComposerChainProps {
332
321
  /** Current Session identity used by temporary business-owned entries. */
@@ -344,7 +333,7 @@ export interface HeroBrandMarkOwnerProps {
344
333
  className?: string | undefined;
345
334
  }
346
335
  /** Full props of the resident optional-Session Conversation shell. */
347
- export type ConversationSlotProps = PropsRuntime<'conversation'> & PropsRenderSlots<'conversation.session' | 'conversation.session.header' | 'conversation.composer' | 'conversation.composer.bar' | 'conversation.input.overlay' | 'conversation.input.dock' | 'conversation.composer.dock' | 'conversation.input.left' | 'conversation.input.right' | 'conversation.hero.brand.mark' | 'conversation.hero.workspace' | 'conversation.hero.agentPreset'> & InjectFace<ConversationInjected> & PropsLocale<'conversation'>;
336
+ export type ConversationSlotProps = PropsRuntime<'conversation'> & PropsRenderSlots<'conversation.session' | 'conversation.session.header' | 'conversation.composer' | 'conversation.composer.bar' | 'conversation.input.dock' | 'conversation.hero.brand.mark' | 'conversation.hero.workspace' | 'conversation.hero.agentPreset'> & InjectFace<ConversationInjected> & PropsLocale<'conversation'>;
348
337
  /** Shared target-neutral Conversation store handle. */
349
338
  export type ConversationStore = ReturnType<typeof createConversationStore>;
350
339
  /** Full props of the strict Session body. */
@@ -15,6 +15,7 @@ export declare class ConversationLocationIndex {
15
15
  private timeline;
16
16
  private readonly turnDataStores;
17
17
  private readonly stepDataStores;
18
+ private readonly dirtyDataStores;
18
19
  private currentTurn;
19
20
  private currentStep;
20
21
  /**
@@ -37,6 +38,8 @@ export declare class ConversationLocationIndex {
37
38
  * @returns whether any published Location data changed.
38
39
  */
39
40
  applyData(changes: readonly ConversationLocationDataChange[]): boolean;
41
+ /** Publish committed Location-data changes to their keyed sources. */
42
+ publishData(): void;
40
43
  /**
41
44
  * Resolve the latest Location for one event.
42
45
  * @param event - event already ingested into this index.
@@ -65,6 +68,7 @@ export declare class ConversationLocationIndex {
65
68
  private stepData;
66
69
  private mutableTurnData;
67
70
  private mutableStepData;
71
+ private createDataStore;
68
72
  private storeFor;
69
73
  private resolve;
70
74
  }
@@ -4,7 +4,7 @@ export { UiConversation } from './conversation/assembly.ts';
4
4
  export type { ConversationBinding } from './conversation/assembly.ts';
5
5
  export { ConversationController, UnsupportedImageMediaTypeError } from './service.ts';
6
6
  export type { IConversation } from './service.ts';
7
- export type { ConversationContextReader, ConversationLocation, ConversationLocationData, ConversationLocationDataScope, ConversationLocationDataStore, ConversationMatch, ConversationMatchResult, ConversationNodeContext, ConversationNodeDefinition, ConversationPreviousContext, ConversationPublication, ConversationStartMatch, ConversationStepDataMap, ConversationTimelineSnapshot, ConversationTurnDataMap, ConversationViewBuilder, ConversationViewDefinition, ConversationViewNode, ConversationViewSnapshotMap, ConversationViewSnapshotStore, StepLocation, TurnLocation, } from './contract/conversation.ts';
7
+ export type { ConversationContextReader, ConversationLocation, ConversationLocationData, ConversationLocationDataScope, ConversationLocationDataSource, ConversationLocationDataStore, ConversationMatch, ConversationMatchResult, ConversationNodeContext, ConversationNodeDefinition, ConversationPreviousContext, ConversationPublication, ConversationStartMatch, ConversationStepDataMap, ConversationTimelineSnapshot, ConversationTurnDataMap, ConversationViewBuilder, ConversationViewDefinition, ConversationViewNode, ConversationViewSnapshotMap, ConversationViewSnapshotStore, StepLocation, TurnLocation, } from './contract/conversation.ts';
8
8
  export { EMPTY_CONVERSATION_SNAPSHOT, conversationPhase } from './contract/snapshot.ts';
9
9
  export type { ConversationPhase, ConversationSnapshot, } from './contract/snapshot.ts';
10
10
  export type { AssistantBlock, AssistantMessageNode, AssistantProvenanceView, AssistantRequestConfig, AssistantTiming, CommandNode, CompactionSummaryNode, ContextMessageNode, ConversationNode, ModelRetryNode, PartialAssistant, RunningToolCall, SteeringMessageNode, TodoItem, ToolCallBlock, ToolResultNode, TurnErrorNode, TurnMaxTokensNode, UnknownSurfaceNode, UserMessageNode, } from './contract/records.ts';
@@ -2,8 +2,8 @@
2
2
  * Machine state arrives through the standard provide channel
3
3
  * (useInput + inputActions); the keyboard/DOM command face and stop arrive
4
4
  * through this entry's own inject, whose hooks compartment binds
5
- * useNotices/useLexicon; layout-phase inputs (variant, placeholder,
6
- * region-slot content) ride the owner props. Session facts
5
+ * useNotices/useLexicon; layout-phase inputs (variant and placeholder) ride
6
+ * the owner props. Session facts
7
7
  * (running/removed/promptError) are self-selected via useSession.
8
8
  *
9
9
  * The text surface is the shell-owned Lexical editor bound here through
@@ -14,5 +14,5 @@
14
14
  */
15
15
  import type { ComposerBarProps } from '../contract/slots.ts';
16
16
  export type InputBarProps = ComposerBarProps;
17
- export declare function InputBar({ useSession, useInput, inputActions, keyboard, addImages, removeImage, draftImages, resolveSubmitMode, toggleCommandMenu, stop, command, t, renderSlot, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert, blocked, workspacePickerOpen, onRequestWorkspace, placeholder, accessory, overlay, leftItems, rightItems, footer, }: InputBarProps): import("react").JSX.Element;
17
+ export declare const InputBar: import("react").MemoExoticComponent<({ useSession, useInput, inputActions, keyboard, addImages, removeImage, draftImages, resolveSubmitMode, toggleCommandMenu, stop, command, t, renderSlot, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert, blocked, workspacePickerOpen, onRequestWorkspace, placeholder, accessory, }: InputBarProps) => import("react").JSX.Element>;
18
18
  //# sourceMappingURL=InputBar.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-conversation",
3
3
  "description": "Target-neutral Conversation assembly, shell, composer, queue, and view navigation",
4
- "version": "0.1.2-alpha.3",
4
+ "version": "0.1.2-alpha.5",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -18,10 +18,6 @@
18
18
  "types": "./lib/types/index.d.ts",
19
19
  "default": "./lib/index.js"
20
20
  },
21
- "./invariant": {
22
- "types": "./lib/types/invariant.d.ts",
23
- "default": "./lib/invariant.js"
24
- },
25
21
  "./client": {
26
22
  "types": "./lib/types/client/index.d.ts",
27
23
  "default": "./lib/client.js"
@@ -63,40 +59,38 @@
63
59
  "react-dom": "^18.2.0",
64
60
  "@types/react-dom": "~18.3.0",
65
61
  "zod": "^4.4.3",
62
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.2-alpha.5",
63
+ "@deepseek-ai/dsh-api-remotes": "^0.1.2-alpha.5",
66
64
  "@deepseek-ai/cordis": "^4.0.2",
67
- "@deepseek-ai/dsh-api-workspace-controller": "^0.1.2-alpha.3",
68
- "@deepseek-ai/dsh-api-session-controller": "^0.1.2-alpha.3",
69
- "@deepseek-ai/dsh-brand": "^0.1.2-alpha.3",
70
- "@deepseek-ai/dsh-attachment": "^0.1.2-alpha.3",
71
- "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.3",
72
- "@deepseek-ai/dsh-client-store": "^0.1.2-alpha.3",
73
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.2-alpha.3",
74
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.2-alpha.3",
75
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-alpha.3",
76
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.3",
77
- "@deepseek-ai/dsh-client-ui-session": "^0.1.2-alpha.3",
78
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.2-alpha.3",
79
- "@deepseek-ai/dsh-client-ui-workspace": "^0.1.2-alpha.3",
80
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-alpha.3",
81
- "@deepseek-ai/dsh-commands": "^0.1.2-alpha.3",
82
- "@deepseek-ai/dsh-goal": "^0.1.2-alpha.3",
83
- "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.3",
84
- "@deepseek-ai/dsh-llm": "^0.1.2-alpha.3",
85
- "@deepseek-ai/dsh-llm-retry": "^0.1.2-alpha.3",
86
- "@deepseek-ai/dsh-permission-presets": "^0.1.2-alpha.3",
87
- "@deepseek-ai/dsh-plan-mode": "^0.1.2-alpha.3",
88
- "@deepseek-ai/dsh-session": "^0.1.2-alpha.3",
89
- "@deepseek-ai/dsh-token-meter": "^0.1.2-alpha.3",
90
- "@deepseek-ai/dsh-tool-todo": "^0.1.2-alpha.3",
91
- "@deepseek-ai/dsh-util-crypto": "^0.1.2-alpha.3",
92
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.2-alpha.3",
93
- "@deepseek-ai/dsh-settings": "^0.1.2-alpha.3",
94
- "@deepseek-ai/dsh-workspace": "^0.1.2-alpha.3",
95
- "@deepseek-ai/dsh-api-remotes": "^0.1.2-alpha.3"
65
+ "@deepseek-ai/dsh-api-workspace-controller": "^0.1.2-alpha.5",
66
+ "@deepseek-ai/dsh-attachment": "^0.1.2-alpha.5",
67
+ "@deepseek-ai/dsh-brand": "^0.1.2-alpha.5",
68
+ "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.5",
69
+ "@deepseek-ai/dsh-client-store": "^0.1.2-alpha.5",
70
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.2-alpha.5",
71
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-alpha.5",
72
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.2-alpha.5",
73
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.5",
74
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.2-alpha.5",
75
+ "@deepseek-ai/dsh-client-ui-workspace": "^0.1.2-alpha.5",
76
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-alpha.5",
77
+ "@deepseek-ai/dsh-commands": "^0.1.2-alpha.5",
78
+ "@deepseek-ai/dsh-goal": "^0.1.2-alpha.5",
79
+ "@deepseek-ai/dsh-llm": "^0.1.2-alpha.5",
80
+ "@deepseek-ai/dsh-llm-retry": "^0.1.2-alpha.5",
81
+ "@deepseek-ai/dsh-permission-presets": "^0.1.2-alpha.5",
82
+ "@deepseek-ai/dsh-plan-mode": "^0.1.2-alpha.5",
83
+ "@deepseek-ai/dsh-session": "^0.1.2-alpha.5",
84
+ "@deepseek-ai/dsh-token-meter": "^0.1.2-alpha.5",
85
+ "@deepseek-ai/dsh-tool-todo": "^0.1.2-alpha.5",
86
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.2-alpha.5",
87
+ "@deepseek-ai/dsh-util-crypto": "^0.1.2-alpha.5",
88
+ "@deepseek-ai/dsh-workspace": "^0.1.2-alpha.5",
89
+ "@deepseek-ai/dsh-settings": "^0.1.2-alpha.5",
90
+ "@deepseek-ai/dsh-util-workspace-path": "^0.1.2-alpha.5"
96
91
  },
97
92
  "files": [
98
93
  "lib/index.js",
99
- "lib/invariant.js",
100
94
  "lib/client.js",
101
95
  "lib/types/**/*.d.ts"
102
96
  ],
package/lib/invariant.js DELETED
@@ -1,23 +0,0 @@
1
- //#region lib/types/invariant.js
2
- /**
3
- * Package-owned invariant companion for `@deepseek-ai/dsh-client-ui-conversation`.
4
- * @module @deepseek-ai/dsh-client-ui-conversation/invariant
5
- */
6
- const PACKAGE_NAME = "@deepseek-ai/dsh-client-ui-conversation";
7
- /** Cordis companion plugin name. */
8
- const name = "client-ui-conversation-invariant";
9
- /** Service required before the companion can reserve package ownership. */
10
- const inject = ["invariants"];
11
- /**
12
- * No runtime invariant: Conversation Definitions, target builders, and Views
13
- * are already validated by their owning registries and the Slot ledger.
14
- */
15
- const install = () => {};
16
- /**
17
- * Register this package's invariant companion.
18
- * @param ctx - Cordis context carrying the invariant service.
19
- * @returns the installed registration's disposer after setup succeeds.
20
- */
21
- const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
22
- //#endregion
23
- export { apply, inject, name };
@@ -1,16 +0,0 @@
1
- /**
2
- * Package-owned invariant companion for `@deepseek-ai/dsh-client-ui-conversation`.
3
- * @module @deepseek-ai/dsh-client-ui-conversation/invariant
4
- */
5
- import type { Context } from '@deepseek-ai/cordis';
6
- /** Cordis companion plugin name. */
7
- export declare const name = "client-ui-conversation-invariant";
8
- /** Service required before the companion can reserve package ownership. */
9
- export declare const inject: string[];
10
- /**
11
- * Register this package's invariant companion.
12
- * @param ctx - Cordis context carrying the invariant service.
13
- * @returns the installed registration's disposer after setup succeeds.
14
- */
15
- export declare const apply: (ctx: Context) => Promise<() => void>;
16
- //# sourceMappingURL=invariant.d.ts.map