@agentsmarket/cli 0.1.0 → 0.5.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/README.md +1455 -44
- package/dist/commands/balance.js +3 -3
- package/dist/commands/call.d.ts +23 -1
- package/dist/commands/call.js +187 -45
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/info.d.ts +6 -6
- package/dist/commands/info.js +33 -35
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.d.ts +11 -7
- package/dist/commands/init.js +71 -42
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +2 -2
- package/dist/commands/mcp.js +9 -11
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/pipeline/call.d.ts +18 -0
- package/dist/commands/pipeline/call.js +58 -0
- package/dist/commands/pipeline/call.js.map +1 -0
- package/dist/commands/pipeline/install.d.ts +7 -0
- package/dist/commands/pipeline/install.js +16 -0
- package/dist/commands/pipeline/install.js.map +1 -0
- package/dist/commands/pipeline/publish.d.ts +15 -0
- package/dist/commands/pipeline/publish.js +22 -0
- package/dist/commands/pipeline/publish.js.map +1 -0
- package/dist/commands/publish-openapi.d.ts +16 -0
- package/dist/commands/publish-openapi.js +61 -0
- package/dist/commands/publish-openapi.js.map +1 -0
- package/dist/commands/publish-pipeline.d.ts +15 -0
- package/dist/commands/publish-pipeline.js +141 -0
- package/dist/commands/publish-pipeline.js.map +1 -0
- package/dist/commands/publish.js +37 -42
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/refund.js +15 -17
- package/dist/commands/refund.js.map +1 -1
- package/dist/commands/register.js +6 -27
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/run.d.ts +31 -0
- package/dist/commands/run.js +305 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.js +2 -5
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/search.js +1 -1
- package/dist/commands/skill/call.d.ts +12 -0
- package/dist/commands/skill/call.js +17 -0
- package/dist/commands/skill/call.js.map +1 -0
- package/dist/commands/skill/install.d.ts +7 -0
- package/dist/commands/skill/install.js +13 -0
- package/dist/commands/skill/install.js.map +1 -0
- package/dist/commands/skill/publish.d.ts +18 -0
- package/dist/commands/skill/publish.js +28 -0
- package/dist/commands/skill/publish.js.map +1 -0
- package/dist/commands/validate.d.ts +20 -0
- package/dist/commands/validate.js +91 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +4 -6
- package/dist/index.js +90 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +12 -13
- package/dist/lib/config.js +27 -27
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/http.d.ts +23 -8
- package/dist/lib/http.js +28 -48
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/identity.d.ts +29 -0
- package/dist/lib/identity.js +57 -0
- package/dist/lib/identity.js.map +1 -0
- package/dist/lib/mcp-install.d.ts +36 -0
- package/dist/lib/mcp-install.js +149 -0
- package/dist/lib/mcp-install.js.map +1 -0
- package/dist/lib/pipeline-spec.d.ts +66 -0
- package/dist/lib/pipeline-spec.js +273 -0
- package/dist/lib/pipeline-spec.js.map +1 -0
- package/package.json +12 -4
- package/dist/lib/keys.d.ts +0 -69
- package/dist/lib/keys.js +0 -85
- package/dist/lib/keys.js.map +0 -1
- package/dist/lib/payment-keys.d.ts +0 -25
- package/dist/lib/payment-keys.js +0 -55
- package/dist/lib/payment-keys.js.map +0 -1
- package/dist/lib/payment.d.ts +0 -27
- package/dist/lib/payment.js +0 -123
- package/dist/lib/payment.js.map +0 -1
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket run <pipeline.yaml>` — execute a pipeline locally.
|
|
3
|
+
*
|
|
4
|
+
* Supports all stage types from the shared executor:
|
|
5
|
+
* - llm stage (model + prompt) — direct LLM call
|
|
6
|
+
* - uses (string) — single skill invocation
|
|
7
|
+
* - uses (string[]) — sequential array of skill invocations
|
|
8
|
+
*
|
|
9
|
+
* Skills are fetched via HTTP from the configured marketplace server
|
|
10
|
+
* (AGENTSMARKET_URL or https://api.agentsmarket.world).
|
|
11
|
+
*
|
|
12
|
+
* Examples:
|
|
13
|
+
* agentsmarket run pipeline.yaml
|
|
14
|
+
* agentsmarket run pipeline.yaml --inputs '{"name":"Alice"}'
|
|
15
|
+
* agentsmarket run pipeline.yaml --mock
|
|
16
|
+
* agentsmarket run pipeline.yaml --model MiniMax-M3
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'node:fs';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import { MiniMaxProvider, OpenRouterProvider, runPipelineV2, createModelResolver, createDefaultPricingResolver, LLMProviderRegistry, UnknownProviderError, ProviderMismatchError, loadPipelineYaml, MissingEnvVarError, } from '@agentsmarket/pipeline-runtime';
|
|
21
|
+
import { validatePipelineSpec } from '../lib/pipeline-spec.js';
|
|
22
|
+
function parseInputs(raw, specInputs) {
|
|
23
|
+
if (!raw)
|
|
24
|
+
return specInputs ?? {};
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
27
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
28
|
+
throw new Error('--inputs must be a JSON object');
|
|
29
|
+
}
|
|
30
|
+
return { ...(specInputs ?? {}), ...parsed };
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
throw new Error(`Failed to parse --inputs JSON: ${e.message}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class MockProvider {
|
|
37
|
+
name = 'mock';
|
|
38
|
+
models = ['mock'];
|
|
39
|
+
simpleModel = 'mock';
|
|
40
|
+
complexModel = 'mock';
|
|
41
|
+
supports(model) {
|
|
42
|
+
return this.models.includes(model);
|
|
43
|
+
}
|
|
44
|
+
async generateText(prompt, _opts) {
|
|
45
|
+
const preview = prompt.slice(0, 200);
|
|
46
|
+
return {
|
|
47
|
+
text: `[mock] echo: ${preview}${prompt.length > 200 ? '…' : ''}`,
|
|
48
|
+
usage: { inputTokens: prompt.length, outputTokens: 50 },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async generateJson(prompt, _schema, opts) {
|
|
52
|
+
const { text } = await this.generateText(prompt, opts);
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(text);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { mock_response: text };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function buildProviderRegistry() {
|
|
62
|
+
const providers = [];
|
|
63
|
+
const minimaxKey = process.env.MINIMAX_API_KEY;
|
|
64
|
+
if (minimaxKey) {
|
|
65
|
+
try {
|
|
66
|
+
providers.push(new MiniMaxProvider({ apiKey: minimaxKey }));
|
|
67
|
+
}
|
|
68
|
+
catch { }
|
|
69
|
+
}
|
|
70
|
+
const openrouterKey = process.env.OPENROUTER_API_KEY;
|
|
71
|
+
if (openrouterKey) {
|
|
72
|
+
try {
|
|
73
|
+
providers.push(new OpenRouterProvider({ apiKey: openrouterKey }));
|
|
74
|
+
}
|
|
75
|
+
catch { }
|
|
76
|
+
}
|
|
77
|
+
return new LLMProviderRegistry(providers);
|
|
78
|
+
}
|
|
79
|
+
export function validateStageProviders(spec, registry) {
|
|
80
|
+
const errors = [];
|
|
81
|
+
for (const stage of spec.stages) {
|
|
82
|
+
if (!stage.provider) {
|
|
83
|
+
const isLlmStage = (typeof stage.model === 'string' && stage.model.length > 0)
|
|
84
|
+
|| (typeof stage.prompt === 'string' && stage.prompt.length > 0 && !stage.uses);
|
|
85
|
+
if (isLlmStage) {
|
|
86
|
+
errors.push(`Stage '${stage.id}': R6 requires explicit 'provider:' field (auto-dispatch by model name removed). Add 'provider: minimax' (or openrouter/openai/anthropic/replicate).`);
|
|
87
|
+
}
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const stageModel = stage.model ?? spec.defaults?.model ?? 'MiniMax-M3';
|
|
91
|
+
try {
|
|
92
|
+
registry.resolveWithSupports(stage.provider, stageModel);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
if (e instanceof UnknownProviderError || e instanceof ProviderMismatchError) {
|
|
96
|
+
errors.push(`Stage '${stage.id}': ${e.message}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw e;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return errors;
|
|
104
|
+
}
|
|
105
|
+
function resolveFallbackProvider(registry, stages) {
|
|
106
|
+
const providers = registry.names();
|
|
107
|
+
if (providers.length === 0) {
|
|
108
|
+
throw new Error('No LLM providers configured. Set MINIMAX_API_KEY or OPENROUTER_API_KEY, ' +
|
|
109
|
+
'or pass --mock to run with the deterministic mock provider.');
|
|
110
|
+
}
|
|
111
|
+
for (const stage of stages) {
|
|
112
|
+
if (typeof stage.provider === 'string' && registry.hasName(stage.provider)) {
|
|
113
|
+
return registry.resolve(stage.provider);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const fallbackName = providers[0];
|
|
117
|
+
return registry.resolve(fallbackName);
|
|
118
|
+
}
|
|
119
|
+
const COLOR = {
|
|
120
|
+
reset: '\x1b[0m', dim: '\x1b[2m', bold: '\x1b[1m',
|
|
121
|
+
green: '\x1b[32m', yellow: '\x1b[33m', cyan: '\x1b[36m', red: '\x1b[31m',
|
|
122
|
+
};
|
|
123
|
+
function colorize(s, color, enabled) {
|
|
124
|
+
return enabled ? `${COLOR[color]}${s}${COLOR.reset}` : s;
|
|
125
|
+
}
|
|
126
|
+
function warnIfDeprecatedFlag(usedDeprecated, useColor) {
|
|
127
|
+
if (usedDeprecated.apiKey) {
|
|
128
|
+
console.error(colorize('⚠ --api-key is deprecated. Pass LLM credentials via env (export MINIMAX_API_KEY=...) and reference them inside your pipeline YAML as ${MINIMAX_API_KEY} (or ${NAME:-default} for a fallback). See docs/R7-ENV-VARS.md for syntax.', 'yellow', useColor));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function getMarketplaceUrl(override) {
|
|
132
|
+
return override ?? process.env.AGENTSMARKET_URL ?? 'https://api.agentsmarket.world';
|
|
133
|
+
}
|
|
134
|
+
async function fetchSkillFromMarketplace(skillId, baseUrl, agentId) {
|
|
135
|
+
const url = `${baseUrl}/v1/skills/${encodeURIComponent(skillId)}`;
|
|
136
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
137
|
+
if (agentId)
|
|
138
|
+
headers['X-Agent-ID'] = agentId;
|
|
139
|
+
const res = await fetch(url, { headers });
|
|
140
|
+
if (res.status === 404)
|
|
141
|
+
return null;
|
|
142
|
+
if (!res.ok)
|
|
143
|
+
throw new Error(`Failed to fetch skill ${skillId}: HTTP ${res.status}`);
|
|
144
|
+
return await res.json();
|
|
145
|
+
}
|
|
146
|
+
export async function runCommand(filePath, opts) {
|
|
147
|
+
const useColor = !opts.noColor && process.stdout.isTTY !== false;
|
|
148
|
+
warnIfDeprecatedFlag(opts, useColor);
|
|
149
|
+
const absPath = path.resolve(filePath);
|
|
150
|
+
if (!fs.existsSync(absPath)) {
|
|
151
|
+
console.error(colorize(`✗ File not found: ${absPath}`, 'red', useColor));
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
const raw = fs.readFileSync(absPath, 'utf8');
|
|
155
|
+
let spec;
|
|
156
|
+
try {
|
|
157
|
+
spec = loadPipelineYaml(raw);
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
if (e instanceof MissingEnvVarError) {
|
|
161
|
+
console.error(colorize(`✗ ${e.message}`, 'red', useColor));
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
console.error(colorize(`✗ Invalid YAML: ${e.message}`, 'red', useColor));
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
const validation = validatePipelineSpec(spec);
|
|
168
|
+
if ('error' in validation) {
|
|
169
|
+
console.error(colorize(`✗ Spec validation failed: ${validation.error}`, 'red', useColor));
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
const inputs = parseInputs(opts.inputs, spec.inputs);
|
|
173
|
+
const baseUrl = getMarketplaceUrl(opts.url);
|
|
174
|
+
const stageCount = spec.stages.length;
|
|
175
|
+
const usesStages = validation.usesStages;
|
|
176
|
+
console.log(colorize(`▶ ${spec.name} v${spec.version ?? '0.0.0'}`, 'bold', useColor));
|
|
177
|
+
console.log(colorize(` ${stageCount} stages · mock=${opts.mock ? 'yes' : 'no'} · inputs=${Object.keys(inputs).length} · url=${baseUrl}`, 'dim', useColor));
|
|
178
|
+
console.log('');
|
|
179
|
+
if (validation.warnings.length > 0) {
|
|
180
|
+
console.log(colorize('⚠ Spec warnings (v0.2 forward-compat):', 'yellow', useColor));
|
|
181
|
+
for (const w of validation.warnings) {
|
|
182
|
+
console.log(colorize(` - ${w}`, 'yellow', useColor));
|
|
183
|
+
}
|
|
184
|
+
console.log('');
|
|
185
|
+
}
|
|
186
|
+
const stagesForRuntime = spec.stages.map((s) => ({
|
|
187
|
+
id: s.id,
|
|
188
|
+
model: opts.model ?? s.model,
|
|
189
|
+
system: s.system,
|
|
190
|
+
prompt: s.prompt,
|
|
191
|
+
uses: s.uses,
|
|
192
|
+
input: s.input,
|
|
193
|
+
output_format: s.output_format,
|
|
194
|
+
fields: s.fields,
|
|
195
|
+
mcp_servers: s.mcp_servers,
|
|
196
|
+
mcp_tools: s.mcp_tools,
|
|
197
|
+
working_dir: s.working_dir,
|
|
198
|
+
provider: s.provider,
|
|
199
|
+
}));
|
|
200
|
+
const providerRegistry = buildProviderRegistry();
|
|
201
|
+
const preFlightErrors = validateStageProviders(spec, providerRegistry);
|
|
202
|
+
if (preFlightErrors.length > 0) {
|
|
203
|
+
for (const msg of preFlightErrors) {
|
|
204
|
+
console.error(colorize(`✗ ${msg}`, 'red', useColor));
|
|
205
|
+
}
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
const t0 = Date.now();
|
|
209
|
+
try {
|
|
210
|
+
const result = await runPipelineV2({
|
|
211
|
+
spec: { name: spec.name, version: spec.version ?? '0.0.0', defaults: spec.defaults, stages: stagesForRuntime },
|
|
212
|
+
inputs,
|
|
213
|
+
deps: {
|
|
214
|
+
provider: opts.mock
|
|
215
|
+
? new MockProvider()
|
|
216
|
+
: resolveFallbackProvider(providerRegistry, stagesForRuntime),
|
|
217
|
+
registry: providerRegistry,
|
|
218
|
+
pricing: createDefaultPricingResolver({ openrouterApiKey: process.env.OPENROUTER_API_KEY }),
|
|
219
|
+
modelResolver: createModelResolver({
|
|
220
|
+
agentDefault: process.env.AGENTSMARKET_DEFAULT_MODEL,
|
|
221
|
+
envDefault: process.env.AGENTSMARKET_DEFAULT_MODEL,
|
|
222
|
+
}),
|
|
223
|
+
fetchSkill: async (skillId) => {
|
|
224
|
+
const skill = await fetchSkillFromMarketplace(skillId, baseUrl);
|
|
225
|
+
if (!skill)
|
|
226
|
+
return null;
|
|
227
|
+
return {
|
|
228
|
+
id: skill.id,
|
|
229
|
+
name: skill.name,
|
|
230
|
+
full_md: skill.full_md ?? '',
|
|
231
|
+
description: skill.description,
|
|
232
|
+
preferred_model: 'MiniMax-M3',
|
|
233
|
+
is_private: skill.is_private ? 1 : 0,
|
|
234
|
+
granted_to: JSON.stringify(skill.granted_to ?? []),
|
|
235
|
+
author_agent_id: skill.author_agent_id,
|
|
236
|
+
};
|
|
237
|
+
},
|
|
238
|
+
getCurrentAgentId: () => '0xcli-local',
|
|
239
|
+
getPipelineAuthorId: () => '0xcli-local',
|
|
240
|
+
isLocal: true,
|
|
241
|
+
},
|
|
242
|
+
hooks: {
|
|
243
|
+
onStageStart: (stageId) => {
|
|
244
|
+
const stage = spec.stages.find((s) => s.id === stageId);
|
|
245
|
+
if (stage?.working_dir) {
|
|
246
|
+
const resolved = path.resolve(path.dirname(absPath), stage.working_dir);
|
|
247
|
+
fs.mkdirSync(resolved, { recursive: true });
|
|
248
|
+
console.log(colorize(` ▸ ${stageId}... [working_dir=${resolved}]`, 'cyan', useColor));
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
console.log(colorize(` ▸ ${stageId}...`, 'cyan', useColor));
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
onStageComplete: (stageId, ms) => {
|
|
255
|
+
console.log(colorize(` ✓ ${stageId} (${ms}ms)`, 'green', useColor));
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
const totalMs = Date.now() - t0;
|
|
260
|
+
const totalCostUsdc = result.totalCostMicroUsdc / 1_000_000;
|
|
261
|
+
console.log('');
|
|
262
|
+
console.log(colorize('═'.repeat(60), 'dim', useColor));
|
|
263
|
+
console.log(colorize(`Total: ${totalMs}ms · ~$${totalCostUsdc.toFixed(6)} USDC`, 'bold', useColor));
|
|
264
|
+
console.log('');
|
|
265
|
+
if (usesStages.length > 0) {
|
|
266
|
+
const nestedCount = result.stageTimings.reduce((acc, s) => acc + (s.skillIds?.length ?? 0), 0);
|
|
267
|
+
console.log(colorize(` ${nestedCount} nested skill calls executed`, 'dim', useColor));
|
|
268
|
+
}
|
|
269
|
+
if (result.stageProvenance) {
|
|
270
|
+
const usesWithProvenance = Object.entries(result.stageProvenance).filter(([, prov]) => (prov.uses_details?.length ?? 0) > 0 || prov.mcp || prov.working_dir);
|
|
271
|
+
if (usesWithProvenance.length > 0) {
|
|
272
|
+
console.log(colorize('Stage provenance (v0.2):', 'bold', useColor));
|
|
273
|
+
for (const [stageId, prov] of usesWithProvenance) {
|
|
274
|
+
console.log(colorize(` ${stageId}:`, 'dim', useColor));
|
|
275
|
+
for (const d of prov.uses_details ?? []) {
|
|
276
|
+
const label = d.requested_version
|
|
277
|
+
? `${d.skill_id}@${d.requested_version} (pin=${d.version_pin})`
|
|
278
|
+
: `${d.skill_id} (latest, pin=loose)`;
|
|
279
|
+
console.log(colorize(` uses ${label} v${d.actual_version} sha256:${d.content_hash.slice(0, 12)}…`, 'dim', useColor));
|
|
280
|
+
}
|
|
281
|
+
if (prov.mcp) {
|
|
282
|
+
console.log(colorize(` mcp_servers=[${prov.mcp.validated_servers.join(', ')}] mcp_tools=[${prov.mcp.validated_tools.join(', ')}]`, 'dim', useColor));
|
|
283
|
+
}
|
|
284
|
+
if (prov.working_dir) {
|
|
285
|
+
console.log(colorize(` working_dir=${prov.working_dir}${prov.working_dir_ignored_on_server ? ' (IGNORED — server execution)' : ''}`, 'dim', useColor));
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
console.log('');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
console.log(colorize('Final outputs:', 'bold', useColor));
|
|
292
|
+
for (const stageId of Object.keys(result.outputs)) {
|
|
293
|
+
const output = result.outputs[stageId] ?? '';
|
|
294
|
+
console.log('');
|
|
295
|
+
console.log(colorize(` ┌── ${stageId} ──`, 'cyan', useColor));
|
|
296
|
+
console.log(output.split('\n').map((line) => ` │ ${line}`).join('\n'));
|
|
297
|
+
}
|
|
298
|
+
console.log('');
|
|
299
|
+
}
|
|
300
|
+
catch (e) {
|
|
301
|
+
console.error(colorize(`✗ Pipeline failed: ${e.message}`, 'red', useColor));
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/scan.js
CHANGED
|
@@ -128,8 +128,6 @@ export function scanContent(content, path) {
|
|
|
128
128
|
message: pattern.message,
|
|
129
129
|
line: findLineNumber(content, match.index),
|
|
130
130
|
});
|
|
131
|
-
if (match[0].length === 0)
|
|
132
|
-
regex.lastIndex++;
|
|
133
131
|
}
|
|
134
132
|
}
|
|
135
133
|
const deductions = findings.reduce((sum, f) => sum + SCORE_BY_SEVERITY[f.severity], 0);
|
|
@@ -147,7 +145,7 @@ export async function scanCommand(filePath) {
|
|
|
147
145
|
content = readFileSync(filePath, 'utf-8');
|
|
148
146
|
}
|
|
149
147
|
catch (err) {
|
|
150
|
-
console.error(`✗ Cannot read ${filePath}: ${err
|
|
148
|
+
console.error(`✗ Cannot read ${filePath}: ${err.message}`);
|
|
151
149
|
process.exit(2);
|
|
152
150
|
}
|
|
153
151
|
const result = scanContent(content, filePath);
|
|
@@ -173,8 +171,7 @@ export async function scanCommand(filePath) {
|
|
|
173
171
|
gray(sev);
|
|
174
172
|
console.log(` ${label} (${list.length})`);
|
|
175
173
|
for (const f of list) {
|
|
176
|
-
|
|
177
|
-
console.log(` [${f.category}] ${f.message} ${where}`);
|
|
174
|
+
console.log(` [${f.category}] ${f.message} L${f.line}`);
|
|
178
175
|
}
|
|
179
176
|
}
|
|
180
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/search.js
CHANGED
|
@@ -18,7 +18,7 @@ export async function searchCommand(query, opts = {}) {
|
|
|
18
18
|
}
|
|
19
19
|
console.log(`Found ${data.count} skill(s) matching "${query}":\n`);
|
|
20
20
|
for (const s of data.skills) {
|
|
21
|
-
const price = s.is_free ? 'FREE' : `$${(s.
|
|
21
|
+
const price = s.is_free ? 'FREE' : `$${(s.price_usdc / 1_000_000).toFixed(3)} USDT`;
|
|
22
22
|
const tags = s.tags.length ? `[${s.tags.join(', ')}]` : '';
|
|
23
23
|
console.log(` ${s.id}`);
|
|
24
24
|
console.log(` ${s.name} — ${price} (${s.invocation_count} invocations) ${tags}`);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket skill call <slug>` — wraps the existing callCommand.
|
|
3
|
+
*
|
|
4
|
+
* Calls a skill via the marketplace server. Handles EIP-191 signing + USDC payment.
|
|
5
|
+
* For v0.5 B2, this is a thin pass-through to the top-level call logic.
|
|
6
|
+
* R16 will replace this with a server-side /invoke call + payment flow.
|
|
7
|
+
*/
|
|
8
|
+
export declare function skillCallCommand(slug: string, opts: {
|
|
9
|
+
paymentTxHash?: string;
|
|
10
|
+
inputs?: string;
|
|
11
|
+
autoSign?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket skill call <slug>` — wraps the existing callCommand.
|
|
3
|
+
*
|
|
4
|
+
* Calls a skill via the marketplace server. Handles EIP-191 signing + USDC payment.
|
|
5
|
+
* For v0.5 B2, this is a thin pass-through to the top-level call logic.
|
|
6
|
+
* R16 will replace this with a server-side /invoke call + payment flow.
|
|
7
|
+
*/
|
|
8
|
+
import { callCommand } from '../call.js';
|
|
9
|
+
export async function skillCallCommand(slug, opts) {
|
|
10
|
+
await callCommand({
|
|
11
|
+
skillId: slug,
|
|
12
|
+
paymentTxHash: opts.paymentTxHash ?? null,
|
|
13
|
+
inputsJson: opts.inputs ?? null,
|
|
14
|
+
noAutoSign: opts.autoSign === false,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../../src/commands/skill/call.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAIpD;IACC,MAAM,WAAW,CAAC;QAChB,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;QACzC,UAAU,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC/B,UAAU,EAAE,IAAI,CAAC,QAAQ,KAAK,KAAK;KACpC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket skill install <slug>` — wraps the existing installCommand.
|
|
3
|
+
*
|
|
4
|
+
* For B1, this is a thin pass-through. In R16, this will be wired to the new
|
|
5
|
+
* `GET /v1/skills/:id/install` server route with payment flow.
|
|
6
|
+
*/
|
|
7
|
+
export declare function skillInstallCommand(slug: string): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket skill install <slug>` — wraps the existing installCommand.
|
|
3
|
+
*
|
|
4
|
+
* For B1, this is a thin pass-through. In R16, this will be wired to the new
|
|
5
|
+
* `GET /v1/skills/:id/install` server route with payment flow.
|
|
6
|
+
*/
|
|
7
|
+
import { installCommand } from '../install.js';
|
|
8
|
+
export async function skillInstallCommand(slug) {
|
|
9
|
+
// For v0.5 B1, the install logic is identical to the top-level install.
|
|
10
|
+
// R16 will replace this with a server-side /install call + payment flow.
|
|
11
|
+
await installCommand(slug);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/skill/install.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket skill publish <file>` — wraps the existing publishCommand.
|
|
3
|
+
*
|
|
4
|
+
* For v0.5 B3, adds two new flags for publish auto-detect semantics (Q22-Q25):
|
|
5
|
+
* --bump-version=patch|minor|major Force version bump on content hash conflict
|
|
6
|
+
* --metadata-only Force metadata-only update (no row insert)
|
|
7
|
+
*
|
|
8
|
+
* Default behavior (no flags): auto-detect by content hash
|
|
9
|
+
* - Same version + same hash → metadata-only update
|
|
10
|
+
* - Same version + different hash → error (suggest --bump-version)
|
|
11
|
+
* - New version → new row
|
|
12
|
+
*/
|
|
13
|
+
interface PublishFlags {
|
|
14
|
+
bumpVersion?: 'patch' | 'minor' | 'major';
|
|
15
|
+
metadataOnly?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function skillPublishCommand(filePath: string, flags: PublishFlags): Promise<void>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket skill publish <file>` — wraps the existing publishCommand.
|
|
3
|
+
*
|
|
4
|
+
* For v0.5 B3, adds two new flags for publish auto-detect semantics (Q22-Q25):
|
|
5
|
+
* --bump-version=patch|minor|major Force version bump on content hash conflict
|
|
6
|
+
* --metadata-only Force metadata-only update (no row insert)
|
|
7
|
+
*
|
|
8
|
+
* Default behavior (no flags): auto-detect by content hash
|
|
9
|
+
* - Same version + same hash → metadata-only update
|
|
10
|
+
* - Same version + different hash → error (suggest --bump-version)
|
|
11
|
+
* - New version → new row
|
|
12
|
+
*/
|
|
13
|
+
import { publishCommand } from '../publish.js';
|
|
14
|
+
export async function skillPublishCommand(filePath, flags) {
|
|
15
|
+
// For B3, pass flags through to publishCommand if it accepts them; otherwise log a warning.
|
|
16
|
+
// The CLI surface exposes the flags; underlying publish logic may not yet consume them.
|
|
17
|
+
// publishCommand will be extended in a follow-up to honor these flags.
|
|
18
|
+
if (flags.bumpVersion) {
|
|
19
|
+
console.log(`[v0.5] Auto-bump requested: ${flags.bumpVersion}`);
|
|
20
|
+
console.log('[v0.5] Note: publish auto-detect wiring is tracked in R17; current publishCommand ignores this flag.');
|
|
21
|
+
}
|
|
22
|
+
if (flags.metadataOnly) {
|
|
23
|
+
console.log('[v0.5] Metadata-only mode requested.');
|
|
24
|
+
console.log('[v0.5] Note: publish auto-detect wiring is tracked in R17; current publishCommand ignores this flag.');
|
|
25
|
+
}
|
|
26
|
+
await publishCommand(filePath);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/skill/publish.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAO/C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAAmB;IAC7E,4FAA4F;IAC5F,wFAAwF;IACxF,uEAAuE;IAEvE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;IACtH,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;IACtH,CAAC;IAED,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket validate <pipeline.yaml>` — validate a pipeline spec without executing.
|
|
3
|
+
*
|
|
4
|
+
* Checks:
|
|
5
|
+
* - YAML is valid
|
|
6
|
+
* - Required fields (name, stages[].id)
|
|
7
|
+
* - Stage IDs are unique
|
|
8
|
+
* - Each stage has model OR uses
|
|
9
|
+
* - Estimates cost per invocation
|
|
10
|
+
*
|
|
11
|
+
* Exit codes:
|
|
12
|
+
* 0 = valid
|
|
13
|
+
* 1 = invalid (with details)
|
|
14
|
+
*/
|
|
15
|
+
interface ValidateOptions {
|
|
16
|
+
json?: boolean;
|
|
17
|
+
noColor?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function validateCommand(filePath: string, opts: ValidateOptions): Promise<void>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agentsmarket validate <pipeline.yaml>` — validate a pipeline spec without executing.
|
|
3
|
+
*
|
|
4
|
+
* Checks:
|
|
5
|
+
* - YAML is valid
|
|
6
|
+
* - Required fields (name, stages[].id)
|
|
7
|
+
* - Stage IDs are unique
|
|
8
|
+
* - Each stage has model OR uses
|
|
9
|
+
* - Estimates cost per invocation
|
|
10
|
+
*
|
|
11
|
+
* Exit codes:
|
|
12
|
+
* 0 = valid
|
|
13
|
+
* 1 = invalid (with details)
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import { loadPipelineYaml, MissingEnvVarError } from '@agentsmarket/pipeline-runtime';
|
|
18
|
+
import { validatePipelineSpec, COST_PER_LLM_CALL_USDC } from '../lib/pipeline-spec.js';
|
|
19
|
+
import { buildProviderRegistry, validateStageProviders } from '../commands/run.js';
|
|
20
|
+
export async function validateCommand(filePath, opts) {
|
|
21
|
+
const absPath = path.resolve(filePath);
|
|
22
|
+
if (!fs.existsSync(absPath)) {
|
|
23
|
+
console.error(`✗ File not found: ${absPath}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const raw = fs.readFileSync(absPath, 'utf8');
|
|
27
|
+
let spec;
|
|
28
|
+
try {
|
|
29
|
+
spec = loadPipelineYaml(raw);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
if (e instanceof MissingEnvVarError) {
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
console.log(JSON.stringify({ ok: false, error: e.message, var: e.varName }));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.error(`✗ ${e.message}`);
|
|
38
|
+
}
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
if (opts.json) {
|
|
42
|
+
console.log(JSON.stringify({ ok: false, error: `invalid YAML: ${e.message}` }));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.error(`✗ Invalid YAML: ${e.message}`);
|
|
46
|
+
}
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const result = validatePipelineSpec(spec);
|
|
50
|
+
if ('error' in result) {
|
|
51
|
+
if (opts.json) {
|
|
52
|
+
console.log(JSON.stringify({ ok: false, error: result.error }));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.error(`✗ Spec validation failed: ${result.error}`);
|
|
56
|
+
}
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const providerErrors = validateStageProviders(spec, buildProviderRegistry());
|
|
60
|
+
if (providerErrors.length > 0) {
|
|
61
|
+
const error = providerErrors.join('; ');
|
|
62
|
+
if (opts.json) {
|
|
63
|
+
console.log(JSON.stringify({ ok: false, error, provider_errors: providerErrors }));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
for (const msg of providerErrors)
|
|
67
|
+
console.error(`✗ ${msg}`);
|
|
68
|
+
}
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
const llmStages = spec.stages.filter((s) => !s.uses).length;
|
|
72
|
+
const usesStages = spec.stages.filter((s) => s.uses).length;
|
|
73
|
+
const estimatedCost = llmStages * COST_PER_LLM_CALL_USDC;
|
|
74
|
+
if (opts.json) {
|
|
75
|
+
console.log(JSON.stringify({
|
|
76
|
+
ok: true,
|
|
77
|
+
name: spec.name,
|
|
78
|
+
version: spec.version ?? '0.0.0',
|
|
79
|
+
stages: spec.stages.length,
|
|
80
|
+
llm_stages: llmStages,
|
|
81
|
+
uses_stages: usesStages,
|
|
82
|
+
estimated_cost_usdc: estimatedCost,
|
|
83
|
+
}, null, 2));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(`✓ ${spec.name} v${spec.version ?? '0.0.0'} is valid`);
|
|
87
|
+
console.log(` ${spec.stages.length} stages (${llmStages} LLM, ${usesStages} uses)`);
|
|
88
|
+
console.log(` Estimated cost: ~$${estimatedCost.toFixed(2)} USDC per invocation`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAyB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAOnF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAqB;IAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE7C,IAAI,IAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAqB,CAAC;IACnD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,kBAAkB,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAkB,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,mBAAoB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,sBAAsB,CAAC,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC7E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,GAAG,IAAI,cAAc;gBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,aAAa,GAAG,SAAS,GAAG,sBAAsB,CAAC;IAEzD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO;YAChC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,UAAU;YACvB,mBAAmB,EAAE,aAAa;SACnC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,IAAI,OAAO,WAAW,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,YAAY,SAAS,SAAS,UAAU,QAAQ,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,uBAAuB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
|