Commit Graph
19 Commits
Author SHA1 Message Date
ZiyaandMagolor 341ea6eea4 feat(schedule): integrate standalone tasks with the existing WebUI (#6189)
* feat(schedule): manage Host tasks with typed timing and delivery targets

* fix(schedule): align task creation button halves

* refactor(schedule): remove obsolete Session reminder runtime

* refactor(schedule): simplify task UI and preserve keyboard navigation

* fix(schedule): address task delivery and interface review findings

* test(schedule): normalize bundle module paths on Windows

* fix(schedule): cover reserved targets and trim unrelated changes

* refactor(schedule): minimize task management changes after rebase

* test(schedule): align rebased fixtures and documentation records

* test(schedule): refresh SDK scenarios added on master

---------

Co-authored-by: Magolor <[email protected]>
2026-10-29 18:11:48 +08:00
Chinesezjc 3e5231bc6f Merge origin/master into feat/preset-scoped-schedule-tools
Resolutions:
- `docs/subsystems/schedule.*` and `packages/client/ui-schedule/README.*` keep
  this branch's shipped-composition text with master's newer wording (Rules and
  Records tabs, the icon-button linked-session layout).
- `docs/event-producer-consumer.*` regenerated by `gen-doc-graphs`.
2026-09-30 13:49:30 +08:00
Chinesezjc 1b1b09e1fb fix(schedule): enforce the caller restriction in the tool layer
Review follow-ups on the delegated-child rule:

- Every one of the four tools refuses a delegated caller before dispatch,
  reading `delegationDepthOf(exec.agent)` and returning the stable
  `subagent_session` refusal, so `schedule_list`, `schedule_delete`, and a
  content-only `schedule_update` are covered too. The preset `toolFilter.deny`
  stays as the layer that keeps the tools out of a child's prompt.
- The service keys the arming refusal on that same delegation accounting
  alone; `hasApiSessionSubagentOwner` returns to package-private and
  `@deepseek-ai/dsh-schedule` no longer imports it.
- The preset child row is `time-context` again: the `preset-` prefix separated
  it from a Host row that no longer exists, and `verify-cordis-config` passes
  with the sibling-style id.
- Docs, Agent Notes, and the generated catalogs follow.
2026-09-29 16:57:25 +08:00
Chinesezjc 699f1a8dc1 feat(schedule): deny the reminder tools to delegated children
A delegated child could arm reminders through the tools its preset mount
passes down, even though delivery can never reach a child's Session. The
refusal now reads the delegation-depth accounting the delegation cap itself
enforces, and the shipped presets deny the four tools to children outright:

- `reminderTargetRefusal` refuses when `delegationDepthOf(agent)` is above
  zero, or when the Session is subagent-owned without a depth record.
- `standard`, `cordis`, and `ptc` set `toolFilter.deny` on both delegation
  rows, so the four tools leave a child's prompt and reject execution.

`create` still rejects and `update` still returns the non-mutating refusal.
2026-09-29 16:39:05 +08:00
Turtle d8f38c4ad6 fix(ui-schedule): keep linked Session focus and disabled tooltip
Render one Button for both layouts so crossing the fit threshold keeps focus,
anchor the tooltip on the wrapper so a disabled compact entry still names
itself, observe each tab, and rename the tab in the user and subsystem docs.
2026-09-29 16:23:52 +08:00
Chinesezjc c6dd905972 feat(web): ship the Schedule service and task page in the Web composition
The reminder stack no longer hides behind an optional experimental bundle.
`packages/bundle/web-app/cordis.patch.yml` inserts `schedule` and
`ui-schedule`, so a shipped profile mounts the task store, the delivery
runtime, and the Automation tasks page; the
`@deepseek-ai/dsh-experimental-schedule-bundle` package and its wiring are
removed.

Preset ownership is unchanged: `standard`, `cordis`, and `ptc` declare the
clock and the four reminder tools in their own scope, and `minimal` declares
neither, so a minimal session carries no reading and no reminder tool even
though the service is mounted.

`apps/cli` depends on `@deepseek-ai/dsh-tool-schedule`, and
`packages/bundle/web-app` declares `@deepseek-ai/dsh-schedule` and
`@deepseek-ai/dsh-client-ui-schedule`: preset and profile rows resolve plugin
names from the installation anchor, so a missing declaration leaves the row
without a fiber and every session creation fails with
`agent-preset/invalid`.

Documentation, Agent Notes, and the recorded Web fixtures follow the shipped
composition.
2026-09-28 18:31:53 +08:00
Chinesezjc 8d7ba898f8 Merge origin/master into feat/preset-scoped-schedule-tools
master now ships the reminder stack as the optional
`@deepseek-ai/dsh-experimental-schedule-bundle`, which inserts the rows the
Web composition leaves out. This branch keeps the preset-level ownership
beside it.

Resolutions:
- The bundle inserts `schedule` and `ui-schedule` only. It no longer inserts
  `time-context`: the clock belongs to the `standard`, `cordis`, and `ptc`
  presets, and a Host row for the same package would mount it in two scopes
  and append two readings per step.
- `packages/bundle/web-app/package.json` declares `@deepseek-ai/dsh-time-context`
  again: the presets reference it by bare name, so `verify-cordis-config`
  requires the dependency.
- The bundle's patch spec, locale, package, README pair, the optional-bundle
  composition spec, the plugin-manager component list, and the
  `schedule-after` roster assertions describe the two-row bundle and the
  preset-owned clock and tools.
- Documentation and Agent Notes follow the same split; the note master
  archived stays frozen with its manifest hashes.
2026-09-28 13:04:51 +08:00
Chinesezjc fd53e83125 Merge origin/master into feat/preset-scoped-schedule-tools
master now ships the reminder stack as the optional
`@deepseek-ai/dsh-experimental-schedule-bundle`; this branch keeps the
preset-level ownership beside it.

Resolutions:
- The Host rows keep master's `disabled: true`. The optional bundle switches
  `schedule` and `ui-schedule` on and no longer `time-context`: the clock row
  is preset-level, so flipping the Host row as well would mount the plugin in
  two scopes and write two readings per step.
- `standard`, `cordis`, and `ptc` declare `preset-time-context` and
  `tool-schedule`; `minimal` declares neither.
- `tool-schedule` injects `tools` and resolves `schedule` per scope through
  `ctx.inject`, so the row stays valid but produces no tools while the service
  is off, and produces them once the bundle mounts it.
- The assembled-Web Schedule spec keeps master's bundle overlay and restates
  the shipped `preset-standard` row instead of the deleted fixture, because a
  top-level patch cannot reach a plugin a preset declares.
- Documentation and Agent Notes describe both layers; the note master archived
  stays frozen with its manifest hashes.
2026-09-26 01:12:54 +08:00
ZiyaZhang 5511abfa14 Merge remote-tracking branch 'origin/ux/automation-tasks-plugin-row' into feat/schedule-bundle-owns-rows
# Conflicts:
#	docs/user/guide/schedule.i18n.yaml
#	docs/user/guide/schedule.md
2026-09-25 01:52:10 -07:00
ZiyaZhang d6ffaa0198 test(plugin-manager): pin the English Automation tasks row and write its label as text
The language-switch case now reads the Automation tasks row's English title
and description, and the English guide writes the UI label as plain text like
the rest of the guide.
2026-09-25 01:19:47 -07:00
ZiyaZhang 64a361ee44 feat(schedule-bundle): insert the Schedule rows from the bundle and list them on its page
The Web composition no longer carries `time-context`, `schedule`, and
`ui-schedule`. The optional bundle inserts the three rows and depends on their
packages, as the other optional bundles insert theirs, so the Plugins page lists
them under the bundle; `dsh.bundle.rowSwitches: false` keeps the bundle's own
switch as their only control. The three packages gain localized titles and
descriptions for that list.
2026-09-25 00:42:21 -07:00
ZiyaZhang 197355bb12 fix(schedule-bundle): name the Plugins row Automation tasks with an alarm clock icon
The row now carries the name of the sidebar entry it adds and a
plain-language description, and its icon is an alarm clock drawn in the
Official group's 36px style. The README and the user guide quote the new
title; the README names the sidebar entry instead of a right-sidebar page.
2026-09-24 23:08:48 -07:00
Chinesezjc 41c29fa832 feat(schedule): ship the Schedule switch as an optional bundle
The shipped Web composition carries `time-context`, `schedule`, and
`ui-schedule` disabled. This adds
`@deepseek-ai/dsh-experimental-schedule-bundle`, whose patch sets
`disabled: false` on those three rows and inserts none, and names it in
`OPTIONAL_BUNDLES` with a runtime dependency of `apps/cli`, so every
installation ships it switched off and the Web Plugins page offers it in
the Official group.

The two Web suites and the built-Web Schedule Remote scenario enable the
rows through that bundle instead of a scenario-local fixture.
2026-09-24 21:03:26 +08:00
Chinesezjc 656adfc986 feat(web): mount time-context from the presets that use it
`packages/bundle/web-app/cordis.patch.yml` inserted `time-context` as a Host
row, so every session in the shipped Web profile — `minimal` included —
received a per-step clock reading its composition never declared. The row
moves into the `standard`, `cordis`, and `ptc` presets; `minimal` mounts
neither the reading nor the reminder tools. The Schedule service row and the
`ui-schedule` client row stay Host-wide. 139a7eb379 carried the bundle,
preset, and runtime-closure half of this move; this commit carries the
fixtures, documentation, and Agent Notes that follow it.

The `minimal` session fixture is refreshed keylessly, the assembled-Web spec
builds its every-step overlay from the shipped preset because a preset plugin
cannot be addressed by id from a top-level patch, and the composition Agent
Note points at the new note that owns the preset-scoped reading.
2026-09-24 20:50:12 +08:00
Chinesezjc 6c1a590a4c feat(schedule): contribute the reminder tools from a preset-scoped package
The Host plugin registered `schedule_create`, `schedule_list`,
`schedule_update`, and `schedule_delete` on every live root Agent, so a
`minimal` session received four reminder tools its preset never declared. The
tools move to the preset-scoped Consumer `@deepseek-ai/dsh-tool-schedule`,
which injects `tools` and `schedule` and registers them in the scope that
mounts it: `standard`, `cordis`, and `ptc` carry the row, `minimal` does not.
`@deepseek-ai/dsh-schedule` keeps the Host service, storage, delivery, and the
Automation surface.

The five `minimal` assertions in the Web preset suite and the `minimal-preset`
tool-schema snapshot return to the bash-only table, the tool catalog is
regenerated under the new owner, and the Agent Note that recorded the previous
composition points at the new one.
2026-09-24 18:39:00 +08:00
Chinesezjc e896737840 feat(schedule): ship Schedule in the default Web composition
The Web bundle now mounts `time-context` and `schedule` and leaves the
`ui-schedule` client row enabled, so the Automation tasks page, the Session
reminder catalog, and the `schedule_*` tools work without an overlay. Both
packages join the bundle's declared dependencies, and the example overlay is
deleted: re-inserting its rows would mount both Host plugins twice.

The fixed-rate floor drops from 300 to 60 seconds across the Host decoder,
the create and update validation, the model-visible tool schema, and the
client's per-unit floors.

Web recorded sessions and header sidecars are refreshed for the readings
`time-context` now appends; `normalizeWebSessionVolatiles` tokenizes their
sampled instant, browser zone, and elapsed duration so replay stays stable.
2026-09-24 16:11:52 +08:00
Chinesezjc 7a362b263b Merge pull request #4335 from deepseek-harness/feat/schedule-storage-phase1
feat(schedule): persist tasks and resume due sessions
2026-09-23 23:33:33 +08:00
pku-xht 1a5d004524 Merge commit 'bc954280ae67e349291e51e5787c6987e767fa40' into schedule-web-catalog
# Conflicts:
#	packages/client/ui-workspace/src/client/rows/Rows.tsx
#	tsconfig.base.json
2026-08-28 07:24:24 +08:00
Tianyi Cui 4125514a08 refactor(repo): retire top-level examples 2026-08-24 22:02:44 +08:00