@vetta-org/plugin-sdk 0.3.0 → 0.3.2
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/manifest-schema.d.ts +75 -8
- package/dist/manifest-schema.d.ts.map +1 -1
- package/dist/manifest-schema.js +40 -5
- package/dist/manifest-schema.js.map +1 -1
- package/dist/manifest.d.ts +2 -2
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +32 -1
- package/dist/manifest.js.map +1 -1
- package/docs/.source.json +22 -0
- package/docs/README.md +112 -0
- package/docs/ability-details.md +424 -0
- package/docs/ai.md +121 -0
- package/docs/app-actions.md +111 -0
- package/docs/browser.md +80 -0
- package/docs/conversation-and-agent.md +619 -0
- package/docs/file-explorer.md +118 -0
- package/docs/getting-started.md +295 -0
- package/docs/guiding-the-agent.md +183 -0
- package/docs/manifest.md +371 -0
- package/docs/mcp.md +152 -0
- package/docs/media.md +141 -0
- package/docs/message-cards.md +188 -0
- package/docs/permissions.md +145 -0
- package/docs/styling-and-pitfalls.md +254 -0
- package/docs/system-plugins.md +58 -0
- package/docs/ui-slots.md +628 -0
- package/package.json +6 -3
|
@@ -250,6 +250,16 @@ export declare const PluginSkillPresentationSchema: import("@sinclair/typebox").
|
|
|
250
250
|
displayDescription: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
251
251
|
}>>>;
|
|
252
252
|
}>;
|
|
253
|
+
/** 角色 slug。跨插件引用的唯一词汇表,格式与智能体 id 一致。 */
|
|
254
|
+
export declare const PluginAgentRoleSchema: import("@sinclair/typebox").TString;
|
|
255
|
+
/**
|
|
256
|
+
* 宿主认识的角色词表。
|
|
257
|
+
*
|
|
258
|
+
* **不是白名单**:写表外的角色照样能被解析,只是团队编辑器里没有现成的槽位选择器。列在这里
|
|
259
|
+
* 的角色由预置插件供货,因此任何一台装机上都解析得到,第三方插件可以放心引用。
|
|
260
|
+
*/
|
|
261
|
+
export declare const BUILTIN_PLUGIN_AGENT_ROLES: readonly ["master", "developer", "researcher", "auditor", "business", "designer"];
|
|
262
|
+
export type BuiltinPluginAgentRole = (typeof BUILTIN_PLUGIN_AGENT_ROLES)[number];
|
|
253
263
|
/** 插件贡献的智能体(blueprint)。人设、头像、职责都由插件提供,宿主只负责铺档案。 */
|
|
254
264
|
export declare const PluginAgentProfileManifestSchema: import("@sinclair/typebox").TObject<{
|
|
255
265
|
/** 插件内唯一;全局 id 由宿主拼成 `plugin:<pluginId>:<id>`。 */
|
|
@@ -277,17 +287,36 @@ export declare const PluginAgentProfileManifestSchema: import("@sinclair/typebox
|
|
|
277
287
|
* 哪个老角色。
|
|
278
288
|
*/
|
|
279
289
|
legacyIds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
290
|
+
/**
|
|
291
|
+
* 本智能体能顶的角色 slug(≤ 8 个)。
|
|
292
|
+
*
|
|
293
|
+
* 声明了角色,别的插件就能用 `teams[].members[].role` 槽位引用到它,而不必知道它属于
|
|
294
|
+
* 哪个插件。这是提供方唯一要做的事——被谁引用、引用几次,提供方都不需要知道。
|
|
295
|
+
*/
|
|
296
|
+
roles: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
280
297
|
}>;
|
|
281
298
|
/**
|
|
282
|
-
*
|
|
299
|
+
* 插件贡献的团队成员。`agent` 与 `role` 二选一,必须恰好写一个。
|
|
283
300
|
*
|
|
284
|
-
* `agent
|
|
285
|
-
*
|
|
286
|
-
*
|
|
301
|
+
* - `agent`:**实体引用**。`<agentId>` 指本插件的智能体,`<pluginId>/<agentId>` 指别的插件的。
|
|
302
|
+
* - `role`:**角色槽位**。只声明「这里需要一个什么角色」,由宿主在全部已启用插件里解析。
|
|
303
|
+
*
|
|
304
|
+
* 推荐用角色槽位:消费方只耦合到一个角色名,提供方换人、换插件、被第三方取代都不影响它,
|
|
305
|
+
* 用户还能把槽位改绑到自己调教过的智能体。实体引用留给「就是要那个人」的场合。
|
|
306
|
+
*
|
|
307
|
+
* 跨插件引用不再被拒,但它带来的「提供方可能不在」由 `optional` 兜底,而不是让整支团队消失。
|
|
287
308
|
*/
|
|
288
309
|
export declare const PluginAgentTeamMemberManifestSchema: import("@sinclair/typebox").TObject<{
|
|
289
|
-
agent: import("@sinclair/typebox").TString
|
|
310
|
+
agent: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
311
|
+
role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
290
312
|
responsibility: import("@sinclair/typebox").TString;
|
|
313
|
+
/**
|
|
314
|
+
* 解析不到这名成员时,是否照常发布这支团队。
|
|
315
|
+
*
|
|
316
|
+
* 缺省值按引用方式走:本插件的实体引用为 `false`(自己的东西缺了就是配置错误),跨插件
|
|
317
|
+
* 实体引用与角色槽位为 `true`(提供方本来就可能不在场)。
|
|
318
|
+
*/
|
|
319
|
+
optional: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
291
320
|
}>;
|
|
292
321
|
/** 插件贡献的团队。第一个成员即队长,也是用户在会话里唯一的对话入口。 */
|
|
293
322
|
export declare const PluginAgentTeamManifestSchema: import("@sinclair/typebox").TObject<{
|
|
@@ -295,8 +324,16 @@ export declare const PluginAgentTeamManifestSchema: import("@sinclair/typebox").
|
|
|
295
324
|
name: import("@sinclair/typebox").TString;
|
|
296
325
|
description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
297
326
|
members: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
298
|
-
agent: import("@sinclair/typebox").TString
|
|
327
|
+
agent: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
328
|
+
role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
299
329
|
responsibility: import("@sinclair/typebox").TString;
|
|
330
|
+
/**
|
|
331
|
+
* 解析不到这名成员时,是否照常发布这支团队。
|
|
332
|
+
*
|
|
333
|
+
* 缺省值按引用方式走:本插件的实体引用为 `false`(自己的东西缺了就是配置错误),跨插件
|
|
334
|
+
* 实体引用与角色槽位为 `true`(提供方本来就可能不在场)。
|
|
335
|
+
*/
|
|
336
|
+
optional: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
300
337
|
}>>;
|
|
301
338
|
/** 队长的团队任务书:把这支团队的固定流水线写死。与 `workflowPath` 二选一。 */
|
|
302
339
|
workflow: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
@@ -357,14 +394,29 @@ export declare const PluginAgentManifestSchema: import("@sinclair/typebox").TObj
|
|
|
357
394
|
* 哪个老角色。
|
|
358
395
|
*/
|
|
359
396
|
legacyIds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
397
|
+
/**
|
|
398
|
+
* 本智能体能顶的角色 slug(≤ 8 个)。
|
|
399
|
+
*
|
|
400
|
+
* 声明了角色,别的插件就能用 `teams[].members[].role` 槽位引用到它,而不必知道它属于
|
|
401
|
+
* 哪个插件。这是提供方唯一要做的事——被谁引用、引用几次,提供方都不需要知道。
|
|
402
|
+
*/
|
|
403
|
+
roles: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
360
404
|
}>>>;
|
|
361
405
|
teams: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
362
406
|
id: import("@sinclair/typebox").TString;
|
|
363
407
|
name: import("@sinclair/typebox").TString;
|
|
364
408
|
description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
365
409
|
members: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
366
|
-
agent: import("@sinclair/typebox").TString
|
|
410
|
+
agent: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
411
|
+
role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
367
412
|
responsibility: import("@sinclair/typebox").TString;
|
|
413
|
+
/**
|
|
414
|
+
* 解析不到这名成员时,是否照常发布这支团队。
|
|
415
|
+
*
|
|
416
|
+
* 缺省值按引用方式走:本插件的实体引用为 `false`(自己的东西缺了就是配置错误),跨插件
|
|
417
|
+
* 实体引用与角色槽位为 `true`(提供方本来就可能不在场)。
|
|
418
|
+
*/
|
|
419
|
+
optional: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
368
420
|
}>>;
|
|
369
421
|
/** 队长的团队任务书:把这支团队的固定流水线写死。与 `workflowPath` 二选一。 */
|
|
370
422
|
workflow: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
@@ -483,14 +535,29 @@ export declare const PluginManifestSchema: import("@sinclair/typebox").TObject<{
|
|
|
483
535
|
* 哪个老角色。
|
|
484
536
|
*/
|
|
485
537
|
legacyIds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
538
|
+
/**
|
|
539
|
+
* 本智能体能顶的角色 slug(≤ 8 个)。
|
|
540
|
+
*
|
|
541
|
+
* 声明了角色,别的插件就能用 `teams[].members[].role` 槽位引用到它,而不必知道它属于
|
|
542
|
+
* 哪个插件。这是提供方唯一要做的事——被谁引用、引用几次,提供方都不需要知道。
|
|
543
|
+
*/
|
|
544
|
+
roles: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
486
545
|
}>>>;
|
|
487
546
|
teams: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
488
547
|
id: import("@sinclair/typebox").TString;
|
|
489
548
|
name: import("@sinclair/typebox").TString;
|
|
490
549
|
description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
491
550
|
members: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
492
|
-
agent: import("@sinclair/typebox").TString
|
|
551
|
+
agent: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
552
|
+
role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
493
553
|
responsibility: import("@sinclair/typebox").TString;
|
|
554
|
+
/**
|
|
555
|
+
* 解析不到这名成员时,是否照常发布这支团队。
|
|
556
|
+
*
|
|
557
|
+
* 缺省值按引用方式走:本插件的实体引用为 `false`(自己的东西缺了就是配置错误),跨插件
|
|
558
|
+
* 实体引用与角色槽位为 `true`(提供方本来就可能不在场)。
|
|
559
|
+
*/
|
|
560
|
+
optional: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
494
561
|
}>>;
|
|
495
562
|
/** 队长的团队任务书:把这支团队的固定流水线写死。与 `workflowPath` 二选一。 */
|
|
496
563
|
workflow: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-schema.d.ts","sourceRoot":"","sources":["../src/manifest-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\nimport { SkillSurfaceVisibilitySchema, SkillVisibilitySchema } from \"@vetta-org/capability-sdk\";\nimport { PLUGIN_PERMISSIONS } from \"./permissions.js\";\n\nconst NON_WHITESPACE_PATTERN = \"\\\\S\";\n\nexport const PluginIdSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-z0-9][a-z0-9._-]{0,63}$\",\n\tdescription: \"Stable lowercase plugin identifier.\",\n});\n\nexport const PluginVersionSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Plugin version without path separators.\",\n});\n\nexport const PluginCommandNameSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Bare executable name declared by the plugin.\",\n});\n\nexport const PluginCommandNamesSchema = Type.Array(PluginCommandNameSchema);\n\nconst PluginCliCommandSchema = Type.Object(\n\t{\n\t\tcommand: PluginCommandNameSchema,\n\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 30 * 60_000 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginCliProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tcommand: PluginCommandNameSchema,\n\t\tprobe: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: false },\n\t\t\t),\n\t\t),\n\t\tinstall: PluginCliCommandSchema,\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PluginServiceArchiveSchema = Type.Union([\n\tType.Literal(\"file\"),\n\tType.Literal(\"zip\"),\n\tType.Literal(\"tar.gz\"),\n]);\n\nexport const PluginServiceArtifactSchema = Type.Object(\n\t{\n\t\tsha256: Type.String({ pattern: \"^[a-f0-9]{64}$\" }),\n\t\tarchive: PluginServiceArchiveSchema,\n\t\t/** Relative file (archive=file) or directory (archive=zip/tar.gz) below the managed runtime root. */\n\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServicePlatformSchema = Type.Object(\n\t{\n\t\texecutable: Type.String({ minLength: 1, maxLength: 512 }),\n\t\tartifacts: Type.Array(PluginServiceArtifactSchema, { minItems: 1, maxItems: 8 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServiceProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\truntime: Type.Object(\n\t\t\t{\n\t\t\t\t/** `managed-binary` is the backwards-compatible default. */\n\t\t\t\tkind: Type.Optional(Type.Union([Type.Literal(\"managed-binary\"), Type.Literal(\"host-node\")])),\n\t\t\t\tversion: PluginVersionSchema,\n\t\t\t\t/** Entry script relative to the installed runtime (required for host-node). */\n\t\t\t\tentry: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n\t\t\t\tplatforms: Type.Record(\n\t\t\t\t\tType.String({ pattern: \"^(win32|darwin|linux)-(x64|arm64)$\" }),\n\t\t\t\t\tPluginServicePlatformSchema,\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\tcredentials: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: PluginIdSchema,\n\t\t\t\t\t\tbytes: Type.Optional(Type.Integer({ minimum: 16, maximum: 64 })),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 8 },\n\t\t\t),\n\t\t),\n\t\ttemplates: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tsource: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\t/** create preserves a data file; render regenerates a cache file on every start. */\n\t\t\t\t\t\tmode: Type.Union([Type.Literal(\"create\"), Type.Literal(\"render\")]),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 16 },\n\t\t\t),\n\t\t),\n\t\tprocess: Type.Object(\n\t\t\t{\n\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\tenv: Type.Optional(Type.Record(Type.String({ minLength: 1 }), Type.String())),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\thealth: Type.Object(\n\t\t\t{\n\t\t\t\tpath: Type.String({ minLength: 1, maxLength: 1_024, pattern: \"^/[^/]*\" }),\n\t\t\t\tcredentialId: Type.Optional(PluginIdSchema),\n\t\t\t\ttimeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\treadiness: Type.Optional(\n\t\t\t\t\tType.Object({ mode: Type.Literal(\"plugin\") }, { additionalProperties: false }),\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginProvidersManifestSchema = Type.Object(\n\t{\n\t\tcli: Type.Optional(Type.Array(PluginCliProviderManifestSchema, { minItems: 1, maxItems: 16 })),\n\t\tservices: Type.Optional(Type.Array(PluginServiceProviderManifestSchema, { minItems: 1, maxItems: 8 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginNetworkManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginBrowserManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginPermissionSchema = Type.Union(\n\tPLUGIN_PERMISSIONS.map((permission) => Type.Literal(permission)),\n\t{ description: \"Host capability requested by the plugin.\" },\n);\n\nconst NonWhitespaceStringSchema = Type.String({ pattern: NON_WHITESPACE_PATTERN });\nconst OptionalAgentModesSchema = Type.Optional(\n\tType.Union([NonWhitespaceStringSchema, Type.Array(NonWhitespaceStringSchema)]),\n);\nconst StringRecordSchema = Type.Record(Type.String(), Type.String());\n\nconst PluginMcpCommonProperties = {\n\tdisabled: Type.Optional(Type.Boolean()),\n\tautoApprove: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\tstartupTimeout: Type.Optional(Type.Number()),\n\tdebug: Type.Optional(Type.Boolean()),\n\tdisplayName: Type.Optional(Type.String()),\n\tdescription: Type.Optional(Type.String()),\n\tagent_mode: OptionalAgentModesSchema,\n};\n\nexport const PluginMcpStdioServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Optional(Type.Literal(\"stdio\")),\n\t\tcommand: NonWhitespaceStringSchema,\n\t\targs: Type.Optional(Type.Array(Type.String())),\n\t\tenv: Type.Optional(StringRecordSchema),\n\t\tcwd: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpHttpServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"http\"),\n\t\turl: NonWhitespaceStringSchema,\n\t\theaders: Type.Optional(StringRecordSchema),\n\t\toauthClientId: Type.Optional(Type.String()),\n\t\toauthDeviceFlow: Type.Optional(Type.Boolean()),\n\t\toauthScopes: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\n/** HTTP MCP served by one of this plugin's managed local services. */\nexport const PluginMcpServiceServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"service\"),\n\t\tserviceId: PluginIdSchema,\n\t\tpath: Type.String({ pattern: \"^/[^/]*\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpServerConfigSchema = Type.Union([\n\tPluginMcpStdioServerConfigSchema,\n\tPluginMcpHttpServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n]);\n\nconst PluginMcpServerMapSchema = Type.Record(\n\tType.String({ pattern: NON_WHITESPACE_PATTERN }),\n\tPluginMcpServerConfigSchema,\n\t{ additionalProperties: false },\n);\n\nexport const PluginSkillPresentationRuleSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tdisplayName: Type.Optional(NonWhitespaceStringSchema),\n\t\tdisplayDescription: Type.Optional(NonWhitespaceStringSchema),\n\t},\n\t{ additionalProperties: false },\n);\nexport const PluginSkillPresentationSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tskills: Type.Optional(Type.Record(NonWhitespaceStringSchema, PluginSkillPresentationRuleSchema)),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 插件贡献的智能体(blueprint)。人设、头像、职责都由插件提供,宿主只负责铺档案。 */\nexport const PluginAgentProfileManifestSchema = Type.Object(\n\t{\n\t\t/** 插件内唯一;全局 id 由宿主拼成 `plugin:<pluginId>:<id>`。 */\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\t/** 支持 `%key%` 占位,按插件 locales 解析。 */\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\t/** @ 提及用的短名;缺省用 `id`。 */\n\t\tmentionHandle: Type.Optional(Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" })),\n\t\t/** 插件包内的相对路径,指向头像图片。 */\n\t\tavatar: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 插件包内的相对路径,指向系统提示词 Markdown。与 `systemPrompt` 二选一。 */\n\t\tsystemPromptPath: Type.Optional(NonWhitespaceStringSchema),\n\t\tsystemPrompt: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\t/**\n\t\t * `all`(默认)继承宿主全部已启用能力;`own` 只用本插件的能力。\n\t\t * 两种模式下本插件的能力都强制激活,用户关不掉。\n\t\t */\n\t\tabilities: Type.Optional(Type.Union([Type.Literal(\"all\"), Type.Literal(\"own\")])),\n\t\t/**\n\t\t * 本智能体接管的历史 blueprint id。\n\t\t *\n\t\t * 用于「人设从别处迁进插件」:宿主解析不到这些 id 时折算到本智能体,回填时也据此\n\t\t * 认领用户已有的同角色档案,而不是再铺一份新的。宿主因此不必知道是哪个插件接管了\n\t\t * 哪个老角色。\n\t\t */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t},\n\t{ additionalProperties: false },\n);\n\n/**\n * 插件贡献的团队成员。\n *\n * `agent` 只能写本插件 `agents[]` 里的智能体 id。刻意不支持引用别的插件——那会让一个插件的\n * 可用性取决于另一个插件是否安装;宿主也没有内置人设可引用,装机自带的那几位同样由预置\n * 插件提供。引用不到的成员会让这一支团队整体被跳过。\n */\nexport const PluginAgentTeamMemberManifestSchema = Type.Object(\n\t{\n\t\tagent: NonWhitespaceStringSchema,\n\t\tresponsibility: Type.String({ maxLength: 2_000 }),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 插件贡献的团队。第一个成员即队长,也是用户在会话里唯一的对话入口。 */\nexport const PluginAgentTeamManifestSchema = Type.Object(\n\t{\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\tmembers: Type.Array(PluginAgentTeamMemberManifestSchema, { minItems: 1, maxItems: 32 }),\n\t\t/** 队长的团队任务书:把这支团队的固定流水线写死。与 `workflowPath` 二选一。 */\n\t\tworkflow: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\tworkflowPath: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 本团队接管的历史团队 id,语义同 `agents[].legacyIds`。 */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginAgentManifestSchema = Type.Object(\n\t{\n\t\tsystemPrompt: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tpromptPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tskillPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tskillPresentation: Type.Optional(PluginSkillPresentationSchema),\n\t\tagents: Type.Optional(Type.Array(PluginAgentProfileManifestSchema, { maxItems: 32 })),\n\t\tteams: Type.Optional(Type.Array(PluginAgentTeamManifestSchema, { maxItems: 32 })),\n\t\tmcpServers: Type.Optional(Type.Union([NonWhitespaceStringSchema, PluginMcpServerMapSchema])),\n\t\ttoolPolicy: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tallow: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t\tdeny: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginModuleFederationManifestSchema = Type.Object(\n\t{\n\t\tremoteName: Type.String({ pattern: \"^[A-Za-z_$][A-Za-z0-9_$-]{0,63}$\" }),\n\t\texpose: Type.String({ pattern: \"^\\\\./(?!.*\\\\.\\\\.)(?!.*\\\\\\\\).+$\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tname: NonWhitespaceStringSchema,\n\t\tversion: PluginVersionSchema,\n\t\tpluginApiVersion: NonWhitespaceStringSchema,\n\t\tentry: NonWhitespaceStringSchema,\n\t\tmoduleFederation: PluginModuleFederationManifestSchema,\n\t\tagent: Type.Optional(PluginAgentManifestSchema),\n\t\tproviders: Type.Optional(PluginProvidersManifestSchema),\n\t\tstyles: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tpermissions: Type.Optional(Type.Array(PluginPermissionSchema)),\n\t\tnetwork: Type.Optional(PluginNetworkManifestSchema),\n\t\tbrowser: Type.Optional(PluginBrowserManifestSchema),\n\t\tcommands: Type.Optional(PluginCommandNamesSchema),\n\t\tdescription: Type.Optional(Type.String()),\n\t\tauthor: Type.Optional(Type.String()),\n\t\ticon: Type.Optional(NonWhitespaceStringSchema),\n\t\tguidingWords: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tdefaultLocale: Type.Optional(\n\t\t\tType.String({ minLength: 2, maxLength: 16, pattern: \"^[a-zA-Z][a-zA-Z0-9-]{1,15}$\" }),\n\t\t),\n\t\tcontributionMode: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\thardIsolation: Type.Optional(Type.Boolean()),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tagent_mode: OptionalAgentModesSchema,\n\t},\n\t{\n\t\t$id: \"PluginManifest\",\n\t\tadditionalProperties: true,\n\t\tdescription: \"Vetta desktop plugin manifest (plugin.json).\",\n\t},\n);\n\nexport type PluginMcpServerConfig = Static<typeof PluginMcpServerConfigSchema>;\nexport type PluginAgentManifest = Static<typeof PluginAgentManifestSchema>;\nexport type PluginAgentProfileManifest = Static<typeof PluginAgentProfileManifestSchema>;\nexport type PluginAgentTeamManifest = Static<typeof PluginAgentTeamManifestSchema>;\nexport type PluginAgentTeamMemberManifest = Static<typeof PluginAgentTeamMemberManifestSchema>;\nexport type PluginSkillPresentation = Static<typeof PluginSkillPresentationSchema>;\nexport type PluginSkillPresentationRule = Static<typeof PluginSkillPresentationRuleSchema>;\nexport type PluginCliProviderManifest = Static<typeof PluginCliProviderManifestSchema>;\nexport type PluginServiceArtifact = Static<typeof PluginServiceArtifactSchema>;\nexport type PluginServicePlatform = Static<typeof PluginServicePlatformSchema>;\nexport type PluginServiceProviderManifest = Static<typeof PluginServiceProviderManifestSchema>;\nexport type PluginServiceRuntimeKind = \"managed-binary\" | \"host-node\";\nexport type PluginProvidersManifest = Static<typeof PluginProvidersManifestSchema>;\nexport type PluginNetworkManifest = Static<typeof PluginNetworkManifestSchema>;\nexport type PluginBrowserManifest = Static<typeof PluginBrowserManifestSchema>;\nexport type PluginManifestInput = Static<typeof PluginManifestSchema>;\nexport type PluginManifest = PluginManifestInput;\n"]}
|
|
1
|
+
{"version":3,"file":"manifest-schema.d.ts","sourceRoot":"","sources":["../src/manifest-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\nimport { SkillSurfaceVisibilitySchema, SkillVisibilitySchema } from \"@vetta-org/capability-sdk\";\nimport { PLUGIN_PERMISSIONS } from \"./permissions.js\";\n\nconst NON_WHITESPACE_PATTERN = \"\\\\S\";\n\nexport const PluginIdSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-z0-9][a-z0-9._-]{0,63}$\",\n\tdescription: \"Stable lowercase plugin identifier.\",\n});\n\nexport const PluginVersionSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Plugin version without path separators.\",\n});\n\nexport const PluginCommandNameSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Bare executable name declared by the plugin.\",\n});\n\nexport const PluginCommandNamesSchema = Type.Array(PluginCommandNameSchema);\n\nconst PluginCliCommandSchema = Type.Object(\n\t{\n\t\tcommand: PluginCommandNameSchema,\n\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 30 * 60_000 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginCliProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tcommand: PluginCommandNameSchema,\n\t\tprobe: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: false },\n\t\t\t),\n\t\t),\n\t\tinstall: PluginCliCommandSchema,\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PluginServiceArchiveSchema = Type.Union([\n\tType.Literal(\"file\"),\n\tType.Literal(\"zip\"),\n\tType.Literal(\"tar.gz\"),\n]);\n\nexport const PluginServiceArtifactSchema = Type.Object(\n\t{\n\t\tsha256: Type.String({ pattern: \"^[a-f0-9]{64}$\" }),\n\t\tarchive: PluginServiceArchiveSchema,\n\t\t/** Relative file (archive=file) or directory (archive=zip/tar.gz) below the managed runtime root. */\n\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServicePlatformSchema = Type.Object(\n\t{\n\t\texecutable: Type.String({ minLength: 1, maxLength: 512 }),\n\t\tartifacts: Type.Array(PluginServiceArtifactSchema, { minItems: 1, maxItems: 8 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServiceProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\truntime: Type.Object(\n\t\t\t{\n\t\t\t\t/** `managed-binary` is the backwards-compatible default. */\n\t\t\t\tkind: Type.Optional(Type.Union([Type.Literal(\"managed-binary\"), Type.Literal(\"host-node\")])),\n\t\t\t\tversion: PluginVersionSchema,\n\t\t\t\t/** Entry script relative to the installed runtime (required for host-node). */\n\t\t\t\tentry: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n\t\t\t\tplatforms: Type.Record(\n\t\t\t\t\tType.String({ pattern: \"^(win32|darwin|linux)-(x64|arm64)$\" }),\n\t\t\t\t\tPluginServicePlatformSchema,\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\tcredentials: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: PluginIdSchema,\n\t\t\t\t\t\tbytes: Type.Optional(Type.Integer({ minimum: 16, maximum: 64 })),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 8 },\n\t\t\t),\n\t\t),\n\t\ttemplates: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tsource: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\t/** create preserves a data file; render regenerates a cache file on every start. */\n\t\t\t\t\t\tmode: Type.Union([Type.Literal(\"create\"), Type.Literal(\"render\")]),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 16 },\n\t\t\t),\n\t\t),\n\t\tprocess: Type.Object(\n\t\t\t{\n\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\tenv: Type.Optional(Type.Record(Type.String({ minLength: 1 }), Type.String())),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\thealth: Type.Object(\n\t\t\t{\n\t\t\t\tpath: Type.String({ minLength: 1, maxLength: 1_024, pattern: \"^/[^/]*\" }),\n\t\t\t\tcredentialId: Type.Optional(PluginIdSchema),\n\t\t\t\ttimeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\treadiness: Type.Optional(\n\t\t\t\t\tType.Object({ mode: Type.Literal(\"plugin\") }, { additionalProperties: false }),\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginProvidersManifestSchema = Type.Object(\n\t{\n\t\tcli: Type.Optional(Type.Array(PluginCliProviderManifestSchema, { minItems: 1, maxItems: 16 })),\n\t\tservices: Type.Optional(Type.Array(PluginServiceProviderManifestSchema, { minItems: 1, maxItems: 8 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginNetworkManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginBrowserManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginPermissionSchema = Type.Union(\n\tPLUGIN_PERMISSIONS.map((permission) => Type.Literal(permission)),\n\t{ description: \"Host capability requested by the plugin.\" },\n);\n\nconst NonWhitespaceStringSchema = Type.String({ pattern: NON_WHITESPACE_PATTERN });\nconst OptionalAgentModesSchema = Type.Optional(\n\tType.Union([NonWhitespaceStringSchema, Type.Array(NonWhitespaceStringSchema)]),\n);\nconst StringRecordSchema = Type.Record(Type.String(), Type.String());\n\nconst PluginMcpCommonProperties = {\n\tdisabled: Type.Optional(Type.Boolean()),\n\tautoApprove: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\tstartupTimeout: Type.Optional(Type.Number()),\n\tdebug: Type.Optional(Type.Boolean()),\n\tdisplayName: Type.Optional(Type.String()),\n\tdescription: Type.Optional(Type.String()),\n\tagent_mode: OptionalAgentModesSchema,\n};\n\nexport const PluginMcpStdioServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Optional(Type.Literal(\"stdio\")),\n\t\tcommand: NonWhitespaceStringSchema,\n\t\targs: Type.Optional(Type.Array(Type.String())),\n\t\tenv: Type.Optional(StringRecordSchema),\n\t\tcwd: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpHttpServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"http\"),\n\t\turl: NonWhitespaceStringSchema,\n\t\theaders: Type.Optional(StringRecordSchema),\n\t\toauthClientId: Type.Optional(Type.String()),\n\t\toauthDeviceFlow: Type.Optional(Type.Boolean()),\n\t\toauthScopes: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\n/** HTTP MCP served by one of this plugin's managed local services. */\nexport const PluginMcpServiceServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"service\"),\n\t\tserviceId: PluginIdSchema,\n\t\tpath: Type.String({ pattern: \"^/[^/]*\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpServerConfigSchema = Type.Union([\n\tPluginMcpStdioServerConfigSchema,\n\tPluginMcpHttpServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n]);\n\nconst PluginMcpServerMapSchema = Type.Record(\n\tType.String({ pattern: NON_WHITESPACE_PATTERN }),\n\tPluginMcpServerConfigSchema,\n\t{ additionalProperties: false },\n);\n\nexport const PluginSkillPresentationRuleSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tdisplayName: Type.Optional(NonWhitespaceStringSchema),\n\t\tdisplayDescription: Type.Optional(NonWhitespaceStringSchema),\n\t},\n\t{ additionalProperties: false },\n);\nexport const PluginSkillPresentationSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tskills: Type.Optional(Type.Record(NonWhitespaceStringSchema, PluginSkillPresentationRuleSchema)),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 角色 slug。跨插件引用的唯一词汇表,格式与智能体 id 一致。 */\nexport const PluginAgentRoleSchema = Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" });\n\n/**\n * 宿主认识的角色词表。\n *\n * **不是白名单**:写表外的角色照样能被解析,只是团队编辑器里没有现成的槽位选择器。列在这里\n * 的角色由预置插件供货,因此任何一台装机上都解析得到,第三方插件可以放心引用。\n */\nexport const BUILTIN_PLUGIN_AGENT_ROLES = [\n\t\"master\",\n\t\"developer\",\n\t\"researcher\",\n\t\"auditor\",\n\t\"business\",\n\t\"designer\",\n] as const;\n\nexport type BuiltinPluginAgentRole = (typeof BUILTIN_PLUGIN_AGENT_ROLES)[number];\n\n/** 插件贡献的智能体(blueprint)。人设、头像、职责都由插件提供,宿主只负责铺档案。 */\nexport const PluginAgentProfileManifestSchema = Type.Object(\n\t{\n\t\t/** 插件内唯一;全局 id 由宿主拼成 `plugin:<pluginId>:<id>`。 */\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\t/** 支持 `%key%` 占位,按插件 locales 解析。 */\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\t/** @ 提及用的短名;缺省用 `id`。 */\n\t\tmentionHandle: Type.Optional(Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" })),\n\t\t/** 插件包内的相对路径,指向头像图片。 */\n\t\tavatar: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 插件包内的相对路径,指向系统提示词 Markdown。与 `systemPrompt` 二选一。 */\n\t\tsystemPromptPath: Type.Optional(NonWhitespaceStringSchema),\n\t\tsystemPrompt: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\t/**\n\t\t * `all`(默认)继承宿主全部已启用能力;`own` 只用本插件的能力。\n\t\t * 两种模式下本插件的能力都强制激活,用户关不掉。\n\t\t */\n\t\tabilities: Type.Optional(Type.Union([Type.Literal(\"all\"), Type.Literal(\"own\")])),\n\t\t/**\n\t\t * 本智能体接管的历史 blueprint id。\n\t\t *\n\t\t * 用于「人设从别处迁进插件」:宿主解析不到这些 id 时折算到本智能体,回填时也据此\n\t\t * 认领用户已有的同角色档案,而不是再铺一份新的。宿主因此不必知道是哪个插件接管了\n\t\t * 哪个老角色。\n\t\t */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t\t/**\n\t\t * 本智能体能顶的角色 slug(≤ 8 个)。\n\t\t *\n\t\t * 声明了角色,别的插件就能用 `teams[].members[].role` 槽位引用到它,而不必知道它属于\n\t\t * 哪个插件。这是提供方唯一要做的事——被谁引用、引用几次,提供方都不需要知道。\n\t\t */\n\t\troles: Type.Optional(Type.Array(PluginAgentRoleSchema, { maxItems: 8 })),\n\t},\n\t{ additionalProperties: false },\n);\n\n/**\n * 插件贡献的团队成员。`agent` 与 `role` 二选一,必须恰好写一个。\n *\n * - `agent`:**实体引用**。`<agentId>` 指本插件的智能体,`<pluginId>/<agentId>` 指别的插件的。\n * - `role`:**角色槽位**。只声明「这里需要一个什么角色」,由宿主在全部已启用插件里解析。\n *\n * 推荐用角色槽位:消费方只耦合到一个角色名,提供方换人、换插件、被第三方取代都不影响它,\n * 用户还能把槽位改绑到自己调教过的智能体。实体引用留给「就是要那个人」的场合。\n *\n * 跨插件引用不再被拒,但它带来的「提供方可能不在」由 `optional` 兜底,而不是让整支团队消失。\n */\nexport const PluginAgentTeamMemberManifestSchema = Type.Object(\n\t{\n\t\tagent: Type.Optional(NonWhitespaceStringSchema),\n\t\trole: Type.Optional(PluginAgentRoleSchema),\n\t\tresponsibility: Type.String({ maxLength: 2_000 }),\n\t\t/**\n\t\t * 解析不到这名成员时,是否照常发布这支团队。\n\t\t *\n\t\t * 缺省值按引用方式走:本插件的实体引用为 `false`(自己的东西缺了就是配置错误),跨插件\n\t\t * 实体引用与角色槽位为 `true`(提供方本来就可能不在场)。\n\t\t */\n\t\toptional: Type.Optional(Type.Boolean()),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 插件贡献的团队。第一个成员即队长,也是用户在会话里唯一的对话入口。 */\nexport const PluginAgentTeamManifestSchema = Type.Object(\n\t{\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\tmembers: Type.Array(PluginAgentTeamMemberManifestSchema, { minItems: 1, maxItems: 32 }),\n\t\t/** 队长的团队任务书:把这支团队的固定流水线写死。与 `workflowPath` 二选一。 */\n\t\tworkflow: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\tworkflowPath: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 本团队接管的历史团队 id,语义同 `agents[].legacyIds`。 */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginAgentManifestSchema = Type.Object(\n\t{\n\t\tsystemPrompt: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tpromptPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tskillPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tskillPresentation: Type.Optional(PluginSkillPresentationSchema),\n\t\tagents: Type.Optional(Type.Array(PluginAgentProfileManifestSchema, { maxItems: 32 })),\n\t\tteams: Type.Optional(Type.Array(PluginAgentTeamManifestSchema, { maxItems: 32 })),\n\t\tmcpServers: Type.Optional(Type.Union([NonWhitespaceStringSchema, PluginMcpServerMapSchema])),\n\t\ttoolPolicy: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tallow: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t\tdeny: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginModuleFederationManifestSchema = Type.Object(\n\t{\n\t\tremoteName: Type.String({ pattern: \"^[A-Za-z_$][A-Za-z0-9_$-]{0,63}$\" }),\n\t\texpose: Type.String({ pattern: \"^\\\\./(?!.*\\\\.\\\\.)(?!.*\\\\\\\\).+$\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tname: NonWhitespaceStringSchema,\n\t\tversion: PluginVersionSchema,\n\t\tpluginApiVersion: NonWhitespaceStringSchema,\n\t\tentry: NonWhitespaceStringSchema,\n\t\tmoduleFederation: PluginModuleFederationManifestSchema,\n\t\tagent: Type.Optional(PluginAgentManifestSchema),\n\t\tproviders: Type.Optional(PluginProvidersManifestSchema),\n\t\tstyles: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tpermissions: Type.Optional(Type.Array(PluginPermissionSchema)),\n\t\tnetwork: Type.Optional(PluginNetworkManifestSchema),\n\t\tbrowser: Type.Optional(PluginBrowserManifestSchema),\n\t\tcommands: Type.Optional(PluginCommandNamesSchema),\n\t\tdescription: Type.Optional(Type.String()),\n\t\tauthor: Type.Optional(Type.String()),\n\t\ticon: Type.Optional(NonWhitespaceStringSchema),\n\t\tguidingWords: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tdefaultLocale: Type.Optional(\n\t\t\tType.String({ minLength: 2, maxLength: 16, pattern: \"^[a-zA-Z][a-zA-Z0-9-]{1,15}$\" }),\n\t\t),\n\t\tcontributionMode: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\thardIsolation: Type.Optional(Type.Boolean()),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tagent_mode: OptionalAgentModesSchema,\n\t},\n\t{\n\t\t$id: \"PluginManifest\",\n\t\tadditionalProperties: true,\n\t\tdescription: \"Vetta desktop plugin manifest (plugin.json).\",\n\t},\n);\n\nexport type PluginMcpServerConfig = Static<typeof PluginMcpServerConfigSchema>;\nexport type PluginAgentManifest = Static<typeof PluginAgentManifestSchema>;\nexport type PluginAgentProfileManifest = Static<typeof PluginAgentProfileManifestSchema>;\nexport type PluginAgentTeamManifest = Static<typeof PluginAgentTeamManifestSchema>;\nexport type PluginAgentTeamMemberManifest = Static<typeof PluginAgentTeamMemberManifestSchema>;\nexport type PluginSkillPresentation = Static<typeof PluginSkillPresentationSchema>;\nexport type PluginSkillPresentationRule = Static<typeof PluginSkillPresentationRuleSchema>;\nexport type PluginCliProviderManifest = Static<typeof PluginCliProviderManifestSchema>;\nexport type PluginServiceArtifact = Static<typeof PluginServiceArtifactSchema>;\nexport type PluginServicePlatform = Static<typeof PluginServicePlatformSchema>;\nexport type PluginServiceProviderManifest = Static<typeof PluginServiceProviderManifestSchema>;\nexport type PluginServiceRuntimeKind = \"managed-binary\" | \"host-node\";\nexport type PluginProvidersManifest = Static<typeof PluginProvidersManifestSchema>;\nexport type PluginNetworkManifest = Static<typeof PluginNetworkManifestSchema>;\nexport type PluginBrowserManifest = Static<typeof PluginBrowserManifestSchema>;\nexport type PluginManifestInput = Static<typeof PluginManifestSchema>;\nexport type PluginManifest = PluginManifestInput;\n"]}
|
package/dist/manifest-schema.js
CHANGED
|
@@ -151,6 +151,22 @@ export const PluginSkillPresentationSchema = Type.Object({
|
|
|
151
151
|
surfaces: Type.Optional(SkillSurfaceVisibilitySchema),
|
|
152
152
|
skills: Type.Optional(Type.Record(NonWhitespaceStringSchema, PluginSkillPresentationRuleSchema)),
|
|
153
153
|
}, { additionalProperties: false });
|
|
154
|
+
/** 角色 slug。跨插件引用的唯一词汇表,格式与智能体 id 一致。 */
|
|
155
|
+
export const PluginAgentRoleSchema = Type.String({ pattern: "^[a-z0-9][a-z0-9-]{0,63}$" });
|
|
156
|
+
/**
|
|
157
|
+
* 宿主认识的角色词表。
|
|
158
|
+
*
|
|
159
|
+
* **不是白名单**:写表外的角色照样能被解析,只是团队编辑器里没有现成的槽位选择器。列在这里
|
|
160
|
+
* 的角色由预置插件供货,因此任何一台装机上都解析得到,第三方插件可以放心引用。
|
|
161
|
+
*/
|
|
162
|
+
export const BUILTIN_PLUGIN_AGENT_ROLES = [
|
|
163
|
+
"master",
|
|
164
|
+
"developer",
|
|
165
|
+
"researcher",
|
|
166
|
+
"auditor",
|
|
167
|
+
"business",
|
|
168
|
+
"designer",
|
|
169
|
+
];
|
|
154
170
|
/** 插件贡献的智能体(blueprint)。人设、头像、职责都由插件提供,宿主只负责铺档案。 */
|
|
155
171
|
export const PluginAgentProfileManifestSchema = Type.Object({
|
|
156
172
|
/** 插件内唯一;全局 id 由宿主拼成 `plugin:<pluginId>:<id>`。 */
|
|
@@ -178,17 +194,36 @@ export const PluginAgentProfileManifestSchema = Type.Object({
|
|
|
178
194
|
* 哪个老角色。
|
|
179
195
|
*/
|
|
180
196
|
legacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),
|
|
197
|
+
/**
|
|
198
|
+
* 本智能体能顶的角色 slug(≤ 8 个)。
|
|
199
|
+
*
|
|
200
|
+
* 声明了角色,别的插件就能用 `teams[].members[].role` 槽位引用到它,而不必知道它属于
|
|
201
|
+
* 哪个插件。这是提供方唯一要做的事——被谁引用、引用几次,提供方都不需要知道。
|
|
202
|
+
*/
|
|
203
|
+
roles: Type.Optional(Type.Array(PluginAgentRoleSchema, { maxItems: 8 })),
|
|
181
204
|
}, { additionalProperties: false });
|
|
182
205
|
/**
|
|
183
|
-
*
|
|
206
|
+
* 插件贡献的团队成员。`agent` 与 `role` 二选一,必须恰好写一个。
|
|
184
207
|
*
|
|
185
|
-
* `agent
|
|
186
|
-
*
|
|
187
|
-
*
|
|
208
|
+
* - `agent`:**实体引用**。`<agentId>` 指本插件的智能体,`<pluginId>/<agentId>` 指别的插件的。
|
|
209
|
+
* - `role`:**角色槽位**。只声明「这里需要一个什么角色」,由宿主在全部已启用插件里解析。
|
|
210
|
+
*
|
|
211
|
+
* 推荐用角色槽位:消费方只耦合到一个角色名,提供方换人、换插件、被第三方取代都不影响它,
|
|
212
|
+
* 用户还能把槽位改绑到自己调教过的智能体。实体引用留给「就是要那个人」的场合。
|
|
213
|
+
*
|
|
214
|
+
* 跨插件引用不再被拒,但它带来的「提供方可能不在」由 `optional` 兜底,而不是让整支团队消失。
|
|
188
215
|
*/
|
|
189
216
|
export const PluginAgentTeamMemberManifestSchema = Type.Object({
|
|
190
|
-
agent: NonWhitespaceStringSchema,
|
|
217
|
+
agent: Type.Optional(NonWhitespaceStringSchema),
|
|
218
|
+
role: Type.Optional(PluginAgentRoleSchema),
|
|
191
219
|
responsibility: Type.String({ maxLength: 2_000 }),
|
|
220
|
+
/**
|
|
221
|
+
* 解析不到这名成员时,是否照常发布这支团队。
|
|
222
|
+
*
|
|
223
|
+
* 缺省值按引用方式走:本插件的实体引用为 `false`(自己的东西缺了就是配置错误),跨插件
|
|
224
|
+
* 实体引用与角色槽位为 `true`(提供方本来就可能不在场)。
|
|
225
|
+
*/
|
|
226
|
+
optional: Type.Optional(Type.Boolean()),
|
|
192
227
|
}, { additionalProperties: false });
|
|
193
228
|
/** 插件贡献的团队。第一个成员即队长,也是用户在会话里唯一的对话入口。 */
|
|
194
229
|
export const PluginAgentTeamManifestSchema = Type.Object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-schema.js","sourceRoot":"","sources":["../src/manifest-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,6BAA6B;IACtC,WAAW,EAAE,qCAAqC;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9C,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,oCAAoC;IAC7C,WAAW,EAAE,yCAAyC;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC;IAClD,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,oCAAoC;IAC7C,WAAW,EAAE,8CAA8C;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;AAE5E,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CACzC;IACC,OAAO,EAAE,uBAAuB;IAChC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAChE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;CAC/E,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC,MAAM,CACzD;IACC,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,uBAAuB;IAChC,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,MAAM,CACV;QACC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAChE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;KAC3E,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CACD;IACD,OAAO,EAAE,sBAAsB;CAC/B,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,0BAA0B,GAAG,IAAI,CAAC,KAAK,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACpB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IACnB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CACrD;IACC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAClD,OAAO,EAAE,0BAA0B;IACnC,qGAAqG;IACrG,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;CAC1D,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CACrD;IACC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACzD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;CAChF,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC,MAAM,CAC7D;IACC,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,IAAI,CAAC,MAAM,CACnB;QACC,4DAA4D;QAC5D,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5F,OAAO,EAAE,mBAAmB;QAC5B,+EAA+E;QAC/E,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,SAAS,EAAE,IAAI,CAAC,MAAM,CACrB,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,EAC9D,2BAA2B,CAC3B;KACD,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B;IACD,WAAW,EAAE,IAAI,CAAC,QAAQ,CACzB,IAAI,CAAC,KAAK,CACT,IAAI,CAAC,MAAM,CACV;QACC,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;KAChE,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,EACD,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAC5B,CACD;IACD,SAAS,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,KAAK,CACT,IAAI,CAAC,MAAM,CACV;QACC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QACrD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAC1D,oFAAoF;QACpF,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;KAClE,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,EACD,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC7B,CACD;IACD,OAAO,EAAE,IAAI,CAAC,MAAM,CACnB;QACC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAChE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KAC7E,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B;IACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAClB;QACC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACzE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC3C,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,SAAS,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAC9E;KACD,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B;CACD,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC,MAAM,CACvD;IACC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9F,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;CACtG,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CACrD;IACC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,EAAE;QACxG,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,GAAG;KACb,CAAC;CACF,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CACrD;IACC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,EAAE;QACxG,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,GAAG;KACb,CAAC;CACF,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAC/C,kBAAkB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAChE,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAC3D,CAAC;AAEF,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;AACnF,MAAM,wBAAwB,GAAG,IAAI,CAAC,QAAQ,CAC7C,IAAI,CAAC,KAAK,CAAC,CAAC,yBAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAC9E,CAAC;AACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAErE,MAAM,yBAAyB,GAAG;IACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACjE,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5C,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC,UAAU,EAAE,wBAAwB;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,CAAC,MAAM,CAC1D;IACC,GAAG,yBAAyB;IAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,EAAE,yBAAyB;IAClC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACtC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;CACjC,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC,MAAM,CACzD;IACC,GAAG,yBAAyB;IAC5B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1B,GAAG,EAAE,yBAAyB;IAC9B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC1C,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3C,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;CACzC,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC,MAAM,CAC5D;IACC,GAAG,yBAAyB;IAC5B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC7B,SAAS,EAAE,cAAc;IACzB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;CACzC,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC;IACrD,gCAAgC;IAChC,+BAA+B;IAC/B,kCAAkC;CAClC,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,IAAI,CAAC,MAAM,CAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,EAChD,2BAA2B,EAC3B,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,CAAC,MAAM,CAC3D;IACC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACvD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACrD,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACrD,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CAC5D,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AACF,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC,MAAM,CACvD;IACC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACvD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACrD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB,EAAE,iCAAiC,CAAC,CAAC;CAChG,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,yHAAmD;AACnD,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,CAAC,MAAM,CAC1D;IACC,8EAAkD;IAClD,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACzD,0DAAoC;IACpC,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,+CAAyB;IACzB,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;IACnF,0DAAwB;IACxB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAChD,qGAAuD;IACvD,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D;;;OAGG;IACH,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF;;;;;;OAMG;IACH,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;CACjF,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC,MAAM,CAC7D;IACC,KAAK,EAAE,yBAAyB;IAChC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;CACjD,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,0GAAwC;AACxC,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC,MAAM,CACvD;IACC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACzD,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACvF,2GAAmD;IACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACtD,4EAA8C;IAC9C,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;CACjF,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM,CACnD;IACC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,MAAM,CACV;QACC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;KACjE,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CACD;IACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAChE,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC/D,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACrF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC5F,UAAU,EAAE,IAAI,CAAC,QAAQ,CACxB,IAAI,CAAC,MAAM,CACV;QACC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC3D,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC1D,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CACD;CACD,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAG,IAAI,CAAC,MAAM,CAC9D;IACC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;IACxE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC;CAClE,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAC9C;IACC,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,yBAAyB;IAC/B,OAAO,EAAE,mBAAmB;IAC5B,gBAAgB,EAAE,yBAAyB;IAC3C,KAAK,EAAE,yBAAyB;IAChC,gBAAgB,EAAE,oCAAoC;IACtD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC/C,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACvD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5D,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC9D,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACnD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACjD,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC9C,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAClE,aAAa,EAAE,IAAI,CAAC,QAAQ,CAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CACrF;IACD,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAC9B,IAAI,CAAC,MAAM,CACV;QACC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;KAC5C,EACD,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAC9B,CACD;IACD,UAAU,EAAE,wBAAwB;CACpC,EACD;IACC,GAAG,EAAE,gBAAgB;IACrB,oBAAoB,EAAE,IAAI;IAC1B,WAAW,EAAE,8CAA8C;CAC3D,CACD,CAAC","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\nimport { SkillSurfaceVisibilitySchema, SkillVisibilitySchema } from \"@vetta-org/capability-sdk\";\nimport { PLUGIN_PERMISSIONS } from \"./permissions.js\";\n\nconst NON_WHITESPACE_PATTERN = \"\\\\S\";\n\nexport const PluginIdSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-z0-9][a-z0-9._-]{0,63}$\",\n\tdescription: \"Stable lowercase plugin identifier.\",\n});\n\nexport const PluginVersionSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Plugin version without path separators.\",\n});\n\nexport const PluginCommandNameSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Bare executable name declared by the plugin.\",\n});\n\nexport const PluginCommandNamesSchema = Type.Array(PluginCommandNameSchema);\n\nconst PluginCliCommandSchema = Type.Object(\n\t{\n\t\tcommand: PluginCommandNameSchema,\n\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 30 * 60_000 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginCliProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tcommand: PluginCommandNameSchema,\n\t\tprobe: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: false },\n\t\t\t),\n\t\t),\n\t\tinstall: PluginCliCommandSchema,\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PluginServiceArchiveSchema = Type.Union([\n\tType.Literal(\"file\"),\n\tType.Literal(\"zip\"),\n\tType.Literal(\"tar.gz\"),\n]);\n\nexport const PluginServiceArtifactSchema = Type.Object(\n\t{\n\t\tsha256: Type.String({ pattern: \"^[a-f0-9]{64}$\" }),\n\t\tarchive: PluginServiceArchiveSchema,\n\t\t/** Relative file (archive=file) or directory (archive=zip/tar.gz) below the managed runtime root. */\n\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServicePlatformSchema = Type.Object(\n\t{\n\t\texecutable: Type.String({ minLength: 1, maxLength: 512 }),\n\t\tartifacts: Type.Array(PluginServiceArtifactSchema, { minItems: 1, maxItems: 8 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServiceProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\truntime: Type.Object(\n\t\t\t{\n\t\t\t\t/** `managed-binary` is the backwards-compatible default. */\n\t\t\t\tkind: Type.Optional(Type.Union([Type.Literal(\"managed-binary\"), Type.Literal(\"host-node\")])),\n\t\t\t\tversion: PluginVersionSchema,\n\t\t\t\t/** Entry script relative to the installed runtime (required for host-node). */\n\t\t\t\tentry: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n\t\t\t\tplatforms: Type.Record(\n\t\t\t\t\tType.String({ pattern: \"^(win32|darwin|linux)-(x64|arm64)$\" }),\n\t\t\t\t\tPluginServicePlatformSchema,\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\tcredentials: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: PluginIdSchema,\n\t\t\t\t\t\tbytes: Type.Optional(Type.Integer({ minimum: 16, maximum: 64 })),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 8 },\n\t\t\t),\n\t\t),\n\t\ttemplates: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tsource: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\t/** create preserves a data file; render regenerates a cache file on every start. */\n\t\t\t\t\t\tmode: Type.Union([Type.Literal(\"create\"), Type.Literal(\"render\")]),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 16 },\n\t\t\t),\n\t\t),\n\t\tprocess: Type.Object(\n\t\t\t{\n\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\tenv: Type.Optional(Type.Record(Type.String({ minLength: 1 }), Type.String())),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\thealth: Type.Object(\n\t\t\t{\n\t\t\t\tpath: Type.String({ minLength: 1, maxLength: 1_024, pattern: \"^/[^/]*\" }),\n\t\t\t\tcredentialId: Type.Optional(PluginIdSchema),\n\t\t\t\ttimeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\treadiness: Type.Optional(\n\t\t\t\t\tType.Object({ mode: Type.Literal(\"plugin\") }, { additionalProperties: false }),\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginProvidersManifestSchema = Type.Object(\n\t{\n\t\tcli: Type.Optional(Type.Array(PluginCliProviderManifestSchema, { minItems: 1, maxItems: 16 })),\n\t\tservices: Type.Optional(Type.Array(PluginServiceProviderManifestSchema, { minItems: 1, maxItems: 8 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginNetworkManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginBrowserManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginPermissionSchema = Type.Union(\n\tPLUGIN_PERMISSIONS.map((permission) => Type.Literal(permission)),\n\t{ description: \"Host capability requested by the plugin.\" },\n);\n\nconst NonWhitespaceStringSchema = Type.String({ pattern: NON_WHITESPACE_PATTERN });\nconst OptionalAgentModesSchema = Type.Optional(\n\tType.Union([NonWhitespaceStringSchema, Type.Array(NonWhitespaceStringSchema)]),\n);\nconst StringRecordSchema = Type.Record(Type.String(), Type.String());\n\nconst PluginMcpCommonProperties = {\n\tdisabled: Type.Optional(Type.Boolean()),\n\tautoApprove: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\tstartupTimeout: Type.Optional(Type.Number()),\n\tdebug: Type.Optional(Type.Boolean()),\n\tdisplayName: Type.Optional(Type.String()),\n\tdescription: Type.Optional(Type.String()),\n\tagent_mode: OptionalAgentModesSchema,\n};\n\nexport const PluginMcpStdioServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Optional(Type.Literal(\"stdio\")),\n\t\tcommand: NonWhitespaceStringSchema,\n\t\targs: Type.Optional(Type.Array(Type.String())),\n\t\tenv: Type.Optional(StringRecordSchema),\n\t\tcwd: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpHttpServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"http\"),\n\t\turl: NonWhitespaceStringSchema,\n\t\theaders: Type.Optional(StringRecordSchema),\n\t\toauthClientId: Type.Optional(Type.String()),\n\t\toauthDeviceFlow: Type.Optional(Type.Boolean()),\n\t\toauthScopes: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\n/** HTTP MCP served by one of this plugin's managed local services. */\nexport const PluginMcpServiceServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"service\"),\n\t\tserviceId: PluginIdSchema,\n\t\tpath: Type.String({ pattern: \"^/[^/]*\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpServerConfigSchema = Type.Union([\n\tPluginMcpStdioServerConfigSchema,\n\tPluginMcpHttpServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n]);\n\nconst PluginMcpServerMapSchema = Type.Record(\n\tType.String({ pattern: NON_WHITESPACE_PATTERN }),\n\tPluginMcpServerConfigSchema,\n\t{ additionalProperties: false },\n);\n\nexport const PluginSkillPresentationRuleSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tdisplayName: Type.Optional(NonWhitespaceStringSchema),\n\t\tdisplayDescription: Type.Optional(NonWhitespaceStringSchema),\n\t},\n\t{ additionalProperties: false },\n);\nexport const PluginSkillPresentationSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tskills: Type.Optional(Type.Record(NonWhitespaceStringSchema, PluginSkillPresentationRuleSchema)),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 插件贡献的智能体(blueprint)。人设、头像、职责都由插件提供,宿主只负责铺档案。 */\nexport const PluginAgentProfileManifestSchema = Type.Object(\n\t{\n\t\t/** 插件内唯一;全局 id 由宿主拼成 `plugin:<pluginId>:<id>`。 */\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\t/** 支持 `%key%` 占位,按插件 locales 解析。 */\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\t/** @ 提及用的短名;缺省用 `id`。 */\n\t\tmentionHandle: Type.Optional(Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" })),\n\t\t/** 插件包内的相对路径,指向头像图片。 */\n\t\tavatar: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 插件包内的相对路径,指向系统提示词 Markdown。与 `systemPrompt` 二选一。 */\n\t\tsystemPromptPath: Type.Optional(NonWhitespaceStringSchema),\n\t\tsystemPrompt: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\t/**\n\t\t * `all`(默认)继承宿主全部已启用能力;`own` 只用本插件的能力。\n\t\t * 两种模式下本插件的能力都强制激活,用户关不掉。\n\t\t */\n\t\tabilities: Type.Optional(Type.Union([Type.Literal(\"all\"), Type.Literal(\"own\")])),\n\t\t/**\n\t\t * 本智能体接管的历史 blueprint id。\n\t\t *\n\t\t * 用于「人设从别处迁进插件」:宿主解析不到这些 id 时折算到本智能体,回填时也据此\n\t\t * 认领用户已有的同角色档案,而不是再铺一份新的。宿主因此不必知道是哪个插件接管了\n\t\t * 哪个老角色。\n\t\t */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t},\n\t{ additionalProperties: false },\n);\n\n/**\n * 插件贡献的团队成员。\n *\n * `agent` 只能写本插件 `agents[]` 里的智能体 id。刻意不支持引用别的插件——那会让一个插件的\n * 可用性取决于另一个插件是否安装;宿主也没有内置人设可引用,装机自带的那几位同样由预置\n * 插件提供。引用不到的成员会让这一支团队整体被跳过。\n */\nexport const PluginAgentTeamMemberManifestSchema = Type.Object(\n\t{\n\t\tagent: NonWhitespaceStringSchema,\n\t\tresponsibility: Type.String({ maxLength: 2_000 }),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 插件贡献的团队。第一个成员即队长,也是用户在会话里唯一的对话入口。 */\nexport const PluginAgentTeamManifestSchema = Type.Object(\n\t{\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\tmembers: Type.Array(PluginAgentTeamMemberManifestSchema, { minItems: 1, maxItems: 32 }),\n\t\t/** 队长的团队任务书:把这支团队的固定流水线写死。与 `workflowPath` 二选一。 */\n\t\tworkflow: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\tworkflowPath: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 本团队接管的历史团队 id,语义同 `agents[].legacyIds`。 */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginAgentManifestSchema = Type.Object(\n\t{\n\t\tsystemPrompt: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tpromptPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tskillPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tskillPresentation: Type.Optional(PluginSkillPresentationSchema),\n\t\tagents: Type.Optional(Type.Array(PluginAgentProfileManifestSchema, { maxItems: 32 })),\n\t\tteams: Type.Optional(Type.Array(PluginAgentTeamManifestSchema, { maxItems: 32 })),\n\t\tmcpServers: Type.Optional(Type.Union([NonWhitespaceStringSchema, PluginMcpServerMapSchema])),\n\t\ttoolPolicy: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tallow: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t\tdeny: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginModuleFederationManifestSchema = Type.Object(\n\t{\n\t\tremoteName: Type.String({ pattern: \"^[A-Za-z_$][A-Za-z0-9_$-]{0,63}$\" }),\n\t\texpose: Type.String({ pattern: \"^\\\\./(?!.*\\\\.\\\\.)(?!.*\\\\\\\\).+$\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tname: NonWhitespaceStringSchema,\n\t\tversion: PluginVersionSchema,\n\t\tpluginApiVersion: NonWhitespaceStringSchema,\n\t\tentry: NonWhitespaceStringSchema,\n\t\tmoduleFederation: PluginModuleFederationManifestSchema,\n\t\tagent: Type.Optional(PluginAgentManifestSchema),\n\t\tproviders: Type.Optional(PluginProvidersManifestSchema),\n\t\tstyles: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tpermissions: Type.Optional(Type.Array(PluginPermissionSchema)),\n\t\tnetwork: Type.Optional(PluginNetworkManifestSchema),\n\t\tbrowser: Type.Optional(PluginBrowserManifestSchema),\n\t\tcommands: Type.Optional(PluginCommandNamesSchema),\n\t\tdescription: Type.Optional(Type.String()),\n\t\tauthor: Type.Optional(Type.String()),\n\t\ticon: Type.Optional(NonWhitespaceStringSchema),\n\t\tguidingWords: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tdefaultLocale: Type.Optional(\n\t\t\tType.String({ minLength: 2, maxLength: 16, pattern: \"^[a-zA-Z][a-zA-Z0-9-]{1,15}$\" }),\n\t\t),\n\t\tcontributionMode: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\thardIsolation: Type.Optional(Type.Boolean()),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tagent_mode: OptionalAgentModesSchema,\n\t},\n\t{\n\t\t$id: \"PluginManifest\",\n\t\tadditionalProperties: true,\n\t\tdescription: \"Vetta desktop plugin manifest (plugin.json).\",\n\t},\n);\n\nexport type PluginMcpServerConfig = Static<typeof PluginMcpServerConfigSchema>;\nexport type PluginAgentManifest = Static<typeof PluginAgentManifestSchema>;\nexport type PluginAgentProfileManifest = Static<typeof PluginAgentProfileManifestSchema>;\nexport type PluginAgentTeamManifest = Static<typeof PluginAgentTeamManifestSchema>;\nexport type PluginAgentTeamMemberManifest = Static<typeof PluginAgentTeamMemberManifestSchema>;\nexport type PluginSkillPresentation = Static<typeof PluginSkillPresentationSchema>;\nexport type PluginSkillPresentationRule = Static<typeof PluginSkillPresentationRuleSchema>;\nexport type PluginCliProviderManifest = Static<typeof PluginCliProviderManifestSchema>;\nexport type PluginServiceArtifact = Static<typeof PluginServiceArtifactSchema>;\nexport type PluginServicePlatform = Static<typeof PluginServicePlatformSchema>;\nexport type PluginServiceProviderManifest = Static<typeof PluginServiceProviderManifestSchema>;\nexport type PluginServiceRuntimeKind = \"managed-binary\" | \"host-node\";\nexport type PluginProvidersManifest = Static<typeof PluginProvidersManifestSchema>;\nexport type PluginNetworkManifest = Static<typeof PluginNetworkManifestSchema>;\nexport type PluginBrowserManifest = Static<typeof PluginBrowserManifestSchema>;\nexport type PluginManifestInput = Static<typeof PluginManifestSchema>;\nexport type PluginManifest = PluginManifestInput;\n"]}
|
|
1
|
+
{"version":3,"file":"manifest-schema.js","sourceRoot":"","sources":["../src/manifest-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\nimport { SkillSurfaceVisibilitySchema, SkillVisibilitySchema } from \"@vetta-org/capability-sdk\";\nimport { PLUGIN_PERMISSIONS } from \"./permissions.js\";\n\nconst NON_WHITESPACE_PATTERN = \"\\\\S\";\n\nexport const PluginIdSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-z0-9][a-z0-9._-]{0,63}$\",\n\tdescription: \"Stable lowercase plugin identifier.\",\n});\n\nexport const PluginVersionSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Plugin version without path separators.\",\n});\n\nexport const PluginCommandNameSchema = Type.String({\n\tminLength: 1,\n\tmaxLength: 64,\n\tpattern: \"^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$\",\n\tdescription: \"Bare executable name declared by the plugin.\",\n});\n\nexport const PluginCommandNamesSchema = Type.Array(PluginCommandNameSchema);\n\nconst PluginCliCommandSchema = Type.Object(\n\t{\n\t\tcommand: PluginCommandNameSchema,\n\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 30 * 60_000 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginCliProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tcommand: PluginCommandNameSchema,\n\t\tprobe: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\t\ttimeoutMs: Type.Optional(Type.Number({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: false },\n\t\t\t),\n\t\t),\n\t\tinstall: PluginCliCommandSchema,\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PluginServiceArchiveSchema = Type.Union([\n\tType.Literal(\"file\"),\n\tType.Literal(\"zip\"),\n\tType.Literal(\"tar.gz\"),\n]);\n\nexport const PluginServiceArtifactSchema = Type.Object(\n\t{\n\t\tsha256: Type.String({ pattern: \"^[a-f0-9]{64}$\" }),\n\t\tarchive: PluginServiceArchiveSchema,\n\t\t/** Relative file (archive=file) or directory (archive=zip/tar.gz) below the managed runtime root. */\n\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServicePlatformSchema = Type.Object(\n\t{\n\t\texecutable: Type.String({ minLength: 1, maxLength: 512 }),\n\t\tartifacts: Type.Array(PluginServiceArtifactSchema, { minItems: 1, maxItems: 8 }),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginServiceProviderManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\truntime: Type.Object(\n\t\t\t{\n\t\t\t\t/** `managed-binary` is the backwards-compatible default. */\n\t\t\t\tkind: Type.Optional(Type.Union([Type.Literal(\"managed-binary\"), Type.Literal(\"host-node\")])),\n\t\t\t\tversion: PluginVersionSchema,\n\t\t\t\t/** Entry script relative to the installed runtime (required for host-node). */\n\t\t\t\tentry: Type.Optional(Type.String({ minLength: 1, maxLength: 512 })),\n\t\t\t\tplatforms: Type.Record(\n\t\t\t\t\tType.String({ pattern: \"^(win32|darwin|linux)-(x64|arm64)$\" }),\n\t\t\t\t\tPluginServicePlatformSchema,\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\tcredentials: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: PluginIdSchema,\n\t\t\t\t\t\tbytes: Type.Optional(Type.Integer({ minimum: 16, maximum: 64 })),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 8 },\n\t\t\t),\n\t\t),\n\t\ttemplates: Type.Optional(\n\t\t\tType.Array(\n\t\t\t\tType.Object(\n\t\t\t\t\t{\n\t\t\t\t\t\tsource: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\tdestination: Type.String({ minLength: 1, maxLength: 512 }),\n\t\t\t\t\t\t/** create preserves a data file; render regenerates a cache file on every start. */\n\t\t\t\t\t\tmode: Type.Union([Type.Literal(\"create\"), Type.Literal(\"render\")]),\n\t\t\t\t\t},\n\t\t\t\t\t{ additionalProperties: false },\n\t\t\t\t),\n\t\t\t\t{ minItems: 1, maxItems: 16 },\n\t\t\t),\n\t\t),\n\t\tprocess: Type.Object(\n\t\t\t{\n\t\t\t\targs: Type.Optional(Type.Array(Type.String(), { maxItems: 64 })),\n\t\t\t\tenv: Type.Optional(Type.Record(Type.String({ minLength: 1 }), Type.String())),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t\thealth: Type.Object(\n\t\t\t{\n\t\t\t\tpath: Type.String({ minLength: 1, maxLength: 1_024, pattern: \"^/[^/]*\" }),\n\t\t\t\tcredentialId: Type.Optional(PluginIdSchema),\n\t\t\t\ttimeoutMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 120_000 })),\n\t\t\t\treadiness: Type.Optional(\n\t\t\t\t\tType.Object({ mode: Type.Literal(\"plugin\") }, { additionalProperties: false }),\n\t\t\t\t),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginProvidersManifestSchema = Type.Object(\n\t{\n\t\tcli: Type.Optional(Type.Array(PluginCliProviderManifestSchema, { minItems: 1, maxItems: 16 })),\n\t\tservices: Type.Optional(Type.Array(PluginServiceProviderManifestSchema, { minItems: 1, maxItems: 8 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginNetworkManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginBrowserManifestSchema = Type.Object(\n\t{\n\t\tallowedHosts: Type.Array(Type.String({ minLength: 1, maxLength: 253, pattern: NON_WHITESPACE_PATTERN }), {\n\t\t\tminItems: 1,\n\t\t\tmaxItems: 128,\n\t\t}),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginPermissionSchema = Type.Union(\n\tPLUGIN_PERMISSIONS.map((permission) => Type.Literal(permission)),\n\t{ description: \"Host capability requested by the plugin.\" },\n);\n\nconst NonWhitespaceStringSchema = Type.String({ pattern: NON_WHITESPACE_PATTERN });\nconst OptionalAgentModesSchema = Type.Optional(\n\tType.Union([NonWhitespaceStringSchema, Type.Array(NonWhitespaceStringSchema)]),\n);\nconst StringRecordSchema = Type.Record(Type.String(), Type.String());\n\nconst PluginMcpCommonProperties = {\n\tdisabled: Type.Optional(Type.Boolean()),\n\tautoApprove: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\tstartupTimeout: Type.Optional(Type.Number()),\n\tdebug: Type.Optional(Type.Boolean()),\n\tdisplayName: Type.Optional(Type.String()),\n\tdescription: Type.Optional(Type.String()),\n\tagent_mode: OptionalAgentModesSchema,\n};\n\nexport const PluginMcpStdioServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Optional(Type.Literal(\"stdio\")),\n\t\tcommand: NonWhitespaceStringSchema,\n\t\targs: Type.Optional(Type.Array(Type.String())),\n\t\tenv: Type.Optional(StringRecordSchema),\n\t\tcwd: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpHttpServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"http\"),\n\t\turl: NonWhitespaceStringSchema,\n\t\theaders: Type.Optional(StringRecordSchema),\n\t\toauthClientId: Type.Optional(Type.String()),\n\t\toauthDeviceFlow: Type.Optional(Type.Boolean()),\n\t\toauthScopes: Type.Optional(Type.String()),\n\t},\n\t{ additionalProperties: true },\n);\n\n/** HTTP MCP served by one of this plugin's managed local services. */\nexport const PluginMcpServiceServerConfigSchema = Type.Object(\n\t{\n\t\t...PluginMcpCommonProperties,\n\t\ttype: Type.Literal(\"service\"),\n\t\tserviceId: PluginIdSchema,\n\t\tpath: Type.String({ pattern: \"^/[^/]*\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginMcpServerConfigSchema = Type.Union([\n\tPluginMcpStdioServerConfigSchema,\n\tPluginMcpHttpServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n]);\n\nconst PluginMcpServerMapSchema = Type.Record(\n\tType.String({ pattern: NON_WHITESPACE_PATTERN }),\n\tPluginMcpServerConfigSchema,\n\t{ additionalProperties: false },\n);\n\nexport const PluginSkillPresentationRuleSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tdisplayName: Type.Optional(NonWhitespaceStringSchema),\n\t\tdisplayDescription: Type.Optional(NonWhitespaceStringSchema),\n\t},\n\t{ additionalProperties: false },\n);\nexport const PluginSkillPresentationSchema = Type.Object(\n\t{\n\t\tdefaultVisibility: Type.Optional(SkillVisibilitySchema),\n\t\tsurfaces: Type.Optional(SkillSurfaceVisibilitySchema),\n\t\tskills: Type.Optional(Type.Record(NonWhitespaceStringSchema, PluginSkillPresentationRuleSchema)),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 角色 slug。跨插件引用的唯一词汇表,格式与智能体 id 一致。 */\nexport const PluginAgentRoleSchema = Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" });\n\n/**\n * 宿主认识的角色词表。\n *\n * **不是白名单**:写表外的角色照样能被解析,只是团队编辑器里没有现成的槽位选择器。列在这里\n * 的角色由预置插件供货,因此任何一台装机上都解析得到,第三方插件可以放心引用。\n */\nexport const BUILTIN_PLUGIN_AGENT_ROLES = [\n\t\"master\",\n\t\"developer\",\n\t\"researcher\",\n\t\"auditor\",\n\t\"business\",\n\t\"designer\",\n] as const;\n\nexport type BuiltinPluginAgentRole = (typeof BUILTIN_PLUGIN_AGENT_ROLES)[number];\n\n/** 插件贡献的智能体(blueprint)。人设、头像、职责都由插件提供,宿主只负责铺档案。 */\nexport const PluginAgentProfileManifestSchema = Type.Object(\n\t{\n\t\t/** 插件内唯一;全局 id 由宿主拼成 `plugin:<pluginId>:<id>`。 */\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\t/** 支持 `%key%` 占位,按插件 locales 解析。 */\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\t/** @ 提及用的短名;缺省用 `id`。 */\n\t\tmentionHandle: Type.Optional(Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" })),\n\t\t/** 插件包内的相对路径,指向头像图片。 */\n\t\tavatar: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 插件包内的相对路径,指向系统提示词 Markdown。与 `systemPrompt` 二选一。 */\n\t\tsystemPromptPath: Type.Optional(NonWhitespaceStringSchema),\n\t\tsystemPrompt: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\t/**\n\t\t * `all`(默认)继承宿主全部已启用能力;`own` 只用本插件的能力。\n\t\t * 两种模式下本插件的能力都强制激活,用户关不掉。\n\t\t */\n\t\tabilities: Type.Optional(Type.Union([Type.Literal(\"all\"), Type.Literal(\"own\")])),\n\t\t/**\n\t\t * 本智能体接管的历史 blueprint id。\n\t\t *\n\t\t * 用于「人设从别处迁进插件」:宿主解析不到这些 id 时折算到本智能体,回填时也据此\n\t\t * 认领用户已有的同角色档案,而不是再铺一份新的。宿主因此不必知道是哪个插件接管了\n\t\t * 哪个老角色。\n\t\t */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t\t/**\n\t\t * 本智能体能顶的角色 slug(≤ 8 个)。\n\t\t *\n\t\t * 声明了角色,别的插件就能用 `teams[].members[].role` 槽位引用到它,而不必知道它属于\n\t\t * 哪个插件。这是提供方唯一要做的事——被谁引用、引用几次,提供方都不需要知道。\n\t\t */\n\t\troles: Type.Optional(Type.Array(PluginAgentRoleSchema, { maxItems: 8 })),\n\t},\n\t{ additionalProperties: false },\n);\n\n/**\n * 插件贡献的团队成员。`agent` 与 `role` 二选一,必须恰好写一个。\n *\n * - `agent`:**实体引用**。`<agentId>` 指本插件的智能体,`<pluginId>/<agentId>` 指别的插件的。\n * - `role`:**角色槽位**。只声明「这里需要一个什么角色」,由宿主在全部已启用插件里解析。\n *\n * 推荐用角色槽位:消费方只耦合到一个角色名,提供方换人、换插件、被第三方取代都不影响它,\n * 用户还能把槽位改绑到自己调教过的智能体。实体引用留给「就是要那个人」的场合。\n *\n * 跨插件引用不再被拒,但它带来的「提供方可能不在」由 `optional` 兜底,而不是让整支团队消失。\n */\nexport const PluginAgentTeamMemberManifestSchema = Type.Object(\n\t{\n\t\tagent: Type.Optional(NonWhitespaceStringSchema),\n\t\trole: Type.Optional(PluginAgentRoleSchema),\n\t\tresponsibility: Type.String({ maxLength: 2_000 }),\n\t\t/**\n\t\t * 解析不到这名成员时,是否照常发布这支团队。\n\t\t *\n\t\t * 缺省值按引用方式走:本插件的实体引用为 `false`(自己的东西缺了就是配置错误),跨插件\n\t\t * 实体引用与角色槽位为 `true`(提供方本来就可能不在场)。\n\t\t */\n\t\toptional: Type.Optional(Type.Boolean()),\n\t},\n\t{ additionalProperties: false },\n);\n\n/** 插件贡献的团队。第一个成员即队长,也是用户在会话里唯一的对话入口。 */\nexport const PluginAgentTeamManifestSchema = Type.Object(\n\t{\n\t\tid: Type.String({ pattern: \"^[a-z0-9][a-z0-9-]{0,63}$\" }),\n\t\tname: NonWhitespaceStringSchema,\n\t\tdescription: Type.Optional(Type.String({ maxLength: 2_000 })),\n\t\tmembers: Type.Array(PluginAgentTeamMemberManifestSchema, { minItems: 1, maxItems: 32 }),\n\t\t/** 队长的团队任务书:把这支团队的固定流水线写死。与 `workflowPath` 二选一。 */\n\t\tworkflow: Type.Optional(Type.String({ maxLength: 64_000 })),\n\t\tworkflowPath: Type.Optional(NonWhitespaceStringSchema),\n\t\t/** 本团队接管的历史团队 id,语义同 `agents[].legacyIds`。 */\n\t\tlegacyIds: Type.Optional(Type.Array(NonWhitespaceStringSchema, { maxItems: 16 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const PluginAgentManifestSchema = Type.Object(\n\t{\n\t\tsystemPrompt: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tpromptPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tskillPaths: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tskillPresentation: Type.Optional(PluginSkillPresentationSchema),\n\t\tagents: Type.Optional(Type.Array(PluginAgentProfileManifestSchema, { maxItems: 32 })),\n\t\tteams: Type.Optional(Type.Array(PluginAgentTeamManifestSchema, { maxItems: 32 })),\n\t\tmcpServers: Type.Optional(Type.Union([NonWhitespaceStringSchema, PluginMcpServerMapSchema])),\n\t\ttoolPolicy: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tallow: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t\tdeny: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginModuleFederationManifestSchema = Type.Object(\n\t{\n\t\tremoteName: Type.String({ pattern: \"^[A-Za-z_$][A-Za-z0-9_$-]{0,63}$\" }),\n\t\texpose: Type.String({ pattern: \"^\\\\./(?!.*\\\\.\\\\.)(?!.*\\\\\\\\).+$\" }),\n\t},\n\t{ additionalProperties: true },\n);\n\nexport const PluginManifestSchema = Type.Object(\n\t{\n\t\tid: PluginIdSchema,\n\t\tname: NonWhitespaceStringSchema,\n\t\tversion: PluginVersionSchema,\n\t\tpluginApiVersion: NonWhitespaceStringSchema,\n\t\tentry: NonWhitespaceStringSchema,\n\t\tmoduleFederation: PluginModuleFederationManifestSchema,\n\t\tagent: Type.Optional(PluginAgentManifestSchema),\n\t\tproviders: Type.Optional(PluginProvidersManifestSchema),\n\t\tstyles: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tpermissions: Type.Optional(Type.Array(PluginPermissionSchema)),\n\t\tnetwork: Type.Optional(PluginNetworkManifestSchema),\n\t\tbrowser: Type.Optional(PluginBrowserManifestSchema),\n\t\tcommands: Type.Optional(PluginCommandNamesSchema),\n\t\tdescription: Type.Optional(Type.String()),\n\t\tauthor: Type.Optional(Type.String()),\n\t\ticon: Type.Optional(NonWhitespaceStringSchema),\n\t\tguidingWords: Type.Optional(Type.Array(NonWhitespaceStringSchema)),\n\t\tdefaultLocale: Type.Optional(\n\t\t\tType.String({ minLength: 2, maxLength: 16, pattern: \"^[a-zA-Z][a-zA-Z0-9-]{1,15}$\" }),\n\t\t),\n\t\tcontributionMode: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\thardIsolation: Type.Optional(Type.Boolean()),\n\t\t\t\t},\n\t\t\t\t{ additionalProperties: true },\n\t\t\t),\n\t\t),\n\t\tagent_mode: OptionalAgentModesSchema,\n\t},\n\t{\n\t\t$id: \"PluginManifest\",\n\t\tadditionalProperties: true,\n\t\tdescription: \"Vetta desktop plugin manifest (plugin.json).\",\n\t},\n);\n\nexport type PluginMcpServerConfig = Static<typeof PluginMcpServerConfigSchema>;\nexport type PluginAgentManifest = Static<typeof PluginAgentManifestSchema>;\nexport type PluginAgentProfileManifest = Static<typeof PluginAgentProfileManifestSchema>;\nexport type PluginAgentTeamManifest = Static<typeof PluginAgentTeamManifestSchema>;\nexport type PluginAgentTeamMemberManifest = Static<typeof PluginAgentTeamMemberManifestSchema>;\nexport type PluginSkillPresentation = Static<typeof PluginSkillPresentationSchema>;\nexport type PluginSkillPresentationRule = Static<typeof PluginSkillPresentationRuleSchema>;\nexport type PluginCliProviderManifest = Static<typeof PluginCliProviderManifestSchema>;\nexport type PluginServiceArtifact = Static<typeof PluginServiceArtifactSchema>;\nexport type PluginServicePlatform = Static<typeof PluginServicePlatformSchema>;\nexport type PluginServiceProviderManifest = Static<typeof PluginServiceProviderManifestSchema>;\nexport type PluginServiceRuntimeKind = \"managed-binary\" | \"host-node\";\nexport type PluginProvidersManifest = Static<typeof PluginProvidersManifestSchema>;\nexport type PluginNetworkManifest = Static<typeof PluginNetworkManifestSchema>;\nexport type PluginBrowserManifest = Static<typeof PluginBrowserManifestSchema>;\nexport type PluginManifestInput = Static<typeof PluginManifestSchema>;\nexport type PluginManifest = PluginManifestInput;\n"]}
|
package/dist/manifest.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type PluginManifest, type PluginMcpServerConfig } from "./manifest-schema.js";
|
|
2
|
-
export { PluginAgentManifestSchema, PluginAgentProfileManifestSchema, PluginAgentTeamManifestSchema, PluginAgentTeamMemberManifestSchema, PluginBrowserManifestSchema, PluginCommandNameSchema, PluginCommandNamesSchema, PluginCliProviderManifestSchema, PluginServiceArtifactSchema, PluginServicePlatformSchema, PluginServiceProviderManifestSchema, PluginIdSchema, PluginManifestSchema, PluginMcpHttpServerConfigSchema, PluginMcpServerConfigSchema, PluginMcpStdioServerConfigSchema, PluginMcpServiceServerConfigSchema, PluginSkillPresentationRuleSchema, PluginSkillPresentationSchema, PluginModuleFederationManifestSchema, PluginNetworkManifestSchema, PluginProvidersManifestSchema, PluginPermissionSchema, PluginVersionSchema, } from "./manifest-schema.js";
|
|
3
|
-
export type { PluginAgentManifest, PluginAgentProfileManifest, PluginAgentTeamManifest, PluginAgentTeamMemberManifest, PluginBrowserManifest, PluginCliProviderManifest, PluginServiceArtifact, PluginServicePlatform, PluginServiceProviderManifest, PluginServiceRuntimeKind, PluginManifest, PluginManifestInput, PluginMcpServerConfig, PluginSkillPresentation, PluginSkillPresentationRule, PluginNetworkManifest, } from "./manifest-schema.js";
|
|
2
|
+
export { PluginAgentManifestSchema, PluginAgentProfileManifestSchema, PluginAgentTeamManifestSchema, PluginAgentTeamMemberManifestSchema, PluginAgentRoleSchema, BUILTIN_PLUGIN_AGENT_ROLES, PluginBrowserManifestSchema, PluginCommandNameSchema, PluginCommandNamesSchema, PluginCliProviderManifestSchema, PluginServiceArtifactSchema, PluginServicePlatformSchema, PluginServiceProviderManifestSchema, PluginIdSchema, PluginManifestSchema, PluginMcpHttpServerConfigSchema, PluginMcpServerConfigSchema, PluginMcpStdioServerConfigSchema, PluginMcpServiceServerConfigSchema, PluginSkillPresentationRuleSchema, PluginSkillPresentationSchema, PluginModuleFederationManifestSchema, PluginNetworkManifestSchema, PluginProvidersManifestSchema, PluginPermissionSchema, PluginVersionSchema, } from "./manifest-schema.js";
|
|
3
|
+
export type { PluginAgentManifest, PluginAgentProfileManifest, PluginAgentTeamManifest, PluginAgentTeamMemberManifest, BuiltinPluginAgentRole, PluginBrowserManifest, PluginCliProviderManifest, PluginServiceArtifact, PluginServicePlatform, PluginServiceProviderManifest, PluginServiceRuntimeKind, PluginManifest, PluginManifestInput, PluginMcpServerConfig, PluginSkillPresentation, PluginSkillPresentationRule, PluginNetworkManifest, } from "./manifest-schema.js";
|
|
4
4
|
export { PLUGIN_PERMISSIONS } from "./permissions.js";
|
|
5
5
|
export type { PluginPermission } from "./permissions.js";
|
|
6
6
|
export interface PluginManifestResourceReference {
|
package/dist/manifest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,EAoBN,KAAK,cAAc,EAEnB,KAAK,qBAAqB,EAI1B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACN,yBAAyB,EACzB,gCAAgC,EAChC,6BAA6B,EAC7B,mCAAmC,EACnC,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,mCAAmC,EACnC,cAAc,EACd,oBAAoB,EACpB,+BAA+B,EAC/B,2BAA2B,EAC3B,gCAAgC,EAChC,kCAAkC,EAClC,iCAAiC,EACjC,6BAA6B,EAC7B,oCAAoC,EACpC,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACX,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAC7B,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,+BAA+B;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACnC;AAmTD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI3D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBnF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAIhE;AAED,8GAAoE;AACpE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAK9E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,qBAAqB,CAG5F;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CA4DhE;AAED,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,cAAc,GACtB,+BAA+B,EAAE,CAsCnC;AAkBD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAWjF","sourcesContent":["import { type Static, type TSchema } from \"@sinclair/typebox\";\nimport type { ValueError } from \"@sinclair/typebox/errors\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport {\n\tPluginCommandNameSchema,\n\tPluginCommandNamesSchema,\n\tPluginCliProviderManifestSchema,\n\tPluginServiceProviderManifestSchema,\n\tPluginIdSchema,\n\tPluginManifestSchema,\n\tPluginMcpServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n\tPluginSkillPresentationRuleSchema,\n\tPluginSkillPresentationSchema,\n\tPluginVersionSchema,\n\ttype PluginAgentManifest,\n\ttype PluginAgentProfileManifest,\n\ttype PluginAgentTeamManifest,\n\ttype PluginAgentTeamMemberManifest,\n\ttype PluginBrowserManifest,\n\ttype PluginCliProviderManifest,\n\ttype PluginServiceProviderManifest,\n\ttype PluginServiceRuntimeKind,\n\ttype PluginManifest,\n\ttype PluginManifestInput,\n\ttype PluginMcpServerConfig,\n\ttype PluginSkillPresentation,\n\ttype PluginSkillPresentationRule,\n\ttype PluginNetworkManifest,\n} from \"./manifest-schema.js\";\nimport { PLUGIN_PERMISSIONS, type PluginPermission } from \"./permissions.js\";\n\nexport {\n\tPluginAgentManifestSchema,\n\tPluginAgentProfileManifestSchema,\n\tPluginAgentTeamManifestSchema,\n\tPluginAgentTeamMemberManifestSchema,\n\tPluginBrowserManifestSchema,\n\tPluginCommandNameSchema,\n\tPluginCommandNamesSchema,\n\tPluginCliProviderManifestSchema,\n\tPluginServiceArtifactSchema,\n\tPluginServicePlatformSchema,\n\tPluginServiceProviderManifestSchema,\n\tPluginIdSchema,\n\tPluginManifestSchema,\n\tPluginMcpHttpServerConfigSchema,\n\tPluginMcpServerConfigSchema,\n\tPluginMcpStdioServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n\tPluginSkillPresentationRuleSchema,\n\tPluginSkillPresentationSchema,\n\tPluginModuleFederationManifestSchema,\n\tPluginNetworkManifestSchema,\n\tPluginProvidersManifestSchema,\n\tPluginPermissionSchema,\n\tPluginVersionSchema,\n} from \"./manifest-schema.js\";\nexport type {\n\tPluginAgentManifest,\n\tPluginAgentProfileManifest,\n\tPluginAgentTeamManifest,\n\tPluginAgentTeamMemberManifest,\n\tPluginBrowserManifest,\n\tPluginCliProviderManifest,\n\tPluginServiceArtifact,\n\tPluginServicePlatform,\n\tPluginServiceProviderManifest,\n\tPluginServiceRuntimeKind,\n\tPluginManifest,\n\tPluginManifestInput,\n\tPluginMcpServerConfig,\n\tPluginSkillPresentation,\n\tPluginSkillPresentationRule,\n\tPluginNetworkManifest,\n} from \"./manifest-schema.js\";\nexport { PLUGIN_PERMISSIONS } from \"./permissions.js\";\nexport type { PluginPermission } from \"./permissions.js\";\n\nexport interface PluginManifestResourceReference {\n\tfield: string;\n\tpath: string;\n\tkind: \"file\" | \"file-or-directory\";\n}\n\nfunction schemaErrorPath(path: string): string {\n\tif (!path) return \"\";\n\treturn path\n\t\t.split(\"/\")\n\t\t.slice(1)\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((segment) => {\n\t\t\tif (segment === \"\") return '[\"\"]';\n\t\t\treturn /^\\d+$/.test(segment) ? `[${segment}]` : `.${segment}`;\n\t\t})\n\t\t.join(\"\");\n}\n\nfunction mostSpecificSchemaError(issue: ValueError): ValueError {\n\tconst nested = issue.errors.flatMap((iterator) =>\n\t\t[...iterator].map((child) => mostSpecificSchemaError(child)),\n\t);\n\tconst deeper = nested.filter((child) => child.path.length > issue.path.length);\n\tif (deeper.length === 0) return issue;\n\treturn deeper.reduce((best, child) => (child.path.length > best.path.length ? child : best));\n}\n\nfunction assertSchema<Schema extends TSchema>(\n\tschema: Schema,\n\tvalue: unknown,\n\tfieldName: string,\n): asserts value is Static<Schema> {\n\tif (Value.Check(schema, value)) return;\n\tconst firstIssue = Value.Errors(schema, value).First();\n\tconst issue = firstIssue ? mostSpecificSchemaError(firstIssue) : undefined;\n\tconst location = `${fieldName}${schemaErrorPath(issue?.path ?? \"\")}`;\n\tthrow new Error(`Invalid plugin ${location}: ${issue?.message ?? \"schema validation failed\"}`);\n}\n\nfunction trimString(value: string): string {\n\treturn value.trim();\n}\n\nfunction normalizeStringArray(values: string[] | undefined): string[] {\n\treturn (values ?? []).map(trimString);\n}\n\nfunction normalizeOptionalAgentModes(value: string | string[] | undefined): string | string[] | undefined {\n\tif (value === undefined) return undefined;\n\treturn Array.isArray(value) ? normalizeStringArray(value) : trimString(value);\n}\n\nfunction normalizePermissions(permissions: PluginPermission[] | undefined): PluginPermission[] {\n\treturn Array.from(new Set(permissions ?? []));\n}\n\nfunction normalizeAllowedHost(value: string, fieldName: \"network\" | \"browser\"): string {\n\tconst raw = trimString(value).toLowerCase();\n\tif (raw === \"*\") return raw;\n\tconst wildcard = raw.startsWith(\"*.\");\n\tconst candidate = wildcard ? raw.slice(2) : raw;\n\tif (!candidate || candidate.includes(\"*\") || /[\\\\/?#@]/.test(candidate)) {\n\t\tthrow new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);\n\t}\n\tconst unwrapped = candidate.startsWith(\"[\") && candidate.endsWith(\"]\") ? candidate.slice(1, -1) : candidate;\n\tif (wildcard && unwrapped.includes(\":\")) {\n\t\tthrow new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);\n\t}\n\ttry {\n\t\tconst parsed = new URL(`http://${unwrapped.includes(\":\") ? `[${unwrapped}]` : unwrapped}`);\n\t\tconst hostname = parsed.hostname.replace(/^\\[|\\]$/g, \"\").replace(/\\.$/, \"\").toLowerCase();\n\t\tif (!hostname || parsed.port || parsed.username || parsed.password) throw new Error(\"invalid host\");\n\t\treturn wildcard ? `*.${hostname}` : hostname;\n\t} catch {\n\t\tthrow new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);\n\t}\n}\n\nfunction normalizeNetworkManifest(network: PluginNetworkManifest | undefined): PluginNetworkManifest | undefined {\n\tif (!network) return undefined;\n\treturn { allowedHosts: Array.from(new Set(network.allowedHosts.map((host) => normalizeAllowedHost(host, \"network\")))) };\n}\n\nfunction normalizeBrowserManifest(browser: PluginBrowserManifest | undefined): PluginBrowserManifest | undefined {\n\tif (!browser) return undefined;\n\treturn { allowedHosts: Array.from(new Set(browser.allowedHosts.map((host) => normalizeAllowedHost(host, \"browser\")))) };\n}\n\nfunction normalizeModuleFederation(\n\tmoduleFederation: PluginManifestInput[\"moduleFederation\"],\n): PluginManifest[\"moduleFederation\"] {\n\treturn {\n\t\tremoteName: trimString(moduleFederation.remoteName),\n\t\texpose: trimString(moduleFederation.expose),\n\t};\n}\n\nfunction normalizeToolPolicy(\n\ttoolPolicy: PluginAgentManifest[\"toolPolicy\"],\n): PluginAgentManifest[\"toolPolicy\"] {\n\tif (!toolPolicy) return undefined;\n\treturn {\n\t\tallow: normalizeStringArray(toolPolicy.allow),\n\t\tdeny: normalizeStringArray(toolPolicy.deny),\n\t};\n}\n\nfunction normalizeMcpServers(\n\tmcpServers: PluginAgentManifest[\"mcpServers\"],\n): PluginAgentManifest[\"mcpServers\"] {\n\tif (mcpServers === undefined) return undefined;\n\tif (typeof mcpServers === \"string\") {\n\t\treturn validatePluginRelativePath(trimString(mcpServers), \"agent.mcpServers\");\n\t}\n\tconst result: Record<string, PluginMcpServerConfig> = {};\n\tfor (const [name, config] of Object.entries(mcpServers)) {\n\t\tresult[trimString(name)] = normalizePluginMcpServerConfig(config);\n\t}\n\treturn result;\n}\n\nfunction normalizeAgentManifest(agent: PluginAgentManifest | undefined): PluginAgentManifest | undefined {\n\tif (!agent) return undefined;\n\treturn {\n\t\tsystemPrompt: agent.systemPrompt\n\t\t\t? {\n\t\t\t\t\tpromptPaths: normalizeStringArray(agent.systemPrompt.promptPaths).map((path) =>\n\t\t\t\t\t\tvalidatePluginRelativePath(path, \"agent.systemPrompt.promptPaths\"),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tskillPaths: normalizeStringArray(agent.skillPaths).map((path) =>\n\t\t\tvalidatePluginRelativePath(path, \"agent.skillPaths\"),\n\t\t),\n\t\tskillPresentation: normalizeSkillPresentation(agent.skillPresentation),\n\t\tmcpServers: normalizeMcpServers(agent.mcpServers),\n\t\ttoolPolicy: normalizeToolPolicy(agent.toolPolicy),\n\t\tagents: agent.agents?.map((profile) => ({\n\t\t\t...profile,\n\t\t\t// 路径都要过越界校验:manifest 里写 `../` 不该能读到插件目录之外。\n\t\t\tavatar: profile.avatar ? validatePluginRelativePath(profile.avatar, \"agent.agents.avatar\") : undefined,\n\t\t\tsystemPromptPath: profile.systemPromptPath\n\t\t\t\t? validatePluginRelativePath(profile.systemPromptPath, \"agent.agents.systemPromptPath\")\n\t\t\t\t: undefined,\n\t\t})),\n\t\tteams: agent.teams?.map((team) => ({\n\t\t\t...team,\n\t\t\tworkflowPath: team.workflowPath\n\t\t\t\t? validatePluginRelativePath(team.workflowPath, \"agent.teams.workflowPath\")\n\t\t\t\t: undefined,\n\t\t})),\n\t};\n}\n\nfunction normalizeSkillPresentation(\n\tpresentation: PluginSkillPresentation | undefined,\n): PluginSkillPresentation | undefined {\n\tif (!presentation) return undefined;\n\tconst normalizeRule = (rule: PluginSkillPresentationRule): PluginSkillPresentationRule => ({\n\t\tdefaultVisibility: rule.defaultVisibility,\n\t\tsurfaces: rule.surfaces ? { ...rule.surfaces } : undefined,\n\t\tdisplayName: rule.displayName?.trim(),\n\t\tdisplayDescription: rule.displayDescription?.trim(),\n\t});\n\treturn {\n\t\tdefaultVisibility: presentation.defaultVisibility,\n\t\tsurfaces: presentation.surfaces ? { ...presentation.surfaces } : undefined,\n\t\tskills: presentation.skills\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(presentation.skills).map(([name, rule]) => [name.trim(), normalizeRule(rule)]),\n\t\t\t\t)\n\t\t\t: undefined,\n\t};\n}\n\nfunction normalizeCliProviders(providers: PluginCliProviderManifest[] | undefined): PluginCliProviderManifest[] | undefined {\n\tif (!providers || providers.length === 0) return undefined;\n\tconst ids = new Set<string>();\n\treturn providers.map((provider) => {\n\t\tif (ids.has(provider.id)) throw new Error(`Duplicate CLI provider id: ${provider.id}`);\n\t\tids.add(provider.id);\n\t\treturn {\n\t\t\tid: provider.id,\n\t\t\tcommand: provider.command,\n\t\t\tprobe: provider.probe\n\t\t\t\t? { args: provider.probe.args ? [...provider.probe.args] : undefined, timeoutMs: provider.probe.timeoutMs }\n\t\t\t\t: undefined,\n\t\t\tinstall: {\n\t\t\t\tcommand: provider.install.command,\n\t\t\t\targs: provider.install.args ? [...provider.install.args] : undefined,\n\t\t\t\ttimeoutMs: provider.install.timeoutMs,\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction normalizeServiceProviders(\n\tproviders: PluginServiceProviderManifest[] | undefined,\n): PluginServiceProviderManifest[] | undefined {\n\tif (!providers || providers.length === 0) return undefined;\n\tconst ids = new Set<string>();\n\treturn providers.map((provider) => {\n\t\tif (ids.has(provider.id)) throw new Error(`Duplicate service provider id: ${provider.id}`);\n\t\tids.add(provider.id);\n\t\tconst runtimeKind: PluginServiceRuntimeKind = provider.runtime.kind ?? \"managed-binary\";\n\t\tconst entry = provider.runtime.entry\n\t\t\t? validatePluginRelativePath(provider.runtime.entry, `providers.services.${provider.id}.runtime.entry`)\n\t\t\t: undefined;\n\t\tif (runtimeKind === \"host-node\" && !entry) {\n\t\t\tthrow new Error(`Host-node service must declare runtime.entry: ${provider.id}`);\n\t\t}\n\t\tconst platforms: PluginServiceProviderManifest[\"runtime\"][\"platforms\"] = {};\n\t\tfor (const [platformTag, platform] of Object.entries(provider.runtime.platforms)) {\n\t\t\tconst destinations = new Set<string>();\n\t\t\tplatforms[platformTag] = {\n\t\t\t\texecutable: validatePluginRelativePath(platform.executable, `providers.services.${provider.id}.executable`),\n\t\t\t\tartifacts: platform.artifacts.map((artifact) => {\n\t\t\t\t\tconst destination = validatePluginRelativePath(\n\t\t\t\t\t\tartifact.destination,\n\t\t\t\t\t\t`providers.services.${provider.id}.artifacts.destination`,\n\t\t\t\t\t);\n\t\t\t\t\tif (destinations.has(destination)) {\n\t\t\t\t\t\tthrow new Error(`Duplicate service artifact destination: ${provider.id}/${platformTag}/${destination}`);\n\t\t\t\t\t}\n\t\t\t\t\tdestinations.add(destination);\n\t\t\t\t\treturn { ...artifact, destination };\n\t\t\t\t}),\n\t\t\t};\n\t\t}\n\t\tif (Object.keys(platforms).length === 0) {\n\t\t\tthrow new Error(`Service provider must declare at least one platform: ${provider.id}`);\n\t\t}\n\t\tconst credentialIds = new Set<string>();\n\t\tconst credentials = provider.credentials?.map((credential) => {\n\t\t\tif (credentialIds.has(credential.id)) throw new Error(`Duplicate service credential id: ${provider.id}/${credential.id}`);\n\t\t\tcredentialIds.add(credential.id);\n\t\t\treturn { id: credential.id, bytes: credential.bytes };\n\t\t});\n\t\tif (provider.health.credentialId && !credentialIds.has(provider.health.credentialId)) {\n\t\t\tthrow new Error(`Unknown service health credential: ${provider.id}/${provider.health.credentialId}`);\n\t\t}\n\t\tconst templateDestinations = new Set<string>();\n\t\tconst templates = provider.templates?.map((template) => {\n\t\t\tconst source = validatePluginRelativePath(template.source, `providers.services.${provider.id}.templates.source`);\n\t\t\tconst destination = validatePluginRelativePath(\n\t\t\t\ttemplate.destination,\n\t\t\t\t`providers.services.${provider.id}.templates.destination`,\n\t\t\t);\n\t\t\tif (templateDestinations.has(destination)) throw new Error(`Duplicate service template destination: ${provider.id}/${destination}`);\n\t\t\ttemplateDestinations.add(destination);\n\t\t\treturn { source, destination, mode: template.mode };\n\t\t});\n\t\tconst normalizedRuntime: PluginServiceProviderManifest[\"runtime\"] = {\n\t\t\tversion: provider.runtime.version,\n\t\t\tplatforms,\n\t\t\t...(runtimeKind === \"host-node\" ? { kind: runtimeKind, entry } : provider.runtime.kind ? { kind: runtimeKind } : {}),\n\t\t};\n\t\treturn {\n\t\t\tid: provider.id,\n\t\t\truntime: normalizedRuntime,\n\t\t\tcredentials,\n\t\t\ttemplates,\n\t\t\tprocess: {\n\t\t\t\targs: provider.process.args ? [...provider.process.args] : undefined,\n\t\t\t\tenv: provider.process.env ? { ...provider.process.env } : undefined,\n\t\t\t},\n\t\t\thealth: { ...provider.health },\n\t\t};\n\t});\n}\n\nfunction normalizePluginMcpServerConfig(config: PluginMcpServerConfig): PluginMcpServerConfig {\n\tconst common = {\n\t\tdisabled: config.disabled,\n\t\tautoApprove: config.autoApprove?.map(trimString),\n\t\tstartupTimeout: config.startupTimeout,\n\t\tdebug: config.debug,\n\t\tdisplayName: config.displayName,\n\t\tdescription: config.description,\n\t\tagent_mode: normalizeOptionalAgentModes(config.agent_mode),\n\t};\n\tif (config.type === \"service\") {\n\t\treturn {\n\t\t\ttype: \"service\",\n\t\t\tserviceId: trimString(config.serviceId),\n\t\t\tpath: trimString(config.path),\n\t\t\t...common,\n\t\t};\n\t}\n\tif (config.type === \"http\") {\n\t\treturn {\n\t\t\ttype: \"http\",\n\t\t\turl: trimString(config.url),\n\t\t\theaders: config.headers ? { ...config.headers } : undefined,\n\t\t\toauthClientId: config.oauthClientId,\n\t\t\toauthDeviceFlow: config.oauthDeviceFlow,\n\t\t\toauthScopes: config.oauthScopes,\n\t\t\t...common,\n\t\t};\n\t}\n\treturn {\n\t\ttype: config.type,\n\t\tcommand: trimString(config.command),\n\t\targs: config.args ? [...config.args] : undefined,\n\t\tenv: config.env ? { ...config.env } : undefined,\n\t\tcwd: config.cwd,\n\t\t...common,\n\t};\n}\n\nexport function validatePluginId(id: string): void {\n\tif (!Value.Check(PluginIdSchema, id)) {\n\t\tthrow new Error(\"Plugin id must be 1-64 chars: lowercase letters, numbers, dot, underscore, or dash\");\n\t}\n}\n\nexport function validatePluginVersion(version: string): void {\n\tif (!Value.Check(PluginVersionSchema, version)) {\n\t\tthrow new Error(\"Plugin version must be 1-64 chars and cannot contain path separators\");\n\t}\n}\n\nexport function validatePluginRelativePath(value: string, fieldName: string): string {\n\tif (value.startsWith(\"/\") || /^[a-zA-Z]:/.test(value)) {\n\t\tthrow new Error(`Invalid plugin ${fieldName}`);\n\t}\n\tconst parts: string[] = [];\n\tfor (const part of value.replace(/\\\\/g, \"/\").split(\"/\")) {\n\t\tif (part === \"\" || part === \".\") continue;\n\t\tif (part === \"..\") {\n\t\t\tif (parts.length === 0) throw new Error(`Invalid plugin ${fieldName}`);\n\t\t\tparts.pop();\n\t\t\tcontinue;\n\t\t}\n\t\tparts.push(part);\n\t}\n\tconst normalized = parts.join(\"/\");\n\tif (!normalized) throw new Error(`Invalid plugin ${fieldName}`);\n\treturn normalized;\n}\n\nexport function parsePluginCommandNames(value: unknown): string[] {\n\tif (value === undefined) return [];\n\tassertSchema(PluginCommandNamesSchema, value, \"commands\");\n\treturn Array.from(new Set(value));\n}\n\n/** @deprecated agent_mode 已无任何运行时语义(ADR-0071),保留仅为容忍既有 manifest。 */\nexport function normalizePluginAgentModes(value: unknown): string[] | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tconst values = Array.isArray(value) ? value : [value];\n\tconst modes = values.map((item) => String(item).trim()).filter(Boolean);\n\treturn modes.length > 0 ? modes : undefined;\n}\n\nexport function parsePluginMcpServerConfig(name: string, raw: unknown): PluginMcpServerConfig {\n\tassertSchema(PluginMcpServerConfigSchema, raw, `MCP server '${name}'`);\n\treturn normalizePluginMcpServerConfig(raw);\n}\n\nexport function isPluginPassthroughIconRef(icon: string): boolean {\n\treturn (\n\t\ticon.startsWith(\"http://\") ||\n\t\ticon.startsWith(\"https://\") ||\n\t\t/^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$/.test(icon)\n\t);\n}\n\nexport function isPluginPackagedIconPath(icon: string): boolean {\n\treturn !isPluginPassthroughIconRef(icon);\n}\n\nexport function parsePluginManifest(raw: unknown): PluginManifest {\n\tif (typeof raw === \"object\" && raw !== null && \"runtime\" in raw) {\n\t\tthrow new Error(\n\t\t\t'Invalid plugin manifest.runtime: runtime selection is unsupported; plugins use Module Federation.',\n\t\t);\n\t}\n\tassertSchema(PluginManifestSchema, raw, \"manifest\");\n\tconst commands = parsePluginCommandNames(raw.commands);\n\tconst icon = raw.icon === undefined ? undefined : trimString(raw.icon);\n\tconst permissions = normalizePermissions(raw.permissions);\n\tconst network = normalizeNetworkManifest(raw.network);\n\tconst browser = normalizeBrowserManifest(raw.browser);\n\tif (permissions.includes(\"network.fetch\") && !network) {\n\t\tthrow new Error(\"Plugin network.allowedHosts is required with network.fetch\");\n\t}\n\tconst browserPermissions = permissions.filter((permission) => permission.startsWith(\"browser.\"));\n\tif (browserPermissions.length > 0 && !browser) {\n\t\tthrow new Error(\"Plugin browser.allowedHosts is required with browser permissions\");\n\t}\n\tif (permissions.includes(\"browser.interact\") && !permissions.includes(\"browser.read\")) {\n\t\tthrow new Error(\"Plugin browser.interact requires browser.read\");\n\t}\n\tconst normalizedServices = raw.providers ? normalizeServiceProviders(raw.providers.services) : undefined;\n\tfor (const [name, server] of Object.entries(raw.agent?.mcpServers && typeof raw.agent.mcpServers !== \"string\" ? raw.agent.mcpServers : {})) {\n\t\tif (server.type === \"service\" && !normalizedServices?.some((service) => service.id === server.serviceId)) {\n\t\t\tthrow new Error(`Plugin MCP server '${name}' references unknown service '${server.serviceId}'`);\n\t\t}\n\t}\n\treturn {\n\t\tid: raw.id,\n\t\tname: trimString(raw.name),\n\t\tversion: raw.version,\n\t\tpluginApiVersion: trimString(raw.pluginApiVersion),\n\t\tentry: validatePluginRelativePath(trimString(raw.entry), \"entry\"),\n\t\tmoduleFederation: normalizeModuleFederation(raw.moduleFederation),\n\t\tagent: normalizeAgentManifest(raw.agent),\n\t\tproviders: raw.providers\n\t\t\t? {\n\t\t\t\t\tcli: normalizeCliProviders(raw.providers.cli),\n\t\t\t\t\tservices: normalizedServices,\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tstyles: normalizeStringArray(raw.styles).map((style) => validatePluginRelativePath(style, \"styles\")),\n\t\tpermissions,\n\t\tnetwork,\n\t\tbrowser,\n\t\tcommands: commands.length > 0 ? commands : undefined,\n\t\tdescription: raw.description,\n\t\tauthor: raw.author,\n\t\ticon:\n\t\t\ticon === undefined || isPluginPassthroughIconRef(icon)\n\t\t\t\t? icon\n\t\t\t\t: validatePluginRelativePath(icon, \"icon\"),\n\t\tguidingWords: raw.guidingWords?.map(trimString),\n\t\tdefaultLocale: raw.defaultLocale ?? \"zh\",\n\t\tcontributionMode: raw.contributionMode\n\t\t\t? { hardIsolation: raw.contributionMode.hardIsolation === true }\n\t\t\t: undefined,\n\t\tagent_mode: normalizePluginAgentModes(raw.agent_mode),\n\t};\n}\n\nexport function listPluginManifestResources(\n\tmanifest: PluginManifest,\n): PluginManifestResourceReference[] {\n\tconst resources: PluginManifestResourceReference[] = [\n\t\t{ field: \"entry\", path: manifest.entry, kind: \"file\" },\n\t];\n\tfor (const stylePath of manifest.styles ?? []) {\n\t\tresources.push({ field: \"styles\", path: stylePath, kind: \"file\" });\n\t}\n\tif (manifest.icon && isPluginPackagedIconPath(manifest.icon)) {\n\t\tresources.push({ field: \"icon\", path: manifest.icon, kind: \"file\" });\n\t}\n\tfor (const promptPath of manifest.agent?.systemPrompt?.promptPaths ?? []) {\n\t\tresources.push({ field: \"agent.systemPrompt.promptPaths\", path: promptPath, kind: \"file-or-directory\" });\n\t}\n\tfor (const skillPath of manifest.agent?.skillPaths ?? []) {\n\t\tresources.push({ field: \"agent.skillPaths\", path: skillPath, kind: \"file-or-directory\" });\n\t}\n\tfor (const agent of manifest.agent?.agents ?? []) {\n\t\t// 人设与头像是插件包里的真实文件:不登记就不会被打进包,装到用户机器上时这个\n\t\t// 智能体会因为「提示词读不出来」被整个跳过。\n\t\tif (agent.avatar) resources.push({ field: \"agent.agents.avatar\", path: agent.avatar, kind: \"file\" });\n\t\tif (agent.systemPromptPath) {\n\t\t\tresources.push({ field: \"agent.agents.systemPromptPath\", path: agent.systemPromptPath, kind: \"file\" });\n\t\t}\n\t}\n\tfor (const team of manifest.agent?.teams ?? []) {\n\t\tif (team.workflowPath) {\n\t\t\tresources.push({ field: \"agent.teams.workflowPath\", path: team.workflowPath, kind: \"file\" });\n\t\t}\n\t}\n\tif (typeof manifest.agent?.mcpServers === \"string\") {\n\t\tresources.push({ field: \"agent.mcpServers\", path: manifest.agent.mcpServers, kind: \"file\" });\n\t}\n\tfor (const service of manifest.providers?.services ?? []) {\n\t\tfor (const template of service.templates ?? []) {\n\t\t\tresources.push({ field: `providers.services.${service.id}.templates.source`, path: template.source, kind: \"file\" });\n\t\t}\n\t}\n\treturn resources;\n}\n\nfunction parseApiVersion(value: string): readonly [number, number, number] | undefined {\n\tconst match = /^(\\d+)\\.(\\d+)\\.(\\d+)$/.exec(value);\n\tif (!match) return undefined;\n\treturn [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nfunction compareApiVersions(\n\tleft: readonly [number, number, number],\n\tright: readonly [number, number, number],\n): number {\n\tfor (let index = 0; index < left.length; index += 1) {\n\t\tif (left[index] !== right[index]) return left[index] - right[index];\n\t}\n\treturn 0;\n}\n\nexport function isPluginApiCompatible(hostVersion: string, range: string): boolean {\n\tconst host = parseApiVersion(hostVersion);\n\tif (!host) return false;\n\tconst normalized = range.trim();\n\tconst exact = parseApiVersion(normalized);\n\tif (exact) return exact[0] === host[0] && compareApiVersions(host, exact) >= 0;\n\tconst caret = normalized.startsWith(\"^\") ? parseApiVersion(normalized.slice(1)) : undefined;\n\tif (caret) return caret[0] === host[0] && compareApiVersions(host, caret) >= 0;\n\tif (normalized === `^${host[0]}` || normalized === `${host[0]}.x`) return true;\n\tconst minimum = normalized.startsWith(\">=\") ? parseApiVersion(normalized.slice(2)) : undefined;\n\treturn minimum !== undefined && compareApiVersions(host, minimum) >= 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,EAoBN,KAAK,cAAc,EAEnB,KAAK,qBAAqB,EAI1B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACN,yBAAyB,EACzB,gCAAgC,EAChC,6BAA6B,EAC7B,mCAAmC,EACnC,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,mCAAmC,EACnC,cAAc,EACd,oBAAoB,EACpB,+BAA+B,EAC/B,2BAA2B,EAC3B,gCAAgC,EAChC,kCAAkC,EAClC,iCAAiC,EACjC,6BAA6B,EAC7B,oCAAoC,EACpC,2BAA2B,EAC3B,6BAA6B,EAC7B,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACX,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAC7B,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,+BAA+B;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACnC;AAwVD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI3D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBnF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAIhE;AAED,8GAAoE;AACpE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAK9E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,qBAAqB,CAG5F;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CA4DhE;AAED,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,cAAc,GACtB,+BAA+B,EAAE,CAsCnC;AAkBD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAWjF","sourcesContent":["import { type Static, type TSchema } from \"@sinclair/typebox\";\nimport type { ValueError } from \"@sinclair/typebox/errors\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport {\n\tPluginCommandNameSchema,\n\tPluginCommandNamesSchema,\n\tPluginCliProviderManifestSchema,\n\tPluginServiceProviderManifestSchema,\n\tPluginIdSchema,\n\tPluginManifestSchema,\n\tPluginMcpServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n\tPluginSkillPresentationRuleSchema,\n\tPluginSkillPresentationSchema,\n\tPluginVersionSchema,\n\ttype PluginAgentManifest,\n\ttype PluginAgentProfileManifest,\n\ttype PluginAgentTeamManifest,\n\ttype PluginAgentTeamMemberManifest,\n\ttype PluginBrowserManifest,\n\ttype PluginCliProviderManifest,\n\ttype PluginServiceProviderManifest,\n\ttype PluginServiceRuntimeKind,\n\ttype PluginManifest,\n\ttype PluginManifestInput,\n\ttype PluginMcpServerConfig,\n\ttype PluginSkillPresentation,\n\ttype PluginSkillPresentationRule,\n\ttype PluginNetworkManifest,\n} from \"./manifest-schema.js\";\nimport { PLUGIN_PERMISSIONS, type PluginPermission } from \"./permissions.js\";\n\nexport {\n\tPluginAgentManifestSchema,\n\tPluginAgentProfileManifestSchema,\n\tPluginAgentTeamManifestSchema,\n\tPluginAgentTeamMemberManifestSchema,\n\tPluginAgentRoleSchema,\n\tBUILTIN_PLUGIN_AGENT_ROLES,\n\tPluginBrowserManifestSchema,\n\tPluginCommandNameSchema,\n\tPluginCommandNamesSchema,\n\tPluginCliProviderManifestSchema,\n\tPluginServiceArtifactSchema,\n\tPluginServicePlatformSchema,\n\tPluginServiceProviderManifestSchema,\n\tPluginIdSchema,\n\tPluginManifestSchema,\n\tPluginMcpHttpServerConfigSchema,\n\tPluginMcpServerConfigSchema,\n\tPluginMcpStdioServerConfigSchema,\n\tPluginMcpServiceServerConfigSchema,\n\tPluginSkillPresentationRuleSchema,\n\tPluginSkillPresentationSchema,\n\tPluginModuleFederationManifestSchema,\n\tPluginNetworkManifestSchema,\n\tPluginProvidersManifestSchema,\n\tPluginPermissionSchema,\n\tPluginVersionSchema,\n} from \"./manifest-schema.js\";\nexport type {\n\tPluginAgentManifest,\n\tPluginAgentProfileManifest,\n\tPluginAgentTeamManifest,\n\tPluginAgentTeamMemberManifest,\n\tBuiltinPluginAgentRole,\n\tPluginBrowserManifest,\n\tPluginCliProviderManifest,\n\tPluginServiceArtifact,\n\tPluginServicePlatform,\n\tPluginServiceProviderManifest,\n\tPluginServiceRuntimeKind,\n\tPluginManifest,\n\tPluginManifestInput,\n\tPluginMcpServerConfig,\n\tPluginSkillPresentation,\n\tPluginSkillPresentationRule,\n\tPluginNetworkManifest,\n} from \"./manifest-schema.js\";\nexport { PLUGIN_PERMISSIONS } from \"./permissions.js\";\nexport type { PluginPermission } from \"./permissions.js\";\n\nexport interface PluginManifestResourceReference {\n\tfield: string;\n\tpath: string;\n\tkind: \"file\" | \"file-or-directory\";\n}\n\nfunction schemaErrorPath(path: string): string {\n\tif (!path) return \"\";\n\treturn path\n\t\t.split(\"/\")\n\t\t.slice(1)\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((segment) => {\n\t\t\tif (segment === \"\") return '[\"\"]';\n\t\t\treturn /^\\d+$/.test(segment) ? `[${segment}]` : `.${segment}`;\n\t\t})\n\t\t.join(\"\");\n}\n\nfunction mostSpecificSchemaError(issue: ValueError): ValueError {\n\tconst nested = issue.errors.flatMap((iterator) =>\n\t\t[...iterator].map((child) => mostSpecificSchemaError(child)),\n\t);\n\tconst deeper = nested.filter((child) => child.path.length > issue.path.length);\n\tif (deeper.length === 0) return issue;\n\treturn deeper.reduce((best, child) => (child.path.length > best.path.length ? child : best));\n}\n\nfunction assertSchema<Schema extends TSchema>(\n\tschema: Schema,\n\tvalue: unknown,\n\tfieldName: string,\n): asserts value is Static<Schema> {\n\tif (Value.Check(schema, value)) return;\n\tconst firstIssue = Value.Errors(schema, value).First();\n\tconst issue = firstIssue ? mostSpecificSchemaError(firstIssue) : undefined;\n\tconst location = `${fieldName}${schemaErrorPath(issue?.path ?? \"\")}`;\n\tthrow new Error(`Invalid plugin ${location}: ${issue?.message ?? \"schema validation failed\"}`);\n}\n\nfunction trimString(value: string): string {\n\treturn value.trim();\n}\n\nfunction normalizeStringArray(values: string[] | undefined): string[] {\n\treturn (values ?? []).map(trimString);\n}\n\nfunction normalizeOptionalAgentModes(value: string | string[] | undefined): string | string[] | undefined {\n\tif (value === undefined) return undefined;\n\treturn Array.isArray(value) ? normalizeStringArray(value) : trimString(value);\n}\n\nfunction normalizePermissions(permissions: PluginPermission[] | undefined): PluginPermission[] {\n\treturn Array.from(new Set(permissions ?? []));\n}\n\nfunction normalizeAllowedHost(value: string, fieldName: \"network\" | \"browser\"): string {\n\tconst raw = trimString(value).toLowerCase();\n\tif (raw === \"*\") return raw;\n\tconst wildcard = raw.startsWith(\"*.\");\n\tconst candidate = wildcard ? raw.slice(2) : raw;\n\tif (!candidate || candidate.includes(\"*\") || /[\\\\/?#@]/.test(candidate)) {\n\t\tthrow new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);\n\t}\n\tconst unwrapped = candidate.startsWith(\"[\") && candidate.endsWith(\"]\") ? candidate.slice(1, -1) : candidate;\n\tif (wildcard && unwrapped.includes(\":\")) {\n\t\tthrow new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);\n\t}\n\ttry {\n\t\tconst parsed = new URL(`http://${unwrapped.includes(\":\") ? `[${unwrapped}]` : unwrapped}`);\n\t\tconst hostname = parsed.hostname.replace(/^\\[|\\]$/g, \"\").replace(/\\.$/, \"\").toLowerCase();\n\t\tif (!hostname || parsed.port || parsed.username || parsed.password) throw new Error(\"invalid host\");\n\t\treturn wildcard ? `*.${hostname}` : hostname;\n\t} catch {\n\t\tthrow new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);\n\t}\n}\n\nfunction normalizeNetworkManifest(network: PluginNetworkManifest | undefined): PluginNetworkManifest | undefined {\n\tif (!network) return undefined;\n\treturn { allowedHosts: Array.from(new Set(network.allowedHosts.map((host) => normalizeAllowedHost(host, \"network\")))) };\n}\n\nfunction normalizeBrowserManifest(browser: PluginBrowserManifest | undefined): PluginBrowserManifest | undefined {\n\tif (!browser) return undefined;\n\treturn { allowedHosts: Array.from(new Set(browser.allowedHosts.map((host) => normalizeAllowedHost(host, \"browser\")))) };\n}\n\nfunction normalizeModuleFederation(\n\tmoduleFederation: PluginManifestInput[\"moduleFederation\"],\n): PluginManifest[\"moduleFederation\"] {\n\treturn {\n\t\tremoteName: trimString(moduleFederation.remoteName),\n\t\texpose: trimString(moduleFederation.expose),\n\t};\n}\n\nfunction normalizeToolPolicy(\n\ttoolPolicy: PluginAgentManifest[\"toolPolicy\"],\n): PluginAgentManifest[\"toolPolicy\"] {\n\tif (!toolPolicy) return undefined;\n\treturn {\n\t\tallow: normalizeStringArray(toolPolicy.allow),\n\t\tdeny: normalizeStringArray(toolPolicy.deny),\n\t};\n}\n\nfunction normalizeMcpServers(\n\tmcpServers: PluginAgentManifest[\"mcpServers\"],\n): PluginAgentManifest[\"mcpServers\"] {\n\tif (mcpServers === undefined) return undefined;\n\tif (typeof mcpServers === \"string\") {\n\t\treturn validatePluginRelativePath(trimString(mcpServers), \"agent.mcpServers\");\n\t}\n\tconst result: Record<string, PluginMcpServerConfig> = {};\n\tfor (const [name, config] of Object.entries(mcpServers)) {\n\t\tresult[trimString(name)] = normalizePluginMcpServerConfig(config);\n\t}\n\treturn result;\n}\n\nfunction normalizeAgentManifest(agent: PluginAgentManifest | undefined): PluginAgentManifest | undefined {\n\tif (!agent) return undefined;\n\treturn {\n\t\tsystemPrompt: agent.systemPrompt\n\t\t\t? {\n\t\t\t\t\tpromptPaths: normalizeStringArray(agent.systemPrompt.promptPaths).map((path) =>\n\t\t\t\t\t\tvalidatePluginRelativePath(path, \"agent.systemPrompt.promptPaths\"),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tskillPaths: normalizeStringArray(agent.skillPaths).map((path) =>\n\t\t\tvalidatePluginRelativePath(path, \"agent.skillPaths\"),\n\t\t),\n\t\tskillPresentation: normalizeSkillPresentation(agent.skillPresentation),\n\t\tmcpServers: normalizeMcpServers(agent.mcpServers),\n\t\ttoolPolicy: normalizeToolPolicy(agent.toolPolicy),\n\t\tagents: agent.agents?.map((profile) => ({\n\t\t\t...profile,\n\t\t\t// 路径都要过越界校验:manifest 里写 `../` 不该能读到插件目录之外。\n\t\t\tavatar: profile.avatar ? validatePluginRelativePath(profile.avatar, \"agent.agents.avatar\") : undefined,\n\t\t\tsystemPromptPath: profile.systemPromptPath\n\t\t\t\t? validatePluginRelativePath(profile.systemPromptPath, \"agent.agents.systemPromptPath\")\n\t\t\t\t: undefined,\n\t\t\troles: normalizeAgentRoles(profile.roles),\n\t\t})),\n\t\tteams: agent.teams?.map((team) => ({\n\t\t\t...team,\n\t\t\tworkflowPath: team.workflowPath\n\t\t\t\t? validatePluginRelativePath(team.workflowPath, \"agent.teams.workflowPath\")\n\t\t\t\t: undefined,\n\t\t\tmembers: team.members.map((member, index) => normalizeTeamMember(member, index, team.id)),\n\t\t})),\n\t};\n}\n\nfunction normalizeAgentRoles(roles: readonly string[] | undefined): string[] | undefined {\n\tif (!roles || roles.length === 0) return undefined;\n\treturn [...new Set(roles.map((role) => role.trim()))];\n}\n\n/** `<pluginId>/<agentId>` 的跨插件实体引用;本插件的引用不带斜杠。 */\nconst CROSS_PLUGIN_AGENT_REF = /^([a-z0-9][a-z0-9-]{0,63})\\/([a-z0-9][a-z0-9-]{0,63})$/;\nconst OWN_PLUGIN_AGENT_REF = /^[a-z0-9][a-z0-9-]{0,63}$/;\n\nfunction normalizeTeamMember(\n\tmember: PluginAgentTeamMemberManifest,\n\tindex: number,\n\tteamId: string,\n): PluginAgentTeamMemberManifest {\n\tconst where = `agent.teams[${teamId}].members[${index}]`;\n\tconst agent = member.agent?.trim();\n\tconst role = member.role?.trim();\n\tif ((agent ? 1 : 0) + (role ? 1 : 0) !== 1) {\n\t\tthrow new Error(`Invalid ${where}: write exactly one of \"agent\" or \"role\"`);\n\t}\n\tif (agent && !CROSS_PLUGIN_AGENT_REF.test(agent) && !OWN_PLUGIN_AGENT_REF.test(agent)) {\n\t\tthrow new Error(`Invalid ${where}.agent: expected \"<agentId>\" or \"<pluginId>/<agentId>\", got \"${agent}\"`);\n\t}\n\tif (index === 0 && (!agent || !OWN_PLUGIN_AGENT_REF.test(agent))) {\n\t\t// 队长是用户在团队会话里唯一的对话入口。允许它落在别的插件上,那个插件一卸载,这支\n\t\t// 团队就成了打不开的壳——比少一名队员严重得多,所以队长只能是本插件自己的智能体。\n\t\tthrow new Error(`Invalid ${where}: the team leader must be one of this plugin's own agents`);\n\t}\n\treturn {\n\t\t...member,\n\t\t...(agent ? { agent } : {}),\n\t\t...(role ? { role } : {}),\n\t};\n}\n\nfunction normalizeSkillPresentation(\n\tpresentation: PluginSkillPresentation | undefined,\n): PluginSkillPresentation | undefined {\n\tif (!presentation) return undefined;\n\tconst normalizeRule = (rule: PluginSkillPresentationRule): PluginSkillPresentationRule => ({\n\t\tdefaultVisibility: rule.defaultVisibility,\n\t\tsurfaces: rule.surfaces ? { ...rule.surfaces } : undefined,\n\t\tdisplayName: rule.displayName?.trim(),\n\t\tdisplayDescription: rule.displayDescription?.trim(),\n\t});\n\treturn {\n\t\tdefaultVisibility: presentation.defaultVisibility,\n\t\tsurfaces: presentation.surfaces ? { ...presentation.surfaces } : undefined,\n\t\tskills: presentation.skills\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(presentation.skills).map(([name, rule]) => [name.trim(), normalizeRule(rule)]),\n\t\t\t\t)\n\t\t\t: undefined,\n\t};\n}\n\nfunction normalizeCliProviders(providers: PluginCliProviderManifest[] | undefined): PluginCliProviderManifest[] | undefined {\n\tif (!providers || providers.length === 0) return undefined;\n\tconst ids = new Set<string>();\n\treturn providers.map((provider) => {\n\t\tif (ids.has(provider.id)) throw new Error(`Duplicate CLI provider id: ${provider.id}`);\n\t\tids.add(provider.id);\n\t\treturn {\n\t\t\tid: provider.id,\n\t\t\tcommand: provider.command,\n\t\t\tprobe: provider.probe\n\t\t\t\t? { args: provider.probe.args ? [...provider.probe.args] : undefined, timeoutMs: provider.probe.timeoutMs }\n\t\t\t\t: undefined,\n\t\t\tinstall: {\n\t\t\t\tcommand: provider.install.command,\n\t\t\t\targs: provider.install.args ? [...provider.install.args] : undefined,\n\t\t\t\ttimeoutMs: provider.install.timeoutMs,\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction normalizeServiceProviders(\n\tproviders: PluginServiceProviderManifest[] | undefined,\n): PluginServiceProviderManifest[] | undefined {\n\tif (!providers || providers.length === 0) return undefined;\n\tconst ids = new Set<string>();\n\treturn providers.map((provider) => {\n\t\tif (ids.has(provider.id)) throw new Error(`Duplicate service provider id: ${provider.id}`);\n\t\tids.add(provider.id);\n\t\tconst runtimeKind: PluginServiceRuntimeKind = provider.runtime.kind ?? \"managed-binary\";\n\t\tconst entry = provider.runtime.entry\n\t\t\t? validatePluginRelativePath(provider.runtime.entry, `providers.services.${provider.id}.runtime.entry`)\n\t\t\t: undefined;\n\t\tif (runtimeKind === \"host-node\" && !entry) {\n\t\t\tthrow new Error(`Host-node service must declare runtime.entry: ${provider.id}`);\n\t\t}\n\t\tconst platforms: PluginServiceProviderManifest[\"runtime\"][\"platforms\"] = {};\n\t\tfor (const [platformTag, platform] of Object.entries(provider.runtime.platforms)) {\n\t\t\tconst destinations = new Set<string>();\n\t\t\tplatforms[platformTag] = {\n\t\t\t\texecutable: validatePluginRelativePath(platform.executable, `providers.services.${provider.id}.executable`),\n\t\t\t\tartifacts: platform.artifacts.map((artifact) => {\n\t\t\t\t\tconst destination = validatePluginRelativePath(\n\t\t\t\t\t\tartifact.destination,\n\t\t\t\t\t\t`providers.services.${provider.id}.artifacts.destination`,\n\t\t\t\t\t);\n\t\t\t\t\tif (destinations.has(destination)) {\n\t\t\t\t\t\tthrow new Error(`Duplicate service artifact destination: ${provider.id}/${platformTag}/${destination}`);\n\t\t\t\t\t}\n\t\t\t\t\tdestinations.add(destination);\n\t\t\t\t\treturn { ...artifact, destination };\n\t\t\t\t}),\n\t\t\t};\n\t\t}\n\t\tif (Object.keys(platforms).length === 0) {\n\t\t\tthrow new Error(`Service provider must declare at least one platform: ${provider.id}`);\n\t\t}\n\t\tconst credentialIds = new Set<string>();\n\t\tconst credentials = provider.credentials?.map((credential) => {\n\t\t\tif (credentialIds.has(credential.id)) throw new Error(`Duplicate service credential id: ${provider.id}/${credential.id}`);\n\t\t\tcredentialIds.add(credential.id);\n\t\t\treturn { id: credential.id, bytes: credential.bytes };\n\t\t});\n\t\tif (provider.health.credentialId && !credentialIds.has(provider.health.credentialId)) {\n\t\t\tthrow new Error(`Unknown service health credential: ${provider.id}/${provider.health.credentialId}`);\n\t\t}\n\t\tconst templateDestinations = new Set<string>();\n\t\tconst templates = provider.templates?.map((template) => {\n\t\t\tconst source = validatePluginRelativePath(template.source, `providers.services.${provider.id}.templates.source`);\n\t\t\tconst destination = validatePluginRelativePath(\n\t\t\t\ttemplate.destination,\n\t\t\t\t`providers.services.${provider.id}.templates.destination`,\n\t\t\t);\n\t\t\tif (templateDestinations.has(destination)) throw new Error(`Duplicate service template destination: ${provider.id}/${destination}`);\n\t\t\ttemplateDestinations.add(destination);\n\t\t\treturn { source, destination, mode: template.mode };\n\t\t});\n\t\tconst normalizedRuntime: PluginServiceProviderManifest[\"runtime\"] = {\n\t\t\tversion: provider.runtime.version,\n\t\t\tplatforms,\n\t\t\t...(runtimeKind === \"host-node\" ? { kind: runtimeKind, entry } : provider.runtime.kind ? { kind: runtimeKind } : {}),\n\t\t};\n\t\treturn {\n\t\t\tid: provider.id,\n\t\t\truntime: normalizedRuntime,\n\t\t\tcredentials,\n\t\t\ttemplates,\n\t\t\tprocess: {\n\t\t\t\targs: provider.process.args ? [...provider.process.args] : undefined,\n\t\t\t\tenv: provider.process.env ? { ...provider.process.env } : undefined,\n\t\t\t},\n\t\t\thealth: { ...provider.health },\n\t\t};\n\t});\n}\n\nfunction normalizePluginMcpServerConfig(config: PluginMcpServerConfig): PluginMcpServerConfig {\n\tconst common = {\n\t\tdisabled: config.disabled,\n\t\tautoApprove: config.autoApprove?.map(trimString),\n\t\tstartupTimeout: config.startupTimeout,\n\t\tdebug: config.debug,\n\t\tdisplayName: config.displayName,\n\t\tdescription: config.description,\n\t\tagent_mode: normalizeOptionalAgentModes(config.agent_mode),\n\t};\n\tif (config.type === \"service\") {\n\t\treturn {\n\t\t\ttype: \"service\",\n\t\t\tserviceId: trimString(config.serviceId),\n\t\t\tpath: trimString(config.path),\n\t\t\t...common,\n\t\t};\n\t}\n\tif (config.type === \"http\") {\n\t\treturn {\n\t\t\ttype: \"http\",\n\t\t\turl: trimString(config.url),\n\t\t\theaders: config.headers ? { ...config.headers } : undefined,\n\t\t\toauthClientId: config.oauthClientId,\n\t\t\toauthDeviceFlow: config.oauthDeviceFlow,\n\t\t\toauthScopes: config.oauthScopes,\n\t\t\t...common,\n\t\t};\n\t}\n\treturn {\n\t\ttype: config.type,\n\t\tcommand: trimString(config.command),\n\t\targs: config.args ? [...config.args] : undefined,\n\t\tenv: config.env ? { ...config.env } : undefined,\n\t\tcwd: config.cwd,\n\t\t...common,\n\t};\n}\n\nexport function validatePluginId(id: string): void {\n\tif (!Value.Check(PluginIdSchema, id)) {\n\t\tthrow new Error(\"Plugin id must be 1-64 chars: lowercase letters, numbers, dot, underscore, or dash\");\n\t}\n}\n\nexport function validatePluginVersion(version: string): void {\n\tif (!Value.Check(PluginVersionSchema, version)) {\n\t\tthrow new Error(\"Plugin version must be 1-64 chars and cannot contain path separators\");\n\t}\n}\n\nexport function validatePluginRelativePath(value: string, fieldName: string): string {\n\tif (value.startsWith(\"/\") || /^[a-zA-Z]:/.test(value)) {\n\t\tthrow new Error(`Invalid plugin ${fieldName}`);\n\t}\n\tconst parts: string[] = [];\n\tfor (const part of value.replace(/\\\\/g, \"/\").split(\"/\")) {\n\t\tif (part === \"\" || part === \".\") continue;\n\t\tif (part === \"..\") {\n\t\t\tif (parts.length === 0) throw new Error(`Invalid plugin ${fieldName}`);\n\t\t\tparts.pop();\n\t\t\tcontinue;\n\t\t}\n\t\tparts.push(part);\n\t}\n\tconst normalized = parts.join(\"/\");\n\tif (!normalized) throw new Error(`Invalid plugin ${fieldName}`);\n\treturn normalized;\n}\n\nexport function parsePluginCommandNames(value: unknown): string[] {\n\tif (value === undefined) return [];\n\tassertSchema(PluginCommandNamesSchema, value, \"commands\");\n\treturn Array.from(new Set(value));\n}\n\n/** @deprecated agent_mode 已无任何运行时语义(ADR-0071),保留仅为容忍既有 manifest。 */\nexport function normalizePluginAgentModes(value: unknown): string[] | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tconst values = Array.isArray(value) ? value : [value];\n\tconst modes = values.map((item) => String(item).trim()).filter(Boolean);\n\treturn modes.length > 0 ? modes : undefined;\n}\n\nexport function parsePluginMcpServerConfig(name: string, raw: unknown): PluginMcpServerConfig {\n\tassertSchema(PluginMcpServerConfigSchema, raw, `MCP server '${name}'`);\n\treturn normalizePluginMcpServerConfig(raw);\n}\n\nexport function isPluginPassthroughIconRef(icon: string): boolean {\n\treturn (\n\t\ticon.startsWith(\"http://\") ||\n\t\ticon.startsWith(\"https://\") ||\n\t\t/^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$/.test(icon)\n\t);\n}\n\nexport function isPluginPackagedIconPath(icon: string): boolean {\n\treturn !isPluginPassthroughIconRef(icon);\n}\n\nexport function parsePluginManifest(raw: unknown): PluginManifest {\n\tif (typeof raw === \"object\" && raw !== null && \"runtime\" in raw) {\n\t\tthrow new Error(\n\t\t\t'Invalid plugin manifest.runtime: runtime selection is unsupported; plugins use Module Federation.',\n\t\t);\n\t}\n\tassertSchema(PluginManifestSchema, raw, \"manifest\");\n\tconst commands = parsePluginCommandNames(raw.commands);\n\tconst icon = raw.icon === undefined ? undefined : trimString(raw.icon);\n\tconst permissions = normalizePermissions(raw.permissions);\n\tconst network = normalizeNetworkManifest(raw.network);\n\tconst browser = normalizeBrowserManifest(raw.browser);\n\tif (permissions.includes(\"network.fetch\") && !network) {\n\t\tthrow new Error(\"Plugin network.allowedHosts is required with network.fetch\");\n\t}\n\tconst browserPermissions = permissions.filter((permission) => permission.startsWith(\"browser.\"));\n\tif (browserPermissions.length > 0 && !browser) {\n\t\tthrow new Error(\"Plugin browser.allowedHosts is required with browser permissions\");\n\t}\n\tif (permissions.includes(\"browser.interact\") && !permissions.includes(\"browser.read\")) {\n\t\tthrow new Error(\"Plugin browser.interact requires browser.read\");\n\t}\n\tconst normalizedServices = raw.providers ? normalizeServiceProviders(raw.providers.services) : undefined;\n\tfor (const [name, server] of Object.entries(raw.agent?.mcpServers && typeof raw.agent.mcpServers !== \"string\" ? raw.agent.mcpServers : {})) {\n\t\tif (server.type === \"service\" && !normalizedServices?.some((service) => service.id === server.serviceId)) {\n\t\t\tthrow new Error(`Plugin MCP server '${name}' references unknown service '${server.serviceId}'`);\n\t\t}\n\t}\n\treturn {\n\t\tid: raw.id,\n\t\tname: trimString(raw.name),\n\t\tversion: raw.version,\n\t\tpluginApiVersion: trimString(raw.pluginApiVersion),\n\t\tentry: validatePluginRelativePath(trimString(raw.entry), \"entry\"),\n\t\tmoduleFederation: normalizeModuleFederation(raw.moduleFederation),\n\t\tagent: normalizeAgentManifest(raw.agent),\n\t\tproviders: raw.providers\n\t\t\t? {\n\t\t\t\t\tcli: normalizeCliProviders(raw.providers.cli),\n\t\t\t\t\tservices: normalizedServices,\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tstyles: normalizeStringArray(raw.styles).map((style) => validatePluginRelativePath(style, \"styles\")),\n\t\tpermissions,\n\t\tnetwork,\n\t\tbrowser,\n\t\tcommands: commands.length > 0 ? commands : undefined,\n\t\tdescription: raw.description,\n\t\tauthor: raw.author,\n\t\ticon:\n\t\t\ticon === undefined || isPluginPassthroughIconRef(icon)\n\t\t\t\t? icon\n\t\t\t\t: validatePluginRelativePath(icon, \"icon\"),\n\t\tguidingWords: raw.guidingWords?.map(trimString),\n\t\tdefaultLocale: raw.defaultLocale ?? \"zh\",\n\t\tcontributionMode: raw.contributionMode\n\t\t\t? { hardIsolation: raw.contributionMode.hardIsolation === true }\n\t\t\t: undefined,\n\t\tagent_mode: normalizePluginAgentModes(raw.agent_mode),\n\t};\n}\n\nexport function listPluginManifestResources(\n\tmanifest: PluginManifest,\n): PluginManifestResourceReference[] {\n\tconst resources: PluginManifestResourceReference[] = [\n\t\t{ field: \"entry\", path: manifest.entry, kind: \"file\" },\n\t];\n\tfor (const stylePath of manifest.styles ?? []) {\n\t\tresources.push({ field: \"styles\", path: stylePath, kind: \"file\" });\n\t}\n\tif (manifest.icon && isPluginPackagedIconPath(manifest.icon)) {\n\t\tresources.push({ field: \"icon\", path: manifest.icon, kind: \"file\" });\n\t}\n\tfor (const promptPath of manifest.agent?.systemPrompt?.promptPaths ?? []) {\n\t\tresources.push({ field: \"agent.systemPrompt.promptPaths\", path: promptPath, kind: \"file-or-directory\" });\n\t}\n\tfor (const skillPath of manifest.agent?.skillPaths ?? []) {\n\t\tresources.push({ field: \"agent.skillPaths\", path: skillPath, kind: \"file-or-directory\" });\n\t}\n\tfor (const agent of manifest.agent?.agents ?? []) {\n\t\t// 人设与头像是插件包里的真实文件:不登记就不会被打进包,装到用户机器上时这个\n\t\t// 智能体会因为「提示词读不出来」被整个跳过。\n\t\tif (agent.avatar) resources.push({ field: \"agent.agents.avatar\", path: agent.avatar, kind: \"file\" });\n\t\tif (agent.systemPromptPath) {\n\t\t\tresources.push({ field: \"agent.agents.systemPromptPath\", path: agent.systemPromptPath, kind: \"file\" });\n\t\t}\n\t}\n\tfor (const team of manifest.agent?.teams ?? []) {\n\t\tif (team.workflowPath) {\n\t\t\tresources.push({ field: \"agent.teams.workflowPath\", path: team.workflowPath, kind: \"file\" });\n\t\t}\n\t}\n\tif (typeof manifest.agent?.mcpServers === \"string\") {\n\t\tresources.push({ field: \"agent.mcpServers\", path: manifest.agent.mcpServers, kind: \"file\" });\n\t}\n\tfor (const service of manifest.providers?.services ?? []) {\n\t\tfor (const template of service.templates ?? []) {\n\t\t\tresources.push({ field: `providers.services.${service.id}.templates.source`, path: template.source, kind: \"file\" });\n\t\t}\n\t}\n\treturn resources;\n}\n\nfunction parseApiVersion(value: string): readonly [number, number, number] | undefined {\n\tconst match = /^(\\d+)\\.(\\d+)\\.(\\d+)$/.exec(value);\n\tif (!match) return undefined;\n\treturn [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nfunction compareApiVersions(\n\tleft: readonly [number, number, number],\n\tright: readonly [number, number, number],\n): number {\n\tfor (let index = 0; index < left.length; index += 1) {\n\t\tif (left[index] !== right[index]) return left[index] - right[index];\n\t}\n\treturn 0;\n}\n\nexport function isPluginApiCompatible(hostVersion: string, range: string): boolean {\n\tconst host = parseApiVersion(hostVersion);\n\tif (!host) return false;\n\tconst normalized = range.trim();\n\tconst exact = parseApiVersion(normalized);\n\tif (exact) return exact[0] === host[0] && compareApiVersions(host, exact) >= 0;\n\tconst caret = normalized.startsWith(\"^\") ? parseApiVersion(normalized.slice(1)) : undefined;\n\tif (caret) return caret[0] === host[0] && compareApiVersions(host, caret) >= 0;\n\tif (normalized === `^${host[0]}` || normalized === `${host[0]}.x`) return true;\n\tconst minimum = normalized.startsWith(\">=\") ? parseApiVersion(normalized.slice(2)) : undefined;\n\treturn minimum !== undefined && compareApiVersions(host, minimum) >= 0;\n}\n"]}
|