@plumeai/plugin-sdk 0.1.4 → 0.1.5
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.
|
@@ -372,7 +372,6 @@ export declare const en: {
|
|
|
372
372
|
"market.title": string;
|
|
373
373
|
"market.skills": string;
|
|
374
374
|
"market.connectors": string;
|
|
375
|
-
"market.fromMarket": string;
|
|
376
375
|
"market.autoUpdate": string;
|
|
377
376
|
"market.updatesN": string;
|
|
378
377
|
"market.updatingN": string;
|
|
@@ -472,6 +471,20 @@ export declare const en: {
|
|
|
472
471
|
"common.other": string;
|
|
473
472
|
"common.openFolder": string;
|
|
474
473
|
"market.reload": string;
|
|
474
|
+
"market.moreShelves": string;
|
|
475
|
+
"market.skillsN": {
|
|
476
|
+
one: string;
|
|
477
|
+
other: string;
|
|
478
|
+
};
|
|
479
|
+
"market.addSkill": string;
|
|
480
|
+
"market.addConnector": string;
|
|
481
|
+
"market.writeSkill": string;
|
|
482
|
+
"market.writeSkillDetail": string;
|
|
483
|
+
"market.writeSkillPrompt": string;
|
|
484
|
+
"market.personalSkills": string;
|
|
485
|
+
"market.projects": string;
|
|
486
|
+
"market.projectShown": string;
|
|
487
|
+
"market.refreshInstalled": string;
|
|
475
488
|
"market.readingPlugins": string;
|
|
476
489
|
"pluginDetail.settings": string;
|
|
477
490
|
"pluginDetail.settingsAt": string;
|
|
@@ -351,7 +351,6 @@ export declare const zhCN: {
|
|
|
351
351
|
readonly "market.title": "插件市场";
|
|
352
352
|
readonly "market.skills": "技能";
|
|
353
353
|
readonly "market.connectors": "连接器";
|
|
354
|
-
readonly "market.fromMarket": "从市场添加";
|
|
355
354
|
readonly "market.autoUpdate": "自动更新";
|
|
356
355
|
readonly "market.updatesN": "{n} 个有新版本";
|
|
357
356
|
readonly "market.updatingN": "正在更新 {n} 个…";
|
|
@@ -442,6 +441,17 @@ export declare const zhCN: {
|
|
|
442
441
|
readonly "common.other": "其他";
|
|
443
442
|
readonly "common.openFolder": "打开目录";
|
|
444
443
|
readonly "market.reload": "重新读取";
|
|
444
|
+
readonly "market.moreShelves": "更多";
|
|
445
|
+
readonly "market.skillsN": "{n} 个技能";
|
|
446
|
+
readonly "market.addSkill": "添加技能";
|
|
447
|
+
readonly "market.addConnector": "添加连接器";
|
|
448
|
+
readonly "market.writeSkill": "让 agent 写一个";
|
|
449
|
+
readonly "market.writeSkillDetail": "开新对话";
|
|
450
|
+
readonly "market.writeSkillPrompt": "帮我写一个新技能,放在 ~/.plume/skills 下(一个目录,里面的 SKILL.md 开头写 name 和 description):";
|
|
451
|
+
readonly "market.personalSkills": "个人";
|
|
452
|
+
readonly "market.projects": "项目";
|
|
453
|
+
readonly "market.projectShown": "查看的项目";
|
|
454
|
+
readonly "market.refreshInstalled": "刷新";
|
|
445
455
|
readonly "market.readingPlugins": "正在读取插件目录";
|
|
446
456
|
readonly "pluginDetail.settings": "设置";
|
|
447
457
|
readonly "pluginDetail.settingsAt": "去 设置 › {place}";
|
|
@@ -1268,6 +1268,8 @@ export interface PluginManifest {
|
|
|
1268
1268
|
license?: string;
|
|
1269
1269
|
/** 详情页「试试这样问」,`plume.defaultPrompt`。 */
|
|
1270
1270
|
prompts?: string[];
|
|
1271
|
+
/** 技能合集带几个技能:不在 `package.json` 里,发市场时数 `skills/` 下的目录写进市场目录,只有 `readCatalogInfo` 读得到。 */
|
|
1272
|
+
skills?: number;
|
|
1271
1273
|
}
|
|
1272
1274
|
/** 一个启用着的插件。 */
|
|
1273
1275
|
export interface InstalledPlugin {
|
|
@@ -235,6 +235,11 @@ export interface PanelAvailabilityContext {
|
|
|
235
235
|
/** 有没有打开的会话:新对话还没发消息时是 false。只围着一个会话转的面板(侧边聊天、子 Agent)没有会话就不列。 */
|
|
236
236
|
session: boolean;
|
|
237
237
|
}
|
|
238
|
+
/** 会话建好之前人在输入框里选的模型(`SessionModel.id`)和思考档位;没有 `model` 是跟随父会话(独立会话用默认模型)。 */
|
|
239
|
+
export interface SessionChoice {
|
|
240
|
+
model?: string;
|
|
241
|
+
thinking?: ThinkingLevel;
|
|
242
|
+
}
|
|
238
243
|
/**
|
|
239
244
|
* 产品的对话视图画一个会话(插件自己的子会话:侧边聊天、子 Agent;或插件的独立会话:页面上的助手),和主列是同一套转录:
|
|
240
245
|
* 工具卡片、思考、运行行都一样。子会话等人批准时,审批卡压在主输入框上方,标明是哪个子会话在请求;独立会话不挂在哪个对话下,
|
|
@@ -251,18 +256,27 @@ export interface ConversationProps {
|
|
|
251
256
|
/** 输入框跨窗口保留文字、附件和引用时传 PanelProps.tab;页面上的助手传一个自己固定的名字。 */
|
|
252
257
|
draftKey?: string;
|
|
253
258
|
placeholder?: LocalizedText;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
259
|
+
/** `choice`:会话还没建、给了 `blank` 时,人在第一句之前选的模型和档位,插件建会话时照它给。 */
|
|
260
|
+
send(text: string, choice?: SessionChoice): void | Promise<void>;
|
|
261
|
+
/** 支持附件时接收完整消息;不提供时保持纯文字输入。`choice` 同 `send`。 */
|
|
262
|
+
sendMessage?(message: OutgoingMessage, choice?: SessionChoice): void | Promise<void>;
|
|
257
263
|
/** steer 运行时也能发,发送键不变停止键。 */
|
|
258
264
|
mode?: "turn" | "steer";
|
|
259
265
|
disabled?: boolean;
|
|
260
266
|
/**
|
|
261
|
-
*
|
|
267
|
+
* 发送按钮左边的模型和思考档位,量的是这个会话(子会话没选的跟着父会话,独立会话没选的用默认模型);会话还没建时只有给了 `blank` 才画。
|
|
262
268
|
* `choose`:和主输入框同一枚按钮,能换,子会话的模型菜单最前面多一项「跟随主会话」;`show`:只读的模型名和档位,悬停说明末尾接 `modelTip`。
|
|
263
269
|
* 不给就不画。插件经 `ui.composerItem(…, { side: "end" })` 加的格子(上下文用量)不用声明,会话在就画。
|
|
264
270
|
*/
|
|
265
271
|
model?: "choose" | "show";
|
|
272
|
+
/**
|
|
273
|
+
* 会话还没建(第一句还没发)时 `model: "choose"` 也画,人先选好,第一句发出去时选的经 `send`、`sendMessage` 的 `choice` 交回。
|
|
274
|
+
* `parentId`:第一句会开在哪个会话下面,菜单最前面的「跟随主会话」跟它,不给是独立会话;`model`:人没动过时插件要用的模型,不给就跟随父会话(独立会话用默认模型)。
|
|
275
|
+
*/
|
|
276
|
+
blank?: {
|
|
277
|
+
parentId?: string;
|
|
278
|
+
model?: string;
|
|
279
|
+
};
|
|
266
280
|
/** `model: "show"` 时悬停说明的最后一句:模型是怎么定下的、去哪里改。 */
|
|
267
281
|
modelTip?: LocalizedText;
|
|
268
282
|
/** 发送按钮左边、用量和模型前面,插件自己的东西。 */
|
|
@@ -421,6 +435,29 @@ export type NotifyLevel = "info" | "warn" | "error";
|
|
|
421
435
|
* (出错、跑到上限、卡住)而人还没打开看。人按停的、看着跑完的不留记号;在跑看摘要的 `running`。
|
|
422
436
|
*/
|
|
423
437
|
export type SessionActivity = "waiting" | "done" | "failed";
|
|
438
|
+
/**
|
|
439
|
+
* `page: "extensions-skills"`、`"extensions-connectors"` 的组件收到的:页头的刷新(技能还有项目选择)由「插件市场」画,
|
|
440
|
+
* 组件照着读、照着画列表。别的位置的组件什么也不收。
|
|
441
|
+
*/
|
|
442
|
+
export interface ExtensionsSectionProps {
|
|
443
|
+
/** 只给技能:选中的项目目录,null 是只看个人的(和插件带来的)。 */
|
|
444
|
+
project?: string | null;
|
|
445
|
+
/** 人点了刷新就变一次,组件跟着重读。 */
|
|
446
|
+
refreshKey?: number;
|
|
447
|
+
/** 打开一个插件的详情(「插件市场」里点开它看到的那一页)。`key` 是插件的目录名(`InstalledPlugin.dir` 的最后一段)。 */
|
|
448
|
+
openPlugin?(key: string): void;
|
|
449
|
+
}
|
|
450
|
+
/** 「插件市场」那一类页顶「添加」菜单里的一项,见 `SettingsSectionOptions.actions`。 */
|
|
451
|
+
export interface SectionAction {
|
|
452
|
+
label: LocalizedText;
|
|
453
|
+
/** 名字下面的一句小字。 */
|
|
454
|
+
detail?: LocalizedText;
|
|
455
|
+
icon?: ComponentType<{
|
|
456
|
+
size?: number;
|
|
457
|
+
strokeWidth?: number;
|
|
458
|
+
}>;
|
|
459
|
+
run(): void | Promise<void>;
|
|
460
|
+
}
|
|
424
461
|
export interface SettingsSectionOptions {
|
|
425
462
|
/**
|
|
426
463
|
* 这一节的标题:插件详情里「设置」下面的小标题;单独占导航一行时是那一行的字和页头标题。放进产品的页面里时只当无障碍名,
|
|
@@ -447,7 +484,8 @@ export interface SettingsSectionOptions {
|
|
|
447
484
|
* 画在哪。不给时画进这个插件的详情(「插件市场」里点开它看到的那一页)的「设置」一节:只和这个插件有关的
|
|
448
485
|
* 选项放这里,不占设置导航。用户不管装了哪个插件、都会到设置里直接找的功能才另给位置:
|
|
449
486
|
* - `nav` 单独占设置导航的一行(使用统计这类),页头由产品按 `title`、`detail` 画;
|
|
450
|
-
* - `extensions-skills`、`extensions-connectors`
|
|
487
|
+
* - `extensions-skills`、`extensions-connectors` 是「插件市场」页的「技能」「连接器」两类,画在筛选条的「已安装」里;
|
|
488
|
+
* 刷新(技能还有看哪个项目)由市场画在页头,经 `ExtensionsSectionProps` 交给组件。
|
|
451
489
|
* 给的是管技能、MCP 连接器的插件:装了哪些、开着没有、配好没有,和还能装什么放在一处看。
|
|
452
490
|
* - `general` 是「常规」页「常规」那张卡里的一行,排在「显示思考过程」后面:名字和说明由产品按 `title`、`detail` 画,
|
|
453
491
|
* 组件只画右边的控件(通常是一个 `Toggle`)。给的是随应用发、不能停用的插件自己的开关(智能标题总结)。
|
|
@@ -458,6 +496,12 @@ export interface SettingsSectionOptions {
|
|
|
458
496
|
* 「智能体」页只在有插件往里画东西时出现在导航里。给了位置的,插件详情里有一个去那里的入口。
|
|
459
497
|
*/
|
|
460
498
|
page?: "nav" | "general" | "personalization" | "agents" | "session-models" | "extensions-skills" | "extensions-connectors";
|
|
499
|
+
/**
|
|
500
|
+
* `page: "extensions-skills"`、`"extensions-connectors"` 时放进页顶「添加技能」「添加连接器」的条目,技能的排在产品自己那一项
|
|
501
|
+
* (让 agent 写一个)后面;只有一项时按钮直接做它。给的是只有这个插件做得到的添加方式(打开个人技能目录、手动添加连接器)。
|
|
502
|
+
* 跑完市场换到「已安装」,这一节接着画(比如弹出添加的对话框)。
|
|
503
|
+
*/
|
|
504
|
+
actions?: SectionAction[];
|
|
461
505
|
}
|
|
462
506
|
/**
|
|
463
507
|
* 产品的模型下拉:和输入框旁的模型菜单是同一份列表(常用、按供应商分组、搜索),最前面多一项「跟随」。
|
|
@@ -969,7 +1013,7 @@ export interface UiContext {
|
|
|
969
1013
|
*/
|
|
970
1014
|
openLink(url: string, sessionId: string | undefined): Promise<void>;
|
|
971
1015
|
/** 加一节设置,默认画进本插件的详情,`options.page` 改放到设置导航或产品的某一页;同一处按 order 从小到大。id 在插件内唯一。 */
|
|
972
|
-
settingsSection(id: string, component: ComponentType
|
|
1016
|
+
settingsSection(id: string, component: ComponentType<ExtensionsSectionProps>, options: SettingsSectionOptions): void;
|
|
973
1017
|
/** 截屏用的宿主能力,见 `ScreenCapture`。 */
|
|
974
1018
|
readonly screen: ScreenCapture;
|
|
975
1019
|
/** 截屏浮层里画的组件。同一时间只有一个,后注册的生效,它撤下后前一个恢复。 */
|
package/lib/manifest.mjs
CHANGED
package/package.json
CHANGED
package/skill/references/ui.md
CHANGED
|
@@ -405,7 +405,7 @@ function SidePanel({ tab }: PanelProps) {
|
|
|
405
405
|
```
|
|
406
406
|
|
|
407
407
|
- 不给 `composer` 就只读。默认按发送调 `send`,会话跑着时发送键换成停止键、按了调 `stop`,保持侧边聊天行为。`mode: "steer"` 时运行中也能发送,发送键不变停止键;`disabled` 保留但禁用操控区。停止可放在面板头部。
|
|
408
|
-
- 输入框右下和主输入框一样:插件经 `ui.composerItem(…, { side: "end" })` 加的格子(上下文用量)会话在就画,拿到的是子会话;`model: "choose"` 再画能换的模型和思考档位(菜单最前面是「跟随主会话」,选了就清掉子会话自己的),`model: "show"` 画只读的模型和档位、悬停说明末尾接 `modelTip
|
|
408
|
+
- 输入框右下和主输入框一样:插件经 `ui.composerItem(…, { side: "end" })` 加的格子(上下文用量)会话在就画,拿到的是子会话;`model: "choose"` 再画能换的模型和思考档位(菜单最前面是「跟随主会话」,选了就清掉子会话自己的),`model: "show"` 画只读的模型和档位、悬停说明末尾接 `modelTip`。量的都是下一轮实际会用的:子会话没选的跟着父会话。会话还没建(第一句没发)时这些都不画;要让人在第一句之前就选,给 `blank: { parentId, model }`(第一句开在哪个会话下面、人没动过时插件要用的模型),`model: "choose"` 的模型和档位照画(没有用量格子),选的经 `send(text, choice)`、`sendMessage(message, choice)` 的 `choice`(`SessionChoice`:`model` 没有是跟随父会话)交回,建会话时照它给 `ctx.sessions.create({ parentId, ...choice })`。`footer` 放插件自己的东西,排在它们前面。
|
|
409
409
|
- 提供 `sendMessage` 时输入框接入附件,交回完整 `OutgoingMessage`;不提供仍是纯文字。草稿与附件按子会话隔离,异步发送失败不会把文字还到另一个子会话。
|
|
410
410
|
- 需要保留草稿、接收划词引用或弹出窗口时设置 `composer.draftKey: tab`(`PanelProps.tab`)。未发送文字、附件和引用按标签保存,支持 `sendMessage`;弹出、收回先确认存储成功,失败阻止交接并保留内存草稿。发送时引用附在消息文字前面,发送失败保留草稿,关闭标签后清理草稿;是否允许关闭仍由面板的 `onClose` 决定。
|
|
411
411
|
- `renderUserMessage(message, fallback)` 只改当前视图用户消息的样子,可按 `origin === "parent"` 画任务卡,其余返回 fallback。`replyText(text, message)` 只过滤当前视图正文与复制,回报卡去重时只拿掉该条最终正文,不动工具和思考,也不改存储。回报卡复用 `ui.turnFooter`。
|
|
@@ -447,10 +447,18 @@ ui.settingsSection("usage", UsagePage, { title: (locale) => MESSAGES[locale].tit
|
|
|
447
447
|
ui.settingsSection("memory", MemorySettings, { title: (locale) => MESSAGES[locale].title, page: "personalization" });
|
|
448
448
|
```
|
|
449
449
|
|
|
450
|
-
管技能、MCP 连接器的插件给 `page: "extensions-skills"`、`"extensions-connectors"
|
|
450
|
+
管技能、MCP 连接器的插件给 `page: "extensions-skills"`、`"extensions-connectors"`:画进「插件市场」页「技能」「连接器」两类筛选条的「已安装」里(「全部」和各个货架是市场里的技能合集、连接器,由宿主画),宽度和设置页一样;插件详情里是「去 插件市场 › 技能」这样的入口,落在「已安装」。内置的 `plume.skills`、`plume.mcp` 就是这样放的。
|
|
451
|
+
|
|
452
|
+
- 刷新(技能还有看哪个项目)由宿主画在页头,组件经参数(`ExtensionsSectionProps`)拿到 `refreshKey`(人点了刷新就变)、`openPlugin(key)`(打开一个插件的详情,`key` 是插件目录名),技能的组件还拿到 `project`(选中的项目目录,null 是只看个人的),照着读、照着画列表。组件只画列表,不画自己的工具条。
|
|
453
|
+
- 只有这个插件做得到的添加方式经 `actions`(`SectionAction`:`label`、`detail`、`icon`、`run`)放进页顶「添加技能」「添加连接器」:技能的排在宿主自己那一项(让 agent 写一个)后面;只有一项时按钮直接做它。`run` 跑完宿主换到「已安装」,要弹对话框的,在 `run` 里记下、等那一节画出来再开(`plume.mcp` 的「手动添加」就是这样)。
|
|
451
454
|
|
|
452
455
|
```tsx
|
|
453
|
-
ui.settingsSection("skills",
|
|
456
|
+
ui.settingsSection("skills", (props) => <SkillsSettings {...props} />, {
|
|
457
|
+
title: (locale) => MESSAGES[locale].settingsTitle,
|
|
458
|
+
icon: WandSparkles,
|
|
459
|
+
page: "extensions-skills",
|
|
460
|
+
actions: [{ label: (locale) => MESSAGES[locale].openPersonalDir, icon: FolderOpen, run: () => api.reveal(null, null) }],
|
|
461
|
+
});
|
|
454
462
|
```
|
|
455
463
|
|
|
456
464
|
画进产品页的 `page` 有四种,宿主都不画这一节的页头,`title` 只当无障碍名(`general`、`session-models` 例外,见下);同一页的几节按 `order` 排:
|