@deepseek-ai/dsh-client-ui-schedule 0.2.0-rc.2 → 0.2.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -15,14 +15,14 @@
15
15
  en: d152484eb41ac6b4
16
16
  zh: 405b30feaf48c087
17
17
  /deepseek-ai-dsh-client-ui-schedule/use-this-package:
18
- en: c129ae5d0a150a5d
19
- zh: d81976f2840cb059
18
+ en: c668e3d223102e47
19
+ zh: efedf3996679fb17
20
20
  /deepseek-ai-dsh-client-ui-schedule/use-this-package/time-zone-data-source:
21
21
  en: 6bd6882dbbbefcb0
22
22
  zh: 03aa15f1a65d13dc
23
23
  /deepseek-ai-dsh-client-ui-schedule/understand-the-implementation:
24
- en: f863859edc1cb0f7
25
- zh: 2bf04cdd1f17bb18
24
+ en: a03a551e0ed96c6b
25
+ zh: a85efe7db56b7df3
26
26
  /deepseek-ai-dsh-client-ui-schedule/further-exploration:
27
27
  en: 06e265120b05dbf5
28
28
  zh: 08ab1ef979b8ea40
package/README.md CHANGED
@@ -25,7 +25,7 @@ Manage active and inactive tasks from the Automation tasks page and the right Si
25
25
  <a id="use-this-package"></a>
26
26
  ## Use this package
27
27
 
28
- The shipped Web composition carries no `ui-schedule` row; enable the optional experimental bundle `@deepseek-ai/dsh-experimental-schedule-bundle` from the Plugins page (Official group), or list it in a profile's `dsh.profile.bundles`, to insert and mount `ui-schedule` with the Host Schedule service and the clock context that supplies the model's current time. The Automation tasks sidebar entry opens a global page without selecting or activating a Session. The page header's New action starts a new Session, where the reminder is created by asking the model; the page itself has no creation form. Its task list supports text search and one All, Enabled, and Inactive status filter row; search matches the stored task name, the instruction, and the internal Session id, not a resolved Session title, and the empty state keeps the heading's New action beside the notice. Selecting an active or inactive task opens a second detail level with Rules and Delivery records tabs. Every list row shows the task's stored title with its status, frequency, and next run and never the original Session name; the detail's name control shows the stored title. Rules contains the complete reminder, status, next target for active tasks, original recurrence rule, and task id. Daily rule labels show the saved local time and exact stored IANA zone, preserving nonzero seconds and milliseconds rather than substituting the browser's zone. The Linked session entry in the detail tab strip names the linked Session by its catalog title, falling back to the Session id when no title is available. It opens an available, unarchived Session after metadata loads; pending Session or Workspace metadata, an archived Session, missing Session membership, or a Workspace query error keeps it disabled with an explanation. The click rechecks availability; browsing does not unarchive the Session. Only this action requests Session activation. Deletion is available from the More task actions menu in the detail's top strip, separate from navigation.
28
+ The shipped Web composition mounts `ui-schedule` with the Host Schedule service. The clock context that supplies the model's current time is preset-owned: `standard`, `cordis`, and `ptc` declare it, and `minimal` declares neither it nor the reminder tools. The Automation tasks sidebar entry opens a global page without selecting or activating a Session. The page header's New action starts a new Session, where the reminder is created by asking the model; the page itself has no creation form. Its task list supports text search and one All, Enabled, and Inactive status filter row; search matches the stored task name, the instruction, and the internal Session id, not a resolved Session title, and the empty state keeps the heading's New action beside the notice. Selecting an active or inactive task opens a second detail level with Rules and Records tabs. Every list row shows the task's stored title with its status, frequency, and next run and never the original Session name; the detail's name control shows the stored title. Rules contains the complete reminder, status, next target for active tasks, original recurrence rule, and task id. Daily rule labels show the saved local time and exact stored IANA zone, preserving nonzero seconds and milliseconds rather than substituting the browser's zone. The Linked session entry in the detail tab strip names the linked Session by its catalog title, falling back to the Session id when no title is available. When the strip cannot fit the tab list beside the labelled entry, the entry becomes an icon button with the same button style as More task actions, with the Session chat icon and a Linked session tooltip that also shows while the entry is disabled; the entry keeps focus when it switches layouts; the tab list scrolls without a visible scrollbar. It opens an available, unarchived Session after metadata loads; pending Session or Workspace metadata, an archived Session, missing Session membership, or a Workspace query error keeps it disabled with an explanation. The click rechecks availability; browsing does not unarchive the Session. Only this action requests Session activation. Deletion is available from the More task actions menu in the detail's top strip, separate from navigation.
29
29
 
30
30
  Selecting a task from the list opens Rules; refreshing that task preserves the selected tab. Rules edits an active task's name, instruction, and run time; the edits stay in a local draft until saved, and inactive tasks remain read-only. Unmodified Left/Right arrows cycle the tabs, Home/End select the first/last tab, and keyboard focus follows the selection. The tabs do not consume these keys with Alt, Ctrl, Meta, or Shift. The linked-Session control in the detail tab strip stays available on the Rules tab, and confirmed deletion is available from either view.
31
31
 
@@ -33,7 +33,7 @@ Rules shows the rule in a Run time card whose rows edit a local draft: Repeat is
33
33
 
34
34
  The rows are disabled while a save is in flight, while the catalog is loading, during a deletion, and for an inactive task. A save bar appears only while the local draft differs from the stored task: it shows Unsaved changes with Cancel and Save changes, and Save changes becomes Saving… while the save is in flight. Cancel restores the stored values. A catalog refresh becomes the shown values only while the draft has no unsaved edit, so an unsaved draft survives an authoritative refresh. A failed save keeps the draft and shows a localized message; after a conflict, retry against the refreshed record. If the task disappears from the catalog, Delete is disabled until the task returns. A successful update refreshes the authoritative catalog. A rejected or unconfirmed update is distinct from a catalog-read failure: Retry reloads the catalog without presenting the update as failed. If the update itself cannot be confirmed, check the task before retrying. Late responses after switching tasks or closing details do not replace the current view, and no failure rolls back a Host write already begun.
35
35
 
36
- Opening Delivery records lazily requests the newest 20 saved records. Load older records adds another page in newest-first append order, independent of wall-clock rollback. The tab strip is the whole header of that view: the editable name and next-run line belong to Rules. Each Saved delivery record leads with a clock glyph and its occurrence time as the locale's month name and clock field pair in the task's zone, or the browser's zone for a one-shot record, and shows the actual saved prompt when present. A prompt longer than two lines shows its first two lines and an Expand toggle, which Collapse reverses; a collapsed prompt rechecks its length when the panel width changes. A legacy receipt without a prompt never substitutes the current instruction.
36
+ Opening Records lazily requests the newest 20 saved records. Load older records adds another page in newest-first append order, independent of wall-clock rollback. The tab strip is the whole header of that view: the editable name and next-run line belong to Rules. Each Saved delivery record leads with a clock glyph and its occurrence time as the locale's month name and clock field pair in the task's zone, or the browser's zone for a one-shot record, and shows the actual saved prompt when present. A prompt longer than two lines shows its first two lines and an Expand toggle, which Collapse reverses; a collapsed prompt rechecks its length when the panel width changes. A legacy receipt without a prompt never substitutes the current instruction.
37
37
 
38
38
  After the last saved page loads, a nonempty history with confirmed pruning shows a borderless notice at the bottom left of the detail panel. Its info button expands or collapses the current Host retention rules. Empty history, legacy unavailability without confirmed pruning, incomplete pagination, and failed reads show no cleanup notice.
39
39
 
@@ -65,9 +65,7 @@ The browser entry registers the `schedules` main panel and matching sidebar entr
65
65
 
66
66
  A restored task tab carries no navigation parameters, because the Sidebar persists a tab's layout record and not what its opener passed. The page type therefore keeps its own binding from the Session and the layout record's id to the Session and id of the task that record last showed, stored under one `dsh.schedule.task-tab.v1.<sessionId>` localStorage key per Session with one entry per tab id and never any task content. Its body and chip read the entry only for a record without navigation parameters, remove it once a read that succeeded after the tab appeared cannot resolve it, and report no missing task on a binding's behalf. Once such a read leaves the tab without a task identity, the body names that state instead of reporting a load that never finishes.
67
67
 
68
- Subscriptions exist only while the framework observes a source. The final unsubscribe releases event listeners and invalidates pending responses. Components receive framework-bound `useCatalog` hooks and explicit action callbacks. The mounted Delivery records view reads `schedule.history` with the selected task's original Session binding; catalog and list responses omit full history. Components own disposable search, filtering, selection, confirmation, and history-page state. Reminder records remain Host-owned and do not come from historical Session projections or browser-local demo data.
69
-
70
- No runtime invariant companion is published because the catalogs render Host-owned task state and own only disposable query and interaction state.
68
+ Subscriptions exist only while the framework observes a source. The final unsubscribe releases event listeners and invalidates pending responses. Components receive framework-bound `useCatalog` hooks and explicit action callbacks. The mounted Records view reads `schedule.history` with the selected task's original Session binding; catalog and list responses omit full history. Components own disposable search, filtering, selection, confirmation, and history-page state. Reminder records remain Host-owned and do not come from historical Session projections or browser-local demo data.
71
69
 
72
70
  </details>
73
71
 
package/README.zh.md CHANGED
@@ -25,7 +25,7 @@ kind: "package-reference"
25
25
  <a id="use-this-package"></a>
26
26
  ## 使用本包
27
27
 
28
- 随发行版交付的 Web 组合不含 `ui-schedule` 行;在插件管理页的“官方”分组中启用可选实验性 bundle `@deepseek-ai/dsh-experimental-schedule-bundle`,或把它列进 profile 的 `dsh.profile.bundles`,即可插入 `ui-schedule` 并将它与 Host Schedule 服务、以及为模型提供当前时间的时钟上下文一起挂载。侧栏的自动化任务入口打开全局页面,不选择或激活会话。页面页头的“新建”操作会打开一个新会话,提醒由模型在该会话中创建;页面本身没有创建表单。列表支持文本搜索和一行“全部/已开启/未运行”状态筛选;搜索匹配任务已存储的名称、指令和内部会话 id,不匹配解析出的会话标题,空状态在提示旁保留页头的“新建”操作。选择活动或未运行任务后,进入含“规则”和“任务运行记录”页签的第二层详情。每条列表行显示任务已存储的标题及其状态、频率和下次运行,不显示原会话名称;详情中的名称输入框显示任务已存储的标题。“规则”显示完整提醒、状态、活动任务的下一目标时间、原始重复规则和任务 id。每天的规则标签显示已保存的本地时间与精确的存储 IANA 时区,保留非零秒与毫秒,而不替换为浏览器时区。详情页签条内的“关联会话”入口按会话标题显示,取不到标题时回退显示会话 id。元数据加载后,它可打开可用且未归档的会话;会话或 Workspace 元数据尚未就绪、会话已归档、会话不在列表中或 Workspace 查询失败时,入口保持禁用并显示原因。点击时会重新检查可用性;浏览不会取消会话归档。仅此操作请求激活会话。删除位于详情顶部条带的“更多任务操作”菜单。
28
+ 随发行版交付的 Web 组合把 `ui-schedule` 与 Host Schedule 服务一起挂载。为模型提供当前时间的时钟上下文归 preset 所有:`standard`、`cordis` 与 `ptc` 声明它,`minimal` 既不声明它,也不声明提醒工具。侧栏的自动化任务入口打开全局页面,不选择或激活会话。页面页头的“新建”操作会打开一个新会话,提醒由模型在该会话中创建;页面本身没有创建表单。列表支持文本搜索和一行“全部/已开启/未运行”状态筛选;搜索匹配任务已存储的名称、指令和内部会话 id,不匹配解析出的会话标题,空状态在提示旁保留页头的“新建”操作。选择活动或未运行任务后,进入含“规则”和“任务运行记录”页签的第二层详情。每条列表行显示任务已存储的标题及其状态、频率和下次运行,不显示原会话名称;详情中的名称输入框显示任务已存储的标题。“规则”显示完整提醒、状态、活动任务的下一目标时间、原始重复规则和任务 id。每天的规则标签显示已保存的本地时间与精确的存储 IANA 时区,保留非零秒与毫秒,而不替换为浏览器时区。详情页签条内的“关联会话”入口按会话标题显示,取不到标题时回退显示会话 id。页签条放不下页签列表和带文字的入口时,入口收为与“更多任务操作”同样式的图标按钮,使用会话对话图标,悬停提示“关联会话”,入口禁用时也会显示;切换形态时保留焦点;页签列表可滚动但不显示滚动条。元数据加载后,它可打开可用且未归档的会话;会话或 Workspace 元数据尚未就绪、会话已归档、会话不在列表中或 Workspace 查询失败时,入口保持禁用并显示原因。点击时会重新检查可用性;浏览不会取消会话归档。仅此操作请求激活会话。删除位于详情顶部条带的“更多任务操作”菜单。
29
29
 
