@deepseek-ai/dsh-client-ui-schedule 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/README.i18n.yaml +39 -5
- package/README.md +36 -39
- package/README.zh.md +42 -45
- package/lib/client.js +6735 -171
- package/lib/index.js +1 -1
- package/lib/types/client/CalendarIcon.d.ts +17 -0
- package/lib/types/client/CatalogFeedback.d.ts +28 -0
- package/lib/types/client/ClockPicker.d.ts +33 -0
- package/lib/types/client/DatePicker.d.ts +27 -0
- package/lib/types/client/DeleteToast.d.ts +47 -0
- package/lib/types/client/DeliveryHistory.d.ts +29 -0
- package/lib/types/client/PickerPopover.d.ts +27 -0
- package/lib/types/client/ScheduleCatalogAction.d.ts +12 -13
- package/lib/types/client/ScheduleCreateCard.d.ts +37 -0
- package/lib/types/client/ScheduleTaskTab.d.ts +36 -0
- package/lib/types/client/ScheduleTaskTabTitle.d.ts +21 -0
- package/lib/types/client/ScheduleTurnCard.d.ts +25 -0
- package/lib/types/client/SessionScheduleHover.d.ts +34 -0
- package/lib/types/client/SessionScheduleMark.d.ts +31 -0
- package/lib/types/client/TaskDetail.d.ts +158 -0
- package/lib/types/client/TaskManagerIcon.d.ts +11 -0
- package/lib/types/client/TaskManagerPage.d.ts +25 -0
- package/lib/types/client/TaskMenu.d.ts +76 -0
- package/lib/types/client/catalog-source.d.ts +91 -0
- package/lib/types/client/definition.d.ts +40 -0
- package/lib/types/client/frequency-locales.d.ts +71 -0
- package/lib/types/client/index.d.ts +40 -4
- package/lib/types/client/locales.d.ts +59 -8
- package/lib/types/client/recent-time-zones.d.ts +15 -0
- package/lib/types/client/relative-clock.d.ts +26 -0
- package/lib/types/client/schedule-create-card.d.ts +46 -0
- package/lib/types/client/schedule-format.d.ts +177 -0
- package/lib/types/client/schedule-turn.d.ts +63 -0
- package/lib/types/client/session-link.d.ts +41 -0
- package/lib/types/client/session-schedule-state.d.ts +62 -0
- package/lib/types/client/task-cron.d.ts +116 -0
- package/lib/types/client/task-manager-locales.d.ts +195 -0
- package/lib/types/client/task-tab-bindings.d.ts +114 -0
- package/lib/types/client/task-tab-target.d.ts +31 -0
- package/lib/types/client/task-timing.d.ts +96 -0
- package/lib/types/index.d.ts +1 -1
- package/package.json +31 -12
package/README.i18n.yaml
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
|
-
# Bilingual-pair consistency record (docs/i18n/README.md):
|
|
2
|
-
#
|
|
3
|
-
#
|
|
1
|
+
# Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
|
|
2
|
+
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
|
|
3
|
+
# After editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/client/ui-schedule/README.md
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/:
|
|
6
|
+
en: 265778d19fe0dd76
|
|
7
|
+
zh: 78b0a191a4bd4e4e
|
|
8
|
+
/deepseek-ai-dsh-client-ui-schedule:
|
|
9
|
+
en: 862120984d5392eb
|
|
10
|
+
zh: eb3e5d5a802da592
|
|
11
|
+
/deepseek-ai-dsh-client-ui-schedule/summary:
|
|
12
|
+
en: 8dfc371c14bb4415
|
|
13
|
+
zh: 9b3545c1a7468a7a
|
|
14
|
+
/deepseek-ai-dsh-client-ui-schedule/table-of-contents:
|
|
15
|
+
en: d152484eb41ac6b4
|
|
16
|
+
zh: 405b30feaf48c087
|
|
17
|
+
/deepseek-ai-dsh-client-ui-schedule/use-this-package:
|
|
18
|
+
en: 3594ab6704cbd7b9
|
|
19
|
+
zh: 99a965f43187501b
|
|
20
|
+
/deepseek-ai-dsh-client-ui-schedule/use-this-package/time-zone-data-source:
|
|
21
|
+
en: 6bd6882dbbbefcb0
|
|
22
|
+
zh: 03aa15f1a65d13dc
|
|
23
|
+
/deepseek-ai-dsh-client-ui-schedule/understand-the-implementation:
|
|
24
|
+
en: f863859edc1cb0f7
|
|
25
|
+
zh: 2bf04cdd1f17bb18
|
|
26
|
+
/deepseek-ai-dsh-client-ui-schedule/further-exploration:
|
|
27
|
+
en: 06e265120b05dbf5
|
|
28
|
+
zh: 08ab1ef979b8ea40
|
|
29
|
+
/deepseek-ai-dsh-client-ui-schedule/model-experience:
|
|
30
|
+
en: a8838aba5fd29fd8
|
|
31
|
+
zh: b9f67d82c81dd030
|
|
32
|
+
/deepseek-ai-dsh-client-ui-schedule/model-experience/kv-cache-effect:
|
|
33
|
+
en: 4b81350950285d47
|
|
34
|
+
zh: 6dc3d5cf7ca8a622
|
|
35
|
+
/deepseek-ai-dsh-client-ui-schedule/known-limitations-and-deferred-work:
|
|
36
|
+
en: ce8cd6e03f4763ae
|
|
37
|
+
zh: 65ad26aad74d83ca
|
|
38
|
+
/deepseek-ai-dsh-client-ui-schedule/known-limitations-and-deferred-work/dev-note:
|
|
39
|
+
en: e67f633dc6fe7773
|
|
40
|
+
zh: a4b126f9a4eaca6f
|
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "Web task management across Sessions and a current-Session reminder catalog."
|
|
3
3
|
kind: "package-reference"
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
|
|
9
9
|
|
|
10
10
|
## Summary
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Manage active and inactive tasks from the Automation tasks page and the right Sidebar task tab: search, filter, edit name, instruction, and run time, browse records, delete, or open the original conversation. Every surface names a task by its title. An open Session's header shows an icon-only reminder clock while active reminders exist and opens that task's detail; a `schedule_create` call renders a transcript card; an idle, unarchived Session row with active tasks shows a clock mark and hover list.
|
|
13
13
|
|
|
14
14
|
## Table of Contents
|
|
15
15
|
|
|
@@ -25,78 +25,75 @@ This package renders a read-only catalog of the current Session's active Schedul
|
|
|
25
25
|
<a id="use-this-package"></a>
|
|
26
26
|
## Use this package
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
The shipped Web bundle mounts `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.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
dsh web --patch apps/cli/config/examples/schedule/cordis.yml
|
|
32
|
-
```
|
|
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.
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
Rules shows the rule in a Run time card whose rows edit a local draft: Repeat is a menu of Weekly, Monday to Friday, Every day, Every N hours, Every N minutes, Every N seconds, Once, and Custom (cron), a weekly rule adds a Weekday row, a fixed-rate choice edits only the interval quantity in the unit it names, a one-shot rule edits separate Date and Time rows, and Custom (cron) edits one Cron expression row holding a five-field expression, interpreted in the selected time zone. The card parses that expression in the browser and, under the row, shows a localized sentence describing it; an expression the Host would reject shows the localized validation message in place of that sentence and blocks Save. A stored weekly rule whose weekday set is exactly Monday through Friday selects the Monday to Friday choice. The Date row is a read-only trigger showing the staged date as `YYYY/MM/DD` and opening a month calendar with localized weekday headings, month navigation, and a marked today; the draft and the submitted text keep the ISO form; the Time row is a read-only trigger showing one 24-hour clock and opening three scrolling columns of hours, minutes, and seconds with the staged value marked and scrolled into view. A calendar or clock pick stages the draft under the same staged save as every other row, arrow keys walk the open column or grid, Enter stages the marked value, Escape closes the panel and returns focus to its row, and a disabled row cannot open one. Clock rows show whole seconds, an untouched row keeps a stored millisecond value for its submit, and editing a time submits whole-second precision. Time zone is a searchable, height-bounded menu. An unlabeled top block keeps the five most recently selected exact zones in browser-local storage; first use seeds the actual system zone and UTC rather than inferring a location from UI language. The system zone is marked, and the remaining inventory is ordered by current UTC offset and canonical IANA id. Each visible label puts `UTC±HH:MM` before the localized zone name; canonical ids stay internal but remain searchable. Zones that ICU renders with the same offset and localized name share one visible row; every grouped id remains searchable, and an already stored id remains selected instead of being rewritten. The inventory comes from `Intl.supportedValuesOf('timeZone')`, and names come from `Intl.DateTimeFormat(..., { timeZoneName: 'longGeneric' })`: both are browser ICU/CLDR data, not a scraped or product-maintained translation table. There is therefore no crawler or generated zone-name resource to refresh. A third-party locale supplies its ordinary `time.locale` value and automatically receives the corresponding ICU names; only the selector's surrounding UI copy needs translation. When the runtime cannot enumerate zones, a short identifier fallback is offered, and a stored zone outside the offered set is kept. Daily, Weekly, and Cron keep their stored rule and IANA zone, and each frequency line names the zone only when it differs from the host's system zone. A one-shot After/At seeds the date and time from the record's stored zone, or this device's zone when the record stores none, so the seeded clock names the stored instant; changing that zone keeps the entered clock values and changes the instant. A kind the card seeds on selection uses the committed occurrence's clock and the choice's zone, which is the record's stored zone or this device's zone, a seeded weekly rule starts from that occurrence's weekday in that zone, and a seeded cron rule states that occurrence's clock as a daily expression. Every accepts at least 60 whole seconds, independent of time zones. One Save submits the complete expected record with the staged change and preserves the id, original Session, latest receipt, and saved history; [Schedule](../../schedule/schedule/README.md#use-this-package) defines future-target selection, reanchoring, and unchanged-rule no-ops.
|
|
35
33
|
|
|
36
|
-
|
|
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.
|
|
37
35
|
|
|
38
|
-
|
|
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.
|
|
39
37
|
|
|
40
|
-
|
|
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
|
+
|
|
40
|
+
A successful empty history page is distinct from loading, query failure, a missing task, or an invalid cursor. Failed requests retain previously loaded records with a warning and Retry delivery records; an invalid cursor offers Refresh delivery records to reload the newest page. Changing the latest `messageId` refreshes the newest page without switching tabs. Responses superseded by a refresh or received after changing tasks, leaving Records, or closing details do not replace the current view.
|
|
41
|
+
|
|
42
|
+
The Automation tasks page requires confirmation before deleting a task. Deletion is hard: the Host removes the stored task row together with its saved delivery records, so the task stops future delivery, leaves `list` and `catalog`, and its delivery history is no longer readable. Deletion leaves the original Session and queued messages intact, and the list keeps the row visible only until an authoritative query confirms the removal. Every deletion path — the Tasks page detail, the Session task tab, and the header popover — reports its settled outcome into one store that the app-wide `shell.overlay` notice renders, so the outcome outlives the panel or tab that asked for it: the notice reads `Task deleted.` once the Host removed the row with its saved delivery records, and `Could not delete the task.` after a failure, which leaves the rule in place to retry. Confirming a deletion closes the detail or the tab it was confirmed from, and each notice is keyed by its own sequence so a later one restarts the banner instead of being folded into an earlier one. A query failure keeps the last known records and shows a separate Retry action; it never appears as an empty successful result. A one-shot remains stored as inactive after durable inbox delivery. Its details and original Session id remain available through the All or Inactive filter until explicit deletion. The latest delivery shows its occurrence time; the message id and delivery acknowledgment time are not shown. Neither inactive status nor that receipt means model execution completed.
|
|
43
|
+
|
|
44
|
+
An open Session renders an icon-only clock button among its header's right-aligned utilities, immediately left of the overflow menu, only once it has something to open: the first read mounts nothing, a read that returns no active reminder leaves the header without the button, a refresh keeps the last known reminders visible, and a failed read keeps the button with its retry. That rule prevents the clock from appearing and disappearing around the first answer. Its accessible name states the reminder count when the read is ready and the generic reminder label otherwise. With exactly one active reminder, the button opens that task's detail in the right Sidebar directly. With any other count it opens a popover that lists overdue reminders first, then future reminders by target time, with stored title, frequency, browser-local target time, relative time, and a Delete button; the title is a button that opens that task's detail in the right Sidebar. The task tab names the shown task's stored title on its chip and carries the same rule, delivery records, name, instruction, and run-time editing, confirmed deletion, and original-Session link as the Automation tasks page; it never activates a Session. Daily frequency text retains the saved local time and zone, and every next-target instant is shown as a device-zone clock with its relative duration in parentheses; the rule's own zone appears only in that frequency text. Escape closes the popover and returns focus to the button; an outside pointer press dismisses it. Deleting the final reminder removes the button, and an already open popover stays expandable until then.
|
|
45
|
+
|
|
46
|
+
The popover is body-portaled and targets 336px, sharing the trigger left edge when space permits and shifting left to retain a 16px viewport margin when the trigger is near the right edge; its width never exceeds the viewport width minus 32px, and it scrolls vertically when the list overflows. It exposes no task id, raw UTC value, or delivery details; each row carries only its detail opener and its Delete action.
|
|
47
|
+
|
|
48
|
+
Calling `schedule_create` renders the created task in the transcript as a card with a clock icon, its stored title, its frequency, and an Open button that opens that task's right-Sidebar tab. The card first narrows the task out of the call's persisted result JSON and reads its `title` from that result; once a catalog read that succeeded after the card appeared resolves that task, the card follows the catalog for the current name and frequency, and shows its deleted state instead of a frequency when that read lacks the record. A result recorded before the stored field existed falls back to the instruction's first line. A running call, a failed creation, or a result carrying no complete task keeps the row, shows the raw result text when the result is a single non-empty text block, and offers no Open action. The card adds no Host field and no Session-log format change, so Sessions recorded before the card existed render it too.
|
|
49
|
+
|
|
50
|
+
The Sidebar's Session rows mark scheduled Sessions: while a row is idle, unarchived, and its Session has at least one active task, the row shows a clock mark; an archived row keeps that cell blank, with its live status on the hover card only. A long hover on a Session with active tasks adds an automation section inside that row's existing hover card, whether or not the row is idle, listing up to two tasks with their icon, stored title, frequency, and next-run text, and an omission line when further tasks are hidden. A row with a higher-priority state — a pending interaction, live activity, or an unviewed completion — keeps its own dot and renders no mark, so the two never appear together. The mark and the hover section read the shared active and inactive Host task catalog and select their own Session's active tasks from it, so any number of visible rows costs one read; they never activate, retain, or unarchive a Session, and never read a Session log.
|
|
41
51
|
|
|
42
52
|
-----
|
|
43
53
|
|
|
54
|
+
### Time-zone data source
|
|
55
|
+
|
|
56
|
+
Time-zone inventory and localization are offline. `Intl` reads ICU/CLDR tables embedded in the browser runtime and never fetches or downloads zone data while DSH runs. There is no crawler to refresh; a third-party locale supplies `time.locale` and translates only the selector's own UI copy.
|
|
57
|
+
|
|
44
58
|
<a id="understand-the-implementation"></a>
|
|
45
59
|
## Understand the implementation
|
|
46
60
|
|
|
47
61
|
<details>
|
|
48
62
|
<summary>Implementation internals — click to expand</summary>
|
|
49
63
|
|
|
50
|
-
The browser
|
|
64
|
+
The browser entry registers the `schedules` main panel and matching sidebar entry, the `schedule-catalog` entry among the Session header's right-aligned utilities at `order: -5` immediately left of the overflow menu, the `schedule_create` transcript card at the turn level through `ctx.uiConversation.events` and ui-chat's list seat `conversation.chat.turnTail`, so it renders after the turn's closing assistant text and stays visible when the tool-call group is collapsed, the root-scoped Session-row seats `sidebar.session.row.leading` and `sidebar.session.row.hover`, and the right-Sidebar page type `@deepseek-ai/dsh-client-ui-schedule/task` under the kind `scheduleTask`. The type registers in two stages: its definition into `ctx.sidebarRightTabs`, then its body and chip into the keyed `sidebar.right.pane.tab` and `sidebar.right.pane.tab.title` seats under the definition's id. Opening a task from the Session entry calls `ctx.sidebarRight.openTab` with that entry's Session id and the chosen task id, so the detail appears in the Sidebar for the Session the entry belongs to; the Automation tasks page keeps its own list and shares the same detail component. The global page, the tab, the row mark, and the row hover section read active and inactive tasks from one `schedule.catalog` source; the header entry keeps its own per-Session `schedule.list` read, which returns only that Session's active tasks. Every surface uses the same observable query lifecycle and refreshes after `schedule/changed` or connection resets. The transcript card narrows the created task from the call's persisted result JSON rather than a Host-added field; the call's own Tool-group cell stays with ui-tool's generic keyed tool view, and the card appears only for a call that produced a complete task. The reconciliation is causal, never clock-based: a catalog snapshot carries `readRequest` (the ordinal of the newest requested read) and `readSettled` (the ordinal of the read that produced its records); the Turn tail anchors `readRequest` when it mounts and requests one read, uses its retained records only once `readSettled` exceeds that anchor, and the source coalesces the requests of one commit into a single `list()`, sharing that read only with callers that have not already observed it. Comparing the browser's clock with the Host's would not establish that order. The shared delete callback and injected `onUpdateTiming` retain the selected record's original Session binding rather than using the currently open conversation. The detail holds the shown task's local draft, the authoritative values it compares that draft against, and any pending or failed save; the owner retains the task while a save is pending or failed and after a confirmed deletion, so a catalog refresh that drops the row can neither close the surfaced failure nor close the detail that states the deletion. Save submits one `schedule.update` request carrying the complete expected `ScheduleRecord` and the staged change; `onUpdateTiming` refreshes the catalog without turning a readback failure into a mutation failure.
|
|
51
65
|
|
|
52
|
-
|
|
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.
|
|
53
67
|
|
|
54
|
-
|
|
55
|
-
|---|---|
|
|
56
|
-
| [`src/client/index.ts`](src/client/index.ts) | Browser entry: locale registration and Session-header slot contribution |
|
|
57
|
-
| [`src/client/ScheduleCatalogAction.tsx`](src/client/ScheduleCatalogAction.tsx) | Visibility, ordering, formatting, popover, and keyboard behavior |
|
|
58
|
-
| [`src/client/locales.ts`](src/client/locales.ts) | English and Chinese catalog copy |
|
|
59
|
-
| [`src/index.ts`](src/index.ts) | Empty Host apply that keeps the optional browser feature addressable by Loader |
|
|
60
|
-
| — | No runtime invariant companion is published because this read-only client catalog owns no mutable cross-plugin 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 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.
|
|
61
69
|
|
|
62
|
-
|
|
70
|
+
No runtime invariant companion is published because the catalogs render Host-owned task state and own only disposable query and interaction state.
|
|
63
71
|
|
|
64
72
|
</details>
|
|
65
73
|
|
|
66
|
-
-----
|
|
67
|
-
|
|
68
74
|
<a id="further-exploration"></a>
|
|
69
75
|
## Further Exploration
|
|
70
76
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- [Schedule package](../../schedule/schedule/README.md) — creates, lists, cancels, and delivers the reminders shown here.
|
|
74
|
-
- [Schedule subsystem](../../../docs/subsystems/schedule.md) — durable record, transition, and delivery semantics.
|
|
75
|
-
- [Session projections subsystem](../../../docs/subsystems/session-projection.md) — the complete-value transport this package reads.
|
|
76
|
-
- [Client package map](../README.md) — adjacent browser UI packages.
|
|
77
|
-
|
|
78
|
-
-----
|
|
77
|
+
- [Schedule](../../schedule/schedule/README.md) owns persistence, dispatch, and deletion semantics.
|
|
78
|
+
- [Slots](../../../docs/subsystems/slots.md) documents injected hooks and panel contributions.
|
|
79
79
|
|
|
80
80
|
<a id="model-experience"></a>
|
|
81
81
|
## Model Experience
|
|
82
82
|
|
|
83
|
-
None, as this
|
|
83
|
+
None, as this browser UI registers no model-facing tools or messages; Schedule owns reminder delivery.
|
|
84
84
|
|
|
85
85
|
#### KV Cache effect
|
|
86
86
|
|
|
87
|
-
None
|
|
87
|
+
None. Catalog presentation does not enter model requests.
|
|
88
88
|
|
|
89
89
|
## Known Limitations and Deferred Work
|
|
90
90
|
|
|
91
91
|
<a id="known-limitations-and-deferred-work"></a>
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
-
|
|
97
|
-
- **Browser-derived time** — local and relative labels use the viewing browser's current locale, time zone, and clock. They are presentation values, not durable Schedule facts.
|
|
98
|
-
- **Read-only surface** — creating and deleting reminders remain with the Schedule tools; the catalog has no mutation, retry, acknowledgement, toast, or delivery-receipt semantics.
|
|
99
|
-
- **Open Session required** — a failed open hides even a tentative cached value because strict Session replay remains authoritative.
|
|
93
|
+
- Saved records describe inbox delivery, not model execution results. Tasks without saved history expose only their existing receipt until new deliveries append records; unsaved earlier records and prompt snapshots cannot be recovered. Previously physically deleted tasks are not restored.
|
|
94
|
+
- Twenty-record pages bound the number of records requested, not prompt bytes or the storage a task retains. Delivery history is bounded by the Host plugin's configuration: `deliveryHistoryDays` (default 30) and `deliveryHistoryRecords` (default 200), pruned when an acknowledgment is appended, with the latest receipt always kept and a pruned older window reported as unavailable; see [Schedule limits](../../schedule/schedule/README.md#known-limitations-and-deferred-work).
|
|
95
|
+
- Deletion does not cancel a reminder already queued for execution. The linked-Session control in the detail tab strip opens the original conversation through ordinary Session navigation and its recovery policy, not a message-specific jump.
|
|
96
|
+
- Reminder creation remains with the Schedule tools. Name, instruction, and run-time edits are available only in the Rules view of an active task, in the Automation tasks page and in the task tab; pausing and immediate execution are not available, and the Run time card's Repeat menu accepts any choice, including one that changes the stored recurrence kind, in which case the target is recomputed from the new rule. The page's New action starts a Session instead of creating a task in place, and the Session-header popover itself has no run-time editor. The Time zone menu offers the runtime's IANA zone inventory, or a short curated list when the runtime cannot enumerate zones.
|
|
100
97
|
|
|
101
98
|
<a id="dev-note"></a>
|
|
102
99
|
### Dev Note
|
package/README.zh.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "跨会话的 Web 任务管理页面及当前会话的提醒列表。"
|
|
3
3
|
kind: "package-reference"
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -9,15 +9,15 @@ kind: "package-reference"
|
|
|
9
9
|
|
|
10
10
|
## 概述
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
在「自动化任务」页面和右侧栏的任务页签中管理各个会话的活动和未运行定时任务:搜索、筛选、修改名称、指令和运行时间、浏览任务运行记录、删除任务,或打开原会话。每个界面都用任务已存储的标题命名任务。已打开会话在存在活动提醒时,页头显示仅图标的提醒时钟,点击在右侧栏打开该任务详情;`schedule_create` 调用把创建的任务渲染为会话卡片;侧栏中带活动任务的未归档空闲会话行显示时钟标记,其悬停卡片列出这些任务。
|
|
13
13
|
|
|
14
14
|
## 目录
|
|
15
15
|
|
|
16
16
|
- [使用本包](#use-this-package)
|
|
17
17
|
- [理解实现](#understand-the-implementation)
|
|
18
|
-
- [
|
|
18
|
+
- [延伸阅读](#further-exploration)
|
|
19
19
|
- [模型体验](#model-experience)
|
|
20
|
-
- [
|
|
20
|
+
- [已知限制与后续工作](#known-limitations-and-deferred-work)
|
|
21
21
|
- [开发备注](#dev-note)
|
|
22
22
|
|
|
23
23
|
-----
|
|
@@ -25,84 +25,81 @@ kind: "package-reference"
|
|
|
25
25
|
<a id="use-this-package"></a>
|
|
26
26
|
## 使用本包
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
发布的 Web bundle 将 `ui-schedule` 与 Host Schedule 服务、以及为模型提供当前时间的时钟上下文一起挂载。侧栏的自动化任务入口打开全局页面,不选择或激活会话。页面页头的“新建”操作会打开一个新会话,提醒由模型在该会话中创建;页面本身没有创建表单。列表支持文本搜索和一行“全部/已开启/未运行”状态筛选;搜索匹配任务已存储的名称、指令和内部会话 id,不匹配解析出的会话标题,空状态在提示旁保留页头的“新建”操作。选择活动或未运行任务后,进入含“规则”和“任务运行记录”页签的第二层详情。每条列表行显示任务已存储的标题及其状态、频率和下次运行,不显示原会话名称;详情中的名称输入框显示任务已存储的标题。“规则”显示完整提醒、状态、活动任务的下一目标时间、原始重复规则和任务 id。每天的规则标签显示已保存的本地时间与精确的存储 IANA 时区,保留非零秒与毫秒,而不替换为浏览器时区。详情页签条内的“关联会话”入口按会话标题显示,取不到标题时回退显示会话 id。元数据加载后,它可打开可用且未归档的会话;会话或 Workspace 元数据尚未就绪、会话已归档、会话不在列表中或 Workspace 查询失败时,入口保持禁用并显示原因。点击时会重新检查可用性;浏览不会取消会话归档。仅此操作请求激活会话。删除位于详情顶部条带的“更多任务操作”菜单。
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
dsh web --patch apps/cli/config/examples/schedule/cordis.yml
|
|
32
|
-
```
|
|
30
|
+
从列表选择任务时默认打开“规则”;刷新同一任务会保留当前页签。活动任务的“规则”修改名称、指令和运行时间;这些修改保留在本地草稿中直到保存,未运行任务保持只读。不带修饰键的左右方向键循环切换页签,Home/End 选择第一个/最后一个页签,键盘焦点随选择移动。页签不会拦截这些键与 Alt、Ctrl、Meta 或 Shift 的组合。共用的会话入口位于详情页签条内,在“规则”页签可见;确认删除操作在两种页签下都可用。
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
“规则”在“运行时间”卡片中以行编辑本地草稿:“重复”是含每周、周一至周五、每天、每 N 小时、每 N 分钟、每 N 秒、仅一次和自定义(cron)的菜单,每周规则增加“星期”行,固定速率选项只修改它所属单位的间隔数量,一次性规则用独立的“日期”和“时间”两行编辑目标,自定义(cron)用一行“Cron 表达式”编辑按所选时区解释的 5 字段表达式。卡片在浏览器中解析该表达式,并在该行下方显示描述它的本地化语句;Host 会拒绝的表达式改为显示本地化校验信息,并在解析通过前阻止保存。已存储的每周规则若星期集合恰好为周一至周五,则选中“周一至周五”选项。“日期”行是只读触发器,以 `YYYY/MM/DD` 显示暂存的日期并展开带本地化星期表头、月份切换和今天标记的月历;草稿与提交文本保持 ISO 形态;“时间”行是只读触发器,显示统一的 24 小时时钟,并展开时、分、秒三列可滚动列表,当前值高亮并在打开时滚动到可见。在月历或时钟上点选即按与其他行相同的分阶段保存写入草稿;方向键在打开的列或网格内移动,Enter 选定当前值,Escape 关闭面板并把焦点还给所在行,被禁用的行无法打开面板。时钟行显示到秒,未改动的行在提交时保留已存储的毫秒值,编辑时间时按整秒精度提交。“时区”使用高度受限的可搜索菜单。顶部无标题区域保留浏览器本地最近选过的 5 个准确时区;首次使用按真实系统时区和 UTC 初始化,而不根据界面语言猜测所在地。系统时区带有标记,其余清单按当前 UTC 偏移、再按规范 IANA 标识排序。可见文案把 `UTC±HH:MM` 放在本地化时区名称之前;IANA 标识仅在内部使用,但可用于搜索。ICU 显示成相同偏移和本地化名称的多个时区只占一行;所有被合并的标识仍可用于搜索,任务已保存的标识也会继续作为选中值,不会被改写。时区清单来自 `Intl.supportedValuesOf('timeZone')`,名称来自 `Intl.DateTimeFormat(..., { timeZoneName: 'longGeneric' })`:两者都是浏览器内置的 ICU/CLDR 数据,不是抓取或产品自维护的翻译表。因此没有需要刷新的爬虫或生成时区资源;第三方语言包只需提供常规的 `time.locale` 值,即可自动获得对应的 ICU 名称,仅需翻译选择器周边的 UI 文案。运行时无法枚举时改用简短的标识候选列表,已存储但不在其中的时区会保留。每天、每周和 cron 保留各自已存储的规则与时区,其频率行仅在时区与宿主系统时区不同时标出时区。一次性 After/At 以记录已存储的时区初始化日期和时间;记录未保存时区时取本设备时区,初始钟表值在该时区下仍表示同一瞬时;更改时区会保留输入的钟表值并改变时点。因选择种类而重新初始化的种类使用已提交发生时点的钟表值和该选项的时区,该时区取记录已存储的时区或本设备时区:每周的星期取自该发生时点在该时区下的星期,cron 则把该发生时点的钟表值写成每天执行的表达式。固定间隔至少为 60 整秒,不受时区影响。一次保存以分阶段的变更提交完整预期记录,并保留 id、原会话、最近一次回执及已保存历史;未来目标选择、重新确定起算时间和未变更规则的无写入语义见 [Schedule](../../schedule/schedule/README.zh.md#use-this-package)。
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
行在保存进行中、目录加载中、删除期间以及任务未运行时禁用。仅当本地草稿与已存储任务不同时才出现保存栏:显示“有未保存的修改”及“取消”和“保存修改”,保存期间“保存修改”变为“保存中…”。“取消”恢复已存储的值。仅当草稿没有未保存修改时,目录刷新才会成为显示值,因此未保存的草稿会保留到权威刷新之后。保存失败保留草稿并显示本地化提示;冲突后针对刷新后的记录重试。任务从目录消失时,“删除”会禁用,直到任务重新出现。更新成功后刷新权威目录。更新被拒绝或无法确认与目录读取失败相互区分:“重试”重新加载目录,不将该更新显示为失败。若更新本身无法确认,应在重试前检查任务。切换任务或关闭详情后才到达的响应不会替换当前视图,任何失败都不会回滚宿主已开始的写入。
|
|
37
35
|
|
|
38
|
-
|
|
36
|
+
打开“任务运行记录”时才请求最新的 20 条已保存记录。“加载更早的记录”按追加顺序从新到旧增加一页,不受实际时间回拨影响。该视图中页签条就是整个页头:名称输入框和“下次运行”行只属于“规则”。每条“已保存的任务运行记录”以时钟图标和任务时区下的本地月份名与时钟字段开头(一次性记录使用浏览器时区),并在存在时显示实际保存的提示文本。超过两行的提示文本只显示前两行并提供“展开”,展开后可“收起”;面板宽度变化时,收起状态的提示文本会重新判断是否超过两行。旧回执没有提示文本时,绝不以当前指令代替。
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
最后一页加载完成后,非空且确认裁剪过的历史在详情面板左下角显示无分隔线的清理提示,信息图标可展开或收起当前宿主的保留规则。空历史、未确认裁剪的旧格式历史、尚未加载完的分页和读取失败均不显示清理提示。
|
|
39
|
+
|
|
40
|
+
历史查询成功的空页与加载中、查询失败、任务不存在或游标无效相互区分。请求失败时保留此前加载的记录,并显示警告和“重试加载任务运行记录”;游标无效时提供“刷新任务运行记录”,重新加载最新一页。最新 `messageId` 变化时刷新最新一页,不切换页签。被刷新取代的响应,以及切换任务、离开任务运行记录或关闭详情后才收到的响应,不会替换当前视图。
|
|
41
|
+
|
|
42
|
+
自动化任务页面要求确认后才能删除任务。删除是硬删除:Host 连同已保存的任务运行记录一起移除存储的任务行,该任务因此停止后续投递、离开 `list` 与 `catalog`,其投递历史不再可读。删除保留原会话和已入队消息;列表仅在权威查询确认移除之前保留该行。每条删除路径——自动化任务页的详情、会话的任务页签、以及页头弹层——都把最终结果写入同一个存储,由应用级 `shell.overlay` 提示渲染,因此提示的生命周期长于发起它的面板或页签:Host 连同已保存的运行记录移除该行后提示显示「任务已删除」,失败时显示「无法删除任务」,并保留规则以便重试。确认删除会关闭确认所在的面板或页签,每条提示按自身序号区分,后一条会重新开始横幅而不是并入前一条。查询失败保留最近已知记录,并显示独立的重试操作;不会呈现为查询成功的空结果。一次性任务在持久收件箱投递后仍以未运行状态保存。显式删除前,通过全部或未运行筛选仍可查看详情与原会话 id。最近一次投递显示其发生时间,不显示消息 id 和投递确认时间;未运行状态和该回执均不表示模型执行完成。
|
|
43
|
+
|
|
44
|
+
已打开的会话只有在确实有可打开的内容时,才在页头右侧功能位中、紧邻更多操作菜单左侧渲染一个仅图标时钟按钮:首次读取前不渲染任何内容,读取结果为没有活动提醒时页头不显示该按钮,刷新期间保留上一次已知的提醒,读取失败则保留按钮及其重试。该规则避免时钟在首次结果前后出现又消失。其无障碍名称在读取就绪时给出提醒数量,否则显示通用提醒标签。当该会话只有一个活动提醒时,按钮直接在右侧栏打开该任务的详情。其余数量都会打开弹层:先列出逾期提醒,再按目标时间列出未来提醒,显示已存储的标题、频率、浏览器本地目标时间、相对时间及删除按钮;标题本身是一个按钮,点击后在右侧栏打开该任务的详情。任务页签在标签上显示当前任务已存储的标题,并提供与自动化任务页面相同的规则、任务运行记录、名称、指令和运行时间修改、确认删除和原会话入口;它不会激活会话。每日频率文本保留保存的本地时间和时区;每个下一目标时点都显示为设备时区的钟点和括号内的相对时长;规则自身的时区只显示在该频率文本中。Escape 关闭弹层并将焦点返回按钮;点击外部将其关闭。删除最后一条提醒会移除按钮;在此之前,已经打开的弹层保持可展开状态。
|
|
45
|
+
|
|
46
|
+
弹层通过 portal 挂到 body,目标宽度为 336px;空间足够时与触发按钮左边缘对齐,触发器靠近视口右侧时向左避让并保留 16px 视口边距,宽度不超过视口宽度减 32px,列表溢出时纵向滚动。它不显示任务 id、原始 UTC 值或投递详情;每行只带自身的详情入口和删除操作。
|
|
47
|
+
|
|
48
|
+
调用 `schedule_create` 时,创建的任务会以卡片形式渲染在 transcript 中,包含时钟图标、已存储的标题、频率,以及打开该任务右侧栏页签的“打开”按钮。卡片先按该调用持久化的结果 JSON 收窄出任务,并从该结果读取 `title`;当一次在卡片出现之后成功结束的目录读取解析到该任务时,卡片改为跟随目录显示当前名称与频率,若该读取中不含该记录,则以“已删除”代替频率显示。在已存储字段存在之前录制的结果回退为指令首行。仍在运行的调用、创建失败,或结果中没有完整任务时,卡片保留该行,并在结果为单个非空文本块时显示原始结果文本,不提供“打开”操作。卡片不增加 Host 字段,也不改变 Session 日志格式,因此早于该卡片录制的 Session 也会渲染它。
|
|
49
|
+
|
|
50
|
+
侧栏的 Session 行会标记有定时任务的会话:当某行处于空闲状态、未归档且其会话至少有一个活动任务时,该行显示时钟标记;归档行该格留空,其实时状态只在悬浮卡片中显示。对存在活动任务的会话长按悬停时,无论该行是否空闲,都会在其已有的悬浮卡片内增加自动化区段,最多列出两个任务(图标、已存储的标题、频率与下次运行文本),还有更多任务被隐藏时显示遗漏行。处于更高优先级状态的行——有待处理交互、活动仍在进行,或有未查看的完成提醒——保留自身状态点且不渲染标记,两者不会同时出现。该标记和悬停区段读取共享的活动与未运行 Host 任务目录,并从中筛选本会话的活动任务;它们不会激活、保留或取消归档任何会话,也不读取 Session 日志。
|
|
41
51
|
|
|
42
52
|
-----
|
|
43
53
|
|
|
54
|
+
### 时区数据来源
|
|
55
|
+
|
|
56
|
+
时区清单与本地化完全离线。`Intl` 读取浏览器运行时内嵌的 ICU/CLDR 表,DSH 运行时不会获取或下载时区数据。没有需要刷新的爬虫;第三方语言包提供 `time.locale`,并仅翻译选择器自身的 UI 文案。
|
|
57
|
+
|
|
44
58
|
<a id="understand-the-implementation"></a>
|
|
45
59
|
## 理解实现
|
|
46
60
|
|
|
47
61
|
<details>
|
|
48
|
-
<summary
|
|
62
|
+
<summary>实现内部细节 — 点击展开</summary>
|
|
49
63
|
|
|
50
|
-
|
|
64
|
+
浏览器入口注册 `schedules` 主面板及对应的侧栏入口、Session 页头右侧功能位中位于 `order: -5` 且紧邻更多操作菜单左侧的 `schedule-catalog` 入口、经由 `ctx.uiConversation.events` 与 ui-chat 的 list seat `conversation.chat.turnTail` 在轮次层级注册的 `schedule_create` transcript 卡片(因此它渲染在该轮收尾的 assistant 文本之后,并在工具调用组折叠时仍然可见)、root 作用域的两个 Session 行 seat `sidebar.session.row.leading` 与 `sidebar.session.row.hover`,以及 kind 为 `scheduleTask` 的右侧栏页类型 `@deepseek-ai/dsh-client-ui-schedule/task`。该类型分两阶段注册:先把其定义注册进 `ctx.sidebarRightTabs`,再按该定义的 id 把正文与 chip 注册进带键 seat `sidebar.right.pane.tab` 与 `sidebar.right.pane.tab.title`。从 Session 入口打开任务时调用 `ctx.sidebarRight.openTab`,传入该入口的 Session id 与所选任务 id,详情因此出现在该入口所属 Session 的右侧栏中;自动化任务页面保留自己的列表并共用同一个详情组件。全局页面、任务页签、行标记与行悬停区段都从同一个 `schedule.catalog` 源读取活动与未运行任务;页头入口保留自己的按 Session `schedule.list` 读取,只返回该 Session 的活动任务。每个面都使用同一套可观察的查询生命周期,并在 `schedule/changed` 或连接重置后刷新。transcript 卡片从该调用持久化的结果 JSON 收窄出创建的任务,而不是依赖 Host 追加字段;该调用自身的工具调用组单元格由 ui-tool 的通用键控视图渲染,且卡片只对产生完整任务的调用出现。该对齐是因果判定而非时钟比较:目录快照带有 `readRequest`(最新被请求的读取序号)与 `readSettled`(产出当前记录的读取序号);Turn 尾部挂载时锚定 `readRequest` 并请求一次读取,仅在 `readSettled` 大于该锚点后才用其保留记录判定,且源把一次提交内的请求合并为单次 `list()`,只把该读取共享给尚未观察到它的调用者。比较浏览器时钟与 Host 时钟无法确立这一顺序。共用的删除回调与注入的 `onUpdateTiming` 保留所选记录的原 Session 绑定,而不使用当前打开的对话。详情保留当前任务的本地草稿、用于比较的权威值以及等待中或失败的保存;保存等待中或失败期间以及删除确认后,属主保留所显示的任务,使目录刷新在丢弃该行时既不能关闭已呈现的失败,也不能关闭陈述删除的详情。保存发出一次携带完整预期 `ScheduleRecord` 和分阶段变更的 `schedule.update` 请求;`onUpdateTiming` 刷新目录,而不把回读失败变成修改失败。
|
|
51
65
|
|
|
52
|
-
|
|
66
|
+
刷新恢复出的任务标签没有导航参数,因为 Sidebar 只持久化标签的布局记录,不持久化打开方传入的内容。因此该页面类型自行保存从 Session 加布局记录 id 到该记录最后显示任务的 Session 和 id 的关联:每个 Session 一个 `dsh.schedule.task-tab.v1.<sessionId>` localStorage 键,按 tab id 一条记录,且从不保存任务内容。正文和 chip 只对没有导航参数的记录读取该条目,在标签出现之后成功的一次读取无法解析时将其删除,且不代替关联声称任务缺失。这样的一次读取无法为该标签给出任务标识时,正文陈述该状态,而不呈现永不结束的加载。
|
|
53
67
|
|
|
54
|
-
|
|
55
|
-
|---|---|
|
|
56
|
-
| [`src/client/index.ts`](src/client/index.ts) | 浏览器入口:注册 locale 并贡献会话头部 slot |
|
|
57
|
-
| [`src/client/ScheduleCatalogAction.tsx`](src/client/ScheduleCatalogAction.tsx) | 可见性、排序、格式化、弹层与键盘行为 |
|
|
58
|
-
| [`src/client/locales.ts`](src/client/locales.ts) | 中英文目录文案 |
|
|
59
|
-
| [`src/index.ts`](src/index.ts) | 空的 Host apply,使 Loader 可以寻址该可选浏览器功能 |
|
|
60
|
-
| — | 不发布运行时不变量伴生入口;这个只读客户端目录不拥有可变的跨插件状态。 |
|
|
68
|
+
仅在框架观察数据源期间订阅。最后一个订阅取消时释放事件监听,并使尚未完成的响应失效。组件接收框架绑定的 `useCatalog` hook 和明确的操作回调。已挂载的任务运行记录视图使用所选任务的原会话绑定读取 `schedule.history`;目录和列表响应不包含完整历史。组件拥有可丢弃的搜索、筛选、选择、确认和历史分页状态。提醒记录由 Host 拥有,不来自历史会话投影或浏览器本地演示数据。
|
|
61
69
|
|
|
62
|
-
|
|
70
|
+
本包不发布运行时 invariant companion,因为目录呈现 Host 拥有的任务状态,自身只拥有可丢弃的查询和交互状态。
|
|
63
71
|
|
|
64
72
|
</details>
|
|
65
73
|
|
|
66
|
-
-----
|
|
67
|
-
|
|
68
74
|
<a id="further-exploration"></a>
|
|
69
|
-
##
|
|
75
|
+
## 延伸阅读
|
|
70
76
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- [Schedule 包](../../schedule/schedule/README.zh.md)——创建、列出、取消并交付这里显示的提醒。
|
|
74
|
-
- [Schedule 子系统](../../../docs/subsystems/schedule.zh.md)——持久记录、转换与交付语义。
|
|
75
|
-
- [会话投影子系统](../../../docs/subsystems/session-projection.zh.md)——本包读取的完整值传输。
|
|
76
|
-
- [客户端包映射](../README.zh.md)——相邻的浏览器 UI 包。
|
|
77
|
-
|
|
78
|
-
-----
|
|
77
|
+
- [Schedule](../../schedule/schedule/README.zh.md) 拥有持久化、投递和删除语义。
|
|
78
|
+
- [槽位](../../../docs/subsystems/slots.zh.md) 说明注入 hook 和面板贡献。
|
|
79
79
|
|
|
80
80
|
<a id="model-experience"></a>
|
|
81
81
|
## 模型体验
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
无,因为浏览器 UI 不注册面向模型的工具或消息;提醒投递由 Schedule 拥有。
|
|
84
84
|
|
|
85
85
|
#### KV Cache 影响
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
无。列表展示不进入模型请求。
|
|
88
88
|
|
|
89
|
-
##
|
|
89
|
+
## 已知限制与后续工作
|
|
90
90
|
|
|
91
91
|
<a id="known-limitations-and-deferred-work"></a>
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
-
|
|
97
|
-
- **浏览器派生时间**——本地时间与相对时间标签使用查看方浏览器当前的 locale、时区与时钟。它们是呈现值,不是持久 Schedule 事实。
|
|
98
|
-
- **只读界面**——创建与删除提醒仍由 Schedule 工具负责;目录没有 mutation、Retry、acknowledgement、Toast 或交付回执语义。
|
|
99
|
-
- **要求会话打开成功**——打开失败时,即使存在暂定缓存值也会隐藏,因为严格会话回放仍是权威。
|
|
93
|
+
- 已保存的记录描述收件箱投递,不表示模型执行结果。没有已保存历史的任务仅呈现已有回执,直到新投递追加记录;未保存的更早记录和提示文本快照无法恢复。此前已物理删除的任务不会恢复。
|
|
94
|
+
- 每页 20 条仅限制请求的记录数,不限制提示文本字节数或任务保留的存储。投递历史由 Host 插件的配置设界:`deliveryHistoryDays`(默认 30)与 `deliveryHistoryRecords`(默认 200),在追加确认时裁剪,最近一次回执始终保留,被裁剪的更早窗口报告为不可用;见 [Schedule 限制](../../schedule/schedule/README.zh.md#known-limitations-and-deferred-work)。
|
|
95
|
+
- 删除不会取消已经排队执行的提醒。详情页签条内的关联会话入口使用普通会话导航及其恢复策略打开原对话,不直接跳转到特定消息。
|
|
96
|
+
- 创建提醒仍通过 Schedule 工具完成。仅在活动任务的“规则”中可修改名称、指令和运行时间,自动化任务页面和任务页签均可;不提供暂停或立即执行,且“运行时间”卡片的“重复”菜单接受任意选择,包括改变已存储重复规则种类;此时按新规则重算目标。页面的“新建”操作会打开一个会话,而不是在页面内创建任务;会话页头的弹层本身不提供运行时间编辑器。“时区”菜单提供运行时的 IANA 时区清单,运行时无法枚举时改用简短的候选列表。
|
|
100
97
|
|
|
101
98
|
<a id="dev-note"></a>
|
|
102
99
|
### 开发备注
|
|
103
100
|
|
|
104
101
|
<details>
|
|
105
|
-
<summary
|
|
102
|
+
<summary>维护工作上下文 — 点击展开</summary>
|
|
106
103
|
|
|
107
104
|
无。
|
|
108
105
|
|