pilothub 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -0
- package/README.md +36 -129
- package/dist/browserAuth.d.ts +20 -0
- package/dist/browserAuth.js +156 -0
- package/dist/browserAuth.js.map +1 -0
- package/dist/browserAuth.test.d.ts +1 -0
- package/dist/browserAuth.test.js +83 -0
- package/dist/browserAuth.test.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/commands/auth.d.ts +9 -0
- package/dist/cli/commands/auth.js +75 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +11 -0
- package/dist/cli/commands/delete.js +67 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/delete.test.d.ts +1 -0
- package/dist/cli/commands/delete.test.js +52 -0
- package/dist/cli/commands/delete.test.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +9 -0
- package/dist/cli/commands/publish.js +87 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/publish.test.d.ts +1 -0
- package/dist/cli/commands/publish.test.js +104 -0
- package/dist/cli/commands/publish.test.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +23 -0
- package/dist/cli/commands/skills.js +298 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/skills.test.d.ts +1 -0
- package/dist/cli/commands/skills.test.js +156 -0
- package/dist/cli/commands/skills.test.js.map +1 -0
- package/dist/cli/commands/star.d.ts +8 -0
- package/dist/cli/commands/star.js +38 -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 +160 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/sync.test.d.ts +1 -0
- package/dist/cli/commands/sync.test.js +277 -0
- package/dist/cli/commands/sync.test.js.map +1 -0
- package/dist/cli/commands/syncHelpers.d.ts +76 -0
- package/dist/cli/commands/syncHelpers.js +349 -0
- package/dist/cli/commands/syncHelpers.js.map +1 -0
- package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
- package/dist/cli/commands/syncHelpers.test.js +22 -0
- package/dist/cli/commands/syncHelpers.test.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/unstar.d.ts +8 -0
- package/dist/cli/commands/unstar.js +38 -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/pilotbotConfig.d.ts +6 -0
- package/dist/cli/pilotbotConfig.js +110 -0
- package/dist/cli/pilotbotConfig.js.map +1 -0
- package/dist/cli/pilotbotConfig.test.d.ts +1 -0
- package/dist/cli/pilotbotConfig.test.js +133 -0
- package/dist/cli/pilotbotConfig.test.js.map +1 -0
- package/dist/cli/registry.d.ts +7 -0
- package/dist/cli/registry.js +42 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/registry.test.d.ts +1 -0
- package/dist/cli/registry.test.js +48 -0
- package/dist/cli/registry.test.js.map +1 -0
- package/dist/cli/scanSkills.d.ts +7 -0
- package/dist/cli/scanSkills.js +75 -0
- package/dist/cli/scanSkills.js.map +1 -0
- package/dist/cli/scanSkills.test.d.ts +1 -0
- package/dist/cli/scanSkills.test.js +60 -0
- package/dist/cli/scanSkills.test.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 +72 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +268 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +5 -0
- package/dist/discovery.js +21 -0
- package/dist/discovery.js.map +1 -0
- package/dist/discovery.test.d.ts +1 -0
- package/dist/discovery.test.js +46 -0
- package/dist/discovery.test.js.map +1 -0
- package/dist/http.d.ts +32 -0
- package/dist/http.js +261 -0
- package/dist/http.js.map +1 -0
- package/dist/http.test.d.ts +1 -0
- package/dist/http.test.js +135 -0
- package/dist/http.test.js.map +1 -0
- package/dist/schema/ark.js.map +1 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/routes.js.map +1 -0
- package/{packages/schema/dist → dist/schema}/schemas.d.ts +0 -39
- package/{packages/schema/dist → dist/schema}/schemas.js +0 -22
- package/dist/schema/schemas.js.map +1 -0
- package/dist/schema/textFiles.js.map +1 -0
- package/dist/schema/textFiles.test.d.ts +1 -0
- package/dist/schema/textFiles.test.js +20 -0
- package/dist/schema/textFiles.test.js.map +1 -0
- package/dist/skills.d.ts +43 -0
- package/dist/skills.js +163 -0
- package/dist/skills.js.map +1 -0
- package/dist/skills.test.d.ts +1 -0
- package/dist/skills.test.js +144 -0
- package/dist/skills.test.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 +27 -70
- package/.env.local.example +0 -19
- package/.github/workflows/ci.yml +0 -40
- package/.oxlintrc.json +0 -3
- package/AGENTS.md +0 -45
- package/CHANGELOG.md +0 -138
- package/DEPRECATIONS.md +0 -7
- package/biome.json +0 -41
- package/convex/_generated/api.d.ts +0 -153
- package/convex/_generated/api.js +0 -23
- package/convex/_generated/dataModel.d.ts +0 -60
- package/convex/_generated/server.d.ts +0 -143
- package/convex/_generated/server.js +0 -93
- package/convex/auth.config.ts +0 -8
- package/convex/auth.ts +0 -19
- package/convex/comments.ts +0 -88
- package/convex/crons.ts +0 -34
- package/convex/devSeed.ts +0 -459
- package/convex/devSeedExtra.ts +0 -541
- package/convex/downloads.ts +0 -78
- package/convex/githubBackups.ts +0 -170
- package/convex/githubBackupsNode.ts +0 -183
- package/convex/githubImport.ts +0 -317
- package/convex/githubSoulBackups.ts +0 -170
- package/convex/githubSoulBackupsNode.ts +0 -186
- package/convex/http.ts +0 -194
- package/convex/httpApi.handlers.test.ts +0 -488
- package/convex/httpApi.test.ts +0 -70
- package/convex/httpApi.ts +0 -305
- package/convex/httpApiV1.handlers.test.ts +0 -584
- package/convex/httpApiV1.ts +0 -1172
- package/convex/leaderboards.ts +0 -39
- package/convex/lib/access.ts +0 -36
- package/convex/lib/apiTokenAuth.ts +0 -36
- package/convex/lib/badges.ts +0 -50
- package/convex/lib/changelog.test.ts +0 -34
- package/convex/lib/changelog.ts +0 -278
- package/convex/lib/embeddings.ts +0 -38
- package/convex/lib/githubBackup.ts +0 -443
- package/convex/lib/githubImport.test.ts +0 -247
- package/convex/lib/githubImport.ts +0 -425
- package/convex/lib/githubSoulBackup.ts +0 -443
- package/convex/lib/leaderboards.ts +0 -103
- package/convex/lib/moderation.ts +0 -42
- package/convex/lib/public.ts +0 -89
- package/convex/lib/searchText.test.ts +0 -46
- package/convex/lib/searchText.ts +0 -27
- package/convex/lib/skillBackfill.test.ts +0 -34
- package/convex/lib/skillBackfill.ts +0 -67
- package/convex/lib/skillPublish.test.ts +0 -28
- package/convex/lib/skillPublish.ts +0 -284
- package/convex/lib/skillStats.ts +0 -80
- package/convex/lib/skills.test.ts +0 -197
- package/convex/lib/skills.ts +0 -273
- package/convex/lib/soulChangelog.ts +0 -273
- package/convex/lib/soulPublish.ts +0 -236
- package/convex/lib/tokens.test.ts +0 -33
- package/convex/lib/tokens.ts +0 -51
- package/convex/lib/webhooks.test.ts +0 -91
- package/convex/lib/webhooks.ts +0 -112
- package/convex/maintenance.test.ts +0 -270
- package/convex/maintenance.ts +0 -840
- package/convex/rateLimits.ts +0 -50
- package/convex/schema.ts +0 -472
- package/convex/search.test.ts +0 -12
- package/convex/search.ts +0 -254
- package/convex/seed.test.ts +0 -37
- package/convex/seed.ts +0 -254
- package/convex/seedSouls.ts +0 -111
- package/convex/skillStatEvents.ts +0 -568
- package/convex/skills.ts +0 -1606
- package/convex/soulComments.ts +0 -88
- package/convex/soulDownloads.ts +0 -14
- package/convex/soulStars.ts +0 -71
- package/convex/souls.ts +0 -570
- package/convex/stars.ts +0 -108
- package/convex/statsMaintenance.ts +0 -205
- package/convex/telemetry.ts +0 -434
- package/convex/tokens.ts +0 -88
- package/convex/tsconfig.json +0 -7
- package/convex/uploads.ts +0 -20
- package/convex/users.ts +0 -122
- package/convex/webhooks.ts +0 -50
- package/convex.json +0 -3
- package/docs/README.md +0 -32
- package/docs/api.md +0 -51
- package/docs/architecture.md +0 -61
- package/docs/auth.md +0 -54
- package/docs/cli.md +0 -117
- package/docs/deploy.md +0 -78
- package/docs/diffing.md +0 -84
- package/docs/github-import.md +0 -171
- package/docs/http-api.md +0 -187
- package/docs/manual-testing.md +0 -64
- package/docs/mintlify.md +0 -43
- package/docs/quickstart.md +0 -120
- package/docs/skill-format.md +0 -58
- package/docs/soul-format.md +0 -37
- package/docs/spec.md +0 -177
- package/docs/telemetry.md +0 -91
- package/docs/troubleshooting.md +0 -49
- package/docs/webhook.md +0 -51
- package/e2e/menu-smoke.pw.test.ts +0 -49
- package/e2e/pilothub.e2e.test.ts +0 -494
- package/e2e/search-exact.pw.test.ts +0 -97
- package/packages/pilothub/LICENSE +0 -22
- package/packages/pilothub/README.md +0 -57
- package/packages/pilothub/package.json +0 -41
- package/packages/pilothub/src/browserAuth.test.ts +0 -96
- package/packages/pilothub/src/browserAuth.ts +0 -174
- package/packages/pilothub/src/cli/buildInfo.ts +0 -94
- package/packages/pilothub/src/cli/commands/auth.ts +0 -97
- package/packages/pilothub/src/cli/commands/delete.test.ts +0 -73
- package/packages/pilothub/src/cli/commands/delete.ts +0 -83
- package/packages/pilothub/src/cli/commands/publish.test.ts +0 -122
- package/packages/pilothub/src/cli/commands/publish.ts +0 -108
- package/packages/pilothub/src/cli/commands/skills.test.ts +0 -191
- package/packages/pilothub/src/cli/commands/skills.ts +0 -380
- package/packages/pilothub/src/cli/commands/star.ts +0 -46
- package/packages/pilothub/src/cli/commands/sync.test.ts +0 -310
- package/packages/pilothub/src/cli/commands/sync.ts +0 -200
- package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +0 -26
- package/packages/pilothub/src/cli/commands/syncHelpers.ts +0 -427
- package/packages/pilothub/src/cli/commands/syncTypes.ts +0 -27
- package/packages/pilothub/src/cli/commands/unstar.ts +0 -48
- package/packages/pilothub/src/cli/helpStyle.ts +0 -45
- package/packages/pilothub/src/cli/pilotbotConfig.test.ts +0 -159
- package/packages/pilothub/src/cli/pilotbotConfig.ts +0 -147
- package/packages/pilothub/src/cli/registry.test.ts +0 -63
- package/packages/pilothub/src/cli/registry.ts +0 -43
- package/packages/pilothub/src/cli/scanSkills.test.ts +0 -64
- package/packages/pilothub/src/cli/scanSkills.ts +0 -84
- package/packages/pilothub/src/cli/slug.ts +0 -16
- package/packages/pilothub/src/cli/types.ts +0 -12
- package/packages/pilothub/src/cli/ui.ts +0 -75
- package/packages/pilothub/src/cli.ts +0 -311
- package/packages/pilothub/src/config.ts +0 -36
- package/packages/pilothub/src/discovery.test.ts +0 -75
- package/packages/pilothub/src/discovery.ts +0 -19
- package/packages/pilothub/src/http.test.ts +0 -156
- package/packages/pilothub/src/http.ts +0 -301
- package/packages/pilothub/src/schema/ark.ts +0 -29
- package/packages/pilothub/src/schema/index.ts +0 -5
- package/packages/pilothub/src/schema/routes.ts +0 -22
- package/packages/pilothub/src/schema/schemas.ts +0 -260
- package/packages/pilothub/src/schema/textFiles.test.ts +0 -23
- package/packages/pilothub/src/schema/textFiles.ts +0 -66
- package/packages/pilothub/src/skills.test.ts +0 -191
- package/packages/pilothub/src/skills.ts +0 -172
- package/packages/pilothub/src/types.ts +0 -10
- package/packages/pilothub/tsconfig.json +0 -14
- package/packages/schema/README.md +0 -3
- package/packages/schema/dist/ark.js.map +0 -1
- package/packages/schema/dist/index.js.map +0 -1
- package/packages/schema/dist/routes.js.map +0 -1
- package/packages/schema/dist/schemas.js.map +0 -1
- package/packages/schema/dist/textFiles.js.map +0 -1
- package/packages/schema/package.json +0 -26
- package/packages/schema/src/ark.ts +0 -29
- package/packages/schema/src/index.ts +0 -5
- package/packages/schema/src/routes.ts +0 -22
- package/packages/schema/src/schemas.test.ts +0 -123
- package/packages/schema/src/schemas.ts +0 -287
- package/packages/schema/src/textFiles.test.ts +0 -23
- package/packages/schema/src/textFiles.ts +0 -66
- package/packages/schema/tsconfig.json +0 -15
- package/pilothub +0 -46
- package/playwright.config.ts +0 -33
- package/public/.well-known/pilothub.json +0 -6
- package/public/api/v1/openapi.json +0 -379
- package/public/favicon.ico +0 -0
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +0 -25
- package/public/og.png +0 -0
- package/public/og.svg +0 -98
- package/public/pilot-logo.png +0 -0
- package/public/pilot-mark.png +0 -0
- package/public/robots.txt +0 -3
- package/public/tanstack-circle-logo.png +0 -0
- package/public/tanstack-word-logo-white.svg +0 -1
- package/scripts/check-peer-deps.ts +0 -56
- package/scripts/docs-list.ts +0 -148
- package/scripts/run-playwright-local.sh +0 -14
- package/server/og/fetchSkillOgMeta.ts +0 -27
- package/server/og/fetchSoulOgMeta.ts +0 -27
- package/server/og/ogAssets.ts +0 -80
- package/server/og/skillOgSvg.test.ts +0 -59
- package/server/og/skillOgSvg.ts +0 -258
- package/server/og/soulOgSvg.ts +0 -209
- package/server/routes/og/skill.png.ts +0 -103
- package/server/routes/og/soul.png.ts +0 -111
- package/src/__tests__/skill-detail-page.test.tsx +0 -86
- package/src/__tests__/skills-index.test.tsx +0 -145
- package/src/__tests__/upload.route.test.tsx +0 -228
- package/src/components/AppProviders.tsx +0 -19
- package/src/components/ClientOnly.tsx +0 -18
- package/src/components/Footer.tsx +0 -29
- package/src/components/Header.tsx +0 -295
- package/src/components/InstallSwitcher.tsx +0 -53
- package/src/components/SkillCard.tsx +0 -36
- package/src/components/SkillDetailPage.tsx +0 -817
- package/src/components/SkillDiffCard.tsx +0 -485
- package/src/components/SoulCard.tsx +0 -19
- package/src/components/SoulDetailPage.tsx +0 -263
- package/src/components/UserBootstrap.tsx +0 -18
- package/src/components/ui/dropdown-menu.tsx +0 -67
- package/src/components/ui/toggle-group.tsx +0 -35
- package/src/convex/client.ts +0 -3
- package/src/lib/badges.ts +0 -29
- package/src/lib/diffing.test.ts +0 -163
- package/src/lib/diffing.ts +0 -106
- package/src/lib/gravatar.test.ts +0 -9
- package/src/lib/gravatar.ts +0 -158
- package/src/lib/og.test.ts +0 -142
- package/src/lib/og.ts +0 -156
- package/src/lib/publicUser.ts +0 -39
- package/src/lib/roles.ts +0 -19
- package/src/lib/site.test.ts +0 -130
- package/src/lib/site.ts +0 -84
- package/src/lib/theme-transition.test.ts +0 -134
- package/src/lib/theme-transition.ts +0 -134
- package/src/lib/theme.test.tsx +0 -88
- package/src/lib/theme.ts +0 -43
- package/src/lib/uploadFiles.jsdom.test.ts +0 -33
- package/src/lib/uploadFiles.test.ts +0 -123
- package/src/lib/uploadFiles.ts +0 -245
- package/src/lib/uploadUtils.test.ts +0 -78
- package/src/lib/uploadUtils.ts +0 -93
- package/src/lib/useAuthStatus.ts +0 -12
- package/src/lib/utils.test.ts +0 -9
- package/src/lib/utils.ts +0 -6
- package/src/logo.svg +0 -12
- package/src/routeTree.gen.ts +0 -345
- package/src/router.tsx +0 -17
- package/src/routes/$owner/$slug.tsx +0 -55
- package/src/routes/__root.tsx +0 -136
- package/src/routes/admin.tsx +0 -11
- package/src/routes/cli/auth.tsx +0 -168
- package/src/routes/dashboard.tsx +0 -97
- package/src/routes/import.tsx +0 -415
- package/src/routes/index.tsx +0 -252
- package/src/routes/management.tsx +0 -529
- package/src/routes/settings.tsx +0 -203
- package/src/routes/skills/index.tsx +0 -422
- package/src/routes/souls/$slug.tsx +0 -55
- package/src/routes/souls/index.tsx +0 -243
- package/src/routes/stars.tsx +0 -68
- package/src/routes/u/$handle.tsx +0 -307
- package/src/routes/upload/utils.ts +0 -81
- package/src/routes/upload.tsx +0 -499
- package/src/styles.css +0 -2718
- package/tsconfig.json +0 -24
- package/tsconfig.oxlint.json +0 -16
- package/vercel.json +0 -8
- package/vite.config.ts +0 -48
- package/vitest.config.ts +0 -47
- package/vitest.e2e.config.ts +0 -11
- package/vitest.setup.ts +0 -1
- /package/{packages/pilothub/bin → bin}/pilothub.js +0 -0
- /package/{packages/schema/dist → dist/schema}/ark.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/ark.js +0 -0
- /package/{packages/schema/dist → dist/schema}/index.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/index.js +0 -0
- /package/{packages/schema/dist → dist/schema}/routes.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/routes.js +0 -0
- /package/{packages/schema/dist → dist/schema}/textFiles.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/textFiles.js +0 -0
|
@@ -1,301 +0,0 @@
|
|
|
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, setGlobalDispatcher } from 'undici'
|
|
7
|
-
import type { ArkValidator } from './schema/index.js'
|
|
8
|
-
import { ApiRoutes, parseArk } from './schema/index.js'
|
|
9
|
-
|
|
10
|
-
const REQUEST_TIMEOUT_MS = 15_000
|
|
11
|
-
const REQUEST_TIMEOUT_SECONDS = Math.ceil(REQUEST_TIMEOUT_MS / 1000)
|
|
12
|
-
const isBun = typeof process !== 'undefined' && Boolean(process.versions?.bun)
|
|
13
|
-
|
|
14
|
-
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
15
|
-
try {
|
|
16
|
-
setGlobalDispatcher(
|
|
17
|
-
new Agent({
|
|
18
|
-
allowH2: true,
|
|
19
|
-
connect: { timeout: REQUEST_TIMEOUT_MS },
|
|
20
|
-
}),
|
|
21
|
-
)
|
|
22
|
-
} catch {
|
|
23
|
-
// ignore dispatcher setup failures in non-node runtimes
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
type RequestArgs =
|
|
28
|
-
| { method: 'GET' | 'POST' | 'DELETE'; path: string; token?: string; body?: unknown }
|
|
29
|
-
| { method: 'GET' | 'POST' | 'DELETE'; url: string; token?: string; body?: unknown }
|
|
30
|
-
|
|
31
|
-
export async function apiRequest<T>(registry: string, args: RequestArgs): Promise<T>
|
|
32
|
-
export async function apiRequest<T>(
|
|
33
|
-
registry: string,
|
|
34
|
-
args: RequestArgs,
|
|
35
|
-
schema: ArkValidator<T>,
|
|
36
|
-
): Promise<T>
|
|
37
|
-
export async function apiRequest<T>(
|
|
38
|
-
registry: string,
|
|
39
|
-
args: RequestArgs,
|
|
40
|
-
schema?: ArkValidator<T>,
|
|
41
|
-
): Promise<T> {
|
|
42
|
-
const url = 'url' in args ? args.url : new URL(args.path, registry).toString()
|
|
43
|
-
const json = await pRetry(
|
|
44
|
-
async () => {
|
|
45
|
-
if (isBun) {
|
|
46
|
-
return await fetchJsonViaCurl(url, args)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const headers: Record<string, string> = { Accept: 'application/json' }
|
|
50
|
-
if (args.token) headers.Authorization = `Bearer ${args.token}`
|
|
51
|
-
let body: string | undefined
|
|
52
|
-
if (args.method === 'POST') {
|
|
53
|
-
headers['Content-Type'] = 'application/json'
|
|
54
|
-
body = JSON.stringify(args.body ?? {})
|
|
55
|
-
}
|
|
56
|
-
const controller = new AbortController()
|
|
57
|
-
const timeout = setTimeout(() => controller.abort('Timeout'), REQUEST_TIMEOUT_MS)
|
|
58
|
-
const response = await fetch(url, {
|
|
59
|
-
method: args.method,
|
|
60
|
-
headers,
|
|
61
|
-
body,
|
|
62
|
-
signal: controller.signal,
|
|
63
|
-
})
|
|
64
|
-
clearTimeout(timeout)
|
|
65
|
-
if (!response.ok) {
|
|
66
|
-
const text = await response.text().catch(() => '')
|
|
67
|
-
const message = text || `HTTP ${response.status}`
|
|
68
|
-
if (response.status === 429 || response.status >= 500) {
|
|
69
|
-
throw new Error(message)
|
|
70
|
-
}
|
|
71
|
-
throw new AbortError(message)
|
|
72
|
-
}
|
|
73
|
-
return (await response.json()) as unknown
|
|
74
|
-
},
|
|
75
|
-
{ retries: 2 },
|
|
76
|
-
)
|
|
77
|
-
if (schema) return parseArk(schema, json, 'API response')
|
|
78
|
-
return json as T
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
type FormRequestArgs =
|
|
82
|
-
| { method: 'POST'; path: string; token?: string; form: FormData }
|
|
83
|
-
| { method: 'POST'; url: string; token?: string; form: FormData }
|
|
84
|
-
|
|
85
|
-
export async function apiRequestForm<T>(registry: string, args: FormRequestArgs): Promise<T>
|
|
86
|
-
export async function apiRequestForm<T>(
|
|
87
|
-
registry: string,
|
|
88
|
-
args: FormRequestArgs,
|
|
89
|
-
schema: ArkValidator<T>,
|
|
90
|
-
): Promise<T>
|
|
91
|
-
export async function apiRequestForm<T>(
|
|
92
|
-
registry: string,
|
|
93
|
-
args: FormRequestArgs,
|
|
94
|
-
schema?: ArkValidator<T>,
|
|
95
|
-
): Promise<T> {
|
|
96
|
-
const url = 'url' in args ? args.url : new URL(args.path, registry).toString()
|
|
97
|
-
const json = await pRetry(
|
|
98
|
-
async () => {
|
|
99
|
-
if (isBun) {
|
|
100
|
-
return await fetchJsonFormViaCurl(url, args)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const headers: Record<string, string> = { Accept: 'application/json' }
|
|
104
|
-
if (args.token) headers.Authorization = `Bearer ${args.token}`
|
|
105
|
-
const controller = new AbortController()
|
|
106
|
-
const timeout = setTimeout(() => controller.abort('Timeout'), REQUEST_TIMEOUT_MS)
|
|
107
|
-
const response = await fetch(url, {
|
|
108
|
-
method: args.method,
|
|
109
|
-
headers,
|
|
110
|
-
body: args.form,
|
|
111
|
-
signal: controller.signal,
|
|
112
|
-
})
|
|
113
|
-
clearTimeout(timeout)
|
|
114
|
-
if (!response.ok) {
|
|
115
|
-
const text = await response.text().catch(() => '')
|
|
116
|
-
const message = text || `HTTP ${response.status}`
|
|
117
|
-
if (response.status === 429 || response.status >= 500) {
|
|
118
|
-
throw new Error(message)
|
|
119
|
-
}
|
|
120
|
-
throw new AbortError(message)
|
|
121
|
-
}
|
|
122
|
-
return (await response.json()) as unknown
|
|
123
|
-
},
|
|
124
|
-
{ retries: 2 },
|
|
125
|
-
)
|
|
126
|
-
if (schema) return parseArk(schema, json, 'API response')
|
|
127
|
-
return json as T
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export async function downloadZip(registry: string, args: { slug: string; version?: string }) {
|
|
131
|
-
const url = new URL(ApiRoutes.download, registry)
|
|
132
|
-
url.searchParams.set('slug', args.slug)
|
|
133
|
-
if (args.version) url.searchParams.set('version', args.version)
|
|
134
|
-
return pRetry(
|
|
135
|
-
async () => {
|
|
136
|
-
if (isBun) {
|
|
137
|
-
return await fetchBinaryViaCurl(url.toString())
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const controller = new AbortController()
|
|
141
|
-
const timeout = setTimeout(() => controller.abort('Timeout'), REQUEST_TIMEOUT_MS)
|
|
142
|
-
const response = await fetch(url.toString(), { method: 'GET', signal: controller.signal })
|
|
143
|
-
clearTimeout(timeout)
|
|
144
|
-
if (!response.ok) {
|
|
145
|
-
const message = (await response.text().catch(() => '')) || `HTTP ${response.status}`
|
|
146
|
-
if (response.status === 429 || response.status >= 500) {
|
|
147
|
-
throw new Error(message)
|
|
148
|
-
}
|
|
149
|
-
throw new AbortError(message)
|
|
150
|
-
}
|
|
151
|
-
return new Uint8Array(await response.arrayBuffer())
|
|
152
|
-
},
|
|
153
|
-
{ retries: 2 },
|
|
154
|
-
)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async function fetchJsonViaCurl(url: string, args: RequestArgs) {
|
|
158
|
-
const headers = ['-H', 'Accept: application/json']
|
|
159
|
-
if (args.token) {
|
|
160
|
-
headers.push('-H', `Authorization: Bearer ${args.token}`)
|
|
161
|
-
}
|
|
162
|
-
const curlArgs = [
|
|
163
|
-
'--silent',
|
|
164
|
-
'--show-error',
|
|
165
|
-
'--location',
|
|
166
|
-
'--max-time',
|
|
167
|
-
String(REQUEST_TIMEOUT_SECONDS),
|
|
168
|
-
'--write-out',
|
|
169
|
-
'\n%{http_code}',
|
|
170
|
-
'-X',
|
|
171
|
-
args.method,
|
|
172
|
-
...headers,
|
|
173
|
-
url,
|
|
174
|
-
]
|
|
175
|
-
if (args.method === 'POST') {
|
|
176
|
-
curlArgs.push('-H', 'Content-Type: application/json')
|
|
177
|
-
curlArgs.push('--data-binary', JSON.stringify(args.body ?? {}))
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const result = spawnSync('curl', curlArgs, { encoding: 'utf8' })
|
|
181
|
-
if (result.status !== 0) {
|
|
182
|
-
throw new Error(result.stderr || 'curl failed')
|
|
183
|
-
}
|
|
184
|
-
const output = result.stdout ?? ''
|
|
185
|
-
const splitAt = output.lastIndexOf('\n')
|
|
186
|
-
if (splitAt === -1) throw new Error('curl response missing status')
|
|
187
|
-
const body = output.slice(0, splitAt)
|
|
188
|
-
const status = Number(output.slice(splitAt + 1).trim())
|
|
189
|
-
if (!Number.isFinite(status)) throw new Error('curl response missing status')
|
|
190
|
-
if (status < 200 || status >= 300) {
|
|
191
|
-
if (status === 429 || status >= 500) {
|
|
192
|
-
throw new Error(body || `HTTP ${status}`)
|
|
193
|
-
}
|
|
194
|
-
throw new AbortError(body || `HTTP ${status}`)
|
|
195
|
-
}
|
|
196
|
-
return JSON.parse(body || 'null') as unknown
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
async function fetchJsonFormViaCurl(url: string, args: FormRequestArgs) {
|
|
200
|
-
const headers = ['-H', 'Accept: application/json']
|
|
201
|
-
if (args.token) {
|
|
202
|
-
headers.push('-H', `Authorization: Bearer ${args.token}`)
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
const tempDir = await mkdtemp(join(tmpdir(), 'pilothub-upload-'))
|
|
206
|
-
try {
|
|
207
|
-
const formArgs: string[] = []
|
|
208
|
-
for (const [key, value] of args.form.entries()) {
|
|
209
|
-
if (value instanceof Blob) {
|
|
210
|
-
const filename = typeof (value as File).name === 'string' ? (value as File).name : 'file'
|
|
211
|
-
const filePath = join(tempDir, filename)
|
|
212
|
-
const bytes = new Uint8Array(await value.arrayBuffer())
|
|
213
|
-
await writeFile(filePath, bytes)
|
|
214
|
-
formArgs.push('-F', `${key}=@${filePath};filename=${filename}`)
|
|
215
|
-
} else {
|
|
216
|
-
formArgs.push('-F', `${key}=${String(value)}`)
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const curlArgs = [
|
|
221
|
-
'--silent',
|
|
222
|
-
'--show-error',
|
|
223
|
-
'--location',
|
|
224
|
-
'--max-time',
|
|
225
|
-
String(REQUEST_TIMEOUT_SECONDS),
|
|
226
|
-
'--write-out',
|
|
227
|
-
'\n%{http_code}',
|
|
228
|
-
'-X',
|
|
229
|
-
args.method,
|
|
230
|
-
...headers,
|
|
231
|
-
...formArgs,
|
|
232
|
-
url,
|
|
233
|
-
]
|
|
234
|
-
|
|
235
|
-
const result = spawnSync('curl', curlArgs, { encoding: 'utf8' })
|
|
236
|
-
if (result.status !== 0) {
|
|
237
|
-
throw new Error(result.stderr || 'curl failed')
|
|
238
|
-
}
|
|
239
|
-
const output = result.stdout ?? ''
|
|
240
|
-
const splitAt = output.lastIndexOf('\n')
|
|
241
|
-
if (splitAt === -1) throw new Error('curl response missing status')
|
|
242
|
-
const body = output.slice(0, splitAt)
|
|
243
|
-
const status = Number(output.slice(splitAt + 1).trim())
|
|
244
|
-
if (!Number.isFinite(status)) throw new Error('curl response missing status')
|
|
245
|
-
if (status < 200 || status >= 300) {
|
|
246
|
-
if (status === 429 || status >= 500) {
|
|
247
|
-
throw new Error(body || `HTTP ${status}`)
|
|
248
|
-
}
|
|
249
|
-
throw new AbortError(body || `HTTP ${status}`)
|
|
250
|
-
}
|
|
251
|
-
return JSON.parse(body || 'null') as unknown
|
|
252
|
-
} finally {
|
|
253
|
-
await rm(tempDir, { recursive: true, force: true })
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
async function fetchBinaryViaCurl(url: string) {
|
|
258
|
-
const tempDir = await mkdtemp(join(tmpdir(), 'pilothub-download-'))
|
|
259
|
-
const filePath = join(tempDir, 'payload.bin')
|
|
260
|
-
try {
|
|
261
|
-
const curlArgs = [
|
|
262
|
-
'--silent',
|
|
263
|
-
'--show-error',
|
|
264
|
-
'--location',
|
|
265
|
-
'--max-time',
|
|
266
|
-
String(REQUEST_TIMEOUT_SECONDS),
|
|
267
|
-
'-o',
|
|
268
|
-
filePath,
|
|
269
|
-
'--write-out',
|
|
270
|
-
'%{http_code}',
|
|
271
|
-
url,
|
|
272
|
-
]
|
|
273
|
-
const result = spawnSync('curl', curlArgs, { encoding: 'utf8' })
|
|
274
|
-
if (result.status !== 0) {
|
|
275
|
-
throw new Error(result.stderr || 'curl failed')
|
|
276
|
-
}
|
|
277
|
-
const status = Number((result.stdout ?? '').trim())
|
|
278
|
-
if (!Number.isFinite(status)) throw new Error('curl response missing status')
|
|
279
|
-
if (status < 200 || status >= 300) {
|
|
280
|
-
const body = await readFileSafe(filePath)
|
|
281
|
-
const message = body ? new TextDecoder().decode(body) : `HTTP ${status}`
|
|
282
|
-
if (status === 429 || status >= 500) {
|
|
283
|
-
throw new Error(message)
|
|
284
|
-
}
|
|
285
|
-
throw new AbortError(message)
|
|
286
|
-
}
|
|
287
|
-
const bytes = await readFileSafe(filePath)
|
|
288
|
-
return bytes ? new Uint8Array(bytes) : new Uint8Array()
|
|
289
|
-
} finally {
|
|
290
|
-
await rm(tempDir, { recursive: true, force: true })
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
async function readFileSafe(path: string) {
|
|
295
|
-
try {
|
|
296
|
-
const { readFile } = await import('node:fs/promises')
|
|
297
|
-
return await readFile(path)
|
|
298
|
-
} catch {
|
|
299
|
-
return null
|
|
300
|
-
}
|
|
301
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { ArkErrors } from 'arktype'
|
|
2
|
-
|
|
3
|
-
export type ArkValidator<T> = (data: unknown) => T | ArkErrors
|
|
4
|
-
|
|
5
|
-
export function parseArk<T>(schema: ArkValidator<T>, data: unknown, label: string) {
|
|
6
|
-
const result = schema(data)
|
|
7
|
-
if (result instanceof ArkErrors) {
|
|
8
|
-
throw new Error(`${label}: ${formatArkErrors(result)}`)
|
|
9
|
-
}
|
|
10
|
-
return result
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function formatArkErrors(errors: ArkErrors) {
|
|
14
|
-
const parts: string[] = []
|
|
15
|
-
for (const error of errors) {
|
|
16
|
-
if (parts.length >= 3) break
|
|
17
|
-
const path = Array.isArray(error.path) ? error.path.join('.') : ''
|
|
18
|
-
const location = path ? `${path}: ` : ''
|
|
19
|
-
const description =
|
|
20
|
-
typeof (error as { description?: unknown }).description === 'string'
|
|
21
|
-
? ((error as { description: string }).description as string)
|
|
22
|
-
: 'invalid value'
|
|
23
|
-
parts.push(`${location}${description}`)
|
|
24
|
-
}
|
|
25
|
-
if (errors.count > parts.length) {
|
|
26
|
-
parts.push(`+${errors.count - parts.length} more`)
|
|
27
|
-
}
|
|
28
|
-
return parts.join('; ')
|
|
29
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
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
|
-
} as const
|
|
13
|
-
|
|
14
|
-
export const ApiRoutes = {
|
|
15
|
-
search: '/api/v1/search',
|
|
16
|
-
resolve: '/api/v1/resolve',
|
|
17
|
-
download: '/api/v1/download',
|
|
18
|
-
skills: '/api/v1/skills',
|
|
19
|
-
stars: '/api/v1/stars',
|
|
20
|
-
souls: '/api/v1/souls',
|
|
21
|
-
whoami: '/api/v1/whoami',
|
|
22
|
-
} as const
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import { type inferred, type } from 'arktype'
|
|
2
|
-
|
|
3
|
-
export const GlobalConfigSchema = type({
|
|
4
|
-
registry: 'string',
|
|
5
|
-
token: 'string?',
|
|
6
|
-
})
|
|
7
|
-
export type GlobalConfig = (typeof GlobalConfigSchema)[inferred]
|
|
8
|
-
|
|
9
|
-
export const WellKnownConfigSchema = type({
|
|
10
|
-
apiBase: 'string',
|
|
11
|
-
authBase: 'string?',
|
|
12
|
-
minCliVersion: 'string?',
|
|
13
|
-
}).or({
|
|
14
|
-
registry: 'string',
|
|
15
|
-
authBase: 'string?',
|
|
16
|
-
minCliVersion: 'string?',
|
|
17
|
-
})
|
|
18
|
-
export type WellKnownConfig = (typeof WellKnownConfigSchema)[inferred]
|
|
19
|
-
|
|
20
|
-
export const LockfileSchema = type({
|
|
21
|
-
version: '1',
|
|
22
|
-
skills: {
|
|
23
|
-
'[string]': {
|
|
24
|
-
version: 'string|null',
|
|
25
|
-
installedAt: 'number',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
})
|
|
29
|
-
export type Lockfile = (typeof LockfileSchema)[inferred]
|
|
30
|
-
|
|
31
|
-
export const ApiCliWhoamiResponseSchema = type({
|
|
32
|
-
user: {
|
|
33
|
-
handle: 'string|null',
|
|
34
|
-
},
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
export const ApiSearchResponseSchema = type({
|
|
38
|
-
results: type({
|
|
39
|
-
slug: 'string?',
|
|
40
|
-
displayName: 'string?',
|
|
41
|
-
version: 'string|null?',
|
|
42
|
-
score: 'number',
|
|
43
|
-
}).array(),
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
export const ApiSkillMetaResponseSchema = type({
|
|
47
|
-
latestVersion: type({
|
|
48
|
-
version: 'string',
|
|
49
|
-
}).optional(),
|
|
50
|
-
skill: 'unknown|null?',
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
export const ApiCliUploadUrlResponseSchema = type({
|
|
54
|
-
uploadUrl: 'string',
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
export const ApiUploadFileResponseSchema = type({
|
|
58
|
-
storageId: 'string',
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
export const CliPublishFileSchema = type({
|
|
62
|
-
path: 'string',
|
|
63
|
-
size: 'number',
|
|
64
|
-
storageId: 'string',
|
|
65
|
-
sha256: 'string',
|
|
66
|
-
contentType: 'string?',
|
|
67
|
-
})
|
|
68
|
-
export type CliPublishFile = (typeof CliPublishFileSchema)[inferred]
|
|
69
|
-
|
|
70
|
-
export const CliPublishRequestSchema = type({
|
|
71
|
-
slug: 'string',
|
|
72
|
-
displayName: 'string',
|
|
73
|
-
version: 'string',
|
|
74
|
-
changelog: 'string',
|
|
75
|
-
tags: 'string[]?',
|
|
76
|
-
forkOf: type({
|
|
77
|
-
slug: 'string',
|
|
78
|
-
version: 'string?',
|
|
79
|
-
}).optional(),
|
|
80
|
-
files: CliPublishFileSchema.array(),
|
|
81
|
-
})
|
|
82
|
-
export type CliPublishRequest = (typeof CliPublishRequestSchema)[inferred]
|
|
83
|
-
|
|
84
|
-
export const ApiCliPublishResponseSchema = type({
|
|
85
|
-
ok: 'true',
|
|
86
|
-
skillId: 'string',
|
|
87
|
-
versionId: 'string',
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
export const CliSkillDeleteRequestSchema = type({
|
|
91
|
-
slug: 'string',
|
|
92
|
-
})
|
|
93
|
-
export type CliSkillDeleteRequest = (typeof CliSkillDeleteRequestSchema)[inferred]
|
|
94
|
-
|
|
95
|
-
export const ApiCliSkillDeleteResponseSchema = type({
|
|
96
|
-
ok: 'true',
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
export const ApiSkillResolveResponseSchema = type({
|
|
100
|
-
match: type({ version: 'string' }).or('null'),
|
|
101
|
-
latestVersion: type({ version: 'string' }).or('null'),
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
export const CliTelemetrySyncRequestSchema = type({
|
|
105
|
-
roots: type({
|
|
106
|
-
rootId: 'string',
|
|
107
|
-
label: 'string',
|
|
108
|
-
skills: type({
|
|
109
|
-
slug: 'string',
|
|
110
|
-
version: 'string|null?',
|
|
111
|
-
}).array(),
|
|
112
|
-
}).array(),
|
|
113
|
-
})
|
|
114
|
-
export type CliTelemetrySyncRequest = (typeof CliTelemetrySyncRequestSchema)[inferred]
|
|
115
|
-
|
|
116
|
-
export const ApiCliTelemetrySyncResponseSchema = type({
|
|
117
|
-
ok: 'true',
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
export const ApiV1WhoamiResponseSchema = type({
|
|
121
|
-
user: {
|
|
122
|
-
handle: 'string|null',
|
|
123
|
-
displayName: 'string|null?',
|
|
124
|
-
image: 'string|null?',
|
|
125
|
-
},
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
export const ApiV1SearchResponseSchema = type({
|
|
129
|
-
results: type({
|
|
130
|
-
slug: 'string?',
|
|
131
|
-
displayName: 'string?',
|
|
132
|
-
summary: 'string|null?',
|
|
133
|
-
version: 'string|null?',
|
|
134
|
-
score: 'number',
|
|
135
|
-
updatedAt: 'number?',
|
|
136
|
-
}).array(),
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
export const ApiV1SkillListResponseSchema = type({
|
|
140
|
-
items: type({
|
|
141
|
-
slug: 'string',
|
|
142
|
-
displayName: 'string',
|
|
143
|
-
summary: 'string|null?',
|
|
144
|
-
tags: 'unknown',
|
|
145
|
-
stats: 'unknown',
|
|
146
|
-
createdAt: 'number',
|
|
147
|
-
updatedAt: 'number',
|
|
148
|
-
latestVersion: type({
|
|
149
|
-
version: 'string',
|
|
150
|
-
createdAt: 'number',
|
|
151
|
-
changelog: 'string',
|
|
152
|
-
}).optional(),
|
|
153
|
-
}).array(),
|
|
154
|
-
nextCursor: 'string|null',
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
export const ApiV1SkillResponseSchema = type({
|
|
158
|
-
skill: type({
|
|
159
|
-
slug: 'string',
|
|
160
|
-
displayName: 'string',
|
|
161
|
-
summary: 'string|null?',
|
|
162
|
-
tags: 'unknown',
|
|
163
|
-
stats: 'unknown',
|
|
164
|
-
createdAt: 'number',
|
|
165
|
-
updatedAt: 'number',
|
|
166
|
-
}).or('null'),
|
|
167
|
-
latestVersion: type({
|
|
168
|
-
version: 'string',
|
|
169
|
-
createdAt: 'number',
|
|
170
|
-
changelog: 'string',
|
|
171
|
-
}).or('null'),
|
|
172
|
-
owner: type({
|
|
173
|
-
handle: 'string|null',
|
|
174
|
-
displayName: 'string|null?',
|
|
175
|
-
image: 'string|null?',
|
|
176
|
-
}).or('null'),
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
export const ApiV1SkillVersionListResponseSchema = type({
|
|
180
|
-
items: type({
|
|
181
|
-
version: 'string',
|
|
182
|
-
createdAt: 'number',
|
|
183
|
-
changelog: 'string',
|
|
184
|
-
changelogSource: '"auto"|"user"|null?',
|
|
185
|
-
}).array(),
|
|
186
|
-
nextCursor: 'string|null',
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
export const ApiV1SkillVersionResponseSchema = type({
|
|
190
|
-
version: type({
|
|
191
|
-
version: 'string',
|
|
192
|
-
createdAt: 'number',
|
|
193
|
-
changelog: 'string',
|
|
194
|
-
changelogSource: '"auto"|"user"|null?',
|
|
195
|
-
files: 'unknown?',
|
|
196
|
-
}).or('null'),
|
|
197
|
-
skill: type({
|
|
198
|
-
slug: 'string',
|
|
199
|
-
displayName: 'string',
|
|
200
|
-
}).or('null'),
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
export const ApiV1SkillResolveResponseSchema = type({
|
|
204
|
-
match: type({ version: 'string' }).or('null'),
|
|
205
|
-
latestVersion: type({ version: 'string' }).or('null'),
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
export const ApiV1PublishResponseSchema = type({
|
|
209
|
-
ok: 'true',
|
|
210
|
-
skillId: 'string',
|
|
211
|
-
versionId: 'string',
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
export const ApiV1DeleteResponseSchema = type({
|
|
215
|
-
ok: 'true',
|
|
216
|
-
})
|
|
217
|
-
|
|
218
|
-
export const ApiV1StarResponseSchema = type({
|
|
219
|
-
ok: 'true',
|
|
220
|
-
starred: 'boolean',
|
|
221
|
-
alreadyStarred: 'boolean',
|
|
222
|
-
})
|
|
223
|
-
|
|
224
|
-
export const ApiV1UnstarResponseSchema = type({
|
|
225
|
-
ok: 'true',
|
|
226
|
-
unstarred: 'boolean',
|
|
227
|
-
alreadyUnstarred: 'boolean',
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
export const SkillInstallSpecSchema = type({
|
|
231
|
-
id: 'string?',
|
|
232
|
-
kind: '"brew"|"node"|"go"|"uv"',
|
|
233
|
-
label: 'string?',
|
|
234
|
-
bins: 'string[]?',
|
|
235
|
-
formula: 'string?',
|
|
236
|
-
tap: 'string?',
|
|
237
|
-
package: 'string?',
|
|
238
|
-
module: 'string?',
|
|
239
|
-
})
|
|
240
|
-
export type SkillInstallSpec = (typeof SkillInstallSpecSchema)[inferred]
|
|
241
|
-
|
|
242
|
-
export const PilotbotRequiresSchema = type({
|
|
243
|
-
bins: 'string[]?',
|
|
244
|
-
anyBins: 'string[]?',
|
|
245
|
-
env: 'string[]?',
|
|
246
|
-
config: 'string[]?',
|
|
247
|
-
})
|
|
248
|
-
export type PilotbotRequires = (typeof PilotbotRequiresSchema)[inferred]
|
|
249
|
-
|
|
250
|
-
export const PilotbotSkillMetadataSchema = type({
|
|
251
|
-
always: 'boolean?',
|
|
252
|
-
skillKey: 'string?',
|
|
253
|
-
primaryEnv: 'string?',
|
|
254
|
-
emoji: 'string?',
|
|
255
|
-
homepage: 'string?',
|
|
256
|
-
os: 'string[]?',
|
|
257
|
-
requires: PilotbotRequiresSchema.optional(),
|
|
258
|
-
install: SkillInstallSpecSchema.array().optional(),
|
|
259
|
-
})
|
|
260
|
-
export type PilotbotSkillMetadata = (typeof PilotbotSkillMetadataSchema)[inferred]
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/* @vitest-environment node */
|
|
2
|
-
|
|
3
|
-
import { describe, expect, it } from 'vitest'
|
|
4
|
-
import * as schema from '.'
|
|
5
|
-
import { isTextContentType, TEXT_FILE_EXTENSION_SET } from './textFiles'
|
|
6
|
-
|
|
7
|
-
describe('packages/pilothub schema textFiles', () => {
|
|
8
|
-
it('exports text-file extension set', () => {
|
|
9
|
-
expect(TEXT_FILE_EXTENSION_SET.has('md')).toBe(true)
|
|
10
|
-
expect(TEXT_FILE_EXTENSION_SET.has('exe')).toBe(false)
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
it('detects text content types with parameters', () => {
|
|
14
|
-
expect(isTextContentType('text/plain; charset=utf-8')).toBe(true)
|
|
15
|
-
expect(isTextContentType('application/json; charset=utf-8')).toBe(true)
|
|
16
|
-
expect(isTextContentType('application/octet-stream')).toBe(false)
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
it('re-exports helpers from index', () => {
|
|
20
|
-
expect(typeof schema.isTextContentType).toBe('function')
|
|
21
|
-
expect(schema.isTextContentType('application/markdown')).toBe(true)
|
|
22
|
-
})
|
|
23
|
-
})
|