@deepseek-ai/dsh-client-ui-conversation 0.1.7-alpha.2 → 0.1.7-rc.2

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/lib/client.js CHANGED
@@ -1860,15 +1860,7 @@ window.__ModuleLoader__.load({
1860
1860
  }
1861
1861
  return merged;
1862
1862
  }
1863
- function conversationMatch(key, input, role, location) {
1864
- if (role === "start") {
1865
- if (input.type !== "event") throw new Error(`conversation Context ${key} received a transient start Match`);
1866
- return {
1867
- event: input.event,
1868
- role,
1869
- location
1870
- };
1871
- }
1863
+ function conversationMatch(input, role, location) {
1872
1864
  return {
1873
1865
  event: input.event,
1874
1866
  role,
@@ -1916,6 +1908,16 @@ window.__ModuleLoader__.load({
1916
1908
  this.resetViewBuilders();
1917
1909
  }
1918
1910
  /**
1911
+ * Read the current open turn without activating a View.
1912
+ * @returns the latest turn number when its start is loaded and it remains open, otherwise undefined.
1913
+ */
1914
+ openTurn() {
1915
+ const snapshot = this.locationIndex.snapshot();
1916
+ const latest = snapshot.turnOrder.at(-1);
1917
+ const turn = latest === void 0 ? void 0 : snapshot.turns.get(latest);
1918
+ return turn?.status === "open" && turn.start !== void 0 ? turn.turn : void 0;
1919
+ }
1920
+ /**
1919
1921
  * Replace the complete loaded window after open, resync, or gap repair.
1920
1922
  * @param entries - complete contiguous window.
1921
1923
  * @param hasMore - whether older history remains outside the window.
@@ -1971,6 +1973,8 @@ window.__ModuleLoader__.load({
1971
1973
  }
1972
1974
  /**
1973
1975
  * Retire one Assistant attempt's transient matches and apply its optional durable settlement.
1976
+ * Empty Contexts retain their keys and published nodes until the loaded window is rebuilt;
1977
+ * Definitions may hide those nodes when no start remains instead of withdrawing their identities.
1974
1978
  * @param attemptId - process-local attempt whose transient presentation ended.
1975
1979
  * @param entry - durable message or attempt event committed for the stream.
1976
1980
  * @returns highest requested publication cadence.
@@ -2126,7 +2130,7 @@ window.__ModuleLoader__.load({
2126
2130
  collectInput(input, pending) {
2127
2131
  return this.dispatchInput(input, (definition, id, role) => {
2128
2132
  const key = conversationContextKey(definition.kind, id);
2129
- const match = conversationMatch(key, input, role, this.locationIndex.locationOf(input.event));
2133
+ const match = conversationMatch(input, role, this.locationIndex.locationOf(input.event));
2130
2134
  const matches = pending.get(key) ?? [];
2131
2135
  matches.push({
2132
2136
  definition,
@@ -2177,14 +2181,14 @@ window.__ModuleLoader__.load({
2177
2181
  acceptMatch(definition, id, role, input) {
2178
2182
  const key = conversationContextKey(definition.kind, id);
2179
2183
  let context = this.contexts.get(key);
2180
- if (role === "start" && context?.start !== void 0) throw new Error(`conversation Context ${key} received more than one start Match`);
2181
2184
  context ??= this.createContext(definition, id, key);
2182
- const match = conversationMatch(key, input, role, this.locationIndex.locationOf(input.event));
2185
+ const starting = role === "start" && context.start === void 0;
2186
+ const match = conversationMatch(input, role, this.locationIndex.locationOf(input.event));
2183
2187
  const previous = context.matches.at(-1);
2184
2188
  if (previous !== void 0 && previous.event.seq >= input.event.seq) throw new Error(`conversation Context ${key} received non-appended Match ${input.event.seq}`);
2185
- if (role === "start" && context.matches.length > 0) throw new Error(`conversation Context ${key} received an update before its start Match`);
2189
+ if (starting && context.matches.length > 0) throw new Error(`conversation Context ${key} received an update before its start Match`);
2186
2190
  context.matches.push(match);
2187
- if (match.role === "start") {
2191
+ if (starting && match.role === "start") {
2188
2192
  context.startSeq = input.event.seq;
2189
2193
  context.start = match;
2190
2194
  this.indexStartedContext(context);
@@ -2192,7 +2196,7 @@ window.__ModuleLoader__.load({
2192
2196
  const owners = this.contextsBySeq.get(input.event.seq) ?? /* @__PURE__ */ new Set();
2193
2197
  owners.add(context);
2194
2198
  this.contextsBySeq.set(input.event.seq, owners);
2195
- if (match.role === "start") this.replayContext(context);
2199
+ if (starting) this.replayContext(context);
2196
2200
  else if (context.state !== void 0) {
2197
2201
  const typed = contextSnapshot(context);
2198
2202
  context.state = requireState(definition, "update", definition.update(typed, match));
@@ -2203,49 +2207,57 @@ window.__ModuleLoader__.load({
2203
2207
  return definition.publication?.(match) ?? "immediate";
2204
2208
  }
2205
2209
  applyPendingMatches(pending, affected) {
2206
- const startsByKind = /* @__PURE__ */ new Map();
2207
2210
  for (const [key, entries] of pending) {
2208
2211
  const first = entries[0];
2209
2212
  if (first === void 0) continue;
2210
2213
  let context = this.contexts.get(key);
2211
2214
  context ??= this.createContext(first.definition, first.id, key);
2212
- let discoveredStart;
2213
2215
  const additions = entries.map((entry) => {
2214
2216
  if (entry.definition !== context.definition || entry.id !== context.id) throw new Error(`conversation Context ${key} received inconsistent Definition identity`);
2215
- if (entry.match.role === "start") {
2216
- if (discoveredStart !== void 0 || context.start !== void 0) throw new Error(`conversation Context ${key} received more than one start Match`);
2217
- discoveredStart = entry.match;
2218
- }
2219
2217
  const owners = this.contextsBySeq.get(entry.match.event.seq) ?? /* @__PURE__ */ new Set();
2220
2218
  owners.add(context);
2221
2219
  this.contextsBySeq.set(entry.match.event.seq, owners);
2222
2220
  return entry.match;
2223
2221
  }).sort((left, right) => left.event.seq - right.event.seq);
2224
2222
  context.matches = mergeMatches(context.key, additions, context.matches);
2225
- if (discoveredStart !== void 0) {
2226
- context.start = discoveredStart;
2227
- context.startSeq = discoveredStart.event.seq;
2228
- const starts = startsByKind.get(context.kind) ?? [];
2229
- starts.push(context);
2230
- startsByKind.set(context.kind, starts);
2231
- }
2232
- if (context.start !== void 0 && context.matches[0] !== context.start) throw new Error(`conversation Context ${context.key} received an update before its start Match`);
2233
2223
  affected.add(context);
2234
2224
  this.markDirty(context);
2235
2225
  }
2236
- for (const [kind, contexts] of startsByKind) this.indexStartedContexts(kind, contexts);
2237
2226
  }
2238
2227
  replayContexts(contexts) {
2228
+ this.refreshStarts(contexts);
2239
2229
  const ordered = [...contexts].sort((left, right) => (left.startSeq ?? Number.POSITIVE_INFINITY) - (right.startSeq ?? Number.POSITIVE_INFINITY));
2240
2230
  for (const context of ordered) {
2241
2231
  if (context.start === void 0) {
2242
2232
  context.state = void 0;
2233
+ this.replaceDependencies(context, /* @__PURE__ */ new Map());
2234
+ context.revision++;
2235
+ this.revised.add(context);
2243
2236
  this.markDirty(context);
2244
2237
  continue;
2245
2238
  }
2246
2239
  this.replayContext(context);
2247
2240
  }
2248
2241
  }
2242
+ refreshStarts(contexts) {
2243
+ const changed = /* @__PURE__ */ new Set();
2244
+ const startsByKind = /* @__PURE__ */ new Map();
2245
+ for (const context of contexts) {
2246
+ const start = context.matches.find((match) => match.role === "start");
2247
+ if (start === context.start) continue;
2248
+ context.start = start;
2249
+ context.startSeq = start?.event.seq;
2250
+ changed.add(context);
2251
+ const starts = startsByKind.get(context.kind) ?? [];
2252
+ if (start !== void 0) starts.push(context);
2253
+ startsByKind.set(context.kind, starts);
2254
+ }
2255
+ for (const [kind, starts] of startsByKind) {
2256
+ const existing = this.contextsByKind.get(kind) ?? [];
2257
+ this.contextsByKind.set(kind, existing.filter((context) => !changed.has(context)));
2258
+ this.indexStartedContexts(kind, starts);
2259
+ }
2260
+ }
2249
2261
  replayContext(context) {
2250
2262
  const start = context.start;
2251
2263
  if (start === void 0) {
@@ -2260,7 +2272,7 @@ window.__ModuleLoader__.load({
2260
2272
  this.replaceDependencies(context, dependencies);
2261
2273
  for (let index = 1; index < context.matches.length; index++) {
2262
2274
  const match = context.matches[index];
2263
- if (match === void 0 || match.role !== "update") continue;
2275
+ if (match === void 0) continue;
2264
2276
  const typed = contextSnapshot(context);
2265
2277
  context.state = requireState(context.definition, "update", context.definition.update(typed, match));
2266
2278
  }
@@ -2908,6 +2920,7 @@ window.__ModuleLoader__.load({
2908
2920
  var BoundConversation = class {
2909
2921
  assembler;
2910
2922
  snapshot;
2923
+ openTurn;
2911
2924
  viewStore;
2912
2925
  targetSources = /* @__PURE__ */ new Map();
2913
2926
  revision = -1;
@@ -2917,6 +2930,7 @@ window.__ModuleLoader__.load({
2917
2930
  this.assembler = assembler;
2918
2931
  this.viewStore = assembler;
2919
2932
  this.snapshot = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(this.currentSnapshot());
2933
+ this.openTurn = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(assembler.openTurn());
2920
2934
  this.replace(feed.getSnapshot());
2921
2935
  this.disposeFeed = feed.subscribe(() => {
2922
2936
  this.accept(feed.getSnapshot());
@@ -2940,6 +2954,7 @@ window.__ModuleLoader__.load({
2940
2954
  }
2941
2955
  activate(target) {
2942
2956
  if (this.assembler.activateTarget(target)) this.snapshot.set(this.currentSnapshot());
2957
+ this.openTurn.set(this.assembler.openTurn());
2943
2958
  }
2944
2959
  rebuild() {
2945
2960
  this.publish(this.assembler.rebuildRegistry());
@@ -3000,6 +3015,7 @@ window.__ModuleLoader__.load({
3000
3015
  }
3001
3016
  flush() {
3002
3017
  if (this.assembler.flush()) this.snapshot.set(this.currentSnapshot());
3018
+ this.openTurn.set(this.assembler.openTurn());
3003
3019
  }
3004
3020
  currentSnapshot() {
3005
3021
  return {
@@ -3058,6 +3074,7 @@ window.__ModuleLoader__.load({
3058
3074
  * Resolve the Conversation binding for one Controller binding or Session id.
3059
3075
  * @param source - Session binding or identity.
3060
3076
  * @returns stable Conversation binding.
3077
+ * @throws if the Session is unknown or its binding is no longer current.
3061
3078
  */
3062
3079
  binding(source) {
3063
3080
  const sessionId = typeof source === "string" ? source : source.sessionId;
@@ -6215,7 +6232,7 @@ window.__ModuleLoader__.load({
6215
6232
  function po(t) {
6216
6233
  return t instanceof _o;
6217
6234
  }
6218
- const mo = "history-push", xo = "history-merge", Co = "paste", ko = "skip-scroll-into-view", No = "skip-selection-focus", wo = "composition-end", Oo = "!important";
6235
+ const mo = "history-push", xo = "history-merge", Co = "paste", ko = "skip-scroll-into-view", bo = "skip-dom-selection", No = "skip-selection-focus", wo = "composition-end", Oo = "!important";
6219
6236
  function Mo(t) {
6220
6237
  const e = {};
6221
6238
  if (!t) return e;
@@ -12322,7 +12339,7 @@ window.__ModuleLoader__.load({
12322
12339
  };
12323
12340
  //#endregion
12324
12341
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/input/editor/composer-editor.module.css.mjs
12325
- const css$7 = ".q44v1G_reference{line-height:inherit;vertical-align:baseline;color:var(--dsw-alias-state-business-primary);-webkit-box-decoration-break:clone;box-decoration-break:clone;background:0 0;border-radius:6px;padding:0 4px}.q44v1G_reference:hover{background:var(--dsw-alias-state-business-tertiary)}.q44v1G_openable{cursor:pointer}.q44v1G_textRef{max-width:100%;display:inline-block}";
12342
+ const css$7 = ".q44v1G_reference{border-radius:var(--dsw-radius-sm);line-height:inherit;vertical-align:baseline;color:var(--dsw-alias-state-business-primary);-webkit-box-decoration-break:clone;box-decoration-break:clone;background:0 0;padding:0 4px}.q44v1G_reference:hover{background:var(--dsw-alias-state-business-tertiary)}.q44v1G_openable{cursor:pointer}.q44v1G_textRef{max-width:100%;display:inline-block}";
12326
12343
  const tagId$7 = "@deepseek-ai/dsh-client-ui-conversation/composer-editor.module.css";
12327
12344
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
12328
12345
  const tag = document.createElement("style");
@@ -13137,7 +13154,15 @@ window.__ModuleLoader__.load({
13137
13154
  * @returns unregister callback that also detaches the editor root.
13138
13155
  */
13139
13156
  register() {
13140
- const unregister = Eu(O$1(this.editor), registerReferenceActivation(this.editor, (source, reference) => this.deps.openReference(source, reference)), O(this.editor, z(), HISTORY_MERGE_DELAY_MS), this.editor.registerUpdateListener(() => {
13157
+ const preserveExternalSelection = () => {
13158
+ const root = this.editor.getRootElement();
13159
+ if (root !== null && !root.contains(root.ownerDocument.activeElement)) Al(bo);
13160
+ return false;
13161
+ };
13162
+ const unregister = Eu(O$1(this.editor), this.editor.registerCommand(Mn$1, () => {
13163
+ this.editor.update(preserveExternalSelection, { discrete: true });
13164
+ return false;
13165
+ }, 4), this.editor.registerCommand(Ie$2, preserveExternalSelection, 4), this.editor.registerNodeTransform(zi, preserveExternalSelection), registerReferenceActivation(this.editor, (source, reference) => this.deps.openReference(source, reference)), O(this.editor, z(), HISTORY_MERGE_DELAY_MS), this.editor.registerUpdateListener(() => {
13141
13166
  this.deps.onUpdate();
13142
13167
  }), registerClaimDecoration(this.editor, () => this.deps.activeClaimToken()), registerTextRefDecoration(this.editor, () => this.deps.lexicon(), () => this.deps.activeClaimToken()), () => {
13143
13168
  this.lexiconOff?.();
@@ -14379,6 +14404,10 @@ window.__ModuleLoader__.load({
14379
14404
  const PLAN_NEXT_ACTION_EN = "describe your task to generate plan";
14380
14405
  /** Simplified Chinese dictionary (the key-set source of truth). */
14381
14406
  const zh = {
14407
+ "shortcut.newline": "换行",
14408
+ "shortcut.complementary": "使用互补的 Queue/Steer 方式",
14409
+ "shortcut.slash": "打开命令菜单",
14410
+ "shortcut.mention": "打开引用菜单",
14382
14411
  "hint.plan": PLAN_NEXT_ACTION_ZH,
14383
14412
  "hint.goal": "输入目标,智能体将持续执行",
14384
14413
  "hint.goal.active": "当前目标进行中。可输入 edit 修改 / pause 暂停 / resume 继续 / clear 清除",
@@ -14455,9 +14484,11 @@ window.__ModuleLoader__.load({
14455
14484
  "tool.title.createGoal": "创建目标",
14456
14485
  "tool.title.getGoal": "查看目标",
14457
14486
  "tool.title.updateGoal": "更新目标",
14487
+ "tool.preparing.content": "正在准备内容 {kilobytes}KB",
14458
14488
  "tool.title.createSchedule": "创建定时任务",
14459
14489
  "tool.title.listSchedules": "查看定时任务",
14460
14490
  "tool.title.deleteSchedule": "删除定时任务",
14491
+ "tool.title.updateSchedule": "修改定时任务",
14461
14492
  "detail.state": "状态",
14462
14493
  "detail.todo.completed": "已完成",
14463
14494
  "detail.todo.in_progress": "进行中",
@@ -14496,18 +14527,29 @@ window.__ModuleLoader__.load({
14496
14527
  "detail.schedule.empty": "没有定时任务",
14497
14528
  "detail.schedule.deleted": "已删除",
14498
14529
  "detail.schedule.count": "{count} 个定时任务",
14530
+ "detail.schedule.daily": "每天 {time}({zone})",
14531
+ "detail.schedule.weekly": "每周 {days} {time}({zone})",
14532
+ "detail.schedule.cron": "Cron {expression}({zone})",
14533
+ "detail.weekday.1": "周一",
14534
+ "detail.weekday.2": "周二",
14535
+ "detail.weekday.3": "周三",
14536
+ "detail.weekday.4": "周四",
14537
+ "detail.weekday.5": "周五",
14538
+ "detail.weekday.6": "周六",
14539
+ "detail.weekday.7": "周日",
14540
+ "detail.weekday.join": "、",
14499
14541
  "tool.title.inspectProviders": "检查提供方",
14500
14542
  "tool.title.queryRuntime": "查询运行时",
14501
14543
  "tool.title.inspectPlugins": "检查动态插件",
14502
14544
  "tool.title.workflow": "运行工作流",
14503
- "tool.title.ralph": "运行 Ralph",
14545
+ "tool.title.ralph": "运行循环工作流",
14504
14546
  "tool.title.readEvent": "读取事件",
14505
14547
  "tool.title.searchEvents": "搜索事件",
14506
14548
  "tool.title.traceEvent": "追踪事件",
14507
14549
  "tool.title.searchSessions": "搜索会话",
14508
14550
  "tool.title.traceSession": "追踪会话",
14509
14551
  "tool.title.listModels": "查看可用模型",
14510
- "tool.title.subagent": "委派任务",
14552
+ "tool.title.subagent": "创建代理",
14511
14553
  "tool.title.listAgents": "查看代理",
14512
14554
  "tool.title.sendMessage": "发送消息",
14513
14555
  "tool.title.interruptAgent": "中断代理",
@@ -14529,7 +14571,7 @@ window.__ModuleLoader__.load({
14529
14571
  "tool.title.getTeamTask": "读取团队任务",
14530
14572
  "tool.title.updateTeamTask": "更新团队任务",
14531
14573
  "tool.title.listTeamTasks": "查看团队任务",
14532
- "tool.title.waitAgent": "等待队友",
14574
+ "tool.title.waitAgent": "等待子智能体",
14533
14575
  "detail.recordedResult": "调用结果",
14534
14576
  "detail.empty": "暂无结果",
14535
14577
  "detail.none": "无",
@@ -14613,8 +14655,8 @@ window.__ModuleLoader__.load({
14613
14655
  "detail.receipt.signal": "信号已发送",
14614
14656
  "detail.receipt.closed": "已关闭",
14615
14657
  "detail.receipt.closing": "关闭中",
14616
- "detail.wait.noProgress": "没有正在运行的队友",
14617
- "detail.wait.title": "队友状态",
14658
+ "detail.wait.noProgress": "没有正在运行的子智能体",
14659
+ "detail.wait.title": "子智能体状态",
14618
14660
  "detail.wait.timeout": "等待超时",
14619
14661
  "detail.wait.changed": "检测到变化",
14620
14662
  "detail.agent.reply": "代理回复",
@@ -14652,6 +14694,7 @@ window.__ModuleLoader__.load({
14652
14694
  "bash.failed": "失败",
14653
14695
  "bash.stopped": "已停止",
14654
14696
  "row.running": "运行中",
14697
+ "row.preparing": "正在准备调用",
14655
14698
  "row.failed": "失败",
14656
14699
  "row.stopped": "已停止",
14657
14700
  "row.input": "输入",
@@ -14664,7 +14707,7 @@ window.__ModuleLoader__.load({
14664
14707
  "tool.title.edit": "编辑",
14665
14708
  "tool.title.code": "代码",
14666
14709
  "tool.title.generic": "工具调用",
14667
- "tool.title.inspect": "查看",
14710
+ "tool.title.inspect": "查询 Cordis 环境",
14668
14711
  "tool.title.runCordis": "运行 Cordis 插件",
14669
14712
  "tool.title.stopCordis": "停止 Cordis 插件",
14670
14713
  "tool.title.removeCordis": "移除 Cordis 插件",
@@ -14727,6 +14770,10 @@ window.__ModuleLoader__.load({
14727
14770
  };
14728
14771
  /** English dictionary, checked complete against the zh key set. */
14729
14772
  const en = {
14773
+ "shortcut.newline": "New line",
14774
+ "shortcut.complementary": "Use the complementary Queue / Steer action",
14775
+ "shortcut.slash": "Open command menu",
14776
+ "shortcut.mention": "Open reference menu",
14730
14777
  "hint.plan": PLAN_NEXT_ACTION_EN,
14731
14778
  "hint.goal": "describe the objective for a long-running task",
14732
14779
  "hint.goal.active": "goal active — edit / pause / resume / clear",
@@ -14803,9 +14850,11 @@ window.__ModuleLoader__.load({
14803
14850
  "tool.title.createGoal": "Create goal",
14804
14851
  "tool.title.getGoal": "View goal",
14805
14852
  "tool.title.updateGoal": "Update goal",
14853
+ "tool.preparing.content": "Preparing content {kilobytes}KB",
14806
14854
  "tool.title.createSchedule": "Create reminder",
14807
14855
  "tool.title.listSchedules": "List reminders",
14808
14856
  "tool.title.deleteSchedule": "Delete reminder",
14857
+ "tool.title.updateSchedule": "Update reminder",
14809
14858
  "detail.state": "Status",
14810
14859
  "detail.todo.completed": "Completed",
14811
14860
  "detail.todo.in_progress": "In progress",
@@ -14844,19 +14893,30 @@ window.__ModuleLoader__.load({
14844
14893
  "detail.schedule.empty": "No reminders",
14845
14894
  "detail.schedule.deleted": "Deleted",
14846
14895
  "detail.schedule.count": "{count} reminders",
14896
+ "detail.schedule.daily": "Every day at {time} ({zone})",
14897
+ "detail.schedule.weekly": "Weekly on {days} at {time} ({zone})",
14898
+ "detail.schedule.cron": "Cron {expression} ({zone})",
14899
+ "detail.weekday.1": "Mon",
14900
+ "detail.weekday.2": "Tue",
14901
+ "detail.weekday.3": "Wed",
14902
+ "detail.weekday.4": "Thu",
14903
+ "detail.weekday.5": "Fri",
14904
+ "detail.weekday.6": "Sat",
14905
+ "detail.weekday.7": "Sun",
14906
+ "detail.weekday.join": ", ",
14847
14907
  "tool.title.inspectProviders": "Inspect providers",
14848
14908
  "tool.title.queryRuntime": "Query runtime",
14849
14909
  "tool.title.inspectPlugins": "Inspect plugins",
14850
14910
  "tool.title.workflow": "Run workflow",
14851
- "tool.title.ralph": "Run Ralph",
14911
+ "tool.title.ralph": "Run ralph loop",
14852
14912
  "tool.title.readEvent": "Read event",
14853
14913
  "tool.title.searchEvents": "Search events",
14854
14914
  "tool.title.traceEvent": "Trace event",
14855
14915
  "tool.title.searchSessions": "Search sessions",
14856
14916
  "tool.title.traceSession": "Trace session",
14857
14917
  "tool.title.listModels": "List models",
14858
- "tool.title.subagent": "Delegate task",
14859
- "tool.title.listAgents": "List agents",
14918
+ "tool.title.subagent": "Create subagent",
14919
+ "tool.title.listAgents": "List subagents",
14860
14920
  "tool.title.sendMessage": "Send message",
14861
14921
  "tool.title.interruptAgent": "Interrupt agent",
14862
14922
  "tool.title.listJobs": "List background jobs",
@@ -14877,7 +14937,7 @@ window.__ModuleLoader__.load({
14877
14937
  "tool.title.getTeamTask": "Read team task",
14878
14938
  "tool.title.updateTeamTask": "Update team task",
14879
14939
  "tool.title.listTeamTasks": "List team tasks",
14880
- "tool.title.waitAgent": "Wait for teammates",
14940
+ "tool.title.waitAgent": "Wait for subagent",
14881
14941
  "detail.recordedResult": "Recorded result",
14882
14942
  "detail.empty": "No results",
14883
14943
  "detail.none": "None",
@@ -14961,8 +15021,8 @@ window.__ModuleLoader__.load({
14961
15021
  "detail.receipt.signal": "Signal delivered",
14962
15022
  "detail.receipt.closed": "Closed",
14963
15023
  "detail.receipt.closing": "Closing",
14964
- "detail.wait.noProgress": "No active teammates",
14965
- "detail.wait.title": "Teammate activity",
15024
+ "detail.wait.noProgress": "No active subagents",
15025
+ "detail.wait.title": "Subagent activity",
14966
15026
  "detail.wait.timeout": "Wait timed out",
14967
15027
  "detail.wait.changed": "Change detected",
14968
15028
  "detail.agent.reply": "Agent response",
@@ -15000,6 +15060,7 @@ window.__ModuleLoader__.load({
15000
15060
  "bash.failed": "Failed",
15001
15061
  "bash.stopped": "Stopped",
15002
15062
  "row.running": "Running",
15063
+ "row.preparing": "Preparing tool call",
15003
15064
  "row.failed": "Failed",
15004
15065
  "row.stopped": "Stopped",
15005
15066
  "row.input": "IN",
@@ -15012,7 +15073,7 @@ window.__ModuleLoader__.load({
15012
15073
  "tool.title.edit": "Edit",
15013
15074
  "tool.title.code": "Code",
15014
15075
  "tool.title.generic": "Tool call",
15015
- "tool.title.inspect": "Inspect",
15076
+ "tool.title.inspect": "Query Cordis environment",
15016
15077
  "tool.title.runCordis": "Run Cordis Plugin",
15017
15078
  "tool.title.stopCordis": "Stop Cordis Plugin",
15018
15079
  "tool.title.removeCordis": "Remove Cordis Plugin",
@@ -15075,7 +15136,7 @@ window.__ModuleLoader__.load({
15075
15136
  };
15076
15137
  //#endregion
15077
15138
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/queue/QueueDock.module.css.mjs
15078
- const css$6 = "._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{isolation:isolate;--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:before{z-index:-1;border-radius:inherit;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);content:\"\";pointer-events:none;position:absolute;inset:0}._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%;min-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_attachments{flex:none;gap:4px;min-width:0;max-width:55%;display:flex;overflow:hidden}._7yHdaG_pendingRow ._7yHdaG_attachments{flex-shrink:1}._7yHdaG_file{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-sizing:border-box;border-radius:6px;flex:0 180px;align-items:center;gap:4px;min-width:74px;height:24px;padding:0 6px;display:inline-flex;overflow:hidden}._7yHdaG_fileIcon{flex:none;width:16px;height:16px;display:inline-flex}._7yHdaG_fileName{min-width:0;color:var(--dsw-alias-label-primary-dimmed);font:var(--dsw-font-xs-13);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._7yHdaG_fileSize{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10px}._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);min-height:28px;max-height:127px;color:var(--dsw-alias-label-primary);resize:none;border-radius:6px;outline:none;padding:3px 8px;overflow-y:auto}._7yHdaG_editor:focus{border-color:var(--dsw-alias-state-business-primary)}._7yHdaG_actions{flex:none;align-items:center;gap:10px;display:flex}._7yHdaG_status{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xs-13);white-space:nowrap;flex:none}._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}";
15139
+ const css$6 = "._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{isolation:isolate;border-radius:var(--dsw-radius-lg) var(--dsw-radius-lg) 0 0;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);width:100%;padding:2px 0;position:relative;overflow:hidden}._7yHdaG_panel:before{z-index:-1;border-radius:inherit;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);content:\"\";pointer-events:none;position:absolute;inset:0}._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;border-radius:var(--dsw-radius-md);width:100%;height:36px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;padding:4px 12px;display:flex}._7yHdaG_header:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));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:var(--dsw-radius-md);align-items:center;gap:10px;width:100%;min-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_attachments{flex:none;gap:4px;min-width:0;max-width:55%;display:flex;overflow:hidden}._7yHdaG_pendingRow ._7yHdaG_attachments{flex-shrink:1}._7yHdaG_file{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-base);box-sizing:border-box;flex:0 180px;align-items:center;gap:4px;min-width:74px;height:24px;padding:0 6px;display:inline-flex;overflow:hidden}._7yHdaG_fileIcon{flex:none;width:16px;height:16px;display:inline-flex}._7yHdaG_fileName{min-width:0;color:var(--dsw-alias-label-primary-dimmed);font:var(--dsw-font-xs-13);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._7yHdaG_fileSize{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10px}._7yHdaG_thumb{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-xs);background:var(--dsw-alias-bg-base);object-fit:cover;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);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-base);min-height:28px;max-height:127px;color:var(--dsw-alias-label-primary);resize:none;outline:none;padding:3px 8px;overflow-y:auto}._7yHdaG_editor:focus{border-color:var(--dsw-alias-state-business-primary)}._7yHdaG_actions{flex:none;align-items:center;gap:10px;display:flex}._7yHdaG_status{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xs-13);white-space:nowrap;flex:none}._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:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}._7yHdaG_action:disabled{cursor:default;opacity:.45}";
15079
15140
  const tagId$6 = "@deepseek-ai/dsh-client-ui-conversation/QueueDock.module.css";
15080
15141
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
15081
15142
  const tag = document.createElement("style");
@@ -15372,6 +15433,7 @@ window.__ModuleLoader__.load({
15372
15433
  queueMutable && (0, react_jsx_runtime.jsx)("div", {
15373
15434
  className: QueueDock_module_css_default.actions,
15374
15435
  children: editing?.id === row.id ? (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
15436
+ portal: true,
15375
15437
  label: t("queue.save"),
15376
15438
  side: "bottom",
15377
15439
  delayMs: 500,
@@ -15386,6 +15448,7 @@ window.__ModuleLoader__.load({
15386
15448
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 14 })
15387
15449
  })
15388
15450
  }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
15451
+ portal: true,
15389
15452
  label: t("queue.cancelEdit"),
15390
15453
  side: "bottom",
15391
15454
  delayMs: 500,
@@ -15401,6 +15464,7 @@ window.__ModuleLoader__.load({
15401
15464
  })
15402
15465
  })] }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
15403
15466
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
15467
+ portal: true,
15404
15468
  label: t("queue.edit"),
15405
15469
  side: "bottom",
15406
15470
  delayMs: 500,
@@ -15421,6 +15485,7 @@ window.__ModuleLoader__.load({
15421
15485
  })
15422
15486
  }),
15423
15487
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
15488
+ portal: true,
15424
15489
  label: t("queue.remove"),
15425
15490
  side: "bottom",
15426
15491
  delayMs: 500,
@@ -15436,6 +15501,7 @@ window.__ModuleLoader__.load({
15436
15501
  })
15437
15502
  }),
15438
15503
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
15504
+ portal: true,
15439
15505
  label: t("queue.steer"),
15440
15506
  side: "bottom",
15441
15507
  delayMs: 500,
@@ -15555,7 +15621,7 @@ window.__ModuleLoader__.load({
15555
15621
  };
15556
15622
  //#endregion
15557
15623
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/settings/EnterBehaviorRow.module.css.mjs
15558
- const css$5 = ".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}";
15624
+ const css$5 = ".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{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;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}";
15559
15625
  const tagId$5 = "@deepseek-ai/dsh-client-ui-conversation/EnterBehaviorRow.module.css";
15560
15626
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
15561
15627
  const tag = document.createElement("style");
@@ -15652,7 +15718,7 @@ window.__ModuleLoader__.load({
15652
15718
  }
15653
15719
  //#endregion
15654
15720
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css.mjs
15655
- const css$4 = ".wSkVaW_root{background:var(--dsw-alias-bg-base);flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.wSkVaW_header{box-sizing:border-box;border-bottom:.5px solid var(--dsw-alias-border-l3);flex:none;grid-template-columns:auto minmax(0,1fr);min-height:76px;padding:10px 28px 0 20px;display:grid}.wSkVaW_header:where(:not(:has(.wSkVaW_tabs))){min-height:0;padding-bottom:10px}.wSkVaW_headerBlank{border-bottom:none;min-height:0;padding-bottom:0}.wSkVaW_headerBlank .wSkVaW_headerCorner{margin-left:auto}html:not([data-platform=darwin]) .wSkVaW_headerSessionless{padding-top:0}html:not([data-platform=darwin]) .wSkVaW_headerSessionless .wSkVaW_titleRow{min-height:0}[data-platform=darwin] .wSkVaW_headerLeading,[data-platform=darwin] .wSkVaW_headerActions,[data-platform=darwin] .wSkVaW_headerUtilities,[data-platform=darwin] .wSkVaW_headerCorner{-webkit-app-region:no-drag}.wSkVaW_titleRow{min-height:30px;grid-column:2;align-items:center;gap:0;padding-inline-start:max(0px, calc(var(--dsh-frame-leading-clearance,0px) - 20px));display:flex}.wSkVaW_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.wSkVaW_headerLeading{flex:none;grid-area:1/1;align-items:center;gap:8px;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;display:inline-block;overflow:hidden}.wSkVaW_crumbSubagent{font-size:12px;line-height:18px}button.wSkVaW_crumb:hover{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_headerCorner{flex:none;align-items:center;margin-left:8px;margin-right:-16px;display:flex}.wSkVaW_headerCorner:empty{display:none}.wSkVaW_tabs{z-index:1;grid-column:1/-1;gap:36px;margin-top:10px;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 9px;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:0;width:min(10px, 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%) - 36px), var(--dsw-alias-scrollbar-bg-l1) calc(var(--dsh-width-handle-pointer-y,50%) - 8px), var(--dsw-alias-scrollbar-bg-l1) calc(var(--dsh-width-handle-pointer-y,50%) + 8px), transparent calc(var(--dsh-width-handle-pointer-y,50%) + 36px));opacity:0;pointer-events:none;border-radius:2px;width:2px;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]:after{right:4px}.wSkVaW_widthHandle[data-side=right]:after{left:4px}.wSkVaW_widthHandle:hover:after,.wSkVaW_widthHandle[data-dragging]:after{opacity:1}.wSkVaW_widthHandle[data-dragging]{z-index:8}.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{--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;flex:1;min-height:0;display:flex;position:relative}.wSkVaW_embeddedBody{--dsh-chat-content-width:min(calc(100% - 32px), 920px);--dsh-composer-card-max-width:min(calc(100% - 16px), 952px);--dsh-composer-side-clearance:8px;--dsh-composer-dock-inset:8px;overflow:hidden}.wSkVaW_scrollBody{scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;margin-right:2px;display:flex;overflow-y:auto}.wSkVaW_scrollBody::-webkit-scrollbar-track{margin:2px}.wSkVaW_root[data-phase=active] .wSkVaW_viewArea,.wSkVaW_embeddedBody[data-content-phase=active] .wSkVaW_viewArea{flex:1 0 auto;min-height:auto}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat,.wSkVaW_embeddedBody[data-content-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:0 16px 0 20px;display:flex}.wSkVaW_root[data-phase=hero] .wSkVaW_scrollBody,.wSkVaW_embeddedBody[data-content-phase=hero] .wSkVaW_scrollBody{justify-content:center;overflow-y:auto}.wSkVaW_root[data-phase=settling] .wSkVaW_composerSeat,.wSkVaW_embeddedBody[data-content-phase=settling] .wSkVaW_composerSeat{visibility:hidden}";
15721
+ const css$4 = ".wSkVaW_root{background:var(--dsw-alias-bg-base);flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.wSkVaW_header{box-sizing:border-box;border-bottom:.5px solid var(--dsw-alias-border-l3);flex:none;grid-template-columns:auto minmax(0,1fr);min-height:76px;padding:10px 28px 0 20px;display:grid}.wSkVaW_header:where(:not(:has(.wSkVaW_tabs))){min-height:0;padding-bottom:10px}.wSkVaW_headerBlank{border-bottom:none;min-height:0;padding-bottom:0}.wSkVaW_headerBlank .wSkVaW_headerCorner{margin-left:auto}html:not([data-platform=darwin]) .wSkVaW_headerSessionless{padding-top:0}html:not([data-platform=darwin]) .wSkVaW_headerSessionless .wSkVaW_titleRow{min-height:0}[data-platform=darwin] .wSkVaW_headerLeading,[data-platform=darwin] .wSkVaW_headerActions,[data-platform=darwin] .wSkVaW_headerUtilities,[data-platform=darwin] .wSkVaW_headerCorner{-webkit-app-region:no-drag}.wSkVaW_titleRow{min-height:30px;grid-column:2;align-items:center;gap:0;padding-inline-start:max(0px, calc(var(--dsh-frame-leading-clearance,0px) - 20px));display:flex;container-type:inline-size}.wSkVaW_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.wSkVaW_headerLeading{flex:none;grid-area:1/1;align-items:center;gap:8px;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{border-radius:var(--dsw-radius-md);max-width:220px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:none;padding:4px 8px;font-size:14px;line-height:20px;display:inline-block;overflow:hidden}.wSkVaW_crumbSubagent{font-size:12px;line-height:18px}button.wSkVaW_crumb:hover{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_headerCorner{flex:none;align-items:center;margin-left:8px;margin-right:-16px;display:flex}.wSkVaW_headerCorner:empty{display:none}.wSkVaW_tabs{z-index:1;grid-column:1/-1;gap:36px;margin-top:10px;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 9px;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:0;width:min(10px, 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%) - 36px), var(--dsw-alias-scrollbar-bg-l1) calc(var(--dsh-width-handle-pointer-y,50%) - 8px), var(--dsw-alias-scrollbar-bg-l1) calc(var(--dsh-width-handle-pointer-y,50%) + 8px), transparent calc(var(--dsh-width-handle-pointer-y,50%) + 36px));opacity:0;pointer-events:none;border-radius:2px;width:2px;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]:after{right:4px}.wSkVaW_widthHandle[data-side=right]:after{left:4px}.wSkVaW_widthHandle:hover:after,.wSkVaW_widthHandle[data-dragging]:after{opacity:1}.wSkVaW_widthHandle[data-dragging]{z-index:8}.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{--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;flex:1;min-height:0;display:flex;position:relative}.wSkVaW_embeddedBody{--dsh-chat-content-width:min(calc(100% - 32px), 920px);--dsh-composer-card-max-width:min(calc(100% - 16px), 952px);--dsh-composer-side-clearance:8px;--dsh-composer-dock-inset:8px;overflow:hidden}.wSkVaW_scrollBody{scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;margin-right:2px;display:flex;overflow-y:auto}.wSkVaW_scrollBody::-webkit-scrollbar-track{margin:2px}.wSkVaW_root[data-phase=active] .wSkVaW_viewArea,.wSkVaW_embeddedBody[data-content-phase=active] .wSkVaW_viewArea{flex:1 0 auto;min-height:auto}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat,.wSkVaW_embeddedBody[data-content-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:0 16px 0 20px;display:flex}.wSkVaW_root[data-phase=hero] .wSkVaW_scrollBody,.wSkVaW_embeddedBody[data-content-phase=hero] .wSkVaW_scrollBody{justify-content:center;overflow-y:auto}.wSkVaW_root[data-phase=settling] .wSkVaW_composerSeat,.wSkVaW_embeddedBody[data-content-phase=settling] .wSkVaW_composerSeat{visibility:hidden}";
15656
15722
  const tagId$4 = "@deepseek-ai/dsh-client-ui-conversation/ConversationRoot.module.css";
15657
15723
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
15658
15724
  const tag = document.createElement("style");
@@ -15887,9 +15953,22 @@ window.__ModuleLoader__.load({
15887
15953
  function ConversationRoot(props) {
15888
15954
  return (0, react_jsx_runtime.jsx)(ConversationMainPanel, { ...props });
15889
15955
  }
15956
+ /**
15957
+ * The text one Workspace is labeled with. A Workspace still carrying the
15958
+ * automatic first-use title reads as the caller's localized default name; every
15959
+ * other title reads verbatim in every language. A title the user typed as
15960
+ * exactly {@link DEFAULT_WORKSPACE_DIRECTORY} is labeled as the default too;
15961
+ * nothing else depends on the distinction.
15962
+ * @param title - stored Workspace title.
15963
+ * @param localizedDefault - the default Workspace name in the active language.
15964
+ * @returns the title to display.
15965
+ */
15966
+ function workspaceDisplayTitle(title, localizedDefault) {
15967
+ return title === "default-workspace" ? localizedDefault : title;
15968
+ }
15890
15969
  //#endregion
15891
15970
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css.mjs
15892
- const css$3 = ".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);flex-wrap:wrap;justify-content:center;align-items:center;gap:12px 10px;font-size:26px;font-weight:500;line-height:32px;display:flex}.pXSMma_titleGroup{flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 7px;min-width:0;display:flex}.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;align-self:flex-start;margin-top:2px;padding:1px 7px 0;font-size:12px;font-weight:500;line-height:18px}.pXSMma_fishHitbox{flex:none;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;min-width:0;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}";
15971
+ const css$3 = ".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);flex-wrap:wrap;justify-content:center;align-items:center;gap:12px 10px;font-size:26px;font-weight:500;line-height:32px;display:flex}.pXSMma_titleGroup{flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 7px;min-width:0;display:flex}.pXSMma_previewBadge{border:.5px solid var(--dsw-alias-interactive-bg-hover);corner-shape:round;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:999px;align-self:flex-start;margin-top:2px;padding:1px 7px 0;font-size:12px;font-weight:500;line-height:18px}.pXSMma_fishHitbox{flex:none;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{border-radius:var(--dsw-radius-sm);max-width:min(100%,360px);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;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;min-width:0;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);border-radius:var(--dsw-radius-lg);width:100%;height:44px;color:var(--dsw-alias-label-primary);background:0 0;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}";
15893
15972
  const tagId$3 = "@deepseek-ai/dsh-client-ui-conversation/HeroShell.module.css";
15894
15973
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
15895
15974
  const tag = document.createElement("style");
@@ -16095,7 +16174,8 @@ window.__ModuleLoader__.load({
16095
16174
  session,
16096
16175
  input: inputState
16097
16176
  };
16098
- const chipTitle = pendingWorkspace?.title ?? (sessionId === void 0 ? void 0 : sessionWorkspace?.title ?? (workspaces.phase === "ready" || cwd === void 0 || cwd === "" ? void 0 : workspaceLabel(cwd)));
16177
+ const storedChipTitle = pendingWorkspace?.title ?? (sessionId === void 0 ? void 0 : sessionWorkspace?.title ?? (workspaces.phase === "ready" || cwd === void 0 || cwd === "" ? void 0 : workspaceLabel(cwd)));
16178
+ const chipTitle = storedChipTitle === void 0 ? void 0 : workspaceDisplayTitle(storedChipTitle, t("workspace.defaultName"));
16099
16179
  const heroWorkspaceRow = (0, react_jsx_runtime.jsxs)("div", {
16100
16180
  className: ConversationRoot_module_css_default.heroWorkspaceRow,
16101
16181
  children: [
@@ -16166,12 +16246,15 @@ window.__ModuleLoader__.load({
16166
16246
  ref: seatResizeRef,
16167
16247
  className: ConversationRoot_module_css_default.composerSeat,
16168
16248
  "data-composer-seat": "",
16249
+ "data-conversation-region": "composer",
16169
16250
  children: composer
16170
16251
  });
16171
16252
  return (0, react_jsx_runtime.jsxs)("div", {
16172
16253
  ref: setBody,
16173
16254
  className: clsx(ConversationRoot_module_css_default.body, props.variant === "embedded" && ConversationRoot_module_css_default.embeddedBody),
16174
16255
  "data-conversation-content": "",
16256
+ "data-conversation-session": sessionId,
16257
+ "data-conversation-region": "chat",
16175
16258
  "data-content-phase": phase,
16176
16259
  children: [(0, react_jsx_runtime.jsxs)("div", {
16177
16260
  className: ConversationRoot_module_css_default.scrollBody,
@@ -16207,6 +16290,7 @@ window.__ModuleLoader__.load({
16207
16290
  const blank = session === void 0 || conversation === void 0 || session.blank && conversationPhase(session, conversation) === "blank";
16208
16291
  return (0, react_jsx_runtime.jsxs)("header", {
16209
16292
  className: clsx(ConversationRoot_module_css_default.header, blank && ConversationRoot_module_css_default.headerBlank, sessionId === void 0 && ConversationRoot_module_css_default.headerSessionless),
16293
+ "data-window-drag": true,
16210
16294
  children: [(0, react_jsx_runtime.jsx)("div", {
16211
16295
  className: ConversationRoot_module_css_default.headerLeading,
16212
16296
  "data-conversation-header-leading": "",
@@ -16541,6 +16625,7 @@ window.__ModuleLoader__.load({
16541
16625
  }
16542
16626
  return false;
16543
16627
  }, 4), editor.registerCommand(cn$1, (event) => {
16628
+ if (event !== null && (event.altKey || event.getModifierState("AltGraph") || event.ctrlKey && event.metaKey || event.shiftKey && (event.ctrlKey || event.metaKey))) return true;
16544
16629
  if (event?.shiftKey === true) return false;
16545
16630
  if (event !== null && isComposingEvent(event, recentlyComposing)) return true;
16546
16631
  if (handlers.arbitrate("enter", false) !== "pass") {
@@ -16758,7 +16843,7 @@ window.__ModuleLoader__.load({
16758
16843
  }
16759
16844
  //#endregion
16760
16845
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/ContextMeter.module.css.mjs
16761
- const css$2 = ".JObwrW_root{flex:none;display:inline-flex}.JObwrW_trigger{color:var(--dsw-alias-label-tertiary);font-family:inherit;font-size:var(--dsh-content-font-size-secondary,13px);font-variant-numeric:tabular-nums;line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:24px;flex:none;align-items:center;gap:6px;padding:1px 8px;display:inline-flex}.JObwrW_trigger:hover,.JObwrW_trigger[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.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:1100;box-sizing:border-box;background:var(--dsw-specific-menu);width:min(264px,100vw - 24px);backdrop-filter:var(--dsw-menu-backdrop-filter);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);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:fixed}.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}";
16846
+ const css$2 = ".JObwrW_root{flex:none;display:inline-flex}.JObwrW_trigger{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-tertiary);font-family:inherit;font-size:var(--dsh-content-font-size-secondary,13px);font-variant-numeric:tabular-nums;line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));white-space:nowrap;cursor:pointer;background:0 0;border:none;flex:none;align-items:center;gap:6px;padding:1px 8px;display:inline-flex}.JObwrW_trigger:hover,.JObwrW_trigger[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.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:1100;box-sizing:border-box;border-radius:var(--dsw-radius-lg);background:var(--dsw-specific-menu);width:min(264px,100vw - 24px);backdrop-filter:var(--dsw-menu-backdrop-filter);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-prominent);color:var(--dsw-alias-label-secondary);cursor:default;border:0;padding:12px;font-size:12px;line-height:20px;position:fixed}.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}";
16762
16847
  const tagId$2 = "@deepseek-ai/dsh-client-ui-conversation/ContextMeter.module.css";
16763
16848
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
16764
16849
  const tag = document.createElement("style");
@@ -17007,7 +17092,7 @@ window.__ModuleLoader__.load({
17007
17092
  }
17008
17093
  //#endregion
17009
17094
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css.mjs
17010
- const css$1 = ".uV2eYG_root{padding:0 var(--dsh-composer-side-clearance) 4px;flex-direction:column;align-items:center;display:flex}.uV2eYG_dock{justify-content:center;align-items:center;gap:12px;max-width:100%;padding-top:4px;display:flex}.uV2eYG_hero .uV2eYG_dock:empty{display:none}.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:8px;display:flex;position:relative}.uV2eYG_cardWorkspaceTrigger{--dsw-elevation-stroke-color:transparent;cursor:pointer}.uV2eYG_cardWorkspaceTrigger:after{content:\"\";box-sizing:border-box;color:var(--dsw-alias-border-l4);pointer-events:none;border:1px dashed;border-radius:22px;transition:color .1s;position:absolute;inset:0}.uV2eYG_cardWorkspaceTrigger :disabled{pointer-events:none}.uV2eYG_cardWorkspaceTrigger:hover:after{color: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;min-height:36px;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 14px}.uV2eYG_input p{margin:0}.uV2eYG_input p:last-child:after{content:var(--dsh-composer-hint);color:var(--dsw-alias-label-caption)}.uV2eYG_input[data-composer-composing] p:last-child:after{content:none}.uV2eYG_input[data-composer-composing]+.uV2eYG_placeholder{visibility:hidden}.uV2eYG_placeholder{color:var(--dsw-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 14px;overflow:hidden}.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_hero .uV2eYG_placeholder{white-space:normal;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.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_row[data-model-compact]{--dsh-composer-model-text-display:none;--dsh-composer-model-icon-display:block}.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{align-items:center;min-width:0;display:flex}.uV2eYG_tools,.uV2eYG_modes{gap:12px}.uV2eYG_trailing{flex:none;gap:12px;margin-left:auto}@container (width<=560px){.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{gap:8px}}.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}.uV2eYG_standardControls{align-items:center;gap:12px;min-width:0;display:flex}.uV2eYG_tools[hidden],.uV2eYG_standardControls[hidden]{display:none}.uV2eYG_trailingActive{flex:1;margin-left:0}.uV2eYG_activity{flex:none;align-items:center;display:flex}.uV2eYG_activity:empty{display:none}.uV2eYG_activityExpanded{flex:1;min-width:0}";
17095
+ const css$1 = ".uV2eYG_root{padding:0 var(--dsh-composer-side-clearance) 4px;flex-direction:column;align-items:center;display:flex}.uV2eYG_dock{justify-content:center;align-items:center;gap:12px;max-width:100%;padding-top:4px;display:flex}.uV2eYG_hero .uV2eYG_dock:empty{display:none}.uV2eYG_hero{padding:0 var(--dsh-composer-side-clearance)}.uV2eYG_notice{width:100%;max-width:var(--dsh-composer-card-max-width);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);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);border-radius:var(--dsw-radius-panel);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;flex-direction:column;gap:12px;padding-top:8px;display:flex;position:relative}.uV2eYG_cardWorkspaceTrigger{--dsw-elevation-stroke-color:transparent;cursor:pointer}.uV2eYG_cardWorkspaceTrigger:after{content:\"\";box-sizing:border-box;border-radius:var(--dsw-radius-panel);color:var(--dsw-alias-border-l4);pointer-events:none;border:1px dashed;transition:color .1s;position:absolute;inset:0}.uV2eYG_cardWorkspaceTrigger :disabled{pointer-events:none}.uV2eYG_cardWorkspaceTrigger:hover:after{color: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;min-height:36px;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 14px}.uV2eYG_input p{margin:0}.uV2eYG_input p:last-child:after{content:var(--dsh-composer-hint);color:var(--dsw-alias-label-caption)}.uV2eYG_input[data-composer-composing] p:last-child:after{content:none}.uV2eYG_input[data-composer-composing]+.uV2eYG_placeholder{visibility:hidden}.uV2eYG_placeholder{color:var(--dsw-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 14px;overflow:hidden}.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_hero .uV2eYG_placeholder{white-space:normal;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.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_row[data-model-compact]{--dsh-composer-model-text-display:none;--dsh-composer-model-icon-display:block}.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{align-items:center;min-width:0;display:flex}.uV2eYG_tools,.uV2eYG_modes{gap:12px}.uV2eYG_trailing{flex:none;gap:12px;margin-left:auto}@container (width<=560px){.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{gap:8px}}.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{border-radius:var(--dsw-radius-sm);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;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{border-radius:var(--dsw-radius-sm);color:inherit;cursor:pointer;background:0 0;border:1px solid;margin-left:8px;padding:1px 8px;font-size:12px}.uV2eYG_standardControls{align-items:center;gap:12px;min-width:0;display:flex}.uV2eYG_tools[hidden],.uV2eYG_standardControls[hidden]{display:none}.uV2eYG_trailingActive{flex:1;margin-left:0}.uV2eYG_activity{flex:none;align-items:center;display:flex}.uV2eYG_activity:empty{display:none}.uV2eYG_activityExpanded{flex:1;min-width:0}";
17011
17096
  const tagId$1 = "@deepseek-ai/dsh-client-ui-conversation/InputBar.module.css";
17012
17097
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
17013
17098
  const tag = document.createElement("style");
@@ -17061,10 +17146,11 @@ window.__ModuleLoader__.load({
17061
17146
  * The no-session state renders the SAME div inert as the Workspace-picker
17062
17147
  * trigger instead of a parallel tree.
17063
17148
  */
17064
- const InputBar = (0, react.memo)(function InputBar({ useSession, useInput, inputActions, keyboard, addFiles, removeAttachment, resolveDraftAttachments, retryFileUpload, toggleCommandMenu, stop, t, renderSlot, useBusyEnter, useFileUploads, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory }) {
17149
+ const InputBar = (0, react.memo)(function InputBar({ useSession, useInput, inputActions, keyboard, addFiles, removeAttachment, resolveDraftAttachments, retryFileUpload, toggleCommandMenu, stop, t, renderSlot, useBusyEnter, useFileUploads, useNotices, useLexicon, useMenuLauncher, useStopShortcut, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory }) {
17065
17150
  const input = useInput((s) => s);
17066
17151
  const notice = useNotices((s) => s);
17067
17152
  const busyEnter = useBusyEnter((s) => s);
17153
+ const stopKeys = useStopShortcut((keys) => keys);
17068
17154
  const commandMenuOpen = useMenuLauncher((source) => source === "command");
17069
17155
  const [activity, setActivity] = (0, react.useState)(false);
17070
17156
  (0, react.useEffect)(() => {
@@ -17377,6 +17463,7 @@ window.__ModuleLoader__.load({
17377
17463
  }),
17378
17464
  interruptible && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
17379
17465
  label: t("input.stop"),
17466
+ shortcutKeys: stopKeys,
17380
17467
  side: "top",
17381
17468
  delayMs: 500,
17382
17469
  disabled: stop === void 0,
@@ -17404,7 +17491,8 @@ window.__ModuleLoader__.load({
17404
17491
  })
17405
17492
  }),
17406
17493
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
17407
- label: primaryLabel,
17494
+ label: primaryStops ? t("input.stop") : primaryLabel,
17495
+ shortcutKeys: primaryStops ? stopKeys : void 0,
17408
17496
  side: "top",
17409
17497
  delayMs: 500,
17410
17498
  disabled: primaryDisabled,
@@ -17457,7 +17545,7 @@ window.__ModuleLoader__.load({
17457
17545
  });
17458
17546
  //#endregion
17459
17547
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css.mjs
17460
- 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));--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);box-shadow:var(--dsw-elevation-panel);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;border-radius:12px;flex: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_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";
17548
+ 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));--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-lg);background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);box-shadow:var(--dsw-elevation-panel);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;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_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";
17461
17549
  const tagId = "@deepseek-ai/dsh-client-ui-conversation/TodoPanel.module.css";
17462
17550
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
17463
17551
  const tag = document.createElement("style");
@@ -17593,6 +17681,132 @@ window.__ModuleLoader__.load({
17593
17681
  }
17594
17682
  };
17595
17683
  //#endregion
17684
+ //#region lib/types/client/stop-sequence.js
17685
+ /** One short-lived first press, cleared before an accepted cancellation runs. */
17686
+ var StopSequence = class {
17687
+ intervalMs;
17688
+ release;
17689
+ first;
17690
+ timer;
17691
+ /**
17692
+ * @param intervalMs - validated maximum time between independent presses.
17693
+ * @param release - releases observations retained by the pending first press.
17694
+ */
17695
+ constructor(intervalMs, release) {
17696
+ this.intervalMs = intervalMs;
17697
+ this.release = release;
17698
+ }
17699
+ /** Clear the first press and its expiry timer. */
17700
+ reset() {
17701
+ this.first = void 0;
17702
+ clearTimeout(this.timer);
17703
+ this.timer = void 0;
17704
+ this.release();
17705
+ }
17706
+ /**
17707
+ * Accept one eligible, non-repeated Escape against freshly resolved current state.
17708
+ * @param target - live turn and actual focused input region.
17709
+ * @returns whether this press requested cancellation.
17710
+ */
17711
+ press(target) {
17712
+ const first = this.first;
17713
+ this.reset();
17714
+ if (first !== void 0 && performance.now() <= first.deadline && first.target.sessionId === target.sessionId && first.target.turn === target.turn && first.target.generation === target.generation && first.target.region === target.region) {
17715
+ target.cancel();
17716
+ return true;
17717
+ }
17718
+ this.first = {
17719
+ target,
17720
+ deadline: performance.now() + this.intervalMs
17721
+ };
17722
+ this.timer = setTimeout(() => {
17723
+ this.reset();
17724
+ }, this.intervalMs + 1);
17725
+ return false;
17726
+ }
17727
+ };
17728
+ //#endregion
17729
+ //#region lib/types/client/stop-shortcut.js
17730
+ /**
17731
+ * Subscribe fixed input to the same Session cancellation used by the stop button.
17732
+ * @param shortcuts - window keyboard arbitration and validated sequence interval.
17733
+ * @param sessions - live Session identities and lifecycle sources.
17734
+ * @param openTurn - stable current-turn source for a live Session binding.
17735
+ * @param uiSession - current pending-interaction status.
17736
+ * @param cancel - scoped stop operation that preserves Queue and reports failures.
17737
+ * @returns disposer releasing the input subscription, pending watches and expiry timer.
17738
+ */
17739
+ function installStopShortcut(shortcuts, sessions, openTurn, uiSession, cancel) {
17740
+ let unwatch = () => {};
17741
+ const sequence = new StopSequence(shortcuts.stopSequenceMs, () => {
17742
+ unwatch();
17743
+ unwatch = () => {};
17744
+ });
17745
+ const reset = () => {
17746
+ sequence.reset();
17747
+ };
17748
+ const off = shortcuts.observeFixedInput((input) => {
17749
+ if (input.type === "reset") {
17750
+ reset();
17751
+ return;
17752
+ }
17753
+ const { gesture, context } = input;
17754
+ if (gesture.code !== "Escape" || gesture.repeat || gesture.composing || gesture.defaultPrevented || gesture.control || gesture.alt || gesture.shift || gesture.meta || context.modal !== null || context.region === "terminal" || context.target === null) {
17755
+ reset();
17756
+ return;
17757
+ }
17758
+ const target = context.target;
17759
+ const occurrence = target.closest("[data-conversation-session]");
17760
+ const region = target.closest("[data-conversation-region]");
17761
+ if (occurrence === null || region === null || !occurrence.contains(region) || target.closest("[data-approval-key], iframe, .xterm, [inert]") !== null) {
17762
+ reset();
17763
+ return;
17764
+ }
17765
+ const sessionId = occurrence.dataset.conversationSession;
17766
+ const binding = sessions.binding(sessionId);
17767
+ if (binding === void 0) {
17768
+ reset();
17769
+ return;
17770
+ }
17771
+ const turnSource = openTurn(binding);
17772
+ const currentTurn = () => {
17773
+ const session = binding.session.getSnapshot();
17774
+ if (!session.running || session.removed || session.subagent !== null && session.subagent.address.mode !== "continuable" || uiSession.sessionStatus.getSnapshot().get(sessionId)?.pendingInteraction !== void 0) return void 0;
17775
+ return turnSource.getSnapshot();
17776
+ };
17777
+ const turn = currentTurn();
17778
+ if (turn === void 0) {
17779
+ reset();
17780
+ return;
17781
+ }
17782
+ input.consume();
17783
+ if (sequence.press({
17784
+ sessionId,
17785
+ turn,
17786
+ generation: binding,
17787
+ region,
17788
+ cancel: () => {
17789
+ cancel(sessionId);
17790
+ }
17791
+ })) return;
17792
+ const changed = () => {
17793
+ if (sessions.binding(sessionId) !== binding || currentTurn() !== turn) reset();
17794
+ };
17795
+ const disposers = [
17796
+ turnSource.subscribe(changed),
17797
+ binding.session.subscribe(changed),
17798
+ uiSession.sessionStatus.subscribe(changed)
17799
+ ];
17800
+ unwatch = () => {
17801
+ for (const dispose of disposers) dispose();
17802
+ };
17803
+ });
17804
+ return () => {
17805
+ off();
17806
+ reset();
17807
+ };
17808
+ }
17809
+ //#endregion
17596
17810
  //#region lib/types/client/apply.js
17597
17811
  /** Services required by the Conversation plugin. */
17598
17812
  const inject = [
@@ -17728,6 +17942,93 @@ window.__ModuleLoader__.load({
17728
17942
  disposeViews();
17729
17943
  };
17730
17944
  }, "ui-conversation: View selection");
17945
+ const stop = (sessionId) => {
17946
+ scopedConversation(sessions, sessionId).cancel().catch((_error) => {});
17947
+ };
17948
+ const stopShortcut = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)([]);
17949
+ ctx.inject(["shortcuts"], (scope) => {
17950
+ const fixedInputs = [
17951
+ {
17952
+ id: "fixed.send",
17953
+ label: () => t("input.send"),
17954
+ keys: ["Enter"],
17955
+ bindings: [{
17956
+ code: "Enter",
17957
+ modifiers: []
17958
+ }],
17959
+ group: "input"
17960
+ },
17961
+ {
17962
+ id: "fixed.newline",
17963
+ label: () => t("shortcut.newline"),
17964
+ keys: scope.shortcuts.describeBinding({
17965
+ code: "Enter",
17966
+ modifiers: ["shift"]
17967
+ }).keys,
17968
+ bindings: [{
17969
+ code: "Enter",
17970
+ modifiers: ["shift"]
17971
+ }],
17972
+ group: "input"
17973
+ },
17974
+ {
17975
+ id: "fixed.complementary",
17976
+ label: () => t("shortcut.complementary"),
17977
+ keys: scope.shortcuts.describeBinding({
17978
+ code: "Enter",
17979
+ modifiers: ["primary"]
17980
+ }).keys,
17981
+ bindings: [{
17982
+ code: "Enter",
17983
+ modifiers: ["control"]
17984
+ }, {
17985
+ code: "Enter",
17986
+ modifiers: ["meta"]
17987
+ }],
17988
+ group: "input"
17989
+ },
17990
+ {
17991
+ id: "fixed.slash",
17992
+ label: () => t("shortcut.slash"),
17993
+ keys: ["/"],
17994
+ bindings: [{
17995
+ code: "Slash",
17996
+ modifiers: []
17997
+ }],
17998
+ group: "input"
17999
+ },
18000
+ {
18001
+ id: "fixed.mention",
18002
+ label: () => t("shortcut.mention"),
18003
+ keys: ["@"],
18004
+ bindings: [{
18005
+ code: "Digit2",
18006
+ modifiers: ["shift"]
18007
+ }],
18008
+ group: "input"
18009
+ }
18010
+ ];
18011
+ for (const command of fixedInputs) scope.effect(() => scope.shortcuts.registerFixed(command), `ui-conversation: ${command.id}`);
18012
+ scope.effect(() => installStopShortcut(scope.shortcuts, sessions, (binding) => uiConversation.binding(binding).openTurn, ctx.uiSession, stop), "ui-conversation: fixed stop input");
18013
+ scope.effect(() => {
18014
+ const command = {
18015
+ id: "response.stop",
18016
+ label: () => t("input.stop"),
18017
+ keys: ["Esc", "Esc"],
18018
+ bindings: [{
18019
+ code: "Escape",
18020
+ modifiers: []
18021
+ }],
18022
+ group: "input"
18023
+ };
18024
+ const dispose = scope.shortcuts.registerFixed(command);
18025
+ stopShortcut.set(command.keys);
18026
+ return () => {
18027
+ stopShortcut.set([]);
18028
+ dispose();
18029
+ };
18030
+ }, "ui-conversation: fixed stop reference");
18031
+ });
17731
18032
  const inputHub = new InputHub(ctx, t);
17732
18033
  const composerBlocks = new ComposerBlockRegistry();
17733
18034
  ctx.inject(["commandUi"], (scope) => {
@@ -17963,6 +18264,7 @@ window.__ModuleLoader__.load({
17963
18264
  toggleCommandMenu: void 0,
17964
18265
  stop: void 0,
17965
18266
  hooks: {
18267
+ stopShortcut,
17966
18268
  busyEnter: submissionPolicy.busyEnter,
17967
18269
  fileUploads: ABSENT_FILE_UPLOADS,
17968
18270
  notices: ABSENT_NOTICES,
@@ -18040,9 +18342,10 @@ window.__ModuleLoader__.load({
18040
18342
  });
18041
18343
  },
18042
18344
  stop: () => {
18043
- scopedConversation(sessions, sessionId).cancel().catch(() => {});
18345
+ stop(sessionId);
18044
18346
  },
18045
18347
  hooks: {
18348
+ stopShortcut,
18046
18349
  busyEnter: submissionPolicy.busyEnter,
18047
18350
  fileUploads: conversation.fileUploads,
18048
18351
  notices: shell.notices,