From 327de93c5333efeff4b2e542774a2683b2cb84d4 Mon Sep 17 00:00:00 2001 From: Elliott de Launay Date: Thu, 14 May 2026 19:27:38 +0000 Subject: [PATCH] Merge upstream/main @ e921f9d21eb48dacf3d1523d892f34e296c27292 --- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/workflows/evals.yml | 74 - .github/workflows/update-contributors.yml | 67 - CHANGELOG.md | 10 - apps/cli/package.json | 6 +- ...session-id-resume-loads-correct-session.ts | 4 +- .../scripts/integration/lib/stream-harness.ts | 2 +- .../auth/__tests__/auth-commands.test.ts | 76 - apps/cli/src/commands/auth/index.ts | 2 - apps/cli/src/commands/auth/logout.ts | 27 - apps/cli/src/commands/auth/status.ts | 99 - apps/cli/src/commands/cli/list.ts | 33 +- apps/cli/src/commands/cli/run.ts | 10 +- apps/cli/src/commands/index.ts | 1 - apps/cli/src/index.ts | 28 +- apps/cli/src/lib/auth/index.ts | 1 - apps/cli/src/lib/auth/token.ts | 61 - .../lib/storage/__tests__/credentials.test.ts | 152 - apps/cli/src/lib/storage/credentials.ts | 72 - apps/cli/src/lib/storage/index.ts | 1 - apps/cli/src/lib/utils/onboarding.ts | 25 - apps/cli/src/types/constants.ts | 4 - .../onboarding/OnboardingScreen.tsx | 27 - .../cli/src/ui/components/onboarding/index.ts | 1 - apps/web-evals/.env | 1 - apps/web-evals/.gitignore | 8 - apps/web-evals/CHANGELOG.md | 3 - apps/web-evals/components.json | 21 - apps/web-evals/eslint.config.mjs | 17 - apps/web-evals/next-env.d.ts | 6 - apps/web-evals/next.config.ts | 7 - apps/web-evals/package.json | 63 - apps/web-evals/postcss.config.mjs | 5 - apps/web-evals/public/.gitkeep | 0 apps/web-evals/scripts/check-services.sh | 20 - .../src/actions/__tests__/killRun.spec.ts | 207 - apps/web-evals/src/actions/exercises.ts | 22 - apps/web-evals/src/actions/heartbeat.ts | 8 - apps/web-evals/src/actions/runners.ts | 8 - apps/web-evals/src/actions/runs.ts | 377 - apps/web-evals/src/actions/tasks.ts | 11 - .../app/api/runs/[id]/logs/[taskId]/route.ts | 74 - .../app/api/runs/[id]/logs/failed/route.ts | 147 - .../src/app/api/runs/[id]/stream/route.ts | 71 - apps/web-evals/src/app/favicon.ico | Bin 25931 -> 0 bytes apps/web-evals/src/app/globals.css | 141 - apps/web-evals/src/app/layout.tsx | 35 - apps/web-evals/src/app/page.tsx | 10 - apps/web-evals/src/app/runs/[id]/page.tsx | 14 - .../src/app/runs/[id]/run-status.tsx | 79 - apps/web-evals/src/app/runs/[id]/run.tsx | 1058 - .../src/app/runs/[id]/task-status.tsx | 20 - apps/web-evals/src/app/runs/new/new-run.tsx | 992 - apps/web-evals/src/app/runs/new/page.tsx | 9 - .../src/app/runs/new/settings-diff.tsx | 58 - apps/web-evals/src/components/home/run.tsx | 433 - apps/web-evals/src/components/home/runs.tsx | 1024 - .../src/components/layout/header.tsx | 7 - apps/web-evals/src/components/layout/logo.tsx | 54 - .../src/components/providers/index.ts | 2 - .../providers/react-query-provider.tsx | 8 - .../components/providers/theme-provider.tsx | 13 - .../src/components/ui/alert-dialog.tsx | 113 - apps/web-evals/src/components/ui/badge.tsx | 36 - apps/web-evals/src/components/ui/button.tsx | 51 - apps/web-evals/src/components/ui/checkbox.tsx | 27 - apps/web-evals/src/components/ui/command.tsx | 134 - apps/web-evals/src/components/ui/dialog.tsx | 110 - apps/web-evals/src/components/ui/drawer.tsx | 98 - .../src/components/ui/dropdown-menu.tsx | 171 - apps/web-evals/src/components/ui/form.tsx | 138 - apps/web-evals/src/components/ui/index.ts | 22 - apps/web-evals/src/components/ui/input.tsx | 22 - apps/web-evals/src/components/ui/label.tsx | 21 - .../src/components/ui/multi-select.tsx | 300 - apps/web-evals/src/components/ui/popover.tsx | 42 - .../src/components/ui/scroll-area.tsx | 51 - apps/web-evals/src/components/ui/select.tsx | 156 - .../web-evals/src/components/ui/separator.tsx | 28 - apps/web-evals/src/components/ui/slider.tsx | 56 - apps/web-evals/src/components/ui/sonner.tsx | 25 - apps/web-evals/src/components/ui/table.tsx | 75 - apps/web-evals/src/components/ui/tabs.tsx | 122 - apps/web-evals/src/components/ui/textarea.tsx | 19 - apps/web-evals/src/components/ui/tooltip.tsx | 47 - apps/web-evals/src/hooks/use-copy-run.ts | 28 - apps/web-evals/src/hooks/use-event-source.ts | 101 - .../src/hooks/use-fuzzy-model-search.ts | 37 - .../src/hooks/use-open-router-models.ts | 38 - apps/web-evals/src/hooks/use-run-status.ts | 110 - .../src/lib/__tests__/formatters.spec.ts | 30 - .../__tests__/normalize-create-run.spec.ts | 65 - apps/web-evals/src/lib/actions.ts | 19 - apps/web-evals/src/lib/formatters.ts | 59 - .../web-evals/src/lib/normalize-create-run.ts | 20 - apps/web-evals/src/lib/schemas.ts | 46 - .../lib/server/__tests__/sse-stream.spec.ts | 111 - apps/web-evals/src/lib/server/redis.ts | 13 - apps/web-evals/src/lib/server/sse-stream.ts | 59 - apps/web-evals/src/lib/utils.ts | 6 - apps/web-evals/tsconfig.json | 10 - apps/web-evals/turbo.json | 10 - apps/web-evals/vitest.config.ts | 8 - apps/web-roo-code/.env.example | 11 - apps/web-roo-code/next-sitemap.config.cjs | 11 - apps/web-roo-code/next.config.ts | 57 +- apps/web-roo-code/package.json | 4 +- apps/web-roo-code/src/actions/evals.ts | 29 - .../web-roo-code/src/app/blog/[slug]/page.tsx | 3 - apps/web-roo-code/src/app/blog/page.tsx | 3 - .../src/app/blog/page/[page]/page.tsx | 3 - apps/web-roo-code/src/app/cloud/page.tsx | 296 - apps/web-roo-code/src/app/cloud/team/page.tsx | 297 - apps/web-roo-code/src/app/enterprise/page.tsx | 559 - apps/web-roo-code/src/app/evals/evals.tsx | 149 - apps/web-roo-code/src/app/evals/page.tsx | 52 - apps/web-roo-code/src/app/evals/plot.tsx | 336 - apps/web-roo-code/src/app/evals/types.ts | 9 - apps/web-roo-code/src/app/extension/page.tsx | 84 - .../src/app/legal/cookies/page.tsx | 19 +- .../src/app/legal/subprocessors/page.tsx | 2 +- apps/web-roo-code/src/app/linear/page.tsx | 413 - apps/web-roo-code/src/app/page.tsx | 104 +- .../src/app/pr-fixer/content-a.tsx | 95 - apps/web-roo-code/src/app/pr-fixer/page.tsx | 67 - apps/web-roo-code/src/app/pricing/page.tsx | 395 - apps/web-roo-code/src/app/privacy/page.tsx | 8 +- apps/web-roo-code/src/app/provider/page.tsx | 263 - .../pricing/components/model-card.tsx | 190 - .../src/app/reviewer/content-b.ts | 93 - apps/web-roo-code/src/app/reviewer/content.ts | 93 - apps/web-roo-code/src/app/reviewer/page.tsx | 70 - .../src/app/shared/AgentLandingContent.tsx | 235 - .../src/app/shared/agent-page-content.ts | 75 - .../src/app/shared/getContentVariant.ts | 36 - apps/web-roo-code/src/app/slack/page.tsx | 401 - .../components/RoomoteAnnouncementBanner.tsx | 4 +- .../src/components/animated-text.tsx | 24 - .../src/components/blog/BlogAnalytics.tsx | 50 - .../src/components/blog/BlogContent.tsx | 286 +- .../src/components/blog/YouTubeModal.test.ts | 140 - .../src/components/blog/YouTubeModal.tsx | 171 - .../src/components/chromes/footer.tsx | 185 - .../src/components/chromes/nav-bar.tsx | 228 +- .../components/enterprise/contact-form.tsx | 291 - .../src/components/homepage/cta-section.tsx | 15 +- .../src/components/homepage/faq-section.tsx | 73 +- .../src/components/homepage/features.tsx | 5 +- .../homepage/option-overview-section.tsx | 8 +- .../components/homepage/pillars-section.tsx | 5 +- .../src/components/homepage/testimonials.tsx | 4 +- .../components/linear/linear-issue-demo.tsx | 442 - .../src/components/providers/providers.tsx | 9 +- .../components/slack/slack-thread-demo.tsx | 548 - ...ternal-influencers-not-topdown-mandates.md | 6 +- ...e-ai-spend-by-measuring-return-not-cost.md | 6 +- ...d-waiting-for-engineers-to-unblock-them.md | 6 +- ...gles-production-code-is-now-aigenerated.md | 2 +- ...prds-are-becoming-artifacts-of-the-past.md | 6 +- ...e-agents-like-employees-not-like-models.md | 2 +- ...ing-roo-code-extension-cloud-and-router.md | 2 +- .../src/lib/analytics/consent-manager.ts | 78 +- apps/web-roo-code/src/lib/blog/analytics.ts | 40 - apps/web-roo-code/src/lib/blog/index.ts | 1 - apps/web-roo-code/src/lib/constants.ts | 8 - apps/web-roo-code/src/lib/format-currency.ts | 14 - apps/web-roo-code/src/lib/format-duration.ts | 26 - apps/web-roo-code/src/lib/format-score.ts | 1 - apps/web-roo-code/src/lib/format-tokens.ts | 19 - apps/web-roo-code/src/lib/formatters.ts | 22 - apps/web-roo-code/src/lib/hooks/index.ts | 2 - .../src/lib/hooks/use-open-router-models.ts | 77 - apps/web-roo-code/src/lib/index.ts | 4 - apps/web-roo-code/src/lib/structured-data.ts | 10 +- apps/web-roo-code/src/lib/types/models.ts | 31 - knip.json | 6 +- package.json | 1 - packages/cloud/CHANGELOG.md | 3 - packages/cloud/eslint.config.mjs | 20 - packages/cloud/package.json | 30 - packages/cloud/src/CloudAPI.ts | 147 - packages/cloud/src/CloudService.ts | 502 - packages/cloud/src/CloudSettingsService.ts | 297 - packages/cloud/src/CloudShareService.ts | 61 - packages/cloud/src/RefreshTimer.ts | 154 - packages/cloud/src/StaticSettingsService.ts | 79 - packages/cloud/src/StaticTokenAuthService.ts | 101 - packages/cloud/src/TelemetryClient.ts | 290 - packages/cloud/src/WebAuthService.ts | 744 - packages/cloud/src/__mocks__/vscode.ts | 63 - .../__tests__/CloudAPI.creditBalance.spec.ts | 96 - .../cloud/src/__tests__/CloudService.test.ts | 645 - .../CloudSettingsService.parsing.test.ts | 167 - .../__tests__/CloudSettingsService.test.ts | 724 - .../src/__tests__/CloudShareService.test.ts | 318 - .../cloud/src/__tests__/RefreshTimer.test.ts | 210 - .../__tests__/StaticSettingsService.test.ts | 125 - .../__tests__/StaticTokenAuthService.spec.ts | 303 - .../src/__tests__/TelemetryClient.test.ts | 675 - .../src/__tests__/WebAuthService.spec.ts | 1267 - packages/cloud/src/config.ts | 6 - packages/cloud/src/errors.ts | 42 - packages/cloud/src/importVscode.ts | 44 - packages/cloud/src/index.ts | 6 - packages/cloud/src/retry-queue/RetryQueue.ts | 371 - .../retry-queue/__tests__/RetryQueue.test.ts | 698 - packages/cloud/src/retry-queue/index.ts | 2 - packages/cloud/src/retry-queue/types.ts | 36 - packages/cloud/src/utils.ts | 5 - packages/cloud/tsconfig.json | 9 - packages/cloud/vitest.config.ts | 26 - packages/evals/.docker/entrypoints/runner.sh | 10 - packages/evals/.docker/entrypoints/web.sh | 48 - .../scripts/postgres/create-databases.sh | 11 - packages/evals/.env.development | 3 - packages/evals/.env.test | 3 - packages/evals/.gitignore | 8 - packages/evals/ADDING-EVALS.md | 305 - packages/evals/ARCHITECTURE.md | 282 - packages/evals/CHANGELOG.md | 3 - packages/evals/Dockerfile.runner | 175 - packages/evals/Dockerfile.web | 64 - packages/evals/README.md | 148 - packages/evals/docker-compose.override.yml | 45 - packages/evals/docker-compose.yml | 87 - packages/evals/drizzle.config.ts | 10 - packages/evals/eslint.config.mjs | 4 - packages/evals/package.json | 55 - packages/evals/scripts/setup.sh | 348 - .../cli/__tests__/messageLogDeduper.test.ts | 35 - packages/evals/src/cli/index.ts | 55 - packages/evals/src/cli/messageLogDeduper.ts | 50 - packages/evals/src/cli/processTask.ts | 150 - packages/evals/src/cli/redis.ts | 63 - packages/evals/src/cli/runCi.ts | 30 - packages/evals/src/cli/runEvals.ts | 88 - packages/evals/src/cli/runTaskInCli.ts | 310 - packages/evals/src/cli/runTaskInVscode.ts | 327 - packages/evals/src/cli/runUnitTest.ts | 91 - packages/evals/src/cli/types.ts | 19 - packages/evals/src/cli/utils.ts | 251 - packages/evals/src/db/db.ts | 45 - packages/evals/src/db/index.ts | 9 - .../src/db/migrations/0000_young_trauma.sql | 54 - .../migrations/0001_add_timeout_to_runs.sql | 1 - .../migrations/0001_lowly_captain_flint.sql | 1 - .../migrations/0002_bouncy_blazing_skull.sql | 6 - .../db/migrations/0003_simple_retro_girl.sql | 1 - .../migrations/0004_sloppy_black_knight.sql | 3 - .../src/db/migrations/0005_strong_skrulls.sql | 12 - .../db/migrations/0006_worried_spectrum.sql | 1 - .../src/db/migrations/meta/0000_snapshot.json | 410 - .../src/db/migrations/meta/0001_snapshot.json | 417 - .../src/db/migrations/meta/0002_snapshot.json | 453 - .../src/db/migrations/meta/0003_snapshot.json | 459 - .../src/db/migrations/meta/0004_snapshot.json | 472 - .../src/db/migrations/meta/0005_snapshot.json | 472 - .../src/db/migrations/meta/0006_snapshot.json | 479 - .../src/db/migrations/meta/_journal.json | 55 - .../src/db/queries/__tests__/copyRun.spec.ts | 288 - .../src/db/queries/__tests__/runs.test.ts | 87 - packages/evals/src/db/queries/copyRun.ts | 183 - packages/evals/src/db/queries/errors.ts | 3 - packages/evals/src/db/queries/runs.ts | 200 - packages/evals/src/db/queries/taskMetrics.ts | 45 - packages/evals/src/db/queries/tasks.ts | 88 - packages/evals/src/db/queries/toolErrors.ts | 22 - packages/evals/src/db/schema.ts | 143 - packages/evals/src/exercises/index.ts | 25 - packages/evals/src/index.ts | 2 - packages/evals/tsconfig.json | 11 - packages/evals/vitest-global-setup.ts | 40 - packages/evals/vitest.config.ts | 10 - packages/ipc/src/ipc-client.ts | 2 +- packages/types/src/__tests__/cloud.test.ts | 440 - .../types/src/__tests__/telemetry.test.ts | 576 - packages/types/src/cloud.ts | 572 - packages/types/src/events.ts | 16 - packages/types/src/global-settings.ts | 78 +- packages/types/src/image-generation.ts | 19 +- packages/types/src/index.ts | 2 +- packages/types/src/mode.ts | 2 +- packages/types/src/organization.ts | 18 + packages/types/src/provider-settings.ts | 19 +- packages/types/src/providers/index.ts | 4 - packages/types/src/providers/roo.ts | 60 - packages/types/src/task.ts | 5 - packages/types/src/vscode-extension-host.ts | 74 +- packages/types/src/vscode.ts | 1 - pnpm-lock.yaml | 25675 ++++++++++------ src/__tests__/extension.spec.ts | 103 - .../nested-delegation-resume.spec.ts | 12 - src/activate/registerCommands.ts | 26 +- src/api/index.ts | 2 +- src/api/providers/__tests__/anthropic.spec.ts | 7 +- .../__tests__/bedrock-error-handling.spec.ts | 8 - src/api/providers/__tests__/bedrock.spec.ts | 153 +- src/api/providers/__tests__/gemini.spec.ts | 91 +- src/api/providers/__tests__/mistral.spec.ts | 8 - .../providers/__tests__/openai-native.spec.ts | 157 +- .../providers/__tests__/openrouter.spec.ts | 156 +- src/api/providers/__tests__/roo.spec.ts | 1033 - src/api/providers/__tests__/xai.spec.ts | 11 - src/api/providers/bedrock.ts | 12 +- .../fetchers/__tests__/modelCache.spec.ts | 13 +- .../providers/fetchers/__tests__/roo.spec.ts | 1020 - src/api/providers/fetchers/modelCache.ts | 32 +- src/api/providers/fetchers/roo.ts | 192 - src/api/providers/gemini.ts | 13 +- src/api/providers/index.ts | 1 - src/api/providers/mistral.ts | 13 +- src/api/providers/openai-codex.ts | 8 - src/api/providers/openai-native.ts | 8 - src/api/providers/openrouter.ts | 75 +- src/api/providers/poe.ts | 5 - src/api/providers/roo.ts | 433 - .../utils/__tests__/error-handler.spec.ts | 4 +- src/api/providers/utils/error-handler.ts | 2 +- src/api/providers/utils/image-generation.ts | 2 +- src/api/providers/xai.ts | 7 +- .../assistant-message/NativeToolCallParser.ts | 8 +- ...resentAssistantMessage-custom-tool.spec.ts | 14 - .../presentAssistantMessage-images.spec.ts | 17 - ...esentAssistantMessage-unknown-tool.spec.ts | 8 - .../presentAssistantMessage.ts | 31 +- .../checkpoints/__tests__/checkpoint.test.ts | 9 - src/core/checkpoints/index.ts | 6 - src/core/condense/__tests__/condense.spec.ts | 7 +- .../__tests__/foldedFileContext.spec.ts | 7 +- src/core/condense/__tests__/index.spec.ts | 54 - .../__tests__/rewind-after-condense.spec.ts | 8 +- src/core/condense/index.ts | 7 - src/core/config/ContextProxy.ts | 15 +- src/core/config/CustomModesManager.ts | 13 +- src/core/config/ProviderSettingsManager.ts | 231 +- .../config/__tests__/ContextProxy.spec.ts | 2 - .../__tests__/ProviderSettingsManager.spec.ts | 473 +- .../config/__tests__/importExport.spec.ts | 5 - src/core/config/importExport.ts | 2 - .../__tests__/context-management.spec.ts | 7 +- .../__tests__/truncation.spec.ts | 6 - src/core/context-management/index.ts | 6 +- .../__tests__/multi-search-replace.spec.ts | 8 +- src/core/prompts/__tests__/sections.spec.ts | 2 +- src/core/prompts/sections/rules.ts | 1 - src/core/task/Task.ts | 111 +- src/core/task/__tests__/Task.dispose.test.ts | 10 - .../task/__tests__/Task.persistence.spec.ts | 5 - src/core/task/__tests__/Task.spec.ts | 5 - .../Task.sticky-profile-race.spec.ts | 19 - src/core/task/__tests__/Task.throttle.test.ts | 10 - .../flushPendingToolResultsToHistory.spec.ts | 5 - .../task/__tests__/grace-retry-errors.spec.ts | 5 - .../task/__tests__/grounding-sources.test.ts | 29 - .../__tests__/reasoning-preservation.test.ts | 29 - .../__tests__/validateToolResultIds.spec.ts | 205 +- src/core/task/validateToolResultIds.ts | 39 +- src/core/tools/ApplyDiffTool.ts | 2 - src/core/tools/AttemptCompletionTool.ts | 3 - src/core/tools/ExecuteCommandTool.ts | 8 - src/core/tools/GenerateImageTool.ts | 18 +- .../__tests__/attemptCompletionTool.spec.ts | 14 - src/core/webview/ClineProvider.ts | 331 +- .../ClineProvider.apiHandlerRebuild.spec.ts | 17 - .../ClineProvider.flicker-free-cancel.spec.ts | 22 - .../ClineProvider.lockApiConfig.spec.ts | 32 - .../webview/__tests__/ClineProvider.spec.ts | 201 +- .../ClineProvider.sticky-mode.spec.ts | 32 - .../ClineProvider.sticky-profile.spec.ts | 32 - .../ClineProvider.taskHistory.spec.ts | 25 - .../__tests__/diagnosticsHandler.spec.ts | 1 + .../webview/__tests__/messageEnhancer.test.ts | 58 - .../telemetrySettingsTracking.spec.ts | 155 - .../webviewMessageHandler.cloudAuth.spec.ts | 78 - .../webviewMessageHandler.rooBalance.spec.ts | 37 - ...webviewMessageHandler.routerModels.spec.ts | 319 - .../__tests__/webviewMessageHandler.spec.ts | 16 - src/core/webview/messageEnhancer.ts | 18 +- src/core/webview/webviewMessageHandler.ts | 234 +- src/extension.ts | 99 +- src/extension/api.ts | 9 +- src/i18n/locales/ca/marketplace.json | 69 - src/i18n/locales/de/marketplace.json | 69 - src/i18n/locales/en/marketplace.json | 69 - src/i18n/locales/es/marketplace.json | 69 - src/i18n/locales/fr/marketplace.json | 69 - src/i18n/locales/hi/marketplace.json | 69 - src/i18n/locales/id/marketplace.json | 69 - src/i18n/locales/it/marketplace.json | 69 - src/i18n/locales/ja/marketplace.json | 69 - src/i18n/locales/ko/marketplace.json | 69 - src/i18n/locales/nl/marketplace.json | 69 - src/i18n/locales/pl/marketplace.json | 69 - src/i18n/locales/pt-BR/marketplace.json | 69 - src/i18n/locales/ru/marketplace.json | 69 - src/i18n/locales/tr/marketplace.json | 69 - src/i18n/locales/vi/marketplace.json | 69 - src/i18n/locales/zh-CN/marketplace.json | 69 - src/i18n/locales/zh-TW/marketplace.json | 69 - src/package.nls.ca.json | 1 - src/package.nls.de.json | 1 - src/package.nls.es.json | 1 - src/package.nls.fr.json | 1 - src/package.nls.hi.json | 1 - src/package.nls.id.json | 1 - src/package.nls.it.json | 1 - src/package.nls.ja.json | 1 - src/package.nls.json | 1 - src/package.nls.ko.json | 1 - src/package.nls.nl.json | 1 - src/package.nls.pl.json | 1 - src/package.nls.pt-BR.json | 1 - src/package.nls.ru.json | 1 - src/package.nls.tr.json | 1 - src/package.nls.vi.json | 1 - src/package.nls.zh-CN.json | 1 - src/package.nls.zh-TW.json | 1 - src/services/__tests__/zoo-code-auth.test.ts | 463 - .../__tests__/cache-manager.spec.ts | 9 - .../code-index/__tests__/manager.spec.ts | 13 +- .../code-index/__tests__/orchestrator.spec.ts | 9 - .../__tests__/service-factory.spec.ts | 9 - src/services/code-index/cache-manager.ts | 17 - .../embedders/__tests__/bedrock.spec.ts | 9 - .../embedders/__tests__/gemini.spec.ts | 9 - .../embedders/__tests__/mistral.spec.ts | 9 - .../embedders/__tests__/ollama.spec.ts | 9 - .../openai-compatible-rate-limit.spec.ts | 9 - .../__tests__/openai-compatible.spec.ts | 9 - .../embedders/__tests__/openai.spec.ts | 18 +- .../embedders/__tests__/openrouter.spec.ts | 10 - .../__tests__/vercel-ai-gateway.spec.ts | 9 - src/services/code-index/embedders/bedrock.ts | 17 - src/services/code-index/embedders/gemini.ts | 32 +- src/services/code-index/embedders/mistral.ts | 32 +- src/services/code-index/embedders/ollama.ts | 31 +- .../code-index/embedders/openai-compatible.ts | 64 +- src/services/code-index/embedders/openai.ts | 46 +- .../code-index/embedders/openrouter.ts | 74 +- .../code-index/embedders/vercel-ai-gateway.ts | 32 +- src/services/code-index/manager.ts | 12 - src/services/code-index/orchestrator.ts | 22 - .../processors/__tests__/file-watcher.spec.ts | 9 - .../processors/__tests__/parser.spec.ts | 9 - .../processors/__tests__/parser.vb.spec.ts | 9 - .../processors/__tests__/scanner.spec.ts | 9 - .../code-index/processors/file-watcher.ts | 28 - src/services/code-index/processors/parser.ts | 17 - src/services/code-index/processors/scanner.ts | 38 +- src/services/code-index/search-service.ts | 9 - src/services/code-index/service-factory.ts | 9 - src/services/command/built-in-commands.ts | 2 - src/services/marketplace/SimpleInstaller.ts | 2 +- .../__tests__/SimpleInstaller.spec.ts | 15 +- .../marketplace-setting-check.spec.ts | 19 +- src/services/mdm/MdmService.ts | 202 - src/services/mdm/__tests__/MdmService.spec.ts | 364 - .../__tests__/checkExistApiConfig.spec.ts | 7 - src/shared/api.ts | 1 - src/shared/checkExistApiConfig.ts | 2 +- src/shared/tools.ts | 2 +- src/utils/__tests__/tool-id.spec.ts | 8 +- src/utils/git.ts | 2 +- webview-ui/package.json | 1 - webview-ui/src/App.tsx | 49 +- webview-ui/src/__tests__/App.spec.tsx | 51 - .../src/__tests__/ErrorBoundary.spec.tsx | 7 - webview-ui/src/components/ErrorBoundary.tsx | 9 - webview-ui/src/components/chat/ChatView.tsx | 12 +- .../src/components/chat/ModeSelector.tsx | 21 +- .../ChatRow.rate-limit-wait.spec.tsx | 24 + .../__tests__/ChatView.keyboard-fix.spec.tsx | 36 +- .../ChatView.notification-sound.spec.tsx | 8 - .../ChatView.preserve-images.spec.tsx | 44 - .../chat/__tests__/ChatView.spec.tsx | 93 +- .../chat/__tests__/ModeSelector.spec.tsx | 24 +- .../components/common/DismissibleUpsell.tsx | 14 - .../src/components/common/TelemetryBanner.tsx | 54 - .../__tests__/DismissibleUpsell.spec.tsx | 42 +- .../marketplace/MarketplaceListView.tsx | 6 +- webview-ui/src/components/mcp/McpView.tsx | 19 - webview-ui/src/components/modes/ModesView.tsx | 18 - .../src/components/settings/ApiOptions.tsx | 6 +- .../src/components/settings/SettingsView.tsx | 21 +- .../components/settings/SkillsSettings.tsx | 26 +- .../src/components/settings/UISettings.tsx | 11 - .../ApiOptions.provider-filtering.spec.tsx | 2 +- .../settings/__tests__/ApiOptions.spec.tsx | 29 +- .../ImageGenerationSettings.spec.tsx | 10 - .../SettingsView.change-detection.spec.tsx | 1 - .../SettingsView.unsaved-changes.spec.tsx | 20 +- .../settings/utils/providerModelConfig.ts | 1 - .../hooks/__tests__/useSelectedModel.spec.ts | 22 +- .../components/ui/hooks/useRouterModels.ts | 2 +- .../components/ui/hooks/useSelectedModel.ts | 9 +- .../welcome/WelcomeViewProvider.tsx | 59 +- .../__tests__/WelcomeViewProvider.spec.tsx | 164 +- .../src/context/ExtensionStateContext.tsx | 71 +- ...tensionStateContext.roo-auth-gate.spec.tsx | 77 - .../__tests__/ExtensionStateContext.spec.tsx | 17 +- webview-ui/src/i18n/locales/ja/mcp.json | 1 - webview-ui/src/i18n/locales/ko/mcp.json | 1 - webview-ui/src/i18n/locales/zh-CN/mcp.json | 1 - .../src/utils/__tests__/validate.spec.ts | 1 - 504 files changed, 17549 insertions(+), 52494 deletions(-) delete mode 100644 .github/workflows/evals.yml delete mode 100644 .github/workflows/update-contributors.yml delete mode 100644 apps/cli/src/commands/auth/__tests__/auth-commands.test.ts delete mode 100644 apps/cli/src/commands/auth/index.ts delete mode 100644 apps/cli/src/commands/auth/logout.ts delete mode 100644 apps/cli/src/commands/auth/status.ts delete mode 100644 apps/cli/src/lib/auth/index.ts delete mode 100644 apps/cli/src/lib/auth/token.ts delete mode 100644 apps/cli/src/lib/storage/__tests__/credentials.test.ts delete mode 100644 apps/cli/src/lib/storage/credentials.ts delete mode 100644 apps/cli/src/lib/utils/onboarding.ts delete mode 100644 apps/cli/src/ui/components/onboarding/OnboardingScreen.tsx delete mode 100644 apps/cli/src/ui/components/onboarding/index.ts delete mode 100644 apps/web-evals/.env delete mode 100644 apps/web-evals/.gitignore delete mode 100644 apps/web-evals/CHANGELOG.md delete mode 100644 apps/web-evals/components.json delete mode 100644 apps/web-evals/eslint.config.mjs delete mode 100644 apps/web-evals/next-env.d.ts delete mode 100644 apps/web-evals/next.config.ts delete mode 100644 apps/web-evals/package.json delete mode 100644 apps/web-evals/postcss.config.mjs delete mode 100644 apps/web-evals/public/.gitkeep delete mode 100755 apps/web-evals/scripts/check-services.sh delete mode 100644 apps/web-evals/src/actions/__tests__/killRun.spec.ts delete mode 100644 apps/web-evals/src/actions/exercises.ts delete mode 100644 apps/web-evals/src/actions/heartbeat.ts delete mode 100644 apps/web-evals/src/actions/runners.ts delete mode 100644 apps/web-evals/src/actions/runs.ts delete mode 100644 apps/web-evals/src/actions/tasks.ts delete mode 100644 apps/web-evals/src/app/api/runs/[id]/logs/[taskId]/route.ts delete mode 100644 apps/web-evals/src/app/api/runs/[id]/logs/failed/route.ts delete mode 100644 apps/web-evals/src/app/api/runs/[id]/stream/route.ts delete mode 100644 apps/web-evals/src/app/favicon.ico delete mode 100644 apps/web-evals/src/app/globals.css delete mode 100644 apps/web-evals/src/app/layout.tsx delete mode 100644 apps/web-evals/src/app/page.tsx delete mode 100644 apps/web-evals/src/app/runs/[id]/page.tsx delete mode 100644 apps/web-evals/src/app/runs/[id]/run-status.tsx delete mode 100644 apps/web-evals/src/app/runs/[id]/run.tsx delete mode 100644 apps/web-evals/src/app/runs/[id]/task-status.tsx delete mode 100644 apps/web-evals/src/app/runs/new/new-run.tsx delete mode 100644 apps/web-evals/src/app/runs/new/page.tsx delete mode 100644 apps/web-evals/src/app/runs/new/settings-diff.tsx delete mode 100644 apps/web-evals/src/components/home/run.tsx delete mode 100644 apps/web-evals/src/components/home/runs.tsx delete mode 100644 apps/web-evals/src/components/layout/header.tsx delete mode 100644 apps/web-evals/src/components/layout/logo.tsx delete mode 100644 apps/web-evals/src/components/providers/index.ts delete mode 100644 apps/web-evals/src/components/providers/react-query-provider.tsx delete mode 100644 apps/web-evals/src/components/providers/theme-provider.tsx delete mode 100644 apps/web-evals/src/components/ui/alert-dialog.tsx delete mode 100644 apps/web-evals/src/components/ui/badge.tsx delete mode 100644 apps/web-evals/src/components/ui/button.tsx delete mode 100644 apps/web-evals/src/components/ui/checkbox.tsx delete mode 100644 apps/web-evals/src/components/ui/command.tsx delete mode 100644 apps/web-evals/src/components/ui/dialog.tsx delete mode 100644 apps/web-evals/src/components/ui/drawer.tsx delete mode 100644 apps/web-evals/src/components/ui/dropdown-menu.tsx delete mode 100644 apps/web-evals/src/components/ui/form.tsx delete mode 100644 apps/web-evals/src/components/ui/index.ts delete mode 100644 apps/web-evals/src/components/ui/input.tsx delete mode 100644 apps/web-evals/src/components/ui/label.tsx delete mode 100644 apps/web-evals/src/components/ui/multi-select.tsx delete mode 100644 apps/web-evals/src/components/ui/popover.tsx delete mode 100644 apps/web-evals/src/components/ui/scroll-area.tsx delete mode 100644 apps/web-evals/src/components/ui/select.tsx delete mode 100644 apps/web-evals/src/components/ui/separator.tsx delete mode 100644 apps/web-evals/src/components/ui/slider.tsx delete mode 100644 apps/web-evals/src/components/ui/sonner.tsx delete mode 100644 apps/web-evals/src/components/ui/table.tsx delete mode 100644 apps/web-evals/src/components/ui/tabs.tsx delete mode 100644 apps/web-evals/src/components/ui/textarea.tsx delete mode 100644 apps/web-evals/src/components/ui/tooltip.tsx delete mode 100644 apps/web-evals/src/hooks/use-copy-run.ts delete mode 100644 apps/web-evals/src/hooks/use-event-source.ts delete mode 100644 apps/web-evals/src/hooks/use-fuzzy-model-search.ts delete mode 100644 apps/web-evals/src/hooks/use-open-router-models.ts delete mode 100644 apps/web-evals/src/hooks/use-run-status.ts delete mode 100644 apps/web-evals/src/lib/__tests__/formatters.spec.ts delete mode 100644 apps/web-evals/src/lib/__tests__/normalize-create-run.spec.ts delete mode 100644 apps/web-evals/src/lib/actions.ts delete mode 100644 apps/web-evals/src/lib/formatters.ts delete mode 100644 apps/web-evals/src/lib/normalize-create-run.ts delete mode 100644 apps/web-evals/src/lib/schemas.ts delete mode 100644 apps/web-evals/src/lib/server/__tests__/sse-stream.spec.ts delete mode 100644 apps/web-evals/src/lib/server/redis.ts delete mode 100644 apps/web-evals/src/lib/server/sse-stream.ts delete mode 100644 apps/web-evals/src/lib/utils.ts delete mode 100644 apps/web-evals/tsconfig.json delete mode 100644 apps/web-evals/turbo.json delete mode 100644 apps/web-evals/vitest.config.ts delete mode 100644 apps/web-roo-code/.env.example delete mode 100644 apps/web-roo-code/src/actions/evals.ts delete mode 100644 apps/web-roo-code/src/app/cloud/page.tsx delete mode 100644 apps/web-roo-code/src/app/cloud/team/page.tsx delete mode 100644 apps/web-roo-code/src/app/enterprise/page.tsx delete mode 100644 apps/web-roo-code/src/app/evals/evals.tsx delete mode 100644 apps/web-roo-code/src/app/evals/page.tsx delete mode 100644 apps/web-roo-code/src/app/evals/plot.tsx delete mode 100644 apps/web-roo-code/src/app/evals/types.ts delete mode 100644 apps/web-roo-code/src/app/extension/page.tsx delete mode 100644 apps/web-roo-code/src/app/linear/page.tsx delete mode 100644 apps/web-roo-code/src/app/pr-fixer/content-a.tsx delete mode 100644 apps/web-roo-code/src/app/pr-fixer/page.tsx delete mode 100644 apps/web-roo-code/src/app/pricing/page.tsx delete mode 100644 apps/web-roo-code/src/app/provider/page.tsx delete mode 100644 apps/web-roo-code/src/app/provider/pricing/components/model-card.tsx delete mode 100644 apps/web-roo-code/src/app/reviewer/content-b.ts delete mode 100644 apps/web-roo-code/src/app/reviewer/content.ts delete mode 100644 apps/web-roo-code/src/app/reviewer/page.tsx delete mode 100644 apps/web-roo-code/src/app/shared/AgentLandingContent.tsx delete mode 100644 apps/web-roo-code/src/app/shared/agent-page-content.ts delete mode 100644 apps/web-roo-code/src/app/shared/getContentVariant.ts delete mode 100644 apps/web-roo-code/src/app/slack/page.tsx delete mode 100644 apps/web-roo-code/src/components/animated-text.tsx delete mode 100644 apps/web-roo-code/src/components/blog/BlogAnalytics.tsx delete mode 100644 apps/web-roo-code/src/components/blog/YouTubeModal.test.ts delete mode 100644 apps/web-roo-code/src/components/blog/YouTubeModal.tsx delete mode 100644 apps/web-roo-code/src/components/enterprise/contact-form.tsx delete mode 100644 apps/web-roo-code/src/components/linear/linear-issue-demo.tsx delete mode 100644 apps/web-roo-code/src/components/slack/slack-thread-demo.tsx delete mode 100644 apps/web-roo-code/src/lib/blog/analytics.ts delete mode 100644 apps/web-roo-code/src/lib/format-currency.ts delete mode 100644 apps/web-roo-code/src/lib/format-duration.ts delete mode 100644 apps/web-roo-code/src/lib/format-score.ts delete mode 100644 apps/web-roo-code/src/lib/format-tokens.ts delete mode 100644 apps/web-roo-code/src/lib/formatters.ts delete mode 100644 apps/web-roo-code/src/lib/hooks/index.ts delete mode 100644 apps/web-roo-code/src/lib/hooks/use-open-router-models.ts delete mode 100644 apps/web-roo-code/src/lib/index.ts delete mode 100644 apps/web-roo-code/src/lib/types/models.ts delete mode 100644 packages/cloud/CHANGELOG.md delete mode 100644 packages/cloud/eslint.config.mjs delete mode 100644 packages/cloud/package.json delete mode 100644 packages/cloud/src/CloudAPI.ts delete mode 100644 packages/cloud/src/CloudService.ts delete mode 100644 packages/cloud/src/CloudSettingsService.ts delete mode 100644 packages/cloud/src/CloudShareService.ts delete mode 100644 packages/cloud/src/RefreshTimer.ts delete mode 100644 packages/cloud/src/StaticSettingsService.ts delete mode 100644 packages/cloud/src/StaticTokenAuthService.ts delete mode 100644 packages/cloud/src/TelemetryClient.ts delete mode 100644 packages/cloud/src/WebAuthService.ts delete mode 100644 packages/cloud/src/__mocks__/vscode.ts delete mode 100644 packages/cloud/src/__tests__/CloudAPI.creditBalance.spec.ts delete mode 100644 packages/cloud/src/__tests__/CloudService.test.ts delete mode 100644 packages/cloud/src/__tests__/CloudSettingsService.parsing.test.ts delete mode 100644 packages/cloud/src/__tests__/CloudSettingsService.test.ts delete mode 100644 packages/cloud/src/__tests__/CloudShareService.test.ts delete mode 100644 packages/cloud/src/__tests__/RefreshTimer.test.ts delete mode 100644 packages/cloud/src/__tests__/StaticSettingsService.test.ts delete mode 100644 packages/cloud/src/__tests__/StaticTokenAuthService.spec.ts delete mode 100644 packages/cloud/src/__tests__/TelemetryClient.test.ts delete mode 100644 packages/cloud/src/__tests__/WebAuthService.spec.ts delete mode 100644 packages/cloud/src/config.ts delete mode 100644 packages/cloud/src/errors.ts delete mode 100644 packages/cloud/src/importVscode.ts delete mode 100644 packages/cloud/src/index.ts delete mode 100644 packages/cloud/src/retry-queue/RetryQueue.ts delete mode 100644 packages/cloud/src/retry-queue/__tests__/RetryQueue.test.ts delete mode 100644 packages/cloud/src/retry-queue/index.ts delete mode 100644 packages/cloud/src/retry-queue/types.ts delete mode 100644 packages/cloud/src/utils.ts delete mode 100644 packages/cloud/tsconfig.json delete mode 100644 packages/cloud/vitest.config.ts delete mode 100644 packages/evals/.docker/entrypoints/runner.sh delete mode 100644 packages/evals/.docker/entrypoints/web.sh delete mode 100755 packages/evals/.docker/scripts/postgres/create-databases.sh delete mode 100644 packages/evals/.env.development delete mode 100644 packages/evals/.env.test delete mode 100644 packages/evals/.gitignore delete mode 100644 packages/evals/ADDING-EVALS.md delete mode 100644 packages/evals/ARCHITECTURE.md delete mode 100644 packages/evals/CHANGELOG.md delete mode 100644 packages/evals/Dockerfile.runner delete mode 100644 packages/evals/Dockerfile.web delete mode 100644 packages/evals/README.md delete mode 100644 packages/evals/docker-compose.override.yml delete mode 100644 packages/evals/docker-compose.yml delete mode 100644 packages/evals/drizzle.config.ts delete mode 100644 packages/evals/eslint.config.mjs delete mode 100644 packages/evals/package.json delete mode 100755 packages/evals/scripts/setup.sh delete mode 100644 packages/evals/src/cli/__tests__/messageLogDeduper.test.ts delete mode 100644 packages/evals/src/cli/index.ts delete mode 100644 packages/evals/src/cli/messageLogDeduper.ts delete mode 100644 packages/evals/src/cli/processTask.ts delete mode 100644 packages/evals/src/cli/redis.ts delete mode 100644 packages/evals/src/cli/runCi.ts delete mode 100644 packages/evals/src/cli/runEvals.ts delete mode 100644 packages/evals/src/cli/runTaskInCli.ts delete mode 100644 packages/evals/src/cli/runTaskInVscode.ts delete mode 100644 packages/evals/src/cli/runUnitTest.ts delete mode 100644 packages/evals/src/cli/types.ts delete mode 100644 packages/evals/src/cli/utils.ts delete mode 100644 packages/evals/src/db/db.ts delete mode 100644 packages/evals/src/db/index.ts delete mode 100644 packages/evals/src/db/migrations/0000_young_trauma.sql delete mode 100644 packages/evals/src/db/migrations/0001_add_timeout_to_runs.sql delete mode 100644 packages/evals/src/db/migrations/0001_lowly_captain_flint.sql delete mode 100644 packages/evals/src/db/migrations/0002_bouncy_blazing_skull.sql delete mode 100644 packages/evals/src/db/migrations/0003_simple_retro_girl.sql delete mode 100644 packages/evals/src/db/migrations/0004_sloppy_black_knight.sql delete mode 100644 packages/evals/src/db/migrations/0005_strong_skrulls.sql delete mode 100644 packages/evals/src/db/migrations/0006_worried_spectrum.sql delete mode 100644 packages/evals/src/db/migrations/meta/0000_snapshot.json delete mode 100644 packages/evals/src/db/migrations/meta/0001_snapshot.json delete mode 100644 packages/evals/src/db/migrations/meta/0002_snapshot.json delete mode 100644 packages/evals/src/db/migrations/meta/0003_snapshot.json delete mode 100644 packages/evals/src/db/migrations/meta/0004_snapshot.json delete mode 100644 packages/evals/src/db/migrations/meta/0005_snapshot.json delete mode 100644 packages/evals/src/db/migrations/meta/0006_snapshot.json delete mode 100644 packages/evals/src/db/migrations/meta/_journal.json delete mode 100644 packages/evals/src/db/queries/__tests__/copyRun.spec.ts delete mode 100644 packages/evals/src/db/queries/__tests__/runs.test.ts delete mode 100644 packages/evals/src/db/queries/copyRun.ts delete mode 100644 packages/evals/src/db/queries/errors.ts delete mode 100644 packages/evals/src/db/queries/runs.ts delete mode 100644 packages/evals/src/db/queries/taskMetrics.ts delete mode 100644 packages/evals/src/db/queries/tasks.ts delete mode 100644 packages/evals/src/db/queries/toolErrors.ts delete mode 100644 packages/evals/src/db/schema.ts delete mode 100644 packages/evals/src/exercises/index.ts delete mode 100644 packages/evals/src/index.ts delete mode 100644 packages/evals/tsconfig.json delete mode 100644 packages/evals/vitest-global-setup.ts delete mode 100644 packages/evals/vitest.config.ts delete mode 100644 packages/types/src/__tests__/cloud.test.ts delete mode 100644 packages/types/src/__tests__/telemetry.test.ts delete mode 100644 packages/types/src/cloud.ts create mode 100644 packages/types/src/organization.ts delete mode 100644 packages/types/src/providers/roo.ts delete mode 100644 src/api/providers/__tests__/roo.spec.ts delete mode 100644 src/api/providers/fetchers/__tests__/roo.spec.ts delete mode 100644 src/api/providers/fetchers/roo.ts delete mode 100644 src/api/providers/roo.ts delete mode 100644 src/core/webview/__tests__/telemetrySettingsTracking.spec.ts delete mode 100644 src/core/webview/__tests__/webviewMessageHandler.cloudAuth.spec.ts delete mode 100644 src/core/webview/__tests__/webviewMessageHandler.rooBalance.spec.ts delete mode 100644 src/core/webview/__tests__/webviewMessageHandler.routerModels.spec.ts delete mode 100644 src/i18n/locales/ca/marketplace.json delete mode 100644 src/i18n/locales/de/marketplace.json delete mode 100644 src/i18n/locales/en/marketplace.json delete mode 100644 src/i18n/locales/es/marketplace.json delete mode 100644 src/i18n/locales/fr/marketplace.json delete mode 100644 src/i18n/locales/hi/marketplace.json delete mode 100644 src/i18n/locales/id/marketplace.json delete mode 100644 src/i18n/locales/it/marketplace.json delete mode 100644 src/i18n/locales/ja/marketplace.json delete mode 100644 src/i18n/locales/ko/marketplace.json delete mode 100644 src/i18n/locales/nl/marketplace.json delete mode 100644 src/i18n/locales/pl/marketplace.json delete mode 100644 src/i18n/locales/pt-BR/marketplace.json delete mode 100644 src/i18n/locales/ru/marketplace.json delete mode 100644 src/i18n/locales/tr/marketplace.json delete mode 100644 src/i18n/locales/vi/marketplace.json delete mode 100644 src/i18n/locales/zh-CN/marketplace.json delete mode 100644 src/i18n/locales/zh-TW/marketplace.json delete mode 100644 src/services/__tests__/zoo-code-auth.test.ts delete mode 100644 src/services/mdm/MdmService.ts delete mode 100644 src/services/mdm/__tests__/MdmService.spec.ts delete mode 100644 webview-ui/src/components/common/TelemetryBanner.tsx delete mode 100644 webview-ui/src/context/__tests__/ExtensionStateContext.roo-auth-gate.spec.tsx diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 78d650b43d..a4a1155bdf 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -64,7 +64,7 @@ body: attributes: value: | --- - Optional (for contributors): You can stop here if you're just proposing the improvement. + Optional: You can stop here if you're just proposing the improvement. - type: textarea id: acceptance-criteria diff --git a/.github/workflows/evals.yml b/.github/workflows/evals.yml deleted file mode 100644 index b99fd7659e..0000000000 --- a/.github/workflows/evals.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Evals - -on: - pull_request: - types: [labeled] - workflow_dispatch: - -env: - DOCKER_BUILDKIT: 1 - COMPOSE_DOCKER_CLI_BUILD: 1 - -jobs: - evals: - # Run if triggered manually or if PR has 'evals' label. - if: github.event_name == 'workflow_dispatch' || contains(github.event.label.name, 'evals') - runs-on: blacksmith-16vcpu-ubuntu-2404 - timeout-minutes: 45 - - defaults: - run: - working-directory: packages/evals - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Create environment - run: | - cat > .env.local << EOF - OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY || 'test-key-for-build' }} - EOF - - cat > .env.development << EOF - NODE_ENV=development - DATABASE_URL=postgresql://postgres:password@db:5432/evals_development - REDIS_URL=redis://redis:6379 - HOST_EXECUTION_METHOD=docker - EOF - - - name: Build image - uses: docker/build-push-action@v6 - with: - context: . - file: packages/evals/Dockerfile.runner - tags: evals-runner:latest - cache-from: type=gha - cache-to: type=gha,mode=max - push: false - load: true - - - name: Tag image - run: docker tag evals-runner:latest evals-runner - - - name: Start containers - run: | - docker compose up -d db redis - timeout 60 bash -c 'until docker compose exec -T db pg_isready -U postgres; do sleep 2; done' - timeout 60 bash -c 'until docker compose exec -T redis redis-cli ping | grep -q PONG; do sleep 2; done' - docker compose run --rm runner sh -c 'nc -z db 5432 && echo "✓ Runner -> Database connection successful"' - docker compose run --rm runner sh -c 'nc -z redis 6379 && echo "✓ Runner -> Redis connection successful"' - docker compose run --rm runner docker ps - - - name: Run database migrations - run: docker compose run --rm runner pnpm --filter @roo-code/evals db:migrate - - - name: Run evals - run: docker compose run --rm runner pnpm --filter @roo-code/evals cli --ci - - - name: Cleanup - if: always() - run: docker compose down -v --remove-orphans diff --git a/.github/workflows/update-contributors.yml b/.github/workflows/update-contributors.yml deleted file mode 100644 index 5709bdc10a..0000000000 --- a/.github/workflows/update-contributors.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: Update Contributors # Refresh contrib.rocks image cache - -on: - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - refresh-contrib-cache: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Bump cacheBust in all README files - run: | - set -euo pipefail - TS="$(date +%s)" - # Target only the root README.md and localized READMEs under locales/*/README.md - mapfile -t FILES < <(git ls-files README.md 'locales/*/README.md' || true) - - if [ "${#FILES[@]}" -eq 0 ]; then - echo "No target README files found." >&2 - exit 1 - fi - - UPDATED=0 - for f in "${FILES[@]}"; do - if grep -q 'cacheBust=' "$f"; then - # Use portable sed in GNU environment of ubuntu-latest - sed -i -E "s/cacheBust=[0-9]+/cacheBust=${TS}/g" "$f" - echo "Updated cacheBust in $f" - UPDATED=1 - else - echo "Warning: cacheBust parameter not found in $f" >&2 - fi - done - - if [ "$UPDATED" -eq 0 ]; then - echo "No files were updated. Ensure READMEs embed contrib.rocks with cacheBust param." >&2 - exit 1 - fi - - - name: Detect changes - id: changes - run: | - if git diff --quiet; then - echo "changed=false" >> $GITHUB_OUTPUT - else - echo "changed=true" >> $GITHUB_OUTPUT - fi - - - name: Create Pull Request - if: steps.changes.outputs.changed == 'true' - uses: peter-evans/create-pull-request@v7 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "docs: update contributors list [skip ci]" - committer: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" - branch: refresh-contrib-cache - delete-branch: true - title: "Refresh contrib.rocks image cache (all READMEs)" - body: | - Automated refresh of the contrib.rocks image cache by bumping the cacheBust parameter in README.md and locales/*/README.md. - base: main diff --git a/CHANGELOG.md b/CHANGELOG.md index e8803b75bc..c94d100613 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1292,7 +1292,6 @@ The entries below are preserved from the upstream Roo Code project history befor - Reposition Add Image button inside ChatTextArea (thanks @roomote!) - Bring back a way to temporarily and globally pause auto-approve without losing your toggle state (thanks @brunobergher!) - Makes text area buttons appear only when there's text (thanks @brunobergher!) -- CONTRIBUTING.md tweaks and issue template rewrite (thanks @hannesrudolph!) - Bump axios from 1.9.0 to 1.12.0 (thanks @dependabot!) ## [3.28.2] - 2025-09-14 @@ -1752,7 +1751,6 @@ The entries below are preserved from the upstream Roo Code project history befor - Fix Claude model detection by name for API protocol selection (thanks @daniel-lxs!) - Move marketplace icon from overflow menu to top navigation - Optional setting to prevent completion with open todos -- Added YouTube to website footer (thanks @thill2323!) ## [3.23.14] - 2025-07-17 @@ -2146,7 +2144,6 @@ The entries below are preserved from the upstream Roo Code project history befor - Fix bug with context condensing in Amazon Bedrock - Fix UTF-8 encoding in ExecaTerminalProcess (thanks @mr-ryan-james!) - Set sidebar name bugfix (thanks @chrarnoldus!) -- Fix link to CONTRIBUTING.md in feature request template (thanks @cannuri!) - Add task metadata to Unbound and improve caching logic (thanks @pugazhendhi-m!) ## [3.19.0] - 2025-05-29 @@ -3114,7 +3111,6 @@ The entries below are preserved from the upstream Roo Code project history befor - Ask and Architect modes can now edit markdown files - Custom modes can now be restricted to specific file patterns (for example, a technical writer who can only edit markdown files 👋) - Support for configuring the Bedrock provider with AWS Profiles -- New Roo Code community Discord at https://roocode.com/discord! ## [3.2.8] @@ -3154,8 +3150,6 @@ The entries below are preserved from the upstream Roo Code project history befor - Create specialized assistants for any workflow - Just type "Create a new mode for " or visit the Prompts tab in the top menu to get started -Join us at https://www.reddit.com/r/RooCode to share your custom modes and be part of our next chapter! - ## [3.1.7] - DeepSeek-R1 support (thanks @philipnext!) @@ -3203,12 +3197,8 @@ Join us at https://www.reddit.com/r/RooCode to share your custom modes and be pa ## [3.0.1] -- Fix the reddit link and a small visual glitch in the chat input - ## [3.0.0] -- This release adds chat modes! Now you can ask Roo Code questions about system architecture or the codebase without immediately jumping into writing code. You can even assign different API configuration profiles to each mode if you prefer to use different models for thinking vs coding. Would love feedback in the new Roo Code Reddit! https://www.reddit.com/r/RooCode - ## [2.2.46] - Only parse @-mentions in user input (not in files) diff --git a/apps/cli/package.json b/apps/cli/package.json index d61bceff61..3fbc271209 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -16,9 +16,9 @@ "test:coverage": "vitest run --coverage", "test:integration": "tsx scripts/integration/run.ts", "build": "tsup", - "build:extension": "pnpm --filter ./src bundle", - "dev": "ROO_AUTH_BASE_URL=https://app.roocode.com ROO_SDK_BASE_URL=https://cloud-api.roocode.com ROO_CODE_PROVIDER_URL=https://api.roocode.com/proxy tsx src/index.ts", - "dev:local": "ROO_AUTH_BASE_URL=http://localhost:3000 ROO_SDK_BASE_URL=http://localhost:3001 ROO_CODE_PROVIDER_URL=http://localhost:8080/proxy tsx src/index.ts", + "build:extension": "pnpm --filter zoo-code bundle", + "dev": "tsx src/index.ts", + "dev:local": "tsx src/index.ts", "clean": "rimraf dist .turbo" }, "dependencies": { diff --git a/apps/cli/scripts/integration/cases/create-with-session-id-resume-loads-correct-session.ts b/apps/cli/scripts/integration/cases/create-with-session-id-resume-loads-correct-session.ts index cbefd26525..ded1656e1e 100644 --- a/apps/cli/scripts/integration/cases/create-with-session-id-resume-loads-correct-session.ts +++ b/apps/cli/scripts/integration/cases/create-with-session-id-resume-loads-correct-session.ts @@ -88,7 +88,7 @@ async function createSessionWithCustomId( "dev", "--print", "--provider", - "roo", + "openrouter", "--output-format", "stream-json", "--workspace", @@ -148,7 +148,7 @@ async function resumeSessionAndSendMarker( "--print", "--stdin-prompt-stream", "--provider", - "roo", + "openrouter", "--output-format", "stream-json", "--workspace", diff --git a/apps/cli/scripts/integration/lib/stream-harness.ts b/apps/cli/scripts/integration/lib/stream-harness.ts index 73b756c7c3..2693103309 100644 --- a/apps/cli/scripts/integration/lib/stream-harness.ts +++ b/apps/cli/scripts/integration/lib/stream-harness.ts @@ -69,7 +69,7 @@ export async function runStreamCase(options: RunStreamCaseOptions): Promise ({ - loadToken: vi.fn(), - loadCredentials: vi.fn(), - getCredentialsPath: vi.fn(() => "/tmp/roo/cli-credentials.json"), - hasToken: vi.fn(), - clearToken: vi.fn(), -})) - -vi.mock("@/lib/auth/index.js", () => ({ - isTokenExpired: vi.fn(), - isTokenValid: vi.fn(), - getTokenExpirationDate: vi.fn(), -})) - -import { status } from "../status.js" -import { logout } from "../logout.js" -import { loadToken, loadCredentials, getCredentialsPath, hasToken, clearToken } from "@/lib/storage/index.js" -import { isTokenExpired, isTokenValid, getTokenExpirationDate } from "@/lib/auth/index.js" - -describe("auth commands", () => { - beforeEach(() => { - vi.clearAllMocks() - }) - - it("reports missing Roo auth tokens as normal for standard CLI usage", async () => { - vi.mocked(loadToken).mockResolvedValue(null) - const consoleLog = vi.spyOn(console, "log").mockImplementation(() => {}) - - const result = await status() - - expect(result).toEqual({ authenticated: false }) - expect(consoleLog.mock.calls.flat().join("\n")).toContain("Normal CLI usage does not require login.") - expect(consoleLog.mock.calls.flat().join("\n")).toContain("Roo Code Router has been removed") - }) - - it("reports optional Roo auth token details when available", async () => { - const token = "header.payload.signature" - const expiresAt = new Date("2026-05-01T00:00:00.000Z") - - vi.mocked(loadToken).mockResolvedValue(token) - vi.mocked(loadCredentials).mockResolvedValue({ token, createdAt: "2026-04-01T00:00:00.000Z" }) - vi.mocked(isTokenValid).mockReturnValue(true) - vi.mocked(isTokenExpired).mockReturnValue(false) - vi.mocked(getTokenExpirationDate).mockReturnValue(expiresAt) - vi.mocked(getCredentialsPath).mockReturnValue("/tmp/roo/cli-credentials.json") - const consoleLog = vi.spyOn(console, "log").mockImplementation(() => {}) - - const result = await status({ verbose: true }) - - expect(result.authenticated).toBe(true) - expect(consoleLog.mock.calls.flat().join("\n")).toContain("Legacy Roo auth token still stored") - expect(consoleLog.mock.calls.flat().join("\n")).toContain("/tmp/roo/cli-credentials.json") - }) - - it("removes stored Roo auth tokens", async () => { - vi.mocked(hasToken).mockResolvedValue(true) - const consoleLog = vi.spyOn(console, "log").mockImplementation(() => {}) - - const result = await logout() - - expect(result).toEqual({ success: true, wasLoggedIn: true }) - expect(clearToken).toHaveBeenCalledTimes(1) - expect(consoleLog.mock.calls.flat().join("\n")).toContain("Removed stored legacy Roo auth token") - }) - - it("treats missing Roo auth tokens as already logged out", async () => { - vi.mocked(hasToken).mockResolvedValue(false) - const consoleLog = vi.spyOn(console, "log").mockImplementation(() => {}) - - const result = await logout() - - expect(result).toEqual({ success: true, wasLoggedIn: false }) - expect(clearToken).not.toHaveBeenCalled() - expect(consoleLog.mock.calls.flat().join("\n")).toContain("No legacy Roo auth token stored.") - }) -}) diff --git a/apps/cli/src/commands/auth/index.ts b/apps/cli/src/commands/auth/index.ts deleted file mode 100644 index 9c499fbd3f..0000000000 --- a/apps/cli/src/commands/auth/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./logout.js" -export * from "./status.js" diff --git a/apps/cli/src/commands/auth/logout.ts b/apps/cli/src/commands/auth/logout.ts deleted file mode 100644 index 8eaa7c37b7..0000000000 --- a/apps/cli/src/commands/auth/logout.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { clearToken, hasToken, getCredentialsPath } from "@/lib/storage/index.js" - -export interface LogoutOptions { - verbose?: boolean -} - -export interface LogoutResult { - success: boolean - wasLoggedIn: boolean -} - -export async function logout({ verbose = false }: LogoutOptions = {}): Promise { - const wasLoggedIn = await hasToken() - - if (!wasLoggedIn) { - console.log("No legacy Roo auth token stored.") - return { success: true, wasLoggedIn: false } - } - - if (verbose) { - console.log(`[Auth] Removing credentials from ${getCredentialsPath()}`) - } - - await clearToken() - console.log("✓ Removed stored legacy Roo auth token") - return { success: true, wasLoggedIn: true } -} diff --git a/apps/cli/src/commands/auth/status.ts b/apps/cli/src/commands/auth/status.ts deleted file mode 100644 index d1a8df4eb7..0000000000 --- a/apps/cli/src/commands/auth/status.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { loadToken, loadCredentials, getCredentialsPath } from "@/lib/storage/index.js" -import { isTokenExpired, isTokenValid, getTokenExpirationDate } from "@/lib/auth/index.js" - -export interface StatusOptions { - verbose?: boolean -} - -export interface StatusResult { - authenticated: boolean - expired?: boolean - expiringSoon?: boolean - userId?: string - orgId?: string | null - expiresAt?: Date - createdAt?: Date -} - -export async function status(options: StatusOptions = {}): Promise { - const { verbose = false } = options - - const token = await loadToken() - - if (!token) { - console.log("No legacy Roo auth token stored.") - console.log("") - console.log("Normal CLI usage does not require login.") - console.log("Roo Code Router has been removed, so no legacy Roo sign-in is required.") - return { authenticated: false } - } - - const expiresAt = getTokenExpirationDate(token) - const expired = !isTokenValid(token) - const expiringSoon = isTokenExpired(token, 24 * 60 * 60) && !expired - - const credentials = await loadCredentials() - const createdAt = credentials?.createdAt ? new Date(credentials.createdAt) : undefined - - if (expired) { - console.log("Stored legacy Roo auth token expired.") - console.log("") - console.log("Standard CLI usage still works without login.") - console.log("Roo Code Router has been removed, so you can safely ignore or delete this token.") - - return { - authenticated: false, - expired: true, - expiresAt: expiresAt ?? undefined, - } - } - - if (expiringSoon) { - console.log("⚠ Legacy Roo auth token expires soon; use `roo auth logout` if you want to clean it up.") - } else { - console.log("✓ Legacy Roo auth token still stored") - } - - if (expiresAt) { - const remaining = getTimeRemaining(expiresAt) - console.log(` Expires: ${formatDate(expiresAt)} (${remaining})`) - } - - if (createdAt && verbose) { - console.log(` Created: ${formatDate(createdAt)}`) - } - - if (verbose) { - console.log(` Credentials: ${getCredentialsPath()}`) - } - - return { - authenticated: true, - expired: false, - expiringSoon, - expiresAt: expiresAt ?? undefined, - createdAt, - } -} - -function formatDate(date: Date): string { - return date.toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" }) -} - -function getTimeRemaining(date: Date): string { - const now = new Date() - const diff = date.getTime() - now.getTime() - - if (diff <= 0) { - return "expired" - } - - const days = Math.floor(diff / (1000 * 60 * 60 * 24)) - const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) - - if (days > 0) { - return `${days} day${days === 1 ? "" : "s"}` - } - - return `${hours} hour${hours === 1 ? "" : "s"}` -} diff --git a/apps/cli/src/commands/cli/list.ts b/apps/cli/src/commands/cli/list.ts index 3a7e99170f..1489a5feb9 100644 --- a/apps/cli/src/commands/cli/list.ts +++ b/apps/cli/src/commands/cli/list.ts @@ -6,7 +6,7 @@ import pWaitFor from "p-wait-for" import type { TaskSessionEntry } from "@roo-code/core/cli" import type { Command, ModelRecord, WebviewMessage } from "@roo-code/types" -import { getProviderDefaultModelId } from "@roo-code/types" +import { openRouterDefaultModelId } from "@roo-code/types" import { ExtensionHost, type ExtensionHostOptions } from "@/agent/index.js" import { readWorkspaceTaskSessions } from "@/lib/task-history/index.js" @@ -112,7 +112,7 @@ async function createListHost(options: BaseListOptions, hostOptions: ListHostOpt reasoningEffort: undefined, user: null, provider: "openrouter", - model: getProviderDefaultModelId("openrouter"), + model: openRouterDefaultModelId, apiKey, workspacePath, extensionPath, @@ -144,7 +144,7 @@ async function createListHost(options: BaseListOptions, hostOptions: ListHostOpt */ function requestFromExtension( host: ExtensionHost, - request: WebviewMessage, + requestType: WebviewMessage["type"], extract: (message: Record) => T | undefined, ): Promise { return new Promise((resolve, reject) => { @@ -187,17 +187,17 @@ function requestFromExtension( const timeoutId = setTimeout(() => { finish(() => - reject(new Error(`Timed out waiting for ${request.type} response after ${REQUEST_TIMEOUT_MS}ms`)), + reject(new Error(`Timed out waiting for ${requestType} response after ${REQUEST_TIMEOUT_MS}ms`)), ) }, REQUEST_TIMEOUT_MS) host.on("extensionWebviewMessage", onMessage) - host.sendToExtension(request) + host.sendToExtension({ type: requestType }) }) } function requestCommands(host: ExtensionHost): Promise { - return requestFromExtension(host, { type: "requestCommands" }, (message) => { + return requestFromExtension(host, "requestCommands", (message) => { if (message.type !== "commands") { return undefined } @@ -206,7 +206,7 @@ function requestCommands(host: ExtensionHost): Promise { } function requestModes(host: ExtensionHost): Promise { - return requestFromExtension(host, { type: "requestModes" }, (message) => { + return requestFromExtension(host, "requestModes", (message) => { if (message.type !== "modes") { return undefined } @@ -215,18 +215,15 @@ function requestModes(host: ExtensionHost): Promise { } function requestOpenRouterModels(host: ExtensionHost): Promise { - return requestFromExtension( - host, - { type: "requestRouterModels", values: { provider: "openrouter" } }, - (message) => { - if (message.type !== "routerModels") { - return undefined - } + return requestFromExtension(host, "requestRouterModels", (message) => { + if (message.type !== "routerModels") { + return undefined + } - const routerModels = isRecord(message.routerModels) ? message.routerModels : undefined - return isRecord(routerModels?.openrouter) ? (routerModels.openrouter as ModelRecord) : {} - }, - ) + const routerModels = isRecord(message.routerModels) ? message.routerModels : {} + const openRouterModels = routerModels.openrouter + return isRecord(openRouterModels) ? (openRouterModels as ModelRecord) : {} + }) } async function withHostAndSignalHandlers( diff --git a/apps/cli/src/commands/cli/run.ts b/apps/cli/src/commands/cli/run.ts index ae263c5573..0dcd3f82f5 100644 --- a/apps/cli/src/commands/cli/run.ts +++ b/apps/cli/src/commands/cli/run.ts @@ -22,7 +22,6 @@ import { JsonEventEmitter } from "@/agent/json-event-emitter.js" import { loadSettings } from "@/lib/storage/index.js" import { readWorkspaceTaskSessions, resolveWorkspaceResumeSessionId } from "@/lib/task-history/index.js" import { getEnvVarName, getApiKeyFromEnv } from "@/lib/utils/provider.js" -import { runOnboarding } from "@/lib/utils/onboarding.js" import { validateTerminalShellPath } from "@/lib/utils/shell.js" import { getDefaultExtensionPath } from "@/lib/utils/extension.js" import { isValidSessionId } from "@/lib/utils/session-id.js" @@ -150,7 +149,6 @@ export async function run(promptArg: string | undefined, flagOptions: FlagOption const isTuiSupported = process.stdin.isTTY && process.stdout.isTTY const isTuiEnabled = !flagOptions.print && isTuiSupported - const isOnboardingEnabled = isTuiEnabled && !flagOptions.provider && !settings.provider // Determine effective values: CLI flags > settings file > DEFAULT_FLAGS. const effectiveMode = flagOptions.mode || settings.mode || DEFAULT_FLAGS.mode @@ -231,12 +229,6 @@ export async function run(promptArg: string | undefined, flagOptions: FlagOption terminalShell, } - if (isOnboardingEnabled) { - if (!settings.onboardingProviderChoice) { - await runOnboarding() - } - } - // Validations // TODO: Validate the API key for the chosen provider. // TODO: Validate the model for the chosen provider. @@ -245,7 +237,7 @@ export async function run(promptArg: string | undefined, flagOptions: FlagOption if (!extensionHostOptions.apiKey) { console.error(`[CLI] Error: No API key provided. Use --api-key or set the appropriate environment variable.`) - console.error(`For ${extensionHostOptions.provider}, set ${getEnvVarName(extensionHostOptions.provider)}`) + console.error(`[CLI] For ${extensionHostOptions.provider}, set ${getEnvVarName(extensionHostOptions.provider)}`) process.exit(1) } diff --git a/apps/cli/src/commands/index.ts b/apps/cli/src/commands/index.ts index 717a7040ef..54fb955464 100644 --- a/apps/cli/src/commands/index.ts +++ b/apps/cli/src/commands/index.ts @@ -1,2 +1 @@ -export * from "./auth/index.js" export * from "./cli/index.js" diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts index f4d123f218..79a4a72475 100644 --- a/apps/cli/src/index.ts +++ b/apps/cli/src/index.ts @@ -2,7 +2,7 @@ import { Command } from "commander" import { DEFAULT_FLAGS } from "@/types/constants.js" import { VERSION } from "@/lib/utils/version.js" -import { run, logout, status, listCommands, listModes, listModels, listSessions, upgrade } from "@/commands/index.js" +import { run, listCommands, listModes, listModels, listSessions, upgrade } from "@/commands/index.js" const program = new Command() @@ -35,7 +35,7 @@ program .option("-d, --debug", "Enable debug output (includes detailed debug information)", false) .option("-a, --require-approval", "Require manual approval for actions", false) .option("-k, --api-key ", "API key for the LLM provider") - .option("--provider ", "API provider (anthropic, openai-native, gemini, openrouter, etc.)") + .option("--provider ", "API provider (anthropic, openai, openrouter, etc.)") .option("-m, --model ", "Model to use", DEFAULT_FLAGS.model) .option("--mode ", "Mode to start in (code, architect, ask, debug, etc.)", DEFAULT_FLAGS.mode) .option("--terminal-shell ", "Absolute path to shell executable for inline terminal commands") @@ -69,7 +69,7 @@ const applyListOptions = (command: Command) => command .option("-w, --workspace ", "Workspace directory path (defaults to current working directory)") .option("-e, --extension ", "Path to the extension bundle directory") - .option("-k, --api-key ", "OpenRouter API key (falls back to OPENROUTER_API_KEY)") + .option("-k, --api-key ", "API key for the LLM provider") .option("--format ", 'Output format: "json" (default) or "text"', "json") .option("-d, --debug", "Enable debug output", false) @@ -107,7 +107,7 @@ applyListOptions(listCommand.command("modes").description("List available modes" }, ) -applyListOptions(listCommand.command("models").description("List available OpenRouter models")).action( +applyListOptions(listCommand.command("models").description("List available models")).action( async (options: Parameters[0]) => { await runListAction(() => listModels(options)) }, @@ -126,24 +126,4 @@ program await runUpgradeAction(() => upgrade()) }) -const authCommand = program.command("auth").description("Inspect or remove legacy Roo auth tokens") - -authCommand - .command("logout") - .description("Remove a stored legacy Roo auth token") - .option("-v, --verbose", "Enable verbose output", false) - .action(async (options: { verbose: boolean }) => { - const result = await logout({ verbose: options.verbose }) - process.exit(result.success ? 0 : 1) - }) - -authCommand - .command("status") - .description("Show whether a legacy Roo auth token is still stored") - .option("-v, --verbose", "Enable verbose output", false) - .action(async (options: { verbose: boolean }) => { - await status({ verbose: options.verbose }) - process.exit(0) - }) - program.parse() diff --git a/apps/cli/src/lib/auth/index.ts b/apps/cli/src/lib/auth/index.ts deleted file mode 100644 index ec1a459835..0000000000 --- a/apps/cli/src/lib/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./token.js" diff --git a/apps/cli/src/lib/auth/token.ts b/apps/cli/src/lib/auth/token.ts deleted file mode 100644 index 34365223a4..0000000000 --- a/apps/cli/src/lib/auth/token.ts +++ /dev/null @@ -1,61 +0,0 @@ -export interface DecodedToken { - iss: string - sub: string - exp: number - iat: number - nbf: number - v: number - r?: { - u?: string - o?: string - t: string - } -} - -function decodeToken(token: string): DecodedToken | null { - try { - const parts = token.split(".") - - if (parts.length !== 3) { - return null - } - - const payload = parts[1] - - if (!payload) { - return null - } - - const padded = payload + "=".repeat((4 - (payload.length % 4)) % 4) - const decoded = Buffer.from(padded, "base64url").toString("utf-8") - return JSON.parse(decoded) as DecodedToken - } catch { - return null - } -} - -export function isTokenExpired(token: string, bufferSeconds = 24 * 60 * 60): boolean { - const decoded = decodeToken(token) - - if (!decoded?.exp) { - return true - } - - const expiresAt = decoded.exp - const bufferTime = Math.floor(Date.now() / 1000) + bufferSeconds - return expiresAt < bufferTime -} - -export function isTokenValid(token: string): boolean { - return !isTokenExpired(token, 0) -} - -export function getTokenExpirationDate(token: string): Date | null { - const decoded = decodeToken(token) - - if (!decoded?.exp) { - return null - } - - return new Date(decoded.exp * 1000) -} diff --git a/apps/cli/src/lib/storage/__tests__/credentials.test.ts b/apps/cli/src/lib/storage/__tests__/credentials.test.ts deleted file mode 100644 index 574b1b6bf4..0000000000 --- a/apps/cli/src/lib/storage/__tests__/credentials.test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import fs from "fs/promises" -import path from "path" - -// Use vi.hoisted to make the test directory available to the mock -// This must return the path synchronously since CREDENTIALS_FILE is computed at import time -const { getTestConfigDir } = vi.hoisted(() => { - // eslint-disable-next-line @typescript-eslint/no-require-imports - const os = require("os") - // eslint-disable-next-line @typescript-eslint/no-require-imports - const path = require("path") - const testRunId = Date.now().toString() - const testConfigDir = path.join(os.tmpdir(), `roo-cli-test-${testRunId}`) - return { getTestConfigDir: () => testConfigDir } -}) - -vi.mock("../config-dir.js", () => ({ - getConfigDir: getTestConfigDir, -})) - -// Import after mocking -import { saveToken, loadToken, loadCredentials, clearToken, hasToken, getCredentialsPath } from "../credentials.js" - -// Re-derive the test config dir for use in tests (must match the hoisted one) -const actualTestConfigDir = getTestConfigDir() - -describe("Token Storage", () => { - const expectedCredentialsFile = path.join(actualTestConfigDir, "cli-credentials.json") - - beforeEach(async () => { - // Clear test directory before each test - await fs.rm(actualTestConfigDir, { recursive: true, force: true }) - }) - - afterAll(async () => { - // Clean up test directory - await fs.rm(actualTestConfigDir, { recursive: true, force: true }) - }) - - describe("getCredentialsPath", () => { - it("should return the correct credentials file path", () => { - expect(getCredentialsPath()).toBe(expectedCredentialsFile) - }) - }) - - describe("saveToken", () => { - it("should save token to disk", async () => { - const token = "test-token-123" - await saveToken(token) - - const savedData = await fs.readFile(expectedCredentialsFile, "utf-8") - const credentials = JSON.parse(savedData) - - expect(credentials.token).toBe(token) - expect(credentials.createdAt).toBeDefined() - }) - - it("should save token with user info", async () => { - const token = "test-token-456" - await saveToken(token, { userId: "user_123", orgId: "org_456" }) - - const savedData = await fs.readFile(expectedCredentialsFile, "utf-8") - const credentials = JSON.parse(savedData) - - expect(credentials.token).toBe(token) - expect(credentials.userId).toBe("user_123") - expect(credentials.orgId).toBe("org_456") - }) - - it("should create config directory if it doesn't exist", async () => { - const token = "test-token-789" - await saveToken(token) - - const dirStats = await fs.stat(actualTestConfigDir) - expect(dirStats.isDirectory()).toBe(true) - }) - - // Unix file permissions don't apply on Windows - skip this test - it.skipIf(process.platform === "win32")("should set restrictive file permissions", async () => { - const token = "test-token-perms" - await saveToken(token) - - const stats = await fs.stat(expectedCredentialsFile) - // Check that only owner has read/write (mode 0o600) - const mode = stats.mode & 0o777 - expect(mode).toBe(0o600) - }) - }) - - describe("loadToken", () => { - it("should load saved token", async () => { - const token = "test-token-abc" - await saveToken(token) - - const loaded = await loadToken() - expect(loaded).toBe(token) - }) - - it("should return null if no token exists", async () => { - const loaded = await loadToken() - expect(loaded).toBeNull() - }) - }) - - describe("loadCredentials", () => { - it("should load full credentials", async () => { - const token = "test-token-def" - await saveToken(token, { userId: "user_789" }) - - const credentials = await loadCredentials() - - expect(credentials).not.toBeNull() - expect(credentials?.token).toBe(token) - expect(credentials?.userId).toBe("user_789") - expect(credentials?.createdAt).toBeDefined() - }) - - it("should return null if no credentials exist", async () => { - const credentials = await loadCredentials() - expect(credentials).toBeNull() - }) - }) - - describe("clearToken", () => { - it("should remove saved token", async () => { - const token = "test-token-ghi" - await saveToken(token) - - await clearToken() - - const loaded = await loadToken() - expect(loaded).toBeNull() - }) - - it("should not throw if no token exists", async () => { - await expect(clearToken()).resolves.not.toThrow() - }) - }) - - describe("hasToken", () => { - it("should return true if token exists", async () => { - await saveToken("test-token-jkl") - - const exists = await hasToken() - expect(exists).toBe(true) - }) - - it("should return false if no token exists", async () => { - const exists = await hasToken() - expect(exists).toBe(false) - }) - }) -}) diff --git a/apps/cli/src/lib/storage/credentials.ts b/apps/cli/src/lib/storage/credentials.ts deleted file mode 100644 index b687111c16..0000000000 --- a/apps/cli/src/lib/storage/credentials.ts +++ /dev/null @@ -1,72 +0,0 @@ -import fs from "fs/promises" -import path from "path" - -import { getConfigDir } from "./index.js" - -const CREDENTIALS_FILE = path.join(getConfigDir(), "cli-credentials.json") - -export interface Credentials { - token: string - createdAt: string - userId?: string - orgId?: string -} - -export async function saveToken(token: string, options?: { userId?: string; orgId?: string }): Promise { - await fs.mkdir(getConfigDir(), { recursive: true }) - - const credentials: Credentials = { - token, - createdAt: new Date().toISOString(), - userId: options?.userId, - orgId: options?.orgId, - } - - await fs.writeFile(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), { - mode: 0o600, // Read/write for owner only - }) -} - -export async function loadToken(): Promise { - try { - const data = await fs.readFile(CREDENTIALS_FILE, "utf-8") - const credentials: Credentials = JSON.parse(data) - return credentials.token - } catch (error) { - if ((error as NodeJS.ErrnoException).code === "ENOENT") { - return null - } - throw error - } -} - -export async function loadCredentials(): Promise { - try { - const data = await fs.readFile(CREDENTIALS_FILE, "utf-8") - return JSON.parse(data) as Credentials - } catch (error) { - if ((error as NodeJS.ErrnoException).code === "ENOENT") { - return null - } - throw error - } -} - -export async function clearToken(): Promise { - try { - await fs.unlink(CREDENTIALS_FILE) - } catch (error) { - if ((error as NodeJS.ErrnoException).code !== "ENOENT") { - throw error - } - } -} - -export async function hasToken(): Promise { - const token = await loadToken() - return token !== null -} - -export function getCredentialsPath(): string { - return CREDENTIALS_FILE -} diff --git a/apps/cli/src/lib/storage/index.ts b/apps/cli/src/lib/storage/index.ts index 53424472c2..8924637643 100644 --- a/apps/cli/src/lib/storage/index.ts +++ b/apps/cli/src/lib/storage/index.ts @@ -1,4 +1,3 @@ export * from "./config-dir.js" export * from "./settings.js" -export * from "./credentials.js" export * from "./ephemeral.js" diff --git a/apps/cli/src/lib/utils/onboarding.ts b/apps/cli/src/lib/utils/onboarding.ts deleted file mode 100644 index dd26ef240c..0000000000 --- a/apps/cli/src/lib/utils/onboarding.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { createElement } from "react" - -import { type OnboardingResult, OnboardingProviderChoice } from "@/types/index.js" -import { saveSettings } from "@/lib/storage/index.js" - -export async function runOnboarding(): Promise { - const { render } = await import("ink") - const { OnboardingScreen } = await import("../../ui/components/onboarding/index.js") - - return new Promise((resolve) => { - const onSelect = async (choice: OnboardingProviderChoice) => { - await saveSettings({ onboardingProviderChoice: choice }) - - app.unmount() - - console.log("") - console.log("Using the standard login-free provider path.") - console.log("Set your API key via --api-key or environment variable.") - console.log("") - resolve({ choice: OnboardingProviderChoice.Byok, skipped: false }) - } - - const app = render(createElement(OnboardingScreen, { onSelect })) - }) -} diff --git a/apps/cli/src/types/constants.ts b/apps/cli/src/types/constants.ts index 555d73a037..9d50e2338f 100644 --- a/apps/cli/src/types/constants.ts +++ b/apps/cli/src/types/constants.ts @@ -23,7 +23,3 @@ export const ASCII_ROO = ` _,' ___ \\,\\ / \\\\ // \\\\ ,/' \`\\_,` - -export const AUTH_BASE_URL = process.env.ROO_AUTH_BASE_URL ?? "https://app.roocode.com" - -export const SDK_BASE_URL = process.env.ROO_SDK_BASE_URL ?? "https://cloud-api.roocode.com" diff --git a/apps/cli/src/ui/components/onboarding/OnboardingScreen.tsx b/apps/cli/src/ui/components/onboarding/OnboardingScreen.tsx deleted file mode 100644 index f22b2098df..0000000000 --- a/apps/cli/src/ui/components/onboarding/OnboardingScreen.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Box, Text } from "ink" -import { Select } from "@inkjs/ui" - -import { OnboardingProviderChoice, ASCII_ROO } from "@/types/index.js" - -export interface OnboardingScreenProps { - onSelect: (choice: OnboardingProviderChoice) => void -} - -export function OnboardingScreen({ onSelect }: OnboardingScreenProps) { - return ( - - - {ASCII_ROO} - - - Welcome! Roo Code works without login. Choose how you want to connect to an LLM provider. - - - - {importedSettings && Object.keys(importedSettings.apiConfigs).length > 0 && ( -
- - {configSelections.map((selection, index) => ( -
- - toggleConfigPopover(selection.id, open) - }> - - - - - - - - No config found. - - {Object.keys( - importedSettings.apiConfigs, - ).map((configName) => ( - - updateConfigSelection( - selection.id, - configName, - ) - }> - {configName} - {configName === - importedSettings.currentApiConfigName && ( - - (default) - - )} - - - ))} - - - - - - {index === configSelections.length - 1 ? ( - - ) : ( - - )} -
- ))} -
- )} - - {settings && ( - - )} - - ) : ( - <> -
- {modelSelections.map((selection, index) => ( -
- toggleModelPopover(selection.id, open)}> - - - - - - - - No model found. - - {models?.map(({ id, name }) => ( - - updateModelSelection( - selection.id, - id, - ) - }> - {name} - - - ))} - - - - - - {index === modelSelections.length - 1 ? ( - - ) : ( - - )} -
- ))} -
- - )} - - - - )} - /> - - ( - - Exercises -
- { - setValue("suite", value as "full" | "partial") - localStorage.setItem("evals-suite", value) - if (value === "full") { - setSelectedExercises([]) - setValue("exercises", []) - localStorage.removeItem("evals-exercises") - } - }}> - - All - Some - - - {suite === "partial" && languages.length > 0 && ( -
- {languages.map((lang) => ( - - ))} -
- )} -
- {suite === "partial" && ( - ({ value: path, label: path })) || []} - value={selectedExercises} - onValueChange={(value) => { - setSelectedExercises(value) - setValue("exercises", value) - localStorage.setItem("evals-exercises", JSON.stringify(value)) - }} - placeholder="Select" - variant="inverted" - maxCount={4} - /> - )} - -
- )} - /> - - {/* Concurrency, Timeout, and Iterations in a 3-column row */} -
- ( - - Concurrency - -
- { - field.onChange(value[0]) - localStorage.setItem("evals-concurrency", String(value[0])) - }} - /> -
{field.value}
-
-
- -
- )} - /> - - ( - - Timeout (Minutes) - -
- { - field.onChange(value[0]) - localStorage.setItem("evals-timeout", String(value[0])) - }} - /> -
{field.value}
-
-
- -
- )} - /> - - ( - - Iterations - -
- { - field.onChange(value[0]) - }} - /> -
{field.value}
-
-
- -
- )} - /> -
- - {/* Terminal timeouts in a 2-column row */} -
- -
- - - - - - -

- Maximum time in seconds to wait for terminal command execution to complete - before timing out. This applies to commands run via the execute_command - tool. -

-
-
-
-
- { - if (value !== undefined) { - setCommandExecutionTimeout(value) - localStorage.setItem("evals-command-execution-timeout", String(value)) - } - }} - /> -
{commandExecutionTimeout}
-
-
- - -
- - - - - - -

- Maximum time in seconds to wait for shell integration to initialize when - opening a new terminal. -

-
-
-
-
- { - if (value !== undefined) { - setTerminalShellIntegrationTimeout(value) - localStorage.setItem("evals-shell-integration-timeout", String(value)) - } - }} - /> -
{terminalShellIntegrationTimeout}
-
-
-
- - {/* Execution Method */} - ( - - Execution Method - { - const newExecutionMethod = value as ExecutionMethod - setExecutionMethod(newExecutionMethod) - setValue("executionMethod", newExecutionMethod) - }}> - - - - VSCode - - - - CLI - - - - - - )} - /> - - ( - - Description / Notes - -