test(plugin): refresh official discovery browser and API evidence
This commit is contained in:
1 parent
8ed0b530ed
commit
c135bdf483
13 files changed
+38
-47
No files matched your search
@@ -2,9 +2,10 @@
|
||||
- button "卸载 @fixture/missing-bundle": 卸载
|
||||
- switch "启用 @fixture/missing-bundle" [checked]
|
||||
- heading "@fixture/missing-bundle" [level=3]
|
||||
- text: 异常
|
||||
- text: 异常 未安装
|
||||
- paragraph:
|
||||
- code: "@fixture/missing-bundle"
|
||||
- status: "原因: dsh: cannot resolve profile bundle \"@fixture/missing-bundle\" from the dsh installation or {{home}}/profiles/scaffold; run 'dsh plugin --profile scaffold install' if its dependency is not installed"
|
||||
- heading "包含的组件" [level=4]
|
||||
- paragraph: 这个插件包不包含任何组件。
|
||||
- heading "来源信息" [level=4]
|
||||
- term: 代码来源
|
||||
- definition: 未安装
|
||||
@@ -16,13 +16,3 @@
|
||||
- strong: tool-subagent
|
||||
- text: Model-facing subagent delegation tool over the ctx.subagents seam
|
||||
- code: tool-subagent-fork
|
||||
- listitem:
|
||||
- button "tool-subagent, tool-subagent-codex, 已停用":
|
||||
- strong: tool-subagent
|
||||
- text: 已停用 Model-facing subagent delegation tool over the ctx.subagents seam
|
||||
- code: tool-subagent-codex
|
||||
- listitem:
|
||||
- button "tool-subagent, tool-subagent-claude-code, 已停用":
|
||||
- strong: tool-subagent
|
||||
- text: 已停用 Model-facing subagent delegation tool over the ctx.subagents seam
|
||||
- code: tool-subagent-claude-code
|
||||
@@ -8,7 +8,7 @@ import { fileURLToPath } from 'node:url'
|
||||
import type { Browser, Locator, Page } from 'playwright'
|
||||
import { chromium } from 'playwright'
|
||||
import { FiberState } from '@deepseek-ai/cordis'
|
||||
import { OPTIONAL_BUNDLES } from '@deepseek-ai/dsh-app-boot'
|
||||
import { ON_DEMAND_BUNDLES, OPTIONAL_BUNDLES } from '@deepseek-ai/dsh-app-boot'
|
||||
import { createUserMessage } from '@deepseek-ai/dsh-llm'
|
||||
import { afterAll, beforeAll, describe, expect, it, onTestFailed, onTestFinished, vi } from 'vitest'
|
||||
import { join } from 'node:path'
|
||||
@@ -188,7 +188,7 @@ describe('web e2e: plugin manager', () => {
|
||||
// configuration-only items; an item card carries no action cell, so the
|
||||
// placeholder rows model the first four bundle cards.
|
||||
const loaded = await measure(official, ':scope > ul > li[data-plugin-package]')
|
||||
expect(await official.locator(':scope > ul > li[data-plugin-package]').count()).toBe(OPTIONAL_BUNDLES.length)
|
||||
expect(await official.locator(':scope > ul > li[data-plugin-package]').count()).toBe(OPTIONAL_BUNDLES.length + ON_DEMAND_BUNDLES.length)
|
||||
expect(loaded.rows).toHaveLength(loading.rows.length)
|
||||
const compare = (name: string, a: typeof loading.pageHeader, b: typeof loaded.pageHeader, axes: readonly (keyof typeof a)[] = ['x', 'y', 'width', 'height']) => {
|
||||
for (const axis of axes) {
|
||||
@@ -438,7 +438,7 @@ describe('web e2e: plugin manager', () => {
|
||||
// optional bundles open the Official group, followed by the official plugins that registered their
|
||||
// configuration, and its other bundles stay off the page.
|
||||
expect(await panel.locator('[data-plugin-group="bundles"] [data-plugin-package]').count()).toBe(2)
|
||||
expect(await panel.locator('[data-plugin-group="official"] [data-plugin-package]').count()).toBe(OPTIONAL_BUNDLES.length)
|
||||
expect(await panel.locator('[data-plugin-group="official"] [data-plugin-package]').count()).toBe(OPTIONAL_BUNDLES.length + ON_DEMAND_BUNDLES.length)
|
||||
expect(await panel.locator('[data-plugin-group="official"] [data-plugin-item]').count()).toBe(4)
|
||||
expect(await panel.getByText('实验性', { exact: true }).count())
|
||||
.toBe(OPTIONAL_BUNDLES.filter(name => name.startsWith('@deepseek-ai/dsh-experimental-')).length)
|
||||
@@ -846,7 +846,8 @@ describe('web e2e: plugin manager', () => {
|
||||
const install = dialog.getByRole('button', { name: '安装', exact: true })
|
||||
expect(await install.isDisabled()).toBe(true)
|
||||
expect(await dialog.getByRole('note').textContent()).toContain('请确认插件来源可信')
|
||||
expect(await dialog.getByRole('note').textContent()).toContain('暂不支持自动更新')
|
||||
expect(await dialog.getByRole('note').textContent()).toContain('按需安装的官方插件会在版本与 DSH 不同时提供“更新”')
|
||||
expect(await dialog.getByRole('note').textContent()).toContain('其他插件请先卸载再安装新版')
|
||||
await dialog.getByRole('button', { name: '插件安装引导和示例' }).click()
|
||||
// The guide carries the package-name example only; the former template strings keep their replacement reminder.
|
||||
await expect.poll(() => dialog.getByRole('listitem').count()).toBe(1)
|
||||
|
||||
@@ -165,8 +165,6 @@ describe('web e2e: settings modal and General preferences', () => {
|
||||
const instanceRows = [
|
||||
['tool-subagent', '已启用'],
|
||||
['tool-subagent-fork', '已启用'],
|
||||
['tool-subagent-codex', '已停用'],
|
||||
['tool-subagent-claude-code', '已停用'],
|
||||
] as const
|
||||
for (const [entryId, status] of instanceRows) {
|
||||
const row = dialog.locator(`[data-plugin-scope="preset"] [data-plugin-entry="${entryId}"]`)
|
||||
@@ -184,6 +182,7 @@ describe('web e2e: settings modal and General preferences', () => {
|
||||
expect(await identity.textContent()).toBe(entryId)
|
||||
expect(await identity.getAttribute('title')).toBe(entryId)
|
||||
}
|
||||
expect(await dialog.locator('[data-plugin-entry="tool-subagent-codex"], [data-plugin-entry="tool-subagent-claude-code"]').count()).toBe(0)
|
||||
const instancesSnapshot = await captureStableAria(
|
||||
page,
|
||||
'[data-plugin-scope="preset"] ul',
|
||||
@@ -191,10 +190,10 @@ describe('web e2e: settings modal and General preferences', () => {
|
||||
)
|
||||
await compareOrRefreshGolden(PLUGIN_INSTANCES_EXPECTED, instancesSnapshot, MODE)
|
||||
await dialog.getByRole('button', {
|
||||
name: 'tool-subagent, tool-subagent-claude-code, 已停用',
|
||||
name: 'tool-subagent, tool-subagent-fork, 已启用',
|
||||
exact: true,
|
||||
}).click()
|
||||
expect(await dialog.locator('[data-plugin-entry="tool-subagent-claude-code"] button')
|
||||
expect(await dialog.locator('[data-plugin-entry="tool-subagent-fork"] button')
|
||||
.getAttribute('aria-expanded')).toBe('true')
|
||||
await pluginSearch.fill('')
|
||||
// Close path 1: Escape.
|
||||
|
||||
@@ -56,9 +56,9 @@ This matrix shows which packages dispatch each harness-owned event and which pac
|
||||
| `llm/adapters-updated` | `emit` | [`packages/llm/llm/src/types.ts:23`](../packages/llm/llm/src/types.ts) | [`llm`](../packages/llm/llm) (`events.dispatch`) | [`acp`](../packages/acp/acp), `remotes` |
|
||||
| `llm/stream` | `waterfall` | [`packages/llm/llm/src/index.ts:75`](../packages/llm/llm/src/index.ts) | [`llm`](../packages/llm/llm) (`waterfall`) | [`llm-replay`](../packages/test-support/llm-replay), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), [`session-title`](../packages/session/session-title) |
|
||||
| `permission-presets/catalog-changed` | `emit` | [`packages/interaction/permission-presets/src/types.ts:48`](../packages/interaction/permission-presets/src/types.ts) | [`permission-presets`](../packages/interaction/permission-presets) (`events.dispatch`) | `remotes` |
|
||||
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:256`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:262`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:269`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:264`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:270`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:277`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `schedule/changed` | `emit` | [`packages/schedule/schedule/src/types.ts:478`](../packages/schedule/schedule/src/types.ts) | [`schedule`](../packages/schedule/schedule) (`emit`) | `remotes` |
|
||||
| `session-telemetry/record` | `waterfall` | [`packages/session/session-telemetry/src/index.ts:44`](../packages/session/session-telemetry/src/index.ts) | [`session-telemetry`](../packages/session/session-telemetry) (`waterfall`) | - |
|
||||
| `session/created` | `emit` | [`packages/core/session/src/index.ts:54`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`permission-presets`](../packages/interaction/permission-presets), [`schedule`](../packages/schedule/schedule), `server`, `session-controller`, [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-telemetry`](../packages/session/session-telemetry) |
|
||||
|
||||
@@ -58,9 +58,9 @@
|
||||
| `llm/adapters-updated` | `emit` | [`packages/llm/llm/src/types.ts:23`](../packages/llm/llm/src/types.ts) | [`llm`](../packages/llm/llm) (`events.dispatch`) | [`acp`](../packages/acp/acp), `remotes` |
|
||||
| `llm/stream` | `waterfall` | [`packages/llm/llm/src/index.ts:75`](../packages/llm/llm/src/index.ts) | [`llm`](../packages/llm/llm) (`waterfall`) | [`llm-replay`](../packages/test-support/llm-replay), [`session-checkpoint-policy`](../packages/session/session-checkpoint-policy), [`session-title`](../packages/session/session-title) |
|
||||
| `permission-presets/catalog-changed` | `emit` | [`packages/interaction/permission-presets/src/types.ts:48`](../packages/interaction/permission-presets/src/types.ts) | [`permission-presets`](../packages/interaction/permission-presets) (`events.dispatch`) | `remotes` |
|
||||
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:256`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:262`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:269`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/changed` | `emit` | [`packages/boot/plugin-manager/src/types.ts:264`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-log` | `emit` | [`packages/boot/plugin-manager/src/types.ts:270`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `plugin-manager/install-state` | `emit` | [`packages/boot/plugin-manager/src/types.ts:277`](../packages/boot/plugin-manager/src/types.ts) | [`plugin-manager`](../packages/boot/plugin-manager) (`emit`) | `remotes` |
|
||||
| `schedule/changed` | `emit` | [`packages/schedule/schedule/src/types.ts:478`](../packages/schedule/schedule/src/types.ts) | [`schedule`](../packages/schedule/schedule) (`emit`) | `remotes` |
|
||||
| `session-telemetry/record` | `waterfall` | [`packages/session/session-telemetry/src/index.ts:44`](../packages/session/session-telemetry/src/index.ts) | [`session-telemetry`](../packages/session/session-telemetry) (`waterfall`) | - |
|
||||
| `session/created` | `emit` | [`packages/core/session/src/index.ts:54`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`permission-presets`](../packages/interaction/permission-presets), [`schedule`](../packages/schedule/schedule), `server`, `session-controller`, [`session-projection`](../packages/session/session-projection), [`session-projection-cache`](../packages/session/session-projection-cache), [`session-telemetry`](../packages/session/session-telemetry) |
|
||||
|
||||
@@ -111,7 +111,7 @@ Manage profile files and apply their declared reload lifecycle.
|
||||
*/
|
||||
@Remote async listPlugins(): Promise<PluginInfo[]>
|
||||
|
||||
/** Read the profile's installed bundles, the bundles this dsh installation supplies, and the selected names that are not bundles.
|
||||
/** Read installed, installation-provided, and offline Official catalog bundles, plus selected non-bundle names.
|
||||
* A dependency without a bundle patch is listed, as a `not-bundle` problem, only while it is selected.
|
||||
* @returns Package versions, manifest descriptions, the installable spec of profile dependencies, rows, optional
|
||||
* display metadata, activation selections, whether the installation offers the bundle, and removal availability.
|
||||
@@ -153,7 +153,7 @@ Manage profile files and apply their declared reload lifecycle.
|
||||
* `package.json` and `pnpm-lock.yaml` as they were; downloaded files can stay.
|
||||
* @param spec One package spec, including local paths relative to the invocation directory.
|
||||
* @param options Whether to activate the installed bundle (defaults to true), the request id a cancellation names,
|
||||
* the pending build scripts to allow for this profile before pnpm runs, and the registry asked first.
|
||||
* the pending build scripts to allow, whether to save an exact dependency, and the registry asked first.
|
||||
* @returns Package-manager diagnostics, the registries asked, and the observed activation outcome.
|
||||
*/
|
||||
@Remote installBundle(spec: string, options?: InstallBundleOptions): Promise<ChangeResult>
|
||||
|
||||
@@ -111,7 +111,7 @@ Manage profile files and apply their declared reload lifecycle.
|
||||
*/
|
||||
@Remote async listPlugins(): Promise<PluginInfo[]>
|
||||
|
||||
/** Read the profile's installed bundles, the bundles this dsh installation supplies, and the selected names that are not bundles.
|
||||
/** Read installed, installation-provided, and offline Official catalog bundles, plus selected non-bundle names.
|
||||
* A dependency without a bundle patch is listed, as a `not-bundle` problem, only while it is selected.
|
||||
* @returns Package versions, manifest descriptions, the installable spec of profile dependencies, rows, optional
|
||||
* display metadata, activation selections, whether the installation offers the bundle, and removal availability.
|
||||
@@ -153,7 +153,7 @@ Manage profile files and apply their declared reload lifecycle.
|
||||
* `package.json` and `pnpm-lock.yaml` as they were; downloaded files can stay.
|
||||
* @param spec One package spec, including local paths relative to the invocation directory.
|
||||
* @param options Whether to activate the installed bundle (defaults to true), the request id a cancellation names,
|
||||
* the pending build scripts to allow for this profile before pnpm runs, and the registry asked first.
|
||||
* the pending build scripts to allow, whether to save an exact dependency, and the registry asked first.
|
||||
* @returns Package-manager diagnostics, the registries asked, and the observed activation outcome.
|
||||
*/
|
||||
@Remote installBundle(spec: string, options?: InstallBundleOptions): Promise<ChangeResult>
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
en: c4a301652b851ce9
|
||||
zh: 784871e19cd9db0a
|
||||
/deepseek-ai-dsh-app-boot/use-this-package/reading-plugin-display-metadata:
|
||||
en: 531a97b4e9717682
|
||||
zh: 0516f143c94c3d87
|
||||
en: ea0cb13f4273a135
|
||||
zh: a642b578b0e24dd9
|
||||
/deepseek-ai-dsh-app-boot/use-this-package/startup-and-reload-failures:
|
||||
en: b2e5cfdf8847d214
|
||||
zh: 8d65771a3bd8a7c9
|
||||
|
||||
@@ -102,9 +102,9 @@ The projector preserves native omission behavior by checking literal defaults ag
|
||||
|
||||
Use `readPluginMeta(specifier, parentURL)` or `ctx.pluginPackages.metaOf(specifier, parentURL)` to read installed package display text without importing or activating the plugin. Lookup uses the complete package specifier and the caller's resolution base, respecting Node exports. File paths and file URLs return no metadata without resolving resources. For a package-root specifier, missing locale fields fall back to the accessible `package.json`; a subpath specifier never reads a `package.json`. Malformed metadata returns an `error` diagnostic. Results retain translations for Client-side language selection. The reader also loads an image data URL, even when locale text is complete: a package root uses its manifest `icon`, or `<package>/icon` when that field is omitted; a subpath uses `<specifier>/icon`. An icon error preserves valid text alongside the diagnostic. See [Plugin display metadata](../../../docs/cookbook/adding-a-package.md#plugin-display-metadata) for the author format.
|
||||
|
||||
<a id="startup-and-reload-failures"></a>
|
||||
`ON_DEMAND_BUNDLES` names the public Official packages installed only on request. `OFFICIAL_ON_DEMAND_CATALOG` embeds their package-owned localized metadata and icons for offline discovery; build-time generation checks resource completeness and freshness without importing provider code. The catalog contains no version: management derives the target from `getDshRuntimeVersion()` and uses the ordinary bundle installer.
|
||||
|
||||
<a id="startup-and-reload-failures"></a>
|
||||
### Startup and reload failures
|
||||
|
||||
Profile reconciliation returns diagnostics for unchanged inactive entries without failing an unrelated mutation. A new inactive entry, a changed configuration or fiber, or a changed diagnostic fails reconciliation; removed fibers must still finish disposal. Active root rows that disappear or become literally disabled release their resources before replacement rows activate, so a singleton provider can drain in-flight work before its successor registers. Compilation and disposal checks use the same parsed root entries for each reconciliation. Explicit enablement targets must activate even when their failure predates the operation. Successful reconciliation emits `app-boot/config-reload` after lifecycle settlement and diagnostic checks, including programmatic updates without HMR. The event carries no diff or parsed config. Successful reconciliation returns after lifecycle settlement and diagnostic checks; volatile-only entry changes are committed by Loader during the update.
|
||||
|
||||
@@ -102,9 +102,9 @@ profile patch 可以将 `preset` 设为外层条目 id,把其余普通 patch
|
||||
|
||||
使用 `readPluginMeta(specifier, parentURL)` 或 `ctx.pluginPackages.metaOf(specifier, parentURL)` 读取已安装包的展示文本,无需导入或激活插件。查询使用完整包标识与调用方的解析基准,并遵循 Node exports。文件路径与文件 URL 不解析资源,直接返回无元信息。包根标识缺失的 locale 字段回退到可访问的 `package.json`;子路径标识从不读取 `package.json`。格式错误的元信息返回 `error` 诊断。结果保留翻译,由 Client 选择语言。即使 locale 文本完整,读取器也会加载图片 data URL:包根使用清单 `icon`,省略该字段时使用 `<包名>/icon`;子路径使用 `<标识>/icon`。图标出错时,保留有效文本并附上诊断。作者格式见[插件展示元信息](../../../docs/cookbook/adding-a-package.zh.md#plugin-display-metadata)。
|
||||
|
||||
<a id="startup-and-reload-failures"></a>
|
||||
`ON_DEMAND_BUNDLES` 列出仅按需安装的官方公开包。`OFFICIAL_ON_DEMAND_CATALOG` 内嵌这些包拥有的本地化元信息和图标,支持离线发现;构建时生成器检查资源完整性与新鲜度,不导入提供者代码。目录不保存版本;管理器通过 `getDshRuntimeVersion()` 确定目标版本,并使用普通组合包安装器。
|
||||
|
||||
<a id="startup-and-reload-failures"></a>
|
||||
### 启动与重载失败
|
||||
|
||||
profile 重载返回未变化的已有故障诊断,不让无关修改因此失败。新增未激活条目、配置或 fiber 变化、诊断变化都会使重载失败;被移除的 fiber 仍须完成释放。消失或被字面量禁用的活跃根条目先释放资源,再激活替代条目,因此单实例提供方可以先排空进行中的工作,再让后继者注册。每次重组时,编译与释放检查使用同一份已解析的根条目。显式启用的目标必须成功激活,即使它的故障早于本次操作。成功重载在生命周期结束及诊断检查通过后发出 `app-boot/config-reload`,包括未启用 HMR 时的程序化更新。事件不携带 diff 或解析后的配置。 成功重载在生命周期结束及诊断检查通过后返回;仅 volatile 的条目变化由 Loader 在更新过程中提交。
|
||||
|
||||
@@ -1897,7 +1897,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
],
|
||||
replaceRisk: 'none',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.add.actions\', () => ctx.slots.register(\n { name: \'plugins.add.actions\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:86',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:91',
|
||||
},
|
||||
{
|
||||
key: 'plugins.bundle.activation',
|
||||
@@ -1935,7 +1935,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
],
|
||||
replaceRisk: 'shadows-shipped-ui',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.bundle.activation\', () => ctx.slots.register(\n { name: \'plugins.bundle.activation\', key: \'<one key the owner dispatches>\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:88',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:93',
|
||||
},
|
||||
{
|
||||
key: 'plugins.bundle.config',
|
||||
@@ -1976,7 +1976,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
],
|
||||
replaceRisk: 'shadows-shipped-ui',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.bundle.config\', () => ctx.slots.register(\n { name: \'plugins.bundle.config\', key: \'<one key the owner dispatches>\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:104',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:109',
|
||||
},
|
||||
{
|
||||
key: 'plugins.detail.actions',
|
||||
@@ -2026,7 +2026,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
occupants: [],
|
||||
replaceRisk: 'none',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.detail.actions\', () => ctx.slots.register(\n { name: \'plugins.detail.actions\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:118',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:123',
|
||||
},
|
||||
{
|
||||
key: 'plugins.detail.badge',
|
||||
@@ -2076,7 +2076,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
occupants: [],
|
||||
replaceRisk: 'none',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.detail.badge\', () => ctx.slots.register(\n { name: \'plugins.detail.badge\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:123',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:128',
|
||||
},
|
||||
{
|
||||
key: 'plugins.detail.section',
|
||||
@@ -2126,7 +2126,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
occupants: [],
|
||||
replaceRisk: 'none',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.detail.section\', () => ctx.slots.register(\n { name: \'plugins.detail.section\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:130',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:135',
|
||||
},
|
||||
{
|
||||
key: 'plugins.item',
|
||||
@@ -2181,7 +2181,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
],
|
||||
replaceRisk: 'none',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.item\', () => ctx.slots.register(\n { name: \'plugins.item\', id: \'my-entry\', order: 100, label: \'My entry\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:98',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:103',
|
||||
},
|
||||
{
|
||||
key: 'plugins.row.config',
|
||||
@@ -2219,7 +2219,7 @@ export const CLIENT_SLOT_API: readonly ClientSlotEntry[] = [
|
||||
occupants: [],
|
||||
replaceRisk: 'none',
|
||||
example: 'return {\n inject: [\'slots\'],\n apply(ctx) {\n ctx.slots.inject(\'plugins.row.config\', () => ctx.slots.register(\n { name: \'plugins.row.config\', key: \'<one key the owner dispatches>\' },\n () => React.createElement(\'div\', null, \'hello\'),\n ))\n },\n}',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:112',
|
||||
source: 'packages/client/ui-plugin-manager/src/client/slot-contract.ts:117',
|
||||
},
|
||||
{
|
||||
key: 'rightbar',
|
||||
|
||||
@@ -1692,7 +1692,7 @@ export const SERVICE_API: readonly ServiceApiEntry[] = [
|
||||
},
|
||||
{
|
||||
signature: '@Remote async listBundles(): Promise<BundleInfo[]>',
|
||||
description: 'Read the profile\'s installed bundles, the bundles this dsh installation supplies, and the selected names that are not bundles. A dependency without a bundle patch is listed, as a `not-bundle` problem, only while it is selected.',
|
||||
description: 'Read installed, installation-provided, and offline Official catalog bundles, plus selected non-bundle names. A dependency without a bundle patch is listed, as a `not-bundle` problem, only while it is selected.',
|
||||
parameters: [],
|
||||
returns: 'Package versions, manifest descriptions, the installable spec of profile dependencies, rows, optional display metadata, activation selections, whether the installation offers the bundle, and removal availability.',
|
||||
},
|
||||
@@ -1723,7 +1723,7 @@ export const SERVICE_API: readonly ServiceApiEntry[] = [
|
||||
{
|
||||
signature: '@Remote installBundle(spec: string, options?: InstallBundleOptions): Promise<ChangeResult>',
|
||||
description: 'Install a package using the same pnpm implementation as dsh plugin. GitHub repositories get a connection check bounded by githubConnectionTimeoutMs before pnpm starts; only network failures or timeouts stop installation, while pnpm owns authentication and transport fallback. A run that fails, is cancelled, or adds a package without a bundle patch restores `package.json` and `pnpm-lock.yaml` as they were; downloaded files can stay.',
|
||||
parameters: [{ name: 'spec', description: 'One package spec, including local paths relative to the invocation directory.' }, { name: 'options', description: 'Whether to activate the installed bundle (defaults to true), the request id a cancellation names, the pending build scripts to allow for this profile before pnpm runs, and the registry asked first.' }],
|
||||
parameters: [{ name: 'spec', description: 'One package spec, including local paths relative to the invocation directory.' }, { name: 'options', description: 'Whether to activate the installed bundle (defaults to true), the request id a cancellation names, the pending build scripts to allow, whether to save an exact dependency, and the registry asked first.' }],
|
||||
returns: 'Package-manager diagnostics, the registries asked, and the observed activation outcome.',
|
||||
},
|
||||
{
|
||||
@@ -4854,7 +4854,7 @@ export const TYPE_API: readonly TypeApiEntry[] = [
|
||||
},
|
||||
{
|
||||
name: 'BundleInfo',
|
||||
declaration: 'export interface BundleInfo {\n name: string;\n version?: string;\n meta?: PluginLocalizedMeta;\n description?: string;\n enabled: boolean;\n installed: boolean;\n source?: string;\n optional: boolean;\n removable: boolean;\n readOnlyReason?: ReadOnlyReason;\n error?: ManagementError;\n rows: BundleRowInfo[];\n overrides: string[];\n}',
|
||||
declaration: 'export interface BundleInfo {\n name: string;\n official: boolean;\n availability: \'installation\' | \'profile\' | \'missing\';\n installTarget?: {\n spec: string;\n version: string;\n };\n version?: string;\n meta?: PluginLocalizedMeta;\n description?: string;\n enabled: boolean;\n installed: boolean;\n source?: string;\n optional: boolean;\n removable: boolean;\n readOnlyReason?: ReadOnlyReason;\n error?: ManagementError;\n rows: BundleRowInfo[];\n overrides: string[];\n}',
|
||||
},
|
||||
{
|
||||
name: 'BundleRowInfo',
|
||||
@@ -5578,7 +5578,7 @@ export const TYPE_API: readonly TypeApiEntry[] = [
|
||||
},
|
||||
{
|
||||
name: 'InstallBundleOptions',
|
||||
declaration: 'export interface InstallBundleOptions {\n enabled?: boolean;\n requestId?: PluginInstallRequestId;\n approvedBuilds?: string[];\n registry?: Registry;\n}',
|
||||
declaration: 'export interface InstallBundleOptions {\n enabled?: boolean;\n saveExact?: boolean;\n requestId?: PluginInstallRequestId;\n approvedBuilds?: string[];\n registry?: Registry;\n}',
|
||||
},
|
||||
{
|
||||
name: 'InstallSpecKind',
|
||||
|
||||
Reference in new issue
Block a user