@vetta-org/plugin-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/activity-tab.d.ts +2 -0
- package/dist/activity-tab.d.ts.map +1 -1
- package/dist/activity-tab.js +1 -1
- package/dist/activity-tab.js.map +1 -1
- package/dist/agent.d.ts +158 -2
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +14 -1
- package/dist/agent.js.map +1 -1
- package/dist/ai.d.ts +93 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +2 -0
- package/dist/ai.js.map +1 -0
- package/dist/app-actions.d.ts +9 -0
- package/dist/app-actions.d.ts.map +1 -1
- package/dist/app-actions.js.map +1 -1
- package/dist/artifacts.d.ts +31 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +2 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/browser.d.ts +119 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/capture.d.ts +64 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +2 -0
- package/dist/capture.js.map +1 -0
- package/dist/command.d.ts +43 -0
- package/dist/command.d.ts.map +1 -1
- package/dist/command.js.map +1 -1
- package/dist/context.d.ts +48 -5
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/conversation.d.ts +67 -2
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js.map +1 -1
- package/dist/file-explorer.d.ts +87 -0
- package/dist/file-explorer.d.ts.map +1 -0
- package/dist/file-explorer.js +2 -0
- package/dist/file-explorer.js.map +1 -0
- package/dist/fs.d.ts +16 -0
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js.map +1 -1
- package/dist/gateway.d.ts +37 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +14 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +24 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs.d.ts +34 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +2 -0
- package/dist/jobs.js.map +1 -0
- package/dist/manifest-schema.d.ts +234 -0
- package/dist/manifest-schema.d.ts.map +1 -0
- package/dist/manifest-schema.js +145 -0
- package/dist/manifest-schema.js.map +1 -0
- package/dist/manifest.d.ts +21 -55
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +342 -1
- package/dist/manifest.js.map +1 -1
- package/dist/media.d.ts +193 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +11 -0
- package/dist/media.js.map +1 -0
- package/dist/network.d.ts +2 -1
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js.map +1 -1
- package/dist/npm-package.d.ts +17 -0
- package/dist/npm-package.d.ts.map +1 -0
- package/dist/npm-package.js +38 -0
- package/dist/npm-package.js.map +1 -0
- package/dist/official.d.ts +218 -10
- package/dist/official.d.ts.map +1 -1
- package/dist/official.js.map +1 -1
- package/dist/permissions.d.ts +2 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +54 -1
- package/dist/permissions.js.map +1 -1
- package/dist/prompt-attachment.d.ts +30 -6
- package/dist/prompt-attachment.d.ts.map +1 -1
- package/dist/prompt-attachment.js +35 -1
- package/dist/prompt-attachment.js.map +1 -1
- package/dist/quickjs.d.ts +147 -0
- package/dist/quickjs.d.ts.map +1 -0
- package/dist/quickjs.js +2 -0
- package/dist/quickjs.js.map +1 -0
- package/dist/shortcuts.d.ts +60 -0
- package/dist/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts.js +34 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/storage.d.ts +7 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/ui.d.ts +246 -13
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js.map +1 -1
- package/package.json +21 -2
- package/src/tailwind-theme.css +30 -0
package/dist/manifest.js
CHANGED
|
@@ -1,2 +1,343 @@
|
|
|
1
|
-
|
|
1
|
+
import { Value } from "@sinclair/typebox/value";
|
|
2
|
+
import { PluginCommandNamesSchema, PluginIdSchema, PluginManifestSchema, PluginMcpServerConfigSchema, PluginVersionSchema, } from "./manifest-schema.js";
|
|
3
|
+
import "./permissions.js";
|
|
4
|
+
export { PluginAgentManifestSchema, PluginBrowserManifestSchema, PluginCommandNameSchema, PluginCommandNamesSchema, PluginIdSchema, PluginManifestSchema, PluginMcpHttpServerConfigSchema, PluginMcpServerConfigSchema, PluginMcpStdioServerConfigSchema, PluginModuleFederationManifestSchema, PluginNetworkManifestSchema, PluginPermissionSchema, PluginSettingDefinitionSchema, PluginVersionSchema, } from "./manifest-schema.js";
|
|
5
|
+
export { PLUGIN_PERMISSIONS } from "./permissions.js";
|
|
6
|
+
function schemaErrorPath(path) {
|
|
7
|
+
if (!path)
|
|
8
|
+
return "";
|
|
9
|
+
return path
|
|
10
|
+
.split("/")
|
|
11
|
+
.slice(1)
|
|
12
|
+
.map((segment) => segment.replace(/~1/g, "/").replace(/~0/g, "~"))
|
|
13
|
+
.map((segment) => {
|
|
14
|
+
if (segment === "")
|
|
15
|
+
return '[""]';
|
|
16
|
+
return /^\d+$/.test(segment) ? `[${segment}]` : `.${segment}`;
|
|
17
|
+
})
|
|
18
|
+
.join("");
|
|
19
|
+
}
|
|
20
|
+
function mostSpecificSchemaError(issue) {
|
|
21
|
+
const nested = issue.errors.flatMap((iterator) => [...iterator].map((child) => mostSpecificSchemaError(child)));
|
|
22
|
+
const deeper = nested.filter((child) => child.path.length > issue.path.length);
|
|
23
|
+
if (deeper.length === 0)
|
|
24
|
+
return issue;
|
|
25
|
+
return deeper.reduce((best, child) => (child.path.length > best.path.length ? child : best));
|
|
26
|
+
}
|
|
27
|
+
function assertSchema(schema, value, fieldName) {
|
|
28
|
+
if (Value.Check(schema, value))
|
|
29
|
+
return;
|
|
30
|
+
const firstIssue = Value.Errors(schema, value).First();
|
|
31
|
+
const issue = firstIssue ? mostSpecificSchemaError(firstIssue) : undefined;
|
|
32
|
+
const location = `${fieldName}${schemaErrorPath(issue?.path ?? "")}`;
|
|
33
|
+
throw new Error(`Invalid plugin ${location}: ${issue?.message ?? "schema validation failed"}`);
|
|
34
|
+
}
|
|
35
|
+
function trimString(value) {
|
|
36
|
+
return value.trim();
|
|
37
|
+
}
|
|
38
|
+
function normalizeStringArray(values) {
|
|
39
|
+
return (values ?? []).map(trimString);
|
|
40
|
+
}
|
|
41
|
+
function normalizeOptionalAgentModes(value) {
|
|
42
|
+
if (value === undefined)
|
|
43
|
+
return undefined;
|
|
44
|
+
return Array.isArray(value) ? normalizeStringArray(value) : trimString(value);
|
|
45
|
+
}
|
|
46
|
+
function normalizeSetting(setting) {
|
|
47
|
+
const common = {
|
|
48
|
+
key: trimString(setting.key),
|
|
49
|
+
description: setting.description,
|
|
50
|
+
default: setting.default,
|
|
51
|
+
enum: setting.enum?.map(trimString),
|
|
52
|
+
visibleWhen: setting.visibleWhen
|
|
53
|
+
? {
|
|
54
|
+
key: trimString(setting.visibleWhen.key),
|
|
55
|
+
in: setting.visibleWhen.in.map(trimString),
|
|
56
|
+
}
|
|
57
|
+
: undefined,
|
|
58
|
+
};
|
|
59
|
+
if (setting.type === "desc") {
|
|
60
|
+
return {
|
|
61
|
+
...common,
|
|
62
|
+
type: "desc",
|
|
63
|
+
title: setting.title === undefined ? undefined : trimString(setting.title),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
...common,
|
|
68
|
+
type: setting.type,
|
|
69
|
+
title: trimString(setting.title),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function normalizeSettings(settings) {
|
|
73
|
+
if (!settings || settings.length === 0)
|
|
74
|
+
return undefined;
|
|
75
|
+
return settings.map(normalizeSetting);
|
|
76
|
+
}
|
|
77
|
+
function normalizePermissions(permissions) {
|
|
78
|
+
return Array.from(new Set(permissions ?? []));
|
|
79
|
+
}
|
|
80
|
+
function normalizeAllowedHost(value, fieldName) {
|
|
81
|
+
const raw = trimString(value).toLowerCase();
|
|
82
|
+
if (raw === "*")
|
|
83
|
+
return raw;
|
|
84
|
+
const wildcard = raw.startsWith("*.");
|
|
85
|
+
const candidate = wildcard ? raw.slice(2) : raw;
|
|
86
|
+
if (!candidate || candidate.includes("*") || /[\\/?#@]/.test(candidate)) {
|
|
87
|
+
throw new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);
|
|
88
|
+
}
|
|
89
|
+
const unwrapped = candidate.startsWith("[") && candidate.endsWith("]") ? candidate.slice(1, -1) : candidate;
|
|
90
|
+
if (wildcard && unwrapped.includes(":")) {
|
|
91
|
+
throw new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const parsed = new URL(`http://${unwrapped.includes(":") ? `[${unwrapped}]` : unwrapped}`);
|
|
95
|
+
const hostname = parsed.hostname.replace(/^\[|\]$/g, "").replace(/\.$/, "").toLowerCase();
|
|
96
|
+
if (!hostname || parsed.port || parsed.username || parsed.password)
|
|
97
|
+
throw new Error("invalid host");
|
|
98
|
+
return wildcard ? `*.${hostname}` : hostname;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw new Error(`Invalid plugin ${fieldName}.allowedHosts entry: ${value}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function normalizeNetworkManifest(network) {
|
|
105
|
+
if (!network)
|
|
106
|
+
return undefined;
|
|
107
|
+
return { allowedHosts: Array.from(new Set(network.allowedHosts.map((host) => normalizeAllowedHost(host, "network")))) };
|
|
108
|
+
}
|
|
109
|
+
function normalizeBrowserManifest(browser) {
|
|
110
|
+
if (!browser)
|
|
111
|
+
return undefined;
|
|
112
|
+
return { allowedHosts: Array.from(new Set(browser.allowedHosts.map((host) => normalizeAllowedHost(host, "browser")))) };
|
|
113
|
+
}
|
|
114
|
+
function normalizeModuleFederation(moduleFederation) {
|
|
115
|
+
return {
|
|
116
|
+
remoteName: trimString(moduleFederation.remoteName),
|
|
117
|
+
expose: trimString(moduleFederation.expose),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function normalizeToolPolicy(toolPolicy) {
|
|
121
|
+
if (!toolPolicy)
|
|
122
|
+
return undefined;
|
|
123
|
+
return {
|
|
124
|
+
allow: normalizeStringArray(toolPolicy.allow),
|
|
125
|
+
deny: normalizeStringArray(toolPolicy.deny),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function normalizeMcpServers(mcpServers) {
|
|
129
|
+
if (mcpServers === undefined)
|
|
130
|
+
return undefined;
|
|
131
|
+
if (typeof mcpServers === "string") {
|
|
132
|
+
return validatePluginRelativePath(trimString(mcpServers), "agent.mcpServers");
|
|
133
|
+
}
|
|
134
|
+
const result = {};
|
|
135
|
+
for (const [name, config] of Object.entries(mcpServers)) {
|
|
136
|
+
result[trimString(name)] = normalizePluginMcpServerConfig(config);
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
function normalizeAgentManifest(agent) {
|
|
141
|
+
if (!agent)
|
|
142
|
+
return undefined;
|
|
143
|
+
return {
|
|
144
|
+
systemPrompt: agent.systemPrompt
|
|
145
|
+
? {
|
|
146
|
+
promptPaths: normalizeStringArray(agent.systemPrompt.promptPaths).map((path) => validatePluginRelativePath(path, "agent.systemPrompt.promptPaths")),
|
|
147
|
+
}
|
|
148
|
+
: undefined,
|
|
149
|
+
skillPaths: normalizeStringArray(agent.skillPaths).map((path) => validatePluginRelativePath(path, "agent.skillPaths")),
|
|
150
|
+
mcpServers: normalizeMcpServers(agent.mcpServers),
|
|
151
|
+
toolPolicy: normalizeToolPolicy(agent.toolPolicy),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function normalizePluginMcpServerConfig(config) {
|
|
155
|
+
const common = {
|
|
156
|
+
disabled: config.disabled,
|
|
157
|
+
autoApprove: config.autoApprove?.map(trimString),
|
|
158
|
+
startupTimeout: config.startupTimeout,
|
|
159
|
+
debug: config.debug,
|
|
160
|
+
displayName: config.displayName,
|
|
161
|
+
description: config.description,
|
|
162
|
+
agent_mode: normalizeOptionalAgentModes(config.agent_mode),
|
|
163
|
+
};
|
|
164
|
+
if (config.type === "http") {
|
|
165
|
+
return {
|
|
166
|
+
type: "http",
|
|
167
|
+
url: trimString(config.url),
|
|
168
|
+
headers: config.headers ? { ...config.headers } : undefined,
|
|
169
|
+
oauthClientId: config.oauthClientId,
|
|
170
|
+
oauthDeviceFlow: config.oauthDeviceFlow,
|
|
171
|
+
oauthScopes: config.oauthScopes,
|
|
172
|
+
...common,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
type: config.type,
|
|
177
|
+
command: trimString(config.command),
|
|
178
|
+
args: config.args ? [...config.args] : undefined,
|
|
179
|
+
env: config.env ? { ...config.env } : undefined,
|
|
180
|
+
cwd: config.cwd,
|
|
181
|
+
...common,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export function validatePluginId(id) {
|
|
185
|
+
if (!Value.Check(PluginIdSchema, id)) {
|
|
186
|
+
throw new Error("Plugin id must be 1-64 chars: lowercase letters, numbers, dot, underscore, or dash");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export function validatePluginVersion(version) {
|
|
190
|
+
if (!Value.Check(PluginVersionSchema, version)) {
|
|
191
|
+
throw new Error("Plugin version must be 1-64 chars and cannot contain path separators");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
export function validatePluginRelativePath(value, fieldName) {
|
|
195
|
+
if (value.startsWith("/") || /^[a-zA-Z]:/.test(value)) {
|
|
196
|
+
throw new Error(`Invalid plugin ${fieldName}`);
|
|
197
|
+
}
|
|
198
|
+
const parts = [];
|
|
199
|
+
for (const part of value.replace(/\\/g, "/").split("/")) {
|
|
200
|
+
if (part === "" || part === ".")
|
|
201
|
+
continue;
|
|
202
|
+
if (part === "..") {
|
|
203
|
+
if (parts.length === 0)
|
|
204
|
+
throw new Error(`Invalid plugin ${fieldName}`);
|
|
205
|
+
parts.pop();
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
parts.push(part);
|
|
209
|
+
}
|
|
210
|
+
const normalized = parts.join("/");
|
|
211
|
+
if (!normalized)
|
|
212
|
+
throw new Error(`Invalid plugin ${fieldName}`);
|
|
213
|
+
return normalized;
|
|
214
|
+
}
|
|
215
|
+
export function parsePluginCommandNames(value) {
|
|
216
|
+
if (value === undefined)
|
|
217
|
+
return [];
|
|
218
|
+
assertSchema(PluginCommandNamesSchema, value, "commands");
|
|
219
|
+
return Array.from(new Set(value));
|
|
220
|
+
}
|
|
221
|
+
/** @deprecated agent_mode 已无任何运行时语义(ADR-0071),保留仅为容忍既有 manifest。 */
|
|
222
|
+
export function normalizePluginAgentModes(value) {
|
|
223
|
+
if (value === undefined || value === null)
|
|
224
|
+
return undefined;
|
|
225
|
+
const values = Array.isArray(value) ? value : [value];
|
|
226
|
+
const modes = values.map((item) => String(item).trim()).filter(Boolean);
|
|
227
|
+
return modes.length > 0 ? modes : undefined;
|
|
228
|
+
}
|
|
229
|
+
export function parsePluginMcpServerConfig(name, raw) {
|
|
230
|
+
assertSchema(PluginMcpServerConfigSchema, raw, `MCP server '${name}'`);
|
|
231
|
+
return normalizePluginMcpServerConfig(raw);
|
|
232
|
+
}
|
|
233
|
+
export function isPluginPassthroughIconRef(icon) {
|
|
234
|
+
return (icon.startsWith("http://") ||
|
|
235
|
+
icon.startsWith("https://") ||
|
|
236
|
+
/^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$/.test(icon));
|
|
237
|
+
}
|
|
238
|
+
export function isPluginPackagedIconPath(icon) {
|
|
239
|
+
return !isPluginPassthroughIconRef(icon);
|
|
240
|
+
}
|
|
241
|
+
export function parsePluginManifest(raw) {
|
|
242
|
+
if (typeof raw === "object" && raw !== null && "runtime" in raw) {
|
|
243
|
+
throw new Error('Invalid plugin manifest.runtime: runtime selection is unsupported; plugins use Module Federation.');
|
|
244
|
+
}
|
|
245
|
+
assertSchema(PluginManifestSchema, raw, "manifest");
|
|
246
|
+
const commands = parsePluginCommandNames(raw.commands);
|
|
247
|
+
const icon = raw.icon === undefined ? undefined : trimString(raw.icon);
|
|
248
|
+
const permissions = normalizePermissions(raw.permissions);
|
|
249
|
+
const network = normalizeNetworkManifest(raw.network);
|
|
250
|
+
const browser = normalizeBrowserManifest(raw.browser);
|
|
251
|
+
if (permissions.includes("network.fetch") && !network) {
|
|
252
|
+
throw new Error("Plugin network.allowedHosts is required with network.fetch");
|
|
253
|
+
}
|
|
254
|
+
const browserPermissions = permissions.filter((permission) => permission.startsWith("browser."));
|
|
255
|
+
if (browserPermissions.length > 0 && !browser) {
|
|
256
|
+
throw new Error("Plugin browser.allowedHosts is required with browser permissions");
|
|
257
|
+
}
|
|
258
|
+
if (permissions.includes("browser.interact") && !permissions.includes("browser.read")) {
|
|
259
|
+
throw new Error("Plugin browser.interact requires browser.read");
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
id: raw.id,
|
|
263
|
+
name: trimString(raw.name),
|
|
264
|
+
version: raw.version,
|
|
265
|
+
pluginApiVersion: trimString(raw.pluginApiVersion),
|
|
266
|
+
entry: validatePluginRelativePath(trimString(raw.entry), "entry"),
|
|
267
|
+
moduleFederation: normalizeModuleFederation(raw.moduleFederation),
|
|
268
|
+
agent: normalizeAgentManifest(raw.agent),
|
|
269
|
+
styles: normalizeStringArray(raw.styles).map((style) => validatePluginRelativePath(style, "styles")),
|
|
270
|
+
permissions,
|
|
271
|
+
network,
|
|
272
|
+
browser,
|
|
273
|
+
commands: commands.length > 0 ? commands : undefined,
|
|
274
|
+
contributes: raw.contributes
|
|
275
|
+
? (() => {
|
|
276
|
+
const settings = normalizeSettings(raw.contributes.settings);
|
|
277
|
+
return settings ? { settings } : undefined;
|
|
278
|
+
})()
|
|
279
|
+
: undefined,
|
|
280
|
+
description: raw.description,
|
|
281
|
+
author: raw.author,
|
|
282
|
+
icon: icon === undefined || isPluginPassthroughIconRef(icon)
|
|
283
|
+
? icon
|
|
284
|
+
: validatePluginRelativePath(icon, "icon"),
|
|
285
|
+
guidingWords: raw.guidingWords?.map(trimString),
|
|
286
|
+
defaultLocale: raw.defaultLocale ?? "zh",
|
|
287
|
+
contributionMode: raw.contributionMode
|
|
288
|
+
? { hardIsolation: raw.contributionMode.hardIsolation === true }
|
|
289
|
+
: undefined,
|
|
290
|
+
agent_mode: normalizePluginAgentModes(raw.agent_mode),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
export function listPluginManifestResources(manifest) {
|
|
294
|
+
const resources = [
|
|
295
|
+
{ field: "entry", path: manifest.entry, kind: "file" },
|
|
296
|
+
];
|
|
297
|
+
for (const stylePath of manifest.styles ?? []) {
|
|
298
|
+
resources.push({ field: "styles", path: stylePath, kind: "file" });
|
|
299
|
+
}
|
|
300
|
+
if (manifest.icon && isPluginPackagedIconPath(manifest.icon)) {
|
|
301
|
+
resources.push({ field: "icon", path: manifest.icon, kind: "file" });
|
|
302
|
+
}
|
|
303
|
+
for (const promptPath of manifest.agent?.systemPrompt?.promptPaths ?? []) {
|
|
304
|
+
resources.push({ field: "agent.systemPrompt.promptPaths", path: promptPath, kind: "file-or-directory" });
|
|
305
|
+
}
|
|
306
|
+
for (const skillPath of manifest.agent?.skillPaths ?? []) {
|
|
307
|
+
resources.push({ field: "agent.skillPaths", path: skillPath, kind: "file-or-directory" });
|
|
308
|
+
}
|
|
309
|
+
if (typeof manifest.agent?.mcpServers === "string") {
|
|
310
|
+
resources.push({ field: "agent.mcpServers", path: manifest.agent.mcpServers, kind: "file" });
|
|
311
|
+
}
|
|
312
|
+
return resources;
|
|
313
|
+
}
|
|
314
|
+
function parseApiVersion(value) {
|
|
315
|
+
const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(value);
|
|
316
|
+
if (!match)
|
|
317
|
+
return undefined;
|
|
318
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
319
|
+
}
|
|
320
|
+
function compareApiVersions(left, right) {
|
|
321
|
+
for (let index = 0; index < left.length; index += 1) {
|
|
322
|
+
if (left[index] !== right[index])
|
|
323
|
+
return left[index] - right[index];
|
|
324
|
+
}
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
export function isPluginApiCompatible(hostVersion, range) {
|
|
328
|
+
const host = parseApiVersion(hostVersion);
|
|
329
|
+
if (!host)
|
|
330
|
+
return false;
|
|
331
|
+
const normalized = range.trim();
|
|
332
|
+
const exact = parseApiVersion(normalized);
|
|
333
|
+
if (exact)
|
|
334
|
+
return exact[0] === host[0] && compareApiVersions(host, exact) >= 0;
|
|
335
|
+
const caret = normalized.startsWith("^") ? parseApiVersion(normalized.slice(1)) : undefined;
|
|
336
|
+
if (caret)
|
|
337
|
+
return caret[0] === host[0] && compareApiVersions(host, caret) >= 0;
|
|
338
|
+
if (normalized === `^${host[0]}` || normalized === `${host[0]}.x`)
|
|
339
|
+
return true;
|
|
340
|
+
const minimum = normalized.startsWith(">=") ? parseApiVersion(normalized.slice(2)) : undefined;
|
|
341
|
+
return minimum !== undefined && compareApiVersions(host, minimum) >= 0;
|
|
342
|
+
}
|
|
2
343
|
//# sourceMappingURL=manifest.js.map
|
package/dist/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * MCP server config declared inside a plugin (stdio or http). Relative paths in\n * stdio `command`/`args`/`cwd` are resolved against the plugin root at contribute time.\n */\nexport type PluginMcpServerConfig =\n\t| {\n\t\t\ttype?: \"stdio\";\n\t\t\tcommand: string;\n\t\t\targs?: string[];\n\t\t\tenv?: Record<string, string>;\n\t\t\tcwd?: string;\n\t\t\tdisabled?: boolean;\n\t\t\tautoApprove?: string[];\n\t\t\tstartupTimeout?: number;\n\t\t\tdebug?: boolean;\n\t\t\tdisplayName?: string;\n\t\t\tdescription?: string;\n\t\t\t/** 该 server 的工具允许出现的工作模式 slug(agent_mode 轴,缺省/空 = 通用)。见 ADR-0046。 */\n\t\t\tagent_mode?: string | string[];\n\t }\n\t| {\n\t\t\ttype: \"http\";\n\t\t\turl: string;\n\t\t\theaders?: Record<string, string>;\n\t\t\toauthClientId?: string;\n\t\t\toauthDeviceFlow?: boolean;\n\t\t\toauthScopes?: string;\n\t\t\tdisabled?: boolean;\n\t\t\tautoApprove?: string[];\n\t\t\tstartupTimeout?: number;\n\t\t\tdebug?: boolean;\n\t\t\tdisplayName?: string;\n\t\t\tdescription?: string;\n\t\t\t/** 该 server 的工具允许出现的工作模式 slug(agent_mode 轴,缺省/空 = 通用)。见 ADR-0046。 */\n\t\t\tagent_mode?: string | string[];\n\t };\n\nexport interface PluginAgentManifest {\n\tsystemPrompt?: {\n\t\t/**\n\t\t * Plugin-packaged prompt contribution file paths. Main-process aggregation\n\t\t * resolves these relative to the installed plugin root.\n\t\t */\n\t\tpromptPaths?: string[];\n\t};\n\t/** Plugin-packaged skill files or directories to add to the agent resource graph. */\n\tskillPaths?: string[];\n\t/**\n\t * Plugin-scoped MCP servers. Either a relative path to `.mcp.json`\n\t * (shape `{ mcpServers: { ... } }`) or an inline map of server configs.\n\t * Requires permission `agent.mcp.control`. Never written into user mcp.json.\n\t */\n\tmcpServers?: string | Record<string, PluginMcpServerConfig>;\n\t/** Declarative tool visibility policy. Names are tool ids after registration. */\n\ttoolPolicy?: {\n\t\tallow?: string[];\n\t\tdeny?: string[];\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAEN,wBAAwB,EACxB,cAAc,EACd,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,GAQnB,MAAM,sBAAsB,CAAC;AAC9B,OAA0D,kBAAkB,CAAC;AAE7E,OAAO,EACN,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,oBAAoB,EACpB,+BAA+B,EAC/B,2BAA2B,EAC3B,gCAAgC,EAChC,oCAAoC,EACpC,2BAA2B,EAC3B,sBAAsB,EACtB,6BAA6B,EAC7B,mBAAmB,GACnB,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAStD,SAAS,eAAe,CAAC,IAAY,EAAU;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,CAAC;SACR,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SACjE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACjB,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC;QAClC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAAA,CAC9D,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACX;AAED,SAAS,uBAAuB,CAAC,KAAiB,EAAc;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChD,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAC5D,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAAA,CAC7F;AAED,SAAS,YAAY,CACpB,MAAc,EACd,KAAc,EACd,SAAiB,EACiB;IAClC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,QAAQ,GAAG,GAAG,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;IACrE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,KAAK,KAAK,EAAE,OAAO,IAAI,0BAA0B,EAAE,CAAC,CAAC;AAAA,CAC/F;AAED,SAAS,UAAU,CAAC,KAAa,EAAU;IAC1C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AAAA,CACpB;AAED,SAAS,oBAAoB,CAAC,MAA4B,EAAY;IACrE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAAA,CACtC;AAED,SAAS,2BAA2B,CAAC,KAAoC,EAAiC;IACzG,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAAA,CAC9E;AAED,SAAS,gBAAgB,CAAC,OAA4B,EAAuB;IAC5E,MAAM,MAAM,GAAG;QACd,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;QACnC,WAAW,EAAE,OAAO,CAAC,WAAW;YAC/B,CAAC,CAAC;gBACA,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC;gBACxC,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;aAC1C;YACF,CAAC,CAAC,SAAS;KACZ,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO;YACN,GAAG,MAAM;YACT,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;SAC1E,CAAC;IACH,CAAC;IACD,OAAO;QACN,GAAG,MAAM;QACT,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;KAChC,CAAC;AAAA,CACF;AAED,SAAS,iBAAiB,CAAC,QAA2C,EAAqC;IAC1G,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,OAAO,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAAA,CACtC;AAED,SAAS,oBAAoB,CAAC,WAA2C,EAAsB;IAC9F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;AAAA,CAC9C;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,SAAgC,EAAU;IACtF,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,wBAAwB,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,IAAI,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,wBAAwB,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3F,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1F,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QACpG,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,wBAAwB,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;AAAA,CACD;AAED,SAAS,wBAAwB,CAAC,OAA0C,EAAqC;IAChH,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,CACxH;AAED,SAAS,wBAAwB,CAAC,OAA0C,EAAqC;IAChH,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,CACxH;AAED,SAAS,yBAAyB,CACjC,gBAAyD,EACpB;IACrC,OAAO;QACN,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC;QACnD,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC;KAC3C,CAAC;AAAA,CACF;AAED,SAAS,mBAAmB,CAC3B,UAA6C,EACT;IACpC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO;QACN,KAAK,EAAE,oBAAoB,CAAC,UAAU,CAAC,KAAK,CAAC;QAC7C,IAAI,EAAE,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC;KAC3C,CAAC;AAAA,CACF;AAED,SAAS,mBAAmB,CAC3B,UAA6C,EACT;IACpC,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,0BAA0B,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,sBAAsB,CAAC,KAAsC,EAAmC;IACxG,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO;QACN,YAAY,EAAE,KAAK,CAAC,YAAY;YAC/B,CAAC,CAAC;gBACA,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9E,0BAA0B,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAClE;aACD;YACF,CAAC,CAAC,SAAS;QACZ,UAAU,EAAE,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/D,0BAA0B,CAAC,IAAI,EAAE,kBAAkB,CAAC,CACpD;QACD,UAAU,EAAE,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC;QACjD,UAAU,EAAE,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC;KACjD,CAAC;AAAA,CACF;AAED,SAAS,8BAA8B,CAAC,MAA6B,EAAyB;IAC7F,MAAM,MAAM,GAAG;QACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,2BAA2B,CAAC,MAAM,CAAC,UAAU,CAAC;KAC1D,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO;YACN,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;YAC3D,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,GAAG,MAAM;SACT,CAAC;IACH,CAAC;IACD,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;QACnC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAChD,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;QAC/C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,MAAM;KACT,CAAC;AAAA,CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAQ;IAClD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACvG,CAAC;AAAA,CACD;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAQ;IAC5D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACzF,CAAC;AAAA,CACD;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAa,EAAE,SAAiB,EAAU;IACpF,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG;YAAE,SAAS;QAC1C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;YACvE,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,SAAS;QACV,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;IAChE,OAAO,UAAU,CAAC;AAAA,CAClB;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc,EAAY;IACjE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,YAAY,CAAC,wBAAwB,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,CAClC;AAED,8GAAoE;AACpE,MAAM,UAAU,yBAAyB,CAAC,KAAc,EAAwB;IAC/E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC5C;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,GAAY,EAAyB;IAC7F,YAAY,CAAC,2BAA2B,EAAE,GAAG,EAAE,eAAe,IAAI,GAAG,CAAC,CAAC;IACvE,OAAO,8BAA8B,CAAC,GAAG,CAAC,CAAC;AAAA,CAC3C;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAW;IACjE,OAAO,CACN,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAC3B,qDAAqD,CAAC,IAAI,CAAC,IAAI,CAAC,CAChE,CAAC;AAAA,CACF;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAW;IAC/D,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;AAAA,CACzC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY,EAAkB;IACjE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACd,mGAAmG,CACnG,CAAC;IACH,CAAC;IACD,YAAY,CAAC,oBAAoB,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO;QACN,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,gBAAgB,EAAE,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAClD,KAAK,EAAE,0BAA0B,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACjE,gBAAgB,EAAE,yBAAyB,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACjE,KAAK,EAAE,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC;QACxC,MAAM,EAAE,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpG,WAAW;QACX,OAAO;QACP,OAAO;QACP,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACpD,WAAW,EAAE,GAAG,CAAC,WAAW;YAC3B,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBACP,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC7D,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAAA,CAC3C,CAAC,EAAE;YACL,CAAC,CAAC,SAAS;QACZ,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EACH,IAAI,KAAK,SAAS,IAAI,0BAA0B,CAAC,IAAI,CAAC;YACrD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC;QAC5C,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC;QAC/C,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI;QACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACrC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,gBAAgB,CAAC,aAAa,KAAK,IAAI,EAAE;YAChE,CAAC,CAAC,SAAS;QACZ,UAAU,EAAE,yBAAyB,CAAC,GAAG,CAAC,UAAU,CAAC;KACrD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,2BAA2B,CAC1C,QAAwB,EACY;IACpC,MAAM,SAAS,GAAsC;QACpD,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;KACtD,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC/C,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,IAAI,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,IAAI,EAAE,EAAE,CAAC;QAC1E,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;QAC1D,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,OAAO,QAAQ,CAAC,KAAK,EAAE,UAAU,KAAK,QAAQ,EAAE,CAAC;QACpD,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,eAAe,CAAC,KAAa,EAAiD;IACtF,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,CAC9D;AAED,SAAS,kBAAkB,CAC1B,IAAuC,EACvC,KAAwC,EAC/B;IACT,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,CAAC;AAAA,CACT;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,KAAa,EAAW;IAClF,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/E,IAAI,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,OAAO,OAAO,KAAK,SAAS,IAAI,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAAA,CACvE","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\tPluginIdSchema,\n\tPluginManifestSchema,\n\tPluginMcpServerConfigSchema,\n\tPluginVersionSchema,\n\ttype PluginAgentManifest,\n\ttype PluginBrowserManifest,\n\ttype PluginManifest,\n\ttype PluginManifestInput,\n\ttype PluginMcpServerConfig,\n\ttype PluginNetworkManifest,\n\ttype PluginSettingSchema,\n} from \"./manifest-schema.js\";\nimport { PLUGIN_PERMISSIONS, type PluginPermission } from \"./permissions.js\";\n\nexport {\n\tPluginAgentManifestSchema,\n\tPluginBrowserManifestSchema,\n\tPluginCommandNameSchema,\n\tPluginCommandNamesSchema,\n\tPluginIdSchema,\n\tPluginManifestSchema,\n\tPluginMcpHttpServerConfigSchema,\n\tPluginMcpServerConfigSchema,\n\tPluginMcpStdioServerConfigSchema,\n\tPluginModuleFederationManifestSchema,\n\tPluginNetworkManifestSchema,\n\tPluginPermissionSchema,\n\tPluginSettingDefinitionSchema,\n\tPluginVersionSchema,\n} from \"./manifest-schema.js\";\nexport type {\n\tPluginAgentManifest,\n\tPluginBrowserManifest,\n\tPluginManifest,\n\tPluginManifestInput,\n\tPluginMcpServerConfig,\n\tPluginNetworkManifest,\n\tPluginSettingSchema,\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 normalizeSetting(setting: PluginSettingSchema): PluginSettingSchema {\n\tconst common = {\n\t\tkey: trimString(setting.key),\n\t\tdescription: setting.description,\n\t\tdefault: setting.default,\n\t\tenum: setting.enum?.map(trimString),\n\t\tvisibleWhen: setting.visibleWhen\n\t\t\t? {\n\t\t\t\t\tkey: trimString(setting.visibleWhen.key),\n\t\t\t\t\tin: setting.visibleWhen.in.map(trimString),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n\tif (setting.type === \"desc\") {\n\t\treturn {\n\t\t\t...common,\n\t\t\ttype: \"desc\",\n\t\t\ttitle: setting.title === undefined ? undefined : trimString(setting.title),\n\t\t};\n\t}\n\treturn {\n\t\t...common,\n\t\ttype: setting.type,\n\t\ttitle: trimString(setting.title),\n\t};\n}\n\nfunction normalizeSettings(settings: PluginSettingSchema[] | undefined): PluginSettingSchema[] | undefined {\n\tif (!settings || settings.length === 0) return undefined;\n\treturn settings.map(normalizeSetting);\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\tmcpServers: normalizeMcpServers(agent.mcpServers),\n\t\ttoolPolicy: normalizeToolPolicy(agent.toolPolicy),\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 === \"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\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\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\tcontributes: raw.contributes\n\t\t\t? (() => {\n\t\t\t\t\tconst settings = normalizeSettings(raw.contributes.settings);\n\t\t\t\t\treturn settings ? { settings } : undefined;\n\t\t\t\t})()\n\t\t\t: 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\tif (typeof manifest.agent?.mcpServers === \"string\") {\n\t\tresources.push({ field: \"agent.mcpServers\", path: manifest.agent.mcpServers, kind: \"file\" });\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"]}
|
package/dist/media.d.ts
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import type { PluginArtifactRef } from "./artifacts.js";
|
|
2
|
+
import type { Disposable } from "./disposable.js";
|
|
3
|
+
import type { PluginJob, PluginJobFailure } from "./jobs.js";
|
|
4
|
+
export type PluginMediaKind = "image" | "video" | "audio" | "document";
|
|
5
|
+
export type PluginMediaOutputKind = "image" | "video" | "audio";
|
|
6
|
+
export type PluginMediaOperation = "generate" | "compose" | "transcode";
|
|
7
|
+
export type PluginMediaGenerationMode = "text-to-image" | "image-to-image" | "text-to-video" | "image-to-video" | "video-to-video" | "reference-to-video";
|
|
8
|
+
export type PluginMediaErrorCode = "unauthenticated" | "provider-unavailable" | "operation-unsupported" | "invalid-request" | "not-entitled" | "quota-exhausted" | "content-rejected" | "provider-timeout" | "provider-failed" | "cancelled";
|
|
9
|
+
export interface PluginMediaFailure extends PluginJobFailure {
|
|
10
|
+
code: PluginMediaErrorCode;
|
|
11
|
+
}
|
|
12
|
+
export declare class PluginMediaError extends Error {
|
|
13
|
+
readonly code: PluginMediaErrorCode;
|
|
14
|
+
readonly retryable: boolean;
|
|
15
|
+
constructor(failure: PluginMediaFailure);
|
|
16
|
+
}
|
|
17
|
+
export interface PluginMediaDimensions {
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
}
|
|
21
|
+
export type PluginMediaInputSource = {
|
|
22
|
+
type: "plugin-blob";
|
|
23
|
+
blobId: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: "workspace-file";
|
|
26
|
+
path: string;
|
|
27
|
+
};
|
|
28
|
+
export interface PluginMediaInput {
|
|
29
|
+
id?: string;
|
|
30
|
+
role?: string;
|
|
31
|
+
kind: PluginMediaKind;
|
|
32
|
+
mimeType?: string;
|
|
33
|
+
source: PluginMediaInputSource;
|
|
34
|
+
}
|
|
35
|
+
export interface PluginMediaOutput {
|
|
36
|
+
kind: PluginMediaOutputKind;
|
|
37
|
+
mimeType: string;
|
|
38
|
+
dimensions?: PluginMediaDimensions;
|
|
39
|
+
fps?: number;
|
|
40
|
+
durationSeconds?: number;
|
|
41
|
+
videoCodec?: string;
|
|
42
|
+
audioCodec?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface PluginMediaArtifact extends PluginArtifactRef {
|
|
45
|
+
kind: PluginMediaOutputKind;
|
|
46
|
+
width?: number;
|
|
47
|
+
height?: number;
|
|
48
|
+
durationSeconds?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface PluginMediaGenerateRequest {
|
|
51
|
+
operation: "generate";
|
|
52
|
+
providerId: string;
|
|
53
|
+
kind: "image" | "video";
|
|
54
|
+
mode: PluginMediaGenerationMode;
|
|
55
|
+
prompt: string;
|
|
56
|
+
modelId?: string;
|
|
57
|
+
dimensions?: PluginMediaDimensions;
|
|
58
|
+
aspectRatio?: string;
|
|
59
|
+
resolution?: string;
|
|
60
|
+
durationSeconds?: number;
|
|
61
|
+
inputs?: readonly PluginMediaInput[];
|
|
62
|
+
}
|
|
63
|
+
export interface PluginMediaComposeRequest {
|
|
64
|
+
operation: "compose";
|
|
65
|
+
providerId: string;
|
|
66
|
+
inputs: readonly PluginMediaInput[];
|
|
67
|
+
output: PluginMediaOutput;
|
|
68
|
+
}
|
|
69
|
+
export interface PluginMediaTranscodeRequest {
|
|
70
|
+
operation: "transcode";
|
|
71
|
+
providerId: string;
|
|
72
|
+
inputs: readonly PluginMediaInput[];
|
|
73
|
+
output: PluginMediaOutput;
|
|
74
|
+
}
|
|
75
|
+
export type PluginMediaSubmitRequest = PluginMediaGenerateRequest | PluginMediaComposeRequest | PluginMediaTranscodeRequest;
|
|
76
|
+
export interface PluginMediaGenerationInputSlot {
|
|
77
|
+
role: string;
|
|
78
|
+
kinds: readonly PluginMediaKind[];
|
|
79
|
+
minItems: number;
|
|
80
|
+
maxItems: number;
|
|
81
|
+
}
|
|
82
|
+
export interface PluginMediaGenerationModeCapability {
|
|
83
|
+
mode: PluginMediaGenerationMode;
|
|
84
|
+
inputs: readonly PluginMediaGenerationInputSlot[];
|
|
85
|
+
minTotalItems?: number;
|
|
86
|
+
maxTotalItems?: number;
|
|
87
|
+
aspectRatioPolicy?: "configurable" | "input-derived";
|
|
88
|
+
audioGeneration?: "none" | "always" | "optional";
|
|
89
|
+
}
|
|
90
|
+
export type PluginMediaCapability = {
|
|
91
|
+
operation: "generate";
|
|
92
|
+
kind: "image" | "video";
|
|
93
|
+
modes: readonly PluginMediaGenerationMode[];
|
|
94
|
+
aspectRatios?: readonly string[];
|
|
95
|
+
/** Provider-defined stable option ids; consumers must not infer pixel dimensions from their names. */
|
|
96
|
+
resolutions?: readonly string[];
|
|
97
|
+
/** Preferred option when the consumer has no supported persisted resolution. */
|
|
98
|
+
defaultResolution?: string;
|
|
99
|
+
durationsSeconds?: readonly number[];
|
|
100
|
+
modeCapabilities?: readonly PluginMediaGenerationModeCapability[];
|
|
101
|
+
} | {
|
|
102
|
+
operation: "compose";
|
|
103
|
+
documentMimeTypes: readonly string[];
|
|
104
|
+
outputMimeTypes: readonly string[];
|
|
105
|
+
} | {
|
|
106
|
+
operation: "transcode";
|
|
107
|
+
inputMimeTypes: readonly string[];
|
|
108
|
+
outputMimeTypes: readonly string[];
|
|
109
|
+
};
|
|
110
|
+
export interface PluginMediaProviderDescriptor {
|
|
111
|
+
/** Host-qualified provider id. */
|
|
112
|
+
id: string;
|
|
113
|
+
displayName?: string;
|
|
114
|
+
ownerId: string;
|
|
115
|
+
protocolVersion: number;
|
|
116
|
+
capabilities: readonly PluginMediaCapability[];
|
|
117
|
+
}
|
|
118
|
+
export type PluginMediaJob = Omit<PluginJob<PluginMediaArtifact>, "error"> & {
|
|
119
|
+
error?: PluginMediaFailure;
|
|
120
|
+
};
|
|
121
|
+
/** A media input exposed to its provider without revealing its storage location. */
|
|
122
|
+
export interface PluginMediaProviderInput {
|
|
123
|
+
id: string;
|
|
124
|
+
role?: string;
|
|
125
|
+
kind: PluginMediaKind;
|
|
126
|
+
mimeType?: string;
|
|
127
|
+
}
|
|
128
|
+
type ProviderRequest<Request extends PluginMediaSubmitRequest> = Omit<Request, "providerId" | "inputs"> & {
|
|
129
|
+
readonly inputs: readonly PluginMediaProviderInput[];
|
|
130
|
+
};
|
|
131
|
+
export type PluginMediaProviderSubmitRequest = PluginMediaSubmitRequest extends infer Request ? Request extends PluginMediaSubmitRequest ? ProviderRequest<Request> : never : never;
|
|
132
|
+
export interface PluginMediaInputUploadRequest {
|
|
133
|
+
url: string;
|
|
134
|
+
fieldName: string;
|
|
135
|
+
fileName?: string;
|
|
136
|
+
fields?: Record<string, string>;
|
|
137
|
+
headers?: Record<string, string>;
|
|
138
|
+
timeoutMs?: number;
|
|
139
|
+
}
|
|
140
|
+
export interface PluginMediaTransferResponse<T = unknown> {
|
|
141
|
+
ok: boolean;
|
|
142
|
+
status: number;
|
|
143
|
+
statusText: string;
|
|
144
|
+
headers: Record<string, string>;
|
|
145
|
+
body: T;
|
|
146
|
+
}
|
|
147
|
+
export interface PluginMediaProviderHandlerContext {
|
|
148
|
+
readonly invocationId: string;
|
|
149
|
+
uploadInput<T = unknown>(inputId: string, request: PluginMediaInputUploadRequest): Promise<PluginMediaTransferResponse<T>>;
|
|
150
|
+
}
|
|
151
|
+
export type PluginMediaProviderArtifactSource = {
|
|
152
|
+
type: "remote-url";
|
|
153
|
+
url: string;
|
|
154
|
+
headers?: Record<string, string>;
|
|
155
|
+
} | {
|
|
156
|
+
type: "plugin-blob";
|
|
157
|
+
blobId: string;
|
|
158
|
+
} | {
|
|
159
|
+
type: "workspace-file";
|
|
160
|
+
path: string;
|
|
161
|
+
};
|
|
162
|
+
export interface PluginMediaProviderArtifact {
|
|
163
|
+
kind: PluginMediaOutputKind;
|
|
164
|
+
mimeType?: string;
|
|
165
|
+
name?: string;
|
|
166
|
+
width?: number;
|
|
167
|
+
height?: number;
|
|
168
|
+
durationSeconds?: number;
|
|
169
|
+
source: PluginMediaProviderArtifactSource;
|
|
170
|
+
}
|
|
171
|
+
export interface PluginMediaProviderJob {
|
|
172
|
+
id: string;
|
|
173
|
+
status: PluginMediaJob["status"];
|
|
174
|
+
progress?: number;
|
|
175
|
+
artifacts?: readonly PluginMediaProviderArtifact[];
|
|
176
|
+
error?: PluginMediaFailure;
|
|
177
|
+
}
|
|
178
|
+
export interface PluginMediaProviderRegistration {
|
|
179
|
+
id: string;
|
|
180
|
+
displayName?: string;
|
|
181
|
+
capabilities: readonly PluginMediaCapability[];
|
|
182
|
+
submit(request: PluginMediaProviderSubmitRequest, context: PluginMediaProviderHandlerContext): Promise<PluginMediaProviderJob>;
|
|
183
|
+
getJob?(jobId: string, context: PluginMediaProviderHandlerContext): Promise<PluginMediaProviderJob>;
|
|
184
|
+
cancelJob?(jobId: string, context: PluginMediaProviderHandlerContext): Promise<PluginMediaProviderJob>;
|
|
185
|
+
}
|
|
186
|
+
export interface PluginMediaApi {
|
|
187
|
+
registerProvider(registration: PluginMediaProviderRegistration): Disposable;
|
|
188
|
+
listProviders(): Promise<readonly PluginMediaProviderDescriptor[]>;
|
|
189
|
+
onProvidersChanged(listener: () => void): Disposable;
|
|
190
|
+
submit(request: PluginMediaSubmitRequest): Promise<PluginMediaJob>;
|
|
191
|
+
}
|
|
192
|
+
export {};
|
|
193
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PluginArtifactRef } from \"./artifacts.js\";\nimport type { Disposable } from \"./disposable.js\";\nimport type { PluginJob, PluginJobFailure } from \"./jobs.js\";\n\nexport type PluginMediaKind = \"image\" | \"video\" | \"audio\" | \"document\";\nexport type PluginMediaOutputKind = \"image\" | \"video\" | \"audio\";\nexport type PluginMediaOperation = \"generate\" | \"compose\" | \"transcode\";\n\nexport type PluginMediaGenerationMode =\n\t| \"text-to-image\"\n\t| \"image-to-image\"\n\t| \"text-to-video\"\n\t| \"image-to-video\"\n\t| \"video-to-video\"\n\t| \"reference-to-video\";\n\nexport type PluginMediaErrorCode =\n\t| \"unauthenticated\"\n\t| \"provider-unavailable\"\n\t| \"operation-unsupported\"\n\t| \"invalid-request\"\n\t| \"not-entitled\"\n\t| \"quota-exhausted\"\n\t| \"content-rejected\"\n\t| \"provider-timeout\"\n\t| \"provider-failed\"\n\t| \"cancelled\";\n\nexport interface PluginMediaFailure extends PluginJobFailure {\n\tcode: PluginMediaErrorCode;\n}\n\nexport class PluginMediaError extends Error {\n\treadonly code: PluginMediaErrorCode;\n\treadonly retryable: boolean;\n\n\tconstructor(failure: PluginMediaFailure) {\n\t\tsuper(failure.message);\n\t\tthis.name = \"PluginMediaError\";\n\t\tthis.code = failure.code;\n\t\tthis.retryable = failure.retryable;\n\t}\n}\n\nexport interface PluginMediaDimensions {\n\twidth: number;\n\theight: number;\n}\n\nexport type PluginMediaInputSource =\n\t| { type: \"plugin-blob\"; blobId: string }\n\t| { type: \"workspace-file\"; path: string };\n\nexport interface PluginMediaInput {\n\tid?: string;\n\trole?: string;\n\tkind: PluginMediaKind;\n\tmimeType?: string;\n\tsource: PluginMediaInputSource;\n}\n\nexport interface PluginMediaOutput {\n\tkind: PluginMediaOutputKind;\n\tmimeType: string;\n\tdimensions?: PluginMediaDimensions;\n\tfps?: number;\n\tdurationSeconds?: number;\n\tvideoCodec?: string;\n\taudioCodec?: string;\n}\n\nexport interface PluginMediaArtifact extends PluginArtifactRef {\n\tkind: PluginMediaOutputKind;\n\twidth?: number;\n\theight?: number;\n\tdurationSeconds?: number;\n}\n\nexport interface PluginMediaGenerateRequest {\n\toperation: \"generate\";\n\tproviderId: string;\n\tkind: \"image\" | \"video\";\n\tmode: PluginMediaGenerationMode;\n\tprompt: string;\n\tmodelId?: string;\n\tdimensions?: PluginMediaDimensions;\n\taspectRatio?: string;\n\tresolution?: string;\n\tdurationSeconds?: number;\n\tinputs?: readonly PluginMediaInput[];\n}\n\nexport interface PluginMediaComposeRequest {\n\toperation: \"compose\";\n\tproviderId: string;\n\tinputs: readonly PluginMediaInput[];\n\toutput: PluginMediaOutput;\n}\n\nexport interface PluginMediaTranscodeRequest {\n\toperation: \"transcode\";\n\tproviderId: string;\n\tinputs: readonly PluginMediaInput[];\n\toutput: PluginMediaOutput;\n}\n\nexport type PluginMediaSubmitRequest =\n\t| PluginMediaGenerateRequest\n\t| PluginMediaComposeRequest\n\t| PluginMediaTranscodeRequest;\n\nexport interface PluginMediaGenerationInputSlot {\n\trole: string;\n\tkinds: readonly PluginMediaKind[];\n\tminItems: number;\n\tmaxItems: number;\n}\n\nexport interface PluginMediaGenerationModeCapability {\n\tmode: PluginMediaGenerationMode;\n\tinputs: readonly PluginMediaGenerationInputSlot[];\n\tminTotalItems?: number;\n\tmaxTotalItems?: number;\n\taspectRatioPolicy?: \"configurable\" | \"input-derived\";\n\taudioGeneration?: \"none\" | \"always\" | \"optional\";\n}\n\nexport type PluginMediaCapability =\n\t| {\n\t\t\toperation: \"generate\";\n\t\t\tkind: \"image\" | \"video\";\n\t\t\tmodes: readonly PluginMediaGenerationMode[];\n\t\t\taspectRatios?: readonly string[];\n\t\t\t/** Provider-defined stable option ids; consumers must not infer pixel dimensions from their names. */\n\t\t\tresolutions?: readonly string[];\n\t\t\t/** Preferred option when the consumer has no supported persisted resolution. */\n\t\t\tdefaultResolution?: string;\n\t\t\tdurationsSeconds?: readonly number[];\n\t\t\tmodeCapabilities?: readonly PluginMediaGenerationModeCapability[];\n\t }\n\t| {\n\t\t\toperation: \"compose\";\n\t\t\tdocumentMimeTypes: readonly string[];\n\t\t\toutputMimeTypes: readonly string[];\n\t }\n\t| {\n\t\t\toperation: \"transcode\";\n\t\t\tinputMimeTypes: readonly string[];\n\t\t\toutputMimeTypes: readonly string[];\n\t };\n\nexport interface PluginMediaProviderDescriptor {\n\t/** Host-qualified provider id. */\n\tid: string;\n\tdisplayName?: string;\n\townerId: string;\n\tprotocolVersion: number;\n\tcapabilities: readonly PluginMediaCapability[];\n}\n\nexport type PluginMediaJob = Omit<PluginJob<PluginMediaArtifact>, \"error\"> & {\n\terror?: PluginMediaFailure;\n};\n\n/** A media input exposed to its provider without revealing its storage location. */\nexport interface PluginMediaProviderInput {\n\tid: string;\n\trole?: string;\n\tkind: PluginMediaKind;\n\tmimeType?: string;\n}\n\ntype ProviderRequest<Request extends PluginMediaSubmitRequest> = Omit<Request, \"providerId\" | \"inputs\"> & {\n\treadonly inputs: readonly PluginMediaProviderInput[];\n};\n\nexport type PluginMediaProviderSubmitRequest =\n\tPluginMediaSubmitRequest extends infer Request\n\t\t? Request extends PluginMediaSubmitRequest\n\t\t\t? ProviderRequest<Request>\n\t\t\t: never\n\t\t: never;\n\nexport interface PluginMediaInputUploadRequest {\n\turl: string;\n\tfieldName: string;\n\tfileName?: string;\n\tfields?: Record<string, string>;\n\theaders?: Record<string, string>;\n\ttimeoutMs?: number;\n}\n\nexport interface PluginMediaTransferResponse<T = unknown> {\n\tok: boolean;\n\tstatus: number;\n\tstatusText: string;\n\theaders: Record<string, string>;\n\tbody: T;\n}\n\nexport interface PluginMediaProviderHandlerContext {\n\treadonly invocationId: string;\n\tuploadInput<T = unknown>(\n\t\tinputId: string,\n\t\trequest: PluginMediaInputUploadRequest,\n\t): Promise<PluginMediaTransferResponse<T>>;\n}\n\nexport type PluginMediaProviderArtifactSource =\n\t| { type: \"remote-url\"; url: string; headers?: Record<string, string> }\n\t| { type: \"plugin-blob\"; blobId: string }\n\t| { type: \"workspace-file\"; path: string };\n\nexport interface PluginMediaProviderArtifact {\n\tkind: PluginMediaOutputKind;\n\tmimeType?: string;\n\tname?: string;\n\twidth?: number;\n\theight?: number;\n\tdurationSeconds?: number;\n\tsource: PluginMediaProviderArtifactSource;\n}\n\nexport interface PluginMediaProviderJob {\n\tid: string;\n\tstatus: PluginMediaJob[\"status\"];\n\tprogress?: number;\n\tartifacts?: readonly PluginMediaProviderArtifact[];\n\terror?: PluginMediaFailure;\n}\n\nexport interface PluginMediaProviderRegistration {\n\tid: string;\n\tdisplayName?: string;\n\tcapabilities: readonly PluginMediaCapability[];\n\tsubmit(\n\t\trequest: PluginMediaProviderSubmitRequest,\n\t\tcontext: PluginMediaProviderHandlerContext,\n\t): Promise<PluginMediaProviderJob>;\n\tgetJob?(jobId: string, context: PluginMediaProviderHandlerContext): Promise<PluginMediaProviderJob>;\n\tcancelJob?(jobId: string, context: PluginMediaProviderHandlerContext): Promise<PluginMediaProviderJob>;\n}\n\nexport interface PluginMediaApi {\n\tregisterProvider(registration: PluginMediaProviderRegistration): Disposable;\n\tlistProviders(): Promise<readonly PluginMediaProviderDescriptor[]>;\n\tonProvidersChanged(listener: () => void): Disposable;\n\tsubmit(request: PluginMediaSubmitRequest): Promise<PluginMediaJob>;\n}\n"]}
|
package/dist/media.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class PluginMediaError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
retryable;
|
|
4
|
+
constructor(failure) {
|
|
5
|
+
super(failure.message);
|
|
6
|
+
this.name = "PluginMediaError";
|
|
7
|
+
this.code = failure.code;
|
|
8
|
+
this.retryable = failure.retryable;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=media.js.map
|