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.
Files changed (388) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +36 -129
  3. package/dist/browserAuth.d.ts +20 -0
  4. package/dist/browserAuth.js +156 -0
  5. package/dist/browserAuth.js.map +1 -0
  6. package/dist/browserAuth.test.d.ts +1 -0
  7. package/dist/browserAuth.test.js +83 -0
  8. package/dist/browserAuth.test.js.map +1 -0
  9. package/dist/cli/buildInfo.d.ts +3 -0
  10. package/dist/cli/buildInfo.js +103 -0
  11. package/dist/cli/buildInfo.js.map +1 -0
  12. package/dist/cli/commands/auth.d.ts +9 -0
  13. package/dist/cli/commands/auth.js +75 -0
  14. package/dist/cli/commands/auth.js.map +1 -0
  15. package/dist/cli/commands/delete.d.ts +11 -0
  16. package/dist/cli/commands/delete.js +67 -0
  17. package/dist/cli/commands/delete.js.map +1 -0
  18. package/dist/cli/commands/delete.test.d.ts +1 -0
  19. package/dist/cli/commands/delete.test.js +52 -0
  20. package/dist/cli/commands/delete.test.js.map +1 -0
  21. package/dist/cli/commands/publish.d.ts +9 -0
  22. package/dist/cli/commands/publish.js +87 -0
  23. package/dist/cli/commands/publish.js.map +1 -0
  24. package/dist/cli/commands/publish.test.d.ts +1 -0
  25. package/dist/cli/commands/publish.test.js +104 -0
  26. package/dist/cli/commands/publish.test.js.map +1 -0
  27. package/dist/cli/commands/skills.d.ts +23 -0
  28. package/dist/cli/commands/skills.js +298 -0
  29. package/dist/cli/commands/skills.js.map +1 -0
  30. package/dist/cli/commands/skills.test.d.ts +1 -0
  31. package/dist/cli/commands/skills.test.js +156 -0
  32. package/dist/cli/commands/skills.test.js.map +1 -0
  33. package/dist/cli/commands/star.d.ts +8 -0
  34. package/dist/cli/commands/star.js +38 -0
  35. package/dist/cli/commands/star.js.map +1 -0
  36. package/dist/cli/commands/sync.d.ts +3 -0
  37. package/dist/cli/commands/sync.js +160 -0
  38. package/dist/cli/commands/sync.js.map +1 -0
  39. package/dist/cli/commands/sync.test.d.ts +1 -0
  40. package/dist/cli/commands/sync.test.js +277 -0
  41. package/dist/cli/commands/sync.test.js.map +1 -0
  42. package/dist/cli/commands/syncHelpers.d.ts +76 -0
  43. package/dist/cli/commands/syncHelpers.js +349 -0
  44. package/dist/cli/commands/syncHelpers.js.map +1 -0
  45. package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
  46. package/dist/cli/commands/syncHelpers.test.js +22 -0
  47. package/dist/cli/commands/syncHelpers.test.js.map +1 -0
  48. package/dist/cli/commands/syncTypes.d.ts +24 -0
  49. package/dist/cli/commands/syncTypes.js +2 -0
  50. package/dist/cli/commands/syncTypes.js.map +1 -0
  51. package/dist/cli/commands/unstar.d.ts +8 -0
  52. package/dist/cli/commands/unstar.js +38 -0
  53. package/dist/cli/commands/unstar.js.map +1 -0
  54. package/dist/cli/helpStyle.d.ts +13 -0
  55. package/dist/cli/helpStyle.js +38 -0
  56. package/dist/cli/helpStyle.js.map +1 -0
  57. package/dist/cli/pilotbotConfig.d.ts +6 -0
  58. package/dist/cli/pilotbotConfig.js +110 -0
  59. package/dist/cli/pilotbotConfig.js.map +1 -0
  60. package/dist/cli/pilotbotConfig.test.d.ts +1 -0
  61. package/dist/cli/pilotbotConfig.test.js +133 -0
  62. package/dist/cli/pilotbotConfig.test.js.map +1 -0
  63. package/dist/cli/registry.d.ts +7 -0
  64. package/dist/cli/registry.js +42 -0
  65. package/dist/cli/registry.js.map +1 -0
  66. package/dist/cli/registry.test.d.ts +1 -0
  67. package/dist/cli/registry.test.js +48 -0
  68. package/dist/cli/registry.test.js.map +1 -0
  69. package/dist/cli/scanSkills.d.ts +7 -0
  70. package/dist/cli/scanSkills.js +75 -0
  71. package/dist/cli/scanSkills.js.map +1 -0
  72. package/dist/cli/scanSkills.test.d.ts +1 -0
  73. package/dist/cli/scanSkills.test.js +60 -0
  74. package/dist/cli/scanSkills.test.js.map +1 -0
  75. package/dist/cli/slug.d.ts +2 -0
  76. package/dist/cli/slug.js +16 -0
  77. package/dist/cli/slug.js.map +1 -0
  78. package/dist/cli/types.d.ts +15 -0
  79. package/dist/cli/types.js +2 -0
  80. package/dist/cli/types.js.map +1 -0
  81. package/dist/cli/ui.d.ts +7 -0
  82. package/dist/cli/ui.js +72 -0
  83. package/dist/cli/ui.js.map +1 -0
  84. package/dist/cli.d.ts +2 -0
  85. package/dist/cli.js +268 -0
  86. package/dist/cli.js.map +1 -0
  87. package/dist/config.d.ts +4 -0
  88. package/dist/config.js +38 -0
  89. package/dist/config.js.map +1 -0
  90. package/dist/discovery.d.ts +5 -0
  91. package/dist/discovery.js +21 -0
  92. package/dist/discovery.js.map +1 -0
  93. package/dist/discovery.test.d.ts +1 -0
  94. package/dist/discovery.test.js +46 -0
  95. package/dist/discovery.test.js.map +1 -0
  96. package/dist/http.d.ts +32 -0
  97. package/dist/http.js +261 -0
  98. package/dist/http.js.map +1 -0
  99. package/dist/http.test.d.ts +1 -0
  100. package/dist/http.test.js +135 -0
  101. package/dist/http.test.js.map +1 -0
  102. package/dist/schema/ark.js.map +1 -0
  103. package/dist/schema/index.js.map +1 -0
  104. package/dist/schema/routes.js.map +1 -0
  105. package/{packages/schema/dist → dist/schema}/schemas.d.ts +0 -39
  106. package/{packages/schema/dist → dist/schema}/schemas.js +0 -22
  107. package/dist/schema/schemas.js.map +1 -0
  108. package/dist/schema/textFiles.js.map +1 -0
  109. package/dist/schema/textFiles.test.d.ts +1 -0
  110. package/dist/schema/textFiles.test.js +20 -0
  111. package/dist/schema/textFiles.test.js.map +1 -0
  112. package/dist/skills.d.ts +43 -0
  113. package/dist/skills.js +163 -0
  114. package/dist/skills.js.map +1 -0
  115. package/dist/skills.test.d.ts +1 -0
  116. package/dist/skills.test.js +144 -0
  117. package/dist/skills.test.js.map +1 -0
  118. package/dist/types.d.ts +7 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/package.json +27 -70
  122. package/.env.local.example +0 -19
  123. package/.github/workflows/ci.yml +0 -40
  124. package/.oxlintrc.json +0 -3
  125. package/AGENTS.md +0 -45
  126. package/CHANGELOG.md +0 -138
  127. package/DEPRECATIONS.md +0 -7
  128. package/biome.json +0 -41
  129. package/convex/_generated/api.d.ts +0 -153
  130. package/convex/_generated/api.js +0 -23
  131. package/convex/_generated/dataModel.d.ts +0 -60
  132. package/convex/_generated/server.d.ts +0 -143
  133. package/convex/_generated/server.js +0 -93
  134. package/convex/auth.config.ts +0 -8
  135. package/convex/auth.ts +0 -19
  136. package/convex/comments.ts +0 -88
  137. package/convex/crons.ts +0 -34
  138. package/convex/devSeed.ts +0 -459
  139. package/convex/devSeedExtra.ts +0 -541
  140. package/convex/downloads.ts +0 -78
  141. package/convex/githubBackups.ts +0 -170
  142. package/convex/githubBackupsNode.ts +0 -183
  143. package/convex/githubImport.ts +0 -317
  144. package/convex/githubSoulBackups.ts +0 -170
  145. package/convex/githubSoulBackupsNode.ts +0 -186
  146. package/convex/http.ts +0 -194
  147. package/convex/httpApi.handlers.test.ts +0 -488
  148. package/convex/httpApi.test.ts +0 -70
  149. package/convex/httpApi.ts +0 -305
  150. package/convex/httpApiV1.handlers.test.ts +0 -584
  151. package/convex/httpApiV1.ts +0 -1172
  152. package/convex/leaderboards.ts +0 -39
  153. package/convex/lib/access.ts +0 -36
  154. package/convex/lib/apiTokenAuth.ts +0 -36
  155. package/convex/lib/badges.ts +0 -50
  156. package/convex/lib/changelog.test.ts +0 -34
  157. package/convex/lib/changelog.ts +0 -278
  158. package/convex/lib/embeddings.ts +0 -38
  159. package/convex/lib/githubBackup.ts +0 -443
  160. package/convex/lib/githubImport.test.ts +0 -247
  161. package/convex/lib/githubImport.ts +0 -425
  162. package/convex/lib/githubSoulBackup.ts +0 -443
  163. package/convex/lib/leaderboards.ts +0 -103
  164. package/convex/lib/moderation.ts +0 -42
  165. package/convex/lib/public.ts +0 -89
  166. package/convex/lib/searchText.test.ts +0 -46
  167. package/convex/lib/searchText.ts +0 -27
  168. package/convex/lib/skillBackfill.test.ts +0 -34
  169. package/convex/lib/skillBackfill.ts +0 -67
  170. package/convex/lib/skillPublish.test.ts +0 -28
  171. package/convex/lib/skillPublish.ts +0 -284
  172. package/convex/lib/skillStats.ts +0 -80
  173. package/convex/lib/skills.test.ts +0 -197
  174. package/convex/lib/skills.ts +0 -273
  175. package/convex/lib/soulChangelog.ts +0 -273
  176. package/convex/lib/soulPublish.ts +0 -236
  177. package/convex/lib/tokens.test.ts +0 -33
  178. package/convex/lib/tokens.ts +0 -51
  179. package/convex/lib/webhooks.test.ts +0 -91
  180. package/convex/lib/webhooks.ts +0 -112
  181. package/convex/maintenance.test.ts +0 -270
  182. package/convex/maintenance.ts +0 -840
  183. package/convex/rateLimits.ts +0 -50
  184. package/convex/schema.ts +0 -472
  185. package/convex/search.test.ts +0 -12
  186. package/convex/search.ts +0 -254
  187. package/convex/seed.test.ts +0 -37
  188. package/convex/seed.ts +0 -254
  189. package/convex/seedSouls.ts +0 -111
  190. package/convex/skillStatEvents.ts +0 -568
  191. package/convex/skills.ts +0 -1606
  192. package/convex/soulComments.ts +0 -88
  193. package/convex/soulDownloads.ts +0 -14
  194. package/convex/soulStars.ts +0 -71
  195. package/convex/souls.ts +0 -570
  196. package/convex/stars.ts +0 -108
  197. package/convex/statsMaintenance.ts +0 -205
  198. package/convex/telemetry.ts +0 -434
  199. package/convex/tokens.ts +0 -88
  200. package/convex/tsconfig.json +0 -7
  201. package/convex/uploads.ts +0 -20
  202. package/convex/users.ts +0 -122
  203. package/convex/webhooks.ts +0 -50
  204. package/convex.json +0 -3
  205. package/docs/README.md +0 -32
  206. package/docs/api.md +0 -51
  207. package/docs/architecture.md +0 -61
  208. package/docs/auth.md +0 -54
  209. package/docs/cli.md +0 -117
  210. package/docs/deploy.md +0 -78
  211. package/docs/diffing.md +0 -84
  212. package/docs/github-import.md +0 -171
  213. package/docs/http-api.md +0 -187
  214. package/docs/manual-testing.md +0 -64
  215. package/docs/mintlify.md +0 -43
  216. package/docs/quickstart.md +0 -120
  217. package/docs/skill-format.md +0 -58
  218. package/docs/soul-format.md +0 -37
  219. package/docs/spec.md +0 -177
  220. package/docs/telemetry.md +0 -91
  221. package/docs/troubleshooting.md +0 -49
  222. package/docs/webhook.md +0 -51
  223. package/e2e/menu-smoke.pw.test.ts +0 -49
  224. package/e2e/pilothub.e2e.test.ts +0 -494
  225. package/e2e/search-exact.pw.test.ts +0 -97
  226. package/packages/pilothub/LICENSE +0 -22
  227. package/packages/pilothub/README.md +0 -57
  228. package/packages/pilothub/package.json +0 -41
  229. package/packages/pilothub/src/browserAuth.test.ts +0 -96
  230. package/packages/pilothub/src/browserAuth.ts +0 -174
  231. package/packages/pilothub/src/cli/buildInfo.ts +0 -94
  232. package/packages/pilothub/src/cli/commands/auth.ts +0 -97
  233. package/packages/pilothub/src/cli/commands/delete.test.ts +0 -73
  234. package/packages/pilothub/src/cli/commands/delete.ts +0 -83
  235. package/packages/pilothub/src/cli/commands/publish.test.ts +0 -122
  236. package/packages/pilothub/src/cli/commands/publish.ts +0 -108
  237. package/packages/pilothub/src/cli/commands/skills.test.ts +0 -191
  238. package/packages/pilothub/src/cli/commands/skills.ts +0 -380
  239. package/packages/pilothub/src/cli/commands/star.ts +0 -46
  240. package/packages/pilothub/src/cli/commands/sync.test.ts +0 -310
  241. package/packages/pilothub/src/cli/commands/sync.ts +0 -200
  242. package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +0 -26
  243. package/packages/pilothub/src/cli/commands/syncHelpers.ts +0 -427
  244. package/packages/pilothub/src/cli/commands/syncTypes.ts +0 -27
  245. package/packages/pilothub/src/cli/commands/unstar.ts +0 -48
  246. package/packages/pilothub/src/cli/helpStyle.ts +0 -45
  247. package/packages/pilothub/src/cli/pilotbotConfig.test.ts +0 -159
  248. package/packages/pilothub/src/cli/pilotbotConfig.ts +0 -147
  249. package/packages/pilothub/src/cli/registry.test.ts +0 -63
  250. package/packages/pilothub/src/cli/registry.ts +0 -43
  251. package/packages/pilothub/src/cli/scanSkills.test.ts +0 -64
  252. package/packages/pilothub/src/cli/scanSkills.ts +0 -84
  253. package/packages/pilothub/src/cli/slug.ts +0 -16
  254. package/packages/pilothub/src/cli/types.ts +0 -12
  255. package/packages/pilothub/src/cli/ui.ts +0 -75
  256. package/packages/pilothub/src/cli.ts +0 -311
  257. package/packages/pilothub/src/config.ts +0 -36
  258. package/packages/pilothub/src/discovery.test.ts +0 -75
  259. package/packages/pilothub/src/discovery.ts +0 -19
  260. package/packages/pilothub/src/http.test.ts +0 -156
  261. package/packages/pilothub/src/http.ts +0 -301
  262. package/packages/pilothub/src/schema/ark.ts +0 -29
  263. package/packages/pilothub/src/schema/index.ts +0 -5
  264. package/packages/pilothub/src/schema/routes.ts +0 -22
  265. package/packages/pilothub/src/schema/schemas.ts +0 -260
  266. package/packages/pilothub/src/schema/textFiles.test.ts +0 -23
  267. package/packages/pilothub/src/schema/textFiles.ts +0 -66
  268. package/packages/pilothub/src/skills.test.ts +0 -191
  269. package/packages/pilothub/src/skills.ts +0 -172
  270. package/packages/pilothub/src/types.ts +0 -10
  271. package/packages/pilothub/tsconfig.json +0 -14
  272. package/packages/schema/README.md +0 -3
  273. package/packages/schema/dist/ark.js.map +0 -1
  274. package/packages/schema/dist/index.js.map +0 -1
  275. package/packages/schema/dist/routes.js.map +0 -1
  276. package/packages/schema/dist/schemas.js.map +0 -1
  277. package/packages/schema/dist/textFiles.js.map +0 -1
  278. package/packages/schema/package.json +0 -26
  279. package/packages/schema/src/ark.ts +0 -29
  280. package/packages/schema/src/index.ts +0 -5
  281. package/packages/schema/src/routes.ts +0 -22
  282. package/packages/schema/src/schemas.test.ts +0 -123
  283. package/packages/schema/src/schemas.ts +0 -287
  284. package/packages/schema/src/textFiles.test.ts +0 -23
  285. package/packages/schema/src/textFiles.ts +0 -66
  286. package/packages/schema/tsconfig.json +0 -15
  287. package/pilothub +0 -46
  288. package/playwright.config.ts +0 -33
  289. package/public/.well-known/pilothub.json +0 -6
  290. package/public/api/v1/openapi.json +0 -379
  291. package/public/favicon.ico +0 -0
  292. package/public/logo192.png +0 -0
  293. package/public/logo512.png +0 -0
  294. package/public/manifest.json +0 -25
  295. package/public/og.png +0 -0
  296. package/public/og.svg +0 -98
  297. package/public/pilot-logo.png +0 -0
  298. package/public/pilot-mark.png +0 -0
  299. package/public/robots.txt +0 -3
  300. package/public/tanstack-circle-logo.png +0 -0
  301. package/public/tanstack-word-logo-white.svg +0 -1
  302. package/scripts/check-peer-deps.ts +0 -56
  303. package/scripts/docs-list.ts +0 -148
  304. package/scripts/run-playwright-local.sh +0 -14
  305. package/server/og/fetchSkillOgMeta.ts +0 -27
  306. package/server/og/fetchSoulOgMeta.ts +0 -27
  307. package/server/og/ogAssets.ts +0 -80
  308. package/server/og/skillOgSvg.test.ts +0 -59
  309. package/server/og/skillOgSvg.ts +0 -258
  310. package/server/og/soulOgSvg.ts +0 -209
  311. package/server/routes/og/skill.png.ts +0 -103
  312. package/server/routes/og/soul.png.ts +0 -111
  313. package/src/__tests__/skill-detail-page.test.tsx +0 -86
  314. package/src/__tests__/skills-index.test.tsx +0 -145
  315. package/src/__tests__/upload.route.test.tsx +0 -228
  316. package/src/components/AppProviders.tsx +0 -19
  317. package/src/components/ClientOnly.tsx +0 -18
  318. package/src/components/Footer.tsx +0 -29
  319. package/src/components/Header.tsx +0 -295
  320. package/src/components/InstallSwitcher.tsx +0 -53
  321. package/src/components/SkillCard.tsx +0 -36
  322. package/src/components/SkillDetailPage.tsx +0 -817
  323. package/src/components/SkillDiffCard.tsx +0 -485
  324. package/src/components/SoulCard.tsx +0 -19
  325. package/src/components/SoulDetailPage.tsx +0 -263
  326. package/src/components/UserBootstrap.tsx +0 -18
  327. package/src/components/ui/dropdown-menu.tsx +0 -67
  328. package/src/components/ui/toggle-group.tsx +0 -35
  329. package/src/convex/client.ts +0 -3
  330. package/src/lib/badges.ts +0 -29
  331. package/src/lib/diffing.test.ts +0 -163
  332. package/src/lib/diffing.ts +0 -106
  333. package/src/lib/gravatar.test.ts +0 -9
  334. package/src/lib/gravatar.ts +0 -158
  335. package/src/lib/og.test.ts +0 -142
  336. package/src/lib/og.ts +0 -156
  337. package/src/lib/publicUser.ts +0 -39
  338. package/src/lib/roles.ts +0 -19
  339. package/src/lib/site.test.ts +0 -130
  340. package/src/lib/site.ts +0 -84
  341. package/src/lib/theme-transition.test.ts +0 -134
  342. package/src/lib/theme-transition.ts +0 -134
  343. package/src/lib/theme.test.tsx +0 -88
  344. package/src/lib/theme.ts +0 -43
  345. package/src/lib/uploadFiles.jsdom.test.ts +0 -33
  346. package/src/lib/uploadFiles.test.ts +0 -123
  347. package/src/lib/uploadFiles.ts +0 -245
  348. package/src/lib/uploadUtils.test.ts +0 -78
  349. package/src/lib/uploadUtils.ts +0 -93
  350. package/src/lib/useAuthStatus.ts +0 -12
  351. package/src/lib/utils.test.ts +0 -9
  352. package/src/lib/utils.ts +0 -6
  353. package/src/logo.svg +0 -12
  354. package/src/routeTree.gen.ts +0 -345
  355. package/src/router.tsx +0 -17
  356. package/src/routes/$owner/$slug.tsx +0 -55
  357. package/src/routes/__root.tsx +0 -136
  358. package/src/routes/admin.tsx +0 -11
  359. package/src/routes/cli/auth.tsx +0 -168
  360. package/src/routes/dashboard.tsx +0 -97
  361. package/src/routes/import.tsx +0 -415
  362. package/src/routes/index.tsx +0 -252
  363. package/src/routes/management.tsx +0 -529
  364. package/src/routes/settings.tsx +0 -203
  365. package/src/routes/skills/index.tsx +0 -422
  366. package/src/routes/souls/$slug.tsx +0 -55
  367. package/src/routes/souls/index.tsx +0 -243
  368. package/src/routes/stars.tsx +0 -68
  369. package/src/routes/u/$handle.tsx +0 -307
  370. package/src/routes/upload/utils.ts +0 -81
  371. package/src/routes/upload.tsx +0 -499
  372. package/src/styles.css +0 -2718
  373. package/tsconfig.json +0 -24
  374. package/tsconfig.oxlint.json +0 -16
  375. package/vercel.json +0 -8
  376. package/vite.config.ts +0 -48
  377. package/vitest.config.ts +0 -47
  378. package/vitest.e2e.config.ts +0 -11
  379. package/vitest.setup.ts +0 -1
  380. /package/{packages/pilothub/bin → bin}/pilothub.js +0 -0
  381. /package/{packages/schema/dist → dist/schema}/ark.d.ts +0 -0
  382. /package/{packages/schema/dist → dist/schema}/ark.js +0 -0
  383. /package/{packages/schema/dist → dist/schema}/index.d.ts +0 -0
  384. /package/{packages/schema/dist → dist/schema}/index.js +0 -0
  385. /package/{packages/schema/dist → dist/schema}/routes.d.ts +0 -0
  386. /package/{packages/schema/dist → dist/schema}/routes.js +0 -0
  387. /package/{packages/schema/dist → dist/schema}/textFiles.d.ts +0 -0
  388. /package/{packages/schema/dist → dist/schema}/textFiles.js +0 -0
