skillspace 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +57 -0
- package/bin/skillspace.js +2 -0
- package/dist/browserAuth.d.ts +20 -0
- package/dist/browserAuth.js +156 -0
- package/dist/browserAuth.js.map +1 -0
- package/dist/cli/authToken.d.ts +2 -0
- package/dist/cli/authToken.js +13 -0
- package/dist/cli/authToken.js.map +1 -0
- package/dist/cli/buildInfo.d.ts +3 -0
- package/dist/cli/buildInfo.js +103 -0
- package/dist/cli/buildInfo.js.map +1 -0
- package/dist/cli/clawdbotConfig.d.ts +6 -0
- package/dist/cli/clawdbotConfig.js +156 -0
- package/dist/cli/clawdbotConfig.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +9 -0
- package/dist/cli/commands/auth.js +74 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +28 -0
- package/dist/cli/commands/delete.js +94 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +12 -0
- package/dist/cli/commands/inspect.js +281 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/moderation.d.ts +19 -0
- package/dist/cli/commands/moderation.js +161 -0
- package/dist/cli/commands/moderation.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +9 -0
- package/dist/cli/commands/publish.js +85 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +26 -0
- package/dist/cli/commands/skills.js +387 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/star.d.ts +8 -0
- package/dist/cli/commands/star.js +31 -0
- package/dist/cli/commands/star.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.js +157 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/syncHelpers.d.ts +76 -0
- package/dist/cli/commands/syncHelpers.js +369 -0
- package/dist/cli/commands/syncHelpers.js.map +1 -0
- package/dist/cli/commands/syncTypes.d.ts +24 -0
- package/dist/cli/commands/syncTypes.js +2 -0
- package/dist/cli/commands/syncTypes.js.map +1 -0
- package/dist/cli/commands/transfer.d.ts +50 -0
- package/dist/cli/commands/transfer.js +133 -0
- package/dist/cli/commands/transfer.js.map +1 -0
- package/dist/cli/commands/unstar.d.ts +8 -0
- package/dist/cli/commands/unstar.js +31 -0
- package/dist/cli/commands/unstar.js.map +1 -0
- package/dist/cli/helpStyle.d.ts +13 -0
- package/dist/cli/helpStyle.js +38 -0
- package/dist/cli/helpStyle.js.map +1 -0
- package/dist/cli/registry.d.ts +7 -0
- package/dist/cli/registry.js +31 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/scanSkills.d.ts +7 -0
- package/dist/cli/scanSkills.js +84 -0
- package/dist/cli/scanSkills.js.map +1 -0
- package/dist/cli/slug.d.ts +2 -0
- package/dist/cli/slug.js +16 -0
- package/dist/cli/slug.js.map +1 -0
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/ui.d.ts +7 -0
- package/dist/cli/ui.js +82 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +384 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +5 -0
- package/dist/discovery.js +25 -0
- package/dist/discovery.js.map +1 -0
- package/dist/homedir.d.ts +7 -0
- package/dist/homedir.js +29 -0
- package/dist/homedir.js.map +1 -0
- package/dist/http.d.ts +43 -0
- package/dist/http.js +501 -0
- package/dist/http.js.map +1 -0
- package/dist/schema/ark.d.ts +4 -0
- package/dist/schema/ark.js +26 -0
- package/dist/schema/ark.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/routes.d.ts +24 -0
- package/dist/schema/routes.js +25 -0
- package/dist/schema/routes.js.map +1 -0
- package/dist/schema/schemas.d.ts +343 -0
- package/dist/schema/schemas.js +308 -0
- package/dist/schema/schemas.js.map +1 -0
- package/dist/schema/textFiles.d.ts +5 -0
- package/dist/schema/textFiles.js +66 -0
- package/dist/schema/textFiles.js.map +1 -0
- package/dist/skills.d.ts +43 -0
- package/dist/skills.js +166 -0
- package/dist/skills.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
package/dist/http.js
ADDED
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import pRetry, { AbortError } from "p-retry";
|
|
6
|
+
import { Agent, EnvHttpProxyAgent, setGlobalDispatcher } from "undici";
|
|
7
|
+
import { ApiRoutes, parseArk } from "./schema/index.js";
|
|
8
|
+
const REQUEST_TIMEOUT_MS = 15_000;
|
|
9
|
+
const UPLOAD_TIMEOUT_MS = 120_000;
|
|
10
|
+
const REQUEST_TIMEOUT_SECONDS = Math.ceil(REQUEST_TIMEOUT_MS / 1000);
|
|
11
|
+
const UPLOAD_TIMEOUT_SECONDS = Math.ceil(UPLOAD_TIMEOUT_MS / 1000);
|
|
12
|
+
const RETRY_COUNT = 2;
|
|
13
|
+
const RETRY_BACKOFF_BASE_MS = 300;
|
|
14
|
+
const RETRY_BACKOFF_MAX_MS = 5_000;
|
|
15
|
+
const RETRY_AFTER_JITTER_MS = 250;
|
|
16
|
+
const CURL_META_MARKER = "__SKILLSPACE_CURL_META__";
|
|
17
|
+
const CURL_WRITE_OUT_FORMAT = [
|
|
18
|
+
"",
|
|
19
|
+
CURL_META_MARKER,
|
|
20
|
+
"%{http_code}",
|
|
21
|
+
"%{header:x-ratelimit-limit}",
|
|
22
|
+
"%{header:x-ratelimit-remaining}",
|
|
23
|
+
"%{header:x-ratelimit-reset}",
|
|
24
|
+
"%{header:ratelimit-limit}",
|
|
25
|
+
"%{header:ratelimit-remaining}",
|
|
26
|
+
"%{header:ratelimit-reset}",
|
|
27
|
+
"%{header:retry-after}",
|
|
28
|
+
].join("\n");
|
|
29
|
+
const isBun = typeof process !== "undefined" && Boolean(process.versions?.bun);
|
|
30
|
+
export function shouldUseProxyFromEnv(env = process.env) {
|
|
31
|
+
return Boolean(env.HTTPS_PROXY || env.HTTP_PROXY || env.https_proxy || env.http_proxy);
|
|
32
|
+
}
|
|
33
|
+
if (typeof process !== "undefined" && process.versions?.node) {
|
|
34
|
+
try {
|
|
35
|
+
setGlobalDispatcher(shouldUseProxyFromEnv(process.env)
|
|
36
|
+
? new EnvHttpProxyAgent({
|
|
37
|
+
connect: { timeout: REQUEST_TIMEOUT_MS },
|
|
38
|
+
})
|
|
39
|
+
: new Agent({
|
|
40
|
+
connect: { timeout: REQUEST_TIMEOUT_MS },
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// ignore dispatcher setup failures in non-node runtimes
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function registryUrl(path, registry) {
|
|
48
|
+
const base = registry.endsWith("/") ? registry : `${registry}/`;
|
|
49
|
+
const relative = path.startsWith("/") ? path.slice(1) : path;
|
|
50
|
+
return new URL(relative, base);
|
|
51
|
+
}
|
|
52
|
+
class HttpStatusError extends Error {
|
|
53
|
+
status;
|
|
54
|
+
rateLimit;
|
|
55
|
+
constructor(status, message, rateLimit) {
|
|
56
|
+
super(message);
|
|
57
|
+
this.name = "HttpStatusError";
|
|
58
|
+
this.status = status;
|
|
59
|
+
this.rateLimit = rateLimit;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function apiRequest(registry, args, schema) {
|
|
63
|
+
const url = "url" in args ? args.url : registryUrl(args.path, registry).toString();
|
|
64
|
+
const json = await runWithRetries(async () => {
|
|
65
|
+
if (isBun) {
|
|
66
|
+
return await fetchJsonViaCurl(url, args);
|
|
67
|
+
}
|
|
68
|
+
const headers = { Accept: "application/json" };
|
|
69
|
+
if (args.token)
|
|
70
|
+
headers.Authorization = `Bearer ${args.token}`;
|
|
71
|
+
let body;
|
|
72
|
+
if (args.method === "POST") {
|
|
73
|
+
headers["Content-Type"] = "application/json";
|
|
74
|
+
body = JSON.stringify(args.body ?? {});
|
|
75
|
+
}
|
|
76
|
+
const response = await fetchWithTimeout(url, {
|
|
77
|
+
method: args.method,
|
|
78
|
+
headers,
|
|
79
|
+
body,
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) {
|
|
82
|
+
throwHttpStatusError(response.status, await readResponseTextSafe(response), response.headers);
|
|
83
|
+
}
|
|
84
|
+
return (await response.json());
|
|
85
|
+
});
|
|
86
|
+
if (schema)
|
|
87
|
+
return parseArk(schema, json, "API response");
|
|
88
|
+
return json;
|
|
89
|
+
}
|
|
90
|
+
export async function apiRequestForm(registry, args, schema) {
|
|
91
|
+
const url = "url" in args ? args.url : registryUrl(args.path, registry).toString();
|
|
92
|
+
const json = await runWithRetries(async () => {
|
|
93
|
+
if (isBun) {
|
|
94
|
+
return await fetchJsonFormViaCurl(url, args);
|
|
95
|
+
}
|
|
96
|
+
const headers = { Accept: "application/json" };
|
|
97
|
+
if (args.token)
|
|
98
|
+
headers.Authorization = `Bearer ${args.token}`;
|
|
99
|
+
const response = await fetchWithTimeout(url, {
|
|
100
|
+
method: args.method,
|
|
101
|
+
headers,
|
|
102
|
+
body: args.form,
|
|
103
|
+
}, UPLOAD_TIMEOUT_MS);
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
throwHttpStatusError(response.status, await readResponseTextSafe(response), response.headers);
|
|
106
|
+
}
|
|
107
|
+
return (await response.json());
|
|
108
|
+
});
|
|
109
|
+
if (schema)
|
|
110
|
+
return parseArk(schema, json, "API response");
|
|
111
|
+
return json;
|
|
112
|
+
}
|
|
113
|
+
export async function fetchText(registry, args) {
|
|
114
|
+
const url = "url" in args ? args.url : registryUrl(args.path, registry).toString();
|
|
115
|
+
return runWithRetries(async () => {
|
|
116
|
+
if (isBun) {
|
|
117
|
+
return await fetchTextViaCurl(url, args);
|
|
118
|
+
}
|
|
119
|
+
const headers = { Accept: "text/plain" };
|
|
120
|
+
if (args.token)
|
|
121
|
+
headers.Authorization = `Bearer ${args.token}`;
|
|
122
|
+
const response = await fetchWithTimeout(url, { method: "GET", headers });
|
|
123
|
+
const text = await response.text();
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
throwHttpStatusError(response.status, text, response.headers);
|
|
126
|
+
}
|
|
127
|
+
return text;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
export async function downloadZip(registry, args) {
|
|
131
|
+
const url = registryUrl(ApiRoutes.download, registry);
|
|
132
|
+
url.searchParams.set("slug", args.slug);
|
|
133
|
+
if (args.version)
|
|
134
|
+
url.searchParams.set("version", args.version);
|
|
135
|
+
return runWithRetries(async () => {
|
|
136
|
+
if (isBun) {
|
|
137
|
+
return await fetchBinaryViaCurl(url.toString(), args.token);
|
|
138
|
+
}
|
|
139
|
+
const headers = {};
|
|
140
|
+
if (args.token)
|
|
141
|
+
headers.Authorization = `Bearer ${args.token}`;
|
|
142
|
+
const response = await fetchWithTimeout(url.toString(), { method: "GET", headers });
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
throwHttpStatusError(response.status, await readResponseTextSafe(response), response.headers);
|
|
145
|
+
}
|
|
146
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
async function fetchWithTimeout(url, init, timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
150
|
+
const controller = new AbortController();
|
|
151
|
+
const timeoutSeconds = Math.ceil(timeoutMs / 1000);
|
|
152
|
+
const timeout = setTimeout(() => controller.abort(new Error(`Request timed out after ${timeoutSeconds}s`)), timeoutMs);
|
|
153
|
+
try {
|
|
154
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (error instanceof Error)
|
|
158
|
+
throw error;
|
|
159
|
+
// Normalize non-Error throws (e.g. DOMException from AbortController) into proper Errors
|
|
160
|
+
const message = typeof error === "object" && error !== null && "message" in error
|
|
161
|
+
? String(error.message)
|
|
162
|
+
: String(error);
|
|
163
|
+
throw new Error(message, { cause: error });
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
clearTimeout(timeout);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function readResponseTextSafe(response) {
|
|
170
|
+
return await response.text().catch(() => "");
|
|
171
|
+
}
|
|
172
|
+
async function runWithRetries(fn) {
|
|
173
|
+
return await pRetry(fn, {
|
|
174
|
+
retries: RETRY_COUNT,
|
|
175
|
+
minTimeout: 0,
|
|
176
|
+
maxTimeout: 0,
|
|
177
|
+
factor: 1,
|
|
178
|
+
randomize: false,
|
|
179
|
+
onFailedAttempt: async (attemptError) => {
|
|
180
|
+
const delayMs = getRetryDelayMs(attemptError);
|
|
181
|
+
if (delayMs <= 0)
|
|
182
|
+
return;
|
|
183
|
+
await sleep(delayMs);
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function getRetryDelayMs(attemptError) {
|
|
188
|
+
const failed = attemptError;
|
|
189
|
+
const attemptNumber = Math.max(1, Number(failed.attemptNumber ?? 1));
|
|
190
|
+
const rootError = failed.cause ?? failed.error ?? attemptError;
|
|
191
|
+
if (rootError instanceof HttpStatusError && rootError.rateLimit.retryAfterSeconds !== undefined) {
|
|
192
|
+
return rootError.rateLimit.retryAfterSeconds * 1000 + jitterMs(RETRY_AFTER_JITTER_MS);
|
|
193
|
+
}
|
|
194
|
+
const baseMs = Math.min(RETRY_BACKOFF_MAX_MS, RETRY_BACKOFF_BASE_MS * 2 ** (attemptNumber - 1));
|
|
195
|
+
return baseMs + jitterMs(RETRY_BACKOFF_BASE_MS);
|
|
196
|
+
}
|
|
197
|
+
function sleep(ms) {
|
|
198
|
+
return new Promise((resolve) => {
|
|
199
|
+
setTimeout(resolve, ms);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
function jitterMs(maxMs) {
|
|
203
|
+
if (maxMs <= 0)
|
|
204
|
+
return 0;
|
|
205
|
+
return Math.floor(Math.random() * maxMs);
|
|
206
|
+
}
|
|
207
|
+
function throwHttpStatusError(status, text, headers) {
|
|
208
|
+
const rateLimit = parseRateLimitInfo(headers);
|
|
209
|
+
const message = buildHttpErrorMessage(status, text, rateLimit);
|
|
210
|
+
if (status === 429 || status >= 500) {
|
|
211
|
+
throw new HttpStatusError(status, message, rateLimit);
|
|
212
|
+
}
|
|
213
|
+
throw new AbortError(message);
|
|
214
|
+
}
|
|
215
|
+
function buildHttpErrorMessage(status, text, rateLimit) {
|
|
216
|
+
const base = text || `HTTP ${status}`;
|
|
217
|
+
const details = [];
|
|
218
|
+
if (rateLimit.retryAfterSeconds !== undefined) {
|
|
219
|
+
details.push(`retry in ${rateLimit.retryAfterSeconds}s`);
|
|
220
|
+
}
|
|
221
|
+
if (rateLimit.remaining !== undefined && rateLimit.limit !== undefined) {
|
|
222
|
+
details.push(`remaining: ${rateLimit.remaining}/${rateLimit.limit}`);
|
|
223
|
+
}
|
|
224
|
+
if (rateLimit.resetDelaySeconds !== undefined) {
|
|
225
|
+
details.push(`reset in ${rateLimit.resetDelaySeconds}s`);
|
|
226
|
+
}
|
|
227
|
+
if (details.length === 0) {
|
|
228
|
+
return base;
|
|
229
|
+
}
|
|
230
|
+
return `${base} (${details.join(", ")})`;
|
|
231
|
+
}
|
|
232
|
+
function parseRateLimitInfo(headers) {
|
|
233
|
+
if (!headers)
|
|
234
|
+
return {};
|
|
235
|
+
const limit = parseIntHeader(getHeader(headers, "x-ratelimit-limit") ?? getHeader(headers, "ratelimit-limit"));
|
|
236
|
+
const remaining = parseIntHeader(getHeader(headers, "x-ratelimit-remaining") ?? getHeader(headers, "ratelimit-remaining"));
|
|
237
|
+
const nowMs = Date.now();
|
|
238
|
+
const retryAfterSeconds = parseRetryAfterSeconds(getHeader(headers, "retry-after"), nowMs);
|
|
239
|
+
const resetDelaySeconds = parseResetDelaySeconds(headers, nowMs, retryAfterSeconds);
|
|
240
|
+
return {
|
|
241
|
+
limit,
|
|
242
|
+
remaining,
|
|
243
|
+
resetDelaySeconds,
|
|
244
|
+
retryAfterSeconds,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function parseResetDelaySeconds(headers, nowMs, retryAfterSeconds) {
|
|
248
|
+
if (retryAfterSeconds !== undefined)
|
|
249
|
+
return retryAfterSeconds;
|
|
250
|
+
const standardized = parseIntHeader(getHeader(headers, "ratelimit-reset"));
|
|
251
|
+
if (standardized !== undefined) {
|
|
252
|
+
return Math.max(1, standardized);
|
|
253
|
+
}
|
|
254
|
+
const legacyEpochSeconds = parseIntHeader(getHeader(headers, "x-ratelimit-reset"));
|
|
255
|
+
if (legacyEpochSeconds === undefined)
|
|
256
|
+
return undefined;
|
|
257
|
+
const nowSeconds = Math.floor(nowMs / 1000);
|
|
258
|
+
return Math.max(1, legacyEpochSeconds - nowSeconds);
|
|
259
|
+
}
|
|
260
|
+
function parseRetryAfterSeconds(value, nowMs) {
|
|
261
|
+
if (!value)
|
|
262
|
+
return undefined;
|
|
263
|
+
const trimmed = value.trim();
|
|
264
|
+
if (!trimmed)
|
|
265
|
+
return undefined;
|
|
266
|
+
const asNumber = Number(trimmed);
|
|
267
|
+
if (Number.isFinite(asNumber) && asNumber >= 0) {
|
|
268
|
+
// Compatibility guard for older servers that accidentally sent Unix epoch seconds.
|
|
269
|
+
if (asNumber > 31_536_000) {
|
|
270
|
+
const nowSeconds = Math.floor(nowMs / 1000);
|
|
271
|
+
return Math.max(1, Math.ceil(asNumber - nowSeconds));
|
|
272
|
+
}
|
|
273
|
+
return Math.max(1, Math.ceil(asNumber));
|
|
274
|
+
}
|
|
275
|
+
const asDateMs = Date.parse(trimmed);
|
|
276
|
+
if (!Number.isFinite(asDateMs))
|
|
277
|
+
return undefined;
|
|
278
|
+
return Math.max(1, Math.ceil((asDateMs - nowMs) / 1000));
|
|
279
|
+
}
|
|
280
|
+
function parseIntHeader(value) {
|
|
281
|
+
if (!value)
|
|
282
|
+
return undefined;
|
|
283
|
+
const parsed = Number.parseInt(value, 10);
|
|
284
|
+
if (!Number.isFinite(parsed))
|
|
285
|
+
return undefined;
|
|
286
|
+
return parsed;
|
|
287
|
+
}
|
|
288
|
+
function getHeader(headers, key) {
|
|
289
|
+
if (!headers)
|
|
290
|
+
return undefined;
|
|
291
|
+
if (headers instanceof Headers) {
|
|
292
|
+
const value = headers.get(key);
|
|
293
|
+
return value === null ? undefined : value;
|
|
294
|
+
}
|
|
295
|
+
const normalizedKey = key.toLowerCase();
|
|
296
|
+
const direct = headers[normalizedKey] ?? headers[key];
|
|
297
|
+
if (typeof direct === "string" && direct.trim())
|
|
298
|
+
return direct.trim();
|
|
299
|
+
const match = Object.entries(headers).find(([entryKey, entryValue]) => entryKey.toLowerCase() === normalizedKey &&
|
|
300
|
+
typeof entryValue === "string" &&
|
|
301
|
+
entryValue.trim());
|
|
302
|
+
return typeof match?.[1] === "string" ? match[1].trim() : undefined;
|
|
303
|
+
}
|
|
304
|
+
async function fetchJsonViaCurl(url, args) {
|
|
305
|
+
const headers = ["-H", "Accept: application/json"];
|
|
306
|
+
if (args.token) {
|
|
307
|
+
headers.push("-H", `Authorization: Bearer ${args.token}`);
|
|
308
|
+
}
|
|
309
|
+
const curlArgs = [
|
|
310
|
+
"--silent",
|
|
311
|
+
"--show-error",
|
|
312
|
+
"--location",
|
|
313
|
+
"--max-time",
|
|
314
|
+
String(REQUEST_TIMEOUT_SECONDS),
|
|
315
|
+
"--write-out",
|
|
316
|
+
CURL_WRITE_OUT_FORMAT,
|
|
317
|
+
"-X",
|
|
318
|
+
args.method,
|
|
319
|
+
...headers,
|
|
320
|
+
url,
|
|
321
|
+
];
|
|
322
|
+
if (args.method === "POST") {
|
|
323
|
+
curlArgs.push("-H", "Content-Type: application/json");
|
|
324
|
+
curlArgs.push("--data-binary", JSON.stringify(args.body ?? {}));
|
|
325
|
+
}
|
|
326
|
+
const result = spawnSync("curl", curlArgs, { encoding: "utf8" });
|
|
327
|
+
if (result.status !== 0) {
|
|
328
|
+
throw new Error(result.stderr || "curl failed");
|
|
329
|
+
}
|
|
330
|
+
const { body, status, headers: responseHeaders } = parseCurlBodyAndMeta(result.stdout ?? "");
|
|
331
|
+
if (status < 200 || status >= 300) {
|
|
332
|
+
throwHttpStatusError(status, body, responseHeaders);
|
|
333
|
+
}
|
|
334
|
+
return JSON.parse(body || "null");
|
|
335
|
+
}
|
|
336
|
+
async function fetchJsonFormViaCurl(url, args) {
|
|
337
|
+
const headers = ["-H", "Accept: application/json"];
|
|
338
|
+
if (args.token) {
|
|
339
|
+
headers.push("-H", `Authorization: Bearer ${args.token}`);
|
|
340
|
+
}
|
|
341
|
+
const tempDir = await mkdtemp(join(tmpdir(), "clawhub-upload-"));
|
|
342
|
+
try {
|
|
343
|
+
const formArgs = [];
|
|
344
|
+
for (const [key, value] of args.form.entries()) {
|
|
345
|
+
if (value instanceof Blob) {
|
|
346
|
+
const filename = typeof value.name === "string" ? value.name : "file";
|
|
347
|
+
const filePath = join(tempDir, filename);
|
|
348
|
+
const bytes = new Uint8Array(await value.arrayBuffer());
|
|
349
|
+
await writeFile(filePath, bytes);
|
|
350
|
+
formArgs.push("-F", `${key}=@${filePath};filename=${filename}`);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
formArgs.push("-F", `${key}=${String(value)}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const curlArgs = [
|
|
357
|
+
"--silent",
|
|
358
|
+
"--show-error",
|
|
359
|
+
"--location",
|
|
360
|
+
"--max-time",
|
|
361
|
+
String(UPLOAD_TIMEOUT_SECONDS),
|
|
362
|
+
"--write-out",
|
|
363
|
+
CURL_WRITE_OUT_FORMAT,
|
|
364
|
+
"-X",
|
|
365
|
+
args.method,
|
|
366
|
+
...headers,
|
|
367
|
+
...formArgs,
|
|
368
|
+
url,
|
|
369
|
+
];
|
|
370
|
+
const result = spawnSync("curl", curlArgs, { encoding: "utf8" });
|
|
371
|
+
if (result.status !== 0) {
|
|
372
|
+
throw new Error(result.stderr || "curl failed");
|
|
373
|
+
}
|
|
374
|
+
const { body, status, headers: responseHeaders } = parseCurlBodyAndMeta(result.stdout ?? "");
|
|
375
|
+
if (status < 200 || status >= 300) {
|
|
376
|
+
throwHttpStatusError(status, body, responseHeaders);
|
|
377
|
+
}
|
|
378
|
+
return JSON.parse(body || "null");
|
|
379
|
+
}
|
|
380
|
+
finally {
|
|
381
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
async function fetchTextViaCurl(url, args) {
|
|
385
|
+
const headers = ["-H", "Accept: text/plain"];
|
|
386
|
+
if (args.token) {
|
|
387
|
+
headers.push("-H", `Authorization: Bearer ${args.token}`);
|
|
388
|
+
}
|
|
389
|
+
const curlArgs = [
|
|
390
|
+
"--silent",
|
|
391
|
+
"--show-error",
|
|
392
|
+
"--location",
|
|
393
|
+
"--max-time",
|
|
394
|
+
String(REQUEST_TIMEOUT_SECONDS),
|
|
395
|
+
"--write-out",
|
|
396
|
+
CURL_WRITE_OUT_FORMAT,
|
|
397
|
+
"-X",
|
|
398
|
+
"GET",
|
|
399
|
+
...headers,
|
|
400
|
+
url,
|
|
401
|
+
];
|
|
402
|
+
const result = spawnSync("curl", curlArgs, { encoding: "utf8" });
|
|
403
|
+
if (result.status !== 0) {
|
|
404
|
+
throw new Error(result.stderr || "curl failed");
|
|
405
|
+
}
|
|
406
|
+
const { body, status, headers: responseHeaders } = parseCurlBodyAndMeta(result.stdout ?? "");
|
|
407
|
+
if (status < 200 || status >= 300) {
|
|
408
|
+
throwHttpStatusError(status, body, responseHeaders);
|
|
409
|
+
}
|
|
410
|
+
return body;
|
|
411
|
+
}
|
|
412
|
+
async function fetchBinaryViaCurl(url, token) {
|
|
413
|
+
const tempDir = await mkdtemp(join(tmpdir(), "clawhub-download-"));
|
|
414
|
+
const filePath = join(tempDir, "payload.bin");
|
|
415
|
+
try {
|
|
416
|
+
const headers = [];
|
|
417
|
+
if (token) {
|
|
418
|
+
headers.push("-H", `Authorization: Bearer ${token}`);
|
|
419
|
+
}
|
|
420
|
+
const curlArgs = [
|
|
421
|
+
"--silent",
|
|
422
|
+
"--show-error",
|
|
423
|
+
"--location",
|
|
424
|
+
"--max-time",
|
|
425
|
+
String(REQUEST_TIMEOUT_SECONDS),
|
|
426
|
+
...headers,
|
|
427
|
+
"-o",
|
|
428
|
+
filePath,
|
|
429
|
+
"--write-out",
|
|
430
|
+
CURL_WRITE_OUT_FORMAT,
|
|
431
|
+
url,
|
|
432
|
+
];
|
|
433
|
+
const result = spawnSync("curl", curlArgs, { encoding: "utf8" });
|
|
434
|
+
if (result.status !== 0) {
|
|
435
|
+
throw new Error(result.stderr || "curl failed");
|
|
436
|
+
}
|
|
437
|
+
const { status, headers: responseHeaders } = parseCurlBodyAndMeta(result.stdout ?? "");
|
|
438
|
+
if (status < 200 || status >= 300) {
|
|
439
|
+
const body = await readFileSafe(filePath);
|
|
440
|
+
throwHttpStatusError(status, body ? new TextDecoder().decode(body) : "", responseHeaders);
|
|
441
|
+
}
|
|
442
|
+
const bytes = await readFileSafe(filePath);
|
|
443
|
+
return bytes ? new Uint8Array(bytes) : new Uint8Array();
|
|
444
|
+
}
|
|
445
|
+
finally {
|
|
446
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function parseCurlBodyAndMeta(output) {
|
|
450
|
+
const marker = `\n${CURL_META_MARKER}\n`;
|
|
451
|
+
const markerIndex = output.lastIndexOf(marker);
|
|
452
|
+
if (markerIndex === -1) {
|
|
453
|
+
// Backward compatibility for older tests that only provide "<body>\n<status>".
|
|
454
|
+
const splitAt = output.lastIndexOf("\n");
|
|
455
|
+
if (splitAt === -1) {
|
|
456
|
+
const statusOnly = Number(output.trim());
|
|
457
|
+
if (!Number.isFinite(statusOnly))
|
|
458
|
+
throw new Error("curl response missing status");
|
|
459
|
+
return { body: "", status: statusOnly, headers: {} };
|
|
460
|
+
}
|
|
461
|
+
const body = output.slice(0, splitAt);
|
|
462
|
+
const status = Number(output.slice(splitAt + 1).trim());
|
|
463
|
+
if (!Number.isFinite(status))
|
|
464
|
+
throw new Error("curl response missing status");
|
|
465
|
+
return { body, status, headers: {} };
|
|
466
|
+
}
|
|
467
|
+
const body = output.slice(0, markerIndex);
|
|
468
|
+
const meta = output.slice(markerIndex + marker.length).replace(/\r/g, "");
|
|
469
|
+
const lines = meta.split("\n");
|
|
470
|
+
const status = Number((lines[0] ?? "").trim());
|
|
471
|
+
if (!Number.isFinite(status))
|
|
472
|
+
throw new Error("curl response missing status");
|
|
473
|
+
const [xRateLimitLimit, xRateLimitRemaining, xRateLimitReset, rateLimitLimit, rateLimitRemaining, rateLimitReset, retryAfter,] = lines.slice(1);
|
|
474
|
+
const headers = {};
|
|
475
|
+
setHeaderIfPresent(headers, "x-ratelimit-limit", xRateLimitLimit);
|
|
476
|
+
setHeaderIfPresent(headers, "x-ratelimit-remaining", xRateLimitRemaining);
|
|
477
|
+
setHeaderIfPresent(headers, "x-ratelimit-reset", xRateLimitReset);
|
|
478
|
+
setHeaderIfPresent(headers, "ratelimit-limit", rateLimitLimit);
|
|
479
|
+
setHeaderIfPresent(headers, "ratelimit-remaining", rateLimitRemaining);
|
|
480
|
+
setHeaderIfPresent(headers, "ratelimit-reset", rateLimitReset);
|
|
481
|
+
setHeaderIfPresent(headers, "retry-after", retryAfter);
|
|
482
|
+
return { body, status, headers };
|
|
483
|
+
}
|
|
484
|
+
function setHeaderIfPresent(headers, key, value) {
|
|
485
|
+
if (typeof value !== "string")
|
|
486
|
+
return;
|
|
487
|
+
const trimmed = value.trim();
|
|
488
|
+
if (!trimmed)
|
|
489
|
+
return;
|
|
490
|
+
headers[key] = trimmed;
|
|
491
|
+
}
|
|
492
|
+
async function readFileSafe(path) {
|
|
493
|
+
try {
|
|
494
|
+
const { readFile } = await import("node:fs/promises");
|
|
495
|
+
return await readFile(path);
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
return null;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ArkErrors } from "arktype";
|
|
2
|
+
export function parseArk(schema, data, label) {
|
|
3
|
+
const result = schema(data);
|
|
4
|
+
if (result instanceof ArkErrors) {
|
|
5
|
+
throw new Error(`${label}: ${formatArkErrors(result)}`);
|
|
6
|
+
}
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
export function formatArkErrors(errors) {
|
|
10
|
+
const parts = [];
|
|
11
|
+
for (const error of errors) {
|
|
12
|
+
if (parts.length >= 3)
|
|
13
|
+
break;
|
|
14
|
+
const path = Array.isArray(error.path) ? error.path.join(".") : "";
|
|
15
|
+
const location = path ? `${path}: ` : "";
|
|
16
|
+
const description = typeof error.description === "string"
|
|
17
|
+
? error.description
|
|
18
|
+
: "invalid value";
|
|
19
|
+
parts.push(`${location}${description}`);
|
|
20
|
+
}
|
|
21
|
+
if (errors.count > parts.length) {
|
|
22
|
+
parts.push(`+${errors.count - parts.length} more`);
|
|
23
|
+
}
|
|
24
|
+
return parts.join("; ");
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ark.js","sourceRoot":"","sources":["../../src/schema/ark.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpC,MAAM,UAAU,QAAQ,CAAI,MAAuB,EAAE,IAAa,EAAE,KAAa;IAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,MAAM,YAAY,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE,MAAM;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,WAAW,GACf,OAAQ,KAAmC,CAAC,WAAW,KAAK,QAAQ;YAClE,CAAC,CAAG,KAAiC,CAAC,WAAsB;YAC5D,CAAC,CAAC,eAAe,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,WAAW,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { ArkValidator } from "./ark.js";
|
|
2
|
+
export { formatArkErrors, parseArk } from "./ark.js";
|
|
3
|
+
export { PLATFORM_SKILL_LICENSE, PLATFORM_SKILL_LICENSE_NAME, PLATFORM_SKILL_LICENSE_SUMMARY, PLATFORM_SKILL_LICENSE_URL, } from "clawhub-schema";
|
|
4
|
+
export { ApiRoutes, LegacyApiRoutes } from "./routes.js";
|
|
5
|
+
export * from "./schemas.js";
|
|
6
|
+
export * from "./textFiles.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { formatArkErrors, parseArk } from "./ark.js";
|
|
2
|
+
export { PLATFORM_SKILL_LICENSE, PLATFORM_SKILL_LICENSE_NAME, PLATFORM_SKILL_LICENSE_SUMMARY, PLATFORM_SKILL_LICENSE_URL, } from "clawhub-schema";
|
|
3
|
+
export { ApiRoutes, LegacyApiRoutes } from "./routes.js";
|
|
4
|
+
export * from "./schemas.js";
|
|
5
|
+
export * from "./textFiles.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const LegacyApiRoutes: {
|
|
2
|
+
readonly download: "/api/download";
|
|
3
|
+
readonly search: "/api/search";
|
|
4
|
+
readonly skill: "/api/skill";
|
|
5
|
+
readonly skillResolve: "/api/skill/resolve";
|
|
6
|
+
readonly cliWhoami: "/api/cli/whoami";
|
|
7
|
+
readonly cliUploadUrl: "/api/cli/upload-url";
|
|
8
|
+
readonly cliPublish: "/api/cli/publish";
|
|
9
|
+
readonly cliTelemetrySync: "/api/cli/telemetry/sync";
|
|
10
|
+
readonly cliSkillDelete: "/api/cli/skill/delete";
|
|
11
|
+
readonly cliSkillUndelete: "/api/cli/skill/undelete";
|
|
12
|
+
};
|
|
13
|
+
export declare const ApiRoutes: {
|
|
14
|
+
readonly search: "/api/v1/search";
|
|
15
|
+
readonly resolve: "/api/v1/resolve";
|
|
16
|
+
readonly download: "/api/v1/download";
|
|
17
|
+
readonly skills: "/api/v1/skills";
|
|
18
|
+
readonly stars: "/api/v1/stars";
|
|
19
|
+
readonly transfers: "/api/v1/transfers";
|
|
20
|
+
readonly souls: "/api/v1/souls";
|
|
21
|
+
readonly users: "/api/v1/users";
|
|
22
|
+
readonly whoami: "/api/v1/whoami";
|
|
23
|
+
readonly telemetrySync: "/api/v1/telemetry/sync";
|
|
24
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const LegacyApiRoutes = {
|
|
2
|
+
download: "/api/download",
|
|
3
|
+
search: "/api/search",
|
|
4
|
+
skill: "/api/skill",
|
|
5
|
+
skillResolve: "/api/skill/resolve",
|
|
6
|
+
cliWhoami: "/api/cli/whoami",
|
|
7
|
+
cliUploadUrl: "/api/cli/upload-url",
|
|
8
|
+
cliPublish: "/api/cli/publish",
|
|
9
|
+
cliTelemetrySync: "/api/cli/telemetry/sync",
|
|
10
|
+
cliSkillDelete: "/api/cli/skill/delete",
|
|
11
|
+
cliSkillUndelete: "/api/cli/skill/undelete",
|
|
12
|
+
};
|
|
13
|
+
export const ApiRoutes = {
|
|
14
|
+
search: "/api/v1/search",
|
|
15
|
+
resolve: "/api/v1/resolve",
|
|
16
|
+
download: "/api/v1/download",
|
|
17
|
+
skills: "/api/v1/skills",
|
|
18
|
+
stars: "/api/v1/stars",
|
|
19
|
+
transfers: "/api/v1/transfers",
|
|
20
|
+
souls: "/api/v1/souls",
|
|
21
|
+
users: "/api/v1/users",
|
|
22
|
+
whoami: "/api/v1/whoami",
|
|
23
|
+
telemetrySync: "/api/v1/telemetry/sync",
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/schema/routes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,oBAAoB;IAClC,SAAS,EAAE,iBAAiB;IAC5B,YAAY,EAAE,qBAAqB;IACnC,UAAU,EAAE,kBAAkB;IAC9B,gBAAgB,EAAE,yBAAyB;IAC3C,cAAc,EAAE,uBAAuB;IACvC,gBAAgB,EAAE,yBAAyB;CACnC,CAAC;AAEX,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,iBAAiB;IAC1B,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,eAAe;IACtB,SAAS,EAAE,mBAAmB;IAC9B,KAAK,EAAE,eAAe;IACtB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,aAAa,EAAE,wBAAwB;CAC/B,CAAC"}
|