antpath 0.4.2 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -6,7 +6,7 @@ var __export = (target, all) => {
6
6
  };
7
7
 
8
8
  // dist/cli.js
9
- import { readFile, writeFile } from "node:fs/promises";
9
+ import { readFile as readFile2, writeFile } from "node:fs/promises";
10
10
 
11
11
  // ../shared/dist/config.js
12
12
  var DEFAULT_CAPS = {
@@ -53,6 +53,7 @@ var TERMINAL_RUN_STATUSES = [
53
53
  var terminalRunStatuses = new Set(TERMINAL_RUN_STATUSES);
54
54
 
55
55
  // ../shared/dist/blueprint.js
56
+ var SKILL_ID_PATTERN = /^skl_[A-Za-z0-9_-]{8,128}$/;
56
57
  var SKILL_BUNDLE_LIMITS = {
57
58
  /** Compressed (.zip) ceiling. */
58
59
  maxCompressedBytes: 10 * 1024 * 1024,
@@ -69,6 +70,270 @@ var SKILL_BUNDLE_LIMITS = {
69
70
  /** Stored directory mode. */
70
71
  defaultDirMode: 493
71
72
  };
73
+ function parseSkillRef(input, path) {
74
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
75
+ throw new Error(`${path} must be a SkillRef object`);
76
+ }
77
+ const record = input;
78
+ const kind = record.kind;
79
+ if (kind === "workspace") {
80
+ for (const key of Object.keys(record)) {
81
+ if (key !== "kind" && key !== "id") {
82
+ throw new Error(`${path} contains unexpected field for workspace SkillRef: ${key}`);
83
+ }
84
+ }
85
+ const id = record.id;
86
+ if (typeof id !== "string" || !SKILL_ID_PATTERN.test(id)) {
87
+ throw new Error(`${path}.id must match ${SKILL_ID_PATTERN.source}`);
88
+ }
89
+ return { kind: "workspace", id };
90
+ }
91
+ if (kind === "provider") {
92
+ for (const key of Object.keys(record)) {
93
+ if (key !== "kind" && key !== "vendor" && key !== "skillId" && key !== "version") {
94
+ throw new Error(`${path} contains unexpected field for provider SkillRef: ${key}`);
95
+ }
96
+ }
97
+ const vendor = record.vendor;
98
+ if (vendor !== "anthropic" && vendor !== "custom") {
99
+ throw new Error(`${path}.vendor must be 'anthropic' or 'custom'`);
100
+ }
101
+ const skillId = record.skillId;
102
+ if (typeof skillId !== "string" || skillId.length === 0 || skillId.length > 256) {
103
+ throw new Error(`${path}.skillId must be a non-empty string (<= 256 chars)`);
104
+ }
105
+ const version = record.version;
106
+ if (version !== void 0 && (typeof version !== "string" || version.length === 0 || version.length > 64)) {
107
+ throw new Error(`${path}.version, when provided, must be a non-empty string (<= 64 chars)`);
108
+ }
109
+ return {
110
+ kind: "provider",
111
+ vendor,
112
+ skillId,
113
+ ...version !== void 0 ? { version } : {}
114
+ };
115
+ }
116
+ throw new Error(`${path}.kind must be 'workspace' or 'provider'`);
117
+ }
118
+ var SkillBundleValidationError = class extends Error {
119
+ constructor(message) {
120
+ super(message);
121
+ this.name = "SkillBundleValidationError";
122
+ }
123
+ };
124
+ function normaliseSkillBundlePath(input) {
125
+ if (typeof input !== "string") {
126
+ throw new SkillBundleValidationError("bundle entry path must be a string");
127
+ }
128
+ if (input.length === 0 || input.trim().length === 0) {
129
+ throw new SkillBundleValidationError("bundle entry path must be non-empty");
130
+ }
131
+ if (input.length > SKILL_BUNDLE_LIMITS.maxPathLength) {
132
+ throw new SkillBundleValidationError(`bundle entry path exceeds maxPathLength (${SKILL_BUNDLE_LIMITS.maxPathLength}): ${input}`);
133
+ }
134
+ if (input.includes("\0")) {
135
+ throw new SkillBundleValidationError(`bundle entry path contains NUL byte: ${JSON.stringify(input)}`);
136
+ }
137
+ if (input.includes("\\")) {
138
+ throw new SkillBundleValidationError(`bundle entry path uses backslash separator: ${input}`);
139
+ }
140
+ if (/^[A-Za-z]:[\\/]/.test(input)) {
141
+ throw new SkillBundleValidationError(`bundle entry path uses a drive letter: ${input}`);
142
+ }
143
+ if (input.startsWith("/")) {
144
+ throw new SkillBundleValidationError(`bundle entry path must be relative: ${input}`);
145
+ }
146
+ if (input.endsWith("/")) {
147
+ throw new SkillBundleValidationError(`bundle entry path must not end with '/': ${input}`);
148
+ }
149
+ const segments = input.split("/");
150
+ for (const segment of segments) {
151
+ if (segment === "..") {
152
+ throw new SkillBundleValidationError(`bundle entry path contains '..' segment: ${input}`);
153
+ }
154
+ if (segment === "." || segment === "") {
155
+ throw new SkillBundleValidationError(`bundle entry path contains empty or '.' segment: ${input}`);
156
+ }
157
+ }
158
+ if (segments.length > SKILL_BUNDLE_LIMITS.maxDepth) {
159
+ throw new SkillBundleValidationError(`bundle entry path exceeds maxDepth (${SKILL_BUNDLE_LIMITS.maxDepth}): ${input}`);
160
+ }
161
+ return input;
162
+ }
163
+ function validateSkillBundleEntry(input) {
164
+ const path = normaliseSkillBundlePath(input.path);
165
+ if (!Number.isFinite(input.size) || !Number.isInteger(input.size) || input.size < 0) {
166
+ throw new SkillBundleValidationError(`bundle entry size must be a non-negative integer (${path})`);
167
+ }
168
+ if (input.size > SKILL_BUNDLE_LIMITS.maxDecompressedBytes) {
169
+ throw new SkillBundleValidationError(`bundle entry size exceeds maxDecompressedBytes (${SKILL_BUNDLE_LIMITS.maxDecompressedBytes}): ${path}`);
170
+ }
171
+ const mode = (input.mode ?? SKILL_BUNDLE_LIMITS.defaultFileMode) & 511;
172
+ if (mode !== SKILL_BUNDLE_LIMITS.defaultFileMode && mode !== SKILL_BUNDLE_LIMITS.defaultDirMode) {
173
+ return { path, size: input.size, mode: SKILL_BUNDLE_LIMITS.defaultFileMode };
174
+ }
175
+ return { path, size: input.size, mode };
176
+ }
177
+ var MCP_SERVER_NAME_PATTERN = /^[a-z][a-z0-9_-]{0,62}$/;
178
+ function parseMcpServerRef(input, path) {
179
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
180
+ throw new Error(`${path} must be an object`);
181
+ }
182
+ const record = input;
183
+ for (const key of Object.keys(record)) {
184
+ if (key !== "name" && key !== "url") {
185
+ throw new Error(`${path}.${key} is not an allowed field for McpServerRef; permitted: name, url`);
186
+ }
187
+ }
188
+ const name = record.name;
189
+ if (typeof name !== "string" || !MCP_SERVER_NAME_PATTERN.test(name)) {
190
+ throw new Error(`${path}.name must match ${MCP_SERVER_NAME_PATTERN.source}`);
191
+ }
192
+ const url = record.url;
193
+ if (typeof url !== "string" || url.length === 0) {
194
+ throw new Error(`${path}.url must be a non-empty string`);
195
+ }
196
+ try {
197
+ const parsed = new URL(url);
198
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
199
+ throw new Error(`${path}.url must use http or https (got ${parsed.protocol})`);
200
+ }
201
+ if (parsed.username !== "" || parsed.password !== "") {
202
+ throw new Error(`${path}.url must not contain userinfo (username/password); use secrets.mcpServers[].headers for auth`);
203
+ }
204
+ } catch (cause) {
205
+ if (cause instanceof Error && cause.message.startsWith(path)) {
206
+ throw cause;
207
+ }
208
+ throw new Error(`${path}.url is not a valid URL: ${url}`);
209
+ }
210
+ return { name, url };
211
+ }
212
+ function parseBlueprintMcpServerRef(input, path) {
213
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
214
+ throw new Error(`${path} must be an object`);
215
+ }
216
+ const record = input;
217
+ for (const key of Object.keys(record)) {
218
+ if (key !== "name" && key !== "url" && key !== "headers") {
219
+ throw new Error(`${path}.${key} is not an allowed field for BlueprintMcpServer; permitted: name, url, headers`);
220
+ }
221
+ }
222
+ const stripped = { name: record.name, url: record.url };
223
+ const ref = parseMcpServerRef(stripped, path);
224
+ const rawHeaders = record.headers;
225
+ if (rawHeaders === void 0) {
226
+ return ref;
227
+ }
228
+ if (rawHeaders === null || typeof rawHeaders !== "object" || Array.isArray(rawHeaders)) {
229
+ throw new Error(`${path}.headers, when provided, must be a string-keyed object`);
230
+ }
231
+ const headers = {};
232
+ for (const [hk, hv] of Object.entries(rawHeaders)) {
233
+ if (typeof hv !== "string") {
234
+ throw new Error(`${path}.headers.${hk} must be a string`);
235
+ }
236
+ headers[hk] = hv;
237
+ }
238
+ return { ...ref, headers };
239
+ }
240
+ function parseBlueprint(input) {
241
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
242
+ throw new Error("Blueprint must be an object");
243
+ }
244
+ const record = input;
245
+ const allowed = /* @__PURE__ */ new Set([
246
+ "model",
247
+ "system",
248
+ "prompt",
249
+ "skills",
250
+ "mcpServers",
251
+ "environment",
252
+ "cleanup",
253
+ "proxyEndpoints",
254
+ "metadata"
255
+ ]);
256
+ for (const key of Object.keys(record)) {
257
+ if (!allowed.has(key)) {
258
+ throw new Error(`Blueprint contains unexpected field: ${key}`);
259
+ }
260
+ }
261
+ const model = record.model;
262
+ if (typeof model !== "string" || model.length === 0) {
263
+ throw new Error("Blueprint.model must be a non-empty string");
264
+ }
265
+ const system = record.system;
266
+ if (system !== void 0 && typeof system !== "string") {
267
+ throw new Error("Blueprint.system, when provided, must be a string");
268
+ }
269
+ const prompt = parseBlueprintPrompt(record.prompt);
270
+ const skills = parseBlueprintSkills(record.skills);
271
+ const mcpServers = parseBlueprintMcpServers(record.mcpServers);
272
+ return {
273
+ model,
274
+ ...system !== void 0 ? { system } : {},
275
+ prompt,
276
+ ...skills !== void 0 ? { skills } : {},
277
+ ...mcpServers !== void 0 ? { mcpServers } : {},
278
+ // environment / cleanup / proxyEndpoints / metadata: passed through
279
+ // as-is — the BFF revalidates them via `parseFlatRunSubmissionRequest`,
280
+ // so duplicating the heavyweight parsers here would mean two sources
281
+ // of truth. The CLI surfaces structural errors at submission time.
282
+ ...record.environment !== void 0 ? { environment: record.environment } : {},
283
+ ...record.cleanup !== void 0 ? { cleanup: record.cleanup } : {},
284
+ ...record.proxyEndpoints !== void 0 ? { proxyEndpoints: record.proxyEndpoints } : {},
285
+ ...record.metadata !== void 0 ? { metadata: record.metadata } : {}
286
+ };
287
+ }
288
+ function parseBlueprintPrompt(value) {
289
+ if (typeof value === "string") {
290
+ if (value.length === 0) {
291
+ throw new Error("Blueprint.prompt must be a non-empty string");
292
+ }
293
+ return value;
294
+ }
295
+ if (Array.isArray(value)) {
296
+ const arr = [];
297
+ for (let i = 0; i < value.length; i++) {
298
+ const item = value[i];
299
+ if (typeof item !== "string" || item.length === 0) {
300
+ throw new Error(`Blueprint.prompt[${i}] must be a non-empty string`);
301
+ }
302
+ arr.push(item);
303
+ }
304
+ if (arr.length === 0) {
305
+ throw new Error("Blueprint.prompt must be a non-empty string or array of strings");
306
+ }
307
+ return arr;
308
+ }
309
+ throw new Error("Blueprint.prompt must be a string or array of strings");
310
+ }
311
+ function parseBlueprintSkills(value) {
312
+ if (value === void 0) {
313
+ return void 0;
314
+ }
315
+ if (!Array.isArray(value)) {
316
+ throw new Error("Blueprint.skills must be an array");
317
+ }
318
+ return value.map((item, index) => parseSkillRef(item, `Blueprint.skills[${index}]`));
319
+ }
320
+ function parseBlueprintMcpServers(value) {
321
+ if (value === void 0) {
322
+ return void 0;
323
+ }
324
+ if (!Array.isArray(value)) {
325
+ throw new Error("Blueprint.mcpServers must be an array");
326
+ }
327
+ const seen = /* @__PURE__ */ new Set();
328
+ return value.map((item, index) => {
329
+ const entry = parseBlueprintMcpServerRef(item, `Blueprint.mcpServers[${index}]`);
330
+ if (seen.has(entry.name)) {
331
+ throw new Error(`Blueprint.mcpServers duplicate name: ${entry.name}`);
332
+ }
333
+ seen.add(entry.name);
334
+ return entry;
335
+ });
336
+ }
72
337
 