30
30
  从列表选择任务时默认打开“规则”;刷新同一任务会保留当前页签。活动任务的“规则”修改名称、指令和运行时间;这些修改保留在本地草稿中直到保存,未运行任务保持只读。不带修饰键的左右方向键循环切换页签,Home/End 选择第一个/最后一个页签,键盘焦点随选择移动。页签不会拦截这些键与 Alt、Ctrl、Meta 或 Shift 的组合。共用的会话入口位于详情页签条内,在“规则”页签可见;确认删除操作在两种页签下都可用。
31
31
 
@@ -67,8 +67,6 @@ kind: "package-reference"
67
67
 
68
68
  仅在框架观察数据源期间订阅。最后一个订阅取消时释放事件监听,并使尚未完成的响应失效。组件接收框架绑定的 `useCatalog` hook 和明确的操作回调。已挂载的任务运行记录视图使用所选任务的原会话绑定读取 `schedule.history`;目录和列表响应不包含完整历史。组件拥有可丢弃的搜索、筛选、选择、确认和历史分页状态。提醒记录由 Host 拥有,不来自历史会话投影或浏览器本地演示数据。
69
69
 
70
- 本包不发布运行时 invariant companion,因为目录呈现 Host 拥有的任务状态,自身只拥有可丢弃的查询和交互状态。
71
-
72
70
  </details>
73
71
 
74
72
  <a id="further-exploration"></a>
package/lib/client.js CHANGED
@@ -228,6 +228,636 @@ window.__ModuleLoader__.load({
228
228
  };
229
229
  }
230
230
  //#endregion
