@microsoft/teamsfx-core 3.1.3 → 3.1.4-alpha.564122f4e1.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/build/common/templates-config.json +4 -4
- package/build/component/configManager/actionInjector.d.ts +4 -2
- package/build/component/configManager/actionInjector.d.ts.map +1 -1
- package/build/component/configManager/actionInjector.js +50 -3
- package/build/component/configManager/actionInjector.js.map +1 -1
- package/build/component/driver/teamsApp/utils/utils.d.ts.map +1 -1
- package/build/component/driver/teamsApp/utils/utils.js +1 -18
- package/build/component/driver/teamsApp/utils/utils.js.map +1 -1
- package/build/component/generator/openApiSpec/helper.d.ts +1 -1
- package/build/component/generator/openApiSpec/helper.d.ts.map +1 -1
- package/build/component/generator/openApiSpec/helper.js +23 -3
- package/build/component/generator/openApiSpec/helper.js.map +1 -1
- package/build/component/generator/openPlugin/authResolver.d.ts +2 -2
- package/build/component/generator/openPlugin/authResolver.d.ts.map +1 -1
- package/build/component/generator/openPlugin/authResolver.js +17 -7
- package/build/component/generator/openPlugin/authResolver.js.map +1 -1
- package/build/component/generator/openPlugin/errors.d.ts +4 -0
- package/build/component/generator/openPlugin/errors.d.ts.map +1 -0
- package/build/component/generator/openPlugin/errors.js +13 -0
- package/build/component/generator/openPlugin/errors.js.map +1 -0
- package/build/component/generator/openPlugin/exporter.d.ts +9 -6
- package/build/component/generator/openPlugin/exporter.d.ts.map +1 -1
- package/build/component/generator/openPlugin/exporter.js +502 -53
- package/build/component/generator/openPlugin/exporter.js.map +1 -1
- package/build/component/generator/openPlugin/fileSystem.d.ts +28 -0
- package/build/component/generator/openPlugin/fileSystem.d.ts.map +1 -0
- package/build/component/generator/openPlugin/fileSystem.js +181 -0
- package/build/component/generator/openPlugin/fileSystem.js.map +1 -0
- package/build/component/generator/openPlugin/iconStrategy.d.ts.map +1 -1
- package/build/component/generator/openPlugin/iconStrategy.js +30 -14
- package/build/component/generator/openPlugin/iconStrategy.js.map +1 -1
- package/build/component/generator/openPlugin/importer.d.ts.map +1 -1
- package/build/component/generator/openPlugin/importer.js +75 -12
- package/build/component/generator/openPlugin/importer.js.map +1 -1
- package/build/component/generator/openPlugin/mapper.d.ts +3 -2
- package/build/component/generator/openPlugin/mapper.d.ts.map +1 -1
- package/build/component/generator/openPlugin/mapper.js +188 -29
- package/build/component/generator/openPlugin/mapper.js.map +1 -1
- package/build/component/generator/openPlugin/parser.d.ts.map +1 -1
- package/build/component/generator/openPlugin/parser.js +264 -70
- package/build/component/generator/openPlugin/parser.js.map +1 -1
- package/build/component/generator/openPlugin/skillValidation.d.ts +2 -0
- package/build/component/generator/openPlugin/skillValidation.d.ts.map +1 -0
- package/build/component/generator/openPlugin/skillValidation.js +63 -0
- package/build/component/generator/openPlugin/skillValidation.js.map +1 -0
- package/build/component/generator/openPlugin/spec.d.ts +67 -0
- package/build/component/generator/openPlugin/spec.d.ts.map +1 -0
- package/build/component/generator/openPlugin/spec.js +157 -0
- package/build/component/generator/openPlugin/spec.js.map +1 -0
- package/build/component/generator/openPlugin/textUtils.d.ts +1 -1
- package/build/component/generator/openPlugin/textUtils.d.ts.map +1 -1
- package/build/component/generator/openPlugin/textUtils.js +8 -7
- package/build/component/generator/openPlugin/textUtils.js.map +1 -1
- package/build/component/generator/openPlugin/types.d.ts +76 -14
- package/build/component/generator/openPlugin/types.d.ts.map +1 -1
- package/build/component/generator/openPlugin/validation.d.ts +17 -0
- package/build/component/generator/openPlugin/validation.d.ts.map +1 -0
- package/build/component/generator/openPlugin/validation.js +563 -0
- package/build/component/generator/openPlugin/validation.js.map +1 -0
- package/build/component/utils/common.d.ts +1 -9
- package/build/component/utils/common.d.ts.map +1 -1
- package/build/component/utils/common.js +7 -37
- package/build/component/utils/common.js.map +1 -1
- package/build/component/utils/envFunctionUtils.d.ts +3 -8
- package/build/component/utils/envFunctionUtils.d.ts.map +1 -1
- package/build/component/utils/envFunctionUtils.js +46 -131
- package/build/component/utils/envFunctionUtils.js.map +1 -1
- package/build/component/utils/mcpAuthScaffolder.d.ts +5 -0
- package/build/component/utils/mcpAuthScaffolder.d.ts.map +1 -1
- package/build/component/utils/mcpAuthScaffolder.js +14 -2
- package/build/component/utils/mcpAuthScaffolder.js.map +1 -1
- package/build/core/FxCore.d.ts +1 -1
- package/build/core/FxCore.d.ts.map +1 -1
- package/build/core/FxCore.declarativeAgent.d.ts +2 -1
- package/build/core/FxCore.declarativeAgent.d.ts.map +1 -1
- package/build/core/FxCore.declarativeAgent.js +17 -6
- package/build/core/FxCore.declarativeAgent.js.map +1 -1
- package/build/core/FxCore.js +3 -3
- package/build/core/FxCore.js.map +1 -1
- package/build/core/FxCore.openPlugin.d.ts +7 -6
- package/build/core/FxCore.openPlugin.d.ts.map +1 -1
- package/build/core/FxCore.openPlugin.js +7 -6
- package/build/core/FxCore.openPlugin.js.map +1 -1
- package/build/question/inputs/AddAuthActionInputs.d.ts +2 -0
- package/build/question/inputs/AddAuthActionInputs.d.ts.map +1 -1
- package/build/question/inputs/AddPluginInputs.d.ts +5 -1
- package/build/question/inputs/AddPluginInputs.d.ts.map +1 -1
- package/build/question/options/AddAuthActionOptions.d.ts.map +1 -1
- package/build/question/options/AddAuthActionOptions.js +7 -0
- package/build/question/options/AddAuthActionOptions.js.map +1 -1
- package/build/question/options/AddPluginOptions.d.ts.map +1 -1
- package/build/question/options/AddPluginOptions.js +14 -1
- package/build/question/options/AddPluginOptions.js.map +1 -1
- package/build/question/options/ExportOpenPluginOptions.js +2 -2
- package/build/question/options/ExportOpenPluginOptions.js.map +1 -1
- package/build/question/options/ImportOpenPluginOptions.js +4 -4
- package/build/question/options/ImportOpenPluginOptions.js.map +1 -1
- package/build/question/other.d.ts +1 -0
- package/build/question/other.d.ts.map +1 -1
- package/build/question/other.js +49 -9
- package/build/question/other.js.map +1 -1
- package/build/question/questionNames.d.ts +1 -0
- package/build/question/questionNames.d.ts.map +1 -1
- package/build/question/questionNames.js +1 -0
- package/build/question/questionNames.js.map +1 -1
- package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts +2 -0
- package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts.map +1 -1
- package/build/question/scaffold/vsc/teamsProjectTypeNode.js +24 -1
- package/build/question/scaffold/vsc/teamsProjectTypeNode.js.map +1 -1
- package/build/v4/mcp/mcpAuthAction.d.ts +2 -1
- package/build/v4/mcp/mcpAuthAction.d.ts.map +1 -1
- package/build/v4/mcp/mcpAuthAction.js +32 -5
- package/build/v4/mcp/mcpAuthAction.js.map +1 -1
- package/build/v4/mcp/mcpAuthScaffold.d.ts +3 -0
- package/build/v4/mcp/mcpAuthScaffold.d.ts.map +1 -1
- package/build/v4/mcp/mcpAuthScaffold.js +57 -30
- package/build/v4/mcp/mcpAuthScaffold.js.map +1 -1
- package/build/v4/runtime/steps/mcpAuth.d.ts.map +1 -1
- package/build/v4/runtime/steps/mcpAuth.js +13 -0
- package/build/v4/runtime/steps/mcpAuth.js.map +1 -1
- package/package.json +37 -37
- package/resource/package.nls.json +20 -0
- package/templates/configs/local/typescript/.gitignore +1 -0
- package/templates/configs/playground/typescript/.gitignore +4 -0
- package/templates/fallback/common.zip +0 -0
- package/templates/fallback/csharp.zip +0 -0
- package/templates/fallback/js.zip +0 -0
- package/templates/fallback/python.zip +0 -0
- package/templates/fallback/ts.zip +0 -0
- package/templates/metadata.zip +0 -0
- package/templates/v4/floor.json +1 -1
- package/templates/v4/templates-metadata.zip +0 -0
- package/templates/v4/templates.zip +0 -0
|
@@ -6,12 +6,19 @@ exports.readOpenPluginDir = readOpenPluginDir;
|
|
|
6
6
|
const tslib_1 = require("tslib");
|
|
7
7
|
const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
|
|
8
8
|
const path = tslib_1.__importStar(require("path"));
|
|
9
|
+
const errors_1 = require("./errors");
|
|
10
|
+
const fileSystem_1 = require("./fileSystem");
|
|
11
|
+
const skillValidation_1 = require("./skillValidation");
|
|
12
|
+
const spec_1 = require("./spec");
|
|
13
|
+
const validation_1 = require("./validation");
|
|
14
|
+
/**
|
|
15
|
+
* Agent Plugins 1.0.0 mandates plugin.json in the plugin root. The pre-1.0.0
|
|
16
|
+
* locations are probed afterwards so older directories keep importing.
|
|
17
|
+
*/
|
|
9
18
|
const MANIFEST_LOCATIONS = [
|
|
10
|
-
{ relPath:
|
|
11
|
-
{
|
|
12
|
-
{ relPath: ".cursor-plugin/plugin.json", kind: "cursor-plugin" },
|
|
19
|
+
{ relPath: spec_1.PLUGIN_MANIFEST_FILE, kind: "agent-plugin", legacy: false },
|
|
20
|
+
...spec_1.LEGACY_MANIFEST_LOCATIONS.map((l) => ({ ...l, legacy: true })),
|
|
13
21
|
];
|
|
14
|
-
const SKILL_NAME_RE = /^[a-z0-9][a-z0-9-_]*$/;
|
|
15
22
|
const UNMAPPED_FIELDS = [
|
|
16
23
|
"agents",
|
|
17
24
|
"hooks",
|
|
@@ -26,112 +33,230 @@ function requireStringPathOverride(value, field) {
|
|
|
26
33
|
if (typeof value === "string") {
|
|
27
34
|
return value;
|
|
28
35
|
}
|
|
29
|
-
throw new
|
|
36
|
+
throw new errors_1.OpenPluginInputError(`Plugin manifest '${field}' override is set to a non-string value. Only the single-string form ` +
|
|
30
37
|
`(e.g. \"${field}\": \"./custom/path\") is supported by this converter today.`);
|
|
31
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve a component location. Agent Plugins 1.0.0 fixes component paths, so
|
|
41
|
+
* manifest overrides are ignored (with a warning) for 1.0.0 layouts. Either
|
|
42
|
+
* way the result must stay inside the plugin root.
|
|
43
|
+
*/
|
|
44
|
+
function resolveComponentPath(absRoot, override, fixedRel, field, isLegacyLayout, warnings) {
|
|
45
|
+
let rel = fixedRel;
|
|
46
|
+
if (override !== undefined) {
|
|
47
|
+
if (isLegacyLayout) {
|
|
48
|
+
rel = override;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
warnings.push(`plugin.json '${field}' relocates a component, which Agent Plugins 1.0.0 no longer permits. ` +
|
|
52
|
+
`Using the fixed location '${fixedRel}' instead.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const resolved = (0, spec_1.resolveWithinRoot)(absRoot, rel);
|
|
56
|
+
if (!resolved) {
|
|
57
|
+
warnings.push(`'${field}' path '${rel}' resolves outside the plugin root and was rejected for safety.`);
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
return resolved;
|
|
61
|
+
}
|
|
32
62
|
async function readOpenPluginDir(root) {
|
|
33
63
|
const warnings = [];
|
|
34
|
-
const absRoot =
|
|
35
|
-
|
|
36
|
-
throw new Error(`Plugin directory not found: ${absRoot}`);
|
|
37
|
-
}
|
|
38
|
-
// 1. Probe manifest locations.
|
|
64
|
+
const absRoot = await (0, fileSystem_1.resolvePluginRoot)(root);
|
|
65
|
+
// 1. Probe manifest locations: spec location first, then pre-1.0.0 layouts.
|
|
39
66
|
let manifestPath;
|
|
40
67
|
let manifestKind;
|
|
68
|
+
let isLegacyLayout = false;
|
|
41
69
|
for (const loc of MANIFEST_LOCATIONS) {
|
|
42
|
-
const
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
70
|
+
const inspected = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, loc.relPath, "file");
|
|
71
|
+
if (inspected.status === "missing")
|
|
72
|
+
continue;
|
|
73
|
+
if (inspected.status === "outside") {
|
|
74
|
+
throw new errors_1.OpenPluginInputError(`Plugin manifest '${loc.relPath}' resolves outside the plugin root.`);
|
|
75
|
+
}
|
|
76
|
+
if (inspected.status === "wrong-kind") {
|
|
77
|
+
throw new errors_1.OpenPluginInputError(`Plugin manifest '${loc.relPath}' must be a regular file.`);
|
|
47
78
|
}
|
|
79
|
+
manifestPath = inspected.path;
|
|
80
|
+
manifestKind = loc.kind;
|
|
81
|
+
isLegacyLayout = loc.legacy;
|
|
82
|
+
break;
|
|
48
83
|
}
|
|
49
84
|
if (!manifestPath || !manifestKind) {
|
|
50
|
-
throw new
|
|
51
|
-
|
|
85
|
+
throw new errors_1.OpenPluginInputError(`No plugin manifest found in ${absRoot}. Agent Plugins 1.0.0 requires '${spec_1.PLUGIN_MANIFEST_FILE}' ` +
|
|
86
|
+
`in the plugin root. Also looked for: ` +
|
|
87
|
+
spec_1.LEGACY_MANIFEST_LOCATIONS.map((l) => l.relPath).join(", "));
|
|
88
|
+
}
|
|
89
|
+
if (isLegacyLayout) {
|
|
90
|
+
warnings.push(`Manifest found at '${path.relative(absRoot, manifestPath)}'. Agent Plugins 1.0.0 requires ` +
|
|
91
|
+
`'${spec_1.PLUGIN_MANIFEST_FILE}' in the plugin root; this location is deprecated. ` +
|
|
92
|
+
`Run 'atk export agentplugin' to emit a 1.0.0-compliant directory.`);
|
|
52
93
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
94
|
+
let manifestJson;
|
|
95
|
+
try {
|
|
96
|
+
manifestJson = await fs_extra_1.default.readJSON(manifestPath);
|
|
56
97
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (!(error instanceof SyntaxError))
|
|
100
|
+
throw error;
|
|
101
|
+
throw new errors_1.OpenPluginInputError("plugin.json contains invalid JSON.");
|
|
102
|
+
}
|
|
103
|
+
const parsedManifest = isLegacyLayout
|
|
104
|
+
? { manifest: (0, validation_1.parseLegacyOpenPluginManifest)(manifestJson), warnings: [] }
|
|
105
|
+
: (0, validation_1.parseAgentPluginManifest)(manifestJson);
|
|
106
|
+
const manifest = parsedManifest.manifest;
|
|
107
|
+
warnings.push(...parsedManifest.warnings);
|
|
108
|
+
// 2. MCP servers. 1.0.0 uses mcp.json; pre-1.0.0 used .mcp.json.
|
|
109
|
+
const mcpOverride = isLegacyLayout
|
|
110
|
+
? requireStringPathOverride(manifest.mcpServers, "mcpServers")
|
|
111
|
+
: undefined;
|
|
60
112
|
const mcpServers = {};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
113
|
+
const invalidRemoteMcpServers = [];
|
|
114
|
+
const requestedMcp = mcpOverride
|
|
115
|
+
? resolveComponentPath(absRoot, mcpOverride, spec_1.MCP_CONFIG_FILE, "mcpServers", isLegacyLayout, warnings)
|
|
116
|
+
: (0, spec_1.resolveWithinRoot)(absRoot, spec_1.MCP_CONFIG_FILE);
|
|
117
|
+
let inspectedMcp = requestedMcp
|
|
118
|
+
? await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, requestedMcp), "file")
|
|
119
|
+
: undefined;
|
|
120
|
+
if (isLegacyLayout && inspectedMcp?.status === "missing") {
|
|
121
|
+
const legacyMcp = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, spec_1.LEGACY_MCP_CONFIG_FILE, "file");
|
|
122
|
+
if (legacyMcp.status === "ok") {
|
|
123
|
+
warnings.push(`Found '${spec_1.LEGACY_MCP_CONFIG_FILE}'. Agent Plugins 1.0.0 renamed this to '${spec_1.MCP_CONFIG_FILE}'; ` +
|
|
124
|
+
`the dotted name is deprecated.`);
|
|
125
|
+
inspectedMcp = legacyMcp;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (inspectedMcp?.status === "outside") {
|
|
129
|
+
warnings.push(`'mcp.json' resolves outside the plugin root and was rejected for safety.`);
|
|
130
|
+
}
|
|
131
|
+
else if (inspectedMcp?.status === "wrong-kind") {
|
|
132
|
+
warnings.push(`'mcp.json' must be a regular file; MCP was disabled for this plugin.`);
|
|
133
|
+
}
|
|
134
|
+
else if (inspectedMcp?.status === "ok") {
|
|
135
|
+
let mcpJson;
|
|
136
|
+
try {
|
|
137
|
+
mcpJson = await fs_extra_1.default.readJSON(inspectedMcp.path);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (!(error instanceof SyntaxError))
|
|
141
|
+
throw error;
|
|
142
|
+
warnings.push(`mcp.json is invalid JSON; MCP was disabled for this plugin.`);
|
|
143
|
+
}
|
|
144
|
+
if (mcpJson === undefined) {
|
|
145
|
+
// A malformed document is isolated above; filesystem failures still propagate.
|
|
146
|
+
}
|
|
147
|
+
else if (isLegacyLayout) {
|
|
148
|
+
readLegacyMcpServers(mcpJson, mcpServers, invalidRemoteMcpServers, warnings);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const parsedMcp = (0, validation_1.parseAgentPluginMcpJson)(mcpJson);
|
|
152
|
+
for (const [name, server] of Object.entries(parsedMcp.mcpServers)) {
|
|
153
|
+
(0, spec_1.setRecordValue)(mcpServers, name, server);
|
|
74
154
|
}
|
|
155
|
+
invalidRemoteMcpServers.push(...parsedMcp.invalidRemoteMcpServers);
|
|
156
|
+
warnings.push(...parsedMcp.warnings);
|
|
75
157
|
}
|
|
76
158
|
}
|
|
159
|
+
removeMcpServersWithFixedHeaders(mcpServers, warnings);
|
|
77
160
|
// 3. Skills.
|
|
78
|
-
const
|
|
79
|
-
const skillsAbs = path.resolve(absRoot, skillsRel);
|
|
161
|
+
const skillsAbs = resolveComponentPath(absRoot, isLegacyLayout ? requireStringPathOverride(manifest.skills, "skills") : undefined, "skills", "skills", isLegacyLayout, warnings);
|
|
80
162
|
const skills = [];
|
|
81
163
|
let skillsRoot;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
164
|
+
const inspectedSkills = skillsAbs
|
|
165
|
+
? await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, skillsAbs), "directory")
|
|
166
|
+
: undefined;
|
|
167
|
+
if (inspectedSkills?.status === "outside") {
|
|
168
|
+
warnings.push(`'skills' path resolves outside the plugin root and was rejected for safety.`);
|
|
169
|
+
}
|
|
170
|
+
else if (inspectedSkills?.status === "wrong-kind") {
|
|
171
|
+
warnings.push(`'skills' must resolve to a directory; this component type was ignored.`);
|
|
172
|
+
}
|
|
173
|
+
else if (inspectedSkills?.status === "ok") {
|
|
174
|
+
skillsRoot = inspectedSkills.path;
|
|
175
|
+
const entries = await fs_extra_1.default.readdir(inspectedSkills.path, { withFileTypes: true });
|
|
85
176
|
for (const entry of entries) {
|
|
86
|
-
|
|
177
|
+
const skillDirectory = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, path.join(inspectedSkills.path, entry.name)), "directory");
|
|
178
|
+
if (skillDirectory.status === "outside") {
|
|
179
|
+
warnings.push(`Skipping skill folder '${entry.name}': it resolves outside the plugin root.`);
|
|
87
180
|
continue;
|
|
88
181
|
}
|
|
89
|
-
if (
|
|
90
|
-
|
|
182
|
+
if (skillDirectory.status !== "ok")
|
|
183
|
+
continue;
|
|
184
|
+
const skillMd = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, path.join(skillDirectory.path, "SKILL.md")), "file");
|
|
185
|
+
if (skillMd.status === "outside") {
|
|
186
|
+
warnings.push(`Skipping skill '${entry.name}': SKILL.md resolves outside the plugin root.`);
|
|
91
187
|
continue;
|
|
92
188
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
189
|
+
if (skillMd.status !== "ok")
|
|
190
|
+
continue;
|
|
191
|
+
const validationError = await (0, skillValidation_1.getAgentSkillValidationError)(entry.name, skillMd.path);
|
|
192
|
+
if (validationError) {
|
|
193
|
+
warnings.push(`Skipping skill '${entry.name}': ${validationError}.`);
|
|
194
|
+
continue;
|
|
96
195
|
}
|
|
196
|
+
skills.push(entry.name);
|
|
97
197
|
}
|
|
98
198
|
skills.sort();
|
|
99
199
|
}
|
|
100
|
-
// 4. Commands.
|
|
101
|
-
|
|
102
|
-
const commandsAbs =
|
|
200
|
+
// 4. Commands. Not an Agent Plugins 1.0.0 component; still copied through so
|
|
201
|
+
// pre-1.0.0 directories round-trip.
|
|
202
|
+
const commandsAbs = resolveComponentPath(absRoot, isLegacyLayout ? requireStringPathOverride(manifest.commands, "commands") : undefined, "commands", "commands", isLegacyLayout, warnings);
|
|
103
203
|
const commands = [];
|
|
104
204
|
let commandsRoot;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
205
|
+
const inspectedCommands = commandsAbs
|
|
206
|
+
? await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, commandsAbs), "directory")
|
|
207
|
+
: undefined;
|
|
208
|
+
if (inspectedCommands?.status === "outside") {
|
|
209
|
+
warnings.push(`'commands' path resolves outside the plugin root and was rejected for safety.`);
|
|
210
|
+
}
|
|
211
|
+
else if (inspectedCommands?.status === "wrong-kind") {
|
|
212
|
+
warnings.push(`'commands' must resolve to a directory and was ignored.`);
|
|
213
|
+
}
|
|
214
|
+
else if (inspectedCommands?.status === "ok") {
|
|
215
|
+
commandsRoot = inspectedCommands.path;
|
|
216
|
+
const entries = await fs_extra_1.default.readdir(inspectedCommands.path, { withFileTypes: true });
|
|
108
217
|
for (const entry of entries) {
|
|
109
|
-
if (entry.
|
|
218
|
+
if (!entry.name.toLowerCase().endsWith(".md"))
|
|
219
|
+
continue;
|
|
220
|
+
if (entry.isSymbolicLink()) {
|
|
221
|
+
warnings.push(`Skipping command '${entry.name}': symbolic links are not permitted.`);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (!entry.isFile())
|
|
225
|
+
continue;
|
|
226
|
+
const command = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, path.join(inspectedCommands.path, entry.name)), "file");
|
|
227
|
+
if (command.status === "outside") {
|
|
228
|
+
warnings.push(`Skipping command '${entry.name}': it resolves outside the plugin root.`);
|
|
229
|
+
}
|
|
230
|
+
else if (command.status === "ok") {
|
|
110
231
|
commands.push(entry.name);
|
|
111
232
|
}
|
|
112
233
|
}
|
|
113
234
|
commands.sort();
|
|
114
235
|
}
|
|
115
|
-
// 5. Unmapped
|
|
116
|
-
// dropped them. We do not throw — the spec says
|
|
117
|
-
//
|
|
118
|
-
const manifestRecord = manifest;
|
|
236
|
+
// 5. Unmapped component fields → emit a warning so the caller knows we
|
|
237
|
+
// dropped them. We do not throw — the spec says clients report and ignore
|
|
238
|
+
// unknown members rather than rejecting an otherwise valid plugin.
|
|
119
239
|
for (const field of UNMAPPED_FIELDS) {
|
|
120
|
-
if (
|
|
121
|
-
warnings.push(`
|
|
240
|
+
if (manifest[field] !== undefined) {
|
|
241
|
+
warnings.push(`'${field}' field is present but not supported by MOS3 today; dropped.`);
|
|
122
242
|
}
|
|
123
243
|
}
|
|
124
244
|
// 6. Icons.
|
|
125
|
-
const hasColorPng = await
|
|
126
|
-
const hasOutlinePng = await
|
|
127
|
-
// 7. Round-trip extension block (written by `atk export
|
|
128
|
-
const atkExtension = readAtkExtensionBlock(manifest);
|
|
245
|
+
const hasColorPng = (await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, "color.png", "file")).status === "ok";
|
|
246
|
+
const hasOutlinePng = (await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, "outline.png", "file")).status === "ok";
|
|
247
|
+
// 7. Round-trip extension block (written by `atk export agentplugin`).
|
|
248
|
+
const atkExtension = readAtkExtensionBlock(manifest, warnings);
|
|
249
|
+
if (atkExtension) {
|
|
250
|
+
await validateAtkExtensionFiles(absRoot, atkExtension, warnings);
|
|
251
|
+
}
|
|
129
252
|
return {
|
|
130
253
|
pluginRoot: absRoot,
|
|
131
254
|
manifest,
|
|
132
255
|
manifestPath,
|
|
133
256
|
manifestKind,
|
|
257
|
+
isLegacyLayout,
|
|
134
258
|
mcpServers,
|
|
259
|
+
invalidRemoteMcpServers,
|
|
135
260
|
skills,
|
|
136
261
|
skillsRoot,
|
|
137
262
|
commands,
|
|
@@ -142,12 +267,81 @@ async function readOpenPluginDir(root) {
|
|
|
142
267
|
atkExtension,
|
|
143
268
|
};
|
|
144
269
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
270
|
+
async function validateAtkExtensionFiles(pluginRoot, extension, warnings) {
|
|
271
|
+
for (const [serverName, connector] of Object.entries(extension.agentConnectors ?? {})) {
|
|
272
|
+
const description = connector.mcpToolDescription;
|
|
273
|
+
if (!description)
|
|
274
|
+
continue;
|
|
275
|
+
if (description.file === undefined) {
|
|
276
|
+
delete description.source;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
const normalizedFile = (0, spec_1.normalizePortableRelativePath)(description.file);
|
|
280
|
+
const normalizedSource = description.source
|
|
281
|
+
? (0, spec_1.normalizePortableRelativePath)(description.source)
|
|
282
|
+
: undefined;
|
|
283
|
+
const destination = normalizedFile ? (0, spec_1.resolveWithinRoot)(pluginRoot, normalizedFile) : undefined;
|
|
284
|
+
const source = normalizedSource !== undefined
|
|
285
|
+
? await (0, fileSystem_1.readFileWithinRoot)(pluginRoot, normalizedSource)
|
|
286
|
+
: undefined;
|
|
287
|
+
if (!destination || source?.status !== "ok") {
|
|
288
|
+
delete connector.mcpToolDescription;
|
|
289
|
+
warnings.push(`Toolkit extension connector '${serverName}' has an unsafe or missing MCP tool-description file and it was ignored.`);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
description.file = normalizedFile;
|
|
293
|
+
description.source = normalizedSource;
|
|
294
|
+
description.contents = source.contents;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Read the toolkit round-trip block. Agent Plugins 1.0.0 places it at
|
|
300
|
+
* `extensions["com.microsoft.agents-toolkit"]`; pre-1.0.0 exports wrote it to a
|
|
301
|
+
* top-level `x-microsoft-365-agents-toolkit` key, which is still honoured.
|
|
302
|
+
*/
|
|
303
|
+
function readAtkExtensionBlock(manifest, warnings) {
|
|
304
|
+
const namespaced = manifest.extensions?.[spec_1.ATK_EXTENSION_NAMESPACE];
|
|
305
|
+
if (namespaced !== undefined)
|
|
306
|
+
return (0, validation_1.parseAtkExtension)(namespaced, warnings);
|
|
307
|
+
const legacy = manifest.legacyAtkExtension;
|
|
308
|
+
if (legacy !== undefined) {
|
|
309
|
+
warnings.push(`Found the toolkit block at top-level '${spec_1.LEGACY_ATK_EXTENSION_KEY}'. Agent Plugins 1.0.0 ` +
|
|
310
|
+
`requires client data under 'extensions["${spec_1.ATK_EXTENSION_NAMESPACE}"]'; the top-level key ` +
|
|
311
|
+
`is deprecated and re-exporting will move it.`);
|
|
312
|
+
return (0, validation_1.parseAtkExtension)(legacy, warnings);
|
|
313
|
+
}
|
|
314
|
+
return undefined;
|
|
315
|
+
}
|
|
316
|
+
function readLegacyMcpServers(value, mcpServers, invalidRemoteMcpServers, warnings) {
|
|
317
|
+
if (!(0, validation_1.isRecord)(value))
|
|
318
|
+
return;
|
|
319
|
+
const source = (0, validation_1.isRecord)(value.mcpServers) ? value.mcpServers : value;
|
|
320
|
+
for (const [name, server] of Object.entries(source)) {
|
|
321
|
+
if (name === "$schema" || !(0, validation_1.isRecord)(server))
|
|
322
|
+
continue;
|
|
323
|
+
const entry = {};
|
|
324
|
+
for (const [field, fieldValue] of Object.entries(server)) {
|
|
325
|
+
(0, spec_1.setRecordValue)(entry, field, fieldValue);
|
|
326
|
+
}
|
|
327
|
+
if (entry.url !== undefined) {
|
|
328
|
+
const urlError = (0, validation_1.getRemoteMcpUrlError)(entry.url);
|
|
329
|
+
if (urlError) {
|
|
330
|
+
invalidRemoteMcpServers.push(name);
|
|
331
|
+
warnings.push(`MCP server '${name}' is invalid and was skipped: ${urlError}`);
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
(0, spec_1.setRecordValue)(mcpServers, name, entry);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function removeMcpServersWithFixedHeaders(mcpServers, warnings) {
|
|
339
|
+
for (const [name, server] of Object.entries(mcpServers)) {
|
|
340
|
+
if (server.headers !== undefined &&
|
|
341
|
+
(!(0, validation_1.isRecord)(server.headers) || Object.keys(server.headers).length > 0)) {
|
|
342
|
+
delete mcpServers[name];
|
|
343
|
+
warnings.push(`MCP server '${name}' declares fixed headers, which Teams agent connectors cannot represent, and was skipped.`);
|
|
344
|
+
}
|
|
150
345
|
}
|
|
151
|
-
return raw;
|
|
152
346
|
}
|
|
153
347
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillValidation.d.ts","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/skillValidation.ts"],"names":[],"mappings":"AAaA,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoD7B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT license.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.getAgentSkillValidationError = getAgentSkillValidationError;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
|
|
8
|
+
const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
|
|
9
|
+
const validation_1 = require("./validation");
|
|
10
|
+
const SKILL_FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;
|
|
11
|
+
const SKILL_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
12
|
+
const SKILL_NAME_MAX_LENGTH = 64;
|
|
13
|
+
const SKILL_DESCRIPTION_MAX_LENGTH = 1024;
|
|
14
|
+
const SKILL_COMPATIBILITY_MAX_LENGTH = 500;
|
|
15
|
+
async function getAgentSkillValidationError(skillName, skillMdPath) {
|
|
16
|
+
if (skillName.length > SKILL_NAME_MAX_LENGTH || !SKILL_NAME_RE.test(skillName)) {
|
|
17
|
+
return "folder name must contain only lowercase letters, numbers, and single hyphens";
|
|
18
|
+
}
|
|
19
|
+
const source = await fs_extra_1.default.readFile(skillMdPath, "utf8");
|
|
20
|
+
const match = SKILL_FRONTMATTER_RE.exec(source);
|
|
21
|
+
if (!match)
|
|
22
|
+
return "SKILL.md must begin with YAML frontmatter";
|
|
23
|
+
let frontmatter;
|
|
24
|
+
try {
|
|
25
|
+
frontmatter = js_yaml_1.default.load(match[1]);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
29
|
+
return `SKILL.md frontmatter is not valid YAML: ${detail}`;
|
|
30
|
+
}
|
|
31
|
+
if (!(0, validation_1.isRecord)(frontmatter))
|
|
32
|
+
return "SKILL.md frontmatter must be a YAML mapping";
|
|
33
|
+
if (frontmatter.name !== skillName) {
|
|
34
|
+
return `frontmatter name must exactly match the parent folder '${skillName}'`;
|
|
35
|
+
}
|
|
36
|
+
if (typeof frontmatter.description !== "string" ||
|
|
37
|
+
frontmatter.description.length < 1 ||
|
|
38
|
+
frontmatter.description.length > SKILL_DESCRIPTION_MAX_LENGTH) {
|
|
39
|
+
return `frontmatter description must contain 1-${SKILL_DESCRIPTION_MAX_LENGTH} characters`;
|
|
40
|
+
}
|
|
41
|
+
if (frontmatter.license !== undefined &&
|
|
42
|
+
(typeof frontmatter.license !== "string" || frontmatter.license.length < 1)) {
|
|
43
|
+
return "frontmatter license must be a non-empty string";
|
|
44
|
+
}
|
|
45
|
+
if (frontmatter.compatibility !== undefined &&
|
|
46
|
+
(typeof frontmatter.compatibility !== "string" ||
|
|
47
|
+
frontmatter.compatibility.length < 1 ||
|
|
48
|
+
frontmatter.compatibility.length > SKILL_COMPATIBILITY_MAX_LENGTH)) {
|
|
49
|
+
return `frontmatter compatibility must contain 1-${SKILL_COMPATIBILITY_MAX_LENGTH} characters`;
|
|
50
|
+
}
|
|
51
|
+
if (frontmatter.metadata !== undefined && !hasStringValues(frontmatter.metadata)) {
|
|
52
|
+
return "frontmatter metadata must map string keys to string values";
|
|
53
|
+
}
|
|
54
|
+
if (frontmatter["allowed-tools"] !== undefined &&
|
|
55
|
+
typeof frontmatter["allowed-tools"] !== "string") {
|
|
56
|
+
return "frontmatter allowed-tools must be a string";
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
function hasStringValues(value) {
|
|
61
|
+
return (0, validation_1.isRecord)(value) && Object.values(value).every((entry) => typeof entry === "string");
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=skillValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillValidation.js","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/skillValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants and helpers for the Agent Plugins specification v1.0.0
|
|
3
|
+
* (https://agent-plugins.org/).
|
|
4
|
+
*
|
|
5
|
+
* This specification was previously published as the "Open Plugin Spec" at
|
|
6
|
+
* https://open-plugins.com/, which now permanently redirects (308) to
|
|
7
|
+
* agent-plugins.org. Internal identifiers in this module keep the historical
|
|
8
|
+
* `openPlugin` naming; the user-facing CLI accepts both `openplugin` and
|
|
9
|
+
* `agentplugin`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const AGENT_PLUGINS_VERSION = "1.0.0";
|
|
12
|
+
/** Required `$schema` value in plugin.json. */
|
|
13
|
+
export declare const PLUGIN_SCHEMA_URL = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
|
|
14
|
+
/** `$schema` value in mcp.json. */
|
|
15
|
+
export declare const MCP_SCHEMA_URL = "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json";
|
|
16
|
+
/** Spec-mandated manifest location: plugin.json in the plugin root. */
|
|
17
|
+
export declare const PLUGIN_MANIFEST_FILE = "plugin.json";
|
|
18
|
+
/** Spec-mandated MCP configuration location: mcp.json in the plugin root. */
|
|
19
|
+
export declare const MCP_CONFIG_FILE = "mcp.json";
|
|
20
|
+
/**
|
|
21
|
+
* Reverse-domain namespace for toolkit-specific manifest data. Agent Plugins
|
|
22
|
+
* 1.0.0 closes the manifest schema (`additionalProperties: false`), so client
|
|
23
|
+
* data must live under `extensions[<namespace>]` rather than at the top level.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ATK_EXTENSION_NAMESPACE = "com.microsoft.agents-toolkit";
|
|
26
|
+
/** Pre-1.0.0 top-level extension key. Still read on import for back-compat. */
|
|
27
|
+
export declare const LEGACY_ATK_EXTENSION_KEY = "x-microsoft-365-agents-toolkit";
|
|
28
|
+
/** Pre-1.0.0 MCP config filename. Still read on import for back-compat. */
|
|
29
|
+
export declare const LEGACY_MCP_CONFIG_FILE = ".mcp.json";
|
|
30
|
+
/**
|
|
31
|
+
* Pre-1.0.0 manifest locations. Agent Plugins 1.0.0 requires plugin.json in the
|
|
32
|
+
* plugin root; these are still probed on import so directories authored against
|
|
33
|
+
* the older spec keep working.
|
|
34
|
+
*/
|
|
35
|
+
export declare const LEGACY_MANIFEST_LOCATIONS: ReadonlyArray<{
|
|
36
|
+
relPath: string;
|
|
37
|
+
kind: "open-plugin" | "claude-plugin" | "cursor-plugin";
|
|
38
|
+
}>;
|
|
39
|
+
/** `name` constraints from plugin.schema.json. */
|
|
40
|
+
export declare const PLUGIN_NAME_MAX_LENGTH = 64;
|
|
41
|
+
export declare const PLUGIN_NAME_PATTERN: RegExp;
|
|
42
|
+
/** Transport types permitted by mcp.schema.json. `sse` is legacy HTTP+SSE. */
|
|
43
|
+
export type AgentPluginMcpServerType = "stdio" | "streamable-http" | "sse";
|
|
44
|
+
export declare const MCP_SERVER_TYPES: readonly AgentPluginMcpServerType[];
|
|
45
|
+
/** Transport emitted by `atk export` for remote MCP servers. */
|
|
46
|
+
export declare const DEFAULT_REMOTE_MCP_TYPE: AgentPluginMcpServerType;
|
|
47
|
+
export declare function isValidPluginName(name: string): boolean;
|
|
48
|
+
export declare function isSupportedMcpServerType(value: unknown): value is AgentPluginMcpServerType;
|
|
49
|
+
/** Add an own enumerable entry without invoking Object.prototype.__proto__. */
|
|
50
|
+
export declare function setRecordValue<T>(record: Record<string, T>, key: string, value: T): void;
|
|
51
|
+
/** Reject absolute and drive-relative paths under both POSIX and Windows semantics. */
|
|
52
|
+
export declare function isPortableRelativePath(value: string): boolean;
|
|
53
|
+
export declare function normalizePortableRelativePath(value: string): string | undefined;
|
|
54
|
+
export declare function portablePathsConflict(left: string, right: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Coerce an arbitrary display string into a name that satisfies
|
|
57
|
+
* plugin.schema.json: lowercase, `[a-z0-9.-]`, no leading/trailing `.`/`-`,
|
|
58
|
+
* no `--` or `..`, and at most 64 characters.
|
|
59
|
+
*/
|
|
60
|
+
export declare function normalizePluginName(raw: string, fallback?: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Reject paths that escape their designated root, per the Agent Plugins
|
|
63
|
+
* security rules ("resolved paths MUST remain within the plugin root").
|
|
64
|
+
* Returns the resolved absolute path, or undefined when it escapes.
|
|
65
|
+
*/
|
|
66
|
+
export declare function resolveWithinRoot(root: string, relative: string): string | undefined;
|
|
67
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/spec.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AAEH,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAE7C,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,+DAA+D,CAAC;AAE9F,mCAAmC;AACnC,eAAO,MAAM,cAAc,4DAA4D,CAAC;AAExF,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAElD,6EAA6E;AAC7E,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,iCAAiC,CAAC;AAEtE,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,mCAAmC,CAAC;AAEzE,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC;CACzD,CAIA,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAwD,CAAC;AAMzF,8EAA8E;AAC9E,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAC3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,wBAAwB,EAI/D,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,EAAE,wBAA4C,CAAC;AAEnF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOvD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAE1F;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAOxF;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB/E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAM1E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAoB,GAAG,MAAM,CAmBrF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWpF"}
|