@@ -1,50 +0,0 @@
1
- import { v } from 'convex/values'
2
- import { internalMutation } from './_generated/server'
3
-
4
- export const checkRateLimitInternal = internalMutation({
5
- args: {
6
- key: v.string(),
7
- limit: v.number(),
8
- windowMs: v.number(),
9
- },
10
- handler: async (ctx, args) => {
11
- const now = Date.now()
12
- const windowStart = Math.floor(now / args.windowMs) * args.windowMs
13
- const resetAt = windowStart + args.windowMs
14
- if (args.limit <= 0) {
15
- return { allowed: false, remaining: 0, limit: args.limit, resetAt }
16
- }
17
-
18
- const existing = await ctx.db
19
- .query('rateLimits')
20
- .withIndex('by_key_window', (q) => q.eq('key', args.key).eq('windowStart', windowStart))
21
- .unique()
22
-
23
- if (!existing) {
24
- await ctx.db.insert('rateLimits', {
25
- key: args.key,
26
- windowStart,
27
- count: 1,
28
- limit: args.limit,
29
- updatedAt: now,
30
- })
31
- return { allowed: true, remaining: Math.max(0, args.limit - 1), limit: args.limit, resetAt }
32
- }
33
-
34
- if (existing.count >= args.limit) {
35
- return { allowed: false, remaining: 0, limit: args.limit, resetAt }
36
- }
37
-
38
- await ctx.db.patch(existing._id, {
39
- count: existing.count + 1,
40
- limit: args.limit,
41
- updatedAt: now,
42
- })
43
- return {
44
- allowed: true,
45
- remaining: Math.max(0, args.limit - existing.count - 1),
46
- limit: args.limit,
47
- resetAt,
48
- }
49
- },
50
- })
package/convex/schema.ts DELETED
@@ -1,472 +0,0 @@
1
- import { authTables } from '@convex-dev/auth/server'
2
- import { defineSchema, defineTable } from 'convex/server'
3
- import { v } from 'convex/values'
4
- import { EMBEDDING_DIMENSIONS } from './lib/embeddings'
5
-
6
- const authSchema = authTables as unknown as Record<string, ReturnType<typeof defineTable>>
7
-
8
- const users = defineTable({
9
- name: v.optional(v.string()),
10
- image: v.optional(v.string()),
11
- email: v.optional(v.string()),
12
- emailVerificationTime: v.optional(v.number()),
13
- phone: v.optional(v.string()),
14
- phoneVerificationTime: v.optional(v.number()),
15
- isAnonymous: v.optional(v.boolean()),
16
- handle: v.optional(v.string()),
17
- displayName: v.optional(v.string()),
18
- bio: v.optional(v.string()),
19
- role: v.optional(v.union(v.literal('admin'), v.literal('moderator'), v.literal('user'))),
20
- deletedAt: v.optional(v.number()),
21
- createdAt: v.optional(v.number()),
22
- updatedAt: v.optional(v.number()),
23
- })
24
- .index('email', ['email'])
25
- .index('phone', ['phone'])
26
- .index('handle', ['handle'])
27
-
28
- const skills = defineTable({
29
- slug: v.string(),
30
- displayName: v.string(),
31
- summary: v.optional(v.string()),
32
- ownerUserId: v.id('users'),
33
- canonicalSkillId: v.optional(v.id('skills')),
34
- forkOf: v.optional(
35
- v.object({
36
- skillId: v.id('skills'),
37
- kind: v.union(v.literal('fork'), v.literal('duplicate')),
38
- version: v.optional(v.string()),
39
- at: v.number(),
40
- }),
41
- ),
42
- latestVersionId: v.optional(v.id('skillVersions')),
43
- tags: v.record(v.string(), v.id('skillVersions')),
44
- softDeletedAt: v.optional(v.number()),
45
- badges: v.object({
46
- redactionApproved: v.optional(
47
- v.object({
48
- byUserId: v.id('users'),
49
- at: v.number(),
50
- }),
51
- ),
52
- highlighted: v.optional(
53
- v.object({
54
- byUserId: v.id('users'),
55
- at: v.number(),
56
- }),
57
- ),
58
- official: v.optional(
59
- v.object({
60
- byUserId: v.id('users'),
61
- at: v.number(),
62
- }),
63
- ),
64
- deprecated: v.optional(
65
- v.object({
66
- byUserId: v.id('users'),
67
- at: v.number(),
68
- }),
69
- ),
70
- }),
71
- moderationStatus: v.optional(
72
- v.union(v.literal('active'), v.literal('hidden'), v.literal('removed')),
73
- ),
74
- moderationNotes: v.optional(v.string()),
75
- moderationReason: v.optional(v.string()),
76
- moderationFlags: v.optional(v.array(v.string())),
77
- lastReviewedAt: v.optional(v.number()),
78
- hiddenAt: v.optional(v.number()),
79
- hiddenBy: v.optional(v.id('users')),
80
- reportCount: v.optional(v.number()),
81
- lastReportedAt: v.optional(v.number()),
82
- batch: v.optional(v.string()),
83
- statsDownloads: v.optional(v.number()),
84
- statsStars: v.optional(v.number()),
85
- statsInstallsCurrent: v.optional(v.number()),
86
- statsInstallsAllTime: v.optional(v.number()),
87
- stats: v.object({
88
- downloads: v.number(),
89
- installsCurrent: v.optional(v.number()),
90
- installsAllTime: v.optional(v.number()),
91
- stars: v.number(),
92
- versions: v.number(),
93
- comments: v.number(),
94
- }),
95
- createdAt: v.number(),
96
- updatedAt: v.number(),
97
- })
98
- .index('by_slug', ['slug'])
99
- .index('by_owner', ['ownerUserId'])
100
- .index('by_updated', ['updatedAt'])
101
- .index('by_stats_downloads', ['statsDownloads', 'updatedAt'])
102
- .index('by_stats_stars', ['statsStars', 'updatedAt'])
103
- .index('by_stats_installs_current', ['statsInstallsCurrent', 'updatedAt'])
104
- .index('by_stats_installs_all_time', ['statsInstallsAllTime', 'updatedAt'])
105
- .index('by_batch', ['batch'])
106
- .index('by_active_updated', ['softDeletedAt', 'updatedAt'])
107
-
108
- const souls = defineTable({
109
- slug: v.string(),
110
- displayName: v.string(),
111
- summary: v.optional(v.string()),
112
- ownerUserId: v.id('users'),
113
- latestVersionId: v.optional(v.id('soulVersions')),
114
- tags: v.record(v.string(), v.id('soulVersions')),
115
- softDeletedAt: v.optional(v.number()),
116
- stats: v.object({
117
- downloads: v.number(),
118
- stars: v.number(),
119
- versions: v.number(),
120
- comments: v.number(),
121
- }),
122
- createdAt: v.number(),
123
- updatedAt: v.number(),
124
- })
125
- .index('by_slug', ['slug'])
126
- .index('by_owner', ['ownerUserId'])
127
- .index('by_updated', ['updatedAt'])
128
-
129
- const skillVersions = defineTable({
130
- skillId: v.id('skills'),
131
- version: v.string(),
132
- fingerprint: v.optional(v.string()),
133
- changelog: v.string(),
134
- changelogSource: v.optional(v.union(v.literal('auto'), v.literal('user'))),
135
- files: v.array(
136
- v.object({
137
- path: v.string(),
138
- size: v.number(),
139
- storageId: v.id('_storage'),
140
- sha256: v.string(),
141
- contentType: v.optional(v.string()),
142
- }),
143
- ),
144
- parsed: v.object({
145
- frontmatter: v.record(v.string(), v.any()),
146
- metadata: v.optional(v.any()),
147
- pilotbot: v.optional(v.any()),
148
- clawdis: v.optional(v.any()),
149
- }),
150
- createdBy: v.id('users'),
151
- createdAt: v.number(),
152
- softDeletedAt: v.optional(v.number()),
153
- })
154
- .index('by_skill', ['skillId'])
155
- .index('by_skill_version', ['skillId', 'version'])
156
-
157
- const soulVersions = defineTable({
158
- soulId: v.id('souls'),
159
- version: v.string(),
160
- fingerprint: v.optional(v.string()),
161
- changelog: v.string(),
162
- changelogSource: v.optional(v.union(v.literal('auto'), v.literal('user'))),
163
- files: v.array(
164
- v.object({
165
- path: v.string(),
166
- size: v.number(),
167
- storageId: v.id('_storage'),
168
- sha256: v.string(),
169
- contentType: v.optional(v.string()),
170
- }),
171
- ),
172
- parsed: v.object({
173
- frontmatter: v.record(v.string(), v.any()),
174
- metadata: v.optional(v.any()),
175
- clawdis: v.optional(v.any()),
176
- }),
177
- createdBy: v.id('users'),
178
- createdAt: v.number(),
179
- softDeletedAt: v.optional(v.number()),
180
- })
181
- .index('by_soul', ['soulId'])
182
- .index('by_soul_version', ['soulId', 'version'])
183
-
184
- const skillVersionFingerprints = defineTable({
185
- skillId: v.id('skills'),
186
- versionId: v.id('skillVersions'),
187
- fingerprint: v.string(),
188
- createdAt: v.number(),
189
- })
190
- .index('by_version', ['versionId'])
191
- .index('by_fingerprint', ['fingerprint'])
192
- .index('by_skill_fingerprint', ['skillId', 'fingerprint'])
193
-
194
- const skillBadges = defineTable({
195
- skillId: v.id('skills'),
196
- kind: v.union(
197
- v.literal('highlighted'),
198
- v.literal('official'),
199
- v.literal('deprecated'),
200
- v.literal('redactionApproved'),
201
- ),
202
- byUserId: v.id('users'),
203
- at: v.number(),
204
- })
205
- .index('by_skill', ['skillId'])
206
- .index('by_skill_kind', ['skillId', 'kind'])
207
- .index('by_kind_at', ['kind', 'at'])
208
-
209
- const soulVersionFingerprints = defineTable({
210
- soulId: v.id('souls'),
211
- versionId: v.id('soulVersions'),
212
- fingerprint: v.string(),
213
- createdAt: v.number(),
214
- })
215
- .index('by_version', ['versionId'])
216
- .index('by_fingerprint', ['fingerprint'])
217
- .index('by_soul_fingerprint', ['soulId', 'fingerprint'])
218
-
219
- const skillEmbeddings = defineTable({
220
- skillId: v.id('skills'),
221
- versionId: v.id('skillVersions'),
222
- ownerId: v.id('users'),
223
- embedding: v.array(v.number()),
224
- isLatest: v.boolean(),
225
- isApproved: v.boolean(),
226
- visibility: v.string(),
227
- updatedAt: v.number(),
228
- })
229
- .index('by_skill', ['skillId'])
230
- .index('by_version', ['versionId'])
231
- .vectorIndex('by_embedding', {
232
- vectorField: 'embedding',
233
- dimensions: EMBEDDING_DIMENSIONS,
234
- filterFields: ['visibility'],
235
- })
236
-
237
- const skillDailyStats = defineTable({
238
- skillId: v.id('skills'),
239
- day: v.number(),
240
- downloads: v.number(),
241
- installs: v.number(),
242
- updatedAt: v.number(),
243
- })
244
- .index('by_skill_day', ['skillId', 'day'])
245
- .index('by_day', ['day'])
246
-
247
- const skillLeaderboards = defineTable({
248
- kind: v.string(),
249
- generatedAt: v.number(),
250
- rangeStartDay: v.number(),
251
- rangeEndDay: v.number(),
252
- items: v.array(
253
- v.object({
254
- skillId: v.id('skills'),
255
- score: v.number(),
256
- installs: v.number(),
257
- downloads: v.number(),
258
- }),
259
- ),
260
- }).index('by_kind', ['kind', 'generatedAt'])
261
-
262
- const skillStatBackfillState = defineTable({
263
- key: v.string(),
264
- cursor: v.optional(v.string()),
265
- doneAt: v.optional(v.number()),
266
- updatedAt: v.number(),
267
- }).index('by_key', ['key'])
268
-
269
- const skillStatEvents = defineTable({
270
- skillId: v.id('skills'),
271
- kind: v.union(
272
- v.literal('download'),
273
- v.literal('star'),
274
- v.literal('unstar'),
275
- v.literal('install_new'),
276
- v.literal('install_reactivate'),
277
- v.literal('install_deactivate'),
278
- v.literal('install_clear'),
279
- ),
280
- delta: v.optional(
281
- v.object({
282
- allTime: v.number(),
283
- current: v.number(),
284
- }),
285
- ),
286
- occurredAt: v.number(),
287
- processedAt: v.optional(v.number()),
288
- })
289
- .index('by_unprocessed', ['processedAt'])
290
- .index('by_skill', ['skillId'])
291
-
292
- const skillStatUpdateCursors = defineTable({
293
- key: v.string(),
294
- cursorCreationTime: v.optional(v.number()),
295
- updatedAt: v.number(),
296
- }).index('by_key', ['key'])
297
-
298
- const soulEmbeddings = defineTable({
299
- soulId: v.id('souls'),
300
- versionId: v.id('soulVersions'),
301
- ownerId: v.id('users'),
302
- embedding: v.array(v.number()),
303
- isLatest: v.boolean(),
304
- isApproved: v.boolean(),
305
- visibility: v.string(),
306
- updatedAt: v.number(),
307
- })
308
- .index('by_soul', ['soulId'])
309
- .index('by_version', ['versionId'])
310
- .vectorIndex('by_embedding', {
311
- vectorField: 'embedding',
312
- dimensions: EMBEDDING_DIMENSIONS,
313
- filterFields: ['visibility'],
314
- })
315
-
316
- const comments = defineTable({
317
- skillId: v.id('skills'),
318
- userId: v.id('users'),
319
- body: v.string(),
320
- createdAt: v.number(),
321
- softDeletedAt: v.optional(v.number()),
322
- deletedBy: v.optional(v.id('users')),
323
- })
324
- .index('by_skill', ['skillId'])
325
- .index('by_user', ['userId'])
326
-
327
- const skillReports = defineTable({
328
- skillId: v.id('skills'),
329
- userId: v.id('users'),
330
- reason: v.optional(v.string()),
331
- createdAt: v.number(),
332
- })
333
- .index('by_skill', ['skillId'])
334
- .index('by_user', ['userId'])
335
- .index('by_skill_user', ['skillId', 'userId'])
336
-
337
- const soulComments = defineTable({
338
- soulId: v.id('souls'),
339
- userId: v.id('users'),
340
- body: v.string(),
341
- createdAt: v.number(),
342
- softDeletedAt: v.optional(v.number()),
343
- deletedBy: v.optional(v.id('users')),
344
- })
345
- .index('by_soul', ['soulId'])
346
- .index('by_user', ['userId'])
347
-
348
- const stars = defineTable({
349
- skillId: v.id('skills'),
350
- userId: v.id('users'),
351
- createdAt: v.number(),
352
- })
353
- .index('by_skill', ['skillId'])
354
- .index('by_user', ['userId'])
355
- .index('by_skill_user', ['skillId', 'userId'])
356
-
357
- const soulStars = defineTable({
358
- soulId: v.id('souls'),
359
- userId: v.id('users'),
360
- createdAt: v.number(),
361
- })
362
- .index('by_soul', ['soulId'])
363
- .index('by_user', ['userId'])
364
- .index('by_soul_user', ['soulId', 'userId'])
365
-
366
- const auditLogs = defineTable({
367
- actorUserId: v.id('users'),
368
- action: v.string(),
369
- targetType: v.string(),
370
- targetId: v.string(),
371
- metadata: v.optional(v.any()),
372
- createdAt: v.number(),
373
- })
374
- .index('by_actor', ['actorUserId'])
375
- .index('by_target', ['targetType', 'targetId'])
376
-
377
- const apiTokens = defineTable({
378
- userId: v.id('users'),
379
- label: v.string(),
380
- prefix: v.string(),
381
- tokenHash: v.string(),
382
- createdAt: v.number(),
383
- lastUsedAt: v.optional(v.number()),
384
- revokedAt: v.optional(v.number()),
385
- })
386
- .index('by_user', ['userId'])
387
- .index('by_hash', ['tokenHash'])
388
-
389
- const rateLimits = defineTable({
390
- key: v.string(),
391
- windowStart: v.number(),
392
- count: v.number(),
393
- limit: v.number(),
394
- updatedAt: v.number(),
395
- })
396
- .index('by_key_window', ['key', 'windowStart'])
397
- .index('by_key', ['key'])
398
-
399
- const githubBackupSyncState = defineTable({
400
- key: v.string(),
401
- cursor: v.optional(v.string()),
402
- updatedAt: v.number(),
403
- }).index('by_key', ['key'])
404
-
405
- const userSyncRoots = defineTable({
406
- userId: v.id('users'),
407
- rootId: v.string(),
408
- label: v.string(),
409
- firstSeenAt: v.number(),
410
- lastSeenAt: v.number(),
411
- expiredAt: v.optional(v.number()),
412
- })
413
- .index('by_user', ['userId'])
414
- .index('by_user_root', ['userId', 'rootId'])
415
-
416
- const userSkillInstalls = defineTable({
417
- userId: v.id('users'),
418
- skillId: v.id('skills'),
419
- firstSeenAt: v.number(),
420
- lastSeenAt: v.number(),
421
- activeRoots: v.number(),
422
- lastVersion: v.optional(v.string()),
423
- })
424
- .index('by_user', ['userId'])
425
- .index('by_user_skill', ['userId', 'skillId'])
426
- .index('by_skill', ['skillId'])
427
-
428
- const userSkillRootInstalls = defineTable({
429
- userId: v.id('users'),
430
- rootId: v.string(),
431
- skillId: v.id('skills'),
432
- firstSeenAt: v.number(),
433
- lastSeenAt: v.number(),
434
- lastVersion: v.optional(v.string()),
435
- removedAt: v.optional(v.number()),
436
- })
437
- .index('by_user', ['userId'])
438
- .index('by_user_root', ['userId', 'rootId'])
439
- .index('by_user_root_skill', ['userId', 'rootId', 'skillId'])
440
- .index('by_user_skill', ['userId', 'skillId'])
441
- .index('by_skill', ['skillId'])
442
-
443
- export default defineSchema({
444
- ...authSchema,
445
- users,
446
- skills,
447
- souls,
448
- skillVersions,
449
- soulVersions,
450
- skillVersionFingerprints,
451
- skillBadges,
452
- soulVersionFingerprints,
453
- skillEmbeddings,
454
- soulEmbeddings,
455
- skillDailyStats,
456
- skillLeaderboards,
457
- skillStatBackfillState,
458
- skillStatEvents,
459
- skillStatUpdateCursors,
460
- comments,
461
- skillReports,
462
- soulComments,
463
- stars,
464
- soulStars,
465
- auditLogs,
466
- apiTokens,
467
- rateLimits,
468
- githubBackupSyncState,
469
- userSyncRoots,
470
- userSkillInstalls,
471
- userSkillRootInstalls,
472
- })
@@ -1,12 +0,0 @@
1
- /* @vitest-environment node */
2
-
3
- import { describe, expect, it } from 'vitest'
4
- import { __test } from './search'
5
-
6
- describe('search helpers', () => {
7
- it('advances candidate limit until max', () => {
8
- expect(__test.getNextCandidateLimit(50, 1000)).toBe(100)
9
- expect(__test.getNextCandidateLimit(800, 1000)).toBe(1000)
10
- expect(__test.getNextCandidateLimit(1000, 1000)).toBeNull()
11
- })
12
- })