73
338
  // ../shared/dist/submission.js
74
339
  var PROXY_ENDPOINT_DEFAULTS = {
@@ -84,21 +349,6 @@ var PROXY_ENDPOINT_DEFAULTS = {
84
349
  // ../shared/dist/stable.js
85
350
  import { createHash } from "node:crypto";
86
351
  var ANTPATH_DEFAULT_BASE_URL = "https://antpath.ai";
87
- function stableStringify(value) {
88
- return JSON.stringify(sortValue(value));
89
- }
90
- function sha256(value) {
91
- return createHash("sha256").update(typeof value === "string" ? value : stableStringify(value)).digest("hex");
92
- }
93
- function sortValue(value) {
94
- if (Array.isArray(value)) {
95
- return value.map(sortValue);
96
- }
97
- if (value && typeof value === "object") {
98
- return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== void 0).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => [key, sortValue(item)]));
99
- }
100
- return value;
101
- }
102
352
 
103
353
  // ../shared/dist/sdk-secrets.js
104
354
  var SECRET_PATTERNS = [
@@ -131,12 +381,6 @@ function redactSecrets(value) {
131
381
  function redactString(input) {
132
382
  return SECRET_PATTERNS.reduce((current, pattern) => current.replace(pattern, REDACTED), input);
133
383
  }
134
- function containsSecretLikeValue(input) {
135
- return SECRET_PATTERNS.some((pattern) => {
136
- pattern.lastIndex = 0;
137
- return pattern.test(input);
138
- });
139
- }
140
384
  function isSecretKey(key) {
141
385
  return /(?:api[_-]?key|authorization|token|secret|password|credential)/i.test(key);
142
386
  }
@@ -152,11 +396,6 @@ var AntpathError = class extends Error {
152
396
  this.details = details === void 0 ? void 0 : redactSecrets(details);
153
397
  }
154
398
  };
155
- var TemplateValidationError = class extends AntpathError {
156
- constructor(message, details) {
157
- super("TEMPLATE_INVALID", message, details);
158
- }
159
- };
160
399
  var AntpathApiError = class extends AntpathError {
161
400
  status;
162
401
  body;
@@ -167,181 +406,6 @@ var AntpathApiError = class extends AntpathError {
167
406
  }
168
407
  };
169
408
 
170
- // ../shared/dist/template/compiler.js
171
- var ESCAPED_OPEN = "\0ANTPATH_ESCAPED_OPEN\0";
172
- var VARIABLE_PATTERN = /{{\s*([A-Za-z_][A-Za-z0-9_]*)\s*}}/g;
173
- function compileTemplate(template, variables = {}) {
174
- assertTemplateShape(template);
175
- const values = resolveVariableValues(template, variables);
176
- const resolved = {
177
- name: template.name,
178
- model: resolveValue(template.model, values, template.variables ?? {}),
179
- system: template.system === void 0 ? void 0 : resolveValue(template.system, values, template.variables ?? {}),
180
- messages: template.messages.map((message) => resolveValue(message, values, template.variables ?? {})),
181
- mcpServers: resolveMcpServers(template.mcpServers ?? {}, values, template.variables ?? {}),
182
- environment: resolveValue(template.environment ?? {}, values, template.variables ?? {}),
183
- skills: resolveValue(template.skills ?? [], values, template.variables ?? {}),
184
- outputs: {
185
- recommendedPath: "/antpath/outputs",
186
- ...resolveValue(template.outputs ?? {}, values, template.variables ?? {})
187
- },
188
- metadata: resolveValue(template.metadata ?? {}, values, template.variables ?? {}),
189
- credentialRequirements: {}
190
- };
191
- resolved.credentialRequirements = Object.fromEntries(resolved.mcpServers.filter((server) => server.auth).map((server) => [server.key, server.auth]));
192
- scanForSecrets(resolved);
193
- return {
194
- ...resolved,
195
- hash: sha256(stableStringify(resolved))
196
- };
197
- }
198
- function assertTemplateShape(template) {
199
- if (!template.name?.trim()) {
200
- throw new TemplateValidationError("Template name is required");
201
- }
202
- if (!template.model) {
203
- throw new TemplateValidationError("Template model is required");
204
- }
205
- if (!Array.isArray(template.messages) || template.messages.length === 0) {
206
- throw new TemplateValidationError("Template must define at least one user message");
207
- }
208
- for (const [key, server] of Object.entries(template.mcpServers ?? {})) {
209
- if (!/^[A-Za-z0-9_-]+$/.test(key)) {
210
- throw new TemplateValidationError(`MCP server key '${key}' must use letters, numbers, underscores, or hyphens`);
211
- }
212
- if (server.tools?.allow && server.tools.deny) {
213
- throw new TemplateValidationError(`MCP server '${key}' cannot define both allow and deny tool policies`);
214
- }
215
- }
216
- }
217
- function resolveVariableValues(template, variables) {
218
- const definitions = template.variables ?? {};
219
- const resolved = {};
220
- for (const [key, definition] of Object.entries(definitions)) {
221
- const value = variables[key] ?? definition.default;
222
- if (value === void 0) {
223
- continue;
224
- }
225
- if (typeof value !== "string") {
226
- throw new TemplateValidationError(`Variable '${key}' must resolve to a string`);
227
- }
228
- resolved[key] = value;
229
- }
230
- for (const key of Object.keys(variables)) {
231
- if (!definitions[key]) {
232
- throw new TemplateValidationError(`Unknown Template variable '${key}'`);
233
- }
234
- }
235
- return resolved;
236
- }
237
- function resolveMcpServers(servers, values, definitions) {
238
- return Object.entries(servers).map(([key, server]) => {
239
- const resolved = {
240
- key,
241
- name: key,
242
- url: resolveValue(server.url, values, definitions ?? {})
243
- };
244
- if (server.auth)
245
- resolved.auth = server.auth;
246
- if (server.tools)
247
- resolved.tools = resolveValue(server.tools, values, definitions ?? {});
248
- return resolved;
249
- });
250
- }
251
- function resolveValue(value, variables, definitions) {
252
- if (typeof value === "string") {
253
- return resolveString(value, variables, definitions);
254
- }
255
- if (Array.isArray(value)) {
256
- return value.map((item) => resolveValue(item, variables, definitions));
257
- }
258
- if (value && typeof value === "object") {
259
- return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, resolveValue(item, variables, definitions)]));
260
- }
261
- return value;
262
- }
263
- function resolveString(input, variables, definitions) {
264
- const protectedInput = input.replace(/\\{{/g, ESCAPED_OPEN);
265
- const resolved = protectedInput.replace(VARIABLE_PATTERN, (_match, name) => {
266
- if (!definitions[name]) {
267
- throw new TemplateValidationError(`Unresolved Template variable '${name}'`);
268
- }
269
- const value = variables[name];
270
- if (value === void 0) {
271
- throw new TemplateValidationError(`Missing value for Template variable '${name}'`);
272
- }
273
- return value;
274
- });
275
- return resolved.replace(new RegExp(ESCAPED_OPEN, "g"), "{{");
276
- }
277
- function scanForSecrets(value) {
278
- const serialized = stableStringify(value);
279
- if (containsSecretLikeValue(serialized)) {
280
- throw new TemplateValidationError("Template contains a secret-like value; pass secrets through typed credentials instead");
281
- }
282
- }
283
-
284
- // ../shared/dist/template/mapper.js
285
- function toPlatformSubmissionTemplate(resolved) {
286
- const modelId = typeof resolved.model === "string" ? resolved.model : resolved.model.id;
287
- const environment = mapEnvironment(resolved.environment);
288
- const metadata = filterMetadata(resolved.metadata);
289
- const submission = {
290
- name: resolved.name,
291
- model: modelId,
292
- templateHash: resolved.hash,
293
- messages: resolved.messages
294
- };
295
- return {
296
- ...submission,
297
- ...resolved.system ? { system: resolved.system } : {},
298
- ...metadata ? { metadata } : {},
299
- ...environment ? { environment } : {}
300
- };
301
- }
302
- function mapEnvironment(env) {
303
- if (!env)
304
- return void 0;
305
- let networking;
306
- if (env.network) {
307
- if (env.network === "restricted") {
308
- networking = { mode: "limited", allowedHosts: [] };
309
- } else if (env.network === "unrestricted") {
310
- networking = { mode: "open" };
311
- } else if (typeof env.network === "object" && env.network.type === "limited") {
312
- const allowedHosts = env.network.allowedHosts ?? [];
313
- networking = { mode: "limited", allowedHosts };
314
- }
315
- }
316
- let packages;
317
- if (env.packages) {
318
- const collected = [];
319
- for (const [manager, list] of Object.entries(env.packages)) {
320
- if (!list)
321
- continue;
322
- for (const item of list) {
323
- collected.push({ name: `${manager}:${item}` });
324
- }
325
- }
326
- if (collected.length > 0)
327
- packages = collected;
328
- }
329
- if (!networking && !packages)
330
- return void 0;
331
- return {
332
- ...networking ? { networking } : {},
333
- ...packages ? { packages } : {}
334
- };
335
- }
336
- function filterMetadata(metadata) {
337
- if (!metadata)
338
- return void 0;
339
- const entries = Object.entries(metadata);
340
- if (entries.length === 0)
341
- return void 0;
342
- return Object.fromEntries(entries);
343
- }
344
-
345
409
  // ../shared/dist/http.js
346
410
  var HttpClient = class {
347
411
  #baseUrl;
@@ -487,10 +551,11 @@ async function createSkillBundle(http, args) {
487
551
  form.append("name", args.name);
488
552
  const blobBody = toBlob(args.body, args.contentType ?? "application/zip");
489
553
  form.append("bundle", blobBody, args.filename ?? `${args.name}.zip`);
490
- return http.request("/api/skills", {
554
+ const result = await http.request("/api/skills", {
491
555
  method: "POST",
492
556
  body: form
493
557
  });
558
+ return unwrapSkill(result);
494
559
  }
495
560
  async function listSkills(http) {
496
561
  const result = await http.request("/api/skills");
@@ -500,13 +565,20 @@ async function listSkills(http) {
500
565
  return result.skills;
501
566
  }
502
567
  async function getSkill(http, skillId) {
503
- return http.request(`/api/skills/${encodeURIComponent(skillId)}`);
568
+ const result = await http.request(`/api/skills/${encodeURIComponent(skillId)}`);
569
+ return unwrapSkill(result);
504
570
  }
505
571
  async function deleteSkill(http, skillId) {
506
572
  await http.request(`/api/skills/${encodeURIComponent(skillId)}`, {
507
573
  method: "DELETE"
508
574
  });
509
575
  }
576
+ function unwrapSkill(result) {
577
+ if (result && typeof result === "object" && "skill" in result) {
578
+ return result.skill;
579
+ }
580
+ return result;
581
+ }
510
582
  function toBlob(input, contentType) {
511
583
  if (input instanceof Blob) {
512
584
  return input;
@@ -605,8 +677,14 @@ async function refuseInsideManagedRun(io2, verb) {
605
677
  Use \`antpath proxy ...\` to call your declared upstream endpoints from inside the run.
606
678
  `);
607
679
  return true;
608
- } catch {
609
- return false;
680
+ } catch (err2) {
681
+ const code = err2?.code;
682
+ if (code === "ENOENT" || code === "ENOTDIR") {
683
+ return false;
684
+ }
685
+ io2.stderr(`\`antpath ${verb}\` could not determine whether it is running inside a managed run container (error reading ${ANTPATH_INDEX_PATH}: ${err2.message ?? "unknown"}). Refusing to proceed.
686
+ `);
687
+ return true;
610
688
  }
611
689
  }
612
690
  function emitJsonError(io2, code, message, extra = {}) {
@@ -651,6 +729,27 @@ function collectRepeated(rest, flag) {
651
729
  }
652
730
  return { values, remaining, error: null };
653
731
  }
732
+ function collectRepeatedKvList(rest, flag) {
733
+ const entries = [];
734
+ const remaining = [];
735
+ for (let i = 0; i < rest.length; i++) {
736
+ const arg = rest[i];
737
+ if (arg === flag) {
738
+ const kv = rest[++i];
739
+ if (kv === void 0) {
740
+ return { entries, remaining, error: `${flag} requires a KEY=VALUE argument` };
741
+ }
742
+ const eq = kv.indexOf("=");
743
+ if (eq <= 0) {
744
+ return { entries, remaining, error: `${flag} must be in the form KEY=VALUE (got: ${kv})` };
745
+ }
746
+ entries.push([kv.slice(0, eq), kv.slice(eq + 1)]);
747
+ continue;
748
+ }
749
+ remaining.push(arg);
750
+ }
751
+ return { entries, remaining, error: null };
752
+ }
654
753
  function takeFlagValue(rest, flag) {
655
754
  let value = null;
656
755
  const remaining = [];
@@ -772,13 +871,13 @@ async function runProxy(io2, rest) {
772
871
  let parsed;
773
872
  try {
774
873
  parsed = parseProxyFlags(rest);
775
- } catch (err) {
776
- if (err instanceof CliUsageError) {
777
- io2.stderr(`${err.message}
874
+ } catch (err2) {
875
+ if (err2 instanceof CliUsageError) {
876
+ io2.stderr(`${err2.message}
778
877
  `);
779
878
  return USAGE_ERR;
780
879
  }
781
- throw err;
880
+ throw err2;
782
881
  }
783
882
  if (!parsed.ok) {
784
883
  io2.stderr(`${parsed.reason}
@@ -833,8 +932,8 @@ async function runProxy(io2, rest) {
833
932
  if (f.dataSpec !== null) {
834
933
  try {
835
934
  body = await resolveBody(io2, f.dataSpec);
836
- } catch (err) {
837
- io2.stderr(`failed to read request body: ${err.message}
935
+ } catch (err2) {
936
+ io2.stderr(`failed to read request body: ${err2.message}
838
937
  `);
839
938
  return RUNTIME_ERR;
840
939
  }
@@ -868,10 +967,10 @@ async function runProxy(io2, rest) {
868
967
  let response;
869
968
  try {
870
969
  response = await io2.fetchImpl(url, init);
871
- } catch (err) {
970
+ } catch (err2) {
872
971
  emitError(io2, {
873
972
  error: "upstream_error",
874
- message: `proxy request failed: ${err.message}`,
973
+ message: `proxy request failed: ${err2.message}`,
875
974
  endpointName: f.endpointName
876
975
  });
877
976
  return RUNTIME_ERR;
@@ -921,38 +1020,8 @@ async function tryReadManifest(io2) {
921
1020
  }
922
1021
  }
923
1022
 
924
- // dist/host/template.js
925
- import { resolve as resolvePath } from "node:path";
926
- import { pathToFileURL } from "node:url";
927
- async function loadTemplate(io2, filePath, variables) {
928
- const absPath = resolvePath(io2.cwd(), filePath);
929
- const lower = absPath.toLowerCase();
930
- if (lower.endsWith(".json")) {
931
- const text = await io2.readFile(absPath);
932
- const parsed = JSON.parse(text);
933
- return { resolved: ensureResolved(parsed, variables) };
934
- }
935
- if (lower.endsWith(".js") || lower.endsWith(".mjs") || lower.endsWith(".ts")) {
936
- const mod = await import(pathToFileURL(absPath).href);
937
- if (!mod.default) {
938
- throw new Error(`template module ${filePath} must export a default TemplateDefinition`);
939
- }
940
- return { resolved: ensureResolved(mod.default, variables) };
941
- }
942
- throw new Error(`unsupported template extension: ${filePath}. Use .json, .js, .mjs, or .ts.`);
943
- }
944
- function ensureResolved(value, variables) {
945
- if (!value || typeof value !== "object") {
946
- throw new Error("template must be an object");
947
- }
948
- const obj = value;
949
- if (typeof obj.hash === "string" && obj.hash.length > 0) {
950
- return value;
951
- }
952
- return compileTemplate(value, variables);
953
- }
954
-
955
1023
  // dist/host/run-cmd.js
1024
+ import { resolve as resolvePath } from "node:path";
956
1025
  var TERMINAL_STATUSES = /* @__PURE__ */ new Set([
957
1026
  "succeeded",
958
1027
  "failed",
@@ -1002,88 +1071,215 @@ async function runRunCmd(io2, argv) {
1002
1071
  }
1003
1072
  const follow = takeBooleanFlag(rest, "--follow");
1004
1073
  rest = follow.remaining;
1005
- const variables = collectRepeatedKv(rest, "--var");
1006
- if (variables.error) {
1007
- io2.stderr(`${variables.error}
1074
+ const config = takeFlagValue(rest, "--config");
1075
+ if (config.error) {
1076
+ io2.stderr(`${config.error}
1008
1077
  `);
1009
1078
  return USAGE_ERR;
1010
1079
  }
1011
- rest = variables.remaining;
1012
- const mcpServerEntries = collectRepeated(rest, "--mcp-server");
1013
- if (mcpServerEntries.error) {
1014
- io2.stderr(`${mcpServerEntries.error}
1080
+ rest = config.remaining;
1081
+ const modelFlag = takeFlagValue(rest, "--model");
1082
+ if (modelFlag.error) {
1083
+ io2.stderr(`${modelFlag.error}
1015
1084
  `);
1016
1085
  return USAGE_ERR;
1017
1086
  }
1018
- rest = mcpServerEntries.remaining;
1019
- const skillEntries = collectRepeated(rest, "--skill");
1020
- if (skillEntries.error) {
1021
- io2.stderr(`${skillEntries.error}
1087
+ rest = modelFlag.remaining;
1088
+ const systemFlag = takeFlagValue(rest, "--system");
1089
+ if (systemFlag.error) {
1090
+ io2.stderr(`${systemFlag.error}
1022
1091
  `);
1023
1092
  return USAGE_ERR;
1024
1093
  }
1025
- rest = skillEntries.remaining;
1026
- const proxyEndpointEntries = collectRepeated(rest, "--proxy-endpoint");
1027
- if (proxyEndpointEntries.error) {
1028
- io2.stderr(`${proxyEndpointEntries.error}
1094
+ rest = systemFlag.remaining;
1095
+ const promptFlags = collectRepeated(rest, "--prompt");
1096
+ if (promptFlags.error) {
1097
+ io2.stderr(`${promptFlags.error}
1029
1098
  `);
1030
1099
  return USAGE_ERR;
1031
1100
  }
1032
- rest = proxyEndpointEntries.remaining;
1033
- const proxyAuthEntries = collectRepeatedKv(rest, "--proxy-auth");
1034
- if (proxyAuthEntries.error) {
1035
- io2.stderr(`${proxyAuthEntries.error}
1101
+ rest = promptFlags.remaining;
1102
+ const skillFlags = collectRepeated(rest, "--skill");
1103
+ if (skillFlags.error) {
1104
+ io2.stderr(`${skillFlags.error}
1036
1105
  `);
1037
1106
  return USAGE_ERR;
1038
1107
  }
1039
- rest = proxyAuthEntries.remaining;
1040
- const positional = rest.filter((a) => !a.startsWith("--"));
1041
- const unknownFlags = rest.filter((a) => a.startsWith("--"));
1042
- if (unknownFlags.length > 0) {
1043
- io2.stderr(`unknown flag: ${unknownFlags[0]}
1108
+ rest = skillFlags.remaining;
1109
+ const providerSkillFlags = collectRepeated(rest, "--provider-skill");
1110
+ if (providerSkillFlags.error) {
1111
+ io2.stderr(`${providerSkillFlags.error}
1044
1112
  `);
1045
1113
  return USAGE_ERR;
1046
1114
  }
1047
- if (positional.length !== 1) {
1048
- io2.stderr("usage: antpath run <template-path> [flags]\n");
1115
+ rest = providerSkillFlags.remaining;
1116
+ const mcpFlags = collectRepeatedKv(rest, "--mcp");
1117
+ if (mcpFlags.error) {
1118
+ io2.stderr(`${mcpFlags.error}
1119
+ `);
1049
1120
  return USAGE_ERR;
1050
1121
  }
1051
- const templatePath = positional[0];
1052
- let resolved;
1053
- try {
1054
- const load = await loadTemplate(io2, templatePath, variables.entries);
1055
- resolved = load.resolved;
1056
- } catch (err) {
1057
- io2.stderr(`failed to load template: ${err.message}
1122
+ rest = mcpFlags.remaining;
1123
+ const mcpAuthFlags = collectRepeatedKvList(rest, "--mcp-auth");
1124
+ if (mcpAuthFlags.error) {
1125
+ io2.stderr(`${mcpAuthFlags.error}
1058
1126
  `);
1059
1127
  return USAGE_ERR;
1060
1128
  }
1061
- let mcpServers;
1062
- try {
1063
- mcpServers = mcpServerEntries.values.map((raw, i) => parseJsonOrThrow(raw, `--mcp-server[${i}]`));
1064
- } catch (err) {
1065
- io2.stderr(`${err.message}
1129
+ rest = mcpAuthFlags.remaining;
1130
+ const metadataFlags = collectRepeatedKv(rest, "--metadata");
1131
+ if (metadataFlags.error) {
1132
+ io2.stderr(`${metadataFlags.error}
1066
1133
  `);
1067
1134
  return USAGE_ERR;
1068
1135
  }
1069
- let skills;
1070
- try {
1071
- skills = skillEntries.values.map((raw, i) => parseSkillFlag(raw, i));
1072
- } catch (err) {
1073
- io2.stderr(`${err.message}
1136
+ rest = metadataFlags.remaining;
1137
+ const proxyEndpointFlags = collectRepeated(rest, "--proxy-endpoint");
1138
+ if (proxyEndpointFlags.error) {
1139
+ io2.stderr(`${proxyEndpointFlags.error}
1074
1140
  `);
1075
1141
  return USAGE_ERR;
1076
1142
  }
1077
- let proxyEndpoints;
1078
- try {
1079
- proxyEndpoints = proxyEndpointEntries.values.map((raw, i) => parseJsonOrThrow(raw, `--proxy-endpoint[${i}]`));
1080
- } catch (err) {
1081
- io2.stderr(`${err.message}
1143
+ rest = proxyEndpointFlags.remaining;
1144
+ const proxyAuthFlags = collectRepeatedKv(rest, "--proxy-auth");
1145
+ if (proxyAuthFlags.error) {
1146
+ io2.stderr(`${proxyAuthFlags.error}
1147
+ `);
1148
+ return USAGE_ERR;
1149
+ }
1150
+ rest = proxyAuthFlags.remaining;
1151
+ const positional = rest.filter((a) => !a.startsWith("--"));
1152
+ const unknownFlags = rest.filter((a) => a.startsWith("--"));
1153
+ if (unknownFlags.length > 0) {
1154
+ io2.stderr(`unknown flag: ${unknownFlags[0]}
1082
1155
  `);
1083
1156
  return USAGE_ERR;
1084
1157
  }
1158
+ if (positional.length > 0) {
1159
+ io2.stderr(`antpath run takes no positional arguments (got: ${positional.join(" ")})
1160
+ `);
1161
+ return USAGE_ERR;
1162
+ }
1163
+ let blueprint;
1164
+ let mcpHeadersFromConfig = /* @__PURE__ */ new Map();
1165
+ if (config.value) {
1166
+ if (modelFlag.value || systemFlag.value || promptFlags.values.length || skillFlags.values.length || providerSkillFlags.values.length || Object.keys(mcpFlags.entries).length || Object.keys(metadataFlags.entries).length) {
1167
+ io2.stderr("--config cannot be combined with --model/--system/--prompt/--skill/--provider-skill/--mcp/--metadata\n");
1168
+ return USAGE_ERR;
1169
+ }
1170
+ try {
1171
+ const absPath = resolvePath(io2.cwd(), config.value);
1172
+ const text = await io2.readFile(absPath);
1173
+ const raw = JSON.parse(text);
1174
+ const { mcpHeaders, normalised } = stripMcpHeadersForParsing(raw);
1175
+ mcpHeadersFromConfig = mcpHeaders;
1176
+ blueprint = parseBlueprint(normalised);
1177
+ } catch (err2) {
1178
+ io2.stderr(`failed to load --config: ${err2.message}
1179
+ `);
1180
+ return USAGE_ERR;
1181
+ }
1182
+ } else {
1183
+ if (!modelFlag.value) {
1184
+ io2.stderr("--model is required when --config is not provided\n");
1185
+ return USAGE_ERR;
1186
+ }
1187
+ if (promptFlags.values.length === 0) {
1188
+ io2.stderr("--prompt is required (repeatable)\n");
1189
+ return USAGE_ERR;
1190
+ }
1191
+ let resolvedPrompt;
1192
+ try {
1193
+ resolvedPrompt = await Promise.all(promptFlags.values.map((v) => readMaybeFile(io2, v)));
1194
+ } catch (err2) {
1195
+ io2.stderr(`failed to read --prompt file: ${err2.message}
1196
+ `);
1197
+ return USAGE_ERR;
1198
+ }
1199
+ let resolvedSystem;
1200
+ if (systemFlag.value !== null) {
1201
+ try {
1202
+ resolvedSystem = await readMaybeFile(io2, systemFlag.value);
1203
+ } catch (err2) {
1204
+ io2.stderr(`failed to read --system file: ${err2.message}
1205
+ `);
1206
+ return USAGE_ERR;
1207
+ }
1208
+ }
1209
+ let workspaceSkills;
1210
+ let providerSkills;
1211
+ try {
1212
+ workspaceSkills = skillFlags.values.map((v, i) => parseWorkspaceSkillFlag(v, i));
1213
+ providerSkills = providerSkillFlags.values.map((v, i) => parseProviderSkillFlag(v, i));
1214
+ } catch (err2) {
1215
+ io2.stderr(`${err2.message}
1216
+ `);
1217
+ return USAGE_ERR;
1218
+ }
1219
+ const mcpRefs = [];
1220
+ for (const [name, url] of Object.entries(mcpFlags.entries)) {
1221
+ mcpRefs.push({ name, url });
1222
+ }
1223
+ blueprint = {
1224
+ model: modelFlag.value,
1225
+ ...resolvedSystem ? { system: resolvedSystem } : {},
1226
+ prompt: resolvedPrompt,
1227
+ ...workspaceSkills.length + providerSkills.length > 0 ? { skills: [...workspaceSkills, ...providerSkills] } : {},
1228
+ ...mcpRefs.length > 0 ? { mcpServers: mcpRefs } : {},
1229
+ ...Object.keys(metadataFlags.entries).length > 0 ? { metadata: { ...metadataFlags.entries } } : {}
1230
+ };
1231
+ }
1232
+ const mcpServersForSubmission = [...blueprint.mcpServers ?? []];
1233
+ const mcpServerSecrets = [];
1234
+ const mcpHeaderBag = new Map(mcpHeadersFromConfig);
1235
+ for (const [name, headerSpec] of mcpAuthFlags.entries) {
1236
+ const colon = headerSpec.indexOf(":");
1237
+ if (colon <= 0 || colon >= headerSpec.length - 1) {
1238
+ io2.stderr(`--mcp-auth ${name}: expected 'HeaderName:Value' (got: ${headerSpec})
1239
+ `);
1240
+ return USAGE_ERR;
1241
+ }
1242
+ const headerName = headerSpec.slice(0, colon).trim();
1243
+ const headerValue = headerSpec.slice(colon + 1).trim();
1244
+ if (!headerName || !headerValue) {
1245
+ io2.stderr(`--mcp-auth ${name}: header name and value must be non-empty
1246
+ `);
1247
+ return USAGE_ERR;
1248
+ }
1249
+ const existing = mcpHeaderBag.get(name) ?? {};
1250
+ if (Object.prototype.hasOwnProperty.call(existing, headerName)) {
1251
+ io2.stderr(`--mcp-auth ${name}: duplicate header "${headerName}" \u2014 each header may be set only once per server
1252
+ `);
1253
+ return USAGE_ERR;
1254
+ }
1255
+ existing[headerName] = headerValue;
1256
+ mcpHeaderBag.set(name, existing);
1257
+ }
1258
+ for (const ref of mcpServersForSubmission) {
1259
+ const headers = mcpHeaderBag.get(ref.name);
1260
+ if (headers && Object.keys(headers).length > 0) {
1261
+ mcpServerSecrets.push({ name: ref.name, url: ref.url, headers });
1262
+ }
1263
+ }
1264
+ for (const name of mcpHeaderBag.keys()) {
1265
+ if (!mcpServersForSubmission.some((m) => m.name === name)) {
1266
+ io2.stderr(`--mcp-auth ${name}: no matching --mcp / mcpServers entry declared
1267
+ `);
1268
+ return USAGE_ERR;
1269
+ }
1270
+ }
1271
+ let proxyEndpoints = blueprint.proxyEndpoints ?? [];
1272
+ if (proxyEndpointFlags.values.length > 0) {
1273
+ try {
1274
+ proxyEndpoints = proxyEndpointFlags.values.map((raw, i) => parseJsonOrThrow(raw, `--proxy-endpoint[${i}]`));
1275
+ } catch (err2) {
1276
+ io2.stderr(`${err2.message}
1277
+ `);
1278
+ return USAGE_ERR;
1279
+ }
1280
+ }
1085
1281
  const proxyAuth = [];
1086
- for (const [name, spec] of Object.entries(proxyAuthEntries.entries)) {
1282
+ for (const [name, spec] of Object.entries(proxyAuthFlags.entries)) {
1087
1283
  const parsed = parseProxyAuth(spec);
1088
1284
  if (!parsed.ok) {
1089
1285
  io2.stderr(`--proxy-auth ${name}: ${parsed.reason}
@@ -1095,31 +1291,42 @@ async function runRunCmd(io2, argv) {
1095
1291
  if (proxyEndpoints.length > 0) {
1096
1292
  try {
1097
1293
  validateProxyAuth(proxyEndpoints, proxyAuth);
1098
- } catch (err) {
1099
- io2.stderr(`proxy auth validation failed: ${err.message}
1294
+ } catch (err2) {
1295
+ io2.stderr(`proxy auth validation failed: ${err2.message}
1100
1296
  `);
1101
1297
  return USAGE_ERR;
1102
1298
  }
1103
1299
  }
1300
+ const promptArray = Array.isArray(blueprint.prompt) ? [...blueprint.prompt] : [blueprint.prompt];
1301
+ const skills = blueprint.skills ? [...blueprint.skills] : [];
1302
+ const submission = {
1303
+ model: blueprint.model,
1304
+ ...blueprint.system ? { system: blueprint.system } : {},
1305
+ prompt: promptArray,
1306
+ skills,
1307
+ mcpServers: mcpServersForSubmission,
1308
+ ...blueprint.environment ? { environment: blueprint.environment } : {},
1309
+ ...blueprint.metadata ? { metadata: blueprint.metadata } : {}
1310
+ };
1104
1311
  const secrets = {
1105
1312
  anthropic: { apiKey: anthropicKey.value },
1106
- ...mcpServers.length ? { mcpServers } : {},
1107
- ...skills.length ? { skills } : {},
1108
- ...proxyAuth.length ? { proxyEndpointAuth: proxyAuth } : {}
1313
+ ...mcpServerSecrets.length > 0 ? { mcpServers: mcpServerSecrets } : {},
1314
+ ...proxyAuth.length > 0 ? { proxyEndpointAuth: proxyAuth } : {}
1109
1315
  };
1110
- const submission = {
1316
+ const request = {
1111
1317
  idempotencyKey: idempotency.value ?? generateIdempotencyKey(),
1112
- template: toPlatformSubmissionTemplate(resolved),
1318
+ submission,
1113
1319
  secrets,
1114
1320
  ...cleanup.value ? { cleanup: { session: cleanup.value } } : {},
1115
- ...proxyEndpoints.length ? { proxyEndpoints } : {}
1321
+ ...blueprint.cleanup && !cleanup.value ? { cleanup: blueprint.cleanup } : {},
1322
+ ...proxyEndpoints.length > 0 ? { proxyEndpoints } : {}
1116
1323
  };
1117
1324
  const http = makeHttpClient(io2, common.flags);
1118
1325
  let run;
1119
1326
  try {
1120
- run = await operations_exports.submitRun(http, submission);
1121
- } catch (err) {
1122
- return emitJsonError(io2, "submit_failed", err.message ?? "submission failed");
1327
+ run = await operations_exports.submitRunFlat(http, request);
1328
+ } catch (err2) {
1329
+ return emitJsonError(io2, "submit_failed", err2.message ?? "submission failed");
1123
1330
  }
1124
1331
  io2.stdout(JSON.stringify(run) + "\n");
1125
1332
  if (!follow.present)
@@ -1134,15 +1341,15 @@ async function runRunCmd(io2, argv) {
1134
1341
  io2.stdout(JSON.stringify(events[i]) + "\n");
1135
1342
  }
1136
1343
  emittedEventCount = events.length;
1137
- } catch (err) {
1138
- io2.stderr(`(transient) event poll failed: ${err.message}
1344
+ } catch (err2) {
1345
+ io2.stderr(`(transient) event poll failed: ${err2.message}
1139
1346
  `);
1140
1347
  }
1141
1348
  try {
1142
1349
  const updated = await operations_exports.getRun(http, run.id);
1143
1350
  currentStatus = updated.status;
1144
- } catch (err) {
1145
- io2.stderr(`(transient) status poll failed: ${err.message}
1351
+ } catch (err2) {
1352
+ io2.stderr(`(transient) status poll failed: ${err2.message}
1146
1353
  `);
1147
1354
  }
1148
1355
  }
@@ -1150,8 +1357,8 @@ async function runRunCmd(io2, argv) {
1150
1357
  const final = await operations_exports.getRun(http, run.id);
1151
1358
  io2.stdout(JSON.stringify(final) + "\n");
1152
1359
  return final.status === "succeeded" ? SUCCESS : RUNTIME_ERR;
1153
- } catch (err) {
1154
- io2.stderr(`final status fetch failed: ${err.message}
1360
+ } catch (err2) {
1361
+ io2.stderr(`final status fetch failed: ${err2.message}
1155
1362
  `);
1156
1363
  return RUNTIME_ERR;
1157
1364
  }
@@ -1162,55 +1369,103 @@ function parseProxyAuth(spec) {
1162
1369
  return { ok: false, reason: `expected '<type>:<value>' (got: ${spec})` };
1163
1370
  }
1164
1371
  const type = spec.slice(0, idx);
1165
- const rest = spec.slice(idx + 1);
1372
+ const restValue = spec.slice(idx + 1);
1166
1373
  switch (type) {
1167
1374
  case "bearer":
1168
- if (!rest)
1375
+ if (!restValue)
1169
1376
  return { ok: false, reason: "bearer requires a token value" };
1170
- return { ok: true, value: { type: "bearer", token: rest } };
1377
+ return { ok: true, value: { type: "bearer", token: restValue } };
1171
1378
  case "header":
1172
- if (!rest)
1379
+ if (!restValue)
1173
1380
  return { ok: false, reason: "header requires a value" };
1174
- return { ok: true, value: { type: "header", value: rest } };
1381
+ return { ok: true, value: { type: "header", value: restValue } };
1175
1382
  case "query":
1176
- if (!rest)
1383
+ if (!restValue)
1177
1384
  return { ok: false, reason: "query requires a value" };
1178
- return { ok: true, value: { type: "query", value: rest } };
1385
+ return { ok: true, value: { type: "query", value: restValue } };
1179
1386
  case "basic": {
1180
- const sep = rest.indexOf(":");
1181
- if (sep <= 0 || sep >= rest.length - 1) {
1387
+ const sep2 = restValue.indexOf(":");
1388
+ if (sep2 <= 0 || sep2 >= restValue.length - 1) {
1182
1389
  return { ok: false, reason: "basic requires <username>:<password>" };
1183
1390
  }
1184
1391
  return {
1185
1392
  ok: true,
1186
- value: { type: "basic", username: rest.slice(0, sep), password: rest.slice(sep + 1) }
1393
+ value: { type: "basic", username: restValue.slice(0, sep2), password: restValue.slice(sep2 + 1) }
1187
1394
  };
1188
1395
  }
1189
1396
  default:
1190
1397
  return { ok: false, reason: `unknown auth type '${type}' (expected bearer|basic|header|query)` };
1191
1398
  }
1192
1399
  }
1193
- function parseSkillFlag(raw, idx) {
1194
- if (raw.trim().startsWith("{")) {
1195
- return parseJsonOrThrow(raw, `--skill[${idx}]`);
1196
- }
1197
- const sep = raw.indexOf(":");
1198
- if (sep === -1) {
1199
- return { skillId: raw };
1200
- }
1201
- const skillId = raw.slice(0, sep);
1202
- const version = raw.slice(sep + 1);
1203
- if (!skillId || !version) {
1204
- throw new Error(`--skill[${idx}] must be 'skillId' or 'skillId:version' (got: ${raw})`);
1205
- }
1206
- return { skillId, version };
1207
- }
1208
1400
  function parseJsonOrThrow(raw, label) {
1209
1401
  try {
1210
1402
  return JSON.parse(raw);
1211
- } catch (err) {
1212
- throw new Error(`${label} is not valid JSON: ${err.message}`);
1403
+ } catch (err2) {
1404
+ throw new Error(`${label} is not valid JSON: ${err2.message}`);
1405
+ }
1406
+ }
1407
+ function parseWorkspaceSkillFlag(raw, idx) {
1408
+ if (!raw) {
1409
+ throw new Error(`--skill[${idx}] must be a non-empty skill id`);
1410
+ }
1411
+ return { kind: "workspace", id: raw };
1412
+ }
1413
+ function parseProviderSkillFlag(raw, idx) {
1414
+ const parts = raw.split(":");
1415
+ if (parts.length < 2 || parts.length > 3) {
1416
+ throw new Error(`--provider-skill[${idx}] must be 'vendor:skillId[:version]' (got: ${raw})`);
1417
+ }
1418
+ const vendor = parts[0];
1419
+ const skillId = parts[1];
1420
+ const version = parts[2];
1421
+ if (vendor !== "anthropic" && vendor !== "custom") {
1422
+ throw new Error(`--provider-skill[${idx}] vendor must be 'anthropic' or 'custom' (got: ${vendor})`);
1423
+ }
1424
+ if (!skillId) {
1425
+ throw new Error(`--provider-skill[${idx}] skillId is required`);
1426
+ }
1427
+ return version ? { kind: "provider", vendor, skillId, version } : { kind: "provider", vendor, skillId };
1428
+ }
1429
+ function stripMcpHeadersForParsing(input) {
1430
+ const mcpHeaders = /* @__PURE__ */ new Map();
1431
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
1432
+ return { normalised: input, mcpHeaders };
1433
+ }
1434
+ const record = input;
1435
+ if (!Array.isArray(record.mcpServers)) {
1436
+ return { normalised: input, mcpHeaders };
1437
+ }
1438
+ const stripped = record.mcpServers.map((entry, i) => {
1439
+ if (!entry || typeof entry !== "object")
1440
+ return entry;
1441
+ const r = entry;
1442
+ if (r.headers && typeof r.headers === "object" && !Array.isArray(r.headers)) {
1443
+ const name = typeof r.name === "string" ? r.name : `__index_${i}__`;
1444
+ const headerObj = {};
1445
+ for (const [k, v] of Object.entries(r.headers)) {
1446
+ if (typeof v !== "string") {
1447
+ throw new Error(`mcpServers[${i}].headers["${k}"] must be a string`);
1448
+ }
1449
+ headerObj[k] = v;
1450
+ }
1451
+ mcpHeaders.set(name, headerObj);
1452
+ const { headers: _omit, ...rest } = r;
1453
+ void _omit;
1454
+ return rest;
1455
+ }
1456
+ return r;
1457
+ });
1458
+ return { normalised: { ...record, mcpServers: stripped }, mcpHeaders };
1459
+ }
1460
+ async function readMaybeFile(io2, value) {
1461
+ if (value.startsWith("@@")) {
1462
+ return value.slice(1);
1463
+ }
1464
+ if (value.startsWith("@")) {
1465
+ const path = resolvePath(io2.cwd(), value.slice(1));
1466
+ return io2.readFile(path);
1213
1467
  }
1468
+ return value;
1214
1469
  }
1215
1470
  function generateIdempotencyKey() {
1216
1471
  const c = globalThis.crypto;
@@ -1222,6 +1477,1000 @@ function sleep(ms) {
1222
1477
  return new Promise((resolve) => setTimeout(resolve, ms));
1223
1478
  }
1224
1479
 
1480
+ // dist/host/skills-cmd.js
1481
+ import { readFile, readdir, stat } from "node:fs/promises";
1482
+ import { basename, join, posix, relative, resolve as resolvePath2, sep } from "node:path";
1483
+
1484
+ // ../../node_modules/.pnpm/fflate@0.8.2/node_modules/fflate/esm/index.mjs
1485
+ import { createRequire } from "module";
1486
+ var require2 = createRequire("/");
1487
+ var Worker;
1488
+ try {
1489
+ Worker = require2("worker_threads").Worker;
1490
+ } catch (e) {
1491
+ }
1492
+ var u8 = Uint8Array;
1493
+ var u16 = Uint16Array;
1494
+ var i32 = Int32Array;
1495
+ var fleb = new u8([
1496
+ 0,
1497
+ 0,
1498
+ 0,
1499
+ 0,
1500
+ 0,
1501
+ 0,
1502
+ 0,
1503
+ 0,
1504
+ 1,
1505
+ 1,
1506
+ 1,
1507
+ 1,
1508
+ 2,
1509
+ 2,
1510
+ 2,
1511
+ 2,
1512
+ 3,
1513
+ 3,
1514
+ 3,
1515
+ 3,
1516
+ 4,
1517
+ 4,
1518
+ 4,
1519
+ 4,
1520
+ 5,
1521
+ 5,
1522
+ 5,
1523
+ 5,
1524
+ 0,
1525
+ /* unused */
1526
+ 0,
1527
+ 0,
1528
+ /* impossible */
1529
+ 0
1530
+ ]);
1531
+ var fdeb = new u8([
1532
+ 0,
1533
+ 0,
1534
+ 0,
1535
+ 0,
1536
+ 1,
1537
+ 1,
1538
+ 2,
1539
+ 2,
1540
+ 3,
1541
+ 3,
1542
+ 4,
1543
+ 4,
1544
+ 5,
1545
+ 5,
1546
+ 6,
1547
+ 6,
1548
+ 7,
1549
+ 7,
1550
+ 8,
1551
+ 8,
1552
+ 9,
1553
+ 9,
1554
+ 10,
1555
+ 10,
1556
+ 11,
1557
+ 11,
1558
+ 12,
1559
+ 12,
1560
+ 13,
1561
+ 13,
1562
+ /* unused */
1563
+ 0,
1564
+ 0
1565
+ ]);
1566
+ var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
1567
+ var freb = function(eb, start) {
1568
+ var b = new u16(31);
1569
+ for (var i = 0; i < 31; ++i) {
1570
+ b[i] = start += 1 << eb[i - 1];
1571
+ }
1572
+ var r = new i32(b[30]);
1573
+ for (var i = 1; i < 30; ++i) {
1574
+ for (var j = b[i]; j < b[i + 1]; ++j) {
1575
+ r[j] = j - b[i] << 5 | i;
1576
+ }
1577
+ }
1578
+ return { b, r };
1579
+ };
1580
+ var _a = freb(fleb, 2);
1581
+ var fl = _a.b;
1582
+ var revfl = _a.r;
1583
+ fl[28] = 258, revfl[258] = 28;
1584
+ var _b = freb(fdeb, 0);
1585
+ var fd = _b.b;
1586
+ var revfd = _b.r;
1587
+ var rev = new u16(32768);
1588
+ for (i = 0; i < 32768; ++i) {
1589
+ x = (i & 43690) >> 1 | (i & 21845) << 1;
1590
+ x = (x & 52428) >> 2 | (x & 13107) << 2;
1591
+ x = (x & 61680) >> 4 | (x & 3855) << 4;
1592
+ rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
1593
+ }
1594
+ var x;
1595
+ var i;
1596
+ var hMap = (function(cd, mb, r) {
1597
+ var s = cd.length;
1598
+ var i = 0;
1599
+ var l = new u16(mb);
1600
+ for (; i < s; ++i) {
1601
+ if (cd[i])
1602
+ ++l[cd[i] - 1];
1603
+ }
1604
+ var le = new u16(mb);
1605
+ for (i = 1; i < mb; ++i) {
1606
+ le[i] = le[i - 1] + l[i - 1] << 1;
1607
+ }
1608
+ var co;
1609
+ if (r) {
1610
+ co = new u16(1 << mb);
1611
+ var rvb = 15 - mb;
1612
+ for (i = 0; i < s; ++i) {
1613
+ if (cd[i]) {
1614
+ var sv = i << 4 | cd[i];
1615
+ var r_1 = mb - cd[i];
1616
+ var v = le[cd[i] - 1]++ << r_1;
1617
+ for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
1618
+ co[rev[v] >> rvb] = sv;
1619
+ }
1620
+ }
1621
+ }
1622
+ } else {
1623
+ co = new u16(s);
1624
+ for (i = 0; i < s; ++i) {
1625
+ if (cd[i]) {
1626
+ co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
1627
+ }
1628
+ }
1629
+ }
1630
+ return co;
1631
+ });
1632
+ var flt = new u8(288);
1633
+ for (i = 0; i < 144; ++i)
1634
+ flt[i] = 8;
1635
+ var i;
1636
+ for (i = 144; i < 256; ++i)
1637
+ flt[i] = 9;
1638
+ var i;
1639
+ for (i = 256; i < 280; ++i)
1640
+ flt[i] = 7;
1641
+ var i;
1642
+ for (i = 280; i < 288; ++i)
1643
+ flt[i] = 8;
1644
+ var i;
1645
+ var fdt = new u8(32);
1646
+ for (i = 0; i < 32; ++i)
1647
+ fdt[i] = 5;
1648
+ var i;
1649
+ var flm = /* @__PURE__ */ hMap(flt, 9, 0);
1650
+ var fdm = /* @__PURE__ */ hMap(fdt, 5, 0);
1651
+ var shft = function(p) {
1652
+ return (p + 7) / 8 | 0;
1653
+ };
1654
+ var slc = function(v, s, e) {
1655
+ if (s == null || s < 0)
1656
+ s = 0;
1657
+ if (e == null || e > v.length)
1658
+ e = v.length;
1659
+ return new u8(v.subarray(s, e));
1660
+ };
1661
+ var ec = [
1662
+ "unexpected EOF",
1663
+ "invalid block type",
1664
+ "invalid length/literal",
1665
+ "invalid distance",
1666
+ "stream finished",
1667
+ "no stream handler",
1668
+ ,
1669
+ "no callback",
1670
+ "invalid UTF-8 data",
1671
+ "extra field too long",
1672
+ "date not in range 1980-2099",
1673
+ "filename too long",
1674
+ "stream finishing",
1675
+ "invalid zip data"
1676
+ // determined by unknown compression method
1677
+ ];
1678
+ var err = function(ind, msg, nt) {
1679
+ var e = new Error(msg || ec[ind]);
1680
+ e.code = ind;
1681
+ if (Error.captureStackTrace)
1682
+ Error.captureStackTrace(e, err);
1683
+ if (!nt)
1684
+ throw e;
1685
+ return e;
1686
+ };
1687
+ var wbits = function(d, p, v) {
1688
+ v <<= p & 7;
1689
+ var o = p / 8 | 0;
1690
+ d[o] |= v;
1691
+ d[o + 1] |= v >> 8;
1692
+ };
1693
+ var wbits16 = function(d, p, v) {
1694
+ v <<= p & 7;
1695
+ var o = p / 8 | 0;
1696
+ d[o] |= v;
1697
+ d[o + 1] |= v >> 8;
1698
+ d[o + 2] |= v >> 16;
1699
+ };
1700
+ var hTree = function(d, mb) {
1701
+ var t = [];
1702
+ for (var i = 0; i < d.length; ++i) {
1703
+ if (d[i])
1704
+ t.push({ s: i, f: d[i] });
1705
+ }
1706
+ var s = t.length;
1707
+ var t2 = t.slice();
1708
+ if (!s)
1709
+ return { t: et, l: 0 };
1710
+ if (s == 1) {
1711
+ var v = new u8(t[0].s + 1);
1712
+ v[t[0].s] = 1;
1713
+ return { t: v, l: 1 };
1714
+ }
1715
+ t.sort(function(a, b) {
1716
+ return a.f - b.f;
1717
+ });
1718
+ t.push({ s: -1, f: 25001 });
1719
+ var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;
1720
+ t[0] = { s: -1, f: l.f + r.f, l, r };
1721
+ while (i1 != s - 1) {
1722
+ l = t[t[i0].f < t[i2].f ? i0++ : i2++];
1723
+ r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];
1724
+ t[i1++] = { s: -1, f: l.f + r.f, l, r };
1725
+ }
1726
+ var maxSym = t2[0].s;
1727
+ for (var i = 1; i < s; ++i) {
1728
+ if (t2[i].s > maxSym)
1729
+ maxSym = t2[i].s;
1730
+ }
1731
+ var tr = new u16(maxSym + 1);
1732
+ var mbt = ln(t[i1 - 1], tr, 0);
1733
+ if (mbt > mb) {
1734
+ var i = 0, dt = 0;
1735
+ var lft = mbt - mb, cst = 1 << lft;
1736
+ t2.sort(function(a, b) {
1737
+ return tr[b.s] - tr[a.s] || a.f - b.f;
1738
+ });
1739
+ for (; i < s; ++i) {
1740
+ var i2_1 = t2[i].s;
1741
+ if (tr[i2_1] > mb) {
1742
+ dt += cst - (1 << mbt - tr[i2_1]);
1743
+ tr[i2_1] = mb;
1744
+ } else
1745
+ break;
1746
+ }
1747
+ dt >>= lft;
1748
+ while (dt > 0) {
1749
+ var i2_2 = t2[i].s;
1750
+ if (tr[i2_2] < mb)
1751
+ dt -= 1 << mb - tr[i2_2]++ - 1;
1752
+ else
1753
+ ++i;
1754
+ }
1755
+ for (; i >= 0 && dt; --i) {
1756
+ var i2_3 = t2[i].s;
1757
+ if (tr[i2_3] == mb) {
1758
+ --tr[i2_3];
1759
+ ++dt;
1760
+ }
1761
+ }
1762
+ mbt = mb;
1763
+ }
1764
+ return { t: new u8(tr), l: mbt };
1765
+ };
1766
+ var ln = function(n, l, d) {
1767
+ return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
1768
+ };
1769
+ var lc = function(c) {
1770
+ var s = c.length;
1771
+ while (s && !c[--s])
1772
+ ;
1773
+ var cl = new u16(++s);
1774
+ var cli = 0, cln = c[0], cls = 1;
1775
+ var w = function(v) {
1776
+ cl[cli++] = v;
1777
+ };
1778
+ for (var i = 1; i <= s; ++i) {
1779
+ if (c[i] == cln && i != s)
1780
+ ++cls;
1781
+ else {
1782
+ if (!cln && cls > 2) {
1783
+ for (; cls > 138; cls -= 138)
1784
+ w(32754);
1785
+ if (cls > 2) {
1786
+ w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
1787
+ cls = 0;
1788
+ }
1789
+ } else if (cls > 3) {
1790
+ w(cln), --cls;
1791
+ for (; cls > 6; cls -= 6)
1792
+ w(8304);
1793
+ if (cls > 2)
1794
+ w(cls - 3 << 5 | 8208), cls = 0;
1795
+ }
1796
+ while (cls--)
1797
+ w(cln);
1798
+ cls = 1;
1799
+ cln = c[i];
1800
+ }
1801
+ }
1802
+ return { c: cl.subarray(0, cli), n: s };
1803
+ };
1804
+ var clen = function(cf, cl) {
1805
+ var l = 0;
1806
+ for (var i = 0; i < cl.length; ++i)
1807
+ l += cf[i] * cl[i];
1808
+ return l;
1809
+ };
1810
+ var wfblk = function(out, pos, dat) {
1811
+ var s = dat.length;
1812
+ var o = shft(pos + 2);
1813
+ out[o] = s & 255;
1814
+ out[o + 1] = s >> 8;
1815
+ out[o + 2] = out[o] ^ 255;
1816
+ out[o + 3] = out[o + 1] ^ 255;
1817
+ for (var i = 0; i < s; ++i)
1818
+ out[o + i + 4] = dat[i];
1819
+ return (o + 4 + s) * 8;
1820
+ };
1821
+ var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
1822
+ wbits(out, p++, final);
1823
+ ++lf[256];
1824
+ var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l;
1825
+ var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l;
1826
+ var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
1827
+ var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
1828
+ var lcfreq = new u16(19);
1829
+ for (var i = 0; i < lclt.length; ++i)
1830
+ ++lcfreq[lclt[i] & 31];
1831
+ for (var i = 0; i < lcdt.length; ++i)
1832
+ ++lcfreq[lcdt[i] & 31];
1833
+ var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
1834
+ var nlcc = 19;
1835
+ for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
1836
+ ;
1837
+ var flen = bl + 5 << 3;
1838
+ var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
1839
+ var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
1840
+ if (bs >= 0 && flen <= ftlen && flen <= dtlen)
1841
+ return wfblk(out, p, dat.subarray(bs, bs + bl));
1842
+ var lm, ll, dm, dl;
1843
+ wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
1844
+ if (dtlen < ftlen) {
1845
+ lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;
1846
+ var llm = hMap(lct, mlcb, 0);
1847
+ wbits(out, p, nlc - 257);
1848
+ wbits(out, p + 5, ndc - 1);
1849
+ wbits(out, p + 10, nlcc - 4);
1850
+ p += 14;
1851
+ for (var i = 0; i < nlcc; ++i)
1852
+ wbits(out, p + 3 * i, lct[clim[i]]);
1853
+ p += 3 * nlcc;
1854
+ var lcts = [lclt, lcdt];
1855
+ for (var it = 0; it < 2; ++it) {
1856
+ var clct = lcts[it];
1857
+ for (var i = 0; i < clct.length; ++i) {
1858
+ var len = clct[i] & 31;
1859
+ wbits(out, p, llm[len]), p += lct[len];
1860
+ if (len > 15)
1861
+ wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12;
1862
+ }
1863
+ }
1864
+ } else {
1865
+ lm = flm, ll = flt, dm = fdm, dl = fdt;
1866
+ }
1867
+ for (var i = 0; i < li; ++i) {
1868
+ var sym = syms[i];
1869
+ if (sym > 255) {
1870
+ var len = sym >> 18 & 31;
1871
+ wbits16(out, p, lm[len + 257]), p += ll[len + 257];
1872
+ if (len > 7)
1873
+ wbits(out, p, sym >> 23 & 31), p += fleb[len];
1874
+ var dst = sym & 31;
1875
+ wbits16(out, p, dm[dst]), p += dl[dst];
1876
+ if (dst > 3)
1877
+ wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst];
1878
+ } else {
1879
+ wbits16(out, p, lm[sym]), p += ll[sym];
1880
+ }
1881
+ }
1882
+ wbits16(out, p, lm[256]);
1883
+ return p + ll[256];
1884
+ };
1885
+ var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
1886
+ var et = /* @__PURE__ */ new u8(0);
1887
+ var dflt = function(dat, lvl, plvl, pre, post, st) {
1888
+ var s = st.z || dat.length;
1889
+ var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
1890
+ var w = o.subarray(pre, o.length - post);
1891
+ var lst = st.l;
1892
+ var pos = (st.r || 0) & 7;
1893
+ if (lvl) {
1894
+ if (pos)
1895
+ w[0] = st.r >> 3;
1896
+ var opt = deo[lvl - 1];
1897
+ var n = opt >> 13, c = opt & 8191;
1898
+ var msk_1 = (1 << plvl) - 1;
1899
+ var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);
1900
+ var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
1901
+ var hsh = function(i2) {
1902
+ return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;
1903
+ };
1904
+ var syms = new i32(25e3);
1905
+ var lf = new u16(288), df = new u16(32);
1906
+ var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
1907
+ for (; i + 2 < s; ++i) {
1908
+ var hv = hsh(i);
1909
+ var imod = i & 32767, pimod = head[hv];
1910
+ prev[imod] = pimod;
1911
+ head[hv] = imod;
1912
+ if (wi <= i) {
1913
+ var rem = s - i;
1914
+ if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
1915
+ pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);
1916
+ li = lc_1 = eb = 0, bs = i;
1917
+ for (var j = 0; j < 286; ++j)
1918
+ lf[j] = 0;
1919
+ for (var j = 0; j < 30; ++j)
1920
+ df[j] = 0;
1921
+ }
1922
+ var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
1923
+ if (rem > 2 && hv == hsh(i - dif)) {
1924
+ var maxn = Math.min(n, rem) - 1;
1925
+ var maxd = Math.min(32767, i);
1926
+ var ml = Math.min(258, rem);
1927
+ while (dif <= maxd && --ch_1 && imod != pimod) {
1928
+ if (dat[i + l] == dat[i + l - dif]) {
1929
+ var nl = 0;
1930
+ for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)
1931
+ ;
1932
+ if (nl > l) {
1933
+ l = nl, d = dif;
1934
+ if (nl > maxn)
1935
+ break;
1936
+ var mmd = Math.min(dif, nl - 2);
1937
+ var md = 0;
1938
+ for (var j = 0; j < mmd; ++j) {
1939
+ var ti = i - dif + j & 32767;
1940
+ var pti = prev[ti];
1941
+ var cd = ti - pti & 32767;
1942
+ if (cd > md)
1943
+ md = cd, pimod = ti;
1944
+ }
1945
+ }
1946
+ }
1947
+ imod = pimod, pimod = prev[imod];
1948
+ dif += imod - pimod & 32767;
1949
+ }
1950
+ }
1951
+ if (d) {
1952
+ syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
1953
+ var lin = revfl[l] & 31, din = revfd[d] & 31;
1954
+ eb += fleb[lin] + fdeb[din];
1955
+ ++lf[257 + lin];
1956
+ ++df[din];
1957
+ wi = i + l;
1958
+ ++lc_1;
1959
+ } else {
1960
+ syms[li++] = dat[i];
1961
+ ++lf[dat[i]];
1962
+ }
1963
+ }
1964
+ }
1965
+ for (i = Math.max(i, wi); i < s; ++i) {
1966
+ syms[li++] = dat[i];
1967
+ ++lf[dat[i]];
1968
+ }
1969
+ pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);
1970
+ if (!lst) {
1971
+ st.r = pos & 7 | w[pos / 8 | 0] << 3;
1972
+ pos -= 7;
1973
+ st.h = head, st.p = prev, st.i = i, st.w = wi;
1974
+ }
1975
+ } else {
1976
+ for (var i = st.w || 0; i < s + lst; i += 65535) {
1977
+ var e = i + 65535;
1978
+ if (e >= s) {
1979
+ w[pos / 8 | 0] = lst;
1980
+ e = s;
1981
+ }
1982
+ pos = wfblk(w, pos + 1, dat.subarray(i, e));
1983
+ }
1984
+ st.i = s;
1985
+ }
1986
+ return slc(o, 0, pre + shft(pos) + post);
1987
+ };
1988
+ var crct = /* @__PURE__ */ (function() {
1989
+ var t = new Int32Array(256);
1990
+ for (var i = 0; i < 256; ++i) {
1991
+ var c = i, k = 9;
1992
+ while (--k)
1993
+ c = (c & 1 && -306674912) ^ c >>> 1;
1994
+ t[i] = c;
1995
+ }
1996
+ return t;
1997
+ })();
1998
+ var crc = function() {
1999
+ var c = -1;
2000
+ return {
2001
+ p: function(d) {
2002
+ var cr = c;
2003
+ for (var i = 0; i < d.length; ++i)
2004
+ cr = crct[cr & 255 ^ d[i]] ^ cr >>> 8;
2005
+ c = cr;
2006
+ },
2007
+ d: function() {
2008
+ return ~c;
2009
+ }
2010
+ };
2011
+ };
2012
+ var dopt = function(dat, opt, pre, post, st) {
2013
+ if (!st) {
2014
+ st = { l: 1 };
2015
+ if (opt.dictionary) {
2016
+ var dict = opt.dictionary.subarray(-32768);
2017
+ var newDat = new u8(dict.length + dat.length);
2018
+ newDat.set(dict);
2019
+ newDat.set(dat, dict.length);
2020
+ dat = newDat;
2021
+ st.w = dict.length;
2022
+ }
2023
+ }
2024
+ return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20 : 12 + opt.mem, pre, post, st);
2025
+ };
2026
+ var mrg = function(a, b) {
2027
+ var o = {};
2028
+ for (var k in a)
2029
+ o[k] = a[k];
2030
+ for (var k in b)
2031
+ o[k] = b[k];
2032
+ return o;
2033
+ };
2034
+ var wbytes = function(d, b, v) {
2035
+ for (; v; ++b)
2036
+ d[b] = v, v >>>= 8;
2037
+ };
2038
+ function deflateSync(data, opts) {
2039
+ return dopt(data, opts || {}, 0, 0);
2040
+ }
2041
+ var fltn = function(d, p, t, o) {
2042
+ for (var k in d) {
2043
+ var val = d[k], n = p + k, op = o;
2044
+ if (Array.isArray(val))
2045
+ op = mrg(o, val[1]), val = val[0];
2046
+ if (val instanceof u8)
2047
+ t[n] = [val, op];
2048
+ else {
2049
+ t[n += "/"] = [new u8(0), op];
2050
+ fltn(val, n, t, o);
2051
+ }
2052
+ }
2053
+ };
2054
+ var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder();
2055
+ var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
2056
+ var tds = 0;
2057
+ try {
2058
+ td.decode(et, { stream: true });
2059
+ tds = 1;
2060
+ } catch (e) {
2061
+ }
2062
+ function strToU8(str, latin1) {
2063
+ if (latin1) {
2064
+ var ar_1 = new u8(str.length);
2065
+ for (var i = 0; i < str.length; ++i)
2066
+ ar_1[i] = str.charCodeAt(i);
2067
+ return ar_1;
2068
+ }
2069
+ if (te)
2070
+ return te.encode(str);
2071
+ var l = str.length;
2072
+ var ar = new u8(str.length + (str.length >> 1));
2073
+ var ai = 0;
2074
+ var w = function(v) {
2075
+ ar[ai++] = v;
2076
+ };
2077
+ for (var i = 0; i < l; ++i) {
2078
+ if (ai + 5 > ar.length) {
2079
+ var n = new u8(ai + 8 + (l - i << 1));
2080
+ n.set(ar);
2081
+ ar = n;
2082
+ }
2083
+ var c = str.charCodeAt(i);
2084
+ if (c < 128 || latin1)
2085
+ w(c);
2086
+ else if (c < 2048)
2087
+ w(192 | c >> 6), w(128 | c & 63);
2088
+ else if (c > 55295 && c < 57344)
2089
+ c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63);
2090
+ else
2091
+ w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63);
2092
+ }
2093
+ return slc(ar, 0, ai);
2094
+ }
2095
+ var exfl = function(ex) {
2096
+ var le = 0;
2097
+ if (ex) {
2098
+ for (var k in ex) {
2099
+ var l = ex[k].length;
2100
+ if (l > 65535)
2101
+ err(9);
2102
+ le += l + 4;
2103
+ }
2104
+ }
2105
+ return le;
2106
+ };
2107
+ var wzh = function(d, b, f, fn, u, c, ce, co) {
2108
+ var fl2 = fn.length, ex = f.extra, col = co && co.length;
2109
+ var exl = exfl(ex);
2110
+ wbytes(d, b, ce != null ? 33639248 : 67324752), b += 4;
2111
+ if (ce != null)
2112
+ d[b++] = 20, d[b++] = f.os;
2113
+ d[b] = 20, b += 2;
2114
+ d[b++] = f.flag << 1 | (c < 0 && 8), d[b++] = u && 8;
2115
+ d[b++] = f.compression & 255, d[b++] = f.compression >> 8;
2116
+ var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;
2117
+ if (y < 0 || y > 119)
2118
+ err(10);
2119
+ wbytes(d, b, y << 25 | dt.getMonth() + 1 << 21 | dt.getDate() << 16 | dt.getHours() << 11 | dt.getMinutes() << 5 | dt.getSeconds() >> 1), b += 4;
2120
+ if (c != -1) {
2121
+ wbytes(d, b, f.crc);
2122
+ wbytes(d, b + 4, c < 0 ? -c - 2 : c);
2123
+ wbytes(d, b + 8, f.size);
2124
+ }
2125
+ wbytes(d, b + 12, fl2);
2126
+ wbytes(d, b + 14, exl), b += 16;
2127
+ if (ce != null) {
2128
+ wbytes(d, b, col);
2129
+ wbytes(d, b + 6, f.attrs);
2130
+ wbytes(d, b + 10, ce), b += 14;
2131
+ }
2132
+ d.set(fn, b);
2133
+ b += fl2;
2134
+ if (exl) {
2135
+ for (var k in ex) {
2136
+ var exf = ex[k], l = exf.length;
2137
+ wbytes(d, b, +k);
2138
+ wbytes(d, b + 2, l);
2139
+ d.set(exf, b + 4), b += 4 + l;
2140
+ }
2141
+ }
2142
+ if (col)
2143
+ d.set(co, b), b += col;
2144
+ return b;
2145
+ };
2146
+ var wzf = function(o, b, c, d, e) {
2147
+ wbytes(o, b, 101010256);
2148
+ wbytes(o, b + 8, c);
2149
+ wbytes(o, b + 10, c);
2150
+ wbytes(o, b + 12, d);
2151
+ wbytes(o, b + 16, e);
2152
+ };
2153
+ function zipSync(data, opts) {
2154
+ if (!opts)
2155
+ opts = {};
2156
+ var r = {};
2157
+ var files = [];
2158
+ fltn(data, "", r, opts);
2159
+ var o = 0;
2160
+ var tot = 0;
2161
+ for (var fn in r) {
2162
+ var _a2 = r[fn], file = _a2[0], p = _a2[1];
2163
+ var compression = p.level == 0 ? 0 : 8;
2164
+ var f = strToU8(fn), s = f.length;
2165
+ var com = p.comment, m = com && strToU8(com), ms = m && m.length;
2166
+ var exl = exfl(p.extra);
2167
+ if (s > 65535)
2168
+ err(11);
2169
+ var d = compression ? deflateSync(file, p) : file, l = d.length;
2170
+ var c = crc();
2171
+ c.p(file);
2172
+ files.push(mrg(p, {
2173
+ size: file.length,
2174
+ crc: c.d(),
2175
+ c: d,
2176
+ f,
2177
+ m,
2178
+ u: s != fn.length || m && com.length != ms,
2179
+ o,
2180
+ compression
2181
+ }));
2182
+ o += 30 + s + exl + l;
2183
+ tot += 76 + 2 * (s + exl) + (ms || 0) + l;
2184
+ }
2185
+ var out = new u8(tot + 22), oe = o, cdl = tot - o;
2186
+ for (var i = 0; i < files.length; ++i) {
2187
+ var f = files[i];
2188
+ wzh(out, f.o, f, f.f, f.u, f.c.length);
2189
+ var badd = 30 + f.f.length + exfl(f.extra);
2190
+ out.set(f.c, f.o + badd);
2191
+ wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);
2192
+ }
2193
+ wzf(out, o, files.length, cdl, oe);
2194
+ return out;
2195
+ }
2196
+
2197
+ // dist/host/skills-cmd.js
2198
+ async function runSkillsCmd(io2, argv) {
2199
+ if (await refuseInsideManagedRun(io2, "skills"))
2200
+ return USAGE_ERR;
2201
+ const [verb, ...rest] = argv;
2202
+ if (!verb) {
2203
+ io2.stderr("usage: antpath skills <upload|list|get|delete> [flags]\n");
2204
+ return USAGE_ERR;
2205
+ }
2206
+ switch (verb) {
2207
+ case "upload":
2208
+ return runSkillsUpload(io2, rest);
2209
+ case "list":
2210
+ return runSkillsList(io2, rest);
2211
+ case "get":
2212
+ return runSkillsGet(io2, rest);
2213
+ case "delete":
2214
+ return runSkillsDelete(io2, rest);
2215
+ default:
2216
+ io2.stderr(`unknown skills verb: ${verb}
2217
+ `);
2218
+ return USAGE_ERR;
2219
+ }
2220
+ }
2221
+ async function runSkillsUpload(io2, argv) {
2222
+ const common = parseCommonHostFlags(argv);
2223
+ if (!common.ok) {
2224
+ io2.stderr(`${common.reason}
2225
+ `);
2226
+ return USAGE_ERR;
2227
+ }
2228
+ let rest = common.rest;
2229
+ const nameFlag = takeFlagValue(rest, "--name");
2230
+ if (nameFlag.error) {
2231
+ io2.stderr(`${nameFlag.error}
2232
+ `);
2233
+ return USAGE_ERR;
2234
+ }
2235
+ rest = nameFlag.remaining;
2236
+ if (!nameFlag.value) {
2237
+ io2.stderr("--name is required\n");
2238
+ return USAGE_ERR;
2239
+ }
2240
+ const fromPath = takeFlagValue(rest, "--from-path");
2241
+ if (fromPath.error) {
2242
+ io2.stderr(`${fromPath.error}
2243
+ `);
2244
+ return USAGE_ERR;
2245
+ }
2246
+ rest = fromPath.remaining;
2247
+ const fileFlags = collectRepeated(rest, "--file");
2248
+ if (fileFlags.error) {
2249
+ io2.stderr(`${fileFlags.error}
2250
+ `);
2251
+ return USAGE_ERR;
2252
+ }
2253
+ rest = fileFlags.remaining;
2254
+ const unknown = rest.filter((a) => a.startsWith("--"));
2255
+ if (unknown.length > 0) {
2256
+ io2.stderr(`unknown flag: ${unknown[0]}
2257
+ `);
2258
+ return USAGE_ERR;
2259
+ }
2260
+ if (fromPath.value && fileFlags.values.length > 0 || !fromPath.value && fileFlags.values.length === 0) {
2261
+ io2.stderr("antpath skills upload requires exactly one of: --from-path <dir> | --file <path> [--file ...]\n");
2262
+ return USAGE_ERR;
2263
+ }
2264
+ let zip;
2265
+ try {
2266
+ if (fromPath.value) {
2267
+ zip = await zipDirectory(resolvePath2(io2.cwd(), fromPath.value));
2268
+ } else {
2269
+ zip = await zipFiles(io2.cwd(), fileFlags.values);
2270
+ }
2271
+ } catch (err2) {
2272
+ io2.stderr(`failed to build skill bundle: ${err2.message}
2273
+ `);
2274
+ return USAGE_ERR;
2275
+ }
2276
+ const http = makeHttpClient(io2, common.flags);
2277
+ try {
2278
+ const skill = await operations_exports.createSkillBundle(http, {
2279
+ name: nameFlag.value,
2280
+ body: zip,
2281
+ contentType: "application/zip",
2282
+ filename: `${nameFlag.value}.zip`
2283
+ });
2284
+ io2.stdout(JSON.stringify(skill) + "\n");
2285
+ return SUCCESS;
2286
+ } catch (err2) {
2287
+ return emitJsonError(io2, "skill_upload_failed", err2.message ?? "upload failed");
2288
+ }
2289
+ }
2290
+ async function runSkillsList(io2, argv) {
2291
+ const common = parseCommonHostFlags(argv);
2292
+ if (!common.ok) {
2293
+ io2.stderr(`${common.reason}
2294
+ `);
2295
+ return USAGE_ERR;
2296
+ }
2297
+ const positional = common.rest.filter((a) => !a.startsWith("--"));
2298
+ const unknown = common.rest.filter((a) => a.startsWith("--"));
2299
+ if (unknown.length > 0) {
2300
+ io2.stderr(`unknown flag: ${unknown[0]}
2301
+ `);
2302
+ return USAGE_ERR;
2303
+ }
2304
+ if (positional.length > 0) {
2305
+ io2.stderr(`antpath skills list takes no positional arguments
2306
+ `);
2307
+ return USAGE_ERR;
2308
+ }
2309
+ const http = makeHttpClient(io2, common.flags);
2310
+ try {
2311
+ const skills = await operations_exports.listSkills(http);
2312
+ for (const s of skills)
2313
+ io2.stdout(JSON.stringify(s) + "\n");
2314
+ return SUCCESS;
2315
+ } catch (err2) {
2316
+ return emitJsonError(io2, "skills_list_failed", err2.message ?? "list failed");
2317
+ }
2318
+ }
2319
+ async function runSkillsGet(io2, argv) {
2320
+ const common = parseCommonHostFlags(argv);
2321
+ if (!common.ok) {
2322
+ io2.stderr(`${common.reason}
2323
+ `);
2324
+ return USAGE_ERR;
2325
+ }
2326
+ const positional = common.rest.filter((a) => !a.startsWith("--"));
2327
+ const unknown = common.rest.filter((a) => a.startsWith("--"));
2328
+ if (unknown.length > 0) {
2329
+ io2.stderr(`unknown flag: ${unknown[0]}
2330
+ `);
2331
+ return USAGE_ERR;
2332
+ }
2333
+ if (positional.length !== 1) {
2334
+ io2.stderr("usage: antpath skills get <skill-id>\n");
2335
+ return USAGE_ERR;
2336
+ }
2337
+ const skillId = positional[0];
2338
+ const http = makeHttpClient(io2, common.flags);
2339
+ try {
2340
+ const skill = await operations_exports.getSkill(http, skillId);
2341
+ io2.stdout(JSON.stringify(skill) + "\n");
2342
+ return SUCCESS;
2343
+ } catch (err2) {
2344
+ return emitJsonError(io2, "skill_get_failed", err2.message ?? "get failed");
2345
+ }
2346
+ }
2347
+ async function runSkillsDelete(io2, argv) {
2348
+ const common = parseCommonHostFlags(argv);
2349
+ if (!common.ok) {
2350
+ io2.stderr(`${common.reason}
2351
+ `);
2352
+ return USAGE_ERR;
2353
+ }
2354
+ const positional = common.rest.filter((a) => !a.startsWith("--"));
2355
+ const unknown = common.rest.filter((a) => a.startsWith("--"));
2356
+ if (unknown.length > 0) {
2357
+ io2.stderr(`unknown flag: ${unknown[0]}
2358
+ `);
2359
+ return USAGE_ERR;
2360
+ }
2361
+ if (positional.length !== 1) {
2362
+ io2.stderr("usage: antpath skills delete <skill-id>\n");
2363
+ return USAGE_ERR;
2364
+ }
2365
+ const skillId = positional[0];
2366
+ const http = makeHttpClient(io2, common.flags);
2367
+ try {
2368
+ await operations_exports.deleteSkill(http, skillId);
2369
+ io2.stdout(JSON.stringify({ skillId, deleted: true }) + "\n");
2370
+ return SUCCESS;
2371
+ } catch (err2) {
2372
+ return emitJsonError(io2, "skill_delete_failed", err2.message ?? "delete failed");
2373
+ }
2374
+ }
2375
+ var ZIP_EPOCH = new Date(Date.UTC(1980, 0, 1));
2376
+ function zipEntryFor(bytes) {
2377
+ return [bytes, { mtime: ZIP_EPOCH }];
2378
+ }
2379
+ async function zipDirectory(rootDir) {
2380
+ const rootStat = await stat(rootDir);
2381
+ if (!rootStat.isDirectory()) {
2382
+ throw new Error(`${rootDir} is not a directory`);
2383
+ }
2384
+ const collected = /* @__PURE__ */ new Map();
2385
+ let totalDecompressed = 0;
2386
+ let hasSkillMd = false;
2387
+ await walk(rootDir, rootDir, async (relPathPosix, bytes) => {
2388
+ const entry = validateSkillBundleEntry({ path: relPathPosix, size: bytes.byteLength });
2389
+ if (entry.path === "SKILL.md")
2390
+ hasSkillMd = true;
2391
+ totalDecompressed += bytes.byteLength;
2392
+ if (totalDecompressed > SKILL_BUNDLE_LIMITS.maxDecompressedBytes) {
2393
+ throw new Error(`skill bundle exceeds decompressed cap of ${SKILL_BUNDLE_LIMITS.maxDecompressedBytes} bytes`);
2394
+ }
2395
+ if (collected.has(entry.path)) {
2396
+ throw new Error(`skill bundle contains duplicate path: ${entry.path}`);
2397
+ }
2398
+ if (collected.size >= SKILL_BUNDLE_LIMITS.maxFiles) {
2399
+ throw new Error(`skill bundle exceeds ${SKILL_BUNDLE_LIMITS.maxFiles} file limit`);
2400
+ }
2401
+ collected.set(entry.path, bytes);
2402
+ });
2403
+ if (collected.size === 0) {
2404
+ throw new Error(`${rootDir} contains no regular files`);
2405
+ }
2406
+ if (!hasSkillMd) {
2407
+ throw new Error('skill bundle must contain a "SKILL.md" file at the root');
2408
+ }
2409
+ const sorted = [...collected.entries()].sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0);
2410
+ const zippable = {};
2411
+ for (const [path, bytes] of sorted)
2412
+ zippable[path] = zipEntryFor(bytes);
2413
+ const out = zipSync(zippable, { level: 6 });
2414
+ if (out.byteLength > SKILL_BUNDLE_LIMITS.maxCompressedBytes) {
2415
+ throw new Error(`skill bundle exceeds compressed cap of ${SKILL_BUNDLE_LIMITS.maxCompressedBytes} bytes (got ${out.byteLength})`);
2416
+ }
2417
+ return out;
2418
+ }
2419
+ async function zipFiles(cwd, paths) {
2420
+ if (paths.length > SKILL_BUNDLE_LIMITS.maxFiles) {
2421
+ throw new Error(`skill bundle exceeds ${SKILL_BUNDLE_LIMITS.maxFiles} file limit`);
2422
+ }
2423
+ const collected = /* @__PURE__ */ new Map();
2424
+ let totalDecompressed = 0;
2425
+ let hasSkillMd = false;
2426
+ for (const p of paths) {
2427
+ const abs = resolvePath2(cwd, p);
2428
+ const bytes = await readFile(abs);
2429
+ const name = basename(p);
2430
+ const entry = validateSkillBundleEntry({ path: name, size: bytes.byteLength });
2431
+ if (entry.path === "SKILL.md")
2432
+ hasSkillMd = true;
2433
+ totalDecompressed += bytes.byteLength;
2434
+ if (totalDecompressed > SKILL_BUNDLE_LIMITS.maxDecompressedBytes) {
2435
+ throw new Error(`skill bundle exceeds decompressed cap of ${SKILL_BUNDLE_LIMITS.maxDecompressedBytes} bytes`);
2436
+ }
2437
+ if (collected.has(entry.path)) {
2438
+ throw new Error(`skill bundle contains duplicate path (basenames must be unique): ${entry.path}`);
2439
+ }
2440
+ collected.set(entry.path, bytes);
2441
+ }
2442
+ if (!hasSkillMd) {
2443
+ throw new Error('skill bundle must contain a "SKILL.md" file at the root');
2444
+ }
2445
+ const sorted = [...collected.entries()].sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0);
2446
+ const zippable = {};
2447
+ for (const [path, bytes] of sorted)
2448
+ zippable[path] = zipEntryFor(bytes);
2449
+ const out = zipSync(zippable, { level: 6 });
2450
+ if (out.byteLength > SKILL_BUNDLE_LIMITS.maxCompressedBytes) {
2451
+ throw new Error(`skill bundle exceeds compressed cap of ${SKILL_BUNDLE_LIMITS.maxCompressedBytes} bytes`);
2452
+ }
2453
+ return out;
2454
+ }
2455
+ async function walk(rootDir, currentDir, visit) {
2456
+ const entries = await readdir(currentDir, { withFileTypes: true });
2457
+ for (const dirent of entries) {
2458
+ const full = join(currentDir, dirent.name);
2459
+ if (dirent.isSymbolicLink())
2460
+ continue;
2461
+ if (dirent.isDirectory()) {
2462
+ await walk(rootDir, full, visit);
2463
+ continue;
2464
+ }
2465
+ if (!dirent.isFile())
2466
+ continue;
2467
+ const rel = relative(rootDir, full);
2468
+ const posixPath = sep === "/" ? rel : rel.split(sep).join(posix.sep);
2469
+ const bytes = await readFile(full);
2470
+ await visit(posixPath, bytes);
2471
+ }
2472
+ }
2473
+
1225
2474
  // dist/host/status.js
1226
2475
  async function runStatusCmd(io2, argv) {
1227
2476
  if (await refuseInsideManagedRun(io2, "status"))
@@ -1243,8 +2492,8 @@ async function runStatusCmd(io2, argv) {
1243
2492
  const run = await operations_exports.getRun(http, runId);
1244
2493
  io2.stdout(JSON.stringify(run) + "\n");
1245
2494
  return SUCCESS;
1246
- } catch (err) {
1247
- return emitJsonError(io2, "status_failed", err.message ?? "status fetch failed", { runId });
2495
+ } catch (err2) {
2496
+ return emitJsonError(io2, "status_failed", err2.message ?? "status fetch failed", { runId });
1248
2497
  }
1249
2498
  }
1250
2499
 
@@ -1281,8 +2530,8 @@ async function runEventsCmd(io2, argv) {
1281
2530
  io2.stdout(JSON.stringify(event) + "\n");
1282
2531
  }
1283
2532
  return SUCCESS;
1284
- } catch (err) {
1285
- return emitJsonError(io2, "events_failed", err.message ?? "event fetch failed", { runId });
2533
+ } catch (err2) {
2534
+ return emitJsonError(io2, "events_failed", err2.message ?? "event fetch failed", { runId });
1286
2535
  }
1287
2536
  }
1288
2537
  let emittedCount = 0;
@@ -1290,8 +2539,8 @@ async function runEventsCmd(io2, argv) {
1290
2539
  let events;
1291
2540
  try {
1292
2541
  events = await operations_exports.listRunEvents(http, runId);
1293
- } catch (err) {
1294
- io2.stderr(`(transient) event poll failed: ${err.message}
2542
+ } catch (err2) {
2543
+ io2.stderr(`(transient) event poll failed: ${err2.message}
1295
2544
  `);
1296
2545
  await sleep2(2e3);
1297
2546
  continue;
@@ -1305,8 +2554,8 @@ async function runEventsCmd(io2, argv) {
1305
2554
  if (TERMINAL_STATUSES2.has(run.status)) {
1306
2555
  return SUCCESS;
1307
2556
  }
1308
- } catch (err) {
1309
- io2.stderr(`(transient) status poll failed: ${err.message}
2557
+ } catch (err2) {
2558
+ io2.stderr(`(transient) status poll failed: ${err2.message}
1310
2559
  `);
1311
2560
  }
1312
2561
  await sleep2(2e3);
@@ -1339,13 +2588,13 @@ async function runOutputsCmd(io2, argv) {
1339
2588
  io2.stdout(JSON.stringify(out) + "\n");
1340
2589
  }
1341
2590
  return SUCCESS;
1342
- } catch (err) {
1343
- return emitJsonError(io2, "outputs_failed", err.message ?? "outputs fetch failed", { runId });
2591
+ } catch (err2) {
2592
+ return emitJsonError(io2, "outputs_failed", err2.message ?? "outputs fetch failed", { runId });
1344
2593
  }
1345
2594
  }
1346
2595
 
1347
2596
  // dist/host/download.js
1348
- import { resolve as resolvePath2, basename } from "node:path";
2597
+ import { resolve as resolvePath3, basename as basename2 } from "node:path";
1349
2598
  async function runDownloadCmd(io2, argv) {
1350
2599
  if (await refuseInsideManagedRun(io2, "download"))
1351
2600
  return USAGE_ERR;
@@ -1372,14 +2621,14 @@ async function runDownloadCmd(io2, argv) {
1372
2621
  let link;
1373
2622
  try {
1374
2623
  link = await operations_exports.createOutputLink(http, runId, outputId);
1375
- } catch (err) {
1376
- return emitJsonError(io2, "link_failed", err.message ?? "create link failed", { runId, outputId });
2624
+ } catch (err2) {
2625
+ return emitJsonError(io2, "link_failed", err2.message ?? "create link failed", { runId, outputId });
1377
2626
  }
1378
2627
  let response;
1379
2628
  try {
1380
2629
  response = await io2.fetchImpl(link.url, { method: "GET", redirect: "follow" });
1381
- } catch (err) {
1382
- return emitJsonError(io2, "download_failed", `download fetch failed: ${err.message}`, { runId, outputId });
2630
+ } catch (err2) {
2631
+ return emitJsonError(io2, "download_failed", `download fetch failed: ${err2.message}`, { runId, outputId });
1383
2632
  }
1384
2633
  if (!response.ok) {
1385
2634
  return emitJsonError(io2, "download_failed", `download HTTP ${response.status}`, { runId, outputId });
@@ -1388,25 +2637,25 @@ async function runDownloadCmd(io2, argv) {
1388
2637
  const destination = resolveDestination(io2, outFlag.value, outputId, link.url);
1389
2638
  try {
1390
2639
  await io2.writeFile(destination, buffer);
1391
- } catch (err) {
1392
- return emitJsonError(io2, "write_failed", `failed to write output: ${err.message}`, { destination });
2640
+ } catch (err2) {
2641
+ return emitJsonError(io2, "write_failed", `failed to write output: ${err2.message}`, { destination });
1393
2642
  }
1394
2643
  io2.stdout(JSON.stringify({ runId, outputId, path: destination, bytes: buffer.byteLength }) + "\n");
1395
2644
  return SUCCESS;
1396
2645
  }
1397
2646
  function resolveDestination(io2, out, outputId, signedUrl) {
1398
2647
  if (out) {
1399
- return resolvePath2(io2.cwd(), out);
2648
+ return resolvePath3(io2.cwd(), out);
1400
2649
  }
1401
2650
  let fileName = `${outputId}`;
1402
2651
  try {
1403
2652
  const url = new URL(signedUrl);
1404
- const tail = basename(url.pathname);
2653
+ const tail = basename2(url.pathname);
1405
2654
  if (tail)
1406
2655
  fileName = tail;
1407
2656
  } catch {
1408
2657
  }
1409
- return resolvePath2(io2.cwd(), fileName);
2658
+ return resolvePath3(io2.cwd(), fileName);
1410
2659
  }
1411
2660
 
1412
2661
  // dist/host/cancel.js
@@ -1430,8 +2679,8 @@ async function runCancelCmd(io2, argv) {
1430
2679
  await operations_exports.cancelRun(http, runId);
1431
2680
  io2.stdout(JSON.stringify({ runId, status: "cancel_requested" }) + "\n");
1432
2681
  return SUCCESS;
1433
- } catch (err) {
1434
- return emitJsonError(io2, "cancel_failed", err.message ?? "cancel failed", { runId });
2682
+ } catch (err2) {
2683
+ return emitJsonError(io2, "cancel_failed", err2.message ?? "cancel failed", { runId });
1435
2684
  }
1436
2685
  }
1437
2686
 
@@ -1456,8 +2705,8 @@ async function runDeleteCmd(io2, argv) {
1456
2705
  await operations_exports.deleteRun(http, runId);
1457
2706
  io2.stdout(JSON.stringify({ runId, deleted: true }) + "\n");
1458
2707
  return SUCCESS;
1459
- } catch (err) {
1460
- return emitJsonError(io2, "delete_failed", err.message ?? "delete failed", { runId });
2708
+ } catch (err2) {
2709
+ return emitJsonError(io2, "delete_failed", err2.message ?? "delete failed", { runId });
1461
2710
  }
1462
2711
  }
1463
2712
 
@@ -1481,8 +2730,8 @@ async function runWhoamiCmd(io2, argv) {
1481
2730
  const me = await operations_exports.whoami(http);
1482
2731
  io2.stdout(JSON.stringify(me) + "\n");
1483
2732
  return SUCCESS;
1484
- } catch (err) {
1485
- return emitJsonError(io2, "whoami_failed", err.message ?? "whoami failed");
2733
+ } catch (err2) {
2734
+ return emitJsonError(io2, "whoami_failed", err2.message ?? "whoami failed");
1486
2735
  }
1487
2736
  }
1488
2737
 
@@ -1492,8 +2741,8 @@ async function runCli(io2) {
1492
2741
  try {
1493
2742
  const exit = await dispatch(io2, args);
1494
2743
  io2.exit(exit.code);
1495
- } catch (err) {
1496
- const body = { error: "internal_error", message: err.message ?? "unknown error" };
2744
+ } catch (err2) {
2745
+ const body = { error: "internal_error", message: err2.message ?? "unknown error" };
1497
2746
  io2.stderr(JSON.stringify(body) + "\n");
1498
2747
  io2.exit(RUNTIME_ERR.code);
1499
2748
  }
@@ -1509,6 +2758,8 @@ async function dispatch(io2, args) {
1509
2758
  return runProxy(io2, rest);
1510
2759
  case "run":
1511
2760
  return runRunCmd(io2, rest);
2761
+ case "skills":
2762
+ return runSkillsCmd(io2, rest);
1512
2763
  case "status":
1513
2764
  return runStatusCmd(io2, rest);
1514
2765
  case "events":
@@ -1553,7 +2804,13 @@ Protocol version: ${manifest.protocolVersion}
1553
2804
  }
1554
2805
  io2.stdout("antpath \u2014 unified CLI for the antpath platform (mirrors the SDK 1:1)\n\n");
1555
2806
  io2.stdout("Usage:\n");
1556
- io2.stdout(" antpath run <template-path> --api-token T [flags]\n");
2807
+ io2.stdout(" antpath run --config <run.json> --anthropic-api-key K --api-token T [flags]\n");
2808
+ io2.stdout(" antpath run --model M --prompt P [--system S] [--skill ID ...] [--mcp name=url ...] --anthropic-api-key K --api-token T [flags]\n");
2809
+ io2.stdout(" antpath skills upload --name N --from-path <dir> --api-token T\n");
2810
+ io2.stdout(" antpath skills upload --name N --file <path> [--file <path> ...] --api-token T\n");
2811
+ io2.stdout(" antpath skills list --api-token T\n");
2812
+ io2.stdout(" antpath skills get <skill-id> --api-token T\n");
2813
+ io2.stdout(" antpath skills delete <skill-id> --api-token T\n");
1557
2814
  io2.stdout(" antpath status <run-id> --api-token T\n");
1558
2815
  io2.stdout(" antpath events <run-id> [--follow] --api-token T\n");
1559
2816
  io2.stdout(" antpath outputs <run-id> --api-token T\n");
@@ -1565,23 +2822,28 @@ Protocol version: ${manifest.protocolVersion}
1565
2822
  io2.stdout("Common flags on every host subcommand:\n");
1566
2823
  io2.stdout(" --api-token <token> REQUIRED \u2014 antpath SDK API token (workspace is derived from it)\n");
1567
2824
  io2.stdout(" --dashboard-url <url> Optional; defaults to https://antpath.ai (set for self-hosted)\n\n");
1568
- io2.stdout("Submit flags (antpath run):\n");
2825
+ io2.stdout("antpath run flags:\n");
1569
2826
  io2.stdout(" --anthropic-api-key <key> REQUIRED \u2014 provider key (never stored)\n");
1570
- io2.stdout(" --var name=value Template variable (repeatable)\n");
1571
- io2.stdout(" --mcp-server '<json>' PlatformMcpServerSecret JSON (repeatable)\n");
1572
- io2.stdout(" --skill <skillId>[:<ver>] Skill reference (repeatable)\n");
2827
+ io2.stdout(" --config <path> JSON Blueprint (mutually exclusive with the flat --model/--prompt flags)\n");
2828
+ io2.stdout(" --model <model-id> Anthropic model id (required in flat mode)\n");
2829
+ io2.stdout(" --system @file | <text> System message; @-prefix reads from file\n");
2830
+ io2.stdout(" --prompt @file | <text> User message; @-prefix reads from file (repeatable)\n");
2831
+ io2.stdout(" --skill <skl_id> Workspace skill (repeatable)\n");
2832
+ io2.stdout(" --provider-skill v:s[:ver] Provider built-in skill (vendor:skillId[:version], repeatable)\n");
2833
+ io2.stdout(" --mcp name=url MCP server entry (repeatable)\n");
2834
+ io2.stdout(" --mcp-auth name=Hdr:Val Auth header on the matching --mcp; routed into vaulted secrets (repeatable)\n");
2835
+ io2.stdout(" --metadata key=value Submission metadata entry (repeatable)\n");
1573
2836
  io2.stdout(" --proxy-endpoint '<json>' PlatformProxyEndpoint JSON (repeatable)\n");
1574
2837
  io2.stdout(" --proxy-auth name=<spec> bearer:tok | basic:u:p | header:v | query:v (repeatable)\n");
1575
2838
  io2.stdout(" --cleanup retain|delete Session cleanup policy\n");
1576
2839
  io2.stdout(" --idempotency-key <key> Optional; defaults to a fresh UUID\n");
1577
- io2.stdout(" --follow Poll events to stdout until the run terminates\n\n");
1578
- io2.stdout("Template formats: .json, .js, .mjs, .ts (default export must be a TemplateDefinition).\n");
2840
+ io2.stdout(" --follow Poll events to stdout until the run terminates\n");
1579
2841
  return SUCCESS;
1580
2842
  }
1581
2843
 
1582
2844
  // dist/cli.js
1583
2845
  var io = {
1584
- readFile: (path) => readFile(path, "utf8"),
2846
+ readFile: (path) => readFile2(path, "utf8"),
1585
2847
  writeFile: (path, data) => writeFile(path, data),
1586
2848
  fetchImpl: fetch,
1587
2849
  stdout: (chunk) => process.stdout.write(chunk),