@ycodium-ai/plugin-api 0.1.0 → 0.2.0

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/dist/ui.d.ts CHANGED
@@ -19,12 +19,15 @@
19
19
  * return {
20
20
  * pages: { overview: OverviewPage }, // key = manifest 里 ui.pages[].id
21
21
  * panels: { inspector: InspectorPanel }, // key = manifest 里 ui.panels[].id
22
+ * views: { detail: DetailView }, // 可选:宿主业务入口嵌入同一组件
22
23
  * };
23
24
  * }
24
25
  * ```
25
26
  *
26
- * - 每个插件只调用一次;返回值之外的副作用宿主不认。
27
+ * - 每台机器上每个已装载版本各注册一次;注册结果跟随该机器上的插件生命周期。
27
28
  * - `pages` 的组件不收 props;`panels` 的组件收 `{ environmentId, threadId }`。
29
+ * - `views` 是不新增导航入口的嵌入组件;调用方与插件约定 props,组件共用该包的
30
+ * React、翻译和机器作用域。旧宿主忽略它,支持的宿主在缺少组件时显示不可用状态。
28
31
  * - manifest 声明了、注册结果里没有的槽位,宿主画"加载失败"——声明与实现对不上
29
32
  * 是 bug,不是空态。
30
33
  * - 抛异常、默认导出不是函数、返回值形状不对,一律按装载失败处理:宿主不炸,
@@ -109,6 +112,23 @@
109
112
  export declare const PLUGIN_UI_GLOBAL_KEY = "__ycodiumPluginHost";
110
113
  /** UI 契约版本。加字段不动它;改已有字段的形状必须进位。 */
111
114
  export declare const PLUGIN_UI_BRIDGE_VERSION = 1;
115
+ /**
116
+ * 宿主在 `bridge.capabilities` 里声明的新动作。缺席时按方法在不在判断,
117
+ * 这样旧插件不会因为多了字段被拒载;新页面缺方法时必须走升级提示,不能当已实现去调。
118
+ */
119
+ export declare const PLUGIN_UI_HOST_CAPABILITIES: readonly ["createThread", "prepareWorkspace", "workspaceRefs", "composerDraft", "notify", "commandPalette"];
120
+ export type PluginUiHostCapability = (typeof PLUGIN_UI_HOST_CAPABILITIES)[number];
121
+ export declare const PLUGIN_UI_HOST_UPGRADE_MESSAGE = "This Ycodium app cannot do that from a plugin page. Update the app.";
122
+ export declare const PLUGIN_UI_HOST_COMMAND_PALETTE_UNAVAILABLE_MESSAGE = "The command palette is not available in this app. Add a project from the Projects tab.";
123
+ export declare function pluginUiHostHasCapability(bridge: {
124
+ readonly capabilities?: ReadonlyArray<string>;
125
+ readonly useCreateThread?: unknown;
126
+ readonly usePrepareWorkspace?: unknown;
127
+ readonly useWorkspaceRefs?: unknown;
128
+ readonly composerDraft?: unknown;
129
+ readonly notify?: unknown;
130
+ readonly openCommandPalette?: unknown;
131
+ }, capability: PluginUiHostCapability): boolean;
112
132
  /**
113
133
  * `react/jsx-runtime` 的三个导出。本包不引 react 类型,所以这里只保证"有这三个
114
134
  * 字段";shim 把它们原样 re-export 出去之后,类型由插件自己的 `@types/react` 给。
@@ -131,6 +151,33 @@ export interface PluginUiCommandQuery<Value = unknown> {
131
151
  readonly isUnavailable: boolean;
132
152
  readonly refresh: () => void;
133
153
  }
154
+ /** 跨机器查询的一台目标。payload 可以按机器不同,归属与凭据因此不会串。 */
155
+ export interface PluginUiCommandTarget {
156
+ readonly environmentId: string;
157
+ readonly payload?: unknown;
158
+ }
159
+ /** 已连接机器的只读身份。`pluginLoaded` 只谈**这个**插件在那台机器上。 */
160
+ export interface PluginUiConnectedEnvironment {
161
+ readonly environmentId: string;
162
+ readonly label: string;
163
+ /** 这台机器已经配了 serverConfig,页面可以问它。 */
164
+ readonly connected: boolean;
165
+ readonly pluginLoaded: boolean;
166
+ }
167
+ export interface PluginUiLocation {
168
+ readonly pathname: string;
169
+ /** 含前导 `?`;没有查询串时是空字符串。 */
170
+ readonly search: string;
171
+ }
172
+ /** 文档面板只描述标签,不持有文件系统或插件业务状态。 */
173
+ export interface PluginUiDocumentTab<Icon = unknown> {
174
+ readonly id: string;
175
+ readonly title: string;
176
+ readonly description?: string;
177
+ readonly status?: "loading" | "ready" | "error";
178
+ readonly icon?: Icon;
179
+ }
180
+ export type PluginUiNotifyTone = "info" | "success" | "warning" | "error";
134
181
  /**
135
182
  * 插件命令的单信封(ADR-0021 第 1 条)。`pluginId` 由宿主补上,插件填不了别人的
136
183
  * 名字;`payload` 的形状由插件自己声明的 JSON Schema 决定,宿主在信封入口校验。
@@ -146,12 +193,65 @@ export interface PluginUiCommands {
146
193
  * 未选定机器时返回空状态。refresh() 重新建立订阅。
147
194
  */
148
195
  useSubscription(command: string, payload?: unknown, options?: PluginUiCommandOptions): PluginUiCommandQuery;
196
+ /**
197
+ * 对若干台机器各发一次同一命令。`targets` 变长时这一钩子的调用次数不变——扇出在
198
+ * 宿主内部,插件不要自己对 `useQuery` 做变长循环。
199
+ */
200
+ useQueryEach(command: string, targets: ReadonlyArray<PluginUiCommandTarget>): {
201
+ readonly rows: ReadonlyArray<PluginUiCommandQuery & {
202
+ readonly environmentId: string;
203
+ }>;
204
+ readonly refresh: () => void;
205
+ };
149
206
  }
150
207
  /** 会话身份必须同时包含所属机器,不能根据当前机器猜测。 */
151
208
  export interface PluginUiThreadTarget {
152
209
  readonly environmentId: string;
153
210
  readonly threadId: string;
154
211
  }
212
+ /** 新建会话时要落到哪一个项目。 */
213
+ export interface PluginUiProjectTarget {
214
+ readonly environmentId: string;
215
+ readonly projectId: string;
216
+ }
217
+ export interface PluginUiComposerDraft {
218
+ readonly prompt: string;
219
+ readonly reviewComments: ReadonlyArray<unknown>;
220
+ }
221
+ export interface PluginUiWorkspaceRef {
222
+ readonly name: string;
223
+ readonly sha?: string | null;
224
+ readonly isDefault?: boolean;
225
+ readonly isRemote?: boolean;
226
+ readonly remoteName?: string | null;
227
+ }
228
+ export interface PluginUiPrepareWorkspaceInput {
229
+ readonly environmentId: string;
230
+ readonly cwd: string;
231
+ readonly reference: string;
232
+ readonly mode: "local" | "worktree";
233
+ readonly threadId?: string;
234
+ }
235
+ export interface PluginUiPrepareWorkspaceResult {
236
+ readonly branch: string;
237
+ readonly worktreePath: string | null;
238
+ readonly isOnPullRequestHead: boolean;
239
+ }
240
+ export interface PluginUiNotifyTaskHandle {
241
+ succeed(result: {
242
+ title: string;
243
+ description?: string;
244
+ }): void;
245
+ fail(result: {
246
+ title: string;
247
+ description?: string;
248
+ }): void;
249
+ }
250
+ export interface PluginUiComposerDraftApi {
251
+ get(target: unknown): PluginUiComposerDraft | null;
252
+ setPrompt(target: unknown, prompt: string): void;
253
+ setReviewComments(target: unknown, comments: ReadonlyArray<unknown>): void;
254
+ }
155
255
  export interface PluginUiI18n {
156
256
  /**
157
257
  * 插件自带 `locales/<locale>.json` 注册成的 `plugin:<pluginId>` 命名空间;
@@ -167,6 +267,11 @@ export interface PluginUiBridge<Ui = unknown, Layout = unknown, React = unknown>
167
267
  readonly version: number;
168
268
  /** 就是这个插件自己的 id,宿主填,插件改不了。 */
169
269
  readonly pluginId: string;
270
+ /**
271
+ * 这台宿主声明会做的新动作。缺席 = 旧宿主,请用 {@link pluginUiHostHasCapability}
272
+ * 判断,不要直接调可能不存在的方法。
273
+ */
274
+ readonly capabilities?: ReadonlyArray<PluginUiHostCapability>;
170
275
  readonly react: React;
171
276
  readonly jsxRuntime: PluginUiJsxRuntime;
172
277
  /** 宿主借出的通用组件(按钮、卡片、表格……)。 */
@@ -177,8 +282,61 @@ export interface PluginUiBridge<Ui = unknown, Layout = unknown, React = unknown>
177
282
  readonly commands: PluginUiCommands;
178
283
  /** 当前页面所属机器;是 hook,宿主切换机器时会重新渲染。 */
179
284
  useEnvironmentId(): string | null;
285
+ /** 工作区里已连接的机器,以及这个插件在各自上面跑没跑。是 hook。 */
286
+ useConnectedEnvironments(): readonly PluginUiConnectedEnvironment[];
287
+ /** 当前路由的 path 与 query;是 hook,宿主导航后会重新渲染。 */
288
+ useLocation(): PluginUiLocation;
180
289
  /** 按客户端的时间显示偏好格式化时间;hook 随偏好变化更新。 */
181
290
  useFormatTimestamp(): (iso: string) => string;
291
+ /** 一条短通知。语气缺省 info。第三参是可选说明,宿主弹层会单独画。 */
292
+ notify(message: string, tone?: PluginUiNotifyTone, detail?: string): void;
293
+ /** 进行中的活条目:同一条从 loading 改到成功或失败。 */
294
+ notifyTask(input: {
295
+ title: string;
296
+ description?: string;
297
+ }): PluginUiNotifyTaskHandle;
298
+ writeClipboard(text: string): Promise<void>;
299
+ /** 在系统浏览器打开 http(s) 链接;其它协议丢掉。 */
300
+ openExternal(url: string): void;
301
+ /** 打开宿主命令面板;`open` 只认宿主已有的入口名。 */
302
+ openCommandPalette(detail?: {
303
+ open?: string;
304
+ environmentId?: string;
305
+ }): void;
306
+ /**
307
+ * 在指定项目开一条新会话(或复用该项目的草稿)。是 hook。
308
+ * 检出/worktree 通过 `options` 交给宿主,插件自己不起 git。
309
+ */
310
+ useCreateThread(): (project: PluginUiProjectTarget, options?: {
311
+ branch?: string | null;
312
+ worktreePath?: string | null;
313
+ envMode?: string;
314
+ }) => Promise<{
315
+ draftId: string;
316
+ threadId: string;
317
+ } | null>;
318
+ /**
319
+ * 把工作区切到某个引用(本仓库或独立 worktree)。是 hook。
320
+ * 实际 git 仍走宿主 RPC,不把二进制解析权交给插件。
321
+ */
322
+ usePrepareWorkspace(): (input: PluginUiPrepareWorkspaceInput) => Promise<{
323
+ ok: true;
324
+ value: PluginUiPrepareWorkspaceResult;
325
+ } | {
326
+ ok: false;
327
+ error: string;
328
+ }>;
329
+ /** 列出工作区当前引用,用来判断叠放的 PR。是 hook。 */
330
+ useWorkspaceRefs(input: {
331
+ environmentId: string;
332
+ cwd: string;
333
+ includeMatchingRemoteRefs?: boolean;
334
+ limit?: number;
335
+ } | null): PluginUiCommandQuery<{
336
+ refs: ReadonlyArray<PluginUiWorkspaceRef>;
337
+ }>;
338
+ /** 读写宿主 composer 草稿。不经插件命令,因为草稿只活在客户端。 */
339
+ readonly composerDraft: PluginUiComposerDraftApi;
182
340
  /**
183
341
  * 受限跳转:只认自己的页面(`/x/<自己>` 及其子路径)与宿主公开路由。别的目标
184
342
  * 被丢弃并留一条 console 警告——插件不该把用户拽进另一个插件的页面。
@@ -196,18 +354,25 @@ export interface PluginUiBridge<Ui = unknown, Layout = unknown, React = unknown>
196
354
  */
197
355
  export interface PluginUiHostGlobal<Ui = unknown, Layout = unknown, React = unknown> {
198
356
  readonly version: number;
357
+ /** 新 bundle 的 API import 指向宿主模块;旧宿主缺少此表时应提示升级。 */
358
+ readonly modules?: {
359
+ readonly "@ycodium-ai/plugin-api": typeof import("./index.ts");
360
+ readonly "@ycodium-ai/plugin-api/ui": typeof import("./ui.ts");
361
+ };
199
362
  readonly react: React;
200
363
  readonly jsxRuntime: PluginUiJsxRuntime;
201
364
  readonly ui: Ui;
202
365
  readonly layout: Layout;
203
366
  }
204
367
  /** 注册函数的返回值。key 必须与 manifest 里声明的槽位 id 一一对上。 */
205
- export interface PluginUiRegistration<Page = unknown, Panel = unknown> {
368
+ export interface PluginUiRegistration<Page = unknown, Panel = unknown, View = unknown> {
206
369
  readonly pages?: Readonly<Record<string, Page>>;
207
370
  readonly panels?: Readonly<Record<string, Panel>>;
371
+ /** 不生成导航入口的嵌入视图。props 由插件与调用方约定,可包含本地 UI 回调。 */
372
+ readonly views?: Readonly<Record<string, View>>;
208
373
  }
209
374
  /** bundle 的默认导出。 */
210
- export type PluginUiRegister<Bridge = PluginUiBridge, Page = unknown, Panel = unknown> = (bridge: Bridge) => PluginUiRegistration<Page, Panel>;
375
+ export type PluginUiRegister<Bridge = PluginUiBridge, Page = unknown, Panel = unknown, View = unknown> = (bridge: Bridge) => PluginUiRegistration<Page, Panel, View>;
211
376
  /** 面板组件拿到的作用域:哪台机器、哪条会话。 */
212
377
  export interface PluginUiPanelProps {
213
378
  readonly environmentId: string;
package/dist/ui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/dist/ui.js CHANGED
@@ -19,12 +19,15 @@
19
19
  * return {
20
20
  * pages: { overview: OverviewPage }, // key = manifest 里 ui.pages[].id
21
21
  * panels: { inspector: InspectorPanel }, // key = manifest 里 ui.panels[].id
22
+ * views: { detail: DetailView }, // 可选:宿主业务入口嵌入同一组件
22
23
  * };
23
24
  * }
24
25
  * ```
