antpath 0.4.2 → 0.6.1
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/_shared/operations.js +10 -2
- package/dist/blueprint.d.ts +33 -0
- package/dist/blueprint.js +14 -0
- package/dist/blueprint.js.map +1 -0
- package/dist/bundle.d.ts +18 -0
- package/dist/bundle.js +55 -0
- package/dist/bundle.js.map +1 -0
- package/dist/cli.mjs +1636 -374
- package/dist/cli.mjs.sha256 +1 -1
- package/dist/client.d.ts +65 -19
- package/dist/client.js +141 -21
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +17 -9
- package/dist/index.js +13 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +44 -0
- package/dist/mcp-server.js +58 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/node-fs.d.ts +12 -0
- package/dist/node-fs.js +44 -0
- package/dist/node-fs.js.map +1 -0
- package/dist/skill.d.ts +59 -0
- package/dist/skill.js +82 -0
- package/dist/skill.js.map +1 -0
- package/package.json +4 -2
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
776
|
-
if (
|
|
777
|
-
io2.stderr(`${
|
|
874
|
+
} catch (err2) {
|
|
875
|
+
if (err2 instanceof CliUsageError) {
|
|
876
|
+
io2.stderr(`${err2.message}
|
|
778
877
|
`);
|
|
779
878
|
return USAGE_ERR;
|
|
780
879
|
}
|
|
781
|
-
throw
|
|
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 (
|
|
837
|
-
io2.stderr(`failed to read request body: ${
|
|
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 (
|
|
970
|
+
} catch (err2) {
|
|
872
971
|
emitError(io2, {
|
|
873
972
|
error: "upstream_error",
|
|
874
|
-
message: `proxy request failed: ${
|
|
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
|
|
1006
|
-
if (
|
|
1007
|
-
io2.stderr(`${
|
|
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 =
|
|
1012
|
-
const
|
|
1013
|
-
if (
|
|
1014
|
-
io2.stderr(`${
|
|
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 =
|
|
1019
|
-
const
|
|
1020
|
-
if (
|
|
1021
|
-
io2.stderr(`${
|
|
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 =
|
|
1026
|
-
const
|
|
1027
|
-
if (
|
|
1028
|
-
io2.stderr(`${
|
|
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 =
|
|
1033
|
-
const
|
|
1034
|
-
if (
|
|
1035
|
-
io2.stderr(`${
|
|
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 =
|
|
1040
|
-
const
|
|
1041
|
-
|
|
1042
|
-
|
|
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
|
-
|
|
1048
|
-
|
|
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
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
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
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
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
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
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
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
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(
|
|
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 (
|
|
1099
|
-
io2.stderr(`proxy auth validation failed: ${
|
|
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
|
-
...
|
|
1107
|
-
...
|
|
1108
|
-
...proxyAuth.length ? { proxyEndpointAuth: proxyAuth } : {}
|
|
1313
|
+
...mcpServerSecrets.length > 0 ? { mcpServers: mcpServerSecrets } : {},
|
|
1314
|
+
...proxyAuth.length > 0 ? { proxyEndpointAuth: proxyAuth } : {}
|
|
1109
1315
|
};
|
|
1110
|
-
const
|
|
1316
|
+
const request = {
|
|
1111
1317
|
idempotencyKey: idempotency.value ?? generateIdempotencyKey(),
|
|
1112
|
-
|
|
1318
|
+
submission,
|
|
1113
1319
|
secrets,
|
|
1114
1320
|
...cleanup.value ? { cleanup: { session: cleanup.value } } : {},
|
|
1115
|
-
...
|
|
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.
|
|
1121
|
-
} catch (
|
|
1122
|
-
return emitJsonError(io2, "submit_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 (
|
|
1138
|
-
io2.stderr(`(transient) event poll failed: ${
|
|
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 (
|
|
1145
|
-
io2.stderr(`(transient) status poll failed: ${
|
|
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 (
|
|
1154
|
-
io2.stderr(`final status fetch failed: ${
|
|
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
|
|
1372
|
+
const restValue = spec.slice(idx + 1);
|
|
1166
1373
|
switch (type) {
|
|
1167
1374
|
case "bearer":
|
|
1168
|
-
if (!
|
|
1375
|
+
if (!restValue)
|
|
1169
1376
|
return { ok: false, reason: "bearer requires a token value" };
|
|
1170
|
-
return { ok: true, value: { type: "bearer", token:
|
|
1377
|
+
return { ok: true, value: { type: "bearer", token: restValue } };
|
|
1171
1378
|
case "header":
|
|
1172
|
-
if (!
|
|
1379
|
+
if (!restValue)
|
|
1173
1380
|
return { ok: false, reason: "header requires a value" };
|
|
1174
|
-
return { ok: true, value: { type: "header", value:
|
|
1381
|
+
return { ok: true, value: { type: "header", value: restValue } };
|
|
1175
1382
|
case "query":
|
|
1176
|
-
if (!
|
|
1383
|
+
if (!restValue)
|
|
1177
1384
|
return { ok: false, reason: "query requires a value" };
|
|
1178
|
-
return { ok: true, value: { type: "query", value:
|
|
1385
|
+
return { ok: true, value: { type: "query", value: restValue } };
|
|
1179
1386
|
case "basic": {
|
|
1180
|
-
const
|
|
1181
|
-
if (
|
|
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:
|
|
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 (
|
|
1212
|
-
throw new Error(`${label} is not valid JSON: ${
|
|
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 (
|
|
1247
|
-
return emitJsonError(io2, "status_failed",
|
|
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 (
|
|
1285
|
-
return emitJsonError(io2, "events_failed",
|
|
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 (
|
|
1294
|
-
io2.stderr(`(transient) event poll failed: ${
|
|
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 (
|
|
1309
|
-
io2.stderr(`(transient) status poll failed: ${
|
|
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 (
|
|
1343
|
-
return emitJsonError(io2, "outputs_failed",
|
|
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
|
|
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 (
|
|
1376
|
-
return emitJsonError(io2, "link_failed",
|
|
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 (
|
|
1382
|
-
return emitJsonError(io2, "download_failed", `download fetch failed: ${
|
|
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 (
|
|
1392
|
-
return emitJsonError(io2, "write_failed", `failed to write output: ${
|
|
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
|
|
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 =
|
|
2653
|
+
const tail = basename2(url.pathname);
|
|
1405
2654
|
if (tail)
|
|
1406
2655
|
fileName = tail;
|
|
1407
2656
|
} catch {
|
|
1408
2657
|
}
|
|
1409
|
-
return
|
|
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 (
|
|
1434
|
-
return emitJsonError(io2, "cancel_failed",
|
|
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 (
|
|
1460
|
-
return emitJsonError(io2, "delete_failed",
|
|
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 (
|
|
1485
|
-
return emitJsonError(io2, "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 (
|
|
1496
|
-
const body = { error: "internal_error", message:
|
|
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 <
|
|
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("
|
|
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(" --
|
|
1571
|
-
io2.stdout(" --
|
|
1572
|
-
io2.stdout(" --
|
|
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
|
|
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) =>
|
|
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),
|