refactor(schedule-bundle): give the Schedule rows the usual per-row switches
The bundle no longer declares `dsh.bundle.rowSwitches`, so its page offers a switch per row while it is on, as every other bundle does. The README records that the three rows work only together, and the Agent Note records the rejected lock.
This commit is contained in:
1 parent
738178f136
commit
912e5bafa1
9 files changed
+35
-45
No files matched your search
+6
-6
@@ -9,11 +9,11 @@
|
||||
en: bb23c2f7f93a462b
|
||||
zh: 9fb600fc8e203323
|
||||
/agent-note-schedule-as-an-opt-in-optional-bundle/decision:
|
||||
en: d486512fd11dd52f
|
||||
zh: 8f0db2a51230ddb9
|
||||
en: 483d1dd51b9cc073
|
||||
zh: b069e2e2385c8132
|
||||
/agent-note-schedule-as-an-opt-in-optional-bundle/alternatives-considered:
|
||||
en: bec79a163cce72f5
|
||||
zh: 56d94da62b85f6f0
|
||||
en: 8e5f4d8fa8c2e78d
|
||||
zh: 3353c7042c6a1d6b
|
||||
/agent-note-schedule-as-an-opt-in-optional-bundle/consequences:
|
||||
en: 05d18fcdc8929ac5
|
||||
zh: e05ab49bc3ef917b
|
||||
en: 36cd0eb71abeedbe
|
||||
zh: 7c134095cc19fcfd
|
||||
+2
-8
@@ -14,8 +14,6 @@ Schedule adds four tool schemas to every live root Agent request and one durable
|
||||
|
||||
`@deepseek-ai/dsh-experimental-schedule-bundle` (`packages/experimental/schedule-bundle/`) inserts the three rows in its `cordis.patch.yml` and depends on their packages, as every other optional bundle inserts the rows it ships. `OPTIONAL_BUNDLES` in `packages/boot/app-boot/src/profile.ts` names the package, and `apps/cli` declares it as a runtime dependency, so every installation ships it switched off. The [experimental-as-optional-bundles decision](2026-09-21-experimental-capabilities-as-optional-bundles.md) owns the `OPTIONAL_BUNDLES` conventions and the localized `icon` and `meta.title` / `meta.description` metadata the Web Plugins page renders in its Official group.
|
||||
|
||||
The bundle's manifest sets `dsh.bundle.rowSwitches: false`. `listPlugins` then reports each row the bundle inserts with the `bundle-switch` read-only reason, so `setPluginEnabled`, the `plugin_manager` tool, and the Plugins page all refuse to switch one of the three rows alone, and the page lists them with their state and draws no row switch. The Host rows and the client row work only together, so the bundle's own switch is their only control. A bundle that omits the field keeps a switch per row.
|
||||
|
||||
Enabling the bundle inserts `time-context` (a per-step clock reading with the sampled instant, the browser zone attached to the open request, and the elapsed time since the preceding model-visible message), `schedule` (durable reminders plus `schedule_create`, `schedule_list`, `schedule_update`, and `schedule_delete` on live root Agents), and `ui-schedule` (the Session reminder catalog and the Automation tasks page). The bundle carries `time-context` with `schedule` because a reminder request states a wall-clock target: the sampled instant is what lets the model turn a request such as "tomorrow at nine" into an offset-bearing `at` value. The [Schedule subsystem](../../../../docs/subsystems/schedule.md) owns the durable records, delivery, and management operations; the [Web bundle](../../../../packages/bundle/web-app/README.md) owns the composition the bundle adds the rows to. Disabling the bundle restores the shipped composition, and the Host stops scheduling while the `schedule` row is absent; stored task records remain in the Schedule domain.
|
||||
|
||||
## Alternatives considered
|
||||
@@ -26,16 +24,12 @@ Enabling the bundle inserts `time-context` (a per-step clock reading with the sa
|
||||
|
||||
**Keep the rows in the Web composition with `disabled: true` and switch them on with id-targeted patches.** The bundle would then set fields on existing rows, but the plugin manager lists only the rows a bundle inserts, so the bundle's page reported no components and needed a second listing path for overridden rows, while every other optional bundle inserts its rows. A profile that also declares one of the ids resolves the same way as for any other bundle: the Loader keeps the last declaration.
|
||||
|
||||
**Offer a switch per row, as other bundles do.** Switching `schedule` off while `ui-schedule` stays on leaves the task page without its service, and switching `time-context` off leaves reminders the model cannot place in time; the three rows are one capability.
|
||||
|
||||
**Hide the row switches only on the Plugins page.** `setPluginEnabled` and the `plugin_manager` tool could then still switch one of the rows off, the state the per-row alternative describes; the read-only reason makes the Remote, the tool, and the page agree.
|
||||
|
||||
**Hide row switches for every optional bundle in the Official group.** That removes per-row control from the other optional bundles as well; the manifest field keeps the choice with each bundle's author.
|
||||
**Lock the three rows to the bundle switch.** A bundle manifest field that makes the plugin manager refuse to switch the rows one by one adds a plugin-manager concept only this bundle would use. The bundle's page offers a switch per row, as for every other bundle, and the bundle README records that the three rows work only together.
|
||||
|
||||
## Consequences
|
||||
|
||||
- A default `dsh web` session carries no Schedule tool schemas, no Session reminder catalog, no Automation tasks page, and no per-step clock reading. An installation that wants them enables the optional bundle from the Plugins page or lists the package in a profile's `dsh.profile.bundles`.
|
||||
- An enabled installation adds four tool schemas to every live root Agent and one durable clock message per eligible step; the reading is model-visible and durable, so it replays, compacts, and appears in exported Session logs like any other user message.
|
||||
- The Plugins page lists the three rows under the bundle with the titles their packages' `locale/*.json` declare and their state, and no row switches; `setPluginEnabled` refuses each of them with `bundle-switch`.
|
||||
- The Plugins page lists the three rows under the bundle with the titles their packages' `locale/*.json` declare, their state, and, while the bundle is on, a switch per row; switching one of them off leaves Schedule without that part.
|
||||
- A profile patch or `--patch` overlay that targets one of the three ids matches no row while the bundle is not selected, and the loader warns `patch: entry <id> not found` for it; selecting the bundle replaces switching the rows on by id.
|
||||
- The switch is configuration-only: `src/index.ts` is an empty module, the patch carries the runtime content, and the package owns no mutable runtime state, so it publishes no invariant companion.
|
||||
+2
-8
@@ -14,8 +14,6 @@ Schedule 会给每个活跃根 Agent 的请求增加四个工具 schema,并在
|
||||
|
||||
`@deepseek-ai/dsh-experimental-schedule-bundle`(`packages/experimental/schedule-bundle/`)在其 `cordis.patch.yml` 中插入这三行并依赖它们的包,与其他可选 bundle 插入各自随附的行相同。`packages/boot/app-boot/src/profile.ts` 的 `OPTIONAL_BUNDLES` 列出该包,`apps/cli` 将其声明为运行时依赖,因此每次安装都随包携带且默认关闭。[实验性能力作为可选 bundle 的决策](2026-09-21-experimental-capabilities-as-optional-bundles.zh.md)负责 `OPTIONAL_BUNDLES` 的约定,以及 Web 插件管理页在“官方”分组中渲染的本地化 `icon` 与 `meta.title` / `meta.description` 元数据。
|
||||
|
||||
该 bundle 的清单设置 `dsh.bundle.rowSwitches: false`。`listPlugins` 随之为该 bundle 插入的每一行报告只读原因 `bundle-switch`,因此 `setPluginEnabled`、`plugin_manager` 工具与插件管理页都拒绝单独开关这三行中的任何一行,页面列出它们及其状态,不绘制单行开关。这些 Host 行与客户端行只能一起工作,因此 bundle 自身的开关是它们唯一的控制项。未设该字段的 bundle 仍为每行提供开关。
|
||||
|
||||
启用该 bundle 会插入 `time-context`(每个步骤的时钟读数,包含采样瞬时、附加到当前开放请求的浏览器时区,以及自前一条模型可见消息以来的经过时长)、`schedule`(持久提醒,以及每个活跃根 Agent 上的 `schedule_create`、`schedule_list`、`schedule_update` 与 `schedule_delete`)与 `ui-schedule`(Session 提醒目录与自动化任务页面)。该 bundle 把 `time-context` 与 `schedule` 一起携带,因为提醒请求给出的是挂钟时间目标:采样瞬时正是让模型把“明天九点”这类请求转换成带偏移量的 `at` 值的依据。持久记录、投递与管理操作由 [Schedule 子系统](../../../../docs/subsystems/schedule.zh.md)负责;该 bundle 向其加入这些行的组合由 [Web bundle](../../../../packages/bundle/web-app/README.zh.md) 负责。禁用该 bundle 会恢复随发行版交付的组合,`schedule` 行不存在期间 Host 不再调度;已存储的任务记录保留在 Schedule domain 中。
|
||||
|
||||
## Alternatives considered
|
||||
@@ -26,16 +24,12 @@ Schedule 会给每个活跃根 Agent 的请求增加四个工具 schema,并在
|
||||
|
||||
**把这三行以 `disabled: true` 留在 Web 组合中,用按 id 定位的 patch 打开。** 这样 bundle 只是给已有的行设值,但插件管理器只列出 bundle 插入的行,因此该 bundle 的页面显示不含任何组件,需要为被覆盖的行另建一条列出路径;而其他可选 bundle 都插入各自的行。某个 profile 若也声明了其中某个 id,处理方式与任何其他 bundle 相同:Loader 保留最后一份声明。
|
||||
|
||||
**像其他 bundle 一样为每行提供开关。** 关掉 `schedule` 而 `ui-schedule` 仍开着,任务页面就没有服务;关掉 `time-context`,模型就无法给提醒定时;这三行是同一项能力。
|
||||
|
||||
**只在插件管理页隐藏单行开关。** 那样 `setPluginEnabled` 与 `plugin_manager` 工具仍能单独关掉其中一行,即上一个备选方案描述的状态;只读原因让 Remote、工具与页面保持一致。
|
||||
|
||||
**让“官方”分组中的所有可选 bundle 都不提供单行开关。** 这会连同其他可选 bundle 的单行控制一起去掉;清单字段把这项选择留给每个 bundle 的作者。
|
||||
**把这三行锁定在 bundle 开关上。** 让插件管理器拒绝逐行开关的 bundle 清单字段,会给插件管理器增加一个只有这个 bundle 使用的概念。该 bundle 的页面像其他所有 bundle 一样为每行提供开关,由 bundle README 说明这三行只能一起工作。
|
||||
|
||||
## Consequences
|
||||
|
||||
- 默认的 `dsh web` 会话不带 Schedule 工具 schema、Session 提醒目录、自动化任务页面与逐步时钟读数。需要它们的安装可从插件管理页启用该可选 bundle,或把该包列进 profile 的 `dsh.profile.bundles`。
|
||||
- 启用后的安装会给每个活跃根 Agent 增加四个工具 schema,并在每个符合条件的步骤追加一条持久时钟消息;该读数对模型可见且持久,因此它与其他 user 消息一样参与回放、压缩,并出现在导出的 Session 日志中。
|
||||
- 插件管理页在该 bundle 下列出这三行,显示各自包的 `locale/*.json` 声明的标题及其状态,不带单行开关;`setPluginEnabled` 以 `bundle-switch` 拒绝其中每一行。
|
||||
- 插件管理页在该 bundle 下列出这三行,显示各自包的 `locale/*.json` 声明的标题、它们的状态,并在 bundle 打开时为每行提供开关;关掉其中一行会让 Schedule 缺少这一部分。
|
||||
- 未选中该 bundle 时,按 id 定位这三行之一的 profile 补丁或 `--patch` overlay 匹配不到任何条目,加载器会为它报告 `patch: entry <id> not found` 警告;选中该 bundle 即可取代按 id 打开这些行。
|
||||
- 该开关只涉及配置:`src/index.ts` 是空模块,运行时内容由 patch 承载,包本身不拥有可变的运行时状态,因此不发布不变量伴随模块。
|
||||
@@ -314,7 +314,7 @@ describe('web e2e: plugin manager', () => {
|
||||
expect(tripwire.pageErrors).toEqual([])
|
||||
}, 60_000)
|
||||
|
||||
it('lists the Automation tasks rows without row switches and runs them with the bundle switch', async () => {
|
||||
it('lists the Automation tasks rows and mounts them with the bundle switch', async () => {
|
||||
onTestFailed(() => saveFailureShot(page, 'web-e2e-plugin-manager-schedule'))
|
||||
const panel = await openPluginsPanel()
|
||||
const scheduleRows = () => [...scaffold.ctx.loader.entries()]
|
||||
@@ -326,13 +326,16 @@ describe('web e2e: plugin manager', () => {
|
||||
for (const title of ['时间感知', '任务调度', '任务界面']) {
|
||||
await rows.locator('[data-plugin-row]', { hasText: title }).waitFor()
|
||||
}
|
||||
// A bundle that is off offers no row switches.
|
||||
expect(await rows.getByRole('switch').count()).toBe(0)
|
||||
const toggle = panel.getByRole('switch', { name: '启用 自动化任务', exact: true })
|
||||
await toggle.click()
|
||||
try {
|
||||
await expect.poll(running, { timeout: 20_000 }).toBe(3)
|
||||
await expect.poll(() => rows.locator('[data-plugin-row]', { hasText: '运行中' }).count(), { timeout: 20_000 }).toBe(3)
|
||||
expect(await rows.getByRole('switch').count()).toBe(0)
|
||||
for (const title of ['时间感知', '任务调度', '任务界面']) {
|
||||
await rows.getByRole('switch', { name: `启用组件 ${title}`, exact: true }).waitFor()
|
||||
}
|
||||
await page.getByRole('navigation', { name: '全局面板' }).getByRole('button', { name: '自动化任务', exact: true }).waitFor()
|
||||
} finally {
|
||||
if (await toggle.getAttribute('aria-checked') === 'true') await toggle.click()
|
||||
|
||||
@@ -9,17 +9,17 @@
|
||||
en: d7b8b6126df4e3c4
|
||||
zh: 546d528efd4edbde
|
||||
/deepseek-ai-dsh-experimental-schedule-bundle/summary:
|
||||
en: 76ad9bc58de2aaa6
|
||||
zh: 252d8013f6e2e2b3
|
||||
en: cd6bb19197192724
|
||||
zh: 983a579ee54aa098
|
||||
/deepseek-ai-dsh-experimental-schedule-bundle/table-of-contents:
|
||||
en: d152484eb41ac6b4
|
||||
zh: 364c80ee00a374ff
|
||||
/deepseek-ai-dsh-experimental-schedule-bundle/use-this-package:
|
||||
en: 20a2e38f4ae11625
|
||||
zh: 1e11726a208359e1
|
||||
en: 632033572617d7bc
|
||||
zh: b2a050e68cf3f3e1
|
||||
/deepseek-ai-dsh-experimental-schedule-bundle/understand-the-implementation:
|
||||
en: 856e560942b11985
|
||||
zh: c969313e00397796
|
||||
en: fce278be320c1ade
|
||||
zh: 8f81ac0154ea01a1
|
||||
/deepseek-ai-dsh-experimental-schedule-bundle/further-exploration:
|
||||
en: c66c056c527188f1
|
||||
zh: 2781b2ff3420c319
|
||||
@@ -39,8 +39,8 @@
|
||||
en: 0b01d8c40b422f5b
|
||||
zh: 57fede4db59a62b8
|
||||
/deepseek-ai-dsh-experimental-schedule-bundle/known-limitations-and-deferred-work:
|
||||
en: 1fee0bec28171b89
|
||||
zh: 689eedbc2e1b35b3
|
||||
en: 6c0599acfe520c6a
|
||||
zh: 69063300060b5785
|
||||
/deepseek-ai-dsh-experimental-schedule-bundle/known-limitations-and-deferred-work/dev-note:
|
||||
en: 0225ba087c5266f3
|
||||
zh: 4e706f1b2b984e63
|
||||
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
||||
|
||||
## Summary
|
||||
|
||||
This optional bundle inserts the three Schedule rows the shipped Web composition leaves out: `time-context`, `schedule`, and `ui-schedule`. Its manifest sets `dsh.bundle.rowSwitches: false`, so the plugin manager lists the three rows with their state and switches them only with the bundle. Shipped profiles leave it switched off.
|
||||
This optional bundle inserts the three Schedule rows the shipped Web composition leaves out: `time-context`, `schedule`, and `ui-schedule`. Shipped profiles leave it switched off.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
@@ -25,7 +25,7 @@ This optional bundle inserts the three Schedule rows the shipped Web composition
|
||||
<a id="use-this-package"></a>
|
||||
## Use this package
|
||||
|
||||
Open Plugins in the Web sidebar and enable Automation tasks, marked by an alarm clock icon. A live root Agent then receives `schedule_create`, `schedule_list`, `schedule_update`, and `schedule_delete`, the Session header shows its reminder catalog, the sidebar's Automation tasks entry opens the task-management page and the right Sidebar holds the selected task's detail, and each eligible step appends one clock reading with the current time, the browser zone attached to the open request, and the elapsed time since the preceding model-visible message. The bundle's page lists Time awareness, Task scheduling, and Task interface with their state; they switch on and off only with the bundle. Disabling the bundle restores the shipped composition; stored tasks remain on disk.
|
||||
Open Plugins in the Web sidebar and enable Automation tasks, marked by an alarm clock icon. A live root Agent then receives `schedule_create`, `schedule_list`, `schedule_update`, and `schedule_delete`, the Session header shows its reminder catalog, the sidebar's Automation tasks entry opens the task-management page and the right Sidebar holds the selected task's detail, and each eligible step appends one clock reading with the current time, the browser zone attached to the open request, and the elapsed time since the preceding model-visible message. The bundle's page lists Time awareness, Task scheduling, and Task interface with their state. Disabling the bundle restores the shipped composition; stored tasks remain on disk.
|
||||
|
||||
-----
|
||||
|
||||
@@ -35,12 +35,12 @@ Open Plugins in the Web sidebar and enable Automation tasks, marked by an alarm
|
||||
<details>
|
||||
<summary>Maintainer details — click to expand</summary>
|
||||
|
||||
`cordis.patch.yml` inserts the three rows, and `package.json` depends on their packages so each row resolves from this bundle. `dsh.bundle.rowSwitches: false` makes the plugin manager refuse to switch any of the three rows alone, because the Host rows and the client row work only together; the Plugins page draws no row switch for them. `OPTIONAL_BUNDLES` in `packages/boot/app-boot/src/profile.ts` names this package and `apps/cli` depends on it, so every installation ships it switched off and the plugin manager offers it in the Official group. Selecting it appends the bundle to the profile's `dsh.profile.bundles` list. No runtime invariant companion is published because this configuration-only package owns no mutable runtime state.
|
||||
`cordis.patch.yml` inserts the three rows, and `package.json` depends on their packages so each row resolves from this bundle. `OPTIONAL_BUNDLES` in `packages/boot/app-boot/src/profile.ts` names this package and `apps/cli` depends on it, so every installation ships it switched off and the plugin manager offers it in the Official group. Selecting it appends the bundle to the profile's `dsh.profile.bundles` list. No runtime invariant companion is published because this configuration-only package owns no mutable runtime state.
|
||||
|
||||
| File | Role |
|
||||
|---|---|
|
||||
| [`cordis.patch.yml`](cordis.patch.yml) | Inserts the `time-context`, `schedule`, and `ui-schedule` rows |
|
||||
| [`package.json`](package.json) | The row packages as dependencies and `dsh.bundle.rowSwitches: false` |
|
||||
| [`package.json`](package.json) | The row packages as dependencies |
|
||||
| [`locale/en.json`](locale/en.json), [`locale/zh.json`](locale/zh.json) | Plugin-manager title and description |
|
||||
| [`icon.svg`](icon.svg) | Plugin-manager icon |
|
||||
| [`src/index.ts`](src/index.ts) | Empty module entry; the patch is the runtime content |
|
||||
@@ -79,6 +79,7 @@ The tool schemas change the request prefix once when the bundle mounts; each app
|
||||
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- While the bundle is on, its page offers a switch per row, as for every bundle. The three rows work only together: switching `schedule` off leaves the task page without its service, and switching `time-context` off leaves the model without the current time for new reminders.
|
||||
- A profile patch or `--patch` overlay that targets `time-context`, `schedule`, or `ui-schedule` by id matches no row while this bundle is not selected: the loader warns `patch: entry <id> not found` for each such patch. Select this bundle instead of switching the rows on by id.
|
||||
|
||||
-----
|
||||
|
||||
@@ -9,7 +9,7 @@ kind: "package-bundle"
|
||||
|
||||
## 概述
|
||||
|
||||
此可选 Bundle 插入随发行版交付的 Web 组合所不含的三个定时条目:`time-context`、`schedule` 与 `ui-schedule`。它的清单设置 `dsh.bundle.rowSwitches: false`,因此插件管理器列出这三个条目及其状态,并只随 Bundle 一起开关它们。随包配置默认禁用。
|
||||
此可选 Bundle 插入随发行版交付的 Web 组合所不含的三个定时条目:`time-context`、`schedule` 与 `ui-schedule`。随包配置默认禁用。
|
||||
|
||||
## 目录
|
||||
|
||||
@@ -25,7 +25,7 @@ kind: "package-bundle"
|
||||
<a id="use-this-package"></a>
|
||||
## 使用此包
|
||||
|
||||
打开 Web 侧栏的插件管理页并启用带闹钟图标的“自动化任务”。此后,活跃的根智能体获得 `schedule_create`、`schedule_list`、`schedule_update` 与 `schedule_delete`,会话头部显示提醒目录,侧栏的自动化任务入口打开任务管理页面、右侧栏承载所选任务的详情,每个符合条件的步骤追加一条时钟读数,包含当前时间、打开请求所带的浏览器时区,以及距上一条模型可见消息的经过时间。此 Bundle 的页面列出时间感知、任务调度与任务界面及其状态;它们只随 Bundle 一起开关。禁用此 Bundle 会恢复随包组合;已存储的任务保留在磁盘上。
|
||||
打开 Web 侧栏的插件管理页并启用带闹钟图标的“自动化任务”。此后,活跃的根智能体获得 `schedule_create`、`schedule_list`、`schedule_update` 与 `schedule_delete`,会话头部显示提醒目录,侧栏的自动化任务入口打开任务管理页面、右侧栏承载所选任务的详情,每个符合条件的步骤追加一条时钟读数,包含当前时间、打开请求所带的浏览器时区,以及距上一条模型可见消息的经过时间。此 Bundle 的页面列出时间感知、任务调度与任务界面及其状态。禁用此 Bundle 会恢复随包组合;已存储的任务保留在磁盘上。
|
||||
|
||||
-----
|
||||
|
||||
@@ -35,12 +35,12 @@ kind: "package-bundle"
|
||||
<details>
|
||||
<summary>维护者信息 — 点击展开</summary>
|
||||
|
||||
`cordis.patch.yml` 插入这三个条目,`package.json` 依赖它们的包,使每个条目都从此 Bundle 解析。`dsh.bundle.rowSwitches: false` 让插件管理器拒绝单独开关这三个条目中的任何一个,因为这些 Host 条目与客户端条目只能一起工作;插件管理页不为它们绘制单条目开关。`packages/boot/app-boot/src/profile.ts` 的 `OPTIONAL_BUNDLES` 列出此包,`apps/cli` 依赖它,因此每次安装都随包携带且默认禁用,插件管理页在“官方”分组中提供它。选中后会把该 Bundle 追加到 profile 的 `dsh.profile.bundles` 列表。此纯配置包不拥有可变的运行时状态,因此不发布不变量伴随模块。
|
||||
`cordis.patch.yml` 插入这三个条目,`package.json` 依赖它们的包,使每个条目都从此 Bundle 解析。`packages/boot/app-boot/src/profile.ts` 的 `OPTIONAL_BUNDLES` 列出此包,`apps/cli` 依赖它,因此每次安装都随包携带且默认禁用,插件管理页在“官方”分组中提供它。选中后会把该 Bundle 追加到 profile 的 `dsh.profile.bundles` 列表。此纯配置包不拥有可变的运行时状态,因此不发布不变量伴随模块。
|
||||
|
||||
| 文件 | 作用 |
|
||||
|---|---|
|
||||
| [`cordis.patch.yml`](cordis.patch.yml) | 插入 `time-context`、`schedule` 与 `ui-schedule` 三个条目 |
|
||||
| [`package.json`](package.json) | 以依赖声明这些条目的包,并设置 `dsh.bundle.rowSwitches: false` |
|
||||
| [`package.json`](package.json) | 以依赖声明这些条目的包 |
|
||||
| [`locale/en.json`](locale/en.json)、[`locale/zh.json`](locale/zh.json) | 插件管理页的标题与描述 |
|
||||
| [`icon.svg`](icon.svg) | 插件管理页图标 |
|
||||
| [`src/index.ts`](src/index.ts) | 空的模块入口;补丁即运行时内容 |
|
||||
@@ -79,6 +79,7 @@ kind: "package-bundle"
|
||||
|
||||
<a id="known-limitations-and-deferred-work"></a>
|
||||
|
||||
- 此 Bundle 打开时,其页面像其他所有 Bundle 一样为每个条目提供开关。这三个条目只能一起工作:关掉 `schedule` 会让任务页面失去服务,关掉 `time-context` 会让模型在创建新提醒时拿不到当前时间。
|
||||
- 未选中此 Bundle 时,按 id 定位 `time-context`、`schedule` 或 `ui-schedule` 的 profile 补丁或 `--patch` overlay 匹配不到任何条目:加载器为每条这样的补丁报告一条 `patch: entry <id> not found` 警告。请选中此 Bundle,而不是按 id 打开这些条目。
|
||||
|
||||
-----
|
||||
|
||||
@@ -47,8 +47,7 @@
|
||||
},
|
||||
"dsh": {
|
||||
"bundle": {
|
||||
"patch": "./cordis.patch.yml",
|
||||
"rowSwitches": false
|
||||
"patch": "./cordis.patch.yml"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@ interface Manifest {
|
||||
publishConfig?: { access?: string }
|
||||
exports?: Record<string, unknown>
|
||||
dependencies?: Record<string, string>
|
||||
dsh?: { bundle?: { patch?: string; rowSwitches?: boolean } }
|
||||
dsh?: { bundle?: { patch?: string } }
|
||||
}
|
||||
|
||||
describe('experimental Schedule bundle', () => {
|
||||
@@ -30,8 +30,6 @@ describe('experimental Schedule bundle', () => {
|
||||
expect(manifest.dsh?.bundle?.patch).toBe('./cordis.patch.yml')
|
||||
expect(manifest.exports?.['./locale/*.json']).toBe('./locale/*.json')
|
||||
expect(manifest.exports?.['./cordis.patch.yml']).toBe('./cordis.patch.yml')
|
||||
// The rows work only together, so the plugin manager offers the bundle's switch alone.
|
||||
expect(manifest.dsh?.bundle?.rowSwitches).toBe(false)
|
||||
// Each inserted row names a package the bundle depends on, so the rows resolve from the bundle.
|
||||
expect(Object.keys(manifest.dependencies ?? {}).sort()).toEqual([
|
||||
'@deepseek-ai/dsh-client-ui-schedule', '@deepseek-ai/dsh-schedule', '@deepseek-ai/dsh-time-context',
|
||||
|
||||
Reference in new issue
Block a user