diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..182081ff Binary files /dev/null and b/.DS_Store differ diff --git a/.env b/.env new file mode 100644 index 00000000..1947d41f --- /dev/null +++ b/.env @@ -0,0 +1 @@ +GOPHERAI_API_KEY=rp4EP8mHxatUP4HlrkryoajwaZfvARf9GkYJdiaOdd9BI8PE \ No newline at end of file diff --git a/.clinerules b/_legacy/.clinerules similarity index 100% rename from .clinerules rename to _legacy/.clinerules diff --git a/.dockerignore b/_legacy/.dockerignore similarity index 100% rename from .dockerignore rename to _legacy/.dockerignore diff --git a/.gitignore b/_legacy/.gitignore similarity index 100% rename from .gitignore rename to _legacy/.gitignore diff --git a/.prettierignore b/_legacy/.prettierignore similarity index 100% rename from .prettierignore rename to _legacy/.prettierignore diff --git a/.prettierrc b/_legacy/.prettierrc similarity index 100% rename from .prettierrc rename to _legacy/.prettierrc diff --git a/apps/api/.env.example b/_legacy/apps/api/.env.example similarity index 100% rename from apps/api/.env.example rename to _legacy/apps/api/.env.example diff --git a/apps/api/.env.test b/_legacy/apps/api/.env.test similarity index 100% rename from apps/api/.env.test rename to _legacy/apps/api/.env.test diff --git a/apps/api/Dockerfile b/_legacy/apps/api/Dockerfile similarity index 100% rename from apps/api/Dockerfile rename to _legacy/apps/api/Dockerfile diff --git a/apps/api/LICENSE b/_legacy/apps/api/LICENSE similarity index 100% rename from apps/api/LICENSE rename to _legacy/apps/api/LICENSE diff --git a/apps/api/README.md b/_legacy/apps/api/README.md similarity index 100% rename from apps/api/README.md rename to _legacy/apps/api/README.md diff --git a/apps/api/package.json b/_legacy/apps/api/package.json similarity index 100% rename from apps/api/package.json rename to _legacy/apps/api/package.json diff --git a/apps/api/pnpm-lock.yaml b/_legacy/apps/api/pnpm-lock.yaml similarity index 100% rename from apps/api/pnpm-lock.yaml rename to _legacy/apps/api/pnpm-lock.yaml diff --git a/apps/api/public/schemas/userProfile.v1.schema.json b/_legacy/apps/api/public/schemas/userProfile.v1.schema.json similarity index 100% rename from apps/api/public/schemas/userProfile.v1.schema.json rename to _legacy/apps/api/public/schemas/userProfile.v1.schema.json diff --git a/apps/api/rspack.config.js b/_legacy/apps/api/rspack.config.js similarity index 100% rename from apps/api/rspack.config.js rename to _legacy/apps/api/rspack.config.js diff --git a/apps/api/scripts/dev-server.js b/_legacy/apps/api/scripts/dev-server.js similarity index 100% rename from apps/api/scripts/dev-server.js rename to _legacy/apps/api/scripts/dev-server.js diff --git a/apps/api/scripts/generate-json-schemas.ts b/_legacy/apps/api/scripts/generate-json-schemas.ts similarity index 100% rename from apps/api/scripts/generate-json-schemas.ts rename to _legacy/apps/api/scripts/generate-json-schemas.ts diff --git a/apps/api/src/app.ts b/_legacy/apps/api/src/app.ts similarity index 100% rename from apps/api/src/app.ts rename to _legacy/apps/api/src/app.ts diff --git a/apps/api/src/db/index.ts b/_legacy/apps/api/src/db/index.ts similarity index 100% rename from apps/api/src/db/index.ts rename to _legacy/apps/api/src/db/index.ts diff --git a/apps/api/src/index.ts b/_legacy/apps/api/src/index.ts similarity index 100% rename from apps/api/src/index.ts rename to _legacy/apps/api/src/index.ts diff --git a/apps/api/src/middlewares/auth.middleware.ts b/_legacy/apps/api/src/middlewares/auth.middleware.ts similarity index 100% rename from apps/api/src/middlewares/auth.middleware.ts rename to _legacy/apps/api/src/middlewares/auth.middleware.ts diff --git a/apps/api/src/routes/api/activity.ts b/_legacy/apps/api/src/routes/api/activity.ts similarity index 100% rename from apps/api/src/routes/api/activity.ts rename to _legacy/apps/api/src/routes/api/activity.ts diff --git a/apps/api/src/routes/api/auth.ts b/_legacy/apps/api/src/routes/api/auth.ts similarity index 100% rename from apps/api/src/routes/api/auth.ts rename to _legacy/apps/api/src/routes/api/auth.ts diff --git a/apps/api/src/routes/api/config.ts b/_legacy/apps/api/src/routes/api/config.ts similarity index 100% rename from apps/api/src/routes/api/config.ts rename to _legacy/apps/api/src/routes/api/config.ts diff --git a/apps/api/src/routes/api/feeds.ts b/_legacy/apps/api/src/routes/api/feeds.ts similarity index 100% rename from apps/api/src/routes/api/feeds.ts rename to _legacy/apps/api/src/routes/api/feeds.ts diff --git a/apps/api/src/routes/api/index.ts b/_legacy/apps/api/src/routes/api/index.ts similarity index 100% rename from apps/api/src/routes/api/index.ts rename to _legacy/apps/api/src/routes/api/index.ts diff --git a/apps/api/src/routes/api/leaderboard.ts b/_legacy/apps/api/src/routes/api/leaderboard.ts similarity index 100% rename from apps/api/src/routes/api/leaderboard.ts rename to _legacy/apps/api/src/routes/api/leaderboard.ts diff --git a/apps/api/src/routes/api/moderation.ts b/_legacy/apps/api/src/routes/api/moderation.ts similarity index 100% rename from apps/api/src/routes/api/moderation.ts rename to _legacy/apps/api/src/routes/api/moderation.ts diff --git a/apps/api/src/routes/api/plugins.ts b/_legacy/apps/api/src/routes/api/plugins.ts similarity index 100% rename from apps/api/src/routes/api/plugins.ts rename to _legacy/apps/api/src/routes/api/plugins.ts diff --git a/apps/api/src/routes/api/processing.ts b/_legacy/apps/api/src/routes/api/processing.ts similarity index 100% rename from apps/api/src/routes/api/processing.ts rename to _legacy/apps/api/src/routes/api/processing.ts diff --git a/apps/api/src/routes/api/recap.ts b/_legacy/apps/api/src/routes/api/recap.ts similarity index 100% rename from apps/api/src/routes/api/recap.ts rename to _legacy/apps/api/src/routes/api/recap.ts diff --git a/apps/api/src/routes/api/stats.ts b/_legacy/apps/api/src/routes/api/stats.ts similarity index 100% rename from apps/api/src/routes/api/stats.ts rename to _legacy/apps/api/src/routes/api/stats.ts diff --git a/apps/api/src/routes/api/submission.ts b/_legacy/apps/api/src/routes/api/submission.ts similarity index 100% rename from apps/api/src/routes/api/submission.ts rename to _legacy/apps/api/src/routes/api/submission.ts diff --git a/apps/api/src/routes/api/test.ts b/_legacy/apps/api/src/routes/api/test.ts similarity index 100% rename from apps/api/src/routes/api/test.ts rename to _legacy/apps/api/src/routes/api/test.ts diff --git a/apps/api/src/routes/api/trigger.ts b/_legacy/apps/api/src/routes/api/trigger.ts similarity index 100% rename from apps/api/src/routes/api/trigger.ts rename to _legacy/apps/api/src/routes/api/trigger.ts diff --git a/apps/api/src/routes/api/twitter.ts b/_legacy/apps/api/src/routes/api/twitter.ts similarity index 100% rename from apps/api/src/routes/api/twitter.ts rename to _legacy/apps/api/src/routes/api/twitter.ts diff --git a/apps/api/src/routes/api/upload.ts b/_legacy/apps/api/src/routes/api/upload.ts similarity index 100% rename from apps/api/src/routes/api/upload.ts rename to _legacy/apps/api/src/routes/api/upload.ts diff --git a/apps/api/src/routes/api/users.ts b/_legacy/apps/api/src/routes/api/users.ts similarity index 100% rename from apps/api/src/routes/api/users.ts rename to _legacy/apps/api/src/routes/api/users.ts diff --git a/apps/api/src/types/app.ts b/_legacy/apps/api/src/types/app.ts similarity index 100% rename from apps/api/src/types/app.ts rename to _legacy/apps/api/src/types/app.ts diff --git a/apps/api/src/types/recap.ts b/_legacy/apps/api/src/types/recap.ts similarity index 100% rename from apps/api/src/types/recap.ts rename to _legacy/apps/api/src/types/recap.ts diff --git a/apps/api/src/types/zod/userProfile.ts b/_legacy/apps/api/src/types/zod/userProfile.ts similarity index 100% rename from apps/api/src/types/zod/userProfile.ts rename to _legacy/apps/api/src/types/zod/userProfile.ts diff --git a/apps/api/src/utils/config.ts b/_legacy/apps/api/src/utils/config.ts similarity index 100% rename from apps/api/src/utils/config.ts rename to _legacy/apps/api/src/utils/config.ts diff --git a/apps/api/src/utils/error.ts b/_legacy/apps/api/src/utils/error.ts similarity index 100% rename from apps/api/src/utils/error.ts rename to _legacy/apps/api/src/utils/error.ts diff --git a/apps/api/test/setup/seed-test.ts b/_legacy/apps/api/test/setup/seed-test.ts similarity index 100% rename from apps/api/test/setup/seed-test.ts rename to _legacy/apps/api/test/setup/seed-test.ts diff --git a/apps/api/tsconfig.json b/_legacy/apps/api/tsconfig.json similarity index 100% rename from apps/api/tsconfig.json rename to _legacy/apps/api/tsconfig.json diff --git a/apps/app/.env.example b/_legacy/apps/app/.env.example similarity index 100% rename from apps/app/.env.example rename to _legacy/apps/app/.env.example diff --git a/apps/app/.gitignore b/_legacy/apps/app/.gitignore similarity index 100% rename from apps/app/.gitignore rename to _legacy/apps/app/.gitignore diff --git a/apps/app/README.md b/_legacy/apps/app/README.md similarity index 100% rename from apps/app/README.md rename to _legacy/apps/app/README.md diff --git a/apps/app/components.json b/_legacy/apps/app/components.json similarity index 100% rename from apps/app/components.json rename to _legacy/apps/app/components.json diff --git a/apps/app/eslint.config.js b/_legacy/apps/app/eslint.config.js similarity index 100% rename from apps/app/eslint.config.js rename to _legacy/apps/app/eslint.config.js diff --git a/apps/app/index.html b/_legacy/apps/app/index.html similarity index 100% rename from apps/app/index.html rename to _legacy/apps/app/index.html diff --git a/apps/app/package.json b/_legacy/apps/app/package.json similarity index 100% rename from apps/app/package.json rename to _legacy/apps/app/package.json diff --git a/apps/app/postcss.config.js b/_legacy/apps/app/postcss.config.js similarity index 100% rename from apps/app/postcss.config.js rename to _legacy/apps/app/postcss.config.js diff --git a/apps/app/public/apple-touch-icon.png b/_legacy/apps/app/public/apple-touch-icon.png similarity index 100% rename from apps/app/public/apple-touch-icon.png rename to _legacy/apps/app/public/apple-touch-icon.png diff --git a/apps/app/public/curatedotfunicon1.png b/_legacy/apps/app/public/curatedotfunicon1.png similarity index 100% rename from apps/app/public/curatedotfunicon1.png rename to _legacy/apps/app/public/curatedotfunicon1.png diff --git a/apps/app/public/curatedotfuntransparenticon.png b/_legacy/apps/app/public/curatedotfuntransparenticon.png similarity index 100% rename from apps/app/public/curatedotfuntransparenticon.png rename to _legacy/apps/app/public/curatedotfuntransparenticon.png diff --git a/apps/app/public/favicon-96x96.png b/_legacy/apps/app/public/favicon-96x96.png similarity index 100% rename from apps/app/public/favicon-96x96.png rename to _legacy/apps/app/public/favicon-96x96.png diff --git a/apps/app/public/favicon.ico b/_legacy/apps/app/public/favicon.ico similarity index 100% rename from apps/app/public/favicon.ico rename to _legacy/apps/app/public/favicon.ico diff --git a/apps/app/public/favicon.svg b/_legacy/apps/app/public/favicon.svg similarity index 100% rename from apps/app/public/favicon.svg rename to _legacy/apps/app/public/favicon.svg diff --git a/apps/app/public/fonts/LondrinaSolid-NNS.ttf b/_legacy/apps/app/public/fonts/LondrinaSolid-NNS.ttf similarity index 100% rename from apps/app/public/fonts/LondrinaSolid-NNS.ttf rename to _legacy/apps/app/public/fonts/LondrinaSolid-NNS.ttf diff --git a/apps/app/public/grid.png b/_legacy/apps/app/public/grid.png similarity index 100% rename from apps/app/public/grid.png rename to _legacy/apps/app/public/grid.png diff --git a/apps/app/public/icons/novice-badge.png b/_legacy/apps/app/public/icons/novice-badge.png similarity index 100% rename from apps/app/public/icons/novice-badge.png rename to _legacy/apps/app/public/icons/novice-badge.png diff --git a/apps/app/public/icons/star-bronze.svg b/_legacy/apps/app/public/icons/star-bronze.svg similarity index 100% rename from apps/app/public/icons/star-bronze.svg rename to _legacy/apps/app/public/icons/star-bronze.svg diff --git a/apps/app/public/icons/star-gold.svg b/_legacy/apps/app/public/icons/star-gold.svg similarity index 100% rename from apps/app/public/icons/star-gold.svg rename to _legacy/apps/app/public/icons/star-gold.svg diff --git a/apps/app/public/icons/star-silver.svg b/_legacy/apps/app/public/icons/star-silver.svg similarity index 100% rename from apps/app/public/icons/star-silver.svg rename to _legacy/apps/app/public/icons/star-silver.svg diff --git a/apps/app/public/images/ca1aeb55a83a97a139b53b47327bdcc0f02d6022.png b/_legacy/apps/app/public/images/ca1aeb55a83a97a139b53b47327bdcc0f02d6022.png similarity index 100% rename from apps/app/public/images/ca1aeb55a83a97a139b53b47327bdcc0f02d6022.png rename to _legacy/apps/app/public/images/ca1aeb55a83a97a139b53b47327bdcc0f02d6022.png diff --git a/apps/app/public/images/curate-coins.png b/_legacy/apps/app/public/images/curate-coins.png similarity index 100% rename from apps/app/public/images/curate-coins.png rename to _legacy/apps/app/public/images/curate-coins.png diff --git a/apps/app/public/images/feed-image.png b/_legacy/apps/app/public/images/feed-image.png similarity index 100% rename from apps/app/public/images/feed-image.png rename to _legacy/apps/app/public/images/feed-image.png diff --git a/apps/app/public/images/metamask.png b/_legacy/apps/app/public/images/metamask.png similarity index 100% rename from apps/app/public/images/metamask.png rename to _legacy/apps/app/public/images/metamask.png diff --git a/apps/app/public/images/near-week.png b/_legacy/apps/app/public/images/near-week.png similarity index 100% rename from apps/app/public/images/near-week.png rename to _legacy/apps/app/public/images/near-week.png diff --git a/apps/app/public/images/near.png b/_legacy/apps/app/public/images/near.png similarity index 100% rename from apps/app/public/images/near.png rename to _legacy/apps/app/public/images/near.png diff --git a/apps/app/public/images/overview-bg.png b/_legacy/apps/app/public/images/overview-bg.png similarity index 100% rename from apps/app/public/images/overview-bg.png rename to _legacy/apps/app/public/images/overview-bg.png diff --git a/apps/app/public/images/solana.jpeg b/_legacy/apps/app/public/images/solana.jpeg similarity index 100% rename from apps/app/public/images/solana.jpeg rename to _legacy/apps/app/public/images/solana.jpeg diff --git a/apps/app/public/images/solana.png b/_legacy/apps/app/public/images/solana.png similarity index 100% rename from apps/app/public/images/solana.png rename to _legacy/apps/app/public/images/solana.png diff --git a/apps/app/public/images/web3-plug.png b/_legacy/apps/app/public/images/web3-plug.png similarity index 100% rename from apps/app/public/images/web3-plug.png rename to _legacy/apps/app/public/images/web3-plug.png diff --git a/apps/app/public/site.webmanifest b/_legacy/apps/app/public/site.webmanifest similarity index 100% rename from apps/app/public/site.webmanifest rename to _legacy/apps/app/public/site.webmanifest diff --git a/apps/app/public/web-app-manifest-192x192.png b/_legacy/apps/app/public/web-app-manifest-192x192.png similarity index 100% rename from apps/app/public/web-app-manifest-192x192.png rename to _legacy/apps/app/public/web-app-manifest-192x192.png diff --git a/apps/app/public/web-app-manifest-512x512.png b/_legacy/apps/app/public/web-app-manifest-512x512.png similarity index 100% rename from apps/app/public/web-app-manifest-512x512.png rename to _legacy/apps/app/public/web-app-manifest-512x512.png diff --git a/apps/app/rsbuild.config.ts b/_legacy/apps/app/rsbuild.config.ts similarity index 100% rename from apps/app/rsbuild.config.ts rename to _legacy/apps/app/rsbuild.config.ts diff --git a/apps/app/src/App.tsx b/_legacy/apps/app/src/App.tsx similarity index 100% rename from apps/app/src/App.tsx rename to _legacy/apps/app/src/App.tsx diff --git a/apps/app/src/components/AvatarProfile.tsx b/_legacy/apps/app/src/components/AvatarProfile.tsx similarity index 100% rename from apps/app/src/components/AvatarProfile.tsx rename to _legacy/apps/app/src/components/AvatarProfile.tsx diff --git a/apps/app/src/components/Container.tsx b/_legacy/apps/app/src/components/Container.tsx similarity index 100% rename from apps/app/src/components/Container.tsx rename to _legacy/apps/app/src/components/Container.tsx diff --git a/apps/app/src/components/ContentApprovers.tsx b/_legacy/apps/app/src/components/ContentApprovers.tsx similarity index 100% rename from apps/app/src/components/ContentApprovers.tsx rename to _legacy/apps/app/src/components/ContentApprovers.tsx diff --git a/apps/app/src/components/ContentProgress.tsx b/_legacy/apps/app/src/components/ContentProgress.tsx similarity index 100% rename from apps/app/src/components/ContentProgress.tsx rename to _legacy/apps/app/src/components/ContentProgress.tsx diff --git a/apps/app/src/components/DistributorBadges.tsx b/_legacy/apps/app/src/components/DistributorBadges.tsx similarity index 100% rename from apps/app/src/components/DistributorBadges.tsx rename to _legacy/apps/app/src/components/DistributorBadges.tsx diff --git a/apps/app/src/components/DownloadButton.tsx b/_legacy/apps/app/src/components/DownloadButton.tsx similarity index 100% rename from apps/app/src/components/DownloadButton.tsx rename to _legacy/apps/app/src/components/DownloadButton.tsx diff --git a/apps/app/src/components/FeedItem.tsx b/_legacy/apps/app/src/components/FeedItem.tsx similarity index 100% rename from apps/app/src/components/FeedItem.tsx rename to _legacy/apps/app/src/components/FeedItem.tsx diff --git a/apps/app/src/components/FeedList.tsx b/_legacy/apps/app/src/components/FeedList.tsx similarity index 100% rename from apps/app/src/components/FeedList.tsx rename to _legacy/apps/app/src/components/FeedList.tsx diff --git a/apps/app/src/components/FilterControls.tsx b/_legacy/apps/app/src/components/FilterControls.tsx similarity index 100% rename from apps/app/src/components/FilterControls.tsx rename to _legacy/apps/app/src/components/FilterControls.tsx diff --git a/apps/app/src/components/Header.tsx b/_legacy/apps/app/src/components/Header.tsx similarity index 100% rename from apps/app/src/components/Header.tsx rename to _legacy/apps/app/src/components/Header.tsx diff --git a/apps/app/src/components/Hero.tsx b/_legacy/apps/app/src/components/Hero.tsx similarity index 100% rename from apps/app/src/components/Hero.tsx rename to _legacy/apps/app/src/components/Hero.tsx diff --git a/apps/app/src/components/HexagonAvatar.tsx b/_legacy/apps/app/src/components/HexagonAvatar.tsx similarity index 100% rename from apps/app/src/components/HexagonAvatar.tsx rename to _legacy/apps/app/src/components/HexagonAvatar.tsx diff --git a/apps/app/src/components/ImageUpload.tsx b/_legacy/apps/app/src/components/ImageUpload.tsx similarity index 100% rename from apps/app/src/components/ImageUpload.tsx rename to _legacy/apps/app/src/components/ImageUpload.tsx diff --git a/apps/app/src/components/InfiniteFeed.tsx b/_legacy/apps/app/src/components/InfiniteFeed.tsx similarity index 100% rename from apps/app/src/components/InfiniteFeed.tsx rename to _legacy/apps/app/src/components/InfiniteFeed.tsx diff --git a/apps/app/src/components/Leaderboard.tsx b/_legacy/apps/app/src/components/Leaderboard.tsx similarity index 100% rename from apps/app/src/components/Leaderboard.tsx rename to _legacy/apps/app/src/components/Leaderboard.tsx diff --git a/apps/app/src/components/LeaderboardModal.tsx b/_legacy/apps/app/src/components/LeaderboardModal.tsx similarity index 100% rename from apps/app/src/components/LeaderboardModal.tsx rename to _legacy/apps/app/src/components/LeaderboardModal.tsx diff --git a/apps/app/src/components/Modal.tsx b/_legacy/apps/app/src/components/Modal.tsx similarity index 100% rename from apps/app/src/components/Modal.tsx rename to _legacy/apps/app/src/components/Modal.tsx diff --git a/apps/app/src/components/PublishIntegrations.tsx b/_legacy/apps/app/src/components/PublishIntegrations.tsx similarity index 100% rename from apps/app/src/components/PublishIntegrations.tsx rename to _legacy/apps/app/src/components/PublishIntegrations.tsx diff --git a/apps/app/src/components/RecapManager.tsx b/_legacy/apps/app/src/components/RecapManager.tsx similarity index 100% rename from apps/app/src/components/RecapManager.tsx rename to _legacy/apps/app/src/components/RecapManager.tsx diff --git a/apps/app/src/components/RecentLaunches.tsx b/_legacy/apps/app/src/components/RecentLaunches.tsx similarity index 100% rename from apps/app/src/components/RecentLaunches.tsx rename to _legacy/apps/app/src/components/RecentLaunches.tsx diff --git a/apps/app/src/components/Sort.tsx b/_legacy/apps/app/src/components/Sort.tsx similarity index 100% rename from apps/app/src/components/Sort.tsx rename to _legacy/apps/app/src/components/Sort.tsx diff --git a/apps/app/src/components/StatusFilter.tsx b/_legacy/apps/app/src/components/StatusFilter.tsx similarity index 100% rename from apps/app/src/components/StatusFilter.tsx rename to _legacy/apps/app/src/components/StatusFilter.tsx diff --git a/apps/app/src/components/StatusFilterButtons.tsx b/_legacy/apps/app/src/components/StatusFilterButtons.tsx similarity index 100% rename from apps/app/src/components/StatusFilterButtons.tsx rename to _legacy/apps/app/src/components/StatusFilterButtons.tsx diff --git a/apps/app/src/components/SubmissionList.tsx b/_legacy/apps/app/src/components/SubmissionList.tsx similarity index 100% rename from apps/app/src/components/SubmissionList.tsx rename to _legacy/apps/app/src/components/SubmissionList.tsx diff --git a/apps/app/src/components/SubmissionRules.tsx b/_legacy/apps/app/src/components/SubmissionRules.tsx similarity index 100% rename from apps/app/src/components/SubmissionRules.tsx rename to _legacy/apps/app/src/components/SubmissionRules.tsx diff --git a/apps/app/src/components/TopFeeds.tsx b/_legacy/apps/app/src/components/TopFeeds.tsx similarity index 100% rename from apps/app/src/components/TopFeeds.tsx rename to _legacy/apps/app/src/components/TopFeeds.tsx diff --git a/apps/app/src/components/UserMenu.tsx b/_legacy/apps/app/src/components/UserMenu.tsx similarity index 100% rename from apps/app/src/components/UserMenu.tsx rename to _legacy/apps/app/src/components/UserMenu.tsx diff --git a/apps/app/src/components/WalletLoginModal.tsx b/_legacy/apps/app/src/components/WalletLoginModal.tsx similarity index 100% rename from apps/app/src/components/WalletLoginModal.tsx rename to _legacy/apps/app/src/components/WalletLoginModal.tsx diff --git a/apps/app/src/components/buttons/ConnectPlatform.tsx b/_legacy/apps/app/src/components/buttons/ConnectPlatform.tsx similarity index 100% rename from apps/app/src/components/buttons/ConnectPlatform.tsx rename to _legacy/apps/app/src/components/buttons/ConnectPlatform.tsx diff --git a/apps/app/src/components/coming-soon.tsx b/_legacy/apps/app/src/components/coming-soon.tsx similarity index 100% rename from apps/app/src/components/coming-soon.tsx rename to _legacy/apps/app/src/components/coming-soon.tsx diff --git a/apps/app/src/components/content-progress/EmptyState.tsx b/_legacy/apps/app/src/components/content-progress/EmptyState.tsx similarity index 100% rename from apps/app/src/components/content-progress/EmptyState.tsx rename to _legacy/apps/app/src/components/content-progress/EmptyState.tsx diff --git a/apps/app/src/components/content-progress/JsonEditor.tsx b/_legacy/apps/app/src/components/content-progress/JsonEditor.tsx similarity index 100% rename from apps/app/src/components/content-progress/JsonEditor.tsx rename to _legacy/apps/app/src/components/content-progress/JsonEditor.tsx diff --git a/apps/app/src/components/content-progress/StepItem.tsx b/_legacy/apps/app/src/components/content-progress/StepItem.tsx similarity index 100% rename from apps/app/src/components/content-progress/StepItem.tsx rename to _legacy/apps/app/src/components/content-progress/StepItem.tsx diff --git a/apps/app/src/components/content-progress/TemplateElement.tsx b/_legacy/apps/app/src/components/content-progress/TemplateElement.tsx similarity index 100% rename from apps/app/src/components/content-progress/TemplateElement.tsx rename to _legacy/apps/app/src/components/content-progress/TemplateElement.tsx diff --git a/apps/app/src/components/content-progress/VisualEditor.tsx b/_legacy/apps/app/src/components/content-progress/VisualEditor.tsx similarity index 100% rename from apps/app/src/components/content-progress/VisualEditor.tsx rename to _legacy/apps/app/src/components/content-progress/VisualEditor.tsx diff --git a/apps/app/src/components/content-progress/data.ts b/_legacy/apps/app/src/components/content-progress/data.ts similarity index 100% rename from apps/app/src/components/content-progress/data.ts rename to _legacy/apps/app/src/components/content-progress/data.ts diff --git a/apps/app/src/components/content-progress/types.ts b/_legacy/apps/app/src/components/content-progress/types.ts similarity index 100% rename from apps/app/src/components/content-progress/types.ts rename to _legacy/apps/app/src/components/content-progress/types.ts diff --git a/apps/app/src/components/feed/EditFeedActions.tsx b/_legacy/apps/app/src/components/feed/EditFeedActions.tsx similarity index 100% rename from apps/app/src/components/feed/EditFeedActions.tsx rename to _legacy/apps/app/src/components/feed/EditFeedActions.tsx diff --git a/apps/app/src/components/feed/EditFeedConfigSection.tsx b/_legacy/apps/app/src/components/feed/EditFeedConfigSection.tsx similarity index 100% rename from apps/app/src/components/feed/EditFeedConfigSection.tsx rename to _legacy/apps/app/src/components/feed/EditFeedConfigSection.tsx diff --git a/apps/app/src/components/feed/EditFeedForm.tsx b/_legacy/apps/app/src/components/feed/EditFeedForm.tsx similarity index 100% rename from apps/app/src/components/feed/EditFeedForm.tsx rename to _legacy/apps/app/src/components/feed/EditFeedForm.tsx diff --git a/apps/app/src/components/feed/EditFeedHeader.tsx b/_legacy/apps/app/src/components/feed/EditFeedHeader.tsx similarity index 100% rename from apps/app/src/components/feed/EditFeedHeader.tsx rename to _legacy/apps/app/src/components/feed/EditFeedHeader.tsx diff --git a/apps/app/src/components/feed/EditFeedImageSection.tsx b/_legacy/apps/app/src/components/feed/EditFeedImageSection.tsx similarity index 100% rename from apps/app/src/components/feed/EditFeedImageSection.tsx rename to _legacy/apps/app/src/components/feed/EditFeedImageSection.tsx diff --git a/apps/app/src/components/feed/EditFeedLoadingState.tsx b/_legacy/apps/app/src/components/feed/EditFeedLoadingState.tsx similarity index 100% rename from apps/app/src/components/feed/EditFeedLoadingState.tsx rename to _legacy/apps/app/src/components/feed/EditFeedLoadingState.tsx diff --git a/apps/app/src/components/feed/FeedCard.tsx b/_legacy/apps/app/src/components/feed/FeedCard.tsx similarity index 100% rename from apps/app/src/components/feed/FeedCard.tsx rename to _legacy/apps/app/src/components/feed/FeedCard.tsx diff --git a/apps/app/src/components/feed/RecentContent.tsx b/_legacy/apps/app/src/components/feed/RecentContent.tsx similarity index 100% rename from apps/app/src/components/feed/RecentContent.tsx rename to _legacy/apps/app/src/components/feed/RecentContent.tsx diff --git a/apps/app/src/components/feed/form/BasicFieldsSection.tsx b/_legacy/apps/app/src/components/feed/form/BasicFieldsSection.tsx similarity index 100% rename from apps/app/src/components/feed/form/BasicFieldsSection.tsx rename to _legacy/apps/app/src/components/feed/form/BasicFieldsSection.tsx diff --git a/apps/app/src/components/feed/form/IngestionSection.tsx b/_legacy/apps/app/src/components/feed/form/IngestionSection.tsx similarity index 100% rename from apps/app/src/components/feed/form/IngestionSection.tsx rename to _legacy/apps/app/src/components/feed/form/IngestionSection.tsx diff --git a/apps/app/src/components/feed/form/ModerationSection.tsx b/_legacy/apps/app/src/components/feed/form/ModerationSection.tsx similarity index 100% rename from apps/app/src/components/feed/form/ModerationSection.tsx rename to _legacy/apps/app/src/components/feed/form/ModerationSection.tsx diff --git a/apps/app/src/components/feed/form/RecapsSection.tsx b/_legacy/apps/app/src/components/feed/form/RecapsSection.tsx similarity index 100% rename from apps/app/src/components/feed/form/RecapsSection.tsx rename to _legacy/apps/app/src/components/feed/form/RecapsSection.tsx diff --git a/apps/app/src/components/feed/form/SourcesSection.tsx b/_legacy/apps/app/src/components/feed/form/SourcesSection.tsx similarity index 100% rename from apps/app/src/components/feed/form/SourcesSection.tsx rename to _legacy/apps/app/src/components/feed/form/SourcesSection.tsx diff --git a/apps/app/src/components/feed/form/StreamSettingsSection.tsx b/_legacy/apps/app/src/components/feed/form/StreamSettingsSection.tsx similarity index 100% rename from apps/app/src/components/feed/form/StreamSettingsSection.tsx rename to _legacy/apps/app/src/components/feed/form/StreamSettingsSection.tsx diff --git a/apps/app/src/components/feed/form/index.ts b/_legacy/apps/app/src/components/feed/form/index.ts similarity index 100% rename from apps/app/src/components/feed/form/index.ts rename to _legacy/apps/app/src/components/feed/form/index.ts diff --git a/apps/app/src/components/feed/form/types.ts b/_legacy/apps/app/src/components/feed/form/types.ts similarity index 100% rename from apps/app/src/components/feed/form/types.ts rename to _legacy/apps/app/src/components/feed/form/types.ts diff --git a/apps/app/src/components/feed/settings/connected/AccountItem.tsx b/_legacy/apps/app/src/components/feed/settings/connected/AccountItem.tsx similarity index 100% rename from apps/app/src/components/feed/settings/connected/AccountItem.tsx rename to _legacy/apps/app/src/components/feed/settings/connected/AccountItem.tsx diff --git a/apps/app/src/components/feed/settings/connected/ConnectPlatform.tsx b/_legacy/apps/app/src/components/feed/settings/connected/ConnectPlatform.tsx similarity index 100% rename from apps/app/src/components/feed/settings/connected/ConnectPlatform.tsx rename to _legacy/apps/app/src/components/feed/settings/connected/ConnectPlatform.tsx diff --git a/apps/app/src/components/feed/settings/connected/ConnectPlatformDialog.tsx b/_legacy/apps/app/src/components/feed/settings/connected/ConnectPlatformDialog.tsx similarity index 100% rename from apps/app/src/components/feed/settings/connected/ConnectPlatformDialog.tsx rename to _legacy/apps/app/src/components/feed/settings/connected/ConnectPlatformDialog.tsx diff --git a/apps/app/src/components/feed/settings/connected/PlatformAccount.tsx b/_legacy/apps/app/src/components/feed/settings/connected/PlatformAccount.tsx similarity index 100% rename from apps/app/src/components/feed/settings/connected/PlatformAccount.tsx rename to _legacy/apps/app/src/components/feed/settings/connected/PlatformAccount.tsx diff --git a/apps/app/src/components/feed/settings/connected/PlatformAccountList.tsx b/_legacy/apps/app/src/components/feed/settings/connected/PlatformAccountList.tsx similarity index 100% rename from apps/app/src/components/feed/settings/connected/PlatformAccountList.tsx rename to _legacy/apps/app/src/components/feed/settings/connected/PlatformAccountList.tsx diff --git a/apps/app/src/components/feed/settings/connected/ProfileCard.tsx b/_legacy/apps/app/src/components/feed/settings/connected/ProfileCard.tsx similarity index 100% rename from apps/app/src/components/feed/settings/connected/ProfileCard.tsx rename to _legacy/apps/app/src/components/feed/settings/connected/ProfileCard.tsx diff --git a/apps/app/src/components/feed/top-curators.tsx b/_legacy/apps/app/src/components/feed/top-curators.tsx similarity index 100% rename from apps/app/src/components/feed/top-curators.tsx rename to _legacy/apps/app/src/components/feed/top-curators.tsx diff --git a/apps/app/src/components/feed/welcome-content.tsx b/_legacy/apps/app/src/components/feed/welcome-content.tsx similarity index 100% rename from apps/app/src/components/feed/welcome-content.tsx rename to _legacy/apps/app/src/components/feed/welcome-content.tsx diff --git a/apps/app/src/components/leaderboard/LeaderboardColumns.tsx b/_legacy/apps/app/src/components/leaderboard/LeaderboardColumns.tsx similarity index 100% rename from apps/app/src/components/leaderboard/LeaderboardColumns.tsx rename to _legacy/apps/app/src/components/leaderboard/LeaderboardColumns.tsx diff --git a/apps/app/src/components/leaderboard/LeaderboardFilters.tsx b/_legacy/apps/app/src/components/leaderboard/LeaderboardFilters.tsx similarity index 100% rename from apps/app/src/components/leaderboard/LeaderboardFilters.tsx rename to _legacy/apps/app/src/components/leaderboard/LeaderboardFilters.tsx diff --git a/apps/app/src/components/leaderboard/LeaderboardSkeleton.tsx b/_legacy/apps/app/src/components/leaderboard/LeaderboardSkeleton.tsx similarity index 100% rename from apps/app/src/components/leaderboard/LeaderboardSkeleton.tsx rename to _legacy/apps/app/src/components/leaderboard/LeaderboardSkeleton.tsx diff --git a/apps/app/src/components/leaderboard/LeaderboardTable.tsx b/_legacy/apps/app/src/components/leaderboard/LeaderboardTable.tsx similarity index 100% rename from apps/app/src/components/leaderboard/LeaderboardTable.tsx rename to _legacy/apps/app/src/components/leaderboard/LeaderboardTable.tsx diff --git a/apps/app/src/components/leaderboard/index.ts b/_legacy/apps/app/src/components/leaderboard/index.ts similarity index 100% rename from apps/app/src/components/leaderboard/index.ts rename to _legacy/apps/app/src/components/leaderboard/index.ts diff --git a/apps/app/src/components/processing/ProcessingActions.tsx b/_legacy/apps/app/src/components/processing/ProcessingActions.tsx similarity index 100% rename from apps/app/src/components/processing/ProcessingActions.tsx rename to _legacy/apps/app/src/components/processing/ProcessingActions.tsx diff --git a/apps/app/src/components/processing/ProcessingHistory.tsx b/_legacy/apps/app/src/components/processing/ProcessingHistory.tsx similarity index 100% rename from apps/app/src/components/processing/ProcessingHistory.tsx rename to _legacy/apps/app/src/components/processing/ProcessingHistory.tsx diff --git a/apps/app/src/components/processing/ProcessingStepDetails.tsx b/_legacy/apps/app/src/components/processing/ProcessingStepDetails.tsx similarity index 100% rename from apps/app/src/components/processing/ProcessingStepDetails.tsx rename to _legacy/apps/app/src/components/processing/ProcessingStepDetails.tsx diff --git a/apps/app/src/components/profile/ProfileHeader.tsx b/_legacy/apps/app/src/components/profile/ProfileHeader.tsx similarity index 100% rename from apps/app/src/components/profile/ProfileHeader.tsx rename to _legacy/apps/app/src/components/profile/ProfileHeader.tsx diff --git a/apps/app/src/components/profile/activity/ActivityTable.tsx b/_legacy/apps/app/src/components/profile/activity/ActivityTable.tsx similarity index 100% rename from apps/app/src/components/profile/activity/ActivityTable.tsx rename to _legacy/apps/app/src/components/profile/activity/ActivityTable.tsx diff --git a/apps/app/src/components/profile/activity/PaginationControls.tsx b/_legacy/apps/app/src/components/profile/activity/PaginationControls.tsx similarity index 100% rename from apps/app/src/components/profile/activity/PaginationControls.tsx rename to _legacy/apps/app/src/components/profile/activity/PaginationControls.tsx diff --git a/apps/app/src/components/profile/content/SmallContainer.tsx b/_legacy/apps/app/src/components/profile/content/SmallContainer.tsx similarity index 100% rename from apps/app/src/components/profile/content/SmallContainer.tsx rename to _legacy/apps/app/src/components/profile/content/SmallContainer.tsx diff --git a/apps/app/src/components/profile/content/index.tsx b/_legacy/apps/app/src/components/profile/content/index.tsx similarity index 100% rename from apps/app/src/components/profile/content/index.tsx rename to _legacy/apps/app/src/components/profile/content/index.tsx diff --git a/apps/app/src/components/profile/my-feeds/FeedCard.tsx b/_legacy/apps/app/src/components/profile/my-feeds/FeedCard.tsx similarity index 100% rename from apps/app/src/components/profile/my-feeds/FeedCard.tsx rename to _legacy/apps/app/src/components/profile/my-feeds/FeedCard.tsx diff --git a/apps/app/src/components/profile/my-feeds/SearchForm.tsx b/_legacy/apps/app/src/components/profile/my-feeds/SearchForm.tsx similarity index 100% rename from apps/app/src/components/profile/my-feeds/SearchForm.tsx rename to _legacy/apps/app/src/components/profile/my-feeds/SearchForm.tsx diff --git a/apps/app/src/components/profile/my-feeds/card.tsx b/_legacy/apps/app/src/components/profile/my-feeds/card.tsx similarity index 100% rename from apps/app/src/components/profile/my-feeds/card.tsx rename to _legacy/apps/app/src/components/profile/my-feeds/card.tsx diff --git a/apps/app/src/components/profile/my-feeds/constants.ts b/_legacy/apps/app/src/components/profile/my-feeds/constants.ts similarity index 100% rename from apps/app/src/components/profile/my-feeds/constants.ts rename to _legacy/apps/app/src/components/profile/my-feeds/constants.ts diff --git a/apps/app/src/components/profile/overview/ApproverFor.tsx b/_legacy/apps/app/src/components/profile/overview/ApproverFor.tsx similarity index 100% rename from apps/app/src/components/profile/overview/ApproverFor.tsx rename to _legacy/apps/app/src/components/profile/overview/ApproverFor.tsx diff --git a/apps/app/src/components/profile/overview/CurateCTA.tsx b/_legacy/apps/app/src/components/profile/overview/CurateCTA.tsx similarity index 100% rename from apps/app/src/components/profile/overview/CurateCTA.tsx rename to _legacy/apps/app/src/components/profile/overview/CurateCTA.tsx diff --git a/apps/app/src/components/profile/overview/CuratorFor.tsx b/_legacy/apps/app/src/components/profile/overview/CuratorFor.tsx similarity index 100% rename from apps/app/src/components/profile/overview/CuratorFor.tsx rename to _legacy/apps/app/src/components/profile/overview/CuratorFor.tsx diff --git a/apps/app/src/components/profile/overview/TopBadges.tsx b/_legacy/apps/app/src/components/profile/overview/TopBadges.tsx similarity index 100% rename from apps/app/src/components/profile/overview/TopBadges.tsx rename to _legacy/apps/app/src/components/profile/overview/TopBadges.tsx diff --git a/apps/app/src/components/profile/overview/UserStats.tsx b/_legacy/apps/app/src/components/profile/overview/UserStats.tsx similarity index 100% rename from apps/app/src/components/profile/overview/UserStats.tsx rename to _legacy/apps/app/src/components/profile/overview/UserStats.tsx diff --git a/apps/app/src/components/profile/points/BadgeCard.tsx b/_legacy/apps/app/src/components/profile/points/BadgeCard.tsx similarity index 100% rename from apps/app/src/components/profile/points/BadgeCard.tsx rename to _legacy/apps/app/src/components/profile/points/BadgeCard.tsx diff --git a/apps/app/src/components/profile/points/PaginationControls.tsx b/_legacy/apps/app/src/components/profile/points/PaginationControls.tsx similarity index 100% rename from apps/app/src/components/profile/points/PaginationControls.tsx rename to _legacy/apps/app/src/components/profile/points/PaginationControls.tsx diff --git a/apps/app/src/components/profile/points/PointsLogTable.tsx b/_legacy/apps/app/src/components/profile/points/PointsLogTable.tsx similarity index 100% rename from apps/app/src/components/profile/points/PointsLogTable.tsx rename to _legacy/apps/app/src/components/profile/points/PointsLogTable.tsx diff --git a/apps/app/src/components/profile/points/PointsOverviewCard.tsx b/_legacy/apps/app/src/components/profile/points/PointsOverviewCard.tsx similarity index 100% rename from apps/app/src/components/profile/points/PointsOverviewCard.tsx rename to _legacy/apps/app/src/components/profile/points/PointsOverviewCard.tsx diff --git a/apps/app/src/components/profile/points/index.tsx b/_legacy/apps/app/src/components/profile/points/index.tsx similarity index 100% rename from apps/app/src/components/profile/points/index.tsx rename to _legacy/apps/app/src/components/profile/points/index.tsx diff --git a/apps/app/src/components/rss-feed/FilterBadges.tsx b/_legacy/apps/app/src/components/rss-feed/FilterBadges.tsx similarity index 100% rename from apps/app/src/components/rss-feed/FilterBadges.tsx rename to _legacy/apps/app/src/components/rss-feed/FilterBadges.tsx diff --git a/apps/app/src/components/rss-feed/FilterControls.tsx b/_legacy/apps/app/src/components/rss-feed/FilterControls.tsx similarity index 100% rename from apps/app/src/components/rss-feed/FilterControls.tsx rename to _legacy/apps/app/src/components/rss-feed/FilterControls.tsx diff --git a/apps/app/src/components/rss-feed/RssFeedItem.tsx b/_legacy/apps/app/src/components/rss-feed/RssFeedItem.tsx similarity index 100% rename from apps/app/src/components/rss-feed/RssFeedItem.tsx rename to _legacy/apps/app/src/components/rss-feed/RssFeedItem.tsx diff --git a/apps/app/src/components/ui/alert.tsx b/_legacy/apps/app/src/components/ui/alert.tsx similarity index 100% rename from apps/app/src/components/ui/alert.tsx rename to _legacy/apps/app/src/components/ui/alert.tsx diff --git a/apps/app/src/components/ui/avatar.tsx b/_legacy/apps/app/src/components/ui/avatar.tsx similarity index 100% rename from apps/app/src/components/ui/avatar.tsx rename to _legacy/apps/app/src/components/ui/avatar.tsx diff --git a/apps/app/src/components/ui/badge.tsx b/_legacy/apps/app/src/components/ui/badge.tsx similarity index 100% rename from apps/app/src/components/ui/badge.tsx rename to _legacy/apps/app/src/components/ui/badge.tsx diff --git a/apps/app/src/components/ui/button.tsx b/_legacy/apps/app/src/components/ui/button.tsx similarity index 100% rename from apps/app/src/components/ui/button.tsx rename to _legacy/apps/app/src/components/ui/button.tsx diff --git a/apps/app/src/components/ui/card.tsx b/_legacy/apps/app/src/components/ui/card.tsx similarity index 100% rename from apps/app/src/components/ui/card.tsx rename to _legacy/apps/app/src/components/ui/card.tsx diff --git a/apps/app/src/components/ui/checkbox.tsx b/_legacy/apps/app/src/components/ui/checkbox.tsx similarity index 100% rename from apps/app/src/components/ui/checkbox.tsx rename to _legacy/apps/app/src/components/ui/checkbox.tsx diff --git a/apps/app/src/components/ui/command.tsx b/_legacy/apps/app/src/components/ui/command.tsx similarity index 100% rename from apps/app/src/components/ui/command.tsx rename to _legacy/apps/app/src/components/ui/command.tsx diff --git a/apps/app/src/components/ui/dialog.tsx b/_legacy/apps/app/src/components/ui/dialog.tsx similarity index 100% rename from apps/app/src/components/ui/dialog.tsx rename to _legacy/apps/app/src/components/ui/dialog.tsx diff --git a/apps/app/src/components/ui/dropdown-menu.tsx b/_legacy/apps/app/src/components/ui/dropdown-menu.tsx similarity index 100% rename from apps/app/src/components/ui/dropdown-menu.tsx rename to _legacy/apps/app/src/components/ui/dropdown-menu.tsx diff --git a/apps/app/src/components/ui/form.tsx b/_legacy/apps/app/src/components/ui/form.tsx similarity index 100% rename from apps/app/src/components/ui/form.tsx rename to _legacy/apps/app/src/components/ui/form.tsx diff --git a/apps/app/src/components/ui/input.tsx b/_legacy/apps/app/src/components/ui/input.tsx similarity index 100% rename from apps/app/src/components/ui/input.tsx rename to _legacy/apps/app/src/components/ui/input.tsx diff --git a/apps/app/src/components/ui/label.tsx b/_legacy/apps/app/src/components/ui/label.tsx similarity index 100% rename from apps/app/src/components/ui/label.tsx rename to _legacy/apps/app/src/components/ui/label.tsx diff --git a/apps/app/src/components/ui/loading.tsx b/_legacy/apps/app/src/components/ui/loading.tsx similarity index 100% rename from apps/app/src/components/ui/loading.tsx rename to _legacy/apps/app/src/components/ui/loading.tsx diff --git a/apps/app/src/components/ui/pagination.tsx b/_legacy/apps/app/src/components/ui/pagination.tsx similarity index 100% rename from apps/app/src/components/ui/pagination.tsx rename to _legacy/apps/app/src/components/ui/pagination.tsx diff --git a/apps/app/src/components/ui/popover.tsx b/_legacy/apps/app/src/components/ui/popover.tsx similarity index 100% rename from apps/app/src/components/ui/popover.tsx rename to _legacy/apps/app/src/components/ui/popover.tsx diff --git a/apps/app/src/components/ui/profile-tabs.tsx b/_legacy/apps/app/src/components/ui/profile-tabs.tsx similarity index 100% rename from apps/app/src/components/ui/profile-tabs.tsx rename to _legacy/apps/app/src/components/ui/profile-tabs.tsx diff --git a/apps/app/src/components/ui/progress.tsx b/_legacy/apps/app/src/components/ui/progress.tsx similarity index 100% rename from apps/app/src/components/ui/progress.tsx rename to _legacy/apps/app/src/components/ui/progress.tsx diff --git a/apps/app/src/components/ui/select.tsx b/_legacy/apps/app/src/components/ui/select.tsx similarity index 100% rename from apps/app/src/components/ui/select.tsx rename to _legacy/apps/app/src/components/ui/select.tsx diff --git a/apps/app/src/components/ui/switch.tsx b/_legacy/apps/app/src/components/ui/switch.tsx similarity index 100% rename from apps/app/src/components/ui/switch.tsx rename to _legacy/apps/app/src/components/ui/switch.tsx diff --git a/apps/app/src/components/ui/table.tsx b/_legacy/apps/app/src/components/ui/table.tsx similarity index 100% rename from apps/app/src/components/ui/table.tsx rename to _legacy/apps/app/src/components/ui/table.tsx diff --git a/apps/app/src/components/ui/tabs.tsx b/_legacy/apps/app/src/components/ui/tabs.tsx similarity index 100% rename from apps/app/src/components/ui/tabs.tsx rename to _legacy/apps/app/src/components/ui/tabs.tsx diff --git a/apps/app/src/components/ui/textarea.tsx b/_legacy/apps/app/src/components/ui/textarea.tsx similarity index 100% rename from apps/app/src/components/ui/textarea.tsx rename to _legacy/apps/app/src/components/ui/textarea.tsx diff --git a/apps/app/src/components/ui/toast.tsx b/_legacy/apps/app/src/components/ui/toast.tsx similarity index 100% rename from apps/app/src/components/ui/toast.tsx rename to _legacy/apps/app/src/components/ui/toast.tsx diff --git a/apps/app/src/components/ui/toaster.tsx b/_legacy/apps/app/src/components/ui/toaster.tsx similarity index 100% rename from apps/app/src/components/ui/toaster.tsx rename to _legacy/apps/app/src/components/ui/toaster.tsx diff --git a/apps/app/src/components/ui/tooltip.tsx b/_legacy/apps/app/src/components/ui/tooltip.tsx similarity index 100% rename from apps/app/src/components/ui/tooltip.tsx rename to _legacy/apps/app/src/components/ui/tooltip.tsx diff --git a/apps/app/src/config/index.ts b/_legacy/apps/app/src/config/index.ts similarity index 100% rename from apps/app/src/config/index.ts rename to _legacy/apps/app/src/config/index.ts diff --git a/apps/app/src/contexts/auth-context.tsx b/_legacy/apps/app/src/contexts/auth-context.tsx similarity index 100% rename from apps/app/src/contexts/auth-context.tsx rename to _legacy/apps/app/src/contexts/auth-context.tsx diff --git a/apps/app/src/hooks/api-client.ts b/_legacy/apps/app/src/hooks/api-client.ts similarity index 100% rename from apps/app/src/hooks/api-client.ts rename to _legacy/apps/app/src/hooks/api-client.ts diff --git a/apps/app/src/hooks/near-social.ts b/_legacy/apps/app/src/hooks/near-social.ts similarity index 100% rename from apps/app/src/hooks/near-social.ts rename to _legacy/apps/app/src/hooks/near-social.ts diff --git a/apps/app/src/hooks/use-edit-feed.ts b/_legacy/apps/app/src/hooks/use-edit-feed.ts similarity index 100% rename from apps/app/src/hooks/use-edit-feed.ts rename to _legacy/apps/app/src/hooks/use-edit-feed.ts diff --git a/apps/app/src/hooks/use-rss-feed.ts b/_legacy/apps/app/src/hooks/use-rss-feed.ts similarity index 100% rename from apps/app/src/hooks/use-rss-feed.ts rename to _legacy/apps/app/src/hooks/use-rss-feed.ts diff --git a/apps/app/src/hooks/use-toast.ts b/_legacy/apps/app/src/hooks/use-toast.ts similarity index 100% rename from apps/app/src/hooks/use-toast.ts rename to _legacy/apps/app/src/hooks/use-toast.ts diff --git a/apps/app/src/hooks/useLeaderboard.ts b/_legacy/apps/app/src/hooks/useLeaderboard.ts similarity index 100% rename from apps/app/src/hooks/useLeaderboard.ts rename to _legacy/apps/app/src/hooks/useLeaderboard.ts diff --git a/apps/app/src/index.css b/_legacy/apps/app/src/index.css similarity index 100% rename from apps/app/src/index.css rename to _legacy/apps/app/src/index.css diff --git a/apps/app/src/index.tsx b/_legacy/apps/app/src/index.tsx similarity index 100% rename from apps/app/src/index.tsx rename to _legacy/apps/app/src/index.tsx diff --git a/apps/app/src/lib/api-client.ts b/_legacy/apps/app/src/lib/api-client.ts similarity index 100% rename from apps/app/src/lib/api-client.ts rename to _legacy/apps/app/src/lib/api-client.ts diff --git a/apps/app/src/lib/api/activity.ts b/_legacy/apps/app/src/lib/api/activity.ts similarity index 100% rename from apps/app/src/lib/api/activity.ts rename to _legacy/apps/app/src/lib/api/activity.ts diff --git a/apps/app/src/lib/api/feeds.ts b/_legacy/apps/app/src/lib/api/feeds.ts similarity index 100% rename from apps/app/src/lib/api/feeds.ts rename to _legacy/apps/app/src/lib/api/feeds.ts diff --git a/apps/app/src/lib/api/index.ts b/_legacy/apps/app/src/lib/api/index.ts similarity index 100% rename from apps/app/src/lib/api/index.ts rename to _legacy/apps/app/src/lib/api/index.ts diff --git a/apps/app/src/lib/api/leaderboard.ts b/_legacy/apps/app/src/lib/api/leaderboard.ts similarity index 100% rename from apps/app/src/lib/api/leaderboard.ts rename to _legacy/apps/app/src/lib/api/leaderboard.ts diff --git a/apps/app/src/lib/api/moderation.ts b/_legacy/apps/app/src/lib/api/moderation.ts similarity index 100% rename from apps/app/src/lib/api/moderation.ts rename to _legacy/apps/app/src/lib/api/moderation.ts diff --git a/apps/app/src/lib/api/plugins.ts b/_legacy/apps/app/src/lib/api/plugins.ts similarity index 100% rename from apps/app/src/lib/api/plugins.ts rename to _legacy/apps/app/src/lib/api/plugins.ts diff --git a/apps/app/src/lib/api/processing.ts b/_legacy/apps/app/src/lib/api/processing.ts similarity index 100% rename from apps/app/src/lib/api/processing.ts rename to _legacy/apps/app/src/lib/api/processing.ts diff --git a/apps/app/src/lib/api/submission.ts b/_legacy/apps/app/src/lib/api/submission.ts similarity index 100% rename from apps/app/src/lib/api/submission.ts rename to _legacy/apps/app/src/lib/api/submission.ts diff --git a/apps/app/src/lib/api/test.ts b/_legacy/apps/app/src/lib/api/test.ts similarity index 100% rename from apps/app/src/lib/api/test.ts rename to _legacy/apps/app/src/lib/api/test.ts diff --git a/apps/app/src/lib/api/twitter.ts b/_legacy/apps/app/src/lib/api/twitter.ts similarity index 100% rename from apps/app/src/lib/api/twitter.ts rename to _legacy/apps/app/src/lib/api/twitter.ts diff --git a/apps/app/src/lib/api/types.ts b/_legacy/apps/app/src/lib/api/types.ts similarity index 100% rename from apps/app/src/lib/api/types.ts rename to _legacy/apps/app/src/lib/api/types.ts diff --git a/apps/app/src/lib/api/users.ts b/_legacy/apps/app/src/lib/api/users.ts similarity index 100% rename from apps/app/src/lib/api/users.ts rename to _legacy/apps/app/src/lib/api/users.ts diff --git a/apps/app/src/lib/config.ts b/_legacy/apps/app/src/lib/config.ts similarity index 100% rename from apps/app/src/lib/config.ts rename to _legacy/apps/app/src/lib/config.ts diff --git a/apps/app/src/lib/crosspost.ts b/_legacy/apps/app/src/lib/crosspost.ts similarity index 100% rename from apps/app/src/lib/crosspost.ts rename to _legacy/apps/app/src/lib/crosspost.ts diff --git a/apps/app/src/lib/distributor-urls.ts b/_legacy/apps/app/src/lib/distributor-urls.ts similarity index 100% rename from apps/app/src/lib/distributor-urls.ts rename to _legacy/apps/app/src/lib/distributor-urls.ts diff --git a/apps/app/src/lib/near-social.ts b/_legacy/apps/app/src/lib/near-social.ts similarity index 100% rename from apps/app/src/lib/near-social.ts rename to _legacy/apps/app/src/lib/near-social.ts diff --git a/apps/app/src/lib/near.ts b/_legacy/apps/app/src/lib/near.ts similarity index 100% rename from apps/app/src/lib/near.ts rename to _legacy/apps/app/src/lib/near.ts diff --git a/apps/app/src/lib/recap.ts b/_legacy/apps/app/src/lib/recap.ts similarity index 100% rename from apps/app/src/lib/recap.ts rename to _legacy/apps/app/src/lib/recap.ts diff --git a/apps/app/src/lib/services/pinata/client.ts b/_legacy/apps/app/src/lib/services/pinata/client.ts similarity index 100% rename from apps/app/src/lib/services/pinata/client.ts rename to _legacy/apps/app/src/lib/services/pinata/client.ts diff --git a/apps/app/src/lib/services/pinata/hooks.ts b/_legacy/apps/app/src/lib/services/pinata/hooks.ts similarity index 100% rename from apps/app/src/lib/services/pinata/hooks.ts rename to _legacy/apps/app/src/lib/services/pinata/hooks.ts diff --git a/apps/app/src/lib/twitter.ts b/_legacy/apps/app/src/lib/twitter.ts similarity index 100% rename from apps/app/src/lib/twitter.ts rename to _legacy/apps/app/src/lib/twitter.ts diff --git a/apps/app/src/lib/utils.ts b/_legacy/apps/app/src/lib/utils.ts similarity index 100% rename from apps/app/src/lib/utils.ts rename to _legacy/apps/app/src/lib/utils.ts diff --git a/apps/app/src/routeTree.gen.ts b/_legacy/apps/app/src/routeTree.gen.ts similarity index 100% rename from apps/app/src/routeTree.gen.ts rename to _legacy/apps/app/src/routeTree.gen.ts diff --git a/apps/app/src/routes/__root.tsx b/_legacy/apps/app/src/routes/__root.tsx similarity index 100% rename from apps/app/src/routes/__root.tsx rename to _legacy/apps/app/src/routes/__root.tsx diff --git a/apps/app/src/routes/_layout.tsx b/_legacy/apps/app/src/routes/_layout.tsx similarity index 100% rename from apps/app/src/routes/_layout.tsx rename to _legacy/apps/app/src/routes/_layout.tsx diff --git a/apps/app/src/routes/_layout/create/feed/_tabs.tsx b/_legacy/apps/app/src/routes/_layout/create/feed/_tabs.tsx similarity index 100% rename from apps/app/src/routes/_layout/create/feed/_tabs.tsx rename to _legacy/apps/app/src/routes/_layout/create/feed/_tabs.tsx diff --git a/apps/app/src/routes/_layout/create/feed/_tabs/index.tsx b/_legacy/apps/app/src/routes/_layout/create/feed/_tabs/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/create/feed/_tabs/index.tsx rename to _legacy/apps/app/src/routes/_layout/create/feed/_tabs/index.tsx diff --git a/apps/app/src/routes/_layout/create/feed/_tabs/review.tsx b/_legacy/apps/app/src/routes/_layout/create/feed/_tabs/review.tsx similarity index 100% rename from apps/app/src/routes/_layout/create/feed/_tabs/review.tsx rename to _legacy/apps/app/src/routes/_layout/create/feed/_tabs/review.tsx diff --git a/apps/app/src/routes/_layout/create/feed/_tabs/settings.tsx b/_legacy/apps/app/src/routes/_layout/create/feed/_tabs/settings.tsx similarity index 100% rename from apps/app/src/routes/_layout/create/feed/_tabs/settings.tsx rename to _legacy/apps/app/src/routes/_layout/create/feed/_tabs/settings.tsx diff --git a/apps/app/src/routes/_layout/create/plugin.tsx b/_legacy/apps/app/src/routes/_layout/create/plugin.tsx similarity index 100% rename from apps/app/src/routes/_layout/create/plugin.tsx rename to _legacy/apps/app/src/routes/_layout/create/plugin.tsx diff --git a/apps/app/src/routes/_layout/edit/feed/$feedId.tsx b/_legacy/apps/app/src/routes/_layout/edit/feed/$feedId.tsx similarity index 100% rename from apps/app/src/routes/_layout/edit/feed/$feedId.tsx rename to _legacy/apps/app/src/routes/_layout/edit/feed/$feedId.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/content.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/content.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/content.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/content.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/curation.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/curation.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/curation.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/curation.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/index.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/index.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/index.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/members.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/members.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/members.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/members.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/points.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/points.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/points.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/points.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/processing.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/processing.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/processing.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/processing.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/proposals.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/proposals.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/proposals.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/proposals.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/connected.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/connected.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/connected.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/connected.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/index.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/index.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/settings/index.tsx diff --git a/apps/app/src/routes/_layout/feed/$feedId/_tabs/token.tsx b/_legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/token.tsx similarity index 100% rename from apps/app/src/routes/_layout/feed/$feedId/_tabs/token.tsx rename to _legacy/apps/app/src/routes/_layout/feed/$feedId/_tabs/token.tsx diff --git a/apps/app/src/routes/_layout/index.tsx b/_legacy/apps/app/src/routes/_layout/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/index.tsx rename to _legacy/apps/app/src/routes/_layout/index.tsx diff --git a/apps/app/src/routes/_layout/leaderboard.tsx b/_legacy/apps/app/src/routes/_layout/leaderboard.tsx similarity index 100% rename from apps/app/src/routes/_layout/leaderboard.tsx rename to _legacy/apps/app/src/routes/_layout/leaderboard.tsx diff --git a/apps/app/src/routes/_layout/plugin/$pluginId.tsx b/_legacy/apps/app/src/routes/_layout/plugin/$pluginId.tsx similarity index 100% rename from apps/app/src/routes/_layout/plugin/$pluginId.tsx rename to _legacy/apps/app/src/routes/_layout/plugin/$pluginId.tsx diff --git a/apps/app/src/routes/_layout/plugin/index.tsx b/_legacy/apps/app/src/routes/_layout/plugin/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/plugin/index.tsx rename to _legacy/apps/app/src/routes/_layout/plugin/index.tsx diff --git a/apps/app/src/routes/_layout/profile.tsx b/_legacy/apps/app/src/routes/_layout/profile.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile.tsx rename to _legacy/apps/app/src/routes/_layout/profile.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/activity.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/activity.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/activity.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/activity.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/my-feeds.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/my-feeds.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/my-feeds.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/my-feeds.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/overview.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/overview.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/overview.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/overview.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/settings/_tabs.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/connections.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/connections.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/connections.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/connections.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/notifications.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/notifications.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/notifications.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/notifications.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/preferences.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/preferences.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/preferences.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/settings/_tabs/preferences.tsx diff --git a/apps/app/src/routes/_layout/profile/_tabs/settings/index.tsx b/_legacy/apps/app/src/routes/_layout/profile/_tabs/settings/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/_tabs/settings/index.tsx rename to _legacy/apps/app/src/routes/_layout/profile/_tabs/settings/index.tsx diff --git a/apps/app/src/routes/_layout/profile/index.tsx b/_legacy/apps/app/src/routes/_layout/profile/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/profile/index.tsx rename to _legacy/apps/app/src/routes/_layout/profile/index.tsx diff --git a/apps/app/src/routes/_layout/test/index.tsx b/_legacy/apps/app/src/routes/_layout/test/index.tsx similarity index 100% rename from apps/app/src/routes/_layout/test/index.tsx rename to _legacy/apps/app/src/routes/_layout/test/index.tsx diff --git a/apps/app/src/store/feed-creation-store.ts b/_legacy/apps/app/src/store/feed-creation-store.ts similarity index 100% rename from apps/app/src/store/feed-creation-store.ts rename to _legacy/apps/app/src/store/feed-creation-store.ts diff --git a/apps/app/src/types/plugin.ts b/_legacy/apps/app/src/types/plugin.ts similarity index 100% rename from apps/app/src/types/plugin.ts rename to _legacy/apps/app/src/types/plugin.ts diff --git a/apps/app/src/types/recap.ts b/_legacy/apps/app/src/types/recap.ts similarity index 100% rename from apps/app/src/types/recap.ts rename to _legacy/apps/app/src/types/recap.ts diff --git a/apps/app/src/types/rss.ts b/_legacy/apps/app/src/types/rss.ts similarity index 100% rename from apps/app/src/types/rss.ts rename to _legacy/apps/app/src/types/rss.ts diff --git a/apps/app/src/types/twitter.ts b/_legacy/apps/app/src/types/twitter.ts similarity index 100% rename from apps/app/src/types/twitter.ts rename to _legacy/apps/app/src/types/twitter.ts diff --git a/apps/app/src/utils/datetime.ts b/_legacy/apps/app/src/utils/datetime.ts similarity index 100% rename from apps/app/src/utils/datetime.ts rename to _legacy/apps/app/src/utils/datetime.ts diff --git a/apps/app/src/utils/ipfs.ts b/_legacy/apps/app/src/utils/ipfs.ts similarity index 100% rename from apps/app/src/utils/ipfs.ts rename to _legacy/apps/app/src/utils/ipfs.ts diff --git a/apps/app/src/utils/string.ts b/_legacy/apps/app/src/utils/string.ts similarity index 100% rename from apps/app/src/utils/string.ts rename to _legacy/apps/app/src/utils/string.ts diff --git a/apps/app/tailwind.config.js b/_legacy/apps/app/tailwind.config.js similarity index 100% rename from apps/app/tailwind.config.js rename to _legacy/apps/app/tailwind.config.js diff --git a/apps/app/tsconfig.app.json b/_legacy/apps/app/tsconfig.app.json similarity index 100% rename from apps/app/tsconfig.app.json rename to _legacy/apps/app/tsconfig.app.json diff --git a/apps/app/tsconfig.json b/_legacy/apps/app/tsconfig.json similarity index 100% rename from apps/app/tsconfig.json rename to _legacy/apps/app/tsconfig.json diff --git a/apps/app/tsconfig.node.json b/_legacy/apps/app/tsconfig.node.json similarity index 100% rename from apps/app/tsconfig.node.json rename to _legacy/apps/app/tsconfig.node.json diff --git a/apps/app/vercel.json b/_legacy/apps/app/vercel.json similarity index 100% rename from apps/app/vercel.json rename to _legacy/apps/app/vercel.json diff --git a/apps/gateway/Caddyfile b/_legacy/apps/gateway/Caddyfile similarity index 100% rename from apps/gateway/Caddyfile rename to _legacy/apps/gateway/Caddyfile diff --git a/apps/gateway/Dockerfile b/_legacy/apps/gateway/Dockerfile similarity index 100% rename from apps/gateway/Dockerfile rename to _legacy/apps/gateway/Dockerfile diff --git a/apps/gateway/README.md b/_legacy/apps/gateway/README.md similarity index 100% rename from apps/gateway/README.md rename to _legacy/apps/gateway/README.md diff --git a/apps/gateway/entrypoint.sh b/_legacy/apps/gateway/entrypoint.sh similarity index 100% rename from apps/gateway/entrypoint.sh rename to _legacy/apps/gateway/entrypoint.sh diff --git a/apps/worker/.env.example b/_legacy/apps/worker/.env.example similarity index 100% rename from apps/worker/.env.example rename to _legacy/apps/worker/.env.example diff --git a/apps/worker/Dockerfile b/_legacy/apps/worker/Dockerfile similarity index 100% rename from apps/worker/Dockerfile rename to _legacy/apps/worker/Dockerfile diff --git a/apps/worker/README.md b/_legacy/apps/worker/README.md similarity index 100% rename from apps/worker/README.md rename to _legacy/apps/worker/README.md diff --git a/apps/worker/package.json b/_legacy/apps/worker/package.json similarity index 100% rename from apps/worker/package.json rename to _legacy/apps/worker/package.json diff --git a/apps/worker/rspack.config.js b/_legacy/apps/worker/rspack.config.js similarity index 100% rename from apps/worker/rspack.config.js rename to _legacy/apps/worker/rspack.config.js diff --git a/apps/worker/src/db/index.ts b/_legacy/apps/worker/src/db/index.ts similarity index 100% rename from apps/worker/src/db/index.ts rename to _legacy/apps/worker/src/db/index.ts diff --git a/apps/worker/src/handlers/index.ts b/_legacy/apps/worker/src/handlers/index.ts similarity index 100% rename from apps/worker/src/handlers/index.ts rename to _legacy/apps/worker/src/handlers/index.ts diff --git a/apps/worker/src/handlers/moderation-queue/index.ts b/_legacy/apps/worker/src/handlers/moderation-queue/index.ts similarity index 100% rename from apps/worker/src/handlers/moderation-queue/index.ts rename to _legacy/apps/worker/src/handlers/moderation-queue/index.ts diff --git a/apps/worker/src/handlers/moderation-queue/processor.ts b/_legacy/apps/worker/src/handlers/moderation-queue/processor.ts similarity index 100% rename from apps/worker/src/handlers/moderation-queue/processor.ts rename to _legacy/apps/worker/src/handlers/moderation-queue/processor.ts diff --git a/apps/worker/src/handlers/processing-queue/index.ts b/_legacy/apps/worker/src/handlers/processing-queue/index.ts similarity index 100% rename from apps/worker/src/handlers/processing-queue/index.ts rename to _legacy/apps/worker/src/handlers/processing-queue/index.ts diff --git a/apps/worker/src/handlers/processing-queue/processor.ts b/_legacy/apps/worker/src/handlers/processing-queue/processor.ts similarity index 100% rename from apps/worker/src/handlers/processing-queue/processor.ts rename to _legacy/apps/worker/src/handlers/processing-queue/processor.ts diff --git a/apps/worker/src/index.ts b/_legacy/apps/worker/src/index.ts similarity index 100% rename from apps/worker/src/index.ts rename to _legacy/apps/worker/src/index.ts diff --git a/apps/worker/src/worker-lifecycle.ts b/_legacy/apps/worker/src/worker-lifecycle.ts similarity index 100% rename from apps/worker/src/worker-lifecycle.ts rename to _legacy/apps/worker/src/worker-lifecycle.ts diff --git a/apps/worker/tsconfig.json b/_legacy/apps/worker/tsconfig.json similarity index 100% rename from apps/worker/tsconfig.json rename to _legacy/apps/worker/tsconfig.json diff --git a/docker-compose.yml b/_legacy/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to _legacy/docker-compose.yml diff --git a/memory-bank/activeContext.md b/_legacy/memory-bank/activeContext.md similarity index 100% rename from memory-bank/activeContext.md rename to _legacy/memory-bank/activeContext.md diff --git a/memory-bank/productContext.md b/_legacy/memory-bank/productContext.md similarity index 100% rename from memory-bank/productContext.md rename to _legacy/memory-bank/productContext.md diff --git a/memory-bank/progress.md b/_legacy/memory-bank/progress.md similarity index 100% rename from memory-bank/progress.md rename to _legacy/memory-bank/progress.md diff --git a/memory-bank/projectbrief.md b/_legacy/memory-bank/projectbrief.md similarity index 100% rename from memory-bank/projectbrief.md rename to _legacy/memory-bank/projectbrief.md diff --git a/memory-bank/queue-refactor-plan.md b/_legacy/memory-bank/queue-refactor-plan.md similarity index 100% rename from memory-bank/queue-refactor-plan.md rename to _legacy/memory-bank/queue-refactor-plan.md diff --git a/memory-bank/systemPatterns.md b/_legacy/memory-bank/systemPatterns.md similarity index 100% rename from memory-bank/systemPatterns.md rename to _legacy/memory-bank/systemPatterns.md diff --git a/memory-bank/techContext.md b/_legacy/memory-bank/techContext.md similarity index 100% rename from memory-bank/techContext.md rename to _legacy/memory-bank/techContext.md diff --git a/memory-bank/testingPlan.md b/_legacy/memory-bank/testingPlan.md similarity index 100% rename from memory-bank/testingPlan.md rename to _legacy/memory-bank/testingPlan.md diff --git a/_legacy/package.json b/_legacy/package.json new file mode 100644 index 00000000..f2671920 --- /dev/null +++ b/_legacy/package.json @@ -0,0 +1,30 @@ +{ + "name": "curatedotfun", + "version": "1.0.0", + "devDependencies": { + "@types/node": "^22.15.33", + "concurrently": "^9.2.0", + "prettier": "^3.6.0", + "turbo": "latest" + }, + "packageManager": "pnpm@10.11.0", + "private": true, + "scripts": { + "dev": "./scripts/dev.sh", + "dev:fresh": "./scripts/dev.sh --fresh", + "dev:frontend": "turbo run dev --filter=@curatedotfun/app", + "build": "turbo run build", + "start": "docker-compose --profile prod up -d --build postgres_prod && docker-compose --profile prod run --rm db-init-prod && docker-compose --profile prod up -d --build app", + "test": "docker-compose --profile test up -d postgres_test && docker-compose --profile test run --rm db-init-test && turbo run test --filter=@curatedotfun/api || true && docker-compose --profile test down -v", + "test:ci": "turbo run test --filter=@curatedotfun/api", + "lint": "turbo run lint", + "clean": "turbo run clean", + "fmt": "prettier --write '**/*.{js,jsx,ts,tsx,json}'", + "fmt:check": "prettier --check '**/*.{js,jsx,ts,tsx,json}'", + "db:generate": "pnpm --filter @curatedotfun/shared-db run db:generate", + "db:migrate": "pnpm --filter @curatedotfun/shared-db run db:migrate", + "db:studio": "pnpm --filter @curatedotfun/shared-db run db:studio", + "db:seed:dev": "pnpm --filter @curatedotfun/shared-db run seed:dev" + }, + "type": "module" +} diff --git a/packages/core-services/package.json b/_legacy/packages/core-services/package.json similarity index 100% rename from packages/core-services/package.json rename to _legacy/packages/core-services/package.json diff --git a/packages/core-services/src/env.ts b/_legacy/packages/core-services/src/env.ts similarity index 100% rename from packages/core-services/src/env.ts rename to _legacy/packages/core-services/src/env.ts diff --git a/packages/core-services/src/index.ts b/_legacy/packages/core-services/src/index.ts similarity index 100% rename from packages/core-services/src/index.ts rename to _legacy/packages/core-services/src/index.ts diff --git a/packages/core-services/src/mocks/twitter-service.mock.ts b/_legacy/packages/core-services/src/mocks/twitter-service.mock.ts similarity index 100% rename from packages/core-services/src/mocks/twitter-service.mock.ts rename to _legacy/packages/core-services/src/mocks/twitter-service.mock.ts diff --git a/packages/core-services/src/service-provider.ts b/_legacy/packages/core-services/src/service-provider.ts similarity index 100% rename from packages/core-services/src/service-provider.ts rename to _legacy/packages/core-services/src/service-provider.ts diff --git a/packages/core-services/src/services/activity.service.ts b/_legacy/packages/core-services/src/services/activity.service.ts similarity index 100% rename from packages/core-services/src/services/activity.service.ts rename to _legacy/packages/core-services/src/services/activity.service.ts diff --git a/packages/core-services/src/services/auth.service.ts b/_legacy/packages/core-services/src/services/auth.service.ts similarity index 100% rename from packages/core-services/src/services/auth.service.ts rename to _legacy/packages/core-services/src/services/auth.service.ts diff --git a/packages/core-services/src/services/config.service.ts b/_legacy/packages/core-services/src/services/config.service.ts similarity index 100% rename from packages/core-services/src/services/config.service.ts rename to _legacy/packages/core-services/src/services/config.service.ts diff --git a/packages/core-services/src/services/distribution.service.ts b/_legacy/packages/core-services/src/services/distribution.service.ts similarity index 100% rename from packages/core-services/src/services/distribution.service.ts rename to _legacy/packages/core-services/src/services/distribution.service.ts diff --git a/packages/core-services/src/services/feed.service.ts b/_legacy/packages/core-services/src/services/feed.service.ts similarity index 100% rename from packages/core-services/src/services/feed.service.ts rename to _legacy/packages/core-services/src/services/feed.service.ts diff --git a/packages/core-services/src/services/interfaces/background-task.interface.ts b/_legacy/packages/core-services/src/services/interfaces/background-task.interface.ts similarity index 100% rename from packages/core-services/src/services/interfaces/background-task.interface.ts rename to _legacy/packages/core-services/src/services/interfaces/background-task.interface.ts diff --git a/packages/core-services/src/services/interfaces/base-service.interface.ts b/_legacy/packages/core-services/src/services/interfaces/base-service.interface.ts similarity index 100% rename from packages/core-services/src/services/interfaces/base-service.interface.ts rename to _legacy/packages/core-services/src/services/interfaces/base-service.interface.ts diff --git a/packages/core-services/src/services/moderation.service.ts b/_legacy/packages/core-services/src/services/moderation.service.ts similarity index 100% rename from packages/core-services/src/services/moderation.service.ts rename to _legacy/packages/core-services/src/services/moderation.service.ts diff --git a/packages/core-services/src/services/plugin.service.ts b/_legacy/packages/core-services/src/services/plugin.service.ts similarity index 100% rename from packages/core-services/src/services/plugin.service.ts rename to _legacy/packages/core-services/src/services/plugin.service.ts diff --git a/packages/core-services/src/services/processing.service.ts b/_legacy/packages/core-services/src/services/processing.service.ts similarity index 100% rename from packages/core-services/src/services/processing.service.ts rename to _legacy/packages/core-services/src/services/processing.service.ts diff --git a/packages/core-services/src/services/scheduler.service.ts b/_legacy/packages/core-services/src/services/scheduler.service.ts similarity index 100% rename from packages/core-services/src/services/scheduler.service.ts rename to _legacy/packages/core-services/src/services/scheduler.service.ts diff --git a/packages/core-services/src/services/submission.service.ts b/_legacy/packages/core-services/src/services/submission.service.ts similarity index 100% rename from packages/core-services/src/services/submission.service.ts rename to _legacy/packages/core-services/src/services/submission.service.ts diff --git a/packages/core-services/src/services/transformation.service.ts b/_legacy/packages/core-services/src/services/transformation.service.ts similarity index 100% rename from packages/core-services/src/services/transformation.service.ts rename to _legacy/packages/core-services/src/services/transformation.service.ts diff --git a/packages/core-services/src/services/twitter/client.ts b/_legacy/packages/core-services/src/services/twitter/client.ts similarity index 100% rename from packages/core-services/src/services/twitter/client.ts rename to _legacy/packages/core-services/src/services/twitter/client.ts diff --git a/packages/core-services/src/services/twitter/queries.ts b/_legacy/packages/core-services/src/services/twitter/queries.ts similarity index 100% rename from packages/core-services/src/services/twitter/queries.ts rename to _legacy/packages/core-services/src/services/twitter/queries.ts diff --git a/packages/core-services/src/services/twitter/twitter.interface.ts b/_legacy/packages/core-services/src/services/twitter/twitter.interface.ts similarity index 100% rename from packages/core-services/src/services/twitter/twitter.interface.ts rename to _legacy/packages/core-services/src/services/twitter/twitter.interface.ts diff --git a/packages/core-services/src/services/users.service.ts b/_legacy/packages/core-services/src/services/users.service.ts similarity index 100% rename from packages/core-services/src/services/users.service.ts rename to _legacy/packages/core-services/src/services/users.service.ts diff --git a/packages/core-services/src/utils/auth.ts b/_legacy/packages/core-services/src/utils/auth.ts similarity index 100% rename from packages/core-services/src/utils/auth.ts rename to _legacy/packages/core-services/src/utils/auth.ts diff --git a/packages/core-services/src/utils/error.ts b/_legacy/packages/core-services/src/utils/error.ts similarity index 100% rename from packages/core-services/src/utils/error.ts rename to _legacy/packages/core-services/src/utils/error.ts diff --git a/packages/core-services/src/utils/plugin.ts b/_legacy/packages/core-services/src/utils/plugin.ts similarity index 100% rename from packages/core-services/src/utils/plugin.ts rename to _legacy/packages/core-services/src/utils/plugin.ts diff --git a/packages/core-services/src/utils/sanitize.ts b/_legacy/packages/core-services/src/utils/sanitize.ts similarity index 100% rename from packages/core-services/src/utils/sanitize.ts rename to _legacy/packages/core-services/src/utils/sanitize.ts diff --git a/packages/core-services/tsconfig.json b/_legacy/packages/core-services/tsconfig.json similarity index 100% rename from packages/core-services/tsconfig.json rename to _legacy/packages/core-services/tsconfig.json diff --git a/packages/shared-db/Dockerfile b/_legacy/packages/shared-db/Dockerfile similarity index 100% rename from packages/shared-db/Dockerfile rename to _legacy/packages/shared-db/Dockerfile diff --git a/packages/shared-db/Dockerfile.dev b/_legacy/packages/shared-db/Dockerfile.dev similarity index 100% rename from packages/shared-db/Dockerfile.dev rename to _legacy/packages/shared-db/Dockerfile.dev diff --git a/packages/shared-db/README.md b/_legacy/packages/shared-db/README.md similarity index 100% rename from packages/shared-db/README.md rename to _legacy/packages/shared-db/README.md diff --git a/packages/shared-db/drizzle.config.ts b/_legacy/packages/shared-db/drizzle.config.ts similarity index 100% rename from packages/shared-db/drizzle.config.ts rename to _legacy/packages/shared-db/drizzle.config.ts diff --git a/packages/shared-db/migrations/0000_parallel_magma.sql b/_legacy/packages/shared-db/migrations/0000_parallel_magma.sql similarity index 100% rename from packages/shared-db/migrations/0000_parallel_magma.sql rename to _legacy/packages/shared-db/migrations/0000_parallel_magma.sql diff --git a/packages/shared-db/migrations/0001_fixed_hulk.sql b/_legacy/packages/shared-db/migrations/0001_fixed_hulk.sql similarity index 100% rename from packages/shared-db/migrations/0001_fixed_hulk.sql rename to _legacy/packages/shared-db/migrations/0001_fixed_hulk.sql diff --git a/packages/shared-db/migrations/0002_brown_satana.sql b/_legacy/packages/shared-db/migrations/0002_brown_satana.sql similarity index 100% rename from packages/shared-db/migrations/0002_brown_satana.sql rename to _legacy/packages/shared-db/migrations/0002_brown_satana.sql diff --git a/packages/shared-db/migrations/0003_melted_hellion.sql b/_legacy/packages/shared-db/migrations/0003_melted_hellion.sql similarity index 100% rename from packages/shared-db/migrations/0003_melted_hellion.sql rename to _legacy/packages/shared-db/migrations/0003_melted_hellion.sql diff --git a/packages/shared-db/migrations/0004_slimy_talon.sql b/_legacy/packages/shared-db/migrations/0004_slimy_talon.sql similarity index 100% rename from packages/shared-db/migrations/0004_slimy_talon.sql rename to _legacy/packages/shared-db/migrations/0004_slimy_talon.sql diff --git a/packages/shared-db/migrations/0005_many_wong.sql b/_legacy/packages/shared-db/migrations/0005_many_wong.sql similarity index 100% rename from packages/shared-db/migrations/0005_many_wong.sql rename to _legacy/packages/shared-db/migrations/0005_many_wong.sql diff --git a/packages/shared-db/migrations/0006_round_lockheed.sql b/_legacy/packages/shared-db/migrations/0006_round_lockheed.sql similarity index 100% rename from packages/shared-db/migrations/0006_round_lockheed.sql rename to _legacy/packages/shared-db/migrations/0006_round_lockheed.sql diff --git a/packages/shared-db/migrations/0007_sleepy_phalanx.sql b/_legacy/packages/shared-db/migrations/0007_sleepy_phalanx.sql similarity index 100% rename from packages/shared-db/migrations/0007_sleepy_phalanx.sql rename to _legacy/packages/shared-db/migrations/0007_sleepy_phalanx.sql diff --git a/packages/shared-db/migrations/0008_flat_black_queen.sql b/_legacy/packages/shared-db/migrations/0008_flat_black_queen.sql similarity index 100% rename from packages/shared-db/migrations/0008_flat_black_queen.sql rename to _legacy/packages/shared-db/migrations/0008_flat_black_queen.sql diff --git a/packages/shared-db/migrations/0009_secret_juggernaut.sql b/_legacy/packages/shared-db/migrations/0009_secret_juggernaut.sql similarity index 100% rename from packages/shared-db/migrations/0009_secret_juggernaut.sql rename to _legacy/packages/shared-db/migrations/0009_secret_juggernaut.sql diff --git a/packages/shared-db/migrations/0010_pale_vertigo.sql b/_legacy/packages/shared-db/migrations/0010_pale_vertigo.sql similarity index 100% rename from packages/shared-db/migrations/0010_pale_vertigo.sql rename to _legacy/packages/shared-db/migrations/0010_pale_vertigo.sql diff --git a/packages/shared-db/migrations/0011_sticky_gambit.sql b/_legacy/packages/shared-db/migrations/0011_sticky_gambit.sql similarity index 100% rename from packages/shared-db/migrations/0011_sticky_gambit.sql rename to _legacy/packages/shared-db/migrations/0011_sticky_gambit.sql diff --git a/packages/shared-db/migrations/0012_overjoyed_titania.sql b/_legacy/packages/shared-db/migrations/0012_overjoyed_titania.sql similarity index 100% rename from packages/shared-db/migrations/0012_overjoyed_titania.sql rename to _legacy/packages/shared-db/migrations/0012_overjoyed_titania.sql diff --git a/packages/shared-db/migrations/0013_smart_fenris.sql b/_legacy/packages/shared-db/migrations/0013_smart_fenris.sql similarity index 100% rename from packages/shared-db/migrations/0013_smart_fenris.sql rename to _legacy/packages/shared-db/migrations/0013_smart_fenris.sql diff --git a/packages/shared-db/migrations/0014_unique_absorbing_man.sql b/_legacy/packages/shared-db/migrations/0014_unique_absorbing_man.sql similarity index 100% rename from packages/shared-db/migrations/0014_unique_absorbing_man.sql rename to _legacy/packages/shared-db/migrations/0014_unique_absorbing_man.sql diff --git a/packages/shared-db/migrations/0015_ambiguous_the_watchers.sql b/_legacy/packages/shared-db/migrations/0015_ambiguous_the_watchers.sql similarity index 100% rename from packages/shared-db/migrations/0015_ambiguous_the_watchers.sql rename to _legacy/packages/shared-db/migrations/0015_ambiguous_the_watchers.sql diff --git a/packages/shared-db/migrations/0016_ambitious_blazing_skull.sql b/_legacy/packages/shared-db/migrations/0016_ambitious_blazing_skull.sql similarity index 100% rename from packages/shared-db/migrations/0016_ambitious_blazing_skull.sql rename to _legacy/packages/shared-db/migrations/0016_ambitious_blazing_skull.sql diff --git a/packages/shared-db/migrations/0017_warm_cerebro.sql b/_legacy/packages/shared-db/migrations/0017_warm_cerebro.sql similarity index 100% rename from packages/shared-db/migrations/0017_warm_cerebro.sql rename to _legacy/packages/shared-db/migrations/0017_warm_cerebro.sql diff --git a/packages/shared-db/migrations/0018_quick_eddie_brock.sql b/_legacy/packages/shared-db/migrations/0018_quick_eddie_brock.sql similarity index 100% rename from packages/shared-db/migrations/0018_quick_eddie_brock.sql rename to _legacy/packages/shared-db/migrations/0018_quick_eddie_brock.sql diff --git a/packages/shared-db/migrations/0019_neat_paladin.sql b/_legacy/packages/shared-db/migrations/0019_neat_paladin.sql similarity index 100% rename from packages/shared-db/migrations/0019_neat_paladin.sql rename to _legacy/packages/shared-db/migrations/0019_neat_paladin.sql diff --git a/packages/shared-db/migrations/0020_purple_rictor.sql b/_legacy/packages/shared-db/migrations/0020_purple_rictor.sql similarity index 100% rename from packages/shared-db/migrations/0020_purple_rictor.sql rename to _legacy/packages/shared-db/migrations/0020_purple_rictor.sql diff --git a/packages/shared-db/migrations/0021_ambitious_iron_man.sql b/_legacy/packages/shared-db/migrations/0021_ambitious_iron_man.sql similarity index 100% rename from packages/shared-db/migrations/0021_ambitious_iron_man.sql rename to _legacy/packages/shared-db/migrations/0021_ambitious_iron_man.sql diff --git a/packages/shared-db/migrations/0021_fix_processing_steps_schema.sql b/_legacy/packages/shared-db/migrations/0021_fix_processing_steps_schema.sql similarity index 100% rename from packages/shared-db/migrations/0021_fix_processing_steps_schema.sql rename to _legacy/packages/shared-db/migrations/0021_fix_processing_steps_schema.sql diff --git a/packages/shared-db/migrations/0022_supreme_vertigo.sql b/_legacy/packages/shared-db/migrations/0022_supreme_vertigo.sql similarity index 100% rename from packages/shared-db/migrations/0022_supreme_vertigo.sql rename to _legacy/packages/shared-db/migrations/0022_supreme_vertigo.sql diff --git a/packages/shared-db/migrations/meta/0000_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0000_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0000_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0000_snapshot.json diff --git a/packages/shared-db/migrations/meta/0001_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0001_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0001_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0001_snapshot.json diff --git a/packages/shared-db/migrations/meta/0002_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0002_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0002_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0002_snapshot.json diff --git a/packages/shared-db/migrations/meta/0003_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0003_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0003_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0003_snapshot.json diff --git a/packages/shared-db/migrations/meta/0004_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0004_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0004_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0004_snapshot.json diff --git a/packages/shared-db/migrations/meta/0005_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0005_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0005_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0005_snapshot.json diff --git a/packages/shared-db/migrations/meta/0006_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0006_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0006_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0006_snapshot.json diff --git a/packages/shared-db/migrations/meta/0007_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0007_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0007_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0007_snapshot.json diff --git a/packages/shared-db/migrations/meta/0008_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0008_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0008_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0008_snapshot.json diff --git a/packages/shared-db/migrations/meta/0009_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0009_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0009_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0009_snapshot.json diff --git a/packages/shared-db/migrations/meta/0010_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0010_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0010_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0010_snapshot.json diff --git a/packages/shared-db/migrations/meta/0011_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0011_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0011_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0011_snapshot.json diff --git a/packages/shared-db/migrations/meta/0012_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0012_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0012_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0012_snapshot.json diff --git a/packages/shared-db/migrations/meta/0013_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0013_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0013_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0013_snapshot.json diff --git a/packages/shared-db/migrations/meta/0014_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0014_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0014_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0014_snapshot.json diff --git a/packages/shared-db/migrations/meta/0015_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0015_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0015_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0015_snapshot.json diff --git a/packages/shared-db/migrations/meta/0016_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0016_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0016_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0016_snapshot.json diff --git a/packages/shared-db/migrations/meta/0017_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0017_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0017_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0017_snapshot.json diff --git a/packages/shared-db/migrations/meta/0018_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0018_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0018_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0018_snapshot.json diff --git a/packages/shared-db/migrations/meta/0019_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0019_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0019_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0019_snapshot.json diff --git a/packages/shared-db/migrations/meta/0020_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0020_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0020_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0020_snapshot.json diff --git a/packages/shared-db/migrations/meta/0021_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0021_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0021_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0021_snapshot.json diff --git a/packages/shared-db/migrations/meta/0022_snapshot.json b/_legacy/packages/shared-db/migrations/meta/0022_snapshot.json similarity index 100% rename from packages/shared-db/migrations/meta/0022_snapshot.json rename to _legacy/packages/shared-db/migrations/meta/0022_snapshot.json diff --git a/packages/shared-db/migrations/meta/_journal.json b/_legacy/packages/shared-db/migrations/meta/_journal.json similarity index 100% rename from packages/shared-db/migrations/meta/_journal.json rename to _legacy/packages/shared-db/migrations/meta/_journal.json diff --git a/packages/shared-db/package.json b/_legacy/packages/shared-db/package.json similarity index 100% rename from packages/shared-db/package.json rename to _legacy/packages/shared-db/package.json diff --git a/packages/shared-db/scripts/overwrite-vars.ts b/_legacy/packages/shared-db/scripts/overwrite-vars.ts similarity index 100% rename from packages/shared-db/scripts/overwrite-vars.ts rename to _legacy/packages/shared-db/scripts/overwrite-vars.ts diff --git a/packages/shared-db/scripts/seed-dev.ts b/_legacy/packages/shared-db/scripts/seed-dev.ts similarity index 100% rename from packages/shared-db/scripts/seed-dev.ts rename to _legacy/packages/shared-db/scripts/seed-dev.ts diff --git a/packages/shared-db/scripts/seed-remote.ts b/_legacy/packages/shared-db/scripts/seed-remote.ts similarity index 100% rename from packages/shared-db/scripts/seed-remote.ts rename to _legacy/packages/shared-db/scripts/seed-remote.ts diff --git a/packages/shared-db/src/index.ts b/_legacy/packages/shared-db/src/index.ts similarity index 100% rename from packages/shared-db/src/index.ts rename to _legacy/packages/shared-db/src/index.ts diff --git a/packages/shared-db/src/repositories/activity.repository.ts b/_legacy/packages/shared-db/src/repositories/activity.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/activity.repository.ts rename to _legacy/packages/shared-db/src/repositories/activity.repository.ts diff --git a/packages/shared-db/src/repositories/authRequest.repository.ts b/_legacy/packages/shared-db/src/repositories/authRequest.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/authRequest.repository.ts rename to _legacy/packages/shared-db/src/repositories/authRequest.repository.ts diff --git a/packages/shared-db/src/repositories/feed.repository.ts b/_legacy/packages/shared-db/src/repositories/feed.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/feed.repository.ts rename to _legacy/packages/shared-db/src/repositories/feed.repository.ts diff --git a/packages/shared-db/src/repositories/feedRecap.repository.ts b/_legacy/packages/shared-db/src/repositories/feedRecap.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/feedRecap.repository.ts rename to _legacy/packages/shared-db/src/repositories/feedRecap.repository.ts diff --git a/packages/shared-db/src/repositories/leaderboard.repository.ts b/_legacy/packages/shared-db/src/repositories/leaderboard.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/leaderboard.repository.ts rename to _legacy/packages/shared-db/src/repositories/leaderboard.repository.ts diff --git a/packages/shared-db/src/repositories/moderation.repository.ts b/_legacy/packages/shared-db/src/repositories/moderation.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/moderation.repository.ts rename to _legacy/packages/shared-db/src/repositories/moderation.repository.ts diff --git a/packages/shared-db/src/repositories/plugin.repository.ts b/_legacy/packages/shared-db/src/repositories/plugin.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/plugin.repository.ts rename to _legacy/packages/shared-db/src/repositories/plugin.repository.ts diff --git a/packages/shared-db/src/repositories/processing.repository.ts b/_legacy/packages/shared-db/src/repositories/processing.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/processing.repository.ts rename to _legacy/packages/shared-db/src/repositories/processing.repository.ts diff --git a/packages/shared-db/src/repositories/submission.repository.ts b/_legacy/packages/shared-db/src/repositories/submission.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/submission.repository.ts rename to _legacy/packages/shared-db/src/repositories/submission.repository.ts diff --git a/packages/shared-db/src/repositories/twitter.repository.ts b/_legacy/packages/shared-db/src/repositories/twitter.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/twitter.repository.ts rename to _legacy/packages/shared-db/src/repositories/twitter.repository.ts diff --git a/packages/shared-db/src/repositories/user.repository.ts b/_legacy/packages/shared-db/src/repositories/user.repository.ts similarity index 100% rename from packages/shared-db/src/repositories/user.repository.ts rename to _legacy/packages/shared-db/src/repositories/user.repository.ts diff --git a/packages/shared-db/src/schema/activity.ts b/_legacy/packages/shared-db/src/schema/activity.ts similarity index 100% rename from packages/shared-db/src/schema/activity.ts rename to _legacy/packages/shared-db/src/schema/activity.ts diff --git a/packages/shared-db/src/schema/auth.ts b/_legacy/packages/shared-db/src/schema/auth.ts similarity index 100% rename from packages/shared-db/src/schema/auth.ts rename to _legacy/packages/shared-db/src/schema/auth.ts diff --git a/packages/shared-db/src/schema/common.ts b/_legacy/packages/shared-db/src/schema/common.ts similarity index 100% rename from packages/shared-db/src/schema/common.ts rename to _legacy/packages/shared-db/src/schema/common.ts diff --git a/packages/shared-db/src/schema/feeds.ts b/_legacy/packages/shared-db/src/schema/feeds.ts similarity index 100% rename from packages/shared-db/src/schema/feeds.ts rename to _legacy/packages/shared-db/src/schema/feeds.ts diff --git a/packages/shared-db/src/schema/index.ts b/_legacy/packages/shared-db/src/schema/index.ts similarity index 100% rename from packages/shared-db/src/schema/index.ts rename to _legacy/packages/shared-db/src/schema/index.ts diff --git a/packages/shared-db/src/schema/moderation.ts b/_legacy/packages/shared-db/src/schema/moderation.ts similarity index 100% rename from packages/shared-db/src/schema/moderation.ts rename to _legacy/packages/shared-db/src/schema/moderation.ts diff --git a/packages/shared-db/src/schema/plugins.ts b/_legacy/packages/shared-db/src/schema/plugins.ts similarity index 100% rename from packages/shared-db/src/schema/plugins.ts rename to _legacy/packages/shared-db/src/schema/plugins.ts diff --git a/packages/shared-db/src/schema/processing.ts b/_legacy/packages/shared-db/src/schema/processing.ts similarity index 100% rename from packages/shared-db/src/schema/processing.ts rename to _legacy/packages/shared-db/src/schema/processing.ts diff --git a/packages/shared-db/src/schema/submissions.ts b/_legacy/packages/shared-db/src/schema/submissions.ts similarity index 100% rename from packages/shared-db/src/schema/submissions.ts rename to _legacy/packages/shared-db/src/schema/submissions.ts diff --git a/packages/shared-db/src/schema/twitter.ts b/_legacy/packages/shared-db/src/schema/twitter.ts similarity index 100% rename from packages/shared-db/src/schema/twitter.ts rename to _legacy/packages/shared-db/src/schema/twitter.ts diff --git a/packages/shared-db/src/schema/users.ts b/_legacy/packages/shared-db/src/schema/users.ts similarity index 100% rename from packages/shared-db/src/schema/users.ts rename to _legacy/packages/shared-db/src/schema/users.ts diff --git a/packages/shared-db/src/types.ts b/_legacy/packages/shared-db/src/types.ts similarity index 100% rename from packages/shared-db/src/types.ts rename to _legacy/packages/shared-db/src/types.ts diff --git a/packages/shared-db/src/utils.ts b/_legacy/packages/shared-db/src/utils.ts similarity index 100% rename from packages/shared-db/src/utils.ts rename to _legacy/packages/shared-db/src/utils.ts diff --git a/packages/shared-db/tsconfig.json b/_legacy/packages/shared-db/tsconfig.json similarity index 100% rename from packages/shared-db/tsconfig.json rename to _legacy/packages/shared-db/tsconfig.json diff --git a/packages/shared-queue/package.json b/_legacy/packages/shared-queue/package.json similarity index 100% rename from packages/shared-queue/package.json rename to _legacy/packages/shared-queue/package.json diff --git a/packages/shared-queue/src/index.ts b/_legacy/packages/shared-queue/src/index.ts similarity index 100% rename from packages/shared-queue/src/index.ts rename to _legacy/packages/shared-queue/src/index.ts diff --git a/packages/shared-queue/src/queues.ts b/_legacy/packages/shared-queue/src/queues.ts similarity index 100% rename from packages/shared-queue/src/queues.ts rename to _legacy/packages/shared-queue/src/queues.ts diff --git a/packages/shared-queue/tsconfig.json b/_legacy/packages/shared-queue/tsconfig.json similarity index 100% rename from packages/shared-queue/tsconfig.json rename to _legacy/packages/shared-queue/tsconfig.json diff --git a/packages/types/package.json b/_legacy/packages/types/package.json similarity index 100% rename from packages/types/package.json rename to _legacy/packages/types/package.json diff --git a/packages/types/src/api/activity.ts b/_legacy/packages/types/src/api/activity.ts similarity index 100% rename from packages/types/src/api/activity.ts rename to _legacy/packages/types/src/api/activity.ts diff --git a/packages/types/src/api/common.ts b/_legacy/packages/types/src/api/common.ts similarity index 100% rename from packages/types/src/api/common.ts rename to _legacy/packages/types/src/api/common.ts diff --git a/packages/types/src/api/feeds.ts b/_legacy/packages/types/src/api/feeds.ts similarity index 100% rename from packages/types/src/api/feeds.ts rename to _legacy/packages/types/src/api/feeds.ts diff --git a/packages/types/src/api/moderation.ts b/_legacy/packages/types/src/api/moderation.ts similarity index 100% rename from packages/types/src/api/moderation.ts rename to _legacy/packages/types/src/api/moderation.ts diff --git a/packages/types/src/api/plugins.ts b/_legacy/packages/types/src/api/plugins.ts similarity index 100% rename from packages/types/src/api/plugins.ts rename to _legacy/packages/types/src/api/plugins.ts diff --git a/packages/types/src/api/processing.ts b/_legacy/packages/types/src/api/processing.ts similarity index 100% rename from packages/types/src/api/processing.ts rename to _legacy/packages/types/src/api/processing.ts diff --git a/packages/types/src/api/submissions.ts b/_legacy/packages/types/src/api/submissions.ts similarity index 100% rename from packages/types/src/api/submissions.ts rename to _legacy/packages/types/src/api/submissions.ts diff --git a/packages/types/src/api/users.ts b/_legacy/packages/types/src/api/users.ts similarity index 100% rename from packages/types/src/api/users.ts rename to _legacy/packages/types/src/api/users.ts diff --git a/packages/types/src/config.ts b/_legacy/packages/types/src/config.ts similarity index 100% rename from packages/types/src/config.ts rename to _legacy/packages/types/src/config.ts diff --git a/packages/types/src/index.ts b/_legacy/packages/types/src/index.ts similarity index 100% rename from packages/types/src/index.ts rename to _legacy/packages/types/src/index.ts diff --git a/packages/types/src/plugin.ts b/_legacy/packages/types/src/plugin.ts similarity index 100% rename from packages/types/src/plugin.ts rename to _legacy/packages/types/src/plugin.ts diff --git a/packages/types/tsconfig.json b/_legacy/packages/types/tsconfig.json similarity index 100% rename from packages/types/tsconfig.json rename to _legacy/packages/types/tsconfig.json diff --git a/packages/utils/package.json b/_legacy/packages/utils/package.json similarity index 100% rename from packages/utils/package.json rename to _legacy/packages/utils/package.json diff --git a/packages/utils/src/errors.ts b/_legacy/packages/utils/src/errors.ts similarity index 100% rename from packages/utils/src/errors.ts rename to _legacy/packages/utils/src/errors.ts diff --git a/packages/utils/src/index.ts b/_legacy/packages/utils/src/index.ts similarity index 100% rename from packages/utils/src/index.ts rename to _legacy/packages/utils/src/index.ts diff --git a/packages/utils/src/logger.ts b/_legacy/packages/utils/src/logger.ts similarity index 100% rename from packages/utils/src/logger.ts rename to _legacy/packages/utils/src/logger.ts diff --git a/packages/utils/tsconfig.json b/_legacy/packages/utils/tsconfig.json similarity index 100% rename from packages/utils/tsconfig.json rename to _legacy/packages/utils/tsconfig.json diff --git a/pnpm-lock.yaml b/_legacy/pnpm-lock.yaml similarity index 100% rename from pnpm-lock.yaml rename to _legacy/pnpm-lock.yaml diff --git a/pnpm-workspace.yaml b/_legacy/pnpm-workspace.yaml similarity index 100% rename from pnpm-workspace.yaml rename to _legacy/pnpm-workspace.yaml diff --git a/scripts/dev.sh b/_legacy/scripts/dev.sh similarity index 100% rename from scripts/dev.sh rename to _legacy/scripts/dev.sh diff --git a/_legacy/tsconfig.json b/_legacy/tsconfig.json new file mode 100644 index 00000000..ed925142 --- /dev/null +++ b/_legacy/tsconfig.json @@ -0,0 +1,27 @@ +{ + "files": [], + "references": [ + // Remember to add reference here when adding a new app or package + { "path": "./apps/api" }, + { "path": "./apps/app" }, + { "path": "./packages/core-services" }, + { "path": "./packages/types" }, + { "path": "./packages/shared-db" }, + { "path": "./packages/shared-queue" }, + { "path": "./packages/utils" } + ], + "compilerOptions": { + "target": "es2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["es2022", "dom"], // Broad libs for general compatibility (DOM for frontend) + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "noEmit": false, + "declaration": true, + "declarationMap": true, + "composite": true + } +} diff --git a/turbo.json b/_legacy/turbo.json similarity index 100% rename from turbo.json rename to _legacy/turbo.json diff --git a/database.db b/database.db new file mode 100644 index 00000000..400ec03d Binary files /dev/null and b/database.db differ diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 00000000..3ad40ce2 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,12 @@ +import type { Config } from "drizzle-kit"; + +export default { + schema: "./schemas/database.ts", + out: "./drizzle", + dialect: "sqlite", + dbCredentials: { + url: "file:./database.db", + }, + verbose: true, + strict: true, +} satisfies Config; diff --git a/drizzle/0000_complete_lifeguard.sql b/drizzle/0000_complete_lifeguard.sql new file mode 100644 index 00000000..5c47c9a8 --- /dev/null +++ b/drizzle/0000_complete_lifeguard.sql @@ -0,0 +1,45 @@ +CREATE TABLE IF NOT EXISTS `items` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `external_id` text NOT NULL, + `platform` text NOT NULL CHECK (platform IN ('twitter', 'tiktok', 'reddit')), + `content` text NOT NULL, + `content_type` text, + `conversation_id` text, + `original_author_username` text, + `original_author_id` text, + `curator_username` text, + `created_at` text, + `ingested_at` text DEFAULT CURRENT_TIMESTAMP, + `url` text, + `raw_data` text +); +--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS `external_id_idx` ON `items` (`external_id`);--> statement-breakpoint +CREATE INDEX IF NOT EXISTS `conversation_idx` ON `items` (`conversation_id`);--> statement-breakpoint +CREATE INDEX IF NOT EXISTS `curator_idx` ON `items` (`curator_username`);--> statement-breakpoint +CREATE INDEX IF NOT EXISTS `ingested_at_idx` ON `items` (`ingested_at`);--> statement-breakpoint +CREATE TABLE IF NOT EXISTS `processing_queue` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `item_id` integer NOT NULL, + `submission_type` text NOT NULL CHECK (submission_type IN ('submit')), + `status` text DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'completed', 'failed')), + `attempts` integer DEFAULT 0, + `worker_id` text, + `error_message` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`item_id`) REFERENCES `items`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE INDEX IF NOT EXISTS `status_idx` ON `processing_queue` (`status`);--> statement-breakpoint +CREATE INDEX IF NOT EXISTS `worker_idx` ON `processing_queue` (`worker_id`);--> statement-breakpoint +CREATE TABLE IF NOT EXISTS `stream_state` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `phase` text NOT NULL CHECK (phase IN ('initial', 'backfill', 'live')), + `most_recent_id` text, + `oldest_seen_id` text, + `backfill_done` integer DEFAULT 0, + `total_processed` integer DEFAULT 0, + `next_poll_ms` integer, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); diff --git a/drizzle/0001_lethal_wolf_cub.sql b/drizzle/0001_lethal_wolf_cub.sql new file mode 100644 index 00000000..b305ff56 --- /dev/null +++ b/drizzle/0001_lethal_wolf_cub.sql @@ -0,0 +1,3 @@ +ALTER TABLE `stream_state` DROP COLUMN `phase`;--> statement-breakpoint +ALTER TABLE `stream_state` DROP COLUMN `backfill_done`;--> statement-breakpoint +ALTER TABLE `stream_state` DROP COLUMN `next_poll_ms`; \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 00000000..595c2474 --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,324 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "90935091-b904-4eba-9748-1a11c7822eb3", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "items": { + "name": "items", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "external_id": { + "name": "external_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "conversation_id": { + "name": "conversation_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "original_author_username": { + "name": "original_author_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "original_author_id": { + "name": "original_author_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "curator_username": { + "name": "curator_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ingested_at": { + "name": "ingested_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "raw_data": { + "name": "raw_data", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "external_id_idx": { + "name": "external_id_idx", + "columns": [ + "external_id" + ], + "isUnique": true + }, + "conversation_idx": { + "name": "conversation_idx", + "columns": [ + "conversation_id" + ], + "isUnique": false + }, + "curator_idx": { + "name": "curator_idx", + "columns": [ + "curator_username" + ], + "isUnique": false + }, + "ingested_at_idx": { + "name": "ingested_at_idx", + "columns": [ + "ingested_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "processing_queue": { + "name": "processing_queue", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "item_id": { + "name": "item_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "submission_type": { + "name": "submission_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'pending'" + }, + "attempts": { + "name": "attempts", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "worker_id": { + "name": "worker_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "status_idx": { + "name": "status_idx", + "columns": [ + "status" + ], + "isUnique": false + }, + "worker_idx": { + "name": "worker_idx", + "columns": [ + "worker_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "processing_queue_item_id_items_id_fk": { + "name": "processing_queue_item_id_items_id_fk", + "tableFrom": "processing_queue", + "tableTo": "items", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "stream_state": { + "name": "stream_state", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "phase": { + "name": "phase", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "most_recent_id": { + "name": "most_recent_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oldest_seen_id": { + "name": "oldest_seen_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "backfill_done": { + "name": "backfill_done", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "total_processed": { + "name": "total_processed", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "next_poll_ms": { + "name": "next_poll_ms", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json new file mode 100644 index 00000000..04091a18 --- /dev/null +++ b/drizzle/meta/0001_snapshot.json @@ -0,0 +1,302 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "92a24588-1d24-4dc9-b871-116a6d6dd318", + "prevId": "90935091-b904-4eba-9748-1a11c7822eb3", + "tables": { + "items": { + "name": "items", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "external_id": { + "name": "external_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "conversation_id": { + "name": "conversation_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "original_author_username": { + "name": "original_author_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "original_author_id": { + "name": "original_author_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "curator_username": { + "name": "curator_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ingested_at": { + "name": "ingested_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "raw_data": { + "name": "raw_data", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "external_id_idx": { + "name": "external_id_idx", + "columns": [ + "external_id" + ], + "isUnique": true + }, + "conversation_idx": { + "name": "conversation_idx", + "columns": [ + "conversation_id" + ], + "isUnique": false + }, + "curator_idx": { + "name": "curator_idx", + "columns": [ + "curator_username" + ], + "isUnique": false + }, + "ingested_at_idx": { + "name": "ingested_at_idx", + "columns": [ + "ingested_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "processing_queue": { + "name": "processing_queue", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "item_id": { + "name": "item_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "submission_type": { + "name": "submission_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'pending'" + }, + "attempts": { + "name": "attempts", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "worker_id": { + "name": "worker_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "status_idx": { + "name": "status_idx", + "columns": [ + "status" + ], + "isUnique": false + }, + "worker_idx": { + "name": "worker_idx", + "columns": [ + "worker_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "processing_queue_item_id_items_id_fk": { + "name": "processing_queue_item_id_items_id_fk", + "tableFrom": "processing_queue", + "tableTo": "items", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "stream_state": { + "name": "stream_state", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "most_recent_id": { + "name": "most_recent_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "oldest_seen_id": { + "name": "oldest_seen_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "total_processed": { + "name": "total_processed", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 00000000..bc8d8e51 --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,20 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1757531295273, + "tag": "0000_complete_lifeguard", + "breakpoints": true + }, + { + "idx": 1, + "version": "6", + "when": 1759778771560, + "tag": "0001_lethal_wolf_cub", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/inspect-db.ts b/inspect-db.ts new file mode 100644 index 00000000..a925c18d --- /dev/null +++ b/inspect-db.ts @@ -0,0 +1,56 @@ +#!/usr/bin/env bun + +import { Effect, Logger, LogLevel } from "effect"; +import { DatabaseService, DatabaseServiceLive } from "./services/db.service"; + +// Simple database inspection utility +const inspectDatabase = Effect.gen(function* () { + const db = yield* DatabaseService; + + console.log("šŸ“Š Database Inspection\n"); + + // Get recent items + const recentItems = yield* db.getRecentItems(10); + console.log(`šŸ“ Recent Items (${recentItems.length}):`); + recentItems.forEach((item, i) => { + const curator = item.curatorUsername ? ` (curator: ${item.curatorUsername})` : ''; + console.log(` ${i + 1}. @${item.originalAuthorUsername} - ${item.externalId}${curator}`); + console.log(` "${item.content.substring(0, 80)}..."`); + console.log(` Platform: ${item.platform}, Ingested: ${item.ingestedAt}\n`); + }); + + // Get pending tasks + const pendingTask = yield* db.getNextPendingTask(); + if (pendingTask) { + console.log("ā³ Next Pending Task:"); + console.log(` Task ID: ${pendingTask.id}, Item ID: ${pendingTask.itemId}`); + console.log(` Type: ${pendingTask.submissionType}, Status: ${pendingTask.status}`); + console.log(` Created: ${pendingTask.createdAt}\n`); + } else { + console.log("āœ… No pending tasks in queue\n"); + } + + // Get stream state + const streamState = yield* db.loadStreamState(); + if (streamState) { + console.log("šŸ”„ Stream State:"); + console.log(` Phase: ${streamState.phase}`); + console.log(` Total Processed: ${streamState.totalProcessed}`); + console.log(` Most Recent ID: ${streamState.mostRecentId}`); + console.log(` Oldest Seen ID: ${streamState.oldestSeenId}`); + console.log(` Backfill Done: ${streamState.backfillDone}`); + console.log(` Next Poll: ${streamState.nextPollMs}ms`); + console.log(` Updated: ${streamState.updatedAt}\n`); + } else { + console.log("āŒ No stream state found\n"); + } +}); + +// Main program +const program = inspectDatabase.pipe( + Effect.provide(Logger.minimumLogLevel(LogLevel.Info)), + Effect.provide(DatabaseServiceLive) +); + +// Run the inspection +await Effect.runPromise(program); diff --git a/main.ts b/main.ts new file mode 100644 index 00000000..40ab4446 --- /dev/null +++ b/main.ts @@ -0,0 +1,187 @@ +#!/usr/bin/env bun + +import { Effect, Logger, LogLevel, Stream } from "every-plugin/effect"; +import type { GopherResult } from "../../plugins/gopher-ai/src/contract"; +import { plugins, runtime } from "./plugins"; +import type { NewItem } from "./schemas/database"; +import { DatabaseService } from "./services/db.service"; + +// State type for stream persistence +type StreamState = { + mostRecentId?: string; + oldestSeenId?: string; + totalProcessed?: number; +}; + +// Configuration constants +const BASE_QUERY = "@curatedotfun"; + +// Helper to extract curator username from content mentioning @curatedotfun +const extractCuratorUsername = (item: GopherResult): string | undefined => { + // For items mentioning @curatedotfun, the curator is typically the author + // For Twitter: author_username field comes through catchall + if (item.content.includes(BASE_QUERY)) { + return item.author_username; + } + return undefined; +}; + +// Helper to detect !submit commands in content +const detectSubmissionCommands = (content: string): boolean => { + return content.toLowerCase().includes("!submit"); +} + +const convertToDbItem = (item: GopherResult): NewItem => { + return { + externalId: item.id, + platform: item.source, + content: item.content, + contentType: "text", // Default, since this isn't in the base schema + conversationId: item.conversation_id || item.metadata?.conversation_id, // Access via catchall + originalAuthorUsername: item.author_username, // Access via catchall + originalAuthorId: item.author_id, // Access via catchall + curatorUsername: extractCuratorUsername(item), + createdAt: item.created_at || new Date().toISOString(), // Access via catchall or fallback + url: item.tweet_url || `https://twitter.com/${item.author_username}/status/${item.id}`, // Construct URL if not available + rawData: item, // Store the entire raw item + }; +}; + +// Enhanced item processing with database storage +const processItem = (item: GopherResult, itemNumber: number) => + Effect.gen(function* () { + const db = yield* DatabaseService; + + // Convert and insert item into database + const dbItem = convertToDbItem(item); + const itemId = yield* db.insertItem(dbItem); + + if (itemId === 0) { + // Duplicate item, skip processing + console.log(`${itemNumber}. Duplicate item skipped: ${item.id}`); + return; + } + + // Check for !submit commands and enqueue for processing + if (detectSubmissionCommands(item.content)) { + yield* db.enqueueProcessing(itemId, "submit"); + console.log(`šŸ“ Queued !submit for processing: ${item.id}`); + } + + // Console output for monitoring + const tweetId = item.id; + const timestamp = item.created_at || item.updated_at || new Date().toISOString(); + const username = (item.author_username) || 'unknown'; + const curator = dbItem.curatorUsername ? ` (curator: ${dbItem.curatorUsername})` : ''; + + console.log(`${itemNumber}. @${username} (${tweetId}) - ${timestamp}${curator}`); + }); + +// State persistence using database +const saveState = (state: StreamState) => + Effect.gen(function* () { + const db = yield* DatabaseService; + yield* db.saveStreamState({ + mostRecentId: state.mostRecentId, + oldestSeenId: state.oldestSeenId, + totalProcessed: state.totalProcessed, + }); + }); + +const loadState = () => + Effect.gen(function* () { + const db = yield* DatabaseService; + const state = yield* db.loadStreamState(); + + if (!state) return null; + + return { + mostRecentId: state.mostRecentId ?? undefined, + oldestSeenId: state.oldestSeenId ?? undefined, + totalProcessed: state.totalProcessed ?? 0, + }; + }); + +// Stream creation and processing function +const createAndProcessGopherStream = () => + Effect.gen(function* () { + const db = yield* DatabaseService; + const { client } = plugins.gopherAi; + + // Load initial state from database + const initialState = yield* loadState(); + + if (initialState) { + console.log(`šŸ“‚ Resuming from saved state (${initialState.totalProcessed || 0} items total)`); + } else { + console.log('šŸ“‚ Starting fresh historical backfill'); + } + + // Create stream + const streamResult = yield* Effect.promise(() => + client.search({ + query: BASE_QUERY, + sourceType: 'twitter', + sinceId: initialState?.mostRecentId ?? undefined, + enableLive: true + }) + ); + + let itemCount = 0; + let currentMostRecentId = initialState?.mostRecentId; + let currentOldestSeenId = initialState?.oldestSeenId; + + yield* Stream.fromAsyncIterable(streamResult, (error) => error).pipe( + Stream.tap((item) => + Effect.gen(function* () { + itemCount++; + yield* processItem(item, itemCount); + + // Update mostRecentId (for live mode cursor) + const itemId = BigInt(item.id); + if (!currentMostRecentId || itemId > BigInt(currentMostRecentId)) { + currentMostRecentId = item.id; + } + + // Update oldestSeenId (for backfill cursor) + if (!currentOldestSeenId || itemId < BigInt(currentOldestSeenId)) { + currentOldestSeenId = item.id; + } + + // Periodically save state every 10 items + if (itemCount % 10 === 0) { + yield* saveState({ + mostRecentId: currentMostRecentId, + oldestSeenId: currentOldestSeenId, + totalProcessed: (initialState?.totalProcessed || 0) + itemCount + }); + console.log(`šŸ’¾ State saved (${itemCount} items in this session)`); + } + }) + ), + Stream.runDrain + ); + + // Save final state before shutdown + yield* saveState({ + mostRecentId: currentMostRecentId, + oldestSeenId: currentOldestSeenId, + totalProcessed: (initialState?.totalProcessed || 0) + itemCount + }); + console.log(`\nšŸ’¾ Final state saved (${itemCount} items processed)`); + }); + +// Main program +const program = Effect.gen(function* () { + console.log('šŸš€ Starting Twitter streaming with database storage...\n'); + yield* createAndProcessGopherStream(); + yield* Effect.sync(() => runtime.shutdown()); +}); + +// Run the program with database service +await Effect.runPromise( + program.pipe( + Effect.provide(DatabaseService.Default), + Effect.provide(Logger.minimumLogLevel(LogLevel.Info)) + ) +); diff --git a/package.json b/package.json index f2671920..a9b87418 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,28 @@ { - "name": "curatedotfun", - "version": "1.0.0", - "devDependencies": { - "@types/node": "^22.15.33", - "concurrently": "^9.2.0", - "prettier": "^3.6.0", - "turbo": "latest" - }, - "packageManager": "pnpm@10.11.0", - "private": true, - "scripts": { - "dev": "./scripts/dev.sh", - "dev:fresh": "./scripts/dev.sh --fresh", - "dev:frontend": "turbo run dev --filter=@curatedotfun/app", - "build": "turbo run build", - "start": "docker-compose --profile prod up -d --build postgres_prod && docker-compose --profile prod run --rm db-init-prod && docker-compose --profile prod up -d --build app", - "test": "docker-compose --profile test up -d postgres_test && docker-compose --profile test run --rm db-init-test && turbo run test --filter=@curatedotfun/api || true && docker-compose --profile test down -v", - "test:ci": "turbo run test --filter=@curatedotfun/api", - "lint": "turbo run lint", - "clean": "turbo run clean", - "fmt": "prettier --write '**/*.{js,jsx,ts,tsx,json}'", - "fmt:check": "prettier --check '**/*.{js,jsx,ts,tsx,json}'", - "db:generate": "pnpm --filter @curatedotfun/shared-db run db:generate", - "db:migrate": "pnpm --filter @curatedotfun/shared-db run db:migrate", - "db:studio": "pnpm --filter @curatedotfun/shared-db run db:studio", - "db:seed:dev": "pnpm --filter @curatedotfun/shared-db run seed:dev" - }, - "type": "module" + "name": "@examples/curatedotfun", + "private": true, + "scripts": { + "start": "bun run main.ts", + "dev": "bun run --watch main.ts", + "worker": "bun run workers/submission.worker.ts", + "worker:dev": "bun run --watch workers/submission.worker.ts", + "inspect": "bun run inspect-db.ts", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:studio": "drizzle-kit studio" + }, + "devDependencies": { + "@types/bun": "latest", + "better-sqlite3": "^12.2.0", + "drizzle-kit": "^0.31.4" + }, + "peerDependencies": { + "typescript": "^5.6.0" + }, + "dependencies": { + "@orpc/server": "^1.10.0", + "drizzle-orm": "^0.44.5", + "every-plugin": "0.4.4", + "hono": "^4.9.8" + } } diff --git a/plugins.ts b/plugins.ts new file mode 100644 index 00000000..a792c72c --- /dev/null +++ b/plugins.ts @@ -0,0 +1,34 @@ +import type GopherAIPlugin from "@curatedotfun/gopher-ai"; +import { createPluginRuntime } from "every-plugin/runtime"; + +// Module augmentation for type safety +declare module "every-plugin" { + interface RegisteredPlugins { + "@curatedotfun/gopher-ai": typeof GopherAIPlugin; + } +} + +// Create and export runtime +export const runtime = createPluginRuntime({ + registry: { + "@curatedotfun/gopher-ai": { + remoteUrl: "https://elliot-braem-159-curatedotfun-gopher-ai-every-plu-bf7adf22c-ze.zephyrcloud.app/remoteEntry.js", + } + }, + secrets: { + GOPHERAI_API_KEY: Bun.env.GOPHERAI_API_KEY || "your-masa-api-key-here" + } +}); + +// Initialize and export plugin +const gopherAi = await runtime.usePlugin( + "@curatedotfun/gopher-ai", + { + secrets: { apiKey: "{{GOPHERAI_API_KEY}}" }, + variables: { baseUrl: "https://data.gopher-ai.com/api/v1", timeout: 30000 } + } +); + +export const plugins = { + gopherAi +}; diff --git a/schemas/database.ts b/schemas/database.ts new file mode 100644 index 00000000..82160475 --- /dev/null +++ b/schemas/database.ts @@ -0,0 +1,75 @@ +import { sql } from "drizzle-orm"; +import { index, integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core"; + +// Main items table - stores all scraped social content +export const items = sqliteTable( + "items", + { + id: integer("id").primaryKey({ autoIncrement: true }), + externalId: text("external_id").notNull(), + platform: text("platform", { enum: ["twitter", "tiktok", "reddit", "web"] }).notNull(), + content: text("content").notNull(), + contentType: text("content_type"), + conversationId: text("conversation_id"), + originalAuthorUsername: text("original_author_username"), + originalAuthorId: text("original_author_id"), + curatorUsername: text("curator_username"), // Who mentioned/submitted this + createdAt: text("created_at"), // When content was posted + ingestedAt: text("ingested_at").default(sql`CURRENT_TIMESTAMP`), + url: text("url"), + rawData: text("raw_data", { mode: "json" }), // Full JSON from Source + }, + (table) => ([ + // Unique constraint on external_id to prevent duplicates + uniqueIndex("external_id_idx").on(table.externalId), + // Index for conversation lookups + index("conversation_idx").on(table.conversationId), + // Index for curator lookups + index("curator_idx").on(table.curatorUsername), + // Index for ingestion time queries + index("ingested_at_idx").on(table.ingestedAt), + ]) +); + +// Processing queue for items that need analysis (!submit, etc.) +export const processingQueue = sqliteTable( + "processing_queue", + { + id: integer("id").primaryKey({ autoIncrement: true }), + itemId: integer("item_id") + .notNull() + .references(() => items.id, { onDelete: "cascade" }), + submissionType: text("submission_type", { enum: ["submit"] }).notNull(), + status: text("status", { + enum: ["pending", "processing", "completed", "failed"] + }).default("pending"), + attempts: integer("attempts").default(0), + workerId: text("worker_id"), + errorMessage: text("error_message"), + createdAt: text("created_at").default(sql`CURRENT_TIMESTAMP`), + updatedAt: text("updated_at").default(sql`CURRENT_TIMESTAMP`), + }, + (table) => ([ + // Index for status queries + index("status_idx").on(table.status), + // Index for worker assignment + index("worker_idx").on(table.workerId), + ]) +); + +// Stream state persistence (replaces JSON file) +export const streamState = sqliteTable("stream_state", { + id: integer("id").primaryKey({ autoIncrement: true }), + mostRecentId: text("most_recent_id"), + oldestSeenId: text("oldest_seen_id"), + totalProcessed: integer("total_processed").default(0), + updatedAt: text("updated_at").default(sql`CURRENT_TIMESTAMP`), +}); + +// Export types for use in services +export type Item = typeof items.$inferSelect; +export type NewItem = typeof items.$inferInsert; +export type ProcessingTask = typeof processingQueue.$inferSelect; +export type NewProcessingTask = typeof processingQueue.$inferInsert; +export type StreamState = typeof streamState.$inferSelect; +export type NewStreamState = typeof streamState.$inferInsert; diff --git a/services/db.service.ts b/services/db.service.ts new file mode 100644 index 00000000..dc1e0804 --- /dev/null +++ b/services/db.service.ts @@ -0,0 +1,162 @@ +import { Database } from "bun:sqlite"; +import { and, asc, desc, eq } from "drizzle-orm"; +import { drizzle } from "drizzle-orm/bun-sqlite"; +import { migrate } from 'drizzle-orm/bun-sqlite/migrator'; +import { Effect } from "every-plugin/effect"; +import { items, type NewItem, type NewStreamState, processingQueue, streamState } from "../schemas/database"; + +export class DatabaseService extends Effect.Service()( + "DatabaseService", + { + effect: Effect.gen(function* () { + // Initialize SQLite database + const sqlite = new Database("./database.db"); + const db = drizzle(sqlite); + + // Run migrations (idempotent table creation) + yield* Effect.sync(() => migrate(db, { migrationsFolder: './drizzle' })); + + return { + insertItem: (item: NewItem) => + Effect.tryPromise({ + try: async () => { + const result = await db.insert(items).values({ + ...item, + rawData: item.rawData ? JSON.stringify(item.rawData) : null, + }).onConflictDoNothing().returning({ id: items.id }); + + return result[0]?.id || 0; // Return 0 if duplicate (no insert) + }, + catch: (error) => new Error(`Failed to insert item: ${error}`) + }), + + getItem: (id: number) => + Effect.tryPromise({ + try: async () => { + const result = await db.select().from(items).where(eq(items.id, id)).limit(1); + return result[0] || null; + }, + catch: (error) => new Error(`Failed to get item: ${error}`) + }), + + getItemByExternalId: (externalId: string) => + Effect.tryPromise({ + try: async () => { + const result = await db.select().from(items).where(eq(items.externalId, externalId)).limit(1); + return result[0] || null; + }, + catch: (error) => new Error(`Failed to get item by external ID: ${error}`) + }), + + enqueueProcessing: (itemId: number, submissionType: "submit") => + Effect.tryPromise({ + try: async () => { + await db.insert(processingQueue).values({ + itemId, + submissionType, + }).onConflictDoNothing(); + }, + catch: (error) => new Error(`Failed to enqueue processing: ${error}`) + }), + + getNextPendingTask: () => + Effect.tryPromise({ + try: async () => { + const result = await db.select() + .from(processingQueue) + .where(eq(processingQueue.status, "pending")) + .orderBy(asc(processingQueue.createdAt)) + .limit(1); + return result[0] || null; + }, + catch: (error) => new Error(`Failed to get next pending task: ${error}`) + }), + + markTaskProcessing: (taskId: number, workerId: string) => + Effect.tryPromise({ + try: async () => { + await db.update(processingQueue) + .set({ + status: "processing", + workerId, + updatedAt: new Date().toISOString() + }) + .where(and( + eq(processingQueue.id, taskId), + eq(processingQueue.status, "pending") + )); + return true; + }, + catch: (error) => new Error(`Failed to mark task processing: ${error}`) + }), + + markTaskCompleted: (taskId: number) => + Effect.tryPromise({ + try: async () => { + await db.update(processingQueue) + .set({ + status: "completed", + updatedAt: new Date().toISOString() + }) + .where(eq(processingQueue.id, taskId)); + }, + catch: (error) => new Error(`Failed to mark task completed: ${error}`) + }), + + markTaskFailed: (taskId: number, errorMessage: string) => + Effect.tryPromise({ + try: async () => { + const existing = await db.select({ attempts: processingQueue.attempts }) + .from(processingQueue) + .where(eq(processingQueue.id, taskId)) + .limit(1); + const currentAttempts = existing[0]?.attempts || 0; + + await db.update(processingQueue) + .set({ + status: "failed", + errorMessage, + attempts: currentAttempts + 1, + updatedAt: new Date().toISOString() + }) + .where(eq(processingQueue.id, taskId)); + }, + catch: (error) => new Error(`Failed to mark task failed: ${error}`) + }), + + saveStreamState: (state: Omit) => + Effect.tryPromise({ + try: async () => { + // Delete existing state and insert new one (simple approach) + await db.delete(streamState); + await db.insert(streamState).values(state); + }, + catch: (error) => new Error(`Failed to save stream state: ${error}`) + }), + + loadStreamState: () => + Effect.tryPromise({ + try: async () => { + const result = await db.select() + .from(streamState) + .orderBy(desc(streamState.updatedAt)) + .limit(1); + return result[0] || null; + }, + catch: (error) => new Error(`Failed to load stream state: ${error}`) + }), + + getRecentItems: (limit: number) => + Effect.tryPromise({ + try: async () => { + return await db.select() + .from(items) + .orderBy(desc(items.ingestedAt)) + .limit(limit); + }, + catch: (error) => new Error(`Failed to get recent items: ${error}`) + }), + }; + }) + } +) { } diff --git a/tsconfig.json b/tsconfig.json index ed925142..37235e78 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,27 +1,34 @@ { - "files": [], - "references": [ - // Remember to add reference here when adding a new app or package - { "path": "./apps/api" }, - { "path": "./apps/app" }, - { "path": "./packages/core-services" }, - { "path": "./packages/types" }, - { "path": "./packages/shared-db" }, - { "path": "./packages/shared-queue" }, - { "path": "./packages/utils" } - ], - "compilerOptions": { - "target": "es2022", - "module": "ESNext", - "moduleResolution": "bundler", - "lib": ["es2022", "dom"], // Broad libs for general compatibility (DOM for frontend) - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "noEmit": false, - "declaration": true, - "declarationMap": true, - "composite": true - } + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false, + + // Path aliases for workspace plugins + "paths": { + "@curatedotfun/gopher-ai": ["../../plugins/gopher-ai/src"] + } + } } diff --git a/workers/submission.worker.ts b/workers/submission.worker.ts new file mode 100644 index 00000000..d85f3084 --- /dev/null +++ b/workers/submission.worker.ts @@ -0,0 +1,287 @@ +#!/usr/bin/env bun + +import { Duration, Effect, Logger, LogLevel } from "every-plugin/effect"; +import type { GopherResult } from "../../../plugins/gopher-ai/src/contract"; +import { plugins } from "../plugins"; +import { DatabaseService } from "../services/db.service"; + +// Worker ID for tracking which worker is processing tasks +const WORKER_ID = `worker-${process.pid}-${Date.now()}`; + +// Content categorization types +interface CuratedContent { + originalPost: { + externalId: string; + content: string; + author: { username?: string; id?: string; displayName?: string } | null; + createdAt?: string; + url?: string; + } | null; + threadContent: Array<{ + externalId: string; + content: string; + author: { username?: string; id?: string; displayName?: string } | null; + createdAt?: string; + }>; + conversationalContext: Array<{ + externalId: string; + content: string; + author: { username?: string; id?: string; displayName?: string } | null; + createdAt?: string; + }>; + curatorNotes?: string; + hashtags: string[]; + curatorUsername: string; +} + +// Extract curator notes and hashtags from !submit command +const parseCuratorSubmission = (content: string) => { + const submitMatch = content.match(/!submit\s+(.+)/i); + const curatorNotes = submitMatch ? submitMatch[1]?.trim() : ""; + const hashtags = curatorNotes?.match(/#\w+/g) || []; + + return { curatorNotes, hashtags }; +}; + +// Categorize content based on authorship +const categorizeContent = ( + replies: GopherResult[], + originalAuthorUsername?: string +): { threadContent: GopherResult[]; conversationalContext: GopherResult[] } => { + const threadContent: GopherResult[] = []; + const conversationalContext: GopherResult[] = []; + + for (const reply of replies) { + // Access author_username via catchall since it's not in base schema + const replyAuthor = reply.author_username; + + if (replyAuthor === originalAuthorUsername) { + // This is additional content from the original author + threadContent.push(reply); + } else { + // This is conversational context from other users + conversationalContext.push(reply); + } + } + + return { threadContent, conversationalContext }; +}; + +// Perform structured analysis on curated content +const analyzeContent = (content: CuratedContent) => { + console.log(`šŸŽÆ Content Analysis Summary:`); + console.log(` Original Post: @${content.originalPost?.author?.username} - "${content.originalPost?.content.substring(0, 80)}..."`); + console.log(` Thread Posts: ${content.threadContent.length} additional posts from original author`); + console.log(` Community Replies: ${content.conversationalContext.length} replies from other users`); + console.log(` Curator: @${content.curatorUsername}`); + console.log(` Curator Notes: "${content.curatorNotes}"`); + console.log(` Hashtags: ${content.hashtags.join(", ")}`); + + // Here you could implement more sophisticated analysis: + // - Sentiment analysis on original content vs community responses + // - Topic extraction and categorization + // - Quality scoring based on engagement patterns + // - Content similarity analysis between curator notes and original content + + return { + summary: { + originalAuthor: content.originalPost?.author?.username, + curator: content.curatorUsername, + totalThreadPosts: content.threadContent.length + 1, // +1 for original + communityEngagement: content.conversationalContext.length, + categories: content.hashtags, + curatorAnalysis: content.curatorNotes + } + }; +}; + + +// Process a single submission task +const processSubmissionTask = (task: any) => + Effect.gen(function* () { + const db = yield* DatabaseService; + const { client } = plugins.gopherAi; + + console.log(`šŸ”„ Processing submission task ${task.id} for item ${task.itemId}`); + + // Get the item that contains the !submit + const item = yield* db.getItem(task.itemId); + + if (!item) { + yield* db.markTaskFailed(task.id, "Item not found"); + return; + } + + console.log(`šŸ“ Found !submit from @${item.originalAuthorUsername}: "${item.content.substring(0, 100)}..."`); + + // Parse curator submission + const { curatorNotes, hashtags } = parseCuratorSubmission(item.content); + console.log(`šŸ“‹ Curator notes: "${curatorNotes}"`); + console.log(`šŸ·ļø Hashtags: ${hashtags.join(", ")}`); + + // Initialize curated content structure + const curatedContent: CuratedContent = { + originalPost: null, + threadContent: [], + conversationalContext: [], + curatorNotes, + hashtags, + curatorUsername: item.originalAuthorUsername || 'unknown' + }; + + // If we have a conversation_id, fetch the original post and its replies + if (item.conversationId) { + console.log(`šŸ” Fetching original post for ID: ${item.conversationId}`); + + // First, get the original post being curated + const originalPostResult = yield* Effect.promise(() => + client.getById({ + id: item.conversationId!, + sourceType: 'twitter' as const + }) + ).pipe( + Effect.catchAll((error: unknown) => { + console.error(`Failed to fetch original post: ${error}`); + return Effect.succeed({ item: null }); + }) + ); + + if (originalPostResult.item) { + const originalPost: GopherResult = originalPostResult.item; + curatedContent.originalPost = { + externalId: originalPost.id, // Changed from externalId + content: originalPost.content, + author: { + username: originalPost.author_username, + id: originalPost.author_id, + displayName: originalPost.author_username + }, + createdAt: originalPost.created_at || originalPost.updated_at, + url: originalPost.tweet_url || `https://twitter.com/${originalPost.author_username}/status/${originalPost.id}` + }; + + console.log(`šŸ“ Original post: @${curatedContent.originalPost.author?.username}: "${curatedContent.originalPost.content.substring(0, 100)}..."`); + + // Now get all replies to understand the full conversation + console.log(`šŸ” Fetching replies for conversation ID: ${item.conversationId}`); + + const repliesResult = yield* Effect.promise(() => + client.getReplies({ + conversationId: item.conversationId!, + sourceType: 'twitter' as const, + maxResults: 50 + }) + ).pipe( + Effect.catchAll((error: unknown) => { + console.error(`Failed to fetch replies: ${error}`); + return Effect.succeed({ replies: [] }); + }) + ); + + console.log(`šŸ“„ Retrieved ${repliesResult.replies.length} replies`); + + // Categorize the replies + const { threadContent, conversationalContext } = categorizeContent( + repliesResult.replies, + curatedContent.originalPost.author?.username + ); + + curatedContent.threadContent = threadContent.map(reply => ({ + externalId: reply.id, + content: reply.content, + author: { + username: reply.author_username, + id: reply.author_id, + displayName: reply.author_username + }, + createdAt: reply.created_at || reply.updated_at + })); + + curatedContent.conversationalContext = conversationalContext.map(reply => ({ + externalId: reply.id, + content: reply.content, + author: { + username: reply.author_username, + id: reply.author_id, + displayName: reply.author_username + }, + createdAt: reply.created_at || reply.updated_at + })); + + // Perform analysis + const analysis = analyzeContent(curatedContent); + console.log(`✨ Analysis completed:`, analysis.summary); + + } else { + console.log(`āš ļø Could not fetch original post for ID: ${item.conversationId}`); + } + } else { + console.log(`āš ļø No conversation_id found, processing as standalone submission`); + } + + // Mark as completed + yield* db.markTaskCompleted(task.id); + console.log(`āœ… Completed submission task ${task.id}`); + }); + +// Main worker loop +const workerLoop = Effect.gen(function* () { + const db = yield* DatabaseService; + + console.log(`šŸš€ Starting submission worker ${WORKER_ID}`); + + // Continuous processing loop + yield* Effect.forever( + Effect.gen(function* () { + // Get next pending task + const task = yield* db.getNextPendingTask(); + + if (!task) { + // No tasks available, wait before checking again + yield* Effect.sleep(Duration.seconds(5)); + return; + } + + // Try to claim the task + const claimed = yield* db.markTaskProcessing(task.id, WORKER_ID); + + if (!claimed) { + // Another worker claimed it, continue + return; + } + + // Process the task with error handling + yield* processSubmissionTask(task).pipe( + Effect.catchAll((error: unknown) => + Effect.gen(function* () { + console.error(`āŒ Failed to process task ${task.id}:`, error); + yield* db.markTaskFailed(task.id, error instanceof Error ? error.message : String(error)); + }) + ) + ); + }) + ); +}); + +// Graceful shutdown handler +const setupShutdown = Effect.gen(function* () { + const shutdown = () => { + console.log(`\nšŸ›‘ Shutting down worker ${WORKER_ID}...`); + process.exit(0); + }; + + process.on('SIGINT', shutdown); + process.on('SIGTERM', shutdown); +}); + +// Main program +const program = Effect.gen(function* () { + yield* setupShutdown; + yield* workerLoop; +}).pipe( + Effect.provide(Logger.minimumLogLevel(LogLevel.Info)), + Effect.provide(DatabaseService.Default) +); + +// Run the worker +await Effect.runPromise(program);