diff --git a/config/scripts/ci-shard-timings.json b/config/scripts/ci-shard-timings.json index 556ddf47f51..4855ce70581 100644 --- a/config/scripts/ci-shard-timings.json +++ b/config/scripts/ci-shard-timings.json @@ -5383,7 +5383,6 @@ "src/main/runtime/rpc/methods/orchestration-worker-release-incarnation-fallback.test.ts": 3771, "src/main/runtime/rpc/methods/orchestration-worker-start-mode-selection.test.ts": 3346, "src/main/runtime/rpc/methods/orchestration-worker-start-mode.test.ts": 722, - "src/main/runtime/rpc/methods/orchestration-worker-start-receipt-wording.test.ts": 656, "src/main/runtime/rpc/methods/orchestration-worker-start-registered-agent.test.ts": 1079, "src/main/runtime/rpc/methods/orchestration-worker-support-unknown.test.ts": 839, "src/main/runtime/rpc/methods/orchestration/cli-runtime-boundary.test.ts": 3319, @@ -12650,7 +12649,6 @@ "src/shared/project-identity-succession.test.ts": 47, "src/shared/promise-settlement-waiters.test.ts": 179, "src/shared/protocol-compat.test.ts": 121, - "src/shared/protocol-version-published-capabilities.test.ts": 121, "src/shared/pty-delivery-diagnostics.test.ts": 64, "src/shared/pty-liveness-verdict.test.ts": 33, "src/shared/pty-owner-backend.test.ts": 45, diff --git a/config/scripts/vitest-directory-frame-patch.test.mjs b/config/scripts/vitest-directory-frame-patch.test.mjs deleted file mode 100644 index e2009ff14b2..00000000000 --- a/config/scripts/vitest-directory-frame-patch.test.mjs +++ /dev/null @@ -1,17 +0,0 @@ -import { readdirSync, readFileSync } from 'node:fs' -import { createRequire } from 'node:module' -import { dirname, join } from 'node:path' -import { expect, it } from 'vitest' - -// Bun names builtins `native:L:C`; Vitest resolved that against the repo root, read the `native/` -// directory as a source map and crashed the run (EISDIR), hiding the real failure. The patch -// reads source maps only from files; an upgrade that drops it fails here. -it('reads stack-frame source maps only from files', () => { - const vitestRoot = dirname(createRequire(import.meta.url).resolve('vitest/package.json')) - const chunks = join(vitestRoot, 'dist', 'chunks') - const cliApi = readdirSync(chunks).find((name) => /^cli-api\..+\.js$/.test(name)) - expect(cliApi).toBeDefined() - expect(readFileSync(join(chunks, String(cliApi)), 'utf8')).toContain( - 'existsSync(file) && statSync(file).isFile()' - ) -}) diff --git a/src/main/ipc/desktop-browser-bridge-wiring.test.ts b/src/main/ipc/desktop-browser-bridge-wiring.test.ts index 5c2897190f1..5228af24928 100644 --- a/src/main/ipc/desktop-browser-bridge-wiring.test.ts +++ b/src/main/ipc/desktop-browser-bridge-wiring.test.ts @@ -40,13 +40,6 @@ vi.mock('../../shared/runtime-environments', async (importOriginal) => ({ })) import { listDesktopBrowserBridgeCandidates } from './desktop-browser-bridge-wiring' -import en from '../../renderer/src/i18n/locales/en.json' -import { - DESKTOP_BROWSER_BRIDGE_ROUTING_OPT_OUT_LABEL, - DESKTOP_BROWSER_BRIDGE_ROUTING_SETTING_LABEL, - DESKTOP_BROWSER_BRIDGE_SETTING_LABEL, - DESKTOP_BROWSER_BRIDGE_UNAVAILABLE_MESSAGE -} from '../../shared/desktop-browser-bridge-protocol' const host = (id: string, extra: Partial = {}): SshTarget => ({ id, @@ -93,22 +86,3 @@ describe('which managed hosts may attach the desktop browser bridge', () => { expect(listDesktopBrowserBridgeCandidates('/user-data', connected)).toEqual([]) }) }) - -// #31421: with the switch on, an unrouted host was told only to turn that switch on. -describe('the error a host gets while no desktop is attached', () => { - it('names the routing setting as the desktop UI labels it', () => { - const copy = en.settings.browser.sshWorkspaceRouting - expect(DESKTOP_BROWSER_BRIDGE_ROUTING_SETTING_LABEL).toBe( - `Settings › ${en.auto.components.settings.Settings.c46215ea03} › ${copy.rowTitle}` - ) - expect(`${DESKTOP_BROWSER_BRIDGE_ROUTING_OPT_OUT_LABEL}:`).toBe(copy.disabledHosts) - for (const label of [ - DESKTOP_BROWSER_BRIDGE_SETTING_LABEL, - DESKTOP_BROWSER_BRIDGE_ROUTING_SETTING_LABEL, - DESKTOP_BROWSER_BRIDGE_ROUTING_OPT_OUT_LABEL, - copy.optionHost - ]) { - expect(DESKTOP_BROWSER_BRIDGE_UNAVAILABLE_MESSAGE).toContain(label) - } - }) -}) diff --git a/src/main/runtime/orchestration/agent-facing-parity.test.ts b/src/main/runtime/orchestration/agent-facing-parity.test.ts index 97e02a6e49a..fa39e506607 100644 --- a/src/main/runtime/orchestration/agent-facing-parity.test.ts +++ b/src/main/runtime/orchestration/agent-facing-parity.test.ts @@ -1,6 +1,4 @@ -/** Chat and terminal agents must receive equivalent preambles, pointers and guides, apart from address and chat wording. */ -import { readdirSync, readFileSync } from 'node:fs' -import { join } from 'node:path' +/** Chat and terminal agents must receive equivalent preambles and pointers, apart from address and chat wording. */ import { afterAll, afterEach, describe, expect, it, vi } from 'vitest' import { getAppEnvironment, @@ -20,11 +18,9 @@ import { OrchestrationDb } from './db' import { formatMessagePointer } from './formatter' import { OrchestrationStructuredMailboxPointerDelivery } from './structured-mailbox-pointer-delivery' import { - buildDispatchPreamble, CHAT_REDISPATCH_PARAGRAPH as CHAT_REDISPATCH, TERMINAL_REDISPATCH_PARAGRAPH as TERMINAL_REDISPATCH } from './preamble' -import { ORCA_SESSION_ID_AS_ADDRESS } from '../../../shared/orca-session-id-wording-test-fixture' const sent = vi.hoisted((): { preambles: string[] } => ({ preambles: [] })) vi.mock('../rpc/methods/orchestration-structured-worker-session', () => ({ @@ -191,50 +187,3 @@ describe('a chat agent and a terminal agent see the same text but for how each i } ) }) - -describe('agent-read text about an Orca session ID', () => { - const guideDir = join(process.cwd(), 'skill-guides') - const guide = [ - join(guideDir, 'orchestration.md'), - ...readdirSync(join(guideDir, 'orchestration', 'references')).map((name) => - join(guideDir, 'orchestration', 'references', name) - ) - ] - // Refusals an agent reads: the string literals of the files that word them. - const refusalSources = [ - 'orchestration/orchestration-party.ts', - 'rpc/orchestration-session-caller.ts', - 'rpc/methods/orchestration/messaging/session-recipient.ts', - 'rpc/methods/orchestration/caller-show.ts' - ].flatMap( - (file) => - readFileSync(join(process.cwd(), 'src', 'main', 'runtime', file), 'utf8').match( - /'(?:[^'\\\n]|\\.)*'|`(?:[^`\\]|\\.)*`/g - ) ?? [] - ) - - it.each([ - ['the guide and its references', () => guide.map((file) => readFileSync(file, 'utf8'))], - [ - 'the preamble, for every pairing of kinds', - () => - [CHAT_ADDRESS, 'term_coord'].flatMap((coordinatorHandle) => - [CHAT_ADDRESS, TERMINAL_HANDLE].map((workerHandle) => - buildDispatchPreamble({ - taskId: 'task_1', - dispatchId: 'ctx_1', - taskSpec: 'do it', - coordinatorHandle, - workerHandle, - heartbeatIntervalMinutes: 5 - }) - ) - ) - ], - ['the refusals that name a session', () => refusalSources] - ])('never calls it an address in %s', (_where, texts) => { - for (const text of texts()) { - expect(text).not.toMatch(ORCA_SESSION_ID_AS_ADDRESS) - } - }) -}) diff --git a/src/main/runtime/rpc/methods/orchestration-worker-start-receipt-wording.test.ts b/src/main/runtime/rpc/methods/orchestration-worker-start-receipt-wording.test.ts deleted file mode 100644 index 14888b3ab5b..00000000000 --- a/src/main/runtime/rpc/methods/orchestration-worker-start-receipt-wording.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -/** Pin full fallback sentences and orchestration vocabulary; substring or mocked-CLI assertions missed corrupted wording. */ - -import { describe, expect, it } from 'vitest' -import { - decideWorkerStartMode, - downgradeWorkerStartModeForHost, - type WorkerStartModeReceipt -} from './orchestration-worker-start-mode' - -const STRUCTURED_PREFERENCE = { - experimentalNativeChat: true -} as const - -function structuredReceipt(): WorkerStartModeReceipt { - const receipt = decideWorkerStartMode({ - params: { agent: 'claude' }, - settings: STRUCTURED_PREFERENCE - }) - expect(receipt.mode).toBe('structured') - return receipt -} - -function downgradeSentence(why: string): string { - return `Your default is a structured chat session, but ${why}; started a terminal agent worker instead.` -} - -describe('worker-start mode receipt wording', () => { - it('states the settings default when the user has no structured preference', () => { - expect(decideWorkerStartMode({ params: { agent: 'claude' }, settings: null })).toEqual({ - mode: 'terminal', - preferred: 'terminal', - reason: 'user_default', - detail: 'Started a terminal agent worker, the default for new agent tabs in your settings.' - }) - }) - - it('states the settings default when the launch is structured', () => { - expect(structuredReceipt()).toEqual({ - mode: 'structured', - preferred: 'structured', - reason: 'user_default', - detail: - 'Started a structured chat session worker, the default for new agent tabs in your settings.' - }) - }) - - it.each([ - [ - 'remote execution host', - { agent: 'claude', on: 'server-1' }, - 'remote_execution_host', - 'this worker runs on a remote execution host' - ], - [ - 'reused terminal', - { agent: 'claude', terminal: 'term_1' }, - 'reused_terminal', - '--terminal reuses a running terminal agent' - ], - [ - 'agent with no structured session', - { agent: 'gemini' }, - 'agent_without_structured_session', - 'this agent has no structured session' - ] - ])('names the %s downgrade in full', (_label, params, reason, why) => { - expect(decideWorkerStartMode({ params, settings: STRUCTURED_PREFERENCE })).toEqual({ - mode: 'terminal', - preferred: 'structured', - reason, - detail: downgradeSentence(why) - }) - }) - - it.each([ - [ - 'an unanswered host', - null, - 'structured_support_unknown', - 'the execution host has not established structured session support' - ], - [ - 'a host refusal with no reason', - { supported: false }, - 'structured_unsupported_on_host', - 'the execution host cannot create one here' - ], - [ - 'a WSL workspace', - { supported: false, reason: 'wsl' as const }, - 'wsl_execution_runtime', - 'this workspace runs under WSL' - ], - [ - 'a remote workspace', - { supported: false, reason: 'remote' as const }, - 'remote_execution_host', - 'this worker runs on a remote execution host' - ] - ])('names %s in full', (_label, support, reason, why) => { - expect(downgradeWorkerStartModeForHost(structuredReceipt(), support)).toEqual({ - mode: 'terminal', - preferred: 'structured', - reason, - detail: downgradeSentence(why) - }) - }) - - it('leaves a settled terminal receipt untouched', () => { - const terminal = decideWorkerStartMode({ params: { agent: 'claude' }, settings: null }) - expect(downgradeWorkerStartModeForHost(terminal, null)).toEqual(terminal) - }) -}) diff --git a/src/main/runtime/rpc/schemas.test.ts b/src/main/runtime/rpc/schemas.test.ts index 207cec8a281..77fbecb2dd6 100644 --- a/src/main/runtime/rpc/schemas.test.ts +++ b/src/main/runtime/rpc/schemas.test.ts @@ -1,21 +1,12 @@ import { describe, expect, it } from 'vitest' import { z, type ZodType } from 'zod' import { - BrowserTarget, OptionalBoolean, OptionalFiniteNumber, OptionalPlainString, OptionalPositiveInt, OptionalString } from '../../../shared/rpc-contract/rpc-param-primitives' -import { - InterceptEnable, - Screenshot, - Scroll, - TabClose, - TabSwitch, - Wait -} from '../../../shared/rpc-contract/browser-params' import { TERMINAL_METHODS } from './methods/terminal' import { TERMINAL_ORPHAN_METHODS } from './methods/terminal-orphan' import { WORKTREE_METHODS } from './methods/worktree' @@ -56,16 +47,6 @@ describe('RPC optional pipe schemas', () => { expectParses(schema, {}) }) - it('accepts omitted browser optional fields while required fields are present', () => { - expectParses(Scroll, { direction: 'down' }) - expectParses(Screenshot, {}) - expectParses(TabSwitch, { page: 'page-1' }) - expectParses(TabClose, {}) - expectParses(Wait, {}) - expectParses(InterceptEnable, {}) - expectParses(BrowserTarget, {}) - }) - it('accepts omitted terminal and worktree optional fields while required fields are present', () => { expectParses(methodParams(TERMINAL_METHODS, 'terminal.split'), { terminal: 'terminal-1' }) expectParses(methodParams(TERMINAL_METHODS, 'terminal.split'), { @@ -169,37 +150,4 @@ describe('RPC optional pipe schemas', () => { expectRejects(list, { handles: [''] }) expectRejects(list, { handles: Array.from({ length: 65 }, (_, index) => `term-${index}`) }) }) - - it('accepts worktree.create payloads sent by the previous mobile protocol', () => { - const create = methodParams(WORKTREE_METHODS, 'worktree.create') - - expectParses(create, { - repo: 'id:repo-github', - name: 'fix-mobile-tasks', - displayName: 'Fix mobile tasks', - setupDecision: 'run', - activate: true, - startupDraft: 'https://github.com/acme/app/pull/123', - createdWithAgent: 'codex', - linkedPR: 123, - baseBranch: 'origin/main', - compareBaseRef: 'origin/main', - branchNameOverride: 'feature/mobile-tasks', - pushTarget: { remoteName: 'origin', branchName: 'feature/mobile-tasks' } - }) - expectParses(create, { - repo: 'id:repo-gitlab', - name: 'mr-7', - linkedGitLabMR: 7, - sparseCheckout: { directories: ['mobile'], presetId: 'mobile' }, - comment: 'keep mobile parity' - }) - expectParses(create, { - repo: 'id:repo-linear', - name: 'eng-42', - linkedLinearIssue: 'ENG-42', - linkedLinearIssueWorkspaceId: 'workspace-1', - linkedLinearIssueOrganizationUrlKey: 'acme' - }) - }) }) diff --git a/src/renderer/src/components/sidebar/AddWslHostFormPanel.test.tsx b/src/renderer/src/components/sidebar/AddWslHostFormPanel.test.tsx index 04c0aebd979..f60979cb466 100644 --- a/src/renderer/src/components/sidebar/AddWslHostFormPanel.test.tsx +++ b/src/renderer/src/components/sidebar/AddWslHostFormPanel.test.tsx @@ -1,9 +1,7 @@ -import { readdirSync, readFileSync } from 'node:fs' -import { fileURLToPath } from 'node:url' import { renderToStaticMarkup } from 'react-dom/server' import { describe, expect, it, vi } from 'vitest' import type { WslHostDistro } from '../../../../shared/wsl-host-types' -import { AddWslHostFormPanel, canAddWslDistro, wslDistroStateLabel } from './AddWslHostFormPanel' +import { AddWslHostFormPanel } from './AddWslHostFormPanel' vi.mock('@/components/ui/dialog', () => ({ DialogHeader: ({ children }: { children: React.ReactNode }) =>
{children}
, @@ -17,14 +15,6 @@ const debian: WslHostDistro = { name: 'Debian', state: 'stopped', version: 2, en const legacy: WslHostDistro = { name: 'Legacy', state: 'running', version: 1, environmentId: null } const added: WslHostDistro = { ...ubuntu, name: 'Arch', environmentId: 'wsl:arch' } -const LOCALES_DIR = fileURLToPath(new URL('../../i18n/locales/', import.meta.url)) -const LOCALE_FILES = readdirSync(LOCALES_DIR).filter((file) => file.endsWith('.json')) - -function readLocaleDescription(file: string): string { - const catalog = JSON.parse(readFileSync(`${LOCALES_DIR}${file}`, 'utf8')) - return String(catalog.auto.components.sidebar.AddWslHostFormPanel.description) -} - function render(props: Partial[0]> = {}): string { return renderToStaticMarkup( [0]> = {}): } describe('AddWslHostFormPanel', () => { - it('labels each distro and refuses WSL 1 and already-added ones', () => { - expect(wslDistroStateLabel(ubuntu)).toBe('Running') - expect(wslDistroStateLabel(debian)).toBe('Stopped') - expect(wslDistroStateLabel(legacy)).toBe('WSL 1 · not supported') - expect(wslDistroStateLabel(added)).toBe('Already a host') - expect([ubuntu, debian, legacy, added].map(canAddWslDistro)).toEqual([true, true, false, false]) - }) - - it('says bridge projects move to the host on their own, and how to bring one back', () => { - // Verify bug 9: "keep working as they are" and "until you move them" both contradicted the - // automatic mover, which moves them once their terminals are idle. - const html = render() - expect(html).not.toContain('Use it for new projects') - expect(html).not.toContain('until you move them') - expect(html).toContain('move to this host automatically once their terminals are idle') - // Only this distro's projects move; Windows-drive ones never do (move scope refuses /mnt). - expect(html).toContain('Projects in this distro that you opened through') - expect(html).toContain('projects on a Windows drive (/mnt/…) stay on this computer') - expect(html).toContain('bring a moved project back from the sidebar') - }) - - it('carries the same promise in every locale, none still saying projects stay put', () => { - const stale = [ - 'new projects', - 'neue Projekte', - 'novos projetos', - 'новых проектов', - 'Yeni projeler', - '新專案', - // Each locale's old "until you move them", as the catalog carried it before verify bug 9. - 'until you move', - 'hasta que los muevas', - "jusqu'à ce que vous les déplaciez", - '移動するまで', - '옮기기 전까지', - '直到你将它们移到' - ] - for (const file of LOCALE_FILES) { - const description = readLocaleDescription(file) - expect(description).toContain('wsl.localhost') - expect(description).toContain('/mnt/…') - for (const phrase of stale) { - expect(description).not.toContain(phrase) - } - } - }) - - it('spells out the WSL 2 conversion for a WSL 1 distro the list cannot offer', () => { - expect(render()).toContain('wsl --set-version Legacy 2') - expect(render({ distros: [ubuntu] })).not.toContain('wsl --set-version') - }) - it('says this build cannot run WSL hosts and offers nothing to add', () => { const html = render({ selectedDistro: 'Ubuntu', serverFilesMissing: true }) expect(html).toContain('This build of Orca can’t run WSL hosts (server files missing).') diff --git a/src/shared/constants.test.ts b/src/shared/constants.test.ts index 941bc6e6c13..7abef843bc6 100644 --- a/src/shared/constants.test.ts +++ b/src/shared/constants.test.ts @@ -1,9 +1,5 @@ import { describe, expect, it } from 'vitest' import { getDefaultSettings } from './constants' -import { - getDefaultPrimarySelectionMiddleClickPaste, - getDefaultTerminalRightClickToPaste -} from './terminal-platform-defaults' describe('getDefaultSettings', () => { it('uses platform-consistent separators for the default workspace directory', () => { @@ -12,30 +8,4 @@ describe('getDefaultSettings', () => { 'C:\\Users\\alice\\orca\\workspaces' ) }) - - it('asks before closing terminals with running processes by default', () => { - expect(getDefaultSettings('/tmp').skipCloseTerminalWithRunningProcessConfirm).toBe(false) - }) -}) - -describe('getDefaultPrimarySelectionMiddleClickPaste', () => { - it('enables primary selection paste on Linux by default', () => { - expect(getDefaultPrimarySelectionMiddleClickPaste('linux')).toBe(true) - }) - - it('enables primary selection paste on macOS by default', () => { - expect(getDefaultPrimarySelectionMiddleClickPaste('darwin')).toBe(true) - }) - - it('leaves primary selection paste opt-in on Windows', () => { - expect(getDefaultPrimarySelectionMiddleClickPaste('win32')).toBe(false) - }) -}) - -describe('getDefaultTerminalRightClickToPaste', () => { - it('defaults on only for Windows', () => { - expect(getDefaultTerminalRightClickToPaste('win32')).toBe(true) - expect(getDefaultTerminalRightClickToPaste('darwin')).toBe(false) - expect(getDefaultTerminalRightClickToPaste('linux')).toBe(false) - }) }) diff --git a/src/shared/protocol-version-published-capabilities.test.ts b/src/shared/protocol-version-published-capabilities.test.ts deleted file mode 100644 index 8b2c4265fa2..00000000000 --- a/src/shared/protocol-version-published-capabilities.test.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { RUNTIME_CAPABILITIES } from './protocol-version' - -// Frozen baseline: additions need no edit; remove a name only when deliberately retiring support. -const PUBLISHED_RUNTIME_CAPABILITIES = [ - 'accounts.antigravity-chat-sign-in.v1', - 'accounts.antigravity-native.v1', - 'accounts.claude-sign-in.v1', - 'accounts.codex-reset-credit.v1', - 'accounts.host-launch-env.v1', - 'accounts.import-host-credentials.v1', - 'accounts.managed-data-profiles.v1', - 'agent-session.accepted-send.v1', - 'agent-session.account-env.v1', - 'agent-session.attachments.phone.v1', - 'agent-session.attachments.v1', - 'agent-session.attention-ack.v1', - 'agent-session.background-task-child-views.v1', - 'agent-session.background-task-row-stop.v1', - 'agent-session.background-task-stop.v1', - 'agent-session.codebuddy-resume.v1', - 'agent-session.continue-interrupted.v1', - 'agent-session.conversation-outline.v1', - 'agent-session.conversation-stop.v1', - 'agent-session.current-requests.v1', - 'agent-session.cursor-resume.v1', - 'agent-session.dsh-resume.v1', - 'agent-session.host-authority.v1', - 'agent-session.keyboard.v1', - 'agent-session.kimi-resume.v1', - 'agent-session.kiro-resume.v1', - 'agent-session.model-catalog.saved-only.v1', - 'agent-session.muse-resume.v1', - 'agent-session.omp-resume-path.v1', - 'agent-session.opencode2-resume.v1', - 'agent-session.pending-send-result.v1', - 'agent-session.permission-modes.v1', - 'agent-session.prompt-cancel.v1', - 'agent-session.qoder-cn-resume.v1', - 'agent-session.qoder-resume.v1', - 'agent-session.question-answers.v1', - 'agent-session.queued-commands.v1', - 'agent-session.queued-message-edit.v1', - 'agent-session.queued-message-reorder.v1', - 'agent-session.qwen-code-resume.v1', - 'agent-session.repeated-stop.v1', - 'agent-session.rewind-recovery.v1', - 'agent-session.rewind.v1', - 'agent-session.send-answers-proof.v1', - 'agent-session.send-options.v1', - 'agent-session.session-boundary.v1', - 'agent-session.status-feed.v1', - 'agent-session.structured.availability.v1', - 'agent-session.structured.cli-source.v1', - 'agent-session.structured.client-launch-mode.v1', - 'agent-session.structured.hold.v1', - 'agent-session.structured.pi-dialogs.v1', - 'agent-session.structured.registered-agents.v1', - 'agent-session.structured.resume-history.v1', - 'agent-session.structured.reveal.v1', - 'agent-session.structured.v1', - 'agent-session.turn-completion.v1', - 'agent-session.turn-item.v1', - 'agent-session.zcode-resume.v1', - 'agent.launch.create-folder-workspace.v1', - 'agent.launch.local-presentation.v1', - 'agent.launch.placement.v1', - 'agent.launch.prompt-carry.v1', - 'agent.launch.prompt-unconfirmed.v1', - 'agent.launch.replay-required.v1', - 'agent.launch.replay.v1', - 'agent.launch.v2', - 'agentSession.create.message.v1', - 'agentSession.create.tab-id.v1', - 'ai-vault.chat-fork-source.v1', - 'aiVault.session-titles.v1', - 'aiVault.v1', - 'automation.create-idempotency.v1', - 'automation.list-host-scope.v1', - 'automation.owner-fencing.v1', - 'automations.extra-agent-args.v1', - 'browser.clientHost.automation.v1', - 'browser.clientHost.fileChannel.v1', - 'browser.clientHost.pageMetadata.v1', - 'browser.clientHost.v1', - 'browser.screencast.v1', - 'browser.tab-create-known-id.v1', - 'files.mutation-ownership.v1', - 'files.pathsExist', - 'files.resolve-terminal-path.absolute-files.v1', - 'files.resolve-terminal-path.cross-workspace.v1', - 'folder-workspace.path-status.v1', - 'git.antigravity-configured-model.v1', - 'github.markPRReadyForReview', - 'gitlab.updateMR.readyForReview.v1', - 'jira.agent-access.v1', - 'jira.attachment-images.v1', - 'jira.current-sprint.v1', - 'jira.issue-list-statuses.v1', - 'jira.issue-summary-generation.v1', - 'jira.saved-filter-state.v1', - 'jira.transition-fields.v1', - 'jira.user-fields.v1', - 'linear.issue-attribute-filter.v1', - 'managed-runtime.install.v1', - 'managed-runtime.remove.v1', - 'mobile.desktop-relay.v1', - 'mobile.tasks.v1', - 'network.browserTunnel.executionHosts.v1', - 'network.browserTunnel.v1', - 'notifications.remote-push.v1', - 'orcad.migration-catalog.v1', - 'orcad.terminal-census.v1', - 'orchestration.contract.v1', - 'orchestration.federation-control-mail.v1', - 'orchestration.federation-fleet-snapshot.v1', - 'orchestration.federation-lifecycle-settlement.v1', - 'orchestration.federation-release-archive.v1', - 'orchestration.federation-structured-read.v1', - 'orchestration.federation.v1', - 'orchestration.worker-launch-preferences.v1', - 'orchestration.worker-stop-verdict.v1', - 'pairing.delegated-mobile-devices.v1', - 'pairing.device-key-ephemeral.v1', - 'pairing.device-key.v1', - 'preflight.other-runtime-refusal.v1', - 'preflight.workspace-scoped.v1', - 'project-host-setup.v1', - 'remote-runtime.shared-control.v1', - 'repo.search-qualified-refs.v1', - 'runtime-source-fence.v1', - 'runtime.automatic-work.v1', - 'runtime.environments.v1', - 'runtime.status.compat.v1', - 'session-tabs.authoritative-inventory.v1', - 'session-tabs.close-intent.v1', - 'session-tabs.create-terminal-shell.v1', - 'session-tabs.empty-worktree-answer.v1', - 'session-tabs.split-group-placement.v1', - 'session.tabs.chat-fork-cli.v1', - 'session.tabs.qoderOwnedCreate.v1', - 'settings.agent-launch.v1', - 'skills.delete.v1', - 'skills.install-cancel.v1', - 'skills.install-progress.v1', - 'skills.install-providers.v1', - 'skills.install-result.v2', - 'skills.install.bundle.v1', - 'skills.install.v1', - 'skills.manage.v1', - 'skills.upload.v1', - 'ssh.target-management.v1', - 'task-source-context.v1', - 'terminal.binary-stream.v1', - 'terminal.create-idempotency.v2', - 'terminal.create-shell-selection.v1', - 'terminal.multiplex.v1', - 'terminal.paired-parking.v1', - 'terminal.program-status.v1', - 'terminal.prompt-delivery.v1', - 'terminal.query-reply-input.v1', - 'terminal.quick-commands.long-prompts.v1', - 'terminal.quick-commands.v1', - 'terminal.spawn-intent.v1', - 'updater.remote-control.v1', - 'workspace-ports.host-scoped.v1', - 'workspace-ports.v1', - 'workspace-run-context.v1', - 'worktree.archive-failure-blocking.v1', - 'worktree.create-idempotency.v1', - 'worktree.github-pr-suppression.v1', - 'worktree.linked-items-delta.v1', - 'worktree.linked-items.v1', - 'worktree.linked-work-item-context.v1', - 'worktree.provisioned-root.v1', - 'worktree.visibility-defaults.v1', - 'worktree.visibility-source-defaults.v1' -] - -describe('RUNTIME_CAPABILITIES', () => { - it('preserves every previously published capability', () => { - expect(RUNTIME_CAPABILITIES).toEqual(expect.arrayContaining(PUBLISHED_RUNTIME_CAPABILITIES)) - }) -})