25
26
  *
26
- * - 每个插件只调用一次;返回值之外的副作用宿主不认。
27
+ * - 每台机器上每个已装载版本各注册一次;注册结果跟随该机器上的插件生命周期。
27
28
  * - `pages` 的组件不收 props;`panels` 的组件收 `{ environmentId, threadId }`。
29
+ * - `views` 是不新增导航入口的嵌入组件;调用方与插件约定 props,组件共用该包的
30
+ * React、翻译和机器作用域。旧宿主忽略它,支持的宿主在缺少组件时显示不可用状态。
28
31
  * - manifest 声明了、注册结果里没有的槽位,宿主画"加载失败"——声明与实现对不上
29
32
  * 是 bug,不是空态。
30
33
  * - 抛异常、默认导出不是函数、返回值形状不对,一律按装载失败处理:宿主不炸,
@@ -109,4 +112,37 @@
109
112
  export const PLUGIN_UI_GLOBAL_KEY = "__ycodiumPluginHost";
110
113
  /** UI 契约版本。加字段不动它;改已有字段的形状必须进位。 */
111
114
  export const PLUGIN_UI_BRIDGE_VERSION = 1;
115
+ /**
116
+ * 宿主在 `bridge.capabilities` 里声明的新动作。缺席时按方法在不在判断,
117
+ * 这样旧插件不会因为多了字段被拒载;新页面缺方法时必须走升级提示,不能当已实现去调。
118
+ */
119
+ export const PLUGIN_UI_HOST_CAPABILITIES = [
120
+ "createThread",
121
+ "prepareWorkspace",
122
+ "workspaceRefs",
123
+ "composerDraft",
124
+ "notify",
125
+ "commandPalette",
126
+ ];
127
+ export const PLUGIN_UI_HOST_UPGRADE_MESSAGE = "This Ycodium app cannot do that from a plugin page. Update the app.";
128
+ export const PLUGIN_UI_HOST_COMMAND_PALETTE_UNAVAILABLE_MESSAGE = "The command palette is not available in this app. Add a project from the Projects tab.";
129
+ export function pluginUiHostHasCapability(bridge, capability) {
130
+ if (bridge.capabilities !== undefined) {
131
+ return bridge.capabilities.includes(capability);
132
+ }
133
+ switch (capability) {
134
+ case "createThread":
135
+ return typeof bridge.useCreateThread === "function";
136
+ case "prepareWorkspace":
137
+ return typeof bridge.usePrepareWorkspace === "function";
138
+ case "workspaceRefs":
139
+ return typeof bridge.useWorkspaceRefs === "function";
140
+ case "composerDraft":
141
+ return bridge.composerDraft !== undefined && bridge.composerDraft !== null;
142
+ case "notify":
143
+ return typeof bridge.notify === "function";
144
+ case "commandPalette":
145
+ return typeof bridge.openCommandPalette === "function";
146
+ }
147
+ }
112
148
  //# sourceMappingURL=ui.js.map
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0GG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAE1D,mCAAmC;AACnC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6GG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAE1D,mCAAmC;AACnC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,cAAc;IACd,kBAAkB;IAClB,eAAe;IACf,eAAe;IACf,QAAQ;IACR,gBAAgB;CACR,CAAC;AAGX,MAAM,CAAC,MAAM,8BAA8B,GACzC,qEAAqE,CAAC;AACxE,MAAM,CAAC,MAAM,kDAAkD,GAC7D,wFAAwF,CAAC;AAE3F,MAAM,UAAU,yBAAyB,CACvC,MAQC,EACD,UAAkC;IAElC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IACD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,cAAc;YACjB,OAAO,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU,CAAC;QACtD,KAAK,kBAAkB;YACrB,OAAO,OAAO,MAAM,CAAC,mBAAmB,KAAK,UAAU,CAAC;QAC1D,KAAK,eAAe;YAClB,OAAO,OAAO,MAAM,CAAC,gBAAgB,KAAK,UAAU,CAAC;QACvD,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;QAC7C,KAAK,gBAAgB;YACnB,OAAO,OAAO,MAAM,CAAC,kBAAkB,KAAK,UAAU,CAAC;IAC3D,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ycodium-ai/plugin-api",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Types and definePlugin for authoring Ycodium plugins. Zero runtime dependencies.",
5
5
  "keywords": [
6
6
  "ycodium",
@@ -8,7 +8,8 @@
8
8
  ],
9
9
  "license": "UNLICENSED",
10
10
  "files": [
11
- "dist"
11
+ "dist",
12
+ "css"
12
13
  ],
13
14
  "type": "module",
14
15
  "exports": {
@@ -19,12 +20,23 @@
19
20
  "./ui": {
20
21
  "types": "./dist/ui.d.ts",
21
22
  "import": "./dist/ui.js"
22
- }
23
+ },
24
+ "./conversation": {
25
+ "types": "./dist/conversation.d.ts",
26
+ "import": "./dist/conversation.js"
27
+ },
28
+ "./tool-display": {
29
+ "types": "./dist/tool-display.d.ts",
30
+ "import": "./dist/tool-display.js"
31
+ },
32
+ "./ui.css": "./css/ui.css"
23
33
  },
24
34
  "publishConfig": {
25
35
  "access": "public"
26
36
  },
27
37
  "devDependencies": {
38
+ "@tailwindcss/node": "^4.3.0",
39
+ "tailwindcss": "^4.0.0",
28
40
  "typescript": "~6.0.3",
29
41
  "vite-plus": "0.2.2"
30
42
  },