231
+ //#region ../../util/values/src/partial-json.ts
232
+ /**
233
+ * Lazily scanned view of one JSON object's top-level fields, built from text
234
+ * that may still be streaming or from an already parsed object. Nothing is
235
+ * scanned until a reader asks; the view remembers every question it answered
236
+ * and reports changed answers when the owner refreshes for publication.
237
+ * Used for model tool-call arguments: a row reads the fields it
238
+ * cares about at whatever granularity it displays, at every stage of the call.
239
+ * @module @deepseek-ai/dsh-util-values/src/partial-json
240
+ */
241
+ const SIMPLE_ESCAPES = {
242
+ "\"": "\"",
243
+ "\\": "\\",
244
+ "/": "/",
245
+ b: "\b",
246
+ f: "\f",
247
+ n: "\n",
248
+ r: "\r",
249
+ t: " "
250
+ };
251
+ const CONTENT_ESCAPE = /[\\\u0000-\u001f]/u;
252
+ function isWhitespace(c) {
253
+ return c === " " || c === "\n" || c === "\r" || c === " ";
254
+ }
255
+ function isHex(c) {
256
+ return c >= "0" && c <= "9" || c >= "a" && c <= "f" || c >= "A" && c <= "F";
257
+ }
258
+ /**
259
+ * The view. A streaming instance grows through {@link PartialArguments.append};
260
+ * {@link PartialArguments.fromText} and {@link PartialArguments.fromObject} build
261
+ * sealed instances over a finished call. Every reader is total: an absent or
262
+ * differently typed field answers `undefined` (or `false`), never throws.
263
+ */
264
+ var PartialArguments = class PartialArguments {
265
+ /** The view of a call with no arguments available. */
266
+ static EMPTY = PartialArguments.fromObject({});
267
+ /**
268
+ * View finished argument text without scanning it until a reader asks.
269
+ * @param text - the complete argument JSON text.
270
+ * @returns a sealed view.
271
+ */
272
+ static fromText(text) {
273
+ const view = new PartialArguments();
274
+ view.append(text);
275
+ view.sealed = true;
276
+ return view;
277
+ }
278
+ /**
279
+ * View an already parsed argument payload, such as a PTC dispatch object.
280
+ * @param value - the parsed argument value.
281
+ * @returns a sealed view; a non-object payload has no fields.
282
+ */
283
+ static fromObject(value) {
284
+ const view = new PartialArguments();
285
+ view.object = typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
286
+ view.sealed = true;
287
+ return view;
288
+ }
289
+ /**
290
+ * The source: text so far or a parsed object, plus whether it can still grow.
291
+ * These are the only enumerable fields, so two views over the same source
292
+ * compare equal structurally however far each has been read.
293
+ */
294
+ chunks = [];
295
+ object;
296
+ sealed = false;
297
+ #ends = [];
298
+ #size = 0;
299
+ #consumed = 0;
300
+ #mode = "root";
301
+ #escape = false;
302
+ #keyStart = 0;
303
+ #keyEscaped = false;
304
+ #key = "";
305
+ #current = null;
306
+ #nestedEnds = [];
307
+ #nestedInString = false;
308
+ #invalidAt;
309
+ #invalidValue = false;
310
+ #entries = /* @__PURE__ */ new Map();
311
+ #order = [];
312
+ #reads = /* @__PURE__ */ new Map();
313
+ /** Whether this view rejects further appends; does not scan text or register reads. */
314
+ get isSealed() {
315
+ return this.sealed;
316
+ }
317
+ /** Whether indexing or a content read found invalid JSON; unread value contents are not validated. */
318
+ get invalid() {
319
+ this.scan();
320
+ return this.#mode === "invalid" || this.#invalidValue;
321
+ }
322
+ /**
323
+ * Retain streamed argument text without scanning or comparing observed answers.
324
+ * @param fragment - the text following every fragment appended before.
325
+ */
326
+ append(fragment) {
327
+ if (this.sealed) throw new Error("PartialArguments: cannot append to a sealed view");
328
+ if (fragment.length === 0) return;
329
+ this.chunks.push(fragment);
330
+ this.#size += fragment.length;
331
+ this.#ends.push(this.#size);
332
+ }
333
+ /**
334
+ * Reconcile a streamed prefix with authoritative complete text without joining the fragments.
335
+ * @param text - the final argument text, which replaces missing or conflicting deltas.
336
+ * @returns this view sealed with its caches retained when every character matches; otherwise a new sealed view.
337
+ */
338
+ settle(text) {
339
+ if (this.object !== void 0 || text.length !== this.#size) return PartialArguments.fromText(text);
340
+ let offset = 0;
341
+ for (const chunk of this.chunks) {
342
+ if (!text.startsWith(chunk, offset)) return PartialArguments.fromText(text);
343
+ offset += chunk.length;
344
+ }
345
+ this.chunks = text.length === 0 ? [] : [text];
346
+ this.#ends = text.length === 0 ? [] : [text.length];
347
+ this.sealed = true;
348
+ return this;
349
+ }
350
+ /**
351
+ * Compare observed answers and advance their publication baseline. Unread views remain unscanned.
352
+ * @returns whether any observed answer changed since its first read or the preceding refresh.
353
+ */
354
+ refresh() {
355
+ if (this.#reads.size === 0) return false;
356
+ this.scan();
357
+ let changed = false;
358
+ let completions = false;
359
+ for (const read of this.#reads.values()) {
360
+ if (read.completion) {
361
+ completions = true;
362
+ continue;
363
+ }
364
+ changed = this.refreshRead(read) || changed;
365
+ }
366
+ if (completions) {
367
+ for (const read of this.#reads.values()) if (read.completion) changed = this.refreshRead(read) || changed;
368
+ }
369
+ if (this.sealed) this.#reads.clear();
370
+ return changed;
371
+ }
372
+ refreshRead(read) {
373
+ const now = read.answer();
374
+ if (Object.is(now, read.last)) return false;
375
+ read.last = now;
376
+ return true;
377
+ }
378
+ /**
379
+ * Check whether no further fields can arrive.
380
+ * @returns whether the outer object closed, indexing failed, or the view is sealed; unread values are not validated.
381
+ */
382
+ closed() {
383
+ return this.remember("closed", "", () => this.closedNow());
384
+ }
385
+ /**
386
+ * List discovered fields in first-appearance order.
387
+ * @returns top-level keys seen so far, in first-appearance order.
388
+ */
389
+ keys() {
390
+ return this.remember("keys", "", () => this.keysNow(), (keys) => keys.length);
391
+ }
392
+ /**
393
+ * Check whether a top-level field has appeared.
394
+ * @param key - argument name.
395
+ * @returns whether the field has appeared (a string opened or another value began).
396
+ */
397
+ has(key) {
398
+ return this.remember("has", key, () => this.hasNow(key));
399
+ }
400
+ /**
401
+ * Check whether a field's closing delimiter has arrived, without validating its contents.
402
+ * @param key - argument name.
403
+ * @returns whether its delimiter arrived and no content reader has reported an error for this value.
404
+ */
405
+ complete(key) {
406
+ return this.remember("complete", key, () => this.completeNow(key));
407
+ }
408
+ /**
409
+ * Read string length without materializing its text.
410
+ * @param key - argument name.
411
+ * @param options - change granularity for a streaming string.
412
+ * @returns decoded UTF-16 length of the string field so far; undefined when absent or not a string.
413
+ */
414
+ stringLength(key, options) {
415
+ const step = Math.max(1, Math.floor(options?.step ?? 1));
416
+ const offset = options?.offset ?? 0;
417
+ return this.remember(`length:${step}:${offset}`, key, () => this.lengthNow(key), (length) => length === void 0 ? void 0 : Math.ceil((length + offset) / step));
418
+ }
419
+ /**
420
+ * Check a string against a decoded UTF-16 length limit without materializing it.
421
+ * @param key - argument name.
422
+ * @param maxLength - decoded UTF-16 limit, floored to at least zero.
423
+ * @returns whether the string is longer than the limit; false when absent or not a string.
424
+ */
425
+ stringExceeds(key, maxLength) {
426
+ const limit = Math.max(0, Math.floor(maxLength));
427
+ return this.remember(`exceeds:${limit}`, key, () => (this.lengthNow(key, limit + 1) ?? 0) > limit);
428
+ }
429
+ /**
430
+ * Read a decoded string, including a streaming prefix.
431
+ * @param key - argument name.
432
+ * @returns the string field's decoded text so far; undefined when absent or not a string.
433
+ */
434
+ text(key) {
435
+ return this.remember("text", key, () => this.textNow(key));
436
+ }
437
+ /**
438
+ * Read at most the first decoded UTF-16 units of a string.
439
+ * @param key - argument name.
440
+ * @param maxLength - maximum decoded UTF-16 length, floored to at least one.
441
+ * @returns the bounded string prefix; undefined when absent or not a string.
442
+ */
443
+ textPrefix(key, maxLength) {
444
+ const limit = Math.max(1, Math.floor(maxLength));
445
+ return this.remember(`prefix:${limit}`, key, () => this.textPrefixNow(key, limit));
446
+ }
447
+ /**
448
+ * Read a completed non-string argument.
449
+ * @param key - argument name.
450
+ * @returns the parsed non-string value once it closed; undefined while open, absent, or a string.
451
+ */
452
+ value(key) {
453
+ return this.remember("value", key, () => this.valueNow(key));
454
+ }
455
+ /** Answer a question and, on a streaming view, remember it for change detection. */
456
+ remember(kind, key, read, comparison) {
457
+ this.scan();
458
+ const result = read();
459
+ if (!this.sealed) {
460
+ const id = `${kind}/${key}`;
461
+ if (!this.#reads.has(id)) this.#reads.set(id, {
462
+ completion: kind === "complete",
463
+ answer: comparison === void 0 ? read : () => comparison(read()),
464
+ last: comparison === void 0 ? result : comparison(result)
465
+ });
466
+ }
467
+ return result;
468
+ }
469
+ closedNow() {
470
+ return this.sealed || this.#mode === "closed" || this.#mode === "invalid";
471
+ }
472
+ keysNow() {
473
+ return this.object === void 0 ? this.#order : Object.keys(this.object);
474
+ }
475
+ hasNow(key) {
476
+ return this.object === void 0 ? this.#entries.has(key) : Object.hasOwn(this.object, key);
477
+ }
478
+ completeNow(key) {
479
+ if (this.object !== void 0) return Object.hasOwn(this.object, key);
480
+ const entry = this.#entries.get(key);
481
+ return entry !== void 0 && entry.end >= 0 && (entry.kind === "string" ? entry.invalidAt === void 0 : !entry.invalid);
482
+ }
483
+ lengthNow(key, limit = Number.POSITIVE_INFINITY) {
484
+ if (this.object !== void 0) {
485
+ const field = Object.hasOwn(this.object, key) ? this.object[key] : void 0;
486
+ return typeof field === "string" ? field.length : void 0;
487
+ }
488
+ const entry = this.#entries.get(key);
489
+ if (entry?.kind !== "string") return void 0;
490
+ if (entry.text !== void 0 && entry.text.at === entry.end) return entry.text.length;
491
+ const read = entry.length ??= {
492
+ at: entry.start,
493
+ length: 0,
494
+ text: ""
495
+ };
496
+ this.readString(entry, read, limit, false);
497
+ return read.length;
498
+ }
499
+ textNow(key) {
500
+ if (this.object !== void 0) {
501
+ const field = Object.hasOwn(this.object, key) ? this.object[key] : void 0;
502
+ return typeof field === "string" ? field : void 0;
503
+ }
504
+ const entry = this.#entries.get(key);
505
+ if (entry?.kind !== "string") return void 0;
506
+ if (entry.text === void 0 && entry.end >= 0 && entry.needsDecoding && entry.invalidAt === void 0) {
507
+ let text;
508
+ try {
509
+ text = JSON.parse(`"${this.slice(entry.start, entry.end)}"`);
510
+ } catch (_error) {}
511
+ if (text !== void 0) entry.text = {
512
+ at: entry.end,
513
+ length: text.length,
514
+ text
515
+ };
516
+ }
517
+ const read = entry.text ??= {
518
+ at: entry.start,
519
+ length: 0,
520
+ text: ""
521
+ };
522
+ this.readString(entry, read, Number.POSITIVE_INFINITY, true);
523
+ return read.text;
524
+ }
525
+ textPrefixNow(key, maxLength) {
526
+ if (this.object !== void 0) {
527
+ const field = Object.hasOwn(this.object, key) ? this.object[key] : void 0;
528
+ return typeof field === "string" ? field.slice(0, maxLength) : void 0;
529
+ }
530
+ const entry = this.#entries.get(key);
531
+ if (entry?.kind !== "string") return void 0;
532
+ const prefixes = entry.prefixes ??= /* @__PURE__ */ new Map();
533
+ let read = prefixes.get(maxLength);
534
+ if (read === void 0) {
535
+ read = {
536
+ at: entry.start,
537
+ length: 0,
538
+ text: ""
539
+ };
540
+ prefixes.set(maxLength, read);
541
+ }
542
+ this.readString(entry, read, maxLength, true);
543
+ return read.text;
544
+ }
545
+ valueNow(key) {
546
+ if (this.object !== void 0) {
547
+ if (!Object.hasOwn(this.object, key)) return void 0;
548
+ const field = this.object[key];
549
+ return typeof field === "string" ? void 0 : field;
550
+ }
551
+ const entry = this.#entries.get(key);
552
+ if (entry?.kind !== "value" || entry.end < 0 || entry.invalid) return void 0;
553
+ if (entry.parsed === void 0) try {
554
+ entry.parsed = JSON.parse(this.slice(entry.start, entry.end));
555
+ } catch (_error) {
556
+ entry.invalid = true;
557
+ this.#invalidValue = true;
558
+ }
559
+ return entry.parsed;
560
+ }
561
+ chunkAt(at) {
562
+ let low = 0;
563
+ let high = this.#ends.length;
564
+ while (low < high) {
565
+ const mid = low + high >>> 1;
566
+ if (this.#ends[mid] <= at) low = mid + 1;
567
+ else high = mid;
568
+ }
569
+ return low;
570
+ }
571
+ /** Materialize only a requested range, never the cumulative source. */
572
+ slice(start, end) {
573
+ if (start >= end) return "";
574
+ const first = this.chunkAt(start);
575
+ const last = this.chunkAt(end - 1);
576
+ const base = first === 0 ? 0 : this.#ends[first - 1];
577
+ if (first === last) return this.chunks[first].slice(start - base, end - base);
578
+ const parts = [this.chunks[first].slice(start - base)];
579
+ for (let i = first + 1; i < last; i++) parts.push(this.chunks[i]);
580
+ parts.push(this.chunks[last].slice(0, end - this.#ends[last - 1]));
581
+ return parts.join("");
582
+ }
583
+ readString(entry, read, limit, materialize) {
584
+ const end = Math.min(entry.end < 0 ? this.#consumed : entry.end, entry.invalidAt ?? Number.POSITIVE_INFINITY, this.#invalidAt ?? Number.POSITIVE_INFINITY);
585
+ if (!entry.needsDecoding) {
586
+ const length = Math.min(end - read.at, limit - read.length);
587
+ if (length <= 0) return;
588
+ if (materialize) read.text += this.slice(read.at, read.at + length);
589
+ read.at += length;
590
+ read.length += length;
591
+ return;
592
+ }
593
+ let chunkIndex = this.chunkAt(read.at);
594
+ while (read.at < end && read.length < limit) {
595
+ const base = chunkIndex === 0 ? 0 : this.#ends[chunkIndex - 1];
596
+ const chunk = this.chunks[chunkIndex];
597
+ const remaining = chunk.slice(read.at - base, Math.min(chunk.length, end - base));
598
+ const boundary = remaining.search(CONTENT_ESCAPE);
599
+ const length = Math.min(boundary < 0 ? remaining.length : boundary, limit - read.length);
600
+ if (length > 0) {
601
+ if (materialize) read.text += remaining.slice(0, length);
602
+ read.at += length;
603
+ read.length += length;
604
+ if (read.at === base + chunk.length) chunkIndex++;
605
+ continue;
606
+ }
607
+ const type = remaining.length > 1 ? remaining[1] : read.at + 1 < end ? this.chunks[chunkIndex + 1][0] : void 0;
608
+ let decoded;
609
+ let width = 2;
610
+ if (remaining[0] === "\\" && type === void 0 && entry.end < 0) return;
611
+ if (remaining[0] === "\\" && type === "u") {
612
+ const hex = this.slice(read.at + 2, Math.min(end, read.at + 6));
613
+ let valid = true;
614
+ for (let i = 0; i < hex.length; i++) if (!isHex(hex[i])) valid = false;
615
+ if (valid) {
616
+ if (hex.length < 4 && entry.end < 0) return;
617
+ if (hex.length === 4) decoded = String.fromCharCode(Number.parseInt(hex, 16));
618
+ }
619
+ width = 6;
620
+ } else if (remaining[0] === "\\" && type !== void 0) decoded = SIMPLE_ESCAPES[type];
621
+ if (decoded === void 0) {
622
+ entry.invalidAt = read.at;
623
+ this.#invalidValue = true;
624
+ return;
625
+ }
626
+ if (materialize) read.text += decoded;
627
+ read.length++;
628
+ read.at += width;
629
+ while (chunkIndex < this.chunks.length && read.at >= this.#ends[chunkIndex]) chunkIndex++;
630
+ }
631
+ }
632
+ /** Locate new field ranges without decoding or parsing their contents. */
633
+ scan() {
634
+ if (this.object !== void 0 || this.#consumed === this.#size) return;
635
+ for (let i = this.chunkAt(this.#consumed); i < this.chunks.length && this.#invalidAt === void 0; i++) {
636
+ const pending = this.chunks[i];
637
+ const base = i === 0 ? 0 : this.#ends[i - 1];
638
+ for (let index = this.#consumed - base; index < pending.length && this.#mode !== "invalid"; index++) {
639
+ if (this.#mode === "string" || this.#mode === "nested" && this.#nestedInString) {
640
+ const end = this.stringBoundary(pending, index);
641
+ this.#consumed += end - index;
642
+ index = end;
643
+ if (index === pending.length) break;
644
+ }
645
+ this.step(pending[index], this.#consumed);
646
+ this.#consumed++;
647
+ }
648
+ }
649
+ }
650
+ /** Only raw quotes and their preceding backslash runs can terminate a string. */
651
+ stringBoundary(fragment, start) {
652
+ let at = start;
653
+ while (true) {
654
+ const quote = fragment.indexOf("\"", at);
655
+ const end = quote < 0 ? fragment.length : quote;
656
+ if (this.#mode === "string") {
657
+ const entry = this.#current;
658
+ if (!entry.needsDecoding && CONTENT_ESCAPE.test(fragment.slice(at, end))) entry.needsDecoding = true;
659
+ }
660
+ let slashStart = end;
661
+ while (slashStart > at && fragment[slashStart - 1] === "\\") slashStart--;
662
+ const escaped = (end - slashStart) % 2 === 1 !== (slashStart === at && this.#escape);
663
+ this.#escape = quote < 0 && escaped;
664
+ if (quote < 0 || !escaped) return end;
665
+ at = quote + 1;
666
+ }
667
+ }
668
+ step(c, at) {
669
+ switch (this.#mode) {
670
+ case "root":
671
+ if (isWhitespace(c)) return;
672
+ if (c === "{") {
673
+ this.#mode = "key-or-end";
674
+ return;
675
+ }
676
+ this.fail();
677
+ return;
678
+ case "key-or-end":
679
+ if (isWhitespace(c)) return;
680
+ if (c === "}") {
681
+ this.#mode = "closed";
682
+ return;
683
+ }
684
+ if (c === "\"") {
685
+ this.beginKey(at);
686
+ return;
687
+ }
688
+ this.fail();
689
+ return;
690
+ case "key-only":
691
+ if (isWhitespace(c)) return;
692
+ if (c === "\"") {
693
+ this.beginKey(at);
694
+ return;
695
+ }
696
+ this.fail();
697
+ return;
698
+ case "key":
699
+ this.stepKey(c, at);
700
+ return;
701
+ case "colon":
702
+ if (isWhitespace(c)) return;
703
+ if (c === ":") {
704
+ this.#mode = "value";
705
+ return;
706
+ }
707
+ this.fail();
708
+ return;
709
+ case "value":
710
+ this.beginValue(c, at);
711
+ return;
712
+ case "string": {
713
+ const entry = this.#current;
714
+ entry.end = at;
715
+ this.#current = null;
716
+ this.#mode = "comma-or-end";
717
+ return;
718
+ }
719
+ case "scalar":
720
+ this.stepScalar(c, at);
721
+ return;
722
+ case "nested":
723
+ this.stepNested(c, at);
724
+ return;
725
+ case "comma-or-end":
726
+ if (isWhitespace(c)) return;
727
+ if (c === ",") {
728
+ this.#mode = "key-only";
729
+ return;
730
+ }
731
+ if (c === "}") {
732
+ this.#mode = "closed";
733
+ return;
734
+ }
735
+ this.fail();
736
+ return;
737
+ case "closed":
738
+ if (isWhitespace(c)) return;
739
+ this.fail();
740
+ return;
741
+ /* v8 ignore next 2 -- scan() stops stepping once the view is invalid. */
742
+ case "invalid": return;
743
+ /* v8 ignore next 2 -- Every scanner mode has a handler above. */
744
+ default: assertNever(this.#mode);
745
+ }
746
+ }
747
+ fail() {
748
+ this.#invalidAt = this.#consumed;
749
+ this.#mode = "invalid";
750
+ this.#current = null;
751
+ }
752
+ beginKey(at) {
753
+ this.#mode = "key";
754
+ this.#keyStart = at + 1;
755
+ this.#keyEscaped = false;
756
+ this.#escape = false;
757
+ }
758
+ stepKey(c, at) {
759
+ if (c < " ") {
760
+ this.fail();
761
+ return;
762
+ }
763
+ if (this.#escape) {
764
+ this.#escape = false;
765
+ return;
766
+ }
767
+ if (c === "\\") {
768
+ this.#escape = true;
769
+ this.#keyEscaped = true;
770
+ return;
771
+ }
772
+ if (c !== "\"") return;
773
+ const raw = this.slice(this.#keyStart, at);
774
+ if (this.#keyEscaped) try {
775
+ this.#key = JSON.parse(`"${raw}"`);
776
+ } catch (_error) {
777
+ this.fail();
778
+ return;
779
+ }
780
+ else this.#key = raw;
781
+ this.#mode = "colon";
782
+ }
783
+ open(entry) {
784
+ if (!this.#entries.has(this.#key)) this.#order.push(this.#key);
785
+ this.#entries.set(this.#key, entry);
786
+ this.#current = entry;
787
+ }
788
+ beginValue(c, at) {
789
+ if (isWhitespace(c)) return;
790
+ if (c === "\"") {
791
+ this.open({
792
+ kind: "string",
793
+ start: at + 1,
794
+ end: -1,
795
+ needsDecoding: false,
796
+ invalidAt: void 0,
797
+ length: void 0,
798
+ text: void 0,
799
+ prefixes: void 0
800
+ });
801
+ this.#escape = false;
802
+ this.#mode = "string";
803
+ return;
804
+ }
805
+ if (c === "}" || c === "," || c === ":" || c === "]") {
806
+ this.fail();
807
+ return;
808
+ }
809
+ this.open({
810
+ kind: "value",
811
+ start: at,
812
+ end: -1,
813
+ parsed: void 0,
814
+ invalid: false
815
+ });
816
+ if (c === "{" || c === "[") {
817
+ this.#mode = "nested";
818
+ this.#nestedEnds = [c === "{" ? "}" : "]"];
819
+ this.#nestedInString = false;
820
+ this.#escape = false;
821
+ return;
822
+ }
823
+ this.#mode = "scalar";
824
+ }
825
+ stepScalar(c, at) {
826
+ if (c !== "," && c !== "}" && !isWhitespace(c)) return;
827
+ this.closeValue(at);
828
+ this.#mode = c === "," ? "key-only" : c === "}" ? "closed" : "comma-or-end";
829
+ }
830
+ stepNested(c, at) {
831
+ if (this.#nestedInString) {
832
+ this.#nestedInString = false;
833
+ return;
834
+ }
835
+ if (c === "\"") {
836
+ this.#nestedInString = true;
837
+ return;
838
+ }
839
+ if (c === "{" || c === "[") {
840
+ this.#nestedEnds.push(c === "{" ? "}" : "]");
841
+ return;
842
+ }
843
+ if (c === "}" || c === "]") {
844
+ if (this.#nestedEnds.pop() !== c) {
845
+ this.fail();
846
+ return;
847
+ }
848
+ if (this.#nestedEnds.length === 0) {
849
+ this.closeValue(at + 1);
850
+ this.#mode = "comma-or-end";
851
+ }
852
+ }
853
+ }
854
+ closeValue(end) {
855
+ const entry = this.#current;
856
+ entry.end = end;
857
+ this.#current = null;
858
+ }
859
+ };
860
+ //#endregion
231
861
  //#region ../../util/values/src/index.ts
232
862
  /**
233
863
  * Mark an unreachable closed-union branch.
@@ -1654,6 +2284,8 @@ window.__ModuleLoader__.load({
1654
2284
  seq: match.event.seq,
1655
2285
  time: match.event.time,
1656
2286
  callId: String(match.event.data.message.source.callId),
2287
+ name: call.name,
2288
+ args: PartialArguments.fromText(call.argsRaw),
1657
2289
  call: {
1658
2290
  name: call.name,
1659
2291
  argsRaw: call.argsRaw
@@ -1798,7 +2430,7 @@ window.__ModuleLoader__.load({
1798
2430
  }
1799
2431
  //#endregion
1800
2432
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-schedule/src/client/TaskManagerPage.module.css.mjs
1801
- const css$5 = ".t-XoWW_page{width:100%;min-width:0;height:100%;min-height:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);font-size:14px;line-height:1.6;display:flex;overflow:hidden}.t-XoWW_listPane{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.t-XoWW_pageScroll{scrollbar-gutter:stable;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px;flex:1;min-height:0;overflow:auto}.t-XoWW_pageContent{max-width:960px;margin:0 auto;padding:0 clamp(24px,4vw,48px) 48px}.t-XoWW_pageHeading{justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px;padding-top:28px;display:flex}[data-platform=darwin] .t-XoWW_pageHeading{padding-top:calc(28px + var(--dsh-frame-top-clearance,0px))}.t-XoWW_pageHeading h1{flex:1;min-width:0;margin:0;font-size:20px;font-weight:500;line-height:28px}.t-XoWW_creationActions{flex:none;align-items:center;gap:16px;display:flex}.t-XoWW_newButton{border-radius:16px;height:32px;padding:0 12px;font-size:13px;line-height:20px}.t-XoWW_filters{flex-wrap:wrap;align-items:center;gap:8px 12px;margin-bottom:14px;display:flex}.t-XoWW_filterTabs{flex-wrap:wrap;align-items:center;gap:8px 12px;display:flex}.t-XoWW_filterTab{height:28px;color:var(--dsw-alias-label-tertiary);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:14px;flex:none;align-items:center;padding:0 10px;font-size:14px;line-height:22px;display:inline-flex}.t-XoWW_filterTab:hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_filterTabActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.t-XoWW_searchField{border:.5px solid var(--dsw-alias-border-l3);height:36px;color:var(--dsw-alias-label-tertiary);border-radius:12px;align-items:center;margin:0 0 16px;padding:0 10px;transition:border-color .15s;display:flex}.t-XoWW_searchField:hover{border-color:var(--dsw-alias-border-l2)}.t-XoWW_searchField:focus-within{border-color:var(--dsw-alias-state-business-primary)}.t-XoWW_searchField>:first-child{background:0 0;border:0;border-radius:0;flex:1;min-width:0;height:100%;padding:0}.t-XoWW_searchField>:first-child:focus-within{border-color:#0000}.t-XoWW_searchField>:first-child svg{width:14px;height:14px}.t-XoWW_searchField input::placeholder{color:var(--dsw-alias-label-caption)}.t-XoWW_searchField input:focus-visible{outline:none}.t-XoWW_searchField input::-webkit-search-cancel-button{display:none}.t-XoWW_searchClear{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);flex:none;margin-right:-6px;padding:0}.t-XoWW_searchClear svg{width:14px;height:14px}.t-XoWW_list{display:block}.t-XoWW_listRows{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.t-XoWW_row{text-align:left;white-space:normal;border-radius:12px;justify-content:flex-start;align-items:flex-start;gap:12px;width:100%;height:auto;padding:8px;display:flex}.t-XoWW_row:hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_rowGlyph{width:16px;height:20px;color:var(--dsw-alias-label-tertiary);flex:none;margin-top:2px}.t-XoWW_rowContent{flex-direction:column;flex:1;min-width:0;display:flex}.t-XoWW_rowTitle{text-overflow:ellipsis;white-space:nowrap;font-weight:500;line-height:23px;overflow:hidden}.t-XoWW_rowSummary{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin-top:2px;font-size:13px;line-height:21px;display:block}.t-XoWW_metadata{color:inherit;overflow-wrap:anywhere;font-size:13px;line-height:21px}.t-XoWW_metadata+.t-XoWW_metadata:before{content:\" · \";padding:0 2px}.t-XoWW_selectedRow{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_endedRow .t-XoWW_rowTitle{color:var(--dsw-alias-label-tertiary)}.t-XoWW_endedRow .t-XoWW_rowSummary{color:var(--dsw-alias-label-caption)}.t-XoWW_endedRow:hover .t-XoWW_rowTitle,.t-XoWW_endedRow.t-XoWW_selectedRow .t-XoWW_rowTitle{color:inherit}.t-XoWW_endedRow:hover .t-XoWW_rowSummary,.t-XoWW_endedRow.t-XoWW_selectedRow .t-XoWW_rowSummary{color:var(--dsw-alias-label-tertiary)}.t-XoWW_notice{background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-secondary);border-radius:10px;flex-wrap:wrap;align-items:flex-start;gap:9px;margin:0 0 20px;padding:12px 14px;font-size:12px;line-height:20px;display:flex}.t-XoWW_notice p{flex:1;margin:0}.t-XoWW_empty{text-align:center;color:var(--dsw-alias-label-tertiary);flex-direction:column;align-items:center;padding:48px 20px;font-size:14px;display:flex}.t-XoWW_empty h2,.t-XoWW_empty h3,.t-XoWW_empty .t-XoWW_emptyTitle,.t-XoWW_empty p{margin:0}.t-XoWW_empty h2,.t-XoWW_empty h3,.t-XoWW_empty .t-XoWW_emptyTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:8px;font-size:14px;font-weight:400;line-height:1.6}.t-XoWW_emptyGlyph{color:var(--dsw-alias-label-caption);margin-bottom:12px}.t-XoWW_emptyAction{margin-top:16px}.t-XoWW_detail{--detail-gutter:24px;border-left:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-base);flex-direction:column;flex:0 0 47%;min-width:0;min-height:0;display:flex;position:relative}.t-XoWW_detail:focus-visible{outline:none}.t-XoWW_tabBody{flex-direction:column;flex:auto;min-width:0;height:100%;min-height:0;display:flex}.t-XoWW_tabBody>.t-XoWW_detail{border-left:0;flex:auto}.t-XoWW_tabBody>.t-XoWW_empty{flex:auto;justify-content:center}.t-XoWW_tabBody>.t-XoWW_detail .t-XoWW_detailTabsBar{height:37px;min-height:37px}.t-XoWW_tabBody>.t-XoWW_detail .t-XoWW_detailTab{padding-bottom:9px}.t-XoWW_tabBody>.t-XoWW_detail .t-XoWW_detailActions{margin-right:calc(6px - var(--detail-gutter))}.t-XoWW_detailHeader{align-items:flex-start;gap:10px;margin-bottom:4px;display:flex}.t-XoWW_editName{width:100%;min-width:0;min-height:32px;color:var(--dsw-alias-label-primary);background:0 0;border:0;outline:0;flex:1;padding:0;font-size:20px;font-weight:500;line-height:28px}.t-XoWW_editName:hover{box-shadow:0 1px var(--dsw-alias-border-l3)}.t-XoWW_editName:focus{box-shadow:0 1px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary))}.t-XoWW_readonlyName{overflow-wrap:anywhere;flex:1;min-width:0;margin:0;padding:2px 0;font-size:20px;font-weight:500;line-height:28px}.t-XoWW_nextRun{min-height:20px;color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;margin-bottom:20px;font-size:13px;line-height:20px;display:flex}.t-XoWW_nextRun p{overflow-wrap:anywhere;min-width:0;margin:0}.t-XoWW_nextRunRelative{color:inherit}.t-XoWW_tabTitleIcon{color:var(--dsw-alias-label-secondary);flex:none}.t-XoWW_detailTabsBar{height:44px;min-height:44px;padding:0 var(--detail-gutter);border-bottom:.5px solid var(--dsw-alias-border-l3);flex-shrink:0;justify-content:space-between;align-items:center;gap:20px;display:flex}.t-XoWW_detailTabs{flex:auto;align-self:flex-end;gap:36px;min-width:0;margin-bottom:-1px;padding-bottom:1px;display:flex;overflow-x:auto}.t-XoWW_detailActions{flex:none;align-items:center;margin-right:-8px}.t-XoWW_detailIconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);flex:none;padding:0}.t-XoWW_detailTab{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;flex:none;padding:0 0 13px;font-size:13px;font-weight:500;line-height:16px;position:relative}.t-XoWW_detailTab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:-1px;left:0;right:0}.t-XoWW_detailTab[aria-selected=true]{color:var(--dsw-alias-state-business-primary)}.t-XoWW_detailTab[aria-selected=true]:after{background:var(--dsw-alias-state-business-primary)}.t-XoWW_detailScroll{min-height:0;padding:24px var(--detail-gutter) 28px;scrollbar-gutter:stable;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px;flex:1;overflow:auto}.t-XoWW_detailRecords{scrollbar-gutter:auto;flex-direction:column;padding:0;display:flex;overflow:hidden}.t-XoWW_detailRecords>.t-XoWW_notice{margin:24px var(--detail-gutter) 0}.t-XoWW_recordsPanel:not([hidden]),.t-XoWW_deliveryHistory{flex-direction:column;flex:1;min-height:0;display:flex}.t-XoWW_retentionEnd{padding:0 var(--detail-gutter) 16px;color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:20px}.t-XoWW_retentionLine{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.t-XoWW_retentionInfo{width:24px;height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:5px;display:inline-flex}.t-XoWW_retentionInfo:hover{color:var(--dsw-alias-label-primary)}.t-XoWW_retentionInfo:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.t-XoWW_retentionRule{background:var(--dsw-alias-bg-layer-1);border-radius:8px;margin-top:12px;padding:12px 14px}.t-XoWW_retentionRule p{margin:0}.t-XoWW_retentionRule p+p{margin-top:6px}.t-XoWW_ruleCard{margin-top:28px}.t-XoWW_ruleCard h3{color:var(--dsw-alias-label-tertiary);margin:0 0 8px 10px;font-size:13px;font-weight:400;line-height:20px}.t-XoWW_ruleRows{border:.5px solid var(--dsw-alias-border-l3);border-radius:16px;flex-direction:column;padding:0 12px;display:flex}.t-XoWW_menuGuard{display:contents}.t-XoWW_zoneMenu.t-XoWW_zoneMenu{height:min(420px,100dvh - 48px);max-height:min(420px,100dvh - 48px)}.t-XoWW_zoneMenu [role=separator]{background:var(--dsw-alias-border-l3);height:.5px;margin:6px 4px}.t-XoWW_ruleRow,.t-XoWW_ruleRowMenu{border-bottom:.5px solid var(--dsw-alias-border-l3);width:100%;display:flex}.t-XoWW_ruleRow{justify-content:space-between;align-items:center;gap:12px;min-height:48px}.t-XoWW_ruleRows>:last-child,.t-XoWW_ruleRows>:last-child>.t-XoWW_ruleRowMenu{border-bottom:0}.t-XoWW_ruleLabel{color:var(--dsw-alias-label-primary);flex:none;font-size:14px;line-height:1.6}.t-XoWW_ruleControl{margin-right:0}.t-XoWW_ruleRows .t-XoWW_ruleControl:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.t-XoWW_ruleValue{width:100%;min-height:48px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;justify-content:space-between;align-items:center;gap:12px;margin:0;padding:0;font-size:14px;line-height:1.6;display:flex}.t-XoWW_ruleValueFace{border-radius:18px;flex:0 auto;align-items:center;gap:6px;min-width:0;min-height:32px;padding:0 8px;transition:background .15s;display:flex}.t-XoWW_ruleValue:not(:disabled):hover .t-XoWW_ruleValueFace{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_ruleRows .t-XoWW_ruleValue:focus-visible{outline:none}.t-XoWW_ruleValue:focus-visible .t-XoWW_ruleValueFace{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.t-XoWW_ruleValueFace>svg{color:var(--dsw-alias-label-tertiary);flex:none}.t-XoWW_ruleValue:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.t-XoWW_ruleCurrent{text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;overflow:hidden}.t-XoWW_zoneSearch{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;outline:none;padding:6px 8px;font-size:13px;line-height:20px}.t-XoWW_zoneSearch:focus{border-color:var(--dsw-alias-state-business-primary)}.t-XoWW_ruleWeekdays{flex-wrap:wrap;justify-content:flex-end;gap:4px;padding:6px 0;display:flex}.t-XoWW_ruleMonthDays{grid-template-columns:repeat(7,minmax(36px,max-content));justify-content:flex-end;gap:4px;padding:6px 0;display:grid}.t-XoWW_ruleMonthDays>*{justify-content:center;justify-self:stretch}.t-XoWW_ruleInput{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:right;background:0 0;border:none;border-radius:18px;flex:0 58%;margin-right:0;padding:5px 8px;font-size:14px;transition:background .15s}.t-XoWW_ruleInput:not(:disabled):hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_ruleInput:disabled{color:var(--dsw-alias-label-tertiary)}.t-XoWW_ruleInterval{flex:none;align-items:center;gap:8px;min-width:0;display:flex}.t-XoWW_ruleIntervalStepper{background:var(--dsw-alias-bg-module-platform);border-radius:18px;justify-content:center;align-items:center;min-width:72px;height:36px;display:inline-flex;position:relative}.t-XoWW_ruleIntervalInput{box-sizing:border-box;width:calc(var(--interval-digits,1) * 1ch + 52px);appearance:textfield;border-radius:inherit;font-variant-numeric:tabular-nums;text-align:center;flex:0 auto;min-width:72px;height:100%;padding:0 26px}.t-XoWW_ruleIntervalInput::-webkit-outer-spin-button,.t-XoWW_ruleIntervalInput::-webkit-inner-spin-button{appearance:none;margin:0}.t-XoWW_ruleIntervalInput:not(:disabled):hover{background:0 0}.t-XoWW_ruleRows .t-XoWW_ruleIntervalInput:focus-visible{outline:none}.t-XoWW_ruleIntervalArrows{opacity:0;flex-direction:column;gap:2px;display:flex;position:absolute;right:8px}.t-XoWW_ruleIntervalStepper:hover .t-XoWW_ruleIntervalArrows,.t-XoWW_ruleIntervalStepper:focus-within .t-XoWW_ruleIntervalArrows{opacity:1}.t-XoWW_ruleIntervalArrow{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 75%, transparent);width:17px;height:12px;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:3px;justify-content:center;align-items:center;padding:0;display:inline-flex}.t-XoWW_ruleIntervalArrow:hover:not(:disabled){background:var(--dsw-alias-bg-layer-1)}.t-XoWW_ruleIntervalArrow:disabled{color:var(--dsw-alias-label-caption);cursor:default}.t-XoWW_ruleIntervalUnit{color:var(--dsw-alias-label-primary);flex:none;font-size:14px}.t-XoWW_pickerTrigger{cursor:pointer;flex:0 auto;justify-content:flex-end;align-items:center;gap:6px;display:inline-flex}.t-XoWW_pickerTrigger:disabled{cursor:default}.t-XoWW_pickerIcon{color:var(--dsw-alias-label-tertiary);flex:none}.t-XoWW_ruleHint{color:var(--dsw-alias-label-tertiary);margin:8px 0 0 10px;font-size:13px;line-height:1.6}.t-XoWW_ruleHintError{color:var(--dsw-alias-state-error-primary)}.t-XoWW_instruction{box-sizing:border-box;field-sizing:content;border:.5px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-base);width:100%;max-width:100%;min-height:112px;max-height:160px;color:var(--dsw-alias-label-primary);font:inherit;resize:none;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px;--dsh-scrollbar-track-margin:12px;border-radius:16px;outline:0;margin:0;padding:12px;font-size:14px;line-height:24px;transition:border-color .15s;display:block}.t-XoWW_instruction:hover{border-color:var(--dsw-alias-border-l2)}.t-XoWW_instruction:focus{border-color:var(--dsw-alias-state-business-primary)}.t-XoWW_readonlyPrompt{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:14px;line-height:24px}.t-XoWW_delivery{border-radius:8px;align-items:flex-start;gap:12px;margin:0 -8px;padding:14px 8px;font-size:14px;line-height:22px;display:flex;position:relative}.t-XoWW_delivery:first-of-type{padding-top:0}.t-XoWW_delivery:before,.t-XoWW_delivery:after{background:var(--dsw-alias-border-l3);width:.5px;position:absolute;left:15.75px}.t-XoWW_delivery:not(:first-of-type):before{content:\"\";height:14px;top:0}.t-XoWW_delivery:not(:last-of-type):after{content:\"\";top:42px;bottom:0}.t-XoWW_delivery:first-of-type:not(:last-of-type):after{top:28px}.t-XoWW_deliveryGlyph{color:var(--dsw-alias-label-tertiary);flex:none;margin-top:6px}.t-XoWW_deliveryBody{flex:1;min-width:0;padding:2px 0}.t-XoWW_deliveryHead{align-items:center;gap:10px;display:flex}.t-XoWW_deliveryTime{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:22px;display:block}.t-XoWW_confirmTitle{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.t-XoWW_savedPrompt{-webkit-line-clamp:2;line-clamp:2;color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;-webkit-box-orient:vertical;margin:6px 0 0;font-size:13px;line-height:22px;display:-webkit-box;overflow:hidden}.t-XoWW_savedPrompt[data-expanded]{-webkit-line-clamp:none;line-clamp:none;display:block}.t-XoWW_savedPromptToggle{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:2px;margin:2px 0 0 -6px;padding:1px 6px;font-size:12px;line-height:20px;display:inline-flex}.t-XoWW_savedPromptToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_savedPromptToggle:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.t-XoWW_detailActions,.t-XoWW_confirmActions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.t-XoWW_detailHeader{flex-shrink:0}.t-XoWW_detailContext{flex:none;align-items:center;min-width:0;max-width:200px;display:flex}.t-XoWW_saveFooter{padding:20px var(--detail-gutter);border-top:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-base);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;display:flex}.t-XoWW_saveFooter>button{height:32px;font-size:13px}.t-XoWW_saveFooter>:last-child{margin-right:-8px}.t-XoWW_saveNotice{color:var(--dsw-alias-label-tertiary);margin-right:auto;font-size:12px}.t-XoWW_saveFailure{padding:12px var(--detail-gutter) 0;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-state-error-primary);flex-shrink:0;margin:0;font-size:12px;line-height:1.6}.t-XoWW_linkedSession{text-align:left;border:0;border-radius:14px;flex:0 auto;align-items:center;gap:6px;min-width:0;max-width:100%;height:28px;padding:0 8px;display:flex}.t-XoWW_linkedSession:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.t-XoWW_detailNotice{padding:0 var(--detail-gutter) 6px;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;background:var(--dsw-alias-bg-base);flex-shrink:0;margin:0;font-size:12px}.t-XoWW_linkedSessionLabel{color:var(--dsw-alias-label-secondary);flex-shrink:0;font-size:13px}.t-XoWW_linkedSessionTarget{justify-content:flex-end;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.t-XoWW_linkedSessionName{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;font-size:12px;position:absolute;overflow:hidden}.t-XoWW_confirmDialog{box-sizing:border-box;max-height:calc(100dvh - 48px)}.t-XoWW_confirmContent{overscroll-behavior:contain;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);min-height:0;overflow-y:auto}.t-XoWW_confirmDialog>:last-child{flex-shrink:0}.t-XoWW_deleteButton{color:var(--dsw-alias-state-error-primary)}.t-XoWW_page :focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.t-XoWW_page .t-XoWW_editName:focus-visible,.t-XoWW_page .t-XoWW_instruction:focus-visible{outline:none}@media (width<=1100px){.t-XoWW_detail{--detail-gutter:20px}}@media (width<=760px){.t-XoWW_hasDetails .t-XoWW_listPane{display:none}.t-XoWW_detail{border-left:0;flex-basis:100%}.t-XoWW_detailScroll{padding-top:20px}.t-XoWW_saveNotice{display:none}}@media (width<=400px){.t-XoWW_detail{--detail-gutter:16px}.t-XoWW_detailTabsBar{gap:16px}.t-XoWW_detailActions{gap:0}}";
2433
+ const css$5 = ".t-XoWW_page{width:100%;min-width:0;height:100%;min-height:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);font-size:14px;line-height:1.6;display:flex;overflow:hidden}.t-XoWW_listPane{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.t-XoWW_pageScroll{scrollbar-gutter:stable;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px;flex:1;min-height:0;overflow:auto}.t-XoWW_pageContent{max-width:960px;margin:0 auto;padding:0 clamp(24px,4vw,48px) 48px}.t-XoWW_pageHeading{justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px;padding-top:28px;display:flex}[data-platform=darwin] .t-XoWW_pageHeading{padding-top:calc(28px + var(--dsh-frame-top-clearance,0px))}.t-XoWW_pageHeading h1{flex:1;min-width:0;margin:0;font-size:20px;font-weight:500;line-height:28px}.t-XoWW_creationActions{flex:none;align-items:center;gap:16px;display:flex}.t-XoWW_newButton{border-radius:16px;height:32px;padding:0 12px;font-size:13px;line-height:20px}.t-XoWW_filters{flex-wrap:wrap;align-items:center;gap:8px 12px;margin-bottom:14px;display:flex}.t-XoWW_filterTabs{flex-wrap:wrap;align-items:center;gap:8px 12px;display:flex}.t-XoWW_filterTab{height:28px;color:var(--dsw-alias-label-tertiary);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:14px;flex:none;align-items:center;padding:0 10px;font-size:14px;line-height:22px;display:inline-flex}.t-XoWW_filterTab:hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_filterTabActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.t-XoWW_searchField{border:.5px solid var(--dsw-alias-border-l3);height:36px;color:var(--dsw-alias-label-tertiary);border-radius:12px;align-items:center;margin:0 0 16px;padding:0 10px;transition:border-color .15s;display:flex}.t-XoWW_searchField:hover{border-color:var(--dsw-alias-border-l2)}.t-XoWW_searchField:focus-within{border-color:var(--dsw-alias-state-business-primary)}.t-XoWW_searchField>:first-child{background:0 0;border:0;border-radius:0;flex:1;min-width:0;height:100%;padding:0}.t-XoWW_searchField>:first-child:focus-within{border-color:#0000}.t-XoWW_searchField>:first-child svg{width:14px;height:14px}.t-XoWW_searchField input::placeholder{color:var(--dsw-alias-label-caption)}.t-XoWW_searchField input:focus-visible{outline:none}.t-XoWW_searchField input::-webkit-search-cancel-button{display:none}.t-XoWW_searchClear{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);flex:none;margin-right:-6px;padding:0}.t-XoWW_searchClear svg{width:14px;height:14px}.t-XoWW_list{display:block}.t-XoWW_listRows{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.t-XoWW_row{text-align:left;white-space:normal;border-radius:12px;justify-content:flex-start;align-items:flex-start;gap:12px;width:100%;height:auto;padding:8px;display:flex}.t-XoWW_row:hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_rowGlyph{width:16px;height:20px;color:var(--dsw-alias-label-tertiary);flex:none;margin-top:2px}.t-XoWW_rowContent{flex-direction:column;flex:1;min-width:0;display:flex}.t-XoWW_rowTitle{text-overflow:ellipsis;white-space:nowrap;font-weight:500;line-height:23px;overflow:hidden}.t-XoWW_rowSummary{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin-top:2px;font-size:13px;line-height:21px;display:block}.t-XoWW_metadata{color:inherit;overflow-wrap:anywhere;font-size:13px;line-height:21px}.t-XoWW_metadata+.t-XoWW_metadata:before{content:\" · \";padding:0 2px}.t-XoWW_selectedRow{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_endedRow .t-XoWW_rowTitle{color:var(--dsw-alias-label-tertiary)}.t-XoWW_endedRow .t-XoWW_rowSummary{color:var(--dsw-alias-label-caption)}.t-XoWW_endedRow:hover .t-XoWW_rowTitle,.t-XoWW_endedRow.t-XoWW_selectedRow .t-XoWW_rowTitle{color:inherit}.t-XoWW_endedRow:hover .t-XoWW_rowSummary,.t-XoWW_endedRow.t-XoWW_selectedRow .t-XoWW_rowSummary{color:var(--dsw-alias-label-tertiary)}.t-XoWW_notice{background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-secondary);border-radius:10px;flex-wrap:wrap;align-items:flex-start;gap:9px;margin:0 0 20px;padding:12px 14px;font-size:12px;line-height:20px;display:flex}.t-XoWW_notice p{flex:1;margin:0}.t-XoWW_empty{text-align:center;color:var(--dsw-alias-label-tertiary);flex-direction:column;align-items:center;padding:48px 20px;font-size:14px;display:flex}.t-XoWW_empty h2,.t-XoWW_empty h3,.t-XoWW_empty .t-XoWW_emptyTitle,.t-XoWW_empty p{margin:0}.t-XoWW_empty h2,.t-XoWW_empty h3,.t-XoWW_empty .t-XoWW_emptyTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:8px;font-size:14px;font-weight:400;line-height:1.6}.t-XoWW_emptyGlyph{color:var(--dsw-alias-label-caption);margin-bottom:12px}.t-XoWW_emptyAction{margin-top:16px}.t-XoWW_detail{--detail-gutter:24px;border-left:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-base);flex-direction:column;flex:0 0 47%;min-width:0;min-height:0;display:flex;position:relative}.t-XoWW_detail:focus-visible{outline:none}.t-XoWW_tabBody{flex-direction:column;flex:auto;min-width:0;height:100%;min-height:0;display:flex}.t-XoWW_tabBody>.t-XoWW_detail{border-left:0;flex:auto}.t-XoWW_tabBody>.t-XoWW_empty{flex:auto;justify-content:center}.t-XoWW_tabBody>.t-XoWW_detail .t-XoWW_detailTabsBar{height:37px;min-height:37px}.t-XoWW_tabBody>.t-XoWW_detail .t-XoWW_detailTab{padding-bottom:9px}.t-XoWW_tabBody>.t-XoWW_detail .t-XoWW_detailActions{margin-right:calc(6px - var(--detail-gutter))}.t-XoWW_detailHeader{align-items:flex-start;gap:10px;margin-bottom:4px;display:flex}.t-XoWW_editName{width:100%;min-width:0;min-height:32px;color:var(--dsw-alias-label-primary);background:0 0;border:0;outline:0;flex:1;padding:0;font-size:20px;font-weight:500;line-height:28px}.t-XoWW_editName:hover{box-shadow:0 1px var(--dsw-alias-border-l3)}.t-XoWW_editName:focus{box-shadow:0 1px var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary))}.t-XoWW_readonlyName{overflow-wrap:anywhere;flex:1;min-width:0;margin:0;padding:2px 0;font-size:20px;font-weight:500;line-height:28px}.t-XoWW_nextRun{min-height:20px;color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;margin-bottom:20px;font-size:13px;line-height:20px;display:flex}.t-XoWW_nextRun p{overflow-wrap:anywhere;min-width:0;margin:0}.t-XoWW_nextRunRelative{color:inherit}.t-XoWW_tabTitleIcon{color:var(--dsw-alias-label-secondary);flex:none}.t-XoWW_detailTabsBar{height:44px;min-height:44px;padding:0 var(--detail-gutter);border-bottom:.5px solid var(--dsw-alias-border-l3);flex-shrink:0;justify-content:space-between;align-items:center;gap:20px;display:flex}.t-XoWW_detailTabs{scrollbar-width:none;flex:auto;align-self:flex-end;gap:36px;min-width:0;margin-bottom:-1px;padding-bottom:1px;display:flex;overflow-x:auto}.t-XoWW_detailTabs::-webkit-scrollbar{display:none}.t-XoWW_detailActions{flex:none;align-items:center;margin-right:-8px}.t-XoWW_detailIconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);flex:none;padding:0}.t-XoWW_detailTab{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;flex:none;padding:0 0 13px;font-size:13px;font-weight:500;line-height:16px;position:relative}.t-XoWW_detailTab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:-1px;left:0;right:0}.t-XoWW_detailTab[aria-selected=true]{color:var(--dsw-alias-state-business-primary)}.t-XoWW_detailTab[aria-selected=true]:after{background:var(--dsw-alias-state-business-primary)}.t-XoWW_detailScroll{min-height:0;padding:24px var(--detail-gutter) 28px;scrollbar-gutter:stable;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px;flex:1;overflow:auto}.t-XoWW_detailRecords{scrollbar-gutter:auto;flex-direction:column;padding:0;display:flex;overflow:hidden}.t-XoWW_detailRecords>.t-XoWW_notice{margin:24px var(--detail-gutter) 0}.t-XoWW_recordsPanel:not([hidden]),.t-XoWW_deliveryHistory{flex-direction:column;flex:1;min-height:0;display:flex}.t-XoWW_retentionEnd{padding:0 var(--detail-gutter) 16px;color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:20px}.t-XoWW_retentionLine{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.t-XoWW_retentionInfo{width:24px;height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:5px;display:inline-flex}.t-XoWW_retentionInfo:hover{color:var(--dsw-alias-label-primary)}.t-XoWW_retentionInfo:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.t-XoWW_retentionRule{background:var(--dsw-alias-bg-layer-1);border-radius:8px;margin-top:12px;padding:12px 14px}.t-XoWW_retentionRule p{margin:0}.t-XoWW_retentionRule p+p{margin-top:6px}.t-XoWW_ruleCard{margin-top:28px}.t-XoWW_ruleCard h3{color:var(--dsw-alias-label-tertiary);margin:0 0 8px 10px;font-size:13px;font-weight:400;line-height:20px}.t-XoWW_ruleRows{border:.5px solid var(--dsw-alias-border-l3);border-radius:16px;flex-direction:column;padding:0 12px;display:flex}.t-XoWW_menuGuard{display:contents}.t-XoWW_zoneMenu.t-XoWW_zoneMenu{height:min(420px,100dvh - 48px);max-height:min(420px,100dvh - 48px)}.t-XoWW_zoneMenu [role=separator]{background:var(--dsw-alias-border-l3);height:.5px;margin:6px 4px}.t-XoWW_ruleRow,.t-XoWW_ruleRowMenu{border-bottom:.5px solid var(--dsw-alias-border-l3);width:100%;display:flex}.t-XoWW_ruleRow{justify-content:space-between;align-items:center;gap:12px;min-height:48px}.t-XoWW_ruleRows>:last-child,.t-XoWW_ruleRows>:last-child>.t-XoWW_ruleRowMenu{border-bottom:0}.t-XoWW_ruleLabel{color:var(--dsw-alias-label-primary);flex:none;font-size:14px;line-height:1.6}.t-XoWW_ruleControl{margin-right:0}.t-XoWW_ruleRows .t-XoWW_ruleControl:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.t-XoWW_ruleValue{width:100%;min-height:48px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;justify-content:space-between;align-items:center;gap:12px;margin:0;padding:0;font-size:14px;line-height:1.6;display:flex}.t-XoWW_ruleValueFace{border-radius:18px;flex:0 auto;align-items:center;gap:6px;min-width:0;min-height:32px;padding:0 8px;transition:background .15s;display:flex}.t-XoWW_ruleValue:not(:disabled):hover .t-XoWW_ruleValueFace{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_ruleRows .t-XoWW_ruleValue:focus-visible{outline:none}.t-XoWW_ruleValue:focus-visible .t-XoWW_ruleValueFace{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.t-XoWW_ruleValueFace>svg{color:var(--dsw-alias-label-tertiary);flex:none}.t-XoWW_ruleValue:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.t-XoWW_ruleCurrent{text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;overflow:hidden}.t-XoWW_zoneSearch{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:7px;outline:none;padding:6px 8px;font-size:13px;line-height:20px}.t-XoWW_zoneSearch:focus{border-color:var(--dsw-alias-state-business-primary)}.t-XoWW_ruleWeekdays{flex-wrap:wrap;justify-content:flex-end;gap:4px;padding:6px 0;display:flex}.t-XoWW_ruleMonthDays{grid-template-columns:repeat(7,minmax(36px,max-content));justify-content:flex-end;gap:4px;padding:6px 0;display:grid}.t-XoWW_ruleMonthDays>*{justify-content:center;justify-self:stretch}.t-XoWW_ruleInput{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:right;background:0 0;border:none;border-radius:18px;flex:0 58%;margin-right:0;padding:5px 8px;font-size:14px;transition:background .15s}.t-XoWW_ruleInput:not(:disabled):hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_ruleInput:disabled{color:var(--dsw-alias-label-tertiary)}.t-XoWW_ruleInterval{flex:none;align-items:center;gap:8px;min-width:0;display:flex}.t-XoWW_ruleIntervalStepper{background:var(--dsw-alias-bg-module-platform);border-radius:18px;justify-content:center;align-items:center;min-width:72px;height:36px;display:inline-flex;position:relative}.t-XoWW_ruleIntervalInput{box-sizing:border-box;width:calc(var(--interval-digits,1) * 1ch + 52px);appearance:textfield;border-radius:inherit;font-variant-numeric:tabular-nums;text-align:center;flex:0 auto;min-width:72px;height:100%;padding:0 26px}.t-XoWW_ruleIntervalInput::-webkit-outer-spin-button,.t-XoWW_ruleIntervalInput::-webkit-inner-spin-button{appearance:none;margin:0}.t-XoWW_ruleIntervalInput:not(:disabled):hover{background:0 0}.t-XoWW_ruleRows .t-XoWW_ruleIntervalInput:focus-visible{outline:none}.t-XoWW_ruleIntervalArrows{opacity:0;flex-direction:column;gap:2px;display:flex;position:absolute;right:8px}.t-XoWW_ruleIntervalStepper:hover .t-XoWW_ruleIntervalArrows,.t-XoWW_ruleIntervalStepper:focus-within .t-XoWW_ruleIntervalArrows{opacity:1}.t-XoWW_ruleIntervalArrow{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 75%, transparent);width:17px;height:12px;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:3px;justify-content:center;align-items:center;padding:0;display:inline-flex}.t-XoWW_ruleIntervalArrow:hover:not(:disabled){background:var(--dsw-alias-bg-layer-1)}.t-XoWW_ruleIntervalArrow:disabled{color:var(--dsw-alias-label-caption);cursor:default}.t-XoWW_ruleIntervalUnit{color:var(--dsw-alias-label-primary);flex:none;font-size:14px}.t-XoWW_pickerTrigger{cursor:pointer;flex:0 auto;justify-content:flex-end;align-items:center;gap:6px;display:inline-flex}.t-XoWW_pickerTrigger:disabled{cursor:default}.t-XoWW_pickerIcon{color:var(--dsw-alias-label-tertiary);flex:none}.t-XoWW_ruleHint{color:var(--dsw-alias-label-tertiary);margin:8px 0 0 10px;font-size:13px;line-height:1.6}.t-XoWW_ruleHintError{color:var(--dsw-alias-state-error-primary)}.t-XoWW_instruction{box-sizing:border-box;field-sizing:content;border:.5px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-base);width:100%;max-width:100%;min-height:112px;max-height:160px;color:var(--dsw-alias-label-primary);font:inherit;resize:none;--dsh-scrollbar-width:9px;--dsh-scrollbar-thumb-border:2px;--dsh-scrollbar-track-margin:12px;border-radius:16px;outline:0;margin:0;padding:12px;font-size:14px;line-height:24px;transition:border-color .15s;display:block}.t-XoWW_instruction:hover{border-color:var(--dsw-alias-border-l2)}.t-XoWW_instruction:focus{border-color:var(--dsw-alias-state-business-primary)}.t-XoWW_readonlyPrompt{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:14px;line-height:24px}.t-XoWW_delivery{border-radius:8px;align-items:flex-start;gap:12px;margin:0 -8px;padding:14px 8px;font-size:14px;line-height:22px;display:flex;position:relative}.t-XoWW_delivery:first-of-type{padding-top:0}.t-XoWW_delivery:before,.t-XoWW_delivery:after{background:var(--dsw-alias-border-l3);width:.5px;position:absolute;left:15.75px}.t-XoWW_delivery:not(:first-of-type):before{content:\"\";height:14px;top:0}.t-XoWW_delivery:not(:last-of-type):after{content:\"\";top:42px;bottom:0}.t-XoWW_delivery:first-of-type:not(:last-of-type):after{top:28px}.t-XoWW_deliveryGlyph{color:var(--dsw-alias-label-tertiary);flex:none;margin-top:6px}.t-XoWW_deliveryBody{flex:1;min-width:0;padding:2px 0}.t-XoWW_deliveryHead{align-items:center;gap:10px;display:flex}.t-XoWW_deliveryTime{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:22px;display:block}.t-XoWW_confirmTitle{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.t-XoWW_savedPrompt{-webkit-line-clamp:2;line-clamp:2;color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;-webkit-box-orient:vertical;margin:6px 0 0;font-size:13px;line-height:22px;display:-webkit-box;overflow:hidden}.t-XoWW_savedPrompt[data-expanded]{-webkit-line-clamp:none;line-clamp:none;display:block}.t-XoWW_savedPromptToggle{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:2px;margin:2px 0 0 -6px;padding:1px 6px;font-size:12px;line-height:20px;display:inline-flex}.t-XoWW_savedPromptToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.t-XoWW_savedPromptToggle:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.t-XoWW_detailActions,.t-XoWW_confirmActions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.t-XoWW_detailHeader{flex-shrink:0}.t-XoWW_detailContext{flex:none;align-items:center;min-width:0;max-width:200px;display:flex}.t-XoWW_detailContext:has(>button:disabled){cursor:not-allowed}.t-XoWW_detailContext>button:disabled{pointer-events:none}.t-XoWW_saveFooter{padding:20px var(--detail-gutter);border-top:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-base);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;display:flex}.t-XoWW_saveFooter>button{height:32px;font-size:13px}.t-XoWW_saveFooter>:last-child{margin-right:-8px}.t-XoWW_saveNotice{color:var(--dsw-alias-label-tertiary);margin-right:auto;font-size:12px}.t-XoWW_saveFailure{padding:12px var(--detail-gutter) 0;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-state-error-primary);flex-shrink:0;margin:0;font-size:12px;line-height:1.6}.t-XoWW_linkedSession{text-align:left;border:0;border-radius:14px;flex:0 auto;align-items:center;gap:6px;min-width:0;max-width:100%;height:28px;padding:0 8px;display:flex}.t-XoWW_linkedSession:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.t-XoWW_detailNotice{padding:0 var(--detail-gutter) 6px;color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;background:var(--dsw-alias-bg-base);flex-shrink:0;margin:0;font-size:12px}.t-XoWW_linkedSessionLabel{color:var(--dsw-alias-label-secondary);flex-shrink:0;font-size:13px}.t-XoWW_linkedSessionTarget{justify-content:flex-end;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.t-XoWW_linkedSessionName{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;font-size:12px;position:absolute;overflow:hidden}.t-XoWW_confirmDialog{box-sizing:border-box;max-height:calc(100dvh - 48px)}.t-XoWW_confirmContent{overscroll-behavior:contain;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);min-height:0;overflow-y:auto}.t-XoWW_confirmDialog>:last-child{flex-shrink:0}.t-XoWW_deleteButton{color:var(--dsw-alias-state-error-primary)}.t-XoWW_page :focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}.t-XoWW_page .t-XoWW_editName:focus-visible,.t-XoWW_page .t-XoWW_instruction:focus-visible{outline:none}@media (width<=1100px){.t-XoWW_detail{--detail-gutter:20px}}@media (width<=760px){.t-XoWW_hasDetails .t-XoWW_listPane{display:none}.t-XoWW_detail{border-left:0;flex-basis:100%}.t-XoWW_detailScroll{padding-top:20px}.t-XoWW_saveNotice{display:none}}@media (width<=400px){.t-XoWW_detail{--detail-gutter:16px}.t-XoWW_detailTabsBar{gap:16px}.t-XoWW_detailActions{gap:0}}";
1802
2434
  const tagId$5 = "@deepseek-ai/dsh-client-ui-schedule/TaskManagerPage.module.css";
1803
2435
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
1804
2436
  const tag = document.createElement("style");
@@ -2217,6 +2849,7 @@ window.__ModuleLoader__.load({
2217
2849
  case "schedule_conflict": return "timing.conflict";
2218
2850
  case "schedule_ended": return "timing.inactive";
2219
2851
  case "schedule_not_found": return "timing.notFound";
2852
+ case "subagent_session": return "timing.subagentSession";
2220
2853
  case "invalid_time_zone": return "timing.invalidZone";
2221
2854
  case "not_future": return "timing.notFuture";
2222
2855
  case "frequency_too_high": return "timing.invalidInterval";
@@ -3567,6 +4200,47 @@ window.__ModuleLoader__.load({
3567
4200
  const sessionLink = sessionLinkState(task.sessionId, sessions, workspaces);
3568
4201
  const linkedSession = sessionLabel(task.sessionId, sessions);
3569
4202
  const sessionNotice = sessionLink === "available" ? void 0 : t(sessionLinkMessages[sessionLink]);
4203
+ const linkedShown = tab === "rule" && withinSession !== task.sessionId;
4204
+ const linkedText = t("detail.session");
4205
+ const [linkedCompact, setLinkedCompact] = (0, react.useState)(false);
4206
+ const linkedRef = (0, react.useRef)(null);
4207
+ const linkedExpanded = (0, react.useRef)(void 0);
4208
+ const linkedAction = linkedSession.titled ? t("detail.openSessionTitle", { title: linkedSession.text }) : t("detail.openSession");
4209
+ const linkedName = (0, react_jsx_runtime.jsx)("span", {
4210
+ id: `${id}-session`,
4211
+ className: TaskManagerPage_module_css_default.linkedSessionName,
4212
+ children: linkedSession.text
4213
+ });
4214
+ const linkedDescribedBy = `${id}-session${sessionNotice === void 0 ? "" : ` ${id}-session-state`}`;
4215
+ (0, react.useLayoutEffect)(() => {
4216
+ if (!linkedShown) return;
4217
+ const tabs = detailTabsRef.current;
4218
+ const linked = linkedRef.current;
4219
+ const measure = () => {
4220
+ const width = linked.getBoundingClientRect().width;
4221
+ if (!linkedCompact) linkedExpanded.current = {
4222
+ label: linkedText,
4223
+ width
4224
+ };
4225
+ const expanded = linkedExpanded.current;
4226
+ if (expanded.label !== linkedText) {
4227
+ setLinkedCompact(false);
4228
+ return;
4229
+ }
4230
+ setLinkedCompact(tabs.lastElementChild.getBoundingClientRect().right - tabs.firstElementChild.getBoundingClientRect().left > tabs.clientWidth - (expanded.width - width) - (linkedCompact ? 1 : 0));
4231
+ };
4232
+ measure();
4233
+ const observer = new ResizeObserver(measure);
4234
+ observer.observe(tabs);
4235
+ for (const tab of tabs.children) observer.observe(tab);
4236
+ return () => {
4237
+ observer.disconnect();
4238
+ };
4239
+ }, [
4240
+ linkedShown,
4241
+ linkedCompact,
4242
+ linkedText
4243
+ ]);
3570
4244
  const taskIdentity = `${task.sessionId}\u0000${task.id}`;
3571
4245
  const [edit, setEdit] = (0, react.useState)(() => initialRuleEdit(task));
3572
4246
  const [intervalUnit, setIntervalUnit] = (0, react.useState)(() => preferredIntervalUnit(edit.shown.draft.seconds));
@@ -3884,28 +4558,32 @@ window.__ModuleLoader__.load({
3884
4558
  }), (0, react_jsx_runtime.jsxs)("div", {
3885
4559
  className: TaskManagerPage_module_css_default.detailActions,
3886
4560
  children: [
3887
- tab === "rule" && withinSession !== task.sessionId && (0, react_jsx_runtime.jsx)("span", {
3888
- className: TaskManagerPage_module_css_default.detailContext,
3889
- children: (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Button, {
3890
- className: TaskManagerPage_module_css_default.linkedSession,
3891
- title: linkedSession.titled ? linkedSession.text : task.sessionId,
3892
- "aria-label": linkedSession.titled ? t("detail.openSessionTitle", { title: linkedSession.text }) : t("detail.openSession"),
3893
- "aria-describedby": `${id}-session${sessionNotice === void 0 ? "" : ` ${id}-session-state`}`,
3894
- disabled: sessionLink !== "available",
3895
- onClick: () => {
3896
- onOpenSession(task.sessionId);
3897
- },
3898
- children: [(0, react_jsx_runtime.jsx)("span", {
3899
- className: TaskManagerPage_module_css_default.linkedSessionLabel,
3900
- children: t("detail.session")
3901
- }), (0, react_jsx_runtime.jsxs)("span", {
3902
- className: TaskManagerPage_module_css_default.linkedSessionTarget,
3903
- children: [(0, react_jsx_runtime.jsx)("span", {
3904
- id: `${id}-session`,
3905
- className: TaskManagerPage_module_css_default.linkedSessionName,
3906
- children: linkedSession.text
3907
- }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutlineRegular, {})]
3908
- })]
4561
+ linkedShown && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
4562
+ label: linkedText,
4563
+ side: "bottom",
4564
+ portal: true,
4565
+ disabled: !linkedCompact,
4566
+ children: (0, react_jsx_runtime.jsx)("span", {
4567
+ ref: linkedRef,
4568
+ className: TaskManagerPage_module_css_default.detailContext,
4569
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
4570
+ size: linkedCompact ? "sm" : "md",
4571
+ className: linkedCompact ? TaskManagerPage_module_css_default.detailIconButton : TaskManagerPage_module_css_default.linkedSession,
4572
+ title: linkedCompact ? void 0 : linkedSession.titled ? linkedSession.text : task.sessionId,
4573
+ "aria-label": linkedAction,
4574
+ "aria-describedby": linkedDescribedBy,
4575
+ disabled: sessionLink !== "available",
4576
+ onClick: () => {
4577
+ onOpenSession(task.sessionId);
4578
+ },
4579
+ children: linkedCompact ? (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.ReferenceIconRegular, { kind: "session" }), linkedName] }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("span", {
4580
+ className: TaskManagerPage_module_css_default.linkedSessionLabel,
4581
+ children: linkedText
4582
+ }), (0, react_jsx_runtime.jsxs)("span", {
4583
+ className: TaskManagerPage_module_css_default.linkedSessionTarget,
4584
+ children: [linkedName, (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutlineRegular, {})]
4585
+ })] })
4586
+ })
3909
4587
  })
3910
4588
  }),
3911
4589
  (0, react_jsx_runtime.jsx)("span", {
@@ -5778,7 +6456,7 @@ window.__ModuleLoader__.load({
5778
6456
  onClick: (event) => {
5779
6457
  event.stopPropagation();
5780
6458
  },
5781
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconClockOutlineRegular, { size: 12 }), (0, react_jsx_runtime.jsx)("span", {
6459
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconClockOutlineRegular, { size: 14 }), (0, react_jsx_runtime.jsx)("span", {
5782
6460
  className: SessionScheduleMark_module_css_default.visuallyHidden,
5783
6461
  children: t("mark.aria", { count: facts.records.length })
5784
6462
  })]
@@ -6401,7 +7079,7 @@ window.__ModuleLoader__.load({
6401
7079
  "detail.nextRun": "Next run",
6402
7080
  "detail.tabs": "Task detail views",
6403
7081
  "detail.rule": "Rules",
6404
- "detail.records": "Delivery records",
7082
+ "detail.records": "Records",
6405
7083
  "delivery.empty": "No delivery record available",
6406
7084
  "delivery.loading": "Loading delivery records…",
6407
7085
  "delivery.error": "Could not load delivery records.",
@@ -6456,6 +7134,7 @@ window.__ModuleLoader__.load({
6456
7134
  "timing.inactive": "Inactive tasks are read-only. Their timing cannot be edited.",
6457
7135
  "timing.conflict": "This task changed while you were editing. Your draft is retained. Cancel and reopen after refresh to edit the latest rule.",
6458
7136
  "timing.notFound": "This task is no longer available. Your draft is retained; cancel to close the editor.",
7137
+ "timing.subagentSession": "This session belongs to a sub-agent, which never receives delivered reminders.",
6459
7138
  "timing.invalid": "Enter a valid date and time, or check the timing fields.",
6460
7139
  "timing.invalidZone": "Enter a valid IANA time zone, for example Asia/Shanghai.",
6461
7140
  "timing.notFuture": "Choose a date and time in the future.",
@@ -6593,6 +7272,7 @@ window.__ModuleLoader__.load({
6593
7272
  "timing.inactive": "已结束的任务为只读,无法修改时间",
6594
7273
  "timing.conflict": "编辑期间任务已变化,草稿已保留。请在刷新后取消并重新打开编辑器,以修改最新规则",
6595
7274
  "timing.notFound": "此任务当前不可用,草稿已保留。请取消以关闭编辑器",
7275
+ "timing.subagentSession": "此会话属于子 agent,永远不会收到投递的提醒",
6596
7276
  "timing.invalid": "请输入有效的日期和时间,或检查时间字段",
6597
7277
  "timing.invalidZone": "请输入有效的 IANA 时区,例如 Asia/Shanghai",
6598
7278
  "timing.notFuture": "请选择未来的日期和时间",
@@ -23,6 +23,7 @@ export declare const en: {
23
23
  readonly 'timing.inactive': "Inactive tasks are read-only. Their timing cannot be edited.";
24
24
  readonly 'timing.conflict': string;
25
25
  readonly 'timing.notFound': "This task is no longer available. Your draft is retained; cancel to close the editor.";
26
+ readonly 'timing.subagentSession': "This session belongs to a sub-agent, which never receives delivered reminders.";
26
27
  readonly 'timing.invalid': "Enter a valid date and time, or check the timing fields.";
27
28
  readonly 'timing.invalidZone': "Enter a valid IANA time zone, for example Asia/Shanghai.";
28
29
  readonly 'timing.notFuture': "Choose a date and time in the future.";
@@ -156,7 +157,7 @@ export declare const en: {
156
157
  readonly 'detail.nextRun': "Next run";
157
158
  readonly 'detail.tabs': "Task detail views";
158
159
  readonly 'detail.rule': "Rules";
159
- readonly 'detail.records': "Delivery records";
160
+ readonly 'detail.records': "Records";
160
161
  readonly 'delivery.empty': "No delivery record available";
161
162
  readonly 'delivery.loading': "Loading delivery records…";
162
163
  readonly 'delivery.error': "Could not load delivery records.";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-schedule",
3
3
  "description": "Host task management page and Session reminder catalog",
4
- "version": "0.2.0-rc.2",
4
+ "version": "0.2.1-alpha.1",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/types/index.d.ts",
@@ -47,7 +47,7 @@
47
47
  "access": "public"
48
48
  },
49
49
  "peerDependencies": {
50
- "@deepseek-ai/cordis": "~4.0.4"
50
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@testing-library/react": "^16.1.0",
@@ -56,26 +56,26 @@
56
56
  "clsx": "^2.1.1",
57
57
  "react": "^18.2.0",
58
58
  "react-dom": "^18.2.0",
59
- "@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2",
60
- "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
61
- "@deepseek-ai/dsh-api-workspace-controller": "0.2.0-rc.2",
62
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
63
- "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
64
- "@deepseek-ai/dsh-client-test-runtime": "0.2.0-rc.2",
65
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
66
- "@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2",
67
- "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
68
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
69
- "@deepseek-ai/dsh-client-ui-sidebar": "0.2.0-rc.2",
70
- "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.0-rc.2",
71
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
72
- "@deepseek-ai/dsh-client-ui-tool": "0.2.0-rc.2",
73
- "@deepseek-ai/dsh-schedule": "0.2.0-rc.2",
74
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
75
- "@deepseek-ai/dsh-util-values": "0.2.0-rc.2",
76
- "@deepseek-ai/cordis": "~4.0.4",
77
- "@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
78
- "@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2"
59
+ "@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.1",
60
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-alpha.1",
61
+ "@deepseek-ai/dsh-api-workspace-controller": "0.2.1-alpha.1",
62
+ "@deepseek-ai/dsh-client-connection": "0.2.1-alpha.1",
63
+ "@deepseek-ai/dsh-client-locale": "0.2.1-alpha.1",
64
+ "@deepseek-ai/dsh-client-test-runtime": "0.2.1-alpha.1",
65
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-alpha.1",
66
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.1-alpha.1",
67
+ "@deepseek-ai/dsh-client-ui-session": "0.2.1-alpha.1",
68
+ "@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-alpha.1",
69
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.1-alpha.1",
70
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.1",
71
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.1",
72
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-alpha.1",
73
+ "@deepseek-ai/dsh-client-ui-workspace": "0.2.1-alpha.1",
74
+ "@deepseek-ai/dsh-schedule": "0.2.1-alpha.1",
75
+ "@deepseek-ai/dsh-session": "0.2.1-alpha.1",
76
+ "@deepseek-ai/dsh-util-values": "0.2.1-alpha.1",
77
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1",
78
+ "@deepseek-ai/dsh-client-ui-tool": "0.2.1-alpha.1"
79
79
  },
80
80
  "files": [
81
81
  "locale/*.json",