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
package/convex/auth.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import GitHub from '@auth/core/providers/github'
|
|
2
|
-
import { convexAuth } from '@convex-dev/auth/server'
|
|
3
|
-
|
|
4
|
-
export const { auth, signIn, signOut, store, isAuthenticated } = convexAuth({
|
|
5
|
-
providers: [
|
|
6
|
-
GitHub({
|
|
7
|
-
clientId: process.env.AUTH_GITHUB_ID ?? '',
|
|
8
|
-
clientSecret: process.env.AUTH_GITHUB_SECRET ?? '',
|
|
9
|
-
profile(profile) {
|
|
10
|
-
return {
|
|
11
|
-
id: String(profile.id),
|
|
12
|
-
name: profile.login,
|
|
13
|
-
email: profile.email ?? undefined,
|
|
14
|
-
image: profile.avatar_url,
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
}),
|
|
18
|
-
],
|
|
19
|
-
})
|
package/convex/comments.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { v } from 'convex/values'
|
|
2
|
-
import type { Doc } from './_generated/dataModel'
|
|
3
|
-
import { mutation, query } from './_generated/server'
|
|
4
|
-
import { assertModerator, requireUser } from './lib/access'
|
|
5
|
-
import { type PublicUser, toPublicUser } from './lib/public'
|
|
6
|
-
|
|
7
|
-
export const listBySkill = query({
|
|
8
|
-
args: { skillId: v.id('skills'), limit: v.optional(v.number()) },
|
|
9
|
-
handler: async (ctx, args) => {
|
|
10
|
-
const limit = args.limit ?? 50
|
|
11
|
-
const comments = await ctx.db
|
|
12
|
-
.query('comments')
|
|
13
|
-
.withIndex('by_skill', (q) => q.eq('skillId', args.skillId))
|
|
14
|
-
.order('desc')
|
|
15
|
-
.take(limit)
|
|
16
|
-
|
|
17
|
-
const results: Array<{ comment: Doc<'comments'>; user: PublicUser | null }> = []
|
|
18
|
-
for (const comment of comments) {
|
|
19
|
-
if (comment.softDeletedAt) continue
|
|
20
|
-
const user = toPublicUser(await ctx.db.get(comment.userId))
|
|
21
|
-
results.push({ comment, user })
|
|
22
|
-
}
|
|
23
|
-
return results
|
|
24
|
-
},
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
export const add = mutation({
|
|
28
|
-
args: { skillId: v.id('skills'), body: v.string() },
|
|
29
|
-
handler: async (ctx, args) => {
|
|
30
|
-
const { userId } = await requireUser(ctx)
|
|
31
|
-
const body = args.body.trim()
|
|
32
|
-
if (!body) throw new Error('Comment body required')
|
|
33
|
-
|
|
34
|
-
const skill = await ctx.db.get(args.skillId)
|
|
35
|
-
if (!skill) throw new Error('Skill not found')
|
|
36
|
-
|
|
37
|
-
await ctx.db.insert('comments', {
|
|
38
|
-
skillId: args.skillId,
|
|
39
|
-
userId,
|
|
40
|
-
body,
|
|
41
|
-
createdAt: Date.now(),
|
|
42
|
-
softDeletedAt: undefined,
|
|
43
|
-
deletedBy: undefined,
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
await ctx.db.patch(skill._id, {
|
|
47
|
-
stats: { ...skill.stats, comments: skill.stats.comments + 1 },
|
|
48
|
-
updatedAt: Date.now(),
|
|
49
|
-
})
|
|
50
|
-
},
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
export const remove = mutation({
|
|
54
|
-
args: { commentId: v.id('comments') },
|
|
55
|
-
handler: async (ctx, args) => {
|
|
56
|
-
const { user } = await requireUser(ctx)
|
|
57
|
-
const comment = await ctx.db.get(args.commentId)
|
|
58
|
-
if (!comment) throw new Error('Comment not found')
|
|
59
|
-
if (comment.softDeletedAt) return
|
|
60
|
-
|
|
61
|
-
const isOwner = comment.userId === user._id
|
|
62
|
-
if (!isOwner) {
|
|
63
|
-
assertModerator(user)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
await ctx.db.patch(comment._id, {
|
|
67
|
-
softDeletedAt: Date.now(),
|
|
68
|
-
deletedBy: user._id,
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
const skill = await ctx.db.get(comment.skillId)
|
|
72
|
-
if (skill) {
|
|
73
|
-
await ctx.db.patch(skill._id, {
|
|
74
|
-
stats: { ...skill.stats, comments: Math.max(0, skill.stats.comments - 1) },
|
|
75
|
-
updatedAt: Date.now(),
|
|
76
|
-
})
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
await ctx.db.insert('auditLogs', {
|
|
80
|
-
actorUserId: user._id,
|
|
81
|
-
action: 'comment.delete',
|
|
82
|
-
targetType: 'comment',
|
|
83
|
-
targetId: comment._id,
|
|
84
|
-
metadata: { skillId: comment.skillId },
|
|
85
|
-
createdAt: Date.now(),
|
|
86
|
-
})
|
|
87
|
-
},
|
|
88
|
-
})
|
package/convex/crons.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { cronJobs } from 'convex/server'
|
|
2
|
-
import { internal } from './_generated/api'
|
|
3
|
-
|
|
4
|
-
const crons = cronJobs()
|
|
5
|
-
|
|
6
|
-
crons.interval(
|
|
7
|
-
'github-backup-sync',
|
|
8
|
-
{ minutes: 30 },
|
|
9
|
-
internal.githubBackupsNode.syncGitHubBackupsInternal,
|
|
10
|
-
{ batchSize: 50, maxBatches: 5 },
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
crons.interval(
|
|
14
|
-
'trending-leaderboard',
|
|
15
|
-
{ minutes: 60 },
|
|
16
|
-
internal.leaderboards.rebuildTrendingLeaderboardInternal,
|
|
17
|
-
{ limit: 200 },
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
crons.interval(
|
|
21
|
-
'skill-stats-backfill',
|
|
22
|
-
{ minutes: 10 },
|
|
23
|
-
internal.statsMaintenance.runSkillStatBackfillInternal,
|
|
24
|
-
{ batchSize: 200, maxBatches: 5 },
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
crons.interval(
|
|
28
|
-
'skill-stat-events',
|
|
29
|
-
{ minutes: 15 },
|
|
30
|
-
internal.skillStatEvents.processSkillStatEventsAction,
|
|
31
|
-
{},
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
export default crons
|
package/convex/devSeed.ts
DELETED
|
@@ -1,459 +0,0 @@
|
|
|
1
|
-
import { v } from 'convex/values'
|
|
2
|
-
import { internal } from './_generated/api'
|
|
3
|
-
import type { ActionCtx } from './_generated/server'
|
|
4
|
-
import { internalAction, internalMutation } from './_generated/server'
|
|
5
|
-
import { EMBEDDING_DIMENSIONS } from './lib/embeddings'
|
|
6
|
-
import { parseFrontmatter, parsePilotbotMetadata } from './lib/skills'
|
|
7
|
-
|
|
8
|
-
type SeedSkillSpec = {
|
|
9
|
-
slug: string
|
|
10
|
-
displayName: string
|
|
11
|
-
summary: string
|
|
12
|
-
version: string
|
|
13
|
-
metadata: Record<string, unknown>
|
|
14
|
-
rawSkillMd: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type SeedActionArgs = {
|
|
18
|
-
reset?: boolean
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
type SeedActionResult = {
|
|
22
|
-
ok: true
|
|
23
|
-
results: Array<Record<string, unknown> & { slug: string }>
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
type SeedMutationResult = Record<string, unknown>
|
|
27
|
-
|
|
28
|
-
const SEED_SKILLS: SeedSkillSpec[] = [
|
|
29
|
-
{
|
|
30
|
-
slug: 'padel',
|
|
31
|
-
displayName: 'Padel',
|
|
32
|
-
summary: 'Check padel court availability and manage bookings via Playtomic.',
|
|
33
|
-
version: '0.1.0',
|
|
34
|
-
metadata: {
|
|
35
|
-
pilotbot: {
|
|
36
|
-
nix: {
|
|
37
|
-
plugin: 'github:joshp123/padel-cli',
|
|
38
|
-
systems: ['aarch64-darwin', 'x86_64-linux'],
|
|
39
|
-
},
|
|
40
|
-
config: {
|
|
41
|
-
requiredEnv: ['PADEL_AUTH_FILE'],
|
|
42
|
-
stateDirs: ['.config/padel'],
|
|
43
|
-
example:
|
|
44
|
-
'config = { env = { PADEL_AUTH_FILE = "/run/agenix/padel-auth"; }; stateDirs = [ ".config/padel" ]; };',
|
|
45
|
-
},
|
|
46
|
-
cliHelp: `Padel CLI for availability
|
|
47
|
-
|
|
48
|
-
Usage:
|
|
49
|
-
padel [command]
|
|
50
|
-
|
|
51
|
-
Available Commands:
|
|
52
|
-
auth Manage authentication
|
|
53
|
-
availability Show availability for a club on a date
|
|
54
|
-
book Book a court
|
|
55
|
-
bookings Manage bookings history
|
|
56
|
-
search Search for available courts
|
|
57
|
-
venues Manage saved venues
|
|
58
|
-
|
|
59
|
-
Flags:
|
|
60
|
-
-h, --help help for padel
|
|
61
|
-
--json Output JSON
|
|
62
|
-
|
|
63
|
-
Use "padel [command] --help" for more information about a command.
|
|
64
|
-
`,
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
rawSkillMd: `---
|
|
68
|
-
name: padel
|
|
69
|
-
description: Check padel court availability and manage bookings via the padel CLI.
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
# Padel Booking Skill
|
|
73
|
-
|
|
74
|
-
## CLI
|
|
75
|
-
|
|
76
|
-
\`\`\`bash
|
|
77
|
-
padel # On PATH (pilotbot plugin bundle)
|
|
78
|
-
\`\`\`
|
|
79
|
-
|
|
80
|
-
## Venues
|
|
81
|
-
|
|
82
|
-
Use the configured venue list in order of preference. If no venues are configured, ask for a venue name or location.
|
|
83
|
-
|
|
84
|
-
## Commands
|
|
85
|
-
|
|
86
|
-
### Check next booking
|
|
87
|
-
\`\`\`bash
|
|
88
|
-
padel bookings list 2>&1 | head -3
|
|
89
|
-
\`\`\`
|
|
90
|
-
|
|
91
|
-
### Search availability
|
|
92
|
-
\`\`\`bash
|
|
93
|
-
padel search --venues VENUE1,VENUE2 --date YYYY-MM-DD --time 09:00-12:00
|
|
94
|
-
\`\`\`
|
|
95
|
-
|
|
96
|
-
## Response guidelines
|
|
97
|
-
|
|
98
|
-
- Keep responses concise.
|
|
99
|
-
- Use 🎾 emoji.
|
|
100
|
-
- End with a call to action.
|
|
101
|
-
|
|
102
|
-
## Authorization
|
|
103
|
-
|
|
104
|
-
Only the authorized booker can confirm bookings. If the requester is not authorized, ask the authorized user to confirm.
|
|
105
|
-
`,
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
slug: 'gohome',
|
|
109
|
-
displayName: 'GoHome',
|
|
110
|
-
summary: 'Operate GoHome via gRPC discovery, metrics, and Grafana dashboards.',
|
|
111
|
-
version: '0.1.0',
|
|
112
|
-
metadata: {
|
|
113
|
-
pilotbot: {
|
|
114
|
-
nix: {
|
|
115
|
-
plugin: 'github:joshp123/gohome',
|
|
116
|
-
systems: ['x86_64-linux', 'aarch64-linux'],
|
|
117
|
-
},
|
|
118
|
-
config: {
|
|
119
|
-
requiredEnv: ['GOHOME_GRPC_ADDR', 'GOHOME_HTTP_BASE'],
|
|
120
|
-
example:
|
|
121
|
-
'config = { env = { GOHOME_GRPC_ADDR = "gohome:9000"; GOHOME_HTTP_BASE = "http://gohome:8080"; }; };',
|
|
122
|
-
},
|
|
123
|
-
cliHelp: `GoHome CLI
|
|
124
|
-
|
|
125
|
-
Usage:
|
|
126
|
-
gohome-cli [command]
|
|
127
|
-
|
|
128
|
-
Available Commands:
|
|
129
|
-
services List registered services
|
|
130
|
-
plugins Inspect loaded plugins
|
|
131
|
-
methods List RPC methods
|
|
132
|
-
call Call an RPC method
|
|
133
|
-
roborock Manage roborock devices
|
|
134
|
-
tado Manage tado zones
|
|
135
|
-
|
|
136
|
-
Flags:
|
|
137
|
-
--grpc-addr string gRPC endpoint (host:port)
|
|
138
|
-
-h, --help help for gohome-cli
|
|
139
|
-
`,
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
rawSkillMd: `---
|
|
143
|
-
name: gohome
|
|
144
|
-
description: Use when Pilotbot needs to test or operate GoHome via gRPC discovery, metrics, and Grafana.
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
# GoHome Skill
|
|
148
|
-
|
|
149
|
-
## Quick start
|
|
150
|
-
|
|
151
|
-
\`\`\`bash
|
|
152
|
-
export GOHOME_HTTP_BASE="http://gohome:8080"
|
|
153
|
-
export GOHOME_GRPC_ADDR="gohome:9000"
|
|
154
|
-
\`\`\`
|
|
155
|
-
|
|
156
|
-
## CLI
|
|
157
|
-
|
|
158
|
-
\`\`\`bash
|
|
159
|
-
gohome-cli services
|
|
160
|
-
\`\`\`
|
|
161
|
-
|
|
162
|
-
## Discovery flow (read-only)
|
|
163
|
-
|
|
164
|
-
1) List plugins.
|
|
165
|
-
2) Describe a plugin.
|
|
166
|
-
3) List RPC methods.
|
|
167
|
-
4) Call a read-only RPC.
|
|
168
|
-
|
|
169
|
-
## Metrics validation
|
|
170
|
-
|
|
171
|
-
\`\`\`bash
|
|
172
|
-
curl -s "\${GOHOME_HTTP_BASE}/gohome/metrics" | rg -n "gohome_"
|
|
173
|
-
\`\`\`
|
|
174
|
-
|
|
175
|
-
## Stateful actions
|
|
176
|
-
|
|
177
|
-
Only call write RPCs after explicit user approval.
|
|
178
|
-
`,
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
slug: 'xuezh',
|
|
182
|
-
displayName: 'Xuezh',
|
|
183
|
-
summary: 'Teach Mandarin with the xuezh engine for review, speaking, and audits.',
|
|
184
|
-
version: '0.1.0',
|
|
185
|
-
metadata: {
|
|
186
|
-
pilotbot: {
|
|
187
|
-
nix: {
|
|
188
|
-
plugin: 'github:joshp123/xuezh',
|
|
189
|
-
systems: ['aarch64-darwin', 'x86_64-linux'],
|
|
190
|
-
},
|
|
191
|
-
config: {
|
|
192
|
-
requiredEnv: ['XUEZH_AZURE_SPEECH_KEY_FILE', 'XUEZH_AZURE_SPEECH_REGION'],
|
|
193
|
-
stateDirs: ['.config/xuezh'],
|
|
194
|
-
example:
|
|
195
|
-
'config = { env = { XUEZH_AZURE_SPEECH_KEY_FILE = "/run/agenix/xuezh-azure-speech-key"; XUEZH_AZURE_SPEECH_REGION = "westeurope"; }; stateDirs = [ ".config/xuezh" ]; };',
|
|
196
|
-
},
|
|
197
|
-
cliHelp: `xuezh - Chinese learning engine
|
|
198
|
-
|
|
199
|
-
Usage:
|
|
200
|
-
xuezh [command]
|
|
201
|
-
|
|
202
|
-
Available Commands:
|
|
203
|
-
snapshot Fetch learner state snapshot
|
|
204
|
-
review Review due items
|
|
205
|
-
audio Process speech audio
|
|
206
|
-
items Manage learning items
|
|
207
|
-
events Log learning events
|
|
208
|
-
|
|
209
|
-
Flags:
|
|
210
|
-
-h, --help help for xuezh
|
|
211
|
-
--json Output JSON
|
|
212
|
-
`,
|
|
213
|
-
},
|
|
214
|
-
},
|
|
215
|
-
rawSkillMd: `---
|
|
216
|
-
name: xuezh
|
|
217
|
-
description: Teach Mandarin using the xuezh engine for review, speaking, and audits.
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
# Xuezh Skill
|
|
221
|
-
|
|
222
|
-
## Contract
|
|
223
|
-
|
|
224
|
-
Use the xuezh CLI exactly as specified. If a command is missing, ask for implementation instead of guessing.
|
|
225
|
-
|
|
226
|
-
## Default loop
|
|
227
|
-
|
|
228
|
-
1) Call \`xuezh snapshot\`.
|
|
229
|
-
2) Pick a tiny plan (1-2 bullets).
|
|
230
|
-
3) Run a short activity.
|
|
231
|
-
4) Log outcomes.
|
|
232
|
-
|
|
233
|
-
## CLI examples
|
|
234
|
-
|
|
235
|
-
\`\`\`bash
|
|
236
|
-
xuezh snapshot --profile default
|
|
237
|
-
xuezh review next --limit 10
|
|
238
|
-
xuezh audio process-voice --file ./utterance.wav
|
|
239
|
-
\`\`\`
|
|
240
|
-
`,
|
|
241
|
-
},
|
|
242
|
-
]
|
|
243
|
-
|
|
244
|
-
function injectMetadata(rawSkillMd: string, metadata: Record<string, unknown>) {
|
|
245
|
-
const frontmatterEnd = rawSkillMd.indexOf('\n---', 3)
|
|
246
|
-
if (frontmatterEnd === -1) return rawSkillMd
|
|
247
|
-
return `${rawSkillMd.slice(0, frontmatterEnd)}\nmetadata: ${JSON.stringify(
|
|
248
|
-
metadata,
|
|
249
|
-
)}${rawSkillMd.slice(frontmatterEnd)}`
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
async function seedNixSkillsHandler(
|
|
253
|
-
ctx: ActionCtx,
|
|
254
|
-
args: SeedActionArgs,
|
|
255
|
-
): Promise<SeedActionResult> {
|
|
256
|
-
const results: Array<Record<string, unknown> & { slug: string }> = []
|
|
257
|
-
|
|
258
|
-
for (const spec of SEED_SKILLS) {
|
|
259
|
-
const skillMd = injectMetadata(spec.rawSkillMd, spec.metadata)
|
|
260
|
-
const frontmatter = parseFrontmatter(skillMd)
|
|
261
|
-
const pilotbot = parsePilotbotMetadata(frontmatter)
|
|
262
|
-
const storageId = await ctx.storage.store(new Blob([skillMd], { type: 'text/markdown' }))
|
|
263
|
-
|
|
264
|
-
const result: SeedMutationResult = await ctx.runMutation(internal.devSeed.seedSkillMutation, {
|
|
265
|
-
reset: args.reset,
|
|
266
|
-
storageId,
|
|
267
|
-
metadata: spec.metadata,
|
|
268
|
-
frontmatter,
|
|
269
|
-
pilotbot,
|
|
270
|
-
skillMd,
|
|
271
|
-
slug: spec.slug,
|
|
272
|
-
displayName: spec.displayName,
|
|
273
|
-
summary: spec.summary,
|
|
274
|
-
version: spec.version,
|
|
275
|
-
})
|
|
276
|
-
|
|
277
|
-
results.push({ slug: spec.slug, ...result })
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
return { ok: true, results }
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
export const seedNixSkills: ReturnType<typeof internalAction> = internalAction({
|
|
284
|
-
args: {
|
|
285
|
-
reset: v.optional(v.boolean()),
|
|
286
|
-
},
|
|
287
|
-
handler: seedNixSkillsHandler,
|
|
288
|
-
})
|
|
289
|
-
|
|
290
|
-
async function seedPadelSkillHandler(
|
|
291
|
-
ctx: ActionCtx,
|
|
292
|
-
args: SeedActionArgs,
|
|
293
|
-
): Promise<SeedMutationResult> {
|
|
294
|
-
const spec = SEED_SKILLS.find((entry) => entry.slug === 'padel')
|
|
295
|
-
if (!spec) throw new Error('padel seed spec missing')
|
|
296
|
-
|
|
297
|
-
const skillMd = injectMetadata(spec.rawSkillMd, spec.metadata)
|
|
298
|
-
const frontmatter = parseFrontmatter(skillMd)
|
|
299
|
-
const pilotbot = parsePilotbotMetadata(frontmatter)
|
|
300
|
-
const storageId = await ctx.storage.store(new Blob([skillMd], { type: 'text/markdown' }))
|
|
301
|
-
|
|
302
|
-
return (await ctx.runMutation(internal.devSeed.seedSkillMutation, {
|
|
303
|
-
reset: args.reset,
|
|
304
|
-
storageId,
|
|
305
|
-
metadata: spec.metadata,
|
|
306
|
-
frontmatter,
|
|
307
|
-
pilotbot,
|
|
308
|
-
skillMd,
|
|
309
|
-
slug: spec.slug,
|
|
310
|
-
displayName: spec.displayName,
|
|
311
|
-
summary: spec.summary,
|
|
312
|
-
version: spec.version,
|
|
313
|
-
})) as SeedMutationResult
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
export const seedPadelSkill: ReturnType<typeof internalAction> = internalAction({
|
|
317
|
-
args: {
|
|
318
|
-
reset: v.optional(v.boolean()),
|
|
319
|
-
},
|
|
320
|
-
handler: seedPadelSkillHandler,
|
|
321
|
-
})
|
|
322
|
-
|
|
323
|
-
export const seedSkillMutation = internalMutation({
|
|
324
|
-
args: {
|
|
325
|
-
reset: v.optional(v.boolean()),
|
|
326
|
-
storageId: v.id('_storage'),
|
|
327
|
-
metadata: v.any(),
|
|
328
|
-
frontmatter: v.any(),
|
|
329
|
-
pilotbot: v.any(),
|
|
330
|
-
skillMd: v.string(),
|
|
331
|
-
slug: v.string(),
|
|
332
|
-
displayName: v.string(),
|
|
333
|
-
summary: v.optional(v.string()),
|
|
334
|
-
version: v.string(),
|
|
335
|
-
},
|
|
336
|
-
handler: async (ctx, args) => {
|
|
337
|
-
const existing = await ctx.db
|
|
338
|
-
.query('skills')
|
|
339
|
-
.withIndex('by_slug', (q) => q.eq('slug', args.slug))
|
|
340
|
-
.unique()
|
|
341
|
-
|
|
342
|
-
if (existing && !args.reset) {
|
|
343
|
-
return { ok: true, skipped: true, skillId: existing._id }
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
if (existing && args.reset) {
|
|
347
|
-
const versions = await ctx.db
|
|
348
|
-
.query('skillVersions')
|
|
349
|
-
.withIndex('by_skill', (q) => q.eq('skillId', existing._id))
|
|
350
|
-
.collect()
|
|
351
|
-
for (const version of versions) {
|
|
352
|
-
await ctx.db.delete(version._id)
|
|
353
|
-
}
|
|
354
|
-
const embeddings = await ctx.db
|
|
355
|
-
.query('skillEmbeddings')
|
|
356
|
-
.withIndex('by_skill', (q) => q.eq('skillId', existing._id))
|
|
357
|
-
.collect()
|
|
358
|
-
for (const embedding of embeddings) {
|
|
359
|
-
await ctx.db.delete(embedding._id)
|
|
360
|
-
}
|
|
361
|
-
await ctx.db.delete(existing._id)
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
const now = Date.now()
|
|
365
|
-
const existingUsers = await ctx.db
|
|
366
|
-
.query('users')
|
|
367
|
-
.withIndex('handle', (q) => q.eq('handle', 'local'))
|
|
368
|
-
.collect()
|
|
369
|
-
|
|
370
|
-
const userId =
|
|
371
|
-
existingUsers[0]?._id ??
|
|
372
|
-
(await ctx.db.insert('users', {
|
|
373
|
-
handle: 'local',
|
|
374
|
-
displayName: 'Local Dev',
|
|
375
|
-
role: 'admin',
|
|
376
|
-
createdAt: now,
|
|
377
|
-
updatedAt: now,
|
|
378
|
-
}))
|
|
379
|
-
|
|
380
|
-
const skillId = await ctx.db.insert('skills', {
|
|
381
|
-
slug: args.slug,
|
|
382
|
-
displayName: args.displayName,
|
|
383
|
-
summary: args.summary,
|
|
384
|
-
ownerUserId: userId,
|
|
385
|
-
latestVersionId: undefined,
|
|
386
|
-
tags: {},
|
|
387
|
-
softDeletedAt: undefined,
|
|
388
|
-
badges: { redactionApproved: undefined },
|
|
389
|
-
statsDownloads: 0,
|
|
390
|
-
statsStars: 0,
|
|
391
|
-
statsInstallsCurrent: 0,
|
|
392
|
-
statsInstallsAllTime: 0,
|
|
393
|
-
stats: {
|
|
394
|
-
downloads: 0,
|
|
395
|
-
installsCurrent: 0,
|
|
396
|
-
installsAllTime: 0,
|
|
397
|
-
stars: 0,
|
|
398
|
-
versions: 0,
|
|
399
|
-
comments: 0,
|
|
400
|
-
},
|
|
401
|
-
createdAt: now,
|
|
402
|
-
updatedAt: now,
|
|
403
|
-
})
|
|
404
|
-
|
|
405
|
-
const versionId = await ctx.db.insert('skillVersions', {
|
|
406
|
-
skillId,
|
|
407
|
-
version: args.version,
|
|
408
|
-
changelog: 'Seeded local version for screenshots.',
|
|
409
|
-
files: [
|
|
410
|
-
{
|
|
411
|
-
path: 'SKILL.md',
|
|
412
|
-
size: args.skillMd.length,
|
|
413
|
-
storageId: args.storageId,
|
|
414
|
-
sha256: 'seeded',
|
|
415
|
-
contentType: 'text/markdown',
|
|
416
|
-
},
|
|
417
|
-
],
|
|
418
|
-
parsed: {
|
|
419
|
-
frontmatter: args.frontmatter,
|
|
420
|
-
metadata: args.metadata,
|
|
421
|
-
pilotbot: args.pilotbot,
|
|
422
|
-
},
|
|
423
|
-
createdBy: userId,
|
|
424
|
-
createdAt: now,
|
|
425
|
-
softDeletedAt: undefined,
|
|
426
|
-
})
|
|
427
|
-
|
|
428
|
-
const embeddingId = await ctx.db.insert('skillEmbeddings', {
|
|
429
|
-
skillId,
|
|
430
|
-
versionId,
|
|
431
|
-
ownerId: userId,
|
|
432
|
-
embedding: Array.from({ length: EMBEDDING_DIMENSIONS }, () => 0),
|
|
433
|
-
isLatest: true,
|
|
434
|
-
isApproved: true,
|
|
435
|
-
visibility: 'latest-approved',
|
|
436
|
-
updatedAt: now,
|
|
437
|
-
})
|
|
438
|
-
|
|
439
|
-
await ctx.db.patch(skillId, {
|
|
440
|
-
latestVersionId: versionId,
|
|
441
|
-
tags: { latest: versionId },
|
|
442
|
-
statsDownloads: 0,
|
|
443
|
-
statsStars: 0,
|
|
444
|
-
statsInstallsCurrent: 0,
|
|
445
|
-
statsInstallsAllTime: 0,
|
|
446
|
-
stats: {
|
|
447
|
-
downloads: 0,
|
|
448
|
-
installsCurrent: 0,
|
|
449
|
-
installsAllTime: 0,
|
|
450
|
-
stars: 0,
|
|
451
|
-
versions: 1,
|
|
452
|
-
comments: 0,
|
|
453
|
-
},
|
|
454
|
-
updatedAt: now,
|
|
455
|
-
})
|
|
456
|
-
|
|
457
|
-
return { ok: true, skillId, versionId, embeddingId }
|
|
458
|
-
},
|
|
459
|
-
})
|